わふうの人が書いてます。

iOSアプリケーション開発、BLEのファームウェアとハードウェア試作のフリーランスエンジニア。

ダイソンの掃除機と旧型ブラーバが一緒に収まるスタンドがありました

タイトルでもう書くべきことが尽きていますが、ダイソンの掃除機と、iRobotの床拭きロボット、旧型のブラーバが、山崎実業(Yamazaki)コードレスクリーナースタンドにちょうど収まりました。ダイソンの掃除機は、3000円くらいからあるギタースタンドや、石膏ボードにギターのヘッド部分を立てかけるスタンドを利用するなど、ギタースタンドが結構使えるのですが、今回は専用のスタンドを購入してみました。

写真のように、このスタンドに、Dyson V6 Fluffy(フラフィ)と、ダイソンの掃除機の予備ヘッドをおけるスタンドの奥側の隙間に旧型ブラーバが収まっています。旧型ブラーバには充電用のスタンドがありますが、このスタンドが奥側の隙間にちょうど収まりました。

山崎実業のコードレスクリーナスタンドは、掃除機の先端ツールを差し込む部分が、単なる板のプレートと、板を四角に折り曲げたタワーの2種類があります。プレートとツールの2つの製品の違いは、ツールを差し込む部分の形状だけです。どちらも6000円ほどの販売価格ですが、たまたまかもしれませんが、2020年5月の時点ではプレートが4000円台と大きな割引価格になっています。ツールの方は、6000円台と本来の希望小売価格のままです。

プレートの方が、大きな割引価格でお買い得です。ですが、ツールが金属を折り曲げた四角の部分にしっかり挿さりそうなのと、単なる板だと頭をぶつけた時に顔に刺さりそうな不安感があるという、根拠のない理由でタワーの方を購入しています。

こちらが、プレートのツール差し込み部分。

こちらが、タワーのツール差し込み部分。

プレート

タワー

台所用品のまとめ

前提と目的

1LDKで、独身世帯が自炊をする台所の配置と用品のまとめをします。

台所のありようは、日々の料理が億劫にならない、気持ちよく作業できることです。それには、使いたい道具がすぐ手に取れること、そして片付けが面倒にならないことが必要です。合理的に整然とした写真写りも見た目にも美しい台所を、毎日維持できれば理想的ですが、それは面倒です。適当に道具を手に取り、適当に戻して、酷い乱雑な見た目にははならずに、毎日使い続けられればよいとします。

冷蔵庫と電気調理器を木製ラックにそろる

冷蔵庫と電気調理器は、毎日使うものです。また食器は、毎回取り出してまた収めるものです。これらは、木製ラックに納めています。

木製ラックは部品で組み立てるもの

収納はこんな感じです。無印のパイル材ユニットシェルフを使います。https://www.muji.com/jp/ja/store/cmdty/section/S02703

棚の1段あたりの高さは18センチメートルです。向かって右は、下3段は18センチメートル単位で、その上は電子レンジが収まるギリギリの36センチメートル、さらにその上は蓋を開けるため高さが必要な電気圧力鍋を置き、最上段はビニール袋やタッパーを入れておく重さがない籠を置くスペースにします。

向かって左は、下の段から、生ゴミ箱、調味料を入れる箱とカトラリーを置くスペース、そしてコーヒーメーカを置いています。入り口横なので、向かって左の棚は高さを抑えていますから、右の棚のような最上段はありません。

冷蔵庫は氷点下ストッカーのある3ドア

冷蔵庫は、MR-CX33C-Wを使っています。シリーズの製品は、毎年少しだけ仕様が変わり新型として型番のアルファベットが変わります。その入れ替え時期で旧機種となったものが安くなりますから、そのタイミングを狙います。10万円を切るくらいで購入できます。

https://www.mitsubishielectric.co.jp/ldg/wink/ssl/displayProduct.do?ccd=102010&pid=286948

独身世帯では300リットルから400リットルの製品で十分です。3ドアで冷蔵室のドアがどこからでも開けるものになりました。高さをちょっと低めの170センチメートルのものにして、冷蔵庫の上に物を置いています。

消費電力もチェックしておきます。同じ企業の冷蔵庫で同じような容積のものでも、型番によっては消費電力が妙に大きなものがあったりします。1kWhを20円として10年使うとすれば、1kWhの消費電力の違いは製品寿命の間で200円の違いになります。

動作音は気になるところですが、購入して見なければわかりません。カタログには、動作音15デシベルなどと数値化されて書かれていますが、音が小さくても気になる音もあります。カタログで数値で確認して、鵜呑みにはできませんがレビューがあれば参考にします。

氷点下ストッカーは、お魚や肉を凍るか凍らないか寸前の状態で保存してくれるので、もしも魚を捌くのが好きで魚を丸ごとで買うならば、2~3日は保存できますから便利です。

木製ラックにある調理器具など

木製ラックに置いている調理器具などをまとめていきます。

電気圧力鍋を使っています。ガスレンジの圧力鍋であれば火の前にいなければなりませんが、電気で自動制御なので、材料と調味料を入れて、あとは放っておくだけです。インターネットでレシピをダウンロードできる機能や、かき混ぜ機能がある機種もありますが、そういったものがない物を選んでいます。象印のものは、レシピ本があり、そこにある番号を選択すれば、調理時間と温度そして圧力が設定できます。

スマートホンでレシピが見られるのは、検索を活用するならば便利です。調理中にスマートホンを取り出して見たりするのは面倒です。紙の本では、何を作るか決まっていなくてぺらぺらと見る、調理中にページを開けておけば都度参照できるのは、便利です。

ティファール 電気ケトル 0.8Lは、温度調整ができる物を使っています。調理用であれば熱湯があればよいので、沸騰させるだけのものでよいのですが、紅茶用にお湯の温度を指定したいので、これにしています。温度設定機能は、鯛のアラを湯で洗う時に、臭みになるタンパク質が変質すればいいので、熱湯ではなく90度くらいのお湯が欲しい場合でも便利です。

デロンギ (DeLonghi) コンパクト全自動コーヒーメーカーを置いています。エスプレッソが飲みたいわけではないのですが、コーヒーの豆を入れておけば、全自動でコーヒーが入ること、そしてコーヒーの粉をその都度捨てなくても、数回でまとめて捨てるだけでよい、という手間のなさで選ぶとこれになりました。スチームでミルクを泡立てられるので、カフェオレを楽しめます。2杯分の豆を使う濃厚なジャポネーゼというものも入れられます。普段と違う物を飲みたくなれば、カフェオレやジャポネーゼを選べるのは、気分の切り替えになってよいです。

オーブン電子レンジには、ZITANGを使っています https://www.mitsubishielectric.co.jp/home/rangegrill/ 。これは、電子レンジと熱風を噴き出すグリルと上下の電熱線で加熱するオーブンの3つを組み合わせたものです。独身世帯で使いよい用に、庫内容量を小さくして加熱時間を短縮しています。本体の高さも、他社製品と比べて低くなっています。

冷蔵庫で冷えたコロッケを、電子レンジ+グリル+オープンで再加熱すると、電子レンジで温めて、グリルとオープンで外側をカラッと揚げたてのようにしてくれます。温度センサーで加熱を調整するので、冷凍したご飯やお刺身の解凍、牛乳の加熱もできます。250度でピザも焼けます。

生ゴミ箱は、simplehuman ダストボックス セミラウンドカン 30L。45リットルのゴミ袋を被せて使えます。密閉度が高く臭いが外に漏れません。内部には黒い別容器があるので、もしもゴミ袋から液体が外に出た場合でも、容器を取り出して洗うだけですみます。

荒澤製作所 アルファクト シャルル・プレーン http://www.alfact.co.jp/38900.html

KEVNHAUN カトラリーケース

台所周りの調理器具

引き出しの中

引き出しの中は、プラスチックの入れ物を入れて、3つの部分に分けます。計量スプーンなど細かいものは右の部分に入れます。そのほかの調理器具は真ん中か左の幅の広い部分に入れます。よく使う物を真ん中に戻すようにすれば、いつも使うものが真ん中に自然に集まります。

引き出しに入れているプラスチックの入れ物は、
ブリックス 9023〈350ミドルM〉https://likestore.like-it.jp/products/detail.php?product_id=236 と、ブリックス 9008〈280ミニS〉https://likestore.like-it.jp/products/detail.php?product_id=243 です。

この入れ物は引き出しの奥行きよりも短いので、この入れ物を引き出しに入れると奥の空間が少し余ります。スペーサーに適当にタオルを丸めて奥に詰めておくなりします。

引き出しに入っている調理器具

お助けスプーン。でっかいスプーンです。かぼちゃの煮物やボールで和えたサラダを皿に取り分けるとか、炒め物で混ぜる時など、適当に便利に使えます。

金属の持ち手が好みなので、お玉やターナーはツヴィリングのものを使います。

ツインキュイジーヌ ナイロンレードル

ターナー https://jp.zwilling-shop.com/jp/Kitchen-World/Kitchen-gadgets-storage/Cooking-frying/Lifters-Turners/Turner-ZWILLING-39711-000-0.html

計量カップは、アヒルの形をした、グースメジャーカップを使っています。計量スプーン付きで、いくつもありますが、実際に使うのは、200ミリリットルと100ミリリットルの2つです。それより小さな容積は計量スプーンを使えば足ります。この計量カップは円形ではなく、横向きの高さが低いので、引き出しにほどよく収まります。

計量スプーンは、マザーズセレクション 大さじ 計量スプーン イノブンスタンダード05 715円(税込) https://www.inobun.com/item-044657.html と 小さじ 605円(税込) https://www.inobun.com/item-044658.html を使っています。

計量スプーンでフライパンで焼いている物をかき混ぜたりするので、熱で溶けるプラスチックの計量スプーンは使えません。また金属のスプーンでも、計量スプーンというと、金属の薄い板を打ち抜いたような厚みのないものが多いです。これは分厚い金属の質感があり表面の質感もいい感じです。持ち手の上に、樹脂に縁取られた小さな穴があります。料理中にいく種類もの調味料を計っては入れていくときに、ボウルに計量スプーンを立てかけることがよくあリマス。この計量スプーンだと、この穴の樹脂部分がボウルの縁に引っかかり、スプーンがボウルの中に落ち込みません。地味に便利です。

計量スプーンは何本もセットになったものもあります。大さじ15ミリリットル、小さじ5ミリリットルですから、この2本があれば、あとは足し算で計算すれば足ります。この計量スプーンは半分の容量の線が入っています。

細かい調味料

細かい調味料は、小さなジップロックに入れて、プラスチックの入れ物に入れています。

プラスチックの容器は、大小それぞれ:

ライクイット(like-it)キッチン収納キッチンツールケース 深型 S 幅14x奥21x高12.5cmクリア

ライクイット(like-it)キッチン収納キッチンツールケース S幅10.5x奥14x高6.3cmクリア

シンク下

プラスチックのブックエンドを置いておくと、鍋の蓋やトレーを立てて置けます。

インジニオ・ネオ IHステンレス エクセレンス https://www.t-fal.co.jp/products/pots-pans/stackable/ingenio_ih_stainless_excellence/ 。取手の取れるティファールは、テフロンコーティングが2年程度で剥がれてくるので、消耗品になります。テフロンコートが使われていない、エクセレンスのソースパンのみが残りました。一度焦げ付くと、もう取れないので見た目は最悪ですが、汁物を作り、ソースパンに入れたまま冷蔵庫で保存できるのは便利です。写真のソースパンは18センチメートルのものです。ソースパンとハンドルを個別に購入することも、多分可能なはずです。

揚げ物は、この鍋を使っています。紙フィルタと粘土ベースの濾過材を使うと、油が汚れずいつもきれいです。
オークス 日本製 ウチクック オイルポット 揚げ 鍋 クイックフライヤー


タニタ 温度計

その他

ガスレンジは、火力が強いので、雑誌のクロワッサンとリンナイがコラボした製品を使っているのです。これは今では製造されていません。安全装置が必要になったりと要求性能項目が増えたので、新製品になり、今では、Vamo. 39800円(税抜き) https://www.vamo4000.jp になっています。

鍋やフライパンは、南部鉄器のものを使っています。ネイキッドパン 片手24cm 深さ4cm https://shop.oigen.jp/?pid=135209978 、マルット https://shop.oigen.jp/?mode=grp&gid=2125403 。周辺が茶色に焦げてパリッとした目玉焼きが、火加減の調整なく適当に焼けます。フライパンは2.45kgの重さがあるので、持ち上げて動かすのも大変なので、ガスレンジに出しっぱなしです。取手は熱くなります。ミトンは、つけたり脱いだりが面倒なので、布地の鍋おきで持ち手をくるっと巻いて使うのが便利です。

まな板は、イチョウの物を使っています。大きなまな板を置くと、台所がまな板に占拠されて使いにくくなるので、シンクに食器カゴとまな板を縦方向に並べて設置できる、18センチメートルの小さいまな板を使っています。

https://www.icyomanaita-futaba.com 18x32センチメートル、3000円(税抜き)。まな板立て 1000円(税抜き)。長く使っていると、それなりに黒くなっていくので、購入後に、まな板の側面や、まな板置きには、ウレタン塗装をしてもいいのかも。

水切りかごはラパーゼを。下の部分の金属ワイヤ部分が、ワイヤが縦横になっていると交点に汚れが溜まりそうなので、そうではない物を探すとラパーゼのものしかありませんでした。

包丁

包丁は、写真の上から:

Zwilling ツインプロHB 三徳包丁

貝印 KAI 三徳包丁 関孫六 10000CC 165mm

藤次郎 プロ DPコバルト合金鋼2層複合 小出刃 105mm

旬 Shun Classic クラシック ペティー 100

貝印 KAI 三徳包丁 関孫六 10000CCは、炭素鋼をステンレスで挟み込んだ物だそうですが、研げばものすごくよく切れます。関孫六 10000CCの持ち手の部分は、口金と樹脂加工した木材でできています。水気をちゃんと拭き取らないから膨張しているのかもしれませんが、口金と木材部分に、多分0.1ミリ以下だとは思いますが、手でさすると分かる段差があるのが少し残念です。ヘンケルスの包丁は、持ち手部分と口金の段差もなく、重さのバランスもよい感じで、手で触れると楽しい包丁です。

iBeaconの検出でバッググラウンドで何かを実行する(不成功)

iBeaconを検出して、バックグラウンドで何かを処理させる手軽な誰にでもできそうな方法を探しましたが、見つかりませんでした。

ビーコン販売と紐付けたアプリケーションもしくはサービスは、調べてはいません。今手元にあるiOSデバイスで、ビーコンとその検出の振る舞いをすぐに確認できる方法を求めているので、特定のビーコンを購入しなければ試せないものは、今回の調査対象外です。

iOSアプリあるいはPythonistaで、実行可能なアプリケーションを作れば、バックグラウンドでのビーコンの検出と、その検出を何かのイベントに紐付ける振る舞いは作れます。

iOS標準アプリの、ショートカットには、オートメーションの機能で位置をトリガーにする機能があります。ですが、トリガー条件に指定できるのは物理的な位置のみで、iBeaconは指定できません。

Launch Center Proというアプリケーションのランチアプリで、アプリ内課金640円ほどで、位置でフックするオプションを有効にして、iBeaconの検出をトリガーにして、通知画面にアプリへのリンクを表示させることはできました。ですが、アプリ自体の実行は、人間がロック画面から通知をタップして実行しなければならず、自動で内部で実行が進みません。Launch Center Proのトリガー実行は、URLで指定されるので、httpサーバを起動して、そのサーバにアクセスさえできれば外部フックとして使えるだろうと思い試しましたが、ブラウザへのURL表示の実行パスができるだけで、アプリを自分で実行するほかないのは、変わりませんでした。

httpsサーバの簡易なアクセスログ取りは、このサイトを参照しました。

Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法 https://qiita.com/kunichiko/items/7f64c7c80b44b15371a3

HomeKitADKを動かしてみる

スマートホームは、機器のネットワークへの接続と、その応用場面の広がりの2つが揃わなければ、利用する価値が生まれません。ネットワーク接続という付加価値を求めた、家庭用機器がこれまでにいくつもの企業から発売されては、製品としてジャンルを確立しないまま消えていきました。

そのスマートホームの流れの中で、新たにAmazonとAppleとGoogleそしてZigbeeアライアンスなどの業界グループから、スマートホームデバイス向けのオープン規格を目指す発表がありました。

https://www.apple.com/newsroom/2019/12/amazon-apple-google-and-the-zigbee-alliance-to-develop-connectivity-standard/

また、HomeKitのデバイス側の開発コードがAppleから公開されています。

https://github.com/apple/HomeKitADK

HomeKitの通信仕様自体は数年前に公開されていて、非商用での開発ができましたが、今回はAppleからさらに開発用コードが提供される形になりました。

https://developer.apple.com/homekit/

HomeKitADKは、非商用で利用できます。製造販売を行うにはMFiの取得が必要です。アプリケーションのコードは、電球と鍵の2つが入っています。

ADKは、Darwin,Linux,ラズベリーパイで動きます。ラズベリにはDockerファイルも提供されています。ビルドは楽そうです。

ソースコードを見ると、Darwinの方は、BLEのペリフェラルとして動くようです。

https://github.com/apple/HomeKitADK/tree/master/PAL/Darwin

Linuxの方は、BLE関連はモックファイルを内部でインクルードしているだけですから、動きません。

ちょっとMacOSで動かしてみました。
READMEにあるビルド方法そのままで、すんなりビルドできます。
IPの方は動きますが、BLEの方はペアリング完了の段階でMac側のアクセサリのプログラムが止まります。
ペアリングの8桁のコードは、”111-22-333”です。

HomeKit ADKをうごかしてみる、Mac OSで。

% cd ~/tmp
% git clone https://github.com/apple/HomeKitADK
Download and install Xcode 11
install brew
% /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
% brew install openssl@1.1
% brew install mbedtls –HEAD
% make all

使ったのはこのブランチ
https://github.com/apple/HomeKitADK/tree/35c8adbb0dae4e44c694fc267dead68be936e65b

BLEのプログラムは、8桁のコードを入力した時点で、アクセサリ側のプログラムが止まるっぽい。こんなメッセージが最後に出ていた。中身まではみていない。
‘’’’
01a0 a0f3 ..
timer register 0x7fa851e1ab20
‘’’’

サイクロルッカーでBirdyを玄関脇収納する

クランクストッパースタンドCS-650 https://cyclelocker.net/product/cs650/ で、折り畳み自転車Birdyを玄関脇にある窪み(約77センチメートル x 約38センチメートル)に収納しました。

この製品は水平のバーでクランクを引っ掛けて自転車を縦向きに固定するスタントです。2029インチ、700cホイールに対応したもので、18インチのBirdyは製品の対応範囲外ですが、使えるので勝手に使うことにしました。
玄関脇の窪みは小さく幅は77センチメートルしかありませんが、Birdyを折りたたむ時と同じように、ハンドルを畳み、サドルポストを下げておくと、この幅にちょうど収まります。

これまでは、折りたたんで玄関脇に置いておいたのですが、ちょっと出かける時に、時間がかからないとはいえ折りたたみを展開するのが手間だったのと、小さいとはいえ玄関の半分近い幅を占有していたのが、少し邪魔だったのですが、その2点が解消できました。

タイヤが向かって左側になるように収納すると、ハンドルが手前にきて、これがぶらんと垂れ下がるので、何かの拍子にここに引っかかって、転倒して怪我をし兼ねません。タイヤを向かって右になるようにすれば、ハンドルが壁側になるので、邪魔な出っ張りができません。

ペダル部分が横に少しはみ出しますが、このペダルだけを簡単に着脱ができるペダルに交換して、収納時はペダルを外すようにすれば、より安全になりそうです。

MacのVMwareのWindowsからSM-BCR2を使う

シマノ製の電動ギアチェンジの自転車を購入したので、MacのVMwareのWindowsから、そのファームウェアを最新版に更新しようとしました。

自転車本体に内蔵した電池の充電と、PCからUSB接続でファームウェア更新や設定ができるUSBアダプタにもなるのが、SM-BCR2 https://bike.shimano.com/ja-JP/product/component/duraace-r9150-di2/SM-BCR2.html です。

E-TUBE PROJECT https://e-tubeproject.shimano.com/?lang=ja で公開されているWindowsソフトウェアで、動くはずです。
しかし、MacのVMwareのWindowsで、ソフトウェアをインストールしても、SM-BCR2を認識できないとダイアログが表示されるばかりです。デバイスマネージャを開くと、COMポートの下、COM3でSM-BCR2が認識されているので、ドライバの問題ではありません。

ここの動画 https://www.youtube.com/watch?v=9oKOvXT_NN8 で解説されていますが、これは、一度Windowsアプリケーションを起動して、デバイスが認識できないダイアログを表示させ、その状態でSM-BCR2をUSBに接続し、Windowsに接続、そしてVMwareのメニューで、USBの切断と接続を行うと、認識されます。

ファームウェアを更新しても、電池が旧型、SM-BTR2 https://bike.shimano.com/ja-JP/product/component/ultegra-6870-di2/SM-BTR2.html、だとシンクロシフト機能は有効になりません。新型の電池 BT-DN110 https://bike.shimano.com/ja-JP/product/component/ultegra-r8050-di2/BT-DN110-A.html を使う必要があるそうです。制御回路本体が、電池と一体化しているのでしょう。

wwdc2019 core bluetooth

What’s New in Core Bluetooth

https://developer.apple.com/videos/play/wwdc2019/901/

BR/EDRデバイスに拡張。
technology, privacy, tool

LE 2Mbps
iPhone8, Apple TV 4K, Apple Watch Series4

Throughput (kbps)
Write With Response: 2.5
Write Without Response: 37
+Larger MTU: 48
+Extended Data Length: 135
+LE L2CAP: 197
+15ms Interval 394
+LE 2Mbps: 670

Advertising Extension, extended advertisement payload up to 124 bytes
Extended Scan,

New API to query for platform support
class func supports(_ features: CBCentralManager.Feature) -> Bool
static var extendedScanAndConnect: CBCentralManager.Feature { get }

Extended Connections,
Supports connections to connectable extended advertisements
Improve existing connection exchange protocol

Legacy Connections
ADV -> スキャン、 Conn_indication, NoACK, Wakes Host Processor

Extended Connections,
ExtADV -> Advertiser, connection_request, connection_response (Wakes host processor),

CoreBluetooth support for BR/EDR
CoreBluetooth2018, いわゆる2つの分離独立スタック構成。
GATT over BR/EDR

Registering for connection events
Connection registration by the Central
Register by Service
Register by Peripheral
open class CBCentralManager: CBManager {
func registerForConnectionEvents(options:[CBConnectionEventMatchingOption:Any]?)
}
extension CBConnectionEventMatchingOption {
public static let serviceUUIDs: ConnectionEventMatchingOption
public static peripheralUUIDs: ConnectionEventMatchingOption
}

Outgoing Connection
let central= CBCentralManager(…)
central?.connect(myPeripheral, options: nil)
デバイスがフォアグラウンドに遷移した時に、BR/EDRのデバイスに接続を試みる。Page/ Page Scan

Core Bluetooth Dual-Mode
Improving Dual-Mode paring
BR/EDRとBLEを両対応すると、そのペアリング/ボンディングは、BR/EDR, BLEそれぞれで、1つのデバイスなのに合計2つの項目が表示される。

Cross Transport Key Derivation
4.2 SIG 規格にある仕組み。
Single pairing process
Same CBPeripheral identifier

BR/EDRでの接続、Inquiry Scan/Inquiry Response、ではなく、BLEのアドバタイジング、スキャンで。
BLEで一度ペアリングして鍵交換。さらにBR/EDRの鍵交換をBLE上で。

Bridging
Low Energy proximity triggers BR/EDR

Privacy Update
User Authorization
background advertization, 許可なしにアドバタイズできてたのが、許可が必要。
スタンドアロンではないiOS/Watchアプリは、Bluetoothの設定を共有する。1度許可を出せば、改めて別のデバイスで許可を出す必要はない。(スタンドアロンを除く)

Adoption
info.plist で許可設定を追加する。
CBManagerAuthorization

Accessory Notification
ANCS Privacy Update
ユーザパーミションが必要になる。

New ANCS Privacy API
public let CBConnectPeripheralOptionRequiresANCS: String

Best Practices
Invoke Core Bluetooth APIs only when required.

Packet Logger
Live Capture
デバイスを起動して、そのログをリアルタイムでMac側で見られる。複数のiOSデバイスの接続も可能。
BLEロギングプロファイルを入れて。

感想

GATT over BR/EDRは規格で見かけても、どこで使うのだろう?と思っていましたが、まさかiOS13で対応すると、少し驚きでした。

BLE proximityでBR/EDRの接続をトリガーするとありますから、iOSデバイスのBluetoothアクセサリのデバイス発見は、完全にBLE側に寄せるんでしょうね。デュアルモードデバイスへの完全移行を印象付けるセッションでした。

BLEのアドバタイジング拡張への対応は、好ましいというよりも、今後は不可欠になると思われます。休日の都会の、ファミリーレストランなどで、BLEのアドバタイジングのチャンネルをスニフィングしたら、その場にいる人たちのiPhoneが盛んにアドバタイジングするから、とてもひどいことになっています。とても接続に使える状況ではありません。これを回避するためにも、アドバタイジング拡張への対応つまりBT5は必須になるでしょう。

wwdc2019 misc

Introducing Low-Latency HLS

資料だけざざっと。配信をより低レイテンシ、ユーザが操作すれば、すぐに再生位置が切り替わるとか、ライブ配信とか。
今は1セグメントが6秒。これをサブセグメントに細かくする。250ミリ秒くらい。リアクションは、600ミリ秒くらい。
大規模な配信で、HTTP(S)は、途中に入るネットワークルータでブロックされたりとかしないという意味で、偉大。

HTTPベースで配信するとして、しかし低レイテンシでは、HTTP/2を使う。
PUSHが使えるので、1つのセグメントを取得したら、サーバー側から次のセグメントのPUSHをしておけば、クライアントはそれを受けて、次のセグメントの取得へと、スムースに要求がつながる。

配信元がすることは、ソースのファイルのセグメントを細かくした配信データを用意する。CDNはHTTP/2にする。

Using Core Data With CloudKit

CoreDataとCloudKitとを統合した振る舞いを、少ないコード量で、実現できる。

CoreDataは、ローカルのデータ永続性、CloudKitは、クラウド側に保存される永続性を提供している。
これを1つの振る舞いとして扱うフレームワークを提供する。

SwiftUIがアプリケーションデータの可視化的な振る舞いをするから、アプリケーションデータをどう実装するかはとても重要で、かつコアになる。また一人のユーザでも、複数端末で作業を継続するのは当たり前の体験だから、このセッションの意味は大きい。

調査すべきは: ClouldKitは、ウェブサービスにもデータを取り出せる。ウェブ側にアプリを取り出す実装は、できるのか?

  • 03:55
    • Xcodeでのデモンストレーション。
    • iCloud capabilityで追加。
    • background capabilityで Remote notification。
  • 07:23
    • NSPersistentCloudKitContainer、AppDelegate.swiftに。追加して。lazy var persistentContainer。
  • 09:04
    • クラウドキットのローカルレプリカ。
    • ローカルとクラウドでの伝送速度は桁違いに違うよと。
    • 同期スケジュールは自動化されている。
  • 14:11
    • Containerの拡張。
    • 複数のストア、
    • CloudKitSchemaを弄る。外部ウェブとの連携。
    • データモデル、コラボレーション。
  • 14:50
    • Multiple store
    • 制約が異なる場合
    • スロットルするとき。
  • 15:50
    • 頻繁な更新があるもの。いちいち同期してもね。
    • ロケーション情報だけローカル保存とか。
  • 19:54
    • Schema、
      <!–
      Object
      CoreDta
      NSManagedObject
      Cloud Kit
      CKRecord

Models
NSManagedObjectModel
Schema

Stores
NSPersistentStore
CKRecordZone

これを2つを1つのフレームワークに。
–>

Creating Great Localized Experiences with Xcode 11

https://developer.apple.com/videos/play/wwdc2019/403/

  • iOS13では、システム言語とは別に、preffered languageが設定できる。
    • インドではお昼の授業は英語で、家に帰ればヒンディー語でと、1日で使う言語が切り替わる生活をしているところは、よくある。そのような利用場面で、iOSを再起動しなくても、言語を簡単に切り替えできる。
  • コードからの言語設定変更はサポートされない。設定アプリに遷移する。

    • UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString!))
  • 言語設定の変更は、アプリを再起動させる。
    AppDelegateの
    application(:shouldSaveApplicationState:)
    application(
    :shouldRestoreApplicationState:)
    restorationIdentifier、言語切り替えをシームレスにするのに、コントローラのを設定する。

  • Locale.preferredLanguages ユーザが設定しているpreferred languageのリスト取得

    • でもこれ設定だから、アプリのバンドルにない言語があったりもする。
  • Bundle.main.preferredLocalizations.first バンドルで一致する言語を返す。

クライアントアプリで、サーバー側と言語を合わせたければ、
let availableLanguages = Server.requestAvailableLangues()
Bundle.preferredLocalizations(from: availableLanguages).first
でバンドルのなかでのリストの中から適当なのを選ばせる。

  • シーンステートの復元

    • stateRestorationActivity(for scene:)、NSUserActivity、シーンステートをエンコードしている。
  • デバイスごとに異なる文字列の扱い。

    • .stringsdictで、NSStringDeviceSpecificRuleType (appletv, applewatch, ipad, iphone, ipod, mac)
    • Settingbundle
  • ローカライゼーションのテスト。

    • クリップ、truncation, レイアウトの重なり、右から左の言語。
    • テストの設定で、スクリーンショットの生成。

Working with USD

https://developer.apple.com/videos/play/wwdc2019/602/

  • usdをアーカイブファイル化するのがusdz。
  • usdzconvert
    • .obj, .fbx, .gltf, .abcなどのファイルをusdzに変換する、コマンドラインツール。

SceneKitから.usdzを出力。
let scene = SCNScene(…)

scene.write(to: baseURL.appendingPathComponent(“file.usdz”), delegate: nil)

  • カーブした表面の再分割。
    • OpenSubdiv。 Pixarが開発した。

What’s New in Swift

  • Xcode11, Swift5.1
  • ABI stability
    • Swift 5 またはそれ以降でビルドされたフレームワークやプログラムであれば、コンパイラーが異なっていても、ABIが安定しているので、ビルドできる。
  • Module stability
    • Swift5.1 で、stable and textual module interface fileが導入。
    • Module + ABI stability = Binary frameworks
  • アプリのランタイムはOSにそれがあれば、それを使う。
    • iOS12.2 以降は、ストアで無駄なコピーされたランタイムを取り除く。
  • SwiftNIO
    • 非同期のクロスプラットホームのネットワークアプリケーションフレームワーク。
    • docker pull swift;
    • docker run -it -rm -v ~/swift-nio:/swift-nio swift
      • cd / swift-nio; swift build;

明示的な単1の表現でのreturnは省略できると。
var area: Double {
return width height
}.
から
var area: Double { width
height },
に。

let quantity = 10
return Text(
“You have (quantity) apples”,
comment: “Number of apples”
)
このyou haveの部分を、ローカライズのキーにできる。ビルド時に、you have + 数値 + applesと分解し、数値部分はローカライズした数値表現で置換する。

Swift DSL。HTMLを例に、HTMLBuilder()をコード内に分散する書き方が、DSLだと、構造のみをすっきりとかけるようにと。

Introducing Desktop-class Browsing on iPad

https://developer.apple.com/videos/play/wwdc2019/203/

  • iPadにデスクトップクラスのWebブラウザ。
    • iPhoneは小さな画面で、タッチがあって。このiPhoneの利点を活かす、Webの機能を入れてきた。
  • ビッグスクリーン、ラージスクリーンで、ウェブサイトは2つある。でiPadは今までスモールだったけど、これからは大きな方に。
  • タッチインプット、マウスインプット。マウスオーバー、out of boxで動くよ。
  • リンクフォロー。
    • 画面分割表示で、領域が小さい時は、ミニモードな表示になるとか。
  • WKWebViewでデスクトップなウェブ体験を有効にするには、
    • ユーザエージェントを設定する
    • webViewConfiguration.applicationNameForuserAgent ユーザエージェントを設定できる。
    • WwebViewで、WKWebPagePreferences , recommended, mobile, desktop、設定できる。
    • WebNavigationで、このpreferencesを設定できると。

セッションの2/3くらいがデモや具体例の紹介。

Introducing SwiftUI: Building Your First App

https://developer.apple.com/videos/play/wwdc2019/204/

最初はコードデモ。コードがリアルタイムに画面表示に反映され、またデザインツール側の設定がリアルタイムにコードに反映される。ビューのスタック、レイアウト、パディングやアライメントの設定、デバッグ用のプレビュー表示設定、ナビゲーションの入れかたなど。

Viewはstruct。Viewは、bodyプロパティを持つだけ。Viewはpiece of UI。
Viewは、dependencyを示す。”@State private var zoomed = false”とか。ステートプロパティ。

時間のかかる処理、UI操作をはさみ。アクティブインディケータの表示、ステートの数で指数的に複雑度は増えるよねと。

データバインディング。配列とリストUIとの自然な結合。

What’s New in Clang and LLVM

https://developer.apple.com/videos/play/wwdc2019/409/

-Ozオプション
Function outlining
処理コードが部分的に同じものを、関数としてまとめて、ブランチすることで、タスクプログラムの25%くらい。
この節約はどこから来るの?
関数の呼び出し最初と戻りの時、SPの退避とか、同じ処理コードがある。

Obj-Cのプロパティ、初期化で値設定するときに、NSObjectでポインタからのオフセットをアドレス加算して、そこに演算処理をする。Xcode11以前。
オフセット値はビルド時にわかるのだから、直接オフセットした値でメモリ操作してしまえばいい。
2%くらいコードサイズ節約。

C++で、スタティックなインスタンス。終了時のデストラクタ呼び出しは意味がない?

Advances in Camera Capture & Photo Segmentation

https://developer.apple.com/videos/play/wwdc2019/225/

フロントとバックのカメラからそれぞれフレームを取れるようになった。
マイクも前後で複数あるから、それはアプリ側で合成する重みを調整して、ビームの指向性を作ってね。

顔の領域分割ができる。顔全体、髪の毛、肌部分、歯の部分。髪の毛を毛の単位で識別する。マットの画像サイズは、元画像の縦横1/2サイズ。
A12以降で動く。マットは、ポートレイトモードのキャプチャに埋め込まれている。あるいは独自のキャプチャアプリを作って、オプトインするか。
マットはCoreImageに統合されているので、画像処理にはそちらで。
HEIFに、メインの画像データに追加して、auxillary matte CIImagesを保存できる。

Data Flow Through SwiftUI

https://developer.apple.com/videos/play/wwdc2019/226/

Source of trueth, “@State”; Viewのstructのプロパティを修飾する。
“@Binding” Stateから派生する。値自体はownしないもの。

外部からのデータ。Combine publisher。

BindableObject protocol

@ObjectBinding クラスでdidChange()で変更を伝えて、モデルの変更を伝える。

@EnvironemtObject ビュー階層でモデルを渡すときに便利。基本ObjectBindingでいいけど、階層でモデルを渡していかなくても、Environmentだとグローバルに渡せる。

@State, View-local, Value, Framework Managed.
BindableObject, External, Reference, Developer Managerd.

Introducing Sign In with Apple

https://developer.apple.com/videos/play/wwdc2019/706/

2ファクタ認証。
アプリが同じなら、全てのデバイスで。

メールアドレスはAppleが認証しているので、認証メールの受信とリンクふみは不要。

AppleID紐付け、メール/パスワード認証。

Real user indicator。

JS SDK。

What’s New in Core Location

https://developer.apple.com/videos/play/wwdc2019/705/

Allow onceが追加。
User alwaysで2回目の利用認証を取らないなら、when in userステートに落ちる。

Beacon ranging
Region monitoring no longer requires always authorization.

CLBeaconIdentityConstraint

Advances in App Background Execution

https://developer.apple.com/videos/play/wwdc2019/707/

Power, Performance, Privacy

これまでのバックグラウンドのbest practice:
メッセージ、コール、muted threads, バックグラウンドダウンロード。

メッセージは遅れば即時に処理が終わると期待するが、実際にはそうでもないかもしれない。アプリが終了されては。
UIApplication.beginBackgroundTask()
message, Phone calls, コード例の紹介。
VoIP Pushed other tips, callder info in push payload, 即時に処理ができるように。
Set apns-expiration on push to 0 電話コールだから、その場で応答できないなら意味がないので。
バナーを出したければ、VoIP pushはバナーを出さないので、別のpushも使う。

Muted Thread,どれを読みどれを読まないかはユーザの設定次第。
alert, sound, badgeは設定しないで、”content-available: 1”でpushを送る。

New: Background Pusheds
apns-priority=5 アプリは起動しない。
apns-push-type = background, watchOSでは必要、その他はめちゃ推奨。

Download Past attachments
メッセージアプリを開いたら最新のメッセージはそこにあってほしい。システムに、程よい時間までダウンロードを遅延させることを許す。
充電中にダウンロードを走らせるとか。パラメータを設定してあげる。

New: BackgroundTasks
バックグラウンドタスクをスケジュールする新しいフレームワーク。
Processing Task, 機械学習のモデル更新など。
App Refresh Task, 30秒。

Mastering Xcode Previews

https://developer.apple.com/videos/play/wwdc2019/233/

struct CellView: View {
var body: some View {
// dynamically replaced with previewbody
}
}

extension CellView {
var previewbody: some View {
Text(“hello”)
}
}

PreviewProviderを使う
Struct AnimalCell: View {

}

struct AnimalCellPreview: PreviewProvider {
static var previews: some View {
AnimalCell(.redFox)
}
}

UIViewControllerRepresentableを実装して、xibのインスタンを作れば、xibのVCをインスタンスしてプレビュー表示ができる。

データモデルをtransferするとか。
self.scentificName =”(anima.genus) (animal.species)”

Model Layer -> XCTest -> View Model -> Preview -> View

Core NFC Enhancements

https://developer.apple.com/videos/play/wwdc2019/715/

これまでに追加してきた機能:
NFCのリード
バックグラウンドでのNFCのリード

NDEF tag writing
Native tag reading

API changes
もともとSessionベースのAPI。スキャンは最大60秒間。

新しく、NFCTagReaderSesion。
ISO14443, ISO15693, ISO18092タグのポーリング。特定のタグの発見コールバック、ポーリングのリスタート。

NFCDEFReaderSession
NDEFタグオブジェクトの、新規発見、読み書き操作。

NFCMiFareTag
ISO15693
Felica

Advances in UI Data Sources

https://developer.apple.com/videos/play/wwdc2019/220/

UICollectionViewControllerDataSource
10年来の構造。data source プロトコル、とてもシンプル。

Apps are often complicated

Diffable Data Source
UICollectionViewDiffableDataSource
NSDiffable DataSourceSnapshot

snapshotを作り、apply()で更新される。
セクションはenumで、デーモモデルはHashable。

デモ。検索でリストが変わっていくもの。
apply()はバックグラウンドキューから呼び出しても、安全。

performBatchUpdates() から apply() に。

Optimizing Storage in Your App

https://developer.apple.com/videos/play/wwdc2019/419/

画像アセット
カメラの解像度が上がり、表示器の解像度も上がっていて、今は画像ファイル1つが25MBくらいある。

HEICがおすすめ。
JPEGと比較して半分近い(25から17とかそんな感じ)のサイズ。iOS11から対応。
aux画像データもはいる、アルファ対応。

Asset Catalog
App icon, Device and scale variants. Storage efficiency.
App slicing(iOS). App launch( up to 10% faster)
Easy GPU based compression, Lossless by default. Lossy image compression available.
AssetCatalog(前の写真だと JPEG 25MB, HEIC 18MB, カタログ 15 MB)。なので積極的に使いましょうと。

File system metadata
plist. one read, three writes.
240バイトのNSDictionaryをファイルに書き込む時。
ファイルシステムノードの更新、新しいファイルにまず書き出し。オブジェクトマップの更新。それぞれ4Kで、合計8Kメタデータ。
ファイルそのもの4K。合計12K。小さなデータだと妙にデータが必要。

non-persistent fileの効率。ファイルを開いて、fsyncせずに使う。

F_BARIRIERFSYNC
F_FULLFSYNC 全てのデータキャッシュをストレージに吐き出す。負荷は大きい。
F_BARRIERSYNC 特定のデータファイルにI/O順序を確保する。

Plists, XML, and JSON
便利に使えるけど、ファイル全てを更新することになったり、色々と微妙?

更新頻度が高いならCoreDataがおすすめ。
SQLiteの上にある。
SQLite、WALモードジャーナルにするとファイルアクセス減るかも?(同じページを変更する場合は) これが、おすすめ。

VACCUM はコストが高い。
incremental auto vacuum と fast secure delete が、ファイルサイズとセキュリティの2つの管理に使えるよと。
Partial indexes。

https://developer.apple.com/videos/play/wwdc2019/262/
リンクにメタデータを追加して、リッチな表現にできる。URLは、ウェブでもローカルファイルURLでも。
リンクの表示。共有シートでも使える。

LPMetadataProvider, LPLinkMetadata。ウェブからメタデータを引っこ抜いてくれる。
LPLinkMetadataはシリアライズできる。

Advances in Networking, Part 1

https://developer.apple.com/videos/play/wwdc2019/712/

Low Data Mode
データ量が厳しい場面で、WiFiやセルラーごとに設定できる、ネットワークデータ利用量を小さくるシグナル。

アプリケーションは、adoption。
画像解像度を下げる、プリフェッチを少なくする。同期を少なくする。オートプレイを止める。タスクをdiscretionaryにする。
でも、ユーザの操作は止めないように。

URL Session
プリフェッチや大きなデータは、allowConstrainedNetworkAccess = false
error.networkUnavailableReason == .constrained のエラーが出たら、Low Data Modeに切り替えるとか。

Network.framework
NWParameters の prohibitConstrainedPaths を設定。
NWPath の isConstrained をチェック。
パスの更新の処理。

URLSession
allowExpensiveNetworkAccess

Network.framework
NWParameters prohibitExpensivePath, NWPath isExpensive

Combine in URLSession
.debounce(0.2) キー入力の、値の遅延。
.removeDuplicates()

URLSesssion
Single value publisher
URLSession.datatTask()に近い。

WebSocket

Advances in Networking, Part 2

https://developer.apple.com/videos/play/wwdc2019/713/

Bonjour
NWBrowser クラス。Bonjour サービスタイプのブラウジング。
デモで、ゲームのアプリ。Bonjourでの、アドバタイジング、発見、接続。

user space network stack, threadで動いている。
やり取りとすると、header/bodyで2回のやりとり。タイプやbodyの可変サイズを取得するのに必要。
header/bodyを1つの塊にして送る。1-65535の大きさで途切れるから、再構築が必要。
Framing。アプリケーションメッセージを、カプセル、エンコードする。

スタックがユーザランドにあるから、このフレームワークで独自のプロトコルを追加したり、TLSを追加したり、層を扱えるのですね。
TCP, Lenght-Value Framer, UDPは? どっちでも動く。

let message NWProtocolFramer.Message(definition: MyProtocol.definition)
message[“key”] = “value // key-valueを追加できる。
NWConnection.ContentContext(identifier: “hoge”, metadata: [message])

CNCopyCurrentNetworkInfo
Access Wi-Fi Information.

Introducing Combine

https://developer.apple.com/videos/play/wwdc2019/722/

パスワード入力画面を例に。
ユーザ目0を表示、UIのtarget/action, 入力に対する反応の遅延時間のtimer, activity(kvo)。
非同期インタフェース、target/action, notificationcenter, url session, kvo, ad-hoc callbacks…
これらすべてを置換するのがCombine、over timeで値を扱う仕組み。
Generic, type safe, composition first, request driven,

Operation API
Functional transofrmations, List operations, Error handling, Thread or queue movement, Scheduling and time.

Compositionの積極的利用。Syncでの配列に相当するものは、AsyncでPublisherに相当。

Zip、複数の入力を1つのタプルに。when/andオペレーション。全ての入力が完了。
CombineLatest, 複数の入力を1つの値に、when/or おオペレーション。

Modern Swift API Design

https://developer.apple.com/videos/play/wwdc2019/415/

Clarity
No prefix in swift-only framewoks

Rference or Value?
リファレンスに意味があるならクラス、リファレンスカウントとdeinitが使う場面。
identity と equality は違うもの。

プロトコル,クラス。
プロトコルで書き出さない。必要なところでプロトコルに。ジェネリックの使い方。

Property Wrappers
使う前に初期化されているべき属性、繰り返される同じコードを、定義にまとめて属性として定義できれば?
@proprtyeWrapper
public struct LateInitialize {
….
}
public struct MyType{
@LateInitialized public var text: String
// これをコンパイラが内部コード生成する
var $text: LateInitialized = LateInitialized()
public var text: String {
get {$text.value }
set {$text.value = newValue }
}
}

@UserDefault(key: “BOOSTER_IGNITED”,defaultValue: false)
static var isBoosterIgnited: Bool

@ThreadSpecific var localPool: MemoryPool
@Option(shorthand:”m”, documentation: “Minimum value”, defaultValue: 0)
var minimum: Int

SwiftUIで@state, @Bindingなど…

Modernizing Your UI for iOS 13

https://developer.apple.com/videos/play/wwdc2019/224/

Launch storyboard, 2020年までの対応が必要。
Be resizable. iOS13でビルドすると、全画面表示になる。リサイズにすること。
Support any size, split screen multitasking.
New bar appearance,
let appearance = UINavigationBarAppearance()

Presentation
レイヤードな、全画面に近い情報表示。Sheets。
UIModalPresntationStyle. .pageSheet, .formSheet / .automatic
Readable widthが、ダイナミックタイプで画面に占める幅が変わる。

Search
UISearchViewController/UISearchBar, UISearchTextField, CancelButton, ScopeBar,
SearchResultController,
Search Tokens, 色付きタグ表示なテキスト、

Gestures
UITextInteraction
CollectionViewControllerで複数アイテムの選択ジェスチャ。

UIContextMenuInteraction
Rich preview,

WWDC2019 Platforms State of the Unionを見たメモ

要点

  • iPadアプリがほぼそのままMacアプリにビルド可能になる。MacOSでカーネルの上にUIKitを含むフレームワークが乗る形。AppKitも平行して横にあるので、従来アプリもそのまま動く。
  • MacOSは、システムはリードオンリになる、ドライバはカーネルからユーザランド側に出てくる、位置やカメラを使うときにパーミションのダイアログが出るなど、iOS的になる。MacがiPadOS化するような感じに移行するのかも?
  • SwiftUIは強力に見える。移行する以外の選択肢はないので、学ぶしかない。

時系列

見ている時間軸で感想。時間は HH:MM:SS 時間が0の時はHHは省略。

  • 00:02:00
    • No more letterbox.
      • 感想: UITextなど、UIは矩形領域を意識するものだったけど、そんな境界はもう忘れて、新しいUIを作ろうという感じがして、いい言葉だなと思うのです。
    • 画面サイズが違う、幅広いデバイスで、UIを展開できるように。
  • 00:03:40
    • Swift、言語、Xcode。ツールは生産性に大きく影響する。
      • 感想: Swiftの言語のオレンジ色のアイコンに対して、SwiftUIにもアイコンが作られている。Swiftの言語のそれの色を青色にしたもので、シンボルとして、これを使っていくのですね。
  • 00:04:35
    • SwiftUIから、プレゼンが入る。
      • 感想: SwiftUIは、大きなUIの設計変更になるから、実際に導入されるのは2年後だろうけど、AutoLayoutのように、そのうち義務化されるのは見えているから、慣れていく必要はあるのでしょう。
      • 感想: iOS12以前でも動くのかだけ要チェックですね。プレゼンでは、1つのビューから移行ができる、すでにあるUIKitなどと競合するものではないから、一部だけ移行していけばいいとありますが。
  • 00:05:25
    • Way Less Code
    • structure , 末尾に見かけを追加していく感じ。
      • 感想: Swift5の言語拡張を利用しているのか、UIの構造をコードの構造で直感的に表現しつつ、見た目の属性もコードにまとめていける感じで、ものすごくスマートな感じがします。実際にデザイナの方が指定したレイアウトをコード表現したらどうなってしまうのかは、やってみないといけませんが。1回、小さな開発を回して、デザインとコードのやり取りフローを見直しておくのがいいかもですね。
  • 00:05:49

    • 例えばリストはとてもよく使うもの。
    • List(mode.items { item in RowContent(item) }
    • Text(“version…”)
    • ローカライゼーション、ダークモードとかは勝手に。
    • コード共有を画面サイズを問わない、全てのデバイスの範囲に広げる。
      • 感想: AutoLayoutは、デバイスクラス単位で指定値を変更できましたが、より柔軟になっているのでしょうか? 要確認ですね。
  • 00:07:23

    • SwiftUIは、Declarative。
    • Button(“Done”, .Done).color()とか。すごく宣言的にかける。Doneボタンを、色はグレイで表示する、とか。大きさやら何やら指定がない。
  • 00:09:43
    • アニメーション。.animation(.default)とか1行的に。
    • アニメーションの割り込み、開始、キャンセルなど、向こう側に。
      • 疑問: state of the unionのSwiftUIのプレゼンを見ているのですが、今までピクセルベースだったりView間のスペース調整などの作業が、まるっとフレームワークの向こう側に行っちゃうのですが、これはもしかしなくても、デザイナの方がコードを書くべき、になりますよね。デザイン要素がSwiftUIの中にある
  • 00:09:54
    • Compositional
    • VStack(alignment: .leading) {
    • Text(item.title)
    • Text(item.subtitle).color(.gray)
    • }
  • 00:10:43
    • Consistent
    • アプリデータの可視化。
    • class Alarms:BindableObject
  • 00:12:46
    • Live development
    • デモ。画面を見ながら、コードで。
  • 00:14:50
    • デザインでのデータは? Preview。PreviewProviderを継承する構造体で、# if DEBUGで、与えられる。
    • ForEach(ContentSizeCategory.common.identified(by: .self)) {
    • item in TrailCell().environment(.sizeCategory, item)
    • }
    • プリビューで、全てのサイズカテゴリを一覧プレビューする方法。
      • 感想: Adobe XDとか、スマホアプリのUIデザインツールがありますけど、こんなコードと同期したプレビュ表示、しかもプレビュがプレビュではなくコードの可視化ツールになってデザイン要素はフレームワーク内部がうまくやってくれるようなもの、デザインツールの立場がなさそうですが、どうなるのかしら
      • 感想: SwiftUIの、Declarative, Automatic, Compositional, Consistent。Doneというボタンをグレイで表示みたいな文章でUIコードが書ける宣言的。アニメなど自動化される。コード構造と対応する形でレイアウトが書ける。アプリデータとViewの自然な結合と表示更新の自動化。
    • デバイスシミュレータ、デバッグでデバイス表示にリアルに反映。
  • 19:32
    • 100%ネイティブアプリ。
    • 自分nのペースで適用。1つのViewからでもいい。既存のUIと共存するから。
  • 20:57
    • Swift、いろんなところに使われる成熟した。ML,AR,iOSアプリ
    • ABI Stability
    • Module Stability
  • 21:50
  • 23:00
    • Xcodeのワークスペース。画面の分割、配置。変更したらアニメーション的に。画面サイズに合わせて、必要なものが必要な時に表示されるよ。
  • 25:00
    • ミニマップがつくよ。
    • //MARK:
    • はミニマップに大きく表示されるよ。
    • 差分のその場表示的なのとか。
      • 感想: まるで別物。1枚のペラっとした板のエディタが、その場の意図でいろんな振る舞い。メニューじゃない感じ。その場ではそういう使い方できるでしょうという、文脈的な?(メニューってありえないのでしょうね)
  • 27:20
    • testing。
    • Location , runtime, Unitがあったけど
    • Test Plansが追加。
    • プラン x Location, Localizations, Locales = スクリーンショット。
      • 感想: スクリーンショットが、言語別に自動生成できて、それがストア提出に使えると。
    • Mac Proで、テストサーバーで、複数のシミュレータ、複数のデバイスで複合テスト。
      • 感想: メモリとコアがたくさんあるProは、こういうテストの並列実行に良いという製品アピールは、それはそうですよね。
  • 29:10

    • Device conditioin.
    • network, thermal. ネットワーク状態や温度を設定してテストできると。温度が上がればプロセッサの速度が下げられるから、画面更新や応答速度に影響するのはわかりますが、そこまでテストケースに入れてみている開発チームはあるのでしょうか。
  • 29:40

    • Result Bundle。テスト結果をファイルに。メールで送り返すとか。内容全てわかるよ。
    • Result Bundle。テストをコマンドラインで走らせて、その結果がバンドルで保存できるよ、それをメールで送るなりしてXcodeで開いたら、全ての情報がそこで見られるよと。半導体シミュレーションでよくあるテスト/ログの運用そのものですね。
  • 30:30
    • App metrix。
    • 消費電力とかディスクとか、いろんなパフォーマンスをモニタ。
      • OSでやってくれないとわからないし、下手をするとプライバシー情報に関わるかもしれないしかしら。プラットホームで閉じているから、プラットホームで提供すればいいのか。
  • 31:00
    • TestFlight Feedback。アプリ画面の下からコントロール的にコメント入力画面が生えてくる。今のテストしているアプリの画面に対して、コメントを返すとかできる。
  • 32:00
    • Mac OS Catalina
    • AppKitベース。
    • UIKitの上にiPad App。
    • 40以上のフレームワークがあるけど、モバイルの制約で移植できないものじゃなければ、動くと。
      • iPadアプリをMacアプリとして動かせる仕組みが提供されるけど、これはiPadアプリ、というより画面を問わない開発環境としてのUIKit、SwiftUIを開発ベースにして、AppKitはだんだん忘れ去る方向なのかしら。
    • Xcodeでチェックを入れてビルドするだけ。
    • iPadアプリ対応。外部キーボード対応、AutoLayout、DynamicType、最新の技術を使う。
    • Mac向けの最適化。iPadアプリにはない、ツールバーの追加とメニューへのアクションの紐付けなど。
  • 36:25
    • iPadアプリのMacアプリ化のデモンストレーション。
    • 左に地名のリスト。右に地球の3D表示で位置が移動する。
    • メニューを追加して、Loginアクションに追加。上のバーが表示されて、アクション実行。
  • 40:30
    • カーネルの中のドライバーをユーザランドに。DriverKit、SystemExtensions。
      • これ、MacのiPad化だよね。iPadでUSBが使えるようになっているけど、そのドライバがどう実装されるのか確認しておこう。
  • 41:00
    • システム領域は読み込みだけに。
    • appから見て、2つ領域
    • OperationgSystem ここが読み込みだけ。2つ領域
    • user data and apps
  • 42:00
    • カメラやマイクロフォンへのアクセスとか。ドキュメントフォルダへのアクセス、許可ダイアログが出る。
  • 43:00
    • WatchOSに入る。
      • 髪が白色で先端だけ紫色で、漫画に出てきそうな、おしゃれな方。
    • 独立して動く、常に接続した状態で、独立した動き。
  • 44:20
    • Supports Running without iso app installation
    • Notification。
  • 45:21
    • Streaming Audio。
    • URL、AVFoundation、とか音楽再生。
    • 瞑想アプリとか、実行し続けるもの
    • Extended Runtime。
  • 47:15
    • 開発demo。
    • チェックボックスを入れて、独立して動くように。
    • サインインの画面。SwiftUI。ロケール、英語と、アラビア語? ユーザ名とパスワードフィールド、
    • シミュレータでの画面、リューズで動くUI
  • 50:00
    • アプリをどう見るける?
    • Discovery
    • ストア表示、結構レビューとか、概要とか。直接ダウンロード。
  • 51:50
    • iOS13。
    • ダークモード。
    • Semantic Colors。
    • 背景は真っ黒、その上のマルチタスク的なレイヤーは、もちょっと明るい背景色で。
  • 53:45
    • Cards
    • 最初はフルスクリーン。画面がポンと出て、いまどきのSNSアプリだとよくある感じ。
    • Contextual Actions。
    • Symbols
    • テキスト、ダイナミックタイプで拡大いけるけど。
    • フォントと連合して動く、UIImageで。SF Symbols。絵文字的な、視覚的な。統一して。文字と統合されたアイコン的な表示。太さとか、大きさ、ベースライン。
  • 56:30
    • iPadOS
  • 57:14
    • マルチなアプリの画面。
    • SceneDelegate、UILife cycle。AppDelegate,。
  • 58:07
    • PencilKit
  • 58:51
    • Productivity Gesture
    • Undo Redo gesture、3本指で。
  • 01:10:00
    • Privacy, それがどうごくか。
    • デバイスで動く、最小のデータ収集、パーミッションを尋ねる。
    • 位置情報、onceが追加。その時限りの。
  • 01:13:00
    • ログイン。
    • 個人だけじゃなくて、会社のため。
  • 01:20:00
    • 機械学習色々。
    • OCRとか、画像の主題の検出とか。
  • 01:29:00
    • Siriショートカットにパラメータ渡し。会話的に。
  • 01:30:00
    • Automation。トリガーで、動作を入れ込む。
  • 01:31:00
    • AR。
    • エンターテイメント。家具の購入での、3.4倍。
  • 01:35:00
    • コードでも。
    • RealityKit,アプリに、ヘリコプターでのツアーのARを追加する例題。
    • RealityComposer、

WWDC 2019

iOS13の新機能

https://developer.apple.com/ios/whats-new/

  • Dark Mode
  • SwiftUI
    • iOS, macOS, watchOS, そしてtvOS のユーザインタフェース構築のモダンなプローチ。
    • ダイナミックなインタフェースを、かつてなく早く、宣言的に、コンポジションを異本単位にしたプログラミングで構築できる。
  • Multiple UIInstanes
    • iOS13ではユーザは、アプリケーションのユーザインタフェースのインスタンスを複数作成して管理できる。
    • 複数のユーザインタフェースのインスタンスは、app switcherで素早く切り替えられる。
    • iPadでは、アプリの複数のインスタンスをside by sideで表示できる。
  • SF Symbols
    • アプリケーションで使うアイコンの一貫した集まりを扱う仕組み。
    • 画像情報はSVGフォーマットでベクターで扱われる。
    • 画像は内包するテキストの大きさやスタイル変更、数学的な足し算や引き算の機能が提供される。
    • Dark modeと通常モードのアイコンの使い分けなど。
  • Bring iPad App to Mac
    • Xcodeで”Mac”チェックボックスを設定するだけで、iPad app をMacに持ってこれます。
  • ARKit3
    • モーションキャプチャ。 People Occlusion。
    • 3までの複数の顔追跡。フロントとバックカメラの同時使用。
    • Collaborative sessions。AR Coating UI。Visual coherence。
  • RealityKit
    • ARアプリで3Dコンテントを連続的にレンダリングする新しいフレームワーク。
    • ARアプリに、アニメーション、物理、空間的な音源の追加する。
    • バーチャルなオブジェクトを実世界にシームレスに統合するのに、ARKitからの情報を活用する。
  • Sign In with Apple
    • AppleIDでアプリにサインイン、ウェブ向けのJSもある。
  • Background Task
    • バックグラウンドのファイルダウンロードなどのAPIがあったが、それがフレームワークとして分離されたもの。
  • Camera Capture
    • フロントカメラとバックカメラの動画の同時録画ができる。
    • 写真の、髪、肌そして歯のセグメンテーション。
  • Combine
    • 値を時間軸で扱う宣言的なSwift APIを提供する新しいフレームワーク。
    • ユーザインタフェースのインベント、ネットワークのレスポンス、スケジュールされたイベントなど、あらゆる非同期なデータを表現できる。
    • Publisher, Subscriber, Subject,, Scheduler プロトコル。
  • Core Haptics
    • ハプティクスのパターンの編集とハプティクスの動作ができる。
  • Apple CryptoKit
    • 暗号関連の処理のフレームワーク。
  • MetricKit
    • システムから、そのデバイスでの電力やパフォーマンスのメトリックを受け取ることができる。
    • 登録したアプリは、直前の24時間のデータを最大で1日に1回受け取る。
    • バッテリー: CPU, Display, GPU, LocationActivity, NetworkTransfer。
    • パフォーマンス: AppLaunch, AppResponsiveness, AppRunTime, Memory。
    • ディスクアクセス, カスタムメトリクス。
  • PencilKit
  • Core ML 3
    • on-deviceでのモデルのパーソナライゼーションをサポートする。
    • アプリの内部で、ユーザ特有のプライベートなデータを元に、再トレーニングやfine-tuningで、モデルを更新できる。
    • ダイナミックなneural networkへのサポートを、100レイヤータイプ以上に拡張する。
    • BackgroundTasksフレームワークで、処理時間の長いCore ML モデルの更新と予測とを、バックグラウンドにスケジュールできる。
  • Vision
    • Saliency analysis。人間と動物の検出。カテゴライズと検索のための画像の分類。feature printとの類似度の分析。ドキュメントのテキスト認識。
  • VisionKit
    • Node appと同じように、カメラでのドキュメントのスキャンができる。Visionフレームワークの文字認識と組み合わせて使うなど。
  • Metal
  • Core Data
    • Core Data storeのCloudKitへの同期。全てのデバイスでのシームレスなデータへのアクセス。
    • クラウドバックアップと配布とにも。
  • Core NFC
    • タグへの書き込み。NDEFフォーマットタグへの書き込みを含む。
    • ISO 7816, MIFARE, ISO 15693, and FeliCaへの、タグの読出しと書き込みを提供する。
  • SiriKit
    • アプリからSiriに、コンテキストと指定時間を含む予約情報を与えられる、ユーザが状況に基づいた関連する行動を取れるように。
    • ホテル予約や、レンタカーの返却時間、飛行機のチェックイン時間のリマインダーなど。