DBD::SQLite 1.38_02

いろいろあって半年ほど放置状態になっていましたが、DBD::SQLite 1.38_02を出し(てもらい)ました。今回特に大きな変更はありませんが、みなさんからの異論がなければこれがDBD::SQLite 1.39になる見込みですので、DBD::SQLiteを使ったアプリやDBD::SQLiteをテストに使っているモジュールの作者の方はあらかじめこのバージョンで問題なく動作するか、また特に大量の読み込みを行うアプリでパフォーマンスの劣化が起こっていないか、ご確認をお願いします。

Perl QA Hackathon 2013について

先日半年ぶりくらいで参加したHachioji.pm #26や、3/9に開催されたHokkaido.pm #9でも少しだけ話をしましたが、昨年に引き続き、今年も4月12日から14日にかけて、イギリスのランカスター大学で開催されるPerl品質管理チームのハッカソンに参加してきます。

http://2013.qa-hackathon.org/qa2013/

参加申し込みはすでに締め切られていますが、今年も各国から40名近い参加者が集まり、Module::Buildまわりの作業や、.packlistの置き換え、CPAN Testers向けのツールの整備、Test::Harness/Test::Builderの対応などが行われる予定です。また、目新しいところでは「Perl 5の仕様」を定めるテストスイートの構築というテーマがあげられています。将来的にはPerl 6の公式テストスイートや、Perl 6の仕様と各実装の対応状況のようなものを提供したいとのことで、もちろん今回のハッカソンだけで完結するような話ではありませんが、先般話題になったPumpking Perlの議論ともども、今後さまざまなイベントやメーリングリストIRCなどで議論を深めていくためのたたき台になることが期待されます。私自身はもっぱらCPANTSで使っている各種ツールのメンテナンスをすることになりそうですが、DBIやDBD::*の共通テストを整備するというお題もあがっているので、DBD::SQLiteのメンテナとしてはそのお手伝いもしたいと思っています。

例によってイギリス以外に住んでいるハッカー渡航費やハッカソン公式ホテルの宿泊費についてはいま主催者側の方でさまざまな伝手をつかってスポンサーを募集してくださっていますが、下記予算にある通り、まだ全額カバーできるほどにはなっていないようです。もしスポンサーになってもいいという企業・団体の方がいらっしゃいましたらお知らせください。

http://2013.qa-hackathon.org/qa2013/budget.html

また、今年はEnglightened Perl Organization経由で寄付を送ることもできるようになっています。個人スポンサーになってくださる方がいらっしゃいましたら、下記リンクよりEPOのサイトに移動して、適当な額を英ポンド換算でお送りいただければさいわいです。

http://2013.qa-hackathon.org/qa2013/donate.html

Ploonga/Groonga::APIというのを書き始めている件

肉の日のリリースには間に合いませんでしたが、先日からgroongaのPerl/XSバインディングを書き始めています。Perlからgroongaというと、過去にはYappoさんが着手されたXSバインディングや、hide_o_55さんがHachioji.pmで発表されていたApp::Groonga::Wrapper、ダウンロードたけしさんのAnyEvent::GroongaPerl Advent Calendarにも記事を書かれたokamuuuさんのTest::Groongaなど、カジュアルに使う分にはそれなりにツールも揃っている(というか、groonga自体HTTPを話せるので、groongaコマンドでサーバさえ用意してしまえばあとはFurlなりLWP::UserAgentなりで事足りてしまう)のですが、それだけではかゆいところに手が届かない部分もあるようなので、ちょっと手を出してみた次第。

いまのところソースはgithubにしかありませんが、ごくカジュアルな使い方はこんな感じ。

use strict;
use warnings;
use Ploonga;

my $ploonga = Ploonga->new(
  dbfile => 'db/test.db',
);

$ploonga->do('table_create --name Site --flags TABLE_HASH_KEY --key_type ShortText');
$ploonga->do('column_create --table Site --name title --type ShortText');
$ploonga->do('load --table Site', <<'JSON');
[
{"_key":"http://example.org/","title":"This is test record 1!"},
{"_key":"http://example.net/","title":"test record 2."},
{"_key":"http://example.com/","title":"test test record three."},
{"_key":"http://example.net/afr","title":"test record four."},
{"_key":"http://example.org/aba","title":"test test test record five."},
{"_key":"http://example.com/rab","title":"test test test test record six."},
{"_key":"http://example.net/atv","title":"test test test record seven."},
{"_key":"http://example.org/gat","title":"test test record eight."},
{"_key":"http://example.com/vdw","title":"test test record nine."},
]
JSON

my $ret = $ploonga->do('select --table Site --query _id:1');

groongaには渡した文字列をそのまま解釈してくれる便利なAPIが用意されているので、データベースやホストを指定してインスタンスをつくったら、あとはgroongaコマンドに渡すようにコマンドを渡してやれば、結果を伝えるスカラー、あるいはもっと複雑な構造のデータが返ってきます。Furlなどでリクエストを投げる場合と違って、テストの際に別サーバを上げ下げしたり、文字列のエスケープをあれこれ気にしたりする必要がないのがメリットです。

もうちょい複雑なことをしたくなった場合は生API(Groonga::API)の方を触ればPure Perlの世界にいながらCを書いている気分を味わえますが、いまの段階ではまだ3割程度のAPIにしか対応できていません。様子がわかってきたらもう少し生っぽくないインタフェースも用意したいとは思っていますが、その辺も今後の課題です。

開発は(例によって)もっぱらWindows上で行っているのですが、手元のstrawberry perl環境ではオフィシャルのライブラリにリンクするとDBにアクセスする段階で落ちてしまうので、いまのところ自前でビルドしたgroongaを使っています(ほかの環境ではそのような問題にはあたっていません)。

追記:この件はどうやらstrawberry perlないしstrawberry perlに同梱されているMinGW側の問題のようです(ActivePerl 5.16.2とppmで提供されているMinGW64の組み合わせではオフィシャルのgroongaとリンクしても問題が発生しませんでした)。

また、現状動作確認したのはgroonga 2.1.1/2.1.2のみです。多少修正すれば1.x.x系列でも動きそうですが、まだ手をつけていません。

リポジトリはこちらです。

https://github.com/charsbar/groonga-api

DBD::SQLiteで作成したデータベースがsqlite3コマンドで開けない場合

以前こちらでも書いた通り、DBD::SQLite 1.37以降ではバンドルしているSQLiteライブラリのデフォルトのファイルフォーマットが変更になったため、「PRAGMA legacy_file_format=ON」を有効にしないと2006年以前のSQLiteでは読めなくなるという問題があるのですが、それとは別に、SQLite 3.7以降で新設されたWAL (Write Ahead Logging)という機能を使うと、バージョン3.7より前のsqlite3コマンドでは「file is encrypted or is not a database」などといわれて該当のデータベースが開けなくなります。

詳細については下記のリンクをご覧いただくとして、データベースを開いたときに-walとか-shmという接尾辞のついたファイルができる場合はこの機能が妨げになっているものと思われますので、最近のDBD::SQLiteを使って「PRAGMA journal_mode = DELETE」を発行して従来のロールバックジャーナルモードに戻すか、sqlite3バイナリの方を最新のものにアップグレードしてください。広報していなかったのであまり使う方もいらっしゃらないかと思っていたのですが、kazeburoさんのGrowthForecastでWALモードが採用されています。

なお、このモード変更は、ほかの多くのプラグマと違い、データベース接続を切ったあとも有効です。WALモードを検証したあと戻し忘れた場合などにも影響が残りますのでご注意ください。

Fukuoka Perl Workshop #22

遅ればせながら、先日開催されたFukuoka Perl Workshop #22に参加してきました。発表資料は以下の通りです。

YAPCのLTではとにかく時間がないとのことだったので思い切り端折り(すぎ)ましたが、Fukuoka Perl Workshopの方はタイムテーブルにかなり余裕があるようでしたので、なんでこういう分析をするのかということも含めて都合1時間近く話をさせていただきました。明日からすぐに役立つというたぐいの話ではありませんが、地方でイベントを開催するときなどの参考になればさいわいです。

なお、発表当日には間に合いませんでしたが、補足資料として、CPAN Authorになった年とアクティブな作者数やリリース数との関係をグラフにして追加しておきました。実のある結論を出せるだけのものではありませんが、なかなか興味深いグラフになっているとは思います。

また、当日も話しましたが、YAPCからFukuoka.pmの間に9名(その後の1週間でさらに1名)の方が新たにPAUSE IDを申請しています(グラフには反映していません)。typesterさんやytnobodyさんの発表との因果がどの程度認められるかは確認していませんが、いずれにしてもありがたいことですね。

今回のFukuoka Perl Workshopには大阪から__papix__さんもいらしていました。氏のお話に刺激を受けた方々が、いま、福岡でもPerl入学式のようなものをしようという話をしています。興味がおありの方はFukuoka.pmのFacebookページをご覧ください。

今回は珍しく当日空港から会場に直行するようなスケジュールを組んだこともあって、三次会?までご一緒できなかったのが心残りでしたが、その辺はまたの機会を楽しみにしています(翌日、懇親会に行くときに話題になっていた一蘭本店と、懇親会でお勧めいただいた太宰府には寄ってきました。九州国立博物館はもう一度時間をとってじっくり見学したいと思ったことです)。

お誘いいただいたd_tsuruさん、会場提供してくださったヌーラボさん、ありがとうございました。

DBD::SQLite 1.38_01

細かいことについてはYAPC::Asiaの発表が済んでからまたあらためて記事を書くつもりでいますが、多くの方に関係のありそうな部分だけ先に書いておきます。

デフォルトのトランザクションモードをdeferredからimmediateにしました

DBD::SQLite 1.30_02以降、sqlite_use_immediate_transactionというアトリビュートを使えばトランザクションのモードを(デフォルトの)deferredからimmediateに変更できるようにしてありましたが、今回このimmediateの方の挙動をデフォルトとしました。deferredの挙動が必要な方は明示的にsqlite_use_immediate_transactionアトリビュートをfalseにしてください。

といってもわかりづらいと思うのでもう少し平易に言い換えると、今回の変更で(おもに書き込み用の)トランザクションを開始するべく$dbh->begin_workを発行したら、きちんとそのタイミングで最初のクエリを発行した時点でデータベースが書き込み用のロックを準備するようになります(SQLite標準のdeferredトランザクションでは読み込みの並列性を高めるため、実際に更新が必要なクエリを発行するまで書き込みロックを取得しません)。

そのため、deferredトランザクションを前提としてものすごく大きなブロック単位でトランザクションを行っているようなアプリケーションの場合、必要以上のロックが発生して並列読み込みの性能に問題が生じるおそれがあります。

DBD::SQLiteの用途を考えると、一般的にはロックのタイミングが直感的にもわかりやすくなるメリットや、早い段階で書き込み用のロックを取得するため、(複数のクライアントが読み込みロックを持ったままほぼ同時に書き込みロックを取得しようとして生じる)デッドロックの問題が生じなくなるメリットの方が大きいと判断した結果ですが、組み込み系などで素のSQLiteを使っている方はまた異なる意見を持たれることもあろうかと思います。ご意見ありましたらYAPCの際にでもお知らせいただければ幸いです。

バインドパラメータの扱いについて

詳細は省略しますが、最近のperlでこんな感じのコードが正しく動いていなかった件が修正されました。

my $sth = $dbh->prepare("UPDATE test SET a = ?, b = ? WHERE id = ?");
my @values = ("hello","world",5);
for (my $i=0;$i<3;$i++) {
  # $sth->bind_param($i+1, $values[$i]); # work as expected
  $sth->bind_param($i+1, "$values[$i]"); # this not work!!
}
$sth->execute();

https://rt.cpan.org/Ticket/Display.html?id=79576

その他

ほかにも情報取得系のメソッドをいくつか追加・修正したほか、JAMADAMさんのパッチのおかげで、sqlite_unicodeアトリビュートが真で、カラム名UTF-8を使っている場合、カラム名も「文字列」としてデコードされるように修正されています。

YAPC::Asiaでのセッションについて

せっかくDBIの作者とDBD::SQLiteチームが一堂に会するのですから、私自身もどこかで時間を見つけてDBI側の仕様とずれているところのすりあわせをしたり、実装上の問題について助言を求めようと思っていますが、ここをご覧のみなさんのなかで、もし特にDBIやDBD::SQLiteにまつわる話題でTim Bunce氏やAdam Kennedy氏に聞いてみたいことがある方がいるようでしたら、YAPCのセッション中でも、その後の懇親会やら何やらの席ででも、可能な範囲でお手伝いしますのでお声をおかけくださいまし。

あと、今年は時間の都合などもあって海外勢のスライドの日本語訳はいっさい行っていません(ktatさんなどほかの翻訳好きな方々がどうされたかまでは承知していません)。あしからずご了承ください。

ドイツ7泊8日の旅

遅ればせながら先日ドイツに行って来たので簡単に。今回の旅行には大きくわけて三つの目的があったのですが、いくつか反省点はあったものの初期の目標はまあまあ達成できたし、いくつかうれしい余録もあったので、行って(行けて)よかったなあと思ったことでした。

CPANTSの進捗報告

ここでも報告した通り、春先にはパリや台北でCPANTSの作業をしたわけですが、その後年度初めの繁忙期に入ってそれどころではなくなったため、発表の場(=締め切り)を設定して作業の後押しをしようというのが今回の訪独の目的のひとつでした。もっとも、6月半ばに繁忙期が一段落着いてからの2ヶ月ほどでとりあえずディストリビューションの分析をパラレルに実行するところまでは作業が進んだものの、8月に入ってからは発表の準備などにやたらと時間をとられてしまい当初目標にしていたところまで実装が終わらなかったので、残作業は今月以降の課題としています。また、この件についてはドイツで、またドイツからの帰国後、情報を提供いただいたり新たな課題の共有をできたりもしているので、また何らかの形で成果を報告できればよいなと思っています。

何人かの人に会う

2008年の来日時にYappoさんとlestrratさんといっしょにお会いして以来しばらくお目にかかる機会のなかったhanekomu氏が春のパリ訪問時に会えなくて残念がってくださっていたので、あらためてお会いできそうな機会をつくるというのも今回の訪独の目的のひとつでした。また、ドイツ語で書かれているPerl専門誌$fooのアジア最初の読者として、発行者であり今回のイベントの主催チームのひとりでもあったRenee Baecker氏にもご挨拶しておきたかったとか、春にはお会いできなかったCPANTSの(元)管理人のdomm氏や、春にあまりお話できなかったBarbie氏やTux氏、春に大変お世話になったelbeho氏などのQAチームの人たちともお会いしたかったという欲もありました。これについてはひとりひとりお名前をあげていてはきりがありませんが、とりあえず初期の目標はなんとか達成できましたし、これまでオンライン上でしかやりとりがなかった何人かの方とも面識ができました(もちろんこれまでまったく接点がなかった何人かの方々とも有意義な話をすることができました)。おそらく頑張ればもう少しいろいろな方とお話しできたと思いますし、お話しすべきだったろうなあと思いつつ特に言葉をかわさなかった方も何人かはいるのですが、その辺は欲張りすぎず、また次の機会を待ちたいと思います。

なお、特記事項として、1) hanekomu氏やsartak氏の日本語についてはよく言及されるところですが、Marty Pauley氏の日本語がとてもお上手になっていたことにびっくりしました(これまでにも何度か酒席でご一緒する機会があったのに、まったく気づきませんでした)。2) フランスのマンガ事情について熱く語ってくださったSebastien Aperghis氏にはぜひ一度来日して日本のヲタたちと交流を深めていただきたいと思ったことでした。

ローマ・ゲルマン博物館見学

春のパリ訪問では日程の都合もあってろくに観光もせずに帰ってきてしまいましたが、『ガリア戦記』の訳者としてはリヨンにあるガロ・ローマン博物館に寄れなかったことをとても残念に思っていました(帰国直前に訪問しようかとも思ったのですが、あいにく休館日だったため断念したのでした)。今回は自腹の旅行だったので遠慮なくケルンにあるローマ・ゲルマン博物館見学と、滞在中に気がついたのでマインツローマ・ゲルマン中央博物館見学も旅程に組み込み、おもに帝政期の国境最前線の残り香を楽しんできました。ケルンもマインツもそれぞれに特色があり大変興味深かったのですが、特にケルンの小物類の豊富さには圧倒されたことです(メルクリウス像だけでひとつの枠が用意されているとは思いませんでした)。その他、ゼンケンベルクの自然博物館ゲーテの生家(フランクフルト)、グーテンベルク博物館マインツ)、各地の大聖堂なども見学してきました。例によって会話の方はさっぱりでしたが、展示の説明文くらいならそれなりにわかるものです。

その他、イベントの感想など

  • どんなイベントでもそうですが、何か役に立つ情報を得たいとか技術的な話をしたいとか思ったらやっぱりそれなりの人にくっついていくことが重要ですね。ほとんど何の接点もない方々と飲み屋の漫談をするのもそれはそれで楽しいのですが、それで終始してしまうにはチト渡航費が高すぎるので。
  • 懇親会会場への移動に貸し切りバスが何台か。あちこちからいろいろな人が来ているせいでもあったのでしょうが、文化の違いというか何というか、ちょっと驚いたことでした。
  • Macros in RakudoのスライドはテキストからPDFへの変換まで、実際にrakudoを使って行われていました。使っている方々はもう使っていますよ、という例として。
  • Larryがnieczaとrakudoを切り替えながらデバッグしていたのも新鮮でした。
  • 国内ではnode-perlが話題になっていましたが、Perl 5/6の構文解析をしてJavaScriptなどに変換できるPerlitoもなかなかに興味深かったです(CPANにはv6というディストリビューション名であがっているもの。かなり昔からあるプロジェクトですが、実際に動いているのを見るのは初めてでした)。
  • EUの協定で有名なシェンゲン(盧独仏の国境沿いにある街)の近くにPerl(独、ペルル)やApach(仏、アパック)という街があるという出来過ぎのようなネタから、Perl 5とPerl 6の間に横たわるさまざまな境界、垣根をなくしていこうという動きが始まっているという、いかにもEUならではのいい話。
  • ピンクのシャツを愛用していることで有名なBooK氏が「~~<>」というイディオムを「精子演算子と改名したネタに苦笑い。
  • LTでダイエットの話をしていた方もいました。
  • Oslo.pmのsjn氏によるPerl Mongersグループの運営にまつわるセッションはとても興味深く聞けました。カンファレンスやトレーニングクラスによる資金稼ぎの話についてはグループの性質や立場にもよるでしょうから必ずしも参考になるとは限りませんが、Hokkaido.pmやHachioji.pmは(おそらくは国内のほかのグループも)これまでのところ本当にコアメンバーのみなさんがうまく回してくださっているなあとあらためて感じたことです。
  • フランクフルトの中央駅でアイスランドから来た方に偶然声をかけられ、お国のことをいろいろうかがえたのも楽しかったことのひとつです。いまではすっかり忘れてしまいましたが、若かりし頃はアイスランドから辞書を取り寄せ、某大学のアイスランド語の講義にも潜り込んでいたのでした。
  • フランクフルトは記録的な猛暑でしたが、ふだん東京で冷房なしの生活をしている私には単にからっとした暑さに過ぎませんでした(帰ってきたときの空気の重さには辟易しましたが)。出国時に現地の天気予報を見たときはやたらと雨マークが多かったのですが、結局小雨がぱらっと降っただけで、天気には恵まれたなあと思ったことです。
  • aystar (e-plus)が遅すぎて、あとからvodafoneのSIMを買い直した件。週末で、しかも現地着がやや遅かったので空港内の店舗が軒並み閉まっていたのが痛恨事でした。
  • ケルン名物わんこケルシュ。フランクフルトのアッペルヴァインやヘフェヴァイスのドゥンケルも悪くはなかったのですが、とにかく出てくるのが早い(というか、注文を受ける前に注いでどんどん配って歩く)のがせっかちな私にはぴったりでした。
  • 来年はキエフだそうですが、露語はまったく読めない(=博物館とか書店とか巡ってもあまり楽しめそうにない)ので悩ましいところ。アムステルダムあたりを経由地にして遊ぶ手はありそうですが、時期が時期だけに費用対効果が悪すぎて。