KLab若手エンジニアの これなぁに?

KLab株式会社の若手エンジニアによる技術ブログです。phpやRubyなどの汎用LLやJavaScript/actionScript等のクライアントサイドの内容、MySQL等のデータベース、その他フレームワークまで幅広く面白い情報を発信します。

php

metahubというgithub活用ツールを作りました

はじめに

 はじめましてoho-sと、お久しぶりですmakki_dです。今日は、metahubというツールの紹介をさせていただきたいと思います。
 
 まず、二人の自己紹介をさせていただきたいと思います。この名前からKLab勉強会No.6を思い出して頂いた方、ありがとうございます。そこで発表した三人のうちの二人です。二人とも、KLab開発部内で新設されたEngineering Managerという役職についています。社内ではEro Managerなどとも言われる略してEMが、どのようなミッションについているかと言いますと、社内の開発・技術的な課題などを横断的にエンジニア視点でマネジメントし、問題解決やビジネス価値の向上を目指す役職です。まぁ、簡単にいえば何でも屋ですね。そんな二人が、社内のある課題の解決のために作ったのが、metahubです。

top


metahubとは何か?  metahubは、githubのリポジトリを登録すると、定期的にクロールしてPullRequestを取得し、そのPullRequestをフィルタリング・タグ付けして一覧表示するサービスです。


背景・課題

 最近、社内案件のリポジトリとして、githubのプライベートリポジトリを使う案件が増えてきました。開発部全体でもgithub移行を後押しし、今後github Enterpriseも視野に入れた、バージョン管理戦略を考えています。

 一方で、弊社のモバイルオンラインゲーム案件の数は、どんどん増え、コードベースが似ているものの、各案件の事情を反映した、「類似」の案件が「多数」「別々のプロジェクトグループ」によって開発・運用されています。これにより、ある案件で判明し修正した問題点を、他の案件がまた作りこんでしまい、問題を起こしてしまうなどの、課題が出てきています。

 githubでは、Pull Requestなどの仕組みを用いることで、社内でソーシャル開発ができ、またgithubという一箇所にリポジトリを集約することも出来て、上記の課題を解決していけそうに見えたのですが、残念ながら運営されている「多数」の案件に対して、横断的に十分な人数のレビュアーがつけない状況になっています。

 ここで問題になるのは、リポジトリを集約できたとしても、結局レビューすべき量は変わらないということです。一箇所に集約できて、ワンストップでレビューできる(かつレビューの仕組みがシステムに組み込まれている)のはとても有効なので、もう一手考えましょう!ということで、二人で考え、見なければいけないPull Requestを様々な条件でフィルタリングして絞り、さらに集約することで、レビューするコードの量を減らし、効率化する仕組みを作ったらどうだろうと、実装したのがmetahubです。


やったこと

 metahubという名前は「高次な」という意味のmetaをgithubのhubと組み合わせたものです。仕組みとして、githubAPIを用いてmetahubに監視対象として登録した案件のリポジトリから、Pull Requestを定期的に取得し、含まれるDiffから、Filterに適合すものを見つけてタグ付けするものです。タグ付けした結果は、githubのPull Requestへのリンクとともに表示され、気になるPull Requestを見つけたら直接ジャンプすることができます。

pullrequest1

 フィルタとしてどのような条件があるといいだろうということで、議論は白熱しました。つまり、良くないコードや、障害につながるコードってどういうコードだろうということです。

 トランザクションやロックが関わるところは、十分に検証しなければならないよね、ということで、FOR UPDATEやbeginTransaction、commit、rollbackといった文字列を検出するフィルタを作りました。経験上、複合主キーがあるテーブルは設計が甘いことが多く問題が起こりやすかったので、検出する正規表現フィルタを作成しました。フレームワークのコアに近いところのコード変更をしている箇所もレビューは必要でしょうということで、フレームワークディレクトリへの変更も検出できるフィルタを作成しました。実は、コミットした人も見えたらいいんじゃない?ということでそんなフィルタもあります。ある人のコミットだったら反応するものですね。幸いなことに、まだこのフィルタを本格的に使うような、常に問題のあるコードを書くような人は、社内にはいません。他にも、よくあるTypoであるとか、コマンド実行しているところの抽出などのフィルタを作成しています。

filter

 実際に作ってみて、現在社内で動かしているのですが、登録されているすべての案件のPull Requestが集約されるため、非常に横断的に見やすくなっています。特に、合致した条件がファイル名とともにわかりやすく表示されるので、レビューするべき点がわかりやすくなります。また、実際に複合主キーに関してのプログラムミスや誤ってコミットされた一時ファイルなどがmetahubで検出出来ました。

pullrequest3

 metahubのコードは(github  https://github.com/KLab/metahub)で公開しています。


今後の展開

 metahubは、こんなツールがあれば便利じゃないかということで作ったのですが、作ったあとに障害管理フローに組み込んだらもっと有益なんじゃないということに思い至りました。つまり、障害が起こった時に、原因コード(コードが原因だった時に)の特徴から、類似のコードなどを検出するフィルタをmetaubにフィードバックすることで、障害管理のPDCAサイクルを有効に回すことができるのではないかということです。類似のコードがコミットされた時に自動的に抽出して、レビュアーにタグ付けして提示できるのです。

 これまで、小規模で類似した多数の案件を、ある程度独立した多数のチームで並行して開発している大規模な組織での開発管理の方法論が、あまり議論されていないのではないでしょうか。metahubは、githubなどの便利で素晴らしいツールを、よりうまく組織に合わせて使いながらの、上記の課題に対しての私達のアプローチの一つです。是非、社内からも社外からも、様々なご意見を頂きたいと思います。


パーフェクトPHP書評

こんにちは、blog登場3回目のnakazawa-kです。書きかけのAndroid記事よりも先になってしまったのですがせっかく献本を頂戴したということで、発売日にはレビューを載せたいなと思い少々駆け足で読んだ「パーフェクトPHP」社内回し読み2人目の書評(?)です。 本にどのようなことが書かれているか、についてはAmazonに掲載されている目次でも見ていただけば大体分かると思いますので、ここでは「どんな人が読むと、どんなことが得られそうか」「nakazawa-k的に気になったトピック」を主に取り上げます。他の切り口は社内外の他の方にお譲りします。 一言でざっくりまとめると「PHPでプログラムを書く人、書いている人は斜め読みでもよいので一読すると、抜けているポイントを補間出来たり、自分の理解度を把握することが出来るので是非読むべき」という感じです。この本から得るものは何も無いという方は、それはそれでひとつの指標として捉えられるのではないでしょうか。その上で、PHPからしばらく遠ざかっていたけれどまた書くことになった、という時にでも『PHPのクセ』を思い出すためのツールとして有効なのではないかな、と考えています。 以下、より具体的に書いていきます。 第二部、PHPの言語仕様については、既にPHPを用いてアプリケーション開発を行っている方もざっと一読をお薦めします。何か抜けている箇所があるかもしれません。PHPは詳細な仕様をきちんと認識していなくてもコードをガリガリ書くと案外動作してしまうので、場合によってはずっと知らないままになってしまうかもしれません。言語仕様をきっちりと把握していないと思わぬところでハマったり、再現性の悪いバグに悩まされたりします。一度整理しておくのは非常に有意義でしょう。 第三部、第四部、第五部は「PHPでWebサービスを作り始め、ひとまずゴリ押しで動かすにはどうするのか、その後保守しやすくPHP的にあるべき姿へとコードを変更するためにはどのようにすべきか、サービスとして公開するにあたりどのような点に注意を払いセキュリティを保つべきであるのか」という、サービス開発者の成長フローとも言えるものをまとめています。 特に第7章からのWebサービス向けフレームワーク設計と実際のディレクトリレイアウトやコードへの落とし込みと、それを用いたアプリケーション構築までを、ある程度思考フローを追いかけて記載されている部分は「フレームワークを使ってるけど、それらがどのように実装されているのか、そしてそれはなぜなのかは分からない。知りたい」という意識を持たれている方はステップアップのために是非読まれることをお薦めします。コンパクトでそこそこ使いやすいフレームワークをPHPで構築するためにどのような要素が必要か、どの程度柔軟性を持たせるべきか、どのようなことに注意を払う必要があるのか、という思考をある程度追体験することが出来るように思います。 終盤の章はPHPに慣れていない人に「こういうのがあるんだー」と、とりわけ文字列操作や配列操作関数がやたらと充実していることを知ってもらうための章立てです。実際にコードを書く段階になって既存関数を自分で書かずに済み、取り組むべきロジックに注力出来る、という意味で有用ですが、既にPHPをある程度触っている人は「何か、知らないものないかな」とざっくり眺める程度でOKでしょう。 ちなみにこのあたりはリファレンス的な内容であることも影響していると考えられますが、多少失速してしまった感があります。他の章についているPHP5.3以降対応の注記が無くなってしまっている(例えばDateIntervalは5.3から、DateTimeクラス自体は5.2にもあるがDateTime::diff()は5.3から)ので、実際に記載の関数/メソッドを使われる際には、リファレンスで確認されることをお薦めします。12章冒頭で書かれているように「PHPのマニュアルはよく出来てる、ちゃんと読もう」ということです。 蛇足ながらPHP5.2.xは現状予定では5.2.15で終了、ということになっています。つまり、そろそろPHP5.3.xへの移行を本格的に考えるべき時期に来ているのですが、まだまだ世の中のサーバでPHP5.3.xが使えない環境が多い上に既存5.2用コードの一部が動作しないことを考えると、依然としてバージョンごとの関数/メソッドサポートについては気を使う必要があります。
= 雑多なトピック = PHP5.2.xな世界に居る人から見たPHP5.3.xの魅力 ・三項演算子の省略記法 $result = func() ? func() : 'default'あるいは$result = ($ret = func()) ? $ret : 'default';と書かざるを得なかったコードが $result = func() ?: 'default'; と書けるようになった。これは幸福度高いです。 ・無名関数 説明不要ですね。使い方によってはコードがカオスになる懸念はありますが、便利にさっくり書ける場面が増えそうです。 ・Nowdoc
$var = <<<'EOM'
text
text
EOM;
シングルクォートでバウンダを指定するという記法がとても残念な感はあるのですが、式を書けない場所にも変数展開無しヒアドキュメント(残念ながら、私はほぼ使わない)を置けるのは嬉しい人がいそうな感じです。一方、constにarrayを定義出来ると嬉しいのですが、残念ながらそれはPHP6.0まで対応されません(6.0の話はやめろーという声が聞こえてきそう)。 本書でも記載されている自動キャストの挙動は様々なところでネタにされているように、PHPでエンバグの原因になる要素のひとつです。厳密比較のほうが速度的なメリットも得られるのですが、全てを厳密比較で行うためにはある程度入力時のキャスト等に労力をかける必要があるため、正しい知識を持った上で場合によって使い分ける必要があります。 本書中に可変変数など、様々な便利機構が記載されていますが、それらについてどの程度コストがかかるかという点については触れられていないので、自ら計測する必要があります。これは処理前後でのmicrotime()を用いた時間計測(実際には数十万回ループにすると思いますが)および使用前後でのmemory_get_usage()を用いた(あるいはXdebugでのトレース出力)メモリ消費量計測によって簡単に取得出来るので、新しい仕組みを使ってコードを書く際には習慣付けると良いでしょう。 本書のコラムにてPHPに限らず、ある言語自体のソースコードが手元にある場合、それをよく知るための良い手掛かりとしてテストコードを読む、というのが挙げられています。PHPのテストコードはPHP自身で書かれていることが多いため仮にCが読めなくとも取っつきやすい、ということです。未知のものに対するアプローチとして面白いものだと感じ、実践してみようと思います。 うっかり知識から抜けていたポイント。 foreachにて要素参照を使うことが出来る。
foreach ($list as &$elem){
}
で参照をそのまま使える。ただし、ブロックを抜けた後での変数破壊コードを埋め込んでしまう恐れもあるため、ループ抜けたらunsetしておくのが無難。外部ソースから取得した配列データを事前に型変換した上でAPCに放りこむ、などの用途で便利ですね。
$list = fetch_data();
foreach($list as &$element){
    $element['id'] = (int)$element['id'];
}
...

勝手に正誤表(既に指摘されてるのを知っている箇所は除いているので完全なリストではありません) 意味的なものではなく、表記的なもののみ。 p.267:設定するして→設定して p.279:処理が完了ら→処理が完了したら p.309:ログイン状態のみ→ログイン状態でのみ、が一般的かな p.373:RFCに準拠しないも→RFCに準拠しないアドレスも

アシアルKLab合同勉強会で発表しました: MessagePackのPHP Extensionについて

こんにちは。takei-hです。 ちょっと時間が経ってしまったのですが、アシアル株式会社KLab株式会社の合同勉強会でMessagePackとPHP Extensionについて発表しましたので、資料を公開します。



また、PHP Extensionもだいたい形になったので、公開します。 MessagePack PHP Extensionのダウンロード ソースを解凍した後、インストールは以下のコマンドで。
$ ./configure
$ make
$ sudo make install
そして、php.iniに以下の行を追加します。
extension=msgpack.so
これで準備完了です。 主に、ruby版のライブラリを参考にしています。使い勝手はPHPのjsonと同じような感じで、msgpack_pack()とmsgpack_unpack()です。 使い方はこんな感じ↓
1), array("takei"=>"hide"), 3);
 var_dump($data);

 // serialize
 $msg = msgpack_pack($data);

 // hexadecimal
 $str = unpack('H*', $msg);
 var_dump("0x".$str[1]);

 // deserialize
 $ret = msgpack_unpack($msg);
 var_dump($ret);
?>
また、ruby版と同様、ストリーミングデシリアライゼーションも可能です。
initialize();
 $buffer = "";
 $nread = 0;

 foreach($msgs as $msg){
    $buffer = $buffer . $msg;

    while(true){
        $nread = $unpacker->execute($buffer, $nread);

        if($unpacker->finished()){
            $msg = $unpacker->data();
            var_dump($msg);

            $unpacker->initialize();
            $buffer = substr($buffer, $nread);
            $nread = 0;

            if(!empty($buffer)){
                continue;
            }
        }
        break;
    }
 }
?>
まだ完全なテストやベンチマークはとっていないのでこれからやろう。。。と思っていたら、本日、MessagePackのPHP Extensionを公開された方がいたようです!(うぅ) MessagePackのPHP Extensionを作りました トロトロしている間に。。でもせっかくなので私も公開させてもらいます笑。優位点としては、array型もpack,unpackできることでしょうか! 世の中の流れは速い!これからはアウトプットを、MessagePackみたいに高速化していきたいですね!! == 追記(2009.11.30 17:34) == GitHubに公開しました。ご指導ご鞭撻のほどよろしくお願いします! http://github.com/hideyuki/messagepack-php-ext

携帯絵文字変換PHPライブラリ PictgramConverter を公開しました

tadaka-atです。 最近Haskellの記事ばかり書いていますが、PHPも書いてます!ということでPHPのライブラリを公開しました。 ■PictgramConverter サポートする機能は
  • 絵文字sjisバイナリをutf-8バイナリに変換
  • キャリア間の絵文字変換
「ShiftJISからutf-8への文字コード変換とともに、絵文字もutf-8エンコーディングに変換」「異なるキャリアの絵文字も表示キャリアに合わせて変換」という処理が手軽にしかも高速にできるすぐれものです。 インストールは以下のコマンドで完了します。
$ pear channel-discover openpear.org
$ pear install openpear/PictgramConverter-alpha
詳しく知りたい方は以下の勉強会資料もごらんください。 アシアルKLab合同勉強会で発表しました

MeCabを使った形態素解析1

どうも、相変わらず暴君なyoshida-kです。 今日はMeCabというオープンソースな形態素解析エンジンをphpから利用して見ましょうというお話です。 MeCabを使うと文章を単語に分割したり、分割された単語がどういったものなのかという情報を取得したりできます。 まずは、MeCabをインストールしてみましょう。 リンク先を見ればインストール方法は明らかですが、とりあえず順を追って説明します。 1.sourceforge.netよりMeCabのソースをDownload 2.任意のディレクトリにDownloadしてきたアーカイブを展開 tar -zxvf ./mecab-x.y.tar.gz 的なw 3.mecabのコンパイルを行う。 普通のアプリと同じでconfigureしてmake , make installな感じです。 ディレクトリ内にあるINSTALLファイルを見るととりあえずやり方が書いてあったりします。 ここまでやるととりあえずmecabがインストールされるわけですが、コレだけではmecabはちゃんと動きません。 mecabを動かすには辞書が必要です。 辞書も先ほどのsourceforgeのところからdownloadできるので同様に展開⇒make installしてください。 さて、この状態でmecabを起動することが可能となりました。 mecabを起動すると形態素解析をしてくれます。 よく使われている例ですが 「すもももももももものうち」と入力すると
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
このような形に出力してくれます。 さて、いよいよPHPでこのMeCabを利用するためにPHPのExtensionをインストールしましょう。 MeCabのPHP ExtensionはこちらのPage2さんが公開してくださってます。 インストール方法は phpize ⇒ configure ⇒ make ⇒ make installです。 インストールが完了したらphp.iniのモジュール読み込みの設定にmecab.soを追加しましょう。 さて、以下の内容がテストコードです。 うまくいくと、mecabを起動して実行したものと同じ結果が出力されます。
<?php
   dl("mecab.so");

   $mecab = mecab_new();
   $string = "すもももももももものうち";

   print mecab_sparse_tostr( $mecab , $str );

   mecab_destroy();
 ?>
いかがでしょう? コレだけではまだ実用性にかけるので次回はもうちょっと実用的な内容を紹介させていただきます。
 KLab若手エンジニアブログのフッター