ブログ

このブログの記事はほとんど AI で生成しています(題材・検証・最終判断は筆者)。詳しくは AI 活用方針 をご覧ください。

iOSアプリの起動白画面に4種のLaunchScreenで挑んで全滅した話 — 計測して「シンプルな起動」を選んだ理由

メモアプリのwhite flashをなくそうと、UILaunchScreen.UIImageName・パディング画像・SwiftUI擬似スプラッシュ・LaunchScreen.storyboardの4手段を試したがiOS 26では全滅した。DYLD_PRINT_STATISTICSとInstrumentsでpre-main/post-mainを計測し、「LaunchScreenで埋める」のではなく「切り替わりを知覚させない」シンプルな起動を意図的に選んだ記録。

GitHub Proなしでmainブランチを守る — ローカルgit hooksでBranch Protectionを代替する

GitHub FreeのPrivateリポジトリではBranch Protectionが使えない。並行で動くCursorエージェントがmainに直コミットを積み重ねる問題を、pre-commitpre-push・ルール条文の3段構えで封じた設計の記録。worktreeを跨いでフックを効かせるgit rev-parse --git-common-dirの使い方まで。

SwiftUIのswipeActionsでrole: .destructiveと確認アラートを組み合わせると行がちらつく

フルスワイプの削除アニメーションが確認アラートより先に走って、行が消えかけて戻る。roleを外して.tint(.red)で色だけ付ける解決と、roleを残してよい条件(タップからデータ変更までに別のUIが挟まらない場合)の切り分け。

iOSの五十音順ソートでCFStringTransformが使えない理由 — 漢字がピンインになる罠

「東京」が「dong jing」と簡体字中国語ピンインに転写される原因を、CFStringTokenizerja_JP localeで直した記録。ASCII文字列の早期リターン、Simulator固有の優先言語設定の罠、NSCacheによるsortKeyメモ化まで。

SwiftUIのList行にButtonが1つあると行全体がタップ領域になる — .buttonStyle(.borderless)でインラインに戻す

名前の部分をタップしただけでサインアウトしてしまう事故。Listの行にButtonが1つだけあると行全体がヒット領域になる挙動を.buttonStyle(.borderless)で戻す話と、VoiceOverのフォーカスリングでタップ領域を確かめる習慣。

Cursorエージェントの「宙ぶらりん作業」を防ぐ3条 — todo.mdが嘘をつく日

Cursorエージェントに任せた修正が、別ブランチの未コミット変更のままtodo.mdだけ[x]になっていた。作業が消えかけた事故から、ブランチ整合・完了の定義・[x]条件の3条をルール化し、rule/hook/人の確認という3層で守る設計を書き残す。

.cursor/rulesだけでスタイルを守ろうとして崩壊した — プロンプト・few-shot・lintの3層設計

ブログの文体ルールを.cursor/rules/blog-writing-style.mdcだけで守ろうとしたら、ルールを足すほど違反が増える逆転状態になった。長大化・抽象ルールの解釈揺れ・モデルの初期化バイアスという3つの失敗モードを分解し、プロンプト/few-shot/lintの3層で役割分担する設計に組み替えた記録。

Opus 4.7が書く日本語の3症状 — 抽象名詞の直訳・列挙の反復・短文の切断

AIが書いた日本語をlintで校正しても、語彙単位では拾えない違和感が残った。抽象名詞×動作動詞の直訳・同一パターンの記事内反復・短文の切断という3症状に言語化し、書き直し例とスタイルガイド/セルフチェック/リライトの3層対策までまとめた記録。

半角英数字の前後に半角スペースは入れるべきか — 5つのスタイルガイドが4対1で「入れない」だった話

ブログの半角スペース方針を見直すために主要5ガイド(JTF・記者ハンドブック・公用文・textlint・Microsoft)を調べたら、日本語出版物の標準は揃って「入れない」側だった。Web技術ブログの主流が英語タイポグラフィの輸入だったという発見と、60d.devを「入れる派」から「入れない派」へ試行転換した経緯・移行戦略。

手書き HTML ブログの index.html 競合から逃げる — 記事メタを YAML に分離して一覧を自動生成するかの判断

並行ブランチで記事を書くと blog/index.html が毎回コンフリクトの温床になる。YAML にメタを分離してビルドで一覧を生成する案と、記事 18 本時点でそれを入れるべきかの判断軸(記事数・コンフリクト頻度・追加忘れ回数・横断変更コスト)を整理する。

Cursor を複数走らせると git stash が勝手に増え続ける — 並行 AI エージェントの working tree 事故と中間コミット運用

複数の Cursor / Claude Code セッションを同じリポジトリで並行させると、ブランチ切替に連動して未コミットの変更が自動 stash され作業が飛ぶ。復旧手順と、習慣・ブランチ運用・`rerere` の 3 層予防策、根本解決としての `git worktree` とエージェントへの状態宣言強制まで整理する。

AI 主体で書くブログの開示は免責ではなく UX 設計だった — 3 層構造と CSS 10 行で担保する読者との信頼

「この記事は AI が書いています」を記事末尾の免責文として貼るのをやめ、header バッジ / 専用ポリシーページ / 一覧注記の 3 層構造で設計した。どこに置かなかったか・CSS 10 行でどう静かに見せるか・Cursor Rules にルール化して運用に組み込むまで。

Xcode が黙って更新する Localizable.xcstrings のドリフト — PR マージ前に必須の 1 コマンド

String Catalog の自動抽出は便利だが、ビルド時に xcstrings が静かに書き換わり、コミットし忘れがドリフトとして蓄積する。v1.0.1 release prep で踏んだ実例と、1 コマンドで防ぐ運用、pre-commit hook の現実的な落としどころまで。

「データの所有権」を謳うアプリで、端末と Drive の件数ズレをユーザー自身が確認できる UI を作った

ビジョンを UI に落とし込む話。エクスポート画面に端末と Drive の件数を並べ、ズレていれば数字も色も変わるようにした。index.json だけで Drive 件数を集計するテクニックと、件数表示は一画面に集約する IA 原則までまとめた記録。

Cursor エージェントの無駄なツール呼び出しを減らす 10 のルール — 自分のトランスクリプトを AI に解析させた記録

過去 4 セッションの JSONL をサブエージェントに読ませて、Glob 重複・大ファイル往復読み・サンドボックス失敗リトライ・WebFetch ループなどの無駄パターンを抽出。ルール 10 条と「文書・hook・環境」の3層で守る話まで。

60dメモの設定画面を3観点でリファクタ — サブタイトルの色、CTA の定義、情報階層

サブタイトルが赤く滲む謎から、SwiftUI の Button tint 伝播、List 行の配色ルール、CTA の定義、冗長なセクションの統合までを一気通貫で整理した記録。

SwiftData で @Attribute(.unique) を後から追加する

最初から付け忘れた一意制約を、既存データの重複を壊さずに追加するには。CloudKit と併用できない理由、マイグレーション失敗が怖い理由、クラウド同期前提の 3 段階ロールアウトで切り抜けた記録。

個人開発の iOS アプリで Crashlytics を使わずクラッシュを監視する

Xcode Organizer と App Store Connect だけで組む、無料のクラッシュ監視体制。重大度の判定基準、ホットフィックス フロー、Crashlytics を後から入れる判断基準までまとめた運用メモ。

SwiftUI の Button(role: .destructive) は List 内で SF Symbol を赤くしない

テキストは赤いのにアイコンだけ青い。symbolRenderingMode を変えても、シンボルを変えても直らない原因と対処法、Apple の設計パターンを解説。

Cursor Rules は PR ごとに進化する — ルール肥大化問題と運用の工夫

Cursor Rules を書き続けると必ず肥大化する。CHANGELOG 陳腐化や重複の実例から、PR ごとの更新、定期棚卸し、TL;DR 化などの運用ルールまで、個人開発での実践記録。(Cursor × iOS 開発シリーズ完結編)

個人開発 iOS アプリの Privacy Manifest 対応チェックリスト

iOS 17 以降で必須化された Privacy Manifest への対応手順を、個人開発の視点で具体的にまとめる。Required Reason API、OSLog のプライバシー指定、第三者 SDK の確認まで。v1.0 審査通過の実例付き。

App Store 審査通過後の30分でやること — 個人開発 iOS アプリのリリース後段取り

審査通過メールが届いた直後にやるべきタスクを、個人開発者の視点で時系列に整理。LP 更新、タグ、CHANGELOG、ブログ記事まで。2回目以降はルール化して AI に任せる。

60d Memo v1.0 を App Store でリリースしました

メモをユーザー自身の Google ドライブに保存する iOS アプリ「60d Memo」をリリース。データの所有権をユーザーに返すという設計思想、技術スタック、AI と一緒に開発した経緯について。

カルーセルの自動再生を DevTools から止める JS スニペット集

Studio 公開サイトなどでカルーセルが動き続けて検証しづらいとき、コンソールに貼るだけで止められる JavaScript スニペットまとめ。

Firebase Hosting + Cloud Functions で 502 Bad Gateway が出たときの切り分けと対処法

前段(Hosting)と後段(Functions)のタイムアウトの違い、直 URL・環境変数・CORS、非同期ジョブ化と App Check のメモ、デプロイログの扱い。

SocialData APIの罠:フォロワー一覧に「最新ツイート」が含まれない問題と対処法

v1.1 の status 前提とレスポンス仕様のズレ、公式 Example を一次ソースにする話、別エンドポイント時のコスト試算とオンデマンド/列廃止の判断メモ。

AIコーディングで同じ失敗を繰り返さないために:Google Drive API と Xcode Cloud の教訓

AI コーディングツールが自信満々に間違える問題にどう対処するか。Google Drive API の 403 エラーと Xcode Cloud のビルド番号管理で得た教訓と、ドキュメントを先に学ばせる仕組みの導入記録。

Cursor × iOSアプリ開発:クラッシュ修正からCI構築まで、AIと進めた1日の記録

CursorのAIエージェントを活用し、iOSアプリのクラッシュ修正、Google Drive同期の堅牢化、GitHub Actions CI構築、UI改善までを1日で進めた記録。

Claude Desktopの通知が来ない? macOSの設定とClaude Code Hooksで解決する方法

Claude Desktopアプリの通知が届かない原因と、Claude Code Hooksを使った確実な解決方法を紹介します。