しおメモ

雑多な技術系ブログです。

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…

Xcodeのビルド時間をキレずに改善する

Xcode10でNew Build Systemになってから、全体的にビルド時間は短くなりました。 しかし、それでも諸々の原因によりビルドがめちゃくちゃ遅い場合があります。 そんな場合でも、キレずに冷静に改善する方法紹介します。 ビルド時間の計測方法 ビルド設定の見…

RxSwiftのSchedulerの実装を読んだ

少し前に、RxSwift5のSchedulerの実装を読んでみたので、初めての読んだ系記事です。 概要 observeOnとsubscribeOn Serial/Concurrent Scheduler 主な組み込みのスケジューラー MainScheduler ConcurrentMainScheduler SerialDispatchQueueScheduler Concurr…

XcodeのLLDBデバッグでよく使う技

若干話題になって出尽くしてる感がありますが、XcodeのLLDBを絡めたデバッグでよく使う手法をまとめてみました。 特定の行をスキップ 特定の行を書き換える ブレークポイントをon/offする アドレスからオブジェクトに戻して変数に格納する 組み込みメソッド…

Swiftのメソッドごとのコンパイル時間を表示するワンライナー

忙しい人向けに、.xcactivitylogからメソッドのコンパイル時間を抽出するワンライナーです。 gunzip -c -S .xcactivitylog hoge.xcactivitylog | perl -pe "s/\r/\n/g" | grep -E "^\d+\.\d+ms" | sort -nr | uniq | head -100 中身はただのgzipですが、\rが…

NimbleのPredicateの自作方法とサンプル

Nimbleでテストを書いていた際に、共通部分を`Predicate`として自作してまとめたいことがあったので、実装の方法と簡単なサンプルを記しておきます。

転職活動のお話

転職してから1ヶ月たったので、書いてみます。 サイト名は出さないつもりなので、書いても何ももらえないやつです なぜ転職したか いろいろ理由はありましたが、一言で言うと当時の環境に何も魅力を感じられませんでした。 See also: ランボー怒りの退職エン…

git push前にrebaseをリマインドする

あとからコミットメッセージ書きたいとか、rebase前提でとりあえず細かくcommit切りたいときに、雑にtempとかWIPとか書いて忘れそうになるので、hooksのpre-pushに警告をいれてみることにしました。 やり方 master pushを防ぐのとほぼ同じです。 masterへのp…

ターミナルからワンライナーでGitHubのもろもろを開く

ターミナルからGitHubのもろもろを開く git管理下のディレクトリにいる時に、もろもろのよく使うページを開くワンライナーでエイリアスを作ってみました。 はじめに 説明に便利なので、ブラウザの立ち上げにmacのopenコマンドをつかっていますが、他のOSの場…

UIView.animateをメソッドチェーンで書く

UIView.animateは引数が多く、animationとcompletionで2つクロージャーを引数に取り、ネストも深くなりやすいため、メソッドチェーンで書けるように改良してみました。 サンプル 実装 AnimationBuilder AnimationExecutor アニメーション開始用のstaticメソ…

I'm gonna quit my job

今月、今勤めているWeb企業を退職します。 特に伝えたいことがあるわけではないのですが、このタイミングで何か残しておくと、自分にとっても今後のヒントにもなるかと思いました。 業務内容はこんな感じでした。

.gitignoreをGitHub公式からとってくるシェルスクリプト

curlで取ってくるだけですが、シェルから取れると便利なので割とよく使っています。 github.com このGitHubのリポジトリ(わかりづらい)のrawから取ってきます。 こちらは、CC0ライセンスらしいです。 スクリプト .bashrcやら.zshrcに置く。 gign() { cp .git…

Nuxtでimgのsrc属性をJSから設定する場合の注意点

assetsの画像を読む際に、template内のimgタグに直接記述するのではなく、スクリプト側の変数を利用してsrcを設定する際、~などがうまく意図したパスに変換されないことがあります。 例 このようにした場合、上のimgタグは適切なパスを参照するのに対し、下…

ターミナルでXcodeのデバッグログを見れるようにした

前にファイル出力できるロガーをつくっていたので、ターミナルで見やすいようにちょこっと改良してみました。 Xcodeのウィンドウでは色がつけられなくなってしまったので、出てきたものにPerlで色を付けています(ゴリ押し)。

Swiftのassert系メソッドとfatalErrorの使い方

Swiftには、assertと似た役割を持つメソッドとして、preconditionやfatalErrorがあります。 これらのメソッドの使い方について考えてみます。

今さらUIPageViewController詳解

UIPageViewControllerが登場したのが古いこともあり、公式ドキュメントや、ネットに出ているの情報だと、いまいち各メソッドの挙動までは掴みづらかったので、改めてまとめてみました。