読者です 読者をやめる 読者になる 読者になる

URL一覧に全部アクセスしてHTTPステータスコードを付けるやつ作った

名前はballad。厨二ネームだ。

github.com

READMEにあるように、こんな感じのことができる。

$ cat data.txt
https://www.google.co.jp/
https://www.google.co.jp/a
https://www.google.co.jp/b

$ cat data.txt | ballad
200 https://www.google.co.jp/
301 https://www.google.co.jp/a
404 https://www.google.co.jp/b

$ cat data.txt | ballad | grep 200 | awk '{print $2}'
https://www.google.co.jp/

URL一覧を標準入力に与えると、全部にアクセスして、レスポンスコードをくっつけて標準出力に返してくれる。

平行でリクエストしてくれるので、上からひとつひとつアクセスするより速い。

これでS3にファイルがあるのかどうか調べたりできる。

元々は仕事上でスクリプトを書いていただけだったけど、直前に読んだ「UNIXという考え方」を思いだした。

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

S3オブジェクトにアクセスして、もし無かったらDBからデータを引いて、このWebAPIを叩いて……。 とスクリプトを書こうとしたけど、

UNIXという考え方にのっとって、小さなプログラムに分けたらどうだろう?』

『インターネットのgrep……、というか、URL一覧を食わせたらアクセスが成功したやつだけ返すプログラムがあったら?』

『オプションでアクセスが失敗したやつにスイッチできるとしたら?ちょうどgrepの-vのように。』

UNIXの考え方にそうなら、grepのことはgrepにまかせて、いっそ全てのURLにレスポンスコードをくっつけてあとでパイプからgrepすればいいのでは?』

と考えてひらめいたのがこのツール

僕はこれで10万件ぐらいのS3オブジェクトのURLを生成する簡単なスクリプトを書いて、パイプでballadに渡して、grepして、整形して、でS3オブジェクトがないurl一覧を作った。

ruby gen_url.rb | ballad | egrep -v "^200" | awk '{print $2}' | tee missing_objects.txt

あんまりこんな使い方をすることはないと思うけど、いざというときのお供に便利。

ついでにgolangに挑戦してみたけどかなりコードが汚いのが分かる。。。

go installがよくわからないし、いい感じに書く環境用に配布する方法もわからない。

その辺りを今後の課題としつつメンテナンスしていきたい。

golangだとバイナリを作れるので、Rubyの環境なんか無い!rubygems入れたりとか面倒!という場合でも使える。

実は最初にRubyでつくってからgolang版を開発しだしたので、 その名残でRuby版もある。 ( https://github.com/ksss/ballad-ruby ) gemにしておいたのでRuby派のかたはgem install balladでどうぞ。balladコマンドが使えるようになる。

balladは最近聞いているtoeの新譜から命名した ;)