A Django site.
7月 4, 2008
» Objective-Cの読みづらさ

メソッドコールをbracketで囲むという程度の知識はあったけど、kuwamoto.org » Blog Archive » Objective C, readability, and language designを読んだら泣けてきた。

7月 3, 2008
» PHPでオブジェクトの配列からプロパティ値を収集する

symfonyのようにORマッパーのある状況でコードを書いていると「モデルが格納された配列から、各モデルのIDだけを抽出したい」というような局面がたまにあって、ベタに書くと、

$book_id = array();
foreach ($books as $book) {
    $book_id[] = $book->getId();
}

こんな感じになってとてもダサい。

こういうとき、RubyのEnumerableにはフィルタ的に使えるメソッドが多く定義されていて「いいなー」なんて思うんですが、PHPで似たようなアプローチをしようとすると、

$book_id = array_map(create_function('$e', 'return $e->getId();'), $books);

こうなります。これはこれで、違う意味でダサい。あちこち危険なにおいがします。create_functionの期待外れ感は異常。

呼び出し側をすっきりさせつつ実装側もある程度robustにしておくには、あらかじめ次のようにユーティリティメソッドを定義しておくのがベスト。ただ、Javaくさいというか、あまりスクリプト言語っぽくないアプローチだと思うので好き嫌いは分かれそうです。

class ModelUtils
{
    /**
     * 指定された文字列をCamelCaseに変換したものを返します。
     *
     * @param string $property 変換する文字列
     * @return string
     */
    public static function camelize($property)
    {
        return implode('', array_map('ucfirst', explode('_', $property)));
    }
 
    /**
     * 配列に含まれる各オブジェクトのプロパティの値を集めた配列を返します。
     * $modelsに含まれるオブジェクトは異なるクラスのものでも構いません。
     * $propertyには、CamelCaseまたはアンダースコア区切りのプロパティ名を
     * 指定します。
     *
     * オブジェクトに、指定されたプロパティ名をCamelCaseにしたものに対応する
     * getterメソッドが定義されている場合に値が取得されます。
     *
     * 使用例:
     * <pre>
     * // $booksの各要素についてgetId()が呼び出される
     * $book_id = ModelUtils::selectProperty($books, 'id');
     * </pre>
     *
     * @param array $models モデルの配列
     * @param string $property 値を取得するプロパティ名
     * @return array
     */
    public static function selectProperty($models, $property)
    {
        $values = array();
 
        foreach ($models as $model) {
            $callback = array($model, 'get' . self::camelize($property));
            if (!is_object($model) || !is_callable($callback)) {
                continue;
            }
            $values[] = call_user_func($callback);
        }
 
        return $values;
    }
}

呼び出し側は以下のようになります。

$book_id = ModelUtils::selectProperty($books, 'id');

5月 26, 2008
» MacPortsのmysql5でreadlineが組み込まれない

MacPortsのmysql5パッケージに含まれるmysql5コマンドが、readlineの組み込まれていない状態でビルドされてしまい不便だったので、強引にPortfileにvariantを追加してビルドしなおした。

--- /opt/local/var/macports/sources/rsync.macports.org/release/ports/databases/mysql5/Portfile.orig     2008-05-05 13:56:36.000000000 +0900
+++ /opt/local/var/macports/sources/rsync.macports.org/release/ports/databases/mysql5/Portfile  2008-05-26 15:53:07.000000000 +0900
@@ -68,6 +68,12 @@
     startupitem.stop    "${prefix}/share/${mysql}/mysql/mysql.server stop"
 }
 
+variant readline {
+    # enable readline
+    depends_lib-append  port:readline
+    configure.args-append  --with-readline
+}
+
 pre-destroot {
     # Some directories we must have in all cases
     xinstall -m 755 -d ${destroot}${sysconfdir}

インストールは以下のように。

$ sudo port install mysql5 +server +readline

今回はreadlineを使ったけど、libeditを使う場合はeditlineマルチバイト不具合の修正 - mir the affiancedを参考に。

5月 24, 2008
» MacPortsのphp5でgdサポートがデフォルトで有効に

MacPortsのphp5パッケージは5.2.6_1から、–with-gd が常に付いた状態でビルドされるようになりました(#13988 (RFE: php5 +macports_gd2) - MacPorts - Trac)。ビルド時にはPHPのソースに同梱のgd2ではなく、MacPortsのgd2が使われる模様。

5月 21, 2008
» Microformatsとアクセシビリティ

英BBCがBBC - BBC One Programmesという番組表ページをベータ版として公開している。

この新しい番組表は番組の放送時間のマークアップにMicroformatsを利用しており、BBC - BBC One Programmes - EastEnders - Previous episodesなどの番組詳細ページに行くと、次のようにABBR要素に時刻情報が埋め込まれていることが確認できる。

<div class="time">
  <span class="date">20 May 2008</span>
  <span class="starttime"><abbr class="dtstart" title="2008-05-20T22:00:00+01:00">22:00</abbr></span>
  <span class="endtime">-<abbr class="dtend" title="2008-05-20T22:30:00+01:00">22:30</abbr></span>
</div>
<div class="location">BBC Three</div>

この手法はabbr-design-patternと呼ばれ、本来は略語を表現するためのABBR要素を情報の埋め込みに利用しているのだが、このマークアップが果たしてスクリーンリーダー - Wikipedia利用者にどのように受け取られるのか、BBC - Radio Labs - Microformats and accessibility - a request for helpが情報提供を呼びかけている。

BBCがいくつかのスクリーンリーダーを調査したところ、購入直後の状態ではABBR要素の略語展開は行われず、Microformatsで埋め込まれた「2008-05-15T19:30:00+01:00」の代わりにABBR要素に囲まれた「19:30」が読み上げられた、とのこと。

5月 14, 2008
» SQLにおける「IS TRUE」と「= TRUE」の違い

IS NULL と = NULL の挙動の違いはよく言われるけど、IS TRUE と = TRUE の違いも注意が必要。

$ psql83
Welcome to psql83 8.3.1, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

juno=# SELECT TRUE = TRUE;
 ?column? 
----------
 t
(1 row)

juno=# SELECT NULL = TRUE;
 ?column? 
----------

(1 row)

juno=# SELECT TRUE IS TRUE;
 ?column? 
----------
 t
(1 row)

juno=# SELECT NULL IS TRUE;
 ?column? 
----------
 f
(1 row)

» symfonyの機能テストを個別に実行するとsfParseExceptionが発生する

symfonyでは以下のようにして、アプリケーション全体の機能テストを実行することができます。

$ symfony test-functional frontend

同様に、機能テストを個別に実行したい場合は、

$ symfony test-functional frontend fooActions

のようにします。

ところが、先日リリースされたばかりのPHP 5.2.6では豪快にsfParseExceptionが発生してしまい残念な感じです。

$ symfony test-functional frontend fooActions
[exception]   sfParseException
[message]     Configuration file “/opt/local/lib/php/data/symfony/config/php.yml” specifies key “magic_quotes_runtime” which cannot be overrided

個別にテストが実行できないと非常に効率が悪いのでどうしたものかと調べてみると、1.0ブランチではChangeset 8861 - symfony - Tracで既に修正されていることが判明。手元のsfPhpConfigHandler.class.phpを直接修正して無事に動作するようになりました。

5月 12, 2008
» フォーム設計にフォーカスした書籍「Web Form Design: Filling in the Blanks」

Web Form Design: Filling in the Blanksというタイトルで、Webのフォーム設計にフォーカスした書籍が出るようです。フォームに特化した書籍はあまり見ないので、ちょっと気になってます。方向性としては、37signalsのディフェンシブ・ウェブデザインの技術―「うまくいかないとき」に備えたデザイン、「上手に」間違えるためのデザイン (Web designing books)なんかに近いのかな?

まだ、amazon.co.jpのデータベースには含まれていないようですが、LukeW | Web Form Design: Filling in the Blanks -a Web design & usability book by Luke Wroblewskiから「ペーパーバックのみ」、「ペーパーバック+PDF」がそれぞれ購入できます。

5月 5, 2008
» 瞑想、座禅

瞑想法とか座禅っていうと、日常生活が宗教とは無縁だった自分のような典型的日本人は「スピリチュアルで胡散臭いもの」という印象を持ってしまいがち。

ところが、海外のミュージシャンのインタビューを読むと「昔はワルだった」みたいな人が「瞑想は素晴らしい」なんて言っていることが結構あるし、今月のrockin’onによると、あのRick Rubinも瞑想法を身につけて良かったと言っている。そして、もちろん我らがSteve Jobsも。

どうやらそんなに悪いもんでもなさそうなので、色々と調べていたら「パトリックが紹介する座禅の座り方」という素晴らしい動画を発見!そんなに長い映像ではないし、途中ちょっと笑いも入っていてとっつきやすいです。

お寺で座禅しながらコーディング合宿とかやったら、何かが降臨しそう。

» 神保町で立ち読み

このところ書店といえば池袋のジュンク堂ばかりだったので、今日は神保町の三省堂へ。

指数・対数のはなし—異世界数学への旅案内
CODE コードから見たコンピュータのからくり

前もって目当ての本を決めていたわけではないので、長々と立ち読みをした末に、面白そうだった指数・対数のはなし—異世界数学への旅案内CODE コードから見たコンピュータのからくりの二冊を購入。

その後、折角だからと秋葉原にオープンしたブックオフまで行ってさらに二冊を購入。

その数学が戦略を決める
量子コンピュータとは何か

読む時間とれるかな…。

» 幼年期の終わり

幼年期の終わり (光文社古典新訳文庫)

3月にアーサー・C・クラークが亡くなったと聞いて、まだ読んでいなかった「幼年期の終わり」を手にしてから2ヶ月あまり。ようやく読み終えました。

クラークの作品は舞台が途方もないスケールに発展していくのに、ストーリーが投げっぱなしじゃなく、ちゃんと読後の充足感が得られるのがよい。

5月 2, 2008
» Zend LLVM Extension

Google Summer of Code - Zend LLVM Extension、これは面白そうな試み。ZendオペコードをLLVMのIR(中間コード)に変換して実行するZend extensionを作るようです。

Hence from the users perspective, the extension would behave much like existing opcode caches, like eAccelerator, but the crucial difference is that LLVM is allowed to perform its aggressive optimizations, which should improve the performance further if enough Zend opcodes are converted to native LLVM IR.

4月 30, 2008
» フレームワーク選びの基準

kunitさんのところから。

仕事でフレームワークを選定する場合は「個人の問題」ではないんです。「チームの問題」「会社の問題」になるんです。

なので、「なぜその仕事でそのフレームワークを選んでるんだ!」という問いは、個人ではなく、チームや会社に問わないといけないわけです。

なので、個人の好みの問題ではないんすよね・・・そのあたりどうもPHPでは個人の好みレベルの議論が多くてまだまだ成熟度がたらんなぁと。

業務で使うフレームワークを「開発方法論とセット」で捉えるべきというのは確かにその通りで、Seasarなんかはその視点を持っていますよね。

かつてのMVCな設計を提供するだけのシンプルなフレームワークだったら好みで選んでも構わない気がしますが、Rails以降のフレームワークは多かれ少なかれユニットテスト、デプロイ機構、データベースマイグレーション、ドキュメント生成といった開発にまつわるあれこれをサポートしていますから、そのフレームワークが前提とする「開発の仕方」、「運用の仕方」が馴染むかどうかは結構重要なところ。

CakePHPやsymfonyもユニットテストやマイグレーションサポートを盛り込んできてはいますが、そのフレームワークでどうやって開発のイテレーションを回していくか、という視点での情報・サポートがあんまりないのが残念です。ユニットテストができればアジャイル開発なのかっていうとそんなことはないので、様々な要素をどう繋いでいけば開発がテンポよく回るのかっていう枠組みまでを提示していって欲しいですね。

などと書きつつ、個人的には「フレームワークのデザイナ(設計者)のセンスを信じられるか」というのがフレームワーク選定の最大の要素であったりします。DHHの言うOpinionated Softwareに共感できるかってこと。あまり合理的ではありませんけどね。

» Jythonプログラミング

Jythonプログラミング

サイボウズ・ラボの西尾さんのJython本が出ていたので買ってきた。

西尾さんはブログに書かれる内容が興味深いので、しばらく前から一挙手一投足を追っているエンジニアさんです。これまで、JavaはHibernateやSpring Frameworkが出始めた頃に仕事で1年ばかり使ったけど、PythonやJythonは完全にスルーしてきた私ですが、そういうわけなので著者買いです。

まだ「はじめに」しか読んでいないので感想は書けませんが、異なるパラダイムの言語を同時に取り上げるというスタイルは面白いですね。

4月 29, 2008