- 1. 「Go言語でつくるインタプリタ」の実行環境構築 M1 Mac
- 2. migrate用のコンテナを作成
- 3. [Go]gRPCの概要をつかむ
- 4. 【シンプルかつ即戦力!】Go言語 / sqlcの使い方!
- 5. GolangでLastInsertId is not supported by this driver が発生する話
- 6. GoでGeocoding APIを使う方法
- 7. RaspberryPiでGolang(cgo)でNEONを動かす
- 8. entで作成日時と更新日時のフィールドにはmixin.Timeを使うといいかも
- 9. Go言語入門 学習メモ 11 ゴールーチン、チャネル、select、
- 10. Go言語入門 学習メモ 10 io.Readerインタフェース
- 11. Atlas APIにおけるMigrationモード
- 12. Herokuの代替としてFly.ioを使ってみた話
- 13. GoのgRPCサーバーでトランザクション
- 14. Go言語 : システムパフォーマンスチェック
- 15. Go言語入門 学習メモ 9 Stringerインタフェース、Errorインタフェース
- 16. Go言語入門 学習メモ 8 インタフェース、型アサーション、型スイッチ
- 17. Goで別々の構造体をマージしてJSONファイルを作成する
- 18. Go言語入門 学習メモ 7 メソッド
- 19. gRPCのサーバーが空配列を返してくれない
- 20. gRPCで3テーブル結合したデータを取得する
「Go言語でつくるインタプリタ」の実行環境構築 M1 Mac
「Go言語でつくるインタプリタ」のサイトからソースコードをダウンロードし、Goのコンパイラをインストールし、コンパイルしようとしたら
“`terminal:terminal src/monkey/
$ go run main.go
main.go:5:2: package monkey/repl is not in GOROOT (/opt/homebrew/Cellar/go/1.19.2/libexec/src/monkey/repl)
“`
とエラーが返ってきてつまずいたので解決法を記事にしました。
# 環境
* macOS Monterey
* Apple Silicon(M1)
* Homebrew 3.6.7# 目標
「Go言語でつくるインタプリタ」のソースコードのコンパイル、実行ができるようにする。具体的には
“`terminal:src/monkey/
$ go run main.go
Hello {username}! This is the Monkey programming language!
Feel free to type in command
migrate用のコンテナを作成
## 環境
・Go
・MYSQL8.0
・Docker
## SQLファイルをDBに入れるSQLファイルを一度読み取り、“;“区切ってfor文で順番に入れた。
“`go:main.go
package mainimport (
“database/sql”
“io/ioutil”
“log”
“strings”_ “github.com/go-sql-driver/mysql”
)const (
path = “root:password@tcp(mysql:3306)/kartenspielen”)
var (
count = 0
)func main() {
db, err := sql.Open(“mysql”, path);if err != nil {
log.Println(err)
return
}
c, ioErr := ioutil.ReadFile(“./init.sql”)
if ioErr != nil {
log.Println(ioErr)
}
requests := strings.Spl
[Go]gRPCの概要をつかむ
来月からgRPCでのAPI開発をすることになっているので、事前に学習した成果をまとめた。
この記事は以下の構成になっている(あとから見返して思い出しやすいように)。– gRPCのイメージを座学的にざっくり → 詳細につかむ
– gRPC APIのサンプルを実際に動かしてみることで、イメージより強固にする# 1. ざっくり理解
## 1.1. gRPC
REST APIの対抗馬となる**APIのフレームワーク的なもの**。
対比させると下記のような形。項目|REST API|gRPC
—|—|—
HTTPプロトコル|HTTP/1.1|HTTP/2
メッセージのフォーマット|JSON や XML(テキスト)|Protocol Buffers(バイナリ)
コードの自動生成|サードパーティ製ツール(Swaggerなど)|Protocol Buffers(※protoc + gRPC拡張プラグイン)
リクエスト実行|<エンドポイントURL> (例. GET /user/1)|gRPCスタブ(内部的にはProtocol Buffers形式へのシリアライ
【シンプルかつ即戦力!】Go言語 / sqlcの使い方!
今回はGo言語におけるORMツールの一つである __sqlc__ を紹介します!
以前までGo言語のORMといえば、私の中では __GORM__ 一択という印象だったのですが、
たまたま触る機会があり、sqlcを使ってみるとGORMとはまた違ったメリットや使いやすいと感じた点もあったので、今回の記事でまとめていきたいと思います。# sqlcの概要
前述の通り、Go言語で使えるORM(ORマッパー)の一つがsqlcです。
GORMはRubyのActive Recordに近い感覚で使えるのに対して、sqlcはSQLで書かれたクエリを自分で用意したうえで、それを元にGo言語のクエリ用のコードを自動生成してくれます。
実行するSQLを事前に書かないといけないという手間は発生しますが、ORマッパーならではの「裏でどんなクエリが飛んでるか分からない」といったことが発生しないために、パフォーマンスの調整がしやすいのが嬉しいところですね。
一方で、現時点でGORMに比べて劣っている点として下記の2点が挙げられます。
1. DBのマイグレーションはスコープ外のため、golang-migr
GolangでLastInsertId is not supported by this driver が発生する話
## LastInsertId is not supported by this driver が発生
GoでDB操作のAPIを作成しているときに出会ったエラー“`Go
func (ur userRepository) CreateUser(ctx context.Context, user *entity.User) (*entity.User, error) {
statement := “INSERT INTO users (name,mail) VALUES($1,$2)”
stmt, err := ur.db.Prepare(statement)
if err != nil {
log.Println(err)
return nil, db_error.StatementError
}
defer stmt.Close()res, err := stmt.ExecContext(ctx, user.Name, user.Mail)
if err != nil {
log.Println(err)
return nil, db_erro
GoでGeocoding APIを使う方法
## Geocoding API のレスポンス
“`json:geocoding.json
{
“results”: [
{
“address_components”: [
{
“long_name”: “1600”,
“short_name”: “1600”,
“types”: [
“street_number”
]
},
{
“long_name”: “Amphitheatre Parkway”,
“short_name”: “Amphitheatre Pkwy”,
“types”: [
RaspberryPiでGolang(cgo)でNEONを動かす
# RaspberryPiでGolang(cgo)でNEONを動かす
## 動機
raspberry pi コンピュータリソースの最大使用に向けて。## 機材
Raspberry Pi4 4GB
go version go1.11.6 linux/arm
gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)## 元プログラム
neonとかについては[こちらから](https://qiita.com/Soleiyu/items/3e80975f00dd700f563b)“`test1.cpp
1 #include
2 #include
3
4 using namespace std;
5
6 int main () {
7
8 cout << "hoge" << endl; 9 10 int array1[2] = {31, 22}; 11 int array2[2] = {11, 20}; 12 int arrayAns[2];
entで作成日時と更新日時のフィールドにはmixin.Timeを使うといいかも
ビルトインで用意されている簡単なやつだけど `create_time` と `update_time` くらいだけでよければ便利。
ミクスインしてやればいいだけなので楽。
“`go
func (User) Mixin() []ent.Mixin {
return []ent.Mixin{
mixin.Time{},
}
}
“`
実装は以下のような感じっぽい。
“`go
// CreateTime adds created at time field.
type CreateTime struct{ Schema }// Fields of the create time mixin.
func (CreateTime) Fields() []ent.Field {
return []ent.Field{
field.Time(“create_time”).
Default(time.Now).
Immutable(),
}
}// create time mixin must implement `Mixin` interface.
var
Go言語入門 学習メモ 11 ゴールーチン、チャネル、select、
# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。# 対象読者
– これからGo言語を学習する方
– 既に他の言語で基本構文を学習されている方# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
– Windows 11 Home / 22H2
– VSCode / 1.72.2
– go version go1.19.2 windows/amd64
– git version 2.38.0.windows.1https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e
# 前回までの学習
前回は io.Readerインタフェース を学習しました。https://qiita.com/drafts/41f9a3dcdfe9c749718b/edit
# ゴールーチン
Goのランタイムで管理される並行処理を行うための軽量スレッド[^thread
Go言語入門 学習メモ 10 io.Readerインタフェース
# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。# 対象読者
– これからGo言語を学習する方
– 既に他の言語で基本構文を学習されている方# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
– Windows 11 Home / 22H2
– VSCode / 1.72.2
– go version go1.19.2 windows/amd64
– git version 2.38.0.windows.1https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e
# 前回までの学習
前回は Stringerインタフェース、Errorインタフェース を学習しました。https://qiita.com/fsd-osw/items/8d21babcd2f3b644b976
# io.Readerインタフェース
io.Readerインタフェ
Atlas APIにおけるMigrationモード
どういう違いがあるのか、ドキュメントに書かれていないように見えたがコードを見ると書いてあった。
https://github.com/ent/ent/blob/5330f877593201a1538884944f1783b104c6fbc4/dialect/sql/schema/atlas.go#L555-L563
“`go
// Mode to compute the current state.
type Mode uintconst (
// ModeReplay computes the current state by replaying the migration directory on the connected database.
ModeReplay = iota
// ModeInspect computes the current state by inspecting the connected database.
ModeInspect
)
“``ModeReplay` は生成されたマイグレーションのDDLから差分を計算してして新しいマ
Herokuの代替としてFly.ioを使ってみた話
– [はじめに](#はじめに)
– [Fly.ioを選んだ理由](#flyioを選んだ理由)
– [手順](#手順)
– [その1 flyctlのインストール](#その1flyctlのインストール)
– [その2 サインアップ & サインイン](#その2サインアップ–サインイン)
– [その3 アプリをFly上にラウンチ](#その3アプリをfly上にラウンチ)
– [チュートリアルやってみる](#チュートリアルやってみる)
– [fly.toml 内容](#flytoml-内容)
– [まとめ](#まとめ)
– [参考文献](#参考文献)# はじめに
カリルー(仮題)という個人間でのもののシェアの予約・金額計算を行うアプリを開発しようとしています。もうすぐ公開!(進捗90%位?)といったところで、Herokuの無料プランが終了するという連絡がきたので代替を試しがてら、メモとして記事を書いてます。がっつりHerokuを使ってた人じゃなくて、Webアプリ開発学習中という人向けの内容になります。
作ろうとしていたアプリは、Golangのginテ
GoのgRPCサーバーでトランザクション
`database/sql`を使ってtransactionを行ったのでメモ。
## 環境
* Go 1.19
* MYSQL8.0
* gRPC
## SQL
使用するSQLは下記の通り。
“`sql:init.sql
BEGIN;
SELECT * FROM player WHERE id = ? FOR UPDATE;
INSERT `table` (`key`, title, gameId, adminId, `limit`, `start`, extraFields) VALUES(“vfdsaa”, “Hello”, 1, 1, 3, 0, {“turn”: “”});
UPDATE player SET tableId = ? WHERE id = ?;
ROLLBACK;
COMMIT;
“`
ユーザーがルームを作成するという内容である。ユーザーが既にどこかのルームに所属している場合、作成はできない。## トランザクション
`database/sql`でトランザクションを行う場合、下記のメソッドを使用する。
“`go:repository.go
import (
Go言語 : システムパフォーマンスチェック
## 概要
システムパフォーマンスを計測するログを出力するためのサンプルである。
計測サンプルとして、素数を求めるためのゴルーチンを5つ起動させて、計算が終了した時点でそのゴルーチンは終了させている。
そして、それぞれの計算が終了した時点でのシステムログを出力させている。## ライブラリ
今回は”gopsutil”というライブラリを使用している。
https://github.com/shirou/gopsutilこのライブラリは、CPUやメモリなど、さまざまな情報を取得することができる。
適宜、以下のコマンドなどでインストールしてほしい。
$ go get github.com/shirou/gopsutil/cpu## ログ出力コード
“`Go
// Output system performance
func checkPerformance() {// CPU Performance
ps, _ := cpu.Percent(100*time.Millisecond, false)
cpuPercent := int(ps[0])//
Go言語入門 学習メモ 9 Stringerインタフェース、Errorインタフェース
# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。# 対象読者
– これからGo言語を学習する方
– 既に他の言語で基本構文を学習されている方# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
– Windows 11 Home / 22H2
– VSCode / 1.72.2
– go version go1.19.2 windows/amd64
– git version 2.38.0.windows.1https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e
# 前回までの学習
前回は インタフェース、型アサーション、型スイッチ を学習しました。https://qiita.com/fsd-osw/items/b935508aa2b0a6604185
# Stringerインタフェース
fmtパッケージが標準で持っているインタフェ
Go言語入門 学習メモ 8 インタフェース、型アサーション、型スイッチ
# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。# 対象読者
– これからGo言語を学習する方
– 既に他の言語で基本構文を学習されている方# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
– Windows 11 Home / 22H2
– VSCode / 1.72.2
– go version go1.19.2 windows/amd64
– git version 2.38.0.windows.1https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e
# 前回までの学習
前回は メソッド を学習しました。https://qiita.com/fsd-osw/items/f1b8788c827e218b55f3
# インタフェース
実装を抽象化、ポリモーフィズムを実現するための手段として用意されてるのはJavaやC++と同じ
Goで別々の構造体をマージしてJSONファイルを作成する
CSVのデータから2種類の構造体を作成し、その2種類の構造体をマージしてJSONファイルを作成したかった。
## JSON
最終的に下記のようなJSONを作成したい。
“`json:hoge.json
{
“JSON_1”: [
{
“id”: “1”,
“title”: “HOGE”,
}
],
“JSON_2”: [
{
“id”: “2”,
“title”: “FOO”,
“parentIds”: [
“1”
]
}
]
}
“`
## 構造体
JSONType2はJSONType1にParentsIDsが追加されたものである。
“`go:main.go
type JSONType1 struct {
ID string `json:”id”`
Title string `json:”title”`
}type JSONType2 struct {
ID string `json:”id”`
Title string `json:”title”`
ParentIDs []string `jso
Go言語入門 学習メモ 7 メソッド
# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。# 対象読者
– これからGo言語を学習する方
– 既に他の言語で基本構文を学習されている方# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
– Windows 11 Home / 22H2
– VSCode / 1.72.2
– go version go1.19.2 windows/amd64
– git version 2.38.0.windows.1https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e
# 前回までの学習
前回は 関数、無名関数、関数型、クロージャ を学習しました。https://qiita.com/fsd-osw/items/2c717815fba1b2a28785
# メソッド
一般にメソッドというとクラス内に定義された関数をイメージすると思いますが、
gRPCのサーバーが空配列を返してくれない
サーバー側から送信されているはずのオブジェクトのキーが排除されていたので原因を調べた。
そもそも LEFT JOIN を使っていたということもあり、レコードがない場合でも下記のようにオブジェクトを返していたので、空の配列を返すことにした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641690/cdd4a08d-739f-04eb-1cf7-9ea68dde865e.png)
## SQL
CASE WHEN THEN を使って値がない場合は空の配列を返すという条件を追加。
“`sql:sql
SELECT
g.id, g.name, g.orignal_extra_fields, CASE WHEN g.key is NULL THEN JSON_ARRAY() ELSE JSON_ARRAYAGG((JSON_OBJECT(‘key’, g.key, ‘title’, g.title, ‘gameId’, g.gameId, ‘adminId’, g.adminId,
gRPCで3テーブル結合したデータを取得する
gRPCで少し複雑なJSONを取得する方法に時間がかかったのでメモ。
## 環境
* Window10
* Go
* Node.js
* MYSQL8.0## JSON
最終的に下記のようなJSONが欲しい。“`json:game.json
{
“id”: 1,
“name”: “BLACK JACK”,
“tables”: [
{
“key”: “cf955e95-360b-43dd-bc0f-2d4569604a13”,
“title”: “Hello world”,
“gameId”: 1,
“adminId”: 3,
“limit”: 5,
“extraFields”: {
“turn”: “”
},
“players”: [
{
“i