1年ほど前にgitのmergetoolをvimdiffからvscodeの3-wayに乗り換えて馴染んできたので、設定方法のメモと布教です。 設定方法 メインのエディタでVSCodeを使っていて、git操作もその中で完結している場合は、VSCode自体の設定でgit.mergeEditorをtrueにするだ…
サーバーサイドエンジニアとやり取りする時など、何かとcurlコマンドが欲しい機会があると思います。 Charlesなどの外部ツールを使っても出来ますが、LLDBで扱えると時短になります。 Swift側のextension HEADリクエストなどを考慮していないため、厳密では…
Xcode13からXCTest周りの機能が強化され、特にflaky testに対応しやすくなったので、実際の対応方法をいくつか書きます。 Flaky testの再現確認 XCTSkipを利用してskipする XCTExpectedFailureを利用して結果を成功扱いにする 動画リンク Flaky testの再現確…
Swiftの場合、特に意識せずとも各オブジェクトに対してARCによるメモリ管理が行われ、コンパイル時にreference countのincrement/decrementの処理(retain/release)が挿入されます。 ほとんどの場合、retain cycleを避けることなどのわずかなことを意識してお…
複雑なアニメーションを実装する場合に、画面の更新(垂直同期)に合わせて、アニメーションの更新処理をしたいケースがあります。 単純にTimerなどで実装した場合、アニメーションの処理が呼ばれるタイミングが画面の更新と合わないため、次の垂直同期までに…
ちょっと前のアップデートで、正しくcontentViewに追加していない場合に、セルの挙動がおかしくなるケースが多発したと思います。 この前Xcode13に上げたタイミングでも食らってしまい、 cellに直接addSubviewしたいケースも多分ないと思ったので、作ってみ…
最近リファクタをしていて、同じオブジェクトを使ってencodeとdecodeをする際に、必要なケースがでてきたので書きました。 状況 Property wrapperを使った解決 Equatableへの応用 サンプルコード 状況 以下のHogeのように一部のパラメーターでdecodeはしたい…
DateFormatterに関しては古くからあり、おおよそのプロジェクトで使われているイメージですが、DateComponentsFormatterやRelativeDateTimeFormatter(iOS13+なので最近)については体感としてあまり使われておらず、特に歴史のあるプロジェクトでは独自のform…
6月23日(水)にPotatotips #74に参加させていただき、iOS枠で発表しました。 potatotips.connpass.com ちょうどWWDCの後だったこともあり、SharePlayやGroup Activitiesなど、自分がキャッチアップできていない部分のお話を聞けて、とても楽しかったです。 An…
iOS開発をしていてデバッグする際に、コピーしたり、"を外したりするのが地味にめんどくさいので作ってみました。 今回は、SwiftのStringをopenurl hogeのようなコマンドで開くのを目指します。(Swift以外でもほぼ同じです) openurlコマンドの作成 コマンド…
普段からVimを使うようなその道の人には有名かと思いますが、XcodeやらVSCodeやらを使う人々にとっても、おすすめできるので書いてみました。 自分もiOSやる前はEmacsユーザーで、正直あんまりVimは慣れていないのですが、それでも使いやすいです。 git merg…
iOS開発でログを利用する場合、自前のロガーを利用したり、OSSを利用する選択肢が多いですが、標準のOSLogのAPIが新しくなり、iOS14以降で使いやすくなりそうなので、紹介します。 printと比べて何が良いか OSLogを利用した出力 Loggerを用意する ログを出力…
NSObjectは自身がEquatableなので、==やEquatableに対するメソッドが呼べたりするのですが、デフォルトの動作はポインタを比較するSwiftでいう===相当なので気をつけましょう。 final class Hoge: NSObject { let value: Int init(_ value: Int) { self.valu…
結構ありがちな書き方なので、書いてみました。 Bastard Injectionとは なぜBastard Injectionが問題となるのか なぜ書いてしまうのか 置き換える方法 見るべき動画 Bastard Injectionとは Bastard Injection(Poor Man's Dependency Injection)は、他の言語…
他言語含めても、なかなか使われているサンプルも少ないmaterializeですが、 そんなに悪さをするオペレーターでもないので書いてみました。 こんなオペレーターもあるよ的な感じです。 materialize/dematerializeの機能 materialize dematerialize ありえそ…
若干需要があったので、テンプレートファイルを作成して、Sourceryを使ってBuilderを自動生成してみました。 実装は、Lombokの@BuilderのようなシンプルなBuilderのイメージです。 projectlombok.org テンプレートと使い方 作成したテンプレートは、ここに置…
最初は、OptionalのmapとflatMapの話だけ書いていたのですが、だんだんOptionalそのものの話まで膨らんできたので、一緒に書くことにしました。 今回の話はコードレビューで見つけたら割と指摘したい部分ではあるものの、毎回この内容を書くのも無理があるの…
プログラミング関係の本は食傷気味なので、気分を変えて読んでみました。 勝手に付与されたPayPayなんとかポイントで買いました。 インタフェースデザインのお約束 ―優れたUXを実現するための101のルール作者:Will Grant発売日: 2019/11/09メディア: 単行本…
絶対忘れる自信があるので書いておきます。 なんとなく、この辺りのインターフェースもまた変わりそうな予感がするので、暫定Swift 5、iOS 13版です。 NotificationCenter(raw) NotificationCenterはライフサイクルに合わせてobserverを破棄してくれるので、…
GitHub Actionsを使ってみたかったので、gemパッケージのrake specとrubygems.orgへのpushを自動化してみました。 GitHub Actionsの準備 PRに対してRSpecテストを実行する masterへのpushでgemをアップロードする GitHubのレポジトリの設定 GitHub Actionsの…
Xcodeのキーバインドや、コードスニペットなどのカスタマイズした情報(UserData)をgit管理する方法を記載します。 個人サーバーやGitHub等を使ってリモートで管理しておくと、Xcodeのバージョンアップの際や複数の環境で設定を揃える際に非常に楽になります…
せっかくインストールしたアプリを削除されたくないので、インストール後のバイナリサイズを削ってみました。 今年は細かい作業やりたくないので、忘れないうちに記録に残しておくことにしました。 まず見るWWDCのセッション アプリのサイズ Assetsの中でか…
こんばんは、final警察です👮 既存のコードにfinalをつけるのがめんどくさかったので、シェルスクリプトで一括finalをつけてみました。 Bashスクリプト 解説 git grep class.+:.*[, ]$CLASS_NAME\W while read ~ done < <(expr) なぜfinalをつけるか 締め Bash…
LLDBのcommand regexを使うと、zshのanonymous functionのaliasみたいな感じで、 引数に置換かけながらLLDBコマンドを実行するaliasが作れます。 これを利用することで、簡単なコマンドならば、Pythonスクリプトを用意する手間が省けます。 やりかた 構文は…
danger-xcode_warningsという名前で、Pull Requestを投げた際に、Xcodeのcompiler warningsやlinker warningsを指摘するDangerプラグインを作りました。 xcodebuildのログと、xcprettyで整形済みのログに対応しています。 github.com rubygems.org 実はだい…
コードレビューの補助に、Dangerを導入しているチームも多いと思います。 プラグインも簡単に作れるので、半分覚え書きですが、解説したいと思います。 プロジェクトの生成 ファイルの構成 プラグイン本体の書き方 RSpecの書き方 実際の例 テストの記述 プラ…
SwiftPMも本格的に使えそうなので、SourceKit-LSPを試してみました。 SourceKit-LSPは外部エディタ向けの、Swiftコードの補完やジャンプなどの機能を提供するLanguage Server Protocolです。 VScodeやVimなどのテキストエディタなどで利用することが出来ます…
毎回ソースコードいじってRxSwiftのdebug仕込むのってめんどいですよね。 そこで、スクリプトを使ってLLDBから仕込めるようにしました。 流れてくるイベントを簡単にチェックするのに役に立つかもしれません。
Swiftに`async/await`がなかなかこないので書いてみました。 コールバック地獄が嫌いな人向けの記事です。
どのブランチで最後にgit stashをしたかわからなくなることがあるので、シェルに表示されるようにしてみました。 これで誤popがだいぶ減りました。 How To stashされた一覧はgit stash listで確認できます。 % git stash list stash@{0}: WIP on feature/int…