hirakiucの日記

いろいろ

Key-Value Observing

"objcでKey-Value Observingしたいのだけど、observeValueForKeyPath:ofObject:change:contextメソッドでsuperを呼び出すのはどんなとき?" という話。

Key-Value Observingの方法とかは、他の方の分かりやすい記事を参照ください。

observeValueForKeyPath:ofObject:change:contextの書き方

Key-Value Observingするとき、監視する側はこのメソッドが呼ばれて通知される様子。

// NSKeyValueObserving Protocol
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

googleさんで探すと良く見つかるのはこんなコード

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
  if ([keyPath isEqualToString:@"tintColor"]) {
    // tintColorに変更があったときのコード
  }
}

他には、superを呼び出してるコードも見つけた。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
   // なにかのコード
   [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

どんなときにsuperを呼ぶ必要があるのか気になったので探してみた。

NSInternalInconsistencyException when using KVO

自分が監視しているkeyPathの場合はsuperを呼び出すべきじゃないね (NSInternalInconsistencyExceptionが起きるから)という話の様子。

で、自分で監視したkeyPathかどうかを判別する一つの方法として、 「observerを登録する際にcontextも一緒に登録しておくと、observeValueForKeyPath:ofObject:change:contextメソッドのcontextで判断できる」という内容ぽい。

// enabled ARC

// observerを追加するとき
[observedObject addObserver:self forKeyPath:@"tintColor" options:0 context:(__bridge void *)self];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
   if (context == (__bridge void *)self) {
     // 監視してるkeyPath毎のコード
  } else {
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  }
}
// 

一つ疑問が解消した。

TLS Next Protocol Negotiation (NPN)

nginx 1.5.0に含まれてるspdy moduleを有効にしたので、せっかくならとspdyを設定してみたくてhttpsを仕込んでみたりしてたところ、また知らないものを見つけた。

spdyを設定ファイルで有効にしてconfigtestしてみると、どうもうちの環境だとOpenSSLが NPNをサポートしていないのでダメみたい。

TLS Next Protocol Negotiation (NPN)

最初の方だけ読んでみると、どうもhttpsで使うsslのセッションを確立する際の方法の様子。

では、これまでのssl セッションの確立はどーなってたのかとか少し漁ってみた。

ssl Handshake

さらっとgoogleさんで探してみると、sslのセッションを確立するときのやり取りはこんな感じらしい。

SSLの解説 - ipa

このサイトの "図4 SSL Handshake" を見てみると、クライアント/サーバ間でたくさんやり取りした後でようやくSSLのセッションが出来る様子。

現場にキく、Webシステムの問題解決ノウハウ 第3 "Webの表示速度を遅くする「SSLハンドシェイク」とは

でも同じような説明を見つけた。

Next Protocol Negotiation (NPN)

TLS Next Protocol Negotiation (NPN)

の途中にあるascii artぽい図を見るとわかるように、この仕様ではサーバ/クライアント間でやり取りをより少なくするものみたい。(だから、spdyに特化した仕様じゃないよと書かれてた)

sslのセッションを確立するための、よりシンプルな方法という感じ。


centos6のofficialなopenssl(1.0.0-27)はNPNを含んでいない事とopensslを入れ替えればいけそうな事は分かったので、ここで一旦打ち切り。

Server Name Indication (SNI)

Webサーバでhttpsを設定したくなって色々と探してたらSNIという話を見つけたのでメモ。

名前ベースのバーチャルホストを使ってるWebサーバで、バーチャルホスト毎にsslの証明書を設定するとどうなってたかと、その一つの解決方法(SSL/TSLの拡張)の話。

HTTPSサーバの設定 - 名前ベースの HTTPS サーバ

Server Name Indication - wikipedia

サーバ/クライアントの双方で対応してる必要があるらしいので、古い環境でも動作を期待する場合は使えないぽい。

一つためになった。

設定と確認方法はこちらがとても詳しく書かれててすごい!

nginxでServer Name Indication(sni)

FlightPath

iOS/Androidアプリのベータテストをお手伝いしてくれるサービス TestFlightから FlightPathというサービスが一ヶ月前くらいに出てた。

https://testflightapp.com/flightpath/

ただし、まだprivate betaの様子で、メールアドレスを登録してみたけど何もお返事なし...。

(Testflightに登録してて、takeOffしてるアプリをリリースすれば参加できるっぽい感じの説明を見つけたので後で試してみる事に。)

アプリの使われ方とかまわりの情報を収集してくれて便利そうなdashboardを見せてくれるらしい。

SDKはTestFlightに含まれているとのことで、TestFlightユーザはうれしい感じ。

Crash logもsymbol付きで見れたりするのだったら便利そうな予感。

どんな情報が見れるのか楽しみ。

中の人たちにぜひ頑張って欲しいところです。

うさぎ の様子

食欲も無くなって元気が無いと聞いてたうさぎ。

久々に会いに来たら、少し元気になったみたい。

食欲もでてきたようで、 ご飯も食べるし、大好きなパイナップルのドライフルーツ(の欠片になってるもの)も食べてた。

ただ、胸の辺りの毛が毛づくろいのし過ぎで抜けてた。

これから暑くなるし、まだまだ気が抜けない。

iphoneアプリからfacebook pageを開くときの注意点

http://stackoverflow.com/a/12953080/1500903

iOSアプリからfacebook pageをMobile Safariで開きたいとき、指定するURLに少し注意が必要ぽい。

(iOS6.1.3 on iPhone5 で実機検証済み)

  // url が開きたい URLの NSString
  NSURL *siteURL = [NSURL URLWithString:url];
  [[UIApplication sharedApplication] openURL:siteURL];

普通はこんな感じでURLを指定して開いたりするぽいのですが、

https://www.facebook.com/(ページ名)」を指定すると、facebookアプリが起動する様子。

https://m.facebook.com/(ページ名)」と、モバイル用のURL(?)を指定すると、Mobile Safariで開いてくれた。

(追記) URLを"http"から"https"に変更。

うさぎ

実家のうさぎが10年8ヶ月のおじいちゃん。

生まれた日〜店で買った日の期間は含んでないため、実際は11年越えてそう。

http://members.jcom.home.ne.jp/purins1/nenrei.htm によると、 だいたい80歳らしい。

元気で居てほしい。