その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

golang

GoのHTTPクライアントがAWS NLB配下にあるコンポーネントと通信するときに5-tupleが分散しないので特定のインスタンスにしか負荷分散されないという話題

Microservicesのようなものを考えた際、Goで書かれたコンポーネントがHTTP(S)を使って他のコンポーネントと通信するという場合があると思います。 その「他のコンポーネント」がAWS NLBの配下にある時、GoのHTTPクライアントがTCPコネクションを使い回す場合…

IP Routing TableのGo実装 "go-iprtb" 書いた

GoのIP Routing Tableの実装について調べてみたところ、だいたいOSのRouting Tableを操作する系のライブラリがヒットし *1、そうではなくユーザー側コードでRouting Table相当の実装・処理をしたい時に使えそうなライブラリがパッと見当たらなかったのでそれ…

CのShared LibraryにしたGoのコードで簡単にダングリングポインタを発生させる

例えば以下のようなGoのコードを書き、 package main import "C" import ( "fmt" ) //export DoSomething func DoSomething(cstr *C.char) { fmt.Printf("Go: %s\n", C.GoString(cstr)) } func main() { } go build -buildmode c-shared -o libdosomething.s…

openapi-generator を使って go のファイルを生成した時に出てくる `var _ context.Context` の謎

openapi-generator を使って go のコード生成をすると、 // Linger please var ( _ context.Context ) という一見不要そうな変数宣言がコード中に出てきます。これはなんなのでしょうか? 「残しておいてね」とは書いてありますが…… TL;DR たぶんこれ過去の…

古いaws/aws-lambda-goでAWS Lambdaのcontainer image runtimeを使うと刺さる

具体的に言うと、aws/aws-lambda-go@v1.18.0よりも前のバージョンでAWS Lambdaのcontainer image runtimeを使うとハンドラが呼び出されず、タイムアウトするまで刺さります。例えば以下のような非常に簡単なLambda Functionをデプロイした時、 package main …

Go Genericsを使ってgo-optionalを書いた / Go Generics感想

Go Genericsがどんなもんか試してみたかったので、これを使ってOptionの実装を書いてみました。github.com基本的な使い方としてはSynopsisを読んでもらえばわかると思いますが、ユーティリティとしては IsSome() IsNone() Take() TakeOr() TakeOrElse() Filt…

jitterをかけたtickerを提供するgoのライブラリjickerを書いた

github.com定期的に実行したい何かがあって、そしてそのインターバルにjitterが入っていてほしいということがしばしばあり、必要な時に都度そういうコードを書いていたのですが、毎度書くのもしんどいな〜と思ったのでこの度ライブラリにしたという次第です…

golangのstructに対してコンストラクタを自動生成するCLIツール "gonstructor" を書いた

github.com表題の通りです.出オチのような名前です.使い方やどういう挙動をするかという話題についてはREADME.mdのSynopsisをご覧いただければと思います.Javaのlombokをご存知の方はlombokの@Valueのような挙動をする,と言えばイメージしやすいでしょう…

gowrtr - goコード生成支援ライブラリ

gowrtr (go writerと発音します) というgoのコード生成支援ライブラリ (ジェネレータ群) を書きました.github.comSynopsisに書いたように, package main import ( "fmt" "github.com/moznion/gowrtr/generator" ) func main() { generator := generator.Ne…

go-errgen書いた

goのstructにエラー定義を書いておけば良い感じで「エラーを返却する関数」をコード生成するツールであるgo-errgenを書きました.github.comSynopsisに書いてあるとおり, package mypkg //go:generate errgen -type=myErrors type myErrors struct { FooErr…

golangのstruct custom tagをうまいことparseして値を引っこ抜きたいってとき

type Foo struct { Bar string `buz:"qux" iyan:"bakan"` } における `buz:"qux" iyan:"bakan"` を良い感じで buz => "qux", iyan => "bakan" のように取得したいというケースでは以下のようにするとよい: tagKeyValue := reflect.StructTag(`buz:"qux" iyan…

req_mirror書いた

req_mirrorというサーバアプリケーションを書いた.受け取ったHTTP requestをJSONにserializeして,responseに詰めて返してくれるというやつ.つまりHTTP requestをおうむ返しにしてくれる雰囲気です.鏡的な挙動なのでreq_mirrorという名前にした次第.gith…

golangで書いたツールをCircleCI上でビルドしてその成果物をGitHub Releasesにリリースする

表題の通り.いくらかポイントがあったのでメモとして記す.基本的にこの記事の内容を真似した.medium.comあらかじめ,CircleCIの側の設定でGITHUB_TOKENという環境変数を登録しておく.なおGitHubのPersonal access tokenにはrepoのpermissionを付与してお…

linenotcatというツールを書いた

LINE Notifyが便利でよく使っています.LINE Notifyが何かとか何が便利なのかとかをご存じない方はコマンドラインから LINE にメッセージを送れる LINE Notify « LINE Engineers' Blogを読んでいただければと思いますが,あえてものすごくざっくり説明すると…

Docker 使って golang で書いたツールの cross platform build をする

まず以下の様なシェルスクリプトを用意する. #!/bin/bash # ここで依存しているパッケージを go get する # 例えば以下の様な感じ # go get -v gopkg.in/yaml.v2 # go get -v gopkg.in/redis.v3 for GOOS in darwin linux; do for GOARCH in 386 amd64; do …

resque_exporter 書いた

最近 Prometheus を使って各種メトリクスを取っていて,ふと resque の queue のステータス,つまり各 queue に 積まれている job の数を集計・可視化したくなったので,そのための exporter を書きました *1.実装としては,resque は <namespace>:queues という SET </namespace>…

go-setlock - Go port of setlock

setlock is a command line tool which is in daemontools. That tool is known as powerful and useful. Then I implemented setlock command by golang, called go-setlock.moznion/go-setlockgo-setlock has functions which are equivalent to the origi…

go-setlock - Go port of setlock

[2015/08/10 12:47 追記]なんか一部のOS Xで動かないので調査中です…… [2015/08/11 10:15 追記]v1.1.0で直っています setlock は daemontools に同梱されているコマンドラインツールで,非常に便利かつ強力なツールであることが知られています.この件につい…

STDIN経由で入力を受け取って1秒あたりのスループットを取れるpersecというのを書いた

表題のやつです.便利っぽかったのと書きたかったという理由からgoで書いています.moznion/persec例えばアクセスログのようなものがあった時,「1秒間に何行ログに書き込まれているか」が分かれば秒間のアクセス数を求めることが可能となります.これはそう…

相手の GitHub の ID さえ知っていれば暗号化したメッセージを送れる naisho というのを作った

色々な事情があり,秘密のメッセージを送り合う必要性が今年に入ってから多数発生していて, そのたびに毎度毎度手で暗号化して〜みたいな風にやるのめんどいですね,そうですね, ということでこの度 naisho というものをこさえました.みんなには内緒です…

Goでforkしたいとかgoroutine IDが欲しいとか言わない

golangでforkってどうやるんだ— 単位落としました (@moznion) 2014, 9月 14 @moznion できねぇよ— Daisuke Maki (@lestrrat) 2014, 9月 14 @moznion 外部プロセスの起動、ならできる。— Daisuke Maki (@lestrrat) 2014, 9月 14 @moznion でもforkしたい、と…