1
1
= GUIライブラリGioで遊んでみよう
2
2
3
- 2019 年7 月に開催されたGopherCon 2019 @<fn>{knsh14_gophercon_link}で新しいGoのGUIライブラリが発表されました 。
3
+ 2019 年7 月に開催されたGopherCon 2019 @<fn>{knsh14_gophercon_link}でGioという新しいGoのGUIライブラリが発表されました 。
4
4
これまでGoの苦手な分野としてGUIを持ったアプリケーションが開発しづらいという点が挙げられていましたが、これを解決する可能性を秘めたライブラリです。
5
5
6
6
7
- // footnote[knsh14_gophercon_link][https://www.gophercon.com/]
7
+ // footnote[knsh14_gophercon_link][@<href>{ https://www.gophercon.com/} ]
8
8
9
9
== Gioの概要
10
10
Gio@<fn>{knsh14_gioui_link}はGo製のGUIライブラリです。
@@ -14,13 +14,13 @@ Gio@<fn>{knsh14_gioui_link}はGo製のGUIライブラリです。
14
14
Gioはまだv1.0.0 がリリースされておらず、今でも大きな変更があります。
15
15
2019 年9 月2 日執筆時点でのバージョン@<fn>{knsh14_gio_version}を正式なものとして扱います。
16
16
17
- // footnote[knsh14_gioui_link][https://gioui.org]
18
- // footnote[knsh14_gio_version][https://git.sr.ht/~eliasnaur/gio/commit/dc62058bcefc51bd138d12668bba5a11dfed3e3f]
17
+ // footnote[knsh14_gioui_link][@<href>{ https://gioui.org} ]
18
+ // footnote[knsh14_gio_version][@<href>{ https://git.sr.ht/~eliasnaur/gio/commit/dc62058bcefc51bd138d12668bba5a11dfed3e3f} ]
19
19
20
20
=== 特徴
21
21
大きな特徴として私達が書くアプリケーションのコードをすべてGoで書ける点にあります。
22
22
さらに、Goそのものの特徴であるクロスプラットフォームにも対応しています。
23
- 対応しているプラットフォームはiOS、AndroidはもちろんtvOSやWebGLなどにも出力できます 。
23
+ 対応しているプラットフォームはmacOSやWindowsなどのデスクトップ、iOS、Androidのスマートフォン、さらにtvOSやWebGLなどにも出力できます 。
24
24
25
25
=== インストール方法
26
26
インストール方法は一般的なGoのライブラリと同じ方法でインストールできます。
@@ -49,7 +49,7 @@ $ goexec 'http.ListenAndServe(":8080", http.FileServer(http.Dir("APP")))'
49
49
ビルドするためのコマンドが@<code>{gio}ではなく、@<code>{go run gioui.org /cmd/gio}なのはgioという別のコマンドがmacOSではデフォルトで入っているからです。
50
50
iOS向けやAndroid向けのビルドコマンドで生成されたバイナリは各ツールでさらに端末にインストールできます。
51
51
52
- == Gioで遊んで見る
52
+ == Gioで遊んでみる
53
53
実際のコードを動かして、Gioがどのような機能を持っているか紹介します。
54
54
これから紹介するコードは、Go Playgroundで動かすことはできません。
55
55
ローカルで@<code>{go run}コマンドを利用して動かしてください。
@@ -82,7 +82,7 @@ func main() {
82
82
ウィンドウに画像や文字を出したり、キーの入力を受けたりする処理は別の@<code>{goroutine}で実行する必要があります。
83
83
84
84
=== Hello World
85
- GopherConで例として利用されたHello Worldのコード@<fn>{knsh14_gioui_sample_hello_world_link}を実行します 。
85
+ Hello Worldという文字列を表示するサンブルコードを@<list>{knsh14_gioui_sample_hello_world}に示します 。
86
86
87
87
#@# textlint-disable
88
88
// listnum[knsh14_gioui_sample_hello_world][Hello Worldを表示するサンプル][go]{
@@ -95,39 +95,38 @@ import (
95
95
" gioui.org/ui/measure"
96
96
" gioui.org/ui/text"
97
97
98
- " golang.org/x/image/font/gofont/goregular "
98
+ " golang.org/x/image/font/gofont/gomono "
99
99
" golang.org/x/image/font/sfnt"
100
100
)
101
101
102
102
// START OMIT
103
103
func main() {
104
104
go func () {
105
105
w := app.NewWindow ()
106
- regular, _ := sfnt.Parse (goregular .TTF )
106
+ regular, _ := sfnt.Parse (gomono .TTF )
107
107
var cfg ui.Config
108
108
var faces measure.Faces
109
109
ops := new (ui.Ops )
110
- for e := range w.Events () {
111
- if e, ok := e.(app.UpdateEvent ); ok {
110
+ for event := range w.Events () {
111
+ switch e := event.(type) {
112
+ case app.UpdateEvent :
112
113
cfg = &e.Config
113
114
cs := layout.RigidConstraints (e.Size )
114
115
ops.Reset ()
115
116
faces.Reset (cfg)
116
117
117
- lbl := text.Label {
118
+ label := text.Label {
118
119
Face: faces.For (regular, ui.Sp (72 )),
119
120
Text: " Hello, World!" ,
120
- } // HLdraw
121
- lbl .Layout (ops, cs) // HLdraw
121
+ }
122
+ label .Layout (ops, cs)
122
123
123
124
w.Update (ops)
124
125
}
125
- } // HLeventloop
126
+ }
126
127
}()
127
128
app.Main ()
128
129
}
129
-
130
- // END OMIT
131
130
// }
132
131
#@# textlint-enable
133
132
@@ -142,8 +141,8 @@ func main() {
142
141
イベントには「画面を更新した」、「何らかの入力を受けた」などがあります。
143
142
このサンプルでは画面を更新する際のイベント@<code>{gioui.org /ui/app.UpdateEvent }@<fn>{knsh14_gioui_app_updateevent_doc_link}の場合に文字を出す処理を行います。
144
143
145
- 文字を出力するためには@<code>{gioui.org /ui/text.Label }を利用します 。
146
- @<code>{Label}には 2 つのフィールドがあります 。
144
+ 文字を出力するためには@<code>{gioui.org /ui/text.Label }型を利用します 。
145
+ @<code>{Label}型には 2 つのフィールドがあります 。
147
146
1 つ目はもちろん出力するための@<code>{Text}フィールドです。
148
147
2 つ目は文字のフォント、大きさを決める@<code>{Face}フィールドです。
149
148
これら2 つを指定してどのように画面に表示するかを決定します。
@@ -157,8 +156,7 @@ func main() {
157
156
@<code>{gioui.org /ui/layout.Constraints }はイベントを処理する毎に取得する必要があります。
158
157
なぜなら画面サイズが変わったりした場合に再度計算する必要があるからです。
159
158
160
- // footnote[knsh14_gioui_sample_hello_world_link][https://github.com/eliasnaur/gophercon-2019-talk/blob/master/helloworld.go]
161
- // footnote[knsh14_gioui_app_updateevent_doc_link][https://godoc.org/gioui.org/ui/app#UpdateEvent]
159
+ // footnote[knsh14_gioui_app_updateevent_doc_link][@<href>{https://godoc.org/gioui.org/ui/app#UpdateEvent}]
162
160
163
161
=== レイアウトを変更する
164
162
右寄せで画面のN%部分に表示したいという状況はGUIアプリケーションを作っているとよく遭遇します。
@@ -304,7 +302,7 @@ func loop(w *app.Window) error {
304
302
#@# textlint-enable
305
303
306
304
キーボード入力などの入力は@<code>{gioui.org /ui/input.Queue }というインタフェースを通して取得します。
307
- このQueueは @<code>{app.Window }オブジェクトから取得します。
305
+ この@<code>{Queue}は @<code>{app.Window }オブジェクトから取得します。
308
306
取得できるイベントの種類はキーボードの入力以外にも、マウスのクリックやウィンドウのフォーカスなどがあります。
309
307
310
308
== Gioでのアプリケーション設計
@@ -314,11 +312,11 @@ func loop(w *app.Window) error {
314
312
=== GioのWindowは状態を持たない
315
313
GopherConのtalkでもGioは状態を持たないという説明がされています。
316
314
前の画面更新時の状態を持っていることもありません。
317
- GioのWindowオブジェクトは全体の描画イベントなどのQueueのchannel、入力イベントのQueueや 、画面再描画のメソッドなどだけを提供します。
315
+ Gioの@<code>{Window}オブジェクトは全体の描画イベントなどの@<code>{Queue}のchannel、入力イベントの@<code>{Queue}や 、画面再描画のメソッドなどだけを提供します。
318
316
画面の要素の状態や、再描画の際のフックのためのコールバック関数は定義されていません。
319
317
320
318
画面が今どう表示されているか、そのためのデータはどのような状態なのかは自分たちで管理する必要があります。
321
- これはアプリケーションの状態を管理するコードを自分たちで管理する必要があるため 、より自分たちでコードを書く必要があります。
319
+ そのため 、より自分たちでコードを書く必要があります。
322
320
ですが、自分たちで状態の変化を管理できるので、テストコードで正しく状態遷移できているかを担保しやすいというメリットがあります。
323
321
324
322
Gioを動かす部分、UIの描画などをハンドリングする部分、実際のデータなどを操作する機能などでうまくアプリケーションを設計する必要があります。
@@ -335,52 +333,55 @@ Gioへ興味が湧いてきて、いろいろ使っているとバグを発見
335
333
ぜひ積極的にGioのコミュニティに参加して、コントリビュートしていきましょう。
336
334
337
335
=== 質問をする
338
- Gophers Slackには@<tt>{#gioui}というGioに関連した話題について議論するチャンネルがあります。
336
+ Gophers Slackには@<tt>{#gioui}というGioに関連した話題について議論するチャンネルがあります@<fn>{knsh14_gophers_slack_gioui_link} 。
339
337
使い方についての質問やベストプラクティスに関する質問など困ったことがあれば参加して聞いて見るとよいでしょう。
340
338
Eliasさんもこのチャンネルを見てくださっているので、本人から意見がもらえることもあります。
341
339
340
+ // footnote[knsh14_gophers_slack_gioui_link][@<href>{https://gophers.slack.com/app_redirect?channel=gioui}]
341
+
342
342
=== Gioに修正を投げる
343
343
#@# textlint-disable
344
344
Gioはsourcehut@<fn>{knsh14_sourcehut_link}という日本ではなかなか見かけないホスティングサービスを使ってコードを管理しています。
345
345
sourcehutはかなりシンプルな機能を提供しているサービスで、GitHubでの開発に慣れていると分かりづらいことが多いです。
346
- Pull Requestのようなブランチ間の差分をウェブ上でレビューする仕組みもないため 、メーリングリストにパッチを送る必要があります。
346
+ Pull Requestのようなブランチ間の差分をWeb上でレビューする機能がないため 、メーリングリストにパッチを送る必要があります。
347
347
以前GitHubに移行するかどうかという議論がありましたが、GitHubにロックインされることを懸念した作者のEliasさんが移行する予定はないとしています。
348
348
349
349
そのための手順について説明をします。
350
350
私はGmailを使っています。
351
- なので、Gmailを利用したパッチ送信について説明します 。
352
- なお、すでにローカルにリポジトリがcloneされている状態を想定しています 。
351
+ ですのでGmailを利用したパッチ送信について説明します 。
352
+ 修正を投げるためにすでにローカルにリポジトリがcloneされている状態を想定しています 。
353
353
#@# textlint-enable
354
- // footnote[knsh14_sourcehut_link][https://sourcehut.org/]
354
+ // footnote[knsh14_sourcehut_link][@<href>{ https://sourcehut.org/} ]
355
355
356
356
357
357
#@# textlint-disable
358
- === 事前準備
359
- 実際にパッチを投げる前にいくつか事前準備を行います 。
358
+ ==== パッチを投げるための準備
359
+ 実際にパッチを投げる前にいくつか準備を行います 。
360
360
361
361
#@# textlint-enable
362
362
363
- ==== sourcehutでアカウントを作成する
363
+ ===== sourcehutでアカウントを作成する
364
364
sourcehutのサイト@<fn>{knsh14_sourcehut_service_link}へアクセスし、アカウントを作成しておきます。
365
- この手順は必須ではありませんが、やっておくとうまく行かなかった際に実際に自分でリポジトリを作成して実験できます 。
365
+ この手順は必須ではありませんが、やっておくと手順の中で失敗した際に実際に自分でリポジトリを作成して実験できます 。
366
366
367
- // footnote[knsh14_sourcehut_service_link][https://git.sr.ht/]
367
+ // footnote[knsh14_sourcehut_service_link][@<href>{ https://git.sr.ht/} ]
368
368
369
- ==== GmailのIMAPを有効にする
369
+ ===== GmailのIMAPを有効にする
370
370
Gmailの画面に行き、設定項目の「メール転送と POP/IMAP」を表示し、IMAPが有効にします。
371
371
他の設定はデフォルトのままで大丈夫です。
372
372
373
373
#@# textlint-disable
374
- ==== Gmailのアカウントでアプリパスワードを作成する
374
+ ===== Gmailのアカウントでアプリパスワードを作成する
375
375
376
376
まず初めにGoogleアカウントの二段階認証を有効にさせます。
377
- 二段階認証が有効になると、アプリパスワードが作成できるようになります 。
377
+ 二段階認証が有効になると、アプリ パスワードが作成できます 。
378
378
379
- セキュリティ項目のアプリパスワード生成画面で 「アプリ」と「デバイス」を選択する画面が出てきます。
380
- アプリを「メール」、デバイスを「その他」にして「git send-email」と入力し、生成ボタンを押します。
379
+ セキュリティ項目のアプリ パスワード生成画面で 「アプリ」と「デバイス」を選択する画面が出てきます。
380
+ アプリを「メール」、デバイスを「その他」にして「Git send-email」と入力し、生成ボタンを押します。
381
381
するとパスワードが表示されるので、パスワードマネージャーなどに記憶させます。
382
382
383
- ==== gitの設定を追加する
383
+ ===== Gitの設定を追加する
384
+ #@# textlint-disable
384
385
cloneされたリポジトリの中で@<tt>{.git /config}に@<list>{knsh14_gioui_repo_git_setting}の設定を行います。
385
386
#@# textlint-enable
386
387
@@ -401,7 +402,7 @@ cloneされたリポジトリの中で@<tt>{.git/config}に@<list>{knsh14_gioui_
401
402
@<tt>{sendmail.annotate }が有効になっていると、パッチを送信する際に確認画面を出してくれます。
402
403
下の4 行はGmail用の設定です。@<tt>{sendmail.smtpUser }の部分は自分のGmailアドレスに変更してください。
403
404
404
- === 修正を行う
405
+ ==== 修正を行う
405
406
#@# textlint-disable
406
407
取り入れて欲しい変更を実際に修正します。
407
408
この操作は普段と同じようにブランチを切って修正します。
@@ -411,22 +412,22 @@ cloneされたリポジトリの中で@<tt>{.git/config}に@<list>{knsh14_gioui_
411
412
このオプションを付けることで、Developer Certificate of Origin@<fn>{knsh14_certificate_of_origin}に同意し、自分の変更がGioのライセンスに属することを証明します。
412
413
#@# textlint-enable
413
414
414
- // footnote[knsh14_certificate_of_origin][https://developercertificate.org/]
415
+ // footnote[knsh14_certificate_of_origin][@<href>{ https://developercertificate.org/} ]
415
416
416
- === 実際にパッチを送信する
417
+ ==== 実際にパッチを送信する
417
418
では実際にパッチをメーリングリストに送信します。
418
419
@<list>{knsh14_gio_git_send-email}は最新のコミットだけをパッチにして送るコマンドです。
419
420
420
421
#@# textlint-disable
421
- // listnum [knsh14_gio_git_send-email][メーリングリストにパッチを送るためのコマンド][bash]{
422
+ // list [knsh14_gio_git_send-email][メーリングリストにパッチを送るためのコマンド][bash]{
422
423
$ git send-email HEAD^
423
424
// }
424
425
#@# textlint-enable
425
426
426
427
このコマンドを実行すると、エディタが開き、@<list>{knsh14_send_email_editor}の画面が開きます。
427
428
428
429
#@# textlint-disable
429
- // listnum [knsh14_send_email_editor][git send-emailコマンド実行時][vim]{
430
+ // list [knsh14_send_email_editor][git send-emailコマンド実行時][vim]{
430
431
1 From HASH ANSIC_Style_time
431
432
2 From: GIT_USERNAME <
[email protected] >
432
433
3 Date: RFC1123Z_style_time
@@ -449,7 +450,7 @@ $ git send-email HEAD^
449
450
再度タイトル、内容を確認し、問題がなさそうならyを入力して進みます。
450
451
451
452
#@# textlint-disable
452
- // listnum [knsh14_send_email_annotate][git send-emailコマンド実行前の確認画面][bash]{
453
+ // list [knsh14_send_email_annotate][git send-emailコマンド実行前の確認画面][bash]{
453
454
/PATH/TO/MY/PATCH/FILE.patch
454
455
@<tt>{(mbox) Adding cc: GIT_USERNAME <USERNAME@gmail.
com > from line
' From: GIT_USERNAME <[email protected] >' }
455
456
@<tt>{(body) Adding cc: GIT_USERNAME <USERNAME@gmail.
com > from line
' Signed-off-by: GIT_USERNAME <[email protected] >' }
@@ -480,9 +481,10 @@ Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): y
480
481
#@# textlint-enable
481
482
482
483
#@# textlint-disable
483
- 送信する際にパスワードが求められます。
484
+ 最後に@<list>{knsh14_send_email_password}の出力が出てきます。
485
+ 1 行目で送信する際にパスワードが求められます。
484
486
ここで事前準備で作成したアプリパスワードを入力します。
485
- そうすると送信されて 、メーリングリストに自分のパッチが掲載されます。
487
+ パスワードによって認証されるとメールが送信され 、メーリングリストに自分のパッチが掲載されます。
486
488
パッチ一覧@<fn>{knsh14_gio_patch_list_url}に自分のパッチが送られているか確認しましょう。
487
489
#@# textlint-enable
488
490
498
500
499
501
Cc: GIT_USERNAME <
[email protected] >
500
502
Subject: [PATCH] PATCH_TITLE
501
- Date: RFC1123Z style time
503
+ Date: RFC1123Z_style_time
502
504
503
505
X-Mailer: git-send-email 2.23.0
504
506
MIME-Version: 1.0
@@ -508,12 +510,12 @@ Result: 250 2.0.0 OK 1567093114 f63sm7776226pfa.144 - gsmtp
508
510
// }
509
511
#@# textlint-enable
510
512
511
- // footnote[knsh14_gio_patch_list_url][https://lists.sr.ht/~eliasnaur/gio]
513
+ // footnote[knsh14_gio_patch_list_url][@<href>{ https://lists.sr.ht/~eliasnaur/gio} ]
512
514
513
515
== まとめ
514
516
GopherConで発表された新しいGUIライブラリGioについて説明しました。
515
517
Gioはまだ若いライブラリですが、作者が同じなのでGo Moblleと使い勝手が似ています。
516
518
昔Go Mobileを利用していた方はすんなり馴染めそうです。
517
519
518
520
Goで自作したCLIコマンドがGUI上で動作すると、さらに楽しい気持ちになります。
519
- ぜひGioで新しいGoのアプリケーションを作ってみてください。
521
+ ぜひGioで新しいGoのアプリケーションを作ってみてください。
0 commit comments