すずけんメモ

技術メモです

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

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

YAPC::Asia Tokyo 2015 前夜祭に行ってきた

YAPC::Asia Tokyo 2015 の前夜祭に行ってきました。仕事終わりに埼京線からりんかい線に乗り継ぎ、国際展示場へ。ビッグサイトはちょっと時間がかかるかなと思っていましたが、空いていたので渋谷から30分ほどで着きました。

聴いたトークは3つ。メモがてらツイートしたことをはっておきます。発表者のみなさまありがとうございました。

PHP帝国の逆襲!(を願うPHPerが話す最近のPHPについてのクイックツアー PHP7対応版) - YAPC::Asia Tokyo 2015

YAPCなのに前夜祭はPHPRubyのセッションから始まったようです。私はuzullaさんのトークを聴きにいきました。去年も聴きたかったのですが機会を逃してしまったので1年経て聴けたことになります。会場が盛り上がってて最高でした。最近HHVMをいろいろ手元で試していたのでトピック的にも面白かったです。PHP7でまたいろいろ良くなりますし、今後も楽しみです。あと「負債のない言語があるか?ないだろ。」的な流れが最高でした。

はてなブックマークのトピックページの裏側 - YAPC::Asia Tokyo 2015

Elasticsearchのaggregationをごりごりと活用している事例でした。はてなブックマークは日々使っているので中のお話が聴けて新鮮でした。トピックの生成、Elasticsearch 6ノードで実現されているのが最も驚いたところです。2時間ごとの生成とおっしゃっていたけれど、日によってトピックの量が変わるとジョブの時間も伸びていくのだろうか・・・など思いつつ、興味ぶかいセッションでした。

我々にできるOSSとそのコミュニティの育てかた - YAPC::Asia Tokyo 2015

前夜祭最終セッションはモリスさんのセッションを見に。モリスさんの経験あってこそのセッションだなあと思いました。私は利用者になってしまうことがほとんどなので、こうしてもっと自分でごりごりとOSSとして出している話を聴くと、ああもっと姿勢を変えていかないとなあと思いました。最後t-wadaさんがQ&Aで質問されていたソフトウェアがコンパクトで美しいことと、ツールの実用性との両立というのは興味深い話でありました。

その他

前夜祭には初めて行ったのですが、ビールが出るのですね!おいしくいただきました。ビッグサイト、広くて明日から人もたくさんくるでしょう。運営の方には頭が上がりません。明日からも楽しく、無事に3日間が終えられることを祈りつつ、楽しんでいきたいと思いました。

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:実際にサンプルとして書いてきたコードが、発表前日の変更で壊れたりもしました・・

Arduinoをはじめよう、をやってみた

GWだし普段やってないことをやってみよう、ということでArduinoを触ってみた。Arduinoをはじめようという本と、それに合わさったキットをつかっている。*1

  • Arduinoをひとまず起動する
  • LEDをつけてみる
  • スイッチをon/offしてLEDをつけたり消したりしてみる
  • Cdsセルをつかって、LEDをつけたり消したりする
  • Cdsセルをつかって、LEDの光る強さを変えてみる
  • ブログから本文読み取って、単語数をもとに3つのLEDの光る強さを変える

ということをした。所要時間5時間くらい。組み立てつつ、写経しつつ進めた。たぶんProcessingとかこういう部品組むのとか慣れてる人だったらもっと早く終わると思う。

つかったもの

環境はOSX 10.9.5のMBP。

Arduinoをはじめようキット

Arduinoをはじめようキット

Arduinoをはじめよう 第2版 (Make:PROJECTS)

Arduinoをはじめよう 第2版 (Make:PROJECTS)

ここからIDEを落とす。Processingで書けるらしい。Cに変換されるとのこと。

Arduino - Software http://www.arduino.cc/en/main/Software

ArduinoIDEが付属している。こんな感じ。

f:id:suzu_v:20150504185604p:plain

ArduinoをはじめようキットだとArduino Unoというボードがついている。これをPCとUSBでつなぐと、Arduinoに電力が供給されて動くようになっている。ちなみに本には設定が必要だと書いてあったんだけど、USBでつないでArduinoIDEを起動したら勝手に設定が終わっていた。簡単。接続されているデバイスの中からArduinoを勝手に認識してくれているらしい。

f:id:suzu_v:20150504190012p:plain

コード書いてチェックボタンでverify、→ボタンでコンパイルとデプロイされる。便利。

まずLEDをつけたりスイッチをつけたり

Arduino IDEで新規ファイルを作成するとSTUBの手続きが生成される。

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

setup()マイコンボードに書き込まれた際に実行される処理。 loop() はその後繰り返し呼び出される。LEDをつけるには

void setup(){
  pinMode(13, OUTPUT); // LEDのポート番号
}

void loop(){
  digitalWrite(13, HIGH);
}

これだけでいい。ちなみに読み込みはINPUT用のpinをつくって、digitalRead()すればいい。するとボタンを押してLEDをつけたり消したりするのは以下のようにかける。

int val = 0;

void setup(){
  pinMode(13, OUTPUT); // LEDのポート番号
  pinMode(7, OUTPUT); // 例えば、ボタンのポート番号
}

void loop(){
  val = digitalRead(7); // ボタンの値を読み込む
  if (val == HIGH) {
    digitalWrite(13, HIGH); // LED on
  }
  else {
    digitalWrite(13, LOW); // LED off
  }
}

といったような感じでコードを書いていく。だいたいArduino側がapiを用意してくれているので、単純なdigitalRead()digitalWrite()だとさくさく書けるようだ。

こういった例がいくつかあって、以下の様に部品を組んで動かしていく。

f:id:suzu_v:20150504190456j:plain

f:id:suzu_v:20150504190506j:plain

微妙にはまったところ

6章にクラウドとの会話という章がある。ここで、ブログのフィードからテキストをもってきて、LEDライトのそれぞれの明るさに反映するという例になっている。

ブログのフィードを持ってきてシリアル通信でボードに送るところはProcessingで書かれている。ただこのままだと動かない。

  • そもそも http://blog.makezine.com/index.xml が403
  • Processingをインストールしてもそのままでは動かない。processing-java を入れる必要があり、それらの import 宣言が抜けている。

ということでちゃちゃっと直した。https://processing.org/download/からProcessingを落としてきてインストール。Tools -> Install "processing-java" でprocessing-javaをインストール。あとは以下のimport文をスケッチに足す。

import java.net.*;
import java.io.*;
import java.util.*;

あとはURLを適当に変えてあげる。私は代わりに String feed = "http://blog.arduino.cc"; とした。また、ここで例にあげられているlove, peace, arduinoの単語はブログによって頻度が違うので適当に選ぶといい。私はそれぞれwindows, make, arduinoとした。

で結果として以下のようになった。

f:id:suzu_v:20150504192155j:plain

ちゃんと光った。

感想

面白かった。シリアル通信できればProcessingで処理した部分は他の言語でも書けるだろうし、もっといろいろできそう。あと色んなセンサーを集めて遊んでみたくなった。

*1:2つともwishlistからプレゼントとしてもらったもの。harukasan, amacbeeありがとう!