読者です 読者をやめる 読者になる 読者になる

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

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

今日はYAPC::Asia Tokyo 2012の1日目です

レポート perl perl+web yapcasia

今日は昨日に引き続きYAPC::Asia Tokyo 2012の1日目です。東大内の伊藤国際学術研究センターに入り開会を待っております。

今日もgihyo.jpさんの特集にレポーターとして参加します。昨日と同様に@amayanさん、@moznionさん、ya_k0さん、@takayuki_hさんが中心となって執筆しますので、ぜひご覧頂ければと思います!

941さん「オープニング」

  • Take A Step Forward
  • 色んな言語を巻き取って行こう
  • 東大のこの会場で大きなカンファレンスが行われるのは初めて
  • 最多のボランティアスタッフ、スポンサー、来場者数、過去最高のやる気(941さん史上)、個人スポンサー
    • 800人以上!!嬉しい誤算。
    • 初めて来た人挙手 → 半分以上!?
  • 遠方からの参加者支援制度 → SKYARCさん
  • 懇親会無料
  • ランチ交流企画 → クジを引いて、当たった人が一緒にランチ
  • LT-thon → Hachioji.pm
  • 書籍の立ち読みコーナー (物販ができないため)
  • YAPCの楽しみ方
    • トークを見る。豪華ゲストスピーカー。トーク応募数90 → 倍率1.4倍
    • Perl Hacker達と交流
    • トークの商品 → 技術書セット、地方PM派遣、YAPC::NAまたはEuropeへ派遣
    • 1位になったら海外旅行手配して英語喋ってきて!(1位の人が苦しんでいるのを見たい!)
  • ハッシュタグ #yapcasia、アナウンスはTwitter @yapcasia
  • 感想はブログに → 抽選で豪華景品
  • 懇親会は19時から

Larry Wall さん「What Does Your Code Smell Like?」

  • 「おはようございます」
  • Perl5とPerl6の文法の違い
  • Perl6では全てリファレンス
  • ifやforの括弧は外せる
  • 負を指定する代わりに *-1、*+$_
  • ..^
  • ->はドットに
  • @xは全て@xで
  • (^100).role
  • 配列を展開させたければ@a[]と書く
  • is copy、is rw にて引数の渡し方の指定
  • cmpや!after、beforeで文字も数字も比較できる
    • cmpの戻りはDecrease、Increase、Same
    • gather と take
    • infix: を定義すれば M= みたいな書き方も → Perl5へバックポート?
  • Q. Perl6への静的型は入らないの?
  • A. Haskellはstrict過ぎるので、NO
  • Q. パターンマッチが足りない場合もエラーにならないの?
  • A. 現状はならないし考えてない。やるなら警告。ユーザフレンドリーに。博士向けのシンタックスは作らない。
  • Larry「Perl6は完璧の次くらいのものにしたい。次の世代でさらによくなる。改善の余地はある。他の言語をuse で取り込んだりも?」

Ingy döt Netさん「Acmeism, Pegex and CoffeeScript on CPAN

こちらはgihyo.jpさんの特集にも掲載しています。

  • 言語は壁。克服できるが大変
  • プログラミング言語も同様
  • "Acmeism" 特定の言語に拘らない
  • Ingy's Law of Programming → 何事も非難されるべきじゃない
  • ラップトップは駄目 → 90年代からwearable コンピュータが欲しかった
  • プログラミングは駄目 → コンピュータにやらせる。人間はアイデアを作る
  • 1000のモジュールを20の言語で出す。世のすべてのモジュールをハックする
  • PEG == Parsing Expression Grammars。例: Perl6
    • Perl 6 Rules + Acmeism == Pegex
    • 例: JSONをPegexで定義
  • Coffexcript は JavaScriptをよくしたもの
  • Pegex + CoffeScript == NPM
  • Coffee on CPAN
    • JSでコンパイルするもの → C'Dent、JSにする、UniScriptなどの解決法
  • UniScriptとは? JSONYとは?
  • Perl5 Module、Panda Module、PyPImodule、NPM module、C'Dent module の比較
  • make npm とするとnpmのコードができる → make cpan はまだ

Tokuhiro Matsunoさん「Nana/Tora - Perl5 から見える未来。Perl5 と共にあゆむ Perl6 ではないプログラミング言語、それは。」

こちらはgihyo.jpさんの特集へも掲載しています。

  • Perlは人気がない。そのなかでできることを考えた
  • Perl5のよくないとこ
    • コンテキストによってはハッシュが壊れる
    • 関数プロトタイプの仕様がひどい
    • @_・・・?
    • リファレンス・・・@{${%{x}}}
    • XSが難し過ぎる。副作用のあるマクロが多い。ref countが大変
  • bless、Moose、は別にいい
  • プログラミング言語はそんなに重要ではない
    • Platformが一番大切 → "Perl5 is a DSL for CPAN"
  • Perlを使う人はモジュールの知識を蓄えている
    • モジュールの善し悪し
    • 作者ごとの癖
    • CPANモジュールガイド
  • モジュールの知識を、何度も学習したくない → Perl + CPANを使っている
  • Perl6はもう10年経ってる
    • 新しい正規表現 → rx/^^\>(\N*\m)/; → 学習コスト
    • Rakudo starのベンチを定期的にとってる
    • 10_000 loops : 0.59s で終わるようになった!(perl5 なら 0.01s)
  • Toraを作った
    • Perl5的な言語
    • ->の代わりに.とか、括弧の省略とか、ラムダとか
    • 実装は2つ → Tora(C++)、Nana(Perl5)
  • Tora → クロージャのネスト以外は動く
  • Nana → 型周りが難しい
  • node.js → v8を一番楽にインストールできる
  • npmがよくできている
  • DSL for npm は・・・? → kuma
    • JSは罠が多い
    • 他、lispyscript、coffee
    • kuma -- Toraのnode.js実装(E"CMA"スクリプトだから)
  • JSは一番みんなが嫌々使う言語なので、ベースにするとよい
  • kumaのデモ → 非常に高速
  • node-perl
    • npmだけだと不満。CPANモジュールも使いたい
    • node.jsからLWPを使ってとってくるデモ
  • node-mruby
  • 色々な言語を使う人がnpmを使うと便利になるでしょう
  • 質疑応答
    • Q. Perl-node は?
    • A. libnode がないので、きつい。node-perlコンパイルは大変
    • Q. kumaからPerlのクラスを呼ぶときに、簡単に呼ぶ方法は
    • A. 今はないです。これから実装
    • Q. node-perl や node-mruby の実装の苦労話をブログに載せる予定は?
    • A. コンパイルオプションが大変。Linuxのsystem perlならいいけど、OS Xはそうはうまくいかない。mrubyはドキュメントがない。@masuidriveさんのツイートが頼り。
    • Q. 実際どの辺りで使う?
    • A. YAPCでの発表。node-perlは使いたかったが、コンパイルがプロ向き過ぎる。kumaは普段使い。node-mrubyは誰かより先に書きたかった

lapis25さん「Perl Ocean - XMPP based realtime communication framework suite」

  • OceanとはXMPPを中心とするリアルタイムコミュニケーションフレームワークスイート
  • XMPPとは?
    • 元はJabber。2004/10にRFCに。2011/3にアップデート
  • オープン標準 → 仕様が公開されている
  • 永続コネクション → tcpでつなぎっぱ
  • XML → 単一のXML。冗長。バイナリはきつい
  • 中央サーバがない
  • 拡張性 → XEPの部分はRFCに規定されていない。グループチャットやボイス・ビデオなど
  • IM:RFC6121、拡張仕様(Pub-Sub、ボイスやビデオ)
  • アプリ → iChatGoogle TalkFacebook Chat、MSN Live、PSN
  • Ocean
    • Webサビスとのインテグレーションを前提とした設計
    • 共通仕様の策定、クラスタサポート、HTTP Bindingのサポート
  • メッセンジャ、プレゼンス、グループチャット、プッシュ、オーディオ・ビデオ
  • 同時接続数やブロック、サイクルのミスマッチ → クラスタサポートが必要
  • メッセージブローカー
  • mixiにてテスト運用中

motemenさん「Wight - Phantom's new friend」

  • Perlの楽しみ → スクレイピング、WEB、その他
  • PhantomJS
    • インターネットができるが、見えない
    • JS API、webページとは別のコンテキストで
    • brewで簡単にinstallできる
  • Scraping、JavaScript monitoring に適している
  • Perlバインディング → Wight (他のライブラリが全て幽霊の名前を使ってるので)
    • 値のセットやクリックをすると、イベントが生成される
    • 画面外をクリックするとエラー(!)
    • evaluate('')
    • cookie_jar HTTP::CookiesとPhantomJSで連携
  • テストに使う
    • Test::Wight
    • Twiggyとの連携
  • Perlにする理由は?
    • コールバックを使いたくない、LWPやCoro、prove便利
  • Tumblrのデモ → 'j'キーの押下をシミュレータ
  • Poltergeist → a phantomJS driver for Capybara
    • JSはこちらから拝借 Rubyist++
  • テストの仕組み
    • Perlからcall経由でPhantomJSにWebSocketメッセージを送って、動作指示
    • Promptの表示にPerl側から答える(Synchronous XML Requestを利用)
  • TODO: Mechanizeとの連携、クロスドメインframe連携、ルビーストになる
  • おまけ → Weight::jQuery (jQueryコードのジェネレータ)
  • 質疑応答
    • Q. アニメーションが終わるのを待てる?
    • A. 要素が見えてるかをJSで見れる。あるサブルーチンが真を返すのを待つ。クリックした後ポーリングしつつ、動作が見えるまで止める

Tim Bunceさん「Profiling memory usage of Perl applications」

こちらはgihyo.jpさんの特集へも掲載しています。

  • 「ありがとう」(初来日に添えて)
  • "Out of memory" 出たことあるでしょう
  • メモリチェック
    • system("cat /proc/$$/stat")
    • system("cat /proc/$$/statm")
    • system("ps -p $$ -ovsz,rsz,sz,size")
    • system("top - -nl -p $$")
    • system("cat /proc/$$/status")
    • system("cat /proc/$$/smaps")
      • Size -> libperl.so
  • メモリはページに分けられている
    • pointはRSSを使わないこと
    • heap は mallocで確保
  • Prelの各種変数のメモリ構造を理解する
    • Devel::Peek → 文字列で表示
    • Devel::Size → 書く変数の実際の総サイズの表示
  • メモリプロファイリング
    • NYTProfでも部分的に対応
    • Perlはメモリの確保時に、余計にメモリを確保することがある
    • 再帰関数など
  • 実装方法
    • Devel::Sizeを継承、Cレベルのフックを追加、コールバックのためにパス名の追加、Devel::Sizeから任意のサイズを取得し、ディスクに残して分析
    • 日曜までには公開予定なんだけど・・・デモ
    • IVとPVの両方を持つデータだとメモリ使用量が増える
    • メモリの使用量を視覚的なグラフで表示できる
    • Tree map でも見られる
  • Moose の例 → 分析に時間はかかるが、freeされた領域はそれでも4MB程度
  • 質疑応答
    • Q. なんで20MB?
    • A. 10MBの文字列領域と、名無しのアサイン領域。名無しの方はコンパイル時に作られてそのまま残る
    • Q. 使ってるのはなんてアプリなの?
    • A. thejit。NYTProfでも使っている。
    • Q. どの範囲のメモリまで終えるの?
    • A. OSに実際に使ってるヒープから、perlが使っている分を引きたい。全体をProcessにして。
    • Q. 動作中のメモリは見れるの?
    • A. スナップショットを定期的に吐けば表示できる
    • Q. SVだけ見てるの?opツリーも見てるの?
    • A. opツリーを全て追っている。アリーナにある領域をみてリークを探す。
    • Q. 使っていた環境変数はなに?
    • A. 開発中の仮名公開時に変える。

Shunichiro Fujiwaraさん「Perlアプリケーションのベンチマークとプロファイリング」

  • チューニンガソン → アプリは弄ってはNG
  • ISUCON → 何やってもOK
    • ISCON2も開催されるそうです
  • チューニンガソン#4、ISUCONでは改善率が100倍を超えてる
  • Query Cache 100 -> 1200
    • テーブル構造 → 20000
    • 極限までcache → 90000
    • テーブル構造の変更が一番効く
  • 「推測するな、計測せよ」
  • 基本的なメトリクスの収集
    • CloudForecast, Ganglia, Cacti, Zabbix, munin
  • 死活監視
    • 監視対象以外はわからない
    • 一ヶ月前より全体的に遅い
    • 数分間だけ遅い
  • nginxでレスポンスタイムを記録
    • $request_time, $upstream_response_time, $upstream_addr
  • Apacheで・・・
    • %D
    • $upstream_response_time 相当がないので、Plack::Middleware::Runtime
  • ログに出すだけだと・・・→可視化
    • fluentd → accessloをtail pluginで読み取る
    • numeric_counter でグループ化する
    • zabbixに送信する(GlothForecastとかにも投げれる)
    • deploy直後に気がつける、数分間だけの性能劣化も把握できる
  • 数分間の劣化とは? → バッチや、bot
  • DB slow query logをまず探す → 70〜80%の原因はどこ
    • 非効率なindexが使われるなど
  • アプリが悪い場合 → Time::HiResのgettimeofdayとtv_intervalで計測
  • Devel::KYTProf → 特定のメソッドをラップして計測できる
    • 任意のメソッドを追加できる
    • (I/Oに比べれば)軽いので本番適用しても→ thresholdでしきい値指定
  • Devel::NYTProf++
    • これは本番はちょっと・・・
    • POSIX::AtFork → Starmanのフォーク時に特定の1プロセスだけに適用
  • 直ったかを見る → Benchmark.pm
    • timethese、cmpthese
  • マイクロベンチマークに拘りすぎないこと
    • 例えば50msで返す場合、0.1msは意味があるのか
  • Parallel::Benchmark → 子プロセス内で並列ベンチマーク
    • fork後にsetup。Parallel::Scoreboardへ書き込み
    • benchmark while 1を指定時間ない実行させ、SIGUSR2で停止させる
  • Benchmarkツールの作り方
    • 例: Parallel::Benchmark + Furl
    • benchmark 関数内に子プロセスを識別する値が来るので、これでうまく挙動を変える
    • Apacheベンチマークはきついけど、Appサーバにはよい
    • バイルゲームのベンチマークに利用できる。並列数を任意に変える
  • 限界を見極めておくのが大切
  • まとめ「推測するな、計測せよ」

Lightning Talks Day 1

こちらはgihyo.jpさんの特集へも掲載しています。

takuji31さん「Android開発入門for Perl Mongers」
  • Android版のみ作った
  • 開始5分前に通知が来る
  • Eclipse, Adroid SDK 25$、折れない心
  • アプリ作成のデモ → エラー発生
    • 無事動作、文言変更
  • Android開発者募集!
tokuhiromさん「Furl
  • Furl → LWPよりとにかく速い
  • 「去年?一昨年!?」「LT中に話しかけないで」
  • たくさんの人の協力
  • low level interfaceの充実、inet_aton、Net::DNS::Lite
  • as_http_response → LWP依存のライブラリとも
  • fileへの対応
  • ヘッダーのパースをせずに高速化
  • DNSキャッシュ
  • Fast, stable, useful!
Ktatさん「Perldoc.jp 10周年」
  • miyagawaさんが2002年に
  • argrathさんが継続メンテ
  • canadaさん、tokuhiromさん、JPA管理
  • nagayamaさんリニューアルデザイン → 昔からの比較
  • Moose関連、WebPageなど、原文との対訳、翻訳したい人向け
  • githubからバグ報告
zeniivaさん「株式会社モバイルファクトリー Hello Perl World」
  • バイルファクトリとは? → Wassar
  • エンジニアはドラえもんだと思ってた
  • 昔有名な人がいた開発部
  • 開発部部長と結婚(拍手)
    • 変更には慎重あれ
  • モバイルファクトリーに入社すると結婚できるかも
egoproさん「おどけでね Sendai.pm」
  • おどけでね -> 並のことではない
  • 時間は2分間
  • Sendai.pm #1をやったあとは剣道
    • 三段合格
  • 明日は長女の誕生日
  • typesterさんや、yusukebeさん、dankogaiさんを呼んで特別講義が
studio3104さん「Fluentdでコードを書けるOpsになれる話」
  • インフラエンジニア 説明に困る
    • 何も作らないので、「インフラ」でいいのでは
    • ガス?水道?
  • インフラエンジニアはコード書かない、shell scriptでいいと思ってた
  • Munin、Nagios、Ganglia、Zabbix、fluentdのプラグインなら・・・
  • デモ
    • 「さっきと全然関係ないのですが」
    • Slow query logを見る
  • コードを書きたいインフラエンジニアはfluentdを(ゴーン!!)
nqounetさん「ニフティクラウドC4SAを使ってみた」
  • 知ってる人 → 少ない
  • 黒い画面が苦手な方 → みんな黒い画面ですか
  • C4SAはGUIです
  • デモ → 作成済みのものが・・・ → Hello, World!
    • GUIから直接ファイルを変更可能
    • daemonStarman。スタートボタンを押すと。
    • ・・・変わってない。hello, world。ほんとはかわります
  • 黒い画面が好きな方へ → env bash とするとコマンド全部使える
@cubicdaiyaさん「ngx_small_light〜Nginxで動的サムネイル生成〜」
  • 画像サムネイルをNginxで生成する
  • URLを変えるだけでリサイズ、サムネイル
  • dw=500、dh=500 のようなパターンに名前を
  • 合成素材を用意
  • なぜ作ったか
    • BOSS「動的生成か、うちもやろう」
    • mod_small_lightへの巨大パッチを見て → Nginxでやらない?
    • pixiv内のHTTPサーバはだいたいApacheからNiginxに
    • nginx_small_light が産まれた
とうどうさん「株式会社ガイアックス
  • 福岡の研究開発拠点
    • まさかのRuby
    • 予算使い過ぎで東京は予算がない
  • プログラミング部
  • 問題: ノベルティに書いてあります
    • CodeIQに投稿するとソースごと公表される
    • 不正解でも答えだけでも公表されます
  • 仕組み Code IQ→ git → ジェンキンス
  • おまちしています!
kan.fushiharaさん「へんなもの」を作ってみた
  • 25Kg減量したけど後30Kg
  • 「明日はしゃぶしゃぶはありません」
  • エンジニアの成長をみる → 昔作った物を再発明する
  • Wema → 付箋を作る
  • jQueryHTML5、WebSocket、CSSハック
  • サーバサイド: Ruby → Protocol::WehSocket+Twiggy
  • まとめ: 進歩しているけど、進歩しているのはソフトかも・・・
keigo.tanaka.77さん「AWS Elastic Beanstalk Custom AMI で PSGI Hello World
  • カスタムAMIを利用
  • デプロイするファイル
    • httpd.conf パス
    • psgi.ini 走らせる設定
    • a.run psgiファイルを走らせるファイル
  • デプロイされてきたらそれをリロード
  • git aws.pushする
  • AMIはゴミもあるので、欲しい方は声をかけて
ノダイイチロウさん「Wano株式会社」
  • 音楽×WEBのサービスを作る会社
  • エコバックを作ってるばかりではない
  • CTO加藤さんがJPA理事に就任
    • 開発速度が速い、指が長い、Perlを愛してやまない
  • 新サービス tunecore 音楽の流通を変える
    • プロモーションビデオ上映
hiratara「Perlでおねえさんを救った話」

自分のセッションでした。今回は人数も人数なのでいつもと違って自分の好きなことだけを話すのではなく聞き手を意識した内容で話してみました。喜んで下さった方も居たようで、よかったです!

mayumineさん「Perl と人生」
  • 去年初めてLTに出て好評だった
    • Perlの経験値は上がらなかった
  • perlの人生
    • Hello Worldの登場 「たかし」
    • 「宿題やりなさい」
    • while result_of_the_exam
    • me->want("Drink")
    • while girlfriend->answer()、$wife = $girlfriend
    • $anser eq 'Bath'
    • wife->childbirth
    • sub life { }
    • 続きはgithub
  • いいコード書けるよって人はぜひ