詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

git commit --fixup とは何か

git commit --fixup というオプションの存在を最近知って調べた。

ヘルプとリリースノートより

"git commit" learned the --fixup and --squash options to help later invocation of interactive rebase. Git v1.7.4 Release Notes

       --fixup=<commit>
           Construct a commit message for use with rebase --autosquash. The commit message will be the subject line from the specified commit with a prefix of "fixup! ".
           See git-rebase(1) for details.

1.7.4 から入ってるらしい。

使い方

ふつうにコミットするときに、別の既存のコミットを指定する。

git commit --fixup=HEAD~1

こうする場合コミットメッセージは不要で、代わりに指定されたコミットのコミットメッセージの先頭に "fixup! " が付与されたコミットメッセージが使用される。

% git log --oneline
e609512 fixup! some commit
9961eb5 meow
05aed73 some commit
147d264 init

なんとも色気のない機能で、これだけだと何に使えるのかと思うが、ここで git-rebase が登場する。

git rebase と組み合わせる

git rebase について詳述はしないが、これは過去のコミット群の親をつけ替えるなどして歴史を改変できる高度なコマンドで、とくに -i オプションによるインタラクティブモードだとエディタを利用して詳細な編集がおこなえる。そこでは "fixup" という指示が使えて、指定したコミットの変更をまるっとその親に含めてしまうことができる。あるコミットをした後に、そのコミットに関するちょっとした修正を後知恵でコミットしたあと、git push 前に git rebase -i、という流れだ。ちなみに git commit --amend でも同じようなことはできてよく使っているが、これは最新のコミットを書き換えることしかできない。

git commit --fixup はこの git rebase -i とうまく働く(というか、そのためのものである)。git rebase -i--autosquash オプションを与えると、先ほどの "fixup! " で始まるコミットを自動的に検出して、そのコミットを修正先のコミットと合体させてくれるように再配置してくれる。

先ほどの例で git rebase -i --autosquash HEAD~4 してみると、エディタには以下のような並びを提示される:

pick 05aed73 some commit
fixup e609512 fixup! some commit
pick 9961eb5 meow

コミットの順番が並び替わっていて、このままエディタを閉じれば "fixup! some commit" の変更は "some commit" に合体して歴史がきれいに改変される。

おまけ

Git のコミットは :/<コミットメッセージの部分文字列> という指定の仕方もできるので、先ほどの例だと

git commit --fixup HEAD~1

の代わりに

git commit --fixup ':/some commit'

のような指定の仕方もできる。

2015-10-20 追記

git commit --fixup とは何か - 詩と創作・思索のひろば

commit --fixup は便利そうなんだけど、最近はコマンドラインから commit しないからなぁ…。magit で commit する時に手で「squash!」書いてる。magit でもできるんかな。autosquash は .gitconfig に書いておくと便利。

2015/10/20 08:29

なるほど! rebase.autosquash を true にしておくと、git rebase -i 時に自動で --autosquash されるんですね。

git config --global rebase.autosquash true

Electron で AdSense のレポートをメニューバーから確認できるアプリを書いた

ぼくはその日を善く生きたかどうかは AdSense の収益で決まると思っているので、以前にも AdSense のレポートを CLI で確認できるツール を書き、この記事にもあるように tmux のステータスバーに収益を表示していつでも確認できるようにカスタマイズしている。これは具合がよくてずっと使っていたのだけど、最近 tmux.conf をいじっていたらだんだん表示領域が手狭に感じられてきて、ターミナルから追い出したくなってしまった。くわえて、人にターミナルを見せると「ほうほう motemen さんの今月の収益は 9 円ですか……」といらぬ情報を人に与えてしまう問題もあり、ここはひとつ最近はやりの Electron を使ってメニューバーに表示してしまおうということしたのだ。

使用イメージはこちら。ここ7日分の収益を、日別に集計してメニューに表示している。アイコンの隣の数字はその合計(数字はサンプル)。

f:id:motemen:20151006193354p:plain

インストール方法

バイナリ配布をおこなっていないので、自前でビルドする必要がある。clone してきたリポジトリで

% npm install
% npm run setup-dev
% npm run compile
% npm run app

などとすればとりあえず起動できる。

64 ビット OSX 用の単独のアプリとして生成するには、npm run app のかわりに

% npm run dist

とする。それ以外のプラットフォームについても、package.json を編集すれば生成できるはず。

使用方法

起動するとメニューバー(やタスクバー)にアイコンが表示されるはず。アイコンをクリックして表示されるメニューから「Authorize…」を選択するとウィンドウが開き、また、普段つかっているブラウザでも Google の認証フローが開くはず。このフローの最後に表示されるコードを先ほどのウィンドウに入力すると認証完了。

スクリーンショットにもあるとおり、メニューからは期間、メトリック、ディメンションの3つが設定できる:

  • 期間: 今日、7日間、1ヶ月間
  • ディメンション: 日付、広告ユニット
  • メトリック: 収益、クリック数、ページビュー

これらを切り替えることで、メニューに表示されるレポートを使いやすいようにカスタマイズできる。どうぞご利用ください。

自分は今日の収益を広告ユニットごとに眺めるようにしている。今日も 0 JPY だ。


gulpfile.js を書きだすといつもそっちのほうに熱中してしまってぜんぜん本体が書き進まないので、今回は素の npm でさっさと実装してしまうことにした。Electron を使ったらほんとに一晩でネイティブの GUI アプリが作れてしまった。メニューバーのアイコンも標準パッケージでできた、すごい。高校生のころには無料の Delphi を使ってせっせと Windows アプリを作っていたことを思い出した。いい時代だというほかない。

今回アイコンは iconmonstr のものを使用した。

ISUCON5 予選通過したが若手に負けました #isucon

表題のとおり、ISUCON5 予選日曜の部にチーム「2nd party cookies」として参加し、17609点の総合10位で本選出場となりました(http://isucon.net/archives/45532743.html)。

それは良かったのだけど、実はうれしさも8割引きで、というのも同日に参加し3位で通過した「はむちゃん」、ここに勝つことが第一の目標だったからなのでした。はむちゃんははてな社内の若手エンジニアで組んだチームで、真っ先に ISUCON への参加表明をしていたので、それに触発されるかたちで自分も参加を決めた経緯があります。id:wtatsuru とともに、チーフエンジニア3人のチームでガチンコ勝負しようぜ! って言ってたら @Songmu さんがうらぎ先約のあったらしく、代わりというわけではないが、ISUCON はインフラ見られる人が2人はいるなという目論見の下、インフラもアプリもできる最高の人材 id:ichirin2501 に声をかけてチーム結成となりました。

やったこと

言語には Perl を使用。去年までの経験から、計測・計画せずに手を動かしはじめるのはキケンだと分かっていたので、開始1時間までにもろもろの環境を作ったら手を止めてアプリを見よう、と決めていて、ちゃんとその通りにできたのでえらい(小並感)。Devel::NYTProf を仕込む準備もしていたけれど、どうやら今回はクエリ改善が主だなということで出番はなく、終盤一度だけ使ったけど、収穫も特になし。予想していたよりアプリの規模が大きくて戸惑ったけど、その分やりがいがあって楽しかった。

方針は普通の改善をしていこう、ということであまり既存の実装から大きく変えることはせずに、pt-query-digest の結果とアクセス分布から重い所をひとつひとつ真面目につぶしていった。

役割分担は自分がアプリで、wtatsuru インフラ全般、ichirin2501 クエリ周りとアプリ、あと時々ぼくが適当な策を言うのをシラッとした目で見るというのをやってもらった。インフラはたつる先生に守られてるという安心感があり、いちりんちゃんは両方と話ができるのでつよい。チーム名は「もてめん」+「だぶるたつる」+「いちりんちゃん」で「もてるたつるちゃん」にしたかったけど却下されました。

  • comments に entries.user_id を持たせる
    • バッチを Perl で書いたらやたら時間かかってしまってよくなかった。要復習
  • users をメモリにキャッシュ
  • relations は one だけで引く
  • relations は一度に引く
  • トップのために 1000 件引いているのをキャッシュ
    • ここだけ memcached を使用
    • スコアは上がったが改善としては良くなかった

などなど。手を付けられなかったのが

  • footprints
    • どうしようかなー、と考えあぐねてたら手付かずになってしまった。終盤で初期データを覗いてみたら created_at が同じ日であるものが数件しかなかったので、うまいことクエリを直せそうだったが果たせず
  • UNIX ドメインソケットによる通信
    • 終盤、そろそろやるか、といってアプリと nginx、MySQL 間を UNIX ソケットに変更したがスコアが微減したので戻してしまった。ここはよく分かってないので復習

感想

予選から解きごたえのある問題で楽しかったし、ベンチマークツールが安定していて待ち時間もほぼなく、ストレスなく問題に取りかかれました。終盤のキューが捌ける速度がすごかった。運営のみなさんありがとうございました! 本選でもお世話になります!

それにしても若手に負けたのがショック。今回はアプリエンジニアの力量で負けたな、という感じなので気分はシオシオのパーです。今日は震えながら出社してます……。

はてなで一緒に働きませんか?