Slide 1

Slide 1 text

Goで作るTUIツール Fukuoka.go #16 2020.07.14 清家 史郎 1

Slide 2

Slide 2 text

自己紹介 - ID - - Work at - - 清家 史郎 seike460 Github:seike460 Twitter:@seike460 株式会社 Fusic (フュージック) 技術開発本部/技術開発第一部門 ■ エバンジェリスト ■ チームリーダー ■ プリンシパルエンジニア Skill - PHP Go AWS 2

Slide 3

Slide 3 text

TUI

Slide 4

Slide 4 text

TUIとは テキストベースのユーザインタフェース - グラフィカルユーザインタフェース (GUI) が考案された後に名づけられた レトロニムであり、テキストベースのユーザインタフェースを区別して 呼ぶための名称である(Wikipediaより転載) - Terminalから出たくない族からすると非常にありがたいインターフェース - git - lazygit top - htop Docker - dry 4

Slide 5

Slide 5 text

tview GoでTUIを作るぞ!

Slide 6

Slide 6 text

github.com/mattn/go-pipeline #mercarigo「プログラミング言語Go完全入門 質問会 2020.6.3」に参加 「tviewを使ってみたくてTODOツールを作った話」@bluemon0919さん - - いい感じのTUIを簡単に作れるツールをご紹介 - 試してみた所、非常に手軽に使えそうだった - 二番煎じではあるけど、かなりいい感じだったので改めて紹介したい tview - terminal based user interfaces 6

Slide 7

Slide 7 text

利用イメージ AWS Service 利用するサービス Target 処理対象バケット Objects バケット内のファイル 左で選択されたもので 次の選択肢を表示していく 7

Slide 8

Slide 8 text

画面構成部分のコード app := tview.NewApplication() serviceList := tview.NewList() ■一番左のリスト serviceList.SetTitle("- AWS Service -").SetBorder(true) ■タイトルとボーダーをつける bucketsList := tview.NewList() ■真ん中のリスト bucketsList.SetTitle("- Target -").SetBorder(true) objectList := tview.NewList() ■右のリスト objectList.SetTitle("- Objects -").SetBorder(true) flex := tview.NewFlex(). // FlexタイプのBox AddItem(serviceList, 20, 0, true). // 固定値20, 均等割合 0, Focusを当てる AddItem(bucketsList, 0, 1, false). // 固定値0 , 均等割合 1, Focusを当てない AddItem(objectList, 0, 2, false) // 固定値0 , 均等割合 2, Focusを当てない 8

Slide 9

Slide 9 text

項目追加とクリックイベント serviceList.AddItem(" S3 ", " Objects Storage ", 0, func() { Serviceリストに追加 ■主要テキスト、サブテキスト、ショートカット用rune、クリック時関数 s := awsservice.NewS3() ■ AWS接続のための構造体 buckets, _ := s.ListBuckets() ■ バケットの取得 bucketsList.Clear() ■ Listのクリア for _, val := range buckets.Buckets { bucketsList.AddItem(*val.Name, *buckets.Owner.DisplayName, 0, func() { bucketリストに追加 ■バケット名、オーナー、なし、クリック時関数 bucketFunc(objectList, bucketsList, s, app) // }) } app.SetFocus(bucketsList) ■ bucketリストにFocusを合わせる }) ----------------------------------------------func bucketFunc(objectList *tview.List, bucketsList *tview.List, s awsservice.S3, app *tview.Application) { objectList.Clear() // List クリア itemText, _ := bucketsList.GetItemText(bucketsList.GetCurrentItem()) ■選択されているバケットテキスト取得 objects, _ := s.ListObjects(itemText) ■バケット内ファイルを取得 for _, v := range objects.Contents { objectList.AddItem(*v.Key, v.LastModified.Format("2006/01/02 15:04:05"), 0, nil) ■Objectsリストに追加 } app.SetFocus(objectList) ■ ObjectsリストにFocusを合わせる } 9

Slide 10

Slide 10 text

github.com/rivo/tview - 大変な画面調整をいい感じにコントロールしてくれる - 各種イベントに応じて実行する関数を簡単に割り当てれる - - 実際の処理を書くのも簡単 モーダル、ボタン、テキスト入力などの機能も有するので 高機能なTUIが簡単に提供出来る - - UI部品はこのサンプルで確認する事が出来ます 「何かを作ってみよう」の受け皿になってくれる サンプルコードレベルですが公開しております github.com/seike460/caws 10

Slide 11

Slide 11 text

余談 - Goの社内勉強会を初心者向けにやってみた - Welcome to a tour of Go - プログラミング言語Go完全入門 - 上記をひたすら読み物として読むだけだとモチベーションの低下が見られた - 最初は手を動かしながら学ぶのが良さそう! - tview使って簡単なツールを作るのいかがでしょうか!!(こじつけ) 11

Slide 12

Slide 12 text

Thank You ご清聴いただきありがとうございました We are Hiring ! https://recruit.fusic.co.jp/