Golangでどうでもいい知識を教えてくれるCLIツールを作った
最近ghqの作者@motemenさんのインタビューや pecoの作者@lestrratさんのインタビューを読んでいてCLIツールを作りたい欲がむらむらと湧いていました。
@motemenさんのインタビューによると、普段から「これ不便だな。ツールにならないかな」とアンテナを貼っていることがツール作成においては大事だそうです。これを読んで僕もアンテナ高くしようと思った次第なのですが、思ってすぐに役に立つツールのアイデアが湧いてきたら苦労しないわけでして。
今回はCLIツールを作る練習として、「そんなに役には立たないけど、面白い」みたいなツールを作ってみました。 成果物はこちらです。
trivia
コマンドを打つとWikipediaからランダムに単語を引っ張ってきて説明をしてくれます。日本語版Wikipediaを検索してるのにカウ高校とパハラ小学校(ハワイの学校)とか出てきて結構面白いです。
使う言語は勉強も兼ねてGolangを選択しました。
go get
で簡単にインストールできるので配布もしやすいですし、何より書いててちょっと楽しいです。
インストールは
$ go get -u github.com/amaotone/trivia
でOKです。デフォルトの言語設定が(ちょっとイキった結果)英語になっているので、
$ trivia set -l ja
で日本語に変えて
$ trivia
でどうでもいい知識を教えてくれます。
技術的な話
言語はGolangを選択しました。
使ったライブラリを列挙すると、
- コマンドラインパーサー: https://github.com/urfave/cli
- Wikipediaスクレイピング: https://github.com/PuerkitoBio/goquery
- ターミナル出力: https://github.com/fatih/color
- ホームディレクトリ検出: https://github.com/mitchellh/go-homedir
です。処理の流れとしては
- cliでコマンドライン引数を解析
- オプションで言語設定があればそれを採用
- なかったらgo-homedirを使ってコンフィグファイルを読みに行く
- goqueryでWikipediaをスクレイピング
- http://ja.wikipedia.org/wiki/Special:Randompage にアクセスすると日本語版Wikipediaのランダムなページを表示してくれる
- jaの部分を他の言語に置き換えるとその言語のランダムなページを表示する
- 見出しと最初の1段落を取得する
- colorで見出しは太く表示する
という感じです。
Golangに関する僕の習熟度はA tour of Goをなぞっただけで何も書いたことはない、という状態でした。そこから始めて1日で完成、という感じです。 後で紹介する方々のコードを読んで真似するだけで一通り書けるので、本当に学習コストが低いと思います。
参考になった資料とかコードとか
まずはきっかけになった2つのインタビュー。 エンジニアとしてのモチベーションが上がるいい内容だと思います。
- 試したいから、作る。ghq、goreの作者motemenの開発は「自分本位」で駆動する - エンジニアHub|若手Webエンジニアのキャリアを考える!
- スター数4200超! 人気リポジトリ『peco』 開発者(@lestrrat)が語る「使われるOSS」の作り方 - エンジニアHub|若手Webエンジニアのキャリアを考える!
CLIツール作るぞ!と思って最初に読んだスライド。いきなり作り始めないでちゃんとREADME駆動開発しろ、とか人のコード読め、とか大変参考になりました。
読んで真似したリポジトリ群。ほとんど@syossan27さんのtorisetsuを参考にしています。
- GitHub - syossan27/torisetsu: Torisetsu - Add README.md Template.
- GitHub - syossan27/kirimori: Tool for managing vim plugin.
- @mattnさんのリポジトリ群
まとめ
プログラミングの練習がしたい! どうせだから役に立つツールを作ろう! なんて考えてる昔の僕みたいな欲張り人間は今すぐその考えを捨てましょう
「役に立つツール」を目指すのではなくて「今自分が困ってる何かを解消するツール」を作ることを目指すのが良いツール作成の第一歩ではないでしょうか。 僕みたいに「プログラミングの練習がしたい」みたいな発想の人はいっそのこと「全然役に立たないツール」を目指すと逆に面白いものができるかもしれません。
で、運良くなにか思いついた人はGolangでシュッと作っちゃいましょう。簡単ですよ。怖くないですよ。
面白いものができたらTwitterかなにかで教えてください。では。