トップ 追記

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|

2018-08-12 [cocoa][swift]Cocoa.swift 2018-09のご案内

次回勉強会の案内です。

秋に特別な勉強会の開催を検討しています。各自取り組んでいることをしっかりと発表できる場になればと考えています。場所も何時もの池袋以外を考えているのですが、このタイミングで勉強会の名称の修正を考えています。

Cocoa勉強会 関東 Swift分科会ということで、Cocoa.swiftでどうでしょうか?

今後も池袋以外での開催の可能性があるとうことで名称に場所を含めない。そして、Cocoa勉強会の分科会ということでBUKUROをCocoaに差し替える。ご意見がある方は、九月の勉強会でお聞かせください。


■ 第114回 Cocoa勉強会 関東 のご案内
日時:
2018/09/12(水) 19:30-22:00
会場:
池袋コワーキングスペース OpenOffice FOREST
http://co-forest.com
集合:
現地
座席代:
夜間ドロップイン 一人1,000円

■出欠の登録

以下のconnpassサイトからお願いします。
https://cocoa-kanto.connpass.com/event/97193/


[スケジュール]
18:00  自習
19:30  自己紹介
20:00  発表
- 20:00〜20:30 「募集中」未定
- 20:30〜21:00 「符号化について」村上幸雄
  ASN.1, JSON, MessagePack, ProtocolBuffers, FlatBuffers, Avro
- 21:00〜21:15 「募集中」未定
21:15 モブプログラミング
- Master-Detail App を実装する(モデルをどう持つ?etc)
21:30 秋の大勉強会について考える
21:45  次回日程の決定、片づけ
22:00  解散

2018-07-25 [cocoa][swift]BUKURO.swift 2018-07に行ってきた

会場はいつもの池袋コワーキングスペース Open Office FOREST。前回の勉強会は新生MOSA始動のイベントだったので、通常の勉強会は久しぶりだ。

_ VirtualBoxへのMojaveのインストール

VirtualBoxへmacOS Mojaveをインストールするという発表だが、MojaveはUSB1.1コントローラがサポートされていないのと、インストール時にフォーマットをAPFSに変更してしまうのだが、VirtualBoxがAPFSからの起動をサポートしていないという問題があり、それを回避する内容だ。

_ 通信デバッグ

Remote Virtual Interfaceを使って、Macに接続されたiOS端末をMacのターミナルで動かしたtcpdumpでパケット・トレースするという内容だ。

_ SwiftのOptionalを理解する

Swiftでプログラミングする範囲で必要なoptional関連の構文とサンプルコードをスライドにして、それを参加者と内容を確認していくといった内容だ。

_ 構文糖衣なしでSwiftのオプショナルを使うとどうなるか?

前の発表を踏まえて、Optionalの内部での定義を紹介して、より深く理解するという内容だ。

予定していた『モブプログラミング』は時間切れとなり次回以降の実施となった。

秋に田町のコワーキングスペース 森永ヴィレッジで、特別な勉強会の開催が発表されたのだが、現状、勉強会の名称が統一されていないのと、池袋以外での開催となるので、新たな名称として『Cocoa.swift』の提案があった。

より詳細な内容については、FacebookのCocoa勉強会 関東のグループで行うことになったので、是非、意見をいただければ。


2018-07-13 [モブプログラミング]Master-Detail App を実装する

勉強会初の試みとして、モブプログラミングに挑戦します。事前に用意した内容を公開します。

進め方

  • 大まかな仕様があるので、それを参考にして皆で製作する。
    • スムーズにするため、サンプル・プロジェクトを用意する。
    • プロジェクトは共有した方がいいが大変なので、各自ローカルの環境でとする。
  • 役割は、一人がドライバ、その他がナビゲータ。
  • ドライバーは時間を決めて、順番に交代して担当する。時間は例えば5分。
  • ドライバーは操作しているMacの画面を投影して、皆で見ながら進める。
  • 大まかな仕様とサンプルと異なる実装方法の意見があると思うが、それを皆で共有して議論したいので、異なる意見は大いに歓迎。

作るもの

  • iOSのMaster-Detail App。
    • ほぼ、新規プロジェクトで生成される雛形のまま。
  • モデルのクラスを用意する。
    • サンプルのモデルのクラス名は、Document。
    • シングルトンでなく、AppDelegateのメンバー変数で保持。
Example

_ ソースコード

たたき台となるExampleを共有ディスクで公開しています。
Exampleプロジェクト

2018-07-08 [Swift]SwiftのOptionalを理解する

  • Lispでは、無を表すものとしてnilを用意。
  • C言語では、空ポインタとしてNULLマクロを定義。
  • Objective-Cでは、空idとしてnilが用意され、画期的なのはnilにメッセージを送信しても無視されるだけでエラーにならない!
  • SwiftのnilはObjective-Cとの互換。Cocoaフレームワークを利用するためか。
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)

キャスト演算子

  • 式 is T

    型/プロトコルTなら真
  • 式 as T

    型/プロトコルTにキャスト
  • 式 as? T
    型/プロトコルTのオプショナルにキャスト
    失敗した場合はnil
  • 式 as! T
    型/プロトコルTにキャスト
    失敗した場合は実行時エラー

オプショナルチェーン optional chaining

// 辿っている途中でnilがあれば、
// そこで止まり全体でnilとなる。
if let name = who?.club?.teacher?.name {
    print(name)
}

2018-07-07 [iOS]通信デバッグ

最近、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

2018-06-10 [WWDC18]OpenGLとOpenGL ES、OpenCLがdeprecated

いつかその時が来ることは予想されていたが、macOSでOpenGLとOpenCLがdeprecatedとなった。また、iOSでもOpenGL ESがdeprecatedとなった。Metalが推奨されるようになたっということだ。

Khronos GroupからVulkanが発表されたことを考えると時間の問題だったともうが、このタイミングとたった。ただし、推奨されないが使えるので、直ぐに切り替えないとというわけではないが、ゲーム関連のディベロッパーなどは喧喧諤諤としていると思う。

macOSやiOSでMetalとVulkanの関係がどうなるのか予測できない部分もあるが注目していこうと思っている。

_ ●●●

WWDCに行かなかった(行けなかった)、日本残留組の朗報だ!6月15日(金)にWWDC関連の合同勉強会『THe Bash in Tokyo』を開催するので、都合がつく人はぜひ!


2018-05-23 [Automatism]アプリ設計のパターン(機能設計)

どうコードを記述するか?この問題に対するアプローチは様々だ。

書籍『Effective ○○』を参考にする。デザインパターンに乗っ取る。コーディング・ルールに従う。どれも有益だとは思うが、今回は、自分がアプリケーション・プログラマに転身した際に参考にした、『iOS開発に置けるパターンによるオートマティズム』を現在の環境で取り組んでみる事にした。

今回取り上げるのはアプリ設計のパターンだ。

_ # 機能設計

今回、この記事を執筆するにあたって過去の教科書的なプログラム開発技法の書籍を読み返してみて気がつくのは、機能設計に相当することがほとんど触れられていないことだ。どんなサービスを開発するのかはユーザの問題で、技術者はユーザからの要求をいかに文書化するかが需要。また、既存のユーザ作業を図にしていくか、制作するプログラムを処理の図にしていくことが主な関心となっていた。

そういう状況から、iPhoneアプリケーションの開発から始まった、幅広い意味のデザインがアプリケーションを製作するエンジニアに期待される状況に変わっていったのは、画期的なことだったのだろう。

そういう訳で機能設計についてはよく使われる図式のようなものなく、様々な図式の技法で育ってきたプログラマにとって不安に感じる部分なのだが、そんなものは不要ということなのだろう。

それではやってみよう。GTDのような個人のワークフローを管理するiOSアプリケーショの機能設計を行ってみる。まずは機能の列挙だ。

  • 個人のワークフローを管理する。
    • 仕事を入力する。
      • 名称
      • 期限
    • 仕事のリストを並べ替える。
    • 仕事をするタイミングを伝える。
      • 通知を表示する。
    • 完了した仕事を済みにする。
      • 指定されて仕事をリストから削除する。

このアプリではデータをバックアップするとか他機器と同期するとかを考えないと、通信の機能は使わないで実装できそう。通知はローカル通知でいけそうだ。


2018-05-09 The Bash in Tokyo

今年も WWDC (Worldwide Developers Conference) の季節となりました。

WWDCについて詳しくない方もいらっしゃると思いますので説明しますと、Appleが毎年春ごろに一週間かけて開催される開発者向けイベントで、今年は6/4(月)〜8(金)に開催となります。そして、WWDC期間中の木曜日の午後にはBashと呼ばれる野外パーティが開催されています。

WWDCでは、開発者向けにMacやiPhoneの次期OSと、その新機能をプロダクトに組み込むための手法が発表されるのと、Appleのエンジニアに直接疑問をぶつけられるということで、開発者にとって関心が高いイベントですが、近年はiPhoneアプリケーション開発者の増加によって人気が高いイベントとなり、すぐにチケットがソールドアウトとなってしまいます。
今回も参加を希望されて、残念ながら抽選で外れた方もいらっしゃると思います。

そこで、MOXSSG (Mac OS X Server勉強会)というグループでは、WWDCのチケットが買えず、日本残留組となった方々と『The Bash in Tokyo』というイベントを開催していました。 今回、このイベントをより幅広い方が参加できるように、MOSAとMOXSSG、Cocoa勉強会 関東と合同で『The Bash in Tokyo』を開催することにいたしました。

本家と違って、会場も屋内でクールなバンドもきません。食べ物も飲み物も基本的に参加者の持ち込みとなります。 でも、WWDCについて語り合いたいという共通の目的がある方々が集まります。WWDCをつまみにビールでも飲みながら語らいましょう。

_ # 参加条件

  • アルコール提供イベントの為、20歳以上とさせて頂きます。
  • イベントの様子の写真は撮影しますのでご了承ください。(SNS等で公開予定)
  • コンサルタントやエンジニア、ライターなど、Appleの最新技術に興味がある方。
  • 飲食の持ち込みをお願いします。例えば、缶ビール1セットやワイン、ピザなどです。
  • _ # イベント概要

  • WWDCセッション動画を皆で視聴します。
  • WWDCで発表された気になるトピックを希望者が発表します。
  • 今回のWWDCについて、皆でディスカッションします
  • _ # 当日のタイムスケジュール(予定)

    17:00 受付
    * WWDCセッション動画(Keynote)の視聴
    18:00 乾杯
    18:00 キーノート(テクノロジーライター 大谷 和利)
    18:30
    * WWDCセッション動画(リクエスト または State of the Union)の視聴
    * 発表数本
    * ディスカッション
    21:00 終了
    22:00までに解散
    

    _ # 申し込み

    ※各グループのメンバーが定員オーバで申し込めないという状況を避けるため、グループ毎に申し込みページを用意しています。  Cocoa勉強会は上記となります。


    2018-05-01 WWDC18について

    今年のWWDCは6月4日から8日までサンノゼで開催される。参加申し込みは抽選方式となった。

    昨年から開催地がサンノゼに戻ったことにより、過去のWWDC情報に役立たない部分があると思うが、パッと見つけたものを列挙してみる。

    _ 以下は事前のイベント。

    _ WWDCと連動したイベント。


    2018-04-12 PubHack.swift 2018-04に行ってきた

    2018年4月12日(木)の夜間、東京都豊島区のTHE DUBLINERS' IRISH PUB 新宿店におきまして、「PubHack.swift 2018-04」を開催致しました。

    PubHack.swift 2018-04

    PubHack.swiftは今年からはじめました新しい形のイベントで、飲み会イベントを通じて、macOS/iOS/tvOS/watchOS/Androidエンジニアの人たちの交流を目的としています。
    名前の由来を説明しますと、PubHackは英国 Pub Rock からとりました。
    Pubは飲み会、Hackはプログラミング、.swiftはmacOS/iOS/tvOS/watchOS系です。

    始めたばっかりということで、正直、浸透していませんが、それでも参加人数は7名と、予想した人数より多くなり大変嬉しいです。
    また、参加された方のバックグラウンドも多彩で、新しいイベントとしては、よかったのではないかと思っています。

    PubHack.swift 2018-04

    純粋な飲み会イベントということで、長々と文章で説明するのも野暮だと思いますが、出てきた話題を何個かピックアップしますと、以下のとおりです。

    • ブロックチェーンの採掘についての理論と実装について。自分はこうしてます。
    • ブロックチェーン関連の開発で収入を得る方法。
    • Mac App Storeで食っていけますか?
    • App Storeで上位にランキングされるということ。
    • 公式に認められた副業について。誰か受注してくれませんか?
    PubHack.swift 2018-04

    次回は5月開催を予定しています!