YAPC::ASIA TOKYO 2011に参加しました


Perl5.16 and beyond

  • Perlは変わっていかなければならない
  • use v5.16みたいなことをした時にだけPerl 5.16としての挙動をするようにすれば、互換性を維持しつつ新しい試みを入れていける
  • 言語のコアを小さくしたい
  • どこでもPerlが動くようにしたい。デバイスもOSも関係無く

いろんなuse vXXXしたコードが混在していった時におかしなことにならないのかな?
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は関係無い。
  • 割と現実的な解ではある
  • 速度はやっぱり遅いので細かいチューニングが必要。
  • デバッグが難しいのは問題。

■SL4A
http://code.google.com/p/android-scripting/

  • PerlでAndroidアプリを作れる。
  • おもちゃの域を出ない。

Android上でスクリプトを動かせる、ということみたいですね。
なのでPerlでも作れると。

WebViewを使うことの一番いいところはやっぱりアプリをアップデートしなくても更新できるところだと思うので、PhoneGap周りをウォッチしながら色々試していくのが良いのかなあ。

他言語から見たPerlのテスト

テストを考える時の分類

Perspective Target
How What
  • Perspective
    • テストの視点。誰がテストするのか。開発者?発注者の受け入れテスト?
  • Target
    • 何をテストするのか。単体テスト、結合テスト
  • How
    • どうやってテストするのか。ブラックボックス、ホワイトボックス。
  • What
    • 何のためにテストするのか。機能テスト、非機能テスト。

テストフレームワークの役割

  1. テストを書くことの支援
  2. テストの実行
  3. テストのレポーティング

Perlのテスト環境は?
テストを書くことの支援

  • 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で類似文字列検索

  • 類似文字列検索はやって当たり前
    • 一致するレコードが無くても似たレコードを提示するあれ
  • モバイル環境では無いと辛い
  • 既存システム

今すぐに使う場面はなさそうですが、検索が必要なサービスを作る時には考慮しなければいけないな、と。
全文検索だけでなく類似文字列検索も。

Monads in Perl

【注意】自分にとっては非常に難しく、理解できていないので下に書かれていることは間違いが多く含まれていると思います。もしこれを読んでいるのが後で検索して来た方だとして、内容を信じないで下さい。

文字では表せない……

  • モナドは特別でない
  • 圏論は複雑なものを簡単に扱うための考え方

ある関数fとgがあったとして、次のような関係が成り立つ関数f;gを考える
(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が存在する必要がある
  • ナナメの矢印を持ち上げる関数

あらゆる型の包含というのは、JavaとかC#のGenericsのイメージですよね。
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の可能性を感じてしまった。

Perlで仮想サーバ制御(仮)

  • libvirtで仮想マシンを制御できる
  • PerlにはSys::VirtがあってPerlから仮想マシンを制御できる
  • 福岡は凄くRuby押しなので結局Rubyでやることになってしまった

EucalyptusというAWSと互換性のあるAPIを提供するEC2みたいなクラウド環境を作るOSSというのははじめて知った

セッション以外

懇親会でusp lab.の方とお話させて頂いたのですが、
シェルスクリプト(bash)と標準コマンド群だけで作られたデータベースのことを教えて頂きました。
シェルスクリプトでDBMSを作ってしまうというだけで凄いと思ったのですが、それが既に無印良品とかローソンなどのPOSシステムなどで実際に稼働していると聞いて更に驚き。
しかも、分散DBにもできてしまうということでもっと驚き。
MySQLと遜色が無く、1億レコードのソートなどではMySQL以上のパフォーマンスを出すらしいです。
この辺はチューニングの話も絡んでくると思うのでわからないのですが。

全体を通して

とにかく、まだまだ自分の知らない広大な世界が広がっているなあという驚きに満ちたカンファレンスでした。
人の熱気も凄くて、Perlコミュニティの活発さがよくわかりました。
自分も何らか貢献していけたらいいなあと思いました。

最後になりましたが、運営の方々、スピーカーの皆様、懇親会でお話させて頂いた方々、そして全ての参加者の方々も、本当にありがとうございました、そしてお疲れ様でした!

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>