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

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

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

今日はYAPC::Asia Tokyo 2010の初日です

perl レポート

今日からが本当のYAPCです。まもなく、東京工業大学大岡山キャンパスに向けて移動します。

昨日と同様に、gihyo.jpさんの特集にもレポートを掲載しています。gihyo.jpさんにはもう一人 @usuihiro さんもレポートを書かれていますので、そちらも合わせて会場の雰囲気を感じて頂ければと思います。

Daisuke Makiさん「Welcome, Perl!」

  • Future, Past, Present Perls
  • ゲスト → Larry, Jesse, Purple Master
  • みんなにPerlを広めたい
  • 今回は非エンジニアが企画した (941さん++)
  • 518人の参加者 → 世界で一番大きなYAPC
  • タグは #yapcasia で
  • トークの投票をやる → 優秀者にはMacBook Pro
  • 懇親会は19時より2,000yen
  • android, iPhoneYAPCアプリがあるので使って! (有志の方の作成)
  • ロケタッチもYAPC対応
  • 謝辞 → ボランティア30名、tmix、スポンサー23社
  • ハッカーと積極的に話して、楽しんで下さい

Larry Wallさん「That Goes Without Saying (or Does It?)」

  • 日本語と英語の違い
    • must <=> なければなりません (英語が短い)
    • must not <=> いけない (日本語が短い)
  • 英語には複数形がある
  • RMS(Root Mean Square)
    • 色々な言語で書き方に違いがある
    • Perl、 Oz、 Lisp系 での違い
    • FoldLについての解説
  • Perlで必須な物
    • @, $
    • {}
    • () → 必要な時と不要なときがある
    • 「@ints = 1 .. 10」と書けるが、Perl5では「@ints = 1, 2, 3」と書けない
    • 結果を格納する $r
  • CPANモジュールを使う → List::Util の reduce
  • Perl6では
    • reduce を [+] と書ける
    • map にはカンマが必要 → ただし、 @nums X** 2 と書ける
    • 引数は、subの行に書ける
    • $r を完全に消せる
  • print "\n" → say
  • Perl6では、 + はスカラコンテキストを与える
  • Perl5ですでに使えるもの → say, smart matching, given/when, Moose
  • 将来もPerl5でサポートされないもの → type system, multi method dispatch, lazy context
  • Ada
    • with と use, begin と end, nums'Range, 1..10が簡単に書けない
    • ファットアロー =>
  • Java
    • import(java.*), class, "public static", 型, C形式のループ
    • Math.とかSystem.outとか
  • JS
    • function(長い)
    • reduceの初期値が必要(Perl6では+なら0、*なら1、<ならtrueが使われる)
  • Python
    • __future__ のインポート、インデント
    • range(1, 11) (# 1 .. 10 とコメントしないとわからないよ)
  • Perl6より短く書けるのは、Mathmatica (これは当たり前)
    • J → 短過ぎる
  • このような見本は、 http://rosettacode.org/ で見られる

―Sqiral matrix, Zig-zag matrix の例

  • 「Please have a wonderful conference. You must!」

Jonathan Rockwayさん「Stylish: PerlEmacs

このセッションはJonathan Rockwayさんがいらしていないということで、中止となりました。

石橋利真さん「最近のPerlな物作り事例」

  • MTLでの業務
    • 自前サービス - ATND、調整さん、演劇ライフ、ハモニナ、コマーシャライザー、docomo公式、モバゲー
    • 社内コラボ - ポンパレ、suumo、WEB APIiPhoneアプリ ←今日の話はこちら
  • suumoの事例
    • 個社の物件+CMSの提供 → century21.on.s-bs.jp、athome.on.s-bs.jp 等、1,000個
    • CMS、物件検索、Typepad
    • デモ → 数社のページを表示。CMSの操作例。モバイル版。
  • suumo的なサービスを横展開
    • お店のミカタ → ページを作るとホットペッパーに引っかかる
    • パチパチゼクシィ → 結婚式開催向けSNS
  • 開発環境を整えると、長期に渡って開発を続けられる
  • 本番環境でもテストを回している → 設定、CPANモジュール漏れの発見。テスト用DBを用意。
  • SubversionCPANモジュールも投入。svn up でデプロイ。
    • 同じOS、同じ環境である必要がある → VMWareによって揃える
    • svn配下にインストールできるよう、MyConfig.pm をいじっておく。
    • site_local_env にて環境変数等を設定(.bashrcより読み込み)
  • 動的ライブラリも、.soをsvnへ登録
  • *.conf もsvnへ。全環境分を登録し、symlinkで切り替え
  • 複数サービスによるロジックの共有
    • Perl Framework 部分は、すべてのサービスに配備されている
    • 認証、画像、Open Social系はWEB APIとして準備
  • (環境まで含めた)フレームワーク
  • インフラ
    • Hardware + XenServer
    • VMの複製コピーができるので楽
  • 仕事の仕方 → 企画、サイト設計、業務フロー、開発、運用、すべてにエンジニアが参加
  • 仕事のスケール → 営業、顧客サポートまで含む大きな体制
    • 金銭的にも、大きな額が動く(1,000社程度の契約)
  • 様々なオープンソースを利用している(Thanks To!)
質疑応答
  • Q. 「CPANモジュールのアップグレード方針は?」
  • A. 「上げない。必要な状況があれば上げる(セキュリティfix等)」
  • Q. 「(デプロイ用の)svn upは手動?」
  • A. 「はい。基本的にリーダーが。」
  • Q. 「ブランチは使っていますか?」
  • A. 「新機能はブランチで行っている。マージはリーダー。」
  • Q. 「オープンソースの中で、オススメがあれば」
  • A. 「backlog。cacooもオススメ。cpanminusも使いたい」

kawanetさん「Mashup Awards 6」

  • Web アプリケーション開発コンテスト
    • 62社のAPIのうち、1つ以上利用すること。動く場所は問わない(電子レンジ等でも)。
  • 注目APIの紹介
    • LLEval - 弾さん「明日トークします」
    • R25 APIR25本文の提供
    • NetVOCALOID-flex → 音声合成API。MA6に参加すると特別に無償提供
    • モバゲーオープンプラットフォーム → 会社名を「マッシュアップアワード6」とすれば特別に個人登録も可能
    • NHKの非公開API → 通常は非公開
    • Evernote APIEvernote社が使っているAPIをそのまま公開
    • インクカートリッジ里帰りAPI → 回収拠点情報の提供
  • 最優秀賞は100万円。11/8まで。
  • 目的 → 技術者の支援、WEB業界の発展
  • Hackathonも開催中

Kensuke Kanekoさん「30days Albumの裏側 後日談」

  • 30days Album
    • 写真共有サービス
    • 表はRoR。裏はPerlbal や Gearmanなど。
    • 過去の発表スライドも参照
  • 素結合を意識したシステム構成
    • HTTP APIでのやりとり。(Catalyst製)
    • 利点 → スケールしやすい。開発能率が上がる(適材適所)。保守が楽。
    • 欠点 → システムが複雑、サーバ台数の増加、障害時の影響範囲
  • MogileFSの障害対応
    • データアクセス不可の障害発生 → ストレージプールから切り離し、再度戻す
    • mogadm にて deviceを "dead"にする。復帰時は"alive"に戻す
    • コピーの確認 → X-REPROXY-URLヘッダを見る。又は、file_onテーブルを見る
    • 障害が起きても、サービスは停止しない。
    • perlbal の再起動(キャッシュのクリア)
  • MogileFSのリバランス
    • 使用量の少ないストレージへ、ファイルを分散して平準化
    • リバランスが必要なタイミング → 新しいノードを追加、容量不足、class(多重度)の変更
    • リバランスをすると、MySQLの負荷は上がる。新しいバージョンであれば改善
    • ネットワーク大域も圧迫。モニタリングした方がいい(Mininの利用)
  • 自作サーバ MP-100 (馬崎さんパワー100Kg、の略)
  • FLVの疑似ストリーミングとは
    • シーク可能。リクエストにstart=*をつける
    • lighttpd の mod_flv_streaming。Apache、nginxにもある。
    • Perlbalにはない。
  • Perlbalプラグインを作成した
  • PerlbalとRangeヘッダ
    • Perlbal は Rangeヘッダリクエストでエラーが出る → X-REPROXY-EXPETED-SIZE が原因
    • Content-Length と一致するか比較していた。ストレージサーバがRangeヘッダを考慮してなかった。
    • 複数のRangeヘッダについては無視(仕様がややこしい)

Tatsuro Hisamoriさん「ソーシャルアプリ向け システム監視運用の勘所」

  • 事例の紹介
    • 「正しくコンテンツを返しているのにタイムアウトが頻発 → ネットワークに問題があるのでは?」
    • タイムアウトはしており、Platform側ネットワーク障害も特になし
  • tcpdumpで調査
    • コンテンツを返すのに5秒かかっているので切断
    • しかし、200を返してしまっている
    • アプリ側の処理遅延が原因(DBの性能劣化だった)
  • コンテンツを返すのにかかる時間
    • WAFでログに出す(request -> response)
    • %DとGadgetServerが認識している時間は違う → 現状は、alarm()がSIGALRMを送るまでの時間
    • tcpdump + wireshark で解析するとよい
  • tcpdumpwiresharkの利用のデモ
    • -w でファイルに吐く
    • TCP Conversations を表示し、 Duration でソートするとよい
  • DB周りの処理時間
    • DBI::ProfileはDBIと同梱。useするだけでよい。
    • DBIx::ProfileManagerでは、profile_startからprofile_stopが統計対象
    • slowlogを吐いていれば、mk-query-digest(maatkit)で解析
    • 最終手段として、mk-query-digestにtcpdumpの結果を読ませることができる
    • 性能劣化の把握も必要 → Connection QPS, I/O
    • open Platform で参照している指標の紹介 → TableSpace usageなど
  • ネットワークのレイテンシの把握
    • ping, traceroute などで計る
    • 自宅サーバ等でも10ms、EC2だと100ms〜200ms、GAEはバラツキが多い
    • VMでもレイテンシとなる
    • 画像キャッシュを利用するのもよい

malaさん「Studying HTTP with Perl

  • PerlのHTTPクライアント(非並列)
  • PerlのHTTPクライアント(並列)
    • HTTP::Async, LWP::Parallel → 古く、オススメできない
    • AnyEvent::HTTP → AnyEvent ware。コードを追いやすい
    • Coro::LWP → LWPをCoro対応させる。ただしCoroは黒魔術。Perlプロセス全体に影響有。
  • AnyEvent::Curl
    • (今まで考えていた)前提 → I/O待ち時間がほとんど。実行速度は無問題
    • しかし、実際はLWPの遅さは問題がある
    • LWPでは性能限界(ネットワーク待ちが0の時の性能)が低過ぎる → CPU1つで秒間200回
    • ネットワーク性能のよい、速いサーバを相手にするときに使う
    • 負荷試験、DoS攻撃(!)に向いている
    • 性能限界は、秒間2500回。LWP::Compatにすると、秒間1000回。WWW::Curlよりは遅い
  • 使いどころ
    • LWPの性能限界を超えている時
    • ブロックしてはいけないとき(つまり、WWW::Curlでは駄目なとき)
    • LWPを利用した機能があるときは、LWP::Compat
  • curl_multi_fdset でとりだしたfdを AnyEventで監視
  • Perl並列処理入門
    • perlのthreadはバグッてるので使わないこと
    • forkによるマルチプロセス
    • イベント駆動(I/O多重化)
  • forkの特徴
    • スケジューリングはOS任せ
    • マルチコアを生かせる
    • forkのコストの高さ、メモリ消費の大きさ
  • イベント駆動
    • AnyEvent, POE → メモリが少なくて住む
    • Coro → 直感的なコードを並列化できる・・・が、ハマりどころ多い
  • 現実解 → イベント駆動 + prefork
    • AnyEvent::DBI → forkして実行する
  • prefork型 → mod_perl, starman, starlet, Paraller::Prefork, WWW::Curl
    • DOS攻撃には弱い。プロセス枯渇する(特に遅いワーカーが多い場合)
    • slowloris のようなツールに弱い
    • 対策 → 個人の持てるIPアドレスは少ないのでIP辺りで資源を制限。タイムアウトの導入
    • 1リクエスト処理時間、リクエスト数が予測できれば、preforkはよく機能する
    • 外部APIのレスポンス時間に依存する場合は、向いてない
  • イベント駆動 → Twiggy, Corona, AnyEvent::HTTP, Coro::LWP,AnyEvent::Curl
    • スレッド間の強調動作をするときに向いている → 同一ホストへのリクエストを制限する時など
  • クライアント → 相手の応答速度が予想できればWWW::Curl、そうでなければAnyEvent::Curl
  • パフォーマンスチューニング
    • HTTPヘッダのパースをXS化。ただし、パースしない方が速い
    • まだXSで落ちたりするので注意
  • デフォルトのcurlは名前解決でブロック
  • RPCのプロトコルはHTTPの方が有利
    • 例えば、 Kyoto Tycoon (mikio hirabayashiさん)
    • アクセスが楽、表現力がある、非同期アクセスにも強い
    • HTTPのオーバヘッドの解決 → Keep-alive、複数データをまとめて1リクエストで転送すればよい
    • HTTPの性能限界 → echoサーバとHTTPをkazuhookuさんが比較。チューニングされたhttpdは十分に速い
  • curlにはまだ高速化の余地がある → gfxさんがやってくれるのではないか
  • HTTPクライアントのテスト方法
    • Google などにリクエストを投げるべきでない
    • Text::TCPpsgi app を作ってテストするべき

伊藤直也さん「Perl/PHPと大規模Web開発」

  • LLフレームワークの近況
    • 中規模以上 → Rails
    • ちょっとした開発 → Sinatra
    • 実行環境 → Rack
  • Perlでは
  • Mojolicious
    • Sebastien Riedel氏作
    • Mojolicious::Lite → Sinatraライクな記法
    • websocket 対応
  • PHPでは
    • CakePHP, CodeIgniter, Symfony → 作り込まれたWAFが多い
    • Limonade, Fitzgerald
    • まだない (需要が小さい)
  • 言語によって大きな差異はないが、好みはある
  • 中から大規模とは → 500から10000台以上
    • 収益化までに数年かかっている → 数人で立ち上げたシステムを数十人で運用開発
    • 昔のアーキテクチャを使い続ける必要。運用を続けなければならい。
  • 「レガシー」とは違う → プロトコルはHTTPであり、枯れている。LL言語後方互換が高い
  • フレームワークの内製バージョンができる理由 → 自社目的の拡張をしたいため。公開はしにくい
  • アーキテクチャの刷新
    • 独立性の高い案件で新しいものを採用 → 複数アーキテクチャによりメンテナンスコストが上がる
    • 旧システムを進化 → 限界がある
    • まず疎結合化してWEB APIで結ぶ。各部品を刷新 → パフォーマンスの問題。メンテナンスコスト
  • スケーラビリティ
    • 言語での優位性は低い
    • I/Oの分散や全体の設計が大切
    • 3層構造、スケールアウト、パーティショニング、キャッシュ、メッセージング
  • 大規模Webサービスは、成長し続けることが大切
    • レガシー部分を蘇らせるのが腕の見せ所
    • 言語での優位性は少ない → 精神面では、好きな言語を使った方がよいけど
  • PerlPHP の移行コストは?
    • 少ない。CPANは欲しい
    • 次世代Web技術が大事で、言語の知識の比率は少ない
  • ツールはPerlで作っている → メンテをどうするかが課題
  • 質疑応答
    • Q. use backslash はいつ公開?
    • A. そのうち公開します

Lightning Talks

西林拓志さん「学生PHPプログラマーPerlな会社に就職した!」
  • PHP歴4年
  • Perlの印象 → 難しい、重い、古い
    • 生まれが一緒。高校の頃に触った印象
  • 実際
  • PHPを使った人がハマる所
    • リファレンス
    • $this, super, self
    • subとfunctionをtypo
  • 最近ではPHPで my $self = shift; と書いてしまう
  • DBIx::Skinny::ModelLoader ってのを書いてみた。githubを参照
  • 趣味でBlogやゲームのファンサイトを作っている
Fumiko Kuranoさん「Inside webcast of Gozan-no-Okuribi in Kyoto」
Yappoさん「Happy AnySan Hacking」
  • tsudaさんのコスプレ
  • AnySanとは? - AnyEvent のメッセージングフレームワーク
    • 似ているもの → IKC, Bot::BasicBot, Morris など
    • IRC以外の対応も可能
  • メッセージの抽象化
  • デモ: @dan_the_bot
Naoki Tomitaさん「OFPM」
  • なぜ忍者 → 手裏剣選手権に出席したから
  • 1日1個CPANモジュールの紹介 → 2008年で挫折 → 書籍化!!(100〜150個)
  • CPANTS → CPANモジュールの統計情報
    • ただし、モジュールで使うモジュールが多く出てしまう
  • Gist から統計
    • OFPMというサイトを立ち上げた
Kamipoさん「MySQLのPluginいろいろ」
issmさん「「名古屋でPerlをゆるく語る会」をはじめました」
  • 名古屋の事情 → Ruby, Python , PHP, Scala , Haskellは勉強会がある
    • ゆるく語る会を開催 → スイーツ、パスタ、ポケモン
    • 10/30に題4回を開催。Nagoya.pmになる?
吉川 毅さん「RubyプログラマPHP大規模開発の会社に入って」
  • GREEの方 ・・・ CTOの代打
    • 図説
    • OOPJog → OOPの話をしながらジョギング
  • Sinatra
    • 他の言語にも同様のものがある(Python(Flask), Java(Scalatra), Perl(Mojolicious::Lite))
    • 直感的なインタフェース
    • PHP版の実装はひど過ぎる。Sinatraじゃない → 作った Vicious
  • PSGI も作った → Phack
  • ゴーーン!(時間切れ)
bayashiさん「YAPC::EU 2010 Reports」
  • ヨーロッパ最大のYAPC
    • 今年はイタリアのピサ
    • 片道13時間半
    • YAPC::EUは食べ物が多い
  • プレゼンは
    • YouTube に動画が上がってる → Larryさん一家の動画が必聴
    • 質問から議論に発展することが多い
  • DeNAの会社の制度で行ってきた → ぜひDeNAへ!
  • 来年はin Riga, Latvia
峰松 浩樹さん「基幹システムがperlでどうしてこうなった」
  • 汎用機を2013年までになくしたい → OpenCOBOLへ
    • Cobol, 500万行 JCLは100万行
  • 解決策 → Perlでの自動変換
zentoooさん「Test::QUnit - QUnit test via prove」
  • 一部プラック企業
  • JSのテスト
    • YUI, QUnit, JSUnit, JSpec, Jasmine
    • ブラウザ開きたくない。でも、ブラウザエミュレーションには問題が
    • JSTestDriver → CUIからもブラウザからも
  • CLIからブラウザのテストが叩ければよい → Test::QUnit
    • QUnit.log をフックしてPerl側にデータを持ってくる。TAPにする。
    • コードはgithub
Karen Pauleyさん「10 Things to Do with a conference T-shirt」
  • YAPCに20回以上出ている → Tシャツが余っている
  • そのままでは大き過ぎる
    • はさみでアレンジ
    • 赤いリボンでアレンジ
    • ヘアバンドに
    • earingに
    • バッグに
    • 枕に
    • 編み直してタオルに(!)
    • 袖を切ってタンクトップに
    • 二枚を合わせてパンツに
  • 「There is more than one way to ware it!」
Yoshinori TAKESAKOさん「all your base16 are belong to us.」
  • プログラミングで何文字使ってますか?
    • 8文字 → Brainf'ck
    • 52文字 → 多い
    • Perlでは100文字以上 → 大き過ぎる
    • Pythonは1000文字以上(emoji)
  • Polyglitプログラミング
  • Binaryを使わずに10文字でx86プログラム
  • バイナリアンは古い → ASCII文字でプログラミングしましょう

合わせて読みたい