## 経緯
急遽仕事で、[[WSL2]]の[[Ubuntu 22.04 LTS]]環境にて、[[Go]]で[[AWS]]のプロダクトを開発することになったので、あらかじめ環境整備とキャッチアップをしておく。
## キャッチアップの要件
- [x] [[Go]]
- [x] [[WSL2]] x [[Ubuntu]]
- [x] [[Docker]]
- [x] [[Neovim]]
- [x] [[Echo]]
- [x] [[OpenAPI Specification]]
- [ ] [[oapi-codegen]]
- [x] client
- [ ] server
- [x] [[PlantUML]]
- [ ] [[AWS]]
- [ ] [[Amazon Aurora]] ([[PostgreSQL]])
- [ ] [[LocalStack]] ([[AWS Lambda]])
## インストール状況とバージョン
インストールしていないものはバージョン列が空。
| 対象 | バージョン | バージョン(対応後) |
| ----------- | ---------- | ------------------ |
| [[Go]] | 1.21.3 | 1.21.4 |
| [[Docker]] | | 24.0.7 |
| [[AWS CLI]] | 2.13.33 | 2.13.33 |
エディタ系。
| 対象 | バージョン | バージョン(対応後) |
| ---------- | ---------- | ------------------ |
| [[Neovim]] | 0.8.3 | 0.9.4 |
## 各種インストールと最新化
### [[Go]]
```console
asdf install golang latest
asdf global golang latest
```
### [[Docker]]
```console
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
> [[📕UbuntuにDockerをインストール]]
```bash
sudo groupadd docker
sudo usermod -aG docker $USER
logout
newgrp docker
```
> [[📝dockerコマンドを実行するとpermission denied while trying to connect to the Docker deamonエラーになる]]
### [[Neovim]]
```console
asdf install neovim latest
asdf global neovim latest
```
## [[Go]]の[[Neovim]]環境を整える
### まずはHello world
<div class="link-card">
<div class="link-card-header">
<img src="https://go.dev/images/favicon-gopher.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">go.dev</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">Tutorial: Get started with Go - The Go Programming Language</p>
</div>
<div class="link-card-description">
</div>
</div>
</div>
<a href="https://go.dev/doc/tutorial/getting-started#code"></a>
</div>
```console
mkdir go-study
cd go-study
go mod init go-study
```
`main.go`を書く。
```go
package main
import "fmt"
func main() {
fmt.Println("Hello world!")
}
```
```console
$ go mod tidy
$ go mod run .
Hello world!
```
### スニペットを使えるようにする
[[Go]]では頻出する表現が多いため、スニペットを使って少しでも楽にコーディングしたい。[[Neovim]]と[[coc.nvim]]を使った環境でそれらを導入したい。
個人的ポリシーとして、[[LSP]]と向き合うような頑張りはしたくないので、あくまで楽に...できるだけ安定して運用できる方法を検討する。
既に [[📜2023-08-10 coc.nvimでスニペット(snippets)が使えるようにしてみた]] で導入済みたいなので確認する。どうやら[[WSL]]環境でインストールしていなかっただけなので、[[Neovim]]の[[Exコマンド]]からインストール。
```console
:CocInstall coc-snippets
```
特に警告なども出なかった。`fp`のような記載でスニペットが使えるようになった。
### [[coc.nvim]]のsuggestionsを絵文字にする
この辺を絵文字にしてみたい。
![[Pasted image 20231111150420.png]]
[[coc-settings.json]]で以下のように設定する。
```json
{
"suggest.completionItemKindLabels": {
"function": " ",
"variable": " ",
"module": " ",
"snippet": " ",
"struct": " ",
"keyword": " ",
"property": " ",
"method": " ",
"field": " ",
"interface": " ",
"folder": " ",
"file": " ",
"class": " ",
"constant": " "
}
}
```
> [[coc.nvimで補完候補(suggestions)にアイコンを表示]]
見やすくなった😊
![[Pasted image 20231111155143.png]]
### auto importされるようにする
スニペットから挿入すると、[[パッケージ (Go)|パッケージ]]を明示的にインポートする必要があるので面倒。保存したときに最適化されるようにする。
[[coc.nvim]]に以下を追加。
```lua
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = {"*.go"},
command = "call CocAction('runCommand', 'editor.action.organizeImport')"
})
```
> [[coc-goで自動インポート]]
### 実装への移動や呼び出し元への移動をもっと見やすく
[[coc.nvim]]のコマンド結果は直感的ではないので、[[coc.nvimのコマンド結果をTelescopeで見やすく]]する。
### [[vim-delve]]でデバッグしてみる
まずは[[DELVE]]をインストールしてみる。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">delve/Documentation/installation at master · go-delve/delve</p>
</div>
<div class="link-card-description">
Delve is a debugger for the Go programming language. - go-delve/delve
</div>
</div>
<img src="https://opengraph.githubassets.com/a7a588a42f9ebec6b9ef4ec08d5bba207372595f6c33a63499462dbea6de70fa/go-delve/delve" class="link-card-image" />
</div>
<a href="https://github.com/go-delve/delve/tree/master/Documentation/installation"></a>
</div>
```console
go install github.com/go-delve/delve/cmd/dlv@latest
```
次に[[vim-delve]]をインストールするため[[init.lua]]の[[lazy.nvim]]設定に追加。
```json
-- Go debugger
{
"sebdah/vim-delve",
ft = {'go'},
keys = {
{ '<Space>b', ':DlvToggleBreakpoint<CR>' }
},
config = function()
vim.g.delve_new_command = "new"
end
},
```
あとは[[Neovim]]を開いてブレークポイントをつけて、`:DlvDebug`の[[Exコマンド]]を追加する。そこから先のコマンドは[[DELVE]]を参照。
## [[Go]]の[[VSCode]]環境を整える
[[Neovim]]の環境だけだとリスキーなので、ホストの[[Windows]]から[[SSL]]経由で[[VSCode]]を使って開発できる環境を整える。[[VSCode Extension]]は以下2つを使う。
- [[Remote Development]]
- [[Go (VSCode)|Go]]
[[coc-go]]で使う[[リンター]]を[[Staticcheck]]にする。
```json
"go.goplsOptions": {
"staticcheck": true
},
```
> [!note]
> [[goimports]]は[[gopls]]のimport最適化コマンドに内包されているはずなので、[[goimports]]の設定は不要なはず... 必要な場合は以下のようになるが。
>
> ```json
> "[go]": {
> "editor.defaultFormatter": "golang.go",
> "editor.insertSpaces": false,
> },
> "go.formatTool": "goimports",
> ```
シンタックスハイライトも格好良くしてみる。
```json
"gopls": { "ui.semanticTokens": true }
```
> [[📝VSCodeのGoでシンタックスハイライトがしょぼい]]
これでOK。デバッグや他の機能は間に合っている。
## Echoを入れてみる
まずは[[Echo]]単体で動かしてみる。[[AWS]]については一旦無視。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - labstack/echo: High performance, minimalist Go web framework</p>
</div>
<div class="link-card-description">
High performance, minimalist Go web framework. Contribute to labstack/echo development by creating a...
</div>
</div>
<img src="https://opengraph.githubassets.com/a9092023cdee6fc47f1aa80321abc75a17f2ec5776ec5d5bbee499b77a135b8c/labstack/echo" class="link-card-image" />
</div>
<a href="https://github.com/labstack/echo"></a>
</div>
```console
go get github.com/labstack/echo/v4
```
`main.go`を書く。
```go
package main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func main() {
e := echo.New()
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.GET("/", hello)
e.Logger.Fatal(e.Start(":1323"))
}
func hello(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
}
```
```console
go mod tidy
```
`localhost:1323`にアクセスして結果が表示されればOK。
## [[OpenAPI Specification]]と連携する
[[oapi-codegen]]を使う。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - deepmap/oapi-codegen: Generate Go client and server boilerplate from OpenAPI 3 specifications</p>
</div>
<div class="link-card-description">
Generate Go client and server boilerplate from OpenAPI 3 specifications - GitHub - deepmap/oapi-code...
</div>
</div>
<img src="https://opengraph.githubassets.com/f20c092d5a61cbd4b6abfd39f2278ae8d0a4afeae5be9a9e1487b41d97aea4d9/deepmap/oapi-codegen" class="link-card-image" />
</div>
<a href="https://github.com/deepmap/oapi-codegen"></a>
</div>
基本は [[📜oapi-codegen v2を使ってOpenAPI SpecificationのYAMLからGoのコードを自動生成する]] を参照。
[[VSCode]]では[[OpenAPI Editor]]を使う。
<div class="link-card">
<div class="link-card-header">
<img src="https://marketplace.visualstudio.com/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">marketplace.visualstudio.com</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">OpenAPI (Swagger) Editor - Visual Studio Marketplace</p>
</div>
<div class="link-card-description">
Extension for Visual Studio Code - OpenAPI extension for Visual Studio Code
</div>
</div>
<img src="https://42crunch.gallerycdn.vsassets.io/extensions/42crunch/vscode-openapi/4.18.6/1691149572966/Microsoft.VisualStudio.Services.Icons.Default" class="link-card-image" />
</div>
<a href="https://marketplace.visualstudio.com/items?itemName=42Crunch.vscode-openapi"></a>
</div>
## [[PlantUML]]を編集する
こちらも[[VSCode]]で。その前に[[Java]]と[[Graphviz]]のインストールが必要。
```console
sudo apt install graphviz
asdf plugin-add java https://github.com/halcyon/asdf-java.git
asdf install java latest:corretto-21
asdf global java latest:corretto-21
```
そしたら、[[PlantUML (VSCode)]]をインストール。
<div class="link-card">
<div class="link-card-header">
<img src="https://marketplace.visualstudio.com/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">marketplace.visualstudio.com</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">PlantUML - Visual Studio Marketplace</p>
</div>
<div class="link-card-description">
Extension for Visual Studio Code - Rich PlantUML support for Visual Studio Code.
</div>
</div>
<img src="https://jebbs.gallerycdn.vsassets.io/extensions/jebbs/plantuml/2.17.5/1670813219516/Microsoft.VisualStudio.Services.Icons.Default" class="link-card-image" />
</div>
<a href="https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml"></a>
</div>
[[PlantUML]]を書いてみる。
```plantuml
@startuml
actor Mさん as M
participant Lさん as L
participant Tさん as T
activate M
M -> L: 税金
activate L
deactivate M
L -> T: ???
activate T
L <-- T: ありがたいお言葉
deactivate T
deactivate L
activate M
M -> T: 追及
activate T
M <-- T: 記憶にございません
L <- T: ???
deactivate T
activate L
destroy L
@enduml
```
以下のようになる。
![[Pasted image 20231112222734.png|frame]]