t-osawa-009 blog

学んだことを載せます

2021-10月に読んだ本まとめ

はじめに

  • 時間に余裕ができたので、今月読んだ本についてまとめてみました。

読んだ本一覧

amazonのすごい会議ジェフ・ベゾスが生んだマネジメントの技法

  • 会議を円滑に進めるためのノウハウが多く載っていました。
  • 特に印象的だったのは会議の最初の時間は資料を読む時間にあて、前提の情報を共有した上で進めることで時間が短縮されることが印象的でした。
  • そのためにAmazonに入社するためには文章スキルが高くないとダメらしいです

悪いヤツほど出世する

  • リーダーシップや組織マネジメントの本に載っているよくある情報を本当なのか分析して証明していきます。
  • スティーブ・ジョブズやジェフベゾスなどの有名人も事例としてできて面白かったです。

失敗の科学 失敗から学習する組織、学習できない組織

  • 失敗からどう学習するかについてまとめられた本です。
  • ソフトウェアエンジニアには馴染みのある、ランダム化比較試験などの失敗を生かす方法が載っています。

Xcodeのarchiveが長時間かかるようになった時にやったこと

環境

Xcode 13.0
Build version 13A233
swift-driver version: 1.26.9 Apple Swift version 5.5 (swiftlang-1300.0.31.1 clang-1300.0.29.1)
Target: arm64-apple-macosx11.0

発生した現象

  • Xcodeを12-> 13にアップデートした。
  • Xcodeのarchiveが急に長時間かかるようになった。(archiveの時間が10分以上伸びた)
  • バイナリ配布の効率が悪くなるので対応した

解決策

  • 最初にarchiveのlogを確認して、archiveに時間がかかっている箇所を発見する。

f:id:da87435:20210922221720p:plain

  • Swift Compiler > Code Generation > Optimization Levelを-Ononeに変更
  • 自分の環境では、自作のライブラリ側で時間がかかっていた。
  • あくまで暫定措置であるので改善された場合は戻す予定

iOSDC 2021に参加した感想

はじめに

今年も2021.9.17 ~ 9.19に開催されたiOSDCに参加しました。

オンラインでの開催であったので並行して、多くのセッションを見ることができました。

その中で特に印象に残ったセッションを3つ取り上げたいと思います。

iosdc.jp

宣言的UIの状態管理とアーキテクチャ - SwiftUIとGraphQLによる実践

speakerdeck.com

  • 状態管理しやすい設計の歴史や特徴を網羅的にまとめた発表でした。
  • GraphQLを使う設計は考えたことなかったのですごく新鮮でした。
  • サーバ側にUIの状態を持たせるのは面白いと思いました

StoreKit のこれまでとこれから

speakerdeck.com

  • StoreKitとStoreKit2の比較をしながら、変更点がまとめられた発表でした。
  • iOS開発者が感じていた、不満がStoreKit2の変更によって、解消される部分はよくキャッチアップしたいと思いました。

Hello, Swift Concurrency world.

speakerdeck.com

  • 新しく導入されるasync/awaitの仕組みを中心にまとめられた発表でした。
  • Actorなどの新しい概念も出てきたので実装前によく調べた方がいいと感じました。

まとめ

  • 今年もiOSDCに参加し、多くのセッションを見ることができました。
  • 今回は新機能であるasync/awaitやSwiftUIなどのセッションがとても興味深い内容のものが多くありました。
  • 来年もぜひ参加したいです

[Swift, iOS]アプリが起動時にクラッシュするがcrash logがない状態を解消した

現象

  • リリースしたiOSアプリで起動時にクラッシュする現象が発生した。特定のバージョンでのみ発生している。 Firebase Crashlyticsを導入しているが起動時にクラッシュしたcrash logがないという状態になった。

原因

f:id:da87435:20210804053628p:plain - AdServices.frameworkAppTrackingTransparency.frameworkはバージョンによって、サポートされていない。 StatusをRequiredにすると起動時にフレームワークの読み込みに失敗して起動できない。 対象のフレームワークをOptionalに設定することで起動できるようになる。

まとめ

  • 古いバージョンのテストはしっかりしようと思いました。

ゲーミングモニターを1か月使ってみた感想

1ヶ月ほど前にゲーミングモニターを買って見ました。使って見てとても良かったので感想をまとめたいと思います。

 

買ったのはこちらのモニターです

www.dell.com

 

良かったところ 

タイピングが気持ちいい

寿司打をやって見るといつもより高速で打てている感じがします。プログラミングでも同様に入力が高速に感じます。

 

画面の切り替わりにストレスがない

Webページの切り替わりも体感で早く感じ、

ストレスがないです。

 

マイナス要素

60hzの普通のモニターで遅延を感じるようになりました。

良いものを知ってしまったことによって、普通のものでは満足しなくなってしまいました。

 

価格はやはり高いです。簡単に買えるものではないので吟味して、買うかどうか決断が必要です

 

まとめ

結論として、満足のいく買い物でした!

 

 

 

 

Swift Package ManagerでBundle.moduleがビルドエラーになる

現象

Swift Package Managerでlocalのファイルを読み込む処理を追加した。(JSONファイル) ビルドするとType 'Bundle' has no member “module”のエラーが出てしまう

解決策

Package.swiftのtargetsで指定したディレクトのpathと実際のディレクトがずれていて、test.jsonを読み込めていなかった。 実際のディレクトPackage.swiftに合わせるとエラーは解消した。 今後、注意していきたい!

// swift-tools-version:5.4
import PackageDescription

let package = Package(
    name: "Hoge",
    platforms: [
        .iOS(.v13)
    ],
    products: [
        .library(
            name: "Hoge",
            targets: ["Hoge"]),
    ],
    dependencies: [],
    targets: [
        .target(
            name: "Hoge",
            dependencies: [],
            path: "Hoge",
            resources: [.process("Resources/test.json")])
    ]
)

iPhone simulatorでmacのファイルを読み込めるようにしたらデバッグが快適になった

はじめに

最近のiOSアプリ開発APIとの接続は必須になってきた。

その中でAPIのリスポンスをもとに期待した動作を確認することが必要になってくる。

その確認を楽にするための方法を考えました

こちらのライブラリを参考に実装した

krzysztofzablocki/KZFileWatchers

環境

Xcode 12.5

Build version 12E262

Apple Swift version 5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)

Target: arm64-apple-darwin20.5.0

 

やりたいこと

iOS側でAPIのレスポンスを受け取る部分を差し替えて、Macjsonファイルを読み込むようにして、期待するレスポンスを返せるようにする。

実装

最初にmacディレクトのpathを返すメソッドを用意

class func simulatorOwnerUsername() -> String {
      let usernameConmponets =NSHomeDirectory().components(separatedBy: "/")
      guard usernameComponents.count > 2 else { fatalError() }
      return usernameComponents[2]
}

次にDeskTopのpathを作成して、Data型をして呼び出す

 func loadfile(filename: String = "test.json") -> Data? {
        #if targetEnvironment(simulator)
                let path = "/Users/\(Self.simulatorOwnerUsername())/Desktop/\(filename)"

                if !FileManager.default.fileExists(atPath: path) {
                    return nil
                }

                let url = URL(fileURLWithPath: path)
               guard let content = try? Data(contentsOf: url, options: .uncached) else {
                  return nil
              }
              return content
        #else
              return nil
        #endif
    }

Data型にすることでCodableなどで簡単に扱うことができる さらにMacでファイルを更新すれば、レスポンスの値を動的に変更できるのでデバッグが更に楽になります