- 1. GORMのトランザクションについて
- 2. 【Go】Goのプロジェクトの雛形を作れるCLIツール「go-blueprint」を使ってみる
- 3. oapi-codegenを使ってGoのコード自動生成とAPIサーバーの起動までやってみた
- 4. [Go] 画像生成サイトをGoで構築してみた
- 5. go-vcrでレスポンスを加工してからカセットに記録する
- 6. printlnとfmt.Printlnの違いが気になったので少し調べた
- 7. go-rodでmoodleの出席登録を自動化
- 8. DynamoDB&Golang Queryまとめ
- 9. DynamoDB&Golang データ取得/更新/削除/操作まとめ
- 10. [VSCode] Goの環境設定。Failed to find the “go” binary in either GOROOT() or PATH(…) を解決する
- 11. bufio で string を取ろうとして詰まった話
- 12. 備忘録 GOの開発環境構築 @VScode
- 13. appendメソッドの初期容量以上の要素を追加したときに起こること
- 14. GoとRustの文字列周りのデータ型
- 15. Goの基本概念だけを学習してみた
- 16. 僕なりの Go 備忘録
- 17. DockerでGinのコンテナを立てようとしたらエラーが出た。
- 18. Ginの環境構築をdockerでやってみた
- 19. Dockerで簡単なGOの環境構築してみた
- 20. イベントソーシングを知ろう ~ステートソーシングとの比較とGoでの簡単な実装例つき~
GORMのトランザクションについて
## はじめに
GORMでDB操作していて、トランザクションをやりたかったので調べたときの備忘録です。細かいとこ間違っていたらすみません。## トランザクションとは
データベースへの複数操作(レコードの読み書きなどの複数SQL文)を1つのステップにまとめるための仕組み。
トランザクションを開始し、レコードを書き換え、処理後にコミットするという流れで行われる。トランザクションに関わるデータはコミットするまでロックされる。
### トランザクションの特性
4つの特性があり、頭文字をつなげてACIDと呼ばれる。
1. 原子性(Atomicity)
トランザクション内で行われる処理はすべて成功するか、すべて失敗するかのどちらかになる。
処理の途中で失敗した場合、それ以前の成功は無かったことになり、すべて失敗したものとして一連の処理が終了する。
2. 一貫性(Consistency)
トランザクションの前後で、データベースの整合性や制約など、正常な状態が失われないことを保証する。
3. 分離性(Isolation)
並行して実行される複数のトランザクションは、お互いに干渉せずに実行でき、あた
【Go】Goのプロジェクトの雛形を作れるCLIツール「go-blueprint」を使ってみる
# はじめに
こんにちは、kenです。お仕事ではGoをよく書いています。最近毎日GitHubのトレンドを見るようにしているのですが、先日いつものようにトレンドをチェックしていたら何やら面白そうなリポジトリを見つけたので今日はそれについて紹介しようと思います。
その名も「**[go-blueprint](https://github.com/Melkeydev/go-blueprint)**」です。https://x.com/ken_hassy/status/1796521428273233998
# go-blueprintとは
> Go Blueprint is a CLI tool that allows users to spin up a Go project with the corresponding structure seamlessly. It also gives the option to integrate with one of the more popular Go frameworks (and the list is growing wit
oapi-codegenを使ってGoのコード自動生成とAPIサーバーの起動までやってみた
# はじめに
コードの自動生成をすると、手軽にAPIサーバの起動をすることができました。
備忘録も兼ねて手順を紹介したいと思います。oapi-codegenのインストール法は別の記事にまとめているので、[OpenAPIのyamlファイルとoapi-codegenでGoの自動生成をやってみた](https://qiita.com/SBS_Takumi/items/8bcf5cb957b06b1633d5)を参照してください。
[コード全体像Githubリポジトリ](https://github.com/IamSBStakumi/Go_Sample_Server/tree/Qiita-Sample)
# やったこと
## yamlファイルの作成
Goおよびoapi-codegenのインストールが終わっているならば、yamlファイルを作成します。
これが仕様書の代わりにもなります。作成したyamlファイル
“`openapi.yaml
openapi: “3.0.3”
info:
version: 0.
[Go] 画像生成サイトをGoで構築してみた
### はじめに
この記事では、ホラーテイストの画像を生成するサイトをGo言語とHTMLで構築する方法を紹介します。
ユーザーがテキストを入力すると、その内容に基づいてホラー映画ポスター風の画像を生成し、レスポンスとして返します。[[Swift] ホラー画像生成アプリ]() のGo言語版です。
### 要件
– バックエンドはGo言語
– OpenAI APIを使う
– プロンプトを入力すると、ホラー画像を生成する### 準備
#### 環境構築
Go言語の開発環境は、公式サイトをご確認ください。
– [Go言語公式サイト](https://go.dev/)
#### ライブラリのインストール
以下のライブラリをインストールします。
– `gin-gonic/gin`: Webフレームワーク
– `nfnt/resize`: 画像リサイズ用ライブラリ※実行時にエラーが出たら、該当するライブラリをインストールしてください。
### ディレクトリ構成
“`
horror-image-generator/
├── main.go
└── index.htm
go-vcrでレスポンスを加工してからカセットに記録する
# TL; DR
– `*recorder.AddHook` でカセットを加工する関数を登録
– https://github.com/dnaeon/go-vcr/tree/v3?tab=readme-ov-file#hooks# はじめに
go-vcrはHTTPリクエストを行う関数のテストに使用するライブラリです。
https://github.com/dnaeon/go-vcr
初回テストでは実際にAPIリクエストを発生させ、リクエスト、レスポンスの組み合わせをカセット(実体はyamlファイル)に保存します。
2回目以降はクライアントがカセットをもとにレスポンスを返すため、実際にはリクエストが発生しません[^cassette]。これにより、
– 実際のAPIリクエスト、レスポンスでテストできる
– リクエストを発生させずにテストできるを両立することができます。
テスト実行時に対象サーバーへの疎通性やリクエスト負荷等を気にする必要はありません。また、冪等性のないリクエストが含まれていても繰り返し実行可能です。
# レスポンスの加工
ところで、テストで
printlnとfmt.Printlnの違いが気になったので少し調べた
Goにはbuildinで定義されるprint, println関数がある。
一方でfmtパッケージにもPrint, Println関数がある。
Goを学ぶとサンプルコードではfmt.Printlnで標準出力に出力することが多いが、print, println関数も使える。
この差について気になったので本記事でまとめる。
## 結論
print, printlnは標準エラー出力に、fmt.Print, fmt.Printlnは標準出力に出力される。
## 標準出力と標準エラー出力
標準出力とは、プログラムの出力を表示するために使われるチャネルのことを指す。
コンピュータのシステムやプログラムの情報の”正常”な出力を表示するために使われ、一般的にはディスプレイに表示される。
例えば`ls`コマンドなどはファイルやディレクトリの一覧情報などを標準出力に出力する。
一方で標準エラー出力は、プログラムのエラー情報を表示するために使われるチャネルのことを指す。
例えば`ls`コマンドで存在しないディレクトリを指定するとエラー情報が標準エラー出力に出力される。
どちらも出力先
go-rodでmoodleの出席登録を自動化
九大では講義時間内にmoodleの講義ページにログインすることで出席登録が行われますが、ユーザ名とパスワードを打ち込む→講義一覧から現在の講義を探す→出席登録という一連の流れが煩雑に感じたのでヘッドレスブラウザで自動化を行いました。
Goを選んだ理由はただ単に触ってみたい言語だったからです。:::note alert
九大moodleでは出席していないにも関わらずコースにログインして出席とする等の行為は不正出席であり、単位を取り消される場合があります。
自動化プログラムを使用して対面講義の出席登録を行う際は必ず講義に出席し、講義室のedunet(学内LAN)へ接続するようにしてください。
本記事のプログラムを使用したことにより生じたいかなる損害にも筆者は一切責任を負いません。
:::https://la.kyushu-u.ac.jp/usage-support/attendance/
## 実行環境
– go version go1.22.4 darwin/arm64
– macOS Ventura 13.4## ディレクトリ構成
“`
auto_attend/
├
DynamoDB&Golang Queryまとめ
Queryで使用するdynamodb/api.goに書かれたQueryInputは以下の通りです。
以下に、スペースを全て詰めた表を提供します。
|フィールド名|タイプ|説明|デフォルト値|SQLでの類似概念|
|—|—|—|—|—|
|*ConsistentRead|`*bool`|読み取りの整合性モデルを決定。`true`の場合、強い整合性の読み取りを使用。グローバルセカンダリインデックスではサポートされていない。|`false`|`SELECT` with `FOR UPDATE`|
|ExclusiveStartKey|`map[string]*AttributeValue`|評価を開始する最初のアイテムのプライマリキー。|`nil`|`OFFSET`|
|*ExpressionAttributeNames|`map[string]*string`|式内の属性名の代用トークン。|`nil`|`AS` (エイリアス)|
|*ExpressionAttributeValues|`map[string]*AttributeValue`|式内の属性値の代用トー
DynamoDB&Golang データ取得/更新/削除/操作まとめ
# PutItem/UpdateItem/DeleteItem/BatchWriteItem/TransactWriteItems
アプリケーションを作成する上で非常によく使用する操作の違いや特徴をまとめてみました。
# 特徴の比較
| 特徴 | GetItem | BatchGetItem | TransactGetItem |
|————————-|————————-|————————-|—————————-|
| **用途** | 単一アイテムの取得 | 複数アイテムの一括取得 | 複数の一貫したアイテム取得 |
| **最大アイテム数** | 1つ | 100個まで | 25個まで
[VSCode] Goの環境設定。Failed to find the “go” binary in either GOROOT() or PATH(…) を解決する
# 環境
– macOS Sonoma 14.4.1
– Apple M1 Pro
– VSCode:1.90.1
– Go for Visual Studio Code:v0.41.4
– `go1.22.4 darwin/arm64` installed by homebrew
– zsh
#もともとはJetBraisのGoLandを利用していたんですが、周囲でVSCode派が多く無料で利用できるので乗り換えてみることにしました。
GoのExtensionをインストールしていざ利用と思っていたところ以下のようなエラーダイアログがでて定義ジャンプなどの機能が使えなかったので解消のための設定を記録しておきます
## 遭遇したエラー
“`
Failed to find the “go” binary in either GOROOT() or PATH(…). Check PATH, or Install Go and reload the window. If PATH isn’t what you expected, see https://github.com/
bufio で string を取ろうとして詰まった話
## RE?
Atcoder で https://atcoder.jp/contests/abc237/tasks/abc237_d を解いていて、
テストケースのうち数ケースのみ RE ( Runtime Error ) になってしまった。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817605/735d6903-d2ae-a11b-b4af-f5f74a4ab26f.png)
## 原因
### 自分の実装
bufio の scanner をこんな感じで使っていたのが原因
“`golang
var sc = bufio.NewScanner(os.Stdin)func main(){
sc.Split(bufio.ScanWords)
s:=scanString()
}func scanString() (s string) {
sc.Scan()
s = sc.Text()
return
}
“`
### ソースコード#### 定数
備忘録 GOの開発環境構築 @VScode
# はじめに
今回自宅用のPCをMacbook airに変更したため、VScodeの環境もはじめから作り直すことにしました。
さらに転職も行うなど、また同じようなことを行わないといけないので、自分用のメモとして本記事を作っておきます。# VScodeのインストール
下記公式HPから使用環境にあったインストーラーをダウンロード。
[VScodeのダウンロードリンク](https://code.visualstudio.com/)
![](https://storage.googleapis.com/zenn-user-upload/75d765883bfc-20240308.png)ダウンロード後は、インストーラーを起動し、手順に従ってポチポチする。
# Goのインストール
Homebrewを使ってGoをインストールする(公式HPのインストーラーを使ってもOKだが、せっかくなので今回はHomebrewを利用する。Windowsの場合は公式HPからインストーラーを持ってきてインストールする形になる。)
※Homebrewのインストール方法は下記。
https://zenn.dev
appendメソッドの初期容量以上の要素を追加したときに起こること
## 実装
“`go
s4 := make([]int, 0, 4)
fmt.Println(s4, len(s4), cap(s4))
s5 := append(s4, 1, 2, 3, 4, 5, 6, 7, 8, 9)
fmt.Println(s5, len(s5), cap(s5))//[] 0 4
//[1 2 3 4 5 6 7 8 9] 9 10
“`上記の実装をしたときにs5の容量は初期に設定した以上の要素数を追加しようとしています。そのときにGo言語は、自動的により大きな容量を持つスライスを作成します。今回であれば、最初の1-4までの要素は初期値の容量で入れることができます。しかし、残りの5-9は一度、初期容量の倍の数スライス容量を増やします。それでも足りませんので、Go言語は2のべき条の数容量を追加します。よって、上記の例では倍数容量を追加したときに8となりますが、まだ足りないので、さらに2のべき条ずつ容量を追加します。今回は2だけで足りますので最終的`8+2`で10となります。
よって、次の実装も下記のような結果になります。
`
GoとRustの文字列周りのデータ型
筆者は普段Goを使って開発していてデータ型に関して馴染があった。
最近はRustを勉強し始めて文字列周りのデータ型について気になったことがあったのでまとめていく。
## Go
Goの文字列にまつわるデータ型は以下の通り。
– string
– byte
– rune### string
一般的に文字列を扱うためのデータ型。
特に補足はいらないと思うがコードで例を見てみる。
“`go
s := “Hello, World!”
fmt.Println(s)// “Hello, World!”
“`ダブルクオーテーションで囲まれた文字列がstring型として扱われる。
### byte
byteはuint8のエイリアスであり、バイトデータを扱うためのデータ型。
コードで例を見てみる。
“`go
b := []byte(“Hello, World!”)
fmt.Println(b)// [72 101 108 108 111 44 32 87 111 114 108 100 33]
“`このように文字列をbyte型に変換することでその文字のA
Goの基本概念だけを学習してみた
# はじめに
Go は近年非常に人気があり、多くの企業や開発者が使用しています。この記事では、Go の基本的な概念について学び、そのメリットを探ります。
# ポインタ
Go ではポインタを使用して変数のアドレスを参照できます。これにより、関数間でデータを効率的に共有することができます。
“`go
package mainimport “fmt”
func main() {
x := 5
fmt.Println(“Before:”, x)
increment(&x)
fmt.Println(“After:”, x)
}func increment(x *int) {
*x = *x + 1
}
“`このコードでは、increment 関数に x のポインタを渡しています。increment 関数内で x の値を変更すると、main 関数内の x の値も変更されます。
## ポインタのメリット
1. 効率的なデータ共有: 大きなデータを関数に渡す際に、データ全体をコピーするのではなく、ポインタを渡すことで効率的にデータを
僕なりの Go 備忘録
# GoとGinのDocker環境を作る
“`bash
.
├── Dockerfile
├── docker-compose.yml
└── www
├── app
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ └── views
│ └── index.html
└── html
“`“`yaml
# docker-compose.yml
version: ‘3’services:
go:
build:
context: .
dockerfile: Dockerfile
stdin_open: true
tty: true
volumes:
– ./www:/var/www
ports:
– 8080:8080
“`“`dockerfile
# Dockerfile
FROM golang:1.22.4-bullseyeWORKDIR /var
DockerでGinのコンテナを立てようとしたらエラーが出た。
# エラー内容
docker composeでコンテナを立てようとしたら
“`
docker compose up –build[+] Building 0.0s (1/1) FINISHED docker:desktop-linux
=> [server internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 200B 0.0s
failed to solve: dockerfile parse error on line 13: unknown instr
Ginの環境構築をdockerでやってみた
# はじめに
Goの有名なフレームワークの一つであるGinを触ってみたいと思い、dockerで環境構築してみました。
# Dockerでの環境構築## 1.Ginのインストール
まず、`Dockerfile`を記述します。“`Dockerfile
FROM golang:latestWORKDIR /code
“``docker-compose.yml`を記述します。
“`docker-compose.yml
services:
server:
build: .
container_name: gintest
tty: true
volumes:
– .:/code/
ports:
– 8080:8080
“`一度、`go.mod`を作成するためにイメージを作成します。
“`
docker compose build
“`ここから一旦コンテナを起動して、go.modを作成します。
“`
docker compose run –rm server sh -c “go mod ini
Dockerで簡単なGOの環境構築してみた
# はじめに
Goを触りたいと感じることが多くなり、Dockerで簡易的に環境構築してみようと思ったので、やってみました。# Dockerで環境構築
`Dockerfile`は以下のように記述します。
“`Dockerfile
FROM golang:latestWORKDIR /app
COPY . .
RUN go mod init myapp
“``docker-compose.yml`は以下のように記述します。
“`docker-compose.yml
services:
app:
build: .
container_name: gotest
tty: true
ports:
– 80:8000
volumes:
– .:/app
“`:::note
tty:trueとつけるとコンテナを永続させることができるので、`docker exec`コマンドが使いたい場合はつけたほうがいいです。
:::`main.go`にHello Dockerと表示させるスクリプトを書いてみます.
`
イベントソーシングを知ろう ~ステートソーシングとの比較とGoでの簡単な実装例つき~
イベントソーシングとは、データベースに保存するデータをイベントの形式で保存することです。イベントソーシングを使うことで、データベースの状態をイベントの履歴から再現することができます。
CRUDのようにデータベースの状態を直接変更するのではなく、イベントを発行してデータベースの状態を変更します。イベントソーシングを使うことで、データベースの状態を変更する操作をイベントの履歴として保存することができます。
ステートソーシングとイベントソーシングの違いは、データベースの状態を直接変更するのではなく、イベントを発行してデータベースの状態を変更する点です。イベントソーシングを使うことで、データベースの状態を変更する操作をイベントの履歴として保存することができます。
ステートソーシングにおいて履歴をトレースするためには、データベースの状態を保存するためのテーブルを作成したりロギングを行って時系列で解析する必要があります
この特徴から、イベントソーシングは、データベースの状態を変更する操作をイベントの履歴として保存することができるため特定の時点でのデータベースの状態を再現することが容易で