YAPC ASIA 2011行ってきました。

cho45さんのWAFの話とか、普段書いているコードに直結するような話で興味深い話も多かったのですが、それ以上に、techno-catさんやHaruka Kataokaさんの音楽関係のトラックにとても刺激を受けました。そういえば、自分がプログラムを始めたきっかけって、テクノとかエレクトロニカとか、そんな音楽やりたくてじたばたしているうちに片足突っ込んだのがはじまりだったよな、ということを思い出したりして、まあ、いわゆる初期衝動?に立ち返ったような気持ちになりました。

で、この一週間モンモンとしているうちに、今やるならWeb Audio APIだよななどと思いつつ色々いじってたら、こんなのが出来ました。

すべてJavaScriptで書かれていて、Web Audio APIを利用してブラウザ上でリアルタイムに動作するプログラムで、DOM構造をそれっぽい音楽に変換して演奏します。ブックマークレットから起動できます。最近のchromeでしか動きません。今のところ、いわゆるIDMとかエレクトロニカといった感じの音にチューニングされてます。ちょっとした画像効果付きなので、そっち系統の音が好きな方は、好きなサイトで実行して放置すると良い感じなんじゃないかと思います。

自分のお気に入りは、Facebookのウォール部分です。予め先の方までAutoPagarizeしておいて垂れ流すと、とても気持ち良いです。みなさんも試してみてください。

Perlのパの字も無いところに落ち着きましたが、言語に拘らずいろんな方向に刺激を与えてくれるのもYAPCの良いところですね。この土日も仕事とも言語とも関係なく、好きなコード書きたいという気持ちが、今の僕には溢れてます。

通常、MTのパッケージはシステムレベルにインストールされません。そのため、lib/ とextlib/ へのパスを実行時に追加する必要があります。
例えば、EntryオブジェクトをDumpするワンライナーは以下のようになります。

$ perl -Ilib -Iextlib -MMT -MData::Dumper -e 'MT->new; print Dumper(MT->model("entry")->load(42))'

また、プラグインごとのlibディレクトリへのパスは、MTのインスタンス作成時に動的に追加されます。そのため、MTのプラグインを開発中、コンパイルチェックをしたい時などに直接実行する事ができません。

$ perl -Ilib -Iextlib -Iplugins/MyPlugin/lib -c plugins/MyPlugin/lib/MyPlugin.pm

長いですね。

そこで、以下のようなモジュールを、perlのパスの通った場所に設置します。

package T;
use strict;
use warnings;
use lib qw( lib extlib );
use MT;
BEGIN { MT->new };
1;

名前は、T.pmです。これで

$ perl -MT -MData::Dumper -e 'print Dumper(MT->model("entry")->load(42))'
$ perl -MT -c plugins/MyPlugin/lib/MyPlugin.pm

などと、perlにMT専用オプションが追加されたような錯覚を覚える事が出来ます。

Gollumは、githubのwikiエンジンのコア部分がオープンソースとして公開されたものです。軽量なWebServerとして動作するので、ローカルマシン上で起動してすぐに、ブラウザ経由でwikiページの閲覧や編集が可能になります。使用感をメモしておきます。

インストールと起動

Gollumはrubyで書かれたwikiエンジンです。gemからインストールする事が出来ます。 起動するには、任意のgitリポジトリへ移動(またはオプションでパスを指定)してgollumコマンドを実行します。
 
$ sudo gem install gollum
$ git init my_wiki
$ cd my_wiki
$ gollum

これで、デフォルトでポート4567にウェブサーバが起動するので、ブラウザでlocalhost:4567にアクセスしてすぐにwikiページの作成が可能です。

特徴

バックエンドがgit

gollumはストレージとして、一般的なDBエンジンではなくgitを利用しています。ブラウザからページを追加してみるとわかりますが、wikiページがファイルと一対一で対応するという直感的に分かりやすい構造になっています。ワーキングコピーでそれらのファイルを直接編集してgit commitすることでwikiに反映させることもできます。

githubのwikiもgitリポジトリとしてアクセス可能になっているので、githubからwikiをガバっとcloneしてローカルマシン上のGollumで確認しながら大量にページ追加作業をし、まとまったところでgithubにpushといった形でのgithubと連携することで、かなりの作業の効率化が可能かと思います。

オマケ的な利点として、画像などのファイルを直接git addする事でリポジトリに含めて管理、参照するといったことも挙げられます。(現時点ではGithubのwikiにはファイルアップロードのインターフェースがないので)

複数のマークアップフォーマットに対応

必要なライブラリをインストールする事で、以下のマークアップフォーマットを利用できます。フォーマットはwikiページごとに設定できます。

  • ASCIIDoc
  • Creole
  • Markdown
  • Org
  • Pod
  • RDoc
  • ReStructuredText
  • Textile
  • MediaWiki (gemから落とせる最新版(1.1.1)には含まれていない模様)

また、github 独自拡張のwiki内リンク記法が利用できます。

はまったところ

ワーキングコピーではなくgitリポジトリそのものを見ているので、ファイルベースで作業した場合、git commitするまで反映されない、ということに気づくまで小一時間はまった。

Happy new year! Happy Github!

ということで、Movable Type のリポジトリがgithubに移行してとても楽しみなのですが、コミットログにFogbugzのケース番号書いてあってもWebから見たときにリンクにならないので不便です。のでとりあえずChrome extensionでなんとかします。

https://github.com/movabletype/ 以下で、コミットログからfogbugzのcase番号らしきものを拾って、近くにリンクを追加します。だけです。もっと良い方法をご存知の方教えてください。

MTのあちこちで使われている registry メソッドについて、自分の知っている範囲でですが、説明的なものを書いてみました。
テストとしてサンプルコードが埋め込まれているので、prove 出来ます。
podで説明文を書いてあるのですが、後で気付いたのですが、perldoc では文字化けして読めませんでした><
直接コードとpodを読んで、実行してみる等してみてください。
何かのお役に立てれば。

少し説明を追加、アップデートしました。

小粋空間さんで、プラグインのファイル構成について解説されている記事が公開されています。

その中で、自分の過去の発表で YAML ファイルでの perl コードの実行について話した内容に触れられていたのですが、それを読んで、自分の発言が誤解されるような言い方になっていたようなので、整理してみます。

要点を順に書くと、こんな感じになります。

  1. Movable Type の registry では、サブルーチンが期待されているなら、文字列を自動的に perl コードとして展開する場合がある
  2. plugin の定義ファイルである config.yaml ファイルではこの機能を最大限利用することで直接 perl コードを埋め込める(ようになっている設定値が多数用意されている)
  3. ただし、テーマの定義ファイルである theme.yaml ファイルを扱う際には、セキュリティ向上を目的に、基本的にこの機能を使わないよう開発している

ですから、plugin のスタートポイントがfoo.plである場合と、config.yamlである場合に、セキュリティ的な安全性の差は(現在の所)ありません。小粋空間さんのところで触れられた安全性の話は、plugin と theme の違いの話だとご理解ください。

2) について補足しておくと、registry 内でサブルーチンが期待される場合(例えばテンプレートタグの登録での、実行ルーチンの指定部分)、「sub {」で始まる文字列を直接指定する事で、perl として実行させる事が出来ます。
以下は、実際にプラグインとして動作するconfig.yamlファイルの例です。

tags:
    function:
        Foo1: sub { return "Hello foo1" }

ActionStreams + AnyEvent

  • Posted on
  • by

ActionStreamsで更新チェックする時に、AnyEvent::HTTPを使って並列ダウンロードするようにしてみました。sixapart / mt-plugin-ActionStreamsからforkして、anyeventブランチを切ってゴニョゴニョしてます。

AnyEventが見つかれば自動的に利用するようにしてありますので、特別な設定は不要です。

10程度のストリームの処理で、ベンチマーク(ストップウォッチで目視)では約三倍ほど速くなってます。ストリームの数が増えれば、もっと差が出るかもしれません。

YAPC::Asia 2010

  • Posted on
  • by

行ってきました。YAPC、というかPerlのイベント自体に初参加だったのですが、とてもエキサイティングな二日間を過ごせました。ふっとMTを持ちあげてくれたyusukebeさんのトークには特に感謝したいです。色々吹っ切れた気がします。

Include Map という名前のプラグインです。

なにが起こるの?

  • テンプレートの編集画面に、そのテンプレートをインクルードしているテンプレートの一覧を表示します。
  • 以下のような依存関係の一覧画面を追加します。

include_map.png

どこでダウンロードするの?

ダウンロードはgithubからお願いします。画面右上、上から3段目の「Download Source」ボタンから、最新のパッケージをダウンロードできます。

使い方は?

IncludeMapプラグインは、テンプレートの編集を監視し、内部的に依存関係の記録を行います。ですが、現在のところプラグインのインストール時にはこの記録は作成されません。
運用中のMovable Typeにこのプラグインを追加して利用する場合、事前にブログ/ウェブサイトの一覧画面からPlugin Action > Rebuild Include Mapを実行してください。

インストールに成功すると、メニューの「デザイン > Include Map」から、各ブログごとのテンプレートの依存関係表を開くことが出来ます。この画面はIEでは動作しないかもしれません。

ご利用は計画的に

このプラグインはMTのデータベースに変更を加えます。また、開発途中のため、今後大きな変更が加わる可能性もあります。実運用中の環境へのインストールはお勧めしません。テスト用途でのご利用をご検討ください。