« 不自然言語処理コンテスト開催中、Baidu絵文字入りモバイルウェブコーパスがすごい | メイン | Cybozu Developers Conference 2010 無事終了 »

2010年10月21日 (木)

YAPC::Asia 2010 Tokyo に参加して

10/14-15、東工大の大岡山キャンパスで開催された「YAPC::Asia 2010 Tokyo」に参加してきました。 いくつか手持ちのデジカメで写真を撮影しましたので、それらを交えながら自分の発表を中心にレポートしたいと思います。

■ Day 0 - 前夜祭 (10/13)

P1040355.JPG Free Beer

前夜祭ではPerlCasual#4のイベントが開催されていましたが、 入り口のロビーでビールが振舞われ、日本語のわからない海外スピーカの方も和気藹藹と楽しんで行かれたようです。 yusukebeさんも一発表者としてではなく運営側に立つと真面目になるんだなぁという、意外な一面も垣間見れたりしました。

■ Day 1 - Lightning Talks (10/14)

絶対コケるなよ! P1040430.JPG

初日のライトニングトークの一番最後に「That Goes Without Alpha-Num (or Does It?)」という内容で発表させていただきました。 元々は「all your base10 are belong to us」という発表タイトルを予定していたのですが、 朝一番のLarry Wallさんのkeynoteで「That Goes Without Saying (or Does It?)」という発表で他のプログラミング言語を紹介されていましたので、 急遽タイトルを変更し、スライドの構成を変えました。

発表スライドはslideshareに、動画はyoutubeで公開されています。

LTの途中で披露したコンソールでgccでコンパイルして実行するデモは、ttyrec録画したものをTeraTerm+ttyplayで再生しています。

二日目のnipotanさんのライトニングトークで、シャッフルするコードで使える文字を禁止して何とかプログラミングをするという発表がありましたが、 最初にアルファベットをすべて使用禁止した状態でさらにどの記号を削減するか、というスタートラインが違うだけで、基本的にはやりたいことは同じです。

わかりやすくPerlの例で説明すると、

sub{print'YAPC!'}->();

ここで使われているsub、print、YAPCのアルファベットの使用を禁止してみますが、evalでできてしまいますね。

eval"\x70\x72\x69\x6E\x74\x22\x59\x41\x50\x43\x21\x22";

全部のアルファベットを使用禁止にしたらどうなるんでしょうか? → それ、Acme::EyeDropsでできるよ

''=~('('.'?'.'{'.('`'|'%').('['^'-').('`'|'!').('`'|',').'"'.('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').'\\'.'"'.('{'^'"').('`'^'!').('{'^'+').('`'^'#').'!'.'\\'.'"'.'"'.'}'.')')

ということなのですが、Acme::EyeDropsでは記号32種類が全部使われるのでもっと少なくしたいです。というわけで必要文字種類をさらに24個減らして、

""=~(("('''''''''(''''=)"|"(=)''=))')('')'|)"^"~~())(='|(^)^'|~~")^("~~~~~~~~'~)~'~'~~"^"~~~~~~~~~~=~=~~~~"|"~~|~|~||)^'^())~~"))

"(^=~)|'の8種類の文字を組み合わせるだけで、任意のPerlコードを実行することができました。 Brainf*ckは+-[]<>.,の8種類ですが、PerlはBrainf*ckと同様8種類の記号の組み合わせでチューリング完全ということがわかりました。よかったですね!

32bit x86では10種類の文字 %-#),[_]`~ だけを使って任意の機械語が実行できるよ!(時間が足りなかったのでデモは省略しましたが)Perlのインタプリンタも実行できるよ! という簡単なお話しでした。

元ネタは 2006-12-19 - 兼雑記 ■[Program][Bin] プログラムは ASCII で書くべきだよ から着想を得ています。shinichiro_hさんは4年前に既にこのようなテクニックを開拓されていて本当に偉大だと思います。

10文字オンリーのx86で任意のコードを実行できるにはEIPが取得できないので「mainの絶対アドレスが既知」もしくは「既存レジスタの値からmainの絶対アドレスを計算可能」という条件がつくのですが、 詳しくは今年11/6(土)のAVTokyo2010で内部の仕組みを発表しますので、もしも興味を持った(奇特な)方がいらっしゃいましたらぜひお越しくださいませ。

■ Day 2 - Perl6 Talks (10/15)

芝生カンファレンス Larry Wall & Takesako @ YAPC::Asia 2010 Tokyo Day 2

2日目のトークは、Perl6正規表現に関する初心者向けの入門セッションでした。 直前の発表でRakudo Star遅すぎて使えないよとか、すっごいネガティブな発言が連呼されていて、 しかも発表時会場にはLarry Wallさんが座っていて、大変緊張しました。

基本的には5年前のShibuya.pmでPugsを紹介したときのスライドと、3年前のYAPC::Asiaでの発表と同じです。

元々のPerl6で検討されていた言語仕様も、Pugsの実装で検証が行われ、Rakudoの実装段階でさらに変わっている部分もあったので、発表スライドを修正しています。

RakudoはWindowsのmsiインストーラも用意されているので、簡単に使い始めることができます。 Perl6言語仕様のPDFファイルと以下のチートシートも付属しているので、Rakudo Perl6 REPLで1行ずつ実際に実行しながら結果を確認し、気軽に試すことができます。

Perl 6 cheat sheet v2                                                »ö«

SIGILS    MAJOR/MINOR CONTEXTS         ACCESS ARRAYS      HASHES
$scalar   item   list       sink       whole: @array[]    %hash{}
@array     Str    flat/slice         element: @array[0]   %hash{'a'}
%hash      Num    lazy/eager/hyper       (or)             %hash<a>
&code      Bool                        slice: @array[0,2] %hash{'a','b'}
                       COMPOSERS         (or)             %hash<a b>
TWIGILS                [ ] array
$normal-lexical        { } block/hash     AUTOMATIC DEREFERENCE
$?compiler-constant    < > quotewords     &($foo)(1,2)     == $foo(1,2)
$*dynamic-or-global    (,) parcel         @($foo)[1]       == $foo[1]
$.public-accessor      :() signature      %($foo){'bar'}   == $foo<bar>
$!private-attribute    \() capture        @(@($foo)[1])[2] == $foo[1][2]
$^positional-param
$:named-parameter         CONTROL SYNTAX
$=pod-info                for LIST { }                # implicit $_ arg
$<named-match-capture>    for LIST -> $a, $b { }      # explicit args
$~slang-variable          while/until EXPR { }
                          repeat while/until EXPR { } # do at least once
OPERATOR PRECEDENCE       loop { }   loop (a;b;c) { } # parens required!
.method .[] i             if EXPR { } elsif EXPR { } else { }
++ --                     unless EXPR { }             # no else allowed!
**                        given EXPR { when EXPR { } default { } }
unary + - ~ ! ? ^         EXPR if EXPR for LIST;    # list comprehension
* / % %% div              next, last, redo            # loop controls
+ -                       proceed, succeed            # switch controls
x xx       TYPES
~          Bool Bit Int Rat FatRat UInt Num Complex int32 complex64 etc.
&          Str Cat Blob Char Byte Codepoint Grapheme Buf buf8 buf32 utf8
| ^                               IO Mu Any Cool Junction Whatever Match
sleep abs sin temp                              Parcel Capture Signature
<=> leg cmp .. but          SCOPE DECLARATORS         Pair Range Set Bag
~~ > == gt eq === eqv !op   my  lexical scope      KeyHash KeySet KeyBag
&&                         our  package scope     Scalar Array Hash Code
|| ^^ // min max           has  instance scope       Enum Order TrigBase
??!! ff                   anon  no scope at all        Block Routine Sub
= := op= =>              state  persistent lexical          Method Regex
so not                 augment  benign parasitic       Failure Exception
, :                  supersede  deadly parasitic        Instant Duration
X Xop Z Zop ...                                            Date DateTime
say die map etc.  OPERATOR DOMAINS
and               Numeric: ==  !==(!=) + <      >     <=> <=     >=
or xor            Stringy: eq  !eq(ne) ~ lt     gt    leg le     ge
<== ==>             Value: eqv  !eqv     before after cmp !after !before
                 ObjectID: ===  !===
METAOPERATORS                         LINKS      IRC
[op] reduce listop to A op B op C...  perl6.org  #perl6 irc.freenode.net
op=  A = A op B                       rakudo.org #parrot irc.perl.org
!op  !(A op B)
»op« hyper/vectorize    REGEX  METACHARS          REGEX MODIFIERS
Zop  zip with op        ^ $    string begin/end   :i   ignore case
Xop  cross with op      ^^ $$  line begin/end     :m   ignore marks
Rop  reverse args       +      one or more        :g   global
Sop  sequentialize      *      zero or more       :r   ratchet
                        ?      zero or one        :s   sigspace
SPECIAL VARIABLES       **1..3 repeat in range    :4th nth occurrence
$_     current topic    ()     capture to $0,$1   :4x  n times
$/     regex result     []     no capture
$!     error object     <foo>  subrule          REGEX CHARCLASSES
@*ARGS command line     <[]>   character class  .  == anychar, \N non \n
@*INC  include path     |      parallel or      \s == <space>, \S non
%*ENV  environment      ||     serial or        \d == <digit>, \D non
$*PID  process id       « »    word boundary    \w == <+alpha+digit+[_]>

Perl5→Perl6では、正規表現も全く別言語になりました。

Perl 6 will not replace Perl 5 nekokak++

Jesseの昼のトークにあった通り、Perl6がPerl5のかわりになるわけではありませんので、焦らず安心して新しい世界観を試してみてください。

■ Day 3 - Hackathon (10/16)

YAPC::Asia 2010 Hackathon miyagawa: "Perl is a glue between the human and the human."

今年のハッカソンは弾さんの家ではなく、hidekさんの家で海外スピーカーを囲む形で行われました。 miyagawaさんのkeynoteにあったように“Perl is a glue between the human and the human.”を感じたひとときでした。 ハッカーの集まりは楽しいですね。ホスト役のhidekさん、素敵な会場のご提供、本当にありがとうございました。

※未承諾広告※ ■「エンジニアの未来サミット for students」開催します!

YAPCの次の週のイベントと言うことで突然ですが、ちょっとだけ「エンジニアの未来サミット for students」について告知させてください。 これは、過去2回開催されたエンジニアの未来サミットのスピンオフ的な位置付けで、より若手向け、というか学生にフォーカスした新卒対象の企画になります。

10月は(YAPCの会場としてお世話になった)東工大の首藤さんがエンジニア研究者人生について語り、 11月は(YAPCの名物)小飼弾さんと(プログラマーの採用試験で一躍有名になった)岡嶋さんが語り合います。 12月はmatzさんと言語ヲタクの水島君、林君がパネルディスカッションを繰り広げる内容で、 (地方PMパネルの司会進行役だった)技術評論社の馮さんが特別モデレータを担当されます。

10月、11月、12月と3ヵ月連続開催で、記念すべき第1回目は今週末の10/23(土)です! また若干座席に余裕があるみたいですので、今からでも遅くはないのでぜひ申し込んでみてください。 学生じゃない方の参加もできるようですので社会人の方もお気軽にお越しいただければと思います。

■ YAPC 運営を振り返ってみて

昨年の2009年度よりYAPC::Asiaの運営を引き継いでいただけるという嬉しいお申し出がJPA様からありまして、 これまで3年間続けてきたホスト役を降り、普通のスピーカとして一般参加させていただくことになりました。

思い起こせば、最初の「YAPC::Asia 2006 Tokyo」は大田区在住というつながりだけでwakatonoさんに会場手配をお願いして某方面の聖地として有名なPiOで開催しました。 当時はまだ数百人単位向けの無線LANのAP構築ノウハウがたまっておらず、安定したネットワーク接続がなかなか提供できない頃でした。 会場で思いがけないトラブルがあっても寛容に許して下さる参加者の皆さまのご協力の積み重ねによってYAPC::Asiaの運営は継続できていると思います。

2006年は大田区PiO2007年は津田ホール2008年は東工大の大岡山キャンパスと、3年間それぞれ違う場所でYAPC::Asiaを開催してきました。 その都度、いろんな方々のご協力を得ながら、イベントの開催規模も自然に大きくなってきました。 当時からスポンサー様には多大なご協力をいただいていて、スポンサー発表枠、ノベルティ提供の他に、カップラーメンやスナック菓子の提供、 ランチ軽食の提供、懇親会でのスポンサー求人セッションなど、様々な試みを試行錯誤してきました。 今考えると、毎年違う場所で開催して、スポンサー交渉、会場予約からタイムテーブルの組版、パンフレットの制作、入稿、 看板出力、資材調達、本編での発表、発表スライドの翻訳、LT、会場のタイムキープ、司会進行、写真撮影、 エンディング動画のエンコードなどなど、当日は前後の動きを含め、振り返ってみると本当によくできたな、と思います。 プロデューサのmiyagawaさんも日本国内にいないし、イベント開催当日に初めてのスタッフミーティング開催とか、いろいろ常識から考えてあり得なかったと思います。 それも大変強力な運営スタッフや、無償で協力してくれるスピーカー、多くのボランティアスタッフ、動画撮影スタッフ、エンコード職人の皆さま、 参加者の熱意、そして現在の勤務先の会社の理解、スポンサー様の多大な支援のおかげでやってこれたのだと思います。 個別にお名前は挙げきれませんが、本当に大変感謝しています。本当にありがとうございました!

従来は、元々非営利のイベントということで、oyamaさん個人に会計処理をお願いしていたこともあり、収支で翌年に繰り越す利益がでると 税金の処理が面倒になるということで、収益の一部を The Perl Foundation に寄付したり、その後、懇親会の参加費用を無料にしたり少なくしたりすることで不確定要素から生じる部分の利益調整をしてスピーカーや参加者の皆さまに少しでも気持ちを還元するようになりました。 やはり余剰金の繰り越しは大規模な非営利イベントを開催するときの一つの問題のようで、参加者が500人を超える他のイベント運営でも同様の悩みを持っている、という話も聞いたりします。

今は継続的にイベントを開催・運営できる母体としてJPAが設立され、個人でお金の入出金をする会計上のリスクやキャッシュフローの問題は解決されたと思います。 Jesseの「Perl5 is Alive!」の講演でもあった通り、YAPCの運営もPerl5のPumpkinに通じるものがあるかもしれませんね。 YAPC::Asiaの運営はこれからもこれまでも、参加者の皆さんのアツい想いと、スピーカーの皆さまのご協力と、運営スタッフの情熱の維持によって成り立っていますので、 ぜひ引き続きご協力を賜ればと思います。今年の941さんのようにイベントプロデューサーに立候補すれば、(控え目に言っても)いいことあると思いますよ!

既に来年のYAPC::Asia 2011建設予定地のページ(次の開催候補地及びプロデューサーを募集中)も出来上がっているみたいですので、 我こそは、と思った方はぜひ名乗りをあげてください。

YAPC::Asia 2010 Tokyo お疲れさまでした!

■ 参考リンク

トラックバック

このページのトラックバックURL:
http://www.typepad.jp/t/trackback/404050/25275355

YAPC::Asia 2010 Tokyo に参加してを参照しているブログ:

コメント

コメントを投稿

コメントは記事の投稿者が承認するまで表示されません。