- 1. Go の気になったコミット (2022 年 4 月)
- 2. golang インターフェースからコードの自動生成
- 3. カスタムプロバイダを自作したらTerraformの仕組みをよく理解できた
- 4. VSCode devcontainerでGinの開発環境を構築するテンプレートを作りました
- 5. DDDの各層について
- 6. 【MySQL】【Go】this user requires mysql native password authentication.
- 7. JSON Schema の力で書きやすいオレオレ YAML ファイルを作る
- 8. [golang]list内の重複した値を消す
- 9. GoでLambda Function URLs ハンズオン
- 10. 【個人開発】今スーパーで安い食材と関連レシピをラインで探せるボットの友達が1000人超えたのでログを晒していく
- 11. 【Golang】Goroutineまとめ
- 12. go: json.Unmarshal(data, slice)
- 13. [Karabiner-Elements] イコール (=) を長押ししたらコロンイコール (:=) と入力できるようにする
- 14. 【Golang】Structオリエンテッドまとめ
- 15. 【Golang】ポインタまとめ
- 16. Goにおけるレシーバの型について
- 17. コマンドラインでAzure Functions Custom Handlerをデプロイする(Go / HTTP trigger編)
- 18. 【Go, Mysql】 DBに指定したidがあればinsert, なければupdate を行う
- 19. Docker-composeを使ってGoの実行環境の作成
- 20. Vue3 + leafletで格安薬局マップを作った件
Go の気になったコミット (2022 年 4 月)
[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。
前回作成したリストはこちら。
https://qiita.com/sg0hsmt/items/d74d96095b83f15746de
軽く説明を追加していますが勘違いや誤りがあるかもしれません。
## Topic
## Commits
### 2022-04-01
https://github.com/golang/go/commit/37065847d87df92b5eb246c88ba2085efcf0b331
楕円曲線暗号で使用する P-256 の処理で panic を起こす問題が修正されています。 [^1] [^2]
この修正はバックポートされており Go 1.17.9 および Go 1.18.1 がリリース済みです。[^1]: https://github.com/golang/go/issues/52075
[^2]: https://github.com/advisorie
golang インターフェースからコードの自動生成
調べているうちにそもそもVSCodeにこの拡張機能があったのでやめたが、その作業記録として。
# Work
https://github.com/progllama/interface-realize# .gitignoreの導入
## OS
### macOS
https://github.com/github/gitignore/blob/main/Global/macOS.gitignore## IDE
### VSCode
https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore## Language
### Go
https://github.com/github/gitignore/blob/main/Go.gitignore# VSCodeの設定
## Official
https://code.visualstudio.com/## spell checker
https://qiita.com/diescake/items/98c5a099e8
カスタムプロバイダを自作したらTerraformの仕組みをよく理解できた
# はじめに
個人で使うにはAWSお金かかりすぎますよね。格安VPSをお手軽に使えるようにTerraformで管理したいと思い調べたところ、ConoHA VPSとさくらのVPSが対応していると分かりました。でももっと安いVPS、WebARENA Indigoがあり、これをTerraformで何とか使いたいと思い、カスタムプロバイダを自作してみました(作ってみたものの結局、実用的かと言われると怪しい笑)。# Terraform Custom Provider
Terraformの説明はいまさらなので省略するとして、どうやらカスタムプロバイダが作れるようなので軽く調べてみました。Qiitaにもいくつか記事がありますが、バージョンが古かったりと結局は[公式ドキュメント](https://learn.hashicorp.com/collections/terraform/providers)を参考にしました。## Terraform plugins
ざっくりまとめると、CRUDに対応したクラウドAPIを呼び出すプラグインを[SDK](https://github.com/hashico
VSCode devcontainerでGinの開発環境を構築するテンプレートを作りました
# 概要
今回作成したテンプレートを使うと、ローカル環境を汚すことなく、コード補完、静的解析、デバッグ等のGoの開発ツールの恩恵を受けつつGinアプリケーションを開発できる環境を構築できます。
コード内容は以下のリポジトリより確認できます。https://github.com/rootsuke/gin-devcontainer-template/tree/master
# 構築される環境
* Go 1.18
* Gin
* air
* gopls, staticcheck, dlv等のGo開発ツール# 動作環境
* Docker
* VSCode
* Remote – Conatainers (VSCodeの拡張機能)# 使用方法
1. Open Folder in Conatainerをクリック
2. コンテナのビルドが完了したらターミナルを開いて `air` と入力上記手順が完了すると `localhost:8080` にてサンプルコードのJSONが表示されます。
以降はairがホットリロードを行ってくれますので、変更内容が自動で反映されます。実際のアプリケー
DDDの各層について
# はじめに
この記事は正しくは「DDDで採用されることの多いアーキテクチャが持つ層について」です。
#### 対象読者
DDDについて軽く勉強した人
DDDを採用していて、アーキテクチャについて調べ直したくなる時がある人#### 記事で論じないこと
そもそもDDDとは何か
DI、DIPといったアーキテクチャの話#### 記事で論じること
DDDで採用されるアーキテクチャの各層について# 概要
DDD(ドメイン駆動設計)で採用されることが多い、レイヤードアーキテクチャ、クリーンアーキテクチャ、オニオンアーキテクチャ、etc..が持つ**層**について理解を深める#### 層とは
本記事で指す層とは、プレゼンテーション層、アプリケーション/ユースケース層、ドメイン層、インフラストラクチャ層である#### 備考
本記事では主にアプリケーション/ユースケース層、ドメイン層について記載
内容の不備/間違いはご指摘ください
Go的な観点で書いています# ドメイン層
#### 役割
ドメインモデルを表現すること
※DDDにおけるドメインとは、ソフトウェアによって解決したい
【MySQL】【Go】this user requires mysql native password authentication.
go-sql-driverで`this user requires mysql native password authentication.`エラー
# 結論
my.ini
“`
[mysqld]
default_authentication_plugin=mysql_native_password
“`# 詳細
このエラーで調べると、 `AllowNativePasswords: true` を設定するように書いているのですが、これだけだと繋がらない場合はmysql側の設定を見直します。
https://qiita.com/ushio_s/items/ab64e7e9222bb5a67a11# 参考
https://github.com/go-sql-driver/mysql/pull/644/files
JSON Schema の力で書きやすいオレオレ YAML ファイルを作る
YAML を用いる独自の設定ファイル(いわゆる「オレオレ YAML」)を作る際は、その YAML ファイルのスキーマ (その設定ファイルがどのような key, value を持つべきなのかの情報) を [JSON Schema](https://json-schema.org/) として書いて紐付けを行うと、エディタのサポートが得られて便利、という話をします。
## JSON Schema を用意すると、YAML Language Server が補完等を行ってくれる
YAML ファイルの記述を支援するツールとして、[YAML Language Server](https://github.com/redhat-developer/yaml-language-server)[^1] があり、YAML ファイルのバリデーション、入力の補完や、値の説明などを行ってくれます。
[](https://github.
[golang]list内の重複した値を消す
“`
package main
import “fmt”
func main() {people := []string{“tanaka”, “sato”, “koike”, “tanaka”, “sato”}
unique := make([]string, 0, len(people))
m := make(map[string]struct{})
for _, v := range people {
if _, ok := m[v]; ok { //重複している際はok(true)となる
fmt.Println(ok)
continue //continueが終わった後再びforループの先頭に戻る
}
unique = append(unique, v)
m[v] = struct{}{} //重複を消す処理}
fmt.Println(unique) //出力:tanaka sato koike
}
“`
GoでLambda Function URLs ハンズオン
# はじめに
この記事はGoでLambda Function URLsをハンズオンしてみる内容となっています。
筆者がLambdaでGoを扱うこと自体が初めてだったため備忘録として簡単に環境構築からデプロイまでの手順も載せています。# 環境
MacBook Air M1# ハンズオン
ランタイム Go1.xを選択後、
Lambdaの関数の作成画面で詳細設定を開き “関数URLを有効化”をチェックします。
(認証はパブリックな利用を想定してNONEを設定しました。)
ランタイム設定のハンドラが`hello`となっているので適当な名前に変更します。
」という記事で紹介させていただいたラインボットの友達が1,000人を超えていたので、ユーザーの利用状況をログから分析して晒していきます。

※ラインボットやスクレイピングなどの技術的な話は前記事に譲って、本記事では技術については触れません。
## どんなボットなのか
1. イオン、イトーヨーカ堂、西友3社のネットスーパーから、今安くなってる食材を検索できる
2. 食材名から、リュウジさんや山本ゆりさんなど著名な料理研究家さんの関連レシピを探せるというのが主な機能です。
【Golang】Goroutineまとめ
# Goroutineとは
並列処理のこと。他の言語だとマルチスレッドなどと言われる。# 49 GoroutineとSync.WaitGroup
normal()とgoroutine()を並列で実行する場合、どちらかのメソッドにgoを頭につけて実行する。
“`go
package mainimport (
“fmt”
“time”
)func goroutine(s string) {
for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func normal(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go goroutine("world") normal("hello") } ``` ``` hello world world hello hello world
go: json.Unmarshal(data, slice)
“`go
package mainimport (
“encoding/json”
“fmt”
)func main() {
cases := []struct {
in []byte
}{
{
in: []byte(`[]`),
},
{
in: []byte(`null`),
},
{
in: []byte(“),
},
{
in: []byte(nil),
},
}
for _, tt := range cases {
out := []string{}
err := json.Unmarshal(tt.in, &out)
if err != nil {
fmt.Printf(“FAIL: %#v, err: %v\n”, []byte(tt.in), err)
} else {
fmt.Printf(“PASS: %s, out: %#v\n”, []byte(tt.in), out)
}
}
}
“`“`go
PASS: [], out: []stri
[Karabiner-Elements] イコール (=) を長押ししたらコロンイコール (:=) と入力できるようにする
# 概要
Go を書いているときに、代入文で `Shift-;` + `=` と入力するのが少々面倒だったので、
`=` を長押ししたら `:=` と入力できるようにしました。# Karabiner-Elements とは
https://karabiner-elements.pqrs.org/
# 設定
`~/.config/karabiner/karabiner.json` を開いて
`profiles > complex_modifications > rules` の中に下記ルールを追加してください。“`json
{
“description”: “イコール(=)を長押ししたらコロンイコール(:=)に置換する”,
“manipulators”: [
{
“from”: {
“key_code”: “equal_sign”,
“modifiers”: {
“optional”: [
“ca
【Golang】Structオリエンテッドまとめ
# 39 メソッドとポインタレシーバーと値レシーバー
### メソッド
#### 構造体の値を関数で使用する場合
“`go
package mainimport “fmt”
type Ver struct {
X, Y int
}func Area(v Ver) int {
return v.X * v.Y
}func main() {
v := Ver{3, 4}
fmt.Println(Area(v))
}
“`“`
12
“`Area()と構造体Verに結びつきがない
### 値レシーバー
オブジェクト指向のクラスとメソッドのように、構造体のメソッドのような形が作れる“`go
package mainimport “fmt”
type Ver struct {
X, Y int
}func (v Ver) Area() int {
return v.X * v.Y
}func main() {
v := Ver{3, 4}
fmt.Println(v.Area())
}
“`“`
12
“`###
【Golang】ポインタまとめ
# 34 ポインタ
“`go
package mainimport “fmt”
func main() {
var v int = 10
fmt.Println(v)
fmt.Println(&v)var p *int = &v
fmt.Println(p)
fmt.Println(*p)
}
“`“`実行結果.go
10
0xc0000160c8
0xc0000160c8
10
“`# 36 struct
“`go
package mainimport “fmt”
type Vertex struct {
X, Y int
S string
}func main() {
v := Vertex{X: 1, Y: 2, S: “ver”}
fmt.Println(v)v4 := Vertex{}
fmt.Printf(“%T %v\n”, v, v4)var v5 Vertex
fmt.Printf(“%T %v\n”, v5, v5)// ポインタ
v6 := new(Vertex)
fmt.
Goにおけるレシーバの型について
下記の様なコードがあるとします。
“`go
package main
import “fmt”
type Greet interface {
sayGreet() string
}type Hello struct {
Message string
}func (h *Hello) sayGreet() string {
return h.Message
}func createGreet() Greet {
return Hello{Message: “こんにちは”}//ここでコンパイルエラー
}func main() {
g := createGreet()
fmt.Println(g.sayGreet())
}“`
今このコードは、createGreet関数のreturnの箇所でコンパイルエラーを起こしています。なぜなのか。
createGreet関数の返り値はGreetインターフェイスです。
ということは
“`go
return Hello{Message: “こんにちは”}
“`
上記で返される返り値がGreetイン
コマンドラインでAzure Functions Custom Handlerをデプロイする(Go / HTTP trigger編)
# はじめに
[Microsoft Azure](https://azure.microsoft.com/ja-jp/?WT.mc_id=AZ-MVP-5004244)のFaaSである[Azure Functions](https://azure.microsoft.com/ja-jp/services/functions/?WT.mc_id=AZ-MVP-5004244)において、GoやRustはネイティブにサポートされておらず、Custom Handlerという仕組みを使って実現されています。
– [Azure Functions のカスタム ハンドラー | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-custom-handlers?WT.mc_id=AZ-MVP-5004244)
また、[Visual Studio Code](https://code.visualstudio.com/)と[Azure Functions エクステンション](https:/
【Go, Mysql】 DBに指定したidがあればinsert, なければupdate を行う
# Go , MySql で 指定したidにレコードがなければinsert, あればupdateを行う
dockerのMySqlにplacesテーブルを作成後、初期データをinsertしたかったため、primary keyのidをauto incrementせずにidを指定してinsertを行うようにした。
しかし、下記の場合だと、再度実行する際にDBにレコードが入っており、primary keyが重複するというエラーが発生した。
“`go:db.gofunc init(){
cmd := fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s(
id INT PRIMARY KEY,
name TEXT,
address TEXT)`, places)
Db.Exec(cmd)insert_init_data()
}func CreatePlace(id int, place string, address string) (err error) {
cmd := `insert into places(
Docker-composeを使ってGoの実行環境の作成
# はじめに
Goを使ったプログラムを書きたかったのでコンテナを使い簡単に環境構築を行おうとしました。今回はホットリロード機能も付けた状態となります。備忘録としてまとめます。# 構成
go
├ app
│ ├── go.mod
| ├── main.go
│ └── .air.toml
├ Dockerfile
└ docker-compose.yaml# ファイルの作成
## Dockerfile
“`sh:Dockerfile
# goバージョン
FROM golang:1.17.9-alpine
# アップデートとgitのインストール
RUN apk add –update && apk add git
# appディレクトリの作成
RUN mkdir /go/src/app
# ワーキングディレクトリの設定
WORKDIR /go/src/app
# ホストのファイルをコンテナの作業ディレクトリに移行
ADD . /go/src/app
# ホットリロード用
RUN go install github.com/cosmtrek/air@v1.27.3
Vue3 + leafletで格安薬局マップを作った件
[表示地域の格安薬局がひと目でわかるマップ](https://tobizaru.github.io/pharmacy_map/map/)を作成しました

## 薬の価格はどこの薬局でも同じではないのか
実は薬の価格はどこの薬局でも同じ、ではありません。
詳しくは[こちら](https://pharmacyassistant.xyz/entry/yasui-yakkyoku-ranking/)などで調べていただければわかりますが、
簡単に言えば、国は下記のような薬局により多くの報酬が得られるよう法律を定めています。– 実績として特定の病院ではなくいろいろな病院の処方箋を受け入れている薬局
– 大手でない小さな薬局、お客の少ない薬局
– ジェネリック医薬品をたくさん準備している薬局この報酬は全