- 1. go修行10日目 embeded
- 2. fish shell + anyenvでのGo開発環境構築
- 3. 【Go】並行処理の「拘束」で安全に並行処理を扱う
- 4. gRPC: メソッドの呼び出しと HTTP/2 フレームの関係
- 5. GraphQLについてまとめてみた
- 6. sqlxのNamedQueryをIN句に適用する方法(名前付きクエリ)
- 7. 【Go言語 GitHubActions】linterで特定のファイルを無視する方法
- 8. Hyperledger Fabricで個人情報をクエリする(RDB連携)
- 9. 【SRE/Go】バルクインサート
- 10. Hyperledger FabricのGetHistoryForKeyを利用した資産のトレース
- 11. 社内勉強会でGo言語を学ぶのにやってること
- 12. longcatのオプションメモ
- 13. go修行9日目 ポインタとか
- 14. Goのプロジェクトでもタスクランナーとしてnpmを使う
- 15. Go Web開発の大枠
- 16. Go Module Mirror から壊れたパッケージが落ちてくる
- 17. GoでHTTPサーバを立ち上げる(超基礎)
- 18. Golangで自作パッケージに対して入力補完が効かない場合
- 19. 次の水曜日の18:30をtimeパッケージで作る
- 20. [LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 2 -リッチメニュー切替-
go修行10日目 embeded
## embeded
– Go言語には継承がなくてその代わり
– VertexをVertex3Dがembededしている“`golang
package main
import “fmt”
type Vertex struct{
x, y int
}func (v Vertex) Area() int{
return v.x * v.y
}func (v *Vertex) Scale(i int){
v.x = v.x * i
v.y = v.y * i
}type Vertex3D struct{
Vertex
z int
}func (v Vertex3D) Area3D() int{
return v.x * v.y * v.z
}func (v *Vertex3D) Scale3D(i int){
v.x = v.x * i
v.y = v.y * i
v.z = v.z * i
}func New(x, y, z int) *Vertex3D{
return &Vertex3D{Vertex{x, y}, z}
}
fish shell + anyenvでのGo開発環境構築
fish shell + anyenvというパターンでのGoの環境構築の記事がなかったので、備忘録としてまとめます。
実行バージョン
– `fish 3.0.2`
– `anyenv 1.1.1`# anyenvでのgoenvのインストールと設定
まずanyenvでGoのバージョン管理システムのgoenvをインストールします。
“`bash
$ anyenv instal goenv
“`そして、goenv用の環境変数やaliasの設定をfish shellの設定ファイル`~/.config/fish/config.fish`に追記します。この部分がzshやbashとは違うので注意です。
“`bash
set -x GOENV_ROOT “$HOME/.anyenv/envs/goenv”
set -x PATH $PATH “$GOENV_ROOT/bin”set -gx PATH “$GOENV_ROOT/shims” $PATH
set -gx GOENV_SHELL fish
source “$GOENV_ROOT/libexec/../complet
【Go】並行処理の「拘束」で安全に並行処理を扱う
オライリーの[「Go言語による並行処理」](https://www.amazon.co.jp/dp/4873118468)を参考に、
実務で使ってみてなるほどと思った内容です。
今日初めて並行処理を書いたのでまだまだ浅い理解ですがメモとしてまとめてみます。# 拘束とは
拘束は、チャネルの読み書きを制限することにより、安全にチャネルを扱えるようにするという考え方です。
チャネルの扱いには注意が必要で、例えばチャネルに対する不適切な書き込みや、
チャネルを閉じる作業の漏れや重複により、デッドロックやpanicが起きてしまう可能性があります。
そうしたことを防ぐために、並行処理を関数にまとめてチャネルに対する権限を制限し、
関数の呼び出し側が安全に並行処理を扱えるようにするという考え方です。# コード
## 「拘束」を使わない場合
“`go
package mainimport (
“fmt”
“time”
)type processAResult struct {
Message string
Error error
}type processBResul
gRPC: メソッドの呼び出しと HTTP/2 フレームの関係
# この記事について
この記事では gRPC の Go言語実装である grpc-go を元に、 gRPC のメソッド呼び出しが HTTP/2 を使ってどう実現されているかをまとめる。– 環境情報
– Go 言語のバージョン : 1.14.4
– grpc-go のバージョン : 1.29.1# はじめに
この記事では、以下のようなシンプルな protobuf の定義(*.protoファイル)を用いて確認をしている。
“`protobuf
syntax = “proto3”;
package helloworld;service Greeter {
// Unary RPC
rpc SayHello (HelloRequest) returns (HelloResponse) {}
// Server streaming RPC
rpc SayHello_SS (HelloRequest) returns (stream HelloResponse) {}
// Client streaming RPC
rpc SayHello_CS (
GraphQLについてまとめてみた
# GraphQLとは
Facebookにより開発された、APIのためのクエリ言語であり、既存のデータを使用しクエリを実行するためのランタイム
GraphQLは、API内のデータの完全で理解可能な説明を提供し、クライアントに必要なものだけを正確に要求する力を与え、APIの長期的な発展を容易にし、強力な開発者ツールを有効にする (翻訳)
[GraphQL](https://graphql.org/)### クエリ言語とスキーマ言語
GraphQLは、一般的にクエリ言語とスキーマ言語から構成される
クエリ言語(フロント側)は、GraphQL APIのリクエストのための言語であり、データ取得に関連するquery、データ更新に関連するmutation、サーバサイドからのイベント通知を行うsubscriptionの3種類がある
一般的にはqueryとmutationを利用するスキーマ言語(サーバー側)は、GraphQL API の仕様を記述するための言語であり、記述したスキーマに従ってレスポンスを生成する
| | REST | GraphQL |
| ——– | —–
sqlxのNamedQueryをIN句に適用する方法(名前付きクエリ)
# 1. はじめに
Goの[sqlx](https://github.com/jmoiron/sqlx)でSQLを書く際に、IN句にNamedQueryを使おうとしてハマったので簡単な例文を書きます。
例はPostgreSQLで書いてます。# 2. 例文
コネクション生成“`Go
db, err := sqlx(“postgres”,”接続情報”)
if err != nil {
log.Fatal(err)
}
“`NamedQuery→PreparedStatementまでの変換
“`Go
baseQuery := `SELECT * FROM users WHERE id IN (:userID) AND name = :userName`bindParams := make(map[string]interface{})
bindParams[“userID”] = []int{1, 2}
bindParam[“userName”] = “Taro”
users := &User{}query, params, err := sqlx.Na
【Go言語 GitHubActions】linterで特定のファイルを無視する方法
調べてもあまりでてこなかったのでメモ用に残す
“`yaml
on:
pull_request:
paths:
– ‘**.go’jobs:
lint:
name: runner / lint
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v2
– uses: reviewdog/action-golangci-lint@v1
with:
github_token: ${{ secrets.github_token }}
tool_name: golint
# ここに–skipをつけて指定する
golangci_lint_flags: “–disable-all -E golint –skip pkg/”
level: warning
filter_mode: nofilter
fail_on_error: true
Hyperledger Fabricで個人情報をクエリする(RDB連携)
# Hyperledger Fabricのchaincodeで個人情報を検索します
Hyperledger Fabric(以下HF。HLFが正式な略称なのだろうか?)の`query`メソッドで個人情報を問い合わせます。前に投稿しましたが、HFの`State DB`に個人情報を持つのはよろしくないので、個人情報はRDB(PostgreSQL)から引き当てることにします。
// 最近はHFでも`chaincode`を`Smart contract`と呼ぶようになっている気がします。# 環境について
動作環境については次の通りです。前回の投稿と(ryUbuntu 18.04.4 LTS
docker-compose 1.26.0
docker 19.03.11
HF 2.1.1
go 1.14.4
PostgreSQL(Dockerイメージ) 12.3(latest)# 下準備
下準備をします。### RDBのテーブル定義
新しく個人情報用のテーブルを定義しました。DB`asset`内に`owner`テーブルを定義しました。“`sql
asset=# \d owner
【SRE/Go】バルクインサート
## バルクインサートとは?
複数行のデータ1回の`SQL`文でインサートしたい時に使用できます。
下記のようなSQLになります。“`sql
INSERT INTO user values(‘test1’), (‘test2’), (‘test3’);
“`
[SQLのインサートとバルクインサート – Qiita](https://qiita.com/bunty/items/91283160b0a38956655e)
[バルクインサート (bulk insert)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word15497.html)## なぜバルクインサートを使うのか
>SQLは一文発行するごとに通信が発生します。その通信にかかる往復の時間は「MySQLがSQL文を解釈して、データベースから該当のデータを探して、何らかの処理をする」という一連の流れを行なう時間よりも遅い場合がほとんどです。
ですからなるべくまとめられる処理はまとめることで、総実行時間を短くするというのが目的なのです。
[My
Hyperledger FabricのGetHistoryForKeyを利用した資産のトレース
#マイカーの一生をトレースしましょう
Hyperledger Fabric(以下HF)の`GetHistoryForKey`を使って、中古で買ったマイカー「ミラ・キータ」の購入から廃車までをトレースしました。シナリオは次の通り。1. Mira Qiitaの中古車を購入
2. 調子が悪いのでディーラーへ持ち込み
3. ディーラーから工場送り
4. ディーラーへ戻ってくる
5. 我が家へ戻ってくる
6. また調子が悪くなってディーラーに引き取ってもらうことに
7. とても古くて廃車送りに
8. 廃車のために工場送り
9. さようなら。。# 環境について
動作環境については次の通りです。前回の投稿と同じですね。Ubuntu 18.04.4 LTS
docker-compose 1.26.0
docker 19.03.11
HF 2.1.1
go 1.14.4
PostgreSQL(Dockerイメージ) 12.3(latest)# データ構造を考える
あまり考えることもなく、`GetHistoryForKey`から得られる情報を構造体へ定義しました。“`go:asset
社内勉強会でGo言語を学ぶのにやってること
# 概要
社内で勉強会の時間を取り分けることが出来たので、数人で集まって毎週2時間程度を取り分けてGo言語の勉強をする事にしました。PHPプログラマや機械学習チーム、インフラさんの混成チームで、社歴も年齢も様々なので、基本的に皆Go言語の初心者としてスタートしました。(途中から詳しいメンバーが合流)Goを選んだ理由としては、
* PHP以外の選択肢を増やしておきたい
* PHPでは難しい処理(並行処理等)が行える言語がよい
* 複数人で限られた時間で行うので、学習コストがそこまで高くない
* 業務の合間での息抜きや刺激が欲しいと大それた志があるわけではありません。
業務ですぐいに活かせそうな、Vue.jsとも迷ったのですが、今回はサーバーサイド言語になりました。
# A Tour of Go
* https://go-tour-jp.appspot.com/welcome/1
* 6時間程度
* 「あーでもないこーでもない」 と言いながらドキュメントも参照しつつ動かしてみる
* 環境作りもこの頃学ぶ# Codewars
* https://www.code
longcatのオプションメモ
[mattn/longcat]のオプションまとめ
## インストール
“`bash
$ go get github.com/mattn/longcat
“`## オプション一覧
`longcat [-n,l int][-i float64][-r,R,H][-o filepath][-d dirpath][-t themename][-themes][-pixterm][-dark][-ascii]`
### `-n int`
– how long cat
– 長さ指定(<-5でエラー) - def: 1 ### `-l int` - number of columns - 横に並ぶ数指定 - def: 1 ### `-i froat64` - rate of intervals - lオプションを使用した際のカラム同士の幅を指定 - def: 1.0 ### `-r` - flip holizontal - 横に反転 - def: false ### `-R` - flip vertical - 縦に反転 - def: false ### `-H`
go修行9日目 ポインタとか
## ポインタ型
– `&n`でポインタのアドレスを指定
– `*int`で指定したアドレスの中身を取得“`golang
package main
import “fmt”
func main() {
var n int = 100
fmt.Println(n)
fmt.Println(&n)// pはポインタ型
var p *int = &nfmt.Println(p)
fmt.Println(*p)
}
“`“`
100
0xc000104030
0xc000104030
100
“`## newとmake
“`golang
package main
import “fmt”
func main(){
// メモリのアドレスを確保している
var p *int = new(int)
fmt.Println(p)// メモリのアドレスは確保していないのでnil
var p2 *int
fmt.Println(p2)
}
“`“`
0xc0000120b8
“`## stru
Goのプロジェクトでもタスクランナーとしてnpmを使う
[Go](https://golang.org/) のタスクランナーとして [npm](https://www.npmjs.com/) を使ってみたら案外よかった。Go に限った話ではないけど、Go が特に開発ツールチェーン周りの管理がしにくいので噛み合いやすいのではないかと思う。
[npm](https://www.npmjs.com/) は [Node.js](https://nodejs.org/ja/) 用のパッケージマネージャだが、[npm-scripts](https://docs.npmjs.com/misc/scripts) という簡易なタスクランナー機能がついている。また、Node.js 用の便利な開発ツールをそのまま利用できて、開発ツールのインストールも一括で管理できる。
## npm をタスクランナーとして使う利点
– Node.js のインストールだけで利用できる
– 簡易なタスクランナーが利用できる
– **Node.js 用の開発ツールが利用できる**
– husky + lint-staged, Prettier, etc
– 開発ツールのイ
Go Web開発の大枠
#Web開発の大枠
今日学んだWeb開発の大枠の流れについてまとめてみた。
(参考)
[Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る](https://www.amazon.co.jp/Go%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Sheong-Chang-ebook/dp/B06XKPNVWV)
##HTTP通信の流れ
まずHTTP通信の流れを理解する。1.クライアントがサ
Go Module Mirror から壊れたパッケージが落ちてくる
“`
$ go version
go version go1.14.1 darwin/amd64
“`# TL;DR
– パッケージのメンテナがリリースを間違えるとミラーから永遠に壊れたパッケージが落ちてくるのでユーザーは気をつけよう
– パッケージをリリースする人は一度ミラーされたバージョンは永遠に消えないのでかなり気をつけよう# 概要
今日、Go 向け Discord クライアントライブラリの `DiscordGo` にアップデートが降ってきました:
[bwmarrin/discordgo](https://github.com/bwmarrin/discordgo/releases/tag/v0.21.0)
さて、早速自身のプロジェクトの依存関係のアップデートを試みます:
“`
$ go get -u github.com/bwmarrin/discordgo
go: downloading github.com/bwmarrin/discordgo v0.21.0
go: downloading golang.org/x/crypto v0.0.0-20
GoでHTTPサーバを立ち上げる(超基礎)
#GoでHTTPサーバを立ち上げる
“`server.go
package mainimport (
“fmt”
“net/http”
)func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “HTTPserver”)
}func main() {
http.HandleFunc(“/”, handler)
http.ListenAndServe(“:8080”, nil)
}
“`
##ハンドラを定義する
“`
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “HTTPserver”)
}
“`
・1つ目の引数:**レスポンス先**
・2つ目の引数:**リクエストの受付**
・{ }内はハンドラで行う処理内容
##ハンドラとエントリポイントを結びつけ
“`
http.HandleFunc(“/”, handler)
“`
・1つ目の引数:エントリポイント
・2つ目の引数:呼
Golangで自作パッケージに対して入力補完が効かない場合
Golangを試している時にハマったので、事象と対応方法のメモです。
# 環境
OS:mac
エディタ:Visual Studio Code(Goの拡張機能インストール済み)
Golang Version:go1.14.4 darwin/amd64# 自作パッケージに対して入力補完が効かない?
下記のような自作パッケージを作成して、
別のソースから呼び出そうとしたところ、入力補完が効かない・・・“`golang/sample/testpackage
package testpackageimport “fmt”
func Test() {
fmt.Println(“test”)
}
“`# 解決策
go install {パッケージ名} コマンドを実行すると入力補
次の水曜日の18:30をtimeパッケージで作る
## はじめに
Goの`timeパッケージ`で「次の水曜日の18:30」を作る方法を備忘録として残します。ここではエラー処理は省略します。
作ったコードは以下の通りです。“`go
// ロケーション情報を取得
loc, _ := time.LoadLocation(“Asia/Tokyo”)// 指定ロケーション(Asia/Tokyo)の現在時刻を取得
now := time.Now().In(loc)// 指定ロケーション(Asia/Tokyo)の18:30を作成
next := time.Date(now.Year(), now.Month(), now.Day(), 18, 30, 0, 0, loc)// 水曜日まで進める
d := time.Wednesday – next.Weekday()
if d <= 0 { d += 7 } next = next.AddDate(0, 0, int(d)) fmt.Println(next) ``` [playgroundで試してみる](https://play.golang.org/p/zQwKkxVb
[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 2 -リッチメニュー切替-
この記事はこの記事の続きです
[[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 1 -グループ管理-]()# リッチメニューを作る
さて、前回はグループへの招待・退会で管理メンバーの追加・削除をできるようにしました。
その際にリッチメニューをユーザ用と管理者用に切り替えます。
今回はそのリッチメニューを作ります。今回はユーザー用を 3 x 1 (1200 x 405)
管理者用を 3 x 2 (1200 x 810) のメニューを作ります。
動作確認のため、上の段はユーザと同じものにします## Line Messaging APIでリッチメニューを作る
Line Account Managerで作成したリッチメニューは残念ながらAPIでは使えません。
画像を準備し、APIで作成する必要があります。
画像はpngかjpgで1MB以内です。pythonで適当に書いたので、ライブラリをインストールします。
“`bash
pip install line-bot-sdk
pip install pyyaml
pip install boto3
“