- 1. sql-migrate PostgreSQLで環境変数を利用した設定例
- 2. golang[][]stringでのtranspose(縦横変換)
- 3. golangでmapにおいてkeyの存在を確認する。
- 4. Golangで型情報を調べる
- 5. Golang入門.3 -html/templateを使う-
- 6. gqlgen httprouter recipe
- 7. 【Go(gorilla)】チャットのサンプルアプリでWebSocketサーバの設計思想を理解しましょう。
- 8. 1分でgolangでHello World を表示する。
- 9. GitHub Actionsでcacheに転んでいた
- 10. よく使うGoのBuildオプションと、UPXの圧縮がバイナリサイズにどの程度影響しているか調べた
- 11. Go言語のdeferを正しく理解する | How defer in Golang works
- 12. Golang – MySQL Scan Error
- 13. GitHub Actionsのcacheでどハマりした
- 14. WSL (ZSH)でGolang 環境を作ろうとしてハマりかけた罠
- 15. 【Go言語】ポインタ変数を reflect パッケージで動的に操作する
- 16. golangで便利ツール作ろうと思ったらos/execでハマった話
- 17. 複数のgithubアカウントをノンストレスで運用する方法(脱ssh鍵設定)(git credential helperの活用)
- 18. 改行コードって難しいっ
- 19. ABS Coins(ABC087B)をループ1回で解く
- 20. どの8進数リテラルが使えるかはプログラミング言語によって異なる
sql-migrate PostgreSQLで環境変数を利用した設定例
## 公式リポジトリ
https://github.com/rubenv/sql-migrate
## 設定例
“`yml:dbconfig.yml
development:
dialect: postgres
dir: migrations
table: migration
datasource: host=${DB_HOST} port=${DB_PORT} dbname=${DB_DATABASE} user=${DB_USERNAME} password=${DB_PASSWORD} sslmode=disable
“`* `dir` マイグレーションファイルを作成するディレクトリ
* `table` マイグレーションテーブルの名前。省略した場合デフォルトの`gorp_migrations`になる
golang[][]stringでのtranspose(縦横変換)
####goalngで[[][][][][]]のような二次元配列の順番をtranspose(縦横変換)する。
・csvを読み込んだ際に変換したくなったので、その部分を抜粋。“`main.go
package mainimport “fmt”
func transpose(slice [][]string) [][]string {
xl := len(slice[0])
yl := len(slice)
result := make([][]string, xl)
for i := range result {
result[i] = make([]string, yl)
}
for i := 0; i < xl; i++ { for j := 0; j < yl; j++ { result[i][j] = slice[j][i] } } return result } func main() { sample := [][]string{ []string{"a1", "a2", "a3", "a4", "a5"}, []s
golangでmapにおいてkeyの存在を確認する。
####golangでmapにおいてkeyの存在を確認する。
“`main.go
if _, ok := Map[key]; ok {
//存在する場合true
}
“`
Golangで型情報を調べる
#####golangで型情報調べる時に使う
“`main.go
package mainimport (
“fmt”
“reflect”
)func main() {
fmt.Println(reflect.TypeOf(1)) // int
fmt.Println(reflect.TypeOf(“”)) // string
fmt.Println(reflect.TypeOf([]string{})) // []string
fmt.Println(reflect.TypeOf(true)) // bool
fmt.Println(reflect.TypeOf(func() {})) // func()}
“`
Golang入門.3 -html/templateを使う-
## はじめに
[Golang入門.2 -http.Handleの実装を見る-](https://qiita.com/ryuji0123/items/9d95c4db88a6b2e3e59f)の続きです。また今回から実際のアプリを作っていきます。詳細は決めていませんが、[Grammarly](https://app.grammarly.com/)と併用して英語の文章を快適に書くためのエディタを作ろうと思っています。## 今回のテーマ
`html/template`を使ってhtmlファイルを返せるようにします。なお、内容は[Writing Web Applications](https://golang.org/doc/articles/wiki/)に準拠します。## 概念
今回はエディタとして必要な入力画面を出せるようにします。基本的には`IndexHandler`(前回までの`HelloHandler`)内でhtmlファイルを読み込み、必要な変数を`Page struct`を通して渡しています。## コード
[commit](https://github.com/ry
gqlgen httprouter recipe
###gqlgenとhttprouteの組み方
“`
import (
“net/http”
…
“github.com/99designs/gqlgen/graphql/handler”
“github.com/99designs/gqlgen/graphql/playground”
“github.com/julienschmidt/httprouter”
)// Defining the Playground handler
func PlaygroundHandler() httprouter.Handle {
h := playground.Handler(“GraphQL”, “/query”)return func(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
h.ServeHTTP(w, req)
}
}// Defining the Graphql handler
func GraphqlHandler(
【Go(gorilla)】チャットのサンプルアプリでWebSocketサーバの設計思想を理解しましょう。
こんにちは。
普段はネットワークの組込み系F/W開発をしています。個人的にWebSocketで高効率なソケットサーバ作れないかと思い、GorillaのWebSocketライブラリ内のサンプルコードから設計思想を拝借しました。私が理解した内容を纏めてみました。Go言語勉強して約2日で知見の浅い記事になってると思います。
間違い等あればご指摘ください。##趣旨
Go言語のWebSocketサーバの効率よい設計を理解する。## 前提知識
– Go言語
プログラミング言語。– Gorilla
WebSocketやHTTPなどのライブラリ。下記記事が分かりやすいです。
https://qiita.com/gold-kou/items/99507d33b8f8ddd96e3a## 参考文献
[100万回のWebSocket接続とGo](https://postd.cc/100%E4%B8%87%E5%9B%9E%E3%81%AEwebsocket%E6%8E%A5%E7%B6%9A%E3%81%A8go/)
Go言語におけるWebSocketの設計記事。[ゴルーチンとチャ
1分でgolangでHello World を表示する。
# 環境
docker for windows
PowerShell# コマンド
“`
>docker pull golang
>docker run –name golang -it golang /bin/bash
root@*******:/go# git clone https://github.com/go-training/helloworld.git
root@*******:/go# go run helloworld/main.go
Hello World!!
“`# 備考
docker for windowsが入っていないと時間がかかります。
GitHub Actionsでcacheに転んでいた
# はじめに
[前回の記事](https://qiita.com/yawn_yawn_yawn_/items/2f4bf5d3ce7e5e77dfd7#yaml%E5%85%A8%E4%BD%93)のまとめを読んでからだと、雰囲気がつかみやすいかも?# 実現したかったこと
GitHub Actionsを用いてgoの静的解析、テスト/ビルドを行うCIを構築したい。
その際、毎回モジュールのインストールが挟まると時間がかかっちゃうので、キャッシュを使って短縮したい。という話の続き。[前回の記事](https://qiita.com/yawn_yawn_yawn_/items/2f4bf5d3ce7e5e77dfd7#yaml%E5%85%A8%E4%BD%93)の段階では、キャッシュヒット、と通知されたが、`go vet`や`go test`を行う際にモジュールのインストールが発生する。保存したはずのキャッシュが使えてねえ…
# 起きていたこと
**中身がキャッシュされていなかった事件**
キャッシュ自体はされていましたが、モジュールがキャッシュされていませんでした。な
よく使うGoのBuildオプションと、UPXの圧縮がバイナリサイズにどの程度影響しているか調べた
# はじめに
GoのBuildオプションでサイズに影響しそうなオプションで、どの程度サイズに差がでるか試しました。
以下の環境です。自分のよくあるGoのユースケースとしてWebAPI開発あるので、go-swaggerやAWS SDK Goに依存したプロジェクトで試してみました。
“`bash
$cat /etc/os-release | head -n2
NAME=”Ubuntu”
VERSION=”18.04.4 LTS (Bionic Beaver)”$ go version
go version go1.14.2 linux/amd64
“`# 比較
“`bash
# 1. ノーオプション
go build -o nooption main.go# 2. ldflagsでdebug情報を削除
go build -ldflags=”-s -w” -o ldflags main.go# 3. trimpathでパス情報を削除
go build -ldflags=”-s -w” -trimpath -o trimpath main.go
“`* `
Go言語のdeferを正しく理解する | How defer in Golang works
deferってなんかかっこいい!
くらいの認識の人向け。# 環境
“`bash
go version go1.13.7 darwin/amd64
“`# A Tour of Goより
> A defer statement defers the execution of a function until the surrounding function returns.> The deferred call’s arguments are evaluated immediately, but the function call is not executed until the surrounding function returns.
> defer文は、上位ブロックの関数がreturnするまで関数の実行を遅延させる。
遅延実行される関数の引数は即時評価されるが、関数の実行は上位ブロックの関数がreturnするまで実行されない。_出典: [A Tour of Go](https://tour.golang.org/flowcontrol/12)_
# 試してみ
Golang – MySQL Scan Error
# Problem
“`
sql: Scan error on column index 5, name \”time\”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time]”}
“`# Solution
You need added string “parseTime=true” in mysql connection setting.“`
db, err := sql.Open(“mysql”, “root:@/?parseTime=true”)
“`https://stackoverflow.com/questions/29341590/how-to-parse-time-from-database/29343013#29343013
https://stackoverflow.com/questions/45040319/unsupported-scan-storing-driver-value-type-uint8-into-type-time-time
GitHub Actionsのcacheでどハマりした
## はじめに
タイトルそのままのことがおこりました。4/15追記: 今回ハマったこと自体は、原因がわかり、形的に成功しているように見えるのですが、8割解決してないです。
こちらも合わせてどうぞ…。
[GitHub Actionsでcacheに転んでいた](https://qiita.com/yawn_yawn_yawn_/items/3f1f796d6eb600447222)## 実現したかったこと
CIにgoの静的解析とテスト、ビルドを盛り込むこと。
その過程で、毎回go moduleのインストールが挟まると時間がかかっちゃうので、キャッシュを用いることでで解決したい。## ハマったこと
キャッシュの探索では、`Cache not found for input keys: …`となり、ごめん見つからんかったわーって言われる。![スクリーンショット 2020-04-13 15.04.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261043/5abc4d2f-7a56
WSL (ZSH)でGolang 環境を作ろうとしてハマりかけた罠
# ~~sammary~~ summary
WSL でGolang環境を作ろうとしたらgoenvインストール後ディレクトリ名がおかしくなっていました。“` ~/.
.goenv~ (ファイル名)
etc…
“`## やったこと
参考:https://qiita.com/10380r/items/37d0bf71b0e19a49ce53* golang のバージョン管理ツールgoenvを入れる
“`
git clone https://github.com/syndbg/goenv.git ~/.goenv
“`* 環境変数設定
“` ~/.zshrc
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval “$(goenv init -)”
“`この後 “`source .zshrc“`をしてもcommand not found: goenvになってしまうし
“`which goenv“`をしてもgoenv not foundになってしまうしで頭を抱え
【Go言語】ポインタ変数を reflect パッケージで動的に操作する
Javaとかオブジェクト指向言語のリフレクションと同じ感覚で操作しようとすると結構ハマりますよね、golangのreflect。
特にポインタの場合、一味工夫が必要だったりするので、現場で使いそうな操作をまとめておきます。(これが更に “構造体の中のフィールド” だったりするとまた色々あるのですが、また後日にでも。)
“`go
package mainimport (
“fmt”
“reflect”
“strconv”
)func main() {
//stringを作成
s := “Aerith”
fmt.Println(“s=” + s) // s=Aerithfmt.Println(“************* ポインタを reflect パッケージで色々いじくってみる ***********”)
//sのポインタを取得
ps := &s
fmt.Println(*ps) // Aerith//ps のreflect.Value構造体を取得
psValue := reflect.ValueOf(ps)
fmt.Println(p
golangで便利ツール作ろうと思ったらos/execでハマった話
# はじめに
PoCの初期段階などで、いくつかのシステムを組み合わせて動作させるような場面では、
リポジトリが分散し、開発者ごとに違う言語で小規模なシステムを構築していることがあります。そんな中で、動作確認をしたり、不具合を再現させたりする際、以下のような手作業が発生していました。
1. システムAを実行してCSVを吐く
2. CSVをシステムB直下にコピーする
3. システムBを実行して結果を得るプログラマーの三大美徳の怠惰担当の私は、手動で何かをすることが嫌いなので、自動化するツールを作成していきます。
シェルスクリプトで書いても良いのですが、実行するデータパターンが複雑だったり、分岐したりすると面倒なので、私はgolangで作成することが多いです。この記事では、そんな中でハマった出来事と、回避方法をご紹介します。
根本解決していないものが多いので要注意&コメントお待ちしています。# 先にまとめ
– 変なところでハマる場合は、最初からシェルスクリプトで書いたほうが早い
– os/execでの実行結果と、ターミナルで手で叩いたときの出力結果は異なることがある#
複数のgithubアカウントをノンストレスで運用する方法(脱ssh鍵設定)(git credential helperの活用)
# はじめに
githubは公式でも言っているように、基本的に1人1アカウントで運用することが推奨されています。
しかし、様々な事情で複数のGithub Accountを利用している人も多いのではないでしょうか。
そんな時に困るのが、git commandを使用する時の認証だと思います。実際にググってみると、以下のような回避方法がありました。
1. ssh keyを登録して、ssh configを設定して切り分ける方法(一番王道)
2. 1つのリポジトリだけであれば、 `https://username:password@github.com/xxx/xxx` でcloneする方法(リポジトリ一つならこれが圧倒的に楽)
3. `.netrc` を切り替えて使う方法 (sshの設定しなくていいけど、手動切り替え)しかし、sshの鍵登録するのもいやだし、すべてのremote設定を `git://` にするのも面倒。 `go mod` もノンストレスで動いて欲しいし、httpsでやりたいけど、毎回手動で切り替えもしたくないとずっと悩んでいました。
そこで少し調べてみると、 `g
改行コードって難しいっ
## はじめに
標準入力から文字列をつけとってなんやかんやする機会は多いと思います。Go で標準入力から文字列を受け取る方法の 1 つとして [fmt.Scanf](https://golang.org/pkg/fmt/#Scanf) を使う方法があります。for ループを使った複数行の文字列を読み込んでいるときに Unix 系の OS と WindowsOS で挙動が異なることに気づきました。バグっぽい挙動を示しています。
問題になっているのは OS の差異による改行コードの違い、CRLF(`\r\n`) と LF(`\n`)によるものです。
公式リポジトリの Issue にもあがっていました。Open な Issue です。
https://github.com/golang/go/issues/23562
## サンプル
実際に fmt.Scanf を使う以下のような簡単な実装を考えてみます。
“`go:main.go
package mainimport “fmt”
func main() {
var f, s stringfmt.Printf(“
ABS Coins(ABC087B)をループ1回で解く
前々から興味はあったんですが、今年に入ってから[AtCoder](https://atcoder.jp/)をはじめました。
とりあえず出てみて慣れつつ、過去問をちょこちょこ解いたり[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/)ちょっとずつやったりとかで地味に頑張ってます。
競プロはガチ勢は実行速度の早いC++とかC#とかでやってるイメージが非常に強いんですが、自分は個人的に慣れようと思ってたGoでやっています。
この記事を書いた次点ではまだ灰色ですが、継続的に頑張っていきます。さて、ABS(※)の中にCoinsという問題があります。
https://atcoder.jp/contests/abs/tasks/abc087_b※参考
AtCoder Beginners Selection
けんちょん(@drken)さんの下記の記事を参考にして作られた(で、いいんですよね?)、最初のチュートリアル的な10問です
[AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~](https://qiita
どの8進数リテラルが使えるかはプログラミング言語によって異なる
(この記事は [地平線に行く](https://yujisoftware.hatenablog.com/entry/octet_literal) とのマルチポストです)
8進数を表記する文法は、主に以下の3つがあります。
(二番目と三番目は分かりにくいですが `ゼロ オー`[^octet] です)* プリフィックスとして `0` を付与する (例: `0123`)
* プリフィックスとして `0o` を付与する (例: `0o123`)
* プリフィックスとして `0O` を付与する (例: `0O123`)これらのうち、各プログラミング言語がどの文法を採用しているかを表にまとめました。
|言語|`0`|`0o`|`0O`|
|:–|:–:|:–:|:–:|
|C|○|×|×|
|PHP|○|×|×|
|Perl|○|×|×|
|Java|○|×|×|
|Scala (~2.9)|○|×|×|
|Scala (2.10~)|×|×|×|
|Kotlin|×|×|×|
|C#|×|×|×|
|Rust|×|○|×|
|Swift|×|○|×|
|Go|○|○|○|
|