北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

YAPC::Asia 2008 Tokyo 1日目

今日も来ています。コンセントは運良く(?)借りられました。

Welcome to YAPC::Asia 2008/Tatsuhiko Miyagawaさん(9:45〜9:55)

  • YAPC::Europaに人数負けそうだった
  • Perl Mongersに属してない人が多い?→YAPC来た時点でMongers!
  • 仕事で来れない人が多い?→仕事とYAPCどっちが大事だ!

TPF Introduction/José Castroさん(10:00〜10:05)

A Standard That Is Meant To Be Broken/Larry Wallさん(10:05〜)

Perl6の文法とその拡張についての話だったと思うのですが、最初全然聞き取れませんでした。難しい。。。

  • Perl6は冗談ではないw
  • 長い名前と短い名前がある
    • 短い名前は略称
  • multi → 関数のオーバーロード??
  • prefix
  • prototype
  • prefixとpostfix → 例えば++みたいなの
    • 違いのデモ
  • prefix:sym<++>とprefix:<++>の違い
  • prefix:sym<+->??←Perl6にはまだない
    • +-のグラマーがなければ、+と-として解析される→グラマーの追加のデモ
    • use PlusMinusPerlすると+-オペレータが使える。してない場合は+と-
    • useするときは影響を最小限にするためにレキシカルスコープで。
    • Perl6にはスコープがたくさんあるが、適切なスコープを選ぶこと
  • statementのグラマーの説明
  • +-と+のどのオペレータが選択されるのか?
    • 新古でもユーザ定義優先でもない
    • 長いキーワードがマッチする
  • Perl6にはCoreもキーワードも演算子もない
  • |と||の意味がPerl6では変わる
    • |は並列、||は直列
  • Perl6をパースするためにPerl6が必要
  • :: → トークンを分ける
  • ! → ルールの無効化
  • DFAとかNFAのマッチャーは使ってない
  • まとめ: Perl6は拡張性があるので、拡張してみて下さい

TESTCONTINUOUS/KANG-MIN LIUさん(11:20〜)

自動テストについて便利なモジュールの説明です。聞いて得したセッションでした!

  • javaでの事情
  • *.tを変えると、自動でテストが走るデモ
  • perl -MTest::Continuous ・・・
    • テストの変更を監視し、PASSかFAILかをレポートする
    • FileModified、Module::ExtractUse、App::Prove、Log::Dispatchで実現
  • テスト駆動
    • 全てのテストを走らせるのは時間の無駄となる→できるだけ少ないテストを実行
    • つまり、変更された.tだけを実行
    • .tの依存関係で、変わったモジュールに対依存するものだけテスト
  • Log::Dispatch::MacGrowl→Macマンセー
  • これだけでは不十分
    • .cとか.conf、.yamlの依存を見れていない
    • isa(継承)のファイルが変更された場合の依存を見てない
    • アイコンがちょっと・・・→アイコンのひと募集
  • Future
    • 依存抽出の改善
    • 別の通知方法(twitterなど)
  • Q&A
    • Q.CPUの利用状況は?
    • A.全部のファイルを見てるわけではないので、そうでもない
    • Q.Devel::Coverで依存を見るってのはやりました?
    • A.まだやってない。hackersonでやりたい
    • Q.Devel::Coveredと言うのがある。どのテストがどのモジュールの何行目をテストしたのかが見れる

Perl Black Magic - Obfuscation, Golfing and Secret Operators in Perl/José Castroさん(11:50〜12:20)

ネタとして非常に楽しめるセッションでした。良くも悪くもさすがPerl、ってとこですね。楽しい時間を過ごしました。

  • 難読化
    • 改行とセミコロンを織り交ぜる
    • s///の亜種を織り交ぜる
    • #を区切り文字にするとコメントだかコメントじゃないのだかわからなくなる
    • わかりにくいリテラル正規表現にかける
    • 特殊変数を使いまくる
  • 例:
    • 空白を覗いて
    • $,を使って
    • reverseかけたり
    • 特殊変数にしたり
    • s///ee
    • 文字コードリテラル
    • コメントに見えないコメント
  • 警告!!難読化されたコードの意味をわからずに実行しないこと
    • system"rm -rf /"をevalさせる難読化コードの例。*1
  • 特殊変数やperlのスイッチ
  • Golfの技術
    • y///c
    • }{ → perl -l スイッチだと、埋め込まれて意味をなす
    • 無名リファレンスのデリファレンス
    • =()= → スペースの数を数える
    • ~- → -1の書き換え
    • /// → ///4は、0.25
    • ~~ スカラ評価させる
    • [$x => $y]->[$y <= $x] → minとmax*2
  • 例:
    • 見た目がラクダとかスペースインベーダー(ゲームになってる)とかのコード
    • ThePerlJournal
    • ローマ数字からなるコード
  • 参考→
    • The Art of obfuscation by Thomas Klausner
    • How to Write Unmaintainable Code by Roedy Green
  • 質疑応答・・・は通訳がなかったので聞き取れなかったですw

ランチタイム(12:30〜)

学食で食べました。弾さんのサイン会やってたのでサイン本*3ゲットしてきました。なんで和服なのか訪ねてみたところ、「正装のときはこれ」だそうですw

Perl Testing (and Automation) Basics/Daisuke Makiさん(13:45〜)

  • テストの重要性
    • テストは必須
    • 全自動にすること→凡ミスを防ぐ
    • バグ--、残業--
    • これをやった、この過ちはもうしない、忘れたときのため
  • Perlのテストインフラ
    • 優れている
    • CPANでは、世界中からフィードバックが
  • CPAN化→言語のテスト機能のサポートを最大に得られる
  • 基本(Test::More、plan、ok)
  • よくあるテスト
    • t/00_compile.t、t/021_basic.t、t/99_pod_coveredge.t、t/99_critic.t
    • t/99_kwalitee.t←個人的には非推奨
  • 書いたテストは、いつでも走らせる。何回も走らせる
    • 性能検証、バグFix
    • 常にテストしてもよくね?→Test::Continuous++ (朝のセッション参照)
  • テストケースは闇雲に作らない
    • 正常系、異常系、限界値(正常と異常の境)、特殊値(リファレンス渡し、undef等)
  • WEBアプリケーションのテスト
    • テストの80%はWEBサーバを通さなくてよい
    • データ処理を、アプリケーションと密結合させない→MVCが有効。SoCの考え方
  • モデルをテストする
    • モデルとは??→API (MVCをMVACとみなす)
  • つまり、XXXアプリのテスト=APIのテスト
    • APIをUIに依存にせずに独立させる
  • Catalystの場合
  • mod_perlに関してはApache::Test
    • 二つファイルを用意するだけ(Makefile.PLとTEST.PLを用意する)とテスト用Apacheが走る
    • 設定自動生成、サーバーからのテスト、クライアントからのテスト
  • Tips
    • やりすぎない。理想はTDDとかでも、落としどころは知っておく
    • バグの再現テストは必ず書く!!
    • ポータビリティを意識
  • Makefile.PLにいろいろ仕事をさせる
    • 初期設定の確認、設定
  • 外部からの値は、環境変数を使ってしまう
  • テストの後片付け
    • ENDブロックで
    • セグフォを考慮したら最初に
  • テストを飛ばす
    • SKIPブロック
    • 未実装部分のテスト(TODOブロック)
  • Test::MockObject
    • 指定されたオブジェクトのふりをする
  • まとめ:
    • テスト書かなくていいのは小学生まで
    • テスト書けないコードはほとんどない→あるとすれば、それはコードが悪い
    • バグがあったら、再現コードをすぐ書く
    • デバグより開発をしよう
  • Q&A
    • Q.Test::Continuousはテスト時間かかり過ぎて大変では?
    • A.必要なテストだけ走る。邪魔ではなさそう

Working in the cloud/Leon Brocardさん(14:30〜14:50)

まったく聞き取れず。すみませんw

  • 色んなサービスをするとサーバが足りなくなる
  • ハード、ネットワーク、信頼性、セキュリティ、OSSVMの技術が高まった
  • XaaS
  • Net::Amazon::S3
  • スケーリング
  • Data保護
  • まとめ: 設備を自前で用意しなくても、サービスを借りて使えばいいよって話(多分

Parrot Compiler Tools/Kazutake Hiramatsuさん(15:00〜15:40)

これもお得セッションでした。ラリーの話の意味がわかりました。つーかラリーの前に聞きたかったw 非常に面白かったです。

  • 2001年開発スタート、今は0.6.1
  • PCT(Parrot Compiler Tools)
    • Parrot向けコンパイラ作成ツール
    • 誰でも作れるらしい
    • Rakudo(Parrot上のPerl6実装)で利用
    • Perl5とかRubyとかPythonでもいいよ。俺言語も作れるよ
  • Parrotのおさらい
  • PASMの例
    • set I0, 1とかprint S1 とか new P0, 'string' とか end とか
  • PIR → PASMのシンタクスシュガーに過ぎない
    • .sub とか .endとか .param pmc args とか $P0 = compreg 'C99' とか
  • PCT
    • ソースからソースツリーを作る
    • ソースツリーからPASTを作る
    • PASTからPOST
    • POST(Parrot Opcode Syntax Tree)からPIR
    • PIRバイトコード
  • PGE(Parrot Grammar Engine)
    • Perl6のRuleを解釈する(via: ラリーのセッション)
    • Rule(言語の文法規則)から言語パーサを作成
    • Rule中に{*}を見つけると、同じ名前のサブルーチン
  • Perl6 Rule
    • grammar、token、rule
    • TOP talken (TOPレベルのルール)
  • NQP(Not Quite Perl)
    • Perl6のサブセット
    • Parse Actionsの言語。{*}に対して呼ばれる。
    • PASTを作る処理を書く。makeコマンド
  • PAST(Parrot Abstract Syntax Tree)
    • 汎用的な抽象構文木(AST)
    • Parse Actions内で、これを作る
    • これができればコンパイル完了
    • PAST::Node、PAST::Val、PAST::Var・・・
  • おためし
    • svnから落として、perl Configure.pl;make;make test
    • mk_language_shellで俺言語のスタブを作成
    • languages.pmに手動で俺言語を追加
    • もう一度Configure.plして、自分の言語のディレクトリでmake
    • 中には、actions.pm(NQP)とかgrammar.pm(Rules)とか*.tとか
    • root.in、say.pir(組み込み関数 sayの定義)、foo.pir(コンパイラのメイン)
    • say "hello" を実行する → parrot foo.pbc test.foo
  • 編集する
    • grammar.pmとactions.pmにルールを足す
    • actions.pmはNQPで書く
  • NQPのシンタクス
    • $/ → マッチした規則
    • $ → $1...$nみたいな役割
    • $( $x ) → $x をスカラとして評価
    • makeメソッド
    • new( :node($/) ) ←インスタンス変数nodeに直接値を入れる
  • Past Nodes
    • Node, Block, Stmts, Var, Val, VarList, Op
  • この後は・・・
    • スコープ管理、オペレータ優先順位、関数呼び出し定義
  • 参考: docs/pct/*.pdd 基本はソースを読む
  • 弾さんタイム
    • Q. RakudoとNQPの違いは?
    • A. NQPは最小のPerl6
    • Q. 自作は?
    • A. 細かな部分が難しい
    • A. PASTさえ作ればいいから、かなりイケてる
  • 質疑応答
    • Q. どういう言語を??
    • A. Cっぽいの
    • Rubyがなくなった!
    • Perl6のコード拝見
    • LISPは??→PCT使ってない
    • Q.日本語対応は??
    • A.デフォルトでutf-8。なでしことかも書けそう?
    • A.ただ、トークンの分割が問題。形態素解析??
  • 業務連絡。明日、ラーメンが720個来るらしいw

Easy system administration programming with a framework/Gosuke Miyashitaさん(16:10〜16:30)

  • System Admin Application Framework
    • Func(Pythonでの実装例)
    • FuncのクローンであるPuncを開発中
  • System Admin Applicationとは?
    • 複数のホストに同じ操作を行う
    • ターゲットホストをどう選ぶ?
    • どうやってつなぐ?
    • セキュリティー
    • 再利用性
    • これらを隠蔽
  • Punc::Client->new('www*')とかして、service->status
    • JSON RPCでSSLでやり取り
    • 小さいモジュールの組み合わせ
  • Punc・・・Funcがあるのに??
    • RedHatでしか動かない。OSの違いを吸収しにくい
    • Perlが好きだから
  • マスタ側とスレーブ側でデーモンを動かす
  • CodeReposから落として、puncmaster-ca、 puncd を実行してそれぞれで起動
  • コマンドラインツールがある punc "*" call service description
  • 例:
    • virtモジュール(まだ未実装) → バーチャルホストの管理
    • smartモジュール(未実装) → エラー表示
  • モジュールはスレーブ側に導入されている
  • モジュールの実装例
    • operatingsystemパラメータで、このモジュールを実行可能なOSを指定する
  • Pfacter → 環境に合わせて適切なモジュールを選択する
    • Pappetのアイディア
  • モジュールの同期
    • punc-modulesync → fileモジュールによる実装。スレーブのモジュールを新しくする
  • 開発中。CodeReposにあるので好きなようにどうぞ
  • まとめ: プログラマブルなシステム管理は楽しい。
  • Q&A
    • Q. Mooseを使ってるとインストールが重いのでは??
    • A. ブームに載ってるだけ
    • Q. Pappet、Funcとの棲み分けは?
    • A. ダイナミックな物に向いている

Let's enjoy Perl on the %^H/Kazuhiro Osawaさん(16:35〜)

  • $^Hと%^H hintbitsみたいなの
  • perl5.8では・・・useとBEGINの関連で、うまくいかない?
    • hintbitsでできる → HINT_LOCALIZE_HH (0x20000)
    • $^H |= 0x20000 で、レキシカルなスコープになる
  • autoboxでの例
    • Scope::Guard*4をhinthashに入れている
    • レキシカルなプラグマっぽい動き
  • perl5.10では??
    • %^Hがレキシカルになった
    • (caller(0))[10]が新たにできて、hinthashをとれる
    • use strict みたいのができる
  • プラグマ側で、caller経由でhinthashを取ると、うまく値がとれる
  • 実践的なものが思いつかなかったので、Hentai($^HはHentaiのH)なものの紹介 → use dan;
  • 質疑応答
    • Q. dan.pmのソースは?
    • A. ^ENCODINGフックを使う。リテラル読み込みに対する強烈なフック。ただ、今更使っちゃ駄目らしい(kogaidanさんより)

LT(17:10〜)

  • String::TT/Jonathan Rockwayさん
    • ヒアドキュメントは見にくい
      • 文字列中ではメソッドが展開されない
      • インデントできない
    • String::TT→TT文法をリテラルの中で使う
    • stripを使うと、空白文字を奇麗にする
    • ソースフィルターとかではなく、普通の関数
    • スカラかハッシュか配列かわからない?→_aとか_hとか_sで指定
  • 会計報告お金☆大好き/Hiroyuki Oyamaさん
    • 2006年→20万ほど余った→PerlFoundationへ寄付
    • 2007年→会場費がでかかった
    • 2008年→懇親会費が上がった。宿泊費はHotel dan.
    • 2008年は、残高がマイナスにならずに処理で来た
    • 時間切れ
  • Open Fastladder with Plagger/Daisuke Muraseさん
  • Everybody wanna know where you belong!/Kenichi Ishigakiさん
    • CPAN登録の201/650人が日本人
    • Acme::CPANAuthors
    • 2007年版のCPAN Authorランキングの紹介
  • Developing Amazon's Dynamo in POE and Erlang - prologue of "From POE to Erlang"/Takeru INOUEさん
    • Dynamoとは?→永続化memcached
      • スケールが凄い、性能の安定
      • 小さいデータをたくさん置く
    • KaiというDynamoクローンの実装
      • POEとEarlangの実装を試した
    • まとめ: Erlangの方がいい。素直なコード書けたり、排他制御なかったり、速かったり
      • ただし、分散システム向け
  • Perl (Perl Machine)/Kazunari Asanoさん
    • デバイスドライバとか全部Perl
    • Microperl利用
    • 組み込み関数もperlで実装
    • XSUBは極力使わない→Cでの実装と同じになってしまう
    • USBドライバを書いて、兵器にw
  • Text::MicroMason::SafeServerPages/cho45さん
    • TTが嫌い→Text::MicroMason
    • Perlと同じ文法で、速い
    • テンプレート言語は覚えたくない
    • まとめ: 埋め込み型のテンプレートエンジンを使いましょう
    • Tenjinがあれば他はいらなくないか?w
  • WebService::Simple/Yusuke Wadaさん
    • POX over HTTP
    • WebService::xxxを探すが、どれを使えばいいのやら
    • 似たようなコードをいつも書く→リクエスト、パース
    • WebService::Simple → これらを抽象化。どんなAPIでも書けるように
    • 戻り値はXMLをパースしたリファレンス。ただし、パーサは入れ替え可能
    • CodeReposに置いておいたら、全部書き換えられたw
  • Vroom: vroom -vroom/Ingyさん
    • Vroom::Vroom プレゼンツール
  • prototype::signatures/Chia-liang Kaoさん
    • perl5のプロトタイプはいまいち
    • Perl6のシグネチャのような機能を実装する
    • sub6、method
    • 高速化
  • HTML Binary Hacks/TAKESAKOさん
    • imgタグを使ったブラウザの自動認識

懇親会(19:00〜)

寿司が出過ぎ!! Kakudaさんと明日のヌードルの話したりid:yuum3さんにLISPの講義受けたり、

ラリーさんに無理言って写真撮ってもらったりサインもらったりしました。ほんとうにありがとうございましたm(_ _)m。Thank you very much. I love perl and will use perl forever! > Larry Wall. これを機に、もっとPerlコミュニティに役に立つように頑張ります。



追記。なんかCodeZineさんからアクセス来るなと思ったら、リンク貼ってもらってました(リンクどもです)。英語部分適当なのがバレバレでかなーりやばいですw。

*1:これ、見ても普通の記号ばかりでまったくわかりません。すげえw

*2:これかっこいいかもw

*3:ラリーさんのサインも後ほどプラス。

*4:スコープ抜けたらオブジェクトを消す