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

後でちゃんと編集します。
乱文でごめんなさい。

Perlで書く結合テスト

  • @ikasam_a
  • Testing Casual Talks #2 11月ごろで調整中
SWET, TE
  • SWET (Software Engineer in Test), TE (Testing Engineer)
    • テストフレームワークを作る、テスト環境を作る、テストコードを書く
    • テスト全般にかかわる仕事をする
    • WikipediaではSETで引くと一応書いてある
    • Google Testing Blogの解説
  • 呼び方
  • Google Testing Blog
Developer Productivity
  • 2つの役割
    • (後でスライド見て補完)
    • Testingにかかわる活動
  • SWET Group Mission Statement
    • テストをしやすくして、生産性を上げる
  • エンジニアリングとしてtesting活動をしていく
    • 自動化など
テストの分類
  • 4つの分類軸

Perspective Target
How What

  • Perspective: 誰がテストするか
    • 開発者テスト
    • 受け入れテスト
  • Target: テスト対象は何であるか
  • How: テストの手法
    • black/white/gray box testing
  • What: テストの目的
  • 今日のお話はTarget: 単体/結合テストについて
Unit Testing
  • 単体テストの「単体」って何?
    • チームで認識を合わせるのが大事
  • モジュールの中の「メソッド」
  • システムの中の「コンポーネント
  • ユニットの入出力にフォーカスしてテストしていく
Integration Testing
Interaction
  • 単体テストでは
    • ターゲットだけに注目
    • 他の部分はモックやスタブでふうじこめる
  • 結合テストでは
    • 実際に動いている中でテストする
結合テストケーススタディ
  • Web API
  • HTTP JSON-RPC API
  • interaction & integration
    • APIサーバーのモジュール同士の
    • APIサーバー、DB、キャッシュサーバー間の
  • テスト用クライアントからAPIサーバーにリクエストを出し、レスポンスを見る
    • APIサーバ内のモジュール間結合、バックエンドサーバー群との連携
  • 入力: HTTPリクエスト、出力: JSONレスポンス
  • HTTPクライアントには
    • LWP::UAFurlを使う。特にどっちということはない
    • 注意: APIに特化したクライアント、特定サービス向けクライアントを使うと、テストで見たい部分が見られない可能性がある
      • 普通じゃない使い方に使えないことがある
  • JSON validation
    • JSON + Test::Deep系を使う
      • かゆいところは T::D::Matcher, T::D::Cond を使って
    • JSON Schemaを使う方法がありそうだ
  • gray box fixture
    • DB/Cache manipulation
    • テストケースに依存したデータを作成
    • 継続的テストのためにキャッシュを消したりとか
    • 普通のオペレーションで生成できないデータを用意する
  • 特定サーバー向けリクエス
    • たくさんリクエストがくるような場合、ロードバランサなどで多重化することが多い
    • ある特定のインスタンスだけテストしたい
    • LWP::UA::DNS::Hosts 特定のホスト名に対して特定のIPを返す。リクエストを特定IPアドレスに向ける
    • Furl + inet_aton クロージャを渡して制御
    • MyDNSなどのツールで設定する方法もあり
  • HTTP Messageを見る
    • LWPはHTTP::Response::requestでリクエストが見れる
    • Furl: capture_request のパッチを送った
  • Web Application
  • UIのWebアプリ
  • interaction & integration
    • Web Appモジュール: MVC的な
    • Web APPとバックエンドサーバーとの間の連携
  • 入力: HTTPリクエスト、出力: HTMLレスポンス
  • ブラウザ、user agentを使う: JavaScriptが解釈できることが重要
    • WWW::Mechanize
    • Selenium::Remote::Driver
    • Wight: phantomjsのPerl実装
    • Brownie: 自分で書いて最近使ってないw Rubyのcapybara相当
  • Switch Browser
    • テストの中でJSを使えるブラウザとJSを使えないブラウザを切りかえたいというニーズがたまにある
    • ブラウザはHTTPヘッダをさわれない
    • エミュレータはJS実行できない
    • ブラウザのpseudo state(セッションなど)をセーブ/リストアする
      • ヘルパーとしてまとめておく
役立つモジュール
  • Test::Ika (RSpec for Perl)
  • Test::Requires::Env
    • 結合テストで必要なユーザー名、パスワードを環境変数から渡す
    • 渡し忘れのときにテストが落ちる
Q&A
  • キャッシュデータを入れるときにキーが重なったりするのはどうしますか?
    • 実際のキャッシュそのものを使って直接書き込んでいる
    • データ競合については本当にwhite boxで、APIのアクセス手段と同じ方法でアクセスする。もう一つのAPIから書き込むようなシーンを設定する

これからのPerlプロダクトのかたち

  • @goccy54
  • 自己紹介
    • ごっしー
    • mixi: 今年2年間
    • タンポポグループ
      • さしみタンポポ仕事をなくそう
      • 開発者のための開発
      • 技術的負債を効率的に検出して直すよう促す
      • Jenkinsテスト時間の短縮 50分 → 4分
    • Perlの中でPerlを作る → gperl
gperl
  • perl-like language written in C++
  • 最終コミットは11か月前。もう終わっちゃったの?
    • いやいや、まだ生きてます
    • Lexical analyzer: perl5 syntax highlighterを作ってます
    • Parser: 静的解析ツール作ってます
  • gperlからスピンアウトしたモジュールを見ていきます
    • Compiler::Lexer, Compiler::Parser, Compiler::CodeGenerator::LLVM
Compiler::Lexer
  • Perl5トークナイザを開発した
    • できるだけシンプルに: トークンのarrayrefを返すだけ
    • 高速にしたい: C++でスクラッチから書いた
      • perfect hash, memory poolなどを使って高速化
    • PPI::Tokenizeと比べて10〜100倍速い
    • Readableにしたい: yacc/bisonを使っていない
  • ハマりパターン
    • func * v: globなのmulなの?
    • func /: regex delimiter or dev?
    • func <
  • 今後
    • recursiveにトークナイズするように
Compiler::Parser
  • abstract syntax treeを生成
  • 速い: PPIより速いよ
  • Readableに作った
  • BlackPerlのパースに挑戦
    • 意味もないし動かないけどsyntax errorにはならないコード
    • ちゃんとパースできたよ
  • 今後
    • PPIを置きかえたい
    • PPIを使っているモジュールは有用であって使いたい → 実行時間が気になる → 速くしたい
    • 最低限PPIが使える部分は使いたい
Compiler::CodeGenerator::LLVM
使い方
  • Lexerでトークナイズ、ParserでASTにする。ASTをCCに渡す。LLVMで実行
  • ベンチマーク: Fibonacci
    • Fibonacciは有利なベンチマークなので数字が良く出る
      • 関数呼出し、整数など
  • まだチューニングは不十分
  • 開発は8月から開始
PerlWebブラウザ上で動かす
  • perl.js (@gfx)と同様のアプローチ
    • 最後にemscriptenを使っているのは同じ
    • LLVM-IRに食わせる
  • 違い
  • enscriptenのバグに遭遇して、ところどころ動かない
  • 今後
    • github.com:goccy/p5-Comiler-Tools-Transpiler
PerliOSOSXで動かす
  • RubyMotion, mocl, Titanium
    • Perl版を作ろう!
  • PerlMotion
  • アーキテクチャ
  • デモ
    • Hello Perl
    • タッチイベントを拾って画像を表示
  • どんだけ動くんですか
    • LLVMがどれだけ動くかに依存
    • Primitive Types: 全部
    • 演算子
    • 組込関数: 自分の好みでやっているw
    • 未サポート機能
      • glob・シンボル操作
      • GC未サポートなのでリークしまくりwww
      • 正規表現: pcre使おうかな
    • サポートするつもりがないこと
      • Appleが禁止しているdynamic evaluation
      • eval, s///e, require
  • 今後
    • 実機で動かせるようにしたい
    • デバッグサポート
    • 既存のUIKit、フレームワークのサポート
      • → generatorで一気に生成したい
    • Pure PerlCPANモジュールも使いたい
    • 来年の春くらいで出せるようにスケジュールを考えている
  • 名前も募集
静的解析ツールとして使う
  • Compiler::Tools::CopyPasteDetector
    • 検出エンジン自体はC++ → 高速
      • Native threadを使って動く
    • Compiler::LexerとB::Deparseを使っているので正確
    • 高機能なvisualizerつき
  • デモ
    • CatalystとMojoliciousを比べてみた
Lexerを使っているモジュール
  • Perl::MinimumVersion::Fast
  • Test::LocalFunctions::Fast
今後
  • Perl::Metrics::Simple::Fast
    • 循環参照の検出をしてくれる → 高速化したい
    • mixi社内の静的解析に時間がかかりすぎて困っている
    • うまく行ったら静的解析ツールをCPANizeしたい
gperlは生まれかわるよ!
  • gperlから派生したCompiler::* をgperlに還元
  • static typingを入れてみたい。型推論エンジンに興味がある

Rubyの良いところ語ってください 〜そんなPerlで大丈夫か?〜」

  • 司会 @naoya_ito
  • パネラー @tokuhirom, secondlife (@hotchpotch), @shyouhei, @masuidrive
  • 本メモでは発言者を示すプレフィクスとして n, t, h, s, m を使っています
自己紹介
言語の比較
  • なぜPerl, Ruby?
    • m: Rubyは日本語でいろいろできる
    • s: ブログブームのときt-diaryを使ったのがRubyの始まり
      • 十分満足していたらコミッターにはならない。不満があるのでパッチを送っていたらコミッターに
    • h: t-diaryから。Railsの回りのコミュニティー形成の流れ → Cookpad
      • n: 最初の会議はPHPだったんですよね。どうしてRubyに?
      • h: 仕事ではPHPだったが、趣味でRubyをやったときに考えたことがすっと表現できたから
    • t: 15歳くらいからRubyPythonを使っていた。Rubyist Magazineに寄稿した。LLの実行委員をやったときにPerlの会社に行って書くようになった
      • t: 当時naoyaさん、miyagawaさんがblog hacksをやっていて楽しそうだった。言語そのものに興味があったので、それまで使ったことのないPerlをやってみた
  • いちばん好きな言語はRubyだと思うが、こういうところが好き、とかある?
    • h: Perlとの比較では、標準ライブラリのセンスがすごくいい。PerlだとList::Util使わないといけなかったりという部分が、そのままサポートされている
      • n: やろうと思えばできるというのと、処理系がサポートされていることには違いがあるのか?
      • h: 学習のしきいが高かったと思う
    • s: ごく最近Perlをさわりはじめた。違うところより似ているところが多かった。仕事の中でpr出したら何も問題なくマージされた。差分よりは似ているところのほうが多いと思う
      • n: でもこういう機能がPerlにあったほうが、というの感じたことある?
      • s: いまRubyに一番あるのは「未来」。みんなポカーンとしてるな。Rubyプログラマーに提案をしてくる言語。思想を振りまいている言語。例えばキーワード引数とか。これから推奨されるべきだと思ったので、型チェックなどを言語でサポートするようにしました。ここはRubyPerlの大きな違いで、Perlは言語の側からやることはしない。Rubyはプログラミングをもっと楽しくしたい、世界を良くするために言語を変えていくことを考えている
    • m: RubyはMatz Rubyの他に処理系のバリエーションが多い。JRubyとか。最近だとmrubyが出たりしている。こういうのはPerlにはあまりない
      • t: goccyさんのgperlが出てきたりgfxさんのperl.jsがあったり。Perl6の実装はバリエーションがある。Perl6に労力を取られている面もあるけど、これからはPerl6ということかな
      • m: JVMのほうが性能がいい。Rubyもあんな複雑なものに他実装が出ないだろうと思っていたのが、いまは5つもあったりする。そのへんが、Perlと比べてに限らず、Rubyの面白いところ
  • n 言語を変えて生産性は変わる?
    • m: 言語を変えると変わってくるが、肌に合うか合わないかのほうが強いかと思う。引数の順番とか覚えなきゃいけないことが多いのはつらい
    • s: 適材適所がある。Rubyのいいところはあるけど、全部をRubyでやろうとするのは間違い。CapystranoでRubyで書いているコマンドは本当はshellの方がいい。なんでもやろうとしないほうがいい。
      • n: webアプリケーションでPPPRと並べたときはどうか
      • s: ツールや言語による違いよりもプログラマーのスキルによるところが大きいだろう
    • h: 現状を切りとると、何の・誰の生産性かというのでも違ってくる。Rubyは道具としてそろっているので何かを作るときにスピードは速い。ただしハッカーは何でもできてしまうのでPerlに足りないところはすぐ作ってしまう。Railsの批判としてはでかすぎるというものがあるが、Amon2作ったりして補ってしまう。普通のところでは道具とコミュニティーが現状Rubyにはそろっていると思う。社内で助言が得られるかというのは難しく、Web回りでコミュニティーができているのは大きい
    • t: PPPRの言語レベルの生産性の違いと言えるほどのことはないと思う。上のレイヤでツール・ライブラリなどが問題。行列計算のライブラリはPerlよりPythonのほうが充実している。Perlの場合は自分で使いたいライブラリは自分で書いているので、ぼくのユースケースと似ているところには合っていると思う。
  • n: フレームワークやライブラリということでRailsが勢力を変えたということがあるか
    • h: bundlerなど、コミュニティーの範囲が広く、うまいやり方がgithubを中心に広がっている。課題を考えたときに育つということがある。
    • h: Rubyはファッションの流れみたいなことがあって、それに乗ってる人もいる。node.jsのコミュニティーのでき方といま乗ればデファクトになれるというのに熱い風を感じる
    • s: 回りでPerlをやってた人がRubyに行ったという話を聞くと、Railsから転びましたという人はあまりいない。Rubyにはthreadがあったという人とstructがあったという人がいる
      • n: threadはね、Perlではいまだにちゃんと使えているとは言えない
    • m: RubyRails以前から使っているが本格的に使うようになったのはRailsRailsはビジネスとつながって経済圏ができているのがすごい。herokuとかNewRelicとか。RubyOSSコミュニティーだけでなくお金が出るコミュニティーもしっかりしている
    • s: RubyがすごかったというよりRailsが切り開いた面がある
  • n: Rubyが良かったのかRailsが良かったのか、そのへんはどう?
    • m: コミッタの視点でどう?
    • s: いろんな分野のいろんな専門化の人が来て、こんなところが気になっているんだけど、みたいな話をしてくれる。特にusabilityについて。いろんな人が来ることがRubyの開発をドライブしている面がある
  • n: PerlとビジネスということでSaaSサービスのサポート状況とかどうですか
    • t: SaaS的なところで言うとherokuとdotcloudくらいしか使えない。積極的にサポートしてくれる/サポートしてくれという動きがないのはよくないかなあ
  • n: travisperlが検証できるようになったのはコミュニティーが主導していったのかな
    • m: 元々ビジネスとして使っているという人が多い。インドの人がオフショアするので日本で需要があったらみたいな名刺をよくもらった。Rubyは最初からそういう感じ
    • n: Perlは使えるようにしたいというと、コミュニティーの中からハイやりますみたいな人がいるが、Rubyは最初から。そのへんが違うということですかね
  • n: エコシステムとしてPerlCPANからという流れがありますが、Rubyrubygemsにコミュニティーがあるというよりも、github上にあるような感じですが
    • h: rubygemsも最初はrubyforgeというPHP上のサービスだった。いまはgithubではあるけど、最初からスムーズだったというよりは、githubが出てからそっちに移った感じ
    • s: lighthouseからgithubに移っていった。単に新し物好きというのもあるが、新しいものが出たときにどんどん流れて行くような人が多いという特性があると思う。これは古いチケットが放置されたり悪い面もあるけど。
    • t: CPANの中にbug tracking systemがあってみんなメールで登録したりしているけど、最近はgithub上でやる人が多い。意外とgithubに移ってきている人も多い
    • m: Perlの人ってgithubでやらないの?
      • n: CPANが機能をたくさん持っているので、そってちでやっている人が多かったということかな
    • m: githubの良さはコードとコミュニケーションが近づいたということ。コミュニケーション主体で大きくなってきたという流れがある
    • t: rtが重要で、なかなかとじることができなかったという面がある
  • n: DevOpsとしてRubyでこんなことやってるよ、みたいのある? 基本puppet使ってとか
    • h: SaaSとかアーキテクチャの話ではPerlとの差が出ると思うが、puppetのようなツールのレベルでは違いがないのかな。単にpuppetがRubyで書かれているだけというか
    • n: Rubyの人はツールもRubyで書かれているものが多い。そういう力が働くのかな
    • h: 道具を作ろうと思って書くからじゃない?
    • n: Railsから広がるというのとDevOpsの話と似たところがあるような
    • h: DevOpsというのはインフラができてソフトが書ける人がやっている印象。Rubyの方が学習コストが低いということがもしあるとすれば、関係しているのかも
    • m: ひと昔前だとRubyをサーバーに入れるのがイヤがられた。Perlは必ず入っていた。5年前に同じことをやろうとしたらPerlになったのでは
  • n: コミッタのコミュニティーについてどうか
    • s: 日本にはPerlのコミッタのコミュニティーがないので仕方ないと思うがRubyについて言うと、普通にコミットできます。まず、みんなで集まって今後のRubyをどうしましょうという話がある。地域Rubyコミュニティーにcommitterが来て「こういう問題があるけどどうすればいいですかねえ」という話をするというのが特徴的だと思う。
    • n: Ruby Kaigiでは言語そのものに関するセッションが多い印象
      • s: YAPCに始めてきたけど、意外に言語そのもののセッションがあって、うれしい意外でしたね
  • m: シアトルにコミュニティーがあって英語が十分でなくても理解してくれる。Matz is nice so we are niceという標語があって、Matzを中心としたコミュニティーがある気がする
    • n: 海外コミュニティーとの関わりってどうですか
    • m: (聞きのがした)
  • n 組織とコミュニティーとの関わりはどうですか?
    • h: 言語のバージョンアップで速くなるとか会社がビジネス面でもコミットしているところが違うと思う
    • t 日本にはPerlのコミッターがあまりいないし、committerをあがめるような文化がない。弾さんが持っているかなーってことくらい。言語コアよりはCPAN authorの方を大事にする文化があるように思う。コミュニティーに還元などはCPANを中心に回っていると思う
    • s: コミュニティーってどこにあるんだという話をしてみたい。Rubyコミュニティーに入るには羊の心臓をささげる、みたいなことはない。分断されていて敵対心をあおるのはよくないと思っていて、自分の所属意識があるのはいいが、排斥しないでほしいと思う
Perlリスク論
  • どう思うか、どう行動したらいいか
  • s: ブログで「まああるんじゃないですか」と書いた件について。去年まではRubyを作る会社にいて、いまはPerlを使う会社に転職してきました。Rubyを使うだけで終わりたくなかったという面はある。いまRubyはバーっともり上がっててカッコイイけど、10年後そうとも思わない。ゆるやかに使われなくなっていくのかな。Rubyを使い続けるのは得策ではなく、もっといい言語が出てきて、それにRubyが影響を与えればいいかなと。ぼくのゴールはRubyを良くすることではなくみなさんを、プログラミングをハッピーにすること。RubyPerlがというよりもっと大事なことがあるんじゃないかな、と。
  • h: ぼくらはユーザーに価値をどれだけ速くとどけられるか、そこに適したRubyをいま使っている。Perlのコミュニティーを見ると他の言語やコミュニティーをすごくよく見ていて、Perlに取り込んだりしている。miyagawaさんはあっという間にRubyRubyコミュニティーの文化を吸収して、またPerlに輸出している。そういうことができる人がいることが大事かなーと思う
  • t: ぼくが言っていることは10年前と同じで変わっていない。Perl6も出ないしもうダメーと言っている。その状況も変わらず。変わらないながら進んでいくんだろうなーと思っている。言語ってのは仕事の一部でしかない。要素技術のひとつを取りかえたくらいで自分のスキルが役立たなくならないようにするのがエンジニアとして大事だろうと思います
  • n: Perlリスクに対してPerlでもこんなことできるよと反論していくのも手であるとは思うけど、他の言語の世界を見て学ぶ機会を得ていくほうが大事。みんなで未来を見ていきましょうと思います。
  • dan: 今年に入ってfreebsdportsに入っているrubyが1.8から1.9になり、いろんなものがこわれた。Rubyはバージョンを上げるとこれがこうこわれますというチェックはどれくらいしていますか、そしてどれくらい反映していますか?
    • s: 何もやっていません。プログラミングを良くすることに主眼を置いているので。RedMineが動かない話が大きかったかな
  • h: バージョンを上げ続けるというのは生産性というかメンテナンスの問題だと思っている

本当にあったレガシーな話

  • @lestrrat
livedoor blog
  • 日本最大のブログサービス
    • 多機能
    • 推定22万行、mod_perl 1.3.x、Perl 5.8.8で動いていた
  • PV/UU非公表(残念)、ただ、ちょっと怖いくらいの量はある
    • サーバーもン百台
  • これをガリガリと変えて、もっと開発しやすく、運用しやすく、モダンにしたい!
  • どう実現できたのか?
    • 銀の弾丸など存在しない って言うと糸冬了してしまう
  • ベストでなくてもベターなコードを適用していく → 地道な作業
コードベース
  • mod_perl 1.3.x、Perl 5.8.8ベッタリ
    • 依存関係もよくわからない
  • これまで: エンジニア・スタッフの腕と力業でやってきた
    • いろんな工夫があっていいシステムではあった
  • これから: コードを良くして運用・メンテをしやすくしたい
目標
  • Perlのバージョンを上げる
  • パッケージングを近代化
  • mod_perlとサヨナラ
perl upgrade
  • PSGI化するまで何もできない。先は長い
phase 1: システムを分割
Road to PSGI
  • まず配信システムをmod_perlからはがそう
  • 仕様は? ログは?
ログを取ってください
  • Log::Minimal
  • 本番では最適化したい
    • 必要ないところではログの出力コードをそもそも消したい
    • 定数たたみ込みしましょう
      • if (LDBLOGNG_DEBUG) { ... } コンパイル時に定数たたみ込みで消える
  • 巨大なアプリではめんどうでもすべての分岐に入れるべき
    • ifの条件式が複雑な場合も、条件ごとにログを入れると後で得
    • 「x == 1なので離脱します」のように書く
    • コンポーネントが多いときはマーカーをつける
      • enter/leaveログ
      • guard objectつけるとインデントしたログを出せる
  • やっとコードの実行結果を追える
  • リファクタリング
    • 「$r」の追放。$rは邪悪そのもの
    • Apache::Request->instanceはさらに悪
  • $r->status(...); $r->send_http_headers()があちこちにある
    • → $class->not_found($r), $class->output_data($r)のような書き方に直す
    • ひと目見て何をやっているかわかる
  • クラス関係の見直し
    • mod_perlハンドラはクラスベース(オブジェクトを作らない)
    • 初期化コードが大変になる
    • フラグ・スイッチを親クラスに集約
  • とりあえずmod_perlのままデプロイ
    • なぜか404ページが真っ白になる
    • mod_perlのクソ仕様
Phase2: 配信システム → PSGI
  • ApacheハンドラをPSGI
  • 直す → 走らせる → 直す → 走らせる →
  • RubyのKageをAnyEventで
      • metacpan.rog/release/Geest (ヘイスト)
      • 出力の差分を見る
  • やっとPerlのバージョンを上げられる
    • せっかくならcpanfile + carton
  • 問題はCPANに上がってないモジュール
    • だいたい内製モジュール
    • tarballからyumで入れてたりとか
    • Class::Triggerだけは他のモジュール全部入れた後に入れたりとか
  • セットアップ
    • よく考えたらmod_perl → PSCIの移行を開発陣全員に教えるのだるい
    • PSGI版のコマンドをたたいたら全部setupするようにしよう
    • mysqlも入れちゃう、パッチ当てて入れちゃう
  • 数台だけ入れかえたら、パフォーマンスが30%落ちる
  • Devel::NYTProfを使う
    • → mountを多用していた。数が多すぎると遅くなる
    • → パッチ書いた
  • query_parameters()がやたら重い
    • uri()をキャッシュするようにしたら10〜15%速くなった → マージ済
  • 再デプロイ
  • 全て落ち着く… svc -hするまでは
    • → 突然load averageが上がる
  • Server::Starterで管理していても-hでやると一気に上がってリソース食う
    • → 既知の問題: 前の世代を殺すタイミングと次の世代が立ち上がるタイミングが同じになってしまう → kazuhoブログ
Phase 3: Sledgeさん
tips
  • plackup多すぎ問題
    • $0に代入してpsで見える名前を変更。リクエスト情報やハンドラ・日時を入れるのも便利

スマフォアプリ開発を支える認証認可アーキテクチャ

  • 鈴木理恵
    • mixi Graph API、認証認可まわり
    • OAuthおねえさん
    • BaaSおねえさん
  • 今日のメイン: OAuth 2.0 Grouped Client拡張について
前提知識: OAuth 2.0
  • OAuth2.0の基本 (略)
  • Glossary
    • Access Token, Refresh Token, client_id, client_secret
OAuth 2.0 Grouped Client extension
  • 今年のミクシィ社はスマホネイティブアプリをたくさん作っています
  • スマホネイティブアプリ
    • mixi IDでログインするアプリ → 今日の主題
    • mixi IDを使わないアプリ
  • mixi公式アプリを立ち上げると、ログイン画面が出てaccess tokenを得る
    • それ以降、access tokenを使ってユーザーの情報を取得
  • mixi製アプリが増えると、それぞれログイン画面が出てしまう
シングルサインオンの実現方法
  • ID・パスワード共有
    • 最初に起動したアプリから後のアプリにID/パスワードを教える
    • OSの機能でKeychain, Account Managerが提供されている。これを使って共有する
    • mixi製でない他社製アプリとは共有できないので安全
    • 絶対の安全はない。root取られるくらいのイキオイでhackされると取られちゃう
      • パスワードが漏洩するとすべての情報がもれる
      • パスワード無効化すると影響が大きい
  • Grouping Refresh Tokenの共有
    • Refresh Tokenは通常アプリごとに異なる
    • Grouping Refresh TokenをOSの機能を使ってアプリグループ間で共有する
    • 不正アクセスに対して、client_id, client_secretが必要なので少し守れる
      • refresh_tokenだけをrevokeすればいい
      • 無効化した場合、grouping refresh tokenを共有している範囲だけで使えなくなる
おまけ
  • 共通アカウント管理機能を持ったBaaSを作ろうとしています
  • push通知機能、その他のBaaSの基本的な機能
  • scopeの違いは? → @ritou と @mad_p のtwitterログをここに入れる

Vagrant と Chef でプログラマブルな開発環境をつくる

  • @aereal
  • アプリを作るにはモジュールがいろいろ必要
  • 某Webアプリ3万コミット
とりあえず cpanm --installdeps
    • だいたい失敗する、オプション変えてみる。やっぱり失敗する。なんども失敗する
  • 2〜3日も開発環境のセットアップにかけるとか気が狂ってる
    • モチベーションも消費する
  • やることは単純な作業の積み重ね
    • → ログが残ることが大切。cpanmの引数とか
    • こわれたらすぐわかる。ドキュメントが陳腐化しているか調べるのは難しいが、プログラムがこわれているのはすぐわかる
vagrantを使う
  • 開発用にVMを立ち上げるのは以前からもやられていた
    • 単純な回帰ではない。Chefのようなソフト面での進化が大きい
    • 丹精こめて作ったVMイメージを大事に大事に使う → 壊れることを前提に環境を作っていく
  • NFSでゲストとリポジトリを共有する
  • perl-buildで5.8.8を入れる (tokuhirom/perl-build)
  • CPANモジュールはcookbookに記述
    • ChefのLWRPを使う
  • carton化も進めている
  • ./bin/server
  • vagrantを使ってもprovisioningには時間がかかる
    • すぐに開発したい
    • provisioning済のboxを配布
    • 社内file serverに配置 → vagrantも取ってこれる
  • git.io/PBG-og にて公開予定
課題
  • 二重管理なのはそのまま → 問題をすりかえただけ
    • 本番環境のchefと共有したい
  • メンテしているのは自分だけ
まとめ
  • Vagrant + Chef: 銀の弾丸ではない
  • 新しい概念なので、ひとりしかわからないという状況で振り出しに戻ってしまうリスクはある
    • ならなんで使うの?
    • cartonの導入もままならないので、まずは開発環境だけでもなんとかしたい
    • 新規開発者がコンスタントに現れる(インターンなど)

p2

  • Reini Urban
  • 5 + 6 = 11
  • perl11.org/p2
  • Parrot performanceはイマイチ
  • perl11 = prel5 + 6
  • Perl is not dead, it is a Deadend」
  • Perl8.org pugs in scala
Perl 11
  • Pluggable perl5 + 6
    • Parser → AST
    • Compiler: AST → ops
    • VM execute ops
  • Parser
    • コミュニティーは信じないので自分で作った
    • YACC (bottom up)
    • PEG/prackrat (top down)
    • Marpa, ANTLR, ragel...
    • PGE, parsec, maru
    • Handwritten もちろんこれが一番いいが
    • maruは結構いい。state machine base(?)
  • Complier
    • AST → ops の線形化と最適化
    • Data Structures: native vs library
    • emit bytecode or jit
      • → pluggable: c, native, jvm, js
      • tieはjsでは難しい
  • VM
    • compile & execute ops
      • でっかいswitchループ
    • native関数を呼ばないといけない。コールバックは難しいものだがp2ではカンタン
    • Debugging support, reflectionが必要
  • 設計方針
    • frequent caseに最適化
      • math, conditionals, function calls,
      • method dispatchはsuperfast。メソッドキャッシュとjitのおかげ
      • local variables
      • string, build: closure内でのimmutable文字列をcopy-on-writeする必要がある。trieを使う(?)
      • memory allocation: GCがあればいい(?)
      • Default arguments: コンパイラでやればやさしいはず
  • Learn from the good
    • LLVMを使ってJITのためだけに大量のライブラリを用意するの?
    • JVM/.NETの起動オーバーヘッドはnot practical。JVMはdynamic data typeに強くない。.NETはマシ
    • 良いVMに共通のアプローチ: GC, register based, three-address coding, taggod small data, word-size ops
  • POTION
    • famous ruby ecleticが作った → いなくなった
    • stack-based expressive with data (lisp-like)
    • lua VM
    • io + soda objmodel (smalltalk based)
    • GC Cheny two-finger loop from QISH かしこい方法
  • potion: フラミンゴをマスコットにした。P 2 の姿をしている
  • potion / P2
    • common number interfaces
      • int, double: automatic promotion, 遅いけど最適化はカンタン
    • common hash/array interface
      • hash とarrayの自動キャスト
    • everything is an object, overy object is a word
      • data, vairables, functions, blocks, class, types, metaclasses, ...
      • 全部はlambdaである。変数もそう
    • every op is a word size: Perlでは4〜7ワード
      • 64bitの中にはopタイプに少しのビット、残りをオペランドに回す余裕がある
  • parser
    • peg, enhanced to greg
    • 最大3ノードのASTを作成
  • compiler
    • ifはただのブロックつきのリストのメッセージ
  • control structureはマクロのように処理できる
  • VM
    • everything is an object, every object is a function
  • MOP
    • object -vtable-> class -vtable-> metaclass
    • 5 core metaclass methods
      • addMethod, lookupp, allocate, delegated, intern
    • 4 ops in VM
      • SELF, CLASS, BIND(継承ツリーをたどってメソッドを決める), MSG
  • VMluaで50opsくらい。とてもカンタン
  • data
    • primitive vs extended object (vt, uniq, size, data)
    • INT, BOOL, NIL as primitives everything else is an object
    • tags LSB2桁
      • 00: foreign ptr or our obj
      • 10: bool
      • _1: int
  • calling convention
    • Native C cdecl (32bit) and fastcall (64bit)
  • GC
    • いろいろ
  • threading
    • まだ決めてない
  • design decisions
  • functions
    • コピーを返す、引数を変更しない
    • Str: immutable, Buf bytebuffers for io

キーノート: management and Perl culture

  • 池辺さん LINE Corp
  • マネジメントしてますという人のトークも多かった。Perlのカルチャーを持ってる人がマネジメントどうやってるかという話をします
  • Career
    • on the Edge → EDGE → livedoor → NHN Japan → LINE
    • 実は転職していない
  • livedoor Blog
    • 10周年
    • mod_perl 1で動いてるサイトの中でさばいてるPVは1位だったと思うけど、一気に返済していただいた
  • お仕様: software development
    • ソフトウエアの開発ってPCに向かってカタカタやってウフフって感じなんでしょ、なんて個人技っぽく思われてる
    • いいソフトウエアってのはすごい少ない人数のちょっとオカシイくらいのすごい人が作ったモノが流行ると思っていたが違う
    • ソフトウエアは人間が作る。いまだに人間が作っている。人間が集まって作っている
    • → Team
  • management
    • 誰かがやらなきゃいけない。大事だなあ
    • manager? えらい人? 「やってくれたまえ」みたいのでやっていけなさそう
      • 「マネージャー」をえらい人と考えるのは大人になってから
      • Google先生に聞くとマネージャーってめっちゃリア充
      • ぼくらの中学生の頃のマネージャーと言えば南ちゃん
        • 選手がパフォーマンスを出せるように麦茶やハチミツレモン作ったりするのがマネージャーの仕事
  • management != 管理
    • 上から目線で管理すればいいというものではない
    • 心がけていることを紹介します
      • as is ではなく to be ですよ
  • work environment
    • 働く環境ってみなさんまあまあウルサイというか非常に大事でしょう
    • PCは速くなくちゃとか、椅子がつらいとか、朝起きれないとか、ワークライフバランスとか
    • 環境をちゃんと備えるために、人事とか総務に通していく仕事がある
  • human resources
    • 人事
    • 自分よりデキル人を雇えないとダメだとか言われる
    • 優秀すぎてどうしよう、取ってかわられるんじゃないかと思ってコワイ
    • ちゃんとやらないとチームとしてのcapがマネージャーのそれになってしまう
    • SKE48の写真、16人みんな色が違う。みんな違うのがいいことで均質化する必要はない。みんな好きキライがあってもいい
    • ビジネスよりに興味があって売上あがるのがいい、細かいチューニングで貢献、いやいや技術的負債は許せない、など、みんなが自分の特性を発揮してくれればいい
    • ユーザーが近いのが得意な人と苦手な人は割とハッキリ分かれているかも。ユーザーからの辛辣な指摘に耐性のある人に大規模な改修してもらうといいかな、とか
  • 将来どうすんの?
    • management or engineer
    • 35歳定年説
    • 人事制度もちゃんと考えないといけない
    • ダメだと思うのは「デキルエンジニアをおまえマネージャーな」とやること
    • 向いている人、向いていない人いると思うし、マネージャーできないとダメだよというのはおかしい。エンジニアはエンジニアのまま給料ももらえるような人事制度にするようハックしていくべき
    • マネージメントとリーダーシップはまた違う。数人でゴールさせるリーダーシップを持っているエンジニアは結構いると思う
    • 「マネージャーならないといけないんですよね、そろそろ」という価値観でやらない方がいいと思う
  • direction: 方向づけ
    • 適材適所、人に向いたいい仕様を与えるというのはあるとして、
    • そもそもなんでこの仕事やってるの、ということはちゃんと伝えていかないといけない
    • 細かいことではPerl使いましょう、このフレームワーク使いましょうとか、弊社で言うとアプリに力入れましょうとか、こういう制御は大事なところですね
  • marketing
    • マーケティングというとアレっすかみたいな話になりがちだけど
    • チームがちゃんとがんばっているということを、技術がわからない人、決裁権を持っている技術のわからない人に伝えていくこと。これをやならないと損したりする
    • 牧さんのmod_perlからの脱却という話があるけど、自分はApache使いたい、でもCは書きたくないという感じでやった。そして脱却した牧さんはすごいんです。だからもっとお金をくださいとか、フレックスにしてくださいとか、そういう社内政治を、社内政治って悪い言葉っぽく聞こえるけどそうじゃなくて、ちゃんとやっていくことは必要
    • ちょっとずつ社内にうちの部署++みたいなカルマがたまっていって良くなるので、そういうスパイラルを回していけることが大事だと思います
  • our team
    • 80人強いる AKBの研究員を全部含めたくらい
    • サーバーサイドはだいたいPerl
    • 最近はアプリを作っているのでObjective-C, Java, JavaScript, Ruby
    • Rubyも実は使ってたり
  • Why we use Perl?
    • 入ったときには弾さんがもうそうしてた
      • dan: ぼくが入るまえに@takapon_jpさんが使ってた
    • 変えようとすれば変えられる
    • Perlリスクという話の中で面接してるときにPerlできませんと言ってすぐお引きとりください、なんて言われてたけどそんなことはない
    • いまPerlができないからってできるようにならないことはない
    • Webの仕事をしていてプログラミング言語で勝負が決まるようなことはない
    • 10年動いているものをRailsで書き直しましょうなんてコストは見合わない
    • タイミングを逃した? まあそうかもw
    • Perlって言語の側面というよりはカルチャーの側面、TIMTOWTDIとか多様性を認めるカルチャーとか大事
    • CPANソムリエという職がうちにはあって、CPANに乗ろうという気持ちがすごく大事
    • いいチームはいいカルチャーを持っている。その大部分はPerlのコミュニティーPerlのカルチャーから学んだかな、と思います

LT2日目

すいませんログ取ってません

クロージング

  • @lestrrat
  • YAPC::Asiaももう8回目
    • ずっとスタッフしてるのはぼくだけ
  • チケットの売れた枚数 + 招待客、スタッフとか全部足すと → 1,131人
  • ベストトーク賞発表
    • 3位: 勉強会の参加費用
    • 2位: 国内カンファレンス参加費用 + 旅費
    • 1位: 米国、ヨーロッパなどのYAPC以外でもいいがカンファレンスに行く参加費 + 旅費
    • 3位: kazeburoさん
    • 2位: myfinderさん、lestrratさん
    • 1位: yusukebeさん
  • お知らせ
    • YAPC::Asia Tokyo これが最後です
      • 941 + lestrrat 引退
    • Exciting new things happening
      • Perl 5.20
      • Carton
      • PerlMotion
      • p2, pvip, perl.js
      • ほとんど日本発
    • Regional YAPCs
    • Perl入学式
    • 新しい息吹
    • 我々が4年間やってきたものが、芽が出てきた
  • Don't keep calm or carry on
    • Be the change you wish to see in the world
  • lestrrat: アイディアある人は今年中にぼくのところに来てください
  • スタッフ
    • NOCチーム: JANOG + LLNOC
    • 記録更新 100Mbps頭うっちゃって、みなさんiOS7ダウンロードしすぎです
  • See You Next At YOUR YAPC!