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

“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."
オリジナルのエンクロージャ:
20181221162757.png

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)