“just epic”と書くだけでサーバを起動する方法

こんにちは、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::runnerour $runner を参照できます。

このコードは、はてなブログ開発黎明期に id:motemen によってローカル起動用の便利スクリプトが追加された時からあるものです。
indirect object notationの実用的な例(?)として個人的に気に入っているコードです。

また西暦が入っていることから毎年年明けに更新しております。

f:id:aereal:20181221162757p:plain
毎年更新しております

もうすぐこのコードを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."