Shibuya.pm#16「夏の正規表現祭り」開催しました

2011年7月6日(水)にShibuya Perl Mongersテクニカルトーク#16「夏の正規表現祭り」を開催しました。

http://shibuya.pm.org/blosxom/techtalks/201107.html

今回は株式会社ミクシィさんの新オフィスのセミナールームをお借りして開催することとなり、その後の懇親会も隣のコラボレーションルームで開催することができました。素敵なオフィス体験でした。

今回は正規表現オンリーで2時間以上語りつくすイベントとなりました。参加された皆さん、長時間お疲れさまでした。

正規表現ネタ縛りという無茶ぶりにもかかわらず、快く発表を引き受けてくれた発表者の皆さま、乾杯の音頭をとっていただいた歌代さま、素敵な会場と懇親会の手配をしてくれた株式会社ミクシィのスタッフの皆さま、本当にどうもありがとうございました。

私の発表した資料は以下にアップロードしました。

いつかまた機会があれば、来年も正規表現のお祭りを開催できるといいかもです。ありがとうございました!

参考リンク

  1. 今日はShibuya.pm #16の日です – a geek born in Tomakomai
  2. イベント座席表 [ #shibuyapm Shibuya Perl Mongersテクニカルトーク#16 ]
  3. [perl]Shibuya Perl Mongersテクニカルトーク#16で配られたうちわの解説 – 猫型開発者 [参考画像]
  4. Shibuya.pm #16 に行ってきた – 刺身☆ブーメランのはてなダイアリー
  5. Shibuya Perl Mongersテクニカルトーク#16 アウトラインメモ | Web scratch
  6. 本を読む Shibuya.pmテクニカルトーク#16をustで見ました
  7. Shibuya.pm 〜夏の正規表現祭り〜 で好きなこと喋ってきた. | sw@mac
  8. Togetterまとめ – Shibuya Perl Mongersテクニカルトーク#16「夏の正規表現祭り」

Perl で学ぶ x86 アセンブラ入門 (Shibuya.pm#11発表資料)

前々回のShibuya.pmテクニカルトーク(XS Nite)では、PerlのC言語拡張モジュールを作成する方法について詳しく解説しましたが、ちょっとしたことを実現するだけでも、PerlVMの構造を理解し、大量のCのマクロを使いこなす必要がありました。やっぱりXSは面倒だよね、ということで、複雑なC言語のレイヤーを飛び越えて一気にPerlからマシン語の世界に飛び込んだらどうなるか?ということをテーマに今回の「no Perl; use x86;」というスローガンを掲げてみました。

■ 発表資料: Perl で学ぶx86アセンブラ入門

4/22に開催したShibuya Perl Mongers テクニカルトーク #11「no Perl; use x86;」での私の発表資料を公開します。

 

■ Perlの正規表現で書く x86 JIT Compiler

#!/usr/bin/perl
use DynaLoader;
$ENV{PERL_SIGNALS}||($ENV{PERL_SIGNALS}="unsafe",exec$^X,$0,@ARGV);
my $x86="\x0f\x0b";$SIG{ILL}=sub{$x86=~s/\x0f\x0b/\xc3\x90/; warn"JIT"};
DynaLoader::dl_install_xsub("X",unpack"L",pack"P",$x86);&X; print"ok\n";
実行結果
% perl ud2jit.pl
JIT at ud2jit.pl line 4.
ok

このプログラムの解説

せっかくなのでこのプログラムが何をしているのか1行1行詳しく見ていくことにします。

use DynaLoader;

今回のShibuya.pm#11で毎度お馴染みの DynaLoader Hacks のために必要なモジュール宣言です。

$ENV{PERL_SIGNALS}||($ENV{PERL_SIGNALS}="unsafe",exec$^X,$0,@ARGV);

ここでは環境変数PERL_SIGNALSが定義されていないときは$ENV{PERL_SIGNALS}="unsafe"で環境変数を代入した後、exec($^X,$0,@ARGV)で自分自身をもう一度実行しなおすようにしています。これは、次で説明するシグナルハンドラ$SIG{ILL}にPerlサブルーチンのフックをしかけるために、環境変数PERL_SIGNALS="unsafe"を設定してからperlコマンドを実行するようにしているためです。

my $x86="\x0f\x0b";$SIG{ILL}=sub{$x86=~s/\x0f\x0b/\xc3\x90/; warn"JIT"};

変数$x86に2byteの機械語"\x0f\x0b"をPerlの文字列として代入しています。
次では、シグナルハンドラ$SIG{ILL}を定義して、$x86=~s/\x0f\x0b/\xc3\x90/;として、機械語の命令をPerlの正規表現で自己書き換えするようにしています。正規表現の置換が終了したらwarn"JIT"で「JIT at ud2jit.pl line 4.」と現在実行しているPerlプログラムのファイル名と行数が表示されます。

このUD2命令("\x0f\x0b")はPentium Pro で追加されたオフィシャルなundefined(未定義)命令ということなのですが、元々未定義の命令領域だったものなのでPentium Pro以前のPentium、i486、i386でも SIGILL(4) illegal hardware instruction が発生します。UD2命令はオフィシャルに動作が定義された未定義命令ということで、その副作用から様々な応用例が開発されています。一つはx86に依存した言語処理系VMの高速化(最適化)などです。

「“ud2” は x86 が未定義命令例外を発生する命令。この命令を読むと CPU はそれ以降の命令の Prefetch を停止する。これにより無駄な Bus Traffic と I-Cache の使用を抑制する。」(Shibuya.lisp Tech Talk #1)

ちなみに、未定義命令を実行して例外が発生した場合、プログラムカウンタEIPは未定義命令の先頭のままなので(プロセッサが何バイト進めばよいかわからないため)、自己書き換えしたい場合は未定義命令そのものを書き換える必要があります。これはINT命令などでソフトウェア割り込みを発生させたときとは動作が異なるので注意が必要です。

DynaLoader::dl_install_xsub("X",unpack"L",pack"P",$x86);&X; print"ok\n";

DynaLoader::dl_install_xsubで変数$x86に代入されているC文字列のポインタをDynaLoader::dl_install_xsubに渡して、コンパイル済みのCライブラリの関数ではなく、直接$x86に記述した機械語を呼び出しています。
無事に$SIG{ILL}に登録されたシグナルハンドラが呼び出されて自己書き換えが行なわれたらx86のRET命令"\xc3"で呼び出し元に戻り、Perlの処理が続行され、print"ok\n";が実行されokと表示されます。

ちなみに、"\x90"はx86でnop命令を意味しています。このnop命令も奥が深く、最速の1byte nop、2byte nop、3byte nop命令などがプロセッサ毎に定義されていて、ユニバーサルなx86イディオムが各所で研究開発され、その成果が取り込まれていたりします。
一部はLinux kernelのソースコードなどに反映されたりしています。

■ おまけ:Inline/x86.pm

package Inline::x86;

use DynaLoader();
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(x86_sub);

sub x86_sub {
  my ($func, $x86) = @_;
  if ($^O eq "linux") {
    require 'syscall.ph';
    my $size = int(2+length($x86)/4096)*4096;
    syscall(&SYS_mprotect,(unpack"L",pack"P",$x86)&~4095,$size,7);
  }
  DynaLoader::dl_install_xsub(caller(0)."::$func",
                              unpack"L",pack"P",$x86);
}

1;

みたいなPerlモジュールを作っておくと、

use Inline::x86 qw(x86_sub);

x86_sub function1 => do {
  "\x90\x90\x90". # nop x 3
  "\xc3";         # ret
};

のように x86の実行コードをPerlからスマートに呼び出せるようになるので便利です。

■ まとめ

「XSを書くよりもx86を直接書いたほうが覚えることが少なくて簡単でしょ?」

■ Shibuya.pm#11 感想リンク

今回はustream中継は行ないませんでしたが、こんなニッチなネタにも関わらず定員200名近くの会場がいっぱいになってびっくりです。次々回はもっと突っ込んだ64bit最適化の話とかができれば嬉しいです。次回Shibuya.pmは低レベルでない通常のPerlネタを考えていますのでどうぞご安心下さいませ。

  1. Security&Trustウォッチ(58) Perl Mongersはセキュリティの夢を見るか? − @IT
  2. 今日はShibuya.pm #11の日です – a geek
  3. Shibuya.pmを聞きにいったらドッペルゲンガー…? – nikki.da!
  4. Shibuya Perl Mongers #11 に参加して – makotoworldのはてなダイアリー
  5. 汚いなさすがPerlきたない – 糸且之入Eヨ言己
  6. セミナーのレポート書ける人って凄い – だるろぐ
  7. Shibuya.pm#11で発表しました – use GFx::WebLog;
  8. Shibuya.pmに行った件 – ハギプラン(愛称:ハプラン)
  9. perlでdtrace環境構築 – handlerの日記
  10. Shibuya Perl Mongersテクニカルトーク#11 でLTしてきました – 葉っぱ日記
  11. Shibuya Perl Mongersテクニカルトーク#11@リクルート本社サウスホール – jitsu102の日記
  12. JPA#1 and Shibuya.pm#11 – Learn to Crawl
  13. Ptrace と TOCTOU 攻撃 – id:kazuhookuのメモ置き場
  14. Shibuya.pmに参加してきました – DesigningとEngineeringの架け橋
  15. shibuya.pmのLT – べにんじょのやっぽ
  16. 活動報告:元現役高校生サーバー管理者の考察日誌 – CNET Japan
  17. 이빨까기인형 :: [ Perl ] Shibuya.pm TechTalk #11 에 다녀와서…
  18. Shibuya.pmテクニカルトーク#11いってきた – 発言注意!
  19. WindowsユーザのためのはじめてのPerlプログラミング
  20. 終わった – webGOTH
  21. にひりずむ::しんぷる:Shibuya Perl Mongersテクニカルトーク#11に滑り込みで行って来た
  22. JPAとかShibuya.pmとか – Charsbar::Note

最後に、無茶なお願いにもかかわらずShibuya.pmでの講演を快諾していただいた皆さん、「no Peel; use x86;」なShibuya,omにご来場いただいたPerlモンガーもしくは他の言語使いの皆さん、当日会場でログをまとめていただいたhirataraさん、本当にありがとうございました。

4/22(水)Shibuya.pm#11開催します

Shibuya.pmテクニカルトーク#11を2009年4月22日(水)に開催します。

とりあえず、仮のプログラムですが、告知&申し込みフォームを公開しました。

  • テーマ – "no Perl; use x86;"
  • 日時 – 2009年4月22日(水) 18:30-21:00 (18:00 開場)
  • 会場 – グラントウキョウサウスタワー23F リクルート本社サウスホール
  • 住所 – 東京都千代田区丸の内1-9-2 (JR東京駅 八重洲南口すぐ)
  • 料金 – 無料
  • 事前登録 – 申し込みフォームより受付開始しています(定員200名)
    http://shibuya.pm.org/blosxom/techtalks/200904.html

会場はリクルートMTLの川崎さんにお世話になりまして、机付きの200人規模の大きな会場を使わさせていただくことになりました。ありがとうございます。

ちなみに今回のプログラムは XS Nite のときよりも低レベルになる予定です。正規表現やPerlに詳しくない方でも安心して聞ける内容になると思います。現在お使いのプログラミング言語を問わず、ふるってご参加ください。

Shibuya.pmリーダーとしてインタビュー取材を受けました

Shibuya.pmリーダーとしてインタビューを受けた記事が公開されましたので、ご報告です。

参加者の成長を見守る、Shibuya.pm 2代目リーダー − @IT自分戦略研究所

参加者の成長を見守る、Shibuya.pm 2代目リーダー − @IT自分戦略研究所

記事トップの写真は、プロカメラマンの大星直輝さんによる撮影です。
自分でもびっくりするほどかっこよく撮っていただきありがとうございます。

インタビューを受けたのは
@IT自分戦略研究所 今週のリーダー」という面白い企画で、
技術者経験があり、現在はリーダーもしくはマネージャ的な役割を果たされている「若手リーダー」にインタビューし、その経験、リーダーシップに対する考え方を紹介し、それを通して読者に「リーダーシップとは何か、どうすれば身に付けられるのか」を伝える企画だそうです。

次はどんなリーダーの方の記事が掲載されるのか楽しみですね。

アイティメディアの長谷川さん、素晴らしい記事をありがとうございました。

ちなみに、次回Shibuya.pmは4月にテクニカルトークを開催する方向で準備を進めていますので、どうぞご期待ください。

■ 参考文献
  1. TAKESAKO @ Yet another Cybozu Labs: Shibuya.pmリーダ交代式@バソキヤオフ
  2. Shibuya.pm と私 – にぽたん研究所

Shibuya.pm#10お疲れ様でした

Shibuya Perl Mongersテクニカルトーク#10無事、終了いたしました。
雨の中にもかかわらず、サテライトの会場にお越しいただいた皆様、
現地の会場までお越しいただいた皆様、本当にありがとうございました。

牧さんのJPA話

今回は福岡・大阪・京都・御茶ノ水などの複数の箇所での
パブリックビューイングも初めて公式に開催しましたが、
ustream.tv の中継もトラブルもなくうまくいき(cojiさんありがとうございました)
気付いたときは視聴者数が 200 viewers を越えていました。

各サテライト会場でホスト役を務めてくださった会社の皆様(ネットエージェント様、はてな様、Fusic様、SST様)、本当にありがとうございました。
また、いつも素晴らしい会場を無償で貸し出していただいているIIJの皆様(今回は特に堂前さん)、本当にお世話になりました。

当日のプログラムはこんな感じで…

  • 第一部 Main Talks
     
       
    1. 18:30 TPF-J(仮)について (lestrrat) 発表資料
    2.  

    3. 18:50 初心者向け Perl OO 講習 – LL温泉報告 (tokuhirom)
    4.  

  • 第二部 特別企画「最速Perlフレームワーク研究会」
     
       
    1. 19:00 Benchmark of Perl Web Application Frameworks (hidek)
    2.  

    3. 19:10 Yacafi と見せかけて Module::Setup の話 (Yappo)
    4.  

    5. 19:15 MENTA (tokuhirom)
    6.  

    7. 19:20 NanoA (kazuho) 発表資料
    8.  

    9. 19:25 Catalyst の次は Mojo ? (charsbar)
    10.  

    11. 19:30 質疑応答/休憩
    12.  

  • 第三部 Demo Talks
     
       
    1. 19:45 "remedie" pluggable media center application (miyagawa)
    2.  

    3. 19:55 "kamaitachi" perl flash media server (typester)
    4.  

    5. 20:10 ウェブサービスにおける SSD の使い方 (kazuho) 発表資料
    6.  

  • 第四部 Lightning Talks
     
       
    1. 20:25 Moxy at Dwango(仮) (acotie)
    2.  

    3. 20:30 EC2 と S3 で Hadoop する (lopnor)
    4.  

    5. 20:35 SVありーな概要 (wakapon)
    6.  

    7. 20:40 Acme::Acme::Don’t 2.0 (gfx)
    8.  

    9. 20:45 EBCDIC 2.0 Binary Hacks (takesako)
    10.  

    11. 20:50 Yokohama.pm 活動報告 (clouder)
    12.  

    13. 20:55 京都観光を終えて (mala)
    14.  

このように滞りなく進行できたのも、すべて発表者の方々の準備とご協力のおかげです。
wakaponさんが事情により当日会場に来られなかったというアクシデントが一つありましたが、
それ以外は大きな問題はなく、無事時間までに終了することができました。

家に帰ってブログを書くまでがShibuya.pmということで、
ぜひ今回のテクニカルトークで感じたことなどを書いていただけると有難いです。
今後の運営の参考にしたいと思います。

早速、講演録画がニコニコ動画にアップロードされたようです。(cojiさん、いつも仕事が速くて素敵です) → http://www.nicovideo.jp/mylist/9691133

読んだブログの記事は感想リンク集に追加していきたいと思います。

続きを読む

Shibuya.pm#10「最新Perlフレームワーク特集」

Shibuya Perl Mongersテクニカルトーク#10「最新Perlフレームワーク特集」を2008年11月27日に開催します。

     
  • 日時 – 2008年11月27日(木) 18:30-21:00 (18:00 開場)
  •  

  • 会場 – 神保町三井ビル 17F 株式会社インターネットイニシアティブ (IIJ) 大会議室
  •  

  • 事前登録 – 以下の参加フォームからお申し込みください (定員100名)
  •  

  • URL – http://shibuya.pm.org/blosxom/techtalks/2008011.html

今回は普段Perl以外の言語(PHPやRubyやPythonなど)を使われている方にも楽しめる内容となるように、Perlのオブジェクト指向がスッキリわかる「初心者向け Perl OO 講習」や、Catalystだけじゃない!「Perlの最新Webアプリケーションフレームワーク特別比較」セッションを企画しました。その他、EC2 と S3 で Hadoop する話や、flash media serverのPerl実装のデモや、SSDで安価な検索エンジンを構築する方法など、Webサービスに関連する幅広い話題も取り扱っています。なお、今回は特別にインターネット中継では味わえないmiyagawaさんの特別セッションも予定されています。最近活発に活動を始めた新しいPerlコミュニティYokohama.pmの活動報告や、これから立ち上げを準備しているTPF-J(仮)の話も聞くことが出来ます。どうぞお楽しみください。

追記:パブリックビューイング会場のご案内

YappoLogs: Shibuya.PM tech talk #10 の申し込み間に合わなかった人への提案とust時代の勉強会の関わり方

  1. 大阪Shibuya.pm ustream中継 新大阪サテライト会場 – 葉っぱ日記
  2. 京都Shibuya Perl Mongersテクニカルトーク#10 京都サテライト開場のご案内 – antipop
  3. 福岡Fukuoka Perl Mongers: 「Shibuya Perl Mongersテクニカルトーク#10 福岡サテライト」開催のお知らせ

パブリックビューイング会場一覧ページ (by doumaeさん)

本日開催 Shibuya.pm#9 (通称:XS Nite)

Shibuya Perl Mongersテクニカルトーク#9 (通称:XS Nite) を2008年6月25日に開催します

     
  • 日時 – 2008年6月25日(水) 18:30-21:00 (18:00 開場)
  •  

  • 会場 – 神保町三井ビル 17F 株式会社インターネットイニシアティブ (IIJ) 大会議室
  •  

  • 料金 – 無料
  •  

  • 事前登録 – (定員100名) 定員に達したので締め切りました。 キャンセルが出たので下記で追加募集中
  •  

  • ストリーミング

     

  •  

  • プログラム 内容・順番・時間などは予告なく変更する場合があります。

    • 第一部「XS 概論」
       
         
      1. 18:30 はじめてのXS – ハマりどころはココだ (hirose31)
      2.  

      3. 18:45 Perl 5 internals の世界にようこそ (Daisuke Maki)
      4.  

      5. 19:30 休憩
      6.  

    • 第二部「XS 若手の会」
       
         
      1. 19:50 Inside Ruby.pm (藤 吾郎)
      2.  

      3. 20:10 PerlMachine (wakapon)
      4.  

    • Lightning Talks
       
         
      1. 20:30 autobox.xs 徹底解説 (tokuhirom)
      2.  

      3. 20:35 PL_check Hacks (Yappo)
      4.  

      5. 20:40 arguments.callee の作り方 (TAKESAKO)
      6.  

      7. 20:45 gdbでXS on mod_perlをデバッグ (stanaka)
      8.  

      9. 20:50 Abstract Script Engines (Akira Higuchi)
      10.  

      11. 20:55 Acme::PerlVMGolf (tokuhirom)
      12.  

YAPC::Asia 2008 Tokyo で一部(※)人気だったセッションをもとに、今回は XS Nite と称して、これから XS を書いてみようと思う Perl プログラマの人を対象に、PerlとCライブラリとの拡張インターフェースを作るためのマクロ言語 XS だけについて語る XS only イベントを開催します。C言語で書かれた Perl 処理系の内部構造についても軽く中身をのぞいてみる予定です。

※一部の人に人気だったセッションという意味です。C言語の話がメインです。Perlのプログラムはほとんで出てこないと思います。このセッションの内容を近い理解するためにはPerlよりもC言語の知識が必要です。あらかじめご了承ください。

■ 追加募集

申し込み間に合わなかったけど参加したい人

キャンセルが2名でましたので、追加で参加募集します。
参加希望の方はこのブログのエントリーに「Shibuya.pm#9参加希望」と書き込んでください。
定員に達したらまた締め切ります。

(万が一SPAMコメントに分類されたらごめんなさい)

YAPC::Asia 2008 Tokyo について(デブサミ発表資料公開)

デブサミ2008「ネットコミュニケーション2.0」(旧称:竹迫アワー)のセッションで発表したLTの資料を公開します。

「地域コミュニティに国境はないかも」というタイトルで
YAPC::Asia 2008 Tokyo
について告知を行いました。

ちょうど今年のデブサミのテーマが
「越境しよう! コードで世界を変えよう」という題目だったので、
開かれたPerlコミュニティの実例を紹介しようと思いました。

地域コミュニティとITについては、地域格差と情報格差の問題が切り離せないのではないかと
最近思っていて、それを越境するためのYAPCかなと。

Shibuya.pmのコアメンバーである
宮川さん、台場さん、エマーソンさん、佐藤さん、小山さん、上之郷谷さん、
その他、スポンサーの皆さんのご協力により開催準備をすすめています。
本当にありがとうございます。

おかげさまでYAPCメイントークのCFPは〆切までに64件のサブミットがあり、
15社の皆様よりスポンサーシップのご協力をいただいているところです。

今年は2006年に引き続き Larry Wall も来日する予定になっていますので、
ぜひお見逃しなく。

続イメージファイト – HTML 2.0 New Browser Detection

Shibuya Perl Mongersテクニカルトーク#8 で発表した「続イメージファイト」の資料を SlideShare で公開しました。

Shibuya.pm#8 続イメージファイト – HTML 2.0 New Browser Detection

JavaScriptやCSS Hacksを一切使わずにHTMLでブラウザを判別するハックの紹介です。


HTML 2.0 – Browser detection [3]
HTML 2.0 only

ブラウザ判別のデモのページにアクセスすると、使っているブラウザの画像が表示されます。

このimgタグのsrc属性はfirefox2.0、firefox1.5、その他のGeckoエンジンを搭載したブラウザ、Safari2、Safari3、Opera、ie、w3m、lynxなどのブラウザの判別に対応しています。

テキストブラウザの判別
w3m - demo

この手法を使うと w3m と lynx の判別もできます。

lynx - demo
デバッグ風景
Debugging Browser-detection on papers

HTMLタグだけでブラウザ判別を行なう手法はまだ体系化されていないため、こんな感じで机上デバッグしてデモのコードを作りました。

参考文献
  1. ブラウザ振り分けクイズ – hoshikuzu | star_dust の書斎 (id:hoshikuzuさん)
  2. 葉っぱ日記 – ブラウザによって異なる画像を表示する(その2) (id:hasegawayosukeさん)
免責事項

ちなみに、ブラウザのバグや細かい実装に依存したハックは、ブラウザのバージョンアップによって覆される可能性が高いですので、一切無保証です。予めご了承下さい。