こんにちは、id:aerealです。普段はいま皆さんがご覧になっているHatena Developer Blogをホストしているはてなブログというサービスの開発に携わっております。
本日はそのはてなブログのコードで使われているオシャレなサーバ起動コードについてご紹介します。
はてなブログのローカル開発用のサーバ起動スクリプトは、タイトルにあるように“just epic”というコードを実行しています。
どうしてそんなことができるのでしょうか?
それでは実際にはてなブログの起動コードの一部をご覧ください:
just epic. 2011-2018;
まるで自然文のようですが歴としたPerlのコードです。
はてなブログはこのコードを実行するとローカルで起動するようになっています *1。
このコードをdeparseしてみます:
✘╹◡╹✘ < cat epicup just epic. 2011-2018; ✘╹◡╹✘ < perl -MO=Deparse ./epicup 'epic'->just . '2011' - 2018; ./epicup syntax OK
2011-2018
は減算で、 .
は文字列結合ということはぱっと見てわかりますが just epic
*2 *3 がちょっとややこしいですね。
これはindirect object notationと呼ばれて、 A B;
は B->A
と解釈されます。 print STDERR 'oops';
も STDERR->print('oops')
のindirect object notationなんですね。
refs. perlmod - perldoc.perl.org
このコード片は不完全で、実行可能な・そして実際に使われているコードの一部がこちらです:
#!/usr/bin/env perl use strict; use warnings; use utf8; no warnings qw(void); use Proclet; our $runner = Proclet->new(color => 1); just epic. 2011-2018; sub epic::just { delete $::{'epic::'}{just}; $main::runner->run; }
sub epic::just {}
は package epic; sub just {}
と等価なので、 just epic
で実行されるサブルーチンが定義されます。
main::
はパッケージを明示しなかった場合のデフォルトのパッケージ名で、 $main::runner
で our $runner
を参照できます。
このコードは、はてなブログ開発黎明期に id:motemen によってローカル起動用の便利スクリプトが追加された時からあるものです。
indirect object notationの実用的な例(?)として個人的に気に入っているコードです。
また西暦が入っていることから毎年年明けに更新しております。
もうすぐこのコードを2019に更新する季節ですね、はやいものです。
以上、優雅な起動コードをPerlで書くおはなしでした。この記事はPerl Advent Calendar 2018の23日目の記事としてお送りしました。
*1:本番では使われていません
*2:ちなみに1: epicははてなブログのリポジトリ名です Hatena blogdevelopmentflow
*3:ちなみに2: just epicの初出はこちらです: Tatsuhiko Miyagawa on Twitter: "Watched Madoka Magica ep3. This is epic. Just epic."