## 経緯 急遽仕事で、[[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]]