2015/12/03

俺のワンライナー改め CLI ツール群のステマ

[perl] [cli]

このエントリーは Perl 5 Advent Calender 2015 の3日目の記事です。

まだワンライナーで消耗してるの?

Perl で書くワンライナーが便利というのはもうさんざん語られている気がするし自明だろうて、このたびはコマンドラインインターフェースで便利なツール群をドヤ顔でステマしたいと思います。怠惰ゆえ、もうワンライナー書くのも面倒になったらコマンドにしてしまえこのやろう、というノリですぜ、おとっつあん。

手前みそですが、できる限り便利そうなやつをピックアップするので、ひとつお付き合いください。ペコリ。

swoop

まずは Statistics::Swoop をインストールすると付いてくる swoop コマンド。これは、ログのあるカラムの合計、最大、最小、レンジ、平均をさくっと算出してくれるコマンド。

$ cat log_file | swoop -f3 -d,
.--------------------------------------------.
|   | elem | sum  | max | min | range | avg  |
+---+------+------+-----+-----+-------+------+
| 3 |   10 |   55 |  10 |   1 |     9 |  5.5 |
'---+------+------+-----+-----+-------+------'

オプションは cut コマンドと同じ感じ。

yg

次は App::YG に付いてくる yg コマンド。これは MySQL の \G のごとく、ログファイルをバーティカル表示できるようにしてやろうというコマンド。2012 年の perl advent calender でも書いたことがある。

$ yg apache_log
******************** 1 ********************
     Host: 127.0.0.1
    Ident: -
 Authuser: -
     Date: 30/Sep/2015:12:34:56 +0900
  Request: GET /foo HTTP/1.0
   Status: 200
    Bytes: 123
  Referer: http://example.com/foo
UserAgent: Mozilla/5.0

おっさんの目にも優しい感じで、LTSV ファイルもいける。

$ yg --ltsv path/to/ltsv
******************** 1 ********************
  time: 08/Feb/2015
  host: 192.168.0.1
   req: GET / HTTP/1.1
status: 200

pipe で受け取ることもできる。

$ cat path/to/ltsv | yg --ltsv 
******************** 1 ********************
  time: 08/Feb/2015
  host: 192.168.0.1
   req: GET / HTTP/1.1
status: 200

from_unixtime

つづきましては App::FromUnixtimefrom_unixtime。これは、標準出力に含まれる unixtime っぽいものにヒューマンリーダブルな日付を差し込んでくれる。

$ cat sql_result
id    1
value         1419702037
created_at    1419702037
updated_at    1419702037

$ cat sql_result | from_unixtime
id    1
value         1419702037
created_at    1419702037(Sun, 28 Dec 2014 02:40:37 +0900)
updated_at    1419702037(Sun, 28 Dec 2014 02:40:37 +0900)

unixtimeまみれの人におすすめ!

randf

App::Randfrandf は、ものすごい流量のログを一定確率でフィルタして目grepに耐えるようにできるやつ。元ネタは YAPC::Asia 2015 の Perlワンライナー入門 で語られていたのをコマンドに落とし込んでみた次第。

$ tail -f high_flow_log | randf 10

これで 1/10 ログになる。滝のように流れるエラーログとかからだに良くないですからね。

edumper

Data::Dumper を利用してデバッグ出力することは多いと思うのですが、マルチバイトな文字列が Perl の内部表現でエスケープされて読めない悲しみを味わっていることも多いと思われます。そうした事態に対処する Data::Dumper::AutoEncode というモジュールがあり、同梱されている edumper は CLI で使えます。

ふつうに Data::Dumper でエスケープされたマルチバイト

$ perl hoge.pl
$VAR1 = {
          "\x{7d05}\x{767d}" => "\x{6b4c}\x{5408}\x{6226}"
        };

上のように読めないのを edumper に渡すと、

$ perl hoge.pl | edumper
$VAR1 = {
          "紅白" => "歌合戦"
        };

乃木坂46!!!

piano_chord

最後は Text::Chord::Piano に同梱されている piano_chord です。いっしょうけんめいコーディングをしているとき、ふとした瞬間に「ピアノで C#augM7 ってどうおさえるんだっけ?」 と疑問に思い始めることってありますよね? そんなとき、めっぽう役立つコマンドです。

$ piano_chord C#augM7
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  |*| | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  |_| |_|  |  |_| |_| |_|  |  |_| |_|  |  |_| |_| |_|  |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|   |   |   | * |   | * |   | * |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
C#augM7

No Music, No Code.

CLI コマンドの勘所

さて、ここまでステマでやってきましたが、いかがだったでしょうか。ワンライナーもいいけど、小さなコマンドラインツールを揃えておくのも再利用性の面で Good です。そういうわけで、ここからは、私が CLI ツールを書くのに利用している便利すぎるモジュールをいくつかあげてみます。ここからはステマではありませんYO!

Getopt::Long & Pod::Usage

Getopt::Long はいわずと知れたコマンドラインオプションをパーズしてくれるデファクト。Pod::Usage は Pod にかかれたマニュアルを、使い方として表示するためのモジュール。この二つは CLIツールを書く上で必須ですね。

Config::CmdRC

コマンドラインツールの設定ファイルは .foorc という rc ファイルなるものに書くのが常だとおばあちゃんから習っていると思いますが、その rc ファイルを探索して読んでパースしてくれるのが Config::CmdRC です。

use Config::CmdRC '.foorc'

たったこれだけで、. $ENV{CMDRC_DIR} $ENV{HOME} /etc を順に探索して .foorc ファイルを読んで RC() という関数で参照できるようになる。

IO::Interactive::Tiny

IO::Interactive::Tiny を使うと、標準入力を受けているかどうか判別できる。

$ some_cmd FILE

ってのと

$ cat FILE | some_cmd

を判別できる。

use IO::Interactive::Tiny;

if ( IO::Interactive::Tiny::is_interactive(*STDIN) ) {
    ## なんかする
}
else {
    while ( my $line = <STDIN> ) {
        ## $line なんかする
    }
}

つまり、-t STDIN だよ。テヘペロ。

App::FatPacker::Simple

App::FatPacker::Simplefatpack-simple は、コマンドの依存関係をまとめて 1ファイルにしてくれる。依存のすべてが Pure Perl (非XS) という縛りがでるが、依存モジュールをインストールしないと使えないというマイナス面をなくしてくれる。cpan コマンドでモジュールを入れることができなくても、fatpack されたファイルをもってくれば利用できるようになる。

ちなみに、fatpack したファイルはモジュールのディストリビューションの最上位に配置して MANIFEST には含めず github あたりから raw コード落としてもらう、というのがよさげ。

まとめ

ワンライナーもいいけど、CLI で役立つツール書くのもおすすめ!

以上、俺のワンライナー改め CLI ツール群のステマ(一部除く)でした!

明日は @fujiwara さんです!

Perl 5 Advent Calendar 2015 はまだまだ参加者募集中!!

サイト内検索