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

[iOS][Swift][Xcode]【iOS 11】API Diffsから見る iOS 11 の新機能 #WWDC17

$
0
0

今年はWWDC会場よりお送りしております。特に何も期待しないまま参加したのですが、開発者的には非常にワクワクする発表がたくさんありました。


基調講演の内容からではなく、ベータ公開されたiOS Dev CenterのAPIリファレンスを見て、個人的に/開発者目線から気になった新APIを挙げていきます。


Core ML

iOS 10からMetal Performance Shaders(以下MPS)に追加されたCNN関連機能、足りないものが色々とあり、ここらへんは拡充されたら嬉しいなとは思っていましたが、新フレームワークとして登場しました。


おいおい、さらに増えたら MPSCNN / BNNS / Core ML とどう使い分けるんだ、と思いましたが、ドキュメントの図で棲み分けがわかりました。


f:id:shu223:20170606094137p:image:w450


Keras や Caffe で学習したモデルを BNNS や MPSCNN で使えるようにするのが Core MLのようですね。

import coremltools
coreml_model = coremltools.converters.caffe.convert('my_caffe_model.caffemodel')
coreml_model.save('my_model.mlmodel')

実際、学習済みモデルを持ってくるところは扱いづらい仕様だったので、これは嬉しいです。



Metal Performance Shader

上でMPSという略語を何度かもう出しましたが、MPS自体にもいくつか新規追加APIがあります。その中でも目を引くのが Recurrent Neural Networks(RNN / 再帰型ニューラルネットワーク)関連のAPI群。

  • MPSRNNImageInferenceLayer
  • MPSRNNMatrixInferenceLayer
  • MPSRNNSingleGateDescriptor
  • MPSGRUDescriptor
  • MPSLSTMDescriptor
  • MPSRNNSequenceDirection

RNNは、文書解析に向いていて、自然言語処理の分野で成果を挙げているとか。勉強します。


Vision

これも新フレームワーク。画像解析・コンピュータビジョンで顔を識別したり、シーンを分類したりするフレームワークのようです。APIを見てると Core Image の CIDetector の下回りがこれなのかなぁという品揃えです。

  • Face Detection and Recognition
  • Machine Learning Image Analysis
  • Barcode Detection
  • Image Alignment Analysis
  • Text Detection
  • Horizon Detection
  • Object Detection and Tracking

ちなみにドキュメント冒頭で "detect faces" ではなく "identify faces" という言い方をしてるのと、"Face Detection and Recognition" とわざわざ書いてあるので、顔検出ではなく、「これは誰々だ」という顔の認識までしてくれるのかなと期待しましたが、今のAPIを見た限りだと従来の顔の矩形検出っぽいです。今のところは。


いや、それにしてもこれは嬉しいです。もっとAPI掘ってみます。


ARKit

これは基調講演でも盛り上がってましたねー *1


f:id:shu223:20170606094517p:image:w600


私事ですが、勤めている会社のアプリ Fyuse でこういうものを実装しました。


f:id:shu223:20170606094635j:image:w585


Fyuseというアプリはスマホで3D的な写真を取るアプリなのですが、実装した機能というのが、タップして選んだ対象の周囲に3Dの「ARガイド」を表示して、撮影を補助するものです。


f:id:shu223:20170606094825g:image


で、これがiOSの実装的に言うと、

  • カメラからの入力画像を解析してリアルタイムにオブジェクトトラッキング(物体追跡)
  • カメラの姿勢と対象物体の位置・角度からARガイドを表示する

というところで、AVFoundation、Metal、SceneKit(+コアとなる画像処理:弊社リサーチチームによる実装)が要素技術になってきます。


僕は3Dにまったく慣れてなくて、カメラからの入力・iPhoneのスクリーンという2Dの世界と、デバイスの姿勢・SceneKitで構築する3Dの世界とを行き来するのに大変苦労しました。


こういうのをARKitはやりやすくしてくれるものなのかなと思います。具体的なAPIはまた後ほど見たいと思います。


Depth API

基調講演で「Depth API」って言ってて、「きたー!」と思いましたが、


AVFoundationを見るも、新規追加APIはなし


どこにあるのでしょうか・・・?


Core NFC

基調講演でチラッとNFCの文字が見えましたが、新フレームワークが追加されてました。何ができるようになったのか、あとでAPIを見ます。


その他

MusicKit

基調講演でチラッと行ってた気がするけどAPIリファレンスに見当たらないような。。。


いや、Musicライブラリまわりの連携って、実は結構苦しいこと多くないですか?なので、何が新たにできるようになったのかは知っておきたいなと。


RPScreenRecorder

ReplayKitに追加された、アプリのスクリーンビデオを撮るためのクラス。そもそもReplayKitってそういうものじゃなかったでしたっけ?たまに画面を録画する機能をサクッとつくりたいケースはあるので、以前のと何が違うのか、見ておきたいなと。


NEHotspotConfiguration

WiFi関連のAPIが今更新たに公開されるのって、どういう文脈に沿ってるんでしょうか?何にせよ外の物理的な何かと連携するAPIは好物なので、見ておきたいです。


Xcode 9

いろいろ劇的に改善されましたね。


関連


*1:個人的には、ポケモンGoのARはあまりARの良さを活かしているものではないと思ってるので(みんなARモード切って使ってますよね)、あれがARの代表例としていつも挙げられる度にうーんと思ってしまうのですが


[iOS][Swift][Metal][画像処理]【iOS 11】ARKitについてWWDCのラボで聞いてきたことのメモ

$
0
0

iOS 11から追加された、AR機能を実装するためのフレームワーク「ARKit」についてWWDCのラボ(Appleのデベロッパに直接質問できるコーナー)で聞いたことのメモです。注目のフレームワークなので行列ができてましたが、丁寧に色々と教えてくれたので、忘れないうちに書いておこうと思います。


f:id:shu223:20170608032933j:image:w600

(WWDCセッションスライドより)


既存実装とどう共存させるか?

先日の記事にも書いたのですが、今働いている会社のアプリ「Fyuse」はスマホで3D的な写真を撮るアプリで、その撮影を補助するために、撮影対象の周囲に3Dの「ARガイド」を表示するという機能をAVFoundation+Metal+SceneKit+独自の画像処理ライブラリ(トラッキング等)で実装しました。


f:id:shu223:20170606094825g:image


ARKitを使うとなると、要iOS 11以上、要A9以上のプロセッサという条件を満たす必要があるわけですが、当然2017年現在では多くのアプリはこれよりもっと広いiOSバージョン、iOSデバイスをサポートしたいはずです。


で、まず聞いたのは、そういう既存実装とARKitを共存させるのに、

if <# iOS 11以上 #> && <# A9以上 #> {
    // ARKitを使う実装
} else if <# 既存実装を使う条件 #> {
    // 既存実装
} else {
    // それ以外
}

みたいなのを避ける方法があったりしませんか?と。



回答:ない。ARKitを使うにはiOS 11以上、A9以上が必要だ。



・・・はい。そりゃそうですね。変な質問してすみません。でもせっかく来たので食い下がって聞いてみました。


「他のAR利用アプリもiOS 10以下はまだ切れないと思うけどみんなどうしてるの?たとえばポケモンGoとか」



回答:知らない。



・・・はい。そりゃそうですよね。(もし知ってても言えないですしね)



既存実装と比較したARKitのアドバンテージは何だと思うか?

質問が悪かったので、「じゃあ既に実装が済んでいて、ARKitを使うとなると既存実装にプラスしてバージョンわけが必要というデメリットがありつつ、それでもARKitを使う理由はあるのか」という観点から、我々の既存実装と比較したARKitを使うメリットについて聞いてみました。



→ 回答:

  • Appleの純正フレームワークは公開APIよりもっと下のレイヤーを利用した実装ができるので、サードパーティ製の実装よりもハードウェアに最適化されている。よってバッテリー消費量や処理速度の面で優れていると考えられる
  • ユーザーがタップしなくても、ARのセッションを開始した時点でシーンの解析が完了している(これは厳密には我々の用途にとってはアドバンテージではないが、「違い」ではある)
  • デバイスの姿勢も考慮してキーポイントを抽出してるので、デバイスを動かすと云々(すみません、実はこのへんちょっとよくわかりませんでした)

結局のところ、ARのシーンとしてはどういうものが検出できるのか

我々の要件としては、水平面に何かを置きたいわけじゃなくて、対象オブジェクトを囲むように3Dノードを表示したいわけです。


f:id:shu223:20170606094825g:image


ところがARKitは検出した床やテーブル等の水平面に何かを置く実装しか見当たらないので、「こういうのってARKitでできるの?」ということを聞いてみました。



で、回答としては、今のところ「水平方向」(horizontal)の「平面」(plane)しか検出しないそうです。


`ARPlaneAnchor.Alignment` というenumがありますが、実はまだ `horizontal` という要素ひとつしかなくて、`vertical` というのはまだありません。つまり壁のような「垂直方向の平面」を検出したり、我々のアプリのように人間や銅像や動物といった任意のオブジェクトを検出したり、そういうことは現状ではサポートしてないようです。


なので、ポケモンGoのようにキャラクターの3Dモデルを表示するタイプのARにはいいですが、我々のアプリのような用途や、実世界のものに合わせて何か情報を表示したり、みたいなタイプのARにも現状では向いてなさそうです。



どういう水平方向の平面が認識されるかについても教えてくれたのですが、ある程度の大きさが必要で、たとえばイスの座面は十分な広さがあるので水平面として検出されるが、背もたれの上(伝わりますかね?)みたいな狭いものは水平面としては検出されないと。



ただもう一つ提案として言ってくれたのは、検出したキーポイントはAPIから取れるので、それらを使って自分で垂直方向の面なり何なりを再構成することならできる、と言ってました。これはありかもしれません。


深度情報は使用しているのか?

たとえばiPhone 7 PlusのようにDepth(デプス/深度)を取れるようなデバイスの場合、それを使ってより精度良く検出するような処理を内部でやってたりするのか?ということを聞きました。



回答:使ってない



普通のカメラだけで精度良く動くようなアルゴリズムになっていて、デバイスによる処理の差異はないそうです。


おわりに

結論としては、我々の用途には今のところは合ってなさそうです。が、今後のアプリ開発の可能性を広げてくれる非常におもしろいフレームワークであることには代わりはないので、プライベートでは引き続き触っていこうと思っています。


[iOS][Swift][Xcode]iOSの技術書をクラウドファンディングで執筆します - 共著者8人の紹介 #peaks_cc

$
0
0

「PEAKS」という技術書のクラウドファンディングサービスで、今日から9人の執筆陣によるiOSの解説書「iOS 11 Programming」のファンディングが始まりました。


f:id:shu223:20170626233655j:image:w600



9人の著者陣に僕も入ってるので、宣伝といえば宣伝なのですが、技術書大好きな自分としては、自分が入ってなくても絶対に買うであろう執筆陣/内容なので、いち読者としてもぜひとも成立して欲しいと思ってまして、本記事を書こうと思った次第です。


そう、念のため書いておきますが、クラウドファンディングなので、成立しなければ出ません😭

購入締切日時 2017年07月28日 23:59 までに、購入者数が目標の 500人 に達した時点で執筆開始となります。購入額の決済は、目標人数が達成された時点で行われます。(目標人数に達しなかった場合はプロジェクト不成立となり、決済は行われません。)


ページ内の著者コメントにも書きましたが、僕がお世話になった著書の執筆者であったり、いつもお世話になってる著名オープンソースライブラリのコミッタの方であったり、いつも素晴らしい記事を書かれている方であったり。期待しかない布陣なのです。


万が一それが伝わってなくても悲しいので、僕「以外」の方々についておこがましいですが簡単に紹介させていただきたいと思います。以下サイトに載ってる順に。*1


吉田 悠一 - Core ML

通称ソンソン(sonson)さん。「iOS SDK Hacks」のメイン著者のひとり。


iOS SDK Hacks ―プロが教えるiPhoneアプリ開発テクニック
吉田 悠一 高山 征大 UICoderz
オライリージャパン
売り上げランキング: 226658

2010年とかなり黎明期に書かれた本ですが、Method Swizzling や Accelerate.framework といった他著では扱ってないトピックについて書かれていて、その後何年も本書を開いて参考にさせていただきました。


コンピュータビジョンや機械学習を専門とされていて、今回Core MLについて書かれるということで、ブログ記事や他著にありそうなチュートリアルをなぞってみた的なところを超えた、「中身がわかってる人ならではの解説」が非常に楽しみです。


池田 翔 - Swift 4の新機能とアップデート

通称いけしょーさん。あの Carthage、ReactiveSwift のコミッタであり、Himotoki の作者です。Carthageというパッケージマネージャ、ReactiveSwiftというリアクティブプログラミングをするためのライブラリ*2、Himotokiという「Swift自体がそのコアコンセプトを後追いすることになった」JSONパーサの中身をコミッタ・作者レベルで理解している人が解説するSwift 4、読みたすぎます。


坂田 晃一 - Xcode 9 の新機能

僕は坂田さんと呼んでますがID的にはhuinさん。今年出版された「モバイルアプリ開発エキスパート養成読本」の著者のひとり。


モバイルアプリ開発エキスパート養成読本
技術評論社 (2017-04-11)
売り上げランキング: 38,762

iOSDC等のカンファレンスや勉強会でよく発表されていて、わかりやすくてためになる内容に定評がある方です。


加藤 尋樹 - Drag and Drop / Files と Document Based Application

通称すこんぶさん。try! Swiftの記念すべき第1回目に登壇されていました。

上記はすこんぶさんのブログですが、技術記事はいつも他の記事には書いてない「一歩踏み込んだ」内容で、めちゃくちゃ勉強になります。


川邉 雄介 - UIKitのガイドラインの変更点とAutoLayoutの新機能、アップデート

僕は川邊さんと呼んでますが、ID的にはjeffsukeさん。「よくわかるAuto Layout」の著者の方です。


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

この本の紹介記事にも書きましたが、「こんなに詳しく、しかも噛み砕いててすごい」と驚く内容の良さでした。*3


ブログ記事もちょっと込み入った内容を綺麗に構造化してわかりやすく書くのが上手い方だなーと思います。


岸川 克己 - Core NFC / PDFKit / SiriKit

通称きしかわさん。きしかわさんです!Realm、try! Swiftの主催、色々な会社の技術顧問、KeychainAccessの作者等いろいろな顔がありますが、なんといっても岸川さんの勉強会等での登壇内容は、そのまま本にして欲しいぐらい詳しく、他で説明されてないような内容まで網羅されていて、それでいてわかりやすいです。


PEAKSクラウドファンディング第1弾は岸川さんの「Inside Swift」でしたが、ぜひとも成立して欲しい企画でした。目標部数が高すぎるからだ!と思わずPEAKSにアンケートでクレームを入れたぐらいでした😭


今回こそは成立させて、岸川さんの書く章を読みたいです。というか、「PDFKit」は何となく岸川さんが書きそうなイメージがありますが、「Core NFC」「SiriKit」というチョイスは個人的にはちょっと意外で、だからこそますます読んでみたい気持ちが高まります・・・!


所 友太 - HomeKit入門とiOS 11における新機能

僕は普通に「ところさん」と呼んでます。みんな持ってた(と僕は思っている)あの「UIKit詳解リファレンス」を書いた方。


iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 355,345

「よくわかるAuto Layout」の監修でもあります。あと #potatotips の創始者でもあります。


「UIKit本の次回作は書かないんですか?」と会う度に聞いてて「今書いてます!」と言ってたのに7年経ってもまだ出てないので、こういう機会でもないとなかなか書いてくれない気がしますw 所さんのHomeKit解説、ぜひ読みたいです。


永野 哲久 - Audio/Media関連 新フレームワークとアップデート

iOSのオーディオまわりをいじる人はみんな参考にしたあの「iPhone Core Audioプログラミング」の著者。


iPhone Core Audioプログラミング
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 88,410

2009年刊行ですが、オーディオ周りの低レイヤのAPIのうちのいくつか(大部分)はこの本にしか書かれてないことが多く、一時期は1万円を超えるプレミア価格がついてました。プログラミング界隈においてはだいたいの情報は英語が源泉ですが、この本をネイティブで読めるので日本語できて良かったーとまで思った一冊です。


この企画の話をいただくまで知らなかったのですが、実はPEAKSの中の人はこの永野さん。今回の発起人でもあります。


おわりに

もしかしたら個人的な思いがほとばしりすぎて宣伝にすらなってないかもしれません。。プロジェクトが成立(=購入者数が目標数に到達)してから執筆される本なので、ある程度内容については著者陣を信用してほしいということになりますが、ガジェット系等のクラウドファンディングと違って成立しなければ決済されないので、"支払ったけど本(電子書籍or紙の本)は届かない"ということはないのでその点はご安心いただきつつ、気になった方はぜひ応援の購入をしていただければありがたいです。



よろしくお願いいたします🙇🏻



*1:なお、紹介に出てくる著書はもちろん全て個人的に所有しております

*2:こういうの何て総称するんでしょう?

*3:「わかりやすいけど内容が薄い」、または「内容は詳しいけど公式ドキュメントの直訳でわかりにくい」(著者が咀嚼できてない)、というパターンは実際にたまに見かける

[iOS][機械学習][Deep Learning][Metal]Core ML vs MPSCNN vs BNNS #fincwwdc

$
0
0

昨日FiNCさんのオフィスで開催された「WWDC2017振り返り勉強会」で『Core ML vs MPSCNN vs BNNS』というタイトルでLTしてきました。



iOS 11で追加されたCore MLが非常に注目を集めていますが、「既存の機械学習フレームワークを使って学習させたモデル(のパラメータ)をiOS側に持ってきて推論を実行する」ということ自体はiOS 10からあって、そこに不便さがあったので広まらず、Core MLでやっと使われるようになった、という側面はもちろんありつつも、いややはりそれでも単にそういうことがiOS 10できるようになったということ自体が知られていなかっただけなのではと。




確かに自分も Metal Performance Shaders のCNN APIを用いた機能を実装しようとしたときに、情報があまりに少なく、何ができて何ができないのか、どうやるのかがよくわからなかった、ということがありました。


で、そのへんをシンプルに説明したら、もっと興味をもつ人も出てくるんじゃないかなと思い、実装手順を3ステップで解説してみました。


  • Step 1: モデルをつくる

f:id:shu223:20170725070344j:image:w600


  • Step 2: ネットワークを実装する

f:id:shu223:20170725070345p:image:w600

f:id:shu223:20170725070347p:image:w600


  • Step 3: 推論の実行処理を書く

f:id:shu223:20170725070346p:image:w600



意外と簡単そう/使えそうではないでしょうか?



ところが・・・


f:id:shu223:20170725070348p:image:w600


f:id:shu223:20170725070349p:image:w600


っていうつらさがあり、他にも色々と面倒な点があり、やっぱりCore ML & Visionのおかげで各段に便利になった、という話でした。



最後にAccelerateフレームワークのBNNSの使いどころについてWWDC17のMetal Labで聞いた話が出てきます。


f:id:shu223:20170725073011p:image:w600



(登壇の様子 by yucovin さん)


なぜこの話をしたのか

上の説明だけを読むとまるでMPSCNNの普及活動をしている人みたいですが、動機はそこではなくて、来月登壇する アメリカのiOSカンファレンス で、"Deep Learning on iOS" というタイトルで発表することが決まっていて、


f:id:shu223:20170725070350p:image:w600


で、これってWWDC17開催前にCfPを出して通ったやつなので、応募当時はMPSCNNの話をするつもりだったのに、Core MLが出てしまって事情が変わってしまった、どうしよう、という。。


じゃあCore MLの話をすればいいじゃん、と思うかもしれません。その通りかもしれません。でも僕自身がまだあまり試せてないのと、Core MLの場合はiOS側が便利になりすぎてむしろ機械学習フレームワーク側(Kerasとか)がメインになるけどそっちは初心者とすらいえないレベルだし、ってことでMPSCNNの方に解説を寄せよう、という試行錯誤の中で「こんな切り口はどうだろう」と考えたのが昨日の発表なのでした。


実際に話してみて、正直なところコレジャナイ感はちょっとありました。もうちょっとワクワクする感じにならないか、実例とかデモとかを増やす感じでブラッシュアップしてみようと思ってます。(来月のカンファレンスは発表時間が45分もあるので、個々の解説ももうちょっと丁寧にやる予定)


おわりに

WWDCには参加したものの、そのままアメリカにいたのでこういう振り返り勉強会に参加できず(※例年勉強会発表ドリブンで新APIを勉強していた)、あっちではこういうLTで気軽に登壇できる勉強会もあまりないので、1ヶ月後というわりとWWDC勉強会としては珍しいタイミングで開催された本イベントは大変ありがたかったです。


LTですが非常に中身の濃い発表が多く、勉強になりました。懇親会で出てくる料理もさすがFiNCさん、ヘルシーで美味しいものばかりでした。どうもありがとうございました!


追記:BNNSについていただいたコメント

Facebookでsonsonさんからコメントいただきました。


f:id:shu223:20170725124035p:image:w400


BNNSとMPSCNNの使い分けは,難しいけど,電力と計算スピードのバランスかなぁと思います.


あと,GPUのメモリとCPUのメモリ間の転送に時間がかかるので,オーバーヘッドをカバーできるくらい,データや計算量大きくないと,GPUは意味ないでしょう.

BNNSは,SIMDなので,これも当然CPUのコンテキストスイッチのためのオーバーヘッド(ノーマルモードとSIMDモードの切り替え)があるのですが,GPUほどではないので,小さいネットワークだとGPUよりBNNSの方が速いというのはありそうです.


まぁ,なんで,電力と速度の限界に挑戦する場合は,ベンチマークとって極限を目指そうって感じですかねw


なるほど、単に「CNNの計算はGPUが向いてるでしょ」とか「Appleの人も言ってた」とかってだけでBNNSのことは忘れようとか言ってちゃいけないですね。確かにGPU↔CPU間の転送速度のボトルネックとGPUによる高速化がどれぐらい見込まれるかのバランスによる、というのは非常に納得です。また「SIMDモードへの切り替えのオーバーヘッド」(はあるがGPUとの転送ほどではない)というあたりもまったく考慮できてなかったところです。


CPU、GPUの負荷がそれぞれどれぐらいか、というのはXcodeで簡単に見れますが、GPU↔CPU間の転送状況を見る方法もあるのでしょうか?GPUまわりの計測・デバッグ手法はもうちょっと勉強したいところです。


ちなみにsonsonさんは例の(私も参加させていただく)クラウドファンディング本で「Core ML」のパートを担当されます。


7/28まで買えるみたいなのでまだの方はぜひご検討を!


[登壇][海外][機械学習][Metal]コロラド州デンバーで開催されたiOSカンファレンス「360|iDev 2017」に登壇した話 #360iDev

$
0
0

今月の8月13日〜16日にかけて、アメリカ合衆国コロラド州デンバーにて開催された「360|iDev 2017」にて登壇してきました。


Shuichi Tsutsumi

(発表中の様子)


トークのタイトルは "Deep Learning on iOS" で、スライドはこちら。



持ち時間が45分もあったので、スライドの内容プラス、トークの序盤・終盤でライブデモを2つ(配布されているモデルを使用した一般物体認識/自分で学習させたモデルを使用したロゴ認識)実施しました。



360 iDev カンファレンスについて

raywenderlich.com の毎年の恒例記事 "Top 10 iOS Conferences" に3年連続でエントリーしている、歴史と由緒あるカンファレンスです。



参加人数は今年は250人程度とのこと。



開催場所のコロラド州デンバーは、カリフォルニアから東に行った、アメリカのちょうど真ん中あたりにあります。


f:id:shu223:20170831034407j:image:w400


登壇の経緯

相変わらず招待されたとかではなくて、4月に出したCfPが採択されての登壇でした。今年の3月にtry! Swift TokyoのLTで話した内容 *1 の完全版をどこかでやりたくて、応募しました。



ちなみに今年のCfPはいまのところ4つのカンファレンスに応募して、3勝1敗(通った: try! Swift, 360iDev, iOSDC, 落ちた: UIKonf)です。


カンファレンスの様子

スピーカーは飛行機代が出るのと、会期中のホテルはカンファレンスが用意してくれます。


開催前日の夜はスピーカーディナー。


360iDev Speaker Dinner

(写ってないように見えますが、写ってます。。)


スピーカーディナーは今までちょっと苦手意識があったのですが、今回はAltConfのオーガナイザーやってて僕のことを覚えててくれた人や、日本語勉強してて僕のブログを読んでくれている(!)人、ベルリンのカンファレンスで同じくスピーカーだった人とかもいて、今回は非常に楽しめました。



会場はホテル内にあり、最大4トラックが同時進行します。


360iDev_20170814_8536

(ゲストスピーカー用の一番広い会場)



SlackにはポケモンGOチャンネルやNintendo Switchでマリオカートやるチャンネルとかもありました。


f:id:shu223:20170830194636j:image:w400

(会場から届くとこにフリーザーが出たのでみんなで狩るの図 )



ランチのシステムがユニークで、カンファレンスでもらえるバウチャー持って、フードトラックが集まる公園まで行って、自分で好きなのを注文して食べる、という形式。


f:id:shu223:20170830194757j:image:w600


観光にもなるし、会場の外の空気を吸えるので非常にいい仕組みだと思いました。



こちらはスポンサーブースでももらった、Firebaseのハンドスピナー、ホットソース、ウッドステッカー。


f:id:shu223:20170830195001j:image:w400


ハンドスピナーは(置いて回すときは)回転中もロゴが見えるし、色で個性も出しやすいので企業やサービスのグッズとしては結構いいのではないでしょうか。



僕の出番は2日目のランチ前。


f:id:shu223:20170830195157j:image:w400

(いよいよ次…)



出る直前はソワソワしましたが、話し始めたら緊張は忘れて、練習時よりもうまくしゃべれたと思います。

Shuichi Tsutsumi


Shuichi Tsutsumi


デモもうまくいったし(バックアッププランもたくさん用意しておいた)、終わった後「良かったよ」と声もかけてもらえました。


ただ正直な所、今回のトークの「内容」については100%最高と思える所まで持っていけたとは思ってなくて、悔やまれる部分もあります。そこらへんは結局のところ自分の準備不足、努力不足に帰結するので、今後精進します。(詳しくは後述)



まぁそんなわけでちょっと発表内容については勝手に凹んだりしてたのですが、かの世界的に有名なiOSチュートリアルサイト "raywenderlich.com" の『360|iDev 2017 Conference Highlights』(360iDevのハイライト)という記事で、なんと僕のセッションが紹介されてました。


f:id:shu223:20170830204903j:image:w400


"Can't miss"(必見!)と書いてあったので、嬉しかったです。


準備段階での悩み

今回は悩みまくりました。CfPを出した時点では、WWDC17開催前で、つまりCore MLの発表前で、Metal Performance Shaders の CNN API (MPSCNN) 使って実際にiOSデバイス上でGPU AcceleratedでCNN走らせてる人って当時はあまりいなくて、情報もものすごく少なかったので、まだ価値があったわけですよ。


それが、Core MLが発表されて、MPSCNNのレイヤーを直接たたく意味はあまりなくなってしまった。敷居がグッと下がって、注目度がバーンと上がって、プレイヤーもドッと増えて。


Core ML使うとiOS側の実装云々よりもほとんど機械学習側での知見と努力がモノを言うのだけど、Courseraのコースやっただけの自分はまだ人様に講釈するようなレベルではないし。。


悩みに悩んで、

  • MPSCNNであればiOS 10でも使える
  • BNNSとの使い分け
  • Core ML+Visionはどこをどう簡単にしたか
  • デモ

という話で構成しました。こういう切り口としては、わかりやすく、かつ理解と興味がつながっていくようにうまく説明できたと思います。



ただ、try! SwiftでのLT含め、そもそもの僕がこの分野でプライベートの時間を使って勉強したり勉強会やカンファレンスで登壇したりしてきたのは、「いろいろと革新的で面白いことができそう」というワクワク感からで、ここをほとんど「実践」できないまま登壇して、結果的に自分のトーク内容にもその「ワクワク感」があまりこめられなかったなと。理想的には、もっと色々な実案件をやったり大量のデモをつくってみたりして、そういうのを紹介しつつ、どう、おもしろそうでしょう、というところから話を展開したかった。WWDCの発表で大幅に当初の思惑が狂ったとはいえ、既存の知見をこねくりまわしてどう発表に落とし込むかに準備時間の大半を使ってしまったなと反省しています。


その後のデンバー滞在/リモートワーク

生まれて初めてのデンバー行きで、「この広いアメリカ、同じ場所をもう一度訪れるチャンスはそうそうないかもしれない」と思い、滞在を1週間ほど延長して、リモートワークしてました。これが最高に良かったのですが、facebookに日々色々と書いてたのでここでは割愛します。


f:id:shu223:20170830202708j:image:w400

(皆既日食中のデンバー)


おわりに

360iDev登壇、デンバーの旅、反省点も含め、非常に良い経験になりました。これもあって執筆が遅れていたのですが、今必死で巻き返しております・・・!



*1:LTは5分だったので、具体的なことはほとんど何も説明できなかった

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

$
0
0

ARKitのサンプルは公式のを含めいろいろ出てますが、自分でも色々とつくる機会があった(後述)ので、せっかくなのでそれらをまとめて一つのアプリにして「ARKit Sampler」として公開しました。


ARKit Sampler


f:id:shu223:20170920095943p:image:w300


ソースコードは GitHub に置いてあるので、ご自由にご活用いただけると幸いです。


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



使い方:

  • ここから Inceptionv3.mlmodel をダウンロードして mlmodels フォルダ配下に置く
  • Xcode 9 でビルドする

ぜひ本日アップデートしたてのiOS 11端末にインストールして歩き回りながら試してみてください!



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


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


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


3-lines AR

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


f:id:shu223:20170913155719j:image:w200


Plane Detection

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


f:id:shu223:20170913173302j:image:w200


Virtual Object

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


f:id:shu223:20170913170249j:image:w200


AR Interaction

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


AR Measure

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

f:id:shu223:20170913224145j:image:w200


AR Drawing

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


f:id:shu223:20170825154724j:image:w200


Core ML + ARKit",

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


f:id:shu223:20170909170336j:image:w200



Metal + ARKit

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


f:id:shu223:20170904173246j:image:w200


Coming soon...

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

書籍「iOS 11 Programming」


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


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


iOS-11-Samplerは?

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


*1:Appleによる公式サンプルではアプリとしての体裁を整えるため、あるいは応用実装の方法を伝えるために実装が複雑になっているケースが多々ある

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

$
0
0

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について紹介してみたいと思います。


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



動画が公開されたらそちらも貼りたいと思います。



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

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




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







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



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


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

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


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


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

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


f:id:shu223:20171030085505p:image:w600


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


[海外][フリーランス][iOS]サンフランシスコで就職して1年が経ちました

$
0
0

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


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


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


f:id:shu223:20170616204618j:image:w600

(オフィスの屋上でビールの図)


状況のおさらい

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

  • 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デバイス側で動かすところまでやってしまうので、残念ながら社内の仕事では自分の出番がほぼなかったのですが、自分にそのへんの仕事がまわってくるようにと、

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


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


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


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

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


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


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

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


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

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


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


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


f:id:shu223:20171120075700j:image:w500

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


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



ちなみにうちの会社、CEO、CTO、SVP Engineering、SVP Webのファウンダー陣全員が現役バリバリでコード書きます。これは本当にエンジニアの働く環境としては良くて、正当に評価されてるなぁ、という実感があります。


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


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


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


まとめ

まとめると、

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

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


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


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


[Metal][iOS][制作実績]「iOS 11 Programming」を共著で執筆しました/本書のおすすめポイント

$
0
0

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


iOS 11 Programming

iOS 11 Programming

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

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


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


f:id:shu223:20171118154230j:image:w500

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


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


第2章: ARKit

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


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


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


f:id:shu223:20171128084826j:image:w600

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


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

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

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


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


f:id:shu223:20171128085004j:image:w600

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


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


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


第13章: Metal

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

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

正直なところ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...が登場しても価値を持ち続ける


ということです。


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


たとえば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:言語の解説書ではなく、という意味

[雑記][フリーランス][海外]2017年の反省

$
0
0

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

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


いま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][画像処理][機械学習]3D写真の機能をアプリに組み込める「Fyuse SDK」の使い方

$
0
0

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


f:id:shu223:20180212093040p:image:w600


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


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


Fyuseとは

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


f:id:shu223:20180212081601g:image





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


f:id:shu223:20180212084457g:image

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


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



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

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

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


SDK導入事例

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


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

f:id:shu223:20180212083657j:image:w600


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


「車」向けの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)")
}

これで撮影機能は完成。


f:id:shu223:20180212083923j:image:w250


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ベースのディープラーニングを用いた物体検索

f:id:shu223:20180212090119j:image:w250


Car Mode

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

f:id:shu223:20180212090334p:image:w480


Tagging

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

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

f:id:shu223:20180212090435p:image:w480


VR, AR & MR-ready

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

f:id:shu223:20180212090529p:image:w480


f:id:shu223:20180212090713g:image

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


Infinite Smoothness

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

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

f:id:shu223:20160929041931p:image:w480


お問い合わせください

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

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


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


移転しました

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

$
0
0

昨日、共著で執筆した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:言語の解説書ではなく、という意味

2017年の反省

$
0
0


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

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


いま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前後ありますが、それはたまたまではなくて、意識してそこまで持っていってます。(数の)驚きがないと、広がっていかないので。

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

$
0
0


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`オブジェクトを作成する

privateletcamera= FYCamera()


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

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

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

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

撮影開始/停止

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

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

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

classViewController:UIViewController, FYCaptureEventListener

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

camera.add(self)


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

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


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

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

これで撮影機能は完成。


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

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

  • 1. FYFyuseViewオブジェクトを作成する
@IBOutletprivate weak varfyuseView:FYFyuseView!

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

privateletfyuseView= 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月)はエンジニアリングのトップと、ビジネスデベロップメント/マーケティングのトップが日本に行くので、直接ミーティングできると話も早いと思います。ぜひぜひこの機会に!



移転しました

$
0
0

これまで書いていた「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

パートタイムになりました

$
0
0

2016年10月よりサンフランシスコのFyusion社でフルタイムで働いてきましたが、今年2月16日より、パートタイム社員として働くことになりました。

・・・とだけ書くと、あれ、fire的な何か?と心配されそうですが、これは僕から希望して、どちらかというと会社に無理を聞いてもらったかたちになります。

どうなったかシンプルにいうと、今後はアメリカにいる間は会社にフルコミット、日本にいる間はフリー」ということになりました。H-1Bビザはフルタイムである必要はないので、今後も維持されます。1

Fyusion社で、サンフランシスコで働くことは学びが多く、メンバーも魅力的な人達ばかりで、まだまだ続けたい気持ちがありつつも、興味のある技術を勉強し、発信し、そこから仕事を獲得し、さらに経験と実績を積み・・・というフリーランス時のサイクルが恋しくもあり、フルタイムで働くことに悶々とするところもありました。

で、今年の年明け早々に長い長いメールを書いて自分の考えを伝え、僕の希望と会社の要望との摺り合わせ、法務・労務的な調整etcがあって、このような形となりました。こういうわがままを受け入れてくれた会社の皆様には本当に感謝です。より濃い密度で貢献していく所存です。

アメリカと日本にいる割合ですが、1:2ということで今は考えています。3分の2はまた以前のようにフリーランスとなりますので、みなさままたよろしくお願いいたします🙇🏻

関連記事

入社の経緯と経過報告

d.hatena.ne.jp

d.hatena.ne.jp

結局どうしたいの、というあたりのキャリア観については以下の記事に書いています。

d.hatena.ne.jp


  1. 確定申告はアメリカと日本、両方でやることになります。

try! Swift Tokyo 2018で登壇しました&補足 #tryswiftconf

$
0
0

先週開催されたtry! Swift Tokyo 2018にて登壇させていただきました。

f:id:shu223:20180301180646j:plain

タイトルは "UIImageView vs Metal"ですが、Metalの使い方の話「ではなく」、Metalを通じて普段意識する機会の少ないGPUレイヤに目を向けてみるという内容となっております。

実際のところ多くの開発者にとってMetalは使う予定がない/興味がないもので、この一大イベントで800人もの方々の前で関係のない話をしても仕方がないので、せめて何か興味を持って聞いてもらえる切り口はないだろうか、ということでお話をいただいてからの数ヶ月間悩みに悩み、あれこれ検討して、この方向性で行くことにしました。

というわけでMetalを使ってない、使う予定がないという方々にも多少なりとも興味を持っていただける内容になったのではないかと思います。

日本語版スライドはこちらです。

また、発表で用いた英語版はこちらになります。

補足/FAQ

Metalについて話しつつも主題としては別のところにある、というそもそもの発表の構造と、時間の制約もあり、説明が不十分だった部分もあるのでこちらにて補足させていただきます。

トーク内に出てくる「対策」は必ずしもベストプラクティスではない

トークの中で、「問題1の解決策として2つのコマンドを1つのコマンドバッファにまとめた」というくだりがありますが、注意点として、これはベストプラクティスであるというわけではありません。

(もともとやっていたように)リサイズは先に済ませておいて、draw(in:)では描画処理だけやるのが望ましい、とも考えられますし、そもそも描画処理をMTLBlitCommandEncoderではなくMTLRenderCommandEncoderMTLComputeCommandEncoderでやっていればリサイズ処理を別途やる必要もない(シェーダ内で同等のことをやればよい)とも考えられます。

前者であればではどのようにCPUとGPU間で(お互いを待ち合うことなく)連携するか、という話が必要になってきますし、後者の方向性で実装するのであれば、シェーダ等についての解説も必要ですし、直面する問題も変わってきます。いずれにせよこのトーク全体の構成に大きく影響しますし、シェーダやエンコーダ云々の解説をするのであればトークの主旨すら変わってくるでしょう。

このトークのこのパートで伝えたかったのはあくまで "CPUとGPUの処理フローに配慮する"という「視点」です。

また問題2の対策としてキャッシュする、という話もしましたが、これもキャッシュするべきか否か、どのようにキャッシュするか、というのはアプリケーション次第で変わってくるので、このトークにおいて重要なのはそこではなくて、"GPUからアクセスするリソースの場所に配慮する"という「視点」です。

ごちゃごちゃと書きましたが、つまり、本トークは「このようにしましょう」というベストプラクティスを提示することを意図したものではないので、その点ご留意ください。

最終的な速度はどうなったの?

最終的な処理時間がどうなったかが気になった方は多いと思われます。処理時間ベースで問題提起しておいて改善後のものを出さなかったのには色々と理由がありまして、それらを一言で言うとすると、「今回のトークの範疇では最終結論となるような数値は出せないから」ということになります。

たとえばp38での計測方法の修正によりGPUの処理時間も加味されたものになりましたが、waitUntilCompleted()GPUの処理完了を待って時間を計算している部分はあくまでCPUにおける処理であって、依然として厳密にGPUでの処理完了タイミングを測れているわけではない、というところがあります。

そしてUIImageViewの方は単にCPU側でのメインスレッドにおける処理時間を測っているに過ぎません。これがCPUとGPUの処理フローにおけるどこまでの範囲を測っていることになるのか、それは我々はUIImageViewのソースコードを持っていないのでわかりません1

上記2点の理由により、これら2つの処理時間を並べて比較することが適切ではない、ということがそもそもの話としてあります 2

そして、具体的な数値がスライドの最後に載っていると、その数値がファイナルアンサー(=Metalの速さ)として独り歩きしてしまう恐れがあります3

上記の補足にもあるとおり今回の実装はベストプラクティスというわけでもなく、あくまで概念や視点を伝えるためのものなので、あまり意味のない数値が意味のある数値のように拡散されてしまうのを避けるために、意図的に最終的な数値は明示しませんでした。

ではMetalはどういうときに使うのか?

「UIKitの下回りがMetalになってて、Appleの中の人がしっかり最適化してくれてるので、自分で下手に低レベルAPI触るよりは普通にUIKit使えばいいよ」ということを今回のトークの中で言ったので、じゃあMetalはどういうときに使うのか、という質問をいただきました。

たとえば僕は以下のようなケースでMetalを利用しました。

  • シェーダを書いて独自の画像処理を行う
  • MPSCNNを利用する
  • ARKitのカスタムレンダリング

共通点としては「カスタムな並列処理を行いたい場合」という感じでしょうか。

当然これらの処理のあとに、処理結果の画像をUIImageに変換してUIImageViewで表示する、みたいなことをやるとそれこそまさにトーク内で話した「CPUとGPU間を行ったり来たりする」というバッドプラクティスそのものなので、そのままMetalでレンダリングすることになります。

OpenGLを使っているけどMetalに乗り換えた方がいいのか?

特に具体的に困っていることがないのであれば、乗り換える必要はないと思います。OpenGLの方がクロスプラットフォームですし。WWDCラボでAppleの人が言ってましたが、今のiOSではOpenGLもMetalの上に実装されているそうです。

今から始めるのであれば、Metalの方がOpenGLよりはシンプルでとっつきやすいのでは、と思います。初心者にとっての鬼門はGPUまわりの概念であって、そこさえ押さえてしまえば他方のGPUフレームワークに移るのはそれほど大変じゃない(=つぶしがきく)のではと。

Metalに興味はあるがどこから始めたらよいか?

スライドにもあるとおり、Metalは最小実装でも結構コードが長くなるので、初心者には「はじめの一歩目が遠い」と思います。英語ですが書籍や動画等の学習用リソースは色々とあり、僕も今となってはそれらを参考にしていますが、OpenGLDirectXの経験がない中での最初の一歩目としてはそれらは難しく、結局Appleのサンプルを頼りに四苦八苦して学びました。

で、手前味噌になってしまいますが、僕の昨年のiOSDCでの解説、およびiOS 11 ProgrammingでのMetalの章の解説はそんな「最初の一歩目が大変だった」僕の目線で噛み砕いて書いてあるので、かなりわかりやすいのではないかと自負しております。

ちなみにQ&Aブースで海外の方からこういう質問をいただいて、Xcodeのテンプレート(=比較的最小実装に近い/そのままBuild&Run可能)を色々といじってみるところから始めてはどうか、というアドバイスをしました。僕がそこから始めたので。

MetalImageViewのAPIが途中で変わってる件

p26でmetalImageView.texture = textureという感じで簡単に使えるようにする、と構想を述べつつ、p30ではmetalImageView.textureName = nameとなっていたことに、気付いた人もいたようです。

前者のように構想しつつなぜp30で後者のようにしたかというと、metalImageView.texture = textureとするにはMTLTextureオブジェクトをつくる部分が必要になるのですが、そこをラッパークラスの外に出してしまうとp30のコードが見づらくなってしまうし、MTLTextureに初期化メソッドを生やしてmetalImageView.texture = MTLTexture(named: name)ってできるようにするとコード的には構想通りになるけど、そうするとテクスチャロードが同期的になってしまう(→ その後の話の展開が大きく変わってしまう)、というジレンマにより、こんな感じになりました。

御礼

try! Swiftでの登壇は密かにずっと憧れていました。try! Swiftのフルトーク(↔LT)はCfP制ではなく主催者による招待制なのですが、僕は"Swift力"は並かそれ以下なので、このタイミングでお声がけいただけたのは本当に幸運だったと思います。Metalは、もともと興味があったのはもちろんですが、try! Swiftで話す切り口を模索するために勉強していたところも大いにあります。

結果としては、多くの方に楽しかった、良かったと言っていただき、Q&Aも(僕が閉会式に行き損ねたぐらいに)途切れることなく質問に来ていただきました。

出番が最後の方だったこともありずっと気持ちがフワフワしていましたが、非常に思い出深い3日間でした。

長期間準備され、会期中は朝早くから夜遅くまで動き回っていたスタッフの皆様、スポンサー企業の皆様、参加された皆様、どうもありがとうございました!Swiftもっと勉強します。


  1. 今年WWDCに行けたらラボで聞いてみます。

  2. ではなぜ最初にこれらの比較を行っていたかというと、計測方法において僕が実際にしていた勘違いを紹介し、その改善の流れを見ていただくことがGPUレイヤへの「視点」を理解するのに役立つと思ったからです。

  3. BLEのときにそういうことが実際にあった

try! Swift 2018の思い出 #tryswiftconf

$
0
0

try! Swiftは非日常感がありどの年も色々と思い出があるのですが、今年はスピーカーとしての参加ということで最初にお声がけいただいた9月から約半年感、ずっとtry! Swiftを意識して行動してきたといっても過言ではなく、感慨深さもひとしおでした。

終わってからの2週間、仕事の状況がガラッと変わったこともありしばらくそんなことも忘れるほど忙殺されていたのですが、最近アップされた公式の写真を見ていると色々と思い出されたので、(もう発表内容についての補足記事は書いたものの、)せっかくなので発表内容以外の振り返りについて書いておきたいと思います。

2017年9月: 打診いただく

9月某日、オーガナイザの pancake 氏よりお話をいただきました。

iOS Top 10 Conferences にも選ばれ、海外からも多数の参加者のある名カンファレンスに招待されるチャンスはもう二度とないかもしれません。実際のところ、try! Swift Tokyoは東京開催で同時通訳が行われるので僕でも呼んでいただけましたが、英語主体のカンファレンスではなかなか厳しいのが現実だと思います。1

そんなわけで、打診いただいたその場で二つ返事でお受けしました。

この時点で発表の軸はMetalしかないかなと考えていました。僕が2017年に興味をもって取り組んでいたのは機械学習、Metal、ARあたりですが、機械学習は結局実務で取り組む機会がなく 2、ARはまだARKitの薄いレイヤしか知らないのでカンファレンスで話すような体系立った知見がない。普通に仕事で使ってる&他に話す人もいなさそうなMetalしかないだろう、と。

〜2018年1月: 技術調査

12月にはMetalのアドベントカレンダーも立て、どれだけMetal好きなんだ、と思われたかもしれませんが、常に頭にあったのはtry! Swiftで発表するからには、知見をしっかりためないと、というところでした。

GPUまわりはもともと興味のあったところですが、try! Swift登壇が決まってなかったら、あんなにMetalMetalせず、機械学習とかARとかその他iOSの新機能とか、もうちょっと幅広く勉強したり記事書いたりしてたと思います。

2017年12月: 発表のタイトルと概要が決定

12月だったかに発表のタイトルと概要を3案ずつ提出して、ナターシャさんがチョイスする、というのがありました。

僕が出した3案はどれもMetal縛りでしたが、それぞれちょっとずつ「切り口」が違ってました。

  • UIImageView vs Metal
    • 今回のやつ。Metal自体の解説ではなく、「普段意識する機会の少ないGPUレイヤに目を向けてみる」というのがコンセプト。

MetalはGPUへのアクセスを提供するAPIで、OpenGLより10倍速いという謳い文句で登場しました。本セッションではMetalの基礎を解説しつつ、そのグラフィックス描画性能をUIImageViewと比較してみます。 MetalのAPIを直接利用する機会がなくても、Metalはあなたのアプリの裏で暗躍しています。身近なクラスとの比較を通じて、普段我々が意識することのないGPUのレイヤで何が起きているのか、目を向けてみるきっかけになればと思います。

  • 非ゲームアプリにおけるMetal / Metal for non-game apps
    • 「Metalってゲーム用でしょ?」いやいやそうじゃないアプリでも実際に使ってるんですよ、ということを示しつつMetalの基礎について話す。

「Metal=本格的なゲーム向けのAPI」と考えてしまい、興味の対象外としている開発者は多いのではないでしょうか。そんなことはなく、Metalはグラフィックス処理から機械学習の計算まで、「非ゲーム」アプリにおいても大いに活用の場があります。本セッションでは、実際にAppStoreにリリースされているアプリでのMetal活用事例を題材に、その基礎と実装方法について解説していきます。

  • iOSGPU Programming
    • 普通にMetalについて解説する。ただしなるべくGPUプログラミング未経験者にもわかりやすく。

GPUはその名の通りグラフィックス向けのプロセッサですが、今ではその並列演算処理能力に着目して、ディープラーニングの行列演算のような汎用的な計算で用いられるケースも増えてきています。 そんなGPUへのアクセスを提供するAPIが、Metalです。本セッションでは、Metalを利用してiOSバイスGPUで処理を行う方法について、初めての方でも理解できるよう基礎から丁寧に解説します。

で、"UIImage vs Metal"がチョイスされたわけですが、たとえばもし2番目のになったとしたら、Fyusion社の事例(画像処理、機械学習、描画、いろんな機能で使ってる)について話すことになるわけで、そうすると、会社に許可を取らないといけない部分も多く、会社にこういう打診をするタイミングももっと遅くなってたかもしれません。そんなキャリアの判断の基準にするほどに、try! Swiftでの登壇は重要視していました。

2018年2月: スライド作成

これは2月中旬に帰国してから着手したのですが、難航しました。「Metalを使うためだけに必要な知識」は本発表のコンセプトでは基本的には不要なのですが、Metalを通じてGPUの気持ちを理解しよう、というところではこの説明をしないといけない、うーむ、みたいな。

同時通訳の方々は下調べ等の準備を行うので、2週間ほど早くトランスクリプトつきで提出する必要があったのですが、まずはできているところだけ提出して順次追加版を提出していきました。

(仙台にてもくもくスライド作成合宿)

2月後半の2週間はほぼフルタイムでtry! Swiftのスライド作成に取り組んでいました。

当日

akatsuki174 がまとめてくれたツイートより、当日の様子が分かる感じのをいくつか時系列にピックアップしていきます。

  • 登壇者としては欠かせない宣伝(英語ですべきだけど)

  • 開始前

  • すごく拡散されていた一枚(スライド全体よりも。。)

  • GPUに向いている処理とは

  • UIImageView vs Metalパフォーマンスの結果発表直前(ちゃんとワクワクしてくれていて嬉しい)

  • 🙏

  • UIImageViewは既に十分に有能だった

  • 問題1

トークの内容としてはまだ続きますが、長くなりそうなのでこのへんで。

反応(ツイート)

これについてはQ&Aで同様の質問をいただいたので、補足記事にてコメントしてあります。

shu223.hatenablog.com

反応(ブログ)

ブログ記事でもいくつか反応をいただいてます。大変ありがたいです。

tech.appbrew.io

GPUがどんな物なのかという導入からMetalを使った自作ライブラリのパフォーマンス測定、その過程で得られた知見についてのトークでした。 MetalとGPUについては知識は殆どなかったのですが、GPUとCPUでのコマンドがどのようにやり取りされているか紹介されていたので処理の概要について知ることができました。 自作ライブラリのパフォーマンス測定ではInstrumentsを使用したデバッグの過程が詳細に述べられており、非常に興味深い内容でした。個人的にはInstrumentsを上手く使いこなせていなかったので、その使用例としても面白い内容でした。 iOSアプリは画像描画の速度でユーザー体験が大きく変わるのでパフォーマンス改善をする際にはMetalの部分まで考慮して実装していきたいです。

medium.com

タイトルに「vs」と入っていますが、実際にはUIImageViewはMetalを使って構築されています。堤さんがUIImageViewのようなものをMetalを使って自作してみようとした経験を元に、Metalが何をやっているのかという部分を通じて、GPUレイヤーに目を向けてみようという話でした。Step by Stepで話が進行してゆき、わかりやすく納得感のある内容でした。

なお、ぼく個人はMetalの知識を全然持っていないのですが、そんな人が興味を持つ導入としての話になっていたのではないかと思います。

blog.lisb.direct

アニメーションなどの描画性能はアプリを作る上で決して無視することができない課題です。このセッションではUIKitの内部処理を理解した上でパフォーマンスチューニングを行うことの大切さを知るための体験談を共有してくれました。directのiOSアプリは短い時間で正確な情報をユーザーに伝えるという大切な使命があります。よりユーザーにとってわかりやすくストレスがないアプリにしていくためにMetalまで意識したパフォーマンスチューニングは大切だと強く意識するきっかけとなりました。UIKitはiOSのバージョンアップによって内部の実装が変わることもあるため、そのバージョンに応じて適切な実装を心がけます。

2018 try! swift - Nakajijapan

これは純粋に面白かったし、Metalのこともわかった気になった。

try! Swift 東京 2018 的一些見聞 - 掃文資訊

カッコ()内はGoogle翻訳

堤修一 以前也是 Kayac的員工,算起來和我在 Kayac還有幾面之緣。不過顯然他並不記得我,直到看到我的 badge 的 ID 才説“哦哦,就是那個頭像是小貓的男人啊”。每年 WWDC結束後其實都會跟着他的 iOS-Sampler 項目學習新 API的用法,受益匪淺。

(Dian XiuyiはKayacの従業員でもあり、Kayacで私と数えます。 しかし、明らかに彼は私のバッジのIDが「ああ、それはアバターが猫の人だ」と言うまで私を覚えていない。 WWDCが終了してから毎年、彼はiOS-Samplerプロジェクトに従って新しいAPIの使い方を学びます。)

這次他帶來了一個關於 Metal 的話題,探索和對比了使用 Metal 進行圖片渲染和直接使用 UIImageView 的異同。一開始給出的數據十分驚人,Metal 的結果要比 UIImageView 快上十到二十倍。但是隨着深入,發現這不過是測量錯誤和實現錯誤的疊加。實際上按照 WWDC 2017 的説法,UIKit 已經在底層使用了 Metal 進行加速。對於 GPU相關的性能測量以及中後段通過 Metal System Trace (我自己是從來沒用過) 來尋找問題的部分很有意思。

(今回は、Metalに関するトピックを紹介し、Metalを使用して画像をレンダリングし、UIImageViewを直接使用することの類似点と相違点を調査し、対照しました。 最初に与えられたデータは驚異的でした。メタルの結果はUIImageViewより10〜20倍速かったです。 しかし、深くなっていくにつれて、測定誤差と実装エラーが重なり合っていることがわかりました。 実際、WWDC 2017によれば、UIKitは下部に加速のために金属を使用していました。 興味深いのは、GPU関連のパフォーマンス測定値と、中期および後期のセクションで、Metal System Traceの問題を探す部分(私はそれを自分で使ったことはありません)です。)

一句話總結就是,不要想着從底層折騰一套自己的 UI 渲染了,乖乖滾去用 UIKit 吧。信蘋果,得永生。

(要約すると、独自のUIレンダリングのセットを一から上に投げ捨て、UIKitでロールアウトすることについて考えないでください。 私はリンゴを信じ、永遠の命を持っています。)

https://techblog.istyle.co.jp/2018/03/05/try-swift-2018-report/

try! Swift 2018では普段あまり意識することのないlow-levelに焦点を当てた発表がいくつかあり、そのなかで一番身近に感じた発表がこちらでした。

まず発表自体がとってもわかりやすかったです!!!

また、普段何気なく書いている処理がCPU/GPUどちらで動いているのか、正直気にしたことがなかったぼくにとってはとても新鮮で、新しい気づきとなりました。

こちらは発表が終わった後に質問をしてUITableViewのパフォーマンス改善について有益なアドバイスをいただくことができました。UITableViewのパフォーマンスはほぼ全ての画面で気にしなければいけないことなので、注意していきたいです。

tid-a24.hatenablog.com

GPUのことを考えるきっかけになるセッションでした。 ゲームを作っていたころは、ずっとGPUのこと考えてる状態でしたが最近はあまり考えてません。

  • コマンドを送る時は1回にまとめる。
  • テクスチャはGPUにキャッシュさせる。

などは、基本的にMetalだけでなくOpenGLDirectXでも同じです。

shachi.hatenablog.com

vs とは書いてましたが、内容はMetalで表現すると速い……あれ? なんか変。あ、GPUとCPU切り替えてなかった。ちゃんと区分けしないと。 という「やらないと判らない知見」でした。こういう発表は後に続く人が出るので大変嬉しいし、すてき案件。

medium.com

今回は参加者が理解しやすいような題材としてUIImageView vs Metalという発表をされました。主にMetalを通じてGPUレイヤに目を向けてみようという内容でした。

私達が普段何気なく使っているUIImageViewは早いのでしょうか?ピクセルを配置するなど並列処理可能な処理はGPUに任せた方がよりパフォーマンスが良いのではないでしょうか?

こういった切り口で独自のカスタムクラスを作成し実測値を元に発表されました。

jp.corp-sansan.com

MetalImageViewという、UIImageViewのように画像を扱えるMetalラッパークラスの実装を行った経験を通じて、GPUレイヤーの処理を細かく追っていくという内容でした。XCodeのInstrumentsであるMetal System Traceを効果的に利用してボトルネックを特定し、パフォーマンスチューニングを行っていく過程はとても勉強になるもので、GPUに関する知識が全くない状態でも分かりやすく、大変興味深い内容の発表でした。

After try! Swift

try! Swift 直後の土曜、ワークショップは早退し(すみません)、翌日に日本を発ってしまうFyusion社の同僚たちと東京散策に行ってました。

原宿(同僚たちが既にそこに行ってた)を散策し、カフェで雑談したあと、僕自身も初めてのパチンコ屋に行き、

松阪牛の焼き肉を食べ、ゴールデン街へ。

f:id:shu223:20180317144735j:plain
ゴールデン街(写真は昨年のもの)
バーテンの方に「日本語上手ですね」と言われましたw

おわりに

  • 来年は登壇のプレッシャーもないことだし、もっと海外の人たちにどんどん自分から声をかけてコミュニケーションしたい
  • そろそろSwiftちゃんとやる(仕事ではObjective-C...)

  1. CfPを出して採択されるコースは別として。

  2. 社内に機械学習のプロが何人もいるので。。

#技術書典 4で「Metal入門」という本を販売します

$
0
0

iOS/macOSGPUインターフェースMetalの入門書を書きました。その名も「Metal入門」です。4月22日に開催される技術書の同人誌イベント、技術書典4向けに書いたもので、初めて出版社を通さず個人で書いた書籍になります。ちなみに日本語としては初のMetal解説書1でもあります。

本の詳細

A5版(技術評論社の実践入門シリーズのサイズ)で全128ページ。一時150ページに達したのですがどうにかこうにか切り詰めてここまで収めたので、ギュッと詰まってます。小さくて(普通の技術書よりは)薄いので、カバンに入れておいても邪魔にならないサイズです。

f:id:shu223:20180418104931p:plain

ちなみに「GPUと戯れてみたいけどまずはほんのさわりでいい」という方のために、全48ページの「普及版」も用意しております。

GPUを操ることに興味のある方、GPUの気持ちをもっとわかりたい方はぜひ!

価格

無料サンプル

まえがき・目次・各章のさわりを試し読みできる無料サンプルをこちらからダウンロードしていただけます!

booth.pm

通常版

(製本仕様)128ページ/平綴じ/マットPP

  • 製本版のみ: 1200円(会場限定・・・の予定)
  • 電子版のみ: 1200円(4/25以降は1500円)
  • 電子版とのセット: 1500円(会場限定)

普及版

(製本仕様)48ページ/中綴じ/表紙なし

  • 製本版のみ: 500円(会場限定の予定)
  • 電子版のみ: 検討中
  • 電子版(通常版※)とのセット: 検討中
    • ※普及版の電子書籍版は作成しない予定です

目次

  • はじめに
  • 第1章 Metal の概要
    • 1.1 Metal とは
    • 1.2 Metal の用途
      • UIKitでもMetalが利用されている
      • 増え続けるMetal関連機能
    • 1.3 Metal を構成するフレームワーク群とシェーディング言語
  • 第2章 Metal の基礎
    • 2.1 Metalの「最初のハードル」
    • 2.2 「背景にある概念」を理解する
    • 2.3 Metalの基本クラスとプロトコル
      • MTLDevice
      • MTLCommandBuffer
      • MTLCommandQueue
      • MTLCommandEncoder
      • MTLBuffer,MTLTexture
    • 2.4 MetalKit
      • MTKView
      • MTKViewDelegate
      • MTKTextureLoader
  • 第3章 入門その1 - 画像を描画する
    • 3.1 描画処理のためのセットアップを行う
    • 3.2 画像をテクスチャとしてロードする
    • 3.3 描画処理を実行する
      • ドローアブル
      • MTKViewのcurrentDrawable
      • ブリットコマンドエンコーダ
      • 描画処理の全体
  • 第4章 入門その2 - シェーダを利用する
    • 4.1 Metalシェーダの基礎
      • シェーダとは
      • MetalShadingLanguage(MSL)
      • Metal シェーダファイルと Metal ライブラリファイル
      • MTLLibraryMTLFunction
    • 4.2 「画面全体を一色に塗る」シェーダの実装
      • 1.Metalシェーダファイルの作成
      • 2.頂点シェーダ関数の実装
      • 3.フラグメントシェーダ関数の実装
    • 4.3 CPUプログラム側の実装
      • シェーダにデータを渡すためのバッファを準備する
      • レンダリングパイプラインを用意する
      • MTLRenderPipelineStateの生成タイミング
      • レンダリングコマンドをエンコードする
  • 第5章 入門その3 - シェーダでテクスチャを描画する
    • 5.1 テクスチャを扱うシェーダの実装
    • 5.2 テクスチャ内座標データをシェーダに渡す
    • 5.3 テクスチャをシェーダに渡す
    • 5.4 ピクセルフォーマットを合わせる- 第6章 Metal のハードウェア要件
    • 6.1 歴代iOSデバイスのMetalサポート状況
    • 6.2 MTLFeatureSet
    • 6.3 Metal非対応デバイスの判定- 第7章 GPGPUプログラミング入門
    • 7.1 コンピュートシェーダ - コンピュートシェーダとカーネル関数 - 頂点シェーダ+フラグメントシェーダとの違い.
    • 7.2 スレッドとスレッドグループ
      • スレッドグループのサイズと数を指定する
      • シェーダ側でスレッドの位置を取得する
    • 7.3 GPGPUの実装例 - パススルーコンピュートシェーダ - CPUプログラム側の実装
  • 第8章 MSL 入門
    • 8.1 Metal のグラフィックスレンダリングパイプライン
    • 8.2 .metalファイルと.metallibファイル - デフォルトライブラリ - コマンドラインユーティリティを用いた Metal ライブラリのビルド
      • 実行時にMSLをコンパイルする
    • 8.3 FunctionQualifier(関数修飾子)
    • 8.4 AttributeQualifier(属性修飾子)
      • [[position]]
      • [[vertex_id]]
      • [[stage_in]]
      • [[buffer(n)]]
      • [[texture(n)]]
      • [[sampler(n)]]
      • [[threadpositionin_grid]]
      • [[threadgrouppositioningrid]], [[ threadsper_threadgroup ]]
    • 8.5 Address Space Qualifiers(アドレス空間修飾子)
    • 8.6 型
      • テクスチャ型
      • サンプラー型
    • 8.7 GLSLをMSLに移植する
      • 型の違い
      • 戻り値の違い
      • プロトタイプ宣言
      • 作例
  • 第9章 Metal Performance Shaders
    • 9.1 デバイスがMPSをサポートしているかを確認する - 9.2 ガウシアンブラー - 9.3 MPSUnaryImageKernelを継承する他の画像処理カーネルクラス
    • 9.4 画像のリサイズ - 9.5 画像の転置(行と列の入れ替え)
  • 第10章 Metal の最適化
    • 10.1 スレッドグループサイズの最適化
      • スレッドグループサイズの決定方法 - 不均一スレッドグループサイズを利用して最適化する - 10.2 ArgumentBuffers
      • ArgumentBuffersの概要 - ArgumentBuffersの実装 - 第 11 章 Metal のデバッグ
    • 11.1 GPUフレームキャプチャを有効にする
    • 11.2 Xcode上でGPUの負荷を確認する
    • 11.3 GPUフレームデバッガ
      • シェーダにバインドされているリソースの一覧を見る
      • パイプラインの統計情報
      • パフォーマンス改善のヒント
      • issueを見る
      • シェーダの処理毎のパフォーマンス確認
    • 11.4 GPUフレームキャプチャをプログラムから制御
    • 11.5 InstrumentsのMetalSystemTrace
    • 11.6 ラベル
    • 11.7 デバッググループ
    • 11.8 GPUで利用中のメモリサイズを調べる
  • 第 12 章 Core Image× Metal
    • 12.1 Core ImageとMetalのシームレスな統合
    • 12.2 Core Imageのフィルタ結果をMetalで描画する
      • MetalによるCIImageのレンダリング
      • 実装例
    • 12.3 CoreImageのカスタムフィルタをMetalで書く
    • Metalでカーネルを書く利点
    • MSLによるカスタムカーネルの実装
    • Metalカスタムカーネルを利用するためのビルド設定
  • 第 13 章 SceneKit × Metal

    • 13.1 Metal で SceneKit のマテリアルを描画する
      • SCNProgramの実装
      • SCNProgramで利用するシェーダの実装
      • SCNProgramで用いるシェーダに値を渡す
    • 13.2 他のSceneKitとMetalの連携機能
      • SCNTechnique
      • shaderModifiers
      • SCNRenderer
  • 第14章 ARKit × Metal

    • 14.1 マテリアルをMetalで描画する
    • 14.2 MetalによるARKitのカスタムレンダリング
  • 第15章 Core Video × Metal
    • 15.1 Metalでリアルタイム動画処理
      • CVImageBufferからMTLTextureを作成する - CIContextを利用
      • CVImageBufferからMTLTextureを作成する - CVMetalTextureCacheを利用

余談:技術書典で本を出す理由

僕はフリーランスエンジニアでして、1日n万円の単価でお客さんに技術力を提供して生計を立てております。ありがたいことに今のところは食べていけております。

しかしお客さん仕事は基本的に「僕がプロとして間違いなく貢献できる領域」についてご依頼いただけるものなので、それだけでスケジュールを埋めてしまうと、

  • 仕事で必要なわけではないが単に興味がある
  • 今は素人だけど学んでいきたい

というような、「今は仕事になってない技術」を開拓していく時間が減ってしまいます。

なので理想的にはスケジュールをびっちり埋めずに、興味のある技術を勉強したり、それを発信したり、オープンソースで公開したり、という時間を確保したいという気持ちはあるのですが、まぁでもお客さんの仕事もおもしろいし勉強になるし、お金ももらえるし・・・ということでどうしても仕事で埋めてしまいがちです。

そこでよく思うのが、技術の勉強自体をマネタイズできれば、「既にスキルがあって、稼げる」フリーの仕事とバランスとってやれるようになるのになぁ、ということです。興味があってしかも稼げるなら、単純に天秤にかけるときに重みがかかる。

幸運にも、「興味のある技術を勉強しては発信してたらお仕事につながった」という例も過去にはあります(BLEとか)。しかしブログやOSSを見て仕事の依頼をいただける、というのは自分ではコントロールできないので(要は「たまたま」なので)その結果をあらかじめ織り込むことはできない。やっぱり技術情報発信そのものでマネタイズできたら理想的だなと。実際に可能かどうかは別にして、手段は探っていきたい。

その手段の候補のひとつが個人での書籍の出版です。出版社を通してちゃんとした技術書を出すのはめちゃめちゃ大変だしあまり収入にもなりませんが、個人で出すならもっとライトに出せるんじゃないの、と。ページ数が230ページ以上じゃないといけない、ということもないし、技術書っていうジャンルはプロによる超美しい装丁じゃなくてもいいと思うし、売れなそうな企画でも自分さえやりたければGOできる。

これである程度収益になるとしたら、

勉強→ブログ→ある程度たまったら本

というサイクルができたらいいな、と。そういうサイクルをまわしているうちにランダムイベントとしての「お仕事の依頼」もあるかもしれない。

で、そんなことを思い続けて案の定一文字も書くことなく4年程経ち、そこに技術書典という超素晴らしいイベントが出てきたので乗っからせていただいた次第です2。たとえあんまり売れなくても、今回技術書典ドリブンでついに個人で本を書き上げることができたというだけでも、自分的にはかなりの達成感があります。

まとめ

余談が長くなってしまいましたが、つまりいろいろ思うところがあり個人で本を書いて技術書典で販売することになりました!

Swinjectの多賀谷さんと共同ブースです(執筆はそれぞれ)。

techbookfest.org

4月22日、「き04」でお待ちしております!


  1. 章単位でいえば、PEAKS社刊行「iOS 11 Programming」のMetalの章(私が執筆)が初となります

  2. 技術書展が終わったら、noteで単発の技術チュートリアル記事販売とかも試してみたいと思ってます。

Viewing all 317 articles
Browse latest View live