$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

#yapcasia 2015に参加しました

今年もYAPC::Asia 2015に参加しました。今年のYAPCも非常に面白いトークが多く、またいろいろな人と会話でき、非常に楽しめた。

トークとしては、Effective ES6Perlの上にも三年 〜 ずっとイケてるサービスを作り続ける技術 〜 3分でサービスのOSを入れ替える技術が非常に参考にった。フロントエンド、Perl、インフラといろいろな層の話が聞けてYAPCはすごい。


今年でYAPCが終わりということで非常に寂しい気持ち。はてなでアルバイトとして入ってプログラミングを始めた時にYAPCに初めて参加して、さまざまなPerlハッカーの人たちにあこがれて、いろいろやっていたら、一年ごとにだんだんPerl界隈の人とも会話させてもらえるようになったので、YAPCに育てられたという気持ちになっている。最初のころantipopさんに連れられてmiyagawaさんの隣で写真を取らせてもらうというのが精一杯だった。でも毎回YAPCやその他のPerlのイベントに参加していったことでいろんなPerlハッカーの人たちと会話することが出来た。またその後YAPCでCartonのことでmiyagawaさんに呼ばれた時とかはすごく嬉しかった。こういう経験を得られたので、YAPCにずっと参加してきてよかった。


最後のYAPCで自分の同僚がベストトーク賞を取っていて最高といった気持ち。発表もすごく面白くて、しかも賞まで取ったの、すごすぎるしとにかくめでたい。ただ自分の中ではもやもやした気持ちもあって、ああやっぱり悔しいんだなと思った。気を引き締めて地道に努力していきたい。


YAPC、自分と同年代で別の会社に入った人との同窓会みたいな感じにもなってたので、それがなくなるの寂しいのだけど、また次のカンファレンスがあるのであれば自分も協力したいなと思う。


最後に運営の皆さま本当にお疲れ様でした!

gitでpush前のcommitの一覧をリスト記法で取得する

github上でコードレビューをされた時、あるコメントに対する変更点を列挙して、「こういうふうに直しました」と言いたい時がある。こういう時にpush前のcommitをリスト記法で貼り付けたい。

なんか出来ないかなと思ったら、以下のようにしたら出来た。

$ git log @{u}..HEAD --format="- %H %s"
- 2b237548bcd779abd3f15d413b3540f4c8699cd2 perlで使っていないモジュールを検出してくれる
- 998d3198bf96ab545f315005128342e124941bc4 fix
- 3434242410997a2be106b3596b810539c5fce0f4 IntelliJの起動ショートカット
- ae0ab4f3397587282b87ed3de8754e971bd0c8c6 gopath
- 8f8a230ca3fffc4536fc4107e6d76308e91a801c envを移動

@{u}は現在のブランチのupstreamを指すための省略記法。man gitrevisionsをすればいろんな記法を知ることが出来る。

またgit logなどはformatを指定できるオプションが付いているので、それを利用して、

- (revision) (commitメッセージ)

というフォーマットで出力するようにしている。


これでちょっと便利になったけど、

  • pushしないと、githubに貼り付けた時にcommit hashがリンクになってくれない
  • コメントに対する対応関係は自分で手書きする必要がある

という不便さがまだあるので何とかしたい。

変更した箇所だけTest::UsedModulesで不要なuseを検知する

blog.shibayu36.org

以前こんなブログを書いたが、やはりCIでチェックしたいと考えた。

全ファイルをチェックしようとすると時間がかかってしまうので毎回のテストでは実行したくない。しかし、毎回のテストで実行しないと結局はmerge前に検出するのが難しくなる。この背景から、どうせgitを使ってるし、変更点だけチェックすればいいのではと考えた。

gitで変更があったファイルの一覧を取得するには

git diff --stat --name-only master...HEAD

とすれば良い。

これを利用すれば以下のようにして変更点だけテストできる。

use Test::More;
use Test::UsedModules;

my $base_branch = "origin/master";
my $changed_files = [
    split "\n", qx{git diff --stat --name-only $base_branch...HEAD}
];
my $target_files = [ grep { $_ =~ /(?:\.pm|\.t)\z/ } @$changed_files ];
for my $file (@$target_files) {
    used_modules_ok($file);
}

done_testing();