一日目です。今日もgihyo.jpさんのスペシャルレポートにレポーターとして参加しています。
941さん「開会の挨拶」
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であり続ける
- Success hates agility
- 不要のものは取り除くべき。ただしいつ除くかは合意が取れてない
- Perlはハッカーを必要としている
- パッチを主に書いているのは4人
- 誰もがパッチを書ける
- 機能が欲しければ実装、わからなければ聞く、p5pに意見を伝える
- Perl5.20
- Q. MOP::Reduxはいつ入る?
- A. 入れたいけど、CPANにあげて様子をみたい。もしかしたら5.22?
- Q. CGI.pmは消える?
- A. コアからは消えます
Songmuさん「今時のカジュアルなデータベース関連開発」
- RDB寄りの話がなくて歴史の流れを感じる
- MySQL前提の話
- 最近はTeng。けど社内はDBIC好きの人が居る・・・
- DBIx::Schema::DSL
- MySQL Workbenchを使わない理由
- バイナリが辛い(マージが出来ない)。GitDDLは神
- GitDDL::Migrator
- GitDDLを運用向けに改良したもの
- 特定のバージョンに戻すとか、
- 実際のDBとの不整合検出とか
- DDLのバージョンをgitのハッシュ値と結びつけて管理
- デモ
- 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必須の普通な感じの
- 単数複数変換はしない。テーブル名は単数形
- 基本的に正規化し、キャッシュで頑張る
- インデックスは必要なものだけ。複合インデクスがあったら先頭部分のインデクスは省く
- 外部キー貼らない。レコードロックの発生やインデックス重複(前項参照)
- 接続時に発行
- 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など
- 過去のブラウザなど用意するのがきつい。結合テストがきつい
- Selenium → Selenium::Remote::Driver
- Cookieなども合わせた挙動が見れて良い
- BrowserStack
- ローカルのサーバはPlack::App::Directoryで十分
- 自動テストするデモ
- 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を作る人
- 失踪したらまずい。同じ物を使うべき
- ノウハウのたまり方。社内の隣の同僚に聞けるかどうか
- 既存プロジェクトからのコピペ
- コピペでなく、社内雛形を統一する
- バランスが大事。ひな形に必要以上に詰め込まない
- 社内ルールを意識する。インフラにも声をかける
- Perlが初めての人でも、市通り最低限のことができている状況になる
- amon2-livedoor-setup.pl
- 問題
- ひな形のコピペ → もとの黙阿弥
- ひな形もプラがブルな作りにしたい
- YAPCに向け、改良
- plainなファイルのテンプレ
- Ksgk (くそがき) - Knack o the System Generation for Kurouto
- アプリケーションのひな形のための小さなツール
- オプションやら実行すべきコマンドやらひな形のテンプレの機能やらを設定
- 実行すると、いい感じにヒアリングされていい感じにひな形ができる
- 「くそがき」はシンプルなモジュール。iOS開発とかにでも使える
- :ksgk: タグで、コードを埋め込める
- 他言語化に必要なものを定義したり
- ひな形ツールの利点 → 最小限のレシピが蓄積されるのがよい。pupetとかと同じ効果
- その他の成果物
- どんな人と働きたいか→何をやっているか考えながら仕事をする
karupaneruraさん「ぼくがかんがえたさいきょうのMVC」
- MVCのおさらい
- M: ビジネスロジック、データベース操作、データの変更通知
- V: UI出力、データの整形、データの変換
- C: UIからの入力をいい感じに
- MVCは意外に難しい
- MVCはそのまま使わない
- MVCのカスタマイズ
- 各アプリにふさわしいMVCを定義する
- 規則をはっきりさせて、コードをはっきりさせる
- 具体例
- Context → リクエスト単位の管理
- Controller → Modelへの入力を抽象化
- Controllerを見ればリクエストのフローがすべてわかる
- Model → ビジネスロジックの抽象化
- 問題はExceptionで通知する
- DB →データベース操作の抽象化
- View → 出力の整形
- 複数のViewを統一のインタフェースで扱えるようにすること
- 実現する必要がある → チーム規約による
- コードレビューなどを有効に使う
- 6人くらいの開発者で読みやすいコードを保てている
hiratara 「Types and Perl Language」
自分のトークでした。
Naoya Itoさん「モダンPerlリファクタリング」
n-Text::Md2Inaoのリファクタリング
- マーティンファウラーによるリファクタリングのタイミング → 新機能を付けたいけど、付けるのが大変なとき
- 下準備github、API定義、テストの追加
- CPANレイアウトにする
- prove, Carton, Guard, Travis CI
- CPANモジュールの洗い出し
- cartonを使う
- carton execでローカルのモジュールだけで動作させられる
- carton execを繰り返して必要なものを入れていく
- モジュールをテストしやすいようにし、オールグリーンにする
- リファクタリングで重要なのは、テスト群を作ること
- 実行環境とアプリケーションを分離
- End to Endのテストから
- 外部から見た時の振る舞いを保つため
- Text::Baseを使っている
- データを起点とするのでEnd to Endに向いている
- Webの場合はPlackを使う
- より細かいテストを追加
- 分割して、テストとして定義
- テストさえあれば、リファクタリングは難しくない
- リファクタリングをする過程で思いついていく
- まずはテストを書く
- バグを明らかにするための単体テスト (回帰テスト)
- 回帰テストは外部を定義するような重要なテストになる
- 継続的インテグレーションが必要 → Travis CI
- 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さん「ギークな異性を落とす魔法の言葉」
sanematさん「Tachikomaで異存ライブラリの断続的バージョン上げ」
- n clickを1 clickにすれば商売、1 clickを0 clickにすれば革命
- 大事なのは継続的にバージョンアップすること
- bundle updateはする。carton updateってするの?
- Tachikomaは自動でpull-req を送ってくれる
- CPAN Testers Reports
- 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というのを作った
- dump-perl-stacktrace
- Perlのパッケージ名などのバックとレースが見れる
- dump-per-memusage
- 間をおいて2回取るとよい
- dump-perl-inc
- githubで公開しているので使って下さい
yusukebeさん「YAPC::NA へ行ってきた」
egoproさん「んだっちゃだれ Sendai.pm」
comewalkさん「オープンソースプロダクトに貢献するということ」
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 →
- 「ゴーン」
mizuki_rさん「p5-SPICA」
*1:スポーツタオル?