LinuxのSwift 5.1で、NSNumberなどがComparableになってDarwinとソース互換がなくなる事例

というバグレポートを起票しました。

原因となったswift-corelibs-foundationのPRがこちらです。

例として、現在のDarwinmacOSiOSなど)でのNSNumberのProtocol準拠は次のとおりです。

NSNumber - Relationships
NSNumber - Relationships

どちらかと言うと、NSNumberNSStringなどがComparableになるのはポジティブなので、DarwinのFoundationでもComparable準拠になると嬉しいですね。

Java Cryptography Extension(JCE)と、AndroidのBouncy Castleと、Spongy Castle

社内のSlackでSpongy Castleという名前を聞いて、知らなかったので少し調べてみました。

  • AndroidJavaJava 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.

https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes/swift_4_2_release_notes_for_xcode_10

CocoaPodsにtest_specというのがあるのを今更ながら知った

CocoaPods 1.6.0 Betaのブログ記事(2018年8月)を今更ながら読んでいたら、s.test_specという定義ができるのを遅まきながら知った。

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と一緒の感じですね。

Xcodeのプロジェクト生成だとXcodeGenという、YamlJSONの定義から生成するツールもある。

2018年振り返り

総括

今年は割と潜っていた感じがするので、来年はもっとアクティブに活動できるといいですね。それと今年は新しくリリースした・新たにコミッターになったOSSがなかった年だったっぽいので、何か新しいものに関わったり、Swiftにももっとコミットしていきたいです。沢山旅行もしたいしお金も欲しいしお酒も飲みたい!✈️💰🍻

React NativeとTypeScript 3.1の相性が悪い

相性が悪いというかStyleSheet.create周りで型エラーになってしまう。

github.com

github.com

Bugラベルは付けられていて、TypeScript 3.2を待つ必要がありそう。