その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

移転しました

これまで書いていた「Over&Out その後」から移転しました。

d.hatena.ne.jp

さらにその前身として、「Over&Out」というブログがあり、2010年のキャリアの節目をもって「〜その後」に移行したのですが、そちらももう7年も書いてきて、はてなダイアリーも「ネット界の限界集落」なんて言われたりして、そろそろはてなブログに移行しようかなと思っていたのと、ちょうどいま、また自分のキャリアの節目感がある(後で記事を書きます)ので、移転に踏み切りました。

過去記事をインポートすることも考えたのですが、リフレッシュしたかったのと、古い記事が古い場所にそのままあるのもいいかなと思いまして、とりあえずそのままにしておきました。

前身ブログの主な記事

とはいえキャリアのこととか、考え方とか、そういうものは地続きなので、こちらにいくつか主な記事のリンクを貼っておきます。

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

3D写真の機能をアプリに組み込める「Fyuse SDK」の使い方


Fyuse SDKを使うと、3D写真(=Fyuse)を撮る/見る機能をアプリに組み込むことができます。



本記事ではそんなSDKの使いどころや組み込み方法について紹介してみたいと思います。 ※念のため、このFyuseおよびFyuse SDKは、僕が所属しているFyusion社のプロダクトです。


ちなみに僕はiOSエンジニアなのでiOSの実装を紹介しますが、我々のSDKはiOS, Android, Webをサポートしています。

Fyuseとは

我々の3D写真フォーマット「Fyuse」は、静止画とも動画ともポリゴンベースの3Dモデルとも違うものです。App Storeにある同名のアプリでどんな感じかお試しいただくことができます。



例として、僕はこんな場面でFyuseを撮ってます。※はてなダイアリーの制約で、ビューアを埋め込むことができなかったので、アニメーションGIFに変換して載せています。ぜひリンクから、Fyuseビューワで見てみてください。

(とある街の道端にあった牛の像)


普通の写真だと、片面だけとか、前からだけになりますが、Fyuseでは立体物をマルチアングルで記録できます。



Fyuseアプリのタイムラインを見ていると、

  • 人(ファッション・コスプレ)
  • 像、彫刻、フィギュア、プラモデル
  • 壮大な景色

あたりはFyuseフォーマットが非常にマッチするなぁと思います。僕は普通に記録フォーマットのいち選択肢として日常使いしてます。

SDK導入事例

モノをいろんな角度から見れる、というところからEC系とは非常に相性が良く、車業界、ファッション業界、大手総合ECサイト等ですでにご愛顧いただいてます。


公開OKを確認できた国内事例ですと、"d fashion"さんの360°アングルでのコーディネート紹介ページがあります。


また中古車販売のガリバーさんにご利用いただいております。


「車」向けのFyuseについては会社のサイトでも詳しく紹介されてるのでぜひ見てみてください。

SDKの使い方:Fyuseを「撮影する」機能を組み込む

Fyuseを撮影する機能の実装は、Fyuse用のカメラを起動する → 撮影を開始する → 保存する という流れになります。

カメラの起動

1. `FYCamera`オブジェクトを作成する

private let camera = FYCamera()


2. `prepare`して、`startPreview`する

camera.prepare()
camera.startPreview(with: previewLayer)

`startPreview`には`AVCaptureVideoPreviewLayer`オブジェクトを渡します。

これでFyuse撮影準備完了です。

撮影開始/停止

それぞれメソッドを1つ呼ぶだけです。

camera.startRecording()
camera.stopRecording()
保存

撮影したFyuseをローカルに保存するにあたって、まずは撮影の完了イベントを受けるために`FYCaptureEventListener`プロトコルへの準拠を宣言しておき、

class ViewController: UIViewController, FYCaptureEventListener

FYCameraのリスナーとして追加しておきます。

camera.add(self)


すると、撮影中・完了時・失敗時に`fyuseCamera(_:captureEvent:)`が呼ばれるようになります。

func fyuseCamera(_ camera: FYCamera, captureEvent event: FYCaptureEvent) {
    switch event.captureStatus {
    case .inProgress:
        // 撮影中
    case .completed:
        // 撮影完了
    case .failed:
        // 撮影失敗
    }
}


ここで、保存する際には内部的に様々な処理を行うため、それらを非同期で実行するクラス`FYProcessingQueue()`を使用します。

private let processingQueue = FYProcessingQueue()!
processingQueue.processEntry(path) { 
    print("Fyuse is saved at \(path)")
}

これで撮影機能は完成。


SDKの使い方:Fyuseを「見る」機能を組み込む

基本的にはたったの2ステップ

  • 1. FYFyuseViewオブジェクトを作成する
@IBOutlet private weak var fyuseView: FYFyuseView!

ちなみにIBを使用せず次のようにコードから初期化してaddSubviewしてもokです。

private let fyuseView = FYFyuseView()
  • 2. 表示したいFyuseを`FYFyuse`オブジェクトとして1に渡す

`FYFyuse`オブジェクトは、先ほど`FYProcessingQueue()`で処理・保存した際に取得したパスを渡して初期化します。

fyuseView.fyuse = FYFyuse(filePath: path)

これだけです。

先ほど撮ったFyuseがインタラクティブに閲覧できるようになります。


More

基本機能の実装方法を解説しましたが、Fyuseは「撮る」「見る」だけでなくいろいろと機能を持ってまして、たとえば以下のようなものがあります。

Visual Search

3Dベースのディープラーニングを用いた物体検索

Car Mode

車をあらゆる角度からオンデバイスで認識し、きれいに車のFyuseを取れるようにする

Tagging

Fyuse同士をタグ付けで関連付けられる。

  • 車全体のFyuseのタイヤ部分に、タイヤにフォーカスして撮ったFyuseを関連付けたり

VR, AR & MR-ready

Fyuseで撮った人物や車等をVR/AR/MR環境にエクスポート可能


(Fyuseの人物の背景を変え、エフェクトを載せるデモ)

Infinite Smoothness

空間内におけるフレーム間を動的に補完してスムーズに表示

  • この技術のおかげでファイルサイズは〜5MBと、非常に小さく済む

お問い合わせください

Fyuse SDKをサイトからダウンロードできるようにするのはまだ準備中です。気になった方はぜひお問い合わせください。

お問合わせは日本語でも可です。


ちなみに、今月(2018年2月)はエンジニアリングのトップと、ビジネスデベロップメント/マーケティングのトップが日本に行くので、直接ミーティングできると話も早いと思います。ぜひぜひこの機会に!


2017年の反省


ふりかえり的なことは先月に書いたのですが、

実際のところこの記事は上澄みだけすくい取ったようなもので、ここには書いていない反省や葛藤がたくさんあります。


いま12月31日ですが、その葛藤はいまも現在進行系で自分の中にあるなーという気がするので、やはり2017年の振り返りというか主に反省を書いておきたいと思います。

反省1: アウトプットが減った

技術記事をあまり書かなかった

自分のブログ(これ)はほとんど「◯◯しました」系の自己PR記事だけになり、Qiitaでも(この12月のアドベントカレンダーの時期を除き)ほとんど記事を書いていませんでした


フリーランス時代は仕事を減らしてでも勉強時間を確保し、勉強したことをアウトプットしていましたが、会社員になると週5日が自動的に埋まってしまいますし、発信することへの意識もだいぶ下がってしまった*1感があります。

iOS 11 Samplerを出さなかった

iOS 7のころから4年続けていたiOS Samplerシリーズ、今年はついにサボってしまいました。


例年8月ぐらいから始めて、そこそこ時間をかけて実装して、9月の正式リリースに合わせて公開、というスケジュール感なのですが、今年のその時期はiOS 11 Programmingの執筆で手一杯で、まったく無理でした。


せめてもの足掻きとして(成果物の横展開的な発想で)ARKit-Samplerを公開しましたが、それもサンプル数がちょっとしかなく、追加更新もできず、例年とは大違いです。*2


iOS Samplerはそもそも「自分で新APIを使ってみて、どんなもんか把握しておく」という目的で始めたもので、今年はiOS 11 Samplerをつくってないので、iOS 11の新機能があまり(実感として)把握できてないという普通に宜しくない状況です。

反省2: 「自分にとって唯一の技術スタック」で遅れをとってきている

「最近のiOS開発」がキャッチアップできてない

会社ではSwift書いてませんし、新しい技術の勉強としても、機械学習とかMetalとか3Dまわりをやってたので、

こういうあたりが全然キャッチアップできてません。ずっとiOSしかやってないエンジニアが、そのiOSでもメインストリームから遅れをとっている感。焦りがあります。

アプリ開発に対して腰が重くなった

ちょっと前までは、「iOSアプリをゼロから実装して、申請して、ストアに出す」という一連の流れは「簡単」という感覚だった気がするのですが、今ではすっかり腰が重くなり、既存アプリをアップデートするにしても、非常に大変な作業のように感じてしまいます。


経験を積んで作業の見通しがより正確にできるようになった(ので、大変に感じる)という面もあるかもしれませんが、割り切りが下手になった、頭でっかちになってしまった、という面が大きいように思います。


また、前述した、最近のベストプラクティスについてキャッチアップできてない、というところもあると思います。


自分はそもそもアイデアを形にするところが楽しくてiOSをやってきたので、アプリ開発へのフットワークの軽さは取り戻したいところです。

反省3: アメリカで働いてるのに、アメリカで勝負してない

僕は元来保守的で、不安やプレッシャーを過度に抱えたくないので、1つの重要なチャレンジをしているときは他のチャレンジは諦めてよい、と自分を赦すところがあります。


で、2017年は

  • 今は英語よりも新しい技術(Metalや機械学習)を勉強するのが重要
  • いまはとにかく本の執筆(iOS 11 Programming)が最重要

みたいな状況が続き、英語とか、アメリカ社会にあまりまともに向き合っていない1年でした。


具体的には、

  • 会社が健康保険も負担してくれてるのに、なんだかよくわからないし調べるのも面倒だから日本に帰ったときに病院行こう
  • そろそろクレジットヒストリーがたまって条件の良いカードをつくれそうだけど調べるのが面倒だから最初につくった日系企業のカードをずっと使ってる

とか、諸々そういう話。


あと、こうして日本語での発信を続けているのもそうだし、未だに会議で全然みんなが何言ってるのかわからない程度の英語力を放置しているのもそう。


同じ時期にサンフランシスコの会社に就職し、グリーンカード取得を見据えて働いている友人等を見ていると、しっかりアメリカと向き合って暮らしているな、と思います。「海外で暮らす」ということに伴う様々な困難に対して、彼らはしっかり向き合い、乗り越えている。僕はただ避けているだけ。せっかく海外で働いているのに、これでは世界が広がっていかない

総括

2017年の反省点をつらつらと書きました。単純に心構えや時間の使い方を改善するだけで対策できそうなところもありますが、これらの根底には、会社員とフリーランス、アメリカと日本、というところでの自分の中での葛藤、あるいは切り替えの中途半端さがあるように思います。そういうフワフワしたところのせいで、この1年の4分の3ぐらいは有意義だったものの、残り4分の1ぐらいはなんだか中途半端に過ごしてしまったような。2018年はこのへんの問題にちゃんと向き合い、優先度をしっかりもって行動したい所存です。


*1:仕事の依頼が来ても基本的には受けられないので。

*2:iOS Samplerシリーズは、だいたい公開時からサンプル数が20前後ありますが、それはたまたまではなくて、意識してそこまで持っていってます。(数の)驚きがないと、広がっていかないので。

「iOS 11 Programming」を共著で執筆しました/本書のおすすめポイント

昨日、共著で執筆したiOSの技術書「iOS 11 Programming」の販売が開始されました!


iOS 11 Programming

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川克己,所 友太,永野 哲久,加藤 寛人,
  • 発行日:2017年11月16日
  • 対応フォーマット:製本版,PDF
  • PEAKSで購入する


私は ARKit と Metal の章の執筆を担当しました。


7月頭のクラウドファンディング成立を機に執筆を開始し、脱稿まで約4ヶ月。技術書の執筆期間としては長くはないですが、がんばりました。基本的に週末はほぼ執筆、有休は使い果たしましたし、どこかに出かけてもずっと執筆してました。


(こういう箱に入って届きます。装丁カッコイイです)


本記事では自分の担当章を中心に、「iOS 11 Programming」を紹介させていただきます。

第2章: ARKit

ARKitは、ちょっと試すだけなら超簡単です。APIはシンプルだし、Xcodeのテンプレートからサクッと動くものがつくれます。


しかしまた、ものすごく奥深くもあります。レンダリングはSceneKitやMetalと組み合わせられるので、これだけで3Dプログラミングのほぼあらゆるテクニックが使えるということになりますし、カメラからの生の入力データ`CVPixelBuffer`にもアクセスできるので、Core Image, Core ML, Vision, OpenCV, GPUImage, etc…と組み合わせて、シーケンシャルな画像を入力とするあらゆるテクニックを駆使できるということにもなります。ARKitが検出している特徴点データにもアクセスできます。


そんな手軽さも奥深さも兼ね備えるARKit、ネット上ではiOS 11の正式リリースを待たずして多くのデモが公開され、開発者の間だけではなく一般ユーザーの間でも話題になっていました。


(ARKitで巻尺のように実寸を測るデモ動画)


本章では、そういったARKitの「超簡単な導入」から始めて、最終的にはネットで話題になっていたようなアイデアを実装できるようになるところまでをカバーするように構成しました。

  • 2.1 はじめに
  • 2.2 ARKit入門その1 - 最小実装で体験してみる
  • 2.3 ARKit入門その2 - 水平面を検出する
  • 2.4 ARKit入門その3 - 検出した水平面に仮想オブジェクトを置く
  • 2.5 ARKit開発に必須の機能
  • 2.6 特徴点(Feature Points)を利用する
  • 2.7 AR空間におけるインタラクションを実現する
  • 2.8 アプリケーション実装例1: 現実空間の長さを測る
  • 2.9 アプリケーション実装例2: 空中に絵や文字を描く
  • 2.10 アプリケーション実装例3: Core ML + Vision + ARKit
  • 2.11 Metal + ARKit


最初の「ARKit入門」では、はじめの一歩として、最小実装でARKitを体験します。実にシンプルな実装で強力なAR機能が利用できることを実感していただけることでしょう。


その後は平面を検出する方法、その平面に仮想オブジェクトを設置する方法、そしてその仮想オブジェクトとインタラクションできるようにする方法…と、読み進めるにつれて「作りながら」引き出しが増えていき、最終的にはARKitを用いた巻尺(メジャー)や、空間に絵や文字を描くといったアプリケーションの実装ができるようになっています。


(本章で作成するサンプル)



ARKitのAPIはシンプルとはいえ、リファレンスだけから実装方法を汲み取るのは難しい部分もあります。またAppleのサンプルは動かして試してみたり、ちょっと改変してみたりして用いる分にはいいですが、実装内容は結構複雑で初心者には意図がわかりにくいものになっている面があります。

  • ARKitには興味があるけどなかなか手を動かせていない
  • 公式サンプルを動かしただけで止まっている
  • どこから始めていいかわからない

といった方には、本章は合っているかなと思います。



一部だけですが、PEASKの本書のページサンプルPDFを読めるので、気になった方はぜひ試し読みを。

第13章: Metal

クラウドファンディング当初は「Metal 2」と題されており、iOS 11のMetalの新機能の紹介を中心とするような章タイトルでしたが、そもそもほとんどのiOSエンジニアがMetalのAPIを自分でたたいて何かを書いたことがないであろう中で新機能についても仕方がないのでは・・・と考え、がっつりMetalの基礎から書きました。

  • 13.1 はじめに
  • 13.2 Metalの概要
  • 13.3 Metalの基礎
  • 13.4 MetalKit
  • 13.5 Metal入門その1 - 画像を描画する
  • 13.6 Metal入門その2 - シェーダを利用する
  • 13.7 Metal入門その3 - シェーダでテクスチャを描画する
  • 13.8 ARKit+Metalその1 - マテリアルをMetalで描画する
  • 13.9 ARKit+Metalその2 - MetalによるARKitのカスタムレンダリング
  • 13.10 Metal 2
  • 13.11 Metalを動作させるためのハードウェア要件

正直なところMetal 2の機能紹介は多くはありません。なので、従来のMetalについて熟知し、iOS 11での変更点を中心に知りたい方には物足りないかもしれません。


しかし2017年11月現在、Metalについての日本語でのまとまった情報はこれが唯一かと思います。そして、OpenGLやDirectXでGPUに近いレイヤでのグラフィックスプログラミングに親しんで「いない」人達にはMetalはかなりとっつきにくいと思うのですが、そういう方達にとってのわかりやすさにおいては英語の情報ソース含めても随一なのではないかなと勝手に自負しております。


なぜなら、他のMetalについての書籍はそういう方面での経験が豊富な著者が書いている一方で、本書の場合、そのあたりにほとんど知見がなく、四苦八苦しながら勉強した僕が書いたからです(胸を張って言うことではないですが)。「グラフィックスプログラミングの達人による解説」ではありませんが、同じ目線で苦労した人による「わからないところがわかる」解説にはなってるのではないかなと。



具体的には「Metalの基礎」「入門その1〜その3」。ここは、新しい事項が一気にブワーッと出てこないように、かなり苦労して解説する内容を精査し、順序を考えました。ブリットコマンドエンコーダから解説するMetalの書籍(記事も含め)はあんまりないんじゃないかなと。普通はレンダーコマンドエンコーダから始めることが多いのですが、シェーダを使うと「初心者にとってのおまじない」が爆発的に増えるのです。


そして、それでも「新しい概念」はたくさん出てくるので、本書ではそのへんを「なにをやっているのか」「なぜこの手順が必要なのか」ということがわかるように解説して、納得感を得ながら前に進められるようにしています。


(本書の執筆の真っ最中、iOSDC 2017にてMetalについて「興味ない人向けに」解説したときの動画です。『まったくMetalさわったことないけどわかった』という感想を多くいただきました)





PEASKの本書のページのサンプルPDFは他の章は基本的に冒頭2ページの公開となっていますが、Metalの章は僕個人の希望で5ページ読めるようにしていただいてます。Metalが気になる方はぜひ試し読みしてみてください。

全体のPR

ここから本書全体の話。まず、各執筆陣の素晴らしさと、その担当章の組み合わせの妙については以前に書いた記事をご参照ください。


各章のご紹介は著者様ご自身での記事にお任せしつつ、ここで僕が声を大にして言いたいことは、


本書はiOS 12, 13, 14...が登場しても価値を持ち続ける


ということです。


なぜかというと、多くの章で、他の書籍には載っていない、あるいはググってもまとまった情報は見つかりづらい内容について解説しているからです。

  • 第1章 iOS 11 概要
  • 第2章 ARKit
  • 第3章 Core ML
  • 第4章 Swift 4の新機能とアップデート
  • 第5章 Xcode 9 の新機能
  • 第6章 Drag and Drop
  • 第7章 FilesとDocument Based Application
  • 第8章 レイアウト関連の新機能及び変更点
  • 第9章 Core NFC
  • 第10章 PDF Kit
  • 第11章 SiriKit
  • 第12章 HomeKit入門とiOS 11のアップデート
  • 第13章 Metal
  • 第14章 Audio関連アップデート


たとえばHomeKitの章。長らく謎に包まれていたHomeKit、対応デバイスもなかなか登場しなかった当然それについて書かれた書籍もありませんでした。そしてポツポツとデバイスが出揃ってきた今、満を持しての所さんによる56ページに及ぶ入門〜実践の解説!他の章に用がなくてもHomeKitに興味がある人はこの本はずっと「買い」です。


岸川さんによるSiriKitの章も、以前からあるフレームワークでありつつ「動作のしくみ」から解説されていますし、僕の書いたMetalの章も新機能だけじゃなくて基礎から解説しています。


Core ML、Core NFC、PDF Kit、MusicKit、ARKitといった新フレームワーク、Drag and Drop等の新機能も、まとまった解説は現時点では(そして恐らく当面の間)本書でしか得られないのは同様でしょう*1


しかも、著書やカンファレンスでの講演に定評のある著者陣による執筆です。たまーに見かける、APIリファレンスを翻訳しただけのような、あるいはさわりをちょろっと解説しただけみたいな章はひとつもありません。それぞれが興味深く読めて、ちゃんと頭に入ってきて、実際の現場で役立つように各著者によって噛み砕かれ、再構成されています。


ひさびさに出た「非入門者向け」の「iOS SDK解説書」*2にして、かなりの良書では、と思います。


謝辞

ARKit、Metalの章ともに、同僚登本さんにチェックしていただきました。というかそもそも(ARKitで大いに必要となる)3Dプログラミングの基礎は彼から教えてもらいました。またMetalの章は後藤氏にもチェックしていただきました。Metalのレビューをお願いできる人はなかなかいないので非常に助かりました。改めてお礼を申し上げます。


また非常に精密な校正をしてくださった加藤さん、このお話をくれて、完成まで導いてくれたPEAKSの永野さん、共著者のみなさま、クラウドファンディングで購入してくださったみなさま、アーリーアクセスでコメントいただいたみなさま、どうもありがとうございました!


そして本書について知らなかったけどちょっと気になってきた、というみなさま。本書はPEAKSのサイトで購入可能です:


iOS 11 Programming

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川克己,所 友太,永野 哲久,加藤 寛人,
  • 発行日:2017年11月16日
  • 対応フォーマット:製本版,PDF
  • PEAKSで購入する


何卒よろしくお願いいたします。


*1:世界的に有名な某iOSチュートリアルサイトが発行しているiOS 11本を実際に購入してARKitの章を見てみましたが、結構さわりだけな印象だったので、英語/日本語という違いを抜きにしてもこちらの方がいいのでは、と個人的には思っています

*2:言語の解説書ではなく、という意味

サンフランシスコで就職して1年が経ちました

昨年9月28日に『フリーランスを休業して就職します』という記事を書いてサンフランシスコの会社に就職し、早1年が経ちました。


実際にはもう1年と2ヶ月ほど経ってまして、この2ヶ月間、何度も記事を書こうと思いテキストエディタを開きつつ、まとめきれずに途中で断念・・・ということを繰り返してました。ブログ記事1つにまとめるには多くのことがありすぎました。


レイク・タホに別荘を借りて会社のみんな(とそのファミリー)で連休を過ごしたり、同僚の帰省(ミズーリ州)についていってサンフランシスコとは全く違うアメリカを体験したりといった「楽しい思い出」もあるし、英語について色々と試行錯誤したり学んだりしたこともあるし、会社でどんな感じで仕事してるか/現地でどう生活してるかというのもあるし・・・ということを書いてると永遠にまとまらなそうなので、本記事では「入社を決めた当初の目的に対しての達成度はどうか」というあたりについて書こうと思います。

状況のおさらい

まずは前提となる状況について書いておきますと、

  • 2016年10月、サンフランシスコのスタートアップ「Fyusion」にiOSエンジニアとして就職
  • ビザはH-1B
  • 僕がちょうど30人目の社員
    • 今は40人ぐらい?
  • 入社時点では日本人は僕ひとり
    • 今はリサーチ(研究開発)チームに日本人の同僚が一人います。

詳細は冒頭にも挙げた昨年の記事に書いてあります。

Fyusion入社の目的:欲しいスキルが得られそうだった

これも昨年の記事に書いたことですが、謳歌していたフリーランスをやめてFyusionに就職することにした理由は、シンプルに言うと「欲しいスキルが得られそうだったから」です。


具体的には以下の4つ。

  • コンピュータビジョン
  • 3Dプログラミング
  • 機械学習
  • 英語


で、Fyusionは

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


というわけで、完璧に条件が揃っていたので、これはもう行くしかないということで入社を即決しました。


プラス、これはスキルというよりは経歴面での話ですが、「サンフランシスコの会社で働き、ちゃんと通用した」という実績が得られるのは、もし今後またフリーランスをやる際にも、海外の会社に対して安心材料になるかなと考えていました。

この1年での達成度:技術面

まず、3Dプログラミング・機械学習については、結構達成感があります。いや、どちらも初心者レベルなのですが、何年も前から興味がありつつ、結局ほとんど手を付けられなかった分野で、少なくともスタートを切ることができた、というのは自分にとって非常に大きい。


3Dプログラミングは、ワールド座標とかそういう3Dの基本のキも知らないところから、アプリ内でもSceneKitを利用した機能を実装できたし、ここでSceneKitをさわってたおかげで書籍でARKitについて書くことができました*1


機械学習については、弊社の優秀なリサーチエンジニアが、学習させたモデルをMetal Performance Shaders(MPSCNN)を使ってiOSデバイス側で動かすところまでやってしまうので、残念ながら社内の仕事では自分の出番がほぼなかったのですが、自分にそのへんの仕事がまわってくるようにと、

といったことができたので、スタート地点としては満足です。


コンピュータビジョンに関しては、正直なところ知見が深まった感はあまりありません。そのへんのコアなアルゴリズムはリサーチチームが実装(C++)を含めて担当するし、その中身を聞いて理解するにはアカデミックな知識も英語力も不足しているので、及び腰になってしまいます。とはいえこの分野で新たに知ったことも多いし、機械学習もこの分野に関連してるので、進んだといえば進んだといえるかも。


あと、当初の目標としては考えてなかったですが、弊社はプロダクト内でMetalをガッツリ使ってるので、実務でMetalを使う機会があったのもよかったです。OpenGL ESには以前から興味がありつつ手を付けられてなかったので、同じくGPUインターフェースレイヤのMetalをいじれるようになったのは自分にとってかなり大きい収穫でした。

この1年での達成度:英語

これは・・・アメリカの会社で働いているという観点でみると、かなりダメだと思います。いまだにミーティングでのみんなの議論(自分以外 vs 自分以外)についていけません。日本語でも口数が多い方ではないので、そもそも会話の絶対量が少ない。この感じだとあと3年いても無理な気がします。


とはいえ、入社以前の自分から比べてどうか、という観点だと、飛躍的に向上したともいえます。表現の引き出しは増えたし、チャットではわりと苦もなくコミュニケーションできてます。相手が少しゆっくり話してくれて、話すべき明確な用事(タスクとか、仕様とか)があれば、ちゃんと意思疎通できます。ほんの数年前まで2,3行の英語メール書くにも辞書引きながら10分とかかけてたのを思うと、また入社面接でも相手の言ってることが5%も理解できなかったのを思うと、大きな進歩だなと。


ただ、これまではどうも技術に逃げてしまってたところがありました。英語の勉強より技術の勉強、楽しい会話ができなくても技術で認めてもらえばいい、と。

これだとせっかくの「英語を使わざるを得ない環境」がもったいないので、会話量を増やすべく対策を打っていこうと思います。

この1年での達成度:実績面

まず、1年以上は働く、というのは目安として考えていました。日本と比べて社員をクビにしやすいアメリカでは、実力不足の社員はやはり切られます。1年いれば、ちゃんと通用した、といえるんじゃないかなと。これは達成です。


それとは別に「会社で技術力が認められている」ことが客観的にわかりやすい事実として、プロモート(昇進)しました。


採用時は Lead Software Engineer だったのが、Senior Principal Engineer になりました。


(新しくしてもらった名刺)


収入も当初のものから年収にしてn百万円上げてもらったので、サンフランシスコの会社で働き、貢献し、評価されている、というわかりやすい証明ができてよかった、と思っています。



ちなみにうちの会社、CEO、CTO、SVP Engineering、SVP Webのファウンダー陣全員が現役バリバリでコード書きます。これの何がいいって、エンジニアが正当に評価される、という実感がハッキリあります。


たとえばある時期、僕はiOSリポジトリのコードを抜本的に改善すべく、iOSチームメンバーのマインドから変えていかないと、ということでレビュー依頼が自分に振られていないものまで結構細かくコメントをつけていたことがありました。頼まれてもないのに人のコードにケチをつけるというのは下手したら相手から嫌われかねないし、自分でコード書いて新機能とかを実装する方がよっぽど楽しいのですが、どうしても必要だと思った(汚染が広がる一方なのを食い止めたかった)のでやってました。


で、そんなある日、CEOから「いつもグレイトなレビューをありがとう!」っていうメッセージが。


CEOがプルリクのレビューコメントを見て、しかもその良し悪しが評価できるって、良くないですか?これはやはり経営陣が現役でコード書いてるならではかなと思います。「昔はバリバリ書いてた」でも厳しいでしょう。あの機能をつくったとか、そういう見えやすい仕事以外での貢献も評価される環境はエンジニアにとって非常に働きやすいなと。

まとめ

まとめると、

  • 技術面・・・手応えあり
  • 英語・・・もっと話さないといけないけどそれでも進歩はあった
  • 実績面・・・アメリカで通用してるぞという明確なものが得られた

という感じで、ここまでの進捗は上々です。


ただこれはコミュニケーション力に難のある僕に対するファウンダー陣や同僚の理解/協力があってこその結果で、「おれはもう世界のどこでもバリバリやれる」という自信がついたかというと、まったくそんなことはないわけで。会社にも、アメリカにももっと食い込んでいけるようにならないとなぁ、というのが今後の要努力ポイントです。


*1:ARKitは、レンダリングはSceneKitや他のフレームワークに任せるようになっている

iOSDC2017で「飛び道具ではないMetal」という話をしました #iOSDC

9月15日〜17日の3日間にわたって開催された iOSDC Japan 2017 にて、「飛び道具ではないMetal」と題して登壇させていただきました。


発表資料はこちら・・・と普段ならここでスライドを貼るところですが、その前に、「あーMetalね。関係ないや」と思われた方。今回はむしろそういう方向けです。MetalのAPIを直接たたくことはなくても、UIKitの下回りでもMetalが使われていて、間接的に誰もがMetalの恩恵を受けています。今日はお祭りなので、そんなMetalにちょっと目を向けてみませんか・・・と、そういう内容です。「Metalをさわったことない人が、Metalについてわかった気になれる」というところをゴールとして設定して発表を構成しました。(そういう切り口でもないと、誰も興味がない話になってしまうので。。)




CfPに書いた内容はこちら。

WWDC17でもMetalのセッション会場は閑古鳥が鳴いてました。Metalって3Dゲームとかカメラアプリとかのトリッキーなエフェクト用でしょ、うちには関係ないなぁ・・・と思われている方も多いかもしれません。しかし、UIKitの下回りもMetalですし、色んな所で実はMetalは暗躍しています。そんなMetalにもっと多くの開発者に興味を持ってもらうため、非ゲーム・非カメラアプリ開発者にも関係しそうな切り口からMetalやGPUについて紹介してみたいと思います。


以上、前置きが長くなりましたが発表資料はこちらです。




今日公開されたばかりの動画がこちら。たった15分の短い発表なので、ぜひ見てみてください。


当日の様子・いただいた感想

絶対みんなこっち見に行くだろーっていうセッションが裏にあり、コアなMetalユーザがパラパラと来るだけだったらどうしよう・・・と思ってたのですが、ありがたいことに多くの方に来ていただけました。




こういう反響をいただきました。







あとNextstep.fmというPodcastで、sonson氏が『Metal書いたことなかったけど、「こういう感じなんや―」っていうのがわかってよかった』と言ってくれてました。



多くの方に期待した感じで伝わったようで良かったです。

お知らせ1: Metalについて書いた本が出ます!

ARKitの章とMetalの章を担当しました。


Metalの章は、新機能というよりどちらかというとゼロから入門するところに力を入れて書いています。また別記事で詳しく書きたいと思います。今日か明日にでもクラウドファンディングで購入された方々にはβリリースされて、近いうちに一般販売開始とのことです。

お知らせ2: try! Swift 2018に登壇します!

本日発表になりましたが、ついに念願かなって来年のtry! Swiftに登壇させていただくことになりました。



あと4ヶ月、ネタを推敲して臨みます!


ARKitのサンプルコード集「ARKit-Sampler」を公開しました

iOS 11のリリースと同時に、ARKitのサンプル集「ARKit-Sampler」をオープンソースで公開しました。


ARKit Sampler



ソースコードは GitHub に置いてあるので、ご自由にご活用ください。


https://github.com/shu223/ARKit-Sampler


使用言語はSwift 4.0です。


ARKitのサンプルは公式のを含めいろいろ出てますが、ARKit-Samplerでは「余計な実装を混ぜずに、できるだけシンプルな実装で伝える」というところに気をつけています。もともとは書籍執筆のために用意したものなので、とくに序盤のサンプルはシンプルで意図が汲みやすいと思います。

ビルド方法

  1. ここから Inceptionv3.mlmodel をダウンロードして mlmodels フォルダ配下に置く
  2. Xcode 9 でビルドしてiOS 11端末にインストール

基本的にビルドするだけですが、Core MLのモデルファイルをダウンロードする必要があります。


サンプル一覧

今のところ8個のサンプルが入っています。少ないですが、随時追加していきます。

3-lines AR

実質3行」のシンプルなAR。ARKitが簡単に扱えるということがわかります。


Plane Detection

ARKitの基本機能、水平面の検出方法を示したシンプルなサンプル。


Virtual Object

水平面に仮想オブジェクトを設置するサンプル。


AR Interaction

仮想オブジェクトや、検出した水平面に対するインタラクションの実装方法を示したサンプル。


AR Measure

もはやARKitの定番実装例となっている、ARKitをメジャー(巻尺)代わりに使うサンプル。


AR Drawing

空中に絵や文字を書くサンプル。


Core ML + ARKit",

Core ML + Visionで認識したオブジェクトに対してARKitで「ARタグ付け」するサンプル。



Metal + ARKit

ARKitの描画にMetalを利用するサンプル。


Coming soon...
  • Audio + ARKit
  • Core Location / MapKit + ARKit
  • Face Tracking
  • etc...

Special Thanks

アイコンデザインはいつものおかず氏です。

書籍「iOS 11 Programming」

ARKitとMetalの章の執筆を担当しています。


ARKitの章は本日アーリーアクセス公開予定です。

iOS-11-Samplerは?

毎年iOSのニューバージョンと同時に公開していたiOS Samplerシリーズですが・・・今年はまだありません・・・つくるつもりはあります・・・!