Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2016-06-15

【iOS 10】Speechフレームワークで音声認識 - 対応言語リスト付き

iOS 10のドキュメントが公開された当日に書いた下記記事で、最も反響が大きかったのが音声認識APIでした。


今回公開された SiriKit(Intents / IntentsUI)とは別のフレームワーク、Speech Framework として公開されたものです。リアルタイム音声にも、録音済み音声にも使えるようです。


f:id:shu223:20160616104103j:image


今までも色々と音声認識を実現する手段はありましたが、やはりApple純正となると一気に本命になってきます。*1


というわけで本記事では Speech フレームワークを色々いじってみて、何ができるのかとか、どうやるのかとか見てみたいと思います。


なお、NDA期間中につき、スクショは自粛します。


まずはサンプルを動かしてみる

"SpeakToMe: Using Speech Recognition with AVAudioEngine" というサンプルコードが公開されているのでまずは試してみます。


アプリが起動してすぐ、Speech Recognition の利用許可を求めるダイアログ が出てきます。そんなパーミッションも追加されたんだ、と思って [Settings] > [Privacy] を見てみると、確かに [Speech Recognition] の欄が追加されています。


録音を開始するボタンを押すだけで認識スタンバイOKです。試しに Hello と話しかけてみると・・・"How do" という結果が・・・気を取り直してもう一度 Hello と言ってみると・・・"I don't"・・・


これは自分の英語力の問題なので、諦めてターミナルから `say` コマンドで Hello と言わせると "Hello" と正しく認識してくれました。同時に過去の "I don't" とかも "Hello" に修正されたので、その後の入力からの認識結果によって過去の認識結果も修正するっぽいです。


サンプルの実装を見てみる

SFSpeechRecognizerの準備

初期化して、

private let speechRecognizer = SFSpeechRecognizer(locale: Locale(localeIdentifier: "en-US"))!

デリゲートをセット

speechRecognizer.delegate = self

音声認識の利用許可を求める
SFSpeechRecognizer.requestAuthorization { authStatus in
    OperationQueue.main().addOperation {
        switch authStatus {
            case .authorized:
                // 許可された

            case .denied:
                // 拒否された

            case .restricted:
                self.recordButton.isEnabled = false
                self.recordButton.setTitle("Speech recognition restricted on this device", for: .disabled)

            case .notDetermined:
                self.recordButton.isEnabled = false
                self.recordButton.setTitle("Speech recognition not yet authorized", for: .disabled)
        }
    }
}

コールバックはメインスレッドで呼ばれているとは限らないので `OperationQueue.main().addOperation` で実行しているようです。


認識リクエストの準備

プロパティを定義しておいて、

private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?    

認識開始前に初期化。

recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
guard let recognitionRequest = recognitionRequest else { fatalError("Unable to created a SFSpeechAudioBufferRecognitionRequest object") }

このプロパティをセットすると、録音が終わる前の "partial (non-final)" な結果を報告してくれる、とのことです。

recognitionRequest.shouldReportPartialResults = true

つまり、確定前の結果を取得できるようで、先ほどの、過去に戻って認識結果が修正される挙動はこのプロパティによるものではないかと思われます。リアルタイム認識時には有効にしておきたい重要プロパティですが、デフォルトでは `false` とのことです。


認識タスクの登録

SFSpeechRecognizer の `recognitionTask:with:resultHandler:` メソッドに SFSpeechRecognitionRequest オブジェクトと、結果を受け取ったときの処理を渡します。

recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in
    var isFinal = false
    
    if let result = result {
        self.textView.text = result.bestTranscription.formattedString
        isFinal = result.isFinal
    }
    
    if error != nil || isFinal {
        self.audioEngine.stop()
        inputNode.removeTap(onBus: 0)
        
        self.recognitionRequest = nil
        self.recognitionTask = nil
        
        self.recordButton.isEnabled = true
        self.recordButton.setTitle("Start Recording", for: [])
    }
}

戻り値として、 SFSpeechRecognitionTask オブジェクトが返ってきます。このサンプルでは、認識結果は SFSpeechRecognitionResult オブジェクトの `bestTranscription` プロパティより得ています。


録音開始(認識開始)

ここは AVAudioEngine の機能であって、iOS 8 からあるものなので、省略します。AVAudioEngine については下記記事にも書いたのでよろしければご参照ください。(残念ながら録音については書いてないのですが。。)


唯一 Speech フレームワークと直接関係するポイントは以下。

inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
    self.recognitionRequest?.append(buffer)
}

これで、マイクから得られる音声バッファが SFSpeechRecognitionRequest オブジェクトに渡されるようになり、録音開始と共に認識が開始されることになります。


対応言語は58言語!

基本的な使い方がわかったところで、以下ではサンプルに触れられてない部分も色々と見てみます。まずは、対応言語から。


SFSpeechRecognize は初期化時に以下のように Locale を指定できるようになっています。

private let speechRecognizer = SFSpeechRecognizer(locale: Locale(localeIdentifier: "en-US"))!

`supportedLocales()` というメソッドがあるので、全部出力してみます。

SFSpeechRecognizer.supportedLocales().enumerated().forEach {
    print($0.element.localeIdentifier)
}

出力結果:

nl-NL
es-MX
zh-TW
fr-FR
it-IT
vi-VN
en-ZA
ca-ES
es-CL
ko-KR
ro-RO
fr-CH
en-PH
en-CA
en-SG
en-IN
en-NZ
it-CH
fr-CA
da-DK
de-AT
pt-BR
yue-CN
zh-CN
sv-SE
es-ES
ar-SA
hu-HU
fr-BE
en-GB
ja-JP
zh-HK
fi-FI
tr-TR
nb-NO
en-ID
en-SA
pl-PL
id-ID
ms-MY
el-GR
cs-CZ
hr-HR
en-AE
he-IL
ru-RU
de-CH
en-AU
de-DE
nl-BE
th-TH
pt-PT
sk-SK
en-US
en-IE
es-CO
uk-UA
es-US

なんと、58言語もあります。もちろん日本語 "ja-JP"もサポート。


長文の認識精度

英語で長文を入れてみてもそもそも自分の発音が、というところがあるので、日本語で試してみます。

private let speechRecognizer = SFSpeechRecognizer(locale: Locale(localeIdentifier: "ja-JP"))!

上記の一文をしゃべって入力してみました。今現在フードコートのテーブルでこれを書いてるので、周りはそこそこ騒がしいです。一発勝負で結果は以下でした。


英語で長文を入れてみても様々自分の発音がどういうところがあるので日本語で試してみます


なんと、間違った箇所は「そもそも」 → 「様々」(さまさま?)だけ


なかなか優秀なんじゃないでしょうか。


パフォーマンス

ちゃんと測ってないですが、体感としてはiOSに従来からある音声入力と同じぐらいです。リアルタイムからほんのちょっと遅れて結果が確定していく感じです。


SFSpeechRecognitionResult

認識結果として SFSpeechRecognitionResult オブジェクトが得られるわけですが、公式サンプルで用いられている `bestTranscription` は最も信頼度(confidence)の高い認識結果で、その他の候補も `transcriptions` プロパティより取得することができます。

@property (nonatomic, readonly, copy) SFTranscription *bestTranscription;
@property (nonatomic, readonly, copy) NSArray<SFTranscription *> *transcriptions;

録音済みファイルの認識

SFSpeechAudioBufferRecognitionRequest の代わりに、SFSpeechURLRecognitionRequest クラスを利用します。どちらも SFSpeechRecognitionRequest のサブクラスです。


実装して試してはないのですが、バッファの代わりにファイルのURL(ローカル/オンライン)を指定するだけで、あとは上述の方法と同じかと思われます。

public init(url URL: URL)    
public var url: URL { get }

(追記)WWDCのセッションで言ってたこと

  • Siri および 音声入力機能と下回りは同じものを使用

Same speech technology as Siri and Dictation

  • 自動でユーザーに適応する
  • 基本的には要インターネット
    • 例外あり(some some languages and device models)

後で調べる

  • シミュレータでも実行できるのか?

*1:古い話かつ余談ですが、音声合成も以前色々と比較してみて結局 AVSpeechSynthesizer が良い、という結論に落ち着いたことがありました:http://qiita.com/shu223/items/223492e4f061032e652e:title:bookmark

2016-06-14

【watchOS 3】API Diffsから見る watchOS 3 の新機能 #WWDC2016

世間から「コレジャナイ」と見放されつつある印象のある Apple Watch / watchOS ですが、APIの面では改善して欲しかった点がちゃんと改善されて、個人的にはまた久々に触ってみたくなっています。


watch.png


以下、「watchOS 3.0 API Diffs」「What’s New in watchOS」等のプレリリースドキュメントを見て気になった新APIを列挙していきます。


WKCrownSequencer / WKCrownDelegate

ついに!やっと!デジタルクラウンの状態が取れるようになったようです。watchOS 2ではスクロール系のUI操作に使えるだけで、操作をフックしたり、値を取ったりできなかったですからね。。

WKCrownDelegate
WKCrownDelegate.crownDidBecomeIdle(_: WKCrownSequencer?)
Added WKCrownDelegate.crownDidRotate(_: WKCrownSequencer?, rotationalDelta: Double)
WKCrownSequencer
WKCrownSequencer.delegate
WKCrownSequencer.focus()
WKCrownSequencer.isIdle
WKCrownSequencer.resignFocus()
WKCrownSequencer.rotationsPerSecond

WKGestureRecognizer

Gesture Recognizer が watchOS でも使えるようになりました。

  • WKLongPressGestureRecognizer
  • WKPanGestureRecognizer
  • WKSwipeGestureRecognizer
  • WKTapGestureRecognizer.

いや、これ自体嬉しいのですが、そもそもの不満として、これまでユーザーがタップした座標を開発者が知るすべがなかったのですが、

WKGestureRecognizer.locationInObject() -> CGPoint

WKPanGestureRecognizer.translationInObject() -> CGPoint

が追加されて、タップした座標とかパンした移動先とかを取れるようになるってことがとにかく重要かと。watchOS 2 の頃はこれができないためにあきらめた機能が色々とあった気がします。今すぐに良い例が思い浮かばないのですが、たとえばタップした位置にCore Graphicsで何かを描画するとか。


バックグラウンドタスク

ついに来たという感じです。watchOS 2 のころ色々と辛かったのが、アプリが最大75秒でdeactivateされるという制約で、せっかく「ウェアラブル」、つまり「つけっぱなしにできる」のに、アプリは動かしっぱなしにはできない、という事態になってました。お客さんから「こういうことやりたい」と相談されたアイデアのうち、この制約のせいで実現できないものがなんと多かったことか。。


で、watchOS 3 では(いくつかのケースで)バックグラウンドで処理を実行できるようになりました。以下の種類があるそうです。

Background App Refresh

Use the `WKApplicationRefreshBackgroundTask` class to update your app’s state in the background. You often use a background app refresh task to drive other tasks. For example, you might use a background app refresh task to start an NSURLSession background transfer or to schedule a background snapshot refresh task.

Background Snapshot Refresh

Use the `WKSnapshotRefreshBackgroundTask` class to update your app’s user interface. You can push, pop, or present other interface controllers, and then update the content of the desired interface controller. The system automatically takes a snapshot of your user interface as soon as this task completes.

Background Watch Connectivity

When you receive background data from the paired iPhone, the system launches your app in the background, instantiates a `WKWatchConnectivityRefreshBackgroundTask` object, and passes the task object to your extension delegate’s handleBackgroundTasks: method.

Background URL Session

When a background transfer requires authorization, or when a background transfer completes (successfully or unsuccessfully), the system creates a background NSURLSession event, instantiates a `WKURLSessionRefreshBackgroundTask` object, and passes the task object to your extension delegate’s handleBackgroundTasks: method

To learn more about handling background tasks in general, see Background Refresh Tasks.


解説を端折ると語弊が生じる気がするので What's New の記述をそのまま引用しました。それぞれの解説だけざっと読むと結構色んなことができるんじゃ、という気がしてきますが、こういうのは実際に試してみないとわからないですね。


WatchConnectivityを用いた本体側(iOS)との通信は、watchOS 2では ウォッチ側はフォアグラウンドじゃないと通信できなかった のでこれは嬉しいアップデート。


Workoutのバックグラウンドサポート

Workoutもバックグランドで動作させられるようになったとのこと。対応方法は Info.plist の WKBackgroundModes キーに `workout-processing` を追加するだけ。ちなみに Xcode 8 の Capabilities からも On/Off できます。(NDA期間中につきスクショは自粛)


AVFoundation

watchOS でも AVFoudation が使えるように!


全部のクラスが移行されるわけではないのですが、オーディオファイル再生クラスである `AVAudioPlayerNode` とか、オーディオ処理諸々(各種エフェクトとか)を司る `AVAudioEngine` (詳しくはこちら)とか、音声合成の `AVSpeechSynthesizer` とか、色々入ってます。ちゃんと動くかは実際に試してみないとわかりませんが。*1


ジャイロスコープの値の取得

API的には2からあったんですが、`gyroAvailable` プロパティで必ず `false` が返ってきて実質的に非サポートでした。Apple Watch 2 とか新しいハードが出たら使えるようになるのかなと思ってましたが、wathcOS 3 で取得できるようになるようです。


ジェスチャー・姿勢認識をやろうと思ったら加速度センサだけじゃなくてジャイロの値も大抵必要になるのでこれも嬉しい更新。


あと、iOS 10 編 で書いた Significant Elevation関連と、CMPedometer関連のAPIが追加されています。


ちなみに最大100Hz周期で取れるそうです。

Device Motion, which fuses outputs from the accelerometer and gyroscope into orientation and motion dynamics updates. Apps can register to receive these updates at rates up to 100Hz.


Core Motion の歩数取得イベントはバックグランドでも取れるらしい。

On supported devices, apps can use CMPedometer APIs to register to receive live pedometer events while running in the foreground or the background.


WKInterfaceInlineMovie

動画再生インターフェース。watchOS 1 の頃、動画再生っぽいことをやるために、動画をアプリ側で動的にフレーム毎に分解して間引いてpngシーケンスアニメーションを生成(いわゆるパラパラ漫画)してウォッチ側で再生する、ということをやってましたが(たぶんみんなこうしてた)、今となっては普通に動画を再生できるようになったようです。


SceneKit / SpriteKit サポート

  • WKInterfaceSCNScene
  • WKInterfaceSKScene

詳細は後で読む。


HomeKit

HomeKitのカメラ・ドアベル(日本で言えば呼び鈴)アクセサリをサポートしたとか。それ用のサービス・キャラクタリスティックが追加されたらしい。


WKInterfaceHMCamera というインターフェースのクラスも追加されていて、これはHomeKitのIPカメラのデータにアクセスするためのインターフェースだそうです。*2


iOS 10 の新機能

量が多いので別記事としてまとめました。


【iOS 10】API Diffsから見る iOS 10 の新機能 #WWDC2016

タイムラインでは「つまんねー」「Apple終わってる」「ジョブズがいればこんなことには・・・」という落胆の声をたくさん見かけましたが、"iOS 10.0 API Diffs" や "What’s New in iOS" 等のプレリリースドキュメントを見ると今回も新しい機能が数多く追加されていて、個人的には非常にワクワクしております。


f:id:shu223:20160614084804j:image:w600


以下、気になったものを列挙していきます。


VoIP API / CallKit

BONXというVoIP通話するプロダクトを手伝っている関係で、IP通話がどんな感じでできるようになるのか(サーバーは自分で用意するのかとか)、非常に気になります。


"Speakerbox: Using CallKit to create a VoIP app" という公式サンプルが公開されているので、後でコードを見てみようと思います。


SiriKit / Intents / IntentsUI

ついにSiriのAPIが開発者に開放されました。What's New in iOS でも一番上に書かれているので、Appleとしても iOS 10 の目玉と考えているのではないでしょうか。


SiriKit というフレームワークがあるわけではなくて、Intents / Intents UI というフレームワークがその実体となるようです。以下の6つのドメインをサポートする、とのこと。

  • Audio or video calling
  • Messaging
  • Sending or receiving payments
  • Searching photos
  • Booking a ride
  • Managing workouts

これだけ見ても何がどんな感じでどこまでできるのか、全然ピンと来ないので、後ほど以下の公式サンプルを試してみます。

  • IntentHandling: Using the Intents framework to handle custom Siri request
  • UnicornChat: Extending Your Apps with SiriKit

音声認識API / Speech

SiriKitとは別に、音声認識のAPIが追加されました。リアルタイム音声にも、録音済み音声にも使えるようです。

let recognizer = SFSpeechRecognizer()
let request = SFSpeechURLRecognitionRequest(url: audioFileURL)
recognizer?.recognitionTask(with: request, resultHandler: { (result, error) in
     print (result?.bestTranscription.formattedString)
})

"SpeakToMe: Using Speech Recognition with AVAudioEngine" という公式サンプルが公開されているので、すぐに試せます。SFSpeechRecognizerの初期化時に Locale を渡せるようになってますが、日本語もいけるのでしょうか(あとでやってみます)

private let speechRecognizer = SFSpeechRecognizer(locale: Locale(localeIdentifier: "en-US"))!

(2016.6.15追記)実際に触ってみて記事を書きました!


AVFoundation

AVCapturePhotoOutput

AVFoudationで写真を撮る際に使用していた AVCaptureStillImageOutput が deprecated になり、iOS 10 では AVCapturePhotoOutput という新クラスを使うようです。すべての写真ワークフローにunifiedなパイプラインを提供する、とのことですがカメラに詳しいわけでもないので使ってみないとわからないのですが、AddedなAPIを見ていると、Live Photo 撮影機能が開発者に開放されてたりと、色々とできることが増えてそうです。

AVCapturePhotoCaptureDelegate.capture(_: AVCapturePhotoOutput, didFinishProcessingLivePhotoToMovieFileAt: URL, duration: CMTime, photoDisplay: CMTime, resolvedSettings: AVCaptureResolvedPhotoSettings, error: NSError?)
AVCapturePhotoCaptureDelegate.capture(_: AVCapturePhotoOutput, didFinishRecordingLivePhotoMovieForEventualFileAt: URL, resolvedSettings: AVCaptureResolvedPhotoSettings)
AVCapturePhotoOutput.isLivePhotoAutoTrimmingEnabled
AVCapturePhotoOutput.isLivePhotoCaptureEnabled
AVCapturePhotoOutput.isLivePhotoCaptureSupported
AVCapturePhotoOutput.isLivePhotoCaptureSuspended
AVCapturePhotoSettings.livePhotoMovieFileURL
AVCapturePhotoSettings.livePhotoMovieMetadata
AVCaptureResolvedPhotoSettings.livePhotoMovieDimensions

AVPlayerLooper

メディア(オーディオ・ビデオのことだと思われる)の特定箇所を簡単にループさせられるクラス、とのこと。


Messages

長々とキーノートで紹介されたMessagesアプリの新機能。「使ってないし。。」という声を多くタイムラインで見かけました。が、Messagesというフレームワークが追加され、開発者ができることも何やら増えたようです。


What's New によると、App ExtensionをつくってMessagesアプリと自分のアプリを連携させられるようです。つくれるApp Extensionは以下の2種類:

  • ステッカーパック(ユーザーがMessagesで使うことができる)
  • Messages内で使えるカスタムUI(iMessage appと呼ぶ)

"Ice Cream Builder: A simple Messages app extension" という公式サンプルが公開されています。あとリファレンスもパッと見ですがプログラミングガイド的にわかりやすく書かれてそうでした。


Core Image

キーノートでのPhotosの話の中で、顔だけじゃなくて「乗馬」みたいなシーンも認識するようになった、という話があって、CIDetector, CIFeatureにもそのへん追加されてるのかなと思ったら API Diffs には残念ながらそういう変更が見当たりませんでした


フィルタは以下の5つが追加されたとのこと。アップサンプリングフィルタはちょっと試してみたい。

  • CINinePartTiled
  • CINinePartStretched
  • CIHueSaturationValueGradient
  • CIEdgePreserveUpsampleFilter
  • CIClamp

僕は一眼レフユーザではないので使わなそうですが、RAW画像を扱えるようになったとのこと。

RAW image file support is now available on iOS devices that use the A8 or A9 CPU. Core Image can decode RAW images produced by several third-party cameras as well as images produced by the iSight camera of supported iOS devices (to learn more, see AVFoundation). To process RAW images, use filterWithImageData:options: or filterWithImageURL:options: to create a CIFilter object, adjust RAW processing options with the keys listed in RAW Image Options, and read the processed image from the filter’s outputImage property.


あと、`imageWithExtent:processorDescription:argumentDigest:inputFormat:outputFormat:options:roiCallback:processor:` というメソッドが何か重要そうなのですが、理解に自信がないのでWWDCのセッション見てからコメントします。

You can now insert custom processing into a Core Image filter graph by using the imageWithExtent:processorDescription:argumentDigest:inputFormat:outputFormat:options:roiCallback:processor: method. This method adds a callback block that Core Image invokes in between filters when processing an image for display or output; in the block, you can access the pixel buffers or Metal textures containing the current state of the processed image and apply your own image processing algorithms.


MapKit

Addedは以下の3つだけ。

MKAnnotationView.init(coder: NSCoder)
NSUserActivity.mapItem
MKLaunchOptionsDirectionsModeDefault

キーノートではMapアプリの新機能の話があったのに、これだけ?と一瞬思いましたが、NSUserActivity に追加された `mapItem` というプロパティが重要っぽいです。What's New の Proactive Suggestions の項に以下のように解説されています。

In iOS 10, the NSUserActivity object includes the mapItem property, which lets you provide location information that can be used in other contexts. For example, if your app displays hotel reviews, you can use the mapItem property to hold the location of the hotel the user is viewing so that when the user switches to a travel planning app, that hotel’s location is automatically available. And if you support app search, you can use the new text-based address component properties in CSSearchableItemAttributeSet, such as thoroughfare and postalCode, to fully specify locations to which the user may want to go. Note that when you use the mapItem property, the system automatically populates the contentAttributeSet property, too.

キーノートで話してた機能と関連することだとは思いますが、正直これも自分で試してみないとよくわからない。。


Core Bluetooth

ある程度枯れてるのでハード的にBluetooth 5.0がサポートされるとかがない限りはそんなに変更ないかなと思ってましたが、やはりそんなに大きな変更はありませんでした。


主な変更点としては、

CBCentralManager.state
CBPeripheralManager.state

がなくなって、代わりにこれらの状態を管理するクラス CBManager というのが追加された、という点です。Bluetoothの状態をこのクラスから取るようになった、というだけかと。

CBManager.state
CBManagerState [enum]
CBManagerState.poweredOff
CBManagerState.poweredOn
CBManagerState.resetting
CBManagerState.unauthorized
CBManagerState.unknown
CBManagerState.unsupported

また、CBCentralManager と CBPeripheralManager に引数なしの初期化メソッドが追加されました。

CBCentralManager.init()
CBPeripheralManager.init()

あと、キャラクタリスティックのValueの有効範囲を指定する Descriptor の UUID を示す定数が追加されています。

CBUUIDCharacteristicValidRangeString

(Valid Range ディスクリプタのドキュメント)


Core Motion

Significant Elevation まわりのAPIが追加されていて、(Core Locationの)Significant Location のようにバックグラウンドでバッテリーを節約しつつ大まかな高度の変化を取れるような感じになったのかなと。

CMAltimeter.isSignificantElevationAvailable() -> Bool [class]
CMAltimeter.querySignificantElevationChange(from: Date, to: Date, withHandler: CoreMotion.CMSignificantElevationSampleHandler)
CMAltimeter.startSignificantElevationUpdates(handler: CoreMotion.CMSignificantElevationSampleHandler)
CMAltimeter.stopSignificantElevationUpdates()
CMSignificantElevationSample
CMSignificantElevationSample.elevationAscended
CMSignificantElevationSample.elevationDescended
CMSignificantElevationSample.endDate
CMSignificantElevationSample.startDate
CMSignificantElevationSampleHandler

新App Extension

個人的にはExtensionは全然つくってないのですが、「開発者ができること」としては重要なので、何が追加されて何ができるようになったのか、はおさえておきたいと思っています。


iOS 10 では以下の Extension Points が追加になったようです。

  • Call Directory
  • Intents
  • Intents UI
  • Messages
  • Notification Content
  • Notification Service
  • Sticker Pack

あと、サードパーティ製のキーボードのExtensionが強化されたとのこと。


あとで見る

Proactive Suggestions

いろいろ賢くなったよ、という話っぽいが、What's New で長めに書かれていて、関連フレームワーク・クラスも多いので後で読む。


UserNotifications / UserNotificationsUI / VideoSubscriberAccount

新フレームワークだけど、名前的には必要になったときに見ればいいかな、と思うのでまた後ほど。


その他、あまり変更がなかったフレームワーク

ここに書いた以外にもたくさんありますが、API Diffsでページを開いて見たものの中で、追加APIがなかった、もしくは「ほとんど」なかったものもまとめておきます。


以下はAddedなAPIなし。

  • AudioUnit
  • CoreLocation
  • CoreAudioKit
  • ExternalAccessory
  • OpenAL
  • MultipeerConnectivity
  • HealthKitUI

以下はほとんどAddedなし、もしくは気になる変更がなかった。

  • AVKit
  • CoreAudio
  • OpenGLES

watchOS 3 の新機能

量が多いので、別記事としてまとめました。個人的には改善して欲しかったところがちゃんと改善されてて好印象です。


*1:APIとしては存在しても実際はサポートされてない、ということもたまにあります。

*2:そもそも HomeKit 対応のネットワークカメラがまだ日本では販売されてないわけですが。。(されてたらすみません)

2016-06-01

BLEを利用した汎用ロボットコアユニット「bCore」を触ってみる

バガボンド・ワークスさんが制作・販売されている「bCore」というハックしがいのある楽しいデバイスを紹介させていただきます。


f:id:shu223:20160601000549j:image:w600


サイトには「汎用多目的超小型リモコンロボットコアユニット」とあります。少し噛み砕くと、スマホからBLEでモーターとサーボをリモコン操作するユニットです。好きなプラモデルやおもちゃがスマホから操作できるようになります。


たとえばミニ四駆1分でラジコンに改造したり、



もうちょっとメカに凝るとこんなロボットもつくれたりするようです。



現在スイッチサイエンスにて購入可能です。


以下は公式サイトの解説です。

技適対応のBLEモジュール(BLE113 )と周辺回路を組み込んだ超小型基板にファームウェアを焼きこんだ bCore と、iOS上で動くアプリケーションソフト bDriver を用いることで、誰もが簡単にiPhoneなどからコントロールできる超小型ロボットを製作できることを目的としています。


ファームは既に焼かれているので、ユーザーはラジコンサーボとモーターと電池をbCoreに繋ぎ、スチロール素材や木材、3Dプリンタなど、好みの方法でロボットのガワを制作するだけで自由に自分のロボットを開発できます。

技適、FCC、CE対応のBLEモジュールをしようしているため、日本、アメリカ、EU各国での使用が可能です。


キットの構成

某青い本を書いた縁で、バガボンドワークスさんよりbCore と、サーボやモーター等の互換パーツ一式をいただきました。


f:id:shu223:20160531153403j:image:w600


上記の各パーツもbCore同様に販売ページにて購入できます。キットとしての販売も予定されているそうです。


bCore をとりあえず試してみる

以下、まずはミニ四駆等の外部パーツを必要としない最小構成でbCoreを体験する手順を紹介します。すべてハンダ付け不要です。


ステップ1: iOSアプリからbCoreに接続してみる

まずは最初の一歩として、「bCoreにバッテリーボックスを繋げてアプリと接続する」ところまでをやってみます。


電源を繋げる

bCore の裏面を見ると、"Bat" と書いてあるところがあります。



該当するコネクタにバッテリーボックスを繋げます。一方向でしか挿せないので、極性を間違える心配もありません*1


f:id:shu223:20160531162621j:image:w500


これだけでもうBLEのペリフェラルデバイスとしての動作は開始しています。


(電源についての詳細 from 公式ページ)

bCoreの電源接続コネクタは、1.25mmピッチの2ピンコネクタ(Molex Pico Blade)で、入力可能な最大電圧は5.5Vとなっています。

アルカリ乾電池3本直列(4.5V)、LiPo電池1セル直列(3.6V)、LiFe電池1セル直列(3.3V)、カメラ用リチウム電池1本直列(3.0V)などが利用できます。ラジコンサーボやモーター駆動をするため、ある程度電流放出能力のある電池が必要になります。そのためボタン電池は使うことはできません。

なお、ラジコンサーボやモーターを繋がない場合は2.3V程度の電源での使用が可能です。


bDriver からスキャン・接続

bDriver というiOSアプリが公開されているので、ダウンロードします。


起動するとこんな感じの画面なので、


f:id:shu223:20160601114625j:image


"Start Scan" ボタンをタップしてスキャン開始します。


上述した通り bCore は電源が供給された時点でアドバタイズを開始するので、すぐに発見されリストに表示されます。


f:id:shu223:20160601114712j:image:w426


発見した bCore を選択すると接続が確立され、次のようなコントロール画面に遷移します。


f:id:shu223:20160601114741j:image:w426


たったこれだけです。要は、バッテリーボックスをコネクタに挿し、アプリをダウンロードして繋げるだけです。


ステップ2: サーボを動かしてみる

とりあえず動かしてみることに成功したところで、「ロボットコアユニット」らしく、キットに同梱されていたサーボをアプリから動かしてみます。


bCore にサーボを接続する

bCore 裏面に Srv1〜4 と書いてあるので、


f:id:shu223:20160531162222j:image:w400


該当するコネクタにサーボを接続します。


f:id:shu223:20160531171742j:image:w500


で、再び bDriver で接続して Srv1〜4 とあるスライダーを操作すると・・・


f:id:shu223:20160601115117g:image


サーボをスマホからリモコン操作できました!


ステップ3: モーターを動かす&LEDを光らせる

サーボと同じ(裏面で確認して該当するコネクタに挿すだけ)なので、全部繋げた写真だけ載せときます!


f:id:shu223:20160601000549j:image:w600


ミニ四駆をbCoreでラジコン化する

ここからが bCore の楽しいところです。サーボやモーターを動力として、色んなおもちゃやプラモデルをスマホから操作するように改造できるわけです。


バガボンドワークスさんのサイトにはいろんな作例が掲載されてまして、たとえばこのミニ四駆をラジコン化するレシピを見ると、

改造するのにプログラミンや電子回路の知識は不要です。

本当に1分でできます。

とあります。


必要なもののリストも「ハンダゴテ」「テープ」といったレベルで載っていて、手順も写真付きで非常に丁寧に書かれていて、本当に電気回路や電子工作の知識がなくてもこの手順通りにやればできそうです。


僕はいま諸事情で出先(海外)でこの記事を書いているのですぐに試せないのですが、ミニ四駆・ハンダゴテ・半田を既にAmazonで注文して家の方に送ってあるので、帰宅次第試してみたい所存です。


自作アプリに組み込む

GATTが公開されているので、Core Bluetooth を利用してアプリを自由に作成することも可能です。


このあたり、ソフトウェアエンジニアにとってはIRKitと同様のロマンがありますね。


下記ページからiOS向けのサンプルコードがダウンロードできます。


また同ページでは参考書籍として下記がオススメされています。


iOS×BLE Core Bluetoothプログラミング
堤 修一 松村 礼央
ソシム
売り上げランキング: 21,212


なお、iOSのBLEアプリ開発を真面目に学びたい人は、

iOS×BLE Core Bluetoothプログラミング 堤 修一 (著), 松村 礼央 (著)

断然おすすめです。bCoreの開発にもこの本を利用させていただきました。


・・・いや、結果的にステマっぽいですが、僕がバガボンドワークスさんと連絡を取り合い始めるずっと前にこれは書かれてたんですよ。。ほんとに。。

(エゴサーチしててたまたま発見しました)


ファームウェアを書き換える

ファームウェア書き込み用の端子も用意されているので、GATTを自分流に変えたいとか、何かしら特殊な処理をbCore側でしたい場合に、自分で書き換えることもできます。


BLE113なのでBGScriptやファーム書き込み等の開発環境をMacに構築したい場合には下記記事も参考になるかもしれません。


おわりに

大変ワクワクする、大人も子供も楽しめそうなプロダクトではないでしょうか。早く家に帰って僕のアバンテJr.をラジコン化したいです。


*1:間違えられませんが、仮に間違えても保護回路が入っているので壊れないそうです

2016-05-30

ベルリンとロンドンのiOSカンファレンスで登壇した話 #UIKonf #iOSCon

先週、ベルリンで開催された UIKonf と、ロンドンで開催された iOSCon の両カンファレンスにスピーカーとして参加してきました。


f:id:shu223:20160529205622j:image:w600

UIKonfの会場(登壇してるのはDaniel氏)


まだロンドンにいまして、興奮冷めやらぬうちに記事に書いておきたいと思います。


UIKonf、iOSCon とは?

どちらもiOSの開発者向けカンファレンスです。


同時期の開催で、同じEU内でのカンファレンスではありますが、それぞれ全く関連のない母体によって運営されています。*1


f:id:shu223:20160530065207j:image:w600


チケット代はそれぞれ、

  • UIKonf:€450+VAT19%(約66,000円
  • iOSCon:£650(約101,500円)+VAT(いくらか忘れた)

と、日本の感覚からいくとかなり高額です。


UIKonfの方は著名ブログ "RAYWENDERLICH" の "Top 10 iOS Conferences" でも紹介されていて、チケットも早々にソールドアウトとなった人気カンファレンスです。


登壇の経緯

UIKonfは登壇者は計18人、iOSConは計20人です。それぞれカンファレンス側から招待された著名スピーカー陣が何人かいますが、僕は招待されたわけではなく、自分で応募して、投票・審査の上で採択されたCFP枠です。


なお、CFP応募・採択までの経緯の詳細は、下記記事にまとめてあります。


準備

僕はそもそも英語にずっと苦手意識があり、WWDCでSFに行ってもセッションを聞きに行かずにネットで(日本にいても見れる)PDFを見てたり、スカイプ面接はトラウマになってたりするほどでした。


ただ今回はどちらのカンファレンスもお客さんは高額のチケット代を払って話を聞きにくるわけで、英語はしっかりやろう、ということで英語の短期指導やってるところをググって探したりしていました。


そんな中で知り合いの方から紹介していただいたのが、ジョセフ・テイム先生。TEDxTokyoとかのコーチもされている方で、技術もわかる、そして信頼している人からの推薦、ということでパーソナルコーチをお願いしました。 *2


f:id:shu223:20160530040355j:image:w540

(レッスン中の様子@先生の自宅)


もともとは僕の方でスライドとTranscript(話す内容の原稿)をつくりあげて、先生の前で練習して変なところを修正してもらう、というつもりだったのですが、実際にはなかなかスライドもTranscriptも完成しなくて、下記のサイクルをぐるぐる回しながらで進んで行った感じです。

  1. スライドの改善作業
  2. 先生のレッスンで新しいスライドにTranscriptをつけていく
  3. 別の誰かに聞いてもらう(改善点が浮き彫りになる)→ 1に戻る


「誰かに聞いてもらう」という話でいうと、知り合いのiOSエンジニアが集まるもくもく会がちょうど出発前日に渋谷dots.さんであり、そこで突発的に発表練習をさせていただく機会もありました。


f:id:shu223:20160530075209j:image:w600

(Photo by Himiさん)


try! Swiftを主催されたRealmの岸川さんにはそもそも一度フィードバックをもらいたいと思っていたし、僕より英語が堪能な方々ばかりだったり、dots.さんは講演の場として臨場感ありまくりだったりで、大変ありがたかったです。


登壇@UIKonf

5/23、いよいよ初の登壇。冒頭の写真の通り、UIKonfは体育館みたいな吹き抜けのでかい会場で、ドイツっぽい古い感じの造りでものすごく素敵な場所でした。


ライブストリーミングがあり、恥を晒すことになるかもしれないのでシェアするか迷いましたが、こんな機会も二度とないかもしれない、と思い発表直前にTwitterでシェア。

おかげで日本からも結構多くの方が観ていてくれたみたいです。


緊張は意外とそんなにしませんでした。Maxの緊張を100とすると10か20ぐらい。


f:id:shu223:20160530040218j:image:w600

(UIKonfのステージより。Photo by 他の登壇者の方)


f:id:shu223:20160530040652j:image:w500

(舞台袖からスタッフが撮ってくれた貴重な一枚)


結果的には大成功で、途中で笑いも起きたし、終わった後いろんな人から「まじで良かったよ!」と声をかけてもらいました。他の登壇者の方々からもお褒めの言葉をたくさんいただきました。*3


下記に動画が公開されています。



とはいえ実は質疑応答は大失敗で、最初の質問への回答はイケてなかったし、2つ目の質問はまったく聞き取れず、テンパってしまいました。終了直後はそれで凹んでたりもしてたのですが、今思えば謝りつつももっと堂々としてればよかったなと。そういうことも経験したからこそ学べたことなので、とにかく良かったです。


f:id:shu223:20160530055219j:image:w540

(スピーカーへのプレゼントで「アーキテクチャ」のレゴ(ベルリン仕様)をいただきました)


登壇@iOSCon

出番は5/26、UIKonfの最終日には出ずにロンドンに移動して、その翌日にはもう発表でした。


基本的には同じ内容なのですが、UIKonfは持ち時間30分、こちらは45分なので、少々スライドを付け足し、デモも用意して臨みました。


(こちらの会場は打って変わってオフィス的な雰囲気)


こちらは・・・質疑応答こそUIKonfのときよりまともにできたものの、講演全体としてはUIKonfの方が出来が良かったかもしれない、と思っています。


話し方、内容、いろいろ具体的な反省点はあるのですが、どうダメだったかを一言でいうと、オーディエンスとの一体感を醸成できなかったという点につきます。


質問はそこそこあったので伝わっていたとは思いますが、UIKonfのときのような、「めっちゃよかったよー」みたいな興奮を伴う反応がなかった。発表中も終始淡々としたムードだったので、冒頭からずっとお客さんの関心というかテンションを掴み損なっていた気がします。


良かった点と、反省点

良かった点

今回の発表内容を構築するにあたって一番悩ましかったのは、とっつきやすさと深さのバランスです。


Core Bluetooth を使ったことがあるiOSエンジニアは世界にいくらでもいると思いますが、「ちゃんとエンドユーザーの手に渡った」ハードウェアプロダクトに「がっつり手を動かす立場で」「複数案件」関わったことがあるiOSエンジニアとなると世界でもまだそれほど多くはないと思っていて、そここそが僕のプロポーザルが採用されたポイントなわけで、そういう「僕ならではのバックグラウンド」を活かした話をしないと、わざわざ海外から呼んでくれた意味がありません。


とはいえBLE/Core BluetoothなんてiOSエンジニア全体から取ってみればやはりニッチな話。いきなり「BLEの経験がある人だけがわかるディープな話」をしてしまうと多くの人の脳内で「この話は自分には関係ないな」枠に分類されてしまいます。


というわけでこだわったポイントは、

  • BLEがわからない、Core Bluetooth に興味がなくても楽しめる
  • たくさんの実案件を経験してきたからこそ話せる

という(一見)相反する2つの要件を満たすこと。


そのために構成やら図解やらデモ動画やら何度も何度も改善を繰り返して今の形になりました。それなりのアプリを1つ作れるぐらいにはスライド作成に時間をかけたと思います。



で、このこだわりポイントはUIKonf(@ベルリン)ではめちゃくちゃ狙い通りにヒットしました。講演がシングルトラック(同時に複数の講演が行われることがない)なので、もともとBLE/Core Bluetoothに興味がなかった人も巻き込んで、多くの人に "really great" と言ってもらえました。


反省点

一方iOSCon(ロンドン)では講演がマルチトラックで、しかもサブ会場なので、そもそも興味のない人は来なかったんじゃないかと思います。


f:id:shu223:20160530041220j:image:w300

(iOSConスケジュールより抜粋)


で、お客さんは多くはなかったし、そんな中で僕は柔軟にアドリブでお客さんの気持ちを掴んだりすることもできず、前述の通り淡々とした雰囲気のまま進めてしまいました。



ひとつやればよかったなと思うのは、もっと非経験者も興味を持てるタイトル・概要にすること。タイトルが "Practical Core Bluetooth" だと、Core Bluetoothに興味がない人がわざわざ選ぶことはあまりないんじゃないかと思います。プロポーザル提出時点ではこの辺のことがまだ見えてなかった。


あと、何度も同じ話をしてると自分自身のテンションが乗らなくなってくる、というのもあるので、そういうページはどんどん削除して、自分も話していて楽しいものに差し替えていく、とかも必要。


try! Swift では多くの登壇者がポケモンを題材にしていてその度に笑いが起きていたのは記憶に新しいところですが、今回 iOSCon でも @ayanonagon さんの "Boundaries In Practice" の話を聞く機会があり、そこにはポケモンの影はなく、掴みの話もアップデートされていました。その国の文化・カンファレンスのカラー・他の登壇者の発表といった文脈を汲んで、発表内容に少しでもアレンジを加えて最適化するのは大事だなと。


その他のアクティビティ

UIKonfはカンファレンスとして素晴らしく、参加者みんなの一体感があったのですが、その理由のひとつとして、開催日前日の「Social Event」が非常に良く機能していたと思います。


「Social Event」は、自転車ツアーやビール工房ツアー、ボートトリップツアー等から選べて、僕は(英語コミュニケーションが未だに怖いし発表の前日なのでスキップしようかと迷いながらも前々日ぐらいに)自転車ツアーに申し込みました。


f:id:shu223:20160529201310g:image


結果的にめちゃめちゃ参加して良かったです。


まず、自転車ツアーなので、そんなに周りの人とずっとしゃべってなくても良くて、たまーに横に並んだときにちょっとしゃべることがある、ぐらいの緩いコミュニケーションが僕にはちょうど良かった。


で、それぐらいでも効果は絶大で、翌日の本編では数百人の参加者が訪れるわけですが、そんな中で前日に数時間一緒にチャリこいだ人と会うと、妙な親近感がありました(しゃべったのは少しだけだとしても)。


あと、開催前夜にはキックオフパーティー、初日の夜にはスピーカーディナー、2日目の夜にはアフターパーティ*4と、毎晩何かしらの懇親会がありました。


f:id:shu223:20160529201311j:image:w600

(スピーカーディナー。ネイティブ && 超饒舌な人達に囲まれて全く話についていけず。。)


iOSConも開催前夜にスピーカーディナー*5、初日の夜にパーティがありました。


コスト

旅費・滞在費はカンファレンス側が出してくれました。なので、日本 ↔ ベルリン、ベルリン ↔ ロンドンの飛行機代、(会期中の)ベルリンとロンドンでのホテル代はかかっていません。もちろんカンファレンスのチケット代もかかっていません。


ただ、僕はフリーランスなのですが、前述の通り5月はほとんどスライド作成と練習に費やしました。結局仕事をしたのは2人日。僕は定期収入的な契約は一切してないので、5月の収入は2日分だけです。


得られたもの

そもそもカンファレンスに応募したのは、フリーランスとしての活動の場を海外に広げるための「入り口」を増やすための活動の一環でした。

ベルリンだけでなくシリコンバレー等に行っても毎回感じることですが、無力感が半端ないです。仕事をやってみたりハッカソンに出てみたりして、技術的に通用しないということはないと思ってますが、誰も僕のことを知らないし(知名度以前に知り合いがいないという意味で)、そういう僕がベルリンに行ったところで、現地の他のスタートアップの方から「会いたい」とか言われることはありません。


(中略)


僕がニュースとかで海外のそういう系の魅力的なプロダクトを見るタイミングではもう遅くて(メディアに出て話題になっているということはある程度開発が進んでいるか完了しているケースが多い)ファウンダーが資金調達して本格的に開発をしようとするタイミングであちらから見つけてもらえるようにならないといけない。


で、LinkedIn や AngelList で人を探す場合は大抵「住んでいる場所」でフィルタされてしまうので、英語ブログという「海外スタートアップに自分を見つけてもらうためのチャネル」を用意する必要があるなと。


僕のGitHubアカウントは今でも多少そういう感じの機能をしてくれてますが、(後略)

(以前書いた記事より)


で、具体的に考えていた「海外カンファレンスに登壇するメリット」は以下の通りです。

  • ログに残る
    • 英語でググッて見つかる「入り口」になる
  • 著名な常連スピーカーの方々に自分の話が届く
    • 別のカンファレンスにも呼ばれるかもしれない
  • 海外から仕事がくるきっかけになるかもしれない
  • 海外に行けるのが嬉しい/楽しい
    • 旅行もいいけど個人的には本業と絡んだほうが楽しい
    • 航空券代・ホテル代は出る(カンファレンスによるかもしれない)
  • 英語を「必死で」練習する機会になる
    • 30分ぶんの、自分の得意な分野について話す英語表現の「引き出し」 をつくる機会にもなる
  • 経歴に書ける

このうち、ログに残る、海外に行ける、英語表現の引き出し、あたりは参加した時点で自動的に達成されたわけですが、他の著名スピーカーが別のカンファレンスにも推薦してくれそうかというと、それにはまだまだかなと。


また「海外から仕事がくるきっかけになるかもしれない」という点については、今のところその気配はありませんが、仕事の話というのはいつでも忘れた頃に思わぬところから来るものなので、いつか今回の発表に起因する話が来るかもしれない、とは楽観的に思っています。ドイツから仕事が来るようになったときもそうでした)


経歴に書ける、というのは忘れてたので後でレジュメやLinkedInプロフィールに追記しておこうと思います。


あと、上記の目論見には書いてませんでしたが、何よりも良かったのは、「海外のカンファレンスに応募し、登壇する」という選択肢が自分の中で増えたことです。


未体験のものはいつでも何だって恐ろしくて、振り返ってみれば日本の勉強会に初めて参加したときは、参加すること自体が怖かったし、周りの人に話しかけることもできず逃げるように帰ったわけで、自分が発表するなんて考えられないことでした。こうやってひとつひとつ恐怖心を克服してコツコツ前進してきたので、(クオリティはまだまだですが)「できること」がまた増えて前進できたことが嬉しいなと。


評判

Twitterより


まとめ

書きたいことをずいぶん端折ったのですがそれでも長くなってしまいました。思い出に残る体験としても、キャリアの面からも、スキルアップの面からも、すごく良い経験ができたと思っています。


素晴らしいカンファレンスを主催されたオーガナイザーの方々、コーチしてくれた先生、未熟なプレゼン練習につきあってくれた方々、皆様に感謝いたします。



ちなみに来月、もうひとつ海外カンファレンスでの登壇が決まりました。

こちらもマルチトラック型、しかも(最近もらったスケジュールによると)とある百戦錬磨のスピーカーの裏・・・がんばります!


*1:僕のプロポーザルが両方で受理されたのもたまたまです。実際、両者の審査フローはまったく違っていました。

*2:ちなみに先生、東京マラソンに毎年仮装して出ていて、すごく有名な方です: http://josephta.me/

*3:気の利いた返しができなかったことが悔やまれますが。。Thank you しか言えなかった。

*4:会場が遠かったのとまだロンドン講演が控えてたので参加せず

*5:所用で参加できず

2016-04-20

海外のカンファレンスに登壇する - 応募編 #potatotips

本日、potatotips #28(iOS/Androidの開発Tips共有会)にて標題の発表をさせていただきました。



iOSのカンファレンスに自分で応募して、採択されるまでの話です。


以下、スライド内容の抜粋。


はじめに

iOSのカンファレンス、UIKonf 2016(ベルリン), iOSCon 2016(ロンドン) に登壇させていただくことになりました!

  • どちらも国内外からスピーカーが来る国際カンファレンス
  • チケット代
    • UIKonf:€450+VAT19%(約66,000円)
    • iOSCon:£650(約101,500円)
  • どちらも登壇者は計18人

f:id:shu223:20160420232101j:image:w600


・・・と言っても

  • 招待されたわけではない
  • 自分で応募して、投票・審査の上で採択された

アジェンダ

1. なぜ応募したか

2. CFPをどう見つけたか

3. Proposalをどう書いたか

4. 審査過程はどうだったか

1. なぜ応募したか?

国際カンファレンスに登壇する(僕にとっての)メリット

  • ログに残る
    • 英語でググッて見つかる「入り口」になる
  • 著名な常連スピーカーの方々に自分の話が届く
    • 海外から仕事がくるきっかけになるかもしれない
    • 別のカンファレンスにも呼ばれるかもしれない
  • 海外に行けるのが嬉しい/楽しい
    • 旅行もいいけど個人的には本業と絡んだほうが楽しい
    • 航空券代・ホテル代は出る(カンファレンスによるかもしれない)
  • 英語を「必死で」練習する機会になる
    • 30分ぶんの、自分の得意な分野について話す英語表現の「引き出し」 をつくる機会にもなる
  • 経歴に書ける

メリットだらけ


2. CFPをどう見つけたか

CFPとは
  • Call for Proposal (Papers / Participation)
  • 登壇者を募集してます、の意味
カンファレンスの探し方
CFPを見つける
  • カンファレンス開催予定はわかっても、CFPは見つけづらい
  • 招待講演だけ(CFPなし)のカンファレンスも多い

探し方

  • ググる
    • "ios conference 2016 "cfp""
    • "ios conference 2016 "call for""
  • Calls for participation | Lanyrd
  • カンファレンス常連の方々のTwitterアカウントをフォローしておく
    • 中の人とつながってたり、中の人だったりするので、たまにCFPのツイートが流れてくる


3. Proposalをどう書いたか

当初案

「いつもの勉強会」と同じように話したいネタを棚卸し

  • iOS×機械学習
  • OpenCV 3
  • iOS×BLE
過去のカンファレンスの登壇内容を見てみた
  • [altconf.com/schedule/:title=AltConf 2015 Schedule]
    • タイトルと概要が一覧で見れて参考にしやすい
  • WWDC
    • iOSエンジニアには馴染み深い
  • その他諸々
  • (※応募当時は try! Swift 開催前)
歓迎されるっぽいTALK
  • スピーカーがその分野で十分な経験がある
    • 「このライブラリをちょっと触ってみました」的な話はさすが にない(そのライブラリの作者で、設計思想等も含めて話せる場合は別)
    • 「その人ならでは」の話(バックグラウンドが活きる話)
  • 体系立てて話せる
    • ↔ 雑多な、箇条書き的な話

これと自分のネタを照らしあわせてみると・・・

  • iOS×機械学習
  • OpenCV 3

→ 専門家でもなければ、 がっつりやった経験もない。発表のプレッシャードリブンで 「これから」勉強したいだけ

  • iOS×BLE

→ (BLE自体にめちゃめちゃ詳しいわけじゃないが、)iOSエンジニアとしてハードウェアプロジェクトに関わった経験数としては多い方だと思う。書籍も書いたので多少は体系立てて話せそう。

完成品

f:id:shu223:20160420203729p:image:w500


4. 審査過程はどうだったか

UIKonf
  • 匿名フィードバックがあり、Proposalをアップデートできる
  • 匿名投票(GitHubアカウントでログイン/8つ選択)
  • 運営によってさらに絞り込まれる
  • 採択率 8 / 60ぐらい?(スピーカー全18人中8人がCFP枠?)
iOSCon
  • 運営による審査
  • 応募数不明
  • 登壇者計18人、うち招待講演は6人(スケジュールが単独で組まれている)

まとめ

  • なぜ応募したか
    • フリーランスとしての海外進出の足がかり
    • 英語の練習
    • 海外に行きたい
  • CFPをどう見つけたか
    • ググる/常連スピーカーをウォッチする
  • Proposalをどう書いたか
    • 過去のカンファレンスを参考にしつつ持ちネタを絞り込んだ
  • 審査過程はどうだったか
    • カンファレンスによって色々(投票/運営による審査)

おわりに

準備と練習をしっかりして臨みます!



以上、スライドより。


主催/会場提供のエウレカさん(広くて天井高くてものすごい良かった)、登壇者のみなさま、参加者のみなさま、ありがとうございました!


2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
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 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 |