こんにちわ、毎年恒例 pyspa Advent Calendar も今年は2019年となりました。12月7日担当のakisuteです。明日の担当は @rokujyouhitoma です。
さて皆さん突然ですが、クルマは持ってますでしょうか?
持ってない?当たり前ですね。馬鹿みたいに高い税金と車両代金と高速道路通行料を搾取されるだけで何一つメリットありませんから。
それでは皆さん、スマホはお持ちでしょうか?
持ってる?馬鹿にすんな?当たり前ですね。今どきスマホ無いと生活が困難ですね。10年ほど前はどうやって電車の車内で時間を潰していたのかすら、もはや思い出せそうもありません。
そういうわけで、私のブログをわざわざ見に来てくださっている方はIT業界、それもスマホアプリ関連の業界の方が大多数でしょうから、スマホについてはバリバリ詳しいけど、クルマなんて持ってないから何一つ知らないし興味もないよ、という方が多数派を占めてらっしゃるのではないでしょうか。本日はそういう多数派の方向けのお話をさせていただきたいと思います。
さて、皆さんがクルマに何の興味も知識もない前提でお話を進めさせていただこうと思うのですが、それでも平成以降に製造されたクルマにはカーナビとかいう地図とか表示するディスプレイが付いていたり、スマホをBluetoothで接続したりしてカーオーディオを聞いたりできるということぐらいはご存じの方が多い、と私は勝手に信じております。ところが今や元号も令和となりまして、どこもかしこもインフォメーションテクニック的なヤツが幅を利かせる世の中になっておりますゆえ、当然クルマに搭載されているカーナビですとかカーオーディオ的なやつもご多分に漏れず高機能化しています。おまけに最近は自動運転 (=カーナビの現在位置情報や道路情報を車両側が使用したい) ですとか、クルマの走行特性モードの設定 (=車両側の走行特性をUIから操作する必要がある) ですとか、クルマのハンドルについているスイッチからカーオーディオを直接操作したい (=車両側の入力をカーオーディオと連動させなければならない) ですとか、そういう昭和の時代では考えられないような高度な統合処理が必要な機能の搭載がクルマにとってもはや必須となっておりまして、昔のように後付で買ってきたカーナビやカーオーディオに配線すればOK、というわけにはいかなくなってきました。
そこで、ここ2年ほど以内に発売された新車の真ん中に鎮座するディスプレイはカーナビではなくマルチファンクションディスプレイとかディスプレイオーディオとか呼ばれるようになってきておりまして、タッチパネルを装備し、カーナビ、オーディオ、エアコン、車両の設定などを直接タッチ操作で行う高度なシステムに変貌しています。
それだけには留まらず、今年発売された新車に至っては4G接続用のSIMとアンテナが装備されており自立通信が可能で、電話は当然として緊急時の連絡サービスや、煽り運転されたときにボタンひとつで自動的に通報してくれるサービスもあり、カーナビの地図情報の自動更新やシステムアップデートもこなすことができます。なぜクルマにこのようなものが必要かといいますとこれまた将来的に重要になる自動運転が絡んできまして、最新の地図が常に使用されていないと自動運転は危険だからだとか、万一なにか問題があったときに自動運転中の車両を遠隔監視できていないと駄目だとかそういう理由があります。そこで先んじてこのような通信能力をクルマに持たせているというわけです (※おそらくは裏で匿名運転データの収集も行っているのではないかと推測していますが、そのへんは不明です) 。
さらには昨今のスマホ社会を反映し、各社自動車メーカーが用意したスマホアプリと車両が連動して、スマホアプリから現在の自分のクルマの位置を調べるだの、走行距離とガソリンの残量を調べるだの、カーナビに目的地を送信するだの、果ては走行前に社外からエアコンをONにしたりクルマのドアロックをスマホアプリから開けてしまうだのといったことまで可能になっているのです。
どうでしょう、まるでスマホみたいですね。
そのとおり、最近のクルマにはちゃんとしたOSがいます。
このクルマのOSは現在のところ基本的には各社自動車メーカーが内製で作っている (かまたは基本システムだけ買ってきて各社勝手にカスタマイズして使っている) ものが多いようで、iOSとAndroid以外のOSが事実上絶滅したスマホの世界とは異なり、どの会社からクルマを買うかによって大いに出来栄えと機能に差がある状態です。
中にはスマホ世代の我々にはひと目見ただけで開発者をコンクリ詰めにして東京湾に投げ捨ててやりたくなるようなひどい代物も多数存在します。それどころかタッチしてから0.5秒遅れで反応するUIなどといった、初代iPhoneどころかAndroid 1.5 Cupcake世代の産業廃棄物スマホにすら劣るレベルの実装すら、世の中のクルマに存在します。
ヤバいですね。何処のドイツでしょうか、そんなひどいブツを作るのは。実際に見てみたいと思いませんか?
・・・ここで、ちょっと話は変わるのですが。
メルセデスというクルマのブランドがあります。
あまりクルマに詳しくない人でも、ベンツといえば分かるでしょうか。そう、ドイツの高級車メーカーです。最近はメルセデスという名前で名乗っていますので、メルセデスと呼ぶことにします。
でそのメルセデスといえば、皆さん誰でもすぐに高級な外車で、金持ちが乗ってそうなイメージを浮かべると思います。当然、見た目も高級だし、内装も高級だし・・・
・・・車載OSの動作だって高級で高品質を期待します。当たり前ですよね。下手すると1000万円とか払うクルマなわけですから、iPhone 11 Proみたいにきれいな見た目で高速にちゃんと動作することを期待したいじゃないですか。iPhoneなんて10万円かそこらしかしないんですから。
じゃあ見てみましょうか。メルセデス。でもなぜだか知らないんですが日本仕様・右ハンドル・日本語表示のMBUX (Mercedes Benz User Experience) のUI、ネット上にほとんど落ちてないんですよね。しょうがないから実車の写真を撮ってきました。
ネットから拾ってこれた左ハンドルでの画像ですが、横一列につながった超ワイドなディスプレイ、一見なかなかカッコいいですね。高級感もあるし、これは期待できるのでは・・・
って思った?残念!半角カナちゃんです!
見ての通り、細部に至るまで半角カナです!
こっちは半角カナじゃありませんがガソリンスタン...になっちゃってます。
幸いにしてタッチパネルの操作感度はまぁまぁ良好だし、タッチしてから1秒以上固まるみたいな絶望的な遅さは無いのですが、どう見ても初代iPhone 3Gとドッコイドッコイ程度の動作速度しかありません。そもそも走行中にカーナビを操作したくなったら、身を乗り出してこのタッチパネルを手で触れというのでしょうか?まことに素晴らしいUXだと思います。
引用元: https://www.elasticfeed.com/44db3e868b3b3bfe82835c65441ea3ca/
もちろんそのような危険なことをしないで済むように、こうして中央手元にMagic Trackpadもどきが付いているのですが、手触りはともかくこいつの反応が10年前のWindowsノートパソコンのほうがマシなのではという次元でして、自分のmacに触れた後にこいつに触ると引きちぎって車外に投げ飛ばしてやりたい気分に駆られること間違いありません。設定で感度を調整したりもできますがどう調整してもイライラするので、結局中央のタッチパネルを身を乗り出して触るほうがマシだったりします。
その他、ハンズフリー操作のために音声アシスタント、いわゆるSiriもどきがついてるのですが、社内での会話中にうっかり「メルセデス」という単語を口にした瞬間「なにか御用でしょうか」と起き上がってきて大変邪魔です。名前を呼んではいけないあの人扱いみたいになっています。しかも初代のSiriより頭が悪く、基本的に何お願いしてもマトモに対応してくれないので使えません。お願いだからOK Googleと席を変わってほしくなります。
極めつけはカーナビです。なんとこちら1年近く道路情報が更新されていないようで、設定画面から最新状態に更新しているにもかかわらず半年前に開通した道路が地図上に存在しません。当然カーナビはそこを迂回しようとします。全く使えません。メルセデスの人に聞いてみたところ、現在地図データを頑張って作ってるらしいです。頑張ってくださいね。
ちなみにこちら、お見せしましたのはAクラスといいます一番安物のメルセデスですが、実は2000万円以上するメルセデス・マイバッハと言われる最上位車種でも全く同様のMBUXが使用されています。それどころかAクラスは今年モデルチェンジされたため、下手するとそれらよりも最新のOSが搭載されています。要するに2000万円以上する超高級車でも1年前の道路しか存在しないカーナビを使わされるというわけです。まぁ、そんなクルマを買うような人は自分で運転なんかしないでしょうから、何の問題もないのかもしれませんね。
じゃあ、次はメルセデスのスマホアプリを見てみましょうか。
まぁ悪くはないですね。
なんかWebViewっぽい匂いがしますが・・・
一応ネイティブアプリのようです。FOSS (Free/OpenSource Softwares)をちゃんと列挙しているのは好感が持てますね。
一応機能は充実してますね。
見ての通りクルマのドアロックをこのアプリから開けることもできます。
カーナビ連動もありまして、この画面から目的地を検索してクルマのカーナビに飛ばすことも可能なのですが、
見ての通りこの程度の検索すらロクにできませんので使い物になりません。まぁよしんば目的地がクルマに送信されたところで1年前の日本地図に基づいてナビゲーションされてしまうので、どっちにしろ使い物にならないと思いますが。
いかがでしたでしょうか。まぁ、車載MBUXに比べると幾ばくかマシかもしれませんが、2000万円以上払った人専用アプリなんてものはございませんので、最廉価のAクラスユーザーでも最上位のVIPユーザーでもこのアプリを使わされることになります。もうちょっと頑張れよと思わないでも無い気がします。
一応、弁護させていただきますと英語版やドイツ語版は半角カナではないのでフォントはマシですし、多分ドイツにサーバがあるのでドイツで使ったほうがアプリの動きも多少はサクサクだと思いますし、ドイツ国内のカーナビは多分1年遅れで更新されるとか言うことも無いはずです。要するに日本版が飛び抜けてショボいだけかもしれません。あとクルマ自体は普通にとんでもなく良かったので、アプリとか気にしない人にとっては最高のクルマだと思います。
で。
また閑話休題で申し訳ないのですが。
テスラというクルマのブランドがあります。
最近話題になることが多い電気自動車のメーカーです。あのイーロン・マスクの会社というと我々IT業界人には通じやすいのではないでしょうか。何かやってくれそうな気がしませんか?
そのテスラなんですが、こんな感じなんです。
iPad Proより巨大なタブレットのようなサムシングが鎮座しています。
引用元: https://response.jp/article/2019/08/19/325526.html
見てください、これ。まるでiPadのアプリにしか見えません。このテスラ モデル3の社内にはハンドル周り以外に一切の物理ボタンが存在せず、ディスプレイもダッシュボードのメーターもありません。速度計の確認も、エアコンの操作も、ハンドルとアクセルとブレーキとギアの選択とウィンカー操作以外、何もかもすべてこのiPadで行うことになります。
普通にメチャクチャ綺麗です。カーナビに至ってはおそらくこれGoogle Mapsそのものです。当然、Google Mapsですから、1年前の日本地図が表示されることもなければ、パチンコガンダム駅が存在することもありません。完璧に最新最先端の地図が無料でいつでも使えます。素晴らしいですね。
では、テスラのアプリはいかがでしょうか?
当然のようにネイティブです。まぁReact NativeかもしれませんしFlutterかもしれませんが。
どうみても出来が良いです。半角カナなんて汚物は当然存在しません。
これで、テスラ モデル3の車両価格は最高でも717万円、最安値ですと511万円で収まります。
以上で大体私の申し上げたいことはなんとなく伝わってきたのではないかと思います。つまり、我々スマホ開発者界隈が買うべきなのはテスラってことです!さぁ、このテスラの新車を今すぐ予約してあなたも未来を体験しましょう!
・・・やっぱりメルセデスのほうがいいですね!メルセデス最高!
最後に余談になりますが、Apple CarPlayとAndroid Autoについてちょっと話します。この2つはスマホ開発者界隈の皆様も少しくらいは聞いたことがある名前ではないでしょうか。これまで見てきましたとおり、最近のクルマには車載OSが存在するのですが、Apple CarPlayやAndroid Autoは車載OSのアプリの一つとして動作します。要するに車載OSのナビアプリを開いたりオーディオアプリを開く感覚で、CarPlayアプリを開いて、その中でCarPlayのUIの中で更にiOSのアプリを操作する、みたいな作りになっています。
引用元: https://www.elasticfeed.com/44db3e868b3b3bfe82835c65441ea3ca/
そのせいで、見てのとおりに画面が狭いです。どうやらApple Carplayは7インチの画面を前提に作ってあるようで、10インチのワイド画面であるメルセデスのディスプレイオーディオにはフィットしません。しかしながらこの中は完全にiOSであり、マトモなGoogle Mapsが機能します。おまけにスマホと車体が連携しており、車体側から車載GPSやジャイロコンパスなどのより正確な情報を提供してもらえるため、スマホ上で使うGoogle Mapsより段違いに自車の現在位置精度が高くなります。
参考: https://developer.apple.com/documentation/carplay
参考: https://developer.apple.com/design/human-interface-guidelines/carplay/interaction/car-data/
なんかクルマ向けにアプリ作ってみてえなと言う人がいらっしゃいましたら今がチャンスかも知れませんのでぜひぜひやってみていただければと思います。まぁ、デバッグに実車が必要・・・かもしれませんけど・・・
最近は国産車でもトヨタ・カローラという昭和のジジイ以外だれも知らないようなオワコンカーがびっっっっっっっっっっくりするぐらいモダンで素晴らしいクルマに生まれ変わりまして、そちらの新型トヨタ・カローラには標準でカーナビがついておらず、Apple CarPlay / Andriod Autoやトヨタ独自のSDLという規格を利用してスマホをナビにすることを前提の作りになっています。まさに今のスマホ時代にふさわしい素晴らしい方針だと思います。
2019年9月24日火曜日
SwiftUI で ScrollView / Listの現在のスクロール位置 (UIKitにおけるcontentOffset) に相当する値を参照する/コード上から指定する方法は iOS SDK 13.0 地点では存在しない
タイトルの通りですが一応補足しておきます。
先日、奇しくもAppleのSwift UIを実際に手掛けている開発者に直接質問する機会に恵まれましたので以前から気になっていた内容を質問してみたのですが、やはり現段階のリリースではcontentOffsetに相当するものの変更タイミングを取得したり、またプログラム的にcontentOffsetを調整することもできないと明言されてしまいました。
ただしcontentOffsetの変化したタイミングを取得するだけであれば、以下の方法で擬似的に再現することができるとアドバイスを頂きました。
彼曰く、コミュニティの誰かが作ったサンプルのVideoPlayerアプリがこのテクを使って動画が画面内に入ってきたときに自動再生を開始する挙動を実現していると言っていたのですが、具体的にどのサンプルアプリなのかは教えてもらえなかったので発見できず。残念。
あとは例によっていつものごとく、機能追加が欲しい場合は https://developer.apple.com/bug-reporting/ 経由で要望を上げてくれると対応できるよと言っていましたので皆さんガンガン書けばいいと思います。
先日、奇しくもAppleのSwift UIを実際に手掛けている開発者に直接質問する機会に恵まれましたので以前から気になっていた内容を質問してみたのですが、やはり現段階のリリースではcontentOffsetに相当するものの変更タイミングを取得したり、またプログラム的にcontentOffsetを調整することもできないと明言されてしまいました。
ただしcontentOffsetの変化したタイミングを取得するだけであれば、以下の方法で擬似的に再現することができるとアドバイスを頂きました。
- ScrollView / List 上の特定の位置に、ダミーの隠しViewを配置する。
- 隠しViewのonAppear() / onDisappear() を利用する。
彼曰く、コミュニティの誰かが作ったサンプルのVideoPlayerアプリがこのテクを使って動画が画面内に入ってきたときに自動再生を開始する挙動を実現していると言っていたのですが、具体的にどのサンプルアプリなのかは教えてもらえなかったので発見できず。残念。
あとは例によっていつものごとく、機能追加が欲しい場合は https://developer.apple.com/bug-reporting/ 経由で要望を上げてくれると対応できるよと言っていましたので皆さんガンガン書けばいいと思います。
2019年6月8日土曜日
SwiftUI 未解決問題まとめ
一通り試してほぼほぼ理解できたのですが、現状どこをどのように調べてもわからなかった内容がいくつかあるので未解決問題としておいておきます。誰か教えて\(^o^)/
問題は肝心要のPreferenceKeyの具体実装がSwiftUI.framework上には一切見つからず、したがってキーが指定できないためonPreferenceChange(_:perform:)がうまく利用できません。特定位置までスクロールしたら発火、とかビューが50%スクロールして隠れたら発火、とか普通に使いたいのですが、困りました。それとかあとはenvironment経由なりイニシャライザ経由なりでinitialScrollPositionのようなプロパティを用意してScrollViewのスクロール初期位置を与える、みたいなテクも使いたいですし、普通に必要だと思うんですけど(´・_・`)
ちなみにView.offsetではない・・・と思います、たぶん。一応念のためにList.offset()で試してみましたが、ドキュメンテーションにもある通り、全く違う挙動になります。
Transition
type-eraseされたAnyTransitionはSwiftUI.frameworkに居るのですが、元のProtocolが見えない上にドキュメンテーションも一切ありません。おそらくはNavigationViewの中で使われているのだと思いますが詳細不明。ScrollView / Listの現在のスクロール位置 (UIKitにおけるcontentOffset) に相当する値を参照する/コード上から指定する方法
今の所、一番怪しいのが以下のpreferenceの仕組みではないかと睨んでいるのですが、問題は肝心要のPreferenceKeyの具体実装がSwiftUI.framework上には一切見つからず、したがってキーが指定できないためonPreferenceChange(_:perform:)がうまく利用できません。特定位置までスクロールしたら発火、とかビューが50%スクロールして隠れたら発火、とか普通に使いたいのですが、困りました。それとかあとはenvironment経由なりイニシャライザ経由なりでinitialScrollPositionのようなプロパティを用意してScrollViewのスクロール初期位置を与える、みたいなテクも使いたいですし、普通に必要だと思うんですけど(´・_・`)
ちなみにView.offsetではない・・・と思います、たぶん。一応念のためにList.offset()で試してみましたが、ドキュメンテーションにもある通り、全く違う挙動になります。
SwiftUI チュートリアル ヘルプ ドキュメント FAQ 困ったらとりあえずここ見ればOK
https://github.com/Juanpe/About-SwiftUI
いろいろ調べたのですが、これよりよくまとまっているドキュメントを現状発見できませんでしたので、2019/06/08現在では上記のドキュメントを参照するのがベストだと思います。
特に以下の記事は役立ち度が高かったです。この2つだけで問題の9割ぐらいは解決できると思います。
SwiftUI by Example
https://www.hackingwithswift.com/quick-start/swiftui
Answers to the most common questions about SwiftUI
https://wwdcbysundell.com/2019/swiftui-common-questions/
あとは直接SwiftUI.frameworkの中身を見るのが良いと思います。正直Appleのドキュメンテーションは未だにSwiftのExtensionベースの実装をきれいにドキュメントに起こす事ができておらず、複数のドキュメントに重複した記載が見られたり、どこで定義されているfunc/varなのかを正しく表現できていなかったりします。なのでシグネチャの名前さえわかっていればSwiftUI.frameworkの中を自分で検索したほうが正確にどういう定義になっているか判断できて便利です。
いろいろ調べたのですが、これよりよくまとまっているドキュメントを現状発見できませんでしたので、2019/06/08現在では上記のドキュメントを参照するのがベストだと思います。
特に以下の記事は役立ち度が高かったです。この2つだけで問題の9割ぐらいは解決できると思います。
SwiftUI by Example
https://www.hackingwithswift.com/quick-start/swiftui
Answers to the most common questions about SwiftUI
https://wwdcbysundell.com/2019/swiftui-common-questions/
あとは直接SwiftUI.frameworkの中身を見るのが良いと思います。正直Appleのドキュメンテーションは未だにSwiftのExtensionベースの実装をきれいにドキュメントに起こす事ができておらず、複数のドキュメントに重複した記載が見られたり、どこで定義されているfunc/varなのかを正しく表現できていなかったりします。なのでシグネチャの名前さえわかっていればSwiftUI.frameworkの中を自分で検索したほうが正確にどういう定義になっているか判断できて便利です。
登録:
投稿 (Atom)