YAPC::Asia 2013セッションメモ9/20分

感想エントリは別途作成します。
とりあえずセッション中に取ったメモを公開。
後でちゃんと編集します。
乱文でごめんなさい。

Postcards from the Edge: The State of Perl 5 Development

  • Ricardo Signes rjbs
  • P5 Pumpking
  • Perlは昔も今もmess。Don't worry.
  • perldeltaに書いてあることの多くは誰の役にも立たない
    • %^Hをtieすると…、globにm?..?で代入すると…
  • 役にたつことを紹介しよう
What's new
  • RegexSets
    • (?[..])
    • +, -, (), &, \p{..}
  • Lexical Subroutines
    • my sub adder {} 毎回作る
    • state sub adder {} 最初に1回だけ作る → lazy closure creation
    • テストで便利
    • エラーのときサブルーチン名が出ないけどね
    • 名前がlexical scopeなだけで実態はパッケージサブルーチン
Experimental Features
  • みんなが使うなら生き残る
  • lexical topic: my $_
    • fixする
  • smart match, given
    • fixする
  • Hash Randomization
  • (?{..}) (??{..})
Fond Farewells
  • いくつかのモジュールはなくなった
  • Text::SoundEx, Pod::LaTeX, CPANPLUSなど
Perl5
  • 新しい名前が必要だ
  • いやいや、何も変える必要はない。ずっと Perl5
  • Backcompat killed my Dog: 後方互換性と進歩の間で
  • Success hates agility: 成功は迅速性の敵だ
Patches
  • ほとんどのパッチは4人からsubmitされてくる
  • みんなもっと貢献できる
Hopes and Dreams: Perl 5.20
  • fatal implicit close() → autodie
  • postfix dereferencing: @{ 長ーい式 }: ->@*
  • key-value slice: %h[ %w(a c) ]
  • chars vs. bytes
Q&A
  • tokuhirom: mop-reduxはいつ入るか? → まずはCPAN
  • miyagawa: CGI.pmは消えるのか? → 消えます

今時のカジュアルなデータベース関連開発

Teng vs DBIx::Class
  • スキーマ管理 DBIx::Schema::DSL
    • MyApp::Schema->outputでスキーマ出せる
    • 定数連携できる、ケツカンマ問題がなくなる
    • 外部キー制約がついたDDLを出し分けできる
    • GitDDLが神
  • なんでMySQL Workbench使わないの?
    • バイナリはつらい → マージできない
  • migration - use GitDDL::Migrator
    • GitDDLを運用向けに改良したもの
    • ミスったときに切り戻せる、履歴を残す
  • gitのコミットハッシュと適用日時(ミリ秒単位)をバージョンテーブルで管理
例外処理 - Exception::Tiny
  • 例外を階層化しておくと便利
    • MyApp::DB::Row::DeleteFailedException
  • findとsingleで見つからなかったときに例外を出すかどうか制御
TransactionManager::EndHook
  • nested transactionで一番外側のコミットが走った時点で処理したいこと
MySQL以外
  • Redis → memcachedが要らなくなった
    • キャッシュ用途というよりはミスヒットしないKVSとして使いたい
    • SortedSetでお手軽ランキングはよく言われる
    • Setが結構アツイ。和・差集合、ランダムに1つ取る、など
    • Listをジョブキューとして使う
  • Redisの注意点
    • Expire設定をしっかりやる
    • LRUには期待できない。あふれると結構変なのが消えちゃう。自分でexpireを管理すること
    • 冗長化つらい
  • Redis.pm
    • PurePerlであまり速くない
    • fork safeなforkあり
    • hiredisバインディングがほしい(EV::Hiredisはある)
  • Cache::Redis
  • Redis::LeaderBoard
    • 同率問題解消のために書いた → みんなやってる処理
  • Fluent::Logger
DB設計
  • テーブル定義
  • インデックスは必要最低限: 複合インデックスあるのに単独も作っちゃうミス
  • 外部キー張らない
    • バッドノウハウ
    • リレーション先のレコードロックが発生したり、不要なインデックスが自動で作られて重複になったり
    • 外部キー側のデータも作らないとテスト作れない。そのかわりちゃんと作ってちゃんと確認すると得
  • 接続時処理

set names utf8mb4;
set session sql_mode='TRADITIONAL';

    • TRADITIONALが一番厳密
    • mysql_enable_utf8している場合、mb4範囲が化ける
  • Unicode6とutf8mb4
    • Unicode絵文字時代
    • default character set utf8mb4
    • 767byte問題 → varchar(191)までしか入らない
  • マスターデータ
    • 固定データ
    • Google spread sheetとかから取ってくる
    • マスターデータの整合性検査をきちんとする
  • 論理削除を使わない
    • 最近はストレージの性能も上がったし、deleteもそんなに遅くない
  • ORM
    • モデルから呼ぶORMはprivateみたいな感じ。必要なクエリをORMに用意

社内開発簡単化と世界で戦う開発を考える技術

  • Inside amon2-livedoor-setup.pl with web application development 2013
  • @yappo
Development Framework
  • というのを考えてみた
  • 使うコードを書くことに集中する
  • WAFの標準的なセットだけでは足りない → 困った → 既存のWAFを使いつつ作れる
  • mission statement
    • アプリのsetupをしてからどういう考えてでモジュール開発をしたか、を統合的に話すトークが最近はない
  • Team Geek いい本でした: (kdmsnrさん監訳)
    • mission statementを書いておくとブレなくていい
ありがちな開発開始手順
  • amon2-setupなどの標準のセットアップスクリプト
    • ただ一つデメリットがある: 社内ルールが反映されていない
  • なんで使うの?
    • A. startupなのでサービスがひとつだけ
    • A. オレオレWAFとか使ってるし標準化とかいらないよね
      • なんとなくで自分のフレームワークとか作っちゃうと後で困る。会社なんでみんなと同じの使うべき
      • ノウハウのたまり具合が違う
    • A 足りないところは社内の別システムからコピペする → わけわかんない設定が入ってたり
  • コピペ駆動開発のデメリット
    • 秘伝のタレ化してしまって、有効性さえ疑われない
  • 社内開発環境の雛形を用意すると仕事が捗る
    • 社内固有のAPIを利用するモジュールを社内リポジトリで管理する
    • → グルー部分が必要になる → ひな形化するといい
ひな形作成のポイント
  • 入れすぎると要らない部分を削る作業に時間がかかってしまったり
    • → ひな形の種類が増える → 増えすぎ注意
  • 社内ルールを意識する。runファイルの置き方とか
  • 開発から本運用に必要なすべてを盛り込む
  • schema loader, deploy tools, CI tools, rundile, batch loader, translate data loader, sass/scss, js/css packer, etc.
  • amon2-livedoor-setup.pl
    • 「このスクリプトたたけば必要なもの全部入れてくれる」スクリプト大事
    • DBスレーブ用
    • warnを埋め込んでおく
    • 参考文献のURLをコメントに書いておく
    • submodule → リンク
ひな形作成の失敗・反省ポイント
  • ひな形作成スクリプトをコピペするようになってしまった → ふり出しに戻った
  • 標準で使いたい機能も差しかえ可能にしたい
  • ひな形作り直した!
新しいひな形の要件
  • シンプルに
  • 同じモノを使ってるならコピペ不要に
  • YAPCに向けた誓い
ksgk Knack of the System Generation for Kurouto
  • 「くそがき」
  • github.cmo/yappo/p5-Ksgk
  • ひな形のroleを指定可能 → role別拡張パラメータ・処理
よかったこと
  • このひな形のこのディレクトリだけ見ればわかるようになった
  • 思想と形てはchef, puppetと同じで、最小限のコードレシピを蓄積 → 適用可能性が上がる

SPDY、HTTP/2.0の使い方

  • @takesako
firesheep
  • firefoxのアドオンで、平文のセッションキーなどを盗む
    • → 各社いっぜいにSSL
  • HSTS: Strict-Transport-Security: max-age=31536000
    • そのURLでは今後一年間HTTPではなくHTTPSでアクセスする
    • 未対応のブラウザもある
SPDY, HTTP/2.0
  • SPDY indicator
  • IPv6都市伝説: コネクション数制限
  • SPDYの出現で発生しなくなった
  • SPDY対応Webサーバー
    • mod_spdy, node-spdy, nginx用ptach.spdy
  • SPDY対応クライアント
    • spdylay
  • Perlモジュールも
提案
  • outbound port 80 blocking
  • 80番をすべてブロック
Q&A
  • サイボウズはどう? → 正直まだ早い
  • SSLにするとCPU使用率上がるのでは?
    • クライアントはスマホ以外はOK。サーバーは上がる
  • 経路のプロキシとかCDNは?
    • akamaiさんは対応済のようだ。プロキシはあまり心配ない

Perlの過去と未来

  • Perl - Past and Future
  • @tokuhirom
Perl5の歴史
  • 1987: Perl 1.0, 1994: Perl 5.0
  • 1998: 5.5, 2002: 5.8, 2007: 5.10,
  • 5.12以降は1年に1回出る
  • cpanmで見るPerlユーザー
    • そんな中でも5.10.1を使ってる人が結構多い
    • 他の言語だとセキュリティーホールがあって更新せざるを得ないがPerlは意外と行ける
最近のupdate
  • say, //, smart-match & given
  • my sub hoge, hash randomization
  • method signatures, ..., ->@*
  • Perl6からのインポートが多い
  • バックエンド側機能
    • 5.8から入ったsource filter
      • → 5.14 custom ops, parser API
        • parse_barestmt, parse_block
    • 5.18: Pad APIs
    • 拡張性向け機能がほしいかな。DSLサポートとか
最近のp5
  • Perlの別実装が増えてきている
    • Moe: Stevan Little (Scala)
    • p2: perl 5+6 = 11: Listen Reini
    • goccy: Compiler::Parser, Compiler::Lexer, gperl, perlmotion
    • (ひとつ聞きのがした)
History of Perl6
  • 2000: Started
  • 2005: Pugs
  • 2010: Rakudo Star!
Rakudo Starは実用に耐えるか?
  • say [+] 1..100 → 0.945秒
  • The nqp language
    • nqp: Perl6のサブセット。Perl6を実装するために作られた言語
    • Rakudoはnqpで書かれている。mostly
Perl6 VM
  • parrot
    • Rakudo動くよー
  • nqpはJVM上でも動く
    • RakudoもJVM上で動くようになった
    • ビルドが大変
  • MoarVM
    • Lightweight VM for Perl6
Perl6 roast
  • test suite for Perl6
  • test suite for implementations
    • JVM, parrotなどのテストケースは最小限しかなく、roastで補う
  • 現状、roastをすべて通す実装はまだない!
Perl6 is awesome!?
  • いいところもある
  • Junction: $var = 3 | 5 | 7
    • Perl6::Junction
    • Syntax::Keyword::Junction
  • MOP, Role
    • p5-mop-redux
    • Mo[ou](se)?
  • slurp/spew
    • Perl6::Slurp, Path::Tiny
  • Rules
  • Reduction operators [+] 1..100
  • Hyper Operators: >>*<< zipっぽく
  • Cross Operators: X 直積っぽく
Perl6 related hacks
  • Perl6、意外と海外で人気ある
  • Regexp::Rules
  • PVIP
    • Perl6 parser library written in C
    • Perl5 bindingもある。roastの50%をparseできている
  • Seis: Perl6をPerl5に変換 (with XS hacks)
    • 1000+個程度のテストをパスしている 千 / 20万だけどw
    • CPANがそのまま使えるよ
Seis demo
  • for 1..12 { .say }
  • [+] 1..100
Q&A
  • dankogai: Perl6が現場で使えるようにならないかなー、と10年くらい待っているんだけど、nqpベースでRubyPHPのように使えるにはあとどれくらい?
    • tokuhirom: すでにaptで入るけど?
    • dankogai: 遅すぎて例外的に時間かかってもいいようにしている
    • tokuhirom: JVM版はそれほど遅くない。MoarVMはまだクロスコンパイルできないけど、それができればだいぶ速くなるかも
    • tokuhirom: MoarVMはparrot上で動くnqpで動くのでparrotの知識がないと貢献しにくい
  • songmu: 正規表現が変わると思うが、p5 regexは標準になっている。受け入れられるのかな?
    • Perl5の正規表現もprefixつければPerl6 regexの中でも動く。長く普及させていこう
  • seisとは「6」です

LT 1日目

@kazuho: Using the Power to Prove
  • 最近あまりPerlを書いてない
  • proveってコマンド知ってる?
    • Ext::HarnessのCLI
  • TAPで出力される。まとめて表示してくれるのがTest::Harness
  • proveを直接たたくと並列に走らせるとか、最近failしたのとか、早く終わるのからやるとかできる
  • Perl以外の言語のもできる
    • なんで? Perlが#!を読んで実行してくれる
    • でもCのバイナリはダメよ
  • .provercに --ext '' --exec ''
  • t/ に入れておけば prove だけでおk
  • サービスモニタリングもproveで可能
  • いろんなタスクを実行してくれる
  • インストールしなくても入ってる
  • TAPを使っているのでどの言語からも使える
@yashims85 ギークな異性を落とす魔法の言葉
@sanemat Tachikomaで依存ライブラリの断続的バージョン上げ
  • n-clickを1-clickにすると商売になる。0-clickにすると革命になる otsune, 2008
  • 変化に対応し続けるのはサービスの宿命
  • Rubyはこまめにbundle updateしないとしぬ。だいたいしない。なのでしぬ
  • プルリクエストでbundle updateしてくれてtravis ciしてくれる
  • CPANのtestamintがいい → 誰かRubyに持ってきてください
  • PerlにあってRubyにないのがfrepan
  • RubyにあってPerlにないものでいいモノというと ci hsbt org。rubyのtrunkで走ってくれる
  • しなないためには変化をしていきましょう!
@yappo: I NEEEEEED HTTP::Body::Builder
  • perlbrew install perl-5.17.2 --as perl-5.17
  • x-www-urlencodedとかform-dataとか
  • こんな仕様で誰か作って!
@hirose31 inspect-perl-proc
  • 実行中のプロセスの中身見たい
  • strace -fF -Tttt -s 512 -p PID
  • gdb
  • gdbperl github:ahiguti/gdbperl
  • inspect-perl-proc @hirose31
    • gdbでattach
    • evalするところで任意のperlコードを書ける
    • 対象Perlデバッグつきでコンパイルされていれば使える
    • どのパッケージがメモリ使っているのかわかる
@yusukebe: YAPC::NAへ行って来た
  • Texas州Austin
  • YAPC::NA厨
  • Inside Bokete
Eikichi Gotoh sendai.pm
@comewalk しげたさん Contributing to open source products
  • sixapart
  • patches welcome → しきい高い
  • stakeholdersがいろいろ
  • メーリングリストのモデレータ
    • spamが来たらだいじょぶな人かどうか見て判定する
    • 時差があるので十分な貢献に
  • 使う → ブログに書く → i18n手伝う → 仕様に使う → パッチ書く → スポンサーになる/メンテナになる
@bayashi 細かすぎて伝わらないモジュール選手権
  • CPANモジュール書けばいい。再開発もかまわない
    • 心配ならPrePANで聞けばいい
  • この1年で26モジュール上げた
  • モヒカンなんてこの世にいない
  • 俺得で十分
  • App::YG mysqlの \G をやる
  • Debug::TraceENV ENVの大域変数化をトレース
  • Plack::App::DummyBox
  • Sub::Sequence 長大なリストをぬるぬるやる → spliceでいいじゃんね
  • Log::Stamper
  • App::LogStats stats -f7 count/avg/max/min/range を出してくれる
  • Benchmark::Confirm 複数モジュールが同じ結果を返すか検証
  • Sub::Data::Recursive Encode::Recursiveでエンコードしない部分だけ
@__gfx__:
@mizuki_r P5-SPICA
  • WEB API便利ですよねー
  • APIにはドキュメントがなかったり
  • 複数APIの仕様が混在
  • base64エンコしたりしなかったりデコードしたり
  • APIごとの違いを吸収して本質的なコードだけ書きたい
  • Tengを参考にしていて、APIの仕様をDSLで書いておく: Github::Spec
@songmu: p5-Riji
  • カヤック
  • Riji: ブログツール
    • dynamic/static generation
  • RubyのJekyll みたいな
  • Riji: RSSをGitから生成する
  • 中国語で発表、すごい!