- 1. Go言語で Codewars の問題を解くための設定
- 2. Herokuにサブディレクトリをデプロイするのに命削った話
- 3. goで画像のリサイズを行う
- 4. Goを触る①
- 5. 今更Qラーニングを勉強したっていい
- 6. MySQL WorkBench でスロークエリをとってISUCON頑張る
- 7. 【Golang】Gitコミットのrevision番号(commit id)を取得するには
- 8. go genericsメモ
- 9. Go の net/http で Web サーバーを立てる
- 10. GOルーチンの非同期処理で context の取り扱いに気をつけないと事故る
- 11. Golang 最新版を Amazon Linux2 へインストールする
- 12. (続) Ginフレームワークとsqlxを連携させた簡易プログラム例 (SelectとGetの違い、バルクインサート、トランザクション)
- 13. github.com/gin-gonic/gin がインストールできない?
- 14. 【自己学習】Go言語を学ぶ(2)
- 15. goでpluginパッケージを使う
- 16. WSLでEbitenGameJam用Go言語開発環境を構築
- 17. 【自己学習】Go言語を学ぶ(1)
- 18. 【Go言語】Ginフレームワークとsqlxを連携させた簡易プログラム例→sqlx中心です。
- 19. Go言語と抽象化
- 20. もうタイムアウトまで待たない!gomockでゴルーチンをまたいでエラーを出す方法
Go言語で Codewars の問題を解くための設定
# はじめに
Codewars の Go の問題はテスティングフレームワークとして Ginkgo https://onsi.github.io/ginkgo/ を使っているけれど、このフレームワークの使い方がわからなて試行錯誤して一応問題を解く上では困らなくなったのでメモを残す。
手順は以下の通り– 作業ディレクトリの作成
– モジュールの初期化
– フレームワークのダウンロード
– テストコードのコピー・ペースト
– テストの実行Codewars ではパッケージ名に kata を使うのが一般的なようなので、モジュール名を codewars、パッケージ名を kata にする。
## 作業ディレクトリの作成
“`
mkdir -p codewars/kata
“`## モジュールの初期化
“`
cd codewars
go mod init codewars
“`## フレームワークのダウンロード
ginko は v2 を使うことにした。特に理由はないが、Codewars のテストコードは v2 を使うように後で変更する。
“`
go ge
Herokuにサブディレクトリをデプロイするのに命削った話
## この記事について
以下のようなプロジェクトでサブディレクトリ(server/)をherokuにデプロイする話です
今回のプロジェクトではgoを使ってます
“`dir:directory
├─data
├─db
├─docker
├─front
├─scraping
└─server
├─domain
├─infrastructure
├─interfaces
│ ├─controllers
│ └─database
├─usecase
└─utils
“`## Docker環境のherokuへのよくあるデプロイ
トップディレクトリにmainファイルが存在し、そこにDockerfileやheroku.ymlが存在する
この場合だといろいろ設定して“`git push heroku master“`でいけそう
## 今回の場合
frontもserverも同じリポジトリで管理している
serverディレクトリのみをherokuでデプロイしたい
## 手順
以下のサイトに詳
goで画像のリサイズを行う
# はじめに
こんにちは、icemint0828です。
今回は自作パッケージの紹介も兼ねて、goでの画像のリサイズの方法を紹介します。## 動作環境
go 1.18.1## 使用パッケージ
* icemint0828/imgedit
画像のリサイズに使用しています。
画像ファイルの拡張子の変換にも使用しています。https://github.com/icemint0828/imgedit
## インストール
“`shell
$ go get github.com/icemint0828/imgedit@v1.2.0
“`# 画像のリサイズ処理(サイズ指定)
“`main.go
package mainimport (
“github.com/icemint0828/imgedit”
)func main() {
// サイズの指定(px)
width, height := 500, 500// FileConverter
fc, _, err := imgedit.NewFileConverter(“srcImage.png”)
Goを触る①
# はじめに
業務でGoを使うことになったので備忘録としてメモ# インストール
Mac環境なのでHomebrewを使う
“`
$ brew update
$ brew upgrade
$ brew install go
“`
インストールされているか確認
“`
$ go version
“`
パスを確認
“`
$ go env GOPATH
“`# Hello world
“`go
package main
import “fmt”
func main() {
fmt.Println(“Hello world”)
}
“`
runでファイルをそのまま実行
“`
$ go run hello-world.go
“`
buildでバイナリを生成することでバイナリを直接実行できる
“`
$ go build hello-world.go
$ ./hello-world
“`# 変数
変数 は var 変数名 型名で宣言
“`go
var hoge int
“`
初期値を設定することも可能
“`go
var hoge int = 1
“`
今更Qラーニングを勉強したっていい
## この記事は何か
タイトルの通りです。
強化学習を勉強しようと思ってから長い月日が過ぎたので、書きはじめました。
勉強しながら書くのでだんだん言っていることが変わる可能性があります。
おそらく定性的な議論ばかりして定量的な事をいいません。## なぜ
筆者は趣味で `botトレーディング`[^1] をしています。
結果は鳴かず飛ばずですですが、かなり楽しくやっております。
botはよく手入れをしている時は勝てるのですが、すぐに賞味期限が来て高速お金配りシステムへと変貌します。
Qラーニングは、せめて取引の手法がきまっているならその変数調整くらいは自動でやってほしいよねということで、諸々検討しているうちの一つです。[^1]: システム連動できる取引所で自動売買するシステム(bot)を運用してお金を得たり失ったりすること。
## やること
いきなり複雑な系を扱うよりはまずイメージを掴みたかったので下記を題材として進めていきます。![E00FD628-E316-4DB8-9571-03470679FED4_0.png](https://qiita-image-store.s3
MySQL WorkBench でスロークエリをとってISUCON頑張る
# MySQL WorkBench でスロークエリをとってISUCON頑張る
MySQL WorkBench を 仕事で最近使うようになりました。
MWBを触っているうちに、結構いろいろなことができることに気が付きました。
例えば、ER図を作成したり、スロークエリログをとることです。また、[達人が教えるWebパフォーマンスチューニング](https://gihyo.jp/book/2022/978-4-297-12846-3)が発売されて、Twitterで話題になっていて気になっていました。
「達人が教えるWebパフォーマンスチューニング ~ISUCONから学ぶ高速化の実践」について読み始めて、色々突っ込みどころというか、間違いが満載なので、Qiitaにまとめでも書こうかと下書きで書いているのですが、あまりに多すぎて、自分の時間の優先順位を思い出して書くのを止めようかと…
— Yoichiro Takehora (竹洞 陽一郎) (@takehor
【Golang】Gitコミットのrevision番号(commit id)を取得するには
# Go 1.18以降でBuildInfoを使う場合
[BuildInfo](https://github.com/golang/go/blob/9cec77ac11b012283e654b423cf85cf9976bedd9/src/runtime/debug/mod.go#L40-L47)のSettingsにある”vcs.revision”を取得。“`go:main.go
package mainimport (
“fmt”
“runtime/debug”
)func main() {
var rev string
info, _ := debug.ReadBuildInfo()
for _, s := range info.Settings {
if s.Key == “vcs.revision” {
rev = s.Value
}
}
fmt.Printf(“revision: %s\n”, rev)
}
“`“`sh
$ go mod init sample
$ git init && git add . && git c
go genericsメモ
go 1.18でchunk?が書きやすくなったのでメモ。
“`
import (
“fmt”
)func chunks[T any](l []T, n int) chan []T {
ch := make(chan []T)
go func() {
for i := 0; i < len(l); i += n { fromIdx := i toIdx := i + n if toIdx > len(l) {
toIdx = len(l)
}
ch <- l[fromIdx:toIdx] } close(ch) }() return ch } func main() { mm := []map[string]interface{}{ {"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "b": 6}, {"a": 7, "b": 8}, {"a": 9, "b": 10}, } for m := range chunks(mm, 3) { log.P
Go の net/http で Web サーバーを立てる
## 基本のコード
マルチプレクサとして `DefaultServeMux` を使用し、`http.HandlerFunc()` でハンドラを付与していきます。
“`go:main.go
package mainimport (
“fmt”
“net/http”
)func hoge(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “hoge”)
}func fuga(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “fuga”)
}func main() {
server := http.Server{
Addr: “:8080”,
Handler: nil,
}http.HandleFunc(“/hoge”, hoge)
http.HandleFunc(“/fuga”, fuga)server.ListenAndServe()
}“`
## 解説
### 構造体 `http.Serv
GOルーチンの非同期処理で context の取り扱いに気をつけないと事故る
`Go`の`context`パッケージの使い方がイマイチよく分からない。このように思っている方は、多いのではないでしょうか。
「**なんかリクエスト情報を持っている**」、今までなんとなくそう思いながら使っていました。そして、その`context`の使い方を間違えて本番にリリースした結果・・・ 見事に事故りました。
## 事故の経緯
今回使用したのは、`graphql`というライブラリです。GraphQLクエリ実行に便利なクライアントですね。
https://github.com/machinebox/graphql社内のAPIからコールしていたのは、このライブラリの`graphql.Run()`メソッドです。今回の修正がこちら。
もともと`context.Backgrount()`で空の`context`を生成して使用していたのですが、同じリクエストスコープだからといって、パラメータの`context`を使用することにしたら、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27
Golang 最新版を Amazon Linux2 へインストールする
Golang 最新版はこちら
https://go.dev/dl/
執筆時点の最新版は 1.18.3 でした
“`bash
wget https://go.dev/dl/go1.18.3.linux-amd64.tar.gz
“`ファイルを解凍します
“`bash
sudo tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz
“`パスを追加します
“`bash
echo ‘export PATH=$PATH:/usr/local/go/bin’ >> .bash_profile
“`確認
“`bash
source ~/.bash_profile
go version
“`結果
“`bash
go version go1.18.3 linux/amd64
“`
(続) Ginフレームワークとsqlxを連携させた簡易プログラム例 (SelectとGetの違い、バルクインサート、トランザクション)
[前回の記事](https://qiita.com/rikimaru-odd-person/items/519053f24c20a3344f9c)に続いて、下記3つの使用方法についてお見せしたいと思います。
– SelectとGetの違い
– バルクインサート
– トランザクション### 前回の記事
https://qiita.com/rikimaru-odd-person/items/519053f24c20a3344f9c### 始めに、おことわり
– 「使えればいい」レベルでの内容ですので、セキュリティやコード品質は無視しております。ご了承ください。
– クリーンアーキテクチャではなく、ベタベタなController+Model形式での設計であることをご容赦ください。### 環境とディレクトリ構成
前回と同じです### 例題のソース
https://github.com/rikimaru-tokyo/gin_sqlx_lesson02### 1: Select()とGet()の違い
– Select() : 複数行のデータ取得時に使用する。
github.com/gin-gonic/gin がインストールできない?
## なにが発生した?
Go言語のWebフレームワーク **Gin** が気になったので、Hello,World!的なものを作ろうとした。
その際に、
“`
> go install github.com/gin-gonic/gin@latest
“`
を実行したが、`go build`でパッケージが見つからないエラーが発生した。## この時の環境
“`
Microsoft Windows [Version 10.0.19044.1766]
(c) Microsoft Corporation. All rights reserved.C:\Users\7280ayubihs>go version
go version go1.18.3 windows/amd64
“`## 解決の備忘録
`go install`の実行後に調べてみると、`$GOPATH/pkg/mod`にGinが配置されており、`go build`実行時に`$GOPATH/pkg/mod`にパスが通っていないので、エラーになったようです。
で、この`$GOPATH/pkg/mod`は Go mod
【自己学習】Go言語を学ぶ(2)
公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list# Functions
関数は、0個以上の引数を取ることができます。
この例では、 add 関数は、 int 型の2つのパラメータを取ります。
変数名の 後ろ に型名を書くことに注意してください。概要
* 型指定が必要
* mainの引数から別のFunctionsを読み込んで返せる
* 必ずfunction内で`return`を忘れないこと* サンプルコード
“`go
package mainimport “fmt”
func add(x int, y int) int {
return x + y
}func main() {
fmt.Println(add(42, 13))
}
“`
* 結果:55`x int, y int`は `x, y int`に省略できる
* サンプルコード
“`
package mainimport “fmt”
func add(x, y int) int {
return x + y
}func
goでpluginパッケージを使う
## Go Plugin
– lambda関数を共通化できるlambda layerがPluginで作る必要があるみたいなので調べました
– lambdaでなければ、git submoduleとかのほうが使い勝手が良さそう
– Pluginだとローカルファイルとして用意してあげないといけないから## Plugin側
### サンプル
“`golang
package mainimport “fmt”
var V int
func F() { fmt.Printf(“Hello, number %d\n”, V) }
“`### ビルド
– `-buildmode=plugin`をつけて、`.so`でビルドする
– おそらく、カレントディレクトリでimport pluginをしていないファイルがプラグインとして認識されてビルドされる
–“`bash
GOOS=linux go build -buildmode=plugin -o plugin.so
“`## 呼び出し側
### サンプル
“`golang
package maini
WSLでEbitenGameJam用Go言語開発環境を構築
# 経緯
おおよそ2週間でEbitenを使用したゲーム開発を行うEbitenGameJamに参加することになりました。
https://itch.io/jam/ebiten-game-jamEbitenについては @eihigh さんの書いている記事がとても参考になります。
https://qiita.com/eihigh/items/1fd6077327f99245b807普段仕事で使用しているPCはMacですが、自宅用PCはWindowsです。
会社のPCで行うのもなんかなぁ…と思ったのでWindowsPCで開発を行うことにしました。まったくgo言語触れたことがなく、当初vscodeを使用した開発を~と思っていましたが、
普段主に使用しているのがVimの為、できる限り近い感じでの開発環境を探していたところ、
WSLというのがあるからそれが良いんじゃないか?とアドバイスを頂きましてそれを試すことにしました。# 使用しているPC
OS Windows 10 Pro
CPU i5-11400# WSL準備手順
いくつかのサイトを参考にさせて頂きました。ありがとうご
【自己学習】Go言語を学ぶ(1)
新しい言語としてgo言語を学ぶまずは公式チュートリアルから理解を深める
# Go言語とは
Googleが2009年に公開したプログラミング言語。
Robert Griesemer、Rob Pike、Ken Thompsonによって設計された。# Go言語の特徴
* オープンソース
* シンプルな構文
* コンパイルが速い
* 並列処理をサポートしている
* ガベージコレクションによるメモリ管理
* 安全性が高い
* 継承がない
* 容易なエラーハンドリング# 公式チュートリアル
https://go-tour-jp.appspot.com/welcome/1
まずはHello Worldから
“`go
package mainimport “fmt”
func main() {
fmt.Println(“Hello, world”)
}“`
# Packages
Goのプログラムは、パッケージ( package )で構成されます。
Go言語のソースファイルは必ず「package」文で始まる。Go言語は「パッケージ」という単位でグルーピングされる
【Go言語】Ginフレームワークとsqlxを連携させた簡易プログラム例→sqlx中心です。
Go言語の[Ginフレームワーク](github.com/gin-gonic/gin)と、同じくGo言語のデータベース処理用ライブラリ[sqlx](github.com/gin-gonic/gin)を連携させた実装例を今回お見せしたいと思います。
「[gorm](https://github.com/go-gorm/gorm)ネタは多いけど、sqlxネタは少ないな」と思ってましたので。
sqlxの使い方にクローズアップさせてまとめました。
### (2022/6/19) 続編作りました。
SelectとGetの違い、バルクインサート、トランザクションについてまとめました。
https://qiita.com/rikimaru-odd-person/items/4151b6c94c0f48882e9c
### 始めに、おことわり
– 「使えればいい」レベルでの内容ですので、セキュリティやコード品質は無視しております。
ご了承ください。
– クリーンアーキテクチャではなく、ベタベタな`Controller+Model`形式での設計であることをご容赦ください。
Go言語と抽象化
# はじめに
オブジェクト指向的な言語をはじめとして、大抵の言語は抽象化を行うための方法を有すると思います。
Go言語では、オブジェクト指向的な言語ではありませんが、interfaceという型により抽象化を行います。
例えば、package ioが定義しているReader インターフェースについて見てみましょう。
“`go
type Reader interface {
Read(p []byte) (n int, err error)
}
“`このコードは、**Readという名前のメソッドを持ち、かつ引数として[]byteを取り、かつ戻り値として(int, error)を持つ型は、Reader interfaceにより抽象化できる**ということを主張しています。
(ちなみに、`error`はビルトインで定義されているinterfaceです。)具体例を見てみましょう。
osパッケージにて定義されている型`File`は、以下のメソッドを持ちます。
“`go
func (f *File) Read(b []byte) (n int, err error)
“`
もうタイムアウトまで待たない!gomockでゴルーチンをまたいでエラーを出す方法
# TL; DR
– gomockのモックをテストと別のゴルーチンで動かすと、モック未定義エラーが起きてもテストが終了しない
– テストが失敗した際、`go test` のタイムアウトまでフリーズしてつらみ
– そこで、 `*testing.T` をラップした独自のReporterを渡し即時終了するようにする“`go
func TestHoge(t *testing.T) {
ctrl := gomock.NewController(NewConcurrentTestReporter(t))
defer ctrl.Finish()
}type ConcurrentTestReporter struct {
*testing.T
}func NewConcurrentTestReporter(t *testing.T) *ConcurrentTestReporter {
return &ConcurrentTestReporter{t}
}func (r *ConcurrentTestReporter) Fatalf(format string, args .