Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

A Tour of Goをやった

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Go完全に忘れた

Slide 10

Slide 10 text

だれもお前を愛さない

Slide 11

Slide 11 text

こうならないために

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

18 実装したい機能と対応するライブラリ 1. コマンドライン引数を解析して → urfave/cli 2. 対応する⾔語のWikipediaからスクレイピング → PuerkitoBio/goquery 3. ターミナルに出⼒ → fatih/color (archived) → logrusorgru/aurora

Slide 19

Slide 19 text

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ツールを作れる

Slide 20

Slide 20 text

20 サブコマンドの追加 app.Commands = []cli.Command{ { Name: "set", Usage: "Save config to $HOME/.trivia/config.json", Action: setConfig, Flags: flags, }, } urfave/cli サブコマンドもほとんど同じ⽂法で追加できる

Slide 21

Slide 21 text

21 コンフィグファイルの読み込み urfave/cli/altsrc を利⽤できる しかし、 • コンフィグの読み込みしかできない • ファイル名をコマンドライン引数で与える必要あり • ファイル名を与えない場合、ちょっと汚い書き⽅ なので、⾃分で書くのが良さそう

Slide 22

Slide 22 text

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" でいけました

Slide 23

Slide 23 text

23 ターミナルのデコレーション

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

26 その他必要になったライブラリ • fmt • encoding/json • io/ioutil • os • mitchellh/go-homedir • ホームディレクトリを取得

Slide 27

Slide 27 text

おわりに 感想とか

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

29 まとめるよ! まとめ • cli + goquery + auroraで簡単CLIツールを作ってみた • 最初のハードルはめっちゃ低い! みんなGoやろう! • ⽂法簡単 • ツールが独⽴していてエディタ依存性も低い • 関数にデフォルト引数ほしくないですか? Future Work • A Tour of Goのgoroutine以降をやる • 友⼈をGoの道に引きずり込む

Slide 30

Slide 30 text

アイコンとか画像とかの出典 表紙の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