- 1. Go言語入門 学習メモ 11 ゴールーチン、チャネル、select、
- 2. Go言語入門 学習メモ 10 io.Readerインタフェース
- 3. Atlas APIにおけるMigrationモード
- 4. Herokuの代替としてFly.ioを使ってみた話
- 5. GoのgRPCサーバーでトランザクション
- 6. Go言語 : システムパフォーマンスチェック
- 7. Go言語入門 学習メモ 9 Stringerインタフェース、Errorインタフェース
- 8. Go言語入門 学習メモ 8 インタフェース、型アサーション、型スイッチ
- 9. Goで別々の構造体をマージしてJSONファイルを作成する
- 10. Go言語入門 学習メモ 7 メソッド
- 11. gRPCのサーバーが空配列を返してくれない
- 12. gRPCで3テーブル結合したデータを取得する
- 13. プログラミング言語Go アウトプット (5章)
- 14. Go言語入門 学習メモ 6 関数、無名関数、関数型、クロージャ
- 15. ABEMA Growth Techはすべてが最高な件
- 16. 【React×Go】フロント(React)とバック(Go)で連携する
- 17. go.mod で Go のバージョンを更新する
- 18. Go言語入門 学習メモ 5 type、for..range
- 19. Go言語入門 学習メモ 4 ポインタ、コンポジット型(配列、構造体、スライス、マップ)
- 20. GoとNode.jsでgRPCサーバーとクライアントを作成
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 stateModeReplay = iota
// ModeInspect computes the current state by inspecting the connected database.
ModeInspect
)
“``ModeReplay` は生成されたマイグレーションの定義から逆算して新しいマイグレーションを計算するが、一方で `ModeInspect` はすでにマイグレーション対象のデータベースのスキーマを参照しマイグレーションを計算する。
`Wit
Herokuの代替としてFly.ioを使ってみた話
# はじめに
カリルー(仮題)という個人間でのもののシェアの予約・金額計算を行うアプリを開発しようとしています。
もうすぐ公開!(進捗90%位?)といったところで、Herokuの無料プランが終了するという連絡がきました。Golangのginテンプレートを使って、フロント・バックともにHerokuにデプロイして実装しようとしていたため、このままでは莫大な金額をHerokuに上納しなければいけないと思い、安い(できれば無料の)サーバを探しているところです。
DBはとりあえずグループの管理だけを想定しています。
要は、がっつりHerokuを使ってた人じゃなくて、Webアプリ開発学習中という人向けということです。
# Fly.ioを選んだ理由
“Heroku 代替”で検索して出た記事をいくつか読みましたが、無料でHerokuばりの機能が搭載されていそうと感じたからです。まず使ってみて合わなければ変えます。AWSも検討しましたが、APIの作成がGUIで面倒くさそうなのと、12カ月しか無料じゃないほうのプランを使用しなければいけなさそうなのでやめました。
## 手順
公式のガイドに
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
プログラミング言語Go アウトプット (5章)
# はじめに
これまでの章のアウトプットやプログラミング言語Goのアウトプットをしようと思ったきっかけなどは[こちら](https://qiita.com/AtomuIshida/items/6e05c02a2bd82f1e133d)でまとめているのでぜひ読んで欲しいです。# 5章 関数
## 重要・学びになったと思うところ
### サイトのリンクを抽出する関数を作れた
“`go
package mainimport (
“fmt”
“net/http”
“os”“golang.org/x/net/html”
)func main() {
for _, url := range os.Args[1:] { // os.Args[1:]でコマンドライン引数を受け取る
links, err := findLinks(url) // 受け取った引数をfindLinks関数に渡す
if err != nil { // エラーハンドリング
fmt.Fprintf(os.Stderr, “findlinks: %v\n”, err)
continue
Go言語入門 学習メモ 6 関数、無名関数、関数型、クロージャ
# はじめに
船井総研デジタルの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
# 前回までの学習
前回は type、for..range を学習しました。https://qiita.com/fsd-osw/items/76a266184a3426886213
# 関数
Goの関数は戻り値の型を引数リストの後方に書きます。また、戻り値は複数指定すること
ABEMA Growth Techはすべてが最高な件
# 1 きっかけ
機械学習エンジニアになりたい。
私はこの夢の実現のために参加したのがこのインターンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1493403/cdc384cc-372c-f1c0-8e1e-9001023cc3d2.png)
>ABEMA Growth Tech ONLINEでは、サイバーエージェントの人気サービス「ABEMA」に対し番組レコメンド機能を制作していただきます。
これまでよりも、さらに難易度がレベルアップしたABEMA Growth Techを実施します。
インターン前半はABEMAの視聴データを題材として、機械学習を用いた番組レコメンド機能を利用可能なAPIとして構築します。
バックエンドはABEMAの現場で実際に利用されているGoやKubernetes等を用いて実践レベルで実装していただきます。
また後半は、皆さんのアイデア力と実装力を用いて、実際にABEMAの機能改善をしていただき、その内容を社員に提案していただく予定です。
そして本インタ
【React×Go】フロント(React)とバック(Go)で連携する
## はじめに
よく「フロントエンドは○○で、バックエンドは××で」みたいな記述を見かけますが、フロントエンドとバックエンドの連携というのが調べてもパッと出てこなく、学習初期によく疑問に思っていたのでまとめました。## 前提知識
ReactとGoの基本知識があることが前提。
#### Go
– APIサーバーを立ててjsonデータを返すことができる#### React
– useState, useEffect
– axios## 構成
フロントエンド:React
バックエンド:Goフロントとバックの連携という1点に集中したいので、DBは使わず、テストデータを直書きしています。
## 1. Goでjsonデータを返す
#### 1-1. 適当な作業ディレクトリを作成します。
“`
~/Desktop$ mkdir dev
~/Desktop$ cd dev
~/Desktop/dev$ mkdir go-app // goアプリ用
~/Desktop/dev$ cd go-app
~/Desktop/dev/go-app$ code . // vs co
go.mod で Go のバージョンを更新する
# 概要
go.mod で Go のバージョンを上げたくなったときの方法がわからなかったのでメモ。
なお、 Go 自体のバージョンを上げる方法もついでに書いておく。# 起きた現象
VS Code で Go の開発をしていて、ジェネリックを使おうと思ったら以下のエラーが出た。
Goのバージョン1.18以上で動作するとのこと。“`
type parameters require go1.18 or later
“`それでは Go のバージョンを上げようかと思ったら、 Go 自体は1.18になっていた。
“`bash
> go version
go version go1.18.3 darwin/amd64
“`答えは、単に go.mod でバージョンが低く設定されていただけであった。
“`go.mod
module samplego 1.17
…
“`# go.mod の更新方法
Go のバージョンは既に上がっているが、 go.mod のバージョンが低い場合はどのように更新するか。
go.mod は基本は手で触らないので、以下のコマンドで
Go言語入門 学習メモ 5 type、for..range
# はじめに
船井総研デジタルの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/b4e4d87cfe8f1ab100c5
# ユーザ定義型
typeは新規の型を作るためのキーワードで、Cで
Go言語入門 学習メモ 4 ポインタ、コンポジット型(配列、構造体、スライス、マップ)
# はじめに
船井総研デジタルの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/drafts/2ef594a01aabf09d6c7f/edit
# ポインタ
GoではC, C++のようにポインタを扱うことができるようです。ただし、ポインタの演算はで
GoとNode.jsでgRPCサーバーとクライアントを作成
## ディレクトリ構成
“`:ディレクトリ
root/
├ server/
│ ├ helloworld/
│ └ main.go
└ proto/
└ helloworld.proto
“`“`protobuf:helloworld.proto
syntax = “proto3”;option go_package = “./”;
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}// The request message containing the user’s name.
message HelloRequest {
string name = 1;
}// The response message containing the greetings
message HelloRep