天色グラフィティ

技術ちっくなことを書きます

Golangでどうでもいい知識を教えてくれるCLIツールを作った

f:id:ejinote:20181006195046p:plain

最近ghqの作者@motemenさんのインタビューpecoの作者@lestrratさんのインタビューを読んでいてCLIツールを作りたい欲がむらむらと湧いていました。

@motemenさんのインタビューによると、普段から「これ不便だな。ツールにならないかな」とアンテナを貼っていることがツール作成においては大事だそうです。これを読んで僕もアンテナ高くしようと思った次第なのですが、思ってすぐに役に立つツールのアイデアが湧いてきたら苦労しないわけでして。

今回はCLIツールを作る練習として、「そんなに役には立たないけど、面白い」みたいなツールを作ってみました。 成果物はこちらです。

github.com

trivia コマンドを打つとWikipediaからランダムに単語を引っ張ってきて説明をしてくれます。日本語版Wikipediaを検索してるのにカウ高校とパハラ小学校(ハワイの学校)とか出てきて結構面白いです。

使う言語は勉強も兼ねてGolangを選択しました。 go get で簡単にインストールできるので配布もしやすいですし、何より書いててちょっと楽しいです。

インストールは

$ go get -u github.com/amaotone/trivia

でOKです。デフォルトの言語設定が(ちょっとイキった結果)英語になっているので、

$ trivia set -l ja

で日本語に変えて

$ trivia

でどうでもいい知識を教えてくれます。

技術的な話

言語はGolangを選択しました。

使ったライブラリを列挙すると、

です。処理の流れとしては

  1. cliコマンドライン引数を解析
    • オプションで言語設定があればそれを採用
    • なかったらgo-homedirを使ってコンフィグファイルを読みに行く
  2. goqueryでWikipediaスクレイピング
    • http://ja.wikipedia.org/wiki/Special:Randompage にアクセスすると日本語版Wikipediaのランダムなページを表示してくれる
    • jaの部分を他の言語に置き換えるとその言語のランダムなページを表示する
    • 見出しと最初の1段落を取得する
  3. colorで見出しは太く表示する

という感じです。

Golangに関する僕の習熟度はA tour of Goをなぞっただけで何も書いたことはない、という状態でした。そこから始めて1日で完成、という感じです。 後で紹介する方々のコードを読んで真似するだけで一通り書けるので、本当に学習コストが低いと思います。

参考になった資料とかコードとか

まずはきっかけになった2つのインタビュー。 エンジニアとしてのモチベーションが上がるいい内容だと思います。

CLIツール作るぞ!と思って最初に読んだスライド。いきなり作り始めないでちゃんとREADME駆動開発しろ、とか人のコード読め、とか大変参考になりました。

読んで真似したリポジトリ群。ほとんど@syossan27さんのtorisetsuを参考にしています。

まとめ

プログラミングの練習がしたい! どうせだから役に立つツールを作ろう! なんて考えてる昔の僕みたいな欲張り人間は今すぐその考えを捨てましょう

「役に立つツール」を目指すのではなくて「今自分が困ってる何かを解消するツール」を作ることを目指すのが良いツール作成の第一歩ではないでしょうか。 僕みたいに「プログラミングの練習がしたい」みたいな発想の人はいっそのこと「全然役に立たないツール」を目指すと逆に面白いものができるかもしれません。

で、運良くなにか思いついた人はGolangでシュッと作っちゃいましょう。簡単ですよ。怖くないですよ。

面白いものができたらTwitterかなにかで教えてください。では。