London Perl Workshop 2016に行ってきた

tl;dr: It was really awesome (again)! A big thank you to the organisers and the speakers and everyone.

YAPC::Hokkaidoの前週ということで悩ましくはあったのですが、もろもろありまして、2016年12月3日にロンドンで開催されたLondon Perl Workshopに行ってきました。資料はそのうち公開されていくと思いますが、ひとまず参加できたセッションの情報をごく簡単にまとめておきます。

Custom Keyword Plugins

Paul Evans氏によるKeyword Plugin (Perl 5.12で導入)、Custom Op (Perl 5.14で導入)まわりの話。仕組みについて解説した後、Keyword::BooleanSwitch::PlainFunction::ParametersKavorkaSyntax::Keyword::Tryなど、この機構を使ったモジュール群を紹介し、Keyword PluginやCustom Opを使えば5年前のPerlにも機能を追加できて胸熱だからもっとみんな使ってみるべきだ、という話に。氏にはトーク後にもいろいろ話をうかがったのですが、Perlソースコードを読むと内部の詳細に引きずられやすいので、参考になるモジュールのソースを読んだ方がいいとか、Perlをもっとよくしていくには、公開されている機能をギリギリまで使い倒して、できる人たちに「そんな無茶なやり方よりもっといい方法がある」と言わせるといい、という話にえらく納得感があったことでした。

ちなみに彼が最後に書こうとしていると話していたFuture::AsyncAwaitについてはp5pのメーリングリストに概要がポストされています。

Making the 'First Hard Thing' easy ? HTTP Caching done right

来年のYAPC::EUのオーガナイザであるTheo van Hoesel氏によるHTTPキャッシュ関連モジュールの話。キャッシュを正しく扱うのはなかなか難しいということで既存のさまざまなモジュールの問題点を指摘した後、氏の書いたHTTP::CachingDancer2::Plugin::HTTP::ConditionalRequestの話に。

Making your website seem faster with HTTP/1.1 and HTTP/2

Leon Brocard氏によるHTTP 2.0まわりの解説。最後に『ハイパフォーマンス ブラウザネットワーキング』をおすすめしていました。

Web development and Perl 6

Stefan Seifert氏によるPerl6でウェブアプリ開発を、というネタ。Perl6のフレームワークなどの現状説明(クリスマス以後にも更新されているものは少ない等々)から、氏の書いたInline::Perl5を使えば(2年前にもネタにしていた)Catalystに限らず、DancerやMojoliciousもちょっと工夫すれば使えるので(=>や{ }はp5とp6で意味が異なるので直す、等々)、適材適所でやっていこう、と。

GDPR for Developers

春にQA Hackathonでお世話になったJJ Allen氏によるEUの一般データ保護規則(GDPR)とそれが開発者にもたらす影響についての話。個人情報は「もらったもの」ではなく「借りているもの」として扱うべし、という大原則から、預かる前には許諾を求めるとか、請求があったら返却する、返却したものを手元に残さない、なくしたら報告する、等々の制約を実現するにはどのようにアプリを設計していかなければならないか(たとえば、許可を得たかどうかという真偽値をDBに保存するだけだと情報開示の要件を満たせなくなるので、もっと複雑なメタデータとして保存するとか、単に情報を削除するだけだとデータの整合性に問題が起こるだろうから、データは消すのではなく復号不能な形で匿名化するようにした方がよいとか)、という話に。バックアップやログの扱いなど、まだまだ考慮すべき点は多そうでしたが、この件は対岸の火事とはいえないので、もう少し深掘りしておこうと思ったことでした。

Optimizing your Dancer2 and Plack apps

Sawyer X氏によるDancer2アプリの高速化の話。XSモジュールを入れようとか、速いサーバを使おうとか、静的ファイルは前段階でサーブしようとか、モジュールは事前ロードしようとか…たまに首をかしげたくなるものもありましたが、まあ、おなじみの話ですね。Dancer Advent Calendar12日目13日目14日目15日目に関連する記事が公開されています。

How does CPAN work?

QA Hackathonなどで何かとお世話になっているNeil Bowers氏によるCPANおよびCPANを取り巻く各種システムに関する初心者向けの解説。

The raptor and the butterfly

mst氏がYAPC::EUで話したネタの再演+後日談。Perl5環境にPerl6を入れるためAlien::Rakudo、Alien::MoarVM、Alien::NQPなどを作ろうとしていろいろ苦労したので、同じことを何度も繰り返さなくて済むようにObject::Remoteを使ってインストール済みのPerl6を外部から利用できるようにしたという話。試してみたい方は氏のサイトから6servまわりを一式落としてみるとよろしいかと。管理にはApp::opanという同氏作のツールが使われています。さらっと流されていましたが、簡易サーバがついていたりと便利そうなツールでした。

Teaching programming: let's do it right

Juan Julian Merelo-Guervos氏が21世紀にふさわしいプログラミング教則本を書きたいということで目次などを示しながらいろいろ提案されていたのですが…この辺は前提となるターゲットや学習曲線の設定次第でいかようにもなるよなあという感じ。

Error(s) Free Programming

David Cross氏がYAPC::EUで話したネタの再演。英語として適切なエラーメッセージを出すにはDamian先生作のLingua::EN::Inflexionを使うといろいろはかどるよ、という話。最後にはDamian先生グッズを買うとThe Perl Foundationにチリンチリンとお金が入るのでよろしく、と。

自分の発表資料

私自身は開催一月前になってもまだ行くかどうか決めかねていたためトークの応募などはしていなかったのですが、前夜祭で煽られたこともあって、当日飛び入りでPERL_JSONB_BACKENDの仕様変更をアナウンスするLTをさせてもらいました。

また、YAPC::Hokkaido向けに、今春Perl5のPumpkingになったSawyer X氏や、Elizabeth Mattijsen、Stefan Seifertの各氏からPerl5、Perl6の情報をうかがったりもしました。入れなくてもいいかなあと思っていたPerl6のUnicodeネタを入れたのはElizabeth Mattijsenさんの助言によるものです。Veel dank!

ヤパチーでPerl::PrereqScanner::NotQuiteLiteの話をしてきました

気がつけばもう一ヶ月も前のことになってしまいましたが、uzullaさんが多くのスタッフの方々を巻き込んで手弁当で開催してくださったYAP(achimon)C::Asia Hachioji 2016 mid in Shinagawaで、今年の春からちまちま作り直しているPerl::PrereqScanner::NotQuiteLiteの経過報告的な話をしてきました。スライドの方は翌日には公開してあったのですが、ここに書くのはコードの方をもう少し(というか、当初目論んでいたあたりまで)直してから、などと思っていたらこのていたらくで、uzullaさんにも聴きに来てくださった方にも大変申し訳ないことをしました。ようやく旧版のテストが全部通るところまではたどり着いたので、コードをCPANGitHubにあげておきました。話題に出したplan skip_allなどへの対応はまだなので、本丸であるCPANTSへの組み込みにはもう少し時間がかかりそうですが、その辺はまた追々。

そんなこんなでいろいろなことが遅れていたので、当日もあまり多くのトークは見ていないのですが、あらためて動画一覧のページを見るだにおもしろそうなネタが集まっているので、秋口になったら少しずつ見ていきたいとおもいます。遅ればせながらuzullaさん、myfinderさんをはじめ、みなさまお疲れさまでした&ありがとうございました。

Perl6でデータベースを扱いたいとき

ロンドンで話を聞いたInline::Perl5の印象が強すぎてうっかり存在を忘れていたのですが、特に複雑なことをするのでなければ、最新のRakudo Starに同梱されているDBIishというモジュールを使うと、Perl5のDBIと同じような書き方ができるようになっています。たとえばSQLiteのデータベースを扱うのであれば、Rakudo StarとSQLiteのライブラリ(libsqlite3的なもの)をインストールしたあと、こんなコードを書けばOK。

use v6;
use DBIish;
my $dbh = DBIish.connect("SQLite", :database, :RaiseError);

$dbh.do("CREATE TABLE IF NOT EXISTS foo (id, text)");

my $sth = $dbh.prepare("INSERT INTO foo VALUES(?, ?)");
$sth.execute(1, "test");
$sth.finish;

$sth = $dbh.prepare("SELECT * FROM foo");
$sth.execute;
my $rows = $sth.fetchall_arrayref();
say $rows.perl;

2015年1月の時点では、SQLiteのほか、MySQL(mysql)とPostgreSQL(Pg)用のDBDishなモジュールも同梱されています。裏ではNativeCallというモジュールが使われていて、Perl5のXSでごりごり書いてあるものに比べるとはるかに読みやすい(うらやましい)のですが、NativeCallは用意するライブラリがどうコンパイルされたかなどをあわせないと正しく動作してくれないので、Windows環境では一手間必要。ドキュメントについては p6doc DBIish とか p6doc DBDish をご覧ください。

London Perl Workshop 2014に行ってきた

tl;dr: It was really awesome! A big thanks to the organisers and the speakers and everyone.

もろもろありまして、2014年11月8日にロンドンで開催されたLondon Perl Workshopに行ってきました。会期こそ一日こっきりでしたが、予約制のワークショップを含めて都合六トラックも走るという非常に盛りだくさんなイベントで、当日は本当に身体が二つ三つ欲しいと思ったことでした。資料は少しずつ公開されているようですが、ひとまず参加できたセッションの情報をごく簡単にまとめておきます。

Booking.comで開発されているSerealというモジュールの紹介。この分野で伝統的に使われてきたコアモジュールのStorableはシリアライズしたデータの互換性に問題があったり(これが長らくBooking.comで使うPerlのバージョンを上げられない大きな要因のひとつになっていたそうな)、早すぎるオブジェクト化によるセキュリティ上の問題があったり、類似のモジュールの中ではかなり遅いという問題があったりするのですが、Serealではその辺の問題をうまく解決しているとのこと(仕様の明確化。圧縮しないヘッダ部と圧縮可能なボディの分離。漸次アップグレードのためにエンコーダ・デコーダの分離。オブジェクト化は最後にまとめて実行。循環構造を持つデータの対応。Perlの内部構造を上手に利用した効率化、などなど)。各言語のバインディングはすでにあるものの、PerlとGo以外の実装の完全性はまだ十分に検証できていないそうですが、特にJavaバインディングについては同社で多用しているHadoopなどに安心してデータを投げられるように完成度を高めたいという話もされていました。

同名のRuby gemを移植したというToggleモジュールの話と、グラフを使った監視の話の二本立て。前者は新機能の導入時など、いきなり新しいコードを全体に投入するのではなく、条件によって機能を切り替えられるようにしておいた上で、外部のデータソースからその条件を取得するようにしておくと、一部の人にだけ新機能を提供するとか、新旧機能の入れ替え(差し戻し)とか、高負荷時にだけ一部の機能を制限するとか、A/Bテストによる各種の問題の切り分けとか、コードの修正をすることなく簡単にできてよいですよ、と。後者は各種メトリックスをNet::Statsdを使ってstatsdに投げ、それをGraphiteでグラフ化するということをしていました。

Yvesさんの二本目のトークPerl 5.18でHash randomizationが導入された経緯と対策の詳細について。また、何がどう問題だったのかの実演。PerlのセキュリティML以外では今回が初公開とのことで大変興味深く拝見しました。やり方さえ知っていればほんの数回の試行でハッシュの秘孔をついてDoSを仕掛けられる可能性があるということで、いまさらな話ではありますが古いPerlウェブアプリケーションなどを提供している方は対策がされている5.18以降にアップグレードするか、各メンテナンスブランチにあたっている対策を忘れずに取り込むようにしましょう、ということですね。

長年にわたってCPAN TestersのメンテナンスをされているBarbieさんによる、さまざまな課題の紹介と協力の要請。氏がいろいろあげていたものの多くは自分のところ(CPANTS)の課題でもあるので身につまされながら聞いていました。とりあえず何かしたいという向きにはApp::cpanminus::reporterを試してみるという課題があります。また、これまで氏らが主宰のBirmingham Perl Mongersが出していた(年額数十万円になる)サーバ代が資金難のため今後捻出できなくなるとの記事も出ています。CPAN Testers Fund経由で寄付やスポンサー企業を募集中とのことでした。

London Perl Workshopでも来年1月31日(〜2月1日)にブリュッセルで開催されるFOSDEM 2015でラリーが「2015 will be the year that Perl 6 officially launches for production use.」という話をする、というニュースで持ちきりでしたが、この手の話が出るたびに「(Perl5の)CPANの資産はどうするんだ」という話が出てきます。現状でもv5というPerl6モジュールを利用することである程度再利用できるようにはなっているのですが、Inline::Perl5というPerl6モジュールを利用すると、XSを含むPerl5モジュールでさえもPerl6から問題なく実行できますよ、というわけで、Perl6からCatalystアプリケーションを動かすデモと、どうやってPerl5とPerl6のギャップを埋めているかというコード例がいくつか紹介されていました(Perl6ではなくなっているアトリビュートや、Perl6ではClass::MOPを使うまでもなく用意されているMOPの扱いなど)。

今回のLondon Perl WorkshopのテーマはInternet of Thingsということで、さまざまな小物とPerlをつなぐネタが紹介されていたのですが、これもそのひとつ。Device::SeralPortNet::Bruetoothなどを駆使して家庭の計器類から情報を抜いてグラフ化し、節電などに役立てている?とのことでした。

Mooseの作者として知られる氏による新しいPSGIアプリ用のデバッグツールの話。Middlewareでごりごり加工したHTMLを埋め込むのはスマホアプリなどに優しくないなどの問題があるので、デバッグ用の情報は一度外に出し、別途マウントした専用APIとやりとりすることで必要な場合のみ表示するような仕組みにしたとのこと。だいぶごつい印象でしたが、HTMLを表示したあとページ内で呼ばれるJSのやりとりなどもうまくまとめられるようになっているのは便利そうでした。

アプリも執事のように出しゃばらず、かといって無機的でもなく、人間らしく親しみやすいものがいいんじゃないか、という話から、現状のcpanmとかCartonはアメフトの選手みたいにごついので、もうちょっとスマートなCPANクライアントを書いている、という話に。手元にビルドファイルを保存したり、インストール済みの情報をうまく整理したりしながら、とりあえずMooはインストールできるようになったとのこと。先日開催されたKichijoji.pmでも効率のよいクライアントが欲しいという話が出ていたので絶妙のタイミングだなあと思いつつ、廊下でもいろいろ話を聞いてきました。これについてはあとでまた深掘りできればと思っています。

その他、エモ系のキーノートやLTもありましたが、長くなってきたので割愛。「Acme大全」がついにacmeことLeon Brocardさんの手に!とか、Mark Keatingさんへのサプライズプレゼント!とか、本当にこの場に立ち会えてよかったと思ったことでした。

DBD::SQLite 1.44/1.45_01

ここでアナウンスするのはかなり久しぶりになってしまいましたが、DBD::SQLiteのメンテナンスはちまちまと続いています。

先ほどリリースした1.44では、SQLiteVMPerlで書けるようにするという機能をLaurent Damiさんが書いてくださったのを取り込んだほか(1.43_04〜。ちなみにSwiss Perl Workshopでご本人が発表された資料が公開されています)、Windows環境で長いファイル名を使って複数コネクションを張ったときに正しく同期できていなかった問題や(1.43_09)、FTS4使用時のdisconnectでクラッシュする問題を修正したりしています(1.43_07)。また、1.43_04ではSQL中に生のアクサン付きアルファベットなどが混じっていたときと、プレースホルダ経由で値を埋め込んだときの挙動のズレを修正するため、SQL文をutf8にアップグレードするようになりました。

その他、細々とした修正はChangesファイルをご覧くださいませ。

1.45_01では32ビット環境での大きな整数値の扱いを改善しました(全部の問題を解決できているかどうかは今後のテスト待ちです)。また、1.44のテスト待ち期間中にリリースされたSQLite 3.8.7を取り込みました。本家の方で地道なパフォーマンスの改善が行われた結果、最後にここでアナウンスしたDBD::SQLite 1.41_01にバンドルされているバージョン(3.8.0)に比べると都合61%も速くなっているとのことで、次の安定版はなるべく早く(他の問題が出なければクリスマス頃をめどに)出せればいいなと思っています。

Pod::PerldocJp 0.18

リリースしたのは一週間ほど前なので見ている方はすでに見ているかとおもいますが、WEB+DB PRESS Vol.80あわせの作業として、Pod::PerldocJpに手を入れて、Pod::Perldoc 3.23に追随するようにしました。

WEB+DB PRESSの原稿を書き始める前と比べると、大きな変更点が2つあります。

-Jオプションをつけなくても日本語が表示されるようにしました。

perldocjpコマンドの中で-Jオプションを強制するようにしたので、perldocjp <ドキュメント名>だけで(あれば)日本語ドキュメントを表示できます。

perlvarやperlfuncのように、-a オプションでperlapiの各項目を切り出せるようになっています。

最近本家に追加された機能なのですが、XSを触る人には地味に便利だとおもいます。そしてこんなマイナーなドキュメントまで翻訳があったことにただただ感謝。

WEB+DB PRESS Vol.80

4月24日発売のWEB+DB PRESS Vol.80に、Perl Hackers Hub連載の第26回として「Perlで困ったときの調べ方」という記事を書きました。

WEB+DB PRESS Vol.80

WEB+DB PRESS Vol.80

最初に「新入社員の人に見てもらいたいもの」というお題をいただいたときは何を書こうかと迷ったのですが、やはり一番は

ということだよなあというわけで、perldocの使い方を中心に、自分が日頃困ったときの情報源としてよく利用しているもろもろについて、ざっくりまとめてあります。

perldocについては過去にcho45さんもPerl Hackers Hub連載第14回で記事を書かれていますし、私自身、モダンPerl連載の第5回でまとめたことがあるのですが、これらの単なる焼き直しに終わらないよう工夫してみました(過去記事の落ち穂拾いをしたともいう)。

他の方の記事では、Vol.80の特集3「はじめてのMac開発環境」の第2章、第3章(Fukuoka.pmなどでお世話になっているヌーラボの中村知成氏の記事)にも今回の記事と関係の深い内容が書かれています。

すでに先行販売されているところもあるようですが、店頭などで見かけた際にはお手にとっていただければ幸いです。