Xcode11以降のProjectでUniversal LinksやCustom URL Schemeを使用する際の注意点

Dynamic Linkを使用しようと思い、Universal Linkを受ける部分の下記メソッドを書いたところ、どれだけデバッグしてもここメソッドが呼ばれない。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool

原因

Universal LinksやCustom URL Schemeに関しては、SceneDelegateのメソッドを使用するようになっているためでした。

解決方法

SceneDelegateに下記メソッドを書くことで、Universal Links実行時に処理が実行されることを確認できました。

func scene(_ scene: UIScene, continue userActivity: NSUserActivity)

Xcode11以降で新規プロジェクトを作成してSceneDelegateを使用している場合は、AppDelegateのメソッドは呼ばれなくなっているため、注意が必要でした。

追記

Custom URL Schemeのコールバック処理について、Qiita記事があったため、リンク貼っておきます。

qiita.com

今更RxSwiftに入門したので、学び方の一例紹介

2020年、今更ですが、RxSwiftに入門しました。

RxSwiftには多くのオペレーターが存在することで、全体像を捉えるまでに時間がかかりつつも

様々な記事を読みながら、ある程度全体像が見えるところまで学習を進めることができました。

学習していく中で、RxSwiftに関する記事や登壇資料などがたくさんあったため、RxSwiftは学習コストが高いと言われつつも

学習コストやハードル感が、だいぶ下がっているのではないかと思いました。

そのため本記事では、RxSwiftの初学者ができるだけ最短距離で全体像が見えるようになるための一例を紹介しようと思います。

著者は記事を書いている段階で、RxSwiftをある程度理解できたくらいのレベル感なので、より良い方法などありましたら、ご指摘頂けますと幸いです。

目次

  • RxSwiftを使うと何ができるのか、ざっくり把握する
  • Observerパターンを理解する
  • RxSwiftのPracticeを実装する
  • Hot/Coldを理解する
  • 汎用的なリンク集
  • まとめ

RxSwiftを使うと何ができるのか、ざっくり把握する

とりあえず「RxSwift 入門」とかで調べて、出てきた記事をいくつか見ました。

qiita.com

qiita.com

この辺りの記事から、様々な記事リンクに飛んで理解した気になっていました。

Observerパターンを理解する

qiita.com

iOSDC Japan 2017の登壇に関する補足資料のようですが、とても参考になりました。

iOSDCは過去の登壇も動画として上がっていたので、こちらもとても参考になりました。

併せてこちらの記事も読みました。

qiita.com

RxSwiftのPracticeを実装する

ある程度ObserverパターンとRxSwiftの全体概要を把握したら、自分でRxSwiftのコードを書けるようになる必要があります。

RxSwiftライブラリ内部に、練習用のRxExampleがあります。

私はこちらを参考にして、同じ挙動を自分で実装していきました。参考程度にリポジトリを載せておきます。

github.com

Hot/Coldを理解する

こちらの資料がとても参考になりました。

www.slideshare.net

汎用的なリンク集

まとめ

  • RxSwiftの学習コストやハードルはだいぶ低くなった(記事などが多いため、つまずきにくい)
  • 学び方の一例を紹介した
  • FRPは理解できてくると、とても楽しい

2019年振り返り/2020年目標

色々と落ち着いてきたので、2019年の目標振り返りと、2020年の目標設定を行います。

2019年振り返り

立てていた目標はこれ。

kuro-46.hatenablog.com

2019年の前半は、本365冊とかアプリ12個リリースとか、結構無茶なことを書いて、達成するためにどこまでできるか試していました。

今年の本業以外のトピックでは以下のようなことをしました。

当たり前ですが、全然達成できなかったです。やりたいことを書きすぎた感です。

とはいえ、今までに比べて圧倒的にインプット/アウトプット量を増やすことができました。具体的に以下のようなことができたと思います。

  • LT/読書を通じて思考のアウトプットが上手になった
    • 読書したことをアウトプットできるようになった
  • 個人アプリ開発を通じて開発の技術修得
    • App Store Connectやガイドライン周りの知見修得
    • デザインのノウハウ / Figma学習
    • Fastlane / Bitriseの環境を0から作ることで、CI/CDの環境構築手段を学習

インプットは継続して、アウトプットは質を高めていきたいです。

仕事

  • iOSアプリケーション開発
  • Project Manager(2019年6月~) / 新卒育成業務

iOSの能力を伸ばしつつ、Project Managerなども経験させて頂いたことで、エンジニアリング全般に関する能力が伸びたと思います。

2020年の目標設定

2019年はアウトプットのハードルをとても高くして、やりたいことを達成するために必死になっていました。

しかし、やりたいこととは別軸で、やらなければいけないことはたくさんあります。

やらなければいけないことの優先順位によって、やりたいことの優先順位も変わってくるため、2020年は目標設定についてはSMARTに立てず、緩めに設定しようと思います。

現在優先度を上げてやりたいことは以下に列挙しておきますが、自分の興味分野が変わったら変える予定です。

  • アプリをたくさん作る、飽きるまでアプリ/ツール開発
  • 英語
  • Computer Science

1-3月目標

1年は長いので、3ヶ月刻みで目標を立ててみようと思います。

3月から別の職場で働くことになり、2月は仕事がありません。そのため、2月は新しい技術キャッチアップを頑張り、3月移行は次の職場でのキャッチアップを頑張りたいです。

RxSwiftを知っておく必要がありそうなので、事前にRxSwift / MVVMの設計パターンについて、一通り学習を済ませるようにキャッチアップします。

1~2月でやること

さきほど記載したとおり、2月は仕事がありません。

何もしないとダラダラして1ヶ月過ぎてしまいそうなので、やりたいことを列挙しておきます。いくつできるかな。

  • ポモドーロカレンダーアプリのブラッシュアップ
  • RxSwiftの学習
  • 個人アプリ1つリリースする(MVVMで作る)
  • SwiftUIもっと触りたい
  • MVVM / Flux / Redux / MVI のアーキテクチャパターンを網羅的に理解する
  • 蟻本やる
  • AtCoderにとにかく参加する
  • C++AtCoderに出られるようにする
  • 本を4冊ブログにアウトプットする
  • 習慣改善(お風呂の時間の使い方見直し、ジム通いたい)
  • XcodeGen使ってVimで開発できないか試してみる

SwiftUIとMVIの相性が良さそうだったので調べてみた #1

経緯

medium.com

こちらの記事を読んで、MVI patternが気になったため、色々調べてみました。

まだまだ知らないことが多いので、間違いなどあったらご指摘頂けますと幸いです。

iOS+MVIの記事が少なく、Android/Webの知見に頼る部分も多くあるため、調べ方なども含めて、参考になると幸いです。

MVIとは

Model-View-Intentの略です。MVIのそれぞれの役割については後述しますが、まずはどのようにMVIが提案されたのか、調べていった過程で見てもらえればと思います。

色々調べている中で、Androidでは記事などで紹介されているとアドバイスをもらったので、 「Android MVI」で調べてみました。

Androidでは、既に有名なカンファレンスなどでも紹介されているようで、iOSよりも情報量が多かったです。

b.hatena.ne.jp

さらに、Androidの記事などを見ていく中で、「Cycle.jsはMVIアーキテクチャを採用しているFramework」という情報を知りました。

Cycle.js

Cycle.jsは、MVI patternを採用したWebフロントエンドのフレームワークです。

cycle.js.org

上にリンクを貼ったCycle.jsのサイトを参考に、MVI patternにおける、それぞれのクラスの役割について調べようと思います。

余談ですが、「Cyclejs MVI」で調べると、参考になりそうな記事が多く出てきます。MVIアーキテクチャの概念理解に困ったら、Cycle.jsで調べると、多くの情報を得られそうです。

MVI pattern

MVI is a simple pattern to refactor the main() function into three parts: Intent (to listen to the user), Model (to process information), and View (to output back to the user).

上記、Cycle.jsの公式ドキュメントに記載されていました。

Intentがユーザからの操作を監視 → Model側で情報を処理 → Viewへ反映 という流れで処理を記述するようです。

まとめ

本記事では、MVIアーキテクチャの紹介をしました。

次回記事で、実際にSwiftUIでMVIアーキテクチャを実装したいと思います。

参考資料

Yahoo! JAPAN Hack Day 2019 参加レポート

Hack Dayが楽しかった気持ちを少しでも忘れないように、記事を書きました。本当に楽しかった。記事を上げたら寝ようと思います。

前回

昨年は、初めてのハッカソンでした。初めてで何もできなかった思い出があります。

kuro-46.hatenablog.com

準備

今年は「普段の業務ではできないような、技術的な遊びをしよう」というテーマで各々アイデア出しを始めました。前回と同じ3人のメンバーで参加しました。

以下の記事が準備段階での記事です。(#2以降が書かれることはありませんでした)

kuro-46.hatenablog.com

メンバーの技術スタックが、iOSアルゴリズム周りだったことと、AR/機械学習周りの知識を使ってみたいということだったので、それらの技術を使用するアイデアを考えました。

メンバーと話していて「プレゼンの聞き手をじゃがいもにする」アイデアが、使いたい技術的にも丁度良いからやってみようという話になり、「人の顔をじゃがいもにするアプリ」で進めました。

事前準備は、何となく必要な技術を調べることと、Githubリポジトリを作ってプッシュ/プルのチェックくらいでした。

当日

やったこと

  • リアルタイムに顔を認識し続ける
  • 顔を認識したところに3Dモデルを貼る、顔に追従させる
  • ハコスコ(Cardboard)で表示できるように2画面表示する
  • 3Dモデリングを作る
  • 3Dモデリングを表示するモデルの調整をする
  • 資料作成/発表準備 など

3Dモデリング以降の作業をチームメンバーにお願いし、私は顔の認識と追従、その他UI周りの調整を行っていました。

技術的に新しく学んだことや頑張ったことは多いのですが、今回はハッカソン全体の話をしたいので割愛します。

やらなかったこと

ハッカソンでは、「やること」よりも「やらないこと」を決めることの方が大事だと去年学びました。

諦めたことは、以下のような項目です。この辺りチームメンバーと話し合いながら、やることを決めていきました。

  • プレゼンで話している言葉のスピードから、早い/遅い などを表示する
  • じゃがいもを人の顔にして、笑顔や悲しい顔など表示する

今回はこれらの項目を諦めて、とにかく「じゃがいもをきれいに表示する」ことだけに特化させました。

発表

チームメンバーの発表がとても上手かったです。会場でじゃがいもの写真が出たときに、結構笑って頂けました。本当に嬉しかった。

また、発表終わりのブースで「じゃがいものやつ!」という感じで多くの方に認識して頂けて、実際に触ってもらえて、フィードバックを頂けて嬉しかったです。

学び

Hack Dayは開発が終わらなかったり、思い通りにならない時間帯もある分、本当に毎回学びが多いです。今回学んだことは主に以下の3点です。

  • 新しいことを学ぶ
  • 尖らせる、ギリギリまで細部にこだわる
  • 見てもらう、フィードバックをもらう

新しいことを学ぶ

チームメンバーとは、「普段できないような技術」を学んでみようというテーマでハッカソンに参加しています。

今回はARや3Dモデルなど、普段手をつけていなくて興味のある技術を調査し、実装するところまで行いました。

全く知らない状態で時間を絞って成果を出す経験は、普段あまりできないので、貴重でした。

尖らせる、ギリギリまで細部にこだわる

前回の経験から、今回は色々な機能を中途半端に実装せず、1つのアイデアを尖らせました。

モデルの表示位置調整や、複数人表示時の描画処理の工夫、リアルタイムの動画を2画面で表示 など、ギリギリまで細部にこだわって実装を続けました。

たった1つの機能ではありますが、それなりに見せられるレベルまで上げることができたので、時間をかけて作って良かったなと思います。

見てもらう、フィードバックをもらう

発表後に様々なフィードバックをもらいました。自分たちが出したアプリを見て頂けるのはとても有り難く、とても嬉しいなと改めて思いました。

ブースに来ていただいた人には、自分たちが作った作品を見て頂いて、本当に感謝しています。

言葉にするのは難しいですが、こういう感覚を忘れずに日々開発を続けていきたいです。

賞は取れなかったですが、作ろうとしたものを作れて、様々な人に見てもらえたので、とても満足しています。

あと、当日ブースで話を聞いていたところ、緊張したときは「かぼちゃ」じゃない?というツッコミが結構ありました。どっちが主流なんだろう。

余談

会場のWifiと飲み物(ペプシ)がありがたくて、とても快適な作業環境で、ずっと楽しかったです。

本物のワクワクさんを見れて良かったです。

あと、Comp(完全食)が配られていて、割とどっぷり浸かりました。絶妙な味でハマりそう。

来年も参加したいです、来年は電子工作にも挑戦してみたいです。

【読書】イノベーション・スキルセット

読んだ本

イノベーション・スキルセット?世界が求めるBTC型人材とその手引き

イノベーション・スキルセット?世界が求めるBTC型人材とその手引き

なぜ読んだか

Designship2019でBTC人材についての話があり、田川さんの本を読みたくなり、即購入して読みました。

1日で一気に読んで、まずは概念的な部分の理解をするために本を読みました。

目次

  • 第4次産業革命の読み解き
  • イノベーションを加速する人材像
  • BTCトライアングルとデザイン
  • BTC型人材へのファーストステップ
  • デザイン駆動形プロジェクト

イノベーションを起こすために必要なスキルをBTC(ビジネス、テクノロジー、クリエイティビティ)という考え方でまとめた本。

エクスペリエンスを生み出すデザインの仕事は、体験が重要になっていく昨今でますます重要になっていく。

そのため、全てのビジネスパーソンやエンジニアがデザインを学び、活用することは重要になる。

本書では、デザインを「課題解決のためのデザイン」と「スタイルやブランドをつくるデザイン」の2つに整理して、どのようにデザインを身につけることが良いのか、入門書として書かれている。

第4次産業革命の読み解き

産業革命の歴史から、現在の世界がどうなっているのかについて記載されていました。

イノベーションを加速する人材像

イノベーション人材とオペレーション人材という言葉が定義されていました。

  • イノベーション人材: 変化の時代に求められる、新しい価値創造をすることができる人材
  • オペレーション人材:ルールを守り、仕組みに乗っ取る。企業を回していく上で優れたオペレーション人材が必要不可欠

オペレーション人材が増えすぎた結果起きる減少について、以下の本に記載されている。

サイロ・エフェクト 高度専門化社会の罠

サイロ・エフェクト 高度専門化社会の罠

越境的新結合

今まではBT型のイノベータが多かったが、これからはイーロン・マスクなどに代表されるようなBTC型の経営人材が必須になっていく。

そもそも、イノベーションが起こるためには、「価値創造」と「社会浸透」の2つの要素が必要となる。(シュンペーター)

イノベーションを起こすために必要な論理的思考だけでなく、デザインを組み込んで「ユーザ視点」や「美意識」といった水平思考をできる必要がある。

越境人材を育てる

片足を自分が安心できる得意な領域に置きながら、片足は新しい分野に踏み出して、探り探り進んでもらう

スタートアップのような場所でBTCを泥臭くこなすことが最短距離でBTC型人材に成長する方法。

BTCトライアングルとデザイン

DesignをBusiness Design / Classical Design / Design Engineeringの3つのデザインに分類する。

デザイン思考

プロトタイピングの方法論に、より汎用性を持たせたものをデザイン思考と言う。

デザイン思考が世界を変える (ハヤカワ・ノンフィクション文庫)

デザイン思考が世界を変える (ハヤカワ・ノンフィクション文庫)

I派とWe派

デザインの歴史から生まれた「I派」「We派」の話から

物理世界のデザイン、デジタル世界のデザインの関係性についても記載されていました。

BTC型人材へのファーストステップ

エンジニアリングから「デザインに理解の深いエンジニア」を経由して「デザインエンジニア」になるためのステップ

プロトタイピング

まずはプロトタイプを自在につくるれるようになることが重要。

  • 考えるためにつくるプロトタイプ
  • 改善するためにつくるプロトタイプ
  • 人に物事を伝えるためにつくるプロトタイプ

まずはハードルを下げて、「スキル」というレベルではなく「リテラシー」というレベルを目指す。

プロトタイピング入門

  • スケッチ
  • ダーティプロトタイプ
  • テクニカルプロトタイプ
  • コールドモックアップ
  • ワーキングプロトタイプ
  • ビジョンムービー

センス

センスとは何か? → センスはジャッジの連続から生まれる

目の前の物事に対して「Yes/No」とジャッジをしていくことがセンスだと考える

センスのない人は、何もジャッジをしていない人ということになる

センスを磨くためのトレーニングも紹介されていました。

デザイン駆動形プロジェクト

ラフなロジックが事業計画へと高解像度化、プロトタイプはワーキングプロトタイプのような精度の高いものに進化していく。

進め方として抽象・具体のどちらにも偏りすぎないように考えていくことがコツ。

感想

Designship2019で聞いた内容を、体系的に学ぶことが出来ました。

デザインに対するリテラシーを上げられるように、センスを磨くトレーニングの部分を重点的に読もうと思います。

Designship2019 参加レポート

Designship2019に参加しました。

design-ship.jp

私はデザイナーではなく、iOSエンジニアですが、エンジニアの視点からDesignshipについて感じたことについて、記事を書ければと思います。

テーマ

物語の力で「デザイン」の壁を越える。をテーマに、様々なスピーカーの方が話をしていました。

スピーカーの方は、事前に自分自身の物語を話すというテーマで構成を考えていたため、全体的にエモくて良かったです。

また、デザイナーの方と言っても、一人一人全然違うキャリアを歩んでいて、とてもカッコいいなあと思いました。

イベント・会場について

とてもおしゃれな空間で、ずっと居心地が良かったです。あと、オープニングがとても格好良かったです。

技術系の勉強会でもオープニングとかカッコいいなと思いますが、照明とかもキレイで、会場の使い方・場所の作り方へのこだわりを感じて、すごく良いなと思いました。

また、イベントを見るために会場へ行くことができなくても、配信を見ることもできるのも、とてもありがたいなと思いました。

セッションについて

全てのセッションについて、学びが多すぎました。特に心を動かされたセッションについてメモを残しておきます。

グロービス パネルディスカッションの話

これからの時代はBTC(Business, Technology, Creative)をかけ合わせることが重要だという話、また、これからのデザイナーがどうなっていくのかという話をしていました。

デザイナーの文脈はエンジニアに当てはめて考えていましたが、エンジニアでも同じようなことが求められていると感じました。

BTC人材については、本があるようなので、さっそく本を買いました。読んでみようと思います。

イノベーション・スキルセット?世界が求めるBTC型人材とその手引き

イノベーション・スキルセット?世界が求めるBTC型人材とその手引き

追記:イノベーション・スキルセットに関するブログを書いたので、リンクを貼っておきます。

掛け合わせ(越境)

様々なスキルを掛け合わせる(越境する)方法や、越境する上で心がけることを話されていました。

印象に残っていたのは、「5年~10年のスパンで考える」・「近傍に越境する」というワードです。

日本について

全てのセッションの中で一番度肝を抜かれました。この方の話をずっと聞いていたいと思うくらいには凄いセッションでした。本当に貴重な経験だった。

EmptinessとSimplicityの違い

  • Emptinessは無で、そこに解釈の余地がある
  • Simplicityは単純な構造ということ

解釈の余地がある資源を、日本はずっと前からたくさん持っていて、まだ発見されていないだけということを学びました。

いつも日本は駄目、グローバルが良い、ローカルは駄目、のような1元的な見方をしてしまっていた自分を恥ずかしく思ったのと共に、少し日本が好きになりました。

Emptinessという考え方は、モノの拡張性を考える上でとても重要だと思いました。

1日目にCookpadの方が話していた、便利と楽しみの正しい関係性ってなんだろう?という話も、EmptinessとSimplicityの別の表現なのかなあと思いました。あの話もとてもとても学びが多くて良かったです。

家に帰って調べてみたのですが、Emptinessの話は以下の本でも言及されているようです。この方の本を買い漁って少しでも取り入れたい。

白

イラストや漫画で「伝える」デザイン

苦手なことを通じて、「伝える」ということを突き詰めた結果、漫画で「伝える」ことができるようになった話でした。

自分も文章で伝えるのが苦手だなとか、話をするのが苦手だと思うことがあったので、そういうモヤモヤをそのままにしないで、新しい方法を考えてみるようにしたいと思いました。

文章で伝えずに、動画・スライドなど色々な手段で伝えることに挑戦してみようかなと思いました。

全体を通じて

Designshipに登壇された方は、BTCで言うところのCreativeに精通していることはもちろん、様々な分野とかけ合わせたマルチスキルを持っていて、とても凄いなと思いました。

また、発表の言語化能力がとても高く、ロジカルで分かりやすいため、ロジカルシンキングなどの基礎的な力も持っていることがとても重要だと思いました。

スライドの作り方

技術系の発表だと、どうしても過去の話に終始することが多くなりますが

今回の発表はプロダクトの話や、発表者の人生の話が多く、過去→未来に向かうためのプレゼンが多かったです。全体的にエモくて良いなと思いました。

感想

カンファレンスについて、最初は先輩に行こうと言われたので行くくらいの動機だったのですが、行って本当に良かったと思いました。

自分の知らない世界をたくさん知る事ができて、視野を広げることが出来た気がします。

取り急ぎはカンファレンスに行った経験から何をするかを考えることと、たくさん本を読んでインプットを刷り込みたいです。早くアーカイブ配信されないかなあ。