▼ 2011/10/15(土) YAPC::ASIA TOKYO 2011に参加しました
■Perl5.16 and beyond
- Perlは変わっていかなければならない
- use v5.16みたいなことをした時にだけPerl 5.16としての挙動をするようにすれば、互換性を維持しつつ新しい試みを入れていける
- 言語のコアを小さくしたい
- どこでもPerlが動くようにしたい。デバイスもOSも関係無く
use v5.16したモジュールをuse v5.18したモジュールから呼び出して、それを更にuse 5.8したコードから呼び出したりとか
ブラウザ上でPerlが動くとどうなるんだろう。
JavaScriptみたいなことになるのかな。
密かにIE上ではVBScriptも動くわけですが、ああいうことをイメージすればいいのかな?
■Carton: CPAN dependencies manager
サービスを作った時のCPANモジュール管理の話。モジュールのバージョンを含めて管理して簡単にインストールできるようになる。
凄く便利そう。
まだ使わない方が良いとのことだけれど。
■SmartPhone development guide with Node/CoffeeScript and HTML5 technologies, for Perl programmers
一番興味深かった。スマートフォンのネイティブアプリ、流れはWebViewとネイティブ機能のハイブリットだよね、というのは完全同意。
Facebookがそうなってるのは有名ですが、Google+もだったんですね。知りませんでした。
で、それらはWebViewのWebページ上で動作しているJavaScriptとネイティブ機能のブリッジを作ってうまい具合にネイティブとWebViewの融合を図っているとのこと。
そうなってくると、アプリのロジックの多くがJavaScriptで書かれるわけで、それと連携するサーバサイドもJavaScriptで書けるとスムーズだよね、ということに。
そこでnode.jsですよ、と。
ただし、JavaScriptそのもので書くのも色々大変だからCoffeeScriptで書くといい感じに書けるよと。
CoffeeScriptをあんまり知らなかったので調べてみると、例えば名前空間だって持てるし、クラスもより簡潔に記述できるようで、確かに便利そう。
いろんなしがらみがあるクライアントサイドはともかく、新規に始めるnode.jsプロジェクトなんかで使わない手は無いんじゃないかと。
他のトピックとしては、既に色々とJavaScriptでスマートフォンのネイティブアプリを書く方法はあるよね、という話が。
■PhoneGap
- WebViewとネイティブアプリのブリッジをするけど、iPhoneで言うところのUIKitを制御するんじゃなくてカメラとかそういうネイティブ機能との橋渡しをする。
- Facebookアプリとかと同等のことができるわけじゃない
- 注意点としては、UIWebViewはSafariよりもJavaScriptの実行速度が遅いからチューニングとかに気を遣う必要アリとのこと。
- Adobeに買収されたらしい。
■Titanium
http://www.appcelerator.com/products/titanium-mobile-application-development/
- JavaScriptでネイティブを作るからHTML5は関係無い。
- 割と現実的な解ではある
- 速度はやっぱり遅いので細かいチューニングが必要。
- デバッグが難しいのは問題。
http://code.google.com/p/android-scripting/
- PerlでAndroidアプリを作れる。
- おもちゃの域を出ない。
なのでPerlでも作れると。
WebViewを使うことの一番いいところはやっぱりアプリをアップデートしなくても更新できるところだと思うので、PhoneGap周りをウォッチしながら色々試していくのが良いのかなあ。
■他言語から見たPerlのテスト
テストを考える時の分類Perspective | Target |
How | What |
- Perspective
- テストの視点。誰がテストするのか。開発者?発注者の受け入れテスト?
- Target
- 何をテストするのか。単体テスト、結合テスト
- How
- どうやってテストするのか。ブラックボックス、ホワイトボックス。
- What
- 何のためにテストするのか。機能テスト、非機能テスト。
- テストを書くことの支援
- テストの実行
- テストのレポーティング
テストを書くことの支援
- Test::More
- Test::Class
- Test::Base
- Test::Spec
prove (TAP::Harness)
テストのレポーティング
TAP::Harness::JUnitとか(こうするとJenkinsでPerlのテスト結果を扱える)
参考→http://dann.g.hatena.ne.jp/dann/20100404/p1
TAPはPerl1の時に作られてPerlと共に歩んできた。
いろんなテストフレームワークを乗せられるシンプルな仕様になっている。
http://gihyo.jp/dev/feature/01/test-perl/0001
Browser Integration
→ブラウザの挙動をエミュレートする?
自動クリックとかそういうのより、ウェブサービスの外から特定のリクエストを送って内部の挙動を見るとかそういう感じのようだ?
Plackなら
Test::WWW::Mechanize::PSGI
とかある
Fakeというのも一瞬出ていたのですが、どういうカテゴリかわかりませんでした。
サーバにとってのクライアントとかクライアントにとってのサーバとかの、
作成しているシステム外部の振る舞いを見せかけるような仕組み?
今AndroidでHTTPリクエストが発生する処理をテストする仕組みを作っているんですが、もしかしたらこのカテゴリなのかも。
■Apporoで類似文字列検索
- 類似文字列検索はやって当たり前
- 一致するレコードが無くても似たレコードを提示するあれ
- モバイル環境では無いと辛い
- 既存システム
- Apache Lucene
- 準備が色々大変らしい
- SimString
- 結果のリランキングができないらしい
- Apache Lucene
全文検索だけでなく類似文字列検索も。
■Monads in Perl
【注意】自分にとっては非常に難しく、理解できていないので下に書かれていることは間違いが多く含まれていると思います。もしこれを読んでいるのが後で検索して来た方だとして、内容を信じないで下さい。文字では表せない……
- モナドは特別でない
- 圏論は複雑なものを簡単に扱うための考え方
(f;gの;は行の終わりを表すのではなく圏論で使われる記号っぽい?)
sub f;g{ f(g($_[0])); }これはfとgを合成した関数になる。
で、M(*)がモナドクラスのインスタンスを返すとすると、
- *はモナドオブジェクトかもしれないしそれ以外かもしれない
- M(*)はモナドオブジェクト
そこで、上のコードの例でfもgも*を引数に取りM(*)を戻り値とするなら、
そのままではf;gを作れない。
そこで、f;gではなくf>=>gで対処する。
;を単純に戻り値を引数にリダイレクトすると考えると、
>=>というのは、「プログラマブルな;」となる。
つまりfとgをそのままでは繋げないのなら、間に何か任意のコードを挟んで繋がるようにすればいいじゃないということ。
sub f>=>g{ f(to_monad(g($_[0]))); } # 何かしら引数をモナドオブジェクトにしてくれる関数 sub to_monad { ... }こういうことか。
to_monadが何をするかはわからねど、こうしてやればfとgは合成できますよね。
ちなみにMには3つの要素が必要らしい
- Mはあらゆる型を包含できる
- 現在存在するあらゆる型だけでなく、未来に作り出されるどのような型でも
- Mオブジェクト自身も
- 配列が一つの例
- ありとあらゆる型に対するunitが存在する必要がある
- ナナメの矢印を持ち上げる関数
unitというのは*をM(*)化する関数のようだ
ナナメの矢印というのは、現時点の自分には言葉にできないです。
矢印というのは、写像の矢印ですよね多分。
http://ja.wikipedia.org/wiki/%E5%86%99%E5%83%8F
「持ち上げる」というのは概念的な話で、
多分「gの引数をfの戻り値に近付ける、あるいはfの戻り値をgの引数が要求する形に近付ける」ような意味合いだと思ったのですが理解が及びませんでした。
そして、モナドはあらゆる値*をモナドの世界に拡張することであらゆる値の間で演算を可能にできると。
int + string(cf. 1 + "a")は難しいけれど、モナドの世界に持って行ったらみんなM(*) + M(*)なんだから簡単でわかりやすいよねということ。
コードの例はちょっとだけわかった気がした
まず、ある数値に対してダイスを振った後に取り得る値の一覧を取得する関数を書く
roll_dice(5); sub roll_dice { my $num = shift; map { $num + $_ } (1..6); }では、[3,5]に対してroll_diceを適用するには?
実装1
roll_dices([3,5]); sub roll_dices { my $nums = shift; map { roll_dice($_) } @{$nums}; } sub roll_dice { my $num = shift; map { $num + $_ } (1..6); }と、ここまで書いてきて講演で書かれていたコードがどんなだったかわからなくなってしまいました。
確かHaskellのflatmapという関数と同じ役割をするflat_mapという関数を使っていい感じに書けるよということだったと思うんですが。
色々種になる知識は伝えて頂けたと思うので、これを元に勉強を進める必要がありそうです。
講演者の方のサンプルコード:https://github.com/hiratara/p5-Data-Monad
この後の話はAnyEventとモナドに移っていきましたが、JSDeferredのことと似ていたかな。
非同期処理をいい感じに書くにはやっぱりこういう知識が必要なんだなということですね。
■少人数でのWebアプリ開発 - CGIからPSGIまでの変遷
- CGI→mod_perl→PSGI
- 人力バージョニング→SVN
- Excelタスク管理→Trac
- Plack
- セットアップ簡単
- 十分に速いサーバ
- WAFを作りやすい
- 個人の開発環境をVMWare上に移した
- テストは書いてるけどタスク管理が危ういかもしれない
- 開発環境はやっぱり手元の仮想マシン上にあった方が何かと捗るだろうなあ
■PerlでJCL、基幹バッチをダウンサイジング
- COBOLで書かれてメインフレーム上に置いてあった自治体システムをLinux Serverに移行
- COBOLのコードをPerlのコードに移植……ではなく自動変換
- COBOLからPerlのコードを呼び出す
Perlの可能性を感じてしまった。
■Perlで仮想サーバ制御(仮)
- libvirtで仮想マシンを制御できる
- PerlにはSys::VirtがあってPerlから仮想マシンを制御できる
- 福岡は凄くRuby押しなので結局Rubyでやることになってしまった
■セッション以外
懇親会でusp lab.の方とお話させて頂いたのですが、シェルスクリプト(bash)と標準コマンド群だけで作られたデータベースのことを教えて頂きました。
シェルスクリプトでDBMSを作ってしまうというだけで凄いと思ったのですが、それが既に無印良品とかローソンなどのPOSシステムなどで実際に稼働していると聞いて更に驚き。
しかも、分散DBにもできてしまうということでもっと驚き。
MySQLと遜色が無く、1億レコードのソートなどではMySQL以上のパフォーマンスを出すらしいです。
この辺はチューニングの話も絡んでくると思うのでわからないのですが。
■全体を通して
とにかく、まだまだ自分の知らない広大な世界が広がっているなあという驚きに満ちたカンファレンスでした。人の熱気も凄くて、Perlコミュニティの活発さがよくわかりました。
自分も何らか貢献していけたらいいなあと思いました。
最後になりましたが、運営の方々、スピーカーの皆様、懇親会でお話させて頂いた方々、そして全ての参加者の方々も、本当にありがとうございました、そしてお疲れ様でした!
▼ コメント(0件)
- TB-URL http://mitc.s279.xrea.com/adiary.cgi/0104/tb/