スライドはこちらです.

また, 当日 Ustream で配信された動画はこちらにアーカイブされています.
動画中の一番最初がボクの発表です.
Lightning Talk

この LT では DSL のサンプルとして Paml というテンプレートエンジンを紹介しています.
また, オチとして, [] で DSL だけじゃなく汎用言語も実装できる, ということで PHP で実装された Lisp ライクな言語 LisPHP を紹介しています.

いずれも GitHub にリポジトリを公開しているので, 興味のある方はご覧ください.

結構ネタ的な要素も強いのですが, この発表でボクが割と真面目に主張したかったのは以下の点です.

  1. PHP 5.4 では [] が配列リテラルとして導入された
  2. PHP の array は他の言語と比べて特殊なデータ構造である
  3. その特性を DSL 的に活用することができる

スライドのまとめと若干表現が違っていますが, 大筋は変わりありません.

LT の 5 分間ではこれらについて説明しきれなかった部分があるので, この記事で補足しようと思います.

(なお, 同カンファレンスで他の方の発表を聞いての感想などは改めて別の記事に書くつもりです.)

1. PHP 5.4 では [] が配列リテラルとして導入された

特にこれ以上の説明は必要ないとは思いますが, 念のため.

今までは配列を以下のように記述していましたが,

PHP 5.4 alpha 3 以降からは以下のように置き換えることができます.

見ての通り, array()[] に置き換えることができるようになった, というだけで機能的な変化はありません.

いわゆる Lightweight Language はその多くが配列リテラルとして [] を採用していますが, PHP では長らく使用することができませんでした.
パッチを送った @rsky さんを始めとする開発者の皆様のおかげでようやく使用することができるようになったので, 感謝をもって使用しましょう.

2. PHP の array は他の言語と比べて特殊なデータ構造である

これはスライド中でもそのまま説明していますが, PHP が持つ特徴として, 配列とハッシュに区別が無い, ということが挙げられます.
PHP における array は配列っぽさとハッシュっぽさを持った, 特殊なデータ構造であり, それらを混合して記述することができてしまいます.

これもスライド中で紹介していますが, PHP では以下のような記述が問題なく通ります.

そしてこちらはスライド中に一度入れて後に割愛したものですが, 要素の順序を入れ替えたらどうなるか.

表示上の順序こそ記述した通りの順番に変わっていますが, 集合としては等しい値であることがわかります.
0 番目の要素のあとに foo という要素を追加して, さらにもう一つ要素を追加しても, その要素には添字として 1 が割り当てられます.

3. その特性を DSL 的に活用することができる

これらを踏まえて, [] で奇妙なデータ構造を記述して, DSL っぽく活用することを思いつきました.

いきなりですが, スライドで紹介したテンプレートエンジン Paml を例に出します.
Paml には REPL (インタラクティブシェル) が同梱されており, Paml のコードを HTML に変換して出力することができます.

入力としての Paml (まぁ配列なんですが) の要素は順番が入れ替わっていますが, 出力はいずれも同じになっています.

もちろん, プログラムがそういう実装になっているというのもありますが, 前提としてこの 2 つの配列は集合として等しい, ということが重要です.

実装の詳細としては, この配列とハッシュが混合したデータ構造から, 配列とハッシュをそれぞれ取り出してから処理するようになっています.

スライドでは, より現実的なフレームワークへの応用として, モデル定義の記述に活用することを提案しています.

例えば, phpDataMapper (なんかここ数日アクセスできない状態ですが) という O/R マッパーのモデル定義は以下のようになっていますが,

これを以下のようにしてみてはどうか, ということです.

違いとしては, array() の代わりに [] を使っているのもそうですが, 後者ではデータ型の指定時の type という添字を使っていません.

イメージとしては, 第一引数に型名を指定して, そのあとにはさらなるオプションがキーワード引数として指定できる, といったような感じです.
型名はどのカラムにも指定する必要で省略不可能なので第一引数としていますが, 後は全てオプションなのでキーワード引数にする, といった具合です.

おまけ: LisPHP の紹介

スライド上ではコードとその出力を出しただけですが, ちゃんと実装しています.
以下は円周率 PI と円の面積を計算する関数を定義し, 実際に計算する例です.

その他, examples ディレクトリには LisPHP のサンプルコードもあります.
フィボナッチ数列による再帰の例 (スライドに掲載したものです) もあるので, ご興味のある方は是非.

LisPHP の特徴は以下の通りです.

  • PHP の array をコードとして扱う (code as data)
  • PurePHP で記述されている (ただし, PHP 5.4 alpha3 以降が必要)
  • 同梱の REPL とインタプリタは PHP の eval を利用することで字句解析も構文解析も PHP まかせ

実はこれにも元ネタがあって, 元は Python で書かれた Lispy というものです.
こちらは string.split とかで超お手軽に字句解析・構文解析はしていますが.

((Pythonで) 書く (Lisp) インタプリタ

発表時, スクリーン上に LisPHP のことが出ていたのはたったの 5 秒間でしたが, 思いのほか笑いを取れて満足しています.
同カンファレンスにスピーカーとして来日していた方にもウケていたとのことで, 発表前日夜に思いついて, 5 時間ぐらいかけて実装した甲斐があったというものです.
(逆に Paml へのリアクションは思いのほか薄かった. これもネタだったのに)

まとめ

人前で LT をやるのは初めてで, とても緊張しましたが, とりあえずは満足する形で終えることが出来て良かったです.
素晴らしい機会をくださった PHP カンファレンス 2011 実行委員会の皆様, そして会場で聞いてくださった皆様に感謝致します.

なお, 次回があれば 30 分ぐらいで現場の役に立つ話がしたいと思っているので, 来年以降の開催も楽しみにしています.

, , ,

最後の日本 RubyKaigi です.
出張の関係で 2 日目の終盤からしか参加できていませんが, 印象に残ったものを簡単にまとめてみました.

Advancing Net::HTTP by @wycats さん

* net/http は並列化できない
* 並列化するためにフォークして net2/http というのを作っている
* 並列化するにあたって Reactor パターンを採用した

ergをすごく偲んで by @m_seki さん

* カスタマイズは誘惑する
* 安易にオプションを増やすことは「仕様の議論からの逃避」

Visual Glitch, using Ruby by @ucnv さん

* とっさにグリッチが必要なときは sed が便利
* チェックサムを壊したりすると表示自体できなくなることがある
* 安全にグリッチするにはどうするか
* 仕様に従って壊すのがマナー
* 動画はキーフレームを抜くことでいい感じに壊せる

ネタ的な発表かと思いましたが, 技術的には思いのほか真摯であり, とても参考になりました.
発表者の方は GitHub に aviglitch というライブラリを後悔されていますが, API, ドキュメント, spec など, あらゆる面で well-mannered な印象です.
純粋に, Ruby でカジュアルに低レベルなバイナリ操作をする上で参考になりそうです.

Ruby遺産とレガシーコード修理技術 by @hsbt さん

* tDiary のコミッタ
* tDiary は 25 年使われる予定
* 既に 10 年使われている
* 各レイヤごとのテスト
** ユニットテスト
** エンドツーエンドテスト
** インテグレーションテスト
* 機能の追加は慎重に削除は大胆に
** プログラマが知るべき97のことにおける @miyagawa さんの言葉
* 継続的インテグレーション
** travis-ci を使えば GitHub リポジトリで CI できる

長期にわたってソフトウェアを育ててきた経験に基づく, 実践的なお話.
機能の追加に慎重になる, というのは, 特に業務だといろいろなしがらみがあって難しいけど, 常に意識して行きたいものです.
No と言える力重要.

O/R Mapper を支える技術 by @makotokuwata さん

* プログラミング言語の機能は分解, 結合, 抽象化
* SQL にはそれらが欠けている
* それらを補完するのが O/R Mapper
* Ruby で SQL を組み立てること自体は抽象化ではない
* named_scope で抽象化しよう
* プログラミング言語の進化は抽象化機能の進化
* モダンな O/R Mapper の機能
** QueryObject の操作
** Collection のように振る舞うこと
** SQL の抽象化
* N + 1 問題
** DataMapper の Eager loading はうまくやっている

去年ぐらいから仕事で O/R Mapper 的なものを PHP で実装していることもあり, 実装寄りの話では一番参考になりました.
スピーカーの桑田さんのお話は去年の Kwartz についてのものもそうでしたが, 洞察に溢れているだけでなく, 非常に明瞭でわかりやすく, とにかく引きつけられました.

まとめ

昨年から引き続き参加しましたが, レベルの高い技術者の考えに触れることができ, 多いに刺激を受けました.
また, 英語を使いこなし, 海外からの参加者と対等にコミュニケーションを取っている方も多く, その店でも自らの力不足を実感させられました.

スピーカー, スタッフ, 参加者の皆様, お疲れさまでした!

,

PHP-users のメーリングリストへの告知がきっかけで行って参りました。予想をはるかに越える、素晴らしいイベントだったので、その凄さを簡潔に紹介。

主催者が凄い

主催者である桑田氏は過去に、RubyKaigi、PHP Conference、YAPC など様々なイベントにおいて講演を行っている。Web サイト kuwata-lab homepage においては、Python 向けのテンプレートエンジン pyTenjin を始め、多数の開発者向けプログラムを提供している。根っからのプログラマーという印象。

間口の広さが凄い

タイトルの通り、PHP ユーザーを対象とした講習会であり、プログラミングはある程度できることが求められるものの、「Python に関しては全く知らない」という人でも参加できるようにプログラムされている。それでいて、最後には Google App Engine 上で、Big Table を利用したプログラムを動作させるところまで行く。

反面、ある程度 Python が書ける人に取っては、退屈な部分もあったかもしれない。講習会前に 3 日ほど予習していただけの私でさえ、最初の数時間は既に覚えた文法のおさらいがほとんどという感じ。

ただ、桑田氏の、プログラミング一般や、Python 言語仕様に関する理解は凄まじいものがあり、「オブジェクト指向の仕組み」や、「メソッドの名前解決の優先順位」などの、興味深い話も聴けるので、Python がある程度書ける人にも、十分楽しめる内容だったことでしょう。

スケジュールが凄い

10:00 ~ 21:00 という予定で、実際にはそれも少しオーバー。それだけの長時間を、桑田氏ひとりで進める。もちろん休憩はあるものの、全員心地よい疲労感とともに講習会を終えたことと思います。

テキストが凄い

講習会は、桑田氏自作のテキストをベースに進められる。その量、PowerPoint で 200 ページ超。Python と PHP を比較しながらの解説も大変わかりやすい。

コストパフォーマンスが凄い

上記のテキストを始め、準備にはかなりの時間が割かれていることと思われますが、それでも参加費は 1 人 500 円と格安。元が取れないわけがない。

また、女性、カップル、中学生以下は無料となるそうです。

まとめ

初心者にもやさしく、全員が一定の目標を達成に到達でき、主催者がともに喜んでくれる、楽しい講習会でした。そんなわけで、次回も是非参加したいと思っています。
(ですが、次回はもうちょい早めに終わって、懇親会とかもあればと思っていたり。)

仕事で Python を使う、という人は、日本にはなかなかいないかと思いますが、純粋にプログラミングが好きな人は、是非次の機会に参加してみてください。

関連リンク

その他の参加者によるブログ

,