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

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

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
    export GOOS
    export GOARCH
    go build -v -o bin/tool-$GOOS-$GOARCH main.go
  done
done

darwinlinux について,それぞれ i386amd64 アーキテクチャ向けのバイナリを作るようなスクリプト.main.go はビルド対象のファイル.成果物はカレントディレクトリの bin 以下に生成されるので,あらかじめ mkdir しておく必要がある (後述).

なお,GOOSGOARCH を export しておかないとうまく動かない.ドキュメントではこれが省略されていて少しハマった.

そんでもってこのスクリプトを呼び出す.以下は Makefile の例.

build:
	docker run --rm -v "$(PWD)":/go/src/github.com/moznion/tool -w /go/src/github.com/moznion/tool golang:1.6 bash build.sh

ここでは docker hub で公開されている golang のイメージを利用している.
https://hub.docker.com/_/golang/

-v オプションを使ってカレントディレクトリに docker image 内の go path が通っている然るべきディレクトリをマウントする.
でもって,-w オプションでマウントしたディレクトリをワーキングディレクトリに設定し,上記のシェルスクリプトを image 内で実行する.

と,ワーキングディレクトリ以下の bin に成果物が吐き出され,ワーキングディレクトリはカレントディレクトリにマウントされているので,つまり成果物はカレントディレクトリ以下の bin に出力されてハッピーという寸法!

なお,--rm オプションを付けておかないと実行する度にゴミ container がどんどん溜まっていくのでつけたほうが良い.

Ref;

実際のコードはここに書いてある感じのやつ


追記

cgo 使わない,なおかつ go 1.5 以上であれば make だけで完結するとのこと!

Docker 使って golang で書いたツールの cross platform build をする - その手の平は尻もつかめるさ

別にdockerもシェルスクリプトもいらなくて makeだけで完結しそうな予感/アンサーソングしといた http://lestrrat.ldblog.jp/archives/48673706.html

2016/05/24 06:27
b.hatena.ne.jp

なお,gox 及び goxc については go 1.4 以下の便利ツールという立ち位置とのこと.

resque_exporter 書いた

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

実装としては,resque は <namespace>:queues という SET に全ての queue の名前を持っているので,SMEMBER を使って全 queue 名を取得してきて,
更にその各 queue 名に対応する <namespace>:queue:<queue_name> という LIST が queue そのものを表しているので,その LIST の長さを LLEN により取得することで各 queue の job 数を集計するという仕組みになっています (ここらへんがその実装).

なお,この exporter は resque 互換の job queue であれば問題なく動作するようになっていると思います (実際に我々は resque の java 実装である jesque でこれを使っています).


ところで golang で Prometheus の exporter を書くのは至って簡単で,

  1. prometheus/client_golang の Collector interface を実装する
  2. prometheus.MustRegister(exporter) と言う感じで Collector interface の実装を登録する
  3. http.Handle("/metrics", prometheus.Handler()) という感じで http 経由で export する口を作って serve

という感じでめいめい exporter を提供することが出来ます.シンプル!


なお補足ですが,色々な exporter の実装を見ていると scrapeFailures という counter を用意してあげて,そこに metrics 取得に失敗した回数を突っ込んでやるのがマナーっぽい感じでしたので,当 exporter でもそのようにしております.

*1:今までは fluentd + kibana という構成で似たようなことをやっていた

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.

go-setlock has functions which are equivalent to the original setlock. And go-setlock has following pros;

The former is useful for environments which cannot install daemontools, minimalists and etc.
The latter is pretty powerful. The original setlock is not available on Windows however go-setlock can use on there.


Usage is matched to the original setlock. Please refer README.md and manual of the original setlock.
Enjoy!

go-setlock - Go port of setlock

[2015/08/10 12:47 追記]なんか一部のOS Xで動かないので調査中です……
[2015/08/11 10:15 追記]v1.1.0で直っています


setlockdaemontools に同梱されているコマンドラインツールで,非常に便利かつ強力なツールであることが知られています.この件については以下の記事などが参考になります.


そしてこの度,その setlock を golang で移植した go-setlock というものをこさえました.

go-setlock は setlock と同等の機能を持っており,かつ以下の様なメリットが挙げられます.

  • daemontools から独立しているので,setlock のみを使いたいときにわざわざ daemontools ごとインストールする必要がない
  • Windows でも使える!!

前者は諸般の事情により daemontools をインストール出来ない環境でお暮らしの方 *1 や、ミニマリストの方にとって役立つでしょう.
後者はなかなか強力です.オリジナルの setlock は Windows 上で使えなかったわけですが,go-setlock はテクノロジにより Windows でも動作するようにしたので便利です (試しに Windows のメディアサーバ上で動画のエンコードを排他的に行う,みたいな事をやってみたんですが便利).


使い方はオリジナルの setlock と揃えています.README.mdmanual of the original setlock をご参照ください.
ご利用くださいませ.

*1:そんな環境があるのか

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

表題のやつです.便利っぽかったのと書きたかったという理由からgoで書いています.

例えばアクセスログのようなものがあった時,「1秒間に何行ログに書き込まれているか」が分かれば秒間のアクセス数を求めることが可能となります.これはそういうことをする為のツールとなります.
persecを一言で言うと,「1秒間に何行やってくるか」をカウントするコマンドです.

$ tail -F nankano.log | persec

という風に使ってやると,persecはteeの様にtail -Fの内容をそのまま出力しつつ,行数をカウントして一定周期ごとにそのスループットを出力します.末尾に雑に噛ませておくとスループットが取れる.

デフォルトだと,persecは60秒ごとのインターバルでスループットをSTDOUTに吐き出します.この場合は60秒間分の行数をカウントしておいて,それを60で割ったものを1秒間あたりのスループットとして扱います.
インターバルは--deltaスループットの出力先は--outというオプションでそれぞれ指定することが可能です.また,--noteeオプションを指定すると,受け取った内容をteeの様にフォワードしなくなります.

加えて--patternというオプションによって,カウントの対象とする行を絞り込むことが出来ます.ここにはgoで利用可能な正規表現を突っ込むことが出来ます.例えば,yyyy-mm-ddから始まる行だけをカウント対象にしたい場合は--pattern="^[0-9]{4}-[0-9]{2}-[0-9]{2}"というふうに指定してやるとそのような感じになります.

--helpで詳細が見れますから,そちらもご確認ください.


シェルスクリプトでも頑張ればこういうことが出来るような気もしたんですが僕にはその力が足りなかった!
というわけでどうぞ御利用ください.


余談ですがテストをどう書けば良いかわからなくて,結局シェルスクリプトによるE2Eテストになってしまった……

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

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


これは何かと言うと,やりとりしたい相手の GitHub の ID を指定するだけで

  • その ID のユーザの ssh-rsa の公開鍵を引っ張ってきて
  • その ID のユーザのメールアドレスを引っ張ってきて
  • そのメールアドレスに対して公開鍵で暗号化したメッセージを添付ファイルにしてメールで送りつける

という動きをするコマンドです.
golang で書きたかったというのと golang で書くと便利なのではと思ったので golang で書いてあります.


Wercker で Go のプロジェクトをクロスコンパイルし、GitHub にリリースする - 詩と創作・思索のひろばや,
werckerでgithubにreleaseをdeployするまでの道のり - yuukichiの日記
を参考にすることで、wercker でバイナリをビルドして GitHub Releases に成果物を設置するということも出来ました.
Releases · moznion/naisho · GitHub からお手軽に入手頂けます.


さて使い方としては

$ naisho <Target GitHub ID> <Message>

としてやるだけで,対象の GitHub ID のユーザーに暗号化した Message を添付ファイルにしてメールで送りつける事ができます.
受け取った側は openssl さえ持っていれば良くて,

$ openssl rsautl -decrypt -inkey <Your Secret Key> -in <Attachment>

という感じで,公開鍵と対応している秘密鍵と添付ファイルを指定してやるだけで内容を読むことが出来ます.


中身の仕組みですが,GitHubhttps://github.com/<user-id>.key という所にアクセスすると,
任意のユーザの ssh-rsa 公開鍵の一覧を引っ張ってこれるという機能があるので *1
ここから一番上の公開鍵を引っ張ってきてそれで暗号化しています.
送信先メールアドレスはプロフィールページ (つまりhttps://github.com/<user-id>) に書いてあるメールアドレスを
GitHub API 経由で取得してくることができるのでそれで取ってきています.
従って,当然ですが公開鍵を登録していないユーザや,メールアドレスを公開していないユーザには送ることが出来ません.残念!


使う鍵の鍵長によって暗号化出来るバイト数が変わってきて,

鍵長ビット 暗号化可能バイト
1024bit 117byte
2048bit 246byte
4096bit 502byte
8192bit 1018byte

という感じなので,そこまで長いメッセージは送れないという世界観です (バイト数が溢れると暗号化に際してエラーが出る).

しかしこれは十分な長さです! これで私にクレジットカードの番号や WebMoney のコード等を安全に送り放題ですね!! やりました!!!


今後の予定としてはファイル入力を受け付けられたり,使う公開鍵をインタラクティブに選べたりできたら良いなあとぼんやり思っています.あとエラーメッセージが雑極まりないので直したいですね!
ご利用くださいませ.

*1:ゆくゆくは無くなるらしい……

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















結論

欲しがらない

補足