ターミナルにクリスマスツリー

全然季節外れだけど。
今日@さんのTweet

を見て初めてnpmコマンドに隠しサブコマンドがあることを知った。npm xmasと打つとクリスマスツリーが出るのね。

こんなかんじ。
https://github.com/isaacs/npm/blob/master/lib/xmas.js
ソース見てもよく分からなかったのでPerlで書き直してみた。

#!/usr/bin/env perl
use strict;
use warnings;
use Encode 'encode_utf8';

my $s = ' ' . encode_utf8(pack 'U', 0x2605);
my $f = encode_utf8(pack 'U', 0xFF0F);
my $b = encode_utf8(pack 'U', 0xFF3C);
my $o = [ map { encode_utf8(pack 'U', $_) } (
    0x0069, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
    0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
    0x0020, 0x2E1B, 0x2042, 0x2E2E, 0x0026, 0x0040, 0xFF61,
) ];
my $oc = [ 21, 33, 34, 35, 36, 37 ];
my $l  = pack 'U', 0x005e;

sub tree {
    my ($H) = @_;

    print("\n");
    print(" " x $H);
    print("\033[33m" . $s . "\n");
    my $M = $H * 2 - 1;
    for my $L (1 .. $H) {
        my $O = $L * 2 - 2;
        my $S = ($M - $O) / 2 + 1;
        print(" " x $S);
        print("\033[32m" . $f);
        for (1 .. $O) {
            print("\033[" . $oc->[ int(rand @$oc) ] . "m" . $o->[ int(rand @$o) ]);
        }
        print("\033[32m" . $b . "\n");
    }
    print(" ");
    print("\033[32m" . $l) for 1 .. $H - 1;
    print("|  |");
    print("\033[32m" . $l) for 1 .. $H - 1;
    if ($H > 10) {
        print("\n ");
        print(" ") for 1 .. $H - 1;
        print("|  |");
        print(" ") for 1 .. $H - 1;
    }
    print("\n\n");
}

tree(20);

https://gist.github.com/1011836
なんてことはなく、for文で回して木の形を作りつつランダムな文字をオーナメントとしてランダムな色にして配置しているだけだった。でもキレイで面白い。