- 1. GraphQL、gqlgen を使って サーバ を立てる
- 2. draw.ioで作成した画面レイアウトから仕様書を自動で生成するツールを作ってみた
- 3. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o_1o0] データファイル作成
- 4. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o1o0] 空点以外のところ(石または枠の上)に石を置くことの禁止
- 5. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o2o0] 連の認識と、呼吸点のカウント
- 6. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o3o0] 相手の眼に石を置くことの禁止
- 7. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o4o0] 自分の眼に石を置くことの任意の禁止
- 8. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o5o0] 任意の連の打ち上げ
- 9. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o6o0] 死に石の連の打ち上げ
- 10. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o7o0] コウの禁止
- 11. 【Go】スライスからi番目の要素を削除する
- 12. Goについての記事
- 13. golangにbool型のXOR演算子がない
- 14. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O12o_1o0] 盤定義(盤面走査)
- 15. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O13o_1o0] 盤表示
- 16. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__10o0] 盤サイズの変更
- 17. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__14o_1o0] データファイル作成
- 18. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__14o0] 初期盤面を設定する
- 19. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o_1o0] 座標の定義
- 20. 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o_4o0] 石の色定義
GraphQL、gqlgen を使って サーバ を立てる
# 記事を書こうと思ったきっかけ
インターン先で GraphQL が使われているので実際に手元で動かしてみようと思ったのがきっかけです。
本家のチュートリアルや、参考になった記事の内容をもとに構成されています。
この記事は [Go Conference mini 2022 Autumn IN Sendai](https://sendaigo.connpass.com/event/256463/?utm_campaign=event_message_to_selected_participant&utm_source=notifications&utm_medium=email&utm_content=title_link) の発表でも使われています。# この記事に書かれていること
:::note info
gqlgen を使ったサーバの立て方
::::::note alert
Client 側の詳しい説明
:::# GraphQL とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c
draw.ioで作成した画面レイアウトから仕様書を自動で生成するツールを作ってみた
## このツールを作った背景
[draw.ioのライブラリを作った](https://qiita.com/capybara-alt/items/033596584f26cd96d94c)ので、実践編として投稿することにした。
前職がSIerでお客様に見せる画面イメージをdraw.ioで作成し、それを画面レイアウト定義(画面仕様書)に貼り付けて、番号や画面部品の詳細な説明などをつけていた。ただ、お客様とのミーティングで要望などを取り入れるたびにdraw.ioを修正→画面仕様書に貼り付け→画面部品の説明などの更新をしなければならなかった。この作業を少しでも楽にしたいという思いで中途半端な状態ではあるが、このツールを作成した。
## draw.ioを使う理由
draw.ioをプロジェクトで使うことになったのがきっかけで、部品にデータ(XMLのAttribute)を設定できたり、xmlファイルで管理されていることから、拡張ツールが作りやすそうと考えた。
## 実現方法
1. draw.ioで画面レイアウトを作成
2. (付番)対象の画面部品に対し、データを付与
![sample1.png](h
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o_1o0] データファイル作成
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o_1o0] データファイル作成
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O22o_1o0] データファイル作成 – data/board2.txt ファイル
あとで使うファイルを先に作成する
? 以下のファイルを新規作成してほしい
“`plaintext
? kifuwarabe-uec14
├── ? data
│ ├── ? board1.txt
? │ └── ? board2.txt
├── ? kernel
│ ├── ? board_area.go
│ ├── ? board_coord.go
│ ├── ? board_set.go
│ ├── ? o12o__11o1o0_board.go
│ ├── ? go.mod
│ ├── ? go.sum
│ ├──
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o1o0] 空点以外のところ(石または枠の上)に石を置くことの禁止
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o1o0] 空点以外のところ(石または枠の上)に石を置くことの禁止
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O22o0] 囲碁の石を打つルールの実装
# Step [O22o1o0] 空点以外のところ(石または枠の上)に石を置くことの禁止 – IsMasonryError関数作成
とりあえず、 `石または枠の上に石を置く行為` に `Masonry` (メイスンリー)という名前を付ける。
従って この主のエラーは `Masonry error` と呼ぶことにする。
そのようなエラーであるかどうか判定する関数の名前は `IsMasonryError` と呼ぶことにする## Step [O22o1o1o0] ファイル作成 – masonry.go
? 以下の既存ファイルを編集してほしい
“`plaintext
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o2o0] 連の認識と、呼吸点のカウント
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o2o0] 連の認識と、呼吸点のカウント
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O22o2o0] 連の認識と、呼吸点のカウント – GetLiberty 関数作成
盤上の座標を指定することで、そこにある `連` の `呼吸点` の数を算出したい
* `連` – Ren、れん。コンピューター囲碁用語。説明は省略
* `呼吸点` – Liberty、こきゅうてん。コンピューター囲碁用語。説明は省略? 呼吸点を数えるために探索すると、一緒に以下のことも行える
* 連の認識
* 隣接する連の色の取得このような探索を行う関数に名前を付ける。
`GetRen` がふさわしいが、慣習を優先して `GetLiberty` と名付けることにする## ~~Step [O22o2o1o0]~~
Moved to `[O11o
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o3o0] 相手の眼に石を置くことの禁止
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o3o0] 相手の眼に石を置くことの禁止
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O22o3o0] 相手の眼に石を置くことの禁止 – OpponentEye
囲碁のルールでは、相手の眼へは石を置けない。これを判定する
とりあえず、このルールへ直訳で短い名前を付ける。 仮に `OpponentEye` とでも呼ぶことにする
このルールは、あとで出てくる `Captured` のルールよりは優先度が低いとする
## Step [O22o3o1o0] ファイル編集 – kernel.go
? 以下の既存ファイルを編集してほしい
“`plaintext
? kifuwarabe-uec14
├── ? data
│ └── ? board1.txt
├── ? kernel
│ ├── ? play_r
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o4o0] 自分の眼に石を置くことの任意の禁止
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o4o0] 自分の眼に石を置くことの任意の禁止
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
## Step [O22o4o0] 自分の眼に石を置くことの任意の禁止
囲碁のルール上可能だが、明らかに損な手は、プレイアウトから除外したい。
対局時には許可し、プレイアウト時には禁止するよう、選択できるようにする### Step [O22o4o1o0] ファイル編集 – play.go
? 以下の既存ファイルを編集してほしい
“`plaintext
? kifuwarabe-uec14
├── ? data
│ └── ? board1.txt
├── ? kernel
│ ├── ? play_rule
│ ├── ? board_area.go
│ ├── ? board_coord.go
│ ├── ?
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o5o0] 任意の連の打ち上げ
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o5o0] 任意の連の打ち上げ
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O22o5o0] 任意の連の打ち上げ – RemoveRen 関数作成
## Step [O22o5o1o0] ファイル編集 – kernel_facade.go
? 以下の既存ファイルを編集してほしい
“`plaintext
? kifuwarabe-uec14
├── ? data
│ └── ? board1.txt
├── ? kernel
│ ├── ? play_rule
│ ├── ? board_area.go
│ ├── ? board_coord.go
│ ├── ? o12o__11o1o0_board.go
│ ├── ? check_board.go
│ ├── ? color.go
│ ├─
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o6o0] 死に石の連の打ち上げ
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o6o0] 死に石の連の打ち上げ
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O22o6o0] 死に石の連の打ち上げ – Captured
石Aを盤上に置いて指を離したばかりの盤面とする。
石Aに隣接する相手の石の連のうち、呼吸点が0のものは打ち上げる。このとき、 `OpponentEye` のルールと相反することがある
## Step [O22o6o1o0] ファイル編集 – play.go
? 以下の既存ファイルを編集してほしい
“`plaintext
? kifuwarabe-uec14
├── ? data
│ └── ? board1.txt
├── ? kernel
│ ├── ? play_rule
│ ├── ? board_area.go
│ ├── ? board_coord
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o7o0] コウの禁止
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o7o0] コウの禁止
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O22o7o0] コウの禁止 – Ko
永遠に同じ局面が繰り返してしまうような1手は置けない
## Step [O22o7o1o0] ファイル編集 – record_item.go
? 以下の既存ファイルを編集してほしい
“`plaintext
? kifuwarabe-uec14
├── ? data
│ └── ? board1.txt
├── ? kernel
│ ├── ? play_rule
│ ├── ? board_area.go
│ ├── ? board_coord.go
│ ├── ? o12o__11o1o0_board.go
│ ├── ? check_board.go
│ ├── ? color.
【Go】スライスからi番目の要素を削除する
・スライスで特定の要素を削除する場合、append関数で以下の処理を実施する。
1.削除する要素の1つ前の要素まで残す
2.削除する要素の1つ後の要素から追加する“`main.go
package main
import “fmt”func main(){
num := []int{1,2,3,4,5}
fmt.Println(num) // [1 2 3 4 5]// [:i] – 最初から数えてiコ目までの要素を取り出す
fmt.Println(num[:2]) // [1 2]// [i:] – 最初から数えて(i + 1)コ目の要素から取り出す
fmt.Println(num[2:]) // [3 4 5]// 3番目の要素を削除する
num = append(num[:2], num[3:]…) // 「…」を忘れない
fmt.Println(num) // [1 2 4 5]
}
“`### for文で処理する場合
“`main.go
package ma
Goについての記事
# Go
Go言語はC言語やJavaなどと同じく、静的型付け言語でありながら、PythonやJavaScriptなどの動的型付け言語のような特徴がある
## 特徴
メモリ管理および並列処理のコントロールは言語仕様およびランタイム・モジュールに組み込まれている
golangにbool型のXOR演算子がない
# はじめに
某サイトのプログラミングスキルチェックで、練習のためgolangで簡単な問題を解いていました。
私は他の言語では、もう…それはもう仕事では出せないような変態的な手法等使って解いたりしていて、それが脳の端でちらつき、不慣れな言語ではどうやってやるのだろうか、と検索をかけたりしています。# 問題について
“`golang
if (/* 式1 */) /*XOR演算子*/ (/* 式2 */) {
// 処理A
} else {
// 処理B
}
“`
問題を解くにあたって、`bool`型のXOR演算子を使いたい、と思った場面がありました。
しかし、「golang xor」で検索すると、`int`型同士のビット演算ばかりが検索画面に並びます。
ならばと「golang xor bool」で検索しても、XORではない演算子のみが出てきます。
更に調べると……そもそも`bool`型に対するXOR演算子など無いことが判明しました。# 解決法
しかしよく考えてみれば、XOR演算子ではないものの、同等の役割を持つものがありました。
“`golang
if (/
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O12o_1o0] 盤定義(盤面走査)
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O12o_1o0] 盤定義(盤面走査)
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O12o_1o0] 盤定義(盤面走査)
## Step [O12o0] ファイル作成 – board_area.go
? 以下のファイルを新規作成してほしい
“`plaintext
? kifuwarabe-uec14
├── ? kernel
? │ ├── ? board_area.go
│ ├── ? o12o__11o1o0_board.go
│ ├── ? go.mod
│ ├── ? kernel.go
│ ├── ? logger.go
│ └── ? stone.go
├── ? .gitignore
├── ? engine_config.go
├── ? engine.toml
├
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O13o_1o0] 盤表示
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O13o_1o0] 盤表示
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O13o_1o0] 盤表示 – board コマンド
## Step [O13o0] コマンド実装 – kernel.go ファイル
? 以下の既存ファイルを編集してほしい
“`plaintext
? kifuwarabe-uec14
├── ? kernel
│ ├── ? board_area.go
│ ├── ? o12o__11o1o0_board.go
│ ├── ? go.mod
? │ ├── ? kernel.go
│ ├── ? logger.go
│ └── ? stone.go
├── ? .gitignore
├── ? engine_config.go
├── ? engine.toml
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__10o0] 盤サイズの変更
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__10o0] 盤サイズの変更
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O15o__10o0] 盤サイズの変更 – resize コマンド
## Step [O15o__11o0] コマンド実装 – kernel.go ファイル
? 以下の既存ファイルを編集してほしい
“`plaintext
? kifuwarabe-uec14
├── ? kernel
│ ├── ? board_area.go
│ ├── ? board.go
│ ├── ? go.mod
? │ ├── ? kernel.go
│ ├── ? logger.go
│ └── ? stone.go
├── ? .gitignore
├── ? engine_config.go
├── ? engine.to
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__14o_1o0] データファイル作成
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__14o_1o0] データファイル作成
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O15o__14o_1o0] データファイル作成 – data/board1.txt ファイル
あとで使うファイルを先に作成する
? 以下のファイルを新規作成してほしい
“`plaintext
? kifuwarabe-uec14
├── ? data
? │ └── ? board1.txt
├── ? kernel
│ ├── ? board_area.go
│ ├── ? board_coord.go
│ ├── ? board_set.go
│ ├── ? board.go
│ ├── ? go.mod
│ ├── ? go.sum
│ ├── ? kernel.go
│ ├── ? lo
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__14o0] 初期盤面を設定する
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__14o0] 初期盤面を設定する
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O15o__14o0] 初期盤面を設定する – board_set コマンド
## Step [O15o__14o1o0] ファイル作成 – board_set.go ファイル
? 以下のファイルを新規作成してほしい
“`plaintext
? kifuwarabe-uec14
├── ? kernel
│ ├── ? board_area.go
│ ├── ? board_coord.go
? │ ├── ? board_set.go
│ ├── ? o12o__11o1o0_board.go
│ ├── ? go.mod
│ ├── ? go.sum
│ ├── ? kernel.go
│ ├── ? log
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o_1o0] 座標の定義
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o_1o0] 座標の定義
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O15o_1o0] 座標の定義
## ~~Step [O15o0]~~
Moved to `[O12o__10o1o0]`
## ~~Step [O16o0]~~
Remove
### Step [O16o1o0] コマンド実装 – kernel.go ファイル
? 以下の既存ファイルを編集してほしい
“`plaintext
? kifuwarabe-uec14
├── ? kernel
│ ├── ? board_coord.go
│ ├── ? board_area.go
│ ├── ? o12o__11o1o0_board.go
│ ├── ? go.mod
? │ ├── ? kernel.go
│ ├── ?
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o_4o0] 石の色定義
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o_4o0] 石の色定義
# 連載の目次
? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)
# Step [O11o_4o0] 石の色定義
`石` を定義していないが、先に `石の色` を定義する
石の色の組み合わせを定義する。
石の色の組み合わせは以下の4通りある。これらの集合を `Color` と名付けることにする* `Color_None` – 隣接する連は1つもない
* `Color_Black` – 黒石の連とだけ隣接する
* `Color_White` – 白石の連とだけ隣接する
* `Color_Mixed` – 黒石と白石の連の両方に隣接する## Step [O11o_4o1o0] ファイル作成 – color.go
? 以下のファイルを新規作成してほしい
“`plaintext
? kifuwarabe-uec14
├─