ATSに対応できているかチェックするツールats_checkerを書いた
追記: El CapitanにATS用のチェックツールが nscurl
に付属したのでそちらをつかうことをおすすめします。
App Transport Security Technote: App Transport Security Technote https://developer.apple.com/library/watchos/technotes/App-Transport-Security-Technote/index.html#//apple_ref/doc/uid/TP40016240-CH1-SW7
/usr/bin/nscurl --ats-diagnostics [--verbose] URL
のように利用できます。
iOS9でApp Transport Securityが適用されます。
要約するとサーバ側でATSに対応するなら以下のことが必要です。
- TLS 1.2以上を使うこと
- Cipherは指定されているものを使うこと
ということでURLがATSに対応できているか*1、というのを調べる簡単なツールを書きました。
以下のように使います。acceptableではない場合にはtlsオブジェクトをとりあえずデバッグのために出力しています。(ちゃんと値を見せてあげないとわかりづらいですが・・・
-> % ats_checker https://google.com https://google.com is acceptable for ATS -> % ats_checker https://example.com https://example.com is acceptable for ATS -> % ats_checker https://apple.com https://apple.com is not acceptable for ATS debug info: &tls.ConnectionState{Version:0x303, HandshakeComplete:true, DidResume:false, CipherSuite:0xc014, NegotiatedProtocol:"", NegotiatedProtocolIsMutual:true, ServerName:"", PeerCertificates:[]*x509.Certificate{(*x509.Certificate)(0xc82049c000), (*x509.Certificate)(0xc82049c480)}, VerifiedChains:[][]*x509.Certificate{[]*x509.Certificate{(*x509.Certificate)(0xc82049c000), (*x509.Certificate)(0xc82049c480), (*x509.Certificate)(0xc8203aed80)}}, SignedCertificateTimestamps:[][]uint8(nil), OCSPResponse:[]uint8(nil), TLSUnique:[]uint8{0x5e, 0x2e, 0xd8, 0x2d, 0x9c, 0x75, 0x56, 0xa4, 0x68, 0xa4, 0x71, 0x61}}
これでATS対応もばっちりですね!
任意のコマンドを適当にリトライするツール、retryを書いた。
外部サービス叩いたりしてるとよく手元でretryすることになったりする。shellで書いても良いのだけど、Goで書いてみた。
suzuken/retry https://github.com/suzuken/retry
-> % retry Usage: retry <command> -initialInterval int retry interval(s) (default 1) -maxElapsedTime int Max Elapsed Time(s) is limit of backoff steps. If the job spends over this, job makes stopped. If set 0, the job will never stop. (default 10000) -maxInterval int cap of retry interval(s) (default 1000)
retry
を頭につければよしなにリトライしてくれる。
-> % retry command_not_found fake 2015/08/26 19:53:28 err: exec: "command_not_found": executable file not found in $PATH 2015/08/26 19:53:29 err: exec: "command_not_found": executable file not found in $PATH 2015/08/26 19:53:31 err: exec: "command_not_found": executable file not found in $PATH ...
リトライの間隔や、最高試行時間をつけることもできる。例えばジョブによってあまり何度もリトライしたくないものなどは最大試行時間を短めにするといい。
$ retry -initialInterval=2 -maxElapsedTime=8 command_not_found 2015/08/26 16:57:37 err: exec: "command_not_found": executable file not found in $PATH 2015/08/26 16:57:39 err: exec: "command_not_found": executable file not found in $PATH 2015/08/26 16:57:43 err: exec: "command_not_found": executable file not found in $PATH 2015/08/26 16:57:49 err: exec: "command_not_found": executable file not found in $PATH operation failed: exec: "command_not_found": executable file not found in $PATH
もしよかったら使ってみてください。
Go 1.5でgo docがちょっと便利になった
$ go doc fmt.Sprintf func Sprintf(format string, a ...interface{}) string Sprintf formats according to a format specifier and returns the resulting string.
見やすくなりましたね。
JAWS-UG Meguro #0 でAWS SDK for Goについて発表してきました
「カジュアルなAWSの集いをやりますよ!」というお誘いをいただいて、行ってきました。
私からは最近触り始めたAWS SDK for Goの紹介をしました。
www.slideshare.net
Gist版: https://gist.github.com/suzuken/0a7f64a6016b3edfe2c4
AWS SDK for Goはまだ開発版で、プレビューの段階です。インタフェースはわりとカジュアルに変わってしまう段階では有りますが*1、ひとまず雰囲気だけでも掴んでもらえれば、と思い紹介してみました。
発表中でも触れたように、内部ではJSONで書かれたAWSのapi仕様に則り、 go generate
をつかってコードが生成されるようになっています。また、Exampleをうまくつかうようにしていたりと、このあたりも面白いところです。
Testable Examples in Go - The Go Blog
AWSのみなさま(と、 @kani_b 氏)、会場・運営どうもありがとうございました。
*1:実際にサンプルとして書いてきたコードが、発表前日の変更で壊れたりもしました・・
dummyデータをつくる
dummyデータつくるのになんかスクリプト書くかーといっていっつも使いまわしている気がしてきたのでとりあえず簡単なライブラリにしておいた。
似たようなツールはいろいろあるけど、シンプルなのが欲しかった。もうちょっとまとまったら使い方を書きたい。
みたいときに使えるようになる、予定。TODOとしては、
- 固定長以外でも出力
- JSONフォーマットで出力
- LTSVのようなフォーマットで出力
- delimiterをoptionalに
- 大きいサイズ生成する場合には並列に
あたりだろうか。DBのテストするために書いたので、CREATE TABLE
から適宜そのテーブルにいれられるダミーデータをつくれるように・・・とか一瞬思ったけど面倒そうだったのでやめた。
複数hostについてlistenしているnet.httpサーバを立ち上げ、そして落とす
HTTP Serverの止め方
結合テストの際にHTTP Serverを立ち上げて、テストが終わったらListenをやめる、というのをやりたかったので調べた。下のようにしてStopさせてみた。
hydrogen18/stoppableListener · GitHub では StoppableListener
を実装していて、net.TCPListener
にstopのchannelをあわせたものをListenerとして定義している。StoppableListener.Stop()
するとstop channelがcloseされて、Listenerも閉じられる。
参考: Stopping a listening HTTP Server in Go - Eric's Apparatus