Charsbar::Note

2016/08/03

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

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

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

2015/02/14

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

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

use v6;

use DBIish;

my $dbh = DBIish.connect("SQLite", :database<test.db>, :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 をご覧ください。

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