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

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

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関連のことを書いていこうと思います。できれば一日一ポスト、その日に学んだことを書いていきたいです。

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

MephistoでGoogle Analytics使おうと思ってググったら Ruby on Rails Plugin: Google Analytics (blue egg edition) - artweb design というのが出てきたので、早速インストールしてみたんだけど動いていないっぽい。

Mephistoは「rails blog」でググって一番上に出てきたので深く考えもせずにインストールしてしまったんだけど、一年近くバージョンアップされてないし、いまはあんまり活発に開発が行われてるわけじゃないっぽいな。

追記

一晩寝て起きたら動いてた。

| @映画/ドラマ/テレビ

しあわせの隠れ場所

評価 : ★★★★☆

あらすじ

家庭崩壊してる貧しい黒人の少年マイケル・オアーが、裕福な白人家庭に養子として迎え入れられ、アメフト選手として大成する話。マイケルが一時的に身を寄せていた自動車整備工場のおっさんが、自分の子どもをカトリックの名門校に入れるために、「マイケルをアメフト選手にしたら将来有望だぜ。だからうちの息子と一緒に入学させてくれよ」と高校のアメフト部のコーチに持ちかけるところから話が始まる。しかし白人だらけの高校にうまくなじめず、下宿先のおばさんにも疎まれマイケルは肩身の狭い思いをする。寒い冬の夜に半袖短パンで路頭に迷っているところに通りかかったリー・アン・テューイ(サンドラ・ブロック)が見かねて家に泊めてあげるところから話は進んでいく。実話がベースらしいです。

ベタな感動作品だけどとても良かったです。『きみに読む物語』とか『私の中のあなた』的な良さがあります。金持ちな白人が貧しい人を助けるっていう話だと偽善っぽさが出てくるんだけど、サンドラ・ブロックが肝っ玉母さんを好演してて、偽善っぽさがあまり漂ってないです。

ぐっと来るのがマイケルが遠慮するところ。サンドラ・ブロックは最初マイケルを家に泊めたときに警戒するんだけど、朝起きてみるとマイケルは礼儀正しくてきれいにふとんをたたんでひっそり屋敷を出ていこうとする。テューイ家で暮らすようになってからも、サンドラ・ブロックのことをミセス・テューイって呼んで「そういうよそよそしい呼び方はやめなさい」って注意されたり。お互いが手探りでじわじわと心の距離を詰めていくところが良かったです。

サンドラ・ブロックが金持ち奥さん達とのランチで、黒人や貧しい地区に住む人たちのことを馬鹿にする連中に向かって "Shame on you" って言うシーンはさすがにやり過ぎというか偽善なオーラが漂ってたけど、最初はマイケルのことを馬鹿にしてた高校のアメフト部のコーチも、試合で白人の審判がマイケルに不利な判定をしたときに「この人種差別野郎!」と食ってかかるところなど、周囲の白人たちの意識が変わっていく感じがさわやかでした。

裕福な白人が貧しいマイノリティーを助ける映画では、去年『路上のソリスト』を見たんだけど、あれは金持ち白人のオナニーストーリーという感じであまりさわやかさがなかった。しかしこの映画はマイケルも白人達も一緒に成長して家族になっていくという一体感があって、そこが良かったのではないかと思います。サンドラ・ブロックの行動力あふれる感じもプラスに作用。

蛇足になるけど、僕が陰ながらいいなぁと思ったのが、一家の大黒柱ショーン・テューイ。リー・アンに黙って、高校にマイケルの緊急連絡先をテューイ家にするなど頼りになるパパぶりが男前でした。やっぱ男は金だなーと見ながら思った。扉をたたく人という映画で、チュニジアからの移民のために大学教授が手をつくすのを見ても思ったけど、人生には金がないとどうにもならない局面がたしかにあって、そういうときにさらっと金を出せるのが男のかっこよさだなと思った。僕もあと15年後くらいにはそういう金を持ったかっこいいおっさんになっていたいです。