- 1. GoのCommonMistakes/Using reference to loop iterator variableに対応するC++/Rustのコード
- 2. Golang TempDir,TempFile作成
- 3. ソートを勉強してみる by Go ②
- 4. Github actionsで自動でCLIツールのバージョニング切ってバイナリを添付したい
- 5. GOPATHモード・モジュールモードそれぞれのgo getの振る舞い
- 6. ソートを勉強してみる by Go ①
- 7. 都道府県名を都道府県コードに変換
- 8. goroutineを使って高速TCP ポートスキャン
- 9. GCPのApp Engineを使ってGolang製のAPIをデプロイしたら簡単すぎました
- 10. GoのContextパッケージについて
- 11. Go言語+WebAssemblyでマウスイベントを実装する
- 12. GoでSubversionからパッケージをgo getして実行する(自マシン内完結型)
- 13. [Golang]envconfigで環境変数を扱う
- 14. GoでGeneratorとWorkerのサンプル
- 15. Go言語はerr != nilでもerrはnilである時がある
- 16. 【LINE】既存LIFFアプリにShareTargetPickerを導入する
- 17. [Go言語] ContextのWithValueのkeyについて
- 18. [メモ] Go言語でうるう年を判定する
- 19. 【Go】echoを使ってさくっとRoutingとTemplateを使いこなす
- 20. Go でプロセス間通信
GoのCommonMistakes/Using reference to loop iterator variableに対応するC++/Rustのコード
– [Let's encryptのバグはRustで実装していたら防げたの? – Qiita](https://qiita.com/MitsutakaTakeda/items/6ae9599d82ce14cf8c88)
に、
[CommonMistakes/Using reference to loop iterator variable](https://github.com/golang/go/wiki/CommonMistakes#using-reference-to-loop-iterator-variable):
“`go
func main() {
var out []*int
for i := 0; i < 3; i++ { out = append(out, &i) } fmt.Println("Values:", *out[0], *out[1], *out[2]) fmt.Println("Addresses:", out[0], out[1], out[2]) } ``` に対応するC++とRustのコードが書かれているけど、上記のG
Golang TempDir,TempFile作成
Golang TempDir,TempFile作成する
“`main.go
package mainimport (
“fmt”
“io/ioutil”
“os”
)func main() {
dir, _ := ioutil.TempDir(“”, “aaa”)
fmt.Println(dir)fp, _ := ioutil.TempFile(dir, “xxx”)
fpath := fp.Name()
fmt.Println(fpath)fp2, _ := ioutil.TempFile(dir, “yyy”)
fpath2 := fp2.Name()
fmt.Println(fpath2)fp.Close()
fp2.Close()
os.RemoveAll(dir)
}//C:\Users\####\AppData\Local\Temp\aaa661041139
//C:\Users\####\AppData\Local\Temp\aaa661041139\xxx642705078
//C:\Users\####\Ap
ソートを勉強してみる by Go ②
[ソートを勉強してみる by Go ①](https://qiita.com/dtmu/items/1372a32762cfad494801) の続き。
クイックソートしてみました。意外とすんなりいきました。“`go
package mainimport (
“fmt”
“math/rand”
)func main() {
length := 20
list := make([]int, length)
for i := 0; i < len(list); i++ { list[i] = (rand.Int() >> 56)
}sort(list, 0, len(list)-1)
for i := 0; i < len(list); i++ { fmt.Println(list[i]) } } func sort(list []int, start int, end int) { if start >= end {
return
}
var stack intleft := start
right := end – 1
Github actionsで自動でCLIツールのバージョニング切ってバイナリを添付したい
> :warning:
> バージョンはツール自体のバージョンではなくて、github上で発番するバージョンです。# Github Actionsってなに?
pushなどをフックしていろんなworkflowを組める、Github謹製のCI/CD的なものです。
詳しくは公式の説明をどうぞ
https://github.co.jp/features/actions# workflow
実際のworkflowのファイルです。
今回はGoのバイナリファイルを作成するという体で書いています。
流れは同じなので他の言語でも同じように組めばできるはずです。※ Mac用しか書いてないですが、matrix追加したら複数OSの対応も可能です。
## 自動バージョニング版
注意:
– checkout@v2からfetchしないとタグとか取れないようなので、直後にfetchしています
– goreleaser-actionはバージョン指定さえすれば、勝手にリリースとか切ってくれそうですが、自動採番でよしなにやろうとしたときに細かい調整ができるように前回のタグを取得して、インクリメントす
GOPATHモード・モジュールモードそれぞれのgo getの振る舞い
Goの入門書でサクッと`go get`のことはインプットしていたのですが(GOPATHモード前提)、モジュールモードのときと振る舞いが違うらしく、どう違うのか気になったので調べてみました。
# GOPATHモードとモジュールモード
## GOPATHモードとは
Go1.10まで動作していたモード。1.11以降でもこのモードを有効にすることは可能。`$GOPATH`配下でパッケージの管理をしており、開発するディレクトリも基本は`$GOPATH/src`で行う。ダウンロードしたパッケージは単一バージョンのみを管理する。
## モジュールモードとは
Go1.11から導入されたモード。任意のディレクトリで開発・ビルドが可能。パッケージをモジュールとしてバージョンごとに管理する。(=複数バージョンの管理が可能)go.modファイルでモジュール間の依存関係を管理する。
### モジュールモードの特徴(GOPATHモードと比べて)
– 開発時にGOPATHを意識しなくても良くなった
– 使用するパッケージを複数のバージョンで管理できるようになった
– 同じパッケージを参照してい
ソートを勉強してみる by Go ①
普段は IT インフラ運用をやっているのですが、ちょっとアルゴリズムを勉強してみることにしました。アプリにもなっている「アルゴリズム図鑑」と、[VisuAlgo](https://visualgo.net/ja) というページを活用して、コードを実装していきます。
きっかけとしては、昨日 Paiza というプログラミングテストをやってみたときに、A ランクまでは難なく取れたのですが、S ランクでは実行結果のタイムアウトにより、なかなか取得できなかったためです。これは根本的にアルゴリズムの知識不足なのでは?と思い、勉強してみることにしました。
今回は初回ということで、まずソートをやってみました。対象は以下の 4 つです。ザザーッとコードを書いていきます。次回はマージソートとクイックソートをやってみます。
## バブルソート
“`go
package mainimport (
“fmt”
“math/rand”
)func main() {
// make array of random int
var list [100]int
for i := 0; i
都道府県名を都道府県コードに変換
都道府県名を次で定義されている都道府県コードに変換する方法です。
[都道府県コード](http://nlftp.mlit.go.jp/ksj/gml/codelist/PrefCd.html)変換に使うJSONファイル
“`json:prefecture.json
{
“北海道”: 1,
“青森県”: 2,
“岩手県”: 3,
“宮城県”: 4,
“秋田県”: 5,
“山形県”: 6,
“福島県”: 7,
“茨城県”: 8,
“栃木県”: 9,
“群馬県”: 10,
“埼玉県”: 11,
“千葉県”: 12,
“東京都”: 13,
“神奈川県”: 14,
“新潟県”: 15,
“富山県”: 16,
“石川県”: 17,
“福井県”: 18,
“山梨県”: 19,
“長野県”: 20,
“岐阜県”: 21,
“静岡県”: 22,
“愛知県”: 23,
“三重県”: 24,
“滋賀県”: 25,
“京都府”: 26,
“大阪府”: 27,
“兵庫県”: 28,
“奈良
goroutineを使って高速TCP ポートスキャン
## この記事に書いている事
– golangでのポートスキャンの方法
– golangでのgoroutine + channelを使った基本的な並列処理のパターンのサンプル
– time.Now()のちょっとだけ面白い話
– スクリプトを書いてみての所感と考えた事## Goでポートスキャンってどうやるの?
net.Dialを使ってコネクションを確立できるかを確認すればいいです。“`go
package mainimport (
“fmt”
“net”
“os”
)func main() {
host := os.Args[1]
port := os.Args[2]
address := fmt.Sprint(host, “:”, port)
_, err := net.Dial(“tcp”, address)
if err == nil {
fmt.Println(“Connection successful”)
}
}“`
“`bash
$ go run main.go22
Connection suc
GCPのApp Engineを使ってGolang製のAPIをデプロイしたら簡単すぎました
## はじめに
普段は業務でAWSをガッツリ触らせていただいていますが、今回は前々から興味のあったGCP(Google Cloud Platform)でアプリケーションをデプロイすることにしました。
ちなみに、GCPでプロジェクト作成後、クレジットカードを登録したら1年間使える3万円分のクレジットもらえました。。
至れり尽くせりすぎる!ありがたく使わせていただきます!
## GCPとAWSの違いとは?
個人的な所感ですが、
AWSはいろんなサービスがあって、インフラエンジニアの方からすると痒いところに手が届くようなサービスが豊富にあるように思えます。
ただ、僕のようにインフラに詳しいわけではなく、ただ自分のアプリを手軽にデプロイしたいような人間からすると、AWSは若干ハードルが高いように感じます。
それに対してGCPは、下記のようなメリットがあります!
– 公式ドキュメントが豊富で読みやすい
– コンソールのUIがAWSに比べてわかりやすい
– サービスの数はAWSほど多くなく、どれを使えば良いか初心者でもわかりやすい
– Firebaseを使う場合、GCP内であれば
GoのContextパッケージについて
# Contextとは
– タイムアウト処理やgoroutineの処理停止を統一的に扱うためのパッケージ
– 1.7から標準パッケージとして導入された
– [公式ドキュメント](https://golang.org/pkg/context/)
– [ソースコード](https://github.com/golang/go/tree/master/src/context)
– 提供されている機能としては以下の2つ
– コールグラフの各枝をキャンセルするAPI
– この記事ではこれについて扱う
– コールグラフを通じてリクエストに関するデータを渡すデータの置き場所# Contextパッケージのソースコード
– 主に[context.go](https://github.com/golang/go/blob/master/src/context/context.go)の内容を深掘りしていく## インターフェース
– [context.go#L58-L154](https://github.com/golang/go/blob/maste
Go言語+WebAssemblyでマウスイベントを実装する
#前書き
Goで記述したファイルをwebAssemblyにコンパイルする形で一通りのマウス操作を検知できるようになったのでまとめました。
Go言語+Webassemblyでフロントエンドを実装しようとしてる方の参考になれば幸いです。
勉強中なので、間違いがあればご指摘ください。
今回のコードはこちら:[Github](https://github.com/daemonkimura/Go_WebAssembly_MouseAction)###画面サンプル
GoでSubversionからパッケージをgo getして実行する(自マシン内完結型)社内や個人でSubversionを使ってGoコードを管理しているGopherには朗報!?Go 1.14から、goコマンドはmoduleモードでSubversionリポジトリーをサポートしました。
しかしながら、具体的な手順がなかなか見つかりませんでした。そこで「**自マシン内のSubversionサーバーに登録されたGoの外部パッケージを、自マシン内で取得して実行する**」ことを色々と目標に試してみました。実際に動作した時は心の中でガッツポーツ!q@w@p
## Subversionサーバーの構築
自マシンに「[Subversion](https://subversion.apache.org/)」と「[Apache HTTP Server](https://httpd.apache.org/)」をインストールします。
Apache HTTP Serverには、Subversionと連動してHTTP/HTTPS通信でアクセスできる仕組みが用意されています。
今回は、諸事情によりno_ssl版のためHTTP通信でアクセスした場合の内容となっています。openssl版&HTTPS
[Golang]envconfigで環境変数を扱う
# はじめに
Goで環境変数ってどうやって扱うのかを調べると、いくつかそれっぽいものを発見しました。
– [caarlos0/env](https://github.com/caarlos0/env)
– [spf13/viper](https://github.com/spf13/viper)
– [kelseyhightower/envconfig](https://github.com/kelseyhightower/envconfig)viperがスター数では最も多いのですが、今回はシンプルな用途で探していたのでenvconfigを試してみました。
# 標準パッケージだとこうなる
外部のライブラリを使用せず、標準パッケージであるosを使用すると、
“`go:main.go
package main
import (
“fmt”
“os”
)
func main() {
val := os.Getenv(“VALUE”)
fmt.Println(“val is “, val)
}
“`“`bash
$ VALUE=”HOGE” go run mai
GoでGeneratorとWorkerのサンプル
大量のJobを捌くこんなケースのGoのサンプルです。
– (Jobの)Generator
– 生成処理が軽くて1つ
– 途中でコケたら全体を中断したい(それ以上Jobを生成しない)
– Worker
– それなりに重たい処理
– 横に複数並べてJobを捌きたい
– エラーが発生しても次のJobを継続(最後にエラーをハンドルする)処理結果とエラーを持つResult構造体
“`go
// packageとimportは割愛type Result struct {
s string
e error
}
“`GeneratorはJobの数だけ値を入れてくチャネルを作って渡します。
時々コケると、途中で止めます。“`go
func Generator(num int) <-chan int { ch := make(chan int) go func() { i := 0 defer close(ch) for num > 0 {
num–// sometime happen error
Go言語はerr != nilでもerrはnilである時がある
**突然ですが問題です。**
以下のコードを実行した時、”This should not be called”の文字列は出力されるでしょうか?“`golang
package mainimport “fmt”
type MyError struct {
}// implements error interface
func (MyError) Error() string {
return “This is MyError”
}func fn() (int, *MyError) {
return 42, nil
}func main() {
result, err := fn()
if err != nil {
fmt.Println(“This should not be called”)
}
fmt.Println(result, err)
}
“`### 実行結果
“`golang
42
“`出てません。`fn()`はエラーnilを返しているので、`if err != nil`の中には入りません。
ここまではOK
【LINE】既存LIFFアプリにShareTargetPickerを導入する
# はじめに
既存のLIFFアプリにShareTargetPickerを導入する方法を説明します。
GitHubは[こちら](https://github.com/yagi-eng/liff-reservation)。## ShareTargetPickerとは?
以下が参考になります。
[Share Target Pickerがリリースされ、LIFFアプリからのメッセージ送信が大幅に強化されました。](https://engineering.linecorp.com/ja/blog/liff-share-target-picker/)>Share Target Pickerとは、LIFFから送信先を選んでメッセージを送信することが出来る機能です。
これにより、
・トークルームやグループから開かれなかった場合でも、メッセージを送信できる
・LIFFアプリをLINE上で開いた場合だけではなく、ブラウザから開いた場合もメッセージを送信できる
・自分以外の友だちや自分が入っていないグループにもメッセージを送信させることができる
といったことが可能になります。## サンプル
htt
[Go言語] ContextのWithValueのkeyについて
## ContextのWithValueでのワーニング
ContextのWithValueで以下のようにstringを使おうとすると、“`should not use basic type string as key in context.WithValue“`のwarningが出てしまいます。“`go
ctx = context.WithValue(ctx, “user”, user)
“`調べてみたところ、WithValueを使っている場所で好き勝手にkeyを設定すると、key名が被ってしまう可能性があるのというエラーのようでした。とても親切ですね。
## 解決策
utilを作成して、そこでWithValueの処理を一括して行うように修正をしました。
ポイントは以下の4点になります1. typeで“`valueKey“`を宣言する
2. constで必要な“`valueKey“`を宣言する
3. “`WithValue“`の関数の引数を“`valueKey“`にする“`go
package ctxutilimport “context
[メモ] Go言語でうるう年を判定する
へえと思ったのでメモ。
以下の記事を参考にした。[Golang : How to determine if a year is leap year?](https://www.socketloop.com/tutorials/golang-how-to-determine-if-a-year-is-leap-year)
うるう年を判定するロジックを愚直に実装している記事は見かけるが、 [Time.YearDay](https://golang.org/pkg/time/#Time.YearDay) を使えば年間の日数が返ってくるため、うるう年かどうかが判定可能という事だった。
こちらの方が標準パッケージのロジックを再利用できてよさそう。“`go
year := time.Date(y, time.December, 31, 0, 0, 0, 0, time.Local)
days := year.YearDay()if days > 365 {
return true
} else {
return false
}
“`
【Go】echoを使ってさくっとRoutingとTemplateを使いこなす
# はじめに
Goはインストールしてあるものとします。REST APIを作りたい場合はこちらを参考にしてみてください。
[【Go】echoを使ってさくっとAPIサーバを構築する](https://qiita.com/yagi_eng/items/b06722dbd7a5652ec239)# 準備
## ディレクトリ構成“`
(任意のディレクトリ)
|- views
|-index.html
|- server.go
|- index.go
“`## echoをインストール
echoをインストールします。“`
$ go get -u github.com/labstack/echo
“`# 実装
以下のように記述していきます。
initRoutingやinitTemplateはmain関数の中にまとめて記載しても問題ありませんが、分けておくとわかりやすいかと思います。routingを増やしたかったら、
– initRoutingの中に `e.GET(“/”, hoge)` と一行追記
– 詳細は[こちらの公式](https://ech
Go でプロセス間通信
MS が https://github.com/Microsoft/go-winio を公開しているので、これを使う。
以下がサンプル“`go:server.go
import (
“fmt”
“io/ioutil”“github.com/Microsoft/go-winio”
)func main() {
pipeConfig := winio.PipeConfig{
SecurityDescriptor: “S:(ML;;NW;;;LW)D:(A;;0x12019f;;;WD)”, // SDDL Everyone
InputBufferSize: 4096,
OutputBufferSize: 4096,
}listener, _ := winio.ListenPipe(`\\.\pipe\my-named-pipe`, &pipeConfig)
defer listener.Close()for {
conn, _ := listener.Accept()
defer conn.Close()bytes