iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
最近、iOS端末のパケット・キャプチャでデバッグしたので、その情報をまとめた。
Appleからの情報は、Technical Q&A QA1176 Getting a Packet Traceだ。
Remote Virtual Interfaceの準備と解除の手順は以下のとおり。
# 端末の識別子を調べる。
・Macに端末をUSBで接続する。
・Xcodeを立ち上げ、Window / Devices and Simulators を選ぶ。
・端末のIdentifier: の値を選択してコピーする。
# 端末をつなぐ。
・Terminal.appで以下のコマンドを叩く。
$ rvictl -s 端末の識別子
Starting device 端末の識別子 [SUCCEEDED] with interface rvi0
# 端末を外す。
・Terminal.appで以下のコマンドを叩く。
$ rvictl -x 端末の識別子
リモート仮想インタフェースの確認
$ ifconfig -l
lo0 gif0 stf0 XHC20 en0 p2p0 awdl0 en1 en2 bridge0 utun0 utun1 utun2 pktap0 en4 rvi0
HTTPSのキャプチャの例。
$ sudo tcpdump port https -I rvi0
RFCからオープンとクローズのパケットの流れを抜き出す。
TCP A TCP B
1. CLOSED LISTEN
2. SYN-SENT --> --> SYN-RECEIVED
3. ESTABLISHED <-- <-- SYN-RECEIVED
4. ESTABLISHED --> --> ESTABLISHED
5. ESTABLISHED --> --> ESTABLISHED
Basic 3-Way Handshake for Connection Synchronization
TCP A TCP B
1. ESTABLISHED ESTABLISHED
2. (Close)
FIN-WAIT-1 --> --> CLOSE-WAIT
3. FIN-WAIT-2 <-- <-- CLOSE-WAIT
4. (Close)
TIME-WAIT <-- <-- LAST-ACK
5. TIME-WAIT --> --> CLOSED
6. (2 MSL)
CLOSED
Normal Close Sequence
無
var a : Int = 1
var b : Int? = 2
a = nil // エラー
b = nil // OK
b = Int(“abcd”) // nil
var c : Optional = 3 // パラメータ付き型指定
開示(unwrap)
var a : Int? = 1234
var b : Int = a - 2 // 型が異なるのでコンパイル・エラー
var b : Int = a! - 2 // 開示指定する
a = nil
b = a! - 2 // 実行時エラー
a = 5678
if a != nil {
print(“\(a!)”) // 開示指定が必要
}
print(String(describing: a)) // Debug目的で
オプショナル束縛構文 optional binding
var num : Int? = 1234
if let n = num {
print(“\(n)”)
}
if var n = Int(“1234”) {
n += 5678
print(“\(n)”)
}
if let n = Int(“1234”), let m = Int(“5678”) {
print(“\(n + m)”)
}
var a : Int? = 1
while let n = a {
a = nil
}
guard文
guard 条件 else { /* breakやreturn */ }
func demo(_ num:Int?) {
guard let n = num else { return }
print(“\(n)”) // 変数nが使える
}
nil合体演算子
let n : Int? = 1234
let m = (n != nil) ? n! : 0
let m = n ?? 0
let a : Int? = nil
let b : Int? = nil
let c : Int? = 3
let = a ?? b ?? c ?? 0 // cの値
func demo(_ p: inout Int?) {
p = nil
}
var n: Int? = 1234
demo(&n)
print(n ?? “nil”)
func test(_ num: inout Int) {
num = 0
}
n = 5678
test(&n!) // nがnilだと実行時エラー
print(n ?? “nil”)
有値オプショナル型 (IUO)
let n : Int! = 1234
print(“\(n)”) // 開示指定は不要
var m : Int! = nil
m += 5678 // 実行時エラー
print(“\(m)”)
失敗のあるイニシャライザ
struct Demo {
var a = 0
init?(_ n:Int) {
if n < 0 {
return nil
}
a = n
}
init() {
a = 1234
}
}
var p: Demo = Demo()
var q: Demo? = Demo(5678)
キャスト演算子
オプショナルチェーン optional chaining
// 辿っている途中でnilがあれば、
// そこで止まり全体でnilとなる。
if let name = who?.club?.teacher?.name {
print(name)
}
勉強会初の試みとして、モブプログラミングに挑戦します。事前に用意した内容を公開します。
進め方
作るもの
会場はいつもの池袋コワーキングスペース Open Office FOREST。前回の勉強会は新生MOSA始動のイベントだったので、通常の勉強会は久しぶりだ。
VirtualBoxへmacOS Mojaveをインストールするという発表だが、MojaveはUSB1.1コントローラがサポートされていないのと、インストール時にフォーマットをAPFSに変更してしまうのだが、VirtualBoxがAPFSからの起動をサポートしていないという問題があり、それを回避する内容だ。
Remote Virtual Interfaceを使って、Macに接続されたiOS端末をMacのターミナルで動かしたtcpdumpでパケット・トレースするという内容だ。
Swiftでプログラミングする範囲で必要なoptional関連の構文とサンプルコードをスライドにして、それを参加者と内容を確認していくといった内容だ。
前の発表を踏まえて、Optionalの内部での定義を紹介して、より深く理解するという内容だ。
予定していた『モブプログラミング』は時間切れとなり次回以降の実施となった。
秋に田町のコワーキングスペース 森永ヴィレッジで、特別な勉強会の開催が発表されたのだが、現状、勉強会の名称が統一されていないのと、池袋以外での開催となるので、新たな名称として『Cocoa.swift』の提案があった。
より詳細な内容については、FacebookのCocoa勉強会 関東のグループで行うことになったので、是非、意見をいただければ。