| @技術/プログラミング

『Railsによるアジャイル〜』とかのコードはViewの部分がスゲーシンプルで、ロジックがほとんど書いてない。これに慣れると、CakePHPに戻って自分が作ってるウェブアプリを見たときに、Viewに結構ロジックが書いてあって愕然とする。例えばフラグをたてて条件にマッチすれば日付を表示し、マッチしなければ表示しないとかしたいとするじゃないですか。Controllerでそういう設定できなくないけど長くなる。Viewの中に書いてしまったら数行で済むし。

だから僕の作ってるCakePHPアプリはMVCとか名ばかりでViewのコード超きたない。入れ子になったif文がたくさんあるし、正規表現で日付の書式変更とかまでやってる。さすがに関数とかは定義してないですけどね。

そもそもCake FoundationのCakeBookも結構Viewにロジックが書いてあったりする。というかかなりハードに書いてある。CakePHPってViewとロジックを分離させるのが難しいのかな。

加えて、Controllerも結構ひどいことになってる。本当はModelに書くべきことを結構Controllerに書いている気がしないではない。サイト検索のためのメソッドとか200行近くあるし、joinとかしまくり。

MVCでロジックとヴューを分離することでデザイナーがViewを触れるようになって分業が進むかもとか思ってたけど、到底そんな状況にないですね。

| @散財

iPhoneはSkypeが使えて便利なのは皆さんご存じの通りだと思います。いままでSkypeつったらパソコンの前に座っていなきゃいけなかったけど、iPhoneでSkypeできたら普通に携帯で電話するみたいにふとんに寝っ転がって話とかできて便利です。また自室はSoftBank携帯の電波の入りが悪いのでWi-Fi経由で話ができるSkype(Skypeout)はその点でも便利です。

そういうわけで昨夜Skypeoutで話してたんですけど、通話料金は1分3円くらいなはずなのに1000円近く残ってたクレジットが一瞬でなくなってしまった! どういうことかなと思ってびっくりしたんですけど、こういうことでした。

Skypeout

NTTの固定電話とIP電話だったらIP電話の方が安いだろうと050の番号にかけてたんだけど、よくよく見てみるとSkypeoutのIP電話向け通話料は携帯向けと同じ! ぎゃふん。

そういうわけなので、よい子の皆さんはSkypeで遠くに住んでるお友達や家族と話すときは固定電話にかけましょう。間違っても050のIP電話にかけてはダメです。

| @技術/プログラミング

こういうコード書いてます。

function getAttrName(attrObj) {
    var attrName = attrObj.firstChild.data;
//  items = document.getElementsByClassName('item');
    var items = $('li.item');
    $(items).fadeOut('slow');
    for (var i = 0; i < items.length; i++) {
    //  var keywordList = items[i].getElementsByClassName('keyword-list');
        var keywordList = $('.keyword-list', items[i]);
        for (var j = 0; j < keywordList.length; j++) {
            //var keywords = keywordList[j].getElementsByTagName('li');
            var keywords = $('li', keywordList[j]);
            for (var k = 0; k < keywords.length; k++) {
                if (attrName == keywords[k].textContent) {
                    $(items[i]).fadeIn('slow');
                }
            }
        }
    }
    getCurAttr(attrName);
}
function getCurAttr(attrName) {
    var curAttr = $("#keySelector li a");
    for (var l = 0; l < curAttr.length; l++) {
        if ($(curAttr[l]).text() == attrName) {
            $(curAttr[l].parentNode).addClass('current-keyword');
        } else {
            $(curAttr[l].parentNode).removeClass('current-keyword');
        }
    }
}

やりたいことは以下のような感じ。

  1. onclickで attrObjgetAttrName に渡される
  2. クリックされた文字列を attrName に格納
  3. すべての item をjQueryを使って非表示
  4. item の中の ul.keyword-list li 内のテキストに一致したらjQueryで表示

Firefox/Safari/Operaでは問題なく動く。しかしIEが全滅。最初は getElementByClassName とか使ってるからかと思ってたけど、その辺のやつをコメントアウトしてjQueryセレクタを使ってオブジェクトを取得するようにしてもダメ。なんかループの処理とかが怪しいんじゃないかと思ってる。ループ処理もjQueryに書き換えようかな。

ブラウザ間の挙動の違いを吸収してくれるライブラリはまじですごいしありがたいのですが、結局IEちゃんでは動かせない。歯がゆいな。

サーバーサイドで実装する方法もないではないけど、

  1. いじる部分が広範囲になりめんどい(新たなバグが発生するかも)
  2. 大した機能じゃないのに大手術したくない
  3. ずっとPHPばっかり触ってるのはつまらん

などという理由により期限ぎりぎりまでJavaScriptで粘ってみたいです。

追記

"Twitterでcxxさんに教えてもらった":http://twitter.com/cxx/status/13545498622 んだけど、IEにはtextContetはないそうです。恥ずかしい。

そういうわけで

var keywords = $('li', keywordList[j]);

var keywords = $('li a', keywordList[j]);

とし、

if (attrName == keywords[k].textContent)

if (attrName == keywords[k].firstChild.data)

にしてみたところ、ばっちりIEで動くようになった。

cxxさんありがとうございます。今度焼き肉デートしましょう。

| @技術/プログラミング

CakePHP 1.3のStableがリリース された。 JavascriptヘルパーとかAjaxヘルパーが非推奨になってる 。かわりにHtmlヘルパーのjsメソッドを使うらしい。 $html->js('') みたいな感じかな。で、Ajax系の処理はjQueryがデフォルトのライブラリになったらしい。Rails 3.0もprotorype.jsに別れを告げたらしいし、自分がJavaScriptのライブラリで遊び始めた頃はjQueryが全盛だったのでいまからprototype.jsの使い方勉強するのかったるかったし、jQuery簡単だしこの進化は大歓迎です。

JavascriptヘルパーとAjaxヘルパーが非推奨になった件については、わざわざ別のヘルパーにせんでもいいよなー、という印象は確かに持ってた。Htmlをいじるメソッドは一つのヘルパークラスにまとめてしまった方がすっきりする。1.2.xのときはAjaxヘルパーが使いづらすぎて結局jQueryでAjaxすることもあったし、あまり存在意義を見いだせなかったので良かったんじゃないでしょうか。

でも既存のプロジェクトの1.3への移行はめんどくさそうなのでたぶんやんない気がする。新しくCakePHPでなんか作るときは使ってみようと思います。

| @ブログ

パソコンの話とかは tech.portalshit.net へどうぞ。ここはグルメブログになります。

| @雑談

もっと映画の感想を書きたいんだけど、週末はついつい新しく公開された映画を見に行ってしまうのですでに見た映画の感想を書くことができず、すかすかな内容の映画評しかできない。映画館の近くに住みたい。都会に引っ越したい。仕事くれ。

| @技術/プログラミング

なんかTwitterで「最近のポータルシット変わったよね…」とかいう意見を目にするようになったので、パソコンネタだけ隔離して別にブログを始めることにした。使っているCMSはMephisto。Railsの勉強になるかと思って。早速DreamhostへMephistoをインストールしていて躓いてしまったのでちょこっとメモ。

とりあえず tech.portalshit.net というサブドメインを用意し、DreamhostのパネルでPassengerのセットアップ。その後SSHでサーバーに接続し、

$ git clone git://github.com/emk/mephisto.git
``

してgithubからプロジェクトをclone。

Mephistoのインストールにはいくつかgemが必要。Dreamhostには結構たくさんgemがインストールしてあるんだけど、いくつか足りないものがあった。とりあえず設置ディレクトリのルートで

```sh
$ rake gems:install

と打ってみたところ、nokogiriとそれに依存するbrynary-webratが入らなかった。原因を調べてみたところ、xsltのライブラリをダウンロードして、gem install するときにパスを指定してあげる必要があるらしい。xsltのライブラリ自体はPHP5をカスタムインストールしたときに入れてあるので、以下のオプションでインストールした。

$ gem install nokogiri \n    --with-xslt-include=/home/morygonzalez/php5/include/ \n    --with-xslt-lib=/home/morygonzalez/php5/lib/

無事インストール成功。その後もう一回 rake gems:install を実行してbrynary-webratも入り、管理ページにアクセスしてみると今度はPassengerのエラーが。これは単純にdatabase.ymlに development: のDB環境しか記述していなかったこと、 rake db:bootstrap のときに RAILS_ENV=production をつけていなかったことが原因だった。そういうわけでdatabase.ymlに production: の設定(sqlite3を使用)を書き、

$ rake db:bootstrap RAILS_ENV=production

ですべてのインストール作業完了。いまこうして動いております。

今後はここにCakePHPやRails、JavaScript関連のことを書いていこうと思います。できれば一日一ポスト、その日に学んだことを書いていきたいです。