YAPC::Asia2015

43
Perlがメインじゃない 現場でもPerlを使う (AdTech現場編) masartz@VOYAGE GROUP YAPC::Asia 2015 08/22

Transcript of YAPC::Asia2015

Page 1: YAPC::Asia2015

Perlがメインじゃない現場でもPerlを使う(AdTech現場編)

masartz@VOYAGE GROUPYAPC::Asia 2015 08/22

Page 2: YAPC::Asia2015

自己紹介• masartz

• http://search.cpan.org/~masartz/

• https://github.com/masartz

• VOYAGE GROUP adingo -> fluct

Page 3: YAPC::Asia2015

先ほどのセッションに続き確認ですが、 こちらでお間違いではないですか?

Page 4: YAPC::Asia2015

結論• 言語が変わっても求められる事は変わらない

• 言語に関わらずできること/しなければならないことはある

• 無駄な部分はなるべくなくしていこう

• そのために自分の持っている技術を使い、またその技術の幅を広げよう

Page 5: YAPC::Asia2015

前提

• What’s SSP?

• What’s fluct?

• How Architecture Works?

Page 6: YAPC::Asia2015

What’s SSP

メディア(媒体) SSP

Adnetwork

or

DSP

広告主

Page 7: YAPC::Asia2015

What’s fluct

Page 8: YAPC::Asia2015

本日のお品書き1. Perlの現場でやってた事を

PHPの現場でもやった話

2. PHPの現場で書いたものをPerlにバックポートした話

3. Rubyの現場で暫定対応をPerlでやった話

4. まとめ

Page 9: YAPC::Asia2015

Perlの現場でやってた事をPHPの現場でもやった話

Page 10: YAPC::Asia2015

共通している課題

• 「こうしたい」、「こうなったら良い」に対して現状がそれを阻む制約を抱えている

• 何らかの線引きをしないと、制約は加速していく

Page 11: YAPC::Asia2015

「現状○○なんだけど、いずれxxしたい」 という時のアプローチ

http://techlog.voyagegroup.com/entry/2015/05/01/150606

Page 12: YAPC::Asia2015

何をしたか?どうなったか?• 媒体社様向けの管理画面用リポジトリにおいて、PSR-2に沿う事をコードレビュー時に目視確認と手動修正によって行っていた

• 既存ファイルを全て修正して、php-cs-fixerが使える状況を作った

• 開発時に機械的にPSR-2に沿えるようになった

Page 13: YAPC::Asia2015

Perlの現場では?• 古いライブラリで、社内のガイドラインに沿ってないファイルがたくさんあった

• Test::CodingStyle( https://github.com/mixi-inc/p5-Test-

CodingStyle )という仕組みを作り、既存ファイルをblacklistに入れて分別するようにした

• 新規分は必ずガイドラインに沿えるようになった

• http://www.slideshare.net/masartz/yapc2013-26481517/21

Page 14: YAPC::Asia2015

PHP環境 Perl環境

課題 コードレビュー時に毎回発生する確認&修正コスト

増え続けるライブラリのメンテナンスコスト

現状 PSR-2に則っていないファイル群(550)

社内ガイドラインに沿ってないファイル群(10,000)

対応 既存全てのファイルにphp-cs-fixerを適用した

Testツールを作って、既存ファイルはblacklist扱いにした

結果 make php-cs-fixer test running

Page 15: YAPC::Asia2015

この話のまとめ• 対象リポジトリ配下全てがPSR-2に沿った

• 対応リリース過程で障害に繋がったケースはなし

• 大切な事は、明瞭な規約に沿う事にコードを統一できたことではない

• 人がやるべきではない作業を機械にやらせるようにした

Page 16: YAPC::Asia2015

PHPの現場で書いたものをPerlにバックポートした話

Page 17: YAPC::Asia2015

共通していること• 開発者がcrontabをうっかり書きミスること 例)19時00分にだけ動いてほしい場合 誤: * 19 * * * php hoge.php  正 : 0 19 * * * php hoge.php

• cron.txt っぽいファイルで設定を管理している

• crontabの解析用のライブラリが既にあることによって少ない工数で、テストが書ける

Page 18: YAPC::Asia2015

・http://masartz.hatenablog.jp/entry/2015/08/04/203331 ・http://www.slideshare.net/masartz/lt-open-45508527

Page 19: YAPC::Asia2015

何をしたか?どうなったか?• crontabの設定をうっかりミスってしまい、障害が起きてしまった

• 書きミスがちょっとだけ防げるdoctest (or Test::Base)っぽいテストを書いた

• テストが落ちることで、うっかりミスに気づけるようになり、簡単な再発防止策となった

Page 20: YAPC::Asia2015

* 19 * * * php hoge.php ###prev 2014-12-31 19:00:00 ###next 2015-01-01 19:00:00

これだと、テスト落ちる

Page 21: YAPC::Asia2015

0 19 * * * php hoge.php ###prev 2014-12-31 19:00:00 ###next 2015-01-01 19:00:00

これだと、テスト通る

Page 22: YAPC::Asia2015

Perl版は?

• Test::Parse::Crontab::Simple

• http://search.cpan.org/~masartz/Test-Parse-Crontab-Simple-0.01/

Page 23: YAPC::Asia2015

10 19 * * * perl hoge.pl ###sample 2014-12-31 19:20:00

これだと、テスト落ちる

Page 24: YAPC::Asia2015

*/10 19 * * * perl hoge.pl ###sample 2014-12-31 19:20:00

これだと、テスト通る

Page 25: YAPC::Asia2015

PHP環境 Perl環境

課題 開発者がcrontabをうっかり書きミスる

現状 Cron Expressionがある Parse::Crontabがある

対応 Cron Expressionを用いたテストファイル Test::Parse::Crontab::Simple

結果 うっかりミスに少しだけ気づきやすくなった

Page 26: YAPC::Asia2015

何故Perlに移植したか?

• PSGI,Plack,plenv,Carton etc…

• 近年のPerlの成長は他言語からの流入が大きい

• 他言語で得た知見をPerlに還元するため

Page 27: YAPC::Asia2015

ここで半分ちょっと越えたくらい

Page 28: YAPC::Asia2015

Rubyの現場で暫定対応を Perlでやった話

Page 29: YAPC::Asia2015

Which situation?

メディア(媒体) SSP

Adnetwork

or

DSP

広告主

Page 30: YAPC::Asia2015

Adnetworkからfluctへの入稿

Page 31: YAPC::Asia2015

何をしたか?どうなったか?• 入稿するJavascriptタグを多重登録してしまうオペレーションミスがしばしば起こっていた

• 重複検知のための要件定義をPerlで行い、定常運用版をRubyで書いた

• 重複が発生した場合、アラートメールが届き、 重複を解消できるようになった

Page 32: YAPC::Asia2015

Which situation?

Page 33: YAPC::Asia2015

既存分の修正

既存分抽出及び定常バッチ用

スクリプト作成&修正(Ruby)

要件定義&既存分の精査

オペレーションG エンジニア

警告発生時の 修正フロー開始

定常バッチ化リリース

要件が曖昧で、見積もりにくい

クリティカルパス

メンテナンス

Page 34: YAPC::Asia2015

この案件のキモ• 要件定義をできるだけ早めて、早く次のフェーズに進むこと

• 一旦現状をクリーンにしてから、異常があった場合のみメールが発砲されるようにすること

• 現状を鑑みて、冗長体制かつ、少ないメンテナンスコストで運用できるようにすること

Page 35: YAPC::Asia2015

既存分の修正

既存分抽出及び定常バッチ用

スクリプト作成&修正(Ruby)

要件定義&既存分の精査

オペレーションG エンジニア

警告発生時の 修正フロー開始

定常バッチ化リリース

Page 36: YAPC::Asia2015

既存分の修正

既存分抽出スクリプト作成&修正

(Perl)

要件定義&既存分の精査

オペレーションG エンジニア

定常バッチ化開発(Ruby)

警告発生時の 修正フロー開始

定常バッチ化リリース

Page 37: YAPC::Asia2015

この話のまとめ• 現状、通知メールが来ると「おっ?」って 思える運用フローになっている

• リリース後稼働しているRuby版は冗長なメンテナンス体制が取れている

• 案件の性質を理解し、より良い手段を取ることが大事であるということ

Page 38: YAPC::Asia2015

全体のまとめ• 言語が変わっても求められる事は変わらない

• 言語に関わらずできること/しなければならないことはある

• 無駄な部分はなるべくなくしていこう

• そのために自分の持っている技術を使い、またその技術の幅を広げよう

Page 39: YAPC::Asia2015

告知タイム

Page 40: YAPC::Asia2015

http://voyagegroup.com/crew/recruit/

Page 41: YAPC::Asia2015
Page 42: YAPC::Asia2015
Page 43: YAPC::Asia2015

Thanks YAPC::Asia!