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

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

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

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

レポート perl perl+web yapcasia

一日目です。今日もgihyo.jpさんのスペシャルレポートにレポーターとして参加しています。

941さん「開会の挨拶」

  • 400人以上入るから今年は大丈夫!
  • 今年で4回目
  • 個人スポンサーも150組以上
  • 遠方参加者支援 @ スカイアークさん
  • 懇親会費無料 @ DeNAさん
  • ランチセッション @ スポンサーの方々
  • ランチミーティング、BOFスペース
  • 今日は中秋の名月→掛け軸コーナーあります
  • ゲストスピーカーもいるのでお楽しみに
    • 話しかけてみよう
  • トークに投票もしましょう
    • 商品は技術カンファレンス参加費用、国内カンファレンスに派遣、国外派遣、など
  • スピーカーの人には珈琲チケットがあります

Ricardo Signesさん「Perl5 〜 Postcards from the Edge」

  • パンプキング → プロジェクトをすすめる
  • perlは今も混沌としている
    • 変えようとしてないし気にすることもない
  • スレッドで出るエラーが修正された
  • 正規表現文字集合の演算
    • (?
    • +と-など
  • Python的な局所サブルーチン → my sub ...
    • state sub ・・・だと状態を持つので直観に反する
    • パッケージローカルにもできる
  • レキシカルな$_はexperimental
  • スマートマッチ
  • ハッシュのランダム化
    • keyとvalueは対になって同じ値を返す
  • splitの挙動の違い
  • File::CheckTeee, Text::SoundeEx,PodLaTeX, CPANPLUS
  • Perl5はPerl5であり続ける
    • PerlをもっとPerlらしく
    • Teachable, Guessable, Extensible, Compatible
  • Success hates agility
  • 不要のものは取り除くべき。ただしいつ除くかは合意が取れてない
  • Perlハッカーを必要としている
    • パッチを主に書いているのは4人
    • 誰もがパッチを書ける
    • 機能が欲しければ実装、わからなければ聞く、p5pに意見を伝える
  • Perl5.20
    • 暗黙のcloseに失敗したらdie
    • 末尾にデリファレンスを書ける ->@*
    • ハッシュのペアのスライス
    • 型 文字列とバイト列の区別とか
    • magic MRO
    • drand48
    • 関数で引数を受けられる
  • Q. MOP::Reduxはいつ入る?
    • A. 入れたいけど、CPANにあげて様子をみたい。もしかしたら5.22?
  • Q. CGI.pmは消える?
    • A. コアからは消えます

Songmuさん「今時のカジュアルなデータベース関連開発」

  • RDB寄りの話がなくて歴史の流れを感じる
  • 最近はTeng。けど社内はDBIC好きの人が居る・・・
  • DBIx::Schema::DSL
    • 自分でSQL書く+α、自動でDDLをはいてくれる
    • Perlの定数と連携、DRYな記述、シンタクスチェックの恩恵
    • SQL記法の統一 → DDLの比較がしやすい(SQL::Translator)
    • 外部キー制約のDDLの出し分け(BKが要らない)
  • MySQL Workbenchを使わない理由
    • バイナリが辛い(マージが出来ない)。GitDDLは神
  • GitDDL::Migrator
    • GitDDLを運用向けに改良したもの
    • 特定のバージョンに戻すとか、
    • 実際のDBとの不整合検出とか
  • DDLのバージョンをgitのハッシュ値と結びつけて管理
    • git_ddl_versionテーブルにgitのハッシュを保存、2つのDDLを比較
  • デモ
    • SQLの生成、deployコマンドでマイグレート
    • データベースが古いことの自動検出、マイグレート(DDLの流し込み)
  • Teng::Plugin::ResultSetみたいの書きたい
  • use Exception::Tiny
    • DBのエラーをMyApp::DB::名前空間に階層化したら便利
  • DBIx::Transaction::Manager::EndHook
  • Redis
    • ゲーム用途(キャッシュと言うよりは、キーバリュー的な用途)ではmemcachedが不要に
    • Setでログインユーザを残したり、Listをジョブキューとして使ったり
    • Expire設定をきちんとすること。LRUに期待しない(溢れるとヤバい)
    • 冗長構成は難しい
    • 永続的なデータはおいてはいけない
  • Redis.pm ・・・ pure perl。遅い
    • fork safeじゃない。パッチ書いたけど取り込まれてない
    • Redis::hiredisは高速だけど素過ぎて微妙
    • EV::Hiredis (typesterさん作)
  • Cache::Redis → Cache::Chache的だけどRedis.pmとかRedis::hiredis使う
  • Redis::LeaderBoard → ランキングの同率問題。Redis.pm依存
    • Redis本体にもAPIができるっぽいけど、2.8で入るはずが入らず難航中?
  • Fluent::ogger
    • 例外とかも構造化ログで。Mongoは捨てつつある
  • DBの設計
    • ARっぽくid必須の普通な感じの
    • 単数複数変換はしない。テーブル名は単数形
    • 基本的に正規化し、キャッシュで頑張る
    • インデックスは必要なものだけ。複合インデクスがあったら先頭部分のインデクスは省く
    • 外部キー貼らない。レコードロックの発生やインデックス重複(前項参照)
  • 接続時に発行
    • SET NAMES utf8mb4 → 4バイト範囲が化けるのを防ぐ(DBD::mysqlの問題)
    • SET SESSION sql_mode='TRADITIONAL' → 一番厳密なモード
    • 再接続の時も実行したいのでon_connect_doで。ただし、on_connect_doはDBIの機能じゃないので注意
  • Unicode絵文字は4バイト → utf8mb4
    • VarCHAR(191)にしないとバイト数の関係でインデクス貼れないので注意
  • 論理削除は使わない
  • MVCは荒れるので略・・・
    • DB/以下にORMの層を置く。Model/がDB/の層を呼ぶ
  • プロファイリング
    • DBIx::QueryLog、Devel::KYTProf、Devel::NYTProf
  • ISUCON → 共同開催。組長に挑戦しよう
  • Lobi → チャット。サーバサイドエンジニア募集

Kosei Moriyamaさん「BrowserStack を用いたクライアントサイドのテスト」

  • JavaScriptのフロントエンドのテストについて
    • 進化している過程である。これを機に知識の整理を
  • JSでできること
    • UI、WebApp、ブラウザ拡張、スマフォアプリ→長いJSが書かれる
  • JSのテスト
    • 純粋なロジックは簡単
    • DOM、非同期、ブラウザ(実行環境)間の違い
    • CLI・CIと遠い
  • テストフレームワーク
  • テストは単純。いろんな環境で流したい
  • QUnit、Jasmine → CSS、JSをブラウザから読むだけ
    • 使いやすいがCLIから呼べず自動化しにくい
  • 解決策
    • node.jsでロジックだけテスト
    • ブラウザのエミューレートの環境、ヘッドレス、実際のブラウザ
  • ヘッドレスブラウザ
    • ブラウザから、UIなどを取り除いたもの
    • PhantomJS、Capybara
    • WebKitしかないのが欠点
  • JsTestDriver
    • ブラウザが後ろにいる。まとめて投げてくれる
    • 他、Buster.js, Karma, Testemなど
    • 過去のブラウザなど用意するのがきつい。結合テストがきつい
  • SeleniumSelenium::Remote::Driver
    • Cookieなども合わせた挙動が見れて良い
  • BrowserStack
  • ローカルのサーバはPlack::App::Directoryで十分
    • BrowserStack から Tunnelを掘って、このサーバにアクセスされる
    • proveの-P(プラグイン)を利用
    • Seleniumから接続させる
  • 自動テストするデモ
  • Q. CPANに上げますか?
    • A. まとめたら
  • Q. 速度は?
    • A. 1つのブラウザにたいして5〜10秒

Yappoさん「Inside amon2-livedoor-setup.pl with web application development 2013」

  • WAF → サービス固有のコードを書くことに集中
  • 実務で使っている内容。入社すると捗る
  • Team Geekはいい本
    • 「ミッションステートメント」やること、やらないことリスト
    • pull-reqでやりたいこととマッチしてないものをマージしない力
  • Amon2の標準セットアップは使ってはダメ
    • 社内環境を考慮していない
    • 当面はサービスが1つなので、それで良い
  • 自分のWAFを作る人
    • 失踪したらまずい。同じ物を使うべき
    • ノウハウのたまり方。社内の隣の同僚に聞けるかどうか
  • 既存プロジェクトからのコピペ
    • 後から見ると、この設定何、みたいな。秘伝のタレ
    • dsnの中にsql-mode=STRICT_TRANS_TABLESとか、効かない
    • httpdの設定がオレオレ過ぎると、インフラの人が捗らない
  • コピペでなく、社内雛形を統一する
    • バランスが大事。ひな形に必要以上に詰め込まない
    • 社内ルールを意識する。インフラにも声をかける
  • Perlが初めての人でも、市通り最低限のことができている状況になる
  • amon2-livedoor-setup.pl
    • stf tool-kit → ローカルサーバのポートの調整など
    • nginxとapacheは両方入れている
    • 簡単なWEBのサンプルコードも入れてある
    • スレーブへupdateをチェックするフック
  • 問題
    • ひな形のコピペ → もとの黙阿弥
    • ひな形もプラがブルな作りにしたい
  • YAPCに向け、改良
    • plainなファイルのテンプレ
  • Ksgk (くそがき) - Knack o the System Generation for Kurouto
    • アプリケーションのひな形のための小さなツール
    • オプションやら実行すべきコマンドやらひな形のテンプレの機能やらを設定
    • 実行すると、いい感じにヒアリングされていい感じにひな形ができる
    • 「くそがき」はシンプルなモジュール。iOS開発とかにでも使える
    • :ksgk: タグで、コードを埋め込める
    • 他言語化に必要なものを定義したり
  • ひな形ツールの利点 → 最小限のレシピが蓄積されるのがよい。pupetとかと同じ効果
  • その他の成果物
    • tiny log
    • Amon2::Plugin::L10N
    • HTTP::AcceptLanguage
    • Exception::Tiny → Exception::Classはわかりにくい
    • Try::lite → クラス名でのキャッチ
    • Makefile.PLでproveを使うhack
    • .proverc → carton
    • growthforecast-worker.plを同梱して使ってもらう
    • SQLはexplainを使ってみること
    • QueryLog → デバグ用
    • AxsLog
    • DB replication。Mysql HA
    • などなど
  • どんな人と働きたいか→何をやっているか考えながら仕事をする

karupaneruraさん「ぼくがかんがえたさいきょうのMVC

  • MVCのおさらい
    • M: ビジネスロジック、データベース操作、データの変更通知
    • V: UI出力、データの整形、データの変換
    • C: UIからの入力をいい感じに
  • MVCは意外に難しい
    • Modelが巨大に、SQLが散らばる
    • Controller、Modelの双方でfetch
    • ViewがJSONとHTML両方あったり
  • MVCはそのまま使わない
    • MVCの定義は曖昧。Client、Web、API、などいろんなアプリがあるのに
    • 定義が曖昧な部分がブレやすい
  • MVCのカスタマイズ
    • 各アプリにふさわしいMVCを定義する
    • 規則をはっきりさせて、コードをはっきりさせる
  • 具体例
    • いろいろな入力 HTTP Header、Request Parameter、Cool URI
    • いろいろな出力 HTML、JSON、MessagePack、XML
    • うまく吸収したい
    • Context, Controller, Model, DB, View
  • Context → リクエスト単位の管理
  • Controller → Modelへの入力を抽象化
    • Controllerを見ればリクエストのフローがすべてわかる
  • Model → ビジネスロジックの抽象化
    • 問題はExceptionで通知する
  • DB →データベース操作の抽象化
  • View → 出力の整形
    • 複数のViewを統一のインタフェースで扱えるようにすること
  • 実現する必要がある → チーム規約による
    • コードレビューなどを有効に使う
    • 6人くらいの開発者で読みやすいコードを保てている

hiratara 「Types and Perl Language」

自分のトークでした。

Naoya Itoさん「モダンPerlリファクタリング

n-Text::Md2Inaoのリファクタリング

  • マーティンファウラーによるリファクタリングのタイミング → 新機能を付けたいけど、付けるのが大変なとき
  • 下準備githubAPI定義、テストの追加
  • CPANレイアウトにする
    • prove, Carton, Guard, Travis CI
  • CPANモジュールの洗い出し
  • cartonを使う
    • carton execでローカルのモジュールだけで動作させられる
    • carton execを繰り返して必要なものを入れていく
  • モジュールをテストしやすいようにし、オールグリーンにする
    • リファクタリングで重要なのは、テスト群を作ること
    • 実行環境とアプリケーションを分離
  • End to Endのテストから
    • 外部から見た時の振る舞いを保つため
  • Text::Baseを使っている
    • データを起点とするのでEnd to Endに向いている
  • Webの場合はPlackを使う
    • test_psgi を使う
    • 出力のコメントにテストでマッチさせる文字列を入れている
    • CGIの場合でも、Plack::App::WrapCGIというものでPSGI化できる
    • 実行環境がみつ結合した独自FW (mod_perlと密結合とか)→capybala-webkit + headless
  • より細かいテストを追加
    • 分割して、テストとして定義
  • テストさえあれば、リファクタリングは難しくない
  • バグを明らかにするための単体テスト (回帰テスト)
    • 回帰テストは外部を定義するような重要なテストになる
  • 継続的インテグレーションが必要 → Travis CI
    • Perlの標準的な構成にして、githubに置くのが重要
  • Guard + guard-tap → ファイルの保存をキーにテストをキックできる
    • 特定のファイルに対して一部のテストを実行させたり → テストの局所化
  • テストは無理せずほどほど程度に
    • 完璧な動かないテストは意味がない
  • テストはリファクタリングが進むほど書きやすい
    • 徐々に増やす

Lightning Talks Day 1

kazuhoさん「Using the Power to Prove」
  • proveはTest::Harnesのインタフェース
  • プロトコルはTAP
  • TAPはversion1から。Test::Harnessは5系なら
  • prove -j 8 --state hot,fast,save → 8並列失敗したもの速いものから実行
  • perlがshbangを読むのでbrain fuckのもproveで動く
  • prove --exec '' はマニュアルにかいてあるが動かない
    • prove --exec '' t/bin で実行できる
  • --ext "" --exec ""とやっておけばbfでもcでも
  • .proverc に書くと良い
  • t/ 以下に入れておけば動く
  • cronやモニタリングもTAPを吐くものなら何でも
yoshims85さん「ギークな異性を落とす魔法の言葉」
  • ギークを落とすための殺し文句
    • ペアプロしませんか」「200 OK」
    • 「全角スペースを入れられました」「これを(grep)...」「200 OK」
    • 「俺のシングルトンになってくれ」「200 OK」
sanematさん「Tachikomaで異存ライブラリの断続的バージョン上げ」
  • n clickを1 clickにすれば商売、1 clickを0 clickにすれば革命
  • 大事なのは継続的にバージョンアップすること
  • bundle updateはする。carton updateってするの?
  • Tachikomaは自動でpull-req を送ってくれる
  • CPAN Testers Reports
    • 落ちた環境を再現する。Rubyにも欲しい
    • Prepanもrubyにはないけど・・・
    • ci hsbt org → 主要のRubyのライブラリをRubyのTrankでは知らせる
    • 刺身さんがRubyで話していたものをライブラリとしている
    • gemのdiffが酔っくわからない
  • tachikoma:carton
  • 死なないためには変化を
Yappoさん「HTTP::Body::Builder」
  • perlbrew install する際に-asオプションを指定するといい(豆知識)
  • x-www-form-urlencodedは簡単に書ける
  • マルチパートは難しい「なんでArray-Refを使うの?」
    • ぐぐらないとできない
  • HTTP::Body::Builder をみんなで作りましょう(まだ作ってない)
    • 作ったらビールおごる
    • add_fileとadd_contentでいじればいいんじゃないか
    • boundaryとかもいい感じに
  • メモリを食いつぶしてしまう
    • コールバック的な
hirose31さん「How to inspect a RUNNING perl process」
  • Acme::CPANAuthors::Nonhumanで人外認定された
  • ハングアップ、無限ループ、リーク、を外部から覗きたい
  • strace システムコールが見られる
    • オプションにより所要時間も
    • テキストがある程度出る ダメなクエリの洗い出し
    • システムコールしか出ない
  • gdb
  • bulkgdb バッチで実行
  • gdbperl
    • 行番号で見れる
    • Perlの特定のバージョンに依存してそう
  • inspect-perl-procというのを作った
    • gdbでアタッチ、Perl_eval_pvする部分で任意のPerlコードを実行
  • dump-perl-stacktrace
    • Perlのパッケージ名などのバックとレースが見れる
  • dump-per-memusage
    • 間をおいて2回取るとよい
  • dump-perl-inc
  • githubで公開しているので使って下さい
yusukebeさん「YAPC::NA へ行ってきた」
  • YAPC::Asia 2012のベストトーク賞の商品
    • YAPC::NAまたはYAPC::Europeへ
    • North America 行ったことある人、少ない
  • オースティン
    • 6/3,4,5
  • YAPCはソーシャルカンファレンス」
    • 廊下でのコミュニケーション
    • 無限珈琲(デカフェも)
    • Speaker's Dinnerなど、3日間交流がある
  • 発表もラフ
    • 身振り手振り
    • 問題を出したり
  • 英語は障壁ではない
    • どこから来たの?と聞くといい
    • オースティンという人は少ない
  • Moo使おうよ
    • タオツポスTシャツ*1
  • Boketeの話をした
    • 結構ウケた
    • ヒラリー夫人はウケやすい
egoproさん「んだっちゃだれ Sendai.pm」
  • んだっちゃだれ
  • 「自ら2分で話します」
  • 270分の集中講義を開いた
    • @typestarさん、@yusukebeさん、@dankogaiさん
  • Sendai.pmはこれだけ。剣道
  • 2014年 YAPC::Tohokuを開きたい
comewalkさん「オープンソースプロダクトに貢献するということ」
  • オープンソースに関わったことないけどやってみたい人 → あまりいないけど
  • patch welcomeはハードルが高い
  • オープンソースとは
    • 開発者とユーザ。どちらも好循環で増えていく
  • Gearman, Perlbal, mogileFSのMLのモデレータをやっている
    • MLのスパム判定
    • アメリカ人が寝ている間に日本人が対応すると、時間として調度良い
  • patch welcome 以外の貢献方法
    • 使う、ブログに書く、国際化、職場で使う
    • やりかたは一つじゃない
bayashiさん「細かすぎて伝わらないモジュール選手権」
  • CPAN
    • 思いついたら書く、再開発でもいい、PrePANで聞く、小さな問題は放置されてるので直せ
  • 26モジュールをあげまくった
    • 突っ込んでもらえない。スルー
    • 半分は自分で作っても使わなくなる
  • App::YG mysqlの\G
  • Plack::Middleware::Debug::TraceENV ENVをトレース
  • Plack::App::DummyBox ダミー画像を表示
  • Sub::Sequence 長大なリストの扱い
  • Test::AllModules アプリのモジュール全部をuse test
  • Log::H::Output::File::Stamper, Log::Stamper
  • Test::NoLoad
  • App::Mypaswrd
  • App::Log::Stats
  • Benchmark::Confirm ベンチマークのついでに値の確認
  • Plack::Middleware::TimeStats
  • App::Aki
  • test::Mock::Furl
  • Sub::Data::Recursive データを再帰的にエンコード以外も
  • Statistics::Swoop, App::plmetrics →
  • 「ゴーン」
__gfx__さん「Power Assert on Perl
  • JS界隈で話題
    • 失敗した時に、中身をパースしてくれる
  • perl.js - emscripten を使ってる

mizuki_rさん「p5-SPICA」

  • WEB APIは便利
  • ドキュメントがないことが多々・・・
  • たくさんのAPIを使っていると、インタフェースがわからなくなる
  • Tengを参考にしている。DSLでいろいろ
    • スペッククラスに、カラムとかの情報を書いておく
  • Perlで書いてYAPCで発表するのは楽しい
songmuさん「Riji」

中国語のトークでした

  • Rijiはブログツールで、動的、静的な配布が可能
  • cpanm Rijiするだけで
  • RubyのJekyllと似ている
  • Gitと似ている
  • RSSが好き。gitの履歴からRSSを生成している
  • デモ
    • 「んーと」「好warn」
  • ゴーン

*1:スポーツタオル?