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

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

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に、コンテキストと指定時間を含む予約情報を与えられる、ユーザが状況に基づいた関連する行動を取れるように。
    • ホテル予約や、レンタカーの返却時間、飛行機のチェックイン時間のリマインダーなど。

Arduinoの新しいボード 2019年

Arduinoから新しいボードが発表されています。他にもIoT向けArduinoブランドのSIMカードなども発表されています。

https://blog.arduino.cc/2019/05/17/whats-new-at-maker-faire-bay-area-2019/

ボードは、無線機能ありとなしのもので、無線機能は、BLE、WiFi+BT4.2。無線モジュールは、u-blox製で世界各国の認証取得済みのものが使われています。

とても手頃な価格ですし、Arduinoの豊富な作例、IDEとライブラリを使っている人の数と書籍の多さなど、プロトタイピングの良い選択肢だと思います。

ボードは4種類:

  • ARDUINO NANO 33 BLE 19米ドル
    • nRF52480ベース。9軸(LSM9DS1 加速度、ジャイロ、磁気)慣性センサ。
  • ARDUINO NANO 33 BLE SENSE 29..5米ドル
    • NANO33 BLEにセンサが増えたもの。
    • 気圧、湿度、周囲環境光、マイク。
  • ARDUINO NANO 33 IOT 18米ドル
    • ESP32ベースWiFi+BT4.2モジュール + プロセッサ Cortex-M0+ 48MHz Flash 256kB SRAM 32kB。
    • 6軸(加速度、ジャイロ)慣性センサ。
  • ARDUINO NANO EVERY 9.9米ドル
    • 無線機能はない、ベーシックなもの。
    • ATMega4809、Cortex-M0+ 20MHz, Flash 48kB, SRAM 6kB。

LeetCodeでrustを始めました

LeetCodeで、書いて動かして身につける

Rustというプログラミング言語 https://www.rust-lang.org を身につけたくなりました。

ただ言語を覚えても使えないのですが、LeetCode https://leetcode.com というサイトで練習問題を解いています。かなり、いいです。

なぜRustかといえば、もう、組み込み向けのファームウェアで、memset(*some_ptr, sizeof(some))して構造体を初期化しているつもりが、some_ptrがsome1という1バイトだけサイズが小さい構造体で、隣の1バイトに0を書き込んでしまって、隣にある構造体がたまたま先頭が通常は0である時だけフラグ1が立つフィールドで、滅多と異常な振る舞いはしないけど、たまに異常な振る舞いをする、実行状態依存のバグ調査なんて、二度としたくないからです。とはいえ、C++は私には難しすぎます。

Rustのドキュメントは https://doc.rust-lang.org にあります。日本語訳を出されているサイトが https://doc.rust-jp.rs にあります。ここには、プログラミング言語 Rust, 2nd Edition(最新版)/ The Rust Programming Language, Second Edition の日本語版が https://doc.rust-jp.rs/book/second-edition/ にあります。

他の言語から推移する

プログラミング言語を習得するには、最初にしっかりと基本的な説明を読み、その言語で素直に書けて他人が読みやすい表現を身につけていくのがよいと思います。素直にかけて読みやすい表現は、小さな1つの完結したプログラムを、数をたくさん書いて動かしてみるのがよいのではないでしょうか。

Rustをいきなり書くのは、無理です。全く訳がわかりません。だから、まずSwiftで動くコードを書いて、それをRustに書き直すことをしています。なぜSwiftかといえば、iOSアプリ開発が本業なので、今時の言語で今覚えている言語がSwiftだったからです。WPFアプリを書いていた20年程前なら、C# だったでしょう。

C言語で書くのは、全くの無意味だなと思います。今時の言語は、イテレータやら辞書やらがあって当たり前ですが、そんな概念がない言語でコードを書くのは、辛いですし、その言語で書いたコードを今時の言語に訳し直すのは、今時の言語の当たり前にある恩恵を全く無視することになり、やる意味がありません。C++という選択肢があるとは思いますが、C++は私には難しすぎます。

なんの工夫もない力づくのコードを、まずSwiftで書きます。処理自体は正しくても、実行時間が長すぎて不合格になったりします。そのコードを、Rustで書くと、十分に短時間で処理が終わり受け付けてもらえるのをみると、Rustを学ぶ理由は速さと自分に納得感が出てきます。

トロイア遺跡の発見で知られるシュリーマンは、ものすごい数の言語を習得していたそうですが、その習得方法の一部に、すでに読んだことのある本の翻訳版を何度も繰り返して読むことがあったそうです。ほんとかどうか知りませんけど。すでに知っている言語で一度書いて、それを翻訳するのは、基本的な部分を身につけるには良さそうです。

XcodeとVS Codeでプレイグラウンド

LeetCodeのサイトは、ハイライト表示などのコードを書く支援機能もあり、コードを快適に書けます。ですが、身につけていない言語でコードを書く場合は、リアルタイムな入力補完や文法エラーの指摘が欲しいところです。

いわゆる、プレイグラウンドがローカルに欲しいところです。

Xcodeは、Macに無償でインストールできます。Xcodeで、メニュー新規作成からプレイグラウンドを作成して、Swiftで書いたコードをその都度評価、その都度実行ができます。

Rustの始め方は、 https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/getting-started.html に書いてあります。

Rustのプレイグランドな環境は、VS Codeを使います。

単体のソースファイルを実行するには、extensionで、Code Runner 0.9.8 をインストールします。Rustの適当なファイル(例えば main.rs のように拡張子をrsにしておけば)を新規作成して、適当にコードを書いて、右クリックで”Run code”をすれば、rustcデコンパイルしてくれます。コンパイラのエラーメッセージでコードが書けるなら、これでいいでしょう。

さらにリアルタイムな入力補完や文法チェックなどが欲しいなら、extensionで Rust (rls) 0.6.1 をインストールします。さらに、rustのCagoプロジェクトを作れば、依存関係も見た入力補完が利くようになります。

Rustの使いどこ?

Rustはべメタルからサーバーまで、幅広く使える言語ですが、私の個人的な要求は、数KBのメモリしかないマイコンで、今時の言語で開発をしたい、ただそれだけです。

今時の言語であれば、そもそも、やらなくてもいいこと、言語に組み込まれたあらゆる工夫や技術開発のおかげで、今ではもう苦労する必要がもうないものを、考古学的に現代で縄文人の生活をするようなことは、もう嫌なのです。苦労は買ってでもしろというなら、店頭に並べておくので、いくらでも買っていって欲しいくらいなのです。

forループで配列を処理するのに、配列の長さを間違えて、書き込んではならぬメモリ領域を暗に変更して、それがずっと後になって何かの処理に影響を及ぼしたり、あるいは及ぼさなかったりするのは、実際に実行されているあまたのデバイスで、稀に発生するが再現できない何かがあると言われるのは、もう嫌なのです。

配列の長さを確実にチェックするのに、{some_type * array_ptr, int count } と、わざわざ自分で配列の長さを記録して配列の処理ループを書くのは、嫌なのです。

今時の言語ならイテレータを使えば済むことを、わざわざforループでベタがきして、潜在的なバグを発生させる綱渡りのようなコードを、大昔に開発された言語で今書いて、地雷を自分で埋めて自分で踏み抜くのが、嫌なのです。

とはいえ、数KBくらいしかメモリがない、OSもないマイコン向けのバイナリを吐き出せる言語系というと、C言語かC++言語になっています。これらは直接機械語を吐き出します。今時の言語は、例えばJavaにしてもSwiftにしても、配列アクセス時の範囲チェックやメモリ管理などが必要ですから、ランタイムがコードを実行しています。ランタイムは、小さなメモリのマイコンに移植するのは、例えばtinyCLRなど実装例がありますが、1桁KBには無理です。

Rustを使ってみると、処理経過がスタックにズラーっと並び、しかも無駄なコピーも発生させずに、処理が終われば長くのびたスタックが元の長さに戻り、その先頭には処理結果がちょこんと乗っている、そんなメモリの時間軸の流れと、処理の流れがイメージできます。

Rustで書いたコードはデータの局在性が極めて高くなりそうだし、そうなるようなコードを書くのがRustでの素直に読めるコードになるのでしょう。最近のプロセッサの処理速度は、演算回路それ自体よりもむしろメモリ幅で制約される場面も多いでしょう。

ハイエンドでも、いい言語かもしれません。データの局在性で。プログラム自体がバイナリが小さい=キャッシュに収まる、スタック的に処理が進む=以前にアクセスした領域だから高い確率でキャッシュに残っている、処理経過がスタックが伸びる感じで進む=データ局在性が極めて高くキャッシュヒットが高くなる感じのコードを書くことになるのかもしれません。もちろんRustにでもRcを使えば参照メモリが使えて、JavaやSwiftと同じようなメモリ領域の使い方ができますが、そういうコードを書く言語ではない、それだけのことなのでしょう。最近のプロセッサはL3キャッシュが2桁MBだったりしますから、そのキャッシュに丸っと処理系が入って出てこないなら、もうプロセッサがFPGAと見分けできなくなりそうですね。

STADIAのブログを読んでみる

開発者サイトに入らないと何もわからないですね

https://stadia.dev/blog/ に、いくつかブログ記事があったので読んでみました。技術的な中身というよりも、なにができるかアイディアを出してみようという感じで、実際に作る段階がどうなっているのか、どのように動くのかは、開発者情報に入らないとまるでなにもわからない感じです。

https://stadia.dev/apply/ 開発者への応募は、US在住ならば雇用者Tax ID番号の登録が必要です。メールアドレスは、会社のドメインのアドレスである必要があり、Gmailなどのアドレスでは受け付けないそうです。

フレームデータがクラウド側にあるよと

https://stadia.dev/blog/stream-connect:new-possibilities-for-multiplayer-gameplay/

Stream connectの概要です。ユーザのビデオをテキスチャとしてゲームに織り込むことができる、またユーザからのオーディオをゲームに混ぜ込むことができる、そうです。チャットやグループでプレイする場面で使えるのでしょうか。

フレームデータがクラウド側にあって、再レンダリングすることなく、あるプレイヤーから他のプレイヤーにフレームデータを渡せること。ここが活用どころになるのでしょう。

例題として:

  • コーチベースの画面分割、複数の人数のゲーム画面を1つの画面に。
  • 共同のsquadビュー、全てのチームメートの見ているのを、それぞれのプレイヤーの視点に、
    • コーディネータに、画面のレンダリングを再度しなくてもいい。
  • あるプレイヤーから別のプレイヤーに、フレームデータを、だいたいすぐにストリームする。

観客がいるゲームなら、レンダリングパイプのHUDを入れる前のゲーム画面を観客に配信して、プレイヤーはそこにライフゲージなどのHUDがレンダリングされたものを見る、というのができるとか、そういう感じです。

配信技術に関わる部分、符号化方式、ビットレート選択とかそういった話はありません。Googleに任せろ、になる部分は知ってても、手が出せないですから意味がないのでしょうか。

ステートの保存と管理

https://stadia.dev/blog/the-magic-of-state-share-explained/

ある人がしているゲームを見かけて、あるいはスクリーンショットを見て、そこに飛び込んで、さらに見ているものを遊ぶにはということだそうです。

ステート設定がAPIになっているので、そこでステート保存をして、どこでも全てがセーブポイント担っている状態で、かつ他のユーザがその状態を引き継いで新たにゲームを続けられる、まるでソースコード開発の無限フォーク状態です。

まぁ、色々できますよね…

象印のIH圧力鍋を買ってみた

買ってみた

象印のIH圧力鍋を買ってみました。台所に設置すると、こんな感じになります。

購入時には、圧力と温度と加熱時間とを、電気制御できるから、適切な材料と調味料さえ入れれば、失敗なく美味しい一定の味が作れるだろうと思いましたが、まさにそのものでした。

1日使ってみた感じでは、レシピ集がよくできている。材料を切り、調味料を入れて、ボタンを押せば、おばんざいや夕食のメインが本当にできる。この手軽さは素晴らしいです。

蒟蒻の煮物は、45分ほど加熱して中まで味が染み込んでいて、美味しくできています。鍋でコトコト煮ると、ガス火の前にその間ついていないと不安になりますが、電気だと放っておけばいいので、手間がありません。

加圧調理は調理時間の短縮ができて根菜の煮物に便利なのですが、この調理器は無水料理も対応しているので、小松菜の煮浸し的なものが手軽に作れます。使ってみると、葉物野菜が手軽に使えるのが、よいです。

魚の煮付けも作ってみました。クッキングシートを敷いて、魚と調味料を入れるだけです。クッキングシートは、鍋への焦げつき防止なのかと思いましたが、クッキングシートをつまんで持ち上げると、出来上がった煮付けを崩さずに鍋から取り出せたので、取り出しのためにあるのかもしれません。

アマゾンだと型番が2つあるけど中身は同じっぽい

アマゾンでみると、EL-MB30-VDとEL-MB30AM-VDの、2つの型番がありますが、機種自体は同じようです。レビューで書かれているように、AMはアマゾン向けの機種名なのかもしれません。

AMがついている方のが、若干お安いみたいです。型番にAMがついた方を購入したのですが、家電そのもののダンボール梱包に送付ラベルが貼り付けてあるシンプルな梱包でした。この型番のものは、故障時など、保証問い合わせ先はアマゾンになるのでしょうか?

アマゾンで商品を購入すると、よく、商品自体にも梱包があるのに、それをさらにアマゾンのダンボールに入れて送付してきますが、こういったシンプルな梱包の方が、捨てるダンボールが少なくて済みますから、いいですね。

電流容量に気をつける

IH圧力鍋を動かしているときは、電流容量を超えるかもしれないので、他の炊飯器やレンジを使うのは、微妙です。おばんざいの作りおきをする、炊飯器は、1200Wではなく600Wくらいの炊飯器を使う、あるいは1200Wくらいの炊飯器なら別のコンセントパネルに接続して2台同時使用可能にする、あるいは、おかゆモードで600W程度の消費電力で動かすようにする、くらいです。

コンセントパネル1つあたりの電流容量が15A、20A以上流すとコンセントごとについている小さなブレイカーが、多分落ちます。台所にはコンセントパネルが2つあるでしょうから、もう1つ別のコンセントから電源をとれば、2台同時動作ができるでしょう。多くの賃貸物件の契約電流容量は30Aですから、別々のコンセントを使ったとしても同時2台が上限になります。3台動かせば、3.6kWで36A流れますから、確実にメインのブレイカーが落ちます。

コンセントパネル1つで設置しているので、2台同時使用ができません。1200Wを消費する炊飯器で炊飯をしながら、メインの料理をIH圧力鍋で行う、というのができません。ただ、この炊飯器は、おかゆの場合は最大消費電力が600Wになるので、同時使用ができます。あるいは、炊飯器が最大消費電力を消費するのは最初の加熱時でしょうから、その消費電力ピークからタイミングをずらしてやれば、2台同時使用もできるでしょうが、気を使うのが面倒でしょう。

使い方は、おばんざいの作りだめ?

この機種の便利な使い方は、3台ほど並べて副食2つとメイン1つを同時に調理する使い方でしょう。賃貸だと契約電流容量の都合で、無理ですが。ですから、時間をずらした使い方となると、冷えても問題がない、あるいは一気に作りだめをして冷蔵庫で数日保存するものに使うしかないです。

ただ、メインのおかずが冷たいのは嬉しくないですから、炊飯器を別のコンセントに接続する、あるいは消費電力が600Wくらいの炊飯器を使い、炊飯器とこのIH圧力鍋の同時利用くらいはできるようにしたいです。

焼くのは必要か?

パン種の発酵とパンを焼くくらいはできますが、肉の塊をこんがり焼き目をつけるような焼きはできません。

他社製品だと、シャープのホットクックは、加圧調理はできませんが、かき混ぜ機能と焼く機能があります。使い方によるでしょうが、私の場合は、野菜炒めや焼きそばなどは、焦げ目がちょっとある方が好みです。焦げ目は電気制御では作るのは困難でしょうから、焼き機能はあっても使わなさそうです。実は使うと便利だったりするのでしょうか?

BLE本執筆開始の挨拶にかえて、駄文です

はじめに

BLE本の執筆を開始しようと思い、手始めに思うところを徒然と書いてみようかと思います。童話で、井戸に向かって、人に言えない秘密を大声で叫ぶ、王様の耳はなんとやらのお話がありますが、その井戸に叫ぶようなところです。

本というものは客観的に書かないと商品にならないのですが、そんな客観的な文章を書いていると、頭の後ろ側がヒリヒリとかゆくなって、続かないので、ここで主観しかないことを書いて、バランスを取ろうというのが目的です。

なので、読ませるための文章じゃありません。どこかの飲み屋さんでお酒を飲むか、タバコでも吸いながら愚痴として空気に霧散させるのが、よいのでしょうが、あいにくお酒もタバコも嗜みませんし、リアル世界に話す人間もいませんから、ネットにこうやって霧散させようというわけです。

ならツイッターに流せばと思われるかもですが、ツイッターは幸福で幸せな日常で彩りたいのですよ。どこか知らない人のタイムラインに、ある日突然3分ごとにツイートが連続して流れ出して、それがこれから下の内容だったらとか思ってみてくださいよ。幸せじゃないじゃないですか。

フリーランスする言い訳がなくなりまして

昨年、両親が他界しまして。

この10年ほどフリーランスをやっていた自分向けの理由が、もしも両親が病気で倒れても即座に対応できる、会社勤務だと有給を使い切ったら休職なり辞めるなりで大騒ぎだけど、元々がフリーランスならそんな事もないでしょう、という立派な理由でした。

10年前に会社を辞めたのは、5月の朝とても気持ちがいい晴天で、こりゃ会社行っている場合じゃないなと思ったからで、そのあとフリーを始めたのは、毎日会社に行くのがめんどくさいからなので、こんな立派な理由はただの言い訳なのですが、そんな理由もそもそもがなくなってしまいまして。

さて、こうなると自分の生き方は自分で決めなさいになるわけですが、身軽過ぎて、これがまた身の置き所に困るわけです。子供がいるわけでも、会社のしがらみがあるわけでもない。徹底的に気楽さを追求しているので、自分がすることは自分で探して決めるほかないわけです。で、ざっと周りを見渡してみると、いろんな生き方があるなーとは思うけど、どれも当事者になりたい気はしないわけです。

iOSアプリやBLEのファームウェア開発、あるいは組み込み系の開発で開発を個人で請け負うなんて、仕事になるのかと思われるでしょうが、実際のところ月に100~400万円くらい売り上げができるわけです。

短いお仕事なら2ヶ月くらい、長いお仕事だとそれでも1年単位くらいで、フリーランスという名前の通りに、必要な技能を提供して必要とされる成果物を収めたら、そこで完了という、そういうお仕事です。

本気で3ヶ月も働くと、指先の皮はキーボードとの摩擦とストレスでボロボロと剥がれて、皮が薄くなって血が滲むので、湿潤治療の絆創膏を皮膚がわりに貼り付けてしのぐ、そんなのを一年ずっと続けられるわけもないので、働くのは一年に1ヶ月を3回くらいが、ほどほどでしょう。

ですから一年のうち3ヶ月も働いたら、日本の地方都市での生活費用(年金や保険と税を抜いて400万円もあれば十分でしょう)くらいは満たせるので、それ以上働くのか?といえば、そこに働く気も起きないわけです。ただ、おもしろいお仕事だと、おもしろいので、つい話を聞きに行っちゃいますが。

なので、必要を超えて働く理由も、あまりないわけですよ。

プロなら自分で勉強するでしょう

組み込みをやっていてBLEがわからない、いい本がないか?とか言われたら、無言でBLE handbookを差し出すわけですよ。あれはBLEの規格を制定したグループのCSR勤務の副議長、本当のプロ中のプロが書いている本ですから。

プロとしてのお仕事は、結果保証なところがありますから、目の前のものが動いているやったーなんて趣味じゃなくて、動いている理由をマイクロ秒単位でビット単位でμA単位で、物理と規格に基づいて完全説明できて、だから動きますよといえないと、怖くて収められないわけですよ。

だから、必要な情報をちゃんと習得できないのに仕事なんか受けられるわけがないでしょう。仕事なのですから。英語が読めないとか、分厚すぎるとか、そんなの、それがどうした? できないなら手がけるな、なんですよ。

実際に私の場合で、4ヶ月くらいですか、BLE handbookとBluetoothの規格書とNordicの半導体のドキュメントとSDKを、じっと睨んで動かして理解してを繰り返してました。本当、ちゃんとプロに教われば1ヶ月くらいでいいらしいですけど、独学で時間を無駄にしているところが、馬鹿っぽくって私らしいですね。

それでも、書くのが好きなようで、BLEの解説をちょっとブログに書くと、リアルで、あれ読みやすかったよとか、分かり易かったとか言われるわけです。やっぱりそう言われると、嬉しくなっちゃうもので、ようし、もうちょっと書こうかなと言っちゃうわけです。

そして机の前に座ると、そんなお調子よく言っている気持ちも30秒で吹き飛ぶのです。だって、BLEって無線からタイミングからプロトコルからデータ表現まで含んだ、完全な無線通信で何かの機能と振る舞いを丸っと実装できる技術体系そのものですよ。今時、話題のIoTの解説本でも、イーサネットの物理層ならイーサネット単体で、IP層ならTLSも含めるかもですけどトランスポート層までで、MQTTなりOAuthなりアプリ層はアプリ層で、層ごとにとかもっと細かい細分で、もう300ページの本になっているわけですよ。

BLEで、層の内容は薄いけど、それらの層を全部含んでいるわけですよ。それを解説を書こうとするわけですよ。BLEの副チェアマンが書いても400ページ行くような、そんなものなんですよ。なんで、勉強しただけの素人な私に、そんな分野の丸っとした本が書けると思うねん? って冷静になるわけですよ。

だいたい1日に書ける文字数が1万文字、10ページとして書くだけで1ヶ月、技術本って裏付けや調査に時間がかかるから、よく知っている分野でも1つ1つ確かなことかを文献にあたって確認して行くので、どうやっても半年は丸っとかかるくらいの、情報収拾と文章表現に時間がかかります。

その数ヶ月の道のりに、一歩足を乗せては、冷静になるわけですよ。2日くらいで書けるBLEの解説が分かり易かったと褒められて嬉しくて、時間もあるから書こうとする、でもここから数ヶ月かかるわけです。しかも想定読者は、自分と同じような仕事をするプロでしょ。

本音で言えば、同業らのために解説の仕事する義理も理由もないわけですよ。ファームウェアなら3ヶ月800万円で見積もり出すから、それで開発して納品するから、本とかそれ以前に、うちに発注すればいいわけですよ。世の中、お金でち。

なので、書く理由もなくなっちゃうわけですよ。

執筆の目線を勘違いしてたんでしょうね

そんなこんなで、2012年にちょっとBLE解説本を書いてみては、これじゃないなーと出版せずにいたわけです。BLEの技術更新は恐ろしく劇的で、そんなことしているうちにBluetooth4.0は、今や5.1が出ようとしています。高速化、ロングレンジ化、アドバタイジングの高度化にペイロード拡張と、もうやりたい放題で規格が毎年何かしら更新されるわけですよ。

見てて楽しいけど、4.0からの技術更新は後方互換性を維持してやっているから、4.0の技術じゃ動かない作れるものも作れちゃうし、それをすると、どの端末だと動かない?とか把握が必要になるしで、見たくもない地獄を見える目にあうわけですよ、リアル仕事だと、いい加減にしろこの野郎です。せめて後方互換性をいっそのこと捨ててくれたらと思いますけど、それはそれで、キッツいんですよね…仕事したら負けだと思います。

でもね、ちょっと目線をずらすと、BLEの本が必要な場面かもなーというのが、この頃見えてきたと思いまして。要は、想定読者を組み込みやらiOSアプリやらの開発者としてたのが、こんな面倒くさい事を考え出すようになった、原因なんですよ。同業者なら、自分と同じように勉強しろ、効率最悪でも4ヶ月あればできるようになるから、と思っちゃうという。

でもね、BLEって、サービスで関わる人もいるし、事業立案で使う人もいるし、開発もアプリとファームとハードウェアと、担当者が別の人でチームで仕事してたりするわけですよ。そうすると、ファーム書く人が理解している、というだけじゃ、トラブルわけです。アプリとかもっと言えば事業とかと、目線があって同じような言葉で同じように話せてないと、仕様も作れないわけです。

そういう考え方をすると、あ、これ海外旅行に行く人の簡単会話集的な位置付けの本がいるんだなって思いました。BLEという言葉のあるところを旅行するためには、BLEというものの文法や単語がわかれば話し言葉が組み立てられますよね、BLEを使う分野で危ないところや安全なところを事前に知っていれば目的地まですっと移動できますよね、そういう目線で見たBLEの解説なら、同業者じゃなくてチーム向けの本として、ありでしょう。

チーム向け、BLEという外国語でBLEという外国を旅するための言語解説込み込みのガイドブック。これなら、書く意味も見いだせるわけです。なぜなら、こんな本を書いた人ならBLEの開発のお仕事を依頼したいという、名刺になりますから。私のところに仕事が来なくても、それはそれで同業向けに書いた本じゃないわけですから、自分の本で自分にきたかもしれない仕事を削り落としたのかと疑心暗鬼にならずにもすむのです。たぶんね。

価格はわふーにちなんで1.2万円

と、2012年から7年余りで、やっと書く気になったわけですが、価格だけはもう、わふーにちなんで1.2万円と決めておきましょう。Kindleでも電子でも紙でも、どんな媒体でも、1.2万円です。買いやがれコンチクショー、です。

では、また執筆状況が進めば、ここに吐き出しにくると思いますので。

Appleスペシャルイベント2019年3月

何が発表されたの

Appleのスペシャルイベントが開催されました。

https://www.apple.com/jp/apple-events/march-2019/

このイベントの中で、4つのサービスが言及されました:

  • News配信
  • コンテンツ配信、TV+
  • ゲーム、Arcade
  • 支払い、Payment

イベントは、まず映画のオープニングのような動画(スタッフ名が入るべきところに、SiriやApple PENCILなど、Apple製品の名前などが入る)で始まり、CEOによる挨拶、担当役員によるサービスそれぞれの紹介、そして最後はTV+に集う才能ある人たちのステージ上でのおしゃべりタイムで終わります。

News配信

専門家によるキュレーション、信頼できるニュースソース、そして読み手のセキュリティとプレイバシーを守ることとして、News配信サービスが紹介されました。

月額9.99米ドルで、家族6人まで共有できます。Wall Street Journalなどが対応します。また、マガジンの配信もするそうです。

読み手のプライバシーとして、レコメンドはデバイス側で計算するとしています。レコメンドの計算はサーバー側での処理ではありません。コンテンツは一括まとめてダウンロードされるので、ユーザがどのコンテンツを見ているかをサーバー側がそのアクセス状況から判別することも、できないそうです。

アプリの画面の見た目は、さすがApplという感じで、とても美しいです。

コンテンツのレイアウトは、トップにトップコンテンツの写真があり、その下にテーブルカラムで項目が並びます。項目は左にテキスト、右に大き目の画像が配置されます。コンテンツの移動、マガジンの選択など、項目のスクロールと選択、選択による表示遷移が発生しますが、それらは横スクロールだったり、縦スクロールだったり、スクロール方向の組み合わせが混じっていますが、アイテムが並ぶ方向が縦横なので、そこからスクロール方向は自然と分かる感じで、混乱はないかも?です。

要所要所で、動画ではなくアニメーションを取り入れている感じです。オンラインのこの手のものだと、トップは動画を入れてきそうですが、トップコンテンツは写真です。でもLivePhotoのように、ちょっと動いたりします。Live cover。動画にするとどうしてもストーリーが入り込みますが、ちょっと動く写真だと、魅力的な写真(not 静止画)みたいな目を引く感じがします。スクロールに従って、文字のコントラストや区切りシンボルの大きさがスムースに変化したり、自然な感じだけど、アニメーションを要所に散りばめていて、ウェブとは違う雰囲気がよく出ています。

本文も、最初の1文字が中世の書籍でよくあるような、大きく表示されて飾り文字になっていたり、とにかく綺麗で、またその綺麗さがコンテンツの論理的な構造を乱してはいない 、デザインと意味が揃っている感じで、この辺りはさすがです。ウェブとは違うのだよ、というネイティブっぽさを感じます。

Arcade

インディだと、無料で提供するゲームになるけど、広告やクリック誘導が収益源になるのは、(あまり稼げないから?)辛いよねということなのでしょうか。

アマゾンで、漫画のインディーズ育成をしていますが、そのような感じで、アーケードという月額の囲いの中で、ゲーム配信をするそうです。Googleがゲームの配信サービスSTRADIAを発表していますが、こちらは当然オフラインでも遊べます。デバイスを握っているAppleにとって、ユーザごとのハードウェアの処理能力の予測できないくらいのばらつきは、ありませんから、オフラインで動くのは当然のことです。

2019年秋からの開始だそうです。

Payment

Apple Payをさらに一歩進めて、Apple自体がゴールドマンサックスと組んでカードブランド/イシュアになります。

アプリに管理画面ができます。支払い明細は、月ごとなどグラフ的に表示されます。また米国のクレカ支払い明細は、事業者の住所で表示されますが、それを読み取って地図や事業者名の分かりやすい表示になります。分割支払いがとても柔軟で、支払い回数や期間をアプリでグリグリ変更すれば、支払い金利がグリグリ更新されます。月1回支払いや2週間ごと支払いなど、支払い方法も柔軟に設定できるようです。

ポイント還元率は、Apple製品の支払いでは3%、オンラインの支払い(Apple Pay)で2%、リアルカードを使う場合は1%です。

リアルな物理カードも発行するそうです。チタン製で、名前がレーザマークされて、ICチップが入っています。磁気カードのストライプも、カード番号も、CVV番号もありません。本当に板みたいなカードですが、ちょっと欲しくなるくらい綺麗です。カードの支払いは、ワールドワイドにマスターカードとも連携してくそうです。マスターカードのお店で使えるなら、世界のどこでも普通に使えますね。物理カードは、2019年夏スタート。

一般利用者から見ると、マネーフォワードなどの家計簿ソフト機能が統合したKyashみたいな感じですが、Health Careアプリがフィットネスの中心担っている人もいれば、全く存在すら知らない、他社アプリを使うためHealth Careアプリが使えない人がいるように、支払いでも、Appleは第3者にデータを渡さないでしょうから、他の家計簿ソフトとの連携はできないでしょう。Appleのカードに囲い込まれて全てを集約する人なら問題はなく、そうでないならば使うメリットが見つけられない感じになりそうです。

コンテンツ配信、TV+

コンテンツ配信からさらに一歩踏み出て、自分たちでコンテンツを作っていくTV+となるそうです。

またTV appを、Mac、そしてSAMSUNG, LG, SONG, VIZIOのスマートテレビと、さらにはFire tv、Roku向けに提供するそうです。月額のサブスクリプションなら、アイテム購入で支払い課金が発生しないから、他のプラットホーム向けには、アプリはビューアでしかないとして、アプリ配信ができるのでしょうか? 今までは自社ハードウェアにサービスを囲い込んでいましたが、TV分野では、デバイスとサービスとを分離してきた形になります。

まとめに代えて、色々な流れのなかで

Appleは、ドコモのビジネスを数年遅れで世界レベルで行う会社に見えます。

ドコモのキャリアは、Appleに置けるデバイスで、そのキャリア契約もしくは周期的に買い換えられるデバイスの売り上げが、収益の基盤になります。その収益基盤の上で、課金(集金)を核にしてサービスのプラットホームを提供し、多種多様なサービス提供者と、そのサービス利用者とが繋がる場となり、それがまた新たな収益となり、かつキャリアやデバイスを使う理由にもなります。

ですが、ドコモもdマガジンなどコンテンツ配信は手がけていますが、自身でクリエータを育成することはしていません。今回は、AppleはTV+で、自分たちでコンテンツを作り配信を盛り上げていくようになります。またArcadeは、ちょうどAmazonが漫画のインディ育成に基金を設定し読まれたページ数でそれを配分するインディ育成プログラムを行なっているように、月額ベースでインディでも参加でき、かつ広告をいれなくても単純な人気/遊ばれた時間や遊んだ人という、本来の遊ぶ人に向けたゲームそのものの楽しみを盛り上げる方向を打ち出しています。

作る人が枯渇したら、作る人の奪い合いになっていく、将来に枯渇して困らないためには、今から自分たちで育成を初めて、長く続けていく、そういう節目に思えます。

ゲームのサブスクリプションが、GoogleがSTADIA、AppleがArcadeと出てきました。前者はビデオ会議ができる端末とネット環境があればよい、後者は自社デバイス縛りでオフラインでももちろん遊べる、そういう明確な違いが見えています。ネットワークサービスとして捉えたものと、ハードウェアを含めたネットという生活環境の中でのゲームというものを捉えたものと言えます。

ただ、今のネットは炎上する環境でもあります。Googleのネットありきは、基本が人の口に登ってなんぼと、人を超えてネットワークの網目の中で情報が流れてなんぼの構造です。これは炎上するのが本質でしょう。Appleのゲーム体験なら、共有するのは自分あるいはリアルに画面を見せ合う友達やネットを通じても自分がそれなりに知っている見せてもいいと思っている相手と、ネットの有無にかかわらず、それは自分もしくは相手という人です。これは人と人との関係です。これは大きな違いとなっていくでしょう。

Googleが生み出すだろうクリエーターは、人に見られてなんぼ、の方向になるでしょう。燃えてなんぼ、炎上してなんぼの、下品な方向にいかないことを祈るばかりです。Appleが生み出すだろうクリエーターは、自分や家族単位のグループが楽しみたい見たいと思わせてなんぼ、の方向になるでしょう。こちらは古典的な今までもあるクリエーターでしょう。

ニュースサービスは、新聞の体験に、美しい画面表現と機械学習を活用したレコメンドという形に見えます。どこまでいっても、個人が読む体験、が本質でしょう。

同じニュースサービスでも、日本では広告が収益のGunosyというニュースをまとめるビューアがあったりします。また今回のAppleのスペシャルイベントについて、事前に噂レベルの情報をまとめて記事にすることでPVを稼ぐサイトもあれば、その記事を元にしてSNSで盛り上がるいつもの流れもありました。

Appleが掲げる、信頼できるニュースソースそしてプライバシーとセキュリティの保たれた世界のニュース体験は、確かにあるものだとは思いますが、それが一般的に多数派のサービスなのかどうかは、Twitterを10年も継続している自分には肌感覚としてもはやわからないです。

ただ、TWを見ちゃうのは、例えば今日であればカニ化というものを初めて知ったりして、こういう体験ができるからだと思えば、自分の行動予測で提案される信頼できるニュースソースから構築された一連の記事では、永遠に知ることはないだろうなと思います。