Quantcast
Channel: その後のその後
Viewing all 317 articles
Browse latest View live

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

$
0
0

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 }

後で調べる

  • Siri および SiriKit の下回りは Speech フレームワークなのか?
  • シミュレータでも実行できるのか?

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


[フリーランス][iOS][登壇]「プログラマとして食べていく」という話を福井県の学生さん達にしてきました

$
0
0

一昨日、福井県の「ふくい産業支援センター」さんが主催されたセミナーで、標題の講演をさせていただきました。資料はこちら。



参加者約70名のうち、75%は18歳以上の大学生・専門学校生、15%が高校生・高専生、10%が小中学校。これまでエンジニアの中で話をする機会は多々ありましたが、学生さんばかりの中で話すのは初めてでした。


内容

内容としては、「プログラミングでこんな感じでメシを食ってる人がいる」という一つの参考例として自分の働き方を紹介しつつ、プログラマとしてとりあえずやっていけるようになるまでの話と、フリーになってからおもしろい仕事を得るためにどんなことを考えながら働いているか、の3部構成でした。


50分と長尺の講演だったので、最後にFAQをくっつけて時間調整できるようにしておいたのですが、6つぐらい用意しておいたうち2つぐらいしかしゃべれず。話したうちのひとつは「お金の話」だったのですがネットに上げるとちょっと生々しいかと思いアップした資料からはカットしました。


「いっぱしのプログラマになるまで」編はこちらのスライドを使い、


「フリーランスになってから」編はこちらのスライドを使いました。


この話はこちらの記事にQ&A含め書いています。


Q&A

  • Q: 東京とくらべて福井でプログラマとして仕事をすることについてはどう思うか?
  • A: 仕事はやっぱり東京が圧倒的に多い。が、福井からであっても東京の仕事を獲得することはできると思う。(+僕ならこうする、という話)
  • Q: これをつくったときに実力が一気にあがった、というものはありますか?
  • A: 近道になったものもあまり意味がなかったものもなくて、最初は何をやっても実力につながったと思う。とにかくたくさんアプリをつくった。

温泉

主催者の方のオススメで、奥さんとの週末旅行も兼ねて芦原(あわら)温泉に泊まりました。


f:id:shu223:20160708184343j:image:w600



芦原温泉からはあの東尋坊まで車で15分・・・と旅館の人は言ってたけど本数の少ない電車とバスを乗り継いでいくとなんだかんだで1時間以上かかりました。


f:id:shu223:20160710111735j:image:w600

(東尋坊の岩牡蠣。めっちゃでかい)


福井県は恐竜の化石でも有名。恐竜博物館や発掘体験にも行きたかったのですが、福井駅からわりと離れてるので今回は断念。


おわりに

「フリーランスプログラマ」とひとくちに言っても働き方は本当に千差万別だし、働き方の好みも人それぞれまったく違うので、「こういう働き方をしている人もいるんだな」と若い人たちの今後の選択肢のひとつとして頭の片隅にでも留めておいてもらえれば、と思いつつこういう話をさせていただきました。


果たして片隅にでも残るような話ができたかどうかはわかりませんが、僕自身はこういう東京以外でプログラミングを学んでいる若い人たちや先生方に接することができて非常に新鮮な経験をさせていただきました。


主催されたふくい産業支援センターの大西さん・河野さん、紹介いただいた伴野さん、プログラミングコンテスト主催の皆様、参加された皆様、貴重な機会をいただきどうもありがとうございました!


(追記)ふくい産業センターさんのサイトでレポート記事が挙がっていました!


[参考書籍][iOS][サーバーサイド][Android]【書評】モバイルエンジニア向けのAWS解説書

$
0
0

著者・監修の佐々木 拓郎さん、 高柳さん、および SB Creative さまより『Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく』をご献本いただきました。


f:id:shu223:20160506083601j:image:w600


昨今のモバイルアプリケーションには大抵の場合バックエンドも必要になりますが、たとえば僕はiOSアプリしかつくれません。そういう場合に、他のサーバーサイドエンジニアやインフラエンジニアと組む以外に、ちょっと前であれば Parse.com を利用してサクッと済ませてしまう、という選択肢もありましたが、来年にはサービス終了してしまうという悲しい事態になってしまった今、やはりモバイルアプリケーションのバックエンドのインフラとして真っ先に候補に挙がるのは AWS(Amazon Web Services)です。


ただそのAWS、LambdaとかMobile HubとかIoTとか色々ありすぎて、手を付け始める前からハードルを感じてしまう部分があることも否めません。例えば外部デバイスからアプリで吸い上げたデータを置いておきたい場合にはどれがいいんだろう、とか。お手軽さとか値段とかそのデータをどう利用したいか等にもよるのだと思いますが、どう検討・比較したらいいのか素人目には難しく思えてしまいます。


前置きが長くなりましたが、そんなAWSの各種サービスについてモバイルエンジニアを対象読者として(※)解説されている本がこちらです。


(Kindle版もありますが、固定レイアウトのようです。)


600ページ強の大作です。以下、個人的にいいなと思ったポイントを紹介していきます。


※ちなみに実際には『対象とする読者は、モバイルやJavaScript等でフロントエンドアプリを開発するアプリケーションエンジニア』とあるのでモバイルエンジニアだけではないのですが、僕がモバイルエンジニアなのでその視点で書かせていただきます。


AWS各サービスの詳細かつ丁寧な解説

Chapter 3 には、各サービスの特徴や使いどころ、機能・導入方法・料金・制限事項など、かゆいところに手が届く情報がまとめられています。

  • 3-1 Amazon S3
  • 3-2 Amazon API Gateway
  • 3-3 Amazon Simple Notification Service
  • 3-4 Amazon DynamoDB
  • 3-5 AWS Lambda
  • 3-6 Amazon Cognito
  • 3-7 Amazon Machine Learning
  • 3-8 Amazon Kinesis
  • 3-9 Amazon Simple Queue Service
  • 3-10 AWS IoT
  • 3-11 AWS Mobile Hub

全項目に利用方法と基本的な使い方が書かれていて、それぞれ10〜20ページにわたって豊富なスクリーンショット付きで丁寧に解説されているので、迷うことなく試してみることができそうです。


f:id:shu223:20160716164206j:image:w600


すぐに使う予定があるわけではなくても、これを見ながら一通り触ってみるのも良さそうです。一度でも触っておけば、どんなことができるのかとか、どれぐらい簡単なのかとかの感触がつかめるので。(個人的には、Lambda、Machine Learning、IoT、Mobile Hub あたりを本書を見つつ触ってみたいと思っています)


興味深いサンプル群

Chapter4からは具体的なアプリケーションを実装してみるチュートリアルとなっており、モバイルエンジニアにとっても魅力的なサンプルが並んでいます。


以下にそのリストを列挙してみます。(個人的に特に気になったものを太字にしてみました)

  • 4-1 Cognitoによる認証を利用したスマートフォン向け写真共有アプリケーション(iOS/Android)
  • 4-2 API GatewayとLambdaによるサーバ連携するモバイルアプリケーション(Android)
  • 4-3 API GatewayとCognito、Lambdaを連携した認証・認可サービス
  • 4-4 API Gatewayを使ったモバイルのスタブAPI
  • 4-5 DynamoDBとApple Watchによる健康情報の収集(iOS/watchOS)
  • 4-6 iBeaconと連動する勤怠管理アプリケーション(iOS/Android)
  • 4-7 Device Farmを利用したモバイルの多端末自動テストの実施(Android)
  • 4-8 S3とLambdaによるキーワードキュレーションサービス
  • 4-9 KinesisによるTwitter情報の収集
  • 4-10 Machine Learningを用いたWeb閲覧履歴保存&キュレーションサービス
  • 4-11 Cognito Syncを使った簡易メモアプリケーション(iOS/Android)

カッコ()内はiOSもしくはAndroidのどちらのサンプルが付いているかを示しています


いかがでしょうか。太字をつけたものの、私はいずれのサンプルも実際に仕事で必要になりそうなシーンが浮かんで、自分で手を動かして試してみたい、と思いました。


まとめ

アプリケーションエンジニア向けに書かれたAWS解説本、『Amazon Web Services クラウドネイティブ・アプリケーション開発技法』を紹介しました。普段あまりサーバーサイドの開発に携わることのない私のようなクライアントサイドのエンジニアにもわかりやすく、興味深い技術書だと思います。バックエンドやAWSまわりに興味がある・知識をつけたい方はぜひ一度書店などで検討されてはいかがでしょうか。(僕も勉強します!)



[iOS][参考書籍][Xcode]【書評】初学者はもちろん、中級者にもオススメのAuto Layout解説書

$
0
0

著者の川邉さん(@jeffsuke)および出版社のリックテレコム様より『よくわかるAuto Layout - iOSレスポンシブデザインをマスター』をご献本いただきました。


f:id:shu223:20160717140912j:image:h600


タイトルの通りAuto Layoutの解説書で、豊富な図やスクリーンショットを用いて、非常にわかりやすく書かれています。前書きによると、本書の対象読者は

過去一度はXcodeを用いてiOSアプリをつくったことがあるが、Auto Layoutとサイズクラスを用いたAdaptive Layoutと言われると尻込みしてしまう開発者

とのこと。


なんかもうベストセラーになったりしてるらしく、


AutoLayoutの必要性は今更僕が説くことでもないですし、監修は名著『UIKit詳解リファレンス』の著者 所さん


ということで、これはもう

  • iOSアプリ開発に携わっている(携わろうとしている)
  • AutoLayoutがよくわかってない

という方はもう買うしかないでしょう。買いましょう!



よくわかるAuto Layout  iOSレスポンシブデザインをマスター
川邉 雄介
リックテレコム
売り上げランキング: 14,747

(Kindle版もありますが、固定レイアウトのようです。)



・・・と、Auto Layoutに自信のない初学者の方には当然のようにオススメなのですが、AutoLayoutがそれなりにわかっている(と自分では思っていた)僕が読んでも、勉強になったポイントがいくつもありました。以下で紹介していきます。


Content Hugging Priority と Content Compression Resistance Priority と Instrinsic Content Size

250とか750とかのデフォルト値が振られてるアレです。


f:id:shu223:20160718095410j:image:w250


Auto Layoutはわかっているつもりでも、このへんの理解が曖昧なままwarningが出たときになんとなく優先度をいじってみたりしている、みたいな人は実は多いのではないでしょうか。私がまさにそうでしたが、本書では詳細かつ明解に解説されていて、曖昧に理解していたところがスッキリしました。以下メモ。

  • それぞれ Instrinsic Content Size についての「大きくなりにくさ」「小さくなりにくさ」を意味している*1
  • NSLayoutConstraintの優先度の値が同値の場合は、NSLayoutConstraintによる制約が優先される

レイアウトのライフサイクル(p35〜)

1. 制約の更新、2. フレームの更新、3. レンダリングというiOSにおけるレイアウトの3つのステップについて詳細に解説されています。


恥ずかしながら `updateConstraintsIfNeeded`, `layoutIfNeeded`, `layoutSubviews`, `setNeedsDsplay` といったメソッドでそれぞれ何が行われるのか、または何が行われないのか、といったことの理解が曖昧だったのですが、順序立ててわかりやすく解説されていて非常に勉強になりました。

  1. 制約の更新
    • `updateConstraints` が呼ばれる
    • ボトムアップ(子ビューから親ビュー)に制約の計算が実行される
    • 制約の有効/無効化、優先度変更、追加/削除などをトリガに実施される
    • この制約の更新を明示的に実行したい場合には `updateConstraintsIfNeeded` もしくは `setNeedsUpdateConstraints` を呼ぶ
  2. フレームの更新
    • `layoutSubviews` が呼ばれる
    • `layoutSubviews` が呼ばれると `updateConstraintsIfNeeded` も呼ばれ、必要に応じて制約の更新も行われる
    • トップダウン(親ビューから子ビュー)に実施される
    • ビューのフレームの変更・サブビューの追加・削除等をトリガに実施される
    • 明示的に実行したい場合には `layoutIfNeeded` もしくは `setNeedsLayout` を呼ぶ
    • `layoutSubview` をオーバーライドすると、`super.layoutSubviews()` の時点で既に制約の更新が完了しているので、そのレイアウト情報を用いて何らかの処理を実行したい場合に有効(+この方法で無限スクロールを実現する例)
  3. レンダリング
    • `drawRect:` が呼ばれる
    • 明示的に実行したい場合には `setNeedsDisplay` または `setNeedsDisplayInRect:` を呼ぶ

また `viewWillLayoutSubviews` と `viewDidLayoutSubviews` についても、それぞれの段階では(レイアウトサイクルの)どのステップは完了していて何は完了していないのか、というところの理解がスッキリしました。

  • viewWillLayoutSubviews
    • この時点では、サブリューのレイアウトは決定されていないが、画面の向きは決定している
    • この後、「制約の更新」と「フレームの更新」が実施される
  • viewDidLayoutSubviews
    • layoutSubviews による「フレームの更新」が完了すると呼ばれる
    • この後にレンダリングが行われるので、viewDidAppearはこれより後に呼ばれる

UIWindowの話

直接Auto Layoutとは関係ないですが、iOSでUIを実装するにあたってUIWindowに関して知っておいた方がいいことが簡潔に解説されています。`windowLevel` による重なり順の話とか、画面サイズを取得する場合に

UIScreen.mainScreen().bounds

UIScreen.sharedAppliation().keyWindow?.bounds

はどう違うか、とか。


UIStackView

iOS 9で追加された UIStackView についても、10ページを使ってしっかり解説されています。


ちなみに

Start with Stack View, use constraints as needed

まずはStack Viewを使って、必要に応じてconstraintsを使おう


WWDCのセッションでも言われていたとか。


コードで制約を設定する & NSLayoutAnchor

僕は基本的にはIB/Storyboardで制約を貼るのですが、仕事柄多くのプロジェクトに関わるので、「IB/Storyboard使わない派」な方々のコードに触れる機会も度々ありまして、コードで制約を設定することもたまにあります。


本書では、NSLayoutConstraint のイニシャライザを使う方法、VFL (Visual Format Language)を使う方法、iOS 9 で追加されたNSLayoutAnchorを使う方法等、まるまる一章を使ってその方法が解説されています。


ちなみにそろそろiOS 9の機能を使ってもいい(iOS 8を切ってもいい)空気になってきたと個人的には感じていますが、NSLayoutAnchor を使うと超シンプルかつ直感的にレイアウト制約をコードから設定できるようになります。


(before)

NSLayoutConstraint(item: subview,
                   attribute: .Leading,
                   relatedBy: .Equal,
                   toItem: view,
                   attribute: .LeadingMargin,
                   multiplier: 1.0,
                   constant: 0.0).active = true

(after)

let margins = view.layoutMarginsGuide
subview.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true

本章末尾のコラムではAuto Layoutを簡潔に書くためのオープンソースライブラリもいくつか紹介されています。


その他、細かい話

Auto Layout のアルゴリズム

この線型方程式系を解くアルゴリズムは、Greg J. Badros と Alan Borning、Peter J. Stuckey によって2001年に発表された、制約充足問題を説く Cassowary というツールキットで用いられたアルゴリズムを使用しています。(p.15)

明日から開発に活かせる、という話ではないのですが、こんなこともサラッと書かれていて、しっかり調べて執筆されている書籍なんだなということが伺えます。


外接矩形(alignment rects)をデバッグ時に確認する

[Edit Scheme] > [Run] > [Arguments] の [Arguments Passed On Launch] に `-UIViewShowAlignmentRects` を追加してチェックを入れると、実行時に外接矩形が表示される、というTips。


NSLayoutAttributeのLeft/RightとLeading/Trailingの違い

基本的にLeading/Trailingを使ってたので意識したことなかったですが、アラビア語とかヘブライ語のように右から左へ書く言語ではLeading/TrailingがそれぞれRight/Leftと同値となるそうです。


制約の矛盾が実行時に起きたときのエラーメッセージの見方

実行時にぶわーっと出てくるエラーメッセージ、ありますよね。僕は最近だとAutoLayoutを使ったアニメーションをやろうとして何かが間違っててこれが出てきました。で、メッセージ読んでもどの制約が悪いのかわかりづらい、と思ってたんですが、制約にちゃんとidentifierふればいいみたいです。(p86)


Xcode 7 の Storyboard Reference

Xcode 7 で追加された [Refactor to Storyboard...] メニューからの Storyboard の分割方法もしっかり書かれています。


Auto LayoutのデバッグTips

UIView に `exerciseAmbiguityInLayout()` なるメソッドがあり、これを用いると曖昧な制約を持つビューオブジェクトのフレームを、制約を満たす範囲でランダムに変更してくれるそうです。


他にもオブジェクトが持つインスタンス変数名と値を吐いてくれる `_ivarDescription` メソッド*2とか、ビューデバッガーの [Show Constraints] 機能とか、知らなかったことが色々と書いてありました。


まとめ

書籍『よくわかるAuto Layout』を紹介させていただきました。Auto Layoutがよくわかってない人を対象として書かれた書籍ですが、中級者にも勉強になる部分は多いと感じました。


本をまるっと一冊通読してAuto Layoutを勉強するというのはなかなか難しい、と感じる方もいらっしゃるかもしれません。が、目次を見れば分かる通り、Auto Layoutについてかなり網羅的かつ本質的に解説されてますので、リファレンス的に手元に置いておくのもいいのでは、と思います。


気になった方はぜひ!


よくわかるAuto Layout  iOSレスポンシブデザインをマスター
川邉 雄介
リックテレコム
売り上げランキング: 14,747

*1:この訳はAppleのドキュメントにあったのか著者のオリジナルかわかりませんが、簡潔で秀逸だなと思いました

*2:※Priveteです

[Deep Learning][機械学習][画像処理]TensorFlowをiOSで動かしてみる

$
0
0

TensorFlow に iOS サポートが追加された というニュースを見かけたので、ビルドして、iOSで動作させてみました。


f:id:shu223:20160720074930j:image:w240

たまたま目の前にあった扇風機もバッチリ認識してくれました)


本記事では最終的にうまくいった手順を書いています。この手順をなぞってみるにあたってTensorFlowや機械学習・ディープラーニングについての専門知識は不要ですのでぜひお試しください!


ビルド手順

iOSサポートバージョンであるv0.9.0をチェックアウトして、以下の手順でビルドしていきます。手順はこの通りになぞるだけですし、ほぼスクリプトを実行するだけで非常に簡単です(が、実行時間がかなりかかります)。


  • スクリプトを実行して Eigen や Protobuf 等の依存ライブラリをダウンロード
cd tensorflow
tensorflow/contrib/makefile/download_dependencies.sh

  • protobuf をビルド&インストール
cd tensorflow/contrib/makefile/downloads/protobuf/
./autogen.sh
./configure
make
sudo make install

ここで、僕の環境では `./autogen.sh` 実行時に

Can't exec "aclocal": No such file or directory at /usr/local/Cellar/autoconf/2.69/share/autoconf/Autom4te/FileUtils.pm line 326.
autoreconf: failed to run aclocal: No such file or directory
shuichi-MacBook-Pro-Retina-15inch:protobuf shuichi$ ./configure
-bash: ./configure: No such file or directory

というエラーが出ました。”aclocal”というのは、”automake”パッケージに含まれているらしいので、automakeをインストール。

brew instal automake

で、改めて

./autogen.sh
./configure
make
sudo make install

  • iOS native版のprotobufをビルド
cd ../../../../..
tensorflow/contrib/makefile/compile_ios_protobuf.sh

  • iOSアーキテクチャ向けにTensorFlowをビルド
tensorflow/contrib/makefile/compile_ios_tensorflow.sh

サンプルをビルドする

`tensorflow/tensorflow/contrib/ios_example` に2種類のサンプルがあります。


simple と名付けられたサンプルアプリは、今回ビルドした static library をアプリ内に組み込む際の最小実装としての参考にはなりそうですが、デモとして見て楽しい機能があるわけではないので、本記事ではもう一方の camera の方を紹介します。


まず、このファイルをダウンロードして、解凍すると入っている、

  • imagenet_comp_graph_label_strings.txt
  • tensorflow_inception_graph.pb

の2つのファイルを、`tensorflow/contrib/ios_examples/camera/data` に置きます。*1


この Inception というのはGoogleが提供する画像認識用の学習済みモデルのようです。


cameraサンプル実行例

cameraサンプルを実行すると、すぐにカメラが起動します。身近のものを色々と映してみました。(リアルタイムカメラ入力に対する認識結果を表示してくれます)


MacBook

f:id:shu223:20160720080028j:image:w240


"Notebook" "Laptop" どっちでも正解!


扇風機

f:id:shu223:20160720074930j:image:w240


"Electric Fan" 正解!


椅子

f:id:shu223:20160720080106j:image:w240


"Folding Chair"(折りたたみ椅子) 惜しい。。ですが、そもそも `imagenet_comp_graph_label_strings.txt` には chair が3種類しかなくて、その中では一番近いと言ってもいいかもしれません。


iPhone

f:id:shu223:20160720080129j:image:w240


"iPod"・・・惜しい!iPhoneなのでほぼ正解と言ってもいいかもしれません。


パフォーマンス

今回cameraサンプルを試したデバイスはiPhone 6だったのですが、認識はまだまだリアルタイムとは言い難く、数秒単位の遅延がある感じでした。まだiOS向けにビルドできるようになったというだけでiOSにおける GPU Accelerated はされてないですし、パフォーマンスの最適化はまだまだこれからのようです。


ちなみに iOS 10 で Accelerate.framework に追加された BNNS (Basic neural network subroutines) を使用した最適化もissueに挙がっています。


ビルド手順の情報ソース

iOSサポートバージョンである0.9.0トップ階層にあるREADMEを見ても、iOSについては書かれていません


上述したビルド手順は`contrib/makefile` 配下のREADMEに書かれています。

関連情報を以下にまとめておきます。


サンプルのソースコードを読んでみる

サンプルは全編Objective-C++で書かれています。読んでもわからないだろうと思いつつ、せっかくなので読んでみます。


tensorflow_utils

モデルとラベルデータを読み込むメソッドと、認識結果を返すメソッドを持つユーティリティクラスのようです。

tensorflow::Status LoadModel(NSString* file_name, NSString* file_type,
                             std::unique_ptr<tensorflow::Session>* session);
tensorflow::Status LoadLabels(NSString* file_name, NSString* file_type,
                              std::vector<std::string>* label_strings);
void GetTopN(const Eigen::TensorMap<Eigen::Tensor<float, 1, Eigen::RowMajor>,
             Eigen::Aligned>& prediction, const int num_results,
             const float threshold,
             std::vector<std::pair<float, int> >* top_results);

汎用的に使えそう。


ios_image_load

画像ファイルを読み込むクラス。

std::vector<tensorflow::uint8> LoadImageFromFile(const char* file_name,
             int* out_width,
             int* out_height,
             int* out_channels);

プロジェクトには追加されているけど使われてないっぽい。


CameraExampleViewController

サンプル本体。肝っぽいところだけを拾っていくと、


`std::unique_ptr<tensorflow::Session>` なメンバ変数を定義して、

std::unique_ptr<tensorflow::Session> tf_session;

viewDidLoadのタイミングでモデルを〜.pbファイルからロード

tensorflow::Status load_status =
  LoadModel(@"tensorflow_inception_graph", @"pb", &tf_session);

で、カメラからのリアルタイム入力が得られるたびに呼ばれるデリゲートメソッドを見てみると、

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection {
  CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
  [self runCNNOnFrame:pixelBuffer];
}

CMSampleBufferRef から CVPixelBufferRef を取得して `runCNNOnFrame:` を呼んでいるだけのようです。


`runCNNOnFrame:` はコードが若干長いですが、このへんと、

tensorflow::Tensor image_tensor(
    tensorflow::DT_FLOAT,
    tensorflow::TensorShape(
        {1, wanted_height, wanted_width, wanted_channels}));
auto image_tensor_mapped = image_tensor.tensor<float, 4>();
tensorflow::uint8 *in = sourceStartAddr;
float *out = image_tensor_mapped.data();

このへんが肝っぽいです。

if (tf_session.get()) {
  std::string input_layer = "input";
  std::string output_layer = "output";
  std::vector<tensorflow::Tensor> outputs;
  tensorflow::Status run_status = tf_session->Run(
      {{input_layer, image_tensor}}, {output_layer}, {}, &outputs);
  if (!run_status.ok()) {
    LOG(ERROR) << "Running model failed:" << run_status;
  } else {
    tensorflow::Tensor *output = &outputs[0];
    auto predictions = output->flat<float>();

    // ラベル取得
  }
}

が、すみません、それぞれ何をやっているのかを解説するにはTensorFlowの処理をちゃんと理解する必要がありそうです。。(勉強します)


自分のアプリに組み込む

試せていませんが、こちら に手順が示されていました。

  • ユニバーサルなstatic library(libtensorflow-core.a)をビルドしてプロジェクトに追加する
    • [Library Search Paths] にも追加。

The `compile_ios_tensorflow.sh' script builds a universal static library in tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a. You'll need to add this to your linking build stage, and in Search Paths add tensorflow/contrib/makefile/gen/lib to the Library Search Paths setting.

  • libprotobuf.a と libprotobuf-lite.a をプロジェクトに追加する。
    • [Library Search Paths]にも追加

You'll also need to add libprotobuf.a and libprotobuf-lite.a from tensorflow/contrib/makefile/gen/protobuf_ios/lib to your Build Stages and Library Search Paths.

  • [Header Search paths] を追加

The Header Search paths needs to contain the root folder of tensorflow, tensorflow/contrib/makefile/downloads/protobuf/src, tensorflow/contrib/makefile/downloads, tensorflow/contrib/makefile/downloads/eigen-eigen-, and tensorflow/contrib/makefile/gen/proto.

  • [Other Linker Flags] に `-force_load` を追加

In the Linking section, you need to add -force_load followed by the path to the TensorFlow static library in the Other Linker Flags section. This ensures that the global C++ objects that are used to register important classes inside the library are not stripped out. To the linker, they can appear unused because no other code references the variables, but in fact their constructors have the important side effect of registering the class.

  • bitcodeを無効にする

The library doesn't currently support bitcode, so you'll need to disable that in your project settings.


まとめ

TensorFlowをiOS向けにビルドし、付属のサンプルを動かしてみました。パフォーマンスの最適化等、まだまだこれから感はありますが、扇風機や椅子、ノートパソコンやiPhone等、大きさも形も全然違うものを認識してくれて未来を感じます。


試してみるだけなら機械学習やTensorFlowについての専門知識を必要としませんし、ぜひお手元で動かしてみてください!


次のステップとしては、下記記事で紹介されているテンソルの計算部分に特化してSwiftで書かれたライブラリと比較したりしつつ、ちゃんとTensorFlowでやっていることを理解したいと思います。


また、本記事同様に「とりあえず動かしてみる」シリーズとして、こちらもよろしければどうぞ:


*1:ちなみにこのとき、 https://github.com/miyosuda/TensorFlowAndroidDemo/find/master にある同名ファイルを使っても、ちゃんと動きません。参考

[海外][登壇][iOS][BLE]イスラエルとパレスチナでiOSとBLEについて講演してきた話

$
0
0

7月24日〜30日、「中東のシリコンバレー」と呼ばれスタートアップがめちゃめちゃ盛り上がっているイスラエルのテルアビブ、IT産業が伸びているというパレスチナのラマッラ、そしてあの聖地エルサレムにて、iOS×BLEについて話してきました。


f:id:shu223:20160816085014j:image:w300

(在イスラエル日本大使館作成のチラシ)


なにそれどういうこと?と思われた方もいらっしゃるかもしれませんが、これ、外務省の「日本ブランド発信事業」という事業の一環なのです。


こういうこともなかなかないだろうという貴重な経験をさせていただいたので、ブログに書いておこうと思います。


経緯

正式に決まったのは出発のちょうど1ヶ月前ですが、きっかけは半年以上前、昨年12月に開催された DemoDay.Tokyo #0 にまでさかのぼります。そこで「勉強しつつソースコードをオープンにしてたら海外からも仕事が来るようになった」という話をしたのですが、そこに外務省の方が来られていて、「こういうのあるんだけど興味ある?」「あります!」的なやり取りをさせていただいたのでした。


「iOSという米国産プラットフォーム上で活動してるだけの自分が日本ブランド発信なんて場違いだろう」という気持ちもありつつダメ元で応募書類を提出したところ、WHILLとかMoffとかBONXとか、日本発の魅力的なプロダクトに横断的に関わっているというところを評価されて見事採択されたのでした。


スケジュール

こんな感じのスケジュールでした。

  • 7/24 東京発
  • 7/25 テルアビブ着、エルサレムへ移動しアズリエリ工科大学にて講演
  • 7/26 テルアビブのGoogle Campusにて講演
  • 7/27 テルアビブのSigma Labsにて講演
  • 7/28 パレスチナのビルゼイト大学にて講演
  • 7/29 テルアビブ発
  • 7/30 東京着

毎日講演が入っていて、移動もあり、会食もあり、それ以外の時間は現地のスタートアップと会ったり資料の手直しをしたりしてたので、自分でどこかに観光に行くような余裕はありませんでした(後述しますが道中で名所に寄ってくれたりはしました)


位置関係

テルアビブとかエルサレムとか言っても多くの日本人にとってはなかなか位置関係をイメージしづらいんじゃないかと思うので、地図を載せておきます。


f:id:shu223:20160816084908p:image:w280


テルアビブ〜エルサレムまで車で片道1時間〜1時間半(渋滞状況による)ぐらいです。


歴史的背景とかは素人が下手に説明できない複雑さがあるのでぜひググッてみてください。。


各講演の様子

それぞれの規模はそんなに大きくはなくて、20〜40名ぐらい。しっかり細かい質問や意見を拾うことができてちょうど良い人数だったと思います。4講演とも基本的には同じテーマで話をした *1 のですが、それなりに場所も離れているので、参加者のかぶりはなかったようです。


初日:アズリエリ工科大学 / エルサレム

f:id:shu223:20160816085715j:image:w600


f:id:shu223:20160816085714j:image:w600


2日目: Google Campus / テルアビブ

f:id:shu223:20160816085753j:image:w600


f:id:shu223:20160816085750j:image:w600


3日目: Sigma Labs / テルアビブ

f:id:shu223:20160816085826j:image:w600


4日目: ビルゼイト大学 / パレスチナ

f:id:shu223:20160816090120j:image:w600


f:id:shu223:20160816090218j:image:w600



各講演やその他の活動についての報告はレポートに書いて既に外務省に提出したので、いずれサイトにて公開されるかと思います。


道中の観光

初日のエルサレムの会場への移動中に、大使館の方のはからいで旧市街に寄っていただきました。

旧市街はユダヤ教・イスラム教・キリスト教の聖地であり、嘆きの壁や聖墳墓教会、岩のドームといった各宗教縁の施設を訪れる人々が絶えない。旧市街は城壁に囲まれ、東西南北に宗派ごとで四分割されている。北東はムスリム地区、北西はキリスト教徒地区、南西はアルメニア正教徒地区、南東はユダヤ人地区となっている。現在の城壁はオスマン・トルコのスレイマン1世によって建設されたものである。城壁には北側中央にあるダマスクス門から時計回りに、ヘロデ門、獅子門、黄金門、糞門、シオン門、ヤッフォ門、新門の八つの門があり、ここからしか出入りができない。19世紀に作られた新門以外はスレイマン時代より存在する門である。(エルサレム - Wikipedia

こういうすごいところなのです。


f:id:shu223:20160725162845j:image:w600


f:id:shu223:20160725163126j:image:w600

(石造りの街並)


f:id:shu223:20160725162641j:image:w400

(嘆きの壁で講演の成功を祈る。かぶっている帽子はキッパというそうです)


観光ではありませんが、パレスチナはこういう機会でもないとなかなか入っていけない(個人の旅行でも入れるみたいですが)ので、すべてが新鮮でした。


f:id:shu223:20160728143114j:image:w600

(パレスチナのとあるレストランから見た風景)


あと、パレスチナからの帰り、かの有名な死海にも寄っていただいたのですが、ビーチに出られるゲートが既に閉まっていて、遠くの方から眺めることしかできませんでした。


大使との会食

なんと、イスラエル大使公邸にてイスラエル大使とお食事をご一緒させていただく機会にも恵まれました。


f:id:shu223:20160726210756j:image:w500


安倍総理やオバマ大統領との写真が飾られている中、恐縮しすぎてちゃんと話せるのかと心配もありましたが、非常に気さくに話していただき、ご飯も和洋イスラエル料理の折衷で非常に美味しく、至福の時間を過ごさせていただきました。


f:id:shu223:20160816093042j:image:w600


途中ポケモンGOの話題になり、帰り際にズバット(コウモリみたいなやつ)を見つけて大使とのツーショットを撮影したところ非常に喜んでいただけました。(写真は 在イスラエル日本大使館のページに掲載されています。)


治安

よく聞かれるのですが、今回の滞在中、治安について不安に感じることは一切ありませんでした。そもそも「海外危険情報」を出しているのが外務省であり、移動も行き先もその外務省や現地大使館の方々が全面的にアレンジしてくださったので、大船に乗った気持ちだったというのもあります。


が、最近ではテルアビブの平均年収が東京のそれを超えたという話もあり、普通に生活水準も高く、警備もしっかりしていることもあって、基本的にかなり平和なようです。


f:id:shu223:20160727122358j:image:w600

(とあるオフィスから見たテルアビブ市街)


旅行なり仕事なりで、またぜひ行きたいと思っています。


おわりに

行く前はワクワク感よりも「自分でいいのだろうか」という不安の方が大きかったのですが、それなりに事業の趣旨に沿った貢献もできたと思うし、僕としては大変貴重な経験を多くさせていただけたので、とにかく行ってよかったです。


本事業の実現にご尽力いただいた外務省の皆様、各講演のアレンジから滞在中の移動や食事等全てにおいてお世話になった在イスラエル日本国大使館の皆様、パレスチナ講演にご協力いただいた対パレスチナ暫定自治政府日本国政府代表事務所の皆様、どうもありがとうございました!


お知らせ

iOSDC

いよいよ今週末に差し迫った iOSDC 2016 にて、『海外のiOSカンファレンスに登壇する - 完全版』というタイトルで発表させていただきます。


ベルリンの「UIKonf」、ロンドンの「iOSCon」、サンフランシスコの「AltConf」と、今年は3つの海外のiOSカンファレンスに登壇する機会に恵まれました。


とはいえ招待されたわけではなく、CFPに自ら応募して投票・審査の上で採択された結果です。


本発表では、海外カンファレンスに参加するメリット、CFPの探し方、発表の準備、実際の登壇でうまくいったことや失敗したこと等について話します。


出番は朝イチの10:20、しかもゲストスピーカーである岸川さんの裏ということで誰も来てくれないんじゃ・・・と恐々としております。来ていただけると嬉しいです。


iOSDC Reject Conference

iOSDC Reject Conferenceにもday1、day2両方とも出させていただきます。


day1はこちらのテーマ。


day2の方は5分のLT枠で応募していて、落ちたのですが、15分枠が定員割れで空いていたので、そちらで出させていただくことになりました。


どちらもまだまだ勉強が必要な分野ですががんばって準備します。よろしくお願いします。


*1:イベントの告知内容や現地主催者の要望に応じてソースコードレベルの話までするかどうかというようなちょっとした調整はした

[登壇][海外][iOS]iOSDCで発表しました『海外のiOSカンファレンスに登壇する - 完全版』 #iOSDC

$
0
0

先週の金・土に練馬で開催された600人規模のiOSカンファレンス「iOSDC 2016」にて、『海外のiOSカンファレンスに登壇する - 完全版』というタイトルで発表させていただきました。


f:id:shu223:20160822084525p:image:w298


応募時に書いたトーク概要はこちら

ベルリンの「UIKonf」、ロンドンの「iOSCon」、サンフランシスコの「AltConf」と、今年は3つの海外のiOSカンファレンスに登壇する機会に恵まれました。


とはいえ招待されたわけではなく、CFPに自ら応募して投票・審査の上で採択された結果です。


本発表では、海外カンファレンスに参加するメリット、CFPの探し方、発表の準備、実際の登壇でうまくいったことや失敗したこと等について話します。


動画がこちら *1


発表スライドはこちら。

(このトークでは埋め込みの音声や動画が重要な役割を担っているので、上に貼ったyoutube動画を見たほうが伝わるかなと思います)


海外のiOSカンファレンスに登壇するためのノウハウ集、というよりは、英語がそんなに得意でもない自分が、どう四苦八苦しつつも海外登壇までこぎつけたのか、その結果どうだったのかという内容となっております。失敗談多めです。


裏話その1: 実行委員長 長谷川さんの神対応

開催前にこういうツイートをしました。


そう、僕の出番はゲストスピーカーである岸川さんの裏にどーんとぶつかっていたわけです。


実は、スタッフの方のひとりと飲む機会があり、事前にこのタイムテーブルについて知ることができたのです*2が、「そんなの誰も来てくれるわけがない・・・」とFacebookで長谷川さんに突然の友達申請をし、長いDMを送り、何とかなりませんかと泣きつきました。


そんな突然かつ面倒なメッセージに対して、長谷川さんは「なぜこういうタイムテーブルになったか」という意図について大変詳細かつ丁寧なご説明を返信で書いてくれて、僕は深く納得し、誰も来ないかもしれないけど(草の根集客活動含め)がんばろう、と思うに至った、ということがありました。(さすがにDMをここに載せることはできないのですが、それにしても朝イチのお客さんの流れとか色々考えられていて感動を覚えるほどでした)*3


結果的には、想像以上に多くの方に来ていただけたし、あと個人的にも出番を朝イチで終えてカンファレンスを存分に楽しめたしで、これで本当に良かったなと。めちゃくちゃお忙しい中、めんどくさい登壇者の個別問い合わせに懇切丁寧に対応してくださった長谷川さん、ありがとうございました🙇🏻🙇🏻🙇🏻


裏話その2: 発表時間

前日夜の時点で15分の発表時間に対して30分以上もかかる、ということに気付きまして、


とりあえず寝て、朝起きたら何となく整理がつくだろうと思ったのですが、



全然整理がつかなかったのです。。


で、とりあえずスライドを削るのはあきらめて、「全部は説明せずに流れが分かる程度にだけ説明する」というページに印をつけておいて*4、その辺を飛ばしながら話すことで、Q&A用の時間もフルに使った19分30秒でなんとか話し切ることができたのでした。(ギリギリですいませんでした🙇🏻🙇🏻🙇🏻)


当日の様子

手元に写真がない *5 ので、会場に来られていた方々のツイートをお借りしつつ会場の様子をお伝えしたいと思います。












関連記事:


おわりに

iOSDC、登壇者としてもいち参加者としてもめちゃめちゃ楽しかったです。トークは勉強になるし面白かったし、アイコン入りの大きめサイズのネームプレートとか、懇親会のビールとか、いろんなところに愛とこだわりを感じるカンファレンスでした。あと参加した人達みんなが口を揃えて言っていたことですが、初回にしてこんなに滞りなくいい感じに進むのってすごいことだと思います。


こんな素晴らしいカンファレンスを主催された長谷川さん、超ハードに動かれていたスタッフのみなさまには本当に感謝です。



そしてチケット代が4000円。僕はトークが採択される前にスポンサーチケット(8000円)を購入していたのですが、この内容でこの値段、お得すぎます。スポンサー企業のみなさまには足を向けて寝られません。チラシにしっかり目を通してサービスを積極的に利用させていただきます。


来年もあればぜひまた参加させていただきたいと思います。ありがとうございました!


関連記事


お知らせ

iOSDC Reject Conferenceにもday1、day2両方とも出させていただきます。


day1はこちらのテーマ。


day2の方は5分のLT枠で応募していて、落ちたのですが、15分枠が定員割れで空いていたので、そちらで出させていただくことになりました。


どちらもまだまだ勉強が必要な分野ですががんばって準備します。よろしくお願いします。

*1:公式チャンネルにはまだ個別の動画が上がっておらず、Bトラック全体の動画は埋め込みができない設定になっていたので、切り出してこちらにアップしました。公式のがアップされたら差し替えます

*2:発表前だったものの絶対に秘密というものではなかったそうです

*3:やるしかない、となった理由の決定打は、「そもそもA会場に全員が入れるわけじゃない」(→ 誰かが裏でやるしかない → 僕がそこを降りても別の誰かがそこに入ることになる → それはスタッフの誰かのトークになる)というところでした。

*4:アップした資料からはその印を削除してあります

*5:公式の写真がいずれシェアされるっぽいです!

[iOS][Deep Learning][機械学習][登壇]iOSDCのリジェクトコンで『iOSとディープラーニング』について話しました #iOSDCRC

$
0
0

一昨日メルカリさんのオフィスで開催された iOSDC Reject Conference days2 で、「iOSとディープラーニング」というタイトルで登壇させていただきました。



大層なタイトルですが、僕はディープラーニングや機械学習について詳しいわけではなく、「これから勉強したい」だけの素人です。iOSDCのCFPではLT枠の場合はトーク概要を書く必要がなかったので、タイトルは大きめにしておいて、内容は勉強の進捗に応じて、という算段でした。


で、先週あたりから夜な夜なこのへんの勉強をしていて、

この次に「自分でモデルをつくる」というステップに進みたかったのですが、次から次へとわからないことがでてきて、結局「誰かがつくったサンプルを動かす」「拾ってきたモデルを使う」止まりの発表になってしまいました。


そこは引き続き精進してまいります、ということで、以下補足を。


iPhoneでInception-v3モデルによるリアルタイム物体認識を動かす

TensorFlowのInception-v3を使った一般物体認識のデモをiPhoneで動かしたときの動画がこちらです。


f:id:shu223:20160902082200g:image


最初 [Notebook] [Laptop] を認識していて、カメラが下の方にいくと [Computer Keyboard] の順位が上がり、リモコンを映すと [Remote Control]、メガネを映すと [Sunglasses] が候補の上に上がってきます。*1


パフォーマンスもなかなかではないでしょうか。(用いたデバイスがiPhone 6sなので、ちょっとずるいですが。。)


サンプルを試す手順の詳細は下記記事にあります。


iOS 10で追加されたニューラルネットワーク機能群

LT5分だったのでここまで話せなかったのですが、iOS 10では2つのフレームワークにニューラルネットワークを高速計算するための機能群が追加されました。


ひとつは BNNS (Basic Neural Network Subroutines) と呼ばれていて、Accelerate Framework に新規追加されました。Accelerate は CPUで高速計算を行うためのフレームワークです。


そしてもうひとつは CNN(Convolutional neural network) で、MetalPerformanceShaders Frameworkに新規追加されました。Metal Performance Shaders はGPUで高速計算を行うためのフレームワークです。


で、どちらも同じような用途の機能が用意されていて、素人からするとGPUで処理するほうが良さそう、と思うのですが、わざわざ2種類出してきたからにはきっと一長一短あるのでしょう。もっと詳しい方が書いた記事があり、その記事ではこれらの比較についてこう述べられています。

AccelerateとMetalは、非常によく似たニューラルネットワーク関数群を提供しているので、どちらを選択するかは、各アプリケーションに依存します。GPUは、通常、機械学習に必要な種類の計算には望ましい反面、データの局所性によって、Metal CNNのパフォーマンスが、Accelerate BNNSバージョンより劣る場合があります。GPUにロードされた画像上でニューラルネットワークを動かす場合、例えば、MPSImageと新しいMPSTemporaryImageを使うと、Metalの方が明らかにパフォーマンスが上です。


MPSCNNのサンプル

BNNSの方も公式サンプルはあるのですが、今のところMac OS X用のものしかありません。MPSCNNの方はメリットやパフォーマンスを把握するのに最適なiOS向け公式サンプルが2つ出ています。

  • MPSCNNHelloWorld・・・MPSCNNで手書き数字認識
  • MetalImageRecognition・・・MPSCNN+Inceptionモデルで物体認識

ちなみに"MPS"は MetalPerformanceShaders のプレフィックスで、CNN関連の機能にはMPSCNNというプレフィックスが付いています。


で、上の手書き文字認識の方(MPSCNNHelloWorld)がシンプルで非常に理解しやすく、最初の一歩にすごく良いです。ベータ期間中につきサンプルのスクショは控えます。


f:id:shu223:20160902080706j:image:w500


上の画像(発表資料p35)はWWDC16のセッションスライド内にあった多層ネットワークの概念図に、該当するMPSCNNのクラス名を書いたものですが、わりとそのまんまで、CNNの概念を理解していれば非常に使いやすそうです。

  • Convolution Layer(特徴量の畳み込みを行う層): MPSCNNConvolution
  • Pooling Layer(レイヤの縮小を行い、扱いやすくするための層): MPSCNNPooling
  • Fully Connected Layer(特徴量から、最終的な判定を行う層): MPSCNNFullyConnected

(参考:Convolutional Neural Networkとは何なのか - Qiita


iOS 9以下でも使えるオープンソースのDL/NNライブラリ

iOS 10の話ばかりしても現実感がないかもしれませんが、"ios deep learning" とか "ios neural" とか "swift neural" とかでGitHub検索するとOSSがざくざく出てきます。


そのうち、100スター以上ついているものをピックアップしてみました。


f:id:shu223:20160902080845p:image:w500


TensorFlowがサンプル含めObjC、C++であるのに対して、Swiftで書かれているものも多いですし、Metal or Acceleratedフレームワークで高速化してあるものも多く、充実している印象です。


が、いざ試してみようとすると、サンプルもなかったり、最近はメンテされてなさそうだったりで、実際に使えるのは実はあまり多くないのかも、とも思いました。


もっともスターが多くついている「Swift-AI」については下記記事で紹介しています。


ディープラーニングの基本概念を学ぶのに良かった本

発表内では触れてないのですが、ディープラーニングというか人工知能というかそういう系の話はWebに解説記事も多く、逆にどこから手を付けていいかわからない、という状態に長らく陥っていました。で、とある機会に会ったこの分野でゴリゴリやってる人に教えてもらったのが下の書籍です。


脳・心・人工知能 数理で脳を解き明かす (ブルーバックス)
講談社 (2016-05-27)
売り上げランキング: 6,089

人間の脳のしくみから読みやすい文章で紹介してあって、いきなり数式ベースの解説があると「また今度にしよう」となってしまう自分には入り口として最適でした。


今後の展望

TensorFlowにしろiOSのBNNS/CNNにしろ、学習済みモデルの中身というかフォーマットがよくわかってないので、次はそのあたりを調べたいと思ってます。


*1:このとき食べていたアイスクリームも見事に認識してくれたのですが、食べかけだったのでカットしました


[Swift][iOS][Xcode]iOS 10の新機能のサンプルコード集「iOS-10-Sampler」を公開しました

$
0
0

iOS 10でも大量のAPIが追加されました。が、新しいAPIはどう使うのか、実際に何がどこまでできるのか、といった具体的なところが、英語のドキュメントやWWDCのセッション動画をながめているだけだと正直あまりピンときません。やはり実際にコードを書いて動かしてみるのが一番わかりやすい・・・ということで今年もつくりました!


iOS-10-Sampler


f:id:shu223:20160914063446j:image:w600


恒例の新機能のサンプルコード寄せ集めアプリです。ソースコードは GitHub に置いてあるので、ご自由にご活用いただけると幸いです。


使い方は Xcode 8 でビルドするだけ なので、デザイナーさんやディレクターさんもぜひお近くのエンジニアにビルドしてもらってください。


f:id:shu223:20160914072119j:image:w600


iOSももうかなり成熟してしまい、話題になる革新的な新機能とか、どの開発者にとっても嬉しい新機能というのはなかなかないわけですが、実装してみると思ったより簡単なので自分のアプリにも取り入れたくなったとか、他の誰も話題にしてないけど自分的には熱いみたいな機能もあったので、ぜひ一度お試しいただけると嬉しいです。


また、Samplerシリーズでは「余計な実装を混ぜずに、新機能のメリットをできるだけシンプルな実装で伝える」というところに気をつけています *1。コピペもしやすいと思うので、自分のアプリに取り入れて動かしてみるとより楽しいかもしれません。


今のところ17個のサンプルが入っています。随時追加していきます。機能追加プルリク大歓迎です!


以下各サンプルの紹介です。


Speech Recognition

新たに追加された Speech Framework を利用した音声認識のサンプルです。


f:id:shu223:20160914070235j:image:w405


Appleのサンプルをベースに、全58種類の対応言語を選択する機能を追加しています。


Looper

AVFoundationに新規追加されたクラス AVPlayerLooper を用いた動画のループ再生のサンプルです。


f:id:shu223:20160914070311g:image:left f:id:shu223:20160914070308g:image



このクラス自体はプレイヤー機能は持っておらず、AVQueuePlayer と AVPlayerItem のインスタンス、そしてループする範囲を示す CMTimeRange オブジェクトを渡して使用します。

public init(player: AVQueuePlayer, templateItem itemToLoop: AVPlayerItem, timeRange loopRange: CMTimeRange)

Live Photo Capturing

写真撮影用に追加された新クラス AVCapturePhotoOutput を使用したライブフォト撮影サンプルです。*2


f:id:shu223:20160914070434j:image:w200


Live Photo のビューワーは iOS 9.1 から使えましたが、今回から撮影もできるようになりました。


Audio Fade-in/out

すごーく地味だし、このAPIがなくてもできたといえばできたことなんですが、実際に使う人は多いかもしれません。AVAudioPlayerにフォードイン/アウトするためのメソッドが追加されました。

// Fade In
player.setVolume(1, fadeDuration: 3)

// Fade Out
player.setVolume(0, fadeDuration: 3)

これタイマーとかでやってた人は嬉しいんじゃないでしょうか。


Metal CNN Basic: Digit Detection

Metal Performance Shaders フレームワークに追加されたCNN (Convolutional Neural Network / 畳み込みニューラルネットワーク)を用いた手書き数字認識のサンプルです。*3


f:id:shu223:20160914070517g:image


この「Metal AcceleratedなCNN計算処理」は個人的には今回一番熱い新機能です。



Metal CNN Advanced: Image Recognition

上のサンプルに引き続き、Metal Performance ShadersのCNNを利用したリアルタイム一般物体認識のサンプルです。*4


f:id:shu223:20160914070509g:image


速くて見づらいかもしれませんが、ノートパソコン(notebook)→ リモコン(remote control) → iPhone(iPod)と認識しています。


Metal ShaderというぐらいなのでGPUで処理されます。6s利用ですが、処理速度も申し分なしでした。(ちなみにMetalはAppleのハードウェアに最適化されたグラフィックスAPIで、「OpenGLより最大10倍速い」と言われています)


ちなみにミスリードもあるかもしれないので念のためですが、「一般物体認識」という新機能があるわけではないです。本サンプルで使用しているモデルはImageNetデータセットを用いてInception v3ネットワークをTensorFlowで学習させたもので、新機能はあくまで「Metal(GPU)でCNN処理」という部分になります。


PropertyAnimator: Position

アニメーション用の新クラス、UIViewPropertyAnimatorを用いて UIView オブジェクトの位置と、背景色をアニメーションさせるサンプルです。


f:id:shu223:20160914070727g:image


画面上をタッチしたままグリグリと動かしてみてください。touchMovedが呼ばれるたびにアニメーションが追加するという単純な処理をやっているのですが、いい感じに追随してくれるのが今回のクラスがアニメーションの追加をいい感じにやってくれてる *5 おかげなのかなと。


PropertyAnimator: Blur

UIViewPropertyAnimator の `fractionComplete` を用いて UIVisualEffectView / UIBlurEffect のブラーをアニメーションさせるサンプルです。


f:id:shu223:20160914070720g:image


やってることは超シンプルで、`effect` プロパティから UIBlurEffect を削除する処理を UIViewPropertyAnimator に登録しておいて、

animator = UIViewPropertyAnimator(duration: 0, curve: .linear) {
    self.effectView.effect = nil
}

スライダーの値に応じて `fractionComplete` を変化させています。*6

@IBAction func sliderChanged(sender: UISlider) {
    animator.fractionComplete = CGFloat(sender.value)
}

Preview Interaction

新クラス、UIPreviewInteraction で、3D Touchでピーク&ポップするサンプルです。


f:id:shu223:20160914070939g:image


Notification with Image

新しい通知のフレームワーク、UserNotifications framework を用いて、画像付きローカル通知を発行するサンプルです。


f:id:shu223:20160914033106j:image:w200:left f:id:shu223:20160914033113j:image:w200



Sticker Pack

iMessage のステッカーパックのサンプルです。


f:id:shu223:20160914032800j:image:w200


Messagesってメッセンジャーアプリとしてどれだけのシェアがあるの?という声も効きますが、ステッカーパックは画像をアセットカタログに入れていくだけの超超簡単実装なので、いい感じの画像を持っているアプリはやっといて損はないのかなと。


Core Data Stack

NSPersistentContainer を使うと Core Data の実装がシンプルになるよ、というサンプルです。


f:id:shu223:20160914034038j:image:w200


noliliさんよりpull requestいただきました!


TabBar Customization

UITabBarのバッジをカスタマイズするためのAPIが追加されました。*7


f:id:shu223:20160914034330j:image:w200


センスがなく、全然いい感じにカスタマイズできてないのが心残りですが。。


New filters

CIFilterで追加されたフィルタのサンプル。


f:id:shu223:20160914034350j:image:w200:left f:id:shu223:20160914034353j:image:w200



前回は豊作だったのですが、今回はちょっとしかありませんでした。。


New Fonts

新規追加されたフォントのサンプル。こちらも今回は少なく、4種だけ。*8


f:id:shu223:20160914034359j:image:w200


Proactive: Location Suggestions

NSUserActivityに新たに追加された `mapItem` プロパティを用いた "Location Suggestions" のサンプル。


f:id:shu223:20160914054654j:image:w200:left f:id:shu223:20160914071309j:image:w200



いわゆる「Proactive」というやつで、Appleから出てるサンプルがあるのですが、どの実装が何に効いているのか、というかこのサンプルをどう試すのか、というのがちょっとわからず(WWDCセッションをちゃんと見ればいいのかもしれませんが)、下記記事に助けられました。


Attributed Speech

AVSpeechUtterance に、NSAttributedStringを渡せるイニシャライザが新たに追加されたので、これを試すデモです。


NSAttributedString は文字列に色んな属性を指定できるわけですが、


これを音声合成の「Utterance」に渡せるということは、例えば、NSFontAttributeNameを用いてある範囲のフォントをboldにすると、その部分だけ強調されて発声されるとか、何か別の属性を使ってアクセントを制御できるとか、そういうことを期待したわけです。


が、結果は・・・何も起こりませんでした



同ツイートのメンションで岸川さんから `kCTLanguageAttributeName` で言語を切り替える、`kCTRubyAnnotationAttributeName` でルビをふる、といった文字列だけではなくて音声にも有用そうな属性を示唆いただきましたが、これらを試してみてもやはりあり/なしで違いは発声しませんでした。


何か私の実装が間違っているのかもしれませんし、プルリクをいただけるかもしれないので、サンプルとしては残してあります。


所感

箇条書きで。。

  • Notificationのカスタマイズ、ロック画面でプレビューは嬉しい
  • 標準で、ローカルで音声認識ができるようになったのも嬉しい
  • MPSCNNは熱いのでここはもっと勉強したい
  • iMessage app / Sticker Pack は当初まったく期待してなかったけど自分でやってみるとその簡単さとやっておいて損はない(親アプリがiOS 9でもok)という点で意外と熱い
  • UIViewPropertyAnimator、あまりワクワクするような新しさのあるものではなかったが、従来のものよりは便利なのでiOS 10以上のアプリでは普段使いすると思う
  • 3D TouchでPeek&Popは3D Touchデバイスが普及するまでは静観
  • Proactiveは今は静観
  • SiriKitは良いサンプルが思いつかず今回は入れなかった

デュアルカメラとか、Taptic Engine APIとか新デバイス系はまた後ほど。


おわりに

最初は個人的な勉強として始めたものがすっかり恒例になって、もうかれこれ4年もこれをやっています。


f:id:shu223:20160914061757j:image:w320


これがまぁなかなか大変で、それなりに時間がかかるので、周りの人には毎年「今年はやらないかも」とか毎年言ってて、なんだかんだやっぱり今年もつくってしまったという。







まぁ自分はやっぱり「新しいAPIが追加されると開発者としてできることが増える」のが好きなのと、(冒頭に毎年書いていることですが)自分で手を動かさないと全然理解できないというのがあるので、これはやっぱり続けた方がいいなと。


そんなわけで Apple Watch Series 2 が届いたら「watchOS-3-Sampler」もつくりたいと思います!


*1:Appleによる公式サンプルではアプリとしての体裁を整えるために新機能とは直接は関係ない実装がたくさん入っていたりしてややこしくなっているケースが多々ある

*2:Appleの「AVCam」サンプルをベースに、Live Photo撮影の実装だけを抜き出し、シンプルにしたもの

*3:本サンプルは、Appleの「MPSCNNHelloWorld」サンプルをベースに、不要な実装を除去しシンプルにしたもの

*4:本サンプルのモデルデータと、ネットワークの実装は、Appleの「MetalImageRecognition」サンプルをベースにしています

*5:WWDC16のセッション216でそんな感じのことを言ってました

*6:この手法は、こちらのコードで知りました: https://github.com/manuelCarlos/IOS10-Animate

*7:これらの追加APIについては、こちらの記事で知りました: [iOS 10] UITabBarのバッジを少しカスタマイズできるようになった - Qiita

*8:しかもFutura、AmericanTypewriterは従来からあるfamilyの太さ違い

[海外][フリーランス][iOS]フリーランスを休業して就職します

$
0
0

2014年からフリーランスiOSプログラマとして活動を始めて2年と8ヶ月。フリーランスという働き方は自分には最高にしっくりきてて、毎日楽しくお仕事させていただいてたのですが、色々とタイミングが重なりまして、タイトルの通り、いったん休業して「会社員」になることにしました。


どこに就職するのかと言いますと、サンフランシスコにあるFyusionというスタートアップにジョインします。


f:id:shu223:20160929075342p:image:w400


無事H-1Bビザが通りまして、ちょうど昨日、スタンプの押されたパスポートが郵送されてきたところです。


フリーランスとしての実績もまとめたいところですが長くなるのでここでは省略して、ご報告の意味でも、自分の考えを整理しておく意味でも、就職することにした経緯や理由等を書いておこうと思います。


経緯

上述しましたが、僕はフリーランスという立場を100%楽しんでいましたし、海外企業も含めて「就職」したいという願望はありませんでした *1


以下は今年の3月ごろの話です。当時の状況としては、

という感じで、「フリーランスとして」「日本をベースにしつつ」「たまに海外に」行けたら楽しいなというスタンスで動いていました。


投資家からのコンタクト

3月はじめ頃のある日、とあるベンチャーキャピタルの方から会いたいという連絡をいただきました。この時点では何の用事かわからなかったのですが、普通に考えて投資先のアプリ開発を手伝って欲しいという話だろうなと。


(VCの人とか上位レイヤーすぎて、末端で手を動かしてるエンジニアなんて駒としか思ってなさそう)・・・という勝手な偏見もありつつ、ちょっと疑心暗鬼のままお会いしたのですが、まずは自己紹介がてらそのVCの投資先について一通りご説明いただいて、これがまた僕的にはどの会社のプロダクトもおもしろかったわけです。*3


で、実は投資先の会社のCEOが僕と話したいと言ってきてる、と。(たぶんGitHubで見つけたんだと思います。それしか入り口がないので)


その会社がFyusionなわけですが、この時点でもう僕は少なくとも何らかの形で関わりたいと思うぐらいには惹かれていて(後述します)、でもどういう「話」なのかはわからないのでまずは話してみよう、という感じでした。


CEOとのスカイプ

その翌週ぐらいにCEOのRaduとスカイプすることになり、僕が次の用事があったので実質3分ぐらいしか話せなかった *4 のですが、その3分でRaduは、ユーと仕事をしたい、働き方はパートタイムでもフルタイムでもリモートでも希望通りでいいよと。で、僕は働くなら一緒に顔を突き合わせてやりたい、と。おおそれじゃあビザの申請マジで急がないといけないからすぐにファウンダー達と話してよ、と。


3分で一気に事が進みました。


ちなみにこのとき確か3月中旬ぐらい。H-1Bビザの申請は4/1にオープンして、一瞬で埋まります。そしてさらに僕が3月後半からドイツに行く予定があり、申請書類の準備期間は実質一週間ぐらいしかありませんでした。


ファウンダー陣とのスカイプ

メールで時間調整して、翌日の午前中にはファウンダー陣とスカイプすることになりました。


正直、グダグダ、どころか95%相手が何言ってるかわからなかったです。第一声でPardon?って言った気がしますが聞き返しても聞き取れないのでそれも言わなくなりました。


唯一、"Printer"とか特徴的な単語がひとつだけ聞き取れたりして、「Canon時代の仕事について聞いてますか?」と確認してしゃべる、みたいな感じでどうにかこうにか乗り切りました。


参考:


そしてオファー

とはいえ全然トンチンカンなコミュニケーションをしてたとは思うので、これは「ない」だろうなと思ってたら、スカイプの30分後だか1時間後だかにオファーのメールが!


条件を確認して、外出していた奥さんに電話かけて「〜ということなんだけどサインしていい?」って聞いて、サインして返送。あちらからもすぐにサイン入りのが返ってきました。


のべ2時間ぐらいのスピード就活でした。ビザ申請の期限という後押しがなかったらもっと迷っていたかもしれません。


Fyusionに惹かれた点

大きく分けて2点あります。

「欲しいスキル」が得られそうだった

僕が身につけたいと思っているスキルに、「英語」「コンピュータビジョン」「3Dプログラミング」「機械学習」があります。


で、Fyusionは、

  • CEOのRaduは、3D点群処理のオープンソース・プロジェクト「Point Cloud Library (PCL) 」の設立者
  • OpenCVのコミッタでもある
  • 他のファウンダー陣・メンバーもロボット工学・3Dコンピュータビジョン・機械学習とかの博士号もってる人がゴロゴロ
  • 提供しているサービスもそれらの技術をベースとしている
  • もちろん英語を使う

というわけで、全部揃っているなと。


やろうとしていることが腹落ちした

彼らは「空間写真」を撮るアプリ「Fyuse」というプロダクトを既に世に出していて、


f:id:shu223:20160929091526p:image:w300

(Fyuseのわかりやすい記事:動画ともパノラマとも違う“空間写真”ってなんだ? Fyuse創業者に話を聞いた | TechCrunch Japan


こういうものを撮影してソーシャル上にシェアできるアプリです。

f:id:shu223:20160929085556g:image:w200

(Fyuseの空間写真をアニメーションGIFに変換したもの)


このアプリは一見飛び道具感があるのですが、中では実際に撮影された動画とスマホの各センサの値から対象を3次元モデルとして解析しています。


f:id:shu223:20160929041931p:image:w600


上に貼った例をよく見ると、人間の向きと3次元のロゴの向きが一致していることがわかると思います。



これはいわば「普通のスマホのカメラを3Dスキャナにする技術」をSNSという使ってもらいやすい形で提供しているようなもので、


「3次元データがたくさんあれば我々の得意分野である3Dコンピュータビジョンの技術でいろんなおもしろいことができるぞ!」


というところに彼らのやりたいことがあります。単にギミッキーな写真撮影SNSをつくってるわけじゃないぞと。



たとえば最近では、このFyuseで撮ったデータをHoloLensでホログラム投影、みたいなことをやってたりします。


僕はハードウェアという「現実世界のモノ」と繋がるアプリの開発を色々やってきて、やはりその「現実世界を見る『目』」のところで技術的強みがあると楽しいよなー、ということを常々感じていたので、彼らのやろうとしていることは非常に腹落ちしたわけです。



あと、Fyuseは普通に撮影フォーマットとしてもかなり可能性があるんじゃないかと思っています。一見ギミッキーですが、写真よりも多面的に記録でき、動画よりも軽量で柔軟に閲覧でき、2Dだけど3Dモデル的な情報も持っているという点で、「空間を捉える」ためのフォーマットとして普遍的な良さがあるなと。


2ヶ月間リモートワークしてみてのPros/Cons

フリーランスでお手伝いしていたところは7月までに収束させて、8月からリモートで手伝い始めてます。当然Pros/Cons両方あります。

Pros
  • AVFoudation, Core Image, Metal/MetalKit/MetalPerformanceShaders, Acceralateと、iOSアプリ開発の中でも特に興味のある部分の実装に携われている
  • iOS 10とかの新機能を積極的に使っていく雰囲気がある
    • バージョン互換とかは後から考えよう、という感じ
  • CEO, CTO, その他ファウンダー陣全員が毎日ゴリッゴリにコードを書いている
    • 一番ソースを把握してるのは彼ら。
Cons
  • チャットの速さに全然ついていけない
    • 全部読んでたら仕事にならない
    • 流し読みしても情報量0%なのでもはやメンションくれない限り読んでいない
  • フリーランスとしての立場が恋しい
    • おもしろい仕事の話をいただいたり、おもしろいことをやってる人に会っても、そこから展開させられないのがもどかしい

サンフランシスコには引っ越しません

あっちに住んで仕事をしてもOKなビザを獲得したわけですが、家庭の事情もあり、基本的には東京にいます。今のところは、1ヶ月アメリカ(オフィス)、2ヶ月日本(リモートワーク)、ぐらいのつもりです。


が、変わるかもしれません。フリーランスとしての働き方も、最初はリモート指向だったけど早々にお客さんのところに行ってやるスタイルに変えたり、短納期案件が楽しいとかじっくりやる方が楽しいとか時期によって色々変遷があったりもしたので、日米往復生活もやりながら試行錯誤していくつもりです。


まとめ

というわけで、長くなりましたが、フリーランス生活をエンジョイしていたところで急に降ってきたご縁で大きく方向転換することになりました。


そもそもの目的である「身につけたいスキル」は身につくのか、アメリカと日本の往復生活は成立するのか、会議では全然聞き取れないだろうけど仕事になるのか等々、いろいろと不安もあります。通用しなくてすぐに逃げ帰ってくるかもしれません。


が、せっかくの機会なので、楽しみつつ色々と吸収してこようと思います!


*1:3年ほど前はありましたが

*2:詳細はこちら:iOSDCで発表しました『海外のiOSカンファレンスに登壇する - 完全版』 #iOSDC - Over&Out その後

*3:今回就職する会社ではないところで、その後アプリ開発をお手伝いしたところもあります。そこのプロダクトも相当ぶっ飛んでておもしろいので許可がとれたら紹介したい

*4:27分ぐらいRaduが会社の説明をしてて、残り3分になったところで「11時から別のスカイプあるんだけど・・・」とやっと切り出した

[Metal][画像処理][iOS][Swift]iOS/MetalのシェーダをWebGL/GLSLから移植する

$
0
0

Metalでグラフィック処理を行うにしろ並列演算を行うにしろ、GPUに処理をさせるためのシェーダを書かないといけないわけですが、これがまだ情報が少なくて、「こういうシェーダを書きたいんだけど、誰かもう書いてないかな・・・」というときに参考になる近いものとかはそうそう都合よく出てこないわけです。


ただ、WebGL/GLSLの情報はググると山ほどあって、GLSL Sandbox という、Web上で編集できてプレビューできてシェアできるサイトもあり、何がどうなってそうなるのか理解できない難しそうなものから、ただの円といったシンプルなものまで、既に偉大な先人たちのサンプルがたくさんアップされています


f:id:shu223:20161113192400j:image:w600



Metalのシェーダというのは正しくは Metal Shading Language といいまして、C++をベースとする独自言語なのですが、まー概ねGLSLと一緒です。


実際にやってみたところ、GLSL -> Metal Shader の移植はほとんど単純置き換えで済み、Swift 2をSwift 3に直すのよりも簡単という感覚でした。


f:id:shu223:20161113192821j:image


いずれも画像等のリソースは使用しておらず、iOSデバイス上で、GPUによってリアルタイム計算されたものです。


実際のところ自分はゲーム開発やVJをやったりしているわけではないので、こういう派手なエフェクトではなく、線とか円とかグラデーションとかのもっと単純なものをMetalで動的描画したいだけだったりするのですが *1、移植が簡単に行えることがわかっていれば、GLSLを参考にMetalシェーダを書けるというのはもちろんのこと、GLSL Sandboxで動作確認しつつシェーダを書いて、できたものをiOSに移植する、ということもできるので、個人的にはMetalシェーダを書く敷居がグッと下がりました。


というわけで、以下GLSLのコードをMetalに移植する際のメモです。


雛形となるプロジェクトを作成する

プロジェクトテンプレートに "OpenGL ES" はあっても "Metal" というのはないのですが、"Game" というのがあり、次の画面で [Game Technology] の欄で Metal を選択すると、シンプルなMetalのプロジェクトが生成されます。


f:id:shu223:20161113194605j:image:w500


これをベースに、GLSLのコードを移植して来やすいように次のように手を入れました。(現時点ではGLSL SandboxのコードをiOSで動かしてみるべく、フラグメントシェーダだけに手を入れています)


1.「画面の解像度」をフラグメントシェーダに渡す

多くのGLSLのサンプルでは、xy平面における座標を 0.0〜1.0 に正規化した状態で取り扱っています。ピクセルベースの座標値をシェーダ側で正規化できるよう、画面の解像度をシェーダに渡すよう修正します。


まずはシェーダ側。下記のように引数に float2型の "resolution" を追加します。

fragment float4 practiceFragment(VertexInOut     inFrag      [[stage_in]],
                                   constant float2 &resolution [[buffer(0)]])

次にSwift側。下記のようにバッファを用意して、

var resolutionBuffer: MTLBuffer! = nil
let screenSize = UIScreen.main.nativeBounds.size
let resolutionData = [Float(screenSize.width), Float(screenSize.height)]
let resolutionSize = resolutionData.count * MemoryLayout<Float>.size
resolutionBuffer = device.makeBuffer(bytes: resolutionData, length: resolutionSize, options: [])

フラグメントシェーダ関数の引数にバッファをセットします。

renderEncoder.setFragmentBuffer(resolutionBuffer, offset: 0, at: 0)

こんな感じで正規化した座標値を算出します。

float p_x = inFrag.position.x / resolution.x;
float p_y = inFrag.position.y / resolution.x;
float2 p = float2(p_x, p_y);

GLSL Sandboxはスクリーンが必ず正方形なのですが、iOSデバイスはそうではないので、比率が変わらないようどちらもx方向の解像度(つまり幅)で割っています。


2. 「経過時間」をフラグメントシェーダに渡す

ほとんど同様です。シェーダ側では、引数に float型の "time" を追加します。

fragment float4 practiceFragment(VertexInOut     inFrag      [[stage_in]],
                                   constant float2 &resolution [[buffer(0)]],
                                   constant float  &time       [[buffer(1)]])

Swift側。下記のようにバッファを用意して、

var timeBuffer: MTLBuffer! = nil
timeBuffer = device.makeBuffer(length: MemoryLayout<Float>.size, options: [])
timeBuffer.label = "time"

フラグメントシェーダ関数の引数にバッファをセットします。インデックスが変わる点に注意。

renderEncoder.setFragmentBuffer(timeBuffer, offset: 0, at: 1)

時刻の更新時にバッファを更新します。

let pTimeData = timeBuffer.contents()
let vTimeData = pTimeData.bindMemory(to: Float.self, capacity: 1 / MemoryLayout<Float>.stride)
vTimeData[0] = Float(Date().timeIntervalSince(startDate))

GLSLを移植する際の改変点

GLSL を Metal に移植してくる準備が整いました。ほとんど同じ、と書きましたが細部はやはり違います。以下、大まかな移行ポイントです。

  • GLSLのフラグメントシェーダでは、最後に gl_FragColor にvec4値をセットすることで出力とするが、return で float4 なり half4 なりを返す

(例)GLSLの場合

gl_FragColor = vec4(color, 1.0 );

Metalの場合

return float4(color, 1.0);
  • 関数はプロトタイプ宣言が必要
    • これがないと、ビルド時に "No previous prototype for function 〜" というwarningが出る
  • vec2, vec3, vec4 -> float2, float3, float4
  • ivec2, ivec3, ivec4 -> int2, int3, int4
  • mat2, mat3, mat4 -> float2x2, float3x3, float4x4
    • コンストラクタも微妙に違う(float2x2ならfloat2を2つ渡す。公式ドキュメントp15あたり)
  • const -> constant
  • mouse.x, mouse.y -> 適当に0.5とか

また出てきたら追記します。


GLSL Sandboxから移植してみる

GLSL Sandboxでいくつかピックアップして上記手順でMetalに移植し、iOSで動かしてみました。それぞれの移植にかかった時間は5分ぐらいです。ほとんど単純置き換えで済みました。


http://glslsandbox.com/e#36694.0

f:id:shu223:20161113193424g:image


http://glslsandbox.com/e#36538.3

f:id:shu223:20161113193507g:image

※デフォルトのITERATIONS 128では3fpsぐらいしか出なかったので、ITERATIONS 64に変更


http://glslsandbox.com/e#36614.0

f:id:shu223:20161113194708g:image


まとめ

GLSLをMetalに移植する手順について書きました。


上にも書きましたが、Metalをさわりはじめたときはシンプルなものすら書き方がわからなくて四苦八苦したので、「GLSLのコードも参考になるんだ!」と気付いたときはMetalの敷居がグッと下がった気がしました。


MetalはiOS 10からニューラルネットワーク計算のライブラリも追加されたこともあり、自分的に今一番熱い分野です。引き続きシェーダの具体的な書き方や、SceneKitを併用して3D空間内のノード上にMetalでテクスチャを動的描画する方法、デバッグツールの使い方等、色々と書いていきたいと思います。



*1:線とか円とかの単純なものでも、カメラプレビューで動的かつリアルタイムに、かつ他の重い画像処理と一緒に、といった場合、そして描画数が多かったり毎フレームの更新が必要な場合、やはりUIKitやCoreGraphicsでは厳しい場面が出てきます。

[海外][フリーランス][登壇][iOS]「シリコンバレーで働くエンジニアと考える、これからのキャリア」という授業をしました

$
0
0

オンライン動画学習サービスSchoo(スクー)で、「シリコンバレーで働くエンジニアと考える、これからのキャリア」と題した授業をさせていただきました。*1



撮影を生放送で行い、視聴者参加型で行う授業でした。もちろんキャリアに正解なんてないし、キャリア観も人によって千差万別なので、僕が何かを教える、というよりは、まずは僕の経験や考えを共有して、あとはコメント・質疑応答ベースでみんなで考えていきましょう、的なコンセプトです。


f:id:shu223:20170111081424j:image:w600


講義

最初に30分(ホントは20分の予定だったのですが🙇🏻)の講義パートがありました。


講義資料はこちら。*2



  1. 自己紹介(僕のキャリアの変遷をざっと説明)
  2. 僕のキャリア観(理想)
  3. その実現のために意識していること4つ
    • 勉強を仕事に繋げる
    • "Searchable"になる
    • 「許容できるリスク」を知る
    • 引き際も大事

という3段構成です。


f:id:shu223:20170111081032j:image:w600

給与の変遷グラフというちょっと生々しい話もあります) *3


スライドだけだと言葉足らずな部分が多々ありますし、「学生代表」の徳田さんがいい感じに合いの手や質問を入れてくれているので、ぜひスクーで見てみてください。


質疑応答

残りの時間は質疑応答でした。やはりキャリアについてはみなさん気になるところが多いようで、授業が延長されるぐらいにコメント、質問をたくさんいただきました。


実際のQ&Aはスクーで見ていただくとして、以下に目次を載せておきます。

  • アメリカに行った理由
  • Q.英語はどのようにして身につけたのでしょうか?
  • Q.日本と海外で働くのどちらが面白いですか?
  • Q.アメリカの就職事情は?スタートアップへの就職で大切なポイントはどこでしょうか?
  • Q.質問です!海外で仕事することに関して奥様から反対とか無かったのですか?
  • Q.シリコンバレーだからこそ日本と環境面で何が異なるかを知りたいです。
  • Q.アメリカで求められるエンジニアってどんな人ですか。データ分析?人工知能?
  • Q.現在、海外で働きながらフロントエンジニアを目指していますが、カヤック時代は一日に何時間、プログラミング学習をしていましたか?(平均睡眠時間が8時間と仰っていたので)
  • Q.シリコンバレーで起業する準備としてするべきことを教えてください。
  • Q.堤さんがエンジニアとして海外に居ても日本に居ても1日の中で最も大切にしていることは何でしょう
  • Q.シリコンバレーにおいて、エンジニアのキャリアはどういうものがあるのですか?ずっとプログラマーのままの人もいらっしゃいますか?
  • Q.日本とアメリカでは開発に対する考え方(リスク等)に違いがあると思います。その考え方の違いについてお話を伺いたいです。
  • Q.面白い仕事をどのように探し続けているですか?教えて頂けますか?
  • 受講生の皆様へのメッセージ

撮影風景

スタジオはこんな感じでした。


f:id:shu223:20170106201910j:image:w600

(カメラが3台、モニタも3台、でかい照明もあります)


スタジオに行くまで、普通のハンディカムみたいなので撮影するもんだと思ってました。。こういう本格的な撮影は初めてなので、楽しかったです。


関連記事/参考資料

本授業に関連する記事をまとめておきます。

プログラミング初心者時代の話
海外登壇
フリーランス時代の海外での仕事
その他海外関連
今回の就職の経緯
情報発信について

おわりに

スクーの皆様、生放送に参加していただいた皆様、どうもありがとうございました!

f:id:shu223:20170111081523j:image:w600

(スクーのみなさんと)


最後に改めて授業へのリンクを載せておきます。


*1:僕が働いてるのはサンフランシスコであってシリコンバレーには含まれないらしいのですが、僕自身も最近知ったぐらいなので、そこらへんは許容していただけるとありがたいです😅

*2:スライド共有サービスにアップしてブログに載せてもいいかはスクーさんに確認済みです

*3:こうやってみると今が一番高くて「さすがアメリカ!」ってなるかもしれませんが、僕のアメリカでの評価はまだまだで、1日単価でいうと日本でのフリーランス時代の方が少し多いぐらいでした。フリーランス時代はお客さん仕事は6〜7割にして、残りの時間を新しい技術の勉強や書籍の執筆に充てていたので、年収としては今より低くなっています。

[機械学習][Deep Learning]それでもCourseraの機械学習コースをオススメする理由

$
0
0

先日、オンライン学習サイトCourseraの機械学習コース "Machine Learning by Stanford University" を修了しました。


f:id:shu223:20170207160051j:image

(感動のエンディング動画)


ただ、機械学習に興味があって情報収集を始めてる人にとって、「Courseraの機械学習コースがおすすめですよ」という話は


「はい、知ってます


という感じではないでしょうか。


僕もそんな感じで、幾度となく人や記事に同コースを薦められたりしつつ、たぶん2年ぐらいスルーし続けてきたと思います。


しかし約2ヶ月前、ひょんなきっかけから本講座を始めてみて、やはり評判通り最高だったと思うと同時に、僕と同じような感じでこのコースが良いらしいと知りながらもスルーし続けてる人は多いんじゃないかと思いまして、(おせっかいながらも)自分の脳内にあった「やらない理由」を列挙しつつ、「いや、それでもやった方がいいですよ」というのを書いてみたいと思います。


「スタンフォードの授業」レベル高そう

世界最高峰のスタンフォード大学の授業、いくら「入門です」と言われても、「それはレベルの高い中での入門でしょ?」と思ってました。技術書を読んでもさっぱり頭に入ってこない人の気持ちなんてわからないでしょうよ、と。


いえ、この授業はサルでもわかります。・・・とは言えません


やっぱり数式がたくさん出てきて何言ってるのかわからなくなります。眠くなります。でも少なくともスタンフォードに入学できる程の世界最高峰の前提知識が必要ってことはないです。


高校レベルの数学、プログラミングが出来れば前提知識としては十分で、Andrew先生は数式の意味を説明するのがめちゃくちゃうまいです。項を削ぎ落としてシンプルにしたところから、順序立ててその数式の性質を説明してくれて、それが機械学習でどう役立つのか、という話をしてくれるので、納得感・腹落ち感があります。


そして時には、「この数式の意味はわかってなくても偉い人が実装したライブラリ使えば機械学習はできるから大丈夫だ」と言ってくれたりもします。わからない人の気持ちがわかってる先生だなと随所で感じます。


わからない分野の話を、英語で学ぶなんて。。

全編に日本語字幕があります。自動翻訳の気持ち悪い日本語ではなくて、ボランティアによる自然な日本語です。


当初僕には「英語の動画を日本語字幕で見るのは何か負けた感がある」「英語で観ると英語の勉強にもなって一石二鳥」という変なこだわりもありましたが、

  • 機械学習を学ぶのが先決
  • (英語で観ることで)心理的ハードルが高くなって講座をやらなくなっては本末転倒

と開き直って全て日本語で観ました。


その後色々なオンラインコースが出てきてるし、もっと良いのがあるんじゃない?

このコースがいつからあるのかわかりませんが、たぶん2012年にはもうあったと思います。今では最初から日本人が日本語で解説している講座もあるでしょうし、ディープラーニングまでカバーしているものもありますし、評価が高いものもあります。


このコースが優れている点として、Andrew先生の説明がわかりやすい、実践的な内容である、といったことがよく挙げられますが、それらももちろん良いわけですが、


毎週のプログラミング課題の提出が義務付けられている


という点で、僕は他のオンライン講座と比べて圧倒的に良いと思いました。


動画で学んだニューラルネットワークとかレコメンドシステムを自分で実装して、毎週提出する必要があります*1


これが本当に素晴らしくて、

  • 動画を見てよく理解できなくても、自分でプログラムを書いてみるとよく理解できる
  • 動画を見て理解できたと思っていても、自分でプログラムを書いてみると理解が曖昧だった部分が浮き彫りになることがある
  • ちゃんと学んだという実感がある

という効果があると感じました。他のオンライン講座ではあまりこの形式は見たことなくて、どんなに動画が良くても、結局これがないと意味ないような、とさえ思います*2



ちなみに最近、『ゼロから作るDeep Learning』という書籍がとても評判が良く、これでゼロから学び始めた/学ぼうと思っている、という人も多いと思います。


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
斎藤 康毅
オライリージャパン
売り上げランキング: 65

僕も最近買って読んでみて、この本の「手を動かして自分で実装してみる」というコンセプトの良さに通ずるものが、このCourseraの機械学習コースもある、と思いました。上述しましたが学んだことは全て自分で実装することになるので。


ちなみにこの本とCourseraの機械学習コースは(被る部分もありますが)カバーする範囲が違うので両方ともやって損はないと個人的には思います。ディープラーニング本はディープラーニングに到達するための要素技術/知識を最短距離で学ぶ感じですが、Coursera機械学習コースはもっと機械学習の基本事項を広く網羅する感じです。*3


OctaveじゃなくてPythonでやりたい

「今機械学習やるならPythonだし、なぜOctave・・・?」というところで避けてしまう人も多いかもしれません。


もちろん僕もOctaveは初めて触りましたしこの講座以外でもう触ることもないんじゃないかとさえ思いますが、Octave独自の使い方とか記法を学ぶ、というオーバーヘッドはほとんどなかったと思います *4


プログラミング課題でやった実装は自分で中身を理解している(どういう関数を使っているか、なぜそういう計算をしているか)ので、つくったものをあとから他の言語やフレームワークに移植するのも簡単そう、と思っています。


続けるコツ

こうやっておすすめしているわけですが、機械学習で何かをやる具体的な予定があるわけでもなく、仕事もプライベートも普通に忙しい、という状況においては実際のところ完走するのはなかなか大変なんじゃないかと思います。


僕は第1週目は「機械学習の歴史」みたいな流し見しても良い内容だろうと思って最初は気軽に始めてみたのですが、最初の動画だか2つ目の動画だかでもういきなり数式がバリバリ出てきて面食らった記憶があります。普通に気が重いです。


そんな中でも続けられた理由が3つほどあるなと思うので参考までに書いておきます。


1. 中間目標があった

当初は完走するつもりはなくて、とりあえず第5週のニューラルネットワークまではやろう、と思っていました。


で、第5週目までやって、修了証書が欲しいわけでもなかったのでやめてもよかったわけですが、その先のカリキュラムに「次元削減」「レコメンドシステム」等いくつか学びたい項目があったので、もうちょっとやってみるか、と。


8週目ぐらいまでやったとき、最後の第10週、第11週はプログラミング課題がないことに気づきました。実質あと2週がんばれば完走じゃん!と。


そんなこんなで、中間目標を見ているうちに完走できた、という話です。


2. 「挫折したらもう一生オンライン講座で勉強できない体になる」という意識があった

自分の性質上、一度自分の意志を折った前例をつくってしまうと、もうダメなんですよね。そこが基準になってしまう。


「今週めっちゃ忙しいけど、この週にやらなかったら来週もやらないだろうし、他にやることめっちゃあるし、一週でもサボったらもうこの講座をやることはないだろう」


「この講座を完走しなかったら、もう一生どんなオンライン講座も完走することはないだろう」


極端だと思われるかもしれませんが、人生を40年近くやってきて実際そんな感じだったので、「ここでオンライン講座という貴重な学習の選択肢を失うわけにはいかない」という思いで後半は進めていました。


3. 適度に飛ばしながら進めた

例えば(上述した通り)Octaveの書き方の動画は飛ばしましたし、前半には結構あるテキストによる解説とPDFは全部飛ばしましたし、プログラミング課題の"optional"問題も容赦なく飛ばしました。やった方がいいのは間違いありませんが、挫折するよりは前に進んだほうがいいので。


まとめ

というわけでCourseraの"Machine Learning"、おすすめです!


*1:自動ですぐに採点されるようになっています

*2:宿題として課されなくても自分で手を動かして学べる人は別

*3:個人的には、先にCourseraの方をやり、後からこの本で(既に知っているところは飛ばしつつ)やった方がわかりやすいのでは、と思いました。

*4:序盤でOctaveの使い方の動画があるが、ほとんど飛ばして、テストと課題で必要になる度にググる、という方法で十分乗り切れました

[Metal][iOS][画像処理]Metalのコンピュートシェーダに関する諸々

$
0
0

Metal の compute shader について。随時書いていきます。


[[ thread_position_in_grid ]] って何?

こういう感じで、カーネル関数の引数から受け取れるやつ。

kernel void
add_vectors(const device float4 *inA [[ buffer(0) ]],
            const device float4 *inB [[ buffer(1) ]],
            device float4 *out [[ buffer(2) ]],
            uint id [[ thread_position_in_grid ]])
{
    out[id] = inA[id] + inB[id];
}

変数名としては id, gid, tid となっているのをよく見かける。


Metal Shading Language Specification / Guide』によると、

thread_position_in_grid identifies its position in the grid.

とシンプルに書かれている(4.3.4.6 Attribute Qualifiers for Kernel Function Input)。


これだけじゃその名前が表現している以上のことがわからないのでグリッドやスレッドの説明も引っ張ってくると、

When a kernel is submitted for execution, it executes over an N-dimensional grid of threads, where N is

one, two or three. A thread is an instance of the kernel that executes for each point in this grid, and

thread_position_in_grid identifies its position in the grid.

Threads are organized into threadgroups. Threads in a threadgroup cooperate by sharing data through

threadgroup memory and by synchronizing their execution to coordinate memory accesses to both

device and threadgroup memory. The threads in a given threadgroup execute concurrently on a

single compute unit12 on the GPU. Within a compute unit, a threadgroup is partitioned into multiple

smaller groups for execution.

ちょっとよくわからない。。


ここの回答にわかりやすい説明があった。

`thread_position_in_grid` is an index (an integer) in the grid that takes values in the ranges you specify in `dispatchThreadgroups:threadsPerThreadgroup:`. It's up to you to decide how many thread groups you want, and how many threads per group.

In the following sample code you can see that `threadsPerGroup.width * numThreadgroups.width == inputImage.width` and `threadsPerGroup.height * numThreadgroups.height == inputImage.height`. In this case, a position in the grid will thus be a non-normalized (integer) pixel coordinate.


なるほど、`dispatchThreadgroups:threadsPerThreadgroup:` を呼ぶときに渡すサイズ(`threadsPerGroup`と`numThreadgroups`)によって「グリッド」の範囲が決まり、`thread_position_in_grid` はそのグリッド内のインデックスを保持する、と。


テクスチャのサイズを取得

カーネル関数が、たとえば以下のように定義されていれば、

kernel void computeShader(texture2d<float, access::read> tex [[ texture(0) ]],

この引数texに渡されてくるテクスチャのサイズは、

    float w = tex.get_width();
    float h = tex.get_height();

という感じで取得できる。


[登壇][Deep Learning][Metal][iOS]try! Swift 2017で「クライアントサイド・ディープラーニング」というLTをしました #tryswiftconf

$
0
0

先週開催された "try! Swift Tokyo 2017" にて、"Client-Side Deep Learning" というタイトルでLTしました。発表資料はこちら。



ディープラーニングは強力なコンピューティングパワーが必要なので、従来はモバイルデバイスでやるものではなかったのですが、iOS 10でMetal Performance Shadersフレームワークに追加された新たしいAPIにより、クライアントサイドのGPUで学習済みCNNの計算を行えるようになったという話です。


その話前もしてたんじゃ・・・と思われるかもしれませんが、今回は自分でモデル作成からアプリ実装まで一通りやってみた上で話をしていたので、僕の中では大違いでした。まぁ、5分のLTなのでそこで得た知見や具体的な実装についてはあまり話せませんでしたが。。


実際にLTの中でライブデモもやりました。手元のネームプレートにあるSwiftロゴの認識に見事成功しました。


f:id:shu223:20170306090025j:image:w600

(Photo by @inamiy


緊張かライブデモの恐怖かわかりませんが手がプルプル震えるし、学習データはオレンジバックの白抜きのお馴染みのロゴ画像が中心で、木製ネームプレートに立体的に刻印されたロゴはそもそも今回作成したモデル的には認識が難しいということもあったのですが、無事うまくいって良かったです。


手が震えてたのが逆に良かったというフィードバックもちょこちょこいただきましたw




ちなみにこちらはライブデモがうまくいかなかったとき用に用意しておいた動画:


f:id:shu223:20170306091242g:image

(try! Swiftの会場で撮ったもの)


実装について詳細を知りたい方は

MPSCNNについては記事をいろいろ書いてます。今回の実装に関係ありそうな話はこのへん。


デモ作成にあたって自分でも自分の記事を何度も見返しました。書いといて良かった。。


LTの難しさ

今回は5分しかないLT枠だったわけですが、「何を話さないか」はそれこそ開催前日ぐらいまで悩んでました。色んなものを泣く泣く削りました。

  • 自己紹介
    • せっかく日本中、世界中から700人ものSwift/iOSエンジニアが集まっているわけだから、自分をアピールしたい
    • が、発表の流れの中で不可欠なものではないのでカット
  • 弊社での事例紹介
    • うちの会社はそれこそiOS 10が出た直後にMPSCNNを利用した機能をリリース*1していて、それを紹介したい気持ちはあった
    • が、それをやると付随して説明することが増えてしまうのでカット
  • CNNとは何か、ディープラーニングとは何か
    • CNN、CNN言いまくってるし、タイトルにDeep Learningとあるので、説明しないわけにはいかない
    • この概念は短く説明しても「わかったような、わからないような」にしかならないし、今回の趣旨的にそこをハッキリ理解することは重要ではないので、思い切って"Something great"(何かすごいもの)っていう理解でいいです、ってことにした
  • 実装コードの紹介
    • ちゃんと実装した上で話してるし、try! "Swift"なのでコードは出したかった
    • CNNについての説明なしに、CNNを構築するコードを出しても「既にわかってる人にしかわからない」のでカット

どこかのカンファレンスのCfPに応募して完全版で発表したいなーと思ってます。


その他余談

CfPについて

今回のLTはCfP(Call for Proposal)によって選ばれたわけですが、競争率は7〜8倍あったそうです。


僕は自慢ではないのですが(自慢ですが)国内にしろ海外にしろCfPはほぼ毎回通ってまして、書く際に意識しているポイント等を下記トークの中で話したので、もしよろしければ見てみてください。


ちなみに、タイトルは"Client-Side Neural Network"の方が適切なのでは、という声もありましたが、それはその通りでそのタイトルも候補にはあったのですが、「キャッチーさ」を重視して現行のものにしました。


英語

海外から多くのスピーカー/聴講者が集まる本カンファレンスで、サンフランシスコで働いている僕が日本語で話しはじめてズッコケた人もいるんじゃないかと思うのですが、日本での開催だし、素晴らしい同時通訳もあるし、上述の通り直前まで発表内容がfixできずにいたし、デモはそれこそ当日まで作ってたし、というわけで、英語での発表は早々に諦めてました🙇🏻 *2


こうしてある程度割り切る判断ができるようになったのも前進だ、とか思ってましたが、やっぱり他の日本人スピーカーの方々が堂々とした英語でプレゼンしてるのを見て心に響くものがあったのも事実。来年またチャンスがあればがんばりたいと思います。


弊社チームメンバーとの思い出

うちの会社から僕を含めて4人、try! Swiftに参加してました。


f:id:shu223:20170306091906j:image:w600

(開催前日、全員集合。渋谷dots.さんにて。この後Ninjaレストランへ)


f:id:shu223:20170306092016j:image:w600

(配布バッグに入れてもらったチラシ)


3人はサンフランシスコから、1人はブラジルからの参加で、そのブラジルの彼は動画ミーティングではずっと顔を合わせていたものの、直接会うのは初めてだったので、感慨深いものがありました。


f:id:shu223:20170306092106j:image:w600

(ロボットレストランからのゴールデン街)


チームで長い時間を一緒に過ごせたのも開発合宿的で良かったです。


try! Swiftの感想

セッション内容については、わりと、「デキる」人達からは、辛口の意見を聞きました。内容が浅い、とか。で、僕はどう思ったかというと、自分のトークの準備(主にデモの実装)をまだやってたのと、気持ちがフワフワしてたのとで、実はほとんど聞けてません。後ほど復習します。


が、来年もまたやって欲しいかというと、ぜひやってほしい派です。やっぱりこうして日本中・世界中からSwift/iOSエンジニアが集まって、一つの場・時間を共有するというのは代えがたい経験です。僕はWWDCに求めるものはセッションでもラボでもなく、iOSエンジニアのお祭り的な空気感だということに気付いてWWDCのチケットがなくても毎年SFに行くようになったのと同様に、try! Swiftもそういう価値があると思います。Swiftについての知見を得られる、ということ以外に、このカンファレンスが日本のSwift/iOSエンジニアコミュニティに与えている影響は相当あるんじゃないかと。


これだけの規模のカンファレンス、早朝の準備から夜のパーティが終わるまで、しかもそれが3日間と、主催・運営された皆様の労力は想像を絶するものかと思います。頭が下がるばかりです。素晴らしいカンファレンスを開催していただき、どうもありがとうございました!


*1:僕が実装したわけではない

*2:海外スピーカーの発表も、去年は「お、この人の英語は聴きやすいしちょっと同時通訳なしでがんばってみようかな」とかやってましたが、今年は最初からがっつり同時通訳レシーバーに頼りました


[レビュー]普通の机を昇降式スタンディングデスクにする(Loctek M1Bレビュー)

$
0
0

なんと、、、GitHub経由で海外から製品レビューの依頼が来ました。Loctekというブランドの、普通の机の上に置いて昇降式のスタンディングデスクのようにできる製品です。


f:id:shu223:20170309083211j:image:w600

(イメージ図)


以前『【サンフランシスコ・エンジニア生活】弊社のオフィス紹介』という記事に書いたのですが、僕が働いているFyusion社のオフィスは電動のスタンディングデスク完備でして、


f:id:shu223:20161110094833j:image:w600

(赤丸で囲んだボタンで昇降する)


これが非常に快適なので東京の自宅 *1 にも欲しい(※オフィスと自宅からのリモートワークが半々ぐらいの割合である)と思って検討したこともあるのですが、こういう電動式の自動昇降デスクは15万〜25万円が相場で、手が出しにくいなと思ってたのでした。


そんな折に表題の通り海外の会社から「GitHubであなたのことを知りました」「製品を送るからレビューしてくれない?」という打診があり *2

I konw you from Github and your work on programmes is really great!

I am here to ask if you could make a review for our sit-stand work station with your using experience.

We'll send you sample without any costs of you for your review.

普通の机が昇降式スタンディングデスクになるなんてまさに欲しかったものなので、二つ返事でOKしたのでした。



日本のAmazonでも取り扱っているので、普通にポチッと購入できます。




レビュー用には上記の「Loctek 座位・立位両用スタンディングデスク 高さ12段階調節付 27インチ ブラックM1B」の他に、「ロックテックLoctek フルモーションガス圧式モニターアーム USB3.0ポート付き 10-30インチ対応 D8」も送ってくれました。



使ってみました

まず、普段の自宅での作業机はこんな感じです。


f:id:shu223:20170309062041j:image:w600


外部モニタは昔から使ってないのと、メイン機がラップトップ(Macbook Pro)なのと、サンフランシスコのオフィス行ったりコワーキングスペース行ったり(フリーランス時代は)お客さんとこ行ったりで基本的には作業道具は全部持ち歩くので、机に常設されてるものは電気スタンドと電源タップぐらいです。



そこに「M1B」と「D8」が届きました。


f:id:shu223:20170309062158j:image:w600


どーーーーん、という感じです。Loctek社のスタンディングデスクはサイズがS(M1B/M1W)、M(M2B/M2W)とあり小さい方を選んだのですが、箱だけ見ると相当な威圧感。。



箱から取り出して置いてみました。組み立てはほとんどありません。*3


f:id:shu223:20170309064817j:image:w600


サイズ的にはちょうど良い気がします。重みがある代わりに安定感があります。




横にあるレバーでガス圧(普通のオフィスチェアの昇降と同じしくみ)で昇降できます。


f:id:shu223:20170309064920j:image:w400


シューッと気持ちよく、力もいらず簡単に上がります。


f:id:shu223:20170309065450j:image:w600


高さ12段階ということで、ちょうどいい高さに調整できます(写真は中間ぐらい)。やはりランチ後の眠くなる時間帯はスタンディングにできると便利です。



金属製で質感の安っぽさは全然なく、角を取った丸みを帯びたデザインなので角が身体に当たって痛いとかもなくてなかなか快適です。


f:id:shu223:20170309065059j:image:w600



モニターアームD8はモニター側がまだ準備できてなくて *4 のですが、このM1Bの天板はモニターアームを取り付けられるようになっているようです。


f:id:shu223:20170309084047j:image:w400


まとめ

普通の机を昇降式スタンディングデスクにするM1B / M1W、ガス圧式でしっかりつくられてる感があり、素材的にもデザイン的にも高級感があり、そのわりにお値段は電動昇降デスクとくらべて遥かにリーズナブル(2017年3月現在、Amazonで29,800円)なので、電動昇降デスクを買うのはハードルが高いけど既存の机を昇降式にしたい、という方はぜひご検討いただくといいんじゃないでしょうか。



そのデスクに取り付けられるモニターアームもどうぞ。



*1:自宅といっても40平米未満の賃貸アパートです

*2:typoありますが原文ママ

*3:キーボードを置く台を取り付けられますが、僕は外部キーボード使ってないので取り付けず。

*4:買ったけど取り付けアタッチメントがまだ届いてない

[参考書籍][iOS][Swift]【書評】iPhoneアプリ開発講座 はじめてのSwift

$
0
0

現在の最新開発環境である Xcode 8、Swift 3 対応のiOSアプリ開発入門書iPhoneアプリ開発講座 はじめてのSwift』を、著者の諏訪様・出版社のSBクリエイティブ様よりご恵贈いただきました。


f:id:shu223:20170320135355j:image:w400



昨年12月に発売されたばかりで、Amazonで購入できます。Kindle版もあります。


iPhoneアプリ開発講座 はじめてのSwift
諏訪 悠紀
SBクリエイティブ
売り上げランキング: 45,845

他の入門書との違い

iOSアプリ開発の入門書は数多出ているわけですが、本書の特長としては、表紙にも、[著者の諏訪様による紹介記事](http://dev.classmethod.jp/smartphone/iphone/wrote-swift-book/)にも

何がわからないか? に対して真摯に向き合い、熟考し、執筆しました。

とある通り、解説がめちゃくちゃ丁寧です。


たとえば、iPhoneアプリ開発を行うためには、プログラミング言語であるSwiftを学ぶ必要があるわけですが、その前段階として、

  • 「プログラムとは」
  • 「プログラミング言語とは」
  • 「コンピュータがプログラムを理解する仕組み」
  • 「iPhoneアプリ開発のためのプログラミング言語『Swift』」

と、Swiftを学ぶ理由に至るまでを順を追って、実に丁寧に説明してくれます。



そしてなんとも図表/イラストが豊富


f:id:shu223:20170320142011j:image:w600

(この丁寧さ、「読者を絶対に突き放さないぞ!」という著者様の意志を感じます)


オールカラーで、ほぼ全ページに図が入っています。



あと素晴らしいと思ったのがこういうところ。


f:id:shu223:20170320143135j:image:w600


ソースコードについての解説、普通の技術書では、インラインのコメントで済ませちゃうと思うんですよ。こういう感じで。

// Carクラスをインスタンス化し、プロパティに値を代入する
let car = Car()
car.mileage = 200
car.usedFuel = 10

// FuelEfficiencyプロトコルに準拠したインスタンスとして扱う
・・・(ソースコード省略)

それを上の写真にあるような感じで全編でソースコードの要点を図っぽく示しているところ、これは実に手間暇かかってるなーと。



そして、筆者の諏訪さんは超有名なクラスメソッド社の技術ブログで非常に多くの投稿(累計406投稿!)をされている方なので、文章が非常に読みやすいです。


Amazonのレビューにもこう書かれていました。

外国人の私でもす一回でわかるぐらいのやさしい日本語で書いています。とてもわかりやすいです、プログラミング経験ゼロの方にオススメです。


目次

  • CHAPTER01 プログラミングの基礎知識
  • CHAPTER02 プログラミングを始めるための準備
  • CHAPTER03 Swiftの基本的な文法
  • CHAPTER04 Swiftとオブジェクト指向プログラミング
  • CHAPTER05 Swiftの発展的な文法
  • CHAPTER06 iOSアプリ開発入門
  • CHAPTER07 iOSアプリ開発レシピ
    • Recipe01 電卓アプリ
    • Recipe02 タイマーアプリ
    • Recipe03 マップアプリ
    • Recipe04 図鑑アプリ
    • Recipe05 写真ビューアアプリ

それぞれの詳細については、著者様ご自身による解説記事に詳しいです。


まとめ

最新の Xcode 8 / Swift 3 対応のiOSアプリ開発入門書「iPhoneアプリ開発講座 はじめてのSwift」を紹介させていただきました。気になる方はぜひAmazonの「なか見!検索」で試し読みしてみたり書店でチェックしたりしてみてください!


iPhoneアプリ開発講座 はじめてのSwift
諏訪 悠紀
SBクリエイティブ
売り上げランキング: 45,845

[書籍][電子工作][Arduino][IoT]【書評】Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ

$
0
0

著者の小林 茂 先生、およびオライリー・ジャパン社より『Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ』をご恵贈いただきました。


f:id:shu223:20170402111539j:image:w600


Arduinoを使ったチュートリアル・レシピをまとめたクックブックで、約7年前に刊行された同名の書籍の大幅改訂版です。2017年1月に刊行されたばかりで、Amazonで購入できます。


Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ (Make: PROJECTS)
小林 茂
オライリージャパン
売り上げランキング: 32,308

Kindle版はないようですが、オライリーの公式サイトにて電子版を購入することもできます。


書籍の概要 / 目次

本書はタイトルに「プロトタイピング」とある通り、ハードウェアで何かつくりたいものが浮かんだときに、Arduino & Processing でサクッとつくってみようという考え方の実践手法を紹介する本です。


なので、◯◯(プロダクト名)みたいなものをつくってみよう、みたいな話ではなくて、互いに組み合わせて再利用しやすいレシピをメインに構成されています。

  • 入力
    • レシピ 1:自然光の明るさを測りたい
    • レシピ 2:距離を測りたい(赤外線センサ)
    • レシピ 3:距離を測りたい(超音波センサ)
    • レシピ 4:振動を測りたい
    • レシピ 5:直線上の位置を測りたい
    • レシピ 6:圧力を測りたい
    • レシピ 7:曲がり具合を測りたい
    • レシピ 8:温度を測りたい
    • レシピ 9:傾きを測りたい
    • レシピ 10:動きを検出したい
    • レシピ 11:方位角を測りたい
    • レシピ 12:人が動いたことを検知したい
    • レシピ 13:何かがタッチしたことを検出したい
    • レシピ 14:タッチパネルを使いたい
  • 出力
    • レシピ 15:光をコントロールしたい
    • レシピ 16:モノを叩いて音を出したい
    • レシピ 17:モノを振動させたい
    • レシピ 18:モノを動かしたい(角度を変える)
    • レシピ 19:DCモータをコントロールしたい
    • レシピ 20:DCモータをコントロールしたい(センサによるコントロール付き)
    • レシピ 21:小型のディスプレイで情報を提示したい
    • レシピ 22:AC100V機器のオンオフをコントロールしたい
    • レシピ 23:サウンドを再生したい
  • データ処理
    • レシピ 24:入力から不要な変動を取り除きたい
    • レシピ 25:アナログ入力をデジタル的にいくつかの範囲に分割したい
    • レシピ 26:ある状態になった後、一定時間が経過してから処理を行いたい
    • レシピ 27:環境ごとにセンサの値をキャリブレーションしたい
    • レシピ 28:ある状態になった瞬間に処理を行い、その後一定時間の変化を無視したい
    • レシピ 29:複数の入力がある状態にマッチしたかどうか判断したい
    • レシピ 30:時間変化を伴う入力があるパターンにマッチしたかどうかを判断したい
    • レシピ 31:状態遷移をわかりやすく記述したい
  • ネットワーク接続
    • レシピ 32:スマートフォンと無線で接続したい
    • レシピ 33:ローカルなトリガによりネットワーク上でアクションを起こしたい
    • レシピ 34:ネットワーク上のトリガによりローカルでアクションを起こしたい

そんなわけで、ひとつひとつのレシピを順番にやっていくという読み方よりも(それもいいと思いますが)、何かつくりたいものを頭に思い浮かべつつ、その要素技術となるレシピをピックアップして読んでいく、という読み方ができるようになっています。


もちろん、レシピを紹介するクックブックパートの前には、ArduinoやProcessingの開発環境のセットアップから、

  • Arduino IDEのセットアップ
    • Arduinoについて
    • ドライバのインストール
    • Arduino IDEの起動と動作確認
  • Processing IDEのセットアップ
    • Processingについて
    • ProcessingでArduinoボードと通信するための準備

(2章:開発環境を整える)


電子回路の基礎(それこそオームの法則から)、揃えておくと便利な電子部品や工具の紹介、

  • 電子回路の基礎知識
    • 電圧〜電流〜抵抗
    • オームの法則
  • 実際に回路を組んでみよう
    • ブレッドボードとジャンパワイヤ
    • 主な電子部品について
    • 実際に回路を組んでみよう
    • オームの法則、ふたたび
    • スイッチで LEDをオン/オフする
  • 自分のツールボックスを整備しよう
    • そろえておくと便利な電子部品
    • そろえておくと便利な工具
    • ブレッドボード以外で利用できるモジュールについて
    • センサ用ケーブルの作り方

(3章:電子回路の基礎と最初の一歩)


そしてArduinoの基本的なチュートリアルがあります。

  • Arduinoの基礎知識
    • スケッチの基本的な構造とデジタル出力
    • PWMによるアナログ出力
    • デジタル入力
    • アナログ入力
    • Arduinoボードに LCDを接続する
    • LCDを自分でシールド化する
  • Arduino+PCで使う
    • Processingの場合
    • Arduino IDEを拡張する
    • ライブラリを追加する
    • ボードを追加する

(4章:Arduinoチュートリアル)


また本書の冒頭にArduinoでプロトタイピングを行うことでどのような実際のプロダクトがつくられたか、という作品紹介パートがあり、実際に各作品においてArduinoや3Dプリンタを利用したプロトタイピングの過程が紹介されていて、こんなものがつくれてしまうのか、と読んでいるだけでワクワクさせてくれます。

  • Orphe(株式会社 no new folk studio)
  • BOCCO(ユカイ工学株式会社)
  • MESH(ソニー株式会社 MESHプロジェクト)
  • 光枡(光枡プロジェクト)
  • 形骸化する言語(菅野創、やんツー)
  • METCALFシリーズ(きゅんくん)
  • NO SALT RESTAURANT(NO SALT RESTAURANT制作委員会、 aircord)
  • IRKit(大塚雅和)
  • HACKberry(イクシー株式会社)
  • ベゼリー(チームベゼリー)

f:id:shu223:20170402121827j:image:h600

(Sonyの「MESH」もArduinoから始まった)



そして、本書全体的に言えることですが、二色刷り(一部カラー)で、きれいな図が多用されていて、わかりやすく、読みやすいです。


f:id:shu223:20170402125719j:image:w600

(本として美しいので、(電子も便利だけど)個人的には紙でずっと持っていたい)


第1版との違い

初版が出版された2010年5月から執筆時点で6年経過していたそうなので、状況は何もかもが変わっています。


個人的に所有している第1版と比べてみると、まず冒頭の「作品紹介」パートは全面的に刷新されています。第1版はメディアアート的な「作品」が100%を占めていたのに対し、第2版では「製品」(量産品)が数多く紹介されています。この6年の歳月が、「Arduinoを用いたプロトタイピング」という手法を確実に浸透させ、製品を世の中に送り出すようにまでなったんだなぁと思うと感慨深いものがあります。


また2010年5月というと、iOSはまだiPhone OS 3(iOSですらない)。Core Bluetoothが最初に入ったのがiOS 5なので、BLE(Bluetooth Low Energy)はまだ浸透するどころか規格がどうのこうのというフェーズだったかと思います。そんなわけで第2版では「BLEを利用してスマートフォンと無線通信」するサンプル(レシピ32)が今回追加されています。


またWi-Fiで無線通信してウェブサービス(myThings/IFTTT/Beebotte)と連携するサンプル(レシピ33と34)や、Raspberry PiやNode-RED、3Dプリンタを使用するプロトタイピングの実例を紹介する章(第9章)も、今回新たに追加されたものです。


その他にももちろんArduino/Processingのサンプルも現行バージョンに全面更新されていますし、Arduino IDEに追加された新機能の説明も追加されています。



個人的にやりたいこと

レシピの総まとめとして、『自律型 2輪ロボットをつくる』という実践の章があります。実際にアイデアをどうやってハードウェアのプロトタイプに昇華するかという具体例を示してくれる章です。


最近友人のiOSエンジニアが「強化学習」の勉強のためにそういうものをラズパイでつくっていて、

めっちゃ楽しそう、って思ってたので、これは是非やってみたいなぁと。


おわりに

Arduinoのチュートリアル・レシピをまとめたクックブック『Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ』をご紹介させていただきました。


パラパラと眺めていると「つくりたい」モチベーションがムクムクと湧いてくる本です。初心者にもわかりやすく書かれていますので、ハードウェアを絡めたものづくりに興味のある方はぜひ一度手にとってみてはいかがでしょうか。


Prototyping Lab 第2版 ―「作りながら考える」ためのArduino実践レシピ (Make: PROJECTS)
小林 茂
オライリージャパン
売り上げランキング: 32,308

関連記事


[書籍][Swift]Swiftの各機能が「なぜ」存在し「いつ」使うべきかを解説した技術書 - Swift実践入門

$
0
0

著者の石川さん、西山さん、およびWEB+DB PRESS plus様より、『Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語』をご恵贈いただきました。


Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)
石川 洋資 西山 勇世
技術評論社
売り上げランキング: 5,087

今年の2月に出版されたばかりですが、観測範囲では「Swift実践入門輪読会」「Swift実践入門読書勉強会」といった会も開催されていて、もう世間ではすっかり教科書のような定番の良書として認知されている感があります。


他のSwift本との違い / Appleの公式ドキュメントで十分?

Swiftについて書かれた技術書は既に数多出ています。入門本はたぶんそれだけで本屋のコーナーができるほど出てますし、リファレンス本や逆引き辞典のような書籍もあります。また、Appleの公式ドキュメントも相当丁寧に、サンプル付きでわかりやすく書かれています。


そんな中、本書の存在意義は何かというと...前書きでグッと来た一説を引用します。


Appleの公式ドキュメントをはじめとして、どんな(what)言語仕様があり、それらをどのように(how)使うかに関しては豊富な情報源があります。しかし、それらがなぜ(why)存在し、いつ(when)使うべきかについてまとまった情報源があるとは言えません。本書は、読者のみなさんの「なぜ」や「いつ」を解消することにも主眼を置いています。


そうそう、そうなんですよね。多くのプログラミング言語の解説本って、「なぜそれを知らないといけないのか」「これを知っておくとどういう場面で役に立つのか」かについて述べられてないことが多いんですよ。


その点、本書は前書きにある通り、各章の冒頭で「これを知っておくと開発現場のどういう場面でどう嬉しいのか」ということがシンプルな具体例でわかりやすく書かれています。



たとえば、本書の第8章、「ジェネリクス」の章の冒頭文では、

ジェネリクスとは、型をパラメータとして受け取ることで汎用的なプログラムを記述するための機能です。

とあります。よくある言語の本って、解説これだけで終わっちゃって、さっさと使い方の解説に行ってしまうと思うんですよ。


他言語でジェネリクスという概念に既に触れてたり、C++のテンプレートとかを知っている人にとってはこれだけで「はいはい、あれね」ってなると思うんですが、僕みたいにSwift以前はほぼObjective-Cしか書いたことない人間からすると、「文章としては理解できるけど・・・『型をパラメータとして受け取ることで汎用的なプログラムを記述できる』から何・・・?」ってなっちゃうわけでして。。


ところが本書の場合はこの章の最初に、まずはジェネリクスを使用「しない」例をサンプルコード付きで示したうえで、それがジェネリクスを利用するとどうなるか、というbefore / afterを示してくれています。しっかりジェネリクスを学ぶモチベーションを喚起されてから使い方の解説に進める、というわけです。


目次 / 個人的な読み方

本書の目次は大見出し、中見出し、小見出しとかなり詳細に区分けされているのですが、長くなってしまうのでここでは各章のタイトルだけ紹介します。

  • 第1章 Swiftはどのような言語か
  • 第2章 変数、定数と基本的な型
  • 第3章 制御構文
  • 第4章 関数とクロージャ
  • 第5章 型の構成要素 ── プロパティ、イニシャライザ、メソッド
  • 第6章 型の種類 ── 構造体、クラス、列挙型
  • 第7章 プロトコル ── 型のインタフェースの定義
  • 第8章 ジェネリクス ── 汎用的な関数と型
  • 第9章 モジュール ── 配布可能なプログラムの単位
  • 第10章 型の設計指針
  • 第11章 イベント通知
  • 第12章 非同期処理
  • 第13章 エラー処理
  • 第14章 実践的なSwiftアプリケーション ── Web APIクライアントを作ろう
  • 第15章 SwiftからObjective-Cを利用する

詳細な目次は公式ページで確認できます。


著者の一人がAPIKit作者の石川氏なので、第14章から読む人も多いようです。



個人的には、

  • パラパラとめくりつつ「この機能は知らないな」「このへんちゃんとわかってないな」というところを見つけたらその項の「why」や「when」にあたる解説を読む
  • 興味がわけば詳しく解説を読む

という感じで読み進めていきました。


その他

Swiftがバージョンアップしたら?

Swiftは(これまでのところは)毎年のようにメジャーアップデートされていて、まだまだ変化の激しい言語です。本書は現行の Swift 3 ベースに解説されたものですが、2017年秋には Swift 4 がリリースされる見込み。そうなると、本書の内容は古くなってしまいうのでしょうか?


私は依然として価値を持ち続けると思います。言語仕様が少々変わっても、それは表面的な書き方(how)の変更であったり、できること(what)が増えたりといった公式ドキュメントでも補完できる部分であり、各機能がなぜ存在するのか(why)、いつ使うべきか(when)といった核となる考え方自体は変わらないはずであり、本書はその「Swiftの核となる考え方」について解説したものだからです。


Swiftは気になるけどiOSには興味がないんだけど・・・

本書のサンプル/解説ではUIKit等のiOSやmacOSに依存するフレームワークやそのAPIは出てこず、基本的にはSwiftの標準機能とFoundationのようなコアライブラリだけを用いて解説されています。


僕はiOSの人間なのでiOSベースで書かれていたとしても全然嬉しいのですが、最近は「iOSには興味がないけど、Swiftでサーバーサイドを書くことには興味がある」という声も聞くので、そういった方にも本書はいいのでは、と思います。


まとめ

以上の紹介でピンと来た方はぜひ手にとってみてください。個人的には超勉強になりました。


Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)
石川 洋資 西山 勇世
技術評論社
売り上げランキング: 5,087

Kindle版はありませんが、Gihyo Digital Publishingで電子版(EPUB/PDF)を購入できるようです。


f:id:shu223:20170512071222j:image:w540

(著者の一人、ishkawa氏にサインをいただきました)


[海外][働き方]「あきらめ」からはじめる英会話 #clem_jp

$
0
0

英語を勉強しているエンジニアやデザイナーのためのミートアップ「CLEM」というのがありまして、本日その第5.2回(5月の2回め?)でLTをしてきました。


昨年10月からサンフランシスコの会社でエンジニアとして働き始めたのですが、


英語が話せるから入ったのではなく、英語に猛烈な苦手意識があり、いろんな勉強もしてきたが続かないので、もう「英語を使わざるを得ない環境」に飛び込むしかない、というのが入社を決めた理由のひとつです。


「そうは言っても話せるんでしょー」という思う人は、この録音を聞いてみてください。


(音声、後ほど貼ります)


※これは会社の人と話してるのではなく、そのちょっと前に「ハッカーパラダイス」というコミュニティに参加した際のスカイプ面談です。


こんな程度の英語力なので、当然英語でのコミュニケーションには恐怖すらありました。会話する機会があっても(「早くこの場から逃げ出したい」)といつも思ってました。


で、そんな僕ですが、いくつかのことを「あきらめる」ことで英会話においてブレークスルーがあったと自分の経験から感じることがあったので、それについて同ミートアップでシェアさせていただきました。



具体的な「あきらめTips」を紹介していますが、要点としては「あきらめることで、挑戦のハードルを下げる」というところです。僕はこれで何年もこじらせた英語への苦手意識からやっと前に進めた感がありました。


どなたかのお役に立てば幸いです!


関連記事


Viewing all 317 articles
Browse latest View live