{"action":"created","comment":{"url":"https://api.github.com/repos/golangtokyo/shoten7/pulls/comments/319770106","pull_request_review_id":282355645,"id":319770106,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDMxOTc3MDEwNg==","diff_hunk":"@@ -0,0 +1,334 @@\n+= GUIライブラリGioで遊んでみよう\n+\n+2019年7月に開催されたGopherCon 2019@<fn>{knsh14_gophercon_link}で新しいGoのGUIライブラリが発表されました。\n+これまでGoの苦手な分野としてGUIを持ったアプリケーションが開発しづらいという点が挙げられていましたが、これを解決する可能性を秘めたライブラリです。\n+\n+\n+//footnote[knsh14_gophercon_link][https://www.gophercon.com/]\n+\n+== Gioの概要\n+Gio@<fn>{knsh14_gioui_link}はGo製のGUIライブラリです。\n+作者のElias NaurさんはGo Mobileを開発されていた方です。\n+その経験を踏まえつつ、今回さらに強力なライブラリを設計しました。\n+\n+Gioはまだv1.0.0がリリースされておらず、今でも大きな変更があります。\n+2019年9月1日執筆時点でのバージョンを正式なものとして扱います。\n+//footnote[knsh14_gioui_link][https://gioui.org]\n+\n+=== 特徴\n+大きな特徴として私達が書くアプリケーションのコードをすべてGoで書ける点にあります。\n+さらに、Goそのものの特徴であるクロスプラットフォームにも対応しています。\n+対応しているプラットフォームはiOS、AndroidはもちろんtvOSやWebGLなどにも出力できます。\n+\n+=== インストール方法\n+インストール方法は一般的なGoのライブラリと同じ方法でインストールできます。\n+ライブラリの取得方法を@<list>{knsh14_gioui_install}に示します。\n+\n+//list[knsh14_gioui_install][Gio UIのインストール方法][shell]{\n+$ go get -u gioui.org/...\n+//}\n+\n+開発中は@<code>{go run main.go}のようにそのまま実行できます。\n+実際にアプリケーションをビルドしてバイナリにする場合は@<list>{knsh14_gioui_builds}に上げたGioのコマンドを実行する必要があります。\n+\n+//list[knsh14_gioui_builds][Gioアプリケーションのビルド方法][shell]{\n+// iOS\n+$ go run gioui.org/cmd/gio -target ios -appid <bundle-id> PATH/TO/APP\n+\n+// Android\n+$ go run gioui.org/cmd/gio -target android PATH/TO/APP\n+\n+// WebGL\n+$ go run gioui.org/cmd/gio -target js PATH/TO/APP\n+$ go get github.com/shurcooL/goexec\n+$ goexec 'http.ListenAndServe(\":8080\", http.FileServer(http.Dir(\"APP\")))'\n+//}\n+\n+ビルドするためのコマンドが@<code>{gio}ではなく、@<code>{go run gioui.org/cmd/gio}なのはgioという別のコマンドがmacOSではデフォルトで入っているからです。\n+iOS向けやAndroid向けのビルドコマンドで生成されたバイナリは各ツールでさらに端末にインストールできます。\n+\n+== Gioで遊んで見る\n+実際のコードを動かして、Gioがどのような機能を持っているか紹介します。\n+これから紹介するコードは、Go Playgroundで動かすことはできません。\n+ローカルで動かしてください。\n+\n+=== 真っ白なWindowを出力する\n+まずはGioのプログラムを動かしてみましょう。\n+@<list>{knsh14_gioui_sample_blank_window}のプログラムを実行すると真っ白なウィンドウが現れます。\n+\n+#@# textlint-disable\n+//list[knsh14_gioui_sample_blank_window][真っ白なWindow][go]{\n+package main\n+\n+import (\n+  \"gioui.org/ui/app\"\n+)\n+\n+func main() {\n+  go func() {\n+    w := app.NewWindow()\n+    for _ = range w.Events() {\n+    }\n+  }()\n+  app.Main()\n+}\n+//}\n+#@# textlint-enable\n+\n+@<code>{main}関数で@<code>{gioui.org/ui/app}の@<code>{Main}関数を呼び出します。\n+この関数は必ず呼ぶ必要があります。@<code>{gioui.org/ui/app.Main}関数はすべてのウィンドウが閉じられるまで@<code>{main}関数をブロックします。\n+ウィンドウに画像や文字を出したり、キーの入力を受けたりする処理は別の@<code>{goroutine}で実行する必要があります。\n+\n+=== Hello World\n+GopherConで例として利用されたHello Worldのコード@<fn>{knsh14_gioui_sample_hello_world_link}を実行します。\n+\n+#@# textlint-disable\n+//list[knsh14_gioui_sample_hello_world][Hello Worldを表示するサンプル][go]{\n+package main\n+\n+import (\n+  \"gioui.org/ui\"\n+  \"gioui.org/ui/app\"\n+  \"gioui.org/ui/layout\"\n+  \"gioui.org/ui/measure\"\n+  \"gioui.org/ui/text\"\n+\n+  \"golang.org/x/image/font/gofont/goregular\"\n+  \"golang.org/x/image/font/sfnt\"\n+)\n+\n+// START OMIT\n+func main() {\n+  go func() {\n+    w := app.NewWindow()\n+    regular, _ := sfnt.Parse(goregular.TTF)\n+    var cfg ui.Config\n+    var faces measure.Faces\n+    ops := new(ui.Ops)\n+    for e := range w.Events() {\n+      if e, ok := e.(app.UpdateEvent); ok {\n+        cfg = &e.Config\n+        cs := layout.RigidConstraints(e.Size)\n+        ops.Reset()\n+        faces.Reset(cfg)\n+\n+        lbl := text.Label{\n+          Face: faces.For(regular, ui.Sp(72)),\n+          Text: \"Hello, World!\",\n+        } // HLdraw\n+        lbl.Layout(ops, cs) // HLdraw\n+\n+        w.Update(ops)\n+      }\n+    } // HLeventloop\n+  }()\n+  app.Main()\n+}\n+\n+// END OMIT\n+//}\n+#@# textlint-enable\n+\n+このコードを実行すると@<img>{knsh14_gioui_hello_world}のような実行結果が得られます。\n+//image[knsh14_gioui_hello_world][GioにおけるHello world]{\n+//}\n+\n+ウィンドウを出す方法は真っ白なウィンドウを出す方法と変わりません。\n+このサンプルでは文字を出す方法を新しく紹介します。\n+\n+23行目のfor文でウィンドウオブジェクトからイベントを取り出します。\n+イベントには「画面を更新した」、「何らかの入力を受けた」などがあります。\n+このサンプルでは画面を更新する際のイベント@<code>{gioui.org/ui/app.UpdateEvent}@<fn>{knsh14_gioui_app_updateevent_doc_link}の場合に文字を出す処理を行います。\n+\n+文字を出力するためには@<code>{gioui.org/ui/text.Label}を利用します。\n+@<code>{Label}には2つのフィールドがあります。\n+1つ目はもちろん出力するための@<code>{Text}フィールドです。\n+2つ目は文字のフォント、大きさを決める@<code>{Face}フィールドです。\n+これら2つを指定してどのように画面に表示するかを決定します。\n+\n+文字を実際に出すためには@<code>{Layout}メソッドを呼び出す必要があります。\n+このメソッドに渡すために、@<code>{gioui.org/ui.Ops}と@<code>{gioui.org/ui/layout.Constraints}を取得する必要があります。\n+@<code>{gioui.org/ui.Ops}は画面更新などの処理を保存して、画面更新時に渡すための変数です。\n+@<code>{Ops}は@<code>{Reset}メソッドを使って中身をクリアできるので、何度も使い回すことが推奨されます。\n+@<code>{gioui.org/ui/layout.Constraints}はイベントを処理する毎に取得する必要があります。\n+なぜなら画面サイズが変わったりした場合に再度計算する必要があるからです。\n+\n+//footnote[knsh14_gioui_sample_hello_world_link][https://github.com/eliasnaur/gophercon-2019-talk/blob/master/helloworld.go]\n+//footnote[knsh14_gioui_app_updateevent_doc_link][https://godoc.org/gioui.org/ui/app#UpdateEvent]\n+\n+=== レイアウトを変更する\n+右寄せで画面のN%部分に表示したいという状況はGUIアプリケーションを作っているとよく遭遇します。\n+そのためのサンプルとして、@<list>{knsh14_gioui_sample_layout_image}にレイアウトを自由に変更するサンプルを示します。\n+\n+#@# textlint-disable\n+//list[knsh14_gioui_sample_layout_image][Gioでウィンドウサイズに依存した表示を行う][go]{\n+package main\n+\n+import (\n+  \"image\"\n+  _ \"image/png\"\n+  \"log\"\n+  \"os\"\n+\n+  \"gioui.org/ui\"\n+  \"gioui.org/ui/app\"\n+  \"gioui.org/ui/layout\"\n+  \"gioui.org/ui/widget\"\n+)\n+\n+func main() {\n+  go func() {\n+    w := app.NewWindow()\n+    if err := loop(w); err != nil {\n+      log.Fatal(err)\n+    }\n+  }()\n+  app.Main()\n+}\n+\n+func loop(w *app.Window) error {\n+  var cfg app.Config\n+  file, err := os.Open(\"gophercon.png\")\n+  defer file.Close()\n+  if err != nil {\n+    return err\n+  }\n+  img, _, err := image.Decode(file)\n+  if err != nil {\n+    return err\n+  }\n+  ops := new(ui.Ops)\n+  for {\n+    e := <-w.Events()\n+    switch e := e.(type) {\n+    case app.UpdateEvent:\n+      cfg = e.Config\n+      ops.Reset()\n+      cs := layout.RigidConstraints(e.Size)\n+      flex := layout.Flex{}\n+      flex.Init(ops, cs)\n+      cs = flex.Flexible(0.5)\n+      dimensions := widget.Image{\n+        Src:  img,\n+        Rect: img.Bounds(),\n+      }.Layout(&cfg, ops, cs)\n+      child1 := flex.End(dimensions)\n+      cs = flex.Flexible(0.5)\n+      dimensions = widget.Image{\n+        Src:  img,\n+        Rect: img.Bounds(),\n+      }.Layout(&cfg, ops, cs)\n+      child2 := flex.End(dimensions)\n+      flex.Layout(child1, child2)\n+      w.Update(ops)\n+    }\n+  }\n+}\n+//}\n+#@# textlint-enable\n+\n+@<list>{knsh14_gioui_sample_layout_image}を実行すると、画面の同じ画像が横に2つ並んでいるウィンドウが開きます。\n+端をドラッグしてウィンドウのサイズを変更するとそれに伴って画像のサイズも変化します。\n+\n+画像などのレイアウトを変更する場合は@<code>{gioui.org/ui/layout}パッケージを利用します。\n+@<code>{Flex}は横方向に要素を並べます。\n+横幅に対する割合は@<code>{Flexible}メソッドで決定し、その戻り値を利用して表示を行います。\n+\n+\n+=== キーイベントをハンドリングする\n+GUIアプリケーションに必須の機能として、キーボードなどの入力を受けて処理を実行することが挙げられます。\n+@<list>{knsh14_gioui_sample_handle_input}はキーボード入力を受け付けて、ウィンドウ上に文字を表示するものです。\n+\n+#@# textlint-disable\n+//list[knsh14_gioui_sample_handle_input][Gioでキーボード入力を表示するサンプル][go]{\n+package main\n+\n+import (\n+  \"log\"\n+\n+  \"gioui.org/ui\"\n+  \"gioui.org/ui/app\"\n+  \"gioui.org/ui/key\"\n+  \"gioui.org/ui/layout\"\n+  \"gioui.org/ui/measure\"\n+  \"gioui.org/ui/text\"\n+  \"golang.org/x/image/font/gofont/goregular\"\n+  \"golang.org/x/image/font/sfnt\"\n+)\n+\n+func main() {\n+  go func() {\n+    w := app.NewWindow()\n+    if err := loop(w); err != nil {\n+      log.Fatal(err)\n+    }\n+  }()\n+  app.Main()\n+}\n+\n+func loop(w *app.Window) error {\n+  var cfg app.Config\n+  regular, _ := sfnt.Parse(goregular.TTF)\n+  var faces measure.Faces\n+  ops := new(ui.Ops)\n+  var input string\n+  for {\n+    e := <-w.Events()\n+    switch e := e.(type) {\n+    case app.UpdateEvent:\n+      cfg = e.Config\n+      faces.Reset(&cfg)\n+      ops.Reset()\n+      queue := w.Queue()\n+      for e, ok := queue.Next(input); ok; e, ok = queue.Next(input) {\n+        if v, ok := e.(key.Event); ok {\n+          input += string([]rune{v.Name})\n+        }\n+      }\n+      cs := layout.RigidConstraints(e.Size)\n+      text.Label{\n+        Face: faces.For(regular, ui.Dp(72)),\n+        Text: input,\n+      }.Layout(ops, cs)\n+      key.InputOp{Key: input, Focus: false}.Add(ops)\n+      w.Update(ops)\n+    }\n+  }\n+}\n+\n+//}\n+#@# textlint-enable\n+\n+キーボード入力などの入力は@<code>{gioui.org/ui/input.Queue}というインターフェースを通して取得します。\n+このQueueは@<code>{app.Window}オブジェクトから取得します。\n+取得できるイベントの種類はキーボードの入力以外にも、マウスのクリックやウィンドウのフォーカスなどがあります。\n+\n+== Gioでのアプリケーション設計\n+サンプルを実行することで、ある程度Gioの機能をどのように利用するか説明しました。\n+ここからはGioを実際に使う上で気をつけることを説明します。\n+\n+=== GioのWindowは状態を持たない\n+GopherConのtalkでもGioは状態を持たないという説明がされています。\n+前の画面更新時の状態を持っていることもありません。\n+GioのWindowオブジェクトは全体の描画イベントなどのQueueのchannel、入力イベントのQueueや、画面再描画のメソッドなどだけを提供します。\n+画面の要素の状態や、再描画の際のフックのためのコールバック関数は定義されていません。\n+\n+画面が今どう表示されているか、そのためのデータはどのような状態なのかは自分たちで管理する必要があります。\n+これはアプリケーションの状態を管理するコードを上手く自分たちで管理する必要があるため、作るのが大変になります。\n+ですが、自分たちですべてを管理できるので、テストコードで正しく状態遷移できているかを担保しやすいというメリットがあります。\n+\n+Gioを動かす部分、UIの描画などをハンドリングする部分、実際のデータなどを操作する機能などでうまくアプリケーションを設計する必要があります。\n+\n+=== layoutをうまく利用する\n+@<code>{gioui.org/ui/layout}はGioの薄いライブラリの中にあって、かなり自由な画面構成を作成できます。\n+固定されたサイズで描画するよりも柔軟なレイアウトが可能になるので、さまざまな画面サイズに対応できます。\n+\n+とはいえ縦長の画面、横長の画面などそれぞれで適したUIが変わってきます。\n+自分のアプリケーション、利用されるプラットフォームにあった画面を意識しましょう。\n+\n+== Gioへのコントリビュート\n+Gioへ興味が湧いてきて、いろいろ使っているとバグを見つけたり、修正したいことが出てくると思います。","path":"articles/knsh14.re","position":330,"original_position":330,"commit_id":"cbb619f7f2cf6b23609857da30851ff909032f1d","original_commit_id":"cbb619f7f2cf6b23609857da30851ff909032f1d","user":{"login":"budougumi0617","id":1883265,"node_id":"MDQ6VXNlcjE4ODMyNjU=","avatar_url":"https://avatars0.githubusercontent.com/u/1883265?v=4","gravatar_id":"","url":"https://api.github.com/users/budougumi0617","html_url":"https://github.com/budougumi0617","followers_url":"https://api.github.com/users/budougumi0617/followers","following_url":"https://api.github.com/users/budougumi0617/following{/other_user}","gists_url":"https://api.github.com/users/budougumi0617/gists{/gist_id}","starred_url":"https://api.github.com/users/budougumi0617/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/budougumi0617/subscriptions","organizations_url":"https://api.github.com/users/budougumi0617/orgs","repos_url":"https://api.github.com/users/budougumi0617/repos","events_url":"https://api.github.com/users/budougumi0617/events{/privacy}","received_events_url":"https://api.github.com/users/budougumi0617/received_events","type":"User","site_admin":false},"body":"**[textlint]** <sub>reported by [reviewdog](https://github.com/reviewdog/reviewdog) :dog:</sub>\n弱い表現: \"思います\" が使われています。 (ja-technical-writing/ja-no-weak-phrase)","created_at":"2019-09-01T18:24:04Z","updated_at":"2019-09-01T18:24:05Z","html_url":"https://github.com/golangtokyo/shoten7/pull/9#discussion_r319770106","pull_request_url":"https://api.github.com/repos/golangtokyo/shoten7/pulls/9","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/golangtokyo/shoten7/pulls/comments/319770106"},"html":{"href":"https://github.com/golangtokyo/shoten7/pull/9#discussion_r319770106"},"pull_request":{"href":"https://api.github.com/repos/golangtokyo/shoten7/pulls/9"}}},"pull_request":{"url":"https://api.github.com/repos/golangtokyo/shoten7/pulls/9","id":310773004,"node_id":"MDExOlB1bGxSZXF1ZXN0MzEwNzczMDA0","html_url":"https://github.com/golangtokyo/shoten7/pull/9","diff_url":"https://github.com/golangtokyo/shoten7/pull/9.diff","patch_url":"https://github.com/golangtokyo/shoten7/pull/9.patch","issue_url":"https://api.github.com/repos/golangtokyo/shoten7/issues/9","number":9,"state":"open","locked":false,"title":"Gio UI にゅうもん by knsh14 ","user":{"login":"knsh14","id":1419696,"node_id":"MDQ6VXNlcjE0MTk2OTY=","avatar_url":"https://avatars3.githubusercontent.com/u/1419696?v=4","gravatar_id":"","url":"https://api.github.com/users/knsh14","html_url":"https://github.com/knsh14","followers_url":"https://api.github.com/users/knsh14/followers","following_url":"https://api.github.com/users/knsh14/following{/other_user}","gists_url":"https://api.github.com/users/knsh14/gists{/gist_id}","starred_url":"https://api.github.com/users/knsh14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/knsh14/subscriptions","organizations_url":"https://api.github.com/users/knsh14/orgs","repos_url":"https://api.github.com/users/knsh14/repos","events_url":"https://api.github.com/users/knsh14/events{/privacy}","received_events_url":"https://api.github.com/users/knsh14/received_events","type":"User","site_admin":false},"body":"# PRの概要\r\nGio UI (https://gioui.org) の入門記事を書きます\r\n\r\n\r\n# PDFを確認する\r\nPRの内容はPDFにビルドされて次のURLのGoogle Driveディレクトリ以下に格納されます（要アクセス権限）。\r\n\r\n*TODO 同じ名前のファイルが何個も作成されてしまうのでどうにかする*\r\n\r\nhttps://drive.google.com/drive/u/0/folders/15vJsSbnosM-iXE0VogU71boPzrHiYnWr\r\n","created_at":"2019-08-26T05:47:22Z","updated_at":"2019-09-01T18:24:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ea0807ad148d4d868564b2e832fb949574f5be2c","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/golangtokyo/shoten7/pulls/9/commits","review_comments_url":"https://api.github.com/repos/golangtokyo/shoten7/pulls/9/comments","review_comment_url":"https://api.github.com/repos/golangtokyo/shoten7/pulls/comments{/number}","comments_url":"https://api.github.com/repos/golangtokyo/shoten7/issues/9/comments","statuses_url":"https://api.github.com/repos/golangtokyo/shoten7/statuses/cbb619f7f2cf6b23609857da30851ff909032f1d","head":{"label":"golangtokyo:knsh14","ref":"knsh14","sha":"cbb619f7f2cf6b23609857da30851ff909032f1d","user":{"login":"golangtokyo","id":30496683,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwNDk2Njgz","avatar_url":"https://avatars1.githubusercontent.com/u/30496683?v=4","gravatar_id":"","url":"https://api.github.com/users/golangtokyo","html_url":"https://github.com/golangtokyo","followers_url":"https://api.github.com/users/golangtokyo/followers","following_url":"https://api.github.com/users/golangtokyo/following{/other_user}","gists_url":"https://api.github.com/users/golangtokyo/gists{/gist_id}","starred_url":"https://api.github.com/users/golangtokyo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/golangtokyo/subscriptions","organizations_url":"https://api.github.com/users/golangtokyo/orgs","repos_url":"https://api.github.com/users/golangtokyo/repos","events_url":"https://api.github.com/users/golangtokyo/events{/privacy}","received_events_url":"https://api.github.com/users/golangtokyo/received_events","type":"Organization","site_admin":false},"repo":{"id":189176806,"node_id":"MDEwOlJlcG9zaXRvcnkxODkxNzY4MDY=","name":"shoten7","full_name":"golangtokyo/shoten7","private":false,"owner":{"login":"golangtokyo","id":30496683,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwNDk2Njgz","avatar_url":"https://avatars1.githubusercontent.com/u/30496683?v=4","gravatar_id":"","url":"https://api.github.com/users/golangtokyo","html_url":"https://github.com/golangtokyo","followers_url":"https://api.github.com/users/golangtokyo/followers","following_url":"https://api.github.com/users/golangtokyo/following{/other_user}","gists_url":"https://api.github.com/users/golangtokyo/gists{/gist_id}","starred_url":"https://api.github.com/users/golangtokyo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/golangtokyo/subscriptions","organizations_url":"https://api.github.com/users/golangtokyo/orgs","repos_url":"https://api.github.com/users/golangtokyo/repos","events_url":"https://api.github.com/users/golangtokyo/events{/privacy}","received_events_url":"https://api.github.com/users/golangtokyo/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/golangtokyo/shoten7","description":"技術書典7に出したい原稿","fork":false,"url":"https://api.github.com/repos/golangtokyo/shoten7","forks_url":"https://api.github.com/repos/golangtokyo/shoten7/forks","keys_url":"https://api.github.com/repos/golangtokyo/shoten7/keys{/key_id}","collaborators_url":"https://api.github.com/repos/golangtokyo/shoten7/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/golangtokyo/shoten7/teams","hooks_url":"https://api.github.com/repos/golangtokyo/shoten7/hooks","issue_events_url":"https://api.github.com/repos/golangtokyo/shoten7/issues/events{/number}","events_url":"https://api.github.com/repos/golangtokyo/shoten7/events","assignees_url":"https://api.github.com/repos/golangtokyo/shoten7/assignees{/user}","branches_url":"https://api.github.com/repos/golangtokyo/shoten7/branches{/branch}","tags_url":"https://api.github.com/repos/golangtokyo/shoten7/tags","blobs_url":"https://api.github.com/repos/golangtokyo/shoten7/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/golangtokyo/shoten7/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/golangtokyo/shoten7/git/refs{/sha}","trees_url":"https://api.github.com/repos/golangtokyo/shoten7/git/trees{/sha}","statuses_url":"https://api.github.com/repos/golangtokyo/shoten7/statuses/{sha}","languages_url":"https://api.github.com/repos/golangtokyo/shoten7/languages","stargazers_url":"https://api.github.com/repos/golangtokyo/shoten7/stargazers","contributors_url":"https://api.github.com/repos/golangtokyo/shoten7/contributors","subscribers_url":"https://api.github.com/repos/golangtokyo/shoten7/subscribers","subscription_url":"https://api.github.com/repos/golangtokyo/shoten7/subscription","commits_url":"https://api.github.com/repos/golangtokyo/shoten7/commits{/sha}","git_commits_url":"https://api.github.com/repos/golangtokyo/shoten7/git/commits{/sha}","comments_url":"https://api.github.com/repos/golangtokyo/shoten7/comments{/number}","issue_comment_url":"https://api.github.com/repos/golangtokyo/shoten7/issues/comments{/number}","contents_url":"https://api.github.com/repos/golangtokyo/shoten7/contents/{+path}","compare_url":"https://api.github.com/repos/golangtokyo/shoten7/compare/{base}...{head}","merges_url":"https://api.github.com/repos/golangtokyo/shoten7/merges","archive_url":"https://api.github.com/repos/golangtokyo/shoten7/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/golangtokyo/shoten7/downloads","issues_url":"https://api.github.com/repos/golangtokyo/shoten7/issues{/number}","pulls_url":"https://api.github.com/repos/golangtokyo/shoten7/pulls{/number}","milestones_url":"https://api.github.com/repos/golangtokyo/shoten7/milestones{/number}","notifications_url":"https://api.github.com/repos/golangtokyo/shoten7/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/golangtokyo/shoten7/labels{/name}","releases_url":"https://api.github.com/repos/golangtokyo/shoten7/releases{/id}","deployments_url":"https://api.github.com/repos/golangtokyo/shoten7/deployments","created_at":"2019-05-29T07:48:10Z","updated_at":"2019-08-27T13:18:19Z","pushed_at":"2019-09-01T18:23:24Z","git_url":"git://github.com/golangtokyo/shoten7.git","ssh_url":"git@github.com:golangtokyo/shoten7.git","clone_url":"https://github.com/golangtokyo/shoten7.git","svn_url":"https://github.com/golangtokyo/shoten7","homepage":null,"size":267,"stargazers_count":4,"watchers_count":4,"language":"TeX","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5,"license":null,"forks":1,"open_issues":5,"watchers":4,"default_branch":"master"}},"base":{"label":"golangtokyo:master","ref":"master","sha":"719769de3b426d0d65d324214df3c8ad2e7a69a7","user":{"login":"golangtokyo","id":30496683,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwNDk2Njgz","avatar_url":"https://avatars1.githubusercontent.com/u/30496683?v=4","gravatar_id":"","url":"https://api.github.com/users/golangtokyo","html_url":"https://github.com/golangtokyo","followers_url":"https://api.github.com/users/golangtokyo/followers","following_url":"https://api.github.com/users/golangtokyo/following{/other_user}","gists_url":"https://api.github.com/users/golangtokyo/gists{/gist_id}","starred_url":"https://api.github.com/users/golangtokyo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/golangtokyo/subscriptions","organizations_url":"https://api.github.com/users/golangtokyo/orgs","repos_url":"https://api.github.com/users/golangtokyo/repos","events_url":"https://api.github.com/users/golangtokyo/events{/privacy}","received_events_url":"https://api.github.com/users/golangtokyo/received_events","type":"Organization","site_admin":false},"repo":{"id":189176806,"node_id":"MDEwOlJlcG9zaXRvcnkxODkxNzY4MDY=","name":"shoten7","full_name":"golangtokyo/shoten7","private":false,"owner":{"login":"golangtokyo","id":30496683,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwNDk2Njgz","avatar_url":"https://avatars1.githubusercontent.com/u/30496683?v=4","gravatar_id":"","url":"https://api.github.com/users/golangtokyo","html_url":"https://github.com/golangtokyo","followers_url":"https://api.github.com/users/golangtokyo/followers","following_url":"https://api.github.com/users/golangtokyo/following{/other_user}","gists_url":"https://api.github.com/users/golangtokyo/gists{/gist_id}","starred_url":"https://api.github.com/users/golangtokyo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/golangtokyo/subscriptions","organizations_url":"https://api.github.com/users/golangtokyo/orgs","repos_url":"https://api.github.com/users/golangtokyo/repos","events_url":"https://api.github.com/users/golangtokyo/events{/privacy}","received_events_url":"https://api.github.com/users/golangtokyo/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/golangtokyo/shoten7","description":"技術書典7に出したい原稿","fork":false,"url":"https://api.github.com/repos/golangtokyo/shoten7","forks_url":"https://api.github.com/repos/golangtokyo/shoten7/forks","keys_url":"https://api.github.com/repos/golangtokyo/shoten7/keys{/key_id}","collaborators_url":"https://api.github.com/repos/golangtokyo/shoten7/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/golangtokyo/shoten7/teams","hooks_url":"https://api.github.com/repos/golangtokyo/shoten7/hooks","issue_events_url":"https://api.github.com/repos/golangtokyo/shoten7/issues/events{/number}","events_url":"https://api.github.com/repos/golangtokyo/shoten7/events","assignees_url":"https://api.github.com/repos/golangtokyo/shoten7/assignees{/user}","branches_url":"https://api.github.com/repos/golangtokyo/shoten7/branches{/branch}","tags_url":"https://api.github.com/repos/golangtokyo/shoten7/tags","blobs_url":"https://api.github.com/repos/golangtokyo/shoten7/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/golangtokyo/shoten7/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/golangtokyo/shoten7/git/refs{/sha}","trees_url":"https://api.github.com/repos/golangtokyo/shoten7/git/trees{/sha}","statuses_url":"https://api.github.com/repos/golangtokyo/shoten7/statuses/{sha}","languages_url":"https://api.github.com/repos/golangtokyo/shoten7/languages","stargazers_url":"https://api.github.com/repos/golangtokyo/shoten7/stargazers","contributors_url":"https://api.github.com/repos/golangtokyo/shoten7/contributors","subscribers_url":"https://api.github.com/repos/golangtokyo/shoten7/subscribers","subscription_url":"https://api.github.com/repos/golangtokyo/shoten7/subscription","commits_url":"https://api.github.com/repos/golangtokyo/shoten7/commits{/sha}","git_commits_url":"https://api.github.com/repos/golangtokyo/shoten7/git/commits{/sha}","comments_url":"https://api.github.com/repos/golangtokyo/shoten7/comments{/number}","issue_comment_url":"https://api.github.com/repos/golangtokyo/shoten7/issues/comments{/number}","contents_url":"https://api.github.com/repos/golangtokyo/shoten7/contents/{+path}","compare_url":"https://api.github.com/repos/golangtokyo/shoten7/compare/{base}...{head}","merges_url":"https://api.github.com/repos/golangtokyo/shoten7/merges","archive_url":"https://api.github.com/repos/golangtokyo/shoten7/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/golangtokyo/shoten7/downloads","issues_url":"https://api.github.com/repos/golangtokyo/shoten7/issues{/number}","pulls_url":"https://api.github.com/repos/golangtokyo/shoten7/pulls{/number}","milestones_url":"https://api.github.com/repos/golangtokyo/shoten7/milestones{/number}","notifications_url":"https://api.github.com/repos/golangtokyo/shoten7/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/golangtokyo/shoten7/labels{/name}","releases_url":"https://api.github.com/repos/golangtokyo/shoten7/releases{/id}","deployments_url":"https://api.github.com/repos/golangtokyo/shoten7/deployments","created_at":"2019-05-29T07:48:10Z","updated_at":"2019-08-27T13:18:19Z","pushed_at":"2019-09-01T18:23:24Z","git_url":"git://github.com/golangtokyo/shoten7.git","ssh_url":"git@github.com:golangtokyo/shoten7.git","clone_url":"https://github.com/golangtokyo/shoten7.git","svn_url":"https://github.com/golangtokyo/shoten7","homepage":null,"size":267,"stargazers_count":4,"watchers_count":4,"language":"TeX","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5,"license":null,"forks":1,"open_issues":5,"watchers":4,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/golangtokyo/shoten7/pulls/9"},"html":{"href":"https://github.com/golangtokyo/shoten7/pull/9"},"issue":{"href":"https://api.github.com/repos/golangtokyo/shoten7/issues/9"},"comments":{"href":"https://api.github.com/repos/golangtokyo/shoten7/issues/9/comments"},"review_comments":{"href":"https://api.github.com/repos/golangtokyo/shoten7/pulls/9/comments"},"review_comment":{"href":"https://api.github.com/repos/golangtokyo/shoten7/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/golangtokyo/shoten7/pulls/9/commits"},"statuses":{"href":"https://api.github.com/repos/golangtokyo/shoten7/statuses/cbb619f7f2cf6b23609857da30851ff909032f1d"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"budougumi0617"}}