- 1. Goで数値型配列の中身を高い順にsort(並び替え)する方法
- 2. goroutineでシェルっぽくバッチ処理を書いてみた
- 3. Goでintのスライスを昇順と降順でソートする方法
- 4. カスタムイメージを使ってCodebuildでbuildするまで。
- 5. Hyperledger FabricのKeyゾンビ化を防ぐ(全ソースコード掲載)
- 6. Go のオレオレ linter を golang.org/x/tools/go/analysis 使って作成する
- 7. CORS(preflight request)にハマったけど解決した話
- 8. go修行10日目 embeded
- 9. fish shell + anyenvでのGo開発環境構築
- 10. 【Go】並行処理の「拘束」で安全に並行処理を扱う
- 11. gRPC: メソッドの呼び出しと HTTP/2 フレームの関係
- 12. GraphQLについてまとめてみた
- 13. sqlxのNamedQueryをIN句に適用する方法(名前付きクエリ)
- 14. 【Go言語 GitHubActions】linterで特定のファイルを無視する方法
- 15. Hyperledger Fabricで個人情報をクエリする(RDB連携)
- 16. 【SRE/Go】バルクインサート
- 17. Hyperledger FabricのGetHistoryForKeyを利用した資産のトレース
- 18. 社内勉強会でGo言語を学ぶのにやってること
- 19. longcatのオプションメモ
- 20. go修行9日目 ポインタとか
Goで数値型配列の中身を高い順にsort(並び替え)する方法
## はじめに
Goで数値型配列の中身を高い順にsortしてみました。## コード
“`go:main.go
package mainimport (
“fmt”
“sort”
)func main() {
slice := []int{1,4,3,5,6,19,21,7,8,10,49}
sort.Sort(sort.Reverse(sort.IntSlice(slice)))←これがPoint
fmt.Println(slice)}
“`“`
// 出力結果
[49 21 19 10 8 7 6 5 4 3 1]
“`
AtCoderなんかの問題を解くときに使ったときは“`go:main.go
package mainimport (
“fmt”
“sort”
)func main() {
var A int
slice := []int{}for i := 0; i < 10; i++ { fmt.Scan(&
goroutineでシェルっぽくバッチ処理を書いてみた
# 小さく分割してきれいにつくりたい、けど効率も重視したい
シェルや関数型プログラミングのように、部品の組み合わせでプログラムを書きたい。しかし、パイプラインや遅延評価みたいな仕組みがないと、ループ回数だけ増えてしまって効率が悪い。仕方がないから、1つの処理の中に全機能まとめてしまおう。そんな経験はないでしょうか。# それgo言語でできる!
go言語のgoroutineとchannelを勉強してみてまさにこれだと思い、go言語の勉強を兼ねて作ってみました。# 前提環境
– goバージョン:1.14# 完成イメージ
シェルっぽく使いたいということで、シェルを意識した設計にしています。メソッドは基本的にchannelに関連付けたメソッドとして定義し、戻り値にはchannelを返すようにしました。そうすることで、メソッドチェーンをシェルのパイプに見立てて使えます。ただし、起点となる処理はchannelにすると逆に使いにくいので、普通に値を引数をとるようにします。“`go:
slip.Cat(“data/slip.csv”).Filter().Sort()
“`また、2
Goでintのスライスを昇順と降順でソートする方法
##はじめに
intのスライスをソートする方法が分からなかったので調べてみました。
今回使用するスライスは、こちら“`
s := []int{4, -1, 12, -26, 5}
“`###昇順(小さいから大きい)でソート
“`
sort.Ints(s)
fmt.Println(s)
// [-26 -1 4 5 12]
“`
###降順(大きいから小さい)でソート“`
sort.Sort(sort.Reverse(sort.IntSlice(s)))
fmt.Println(s)
//[12 5 4 -1 -26]
“`
##おまけ
スライスの中から一番大きい数字や小さい数字を見つけるコードも書いてみます。
###一番大きい数字を出力“`
sort.Ints(s)
//合計の要素数から-1(5-1=4番目の数字)
fmt.Println(s[len(s)-1])
//12
“`
###一番小さい数字を出力“`
sort.Ints(s)
//スライスの0番目
fmt.Println(s[0])
//-26
“`##さいごに
調べてみると、比
カスタムイメージを使ってCodebuildでbuildするまで。
マニュアル見ろよ、という話しではあるんだが。
私はなんか突っかかるまでマニュアル読まないタイプの人なので。# やりたかったこと
– マネージドイメージ内でカスタムイメージをビルド。ビルドしたイメージをECRにPush
– カスタムイメージ内で、golangのpackeageをビルド。ビルドした生成物をS3にアップロード# カスタムイメージの作成まで
## DOWNLOAD_SOURCEでi/o timeout for primary source
GitHubへのoAuth設定をCodeBuildから行うと、こんなエラーが出る。GitHub側で問題おきていることは考えにくいので、CodeBuild側の問題。“`
CLIENT_ERROR: Get https://github.com/XXXXXXXXXXX/sample.git/info/refs?service=git-upload-pack:
dial tcp 13.114.40.48:443: i/o timeout for primary source
“`CodeBuildはVPC内に設定してあり、
Hyperledger FabricのKeyゾンビ化を防ぐ(全ソースコード掲載)
# Hyperledger FabricでState DBのKeyを再利用させない(実はできない)
Hyperledger Fabric(以下HF)で一度削除(`DelState`)したKeyで再登録(`PutState`)したらどうなるんだろう?という疑問から、次のようなシナリオを考えました。またミラ・キータ(Mira Qiita)に登場してもらいます。
1. Mira QiitaをKey=”JMYMIRAGINO200302″で登録(`PutState`)
2. 1のKeyでクエリ(`GetState`)
3. 1のKeyで削除(`DelState`)
4. 1のKeyでクエリ(`GetState`)
4. 1のKeyで登録(`PutState`)
5. 1のKeyで履歴を参照(`GetHistoryForKey`)どうなるんだろう?
あと、この投稿にてGoで書いたソースコードやシェルスクリプトを掲載します。
# 環境について
動作環境については次の通りです。– Ubuntu 18.04.4 LTS
– docker-compose 1.26.0
– docker
Go のオレオレ linter を golang.org/x/tools/go/analysis 使って作成する
## ゴール
* `x/tools/go/analysis` package を使って、linter を実装できるようになる
## 背景
Go は言語本体の簡潔さ、強力さはもちろんのことですが、周辺のツール/環境が充実していることでも知られています。
linter についても、標準で `go vet` や、標準の linter の runnner として、`golangci-lint` というサードパーティのツールも利用されています。さらに、Go ではそのような linter 、及び静的解析を実装するためのライブラリが準標準 (`golang.org./x` 以下)で公開されています。
今回は、そのライブラリを使ってユーザ独自の linter を作る方法を紹介します。## 環境
* go1.14.4
* skeleton v1.2.1## gostaticanalysis/skeleton で linter のひな形を作る
`go/analysis` package を使った linter の作成は、以下のツールでスケルトンを作成することができます。
CORS(preflight request)にハマったけど解決した話
CORS(preflight request)にハマったので、解決方法を備忘録として残しておきます。
# エラーが起きた場面
異なるドメインからHttpリクエストを送る場合は、CORSに注意だよなぁ。
サーバー側のレスポンスで、ヘッダーをつけてあげれば良いんだろう。
簡単じゃん。## クライアント側
何かしらのデータをjasonでPOSTする。“`js
var xmlhttp = new XMLHttpRequest();
xmlhttp.open(“POST”, API_ENDPOINT);
xmlhttp.setRequestHeader(“Content-Type”, “application/json;charset=UTF-8”);
xmlhttp.send(JSON.stringify(data));
“`## APIサーバー側
サーバー側では、レスポンスのヘッダーを付けてあげる。“`go
func (a *API) HandleFunc(w http.ResponseWriter, r *http.Request) {
//略…w.He
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