投稿

2017の投稿を表示しています

[isucon] ISUCON7 予選通過しました

ISUCON7 にチーム名 円山町 (@hidekiy, @kotaroy, @k_enoki) として出場し、去年に引き続き予選通過しました。当日について、記憶が定かな内にメモしておきます。 今回の予選問題について isubata という名前で、これは ISUCON 参加者になじみの深い idobata というチャットサービスを参考に作られているようでした。 用意したもの GitLab のプライベートリポジトリと権限設定 専用の Slack チャンネル Mackerel オーガニゼーションと公式プラグイン (inode, linux, mysql, nginx, proc-fd, uptime) の設定 ngxtop の使い方 2017/10/22 13:00 無事全員そろって開始 当日用マニュアル熟読 (@hidekiy, @kotaroy) 公開鍵ログイン設定と ssh config 作成 (@k_enoki) アプリのソースコードを GitLab へアップロード (@k_enoki) アプリを Go 実装へ切り替えと自動起動設定の修正 (@k_enoki) isubata アプリの動作確認 (@hidekiy, @kotaroy) インフラ構成と、nginx, MySQL の動作状況の確認 (@k_enoki) トラブルシュート用の mackerel-agent を全台に設定 (@hidekiy) 14:00 ローカル開発環境構築 (@hidekiy, @kotaroy) make deploy で全台にアプリがデプロイ (ローカルで GOOS=linux でクロスコンパイル後、scp して rename して systemctl restart) されるように設定 (@hidekiy) 静的ファイルの nginx 配信化と事前圧縮設定 (@k_enoki) DB のネットワーク上りがあんまりな状態だったので、一旦 image のオンメモリキャッシュを実装 (@hidekiy) /icon にインチキ Etag + If-None-Match 実装を試すが、全く 304 を返せず挫折 (@hidekiy) /profile の画像アップロード機能で、DB に二重に書き込まないように修正、ついでに

[golang] crypto/rand で疑似乱数生成器を初期化する

Go 言語で疑似乱数 math/rand を使うとき、実行ごとに別の乱数列を選択するための方法として、rand.Seed(time.Now().UnixNano()) とするのが人気があるようなのですが、より予測困難さを追加するためには以下のコードのようにすると良いです。 今日では、Perl, Ruby, Python などで、明示的な seed をせずに rand を使った場合に、内部的に行われる自動的な seed では、OS の乱数生成器由来の値が使われるようになっているので、Go でも同じ感じで良いと思います。 package main import ( cryptorand "crypto/rand" "encoding/binary" "math/rand" ) func main() { randSeed() println("rand int:", rand.Int()) } func randSeed() { var seed int64 err := binary.Read(cryptorand.Reader, binary.LittleEndian, &seed) if err != nil { panic(err) } rand.Seed(seed) } LittleEndian は BigEndian でも良いです。crypto/rand には big.Int のインターフェースもありますが、こちらの方式の方が簡潔に書けると思います。 蛇足ですが、暗号化用の鍵や、何とかトークンのような、長さ分のエントロピーを持つ乱雑な文字列を作りたい場合は、math/rand ではなく、 crypto/rand をそのまま使う必要があります。 リンク math/rand: Deterministic random by default is dangerous #11871