- https://github.com/airbnb/epoxy/wiki/Epoxy-Controller#filtering-duplicates
- デフォルトではEpoxyは何もしなくて、
DiffUtil
が重複IDのものは無視するが、その時の動作は未定義、という感じの模様 - Epoxy側で重複IDを検知して、後に登場したものを弾く(先勝ち)というモードを設定することができる
EpoxyController.setFilterDuplicates(true)
- デフォルトはオフ
- 重複を発見したという警告としての例外が作成されるが、これは
EpoxyController.onExceptionSwallowed
で処理されて、デフォルトでは無視されてクラッシュしたりはしない- https://github.com/airbnb/epoxy/blob/3b4a9cb8d626b192bc42c16d96ca70731696e2f9/epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyController.java#L574-L578
- https://github.com/airbnb/epoxy/blob/3b4a9cb8d626b192bc42c16d96ca70731696e2f9/epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyController.java#L735-L763
LinuxのSwift 5.1で、NSNumberなどがComparableになってDarwinとソース互換がなくなる事例
というバグレポートを起票しました。
原因となったswift-corelibs-foundationのPRがこちらです。
例として、現在のDarwin(macOSやiOSなど)でのNSNumber
のProtocol準拠は次のとおりです。
どちらかと言うと、NSNumber
やNSString
などがComparable
になるのはポジティブなので、DarwinのFoundationでもComparable
準拠になると嬉しいですね。
Java Cryptography Extension(JCE)と、AndroidのBouncy Castleと、Spongy Castle
社内のSlackでSpongy Castleという名前を聞いて、知らなかったので少し調べてみました。
- AndroidはJavaのJava Cryptography Extension(JCE)の仕組みに則っている
- AndroidではJCEのプロバイダーとしてBouncy Castleが提供されている
- Androidに乗っているBouncy Castleは、スリムダウン・カスタムしたバージョンが乗っていて名前空間はそのまま
- なので本来のBouncy Castleの新バージョンなどを入れようとすると衝突してしまって問題になる
- なので中身はBouncy Castleだけど、名前空間を分けたのがSpongy Castle
この辺を見ました:
CocoaPods 1.7.0からSpecsのソースにCDNを使えるようになります
先日リリースされたCocoaPods 1.7.0.beta.1で、実験的機能としてSpecsのソース(パッケージ定義であるpodspecファイルのセントラルリポジトリ)にCDNを利用できるようになりました。
今までは、ソースとして https://github.com/CocoaPods/Specs のGitリポジトリが使用されており、初期セットアップ時のクローンや、日々のアップデートに結構な時間が掛かっていましたが、ソースのCDN化によりこうした時間が削減できるようになります(必要なデータだけダウンロードされてローカルにキャッシュもされる)。
また、ライブラリの最新バージョンを使おうとしたらローカルのSpecsが更新されていなくて、その都度$ pod repo update
(もしくは$ pod install --repo-update
のオプション付き実行)をしないといけない、というのもなくなるはずです。
Beta期間中の結果によっては、1.7.0の正式リリース時点でCDNソースがデフォルトになるようです。
Depending on the results and stability, we hope that starting with 1.7.0, CocoaPods will no longer require users to clone the master specs repo in order to get started.
この機能を有効にするには、1.7.0.beta.1にアップデートし、プロジェクトのPodfileの先頭に次の1行を足すだけです。
# source 'https://github.com/CocoaPods/Specs' 既存のこの行があれば削除かコメントアウトしましょう source 'https://cdn.jsdelivr.net/cocoa/'
ということでどんどん試していきましょう!💪
RawValueがIntのenumを何かのインデックスとして使いたい時はhashValueじゃなくてrawValueを使いましょう
そうそう遭遇はしないと思いつつ、Swift 4.2になるとハッシュシードのランダム化により問題が起き得ます。
- RawValueがIntのenumであっても、rawValueがそのままhashValueではなくなる
- Swift 4.1までは、rawValue == hashValueという挙動だった(実装依存)
- 実行ごとにハッシュ値は変わる
hashValueは「ダメ。ゼッタイ。」
The standard library now uses a high-quality, randomly seeded, universal hash function, represented by the new Hasher struct. Random seeding varies the result of hashValue on each execution of a program, improving the reliability of the standard library's hashed collections, Set and Dictionary. In particular, random seeding enables better protection against (accidental or deliberate) hash-flooding attacks.
CocoaPodsにtest_specというのがあるのを今更ながら知った
CocoaPods 1.6.0 Betaのブログ記事(2018年8月)を今更ながら読んでいたら、s.test_spec
という定義ができるのを遅まきながら知った。
- CocoaPods 1.6.0 Beta Begins! - CocoaPods Blog
- 1.3.0で追加された機能だった🙈 CocoaPods 1.3.0 — Test specifications and performance improvements - CocoaPods Blog
test_spec
で定義したものがテストターゲットとなり、pod lib lint
かpod spec lint
した時にテストも実行してくれる- Googleで検索してみても、ほとんど日本語情報はなかった
- 1.6.0では複数のtest_specを定義した時に、1ターゲットに全部まとめられるのではなくて、複数ターゲットになるという改善が入って紹介されていた
Pod::Spec.new do |s| # ... rest of root spec entries go here # Unit Test Sources - Those do not require an app host to run. # They also require 'OCMock' dependency. s.test_spec 'Tests' do |test_spec| test_spec.source_files = 'Tests/**/*.{h,m}' test_spec.dependency 'OCMock' end # SnapShot Tests Sources - Those *do* require an app host to run. s.test_spec 'SnapshotTests' do |test_spec| test_spec.requires_app_host = true test_spec.source_files = 'SnapshotTests/**/*.{h,m}' end
おまけで、cocoapods-generateという、podspecからXcodeのプロジェクトを生成してくれるプラグインも紹介されていてよさそうだった。SwiftPM(Swift Package Manager)の$ swift package generate-xcodeproj
と一緒の感じですね。
2018年振り返り
- 1月: 記憶にございません
- 2月: 妻が平昌オリンピック(フィギュアスケート女子)の観戦に行っていて寂しかったです
- 3月: try! Swift Tokyo 2018に参加、ワークショップ講師をさせてもらいました
- 4月: 見知らぬ人からもらったお酒で、見知らぬ夫婦とお花見をしました
- 5月: アプリの新規リリースが大変でした
- 6月: WWDC 2018に参加(2年連続2回目)(id:yutailang0119さん、楽しかったね&色々ありがとう)
- 7月: バリ島行きました、ヒュー🤟
- 8月: 暑かったですね〜iOSDC 2018
- 9月: iOSDC 2018で3年連続3回目のLTをしました。3年連続LTをしたのは僕一人であることに気付きました(来年はレギュラートーク選ばれたい……!)
- 10月
- 埼玉までフィギュアスケートを見に行きました(ジャパンオープン・カーニバル・オン・アイス)
- PEAKSで執筆に参加した『iOS 12 Programming』がクラウドファンディング参加者向けにリリースされました
- 昨年に引き続き、今年もSwiftのアップデートについて解説しました(第7章)
- 11月: React Nativeを導入してリニューアルしたカクヨムの公式アプリがリリースされました
- カクヨムのアプリをリニューアルしました - カクヨムからのお知らせ
- デザイナーがReact Nativeでのアプリ開発を経験した感想 - Hatena Design Group
- iOSDCで@hotchemiさんや@mybさんとReact Native話ができたのが役立ったし楽しかった!
- 12月
- 連日、酒
- 『iOS 12 Programming』の一般販売が開始されました。まだ買っていない人は買って読んでくれ!
総括
今年は割と潜っていた感じがするので、来年はもっとアクティブに活動できるといいですね。それと今年は新しくリリースした・新たにコミッターになったOSSがなかった年だったっぽいので、何か新しいものに関わったり、Swiftにももっとコミットしていきたいです。沢山旅行もしたいしお金も欲しいしお酒も飲みたい!✈️💰🍻