Charsbar::Note

2014/11/11

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さんへのサプライズプレゼント!とか、本当にこの場に立ち会えてよかったと思ったことでした。

2014/10/23

DBD::SQLite 1.44/1.45_01

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

先ほどリリースした1.44では、SQLiteのVMをPerlで書けるようにするという機能を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%も速くなっているとのことで、次の安定版はなるべく早く(他の問題が出なければクリスマス頃をめどに)出せればいいなと思っています。

2014/04/24

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を触る人には地味に便利だとおもいます。そしてこんなマイナーなドキュメントまで翻訳があったことにただただ感謝。

2014/04/21

WEB+DB PRESS Vol.80

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

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

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

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

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

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

2014/04/07

Test::PAUSE::Permissions

たまに、そう、CPANディストリビューションの割合からすると1%ほどのことではあるのですが、他の人からモジュールを引き継いだときに必要なパーミッションを全部もらえていなかったとか、名前がかぶっているのに気づかなかったとかで、PAUSEの索引に登録してもらえないディストリビューションが生まれてしまうことがあります。

そういう問題を防ぐにはリリース前にPAUSEのパーミッションの確認しておくに限る、というわけで、Test::PAUSE::Permissionsというモジュールをリリースしました。

基本的な使い方は、SYNOPSISに書いてある通り、xt/perms.tのようなテストファイルにこう書いておくだけ。

use strict;
use warnings;
use Test::PAUSE::Permissions;

all_permissions_ok();

リリース時に(環境変数RELEASE_TESTINGを有効にして)このテストを実行すると、ディストリビューション内のpackageを抽出し、CPANからパーミッションの索引をダウンロードしてきて、それぞれのpackageについて、パーミッションの状況を確認します。持ち主が登録されていない(誰もそのpackageを登録したことがない)か、持ち主に自分が含まれていればテストが通りますし、自分がパーミッションを持っていないpackageが含まれていたらテストが失敗するので、パーミッションの持ち主に連絡して必要なパーミッションをもらうか、package名がかぶっている場合はお手元のpackageを修正する、あるいはMETAファイルの設定にno_indexを追加して索引に登録されないようにする、等の手段を講じてください。

Test::PAUSE::Permissionsは、METAファイル内のx_authorityというフィールドの値があればそこからリリースする作者のPAUSE IDを取得します。また、各.pmファイルに $AUTHORITYという変数が指定されていればそこからIDを取得します。どちらもない場合、モジュールのリリースにCPAN::Uploaderなどを使っている方ならホームディレクトリに.pauseという設定ファイルがあると思いますが、そこからIDを取得します。それすらもない場合は、テストをスキップします。また、このテストをツールなどで自動生成する場合は、all_permissions_ok()の引数としてPAUSE IDを渡してやれば、.pauseにそのIDが登録されているかのように振る舞います(ただし、ここで渡したIDよりも、x_authorityおよび$AUTHORITYの指定の方が優先されます)

修正: miyagawaさんにご指摘いただいて、0.04からはx_authority等をテストの対象に含めるのをやめました。情報自体は取得しますが、テストは.pause (およびall_permissions_ok()の引数)で指定されたPAUSE IDに対してのみ行います。