ラベル Perl の投稿を表示しています。 すべての投稿を表示
ラベル Perl の投稿を表示しています。 すべての投稿を表示

2013年11月22日金曜日

\L と \U と Perl

Perl スクリプトに文字列を渡すのに

count -t '\t'

のような感じでエスケープを使いたいけれど、Perl コアでそのものの機能は提供されていないということで String-Unescape というモジュールを作成中です。もちろん eval 使えば済むのは分かってるんですけど、文字列 eval はなるたけ避けたいということで。その中でぶつかった(自分的には)驚きの Perl 仕様について書いてみます。

ダブルクウォート内で \Q と \E で囲った範囲の英数アンダーバー以外をエスケープできる(quotemeta がかかる)というのは Perl 使いではそれなりに知られた事実だと思います。

say "\Q[|]\E";
# \[\|\+\]

同様に範囲で効く変換として \L, \U も存在は知っているという方も多いでしょう(最近は \F と言うのもあります)。で、これらは重ねることができると perldoc perlop には書いてあります。

\L, \U, \F, and \Q can stack, in which case you need one \E for each. For example:
 say"This \Qquoting \ubusiness \Uhere isn't quite\E done yet,\E is it?";
# This quoting\ Business\ HERE\ ISN\'T\ QUITE\ done\ yet\, is it?

さて、では問題です。以下はどのように出力されるでしょうか。

say "\Q[A\U[a\L[A\E[a\E[A\E";

正解は \[A\[A\[a\[a[A です。この時点で「は?」って感じですが、続いて第 2 問。

say "\U[a\Q[a\L[A\E[a\E[a\E";

正解は [A\[A[a[a[a です。もう訳がわからないという感じですが、真っ当に追っかける気を無くすコードを感覚で読み取ったところ、\U 中の \L や \L 中の \U があると、その前の \U, \L まで(途中に \Q とかがあればそれも)無効になった後で、新しく \L, \U が有効になるようです。\L や \U が一回しか有効にならないように \E が適宜補われると考えると分かりやすいかもしれません。

say "\Q[A\U[a\L[A\E[a\E[A\E";
say "\Q[A\U[a\E\L[A\E[a\E[A\E"; # 直前の \U が無効
# \[A\[A\[a\[a[A
# \[A\[A\[a\[a[A
say "\U[a\Q[a\L[A\E[a\E[a\E";
say "\U[a\Q[a\E\E\L[A\E[a\E[a\E"; # \U\Q が無効
# [A\[A[a[a[a
# [A\[A[a[a[a

\L...\U...\E...\E ってやっても外側の \L しか効かないから無駄じゃねーか、という意図であろうというのは推測できますが、個人的には「いや、書かれたとおりに実行しろよ」と言いたくなる挙動です。

もう一つ、エスケープ関連でお節介じゃないの?という機能として、\L\u と \U\l をそれぞれ \u\L と \l\U に置き換えるというものがあります。

say "\L\uaAA\E \U\lAaa\E";
# Aaa aAA

\u してから \L したら結局 \L だけじゃねーかってのは分かりますが、「勝手に書き換えるな、警告出せ」と思うわけです。

ちょっと気を利かせたつもりで全体として訳が分からなくなる、というのはある意味とても Perl らしいという気もしますが。元々 String-Unescape は Perl の処理と一致させることを目指そうと思っていたわけですが、この 2 つの挙動(特に前者)は無理して再現する必要はないだろうということで実装しないつもりでいます。

2013年9月26日木曜日

YAPC::Asia Tokyo 2013 参加メモ(二日目)

前稿に引き続き、聴講したトークの雑感を箇条書き的に。

Mojoliciousでつくる!Webアプリ入門 by Yusuke Wada

  • WAF 自作も楽しいけど、そこは本題じゃないんだからとりあえず WAF 使っとくのが良い、と。
  • ライブコーディングでさくっと作られてたのですごい簡単感が伝わってたと思います。
  • 「分けることで分かる」「少しづつやる(ことで俺スゲー感を持続)」俺スゲー感はモチベーション持続に有用ですよ、本当。新しいことやると楽しいんですよね。
  • CCF は WAF 使ってないんですが、特に model がきちっと分かれてないところは次の大改修前には手直ししたいという気になりました。

Programming AWS with Perl by Yasuhiro Horiuchi

  • with Perl 要素少なめ。
  • Python 製 AWS CLI が提供されてるので、Perl での自動処理用にはそれに対する wrapper AWS::CLIWrapper を使えば良いのではないかと、という感じですかね。
  • CLI と API 直叩きモジュールとどちらが良いという質問がありましたが、自動処理用には CLI 経由でいいでしょうけど、アプリ的にはモジュール使用なんじゃないですかね。

What's new in Carton & cpanm by Tatsuhiko Miyagawa

  • もちろん cpanm は使ってますけど Carton は使ってないんですよね。個人の趣味の領域だとそこまで必要性を感じないというか。
  • git URL 可になったのは patch 版指定とかできて嬉しい感じではあるんですけど、Dist::Zilla で github に置くと普通はインストール可にならないんで、その辺どうするのがいいのかな、と思ったりします。

GitHubでつくる、たのしい開発現場 by Hiroki OHTSUKA

  • どっちかっていうと精神よりというか、本来そういうことの方が重要だとは思うんですが、やっぱり具体的なツールとか Tips の方が分かりやすいんですよね。

可視化のためのPerl by Muddy Dixon

  • 可視化には Explanatory (ストーリー説明) と Exploratory (ストーリー探索) の 2 種類がある。
  • マイニング技術者はドメイン知識が少ない v.s. ドメイン専門家はマイニングの知識が少ないので可視化してドメイン専門家に見てもらおう、と。
  • DataCube の開発止まってるじゃんということで、Data::Cube をリリースされたとのことですが、「僕はこの手の処理はRでやります」という衝撃の結末からは、どうせこのモジュールも開発止まるんでしょ?、感が激しくします。

本当にあったレガシーな話 by Daisuke Maki

  • livedoor blog のモダン化について。モダン Perl 入門 増補改訂版 に書かれるそうです。題名は増補改訂版になっていますが 80% 変わっているとのこと。
  • 発表的にはとりあえず mod_perl dis だったと思っておけば大体合ってるんじゃないでしょうか。
  • とにかくログをとることがまず最初。設定切り替えには use constant による定数たたみ込み最適化の利用をすると良い。
  • 他色々あったんですが、$0 変えると ps で見たときに分かるというのは Tips は面白かったです。

スマフォアプリ開発を支える認証認可アーキテクチャ by Rieko Suzuki

  • 執筆記事の著者写真の時点でなんかもう色々と違う気がしましたが「糞アプリ」発言で逆に安心しました。

PhantomJSによる多岐にわたる広告枠の確実な表示テスト by Yusuke Yanbe

  • Selenium::Remote::Driver を使えば headless ブラウザである PhantomJS を操作できるのでそれを使ってテストするという話。

フルテストも50msで終わらせたい 〜 FreakOutの取り組み 〜

  • 最初にさすがに 50ms は無理ですとの潔いお言葉。
  • 一日目の soh335 さんの発表と結構被っていたとのこと。テスト用ユーティリティモジュールも用意されているそうです。
  • 実行順序に依存するテストを避けるために、テスト順序のシャッフルがおすすめとのこと。
  • File::Find, List::MoreUtils, Parallel::ForkManager, Net::OpenSSH, TAP::Harness といった CPAN モジュールを組み合わせて分散実行することで 2,000 秒 over → 180 秒に短縮。
  • CPAN モジュールの組み合わせというのがとても Perl らしくていいですね。
  • 「高速なテストは開発文化を変える」手元でやるより push した方が速いのでとりあえず push する文化に→コードが早期共有されてレビューも進み品質も向上。

LT

とりあえず分かる範囲でメモ。名前が分からない方とかもし抜けてたらすみません。

  • テストカバレッジについて http://coveralls.io/ というサービスがある。
  • DBIx::* の新しいモジュール。
  • makamaka さんの同人活動レポート。
  • HTTP から SMTP 送信ができる Haineko について。
  • Perl 入学式と近所の Perl Mongers のおかげで初心者でも「つぶやいてないでコード書け」というサービスができました!という話。いい LT だったと思います。
  • papix さんの Perl 入学式活動レポート。
  • kamipo さんの mysql-build の話。
  • もっとネタモジュールを!ということで netacpan.org できました。
  • kamadango さんのマイクロコミュニケーションの話。
  • tokuhirom さんの Test::Power っていうか HTTP::Body::Builder 作ったった。
  • mruby_nginx_module について。
  • pjf さんの method add_datapoint( Str: $goal!, Int:$timestamp) みたいに書ける Method::Signatures の紹介。
  • takesako さんの Perl クイズ。近藤嘉雪先生が優勝してました。チート級。識別子が 251 文字以下とかそんな制限あったんですね……

Keynote by Tomohiro Ikebe

  • 「Management and Perl culture」というタイトル。
  • マネージャーで画像検索するとリア充 マネージャーって管理するというより支える方じゃないの?
  • できるエンジニアにできるからマネージャーやれ、は最悪。とはいえチーム内のリーダーシップは必要。
  • 社内に対する広報(エンジニアの仕事が意味のある仕事だってことを伝える)ことも大事。
  • ……そんなに年が変わらないということにちょっとショックを受けました。

YAPC::Asia Tokyo 2013 クロージング by Daisuke Maki

  • 牧さん、櫛井さんのツートップによる YAPC::Asia はこれで終了、とのこと。後を継ぐ人が居ないとこれで終わり、ということなんでしょうか?
  • のべ参加者 1,000 人オーバー。うーむ、すごい。

まとめと余談

  • 今年の YAPC は Perl の話題が多いな、とかいう tweet を見ましたが、確かに Perl 寄りな感じで個人的には嬉しかったです。
  • 本当は今年発表できたらなーと朧気に思っていたのですが(Dist::Zilla の話とか)、Minilla と Milla のトークが応募されてるし、しかも Ricardo SIGNES ご本人来てるしってんで無理ゲーでしたね。LT できたらなーというネタは今年は余裕で間に合わなかったので来年に LT できたらなーと思っています。
  • 今回新しいノート PC (VAIO Pro 13)で参加しました。今まで一台のノート PC をどのシーンでも使い回す感じだったので 2kg 前半まで選択肢に入れていたのですが、重量というよりもバッテリーの持ちからこの手のイベントではちょっときついな、ということでモバイル用として購入。シートバッテリがなかったとしてもイベント中はもってそうでした。重量はあんまり気にしてなかったんですが実際に使ってみると、部屋の移動のときに横に抱えるのも楽だし AC アダプタもなくてそのまま運べるしで良かったと思います。

YAPC::Asia Tokyo 2013 参加メモ(一日目)

遅ればせながら、YAPC::Asia Tokyo 2013 参加メモ。

目が覚めたらいきなり当初乗るつもりだった電車の時間でしたが、最初の説明にわずかに遅刻する程度の時間で着。いきなり席が埋まってる感じでちょっとびびりました。メインの藤原洋記念ホール 1階席は後ろからの入り口が2ヶ所あるのですが、一度どっちかの入り口から入ってしまうと途中で別の通路側まで行くのは狭い席の間を移動するしかなく(ステージ直前では移動できたかも)手前通路側が埋まりがちになっていた気がします。 以下、聴講したトークの雑感を箇条書き的に。

Postcards from the Edge: The State of Perl 5 Development by Ricardo SIGNE

  • Dist::Zilla でも大変お世話になっている RJBS こと Ricardo SIGNES 氏の Perl5 の今後についての発表。
  • とりあえず pumpkin というのは Perl 5 のリリースマネージャ(というのが正確か分かりませんが)的な立ち位置の人だ、というのは以前の参加の時に聞いているので知っているのですが、何言ってるのかさっぱり分からない参加者の人とか居たんじゃないかな、というのは少し気になりました。
  • 「Perl5 は Perl5 であり続ける(意訳)」という言葉は印象的でした。
  • postfix dereferencing @{$hoge}$hoge->@* と書けるというのは確かにちょっとキモいですが Perl らしいキモさな気がします。実際 $hoge->[3]->{key} とか書いた後、あぁ array dereference しなきゃってんで、カーソル戻して @{ } で囲うとかいうのは超頻出パターンなので便利にはなるはず。
  • 本体開発側では互換性によってはじかれるパッチとか改良とかは少ないかもしれないですが、利用者側で互換性のために使用しない機能、とかは割とある気がします。モジュール書いててもより低いバージョンをサポートするためにより面倒な方法に書き直したりすることもありますし。強制アップデート的なことができれば楽かもしれませんが。

Perlのモジュールを公開するときに気をつけておいた方がよい**個のこと by Kenichi Ishigaki

  • 基本的に CPANTS の Kwalitee の説明という感じで、Test::Kwalitee::Extra とか書いてるくらいなので大体のところは既知でした。
  • バージョンの形式(v0.1.5 だとか 0.1.5 だとか 0.001005 だとか)について聞いてみましたが、「特殊なことしないのであれば 0.01 とか使うのが楽」とのことでした。なんかコンセンサス的なものが欲しいです……

Perl and Riak - 分散データストア Riak を Perl から "爆速" で使うために - by Tatsuro Hisamori

  • FreakOut さん所属。(前からそうで気付いてなかっただけかもしれないですが) YAPC での存在感が大きくなってる気がします。
  • 内容についてはどうこう言えるほど知らない分野なので割愛。
  • 「継続的に運用していくシステムにおいては"テストができる"ことはマスト要件」これ本当大事。

Inside amon2-livedoor-setup.pl with web application development 2013 by Kazuhiro Osawa

  • Team Geek 買いました。
  • 溺愛の初期設定スクリプトだと社内事情が考慮されてないので、各社でひな形設定スクリプトを作っておくとよいよ、という話。
  • コピペを排除するためのひな形スクリプトがコピペ対象に、というのはものすごく有りそうな話。
  • 「開発から本運用に必要なすべてを盛り込む」これは確かに大事だけど抜けやすそうな気がします。

SPDY、HTTP/2.0の使い方 by takesako

  • 使いどころ、というところまでは達してなくて今使うならどうするか、くらいでしょうか。
  • HTTPS 接続を強制する HSTS (HTTP Strict Transport Secruity) は初めて聞きました。
  • Outbound Port 80 Blocking は笑ってしまいましたが、でもそれでもいい気がしますね。企業等のフィルタリングが辛いかもしれませんが。MITM 的に中継する HTTPS フィルタ proxy とかは SSL によるセキュリティの根本的なコンセプトを損なう最低の存在だと思っているので許容不可。

Types and Perl Language by Masahiro Honma

  • 人全然居ないんじゃないの?と思ったら座れませんでした。
  • トラブルがあってデモができなかったり、本論に入る前のところで終わったりした感じで、もっとちゃんと聞きたかったですね。
  • ひょっとしたらトラブルが無かったらそうだったのかもしれませんがバックグラウンドの説明を廃して Typed Perl の実例側から話す、という流れもありだったんじゃないかと思います。

モダンPerlリファクタリング by Naoya Ito

  • Perl 徹底攻略 掲載ネタです。毎回全く新しいネタを話すというのはとても難しいことだとは思うのですが、既に書籍を持っている状態で聞くと割と悲しい気分になったりするので、発表→書籍出版の順番になるようにしてもらえると宣伝にもなって双方がハッピーかもしれません。いや、トーク内容にも書いてあるし確認しておけば良かったんですけど。
  • とにかくまずはテストを作ること、細かいテストをちまちま書いていくという意味ではなく、とにかく大外の I/F 切ってテストを書いて、あとはテストとコード修正を並行していく、という感じでしょうか。
  • Test::Base で DATA セクションに置くとかまではやらないですけど、テストケースをデータにまとめておくってのは良くやりますね。

perl な web application のためのテスト情報 by soh335

  • テストを書いてもらうために、テスト用の共通モジュール t/Util.pm を作ってテストを書く障壁を下げている、とのこと。
  • Web application に限らないですし、各種 Test モジュールの簡単な紹介もあるのでさらっとスライド見ておくといいんじゃないでしょうか。
  • コードだけじゃなく、ファイル命名規則だとか用語チェックだとかもテストすればよい、というのは確かにその通りでわざわざ別の枠組み使わなくても TAP で合わせてしまえばいいですね。

はてなのサーバ管理ツールの話 by Yuuki Tsubouchi

  • ものすごくざっくりまとめると、運用系のツールは各種あって組み合わせの柔軟度は持っていたいけど設定が分散するので中央のコントローラーは内製といった感じでしょうか。
  • 知見や経験がほとんどないところなんでなんとも言えないですが一通り紹介というよりはポイントに絞って話してもらったほうが良かったかもしれません。

LT

題目と発表者リストがあるかと思ったらスケジュールの所にないですね……。とりあえず分かる範囲でメモ。名前が分からない方すみません。

  • kazuho さんの prove の発表。prove は汎用 taskrunner である、と。(今後使うか分からない)拡張子限定の解除とか Tips 満載でした。
  • mobile factory の人。えーと何でしたっけ?モテる台詞でしたっけ?今年のネタ枠。
  • Tachikoma の話。依存ライブラリ指定を更新して commit して pullreq 出してくれる。n-click から 1-click だと商売になって、1-click から 0-click だと革命という台詞が印象に残りました。
  • yappo さんの HTTP::Builder::Body が欲しい、という話。
  • hirose31 さんの inspect running perl process という話。strace とかだと syscall しか見られないし gdb 系だと特定の環境に依存するしということで、inspect-perl-proc を作成。例えば perl プロセスが詰まってるときにどこの関数で詰まってるかとかが分かる。いや、これすごいんじゃないでしょうか。
  • yusukebe さんの YAPC::NA 行ってきた話。どこから来たの?で話ができるし、こちらから話を切り出せば聞いてくれるよ、とのこと。
  • eikichi さんの YAPC::Tohoku やりたい、という話
  • comewalk さんの OSS に対する貢献の話。別にコード書くだけが貢献じゃない、と。規模によるでしょうが、自分のような弱小個人だったりすると単に反応があるだけでも嬉しいですしバグレポだけでも「使ってくれてる人居たんだ(泣)」という気分になります。
  • bayashi さんの module 紹介。アップロードしたところで自分もすぐに使わなくなるかもしれないですが、ローカルにおいてるだけだと絶対に今の自分にしか使えないですが、上げれば誰かが使えるかもしれないですし、テストやドキュメントを書くので将来の自分にとっても役に立ったりするかもしれません。Milla, Minilla, Dist::Zilla とか使うと簡単にモジュールをアップロードできます。おすすめ。
  • gfx さんの Power Assert と Emscripten による perl.js の話。
  • mizuki_r さんの p5-Spica (Web service wrapper) の話。
  • Songmu さんの Riji (日記) の話。いや、中国語分からないっす。

以下次稿

2012年9月30日日曜日

YAPC::Asia Tokyo 2012 参加メモ

ブログ書くまでが YAPC::Asia らしいので。/.-j にしようか迷ったけど一応こちらで。

1日目、2日目で参加。1日目は新幹線が 80 分くらい遅れたため残念ながら Larry 氏のセッションは聞けず、その後から参加。YAPC 参加者は Web 界隈の人が多いんじゃないかと思っているが、そういう意味ではそもそも日常業務的に Perl どころがプログラミングも(基本)しないという点で特異な参加者な気もする(1日目は年休取得して参加)。ということで Web サービス寄りよりかは Perl 本体寄りのセッション選択、のはず。以降、各セッションの雑多なメモとか感想とか。

一日目

Acmeism, Pegex and CoffeeScript on CPAN

40 分の枠に収まらなかった感じ。もうちょいちゃんと聞きたかった。

リアルタイム通知システムの舞台裏

C++ Compiler Farm みたいなものを作っていて通知ではなくバックエンドのコンパイルサーバについてだがこの辺の管理(どのサーバに投げたか)とかどうしようというのと通ずるものがある気がした。メッセージキュー(RabitMQ)で解決したみたいだが、CCF では S3 がその位置に来そう。

Perl初心者が作ったサーバ運用ツール

英語での発表。運用ツールそのものについて自分に知見がないけど、テストがある、というのが重要なところか。ただこれ、テスト可能なように設定を綺麗に分離してやるというか、role と blueprint との関係が重要な気がする。

GitHubを使った開発とデプロイ

丁度 Perl モジュールの fork とかし始めたところだったのでそういう話なのかなと(勝手に)期待していたけどそうではなく普通にプロジェクトの中心リポジトリとして Github を使う感じだった。

Distributed Job System. Clutch

中央サーバを必要とせずクライアント側で振り分ける分散ジョブシステム、だろうか。多分構成次第? 多対多になるなら間に中央管理サーバを置いた方が楽になる気がするし、振り分け先が動的に変化するケースだと難しくなったりするんじゃないだろうか。

DBD::SQLite: Recipes, Issues, and Plans

正直一番実用的だったかもしれない。解析の仕方から考えなきゃならないデータに対してとりあえず DB に突っ込んで SQL で色々料理してみるというのはかなり強力なスキームだと思っているが、その上で SQLite は強い味方である。で、DB へのデータ投入とか SQL が苦手な処理をする時に一旦外でやろうとする場合などで DBD::SQLite はお世話になりまくりである。bulk insert は自分も prepare/分割commit/各種pragma on でやってたのでお墨付きをもらった感が。複数レコード insert は今度試してみたい。その他、DBD::SQLite ユーザーは一度軽く資料を眺めておくといいんじゃないかと思う。

Profiling memory usage of Perl applications

TreeMap によるメモリ使用量の視覚化デモが格好良かった。使われていたのは JavaScript InfoVis Toolkit だろうか。Interactive な視覚化をやるのに Javascript を使うというのは環境も(あまり)選ばないし便利な気がする。

平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用

実際の内容についてはどうこう言えることはないのだが、前振りのアドテック業界について、が非常に分かりやすい導入だったと思う。

Perlアプリケーションのベンチマークとプロファイリング

↑のセッションでもそうだがとにかく計測すること、視覚化することがまず重要か。CCF なんかはとりあえず立ち上げてるだけなので試せるといいなぁ。

LT

相変わらずネタ満載。

二日目

「新しい」を生み出すためのWebアプリ開発とその周辺

今回のベストトーク賞受賞セッション。企画の部分は、Web アプリに限らず何か作ろうと思ってる万人に得るものがあるのではないかと。実装については枯れたものを使えば十分というあたり? 11月末~12月発売予定という「Webサービスのつくり方」は期待大。

Padre - The Perl IDE for Normal People

Emacs ユーザーと Vim ユーザーが聴取者の大半というのが印象的。自分も Emacs も Vim もプログラミングに使わないけど IDE も(ほとんど)使わないという点で Normal People からは外れてるわけだけど。Perl ユーザーが拡張とかしやすいのは Perl で書かれた IDE というのはそうかもしれないけど Perl のコアユーザー層が IDE 使ってないわけで。Eclipse なんかは企業からの後押しが大きかったわけだし、一般ユーザー層への拡大の需要というかそういうのがないと難しいかもしれない。

Perl 今昔物語

日記をさらってみたところ自分は 2008 が初参加の模様。この手のイベント自体が初参加だった。2010 は 2 日目だけ参加、2011 はキャンセル(海外出張)。参加してない部分のタイムテーブルを見ると聞いときゃ良かったというのが結構ある。今後はもう少し参加に貪欲になってもいいかもしれない。内容としてはPerl で書く必然性が薄れてきた、みたいなことを言われていたのが印象的だった。他のセッションの内容にもその辺が出てきているような気がする。

Perl と SQL のいろいろ

DBI/DBD についての分かりやすいチュートリアル。周辺モジュールの簡単な紹介もあって参考になった。質問タイムでプレースホルダの強制ができないんで O/R マッパー使ってるみたいなコメントがあって、プレースホルダの使用くらいプログラマとして最低限度の常識じゃないのかと思ったけど現実はそうもいかないんだろうなぁというのが悲しいところ。

シリコンバレーと世界のPerlエンジニア

川崎さんがアクティブ過ぎて眩しい。「10年後に食える仕事 食えない仕事」から引用されてた「グローカル」「ジャパンプレミアム」「無国籍ジャングル」「重力の世界」っていうのは興味深い。元々の本だとプログラマは「重力の世界」みたいだけど日本の適当な開発要求とのブリッジングという位置では立ち位置はありそう。それはそれでしんどそうだけど。

Perlで始める!初めての機械学習の学習

メモ見たら PRML 同人誌とだけ書いてあったw。とりあえず手に入れたいと思う。perl-kinect は面白そうなので公開されないかなぁ。

Perl入学式をやってみた!

期待していなかったのだが(ごめんなさい)、熱い思いを感じられるいいセッションだったと思う。「ハードルを下げることを重視する」「継続して参加できる環境を作る」というのは他のイベント主催の人も参考にできるかもしれないが、このレベルまで頑張るのは相当大変なことだと思う。あと、Perl 入学式参加者の Perl のわかりにくかったところとして、リファレンス(-> が省略できる場合がある)、コンテキストの概念、ファイルハンドルの , の省略、辺りが挙がってたのはそうだよなぁ、と思わざるを得ない。慣れてくると大丈夫だし逆に楽に書ける要因になったりもするんだけど、場合に応じてうまい具合に挙動が変わる、は、むしろ初めての人にはわかりにくい、と。

Performance Profiling with Devel::NYTProf

他のセッションでも言われていたけど、まず計測しろ、と。あと、目標達成したらそれ以上余計な事しない。局所的な変更から積み上げる。

LT

相変わらずネタ満載。

How Perl Changed My Life & Closing

総括感想も含めて。なんだろう、所詮 Perl はプログラミング言語の一つな訳だけど、TMTOWTDI に代表されるその精神というかそういうのがコミュニティにも有ってそれだけ懐が深いというか、Closing で牧さんが the most welcoming conference みたいなこと書いてたけどそういうのが有るんじゃないかな、と。忘れていたけど自分としては初参加のイベントが YAPC::Asia 2008 だった訳で、そこから色々参加(だけは)するようになったのを考えるとそれなりに大きな転機だったのかもしれないとも思う。そういう意味で Perl ってのは自分の中で結構大きい割合を占めているかもしれない。実際「Perl は生活、C++ は趣味」という感じで技術ネタは C++ が多いけど実際書いてたり日常使ってるものは Perl の方が多かったりするし。今現時点で Perl を選ぶ理由ってのはそんなにないのかもしれないけど、でも自分は Perl が好きなんだなぁ、と思う。で、スピーカーの人にはせっかくの YAPC なので別に Perl べったりの内容にする必要はないと思うんだけどもう少し Perl 寄りの発表をして欲しいなぁという気持ちもあったり。まぁとにかく来年も参加したいと思う。

2012年9月8日土曜日

小ネタ: Perl の警告: Deep recursion on subroutine ...

Perl では再帰呼び出しのネストが深いと警告してくれる機能がある。定石的に use strict; use warnings; していれば有効になっている。

use warnings;
sub dfs {
    if($_[0] < 101) { dfs($_[0]+1); }
}
dfs(0);
Deep recursion on subroutine "main::dfs" at ... line 3.

perldiag には "unless you're writing strange benchmark programs, in which case it indicates something else." などと書いてあったりするのだが、閾値が 100 であるためちょっと大きめのグラフに対して再帰で DFS かけたりしたら余裕で突破したりするのである。警告を抑制したい場合、Perl の警告はカテゴリ分けされているため再帰に関する警告だけオフにしてやればいい。

use warnings;
no warnings 'recursion';
sub dfs {
    if($_[0] < 101) { dfs($_[0]+1); }
}
dfs(0);

が、これだと全体で警告がオフになってしまう。Perl の警告制御は lexical scope である。これは限定した部分で警告をオン・オフできるということだが、

use warnings;
sub dfs {
    if($_[0] < 101) {
        no warnings 'recursion';
        dfs($_[0]+1);
    } # End of the effect of no warnings
}
dfs(0);

もう一つ、dynamic scope ではない、ということも意味している。つまり、以下では警告は抑制されない。

use warnings;
sub dfs {
    if($_[0] < 101) {
        dfs($_[0]+1);
    }
}
no warnings 'recursion';
dfs(0);

実際に deep recursion が発生するのは dfs(0); の実行中じゃないかと思ってしまうのだが、字面上(lexical)は 4 行目の dfs 呼び出しで発生するからだ。

2012年8月4日土曜日

LL Decade 「君ならどう書く Online」 で書いたコード

本日(8/4)開催された、LL Decade では「君ならどう書く Online」という企画がありました(問題の内容はリンク先参照)。14:00 までという短い時間と告知がそれほど強いものではなかったこともあってか参加者は 14 名(+締め切り以降10名)(間違ってるかも)だったそうですが、おかげで商品をゲットすることが出来ました。問題発表前は C++ Template Meta Programming で書いて「コンパイルの必要もない Lightweight です(キリッ」とかやろうかと思ったのですが、文字列の validation ということで断念しました。で、順当に Perl で書いた訳ですがせっかくこういう場で書くんだから多少のひねりが欲しいところです。という訳で書いたのが以下のコード。文字列処理ということで正規表現さんにお出まし願ったわけですが、普段使わない機能を使ってみました。

#!/usr/bin/perl

# regexp 内でそれなりに頑張る

use utf8;
use strict;
use warnings;

local $/; # slurp
my $t = <STDIN>;
$t =~ s/^(
   (?<ipv4>(?&ipv4_))|
   (?<ipv6>(?&ipv6_))|
   (?<mac>(?&mac_))|
   (?<any>.*)
  )$
  |(?<spc>\s+)
  (?(DEFINE)
   (?<ipv4_1>1[0-9]{2}|2([0-4][0-9]|5[0-5])|[1-9]?[0-9])
   (?<ipv4_>(?:(?&ipv4_1)\.){3}(?&ipv4_1))
   (?<ipv6_1>[1-9a-fA-F][0-9a-fA-F]{0,3}|0)
   (?<ipv6_>(?:(?&ipv6_1):){7}(?&ipv6_1))
   (?<mac_1>[0-9a-fA-F]{2})
   (?<mac_>(?:(?&mac_1):){5}(?&mac_1)|(?:(?&mac_1)-){5}(?&mac_1)) # 格好悪い。backreference でいける?
  )/@{{
   ipv4 => '01',
   ipv6 => '10',
   mac => '00',
   any => '11',
   spc => '',
  }}{keys %+}/mxge;

print pack('B*', $t);

9,10 行目は Perl5 だと悲しい slurp。以降の(一応一つの)正規表現で 0 と 1 の文字列に変換してから pack() で普通の文字列に復元という流れになっています。18行目からの (?(DEFINE) で始まっている部分は正規表現パターンに対して名前を付けている部分です。(?<name>pattern) で pattern に対して name という名前を付け、(?&name) で呼び出している訳です。hoge_1 になっているのがアドレス構成要素 1 要素分、hoge_ になっているのがアドレス全体に対するパターンです。これを (?<name>pattern) で hoge として名前付きキャプチャしています(12行目から)。名前付きキャプチャの結果はハッシュ %+ に設定されるので、keys を使って有効なキャプチャ名(hoge)を取得し、ハッシュで値を置き換えています(25行目)。keys をリストコンテキストで評価したいので(ハッシュリテラルに対する)ハッシュスライスを使っています。わざわざハッシュリテラルを使っているのはその方がなんか格好良さそうだからです。spc 関連は改行削除用のものです。正規表現のオプションとしては、複数行に ^$ をマッチさせるための m、空白等を入れるための x、全体を置き換えるための g、eval するための e を指定しています。こうして変換した後は pack を使って変換して出力するだけです。

perlre とか見ながら即席で書いたにしてはなかなか面白みのあるコードに仕上がったんじゃないかと思います。IP アドレス等にマッチする正規表現そのものがあんまりいけてない感じなのがちょっと残念なところですが。もっと格好良い書き方がある気がします。

ちなみにもらった商品は、iOS プログラミング第2版(ISBN978-4-86401-049-8) なのですが、Mac 持ってないんですよね。iPad も会社支給(貸与)された今、MBP とかを買うべきと言うお告げだったりするのでしょうか。