calコマンドで91days

cal-006

アニメ『91Days』(ナインティワンデイズ)
マフィアの闘争で両親と弟を失ってしまった主人公の復讐がハードボイルドで描かれます。91daysというタイトルからして、復讐が91日間なんでしょうね。6話ぐらいまで見ましたが、復讐劇というよりも、策を使ったマフィアの闘争が面白いです。復讐するべき人物とは友情が芽生えるのでしょうけど、人生を復讐に捧げた主人公は友情より復讐を選ぶのでしょうか、気になります。暴力シーンが多いのですが、先が気になるので、最終回まで視聴確定です。

calコマンドでカレンダーが表示できますが、タイトル画像のような、復讐用の91日カレンダーを作ってみたいと思います。復讐最終日は12月31日に設定します。

まずは、calコマンドの使い方を確認します。
calコマンドはオプションや引数なしで実行すると、今月のカレンダーを表示します。

~$ cal
~$ cal aug 2016
~$ cal 8 2016

今日が2016年8月なら、上3つのコマンドはすべて同じ結果が表示されます。
cal-001

3ヶ月分表示するなら、-3オプション。

~$ cal -3

cal-002

前後の月の表示数も指定することができます。

~$ cal -B1

cal-007
Bは、BeforeのB、AはAfterのAですね。

~$ cal -A3

cal-008

一年間を表示するなら取得したいカレンダーの年をそのまま指定します。

~$ cal  2016

cal-003

1月1日からの日数がほしい場合は、-jオプションを指定します。

~$ cal -j 2016

cal-004
(省略)
cal-005

さて、91daysカレンダーです。
復讐最終日を12月31日に設定しますので、その日を含め91日逆算して、復讐初日を算出します。

~$ date --date "20161231 90 days ago"
2016年 10月  2日 日曜日 00:00:00 JST
~$ 

算出した10月2日の、-j時の日付をさきほどのカレンダーから確認します。276でした。

cal -j 2016で表示される日付を置換するPerlスクリプトを作成しました。275としているのは、1から始めるためです。

~$ cat 91days.pl
open(FH,"cal -j 2016 |");
while(<FH>){
        unless(/月/){
                s/(\d+)/days($1)/ge;
        }
        print;
}
close(FH);

sub days{
        my($s) = @_;

        $ldays = $s - 275;
        if(($ldays < 1) or ($ldays > 91)){
                $s =~ s/./-/g;

        }else{
                $s = " " x ((length $s) - (length $ldays)). $ldays;
        }

        return $s;
}

結果は、タイトル画像のようになりますが、復讐用なので日常生活には役に立ちませんね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA