iOSDC Japan 2022にプロポーザル提出した -> 採択された #iosdc

fortee.jp

過去にも採択してもらってトーク枠をもらったけど、隔年の周期っぽい。

提出したプロポーザル

よろしくお願いします。

追記

fortee.jp が無事採択された。

SSOを切っても、GitHubの草を1年生やせた

Contributions in the last year

前の1年は仕事でのリポジトリも含めて1年間GitHubの草を生やしていたが、この1年はSSOを切った状態でも草を生やすことを目標にやってきた。
毎日意味のあるコードを書き続けられた訳ではないけど、毎日PCやスマホGitHubアプリでコードを開いたり、利用しているライブラリのリリースノートを読んだりは、有意義だったと思う。
また1年やっていきたい。

SSOをONにした状態

Contributions in the last year with work

昨年の様子

【2022年】Xcode/Apple Platform/Swiftアップデートの歩き方

先にまとめ

前提

XcodeApple Platform、Swift 、そしてそれらのアップデートには相互に関係がある。
ここでのカテゴライズはオーバーラップがあるものとして捉えてもらいたい。

対象読者

  • Swift、Apple Platformアプリケーション開発の中上級者
  • WWDCで盛り上がるが、それ以外の期間のキャッチアップまで手が回っていない人

Xcode

基本的に、Apple Platfromアプリケーションを開発する上で、Xcodeのバージョンには大きな影響を受ける。
Xcodeに同梱されるSwift、各種SDKを使って、コンパイルするからだ。

Xcode Release Notes

developer.apple.com

全体を通して、まずは Xcode Release Notes に目を通すとよいだろう。
ここにはSwift、SDKXcode自体のアップデートについて記載される。
Xcode Betaについても更新があり、解決した問題、既知の問題、それに対するworkaroundも掲載されている。

Xcode Release Notesは初手としてはいい反面、各Frameworkのアップデートは省略されている。

Apple Platform

開発におけるXcodeの影響は支配的だが、とりわけApple Platformのアップデートとの関係は深い。

‪Technologies‬ Documentation API diff

developer.apple.com

API diff では、Xcodeのバージョン間で差分を確認できる。
普段の開発でもドキュメントを確認する場合に参照するので、扱いには慣れているだろう。
ただし、新しいFrameworkやメソッド (それ以外に古くから存在するものであろうと) No overview available も多いので注意されたい。

Tech Talks

developer.apple.com

特にWWDCの期間になるが、Tech Talks の動画も貴重な資料だ。
WWDC以外でも動画がアップロードされることもある。
しかし、日頃のアップデートを追うという意味では、ここに辿り着くことは少ない。
サポートするPlatformバージョンが追いついた時に、改めて見直すことはよくある。

Swift

次にSwift言語としてのアップデートを見る。
Swiftや多くのツール群は、Open Source Projectとして開発されていて、Apple Platformとは別サイクルでアップデートされている。
しかし、現実はXcodeのアップデート (= Apple Platformのリリース) に合わせて、Swiftのリリースも行われている。

apple/swift

github.com

Swift本体。
CHANGELOGに、バージョン毎のアップデートがまとまっていてわかりやすい。

apple/swift-package-manager

github.com

Swift Package Manager。
Swiftのリリースに合わせて、リリースされる。
CHANGELOGに、バージョン毎のアップデートがまとまっていてわかりやすい。

swift.org Blog

www.swift.org

Swiftのリリースに合わせてブログが公開され、リリースに含まれるプロポーザルについて紹介される。
e.g. https://www.swift.org/blog/swift-5-5-released/

それ以外にも、PackageのOpen Source化などが周知されることがある。
読みやすい内容になっているので、おすすめ。

swift-evolution

リリースに合わせたアップデートよりも、進化のキャッチアップ面が大きいが、以下も参照されたい。

apple/swift-evolution

github.com

Swift/Swift Package Manager/それ以外にもSwift に関わる進化について、リリース前からキャッチアップしていくためにはここから。
それだけでなく、swiftやswift-package-managerのCHANGELOGの理解を深めたい時に、立ち戻ってproposalを眺めることもよくある。
Acceptされるまでは大胆に変更されることも多々あるので、その点には注意されたい。

Swift Forums

forums.swift.org

apple/swift-evolutionに投稿されたproposalやそれの元となる議論が行われている。

ちなみにSwiftのリリースプロセスについても公開される。 (≒Apple Platformのリリース時期も予測できる)
e.g. Swift 5.6 Release Process - Announcements - Swift Forums

誕生日を迎えた 29回目

id:yutailang0119 の通り、2022年1月19日に誕生日を迎えました。
二十代最後だけど、カウントダウンが始まった。

仕事の昼会で「誕生日の歌をオンラインで歌ってもらう実績」を解除しました。

仕事

2018年2月に株式会社はてなに入社して、早いもので4年目が終わろうとしています。
世間も同じだと思うけれど、コロナ禍で生活は変わっています。
今のところまだまだやりたいことがあるので、やっていくつもりです。

最近の暮らしぶりはデベロッパーブログに書いたので、ご覧ください。

developer.hatenastaff.com

相変わらずプログラミングに関しては仕事と私生活の曖昧な部分もあって、私生活で作ったライブラリを仕事で使ったり、アプリを作ったりしています。

生活

アラサーになると、話題は健康とか体のことになりがち。

鉄棒を買った

去年9月の楽天セールで、鉄棒を買いました。
懸垂機ではなく "鉄棒"
幸い部屋の天井が高いので高さの問題はクリアしたが、折り畳んでも部屋の中では邪魔である...

日々懸垂しています。
pixe.la

歯科矯正を始めた

元々口内には課題があって、つい先日2022/01/17 (月) に歯科矯正を始めました。
子供の頃にも矯正器具を入れていたことがあったので、痛みのトラウマがあったけれど、今のところは軽い頭痛くらい。
動いているか心配になるので、もう少し痛みがわかりやすくてもいいかなと考えられるくらい。

ヒゲ脱毛も始めた

12月の深夜に突然思い立ってヒゲ脱毛について調べて、6回コースを始めました。
元々ヒゲが濃い方ではないけど、ヒゲを剃る時の手間と肌荒れが気になっていた。
まだ1回しか受けていないのでなんともだけれど、受けた直後は快適だったので、回数をこなしたらいいのかもしれないです。
イメージよりは安くできるので、とりあえずチャレンジをおすすめします。

最後に

いつものあれです。
ご支援お待ちしております。

www.amazon.jp

Swiftのenumはコンパイルが通れば、本当に安全? (CGImagePropertyOrientation)

CGImagePropertyOrientation -> UIImage.Orientation に変換するコードを、ドキュメントを基に以下のように実装した。

extension UIImage.Orientation {
    init(_ cgOrientation: CGImagePropertyOrientation) {
        switch cgOrientation {
        case .up:
            self = .up
        case .upMirrored:
            self = .upMirrored
        case .down:
            self = .down
        case .downMirrored:
            self = .downMirrored
        case .left:
            self = .left
        case .leftMirrored:
            self = .leftMirrored
        case .right:
            self = .right
        case .rightMirrored:
            self = .rightMirrored
        }
    }
}

コンパイラはエラーも警告も出さない。
CGImagePropertyOrientation には @frozen が指定されており、仕様上 @unknown default も不要だ。

そう思っていた時期がありました

_人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人_
> Fatal error: unexpected enum case 'CGImagePropertyOrientation(rawValue: 0)' <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

CGImagePropertyOrientation

Xcode 13.2.1 (13C100) における CGImagePropertyOrientation

/* Possible int values for kCGImagePropertyTIFFOrientation */
@frozen public enum CGImagePropertyOrientation : UInt32 {

    
    case up = 1 // 0th row at top,    0th column on left   - default orientation

    case upMirrored = 2 // 0th row at top,    0th column on right  - horizontal flip

    case down = 3 // 0th row at bottom, 0th column on right  - 180 deg rotation

    case downMirrored = 4 // 0th row at bottom, 0th column on left   - vertical flip

    case leftMirrored = 5 // 0th row on left,   0th column at top

    case right = 6 // 0th row on right,  0th column at top    - 90 deg CW

    case rightMirrored = 7 // 0th row on right,  0th column on bottom

    case left = 8 // 0th row on left,   0th column at bottom - 90 deg CCW
}

CGImagePropertyOrientation の要素は固定になっているはずだが、rawValue UInt32 から変換される経路によって Fatal error が発生しているようだ。
CGImagePropertyOrientation は 1 ~ 8 の範囲を指定することを想定した設計になっているが、カメラアプリによっては今回の "0" のように、範囲外の値を指定してる可能性がある。

回避策

仕方ないので、回避策として default を埋めておくことにする。
変更しても、コンパイラからエラーと警告は出ない。

extension UIImage.Orientation {
    init(_ cgOrientation: CGImagePropertyOrientation) {
        switch cgOrientation {
        case .up:
            self = .up
        case .upMirrored:
            self = .upMirrored
        case .down:
            self = .down
        case .downMirrored:
            self = .downMirrored
        case .left:
            self = .left
        case .leftMirrored:
            self = .leftMirrored
        case .right:
            self = .right
        case .rightMirrored:
            self = .rightMirrored
        default:
            self = .up
        }
    }
}

まとめ

Swift の enum だからといって、網羅性に100%の安心ができるかは、ケースによりますね。
みなさまもお気をつけください。

それでは、よいお年を 🐮 🔜 🐯.

UIImage.Orientation -> CGImagePropertyOrientation の変換はこう

extension CGImagePropertyOrientation {
    init(_ uiOrientation: UIImage.Orientation) {
        switch uiOrientation {
        case .up:
            self = .up
        case .upMirrored:
            self = .upMirrored
        case .down:
            self = .down
        case .downMirrored:
            self = .downMirrored
        case .left:
            self = .left
        case .leftMirrored:
            self = .leftMirrored
        case .right:
            self = .right
        case .rightMirrored:
            self = .rightMirrored
        @unknown default:
            self = .up
        }
    }
}