- 1. Dataloadersを使ったN+1問題への対応
- 2. Goでローカルサーバーを立てた~ファイルダウンロード~
- 3. Goの基本型について
- 4. [Go]Sentryに対応したcustom errorの作り方
- 5. DBコネクションプールをgolangで実現
- 6. 環境構築, Buildまで -Go編-
- 7. Goで再帰クロージャを実装
- 8. Go Modules(vgo)について
- 9. Go言語で簡単な画像処理のツールの類をつくってみた。
- 10. Golangのinterface型
- 11. 【Go】WSL2にGoをインストールする手順
- 12. RDSにORM使ったけどモヤモヤが止まらないのでぜんぶ吐き出す!!!
- 13. Goでbit全探索
- 14. GORMでマイグレーションする際の覚書
- 15. 【Golang】testing で、関数のエラー終了 “os.Exit(1)” をテストする
- 16. タグ1つでブログを収益化できる投げ銭サービスを支える技術
- 17. gRPCサーバーから”unknown service”エラーが返ってきた時の対処方法について
- 18. 【Go】実行・ビルド・パッケージのテストについて
- 19. Goには非短絡評価の論理演算子がなかった
- 20. go言語学習雑記 1
Dataloadersを使ったN+1問題への対応
# お題
Golang製GraphQLライブラリである[gqlgen](https://github.com/99designs/gqlgen)の「[Dataloaders](https://gqlgen.com/reference/dataloaders/)」を使って、N+1問題(ググるとわんさか記事が出てくる)を解決する。# 想定する読者
– Golangについてある程度書ける。
– 「GraphQL is 何?」ではない。
– gqlgenの [getting-started](https://gqlgen.com/getting-started/) で初期セットアップくらいはやったことがある。# 関連記事索引
– 第11回「[Dataloadersを使ったN+1問題への対応](https://qiita.com/sky0621/items/621f075e4257270a9e02)」
– 第10回「[GraphQL(gqlgen)エラーハンドリング](https://qiita.com/sky0621/items/affc833e770fee8b576e)」
– 第9回
Goでローカルサーバーを立てた~ファイルダウンロード~
初めに
===
Androidアプリからリクエストを投げて、GoでWebServerを立てたローカルサーバー上のファイルをダウンロードする環境
===
PC Windows10
Android Studio 4.0
Kotlin 1.3.72
Android端末 Emulator(API Level 29)
Go 1.11.1構成図
===
![go_server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/e8771fc0-f61a-3472-8ab4-5f998bb3e704.png)
Androidアプリからファイル名を指定して、サーバー側にリクエスト、サーバー側に保存されているファイルとステータスコードを返却実装
===
ローカルサーバー
—“`Server.go
package controllersimport (
“fmt”
“io/ioutil”
“net/http”
“os”
“strconv”
“strings”
)fu
Goの基本型について
##基本型
###論理値型
論理値はbool型で表します。下記のように、真の場合は**true**、偽の場合は**false**の値をとる動作をします。また、型推論での定義もできます。“`
var a bool //変数aをbool型で定義
a = true //変数aにtrueを代入
“`“`
a := true
“`###数値型
数値型には整数型が用意されており、**符合付き整数型**と**符合なし整数型**の2つの型が用意されています。符合付き整数型は“`int8“`、“`int16“`、“`int32“`、“`int64“`の型があり、数値がサイズを表しています。
符合なし整数型は“`uint8(byte)“`、“`uint16“`、“`uint32“`、“`uint64“`の型があり、同様に数値がサイズを表しています。符合付きと違う点として、“`uint8“`は“`byte“`型という別名でも定義することができ、uint8と同じ動作をします。また、64bit実装のGoでは“`int“`型は“`i
[Go]Sentryに対応したcustom errorの作り方
# はじめに
go v1.x の 標準erorrはシンプルなゆえに欲しい機能が足りていない事が多く
標準errorをより使いやすくした[`pkg/errors`](https://github.com/pkg/errors)等が存在しますが、それでもerror自体に特定のステータス(status codeやerror levelなど)を保持したい場合等はそれ専用のcustom errorを作る事になると思います。それ自体は良いのですが、errorが発生した際にそのerrorをSentryに通知したい場合
`sentry-go`の[`CaptureException()`](https://godoc.org/github.com/getsentry/sentry-go#Client.CaptureException)ではStacktraceの取得に以下のpackageを使用する事が前提になっています。
– [pingcap/errors](https://github.com/pingcap/errors)
– [pkg/errors](https://github.com/pk
DBコネクションプールをgolangで実現
#初めに
GCPをつかっていてコネクションプールの話に行き着きました。
「最大コネクション数が100を超えました」というエラーが発生。
なぜコネクション数が多くなってしまうのかを調べ、見つけた対処方法となります。#環境
クラウド:GCP
WEBサーバーをVue/CloudRun
APIサーバーをGolang/CloudRun
DBサーバーをMySQL/CloudSQL#原因
“`
APIを叩くたびにAPIサーバーとDBサーバー間で新しいコネクションができているから
“`と判明した。
つまり、コネクションの使い回しができていなかった。
#対策
database.sqlの以下のメソッドを使用し、コネクションプールの設定を行う。
また、ORMでもコネクションプールできるらしい。| メソッド名| 説明 |
|:-:|:-:|
|func (db *DB) SetMaxOpenConns(n int) |接続の最大数を設定。 nに0以下の値を設定で、接続数無制限。 |
|func (db *DB) SetMaxIdleConns(n int) |コネク
環境構築, Buildまで -Go編-
# Goについて
静的型付けプログラミング言語として急速に人気が向上しているGo言語(Golang)。
## 1. インストール
https://golang.org/dlgo コマンドを使用する。
正常にインストールされていたら、以下のような結果が表示がされます。“`
Go is a tool for managing Go source code.Usage:
go <command> [arguments]
The commands are:
bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages
Goで再帰クロージャを実装
# はじめに
Go言語の勉強version2ということで、アルゴリズムの勉強をGoでやってみたというものです。## 再帰クロージャ
まず、クロージャとはなのですが、下記に参考にした文を記載致します。>Goの無名関数は「クロージャ」です。クロージャは日本語では「関数閉包」と呼ばれ、関数と関数の処理に関係する「関数外」の環境をセットにして「閉じ込めた(閉包)」ものです。
ということで、無名関数を表しています。今回はこれを使用し再帰関数を作成してみることから始めました。
1. 下記に階乗を計算する関数[func fact (n int) int]を作成してみました。
“`fact.go
package mainimport (
“bufio”
“fmt”
“os”
)func main() {
r := bufio.NewReader(os.Stdin)
w := bufio.NewWriter(os.Stdout)
defer w.Flush()var a int
fmt.Fscan(r, &a)
result := solveFact(
Go Modules(vgo)について
##Go Modulesとは
Goの依存関係管理ツールです。一昔前まではdepが多く使われていましたが、Go1.11から導入され、多く使われているそうです。ちなみに、Go1.13から本格的に導入で、Go1.11~1.12は移行期ということなので該当している場合は、バージョンアップします。また、下記のコマンドで環境変数の確認をし、**GO111MODULE**を**on**にすることでも使えるようになるようです。
“`
$ go env
GO111MODULE=”on”
GOARCH=”amd64″
GOBIN=””
.
.
. //下に続く
“`##Go Modulesの使い方
実際にプロジェクトを作るところから一連の流れに沿っていきます。まず、任意のディレクトリで任意のディレクトリで新規にプロジェクトを作成します。また、Go Modulesを使う場合、GOPATH外でも置くことは出来ますが、保存先はGOPATH下になるそうです。→[参考記事](https://qiita.com/propella/items/e49bccc88f3cc2407745#go-modu
Go言語で簡単な画像処理のツールの類をつくってみた。
Go言語初学者です。普段の生息界隈はJS/TS+Javaですが、サーバーサイド言語の処理をもっと得意になりたいという理由から、今年からGo言語に挑戦しています。挑戦理由は「モダン, マルチスレッド, コンテナ関連での活躍」が挙げられます。
やはり、実際に何かを作って習得していくスタイルが自分には合っているので、今回は「画像処理」をテーマに、CLIとしてもAPIとしても使えるツール[yellow-high5/pictar](https://github.com/yellow-high5/pictar)を作ってみました。画像処理といってもCNNを使って画像認識させるような高度なものではないです。
## Go標準のimageパッケージ
まずは[Go標準のimageパッケージ](https://golang.org/pkg/image/)がどんな仕組みになっているか簡単に確認してみました。
### [Point](https://golang.org/pkg/image/#Point), [Rectangle](https://golang.org/pkg/image
Golangのinterface型
## interface型
– あらゆる型と互換性のある型
– Objectクラスのようなもの
– あくまで、全ての型の値を汎用的に表すものなので、演算などはできない“`main.go
package mainimport (
“fmt”
)func main() {
var x interface{}
fmt.Printf(“%#v”, x)
}
“`出力すると、
となる。
int型では0が初期値としてセットされるが、interface型ではnilとなる“`
$ go run main.go
“`
【Go】WSL2にGoをインストールする手順
# WSL2にGoをインストールする
いままでWindowsにインストールしたGoを使用してたけどどうせならWSL2で開発したいのでWSL2にGoをインストールしてみる
# 実行環境
OSは**Windows 10 Pro 64bit** (バージョン2004 OSビルド19041.572)
**WSL2**でOSは**Ubuntu-20.04**## 1.インストーラーをダウンロードする
まずは[Download and install – The Go Programming Language](https://golang.org/doc/install) を開き「Linux」を選択し、Linux用のインストーラーをダウンロードしてくる。
![FireShot Capture 139 – Download and install – The Go Programming Language – golang.org.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/20409
RDSにORM使ったけどモヤモヤが止まらないのでぜんぶ吐き出す!!!
転職活動で**バックエンドも出来るぜ!アピール**としてポートフェリオぽいの作った方が良いかもね・・?という事で、こんなリポジトリ作ってたわけなんですけど、コード書いてて気づいた事つらつらと書きます。
何時もの奔放な個人開発じゃなく、気づき、ハマりのQiitaらしいアウトプットってことで。ちゃんと調べて書けーって怒られそうな気もするけどw
## ORMの仕様とか親切で大惨事になるかも・・?
今回Goの代表的なORMである**gorm**を使いましたが、**Delete**投げる時に消す情報を先に取得しないまま、動かすと**テーブル内のレコードすべてが消える**のが仕様らしいんです!
“`
jsonData.Id = Ids
DBMS.F
Goでbit全探索
Donutsプロコンチャレンジ
B – Tokyo 7th シスターズ
https://atcoder.jp/contests/donuts-2015/tasks/donuts_2015_2“`
package main
import(
“fmt”
“bufio”
“os”
“strconv”
“strings”
“go/types”
“go/token”
)
var rdr=bufio.NewReaderSize(os.Stdin,10000000)
func readLine()string{
l,_,_:=rdr.ReadLine()
return string(l)
}
func readInts()[]int{
s:=strings.Split(readLine(),” “)
res:=[]int{}
for i:=0;i
GORMでマイグレーションする際の覚書
# はじめに
`struct`でモデル定義、`AutoMigrate`でマイグレーションを実行、といった辺りで少し調べた部分をメモしておきます。## IDにUUIDを使用するには
UUIDの自動生成をライブラリに任せつつ、テストやシードデータの投入時には固定のUUIDも指定できるようにしたかったため、以下のように対応しました。まずはstructでのモデルの定義
“`golang
package modeltype User struct {
ID string `gorm:”primaryKey;size:255;default:uuid_generate_v4()” json:”id”`
…
}
“`上記`uuid_generate_v4()`を利用するために、`AutoMigrate(&User{})` する前にpostgresに拡張機能 `uuid-ossp` をインストール
“`go
db, err = gorm.Open(“postgres”, fmt.Sprintf(
“host=%s port=%s user=%s passwor
【Golang】testing で、関数のエラー終了 “os.Exit(1)” をテストする
> Go 言語(以下 golang)の `testing` で関数が `os.Exit(1)` するのをテストしたい。
[「”golang” test “os.Exit(1)”」でググって](https://www.google.com/search?q=%22golang%22+test+%22os.Exit(1)%22&tbs=qdr:y)もドンピシャの記事がなかったので、自分のググラビリティとして。
## TL; DR
> 処理を別プロセスで実行して、ステータスを取得する。
> テスト自体には、環境変数でフラグが立っていた場合のみ該当する関数を実行するように分岐させておく。
>
> – [オンラインでサンプルの動作をみる](https://play.golang.org/p/RtFM-VrrVm2) @ The Go Playground
>
> ただし、カバレッジには反映されないので注意。カバレッジを 100% にするには、いささか工夫が必要です。(記事反映準備中)
>
> – [オンラインでカバレッジ 100% のサンプルを
タグ1つでブログを収益化できる投げ銭サービスを支える技術
# はじめに
こちらに今回の開発を通して一番重要だと感じていることを記事にしました。
[【個人開発】開発プロセスが何より大事だった ~ タグ1つでブログを収益化できる投げ銭サービス ~](https://qiita.com/yoshinori_hisakawa/items/caaf6acd7d979b7d7c01)先日 **[plog](https://plog.cash/)** というサービスをリリースしました。
![plog.gif](https://firebasestorage.googleapis.com/v0/b/plog-0925.appspot.com/o/cover.png?alt=media&token=d92ba0bc-4df4-4c10-a6c2-35b0a3ea746d)
[YouTube](https://youtu.be/1owJvJpMJWo) に使い方など載せています。
最近noteやzennなど、有料記事によるブログ収益化サービスが流行っています。
とても良いサービスですが、**プラットフォームに依存した収益ですし、何より手数料が高いな・
gRPCサーバーから”unknown service”エラーが返ってきた時の対処方法について
最近流行りのgRPC.
スキーマ言語であるProtocol Buffersによってデータをシリアライズ化する事ができ、
これまで主流だったjson通信よりもより高速に通信を行えるとして、
マイクロサービス開発で採用されるケースが増えている。この間gRPCで構築したクライアント・サーバー間の通信をやろうとした時にタイトルの通りのバグが発生し
だいぶ手こずったので、忘備録として原因と解決策を残しておこうと思う。## ソースコード
ソースはこちら。
https://github.com/yzmw1213/PostService## やろうとした事
goで書いたgRPCサーバーで、以下2つのサービスを実装する。
– 投稿サービス
– 投稿につけるタグの管理サービス(マスタデータとしての扱い)そして、typescriptで実装している client側のコードから、上のサービスにリクエストを送り処理を行う。
“` client.ts
import { Tag, CreateTagRequest } from “~/grpc/tag_pb”
import { TagSe
【Go】実行・ビルド・パッケージのテストについて
##一応 前提環境
・macOS
・goenv 2.0.0beta11
・go version go1.15.2 darwin/amd64##実行方法
今回は定番のHello Worldを実行します。とりあえず$GOPATH直下に**hello.go**という名前でファイルを作成し、そこに下記のプログラムを書きます。
“`
package main //パッケージの宣言import ( //使用するパッケージをインポート
“fmt”
)func main() { //関数main(エントリーポイント)の定義
fmt.Println(“Hello World”)
}
“`そうしたらファイルを作成したディレクトリをターミナルで開き、“`$ go run hello.go“`を入力し、**Hello World**と表示されたら実行成功です。
##ビルド
次はhello.goを実行ファイル形式にコンパイルします。下記のように**buildコマンド**を入力、-oオプションを使用することで実行ファイル名を指定できます。
“`
Goには非短絡評価の論理演算子がなかった
あまり意識することはなかったのですが、躓いてしまったのでメモ。
package, import文は省略しているので、完全なコードはリンク先をご確認ください。以下のコードのGoのバージョンは `go1.14.9` です。
# TL;DR
**Goには非短絡評価の論理演算子がないため、関数を含む場合は**– **事前に評価するか、**
– **関数を左辺に記述すべし**# 躓いた点
以下のようなコードがあるとします。
https://play.golang.org/p/en49-fRSNLU
“`go
func main() {
funcCalled := true
funcCalled = funcCalled || returnFalse()
fmt.Println(funcCalled)
}func returnFalse() bool {
fmt.Println(“returnFalse() called”)
return false
}
“`“`
trueProgram exited.
“`ここで `returnFalse(
go言語学習雑記 1
ちょっと前にGo言語を勉強していて、備忘録がてらその時のメモを書いていきます。
# パッケージ
goはパッケージと言う単位で構成され、その中の関数や変数の単位でimport,exportをしていきます。
できるかどうかは、文字の大文字小文字で判別されています。“`go
package mainimport (
“fmt”
“math”
)func main() {
fmt.Println(math.Pi) //OK
fmt.Println(math.pi) // error
}“`
大文字の場合はexport されず
小文字の場合はexport されます。# 変数宣言
変数は var <変数名> <型名> の形で宣言されます。
また分割代入っぽくかけます。セイウチ演算子(:=)を使うと型推論を効かせて型名を省略して宣言できます。その場合はの宣言は <変数名> := <値> となります
定数は const <変数名> = <値> となります。 定数の場合は勝手に型推論が働きます。
“`go
var i, j in