Charsbar::Note

2017/07/08

YAPC::Fukuokaに行ってきた

遅ればせながら、YAPC::Fukuokaに参加してきました。発表資料は以下の通りです。今回はPerl 5.26がリリースされたこともあって、前回、前々回の分から5.24の内容を削り、その分5.26のやや細かい話や、開発が始まったばかりの5.27系の話を追加しました。調べ物の過程でふたつほど5.26.0のバグを踏んだりもしましたが、いずれも次のリリース時には直る見込みです。準備の時間が足りず掘り下げきれなかった部分もありますが、その辺はまたいずれ何かの機会に。

JPAはじめスタッフ、スポンサーのみなさま、ありがとうございました。Okinawaも楽しみにしています。

2017/03/18

'.' in @INC問題とその対処法について(2017年3月版)

YAPC::HokkaidoやYAPC::Kansaiで話した通り、Perl 5.26ではセキュリティ上の問題で@INCにカレントディレクトリが含まれなくなります。p5pやツールチェーン側ではその影響を軽減すべくCPANクライアントやTest::Harnessに従来の挙動を残すような仕組みを用意中ですが、現時点ではまだすべての対策が出そろっているわけではありません。最終的にどうすべきかは5月に開催される予定のPerl Toolchain Summit (旧Perl QA Hackathon)後にあらためてまとめるつもりですが、直接的な影響を受けるCPAN Authorのところには順次バグレポートが届いているかと思いますので、可能であれば以下の対応をご検討ください。

incディレクトリなどにMakefile.PL/Build.PL用の特殊なモジュールなどを同梱している場合

カレントディレクトリが@INCから消えることで、開発時および手動インストール時にはinc::Module::Install、inc::MyBuilderなどの同梱モジュールが正しく読み込めなくなる可能性があります。この辺は別途パッチがあたる可能性もありますが、基本的にはMakefile.PL/Build.PLなどの先頭付近に適宜以下のような行を追加しておいていただけると面倒がなくてよいかと思います(通常のインストール時にはCPANクライアント側で対策が取られるので問題にはならないはずです。また、どうせ開発するのは自分だけだから、perl -I. Makefile.PL/Build.PLするよ、という方もひとまず気にしなくてかまわないかと思います。ただ、CIがこけたりCPAN Testersなどから指摘を受ける可能性はあります)。なお、Makefile.PL/Build.PL については use lib "."; でもよいはずですが、今回の「対策」と呼ばれるものは "." を狙い撃ちにしているので、場合によってはおかしな副作用に巻き込まれる可能性があります。

use FindBin;
use lib $FindBin::Bin;

また、Module::Installについては、Perl本体あるいはツールチェーン側で何らかの特別対応が行われる可能性もあるのですが、最新のModule::Installにも警告が出ている通り、これまでにもいろいろと問題が出ていますので、特に最新版をお使いでない方は、可能であればこの機会にMinilla、Dist::Zilla等のオーサリングツールに移行しておいていただけると助かります。

テストファイル中で t::Foo のようなモジュールを呼んでいる場合

これも、面倒でなければ、上と同じく各テストファイル中でFindBinを呼んで、実際の階層に応じたlib設定をしておいてください。

また、修正すべきファイルが多すぎて大変な場合は、依存モジュールにTest::Harnessの3.38以降を加えておけば、とりあえずmake test時には@INCにカレントディレクトリが戻るようになります。

これも同じくどうせ自分だけだから…という考え方もありですが、Makefile.PL/Build.PLの場合と同様におそらくCIでこけたり、CPAN Testersから指摘を受けることになるかと思います。

do "localfile.pl" のような呼び出しをしている場合

CPANモジュールには少ないと思いますが、お手元のアプリやスクリプトで環境設定などのために do を使ったファイル読み込みをしている場合は do "./localfile.pl"; のように明示的にディレクトリを追加しておいてください(もちろんFindBinを利用してもかまいません)。

また、require "jcode.pl"; のような行も、あれば同様の修正をお願いします(もっとも、jcode.plについてはそのままだとそもそも5.26では読み込み時にエラーになりますが)。

スクリプトをインストールするディストリビューションの場合

インストール時に bin/foo(.pl) のようなスクリプトをインストールするディストリビューションについては、追加の対策をしておいた方がよいかもしれません。コアに入っているものについてはいまのところスクリプトの先頭付近に以下のような行が追加されていますが、これについてはno lib "."; の方がよいという異論もあります(no lib "." なら明示的な perl -I. も封じることができますが、-I オプションを使える状況ならどちらにしても迂回できるので現状ではそれほど違いを気にする必要はないかと思います)。

BEGIN { pop @INC if $INC[-1] eq '.' }

なお、この行は基本的にはスクリプトやアプリの先頭付近に一度追加すれば十分です。

やってはいけないこと

use lib "."; は探索パスの「先頭」にカレントディレクトリおよび関連ディレクトリを追加してしまうので、うかつに使うとかえって発端となった脆弱性の影響を受けやすくなってしまいます。私的なスクリプトなどの応急処置には便利ですが、一般に公開するモジュール、アプリなどでは使用を避けてください。シェルスクリプト/バッチファイルなどから呼び出すperlのコマンドラインオプションに「-I.」を追加するのも同様の理由で危険です。

なお、CPANモジュールを使うだけの方は、5月のPerl Toolchain Summit以降にCPANクライアント(とTest::Harnessあたり)を最新にしておいていただければ、ほぼ問題なく5.26に移行できる(ようになる)見込みです。

YAPC::Kansai 2017に行ってきた

だいぶ遅ればせながらYAPC::Hokkaidoに引き続きYAPC::Kansaiも前夜祭から参加してきました。前夜祭についてはあいにく資料はありません。msysもcygwinも(ものによってはgnuwinのツール群も)入っていることとか、変換キーが「\」(カナ入力時には「ー」)、無変換キーがカナのオンオフ、半角/全角キーがエスケープになっていることとか、VMだけでなくWindows環境にもいちおうrakudoもgolangもnodejsもrubyもpythonも(もちろん複数バージョンのVisual Studioも)入っていることとか、話すつもりでいたことをもろもろ話し忘れたような気がしますが、誰得情報ということでご勘弁ください。ダイヤモンドカーソル依存やタッチパッドを無効にしている件も含めて、まっさらなノートPCを渡されると場合によってはものすごく困るクラスタに属しています。

本編の資料は以下の通りです。Perl 5、Perl 6ともに新しい安定版のリリースがあったわけではないのでHokkaidoからの引き写しも多いのですが、連続参加の方にも多少なりと新しい情報をお届けできるよう、Hokkaido以降に目にしたコメントなどへのレスを追加したり、2月にブリュッセルで開催されたFOSDEM 2017で仕入れてきた情報を追加したりしておきました。@INC問題についてはいよいよみなさんのところにも行動を求めるバグレポートが届き始めたようなので、別途記事を書いておきます。

何はともあれ、JPAはじめスタッフ、スポンサーのみなさま、ありがとうございました。Fukuokaも楽しみにしています。

2016/12/17

YAPC::Hokkaido 2016に行ってきた

London Perl Workshop 2016に続いてYAPC::Hokkaidoにも前夜祭から参加してきました。資料は以下の通りです。前夜祭では今年の夏にまかまかさんからメンテを引き継いだJSON(::PP)の現状、土曜日の本編では昨年までならPerl5やPerl6の重鎮が発表していたであろうPerl5/6の現状をウォッチャー目線でざっくりまとめておきました。夏のLigthweight Language of Thingsでは日本語でスライドを書きましたが、今回は海外からのスピーカーがいらしたということでスライドはいつも通り英語になっています。

あと、syohexさんの発表にあったメンテをやめたくなったときの話ですが、CPAN/PAUSEではLancaster Consensusで合意されたADOPTME、HANDOFF、NEEDHELPといったアカウントにパーミッションを与えておくと、作者/プライマリメンテナの意志を機械的に判別可能な形で明示できます。現状ではRTくらいでしか一覧できないのですが、Neil Bowers氏のサイトでは最終更新日やバグの多さなどの観点も含めて誰かが引き継ぎを行った方がよさそうなモジュールも一覧になっています。余力がある方は自分が利用しているモジュールや興味のあるモジュールが挙がっていないかご確認いただければありがたく(DBD::SQLiteがリストに挙がっている件はこちらで把握しています)。

なにはともあれ、29年ぶりという大雪のみならず、いろいろな点で感慨深いYAPCでした。JPAはじめスタッフ、スポンサーのみなさまありがとうございました。

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!

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 をご覧ください。