Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go初心者でもCLIツールを作った話をLTしたい! / golang-beginner-cli-tool

70ae2d149767d4198aac83453481b8dd?s=47 Amane Suzuki
October 19, 2018

Go初心者でもCLIツールを作った話をLTしたい! / golang-beginner-cli-tool

Go初心者が全く役に立たないCLIツールを作って勉強会でLTするまでの道筋です。

言語を勉強するときに大事なのは「本当に何でも良いから」アウトプットすることです。 勉強会駆動開発やっていきましょう。

70ae2d149767d4198aac83453481b8dd?s=128

Amane Suzuki

October 19, 2018
Tweet

Transcript

  1. Go初⼼者 でも CLIツール を作った話を LT したい! Go(un)conference 4kg Amane Suzuki

  2. 鈴⽊ 天⾳ ⾔語 趣味 Kaggle, 競プロ, 競技かるた SakuEji amaotone

  3. このLTで伝えたいこと 1.初⼼者は忘れる前になにか作ろう 2.Goなら簡単にCLIツールを作れる 3.LTしよう!(僕がハードル下げるので)

  4. ⾔語初⼼者あるある 数週間前までの私です

  5. A Tour of Goをやった

  6. なにか作るぞ! 夢は⼤きく★5000や!

  7. 役に⽴ちそうなツール 思いつかない

  8. もうやだ…オフトゥンで寝よ…

  9. Go完全に忘れた

  10. だれもお前を愛さない

  11. こうならないために

  12. いっそのこと 役に⽴たないツールを作ろう

  13. 13 つくった Trivia Wikipediaからランダムに単語をひろって教えてくれる https://github.com/amaotone/trivia 今ならあなたが最初のstargazerになれます!

  14. デモ 怪しい単語が出ないかヒヤヒヤ

  15. 使ったもの 「これ使ったら?」「これは良くない」 があったら教えてください!

  16. 16 エディタ • プラグインは vim-go と deocomplete-go が良い • Vim以外だとVSCodeとかJetBrains系

  17. 17 開発環境 パッケージ管理 → golang/dep テスト → testing

  18. 18 実装したい機能と対応するライブラリ 1. コマンドライン引数を解析して → urfave/cli 2. 対応する⾔語のWikipediaからスクレイピング → PuerkitoBio/goquery

    3. ターミナルに出⼒ → fatih/color (archived) → logrusorgru/aurora
  19. app := cli.NewApp() app.Name = "Trivia" app.Usage = "Trivia makes

    your life richer." app.Version = "0.0.1" app.Action = showWord app.Flags = []cli.Flag { cli.StringFlag { Name: "lang, l", Usage: "Specify the language.", }, } app.Run(os.Args) 19 コマンドライン引数のパース urfave/cli Flagなどを指定すると簡単にCLIツールを作れる
  20. 20 サブコマンドの追加 app.Commands = []cli.Command{ { Name: "set", Usage: "Save

    config to $HOME/.trivia/config.json", Action: setConfig, Flags: flags, }, } urfave/cli サブコマンドもほとんど同じ⽂法で追加できる
  21. 21 コンフィグファイルの読み込み urfave/cli/altsrc を利⽤できる しかし、 • コンフィグの読み込みしかできない • ファイル名をコマンドライン引数で与える必要あり •

    ファイル名を与えない場合、ちょっと汚い書き⽅ なので、⾃分で書くのが良さそう
  22. 22 スクレイピング PuerkitoBio/goquery jQueryと似た⽂法で要素の指定が可能 doc, err := goquery.NewDocument(url) if err

    != nil { // error handling } title = doc.Find("#firstHeading").Text() lead = doc.Find("#mw-content-text > div > p").First().Text() 要素をスキップして指定するとうまくいかない? lead = doc.Find("#mw-content-text > p").First().Text() // doesn't work "#mw-content-text p" でいけました
  23. 23 ターミナルのデコレーション

  24. 24 ターミナルのデコレーション 10/10にアーカイブされたっぽいです……

  25. 25 ターミナルのデコレーション logrusorgru/aurora ⼿軽にターミナル出⼒を⾊付けしたりBoldしたりできる fmt.Println(Bold(strings.TrimSpace(title))) fmt.Println(strings.TrimSpace(lead))

  26. 26 その他必要になったライブラリ • fmt • encoding/json • io/ioutil • os

    • mitchellh/go-homedir • ホームディレクトリを取得
  27. おわりに 感想とか

  28. 28 勉強会駆動開発 実は、前回のgouncoも参加する予定だった (直前キャンセル, ごめんなさい) いつまでたっても本腰⼊れてGo勉強しないので LTすることにして退路を断った slideshare⾒ながら「⾏こうかなぁ……でもなぁ……」 って思ってる⼈には勉強会駆動開発しましょう!

  29. 29 まとめるよ! まとめ • cli + goquery + auroraで簡単CLIツールを作ってみた •

    最初のハードルはめっちゃ低い! みんなGoやろう! • ⽂法簡単 • ツールが独⽴していてエディタ依存性も低い • 関数にデフォルト引数ほしくないですか? Future Work • A Tour of Goのgoroutine以降をやる • 友⼈をGoの道に引きずり込む
  30. アイコンとか画像とかの出典 表紙のGopherくん The Go gopher was designed by Renee French.

    (http://reneefrench.blogspot.com/) The gopher stickers was made by Takuya Ueda (https://twitter.com/tenntenn). Licensed under the Creative Commons 3.0 Attributions license. https://github.com/tenntenn/gopher-stickers スライド中の絵 http://konpa.github.io/devicon/ https://github.com/hwkr/BitIcon https://www.kaoriya.net/blog/2013/12/06/ https://www.irasutoya.com/ https://twitter.com/molgh/status/726854917214879744