Stats of the Rivers

川の様子を見に行ってます。

glitch(1) - グリッチのためのコマンドラインツール

土日に開発合宿に行ったので、その際に glitch(1) というのを作った。

何これ

例によってグリッチのためのツールなのだが、 golang 製のコマンドラインツールとして作られている。

golang がインストールされている端末では、最短2個のコマンドを叩くだけでグリッチ画像が作成できる。 (とはいえ、sed s/a/b/g photo.jpg > output.jpg とかすると1コマンドでグリッチできるので、実は別段優れているわけではない)

今のところ sed glitch と repeat glitch と自分が呼んでいる手法について実装してある。 JPEG 画像だとうまく壊れるが、他のフォーマットではまだあまりまじめに確認していない。

特に何も設定しなくてもそれなりの壊れ方をするようになっているけど、オプションをいくつか渡すことでその人好みの壊れ方をすることができる。

例えば、

$ glitch repeat -e 15 -b 200 -n 10 -o glitched.jpg /path/to/yourfile.jpg

は、データの前方 15% をヘッダとして無視した後、その次の200バイト分のバイト列を10回繰り返し書き込み、その後のデータを書き込んでから glitched.jpg というファイルに出力している。

今後も時間があればいろいろな手法を実装していきたい。

なぜ作ったのか

最近、 ghq とか peco のような golang 製のコマンドラインツールが流行っていて、自分でも必要が生じた際にサクッと作れるように作り方を把握しておきたかったのが一番の目的である。

あと、画像や動画を壊したりする仕事は、原則としてバイト列を操作することに終始するのだが、今のところそういうのがあまり得意じゃなさそうな Ruby とかで書いていて、もうちょっと向いていそうな言語を探しているというのもある。

開発について

あんまりスクラッチから golang を書いたことがなかったので、探り探りでやっていた。

ghq のコードとか読んだ時に見かけた cli.go というライブラリがコマンドラインパーサのデファクトスタンダードのようなのでこれを採用した。

tcnksm/cli-init という cli.go 用のコードを生成してくれるツールもあったので、これを使って雛形を作った上で、画像を壊すロジックをガシガシ書いていくだけだったので、かなり整っている印象だった。

バイト列操作には bytes パッケージに Repeat とか Replace のようなそのまんまな名前のメソッドがあって便利だった。

画像を壊すことに興味のある人々は golang でやるのがかなり効率的だと思った。

合宿について

  • 今回の開発合宿は勝どきのホテルの会議室でやったので、地下鉄で通えて便利だった。
  • 夜に mirakui さんが Podcast の収録をするということで、10人くらいでホテルの一室にこもって話を聴いていた。
  • 翌日の昼、昼食を取りに勝どき駅の辺りまで行ったけど、人通りはあるのに飲食店はまったく開いてなくてつらかった。この近隣の人々は休日は外食しないのだろうか。
  • 月島の方のもんじゃ焼き屋さんが開いていたので事無きを得た。

(合宿っぽい写真を貼っときますね)