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

『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電話にかけてはダメです。

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

Gitでbranchの効率的な使い方みたいのがよくわからない。

  • 実験的な機能をつけたい

  • ブランチを分ける(例えば開発用に alternate というブランチを作る)

  • 開発する

  • 開発完了後、 master にマージ

みたいな感じかなと思ってた。

しかし実際に運用してみると、実験的な機能の実装の他に、日常的にmasterでコードの改良みたいな作業があり、alternateで開発が完了した後にmasterにマージしたら多分コンフリクト起こりまくりになるような気がしてきた。

それで日常メンテみたいな作業はmasterブランチで行い、それをalternateにマージするという手順をとってる。正しい開発方法かどうかはわからないけど、一応alternateブランチもmasterの最新の変更を追跡できる。んでalternateではしこしこ開発を続けて、開発完了時にmasterにマージしても多分派手なコンフリクトは起こらないんじゃないかと思ってますがどうなんでしょう。

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

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

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さんありがとうございます。今度焼き肉デートしましょう。

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

ポータルシットがクソ重くて、なんか対策ないかなーとか仕事をさぼりながらときどき調べてた。

おおよその原因は掴んでいた。それはアクセス解析プラグイン。MySQLのデータ容量がでかくなるとページの表示が遅くなる。アクセス解析プラグインを無効にした状態でページの表示速度はだいたい0.05秒くらいなんだけど、アクセス解析プラグインを有効にすると表示速度は1秒台とかまで悪化する。アクセス解析に使うテーブル( p_page_analyze )をDROPするとまた速さが回復するので時々空にしていた。

しかしよくよくアクセス解析プラグインのコードを覗いてみると、ヴュー部分で使っていないSQLクエリが発行されており、このせいでクエリの回数が必要な回数の何倍にもなっていた。ポータルシットのアクセスなんて大したことないんだから、DBのサイズがちょっとでかくなっただけでこんなに遅くなるはずがないのだ。

そういうわけで不必要なクエリのトリガーになるコードをコメントアウトしてみた。すると1秒台だった表示速度は0.2秒から0.5秒程度に収まるようになった。しかしそれでもなんか遅く感じる。

それでキャッシュを効かせることにしてみた。使ったのはPecl APC。DreamHostはなんでもやらせてくれるのでほんと助かる。

Pecl APC - DreamHost を見ながらシェルスクリプトをコピペして走らせ、php.iniにAPCの設定を書き加えて終了。僕はPHPのバージョンを5.3.1に上げているのでコピペしたシェルスクリプトのまんまではきちんと入らなかった。最新版のAPC(APC-3.1.3p1)にバージョン情報を書き換えてインストールしたところうまくいった。またDreamHost Wikiではキャッシュファイルのパスが /home/username/tmp/apc.*XXXXXX* だったり /home/username/tmp/apc.*XXXXX* だったりばらついてるけど、Xの数は6個じゃないと500エラーが出るのでご注意を。

キャッシュを効かせて見た結果、フッターのPage Generationはあまり変化がないが、体感速度は十分に速くなった。

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

ユキとニナ

評価 : ★★☆☆☆

日本人とフランス人の監督の合作らしい。率直に申し上げるとそんなに面白くなかったです。

あらすじ

フランス人と日本人のハーフのユキはフランスで暮らしていたが、両親が離婚するため母親と日本に帰ることになった。しかしユキは日本に行きたがらない。住み慣れたパリと親友のニナとも離れたくない。ある日二人は親の目を盗んでニナの父親の別荘に逃げるが…

感想

見る前からなんか「『ポネット』臭のする映画だなー」と思っていたらまさにそんな感じでした。フランスの少女の話。あるいは『大人はわかってくれない』にも近いかも。大人の身勝手で子どもが振り回されるというストーリーは似ているような気がします。

しかし、内容が徹頭徹尾抽象的で、あまり感情移入できなかった。

途中、ユキがニナとはぐれて、フランスの田舎村の森の中をさまよっていて日本の田舎にテレポーテーションするというシーンがある。まぁ寓話的なんだけど、そんなに悪くない演出だった。なにより梅雨の日本の田舎の田園地帯はフランスの田園風景にはない美しさがあって、この対比は良いなと思った。

そんでネタバレ気味になるから気になる人は読まないで欲しいんだけど、エンドロールの音楽がやばかったです。沖縄民謡の『てぃんさぐぬ花』。僕は初めて沖縄に行った小学生の頃にこの曲を聞いて以来、この曲が好きなんだけど、歌詞の内容も映画にマッチしてるのかなーと思った。というか最後にこの曲が流されなければ、映画のテーマがよく伝わってこなかったかも。

日本人であるユキの母も、フランス人のユキの父も、離婚することにはなったけど、ユキのことをとても大切に思っている。特にユキの父が、ユキと二人きりの夜にユキに語りかけるシーン。この男は妻とくだらない内容で喧嘩するシーンが多いのでくだらない男なんだ、という先入観を持っていたけど、父親が愛娘に接する様はいじらしいと思った。それで最後に『てぃんさぐぬ花』が流れるとじーんと来る。

見ると親孝行したくなる映画でした。

| @散財

ゼンハイザーのヘッドフォン(HD 238)を買ったのでご報告いたします。

ヨドバシカメラで9800円でしたが、Amazonだと7800円! 安い!買った後に気づいた! 悔しい! でもわりと気に入ってます。

特徴ですが、

  1. 音が誇張されてない(低音高音とも)
  2. つけていて楽(耳が痛くならない)
  3. 小さくて身につけやすい(ケーブルが細いのはちぎれそうになり心配だけど)

などが挙げられます。

難点としては音漏れすること。かなり控えめな音量で聞いていても音漏れします。しかし音抜けの良さがこの製品の売りらしく、密閉型タイプのHD 228とも聞き比べてみましたが、全然音が違います。密閉型タイプは音がこもっているようにもこもこしているし、装着していて圧迫感があります。やたら低音が響く印象を持ちました。

対してHD 238は音の聞こえ方が自然です。据え付け型のスピーカーで聞くのに近い聞こえ方をします。もこもこしてたりやたら低音が強かったり高音が耳をつんざいたりしません。

僕は音楽はなんでも聞くので、こういう余計な音の誇張がされていないヘッドフォンはとても良いと思います。オススメです。

ところで、ヨドバシカメラで接客してくれたお姉さんが博識かつ自分の好みをハキハキと言う人でとても好感が持てました。最初はAppleのMA850G/A (マイクとコントローラー付のiPhoneでも使えるカナル型イヤフォン)を買おうと思ってたのですが、このお姉さんが「うーん、これは…」と別の製品を進めてくれて、さらに「同じ金額出すならイヤフォンよりもヘッドフォンの方が…」とヘッドフォンを買うことになりました。

人によって感じ方は異なるでしょうが、お店の人が自分の好みをはっきり話してくれると僕は信頼できると感じてしまいます。あまり良くない製品のことを適当にお茶を濁したように解説されるよりも、ぶっちゃけトークをしてくれた方が参考になります。電気屋で店員さんがこんくらい博識だとAmazonばっかじゃなくてたまには店で買おうかなって気になりますね。