しおメモ

雑多な技術系ブログです。ニッチな内容が多いです。

VSCodeの3-way mergeをgitのmergetoolとして利用する

git

1年ほど前にgitのmergetoolをvimdiffからvscodeの3-wayに乗り換えて馴染んできたので、設定方法のメモと布教です。 設定方法 メインのエディタでVSCodeを使っていて、git操作もその中で完結している場合は、VSCode自体の設定でgit.mergeEditorをtrueにするだ…

URLRequestをcurlコマンドに変換する

サーバーサイドエンジニアとやり取りする時など、何かとcurlコマンドが欲しい機会があると思います。 Charlesなどの外部ツールを使っても出来ますが、LLDBで扱えると時短になります。 Swift側のextension HEADリクエストなどを考慮していないため、厳密では…

XCTestを使ったflaky testの扱い方

Xcode13からXCTest周りの機能が強化され、特にflaky testに対応しやすくなったので、実際の対応方法をいくつか書きます。 Flaky testの再現確認 XCTSkipを利用してskipする XCTExpectedFailureを利用して結果を成功扱いにする 動画リンク Flaky testの再現確…

ARCによるオブジェクトの破棄タイミングをずらす

Swiftの場合、特に意識せずとも各オブジェクトに対してARCによるメモリ管理が行われ、コンパイル時にreference countのincrement/decrementの処理(retain/release)が挿入されます。 ほとんどの場合、retain cycleを避けることなどのわずかなことを意識してお…

CADisplayLinkを用いたアニメーション実装

iOS

複雑なアニメーションを実装する場合に、画面の更新(垂直同期)に合わせて、アニメーションの更新処理をしたいケースがあります。 単純にTimerなどで実装した場合、アニメーションの処理が呼ばれるタイミングが画面の更新と合わないため、次の垂直同期までに…

Cellに直接addSubviewするコードに警告を出す

ちょっと前のアップデートで、正しくcontentViewに追加していない場合に、セルの挙動がおかしくなるケースが多発したと思います。 この前Xcode13に上げたタイミングでも食らってしまい、 cellに直接addSubviewしたいケースも多分ないと思ったので、作ってみ…

Property wrapperを使ってCodableの一部のプロパティをencodeしないようにする

最近リファクタをしていて、同じオブジェクトを使ってencodeとdecodeをする際に、必要なケースがでてきたので書きました。 状況 Property wrapperを使った解決 Equatableへの応用 サンプルコード 状況 以下のHogeのように一部のパラメーターでdecodeはしたい…

よくある実装でDateComponentsFormatterやRelativeDateTimeFormatterを使う

DateFormatterに関しては古くからあり、おおよそのプロジェクトで使われているイメージですが、DateComponentsFormatterやRelativeDateTimeFormatter(iOS13+なので最近)については体感としてあまり使われておらず、特に歴史のあるプロジェクトでは独自のform…

potatotips #74に参加して発表しました

6月23日(水)にPotatotips #74に参加させていただき、iOS枠で発表しました。 potatotips.connpass.com ちょうどWWDCの後だったこともあり、SharePlayやGroup Activitiesなど、自分がキャッチアップできていない部分のお話を聞けて、とても楽しかったです。 An…

LLDB経由でPythonを利用してStringの示すURLを開く

iOS開発をしていてデバッグする際に、コピーしたり、"を外したりするのが地味にめんどくさいので作ってみました。 今回は、SwiftのStringをopenurl hogeのようなコマンドで開くのを目指します。(Swift以外でもほぼ同じです) openurlコマンドの作成 コマンド…

git mergeのコンフリクト解消にvimdiffを使う

git

普段からVimを使うようなその道の人には有名かと思いますが、XcodeやらVSCodeやらを使う人々にとっても、おすすめできるので書いてみました。 自分もiOSやる前はEmacsユーザーで、正直あんまりVimは慣れていないのですが、それでも使いやすいです。 git merg…

OSLogを利用したロギング

iOS開発でログを利用する場合、自前のロガーを利用したり、OSSを利用する選択肢が多いですが、標準のOSLogのAPIが新しくなり、iOS14以降で使いやすくなりそうなので、紹介します。 printと比べて何が良いか OSLogを利用した出力 Loggerを用意する ログを出力…

NSObjectを継承したクラスでEquatableの操作をする

NSObjectは自身がEquatableなので、==やEquatableに対するメソッドが呼べたりするのですが、デフォルトの動作はポインタを比較するSwiftでいう===相当なので気をつけましょう。 final class Hoge: NSObject { let value: Int init(_ value: Int) { self.valu…

SwiftにおけるBastard Injectionとは

結構ありがちな書き方なので、書いてみました。 Bastard Injectionとは なぜBastard Injectionが問題となるのか なぜ書いてしまうのか 置き換える方法 見るべき動画 Bastard Injectionとは Bastard Injection(Poor Man's Dependency Injection)は、他の言語…

RxSwiftのmaterialize/dematerialize

他言語含めても、なかなか使われているサンプルも少ないmaterializeですが、 そんなに悪さをするオペレーターでもないので書いてみました。 こんなオペレーターもあるよ的な感じです。 materialize/dematerializeの機能 materialize dematerialize ありえそ…

SourceryでBuilderを自動生成するテンプレート

若干需要があったので、テンプレートファイルを作成して、Sourceryを使ってBuilderを自動生成してみました。 実装は、Lombokの@BuilderのようなシンプルなBuilderのイメージです。 projectlombok.org テンプレートと使い方 作成したテンプレートは、ここに置…

SwiftのOptionalの注意点とmap/flatMap

最初は、OptionalのmapとflatMapの話だけ書いていたのですが、だんだんOptionalそのものの話まで膨らんできたので、一緒に書くことにしました。 今回の話はコードレビューで見つけたら割と指摘したい部分ではあるものの、毎回この内容を書くのも無理があるの…

読んだ: インターフェースデザインのお約束

プログラミング関係の本は食傷気味なので、気分を変えて読んでみました。 勝手に付与されたPayPayなんとかポイントで買いました。 インタフェースデザインのお約束 ―優れたUXを実現するための101のルール作者:Will Grant発売日: 2019/11/09メディア: 単行本…

iOSのキーボードの高さと連動したビューを作る

絶対忘れる自信があるので書いておきます。 なんとなく、この辺りのインターフェースもまた変わりそうな予感がするので、暫定Swift 5、iOS 13版です。 NotificationCenter(raw) NotificationCenterはライフサイクルに合わせてobserverを破棄してくれるので、…

gemパッケージのCI/CDをGitHub Actionsに移行した

GitHub Actionsを使ってみたかったので、gemパッケージのrake specとrubygems.orgへのpushを自動化してみました。 GitHub Actionsの準備 PRに対してRSpecテストを実行する masterへのpushでgemをアップロードする GitHubのレポジトリの設定 GitHub Actionsの…

XcodeのSnippetsなどのカスタマイズ情報をgitで管理する

Xcodeのキーバインドや、コードスニペットなどのカスタマイズした情報(UserData)をgit管理する方法を記載します。 個人サーバーやGitHub等を使ってリモートで管理しておくと、Xcodeのバージョンアップの際や複数の環境で設定を揃える際に非常に楽になります…

iOSアプリの圧縮済みAssets内の画像のサイズを調べて小さくする

せっかくインストールしたアプリを削除されたくないので、インストール後のバイナリサイズを削ってみました。 今年は細かい作業やりたくないので、忘れないうちに記録に残しておくことにしました。 まず見るWWDCのセッション アプリのサイズ Assetsの中でか…

Swiftのコードにシェルスクリプトでfinalをつける

こんばんは、final警察です👮 既存のコードにfinalをつけるのがめんどくさかったので、シェルスクリプトで一括finalをつけてみました。 Bashスクリプト 解説 git grep class.+:.*[, ]$CLASS_NAME\W while read ~ done < <(expr) なぜfinalをつけるか 締め Bash…

LLDBのcommand regexを使って動的なaliasを作る

LLDBのcommand regexを使うと、zshのanonymous functionのaliasみたいな感じで、 引数に置換かけながらLLDBコマンドを実行するaliasが作れます。 これを利用することで、簡単なコマンドならば、Pythonスクリプトを用意する手間が省けます。 やりかた 構文は…

Xcodeのコンパイラやリンカの警告をDangerで指摘するプラグインを作っていた

danger-xcode_warningsという名前で、Pull Requestを投げた際に、Xcodeのcompiler warningsやlinker warningsを指摘するDangerプラグインを作りました。 xcodebuildのログと、xcprettyで整形済みのログに対応しています。 github.com rubygems.org 実はだい…

Dangerプラグインを自作する

コードレビューの補助に、Dangerを導入しているチームも多いと思います。 プラグインも簡単に作れるので、半分覚え書きですが、解説したいと思います。 プロジェクトの生成 ファイルの構成 プラグイン本体の書き方 RSpecの書き方 実際の例 テストの記述 プラ…

VSCodeでSwift5.1のSourceKit-LSPを動かす

SwiftPMも本格的に使えそうなので、SourceKit-LSPを試してみました。 SourceKit-LSPは外部エディタ向けの、Swiftコードの補完やジャンプなどの機能を提供するLanguage Server Protocolです。 VScodeやVimなどのテキストエディタなどで利用することが出来ます…

LLDBからRxSwiftのdebugを仕込む

毎回ソースコードいじってRxSwiftのdebug仕込むのってめんどいですよね。 そこで、スクリプトを使ってLLDBから仕込めるようにしました。 流れてくるイベントを簡単にチェックするのに役に立つかもしれません。

DispatchSemaphoreで非同期処理の完了を待つ

Swiftに`async/await`がなかなかこないので書いてみました。 コールバック地獄が嫌いな人向けの記事です。

git stashされているかをシェル(zsh)に表示する

どのブランチで最後にgit stashをしたかわからなくなることがあるので、シェルに表示されるようにしてみました。 これで誤popがだいぶ減りました。 How To stashされた一覧はgit stash listで確認できます。 % git stash list stash@{0}: WIP on feature/int…