Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goで作るTUIツール / Building TUI Tools with Go
Search
shiro seike
PRO
June 10, 2021
Programming
3
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goで作るTUIツール / Building TUI Tools with Go
Go で TUI(ターミナルUI)ツールを作る方法を紹介した資料です。
shiro seike
PRO
June 10, 2021
More Decks by shiro seike
See All by shiro seike
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
95
Seeing Through Serverless: ADOT と CloudWatch Application Signals で実現する AWS Lambda のオブザーバビリティ(日本語版)/ Seeing Through Serverless (Japanese Edition)
seike460
PRO
1
10
モノレポの型は、そのままつながる 〜Hono RPCで型を素通しする開発体験〜 / Monorepo Types Connect As-Is: Passing Types Through with Hono RPC
seike460
PRO
1
9
OSSのコンセプトを知る / Understanding the Concept Behind an OSS
seike460
PRO
1
8
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
610
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
440
実行委員長目線で振り返る JAWS DAYS 2026 / JAWS DAYS 2026 from the Chair's Perspective
seike460
PRO
1
13
SLO から始める SRE / Starting SRE with SLO
seike460
PRO
1
86
Architecture as SteeringOn-Ramp to AI-DLC
seike460
PRO
0
50
Other Decks in Programming
See All in Programming
リアルな遅延を測る仕様
kota_yata
1
130
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
130
AIの中の人になってみる
htkym
0
150
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
550
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
750
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
120
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
130
[DroidKaigi 26] How We Moved from Android Studio to Slack
thisaay
0
150
FDEとは、何者なのか?
masapyon1212
0
110
プロポーザルを書いてもらう
pvcresin
0
600
Go 1.27 における memory allocation の高速化
andpad
0
370
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
670
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
680
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
270
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Chasing Engaging Ingredients in Design
codingconduct
0
290
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
300
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
510
KATA
mclloyd
PRO
35
15k
Ethics towards AI in product and experience design
skipperchong
2
360
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
320
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Transcript
Goで作るTUIツール Fukuoka.go #16 2020.07.14 清家 史郎 1
自己紹介 - ID - - Work at - - 清家
史郎 seike460 Github:seike460 Twitter:@seike460 株式会社 Fusic (フュージック) 技術開発本部/技術開発第一部門 ▪ エバンジェリスト ▪ チームリーダー ▪ プリンシパルエンジニア Skill - PHP Go AWS 2
TUI
TUIとは テキストベースのユーザインタフェース - グラフィカルユーザインタフェース (GUI) が考案された後に名づけられた レトロニムであり、テキストベースのユーザインタフェースを区別して 呼ぶための名称である(Wikipediaより転載) - Terminalから出たくない族からすると非常にありがたいインターフェース
- git - lazygit top - htop Docker - dry 4
tview GoでTUIを作るぞ!
github.com/mattn/go-pipeline #mercarigo「プログラミング言語Go完全入門 質問会 2020.6.3」に参加 「tviewを使ってみたくてTODOツールを作った話」@bluemon0919さん - - いい感じのTUIを簡単に作れるツールをご紹介 - 試してみた所、非常に手軽に使えそうだった
- 二番煎じではあるけど、かなりいい感じだったので改めて紹介したい tview - terminal based user interfaces 6
利用イメージ AWS Service 利用するサービス Target 処理対象バケット Objects バケット内のファイル 左で選択されたもので 次の選択肢を表示していく
7
画面構成部分のコード 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
項目追加とクリックイベント 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
github.com/rivo/tview - 大変な画面調整をいい感じにコントロールしてくれる - 各種イベントに応じて実行する関数を簡単に割り当てれる - - 実際の処理を書くのも簡単 モーダル、ボタン、テキスト入力などの機能も有するので 高機能なTUIが簡単に提供出来る
- - UI部品はこのサンプルで確認する事が出来ます 「何かを作ってみよう」の受け皿になってくれる サンプルコードレベルですが公開しております github.com/seike460/caws 10
余談 - Goの社内勉強会を初心者向けにやってみた - Welcome to a tour of Go
- プログラミング言語Go完全入門 - 上記をひたすら読み物として読むだけだとモチベーションの低下が見られた - 最初は手を動かしながら学ぶのが良さそう! - tview使って簡単なツールを作るのいかがでしょうか!!(こじつけ) 11
Thank You ご清聴いただきありがとうございました We are Hiring ! https://recruit.fusic.co.jp/