try! Swiftに参加しました(4回目) #tryswiftconf
カンファレンスには一般参加したり学生参加したりスタッフ参加したり色々してきた。
今回はスポンサーチケットで、スポンサー役を。
-1日目
tryswifttokyo-aftertalks.connpass.com
勉強会自体が久しぶりで、ぱそこん持ってくるのを忘れる失態を犯した。
Xcodeの Debug Memory Graph
を使った華麗なるデバッグ
Xcodeの Memory graph を使った華麗なるデバッグ - Speaker Deck
実装はGitHub - po-miyasaka/LLDB: A LLDB command creating a variable from a arbitrary instance address for debugで見れる。
ビルドにン十分かかるやつを触るとなるとあの手この手でビルドを回避しないといけないから、助かる。今回はDeNAさんもLLDBチートシートをくれたのではかどっちゃう
アプリの起動速度と Dynamic/Static Framework の関係を紐解く
App startup time with Dynamic/Static frameworks - Speaker Deck
Optimizing App Startup Time - WWDC 2016 - Videos - Apple Developerが参考になるとのこと。まとめてくれる人がいてたすかる。
0日目
縁あってハンズオンした。
Kituraと一緒に使えるパッケージがたくさん用意されているのはありがたい。世の中にはDarwin専用というか、Darwin上で動かすことしか想定していないものが多いので、使い合わせやら何やらを考えずにさくっと雑に作れる。
さっそくお家帰ってつくろうとしたら私用Macbookがつかえない子になっていた*1ので断念。いい加減買い換えようと決心した(3度目)→買いました
1日目
Color Contrast for Accessibility
https://raw.githubusercontent.com/emarley/ColorContrast/master/ColorContrast.pdf
色関係の話になるとすぐそうやって数式が出てくるんだから!(それはそう)
我々に求められているのはsRGB→XYZである
JavascriptでWC3のコントラスト計算式を書いてみる|意識の高い時に雑記
XYZ-RGB の変換式とカラートライアングル(JavaScript版)
数式は数式だからまだ何とかなるのだけど、どうやってデザイナーさん達と協力していくかのほうが10000倍難しそう。がんばりましょう。
Color - Visual Design - iOS - Human Interface Guidelines - Apple Developer
Web Content Accessibility Guidelines (WCAG) 2.0
protocol/extensionにジェネリクスを入れたい
protocol HList { associatedtype Head associatedtype Tail: HList } // ScalaのNothingは全ての型のサブタイプであるであるがSwiftにそんなものはなかった enum Nothing {} struct HNil: HList { typealias Head = Nothing typealias Tail = HNil // Scala object classの代わり private init() {} static let singleton = HNil() } // (A, (B, (...)))のような構造 struct HCons<T, U: HList>: HList { typealias Head = T typealias Tail = U let head: Head let tail: Tail }
で表されるheterogenous list*2略して HList
がある。
この HList
同士の結合を考える。
protocol HAppendable { associatedtype Left: HList associatedtype Right: HList associatedtype Result: HList static func append(_ lhs: Left, _ rhs: Right) -> Result }
空リスト HNil
と リスト T: HList
の結合は、リストのほうをそのまま返せばいい。
enum Nil足すList<T: HList>: HAppendable { typealias Left = HNil typealias Right = T typealias Result = T static func append(_ lhs: HNil, _ rhs: T) -> T { return rhs } }
HNilと非空リストとの結合ができたので、非空リスト同士の結合ができればあとは無限に好きなだけリストを繋げられる。
T: HList + U: HList -> V: HList
が定義されているとき、
非空リスト同士の結合
(W, T: HList) + U: HList
は W, T, U
つまり (W, V): HList
とすればいいので、
enum List足すList<T, U, V, W, EV: HAppendable>: HAppendable where T == EV.Left, U == EV.Right, V == EV.Result { typealias Left = HCons<W, T> typealias Right = U typealias Result = HCons<W, V> static func append(_ lhs: HCons<W, T>, _ rhs: U) -> HCons<W, V> { return HCons(head: lhs.head, tail: EV.append(lhs.tail, rhs)) } } // あるいは func append<T: HList>(_ lhs: HNil, _ rhs: T) -> T { return rhs } func append<EV: HAppend, T, U, V, W>(_ lhs: HCons<W, T>, _ rhs: U, ev: EV.Type) -> HCons<W, V> where T == EV.Left, U == EV.Right, V == EV.Result { return HCons(head: lhs.head, tail: EV.append(lhs.tail, rhs)) }
である。ほんとか??????誰かもっと綺麗に書いてほしい。だめだ修行が足りない。ワタシハSwiftゼンゼンカケナイ
↓
swift-can-not-infer-concrete-type-from-protocol.swift · GitHub
元トピックのコンテクストがわかりませんが、ジェネリックプロトコルのことなら、GenericsManifestoのUnlikelyの中に挙げられてますね。https://t.co/GDA7JZ3R5x
— koher (@koher) March 21, 2019
あ、TaPL以外に参考書ない?とか色々質問して、「プログラミング言語の基礎概念」「Scala DOT*3」の存在を教えてもらいました。みなさんもたまにはTaPL以外を推してみてください。なさそう。
テストケースでMemory Leakを発見する
たしかにその方法でメモリリーク発見できる……が、……そのオチ、かなしいですね
2日目
Swift type metadata
Swift Type Metadata - Speaker Deck
Metadataってあっさり取れちゃうもんなんですねえ
UnsafePointer - Swift Standard Library | Apple Developer Documentation
SwiftにおけるMethod Dispatchについて - Qiita
What is a nominal type? - Speaker Deck
All about linking libraries
All about linking libraries - Speaker Deck
Keynote for iCloud
同じく、まとめられてて助かるやつ。自分でまとめろよという話だが
The Philosopher's String
これ資料公開されてる?代わりにniwatakoさんのブログを。
賢者のString | try! Swift Tokyo 2019 2-12 - niwatakoのはてなブログ
あんま関係ないけど、都道府県リストもソート時には罠っすよね。国名とかアメリカ州リストと違って南北にソートせにゃならんという。かといって日本の地理把握してない外国人向けだと辞書順になるのか?とか。
3日目
Open Source Swift Workshop
じぶんのぱそこんはだめなこなので、そのへんのつよそうな32GBまっくぶっく*4をひろってつかいました。じしゃかいさいでたすかりました。
どうにかして初PR出した。しかしへんじがないようだ。
まとめ
*1:ストレージが残り10GB未満だとXcodeをアップデートできず、Kitura+Swift4.2(+Docker)を用意できない
*2:こういう手のものをプログラミング言語で表現する場合はSwiftなどという言語ではなく大人しくHaskell先輩の実装Heterogenous collections - HaskellWikiでも読んだ方が良さそうまだ読んでないけど
*3:ざっとぐぐったら 何で走っているのだろう: Scalaの型と型関連の機能 や DOT/dottyについて調べてみた | κeenのHappy Hacκing Blog が出てきた。あとでよむ
*4:入社して1年で2回PCを乗りかえたのは悪いと思ってい、ません
DroidKaigi 2019でネットワーク班の指揮と雑用をしました #droidkaigi
準備をする
今回のおもしろ話:配置設計と備品
配置設計を行う
使用機材の数と位置は以下の要素から決まる。
- 部屋ごとの定員
- LAN口位置
- 参加者の座席位置や動線
- 電源容量
- 大規模な通信の予定
APの数は「50接続/台」で計算する。200人定員の部屋なら4つ置くことを考える。でもうまく分散しなくて1台あたり接続数100とか普通に行くんだよねしょうがないね。
SWの数は1部屋1台くらい。電源とかポート数次第。
機材の位置は、
ケーブル長は100m以内(※カテゴリ5e)にしなくちゃなあ、とか、
この会場はLAN口がどこにあるかな、とか、
人や車椅子がたくさん通りそうだからここは避けよう、とか、
バリスタマシンと同じところから電源とるとブレーカー落ちるからだめって言われた、とか、
参加者用電源席と同じところから電源(ry、とか、
録画したりYouTube配信したり、とか、
マグネットでドアの上を架線すれば動線邪魔しないんじゃね!、とか、
etc…
そのため、図を見たり会場&各部署と交渉したりするほうの仕事が多い。機材位置決定問題が充足不能に陥りかける点を除けば初心者でもできるお仕事です!
備品を調達する
備品調達も大事なお仕事
www.endeworks.jp
↑ iOSDCで肉の話してる会社 機材レンタル会社
セーラー万年筆 ホワイトボード どこでもシート W600mm×20m巻 31-3500-000
- 出版社/メーカー: セーラー万年筆
- メディア: オフィス用品
- この商品を含むブログを見る
- 出版社/メーカー: もりや産業
- メディア: オフィス用品
- この商品を含むブログを見る
ダイヤテックス パイオラン 仮設コード固定用テープ 100mm×20m CK-06-BK
- 出版社/メーカー: ダイヤテックス
- メディア: Tools & Hardware
- この商品を含むブログを見る
ダイヤテックス パイオランクロス 表示テープ 「関係者以外立入禁止」 50mm×25m H-06-SO
- 出版社/メーカー: ダイヤテックス
- メディア: Tools & Hardware
- この商品を含むブログを見る
ダイヤテックス パイオランクロス 安全表示テープ 50mm×25m TT-06-YB
- 出版社/メーカー: ダイヤテックス
- メディア: Tools & Hardware
- この商品を含むブログを見る
本番を迎える
機材を置く
人に蹴られないように椅子の上に置いたらスイッチの排熱がうまくいかなかったぽくてめっちゃ温度上がった。椅子の下が正解だった。
監視をする
今回はZabbixのほかにGrafanaも使ったので、らくらくきれいにグラフを表示できた。
こちらは展示ルームの接続数推移。
休憩時間ごとにみなさんが訪ねてくるので接続数が跳ね上がっていること、
Day1のパーティ終了後(2月7日20時)にスタッフたちが戻ってきて接続数がちょっと増えていること、
Day2のお昼頃(2月8日11時)に意味深なデータ欠損があること、
が読み取れる。
暇になる
どうにかうまく軌道に乗って暇になり、みんな遊び始める。
例:
- "本物"のネットワークとか称してGlobal IP配り始める人
- どろいどくんの落書きをする人
- IPv6じゃないと"本物"のネットワークじゃないとか言い出す人
- Ciscoスイッチで遊んでるのかNintendoスイッチで遊んでるのかよくわからない人
- Cat5e作成体験会
人類は2種類に分類できる。研究室でLANケーブルを散々作らされた人と、そうではない人の2種類である。
事故る
時刻 | できごと |
---|---|
11:00 | 運用も2日目に入ってやることないし眠い |
11:01 | 全断発生 |
11:05 | わたし、APが緑点滅していることに気づく。ほか全員目が覚める |
11:20 | どうやらONUが息してないことに気づく |
11:25 | 2台目のONUに換えることでことなきを得る |
11:35 | 元どおりになったことを確認 |
ONUは会場に設置している機器のなかでも1番ねっこのほうにあるもの(というかNTTのやつ)なので、これが息してないと全滅である。
実は会場全体用と配信用でフレッツを2回線契約しており、配信用のONUに乗り換えることで復旧した。YouTube配信用に念のため2回線契約していなかったら詰んでいた。(帯域的にはいらなかったんだけど、冗長化の面では必要だった。)
おいたをしたONUは復旧後暇になった人々により祭り上げられた。
"初期化しました"……
正確には、運用中に突然の再起動をキメてくれた。しかもすぐに元に戻らない。
写真内の製品注意書きにある通り、アップデートの為に再起動することがある、とのことだが、ONUのログの時刻がガバガバである以上、アップデートをしてしまったのか他の理由で再起動しちゃったのか、何しでかしたんだかよくわからない。歴戦の皆様もONUが事故ったのは初めてだとか。
(誰かZabbixからSlackへの通知作ってくれないかな〜、パトライトとかをくるくるまわすのでもいいよ!)
今回の記録
Day1 | Day2 | |
---|---|---|
同時最大接続数 | |
979 |
下り最大 | 218.3Mbps | 228.6Mbps |
上り最大 | 107.1Mbps | 99.2Mbps |
ぎりぎり1000にとどかなかったあ!今年こそはと思ったのに〜。ご利用ありがとうございました。
【2019年三が日企画】iPhone VoiceOverで三が日を暮らしてみた
三が日には何か新しいことをしましょう。今年はVoiceOverに挑戦しました。普段使っているアプリをVoiceOverオンにして使ってみます。 選んだアプリは私が普段愛用しているやつ順不同で、「もし失明宣告を受けたら私のiPhone生活はどうなっちゃうんだろう」というシチュエーションでやっています。それと、本体設定が英語なので読み上げは日英混合です。
アクセシビリティとは
世界で最もパーソナルなデバイスは、すべての人が使えるように設計されました。だから、視覚に障がいのある方がみんなとセルフィーを撮ることも、聴覚に障がいのある方がお母さんに国際電話をかけることも、首から下の体を動かせない方が友だちにテキストメッセージを送ることもできます。
視覚障害者の数
ロービジョンの人の割合が思ったより多い。ロービジョンとひとくちにいっても症状は様々なので、アプリの使い方もきっと人によって様々。
Voice Overとは
VoiceOverはジェスチャーで操作する画面読み上げ機能です。画面を見なくてもiPhoneの楽しさと便利さを体験できるようにします。
基本的に、
- 選択したい項目のところをシングルタップ。四角い枠がつく。
- 1.の状態で画面の任意の場所をダブルタップすることで、初めてその項目を選択したことになる。
という2ステップで通常時のシングルタップ操作相当になる。
他にはローターという操作もある。
support.apple.com
個人情報を映しているとき(あるいは視覚情報無しでの操作を試したいとき)はスクリーンカーテンで。
support.apple.com
いろんなアプリを触ってみた
基本操作まわり
テキスト操作
これがめっちゃ難しい。音声入力だけは簡単なのでひとまず安心なのだが、修正やら何やらをしようとすると途端に難易度が上がる。
「VoiceOver」の設定方法②(入力モード~ダブルタップのタイムアウト) | iphoneMAX
是非みなさんもNotesアプリあたりで文章修正やコピーペースト操作に挑戦してみてほしい。
3678 Re: VoiceOverにおけ る範囲選択について - Apple Accessibility Mailing List Archive
行選択やApp Switcherが誤爆してもう無理。私は諦めました。
スクロール操作
UITableViewやブラウザで出したなが〜いページなど。
↑はてなブックマーク - 電話ボックスに侵入して日向ぼっこしている猫が平和すぎてめっちゃ可愛い「いい場所見つけたなぁ」 - Togetterのようななが〜いページでもいちおう大丈夫。
スクロールする方法は2通りあって、
- 3本指で上下スワイプしてページめくりする
- ローターメニューで適当なものを選択した後にシングルスワイプで項目移動する
しかし任意の位置にスクロールができないので、レイアウトによっては若干つらさがある。どういうことかというと……
ナビゲーションバーや広告で隠れてしまう部分(右側のスクショの灰色にした部分)にフォローが入らないということである。任意の位置にスクロールできないので何が書いてあるのかすぐに確認できない。項目移動であっても、やっぱり他のコンテンツに隠れていたり、一気に下方に飛ばされるなどして厳しい。
UIPickerViewは「pickerviewを選択→シングルswipe up/downで1つずつスクロール」なので簡単。
Twitter関連
私は普段公式アプリではなくThe Worldを使っている。で、VoiceOverにすると途端に使えなくなってしまうのがこのThe Worldのようなアプリ。シングルタップやダブルタップにアクションを割り当てるなどと言っている場合ではなく、大半の操作が不可能になってしまっている。そういう仕様のアプリだし個人制作の無料アプリだから仕方ないんですけど。
Twitter公式アプリはアクセシビリティ対応済みで、Cellを選択するだけで「ツイート主〜ツイート内容〜リツイート主」と一通り読み上げてくれて便利。ツイートを時系列順に戻せとか文句垂れてる場合じゃない。
↑「しもとりミドルドットニートミドルドットしぐれ, 三が日企画には早いけどでアクセシビリティ機能onにしたらゲームで遊べなくなったミドルドットミドルドット, 1 day ago」。リプライなどのボタン類はタップしても一切反応せず、ローターメニューから行えるようにしてある。
Slack
VoiceOverがDroidKaigiをどろいどけーじーって読む(´・ω・`)
大人気アプリなので完全対応されているのでは!と思ったら、使えそうで絶妙に使えない。
- 未読件数どころか未読があるかどうかすらも読み上げてくれないので、どのワークスペースやチャンネルを読んだらいいのかわからない。
- リアクション周りが非対応。
ほか、いろいろ。デスクトップ版の方の使い心地は試してないけど、視覚障害の方がいるコミュニティでのiOS Slack利用は正直お勧めできない。せっかく便利なのに残念だ。今後対応してくれるのかな?してくれると嬉しいね。
↑上の発言は「s_shimotori, おいしいものがたべたいな, 6:11 PM, December 30th, 2018two reactions」。このtwo reactionsとはtwo types of reactionという意味であり、何人が寿司とピザをリアクションしようともtwo reactions。詳細画面に行きさえすればリアクション内容や人数も喋ってくれる。
↑下の発言は「s_shimotori, 人の金で, 10 minutes ago」(10分後に読み上げてもらったとき)。取り消し線の読み上げは無理だった。
スクリーンショット加工
VoiceOverオンの時にスクリーンショットを取ると、左下ににゅっと顔を出すプレビューにフォーカスが移るので、そこから加工画面にいける。しかしここで求められているのはハンドルをドラッグするなどの操作であり、VoiceOver使用時は何もできない。
Safari
他と同じように操作できる。あとは各サイトさんのアクセシビリティ対応次第。
どこでウィンドウ閉じるんだろう?と思ったらローラーメニューにちゃんと設定してあった。
乗換NAVITIME
乗り換え案内を華麗に読み上げてくれると思ったのに!
情報量が豊富なのが仇になっている感じ。例えば次の箇所を選択して読み上げてもらうと……
「ブラックアップポインティングトライアングル、ブラックダウンポインティングトライアングル、籠原行、7、5、JR高崎線、番線、番線、発、着、154円、5分」
つらいっす。
日経電子版
記事の個別ページで操作と読み上げが効かない。つらい。記事一覧は読めるので、1日何があったかくらいはわかる。
写真がメインコンテンツではあるが、Photosアプリみたくちゃんと写真の中身を読み上げてくれる。
↑「Photo via S_Shimotori, Image may contain fruit and food, Image」
めっちゃおいしいいちごとメロンのパフェとか読み上げてくれたら最高なんだけどなー。将来的にやってくれればなー。
MoneyForward
非対応っぽいけど使えないことはない……と思ったがカテゴリ選択が操作不能なのでやっぱ厳しかった。
↑ここからアクションが発生してくれない。
(おまけ)ゲーム関連
VoiceOverをオンにしたらどうなるのか。
FEヒーローズは謎のTextFieldが邪魔して何も操作できない。挙げ句の果てにはキーボードが出てきてしまった。しかもしまえない。どこに隠れてたのか逆に気になってきた。
どうぶつの森はいつも通りのプレイ。
ゲームがVoiceOver対応していることはまずないだろうけど、あなたは徐々に失明してゲームもままならなくなりますとか言われたら泣いちゃう。
まとめ
- 健常者に使いやすいUIが視覚障害者に使いやすいとは限らない。というか凝ったものほど使いづらいのでは…
- 有料版があるようなサービスでも完全対応しているわけじゃないみたい
結構便利で愛用しているアプリがいくつかあるのだが、目が見えなくなったら下手すると使えなくなるんだと思うと悲しかったり寂しかったり。
みんな、余力を見つけて開発していこうな!
iOS以外でも前向きにSwiftを使いたい話
本記事はこれです。
iOS以外でSwiftの出番がない話
皆さんはiOS以外でSwiftを採用したことはありますか?私はないです。Swiftとかいうマイナーな言語を授業や研修で使うわけがありません。
「言語何にするー?」
「Ruby/Java/Pythonならみんな書けるっしょー?」完
たまにはSwiftって言われてみたい……
全員がiOSエンジニアにも関わらずiOS以外をやる用事があればSwiftになるかも?
たとえば、iOSコミュニティでサーバサイドをやることになったとか……
アクセスポイント毎の接続数をSwiftを使って取得する
具体的には
自前でカンファレンスのネットワーク環境をやろうと思った時には、ログを集めたり監視したりするように作らなければならない。ここでネットワーク管理ソフトウェアZabbixの利用が候補に上がる。
ざっくりとした図:
例えば、各APの接続数は、APの親玉であるWireless LAN ControllerからZabbixに届けられる。
ZabbixはREST APIで叩くことができるので、あとは煮るなり焼くなりVaporでヒートマップを出すなり自由。もしwebassemblyが完全対応すればWi-Fiヒートマップの描画までSwiftがやっちゃうかもしれない。
SwiftでZabbix REST APIを叩く
Linux(適当なUbuntu)サーバ上で叩くので、Linux対応のライブラリがあると便利。Package.swiftが置いてあるかというよりも、READMEで名言されていたり #if os(Linux)
がソースコード上にあったりIBMだったりするほうが信用度高め。
let request = RestRequest(method: .post, url: "http://Zabbixホスト/zabbix/api_jsonrpc.php") request.messageBody = try! encoder.encode(略) request.response { data, response, error in 煮るなり焼くなり }
略の部分に、たとえば
{ "auth":"ログインした時に返ってきたやつ", "method":"item.get", "id":1, "params":{ "search": { "name":"* Ap If No Of Users * GHz" }, "searchWildcardsEnabled":true, "output": ["name", "key_", "lastvalue", "prevvalue"] }, "jsonrpc":"2.0" }
というふうになる struct Hoge: Encodable
を与えておくとZabbixから接続数が取れる。
Zabbix自体をカンファレンス参加者に叩かれるわけにはいかないし、キャッシュの役割をする人がいてほしいので、Vaporを立ててそこからAPIやらhtmlやらを出させるとなおよし。
routes.swiftに上手に書けばVapor1人で両方出せる。テンプレートを使ってりっちにhtmlをやりたい場合はleafもセットで。
.package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"), .package(url: "https://github.com/vapor/leaf.git", from: "3.0.1"),
なんでこんなことしなくちゃいけないの?
え、自分の所属するコミュニティのカンファレンスのネットワーク環境やっていきたくないんですか?
まとめ
興味がある人はそのへんのカンファレンスのネットワークチームを乗っ取っていっしょにSwiftまみれにしましょう!iOS関係ならSwiftを使ってもメンテの人手には困……らないかどうかはわからない。責任は取りません。
ちなみに上の図の画像はいらすとやさんです。アクセスポイントにははんぺんを使いました。便利ですね。
TraitとBar周りの英単語の語彙が乏しいのでドキュメント読み直した
本記事はiOSアドベントカレンダーの12日目です。
- スマブラSPについて
アドベンチャーモードの分量と難易度、どっちも調整おかしいんじゃねえのと思いながら週末溶かしてアドベントカレンダーどころではなくなった。
- 現在地
看板が読める気がするいややっぱわからん
雑談はさておいて、本記事では、ドキュメントが英語で書いてあってよく読み取れないので頑張って読み取ります。
新規性なんてなかった。
本記事のネタを書くに至った経緯について
上手に UINavigationBar
に背景画像を表示させたいな!端末のサイズによって適切な背景画像のサイズが異なるから上手に計算したいな!
そういえばsize classなるものがあってregularとcompactの2種類があったな?
Adaptivity and Layout - Visual Design - iOS - Human Interface Guidelines - Apple Developer
Size classes are traits that are automatically assigned to content areas based on their size. The system defines two size classes, regular (denotes expansive space) and compact (denotes constrained space), which describe the height and width of a view.
もしや setBackground
で UIBarMetrics
を指定するときにこの知識が役に立つのでは…?
UIBarMetrics - UIKit | Apple Developer Documentation
Constants to specify metrics to use for appearance.
case default
Specifies default metrics for the device.
case compact
Specifies metrics when using the phone idiom.
なるほど、defaultとcompactの2種類があるんだな!いやdefaultってお前誰だよ。ていうかphone idiomってなんだよ。つーかprompt propertyってなんだよ。英語難しいな!
size classを擁するtraitについて
iOSのインターフェース環境はtrait(特徴)を持ち、このtraitには
- size class (
UIUserInterfaceSizeClass
)- 縦と横それぞれ
- display scale (浮動小数点数)
- 1.0は非Retinaディスプレイ、2.0や3.0はRetinaディスプレイ。
- display gamut (
UIDisplayGamut
)- 色域のこと。iOSは基本的にsRGBを使用する。最近のディスプレイはP3対応。
- user interface idiom (
UIUserInterfaceIdiom
)phone
やpad
といったインターフェースの種類を指す。ちなみに、idiomには慣用句の他に表現方法という意味もあるらしい。
- force touch capability (
UIForceTouchCapability
)- 3D touchが使えるかどうか
- layout direction (
UITraitEnvironmentLayoutDirection
)- レイアウト方向がLTRかRTLか
- user interface style (
UIUserInterfaceStyle
)- darkスタイルにすべきかlightスタイルにすべきか。tvOSやCarPlay限定。
- preferredContentSizeCategory (
UIContentSizeCategory
)- Dynamic Typeでユーザが設定したサイズ???
がある。
これらはclass UITraitCollection
でまとめて表されており、protocol UITraitEnvironment
の
var traitCollection: UITraitCollection { get }
や
func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
から取得することができる。
いろいろなscaleについて
UIScreen
から取れるscaleは3種類存在する。
var traitCollection: UITraitCollection
経由で取れるdisplayScale
nativeScale
scale
このうち役割が違うのが nativeScale
で(多分)、ユーザがDisplay Zoomの設定を変えると nativeScale
の値も変わる(きっとそう)。
公式ドキュメントのどこかに明記されていたら教えてください。
色空間について
Color - Visual Design - iOS - Human Interface Guidelines - Apple Developer
このグラフはXY色度図といい、XYZ表色系における色を2次元グラフ上に表したもの。Zの値はXとYが決まれば定義から求められるのでグラフ上には載っていない。
図中の三角形をカラートライアングルという。Display P3やsRGBなどの色空間が定める3原色をつないだもので、各色空間は三角形の中の色のみを再現できる。要するに、sRGBよりDisplay P3の方が再現可能な色が多い(だから必要な時はP3を使ってね!by Apple)ということが図から読み取れる。
本題: UINavigationBarの背景画像を変更する
次のメソッドで背景画像を設定することができる。
func setBackgroundImage(_ backgroundImage: UIImage?, for barMetrics: UIBarMetrics)
問題は
barMetrics
A bar metrics constant.
これ。
そもそもBarには protocol UIBarPositioning
というprotocolが用意されていて、 UINavigationBar
や UISearchBar
は var barPosition: UIBarPosition
経由でBarの位置を取得することができる。
この protocol UIBarPositioning
が enum UIBarPosition
の他に enum UIBarMetrics
を擁する。metrics = 指標。
なまえ | 種類 | 役割 |
---|---|---|
UIBarPositioning |
protocol | Barの位置の取得方法を提供。 var barPosition をつければOK |
UIBarPosition |
enum | 上とか下とか |
UIBarMetrics |
enum | appearance(= 外観)のために用いる指標 |
UIBarMetrics
は以下4つの要素を持つ。
- default
- Specifies default metrics for the device.
- compact
- Specifies metrics when using the phone idiom.
- defaultPrompt
- Specifies default metrics for the device for bars with the prompt property, such as
UINavigationBar
andUISearchBar
.
- Specifies default metrics for the device for bars with the prompt property, such as
- compactPrompt
- Specifies metrics for bars with the prompt property when using the phone idiom, such as
UINavigationBar
andUISearchBar
.
- Specifies metrics for bars with the prompt property when using the phone idiom, such as
compactとpromptが何を表しているかというと…
試しに
UINavigationBar.appearance().setBackgroundImage(赤色画像, for: .default) UINavigationBar.appearance().setBackgroundImage(青色画像, for: .compact)
などでどちらが使われるか試してみると、
size class for w&h | bar metrics | |
---|---|---|
iPhone 8縦 | compact®ular | regular |
iPhone 8横 | compact&compact | compact |
iPhone 8 Plus縦 | compact®ular | regular |
iPhone 8 Plus横 | regular&compact | regular |
iPhone XS Max縦 | compact®ular | regular |
iPhone XS Max横 | regular&compact | regular |
となる。つまり
size classを雑に参照すれば違うUIBarMetrics
も定まる違う.compact
にphone idiomと書いてあるからiPhoneは全部.compact
になる- Plus、Max、XRのような、Landscape時にregular&compactとなっている端末は常に
.regular
設定が使われる ←これが正解!
である。
promptはこれのことっぽい。(が、prompt stringとセットで使っても反映されない・・)
UINavigationBar - UIKit | Apple Developer Documentation
結論
- 英語難しい
"compactPrompt"
でGoogle検索してもenum要素の1つであることしかわからないことがわかった。使ってる人あんまいないんちゃう?func setBackgroundImage(_: barMetrics:)
はそこまで上手にやってくれないので我々が頑張りましょう。縦時背景画像は.regular
で横時背景画像は.compact
とか設定するのは間違い。
参考文献
- UITraitEnvironment - UIKit | Apple Developer Documentation
- displayScale - UITraitCollection | Apple Developer Documentation
- nativeScale - UIScreen | Apple Developer Documentation
- scale - UIScreen | Apple Developer Documentation
- UIUserInterfaceSizeClass - UIKit | Apple Developer Documentation
- displayScale - UITraitCollection | Apple Developer Documentation
- UIDisplayGamut - UIKit | Apple Developer Documentation
- UIUserInterfaceIdiom - UIKit | Apple Developer Documentation
- UIForceTouchCapability - UIKit | Apple Developer Documentation
- UIUserInterfaceStyle - UIKit | Apple Developer Documentation
- UINavigationBar - UIKit | Apple Developer Documentation
- UIBarMetrics - UIKit | Apple Developer Documentation
- UIBarPositioning - UIKit | Apple Developer Documentation
Color - Visual Design - iOS - Human Interface Guidelines - Apple Developer
- Displays
- Scaling Fonts Automatically | Apple Developer Documentation
Typography - Visual Design - iOS - Human Interface Guidelines - Apple Developer
- XYZ-RGB の変換式とカラートライアングル(JavaScript版)
- XYZ表色系|色の表わし方|DIC Color Design, Inc.
- 色の3原色
iOSDC Japan 2018でネットワークスタッフと30分セッションとシークレットLTをやりました #iosdc
Qiita記事書いたらブログ書こうと思っていたら1週間が経過しました。
ネットワークスタッフをしました
ここまでの経緯
母校でDroidKaigi2016が開催されるというので当日スタッフに参入
↓
DroidKaigi2017でコアスタッフとしてCONBUさんを見学
↓
DroidKaigi2018でネットワーク専門コアスタッフ
↓
iOSDC2018でネットワークチーム参入(not コア、not CONBU)
適当に仕事を抜け出してセッションを聴きに行きたいのでコアスタッフではないしその予定もない。
成果
今回はサーバサイドをやったがうまくできなかったのでそのへんでリベンジする。うまくできなかったぶん当日は宣伝に注力した。
8の字巻きにはもう慣れたと思う。
はじめてLANケーブルをつくりました!せっかくなのでじぶんが腕を広げた長さちょうどにしました。 #iosdc pic.twitter.com/9dUOOhKuC9
— Shigure Shimotori (@S_Shimotori_pub) August 31, 2018
LANケーブルを作る仕事はネットワークスタッフにはない*1のだがちょうどいい機会なので初作成した。作ったものはいまこの瞬間、有線接続するのに活躍している。
他のスタッフのみんなは1本作るのに3分くらいでできるだとか家に工具があるだとかが常識らしいが私にはよくわからない。ぐろ〜ばるIPもちょっとよくわかりたくない。
30分セッションをしました
フォントと組版の30分入門 by S_Shimotori | プロポーザル | iOSDC Japan 2018 - fortee.jp
出したら通ってしまったので登壇した。聴衆が何を期待しているのかは無視して自分の好きなことをしゃべった。
結果タイ語とアラビア語に質問が集中したので別途Qiita記事を書いた。流石にあまり馴染みがないようだ。でもWWDCで名指しで紹介されるような言語なので無視してはいけない。
資料を探すのに新宿区立図書館を使った。なんと西早稲田キャンパスの目の前、道を渡るだけ。なので西早稲田に行った回数はコアスタッフや早大◯◯理工学部の現役生の次くらいに多い自信がある。
あと印刷博物館は300円で楽しめるのでおすすめ
Qiita記事を書くのに苦労しました
iPhoneのスクショ画面はDisplay P3というカラープロファイルを使っているので、デフォルトカラープロファイルがsRGBであるIllustratorに配置すると色がおかしくなる。Photoshopは正しい色で扱ってくれる。
iPhone iOS 11 screenshots problem on illustrator – Adobe Illustrator Feedback
シークレットLTをしました
東松さんがほとんどしゃべっていたとかいうツッコミはいけない。宣伝のためだ。iOSエンジニアにネットワークチームへ入ってもらうためだ。なので許してください。
ネットワークやりたい人を募集しています
iOSDCネットワークチームでは新しいことを始めたい人を募集しています。8の字巻きやアクセスポイント配置やサーバサイドならiOSエンジニアでもできると思います。
カンファレンスのWi-Fiは繋がらないものだと思い込んでいる人たちのその思い込みをやっつけるためにがんばりたい。この記事を読んだ人はネットワークスタッフへの応募を必ず検討してください。約束ですよ。
*1:既製品をまとめ買いするため
iOSDC Japan 2018でネットワークスタッフと『フォントと組版の30分入門』をやります #iosdc
iOSDC Japan 2018でやること
- ネットワークチームのおしごと
- 『フォントと組版の30分入門』
ネットワークスタッフのおしごと
クイズ!1000人規模のカンファレンスでネットワーク環境を提供するには何をすればいいでしょうか。
ネットワークスタッフは、私の認識が正しければ次のようなチーム分けになっている。
- wifi: WLCとAPと配線のお世話
- ネットワーク: IXのお世話
- サーバ: データセンター内に各種サーバを用意
くわしくは当日暇そうなネットワークスタッフを捕まえて聞いてほしい。
私が経験済みなのは配線(DroidKaigi 2018)とDHCP/TFTP/DNSサーバ(今回)である。しかしDHCPサーバが完動している形跡がないので危うい。
以下はお役立ち情報。
- centos7のreboot時にネットワークがつながらなくてハマった話
- CentOS 7 NIC ネットワークデバイス名の変更
- TFTPサーバの構築(CentOS7) | AC-5
- TFTPサーバー
- http://www.bo-yang.net/2015/08/31/centos7-install-tftp-server
- 強いBIND DNSサーバを構築する 第二回 named.confの基本設定 | ユーロテック情報システム販売株式会社
『フォントと組版の30分入門』
2018/08/31 16:00〜 Track Cです。
フォントと組版の30分入門 by S_Shimotori | プロポーザル | iOSDC Japan 2018 - fortee.jp
iOSエンジニアに聞いて欲しいトーク、っていうんならこういう分野もありなのかな??と思って出したら通ってしまった。説明書きに『間違えるとこわーい人にツッコミを入れられてしまうかも!』とあるが、ツッコミを入れられてしまう可能性が高いのは登壇する私自身である。書籍や企業HPや大学HPならば大丈夫だろうと思ってどうにか調べている。
組版の話となれば流石にこれは避けられないと思って作った。本格的な縦組みは私の能力では不可能なので、セッションで深掘りするつもりはない。許してほしい。こんなん無理。
できた! #iosdc pic.twitter.com/YjLEqsNNrm
— Shigure Shimotori (@S_Shimotori_pub) July 28, 2018
そのかわり……にはならないかもしれないが、こういうのをやってみた。
「フォントと組版の30分入門」を発表するからにはこれだと思ってほんものの組版とやらを見てまいりました。とても面白かったです。 #iosdc pic.twitter.com/Kn8CByEaQW
— Shigure Shimotori (@S_Shimotori_pub) July 21, 2018
話に聞いていただけのものを実際に見たりやったりというのは楽しいね。
というわけで、本セッションは以下に当てはまる方に聞いて欲しい。
✅フォントや組版を気にしたことがない人
✅まず実物を見たほうが取り掛かりやすい人
✅歴史が好きな人
✅アプリ多言語化対応の予定がある人
✅同人誌を読む側の人
以下の方にはお楽しみいただけないかもしれません。
❌フォント警察
絶対フォント感の解説はできませんゴメンナサイ。。ていうか代わりにやって欲しい。
❌校閲のプロ
これは入門編ですこわいですやめてくださいこわいよ〜〜〜
❌業務で縦書きをしている人、予定がある人
ていうか代わりに(ry
登壇練習会 at Ebisu
さきほどTimersさんのオフィスで登壇練習会をしてきた。みなさんありがとうございます。ネタバレはできないので、ぜひみなさん自身の目で確かめて欲しい。どれも面白い話で本番が楽しみ。
むしろ自分の発表がみんなに負けないくらい面白いかどうか不安になってきた。正確には、フォントも組版も面白いのは間違い無いんだけど、自分がそれをちゃんと伝えられるかどうか不安になってきた。最後の追い込み頑張ります。