すずけんメモ

技術メモです

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が適用されます。

developer.apple.com

要約するとサーバ側でATSに対応するなら以下のことが必要です。

  • TLS 1.2以上を使うこと
  • Cipherは指定されているものを使うこと

ということでURLがATSに対応できているか*1、というのを調べる簡単なツールを書きました。

github.com

以下のように使います。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対応もばっちりですね!

*1:ただしデフォルトの条件に限るので、iOSアプリ側で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

もしよかったら使ってみてください。

JAWS-UG Meguro #0 でAWS SDK for Goについて発表してきました

「カジュアルなAWSの集いをやりますよ!」というお誘いをいただいて、行ってきました。

connpass.com

私からは最近触り始めたAWS SDK for Goの紹介をしました。

www.slideshare.net

Gist版: https://gist.github.com/suzuken/0a7f64a6016b3edfe2c4

AWS SDK for Goはまだ開発版で、プレビューの段階です。インタフェースはわりとカジュアルに変わってしまう段階では有りますが*1、ひとまず雰囲気だけでも掴んでもらえれば、と思い紹介してみました。

発表中でも触れたように、内部ではJSONで書かれたAWSapi仕様に則り、 go generate をつかってコードが生成されるようになっています。また、Exampleをうまくつかうようにしていたりと、このあたりも面白いところです。

Testable Examples in Go - The Go Blog

AWSのみなさま(と、 @kani_b 氏)、会場・運営どうもありがとうございました。

*1:実際にサンプルとして書いてきたコードが、発表前日の変更で壊れたりもしました・・

dummyデータをつくる

dummyデータつくるのになんかスクリプト書くかーといっていっつも使いまわしている気がしてきたのでとりあえず簡単なライブラリにしておいた。

github.com

似たようなツールはいろいろあるけど、シンプルなのが欲しかった。もうちょっとまとまったら使い方を書きたい。

  • Goで適当な文字列が欲しい
  • cliツールとしても使いたい
  • 適当なフォーマットで指定したらよしなに出力して欲しい

みたいときに使えるようになる、予定。TODOとしては、

  • 固定長以外でも出力
  • JSONフォーマットで出力
  • LTSVのようなフォーマットで出力
  • delimiterをoptionalに
  • 大きいサイズ生成する場合には並列に

あたりだろうか。DBのテストするために書いたので、CREATE TABLE から適宜そのテーブルにいれられるダミーデータをつくれるように・・・とか一瞬思ったけど面倒そうだったのでやめた。

複数hostについてlistenしているnet.httpサーバを立ち上げ、そして落とす

先ほどのメモに引き続き suzuken.hatenablog.jp

今度はこれを複数hostについてlistenしたい。これもテスト用に使いたかったもの。で、下のように書いてみた。

gist.github.com

10秒間は複数hostについてlistenさせているのがわかる。ただ雑なので、HostSwitch:5555指定しているのと、http.Server を作っているところで適当に整合性をとる必要がある。ちなみにlocalhostでやる場合にはhostsファイルかDNS cacheサーバか何かに適当に設定してドメインを引けるようにすること。

DNS cacheサーバもgolangの中に閉じ込めれば便利かもしれない。

HTTP Serverの止め方

結合テストの際にHTTP Serverを立ち上げて、テストが終わったらListenをやめる、というのをやりたかったので調べた。下のようにしてStopさせてみた。

gist.github.com

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