Skip to content

Commit c6fe8f7

Browse files
Merge pull request #20 🙇 fix force push
🙇 fix force push
2 parents b6f7f31 + 9e7086d commit c6fe8f7

File tree

1 file changed

+53
-51
lines changed

1 file changed

+53
-51
lines changed

articles/knsh14.re

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
= GUIライブラリGioで遊んでみよう
22

3-
20197月に開催されたGopherCon 2019@<fn>{knsh14_gophercon_link}で新しいGoのGUIライブラリが発表されました
3+
20197月に開催されたGopherCon 2019@<fn>{knsh14_gophercon_link}でGioという新しいGoのGUIライブラリが発表されました
44
これまでGoの苦手な分野としてGUIを持ったアプリケーションが開発しづらいという点が挙げられていましたが、これを解決する可能性を秘めたライブラリです。
55

66

7-
//footnote[knsh14_gophercon_link][https://www.gophercon.com/]
7+
//footnote[knsh14_gophercon_link][@<href>{https://www.gophercon.com/}]
88

99
== Gioの概要
1010
Gio@<fn>{knsh14_gioui_link}はGo製のGUIライブラリです。
@@ -14,13 +14,13 @@ Gio@<fn>{knsh14_gioui_link}はGo製のGUIライブラリです。
1414
Gioはまだv1.0.0がリリースされておらず、今でも大きな変更があります。
1515
201992日執筆時点でのバージョン@<fn>{knsh14_gio_version}を正式なものとして扱います。
1616

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}]
1919

2020
=== 特徴
2121
大きな特徴として私達が書くアプリケーションのコードをすべてGoで書ける点にあります。
2222
さらに、Goそのものの特徴であるクロスプラットフォームにも対応しています。
23-
対応しているプラットフォームはiOS、AndroidはもちろんtvOSやWebGLなどにも出力できます
23+
対応しているプラットフォームはmacOSやWindowsなどのデスクトップ、iOS、Androidのスマートフォン、さらにtvOSやWebGLなどにも出力できます
2424

2525
=== インストール方法
2626
インストール方法は一般的なGoのライブラリと同じ方法でインストールできます。
@@ -49,7 +49,7 @@ $ goexec 'http.ListenAndServe(":8080", http.FileServer(http.Dir("APP")))'
4949
ビルドするためのコマンドが@<code>{gio}ではなく、@<code>{go run gioui.org/cmd/gio}なのはgioという別のコマンドがmacOSではデフォルトで入っているからです。
5050
iOS向けやAndroid向けのビルドコマンドで生成されたバイナリは各ツールでさらに端末にインストールできます。
5151

52-
== Gioで遊んで見る
52+
== Gioで遊んでみる
5353
実際のコードを動かして、Gioがどのような機能を持っているか紹介します。
5454
これから紹介するコードは、Go Playgroundで動かすことはできません。
5555
ローカルで@<code>{go run}コマンドを利用して動かしてください。
@@ -82,7 +82,7 @@ func main() {
8282
ウィンドウに画像や文字を出したり、キーの入力を受けたりする処理は別の@<code>{goroutine}で実行する必要があります。
8383

8484
=== Hello World
85-
GopherConで例として利用されたHello Worldのコード@<fn>{knsh14_gioui_sample_hello_world_link}を実行します
85+
Hello Worldという文字列を表示するサンブルコードを@<list>{knsh14_gioui_sample_hello_world}に示します
8686

8787
#@# textlint-disable
8888
//listnum[knsh14_gioui_sample_hello_world][Hello Worldを表示するサンプル][go]{
@@ -95,39 +95,38 @@ import (
9595
"gioui.org/ui/measure"
9696
"gioui.org/ui/text"
9797

98-
"golang.org/x/image/font/gofont/goregular"
98+
"golang.org/x/image/font/gofont/gomono"
9999
"golang.org/x/image/font/sfnt"
100100
)
101101

102102
// START OMIT
103103
func main() {
104104
go func() {
105105
w := app.NewWindow()
106-
regular, _ := sfnt.Parse(goregular.TTF)
106+
regular, _ := sfnt.Parse(gomono.TTF)
107107
var cfg ui.Config
108108
var faces measure.Faces
109109
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:
112113
cfg = &e.Config
113114
cs := layout.RigidConstraints(e.Size)
114115
ops.Reset()
115116
faces.Reset(cfg)
116117

117-
lbl := text.Label{
118+
label := text.Label{
118119
Face: faces.For(regular, ui.Sp(72)),
119120
Text: "Hello, World!",
120-
} // HLdraw
121-
lbl.Layout(ops, cs) // HLdraw
121+
}
122+
label.Layout(ops, cs)
122123

123124
w.Update(ops)
124125
}
125-
} // HLeventloop
126+
}
126127
}()
127128
app.Main()
128129
}
129-
130-
// END OMIT
131130
//}
132131
#@# textlint-enable
133132

@@ -142,8 +141,8 @@ func main() {
142141
イベントには「画面を更新した」、「何らかの入力を受けた」などがあります。
143142
このサンプルでは画面を更新する際のイベント@<code>{gioui.org/ui/app.UpdateEvent}@<fn>{knsh14_gioui_app_updateevent_doc_link}の場合に文字を出す処理を行います。
144143

145-
文字を出力するためには@<code>{gioui.org/ui/text.Label}を利用します
146-
@<code>{Label}には2つのフィールドがあります
144+
文字を出力するためには@<code>{gioui.org/ui/text.Label}型を利用します
145+
@<code>{Label}型には2つのフィールドがあります
147146
1つ目はもちろん出力するための@<code>{Text}フィールドです。
148147
2つ目は文字のフォント、大きさを決める@<code>{Face}フィールドです。
149148
これら2つを指定してどのように画面に表示するかを決定します。
@@ -157,8 +156,7 @@ func main() {
157156
@<code>{gioui.org/ui/layout.Constraints}はイベントを処理する毎に取得する必要があります。
158157
なぜなら画面サイズが変わったりした場合に再度計算する必要があるからです。
159158

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}]
162160

163161
=== レイアウトを変更する
164162
右寄せで画面のN%部分に表示したいという状況はGUIアプリケーションを作っているとよく遭遇します。
@@ -304,7 +302,7 @@ func loop(w *app.Window) error {
304302
#@# textlint-enable
305303

306304
キーボード入力などの入力は@<code>{gioui.org/ui/input.Queue}というインタフェースを通して取得します。
307-
このQueueは@<code>{app.Window}オブジェクトから取得します。
305+
この@<code>{Queue}は@<code>{app.Window}オブジェクトから取得します。
308306
取得できるイベントの種類はキーボードの入力以外にも、マウスのクリックやウィンドウのフォーカスなどがあります。
309307

310308
== Gioでのアプリケーション設計
@@ -314,11 +312,11 @@ func loop(w *app.Window) error {
314312
=== GioのWindowは状態を持たない
315313
GopherConのtalkでもGioは状態を持たないという説明がされています。
316314
前の画面更新時の状態を持っていることもありません。
317-
GioのWindowオブジェクトは全体の描画イベントなどのQueueのchannel、入力イベントのQueueや、画面再描画のメソッドなどだけを提供します。
315+
Gioの@<code>{Window}オブジェクトは全体の描画イベントなどの@<code>{Queue}のchannel、入力イベントの@<code>{Queue}や、画面再描画のメソッドなどだけを提供します。
318316
画面の要素の状態や、再描画の際のフックのためのコールバック関数は定義されていません。
319317

320318
画面が今どう表示されているか、そのためのデータはどのような状態なのかは自分たちで管理する必要があります。
321-
これはアプリケーションの状態を管理するコードを自分たちで管理する必要があるため、より自分たちでコードを書く必要があります。
319+
そのため、より自分たちでコードを書く必要があります。
322320
ですが、自分たちで状態の変化を管理できるので、テストコードで正しく状態遷移できているかを担保しやすいというメリットがあります。
323321

324322
Gioを動かす部分、UIの描画などをハンドリングする部分、実際のデータなどを操作する機能などでうまくアプリケーションを設計する必要があります。
@@ -335,52 +333,55 @@ Gioへ興味が湧いてきて、いろいろ使っているとバグを発見
335333
ぜひ積極的にGioのコミュニティに参加して、コントリビュートしていきましょう。
336334

337335
=== 質問をする
338-
Gophers Slackには@<tt>{#gioui}というGioに関連した話題について議論するチャンネルがあります。
336+
Gophers Slackには@<tt>{#gioui}というGioに関連した話題について議論するチャンネルがあります@<fn>{knsh14_gophers_slack_gioui_link}
339337
使い方についての質問やベストプラクティスに関する質問など困ったことがあれば参加して聞いて見るとよいでしょう。
340338
Eliasさんもこのチャンネルを見てくださっているので、本人から意見がもらえることもあります。
341339

340+
//footnote[knsh14_gophers_slack_gioui_link][@<href>{https://gophers.slack.com/app_redirect?channel=gioui}]
341+
342342
=== Gioに修正を投げる
343343
#@# textlint-disable
344344
Gioはsourcehut@<fn>{knsh14_sourcehut_link}という日本ではなかなか見かけないホスティングサービスを使ってコードを管理しています。
345345
sourcehutはかなりシンプルな機能を提供しているサービスで、GitHubでの開発に慣れていると分かりづらいことが多いです。
346-
Pull Requestのようなブランチ間の差分をウェブ上でレビューする仕組みもないため、メーリングリストにパッチを送る必要があります。
346+
Pull Requestのようなブランチ間の差分をWeb上でレビューする機能がないため、メーリングリストにパッチを送る必要があります。
347347
以前GitHubに移行するかどうかという議論がありましたが、GitHubにロックインされることを懸念した作者のEliasさんが移行する予定はないとしています。
348348

349349
そのための手順について説明をします。
350350
私はGmailを使っています。
351-
なので、Gmailを利用したパッチ送信について説明します
352-
なお、すでにローカルにリポジトリがcloneされている状態を想定しています
351+
ですのでGmailを利用したパッチ送信について説明します
352+
修正を投げるためにすでにローカルにリポジトリがcloneされている状態を想定しています
353353
#@# textlint-enable
354-
//footnote[knsh14_sourcehut_link][https://sourcehut.org/]
354+
//footnote[knsh14_sourcehut_link][@<href>{https://sourcehut.org/}]
355355

356356

357357
#@# textlint-disable
358-
=== 事前準備
359-
実際にパッチを投げる前にいくつか事前準備を行います
358+
==== パッチを投げるための準備
359+
実際にパッチを投げる前にいくつか準備を行います
360360

361361
#@# textlint-enable
362362

363-
==== sourcehutでアカウントを作成する
363+
===== sourcehutでアカウントを作成する
364364
sourcehutのサイト@<fn>{knsh14_sourcehut_service_link}へアクセスし、アカウントを作成しておきます。
365-
この手順は必須ではありませんが、やっておくとうまく行かなかった際に実際に自分でリポジトリを作成して実験できます
365+
この手順は必須ではありませんが、やっておくと手順の中で失敗した際に実際に自分でリポジトリを作成して実験できます
366366

367-
//footnote[knsh14_sourcehut_service_link][https://git.sr.ht/]
367+
//footnote[knsh14_sourcehut_service_link][@<href>{https://git.sr.ht/}]
368368

369-
==== GmailのIMAPを有効にする
369+
===== GmailのIMAPを有効にする
370370
Gmailの画面に行き、設定項目の「メール転送と POP/IMAP」を表示し、IMAPが有効にします。
371371
他の設定はデフォルトのままで大丈夫です。
372372

373373
#@# textlint-disable
374-
==== Gmailのアカウントでアプリパスワードを作成する
374+
===== Gmailのアカウントでアプリパスワードを作成する
375375

376376
まず初めにGoogleアカウントの二段階認証を有効にさせます。
377-
二段階認証が有効になると、アプリパスワードが作成できるようになります
377+
二段階認証が有効になると、アプリ パスワードが作成できます
378378

379-
セキュリティ項目のアプリパスワード生成画面で「アプリ」と「デバイス」を選択する画面が出てきます。
380-
アプリを「メール」、デバイスを「その他」にして「git send-email」と入力し、生成ボタンを押します。
379+
セキュリティ項目のアプリ パスワード生成画面で「アプリ」と「デバイス」を選択する画面が出てきます。
380+
アプリを「メール」、デバイスを「その他」にして「Git send-email」と入力し、生成ボタンを押します。
381381
するとパスワードが表示されるので、パスワードマネージャーなどに記憶させます。
382382

383-
==== gitの設定を追加する
383+
===== Gitの設定を追加する
384+
#@# textlint-disable
384385
cloneされたリポジトリの中で@<tt>{.git/config}に@<list>{knsh14_gioui_repo_git_setting}の設定を行います。
385386
#@# textlint-enable
386387

@@ -401,7 +402,7 @@ cloneされたリポジトリの中で@<tt>{.git/config}に@<list>{knsh14_gioui_
401402
@<tt>{sendmail.annotate}が有効になっていると、パッチを送信する際に確認画面を出してくれます。
402403
下の4行はGmail用の設定です。@<tt>{sendmail.smtpUser}の部分は自分のGmailアドレスに変更してください。
403404

404-
=== 修正を行う
405+
==== 修正を行う
405406
#@# textlint-disable
406407
取り入れて欲しい変更を実際に修正します。
407408
この操作は普段と同じようにブランチを切って修正します。
@@ -411,22 +412,22 @@ cloneされたリポジトリの中で@<tt>{.git/config}に@<list>{knsh14_gioui_
411412
このオプションを付けることで、Developer Certificate of Origin@<fn>{knsh14_certificate_of_origin}に同意し、自分の変更がGioのライセンスに属することを証明します。
412413
#@# textlint-enable
413414

414-
//footnote[knsh14_certificate_of_origin][https://developercertificate.org/]
415+
//footnote[knsh14_certificate_of_origin][@<href>{https://developercertificate.org/}]
415416

416-
=== 実際にパッチを送信する
417+
==== 実際にパッチを送信する
417418
では実際にパッチをメーリングリストに送信します。
418419
@<list>{knsh14_gio_git_send-email}は最新のコミットだけをパッチにして送るコマンドです。
419420

420421
#@# textlint-disable
421-
//listnum[knsh14_gio_git_send-email][メーリングリストにパッチを送るためのコマンド][bash]{
422+
//list[knsh14_gio_git_send-email][メーリングリストにパッチを送るためのコマンド][bash]{
422423
$ git send-email HEAD^
423424
//}
424425
#@# textlint-enable
425426

426427
このコマンドを実行すると、エディタが開き、@<list>{knsh14_send_email_editor}の画面が開きます。
427428

428429
#@# textlint-disable
429-
//listnum[knsh14_send_email_editor][git send-emailコマンド実行時][vim]{
430+
//list[knsh14_send_email_editor][git send-emailコマンド実行時][vim]{
430431
1 From HASH ANSIC_Style_time
431432
2 From: GIT_USERNAME <[email protected]>
432433
3 Date: RFC1123Z_style_time
@@ -449,7 +450,7 @@ $ git send-email HEAD^
449450
再度タイトル、内容を確認し、問題がなさそうならyを入力して進みます。
450451

451452
#@# textlint-disable
452-
//listnum[knsh14_send_email_annotate][git send-emailコマンド実行前の確認画面][bash]{
453+
//list[knsh14_send_email_annotate][git send-emailコマンド実行前の確認画面][bash]{
453454
/PATH/TO/MY/PATCH/FILE.patch
454455
@<tt>{(mbox) Adding cc: GIT_USERNAME <USERNAME@gmail.com> from line 'From: GIT_USERNAME <[email protected]>'}
455456
@<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
480481
#@# textlint-enable
481482

482483
#@# textlint-disable
483-
送信する際にパスワードが求められます。
484+
最後に@<list>{knsh14_send_email_password}の出力が出てきます。
485+
1行目で送信する際にパスワードが求められます。
484486
ここで事前準備で作成したアプリパスワードを入力します。
485-
そうすると送信されて、メーリングリストに自分のパッチが掲載されます。
487+
パスワードによって認証されるとメールが送信され、メーリングリストに自分のパッチが掲載されます。
486488
パッチ一覧@<fn>{knsh14_gio_patch_list_url}に自分のパッチが送られているか確認しましょう。
487489
#@# textlint-enable
488490

@@ -498,7 +500,7 @@ From: GIT_USERNAME <[email protected]>
498500
To: ~eliasnaur/[email protected]
499501
Cc: GIT_USERNAME <[email protected]>
500502
Subject: [PATCH] PATCH_TITLE
501-
Date: RFC1123Z style time
503+
Date: RFC1123Z_style_time
502504
Message-Id: <[email protected]>
503505
X-Mailer: git-send-email 2.23.0
504506
MIME-Version: 1.0
@@ -508,12 +510,12 @@ Result: 250 2.0.0 OK 1567093114 f63sm7776226pfa.144 - gsmtp
508510
//}
509511
#@# textlint-enable
510512

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}]
512514

513515
== まとめ
514516
GopherConで発表された新しいGUIライブラリGioについて説明しました。
515517
Gioはまだ若いライブラリですが、作者が同じなのでGo Moblleと使い勝手が似ています。
516518
昔Go Mobileを利用していた方はすんなり馴染めそうです。
517519

518520
Goで自作したCLIコマンドがGUI上で動作すると、さらに楽しい気持ちになります。
519-
ぜひGioで新しいGoのアプリケーションを作ってみてください。
521+
ぜひGioで新しいGoのアプリケーションを作ってみてください。

0 commit comments

Comments
 (0)