The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

2024振り返り

2024年の振り返りです。 仕事 今年もプレイングマネージャーとして一年過ごしました。 昨年はプレイングマネージャーで10人弱は多すぎだったため、今年は5人以下にしプレイング要素が増えました。 結構React書いていたような気がします。 アウトプット 会社…

styled-componentsをゼロランタイムCSS in JSに置き換える検討

この記事はコネヒトアドベントカレンダー2024の20日目の記事です。 adventar.org styled-componentsで書かれたプロジェクトをあまり移行コストをかけずにゼロランタイムCSS in JSに置き換えられないか、といくつかのゼロランタイムCSS in JSを軽く味見してみ…

static libraryをつかったマルチモジュール環境でCocoaPodsとSwiftPackageManagerを混在させる

このようにアプリの一部のモジュールをstatic libraryに切り出し、それぞれでCocoaPods経由でライブラリを使っているケースで、Swift Package Manager経由でライブラリを使いたいときの対処法です。 モジュール分割したどちらか一方でのみSwift Package Mana…

2023振り返り

2023年の振り返りです。 仕事 今年もプレイングマネージャーとして一年過ごしました EMとして10人弱見てる感じです アウトプット 会社ブログ tech.connehito.com tech.connehito.com プライベート 超がんばってiPhoneアプリをリリースしました。星5お願いし…

スクラムガイド輪読会で捕捉したりしてること

この記事はコネヒトアドベントカレンダー22日目の記事です。 adventar.org スクラムガイド輪読会をこれまで社内で何度となくやってきて、スクラムガイドを読み進める上で各章のポイントや捕捉していることについてまとめてみました。 スクラムガイドを読んで…

Phrasieを支える技術

個人開発で2023年5月末にiOSアプリをリリースしました! 英語日記でシャドーイングする英語勉強アプリphrasieYasuharu Yanamura教育無料apps.apple.com 有料アプリなので課金はしなくてもよいですが(してもいいですよ!)、星5をなにとぞお願いします!!!…

UIViewControllerがMainActorだから安心できるわけではない

前回の記事でUIViewControllerとMainActorのことについてかきました。UIViewControllerはMainActorなのでMainスレッドで実行されることは保証されていて安心!かと思いきやそうでもなかったのです。 以下のMainActorであるViewModelをMainActorではないクラ…

UIViewControllerからMainActorを呼ぶときにawaitしなくてよい理由

SwiftConcurrencyでは普通actorのメソッドを呼んだりするときはawaitしなければならないですが、UIViewControllerからMainActorのメソッドを呼ぶときはawaitせずに普通に呼べてしまいます。 これはなぜかというとUIViewControllerもMainActorだからです。 UI…

SwiftUIのモーダルの表示・非表示

※ iOS16でのやり方です モーダルの非表示 説明の都合上、先に非表示(モーダルを閉じるとき)についてです。 モーダルを閉じる場合はこのようにEnvironmentのdismissを使って画面を閉じます。 // モーダルで表示する画面 struct ModalContents: View { @Envi…

2022振り返り

2022年の振り返りです。 年末に下の子が胃腸炎になりその後家族全滅する事態となり正月過ぎての振り返りとなってしまいました・・ 仕事 今年もプレイングマネージャーとして一年過ごしました。 アウトプット 会社ブログ ちょっと油断していたところだいぶ世…

GitHub Actionsを自作している人はwarningに注意

GitHub Actionsは実行に成功していても、密かにwarningが出ていたりするので、GitHub Actionsを自作している人は気をつけましょう、将来的に急に動かなくなります。 わたしの自作のGitHub Actionsでは以下のようなwarningが出ていました。 The `set-output` …

Xcode Cloud所感

Xcode CloudがXcode 13.4.1から使えるようになったので試してみました。 Xcodeの左のナビゲーションの一番右の Report navigator もcloudタブからワークフローを作ることができるようになっています。 ここからXcode上でポチポチしていくだけで、ワークフロ…

leetcodeのeasyだけどeasyじゃなかった問題1

543. Diameter of Binary Tree 2分木の直径(左右ノードが最長となるときの長さ)を求める問題です。 この問題はノードの高さを求めるアルゴリズムを知ってる前提だと確かに簡単なのですが、知らないとそこから考えないといけないのでちょっと大変です。 前…

Swift Concurrencyのパフォーマンス

Swift Concurrencyは並列プログラミングの書きやすさや便利さがよくなっただけでなくパフォーマンスも改善されています。 これまでの問題 これまでのGCDを使った並列処理では、CPU Coreに対して一つスレッドを割り当てそれをスレッドプールにプールして再利…

UIViewRepresentableのCoordinatorはなぜ必要か

UIKitのViewをSwiftUIとして使うには、UIViewRepresentableを使います。 そしてUIKitのViewのdelegateやtarget actionをハンドリングしたい場合structではハンドリングできないので、Coordinatorという仕組みが用意されています。 makeCoordinator()がmakeUI…

Swift ConcurrencyのActor reentrancy

SwiftでActorsが導入され、actorを使えば簡単にスレッドセーフにすることができるようになりました。 ただこれでrace conditionやdead lockといった並行プログラミングにおける問題が解決されるわけではありません。 Actor reentrancy SwiftのActors(正確に…

2021振り返り

2021年の振り返りです。 仕事 プレイングマネージャとして一年過ごしました。 SwiftUIを使い始めました アウトプット コネヒトの開発者ブログを書いたり tech.connehito.com tech.connehito.com tech.connehito.com アドベントカレンダーを書いたりしました…

SwiftUI-Introspectの仕組み

これはiOSアドベントカレンダー2021その3の25日目の記事です! SwiftUIのViewに対応するUIKitの参照をとってくるSwiftUI-Introspectという謎ライブラリがあります。 なんのことを言っているのかわからないと思うので例をあげると、SwiftUI-Introspectを使う…

プレイングマネージャーとしてプレイヤーとマネージャーを両立させるためにやっていること

これはコネヒトアドベントカレンダー2021の20日目の記事です。 これまでずっとエンジニアとしてやってきましたが、昨年の9月からマネージャーとしてのロールもやることになりました。(マネージャーとしておまえなにやるのよという点についてはこちらにしたた…

2020振り返り

2020年の振り返りです。 仕事 今年はずっとiOSエンジニアの採用を頑張ってました。 マネジメントの役割もやりはじめました。 アウトプット GitHub Actionsをいくつか作って公開しました GitHub - yanamura/ios-bump-version GitHub - yanamura/git-flow-merg…

iOSエンジニアがFlutterを勉強するのにやったこと

こちらはコネヒトアドベントカレンダー2020 23日目の記事です。 普段はSwiftでiOSアプリを開発しているわたしがFlutterを入門するのにつかったものなどを紹介します。 Dartについて Dart Language Tour(https://dart.dev/guides/language/language-tour)を読…

Invalid bitcode version (Producer: 'xxx' Reader: 'yyy')になったときの対処方法

iOSアプリのreleaseビルドを行った際にlinkerでinvalid bitcode versionで怒られることがあります。 ld: could not reparse object file in bitcode bundle: 'Invalid bitcode version (Producer: '1103.0.32.62.0_0' Reader: '1100.0.33.17_0')', using lib…

npmの特定のパッケージのみ最新にアップデートする

npm i -g npm-check-updatesを入れておくと便利 npm-check-updatesをインストール $ npm i -g npm-check-updates 特定のパッケージを最新にする $ncu -u styled-components これを実行するとpackage.jsonが更新される --- a/package.json +++ b/package.json…

2019振り返り

2019年の振り返りです。 仕事 去年の5月からコネヒトに出向していましたが、今年の5月にSupershipからコネヒトに転籍となりました。 アウトプット まだちゃんとつくりきってはいないんですが、変更のあったファイルにのみlintとかformatterを適用するSwiftの…

iOS開発の年末大掃除

この記事はこの記事はコネヒト Advent Calendar 2019 18日目の記事です。 開発を重ねるとプロジェクト内についつい使っていないコードやリソースが残ってしまったり、開発環境にゴミが残ったりします。 今回はそれらの掃除に役立つツールを紹介します。 使っ…

peripheryの特定ブランチをビルドしてつかう

Swiftの使ってないコードを消すperipheryとツールがありますが、 Xcode11の対応版がまだマージされていなくて使えません。 xcode11というブランチがあってそれを使うと一応使うことができます。ただビルドしないといけないのでそのビルド方法です。 peripher…

MacBook Proの電源アダプタ

MBPを会社と家で使っている場合に、ただでさえMBPが重いのに電源アダプタまで持ち帰りたくないですよね。 ですが、純正の電源アダプタ(85W)を買うと8000円もするわけです・・ そこで色々探してよさげだったのがAnker PowerPort Speed PD 60です。 出力は60W…

SwiftUIのViewで条件によってViewを出し分ける方法

potatotips #64でLTした内容です。 SwiftUIのViewで条件によってViewをだしわけたいことがたまにあるかと思います。 SwiftUIでこのように条件によってViewを出し分けるようなコードを書いてみます。 var body: some View { if imageName.isEmpty { return Te…

アプリのDark ModeをOFFにする

既存のアプリでいきなりダークモードに対応するのは大変です。 しかしXcode11でビルドするとデフォルトでダークモードが適用されてしまいます。 もちろんダークモードをOFFにすることは可能となっています。 アプリ全体でダークモードをOFFにする方法 Info.p…

Nimbleでtupleの比較

Nimbleでtupleをequal()で比較してもコンパイルに通りません。 let tuple = (1, 2) expect(tuple).to(equal((1, 2))) 原因 これはtupleがEquatableではないからです 対策 これはどうしようもないので以下のようにequalを使わずに回避するしかなさそうです ex…