ブログ

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

60d.dev ブログを Astro + MDX に移行した

手書き HTML の index.html 競合から Astro 6 + MDX + Content Collections へ。記事ソースを astro-blog/ に一本化し、Netlify 本番に載せ替えた記録。

iOSアプリの起動白画面に4種のLaunchScreenで挑んで全滅した話

メモアプリの起動白画面を消そうと、UILaunchScreen.UIImageName・パディング画像・SwiftUI擬似スプラッシュ・LaunchScreen.storyboardの4手段を試したが、iOS 26では全滅した。pre-main計測で本当のコストを把握し、「シンプルな起動」を意図的に選んだ記録。

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

GitHub FreeプランのPrivateリポジトリではBranch Protectionが使えない。ソロの個人開発でmainを守るために、pre-commit/pre-pushフックとCursor Rulesの2重化で直コミット/直pushを封じた設計の記録。

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

タグ一覧の五十音順ソートをCFStringTransform(kCFStringTransformToLatin)で書いたら、「東京」が「dong jing」と中国語ピンインに転写された。CFStringTokenizerとja_JP localeで正しい日本語読みを得るまでの記録と、Simulator固有の罠。

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

設定画面のアカウント行で、名前やメールをタップしただけでサインアウトしてしまう事故。SwiftUIのList行にButtonが1つだけ置かれていると、SwiftUIが行全体をそのボタンのヒット領域に拡張する。.buttonStyle(.borderless)でラベル部分だけが tappable に戻る話。

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

SwiftUIのListで.swipeActionsにBoolean(role: .destructive)と.alertを組み合わせると、フルスワイプ時に行の削除アニメーションが先行して、データソースが変わらずに行がちらつく。roleを外して.tint(.red)で済ませる解決と、roleを残してよい条件の整理。

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

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

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

ブログのスタイルガイドを.cursor/rulesだけで運用していたら、記事を書くたびに文体が崩れていきました。原因を探って、rules(プロンプト)・few-shot(自分の過去記事)・lint(機械検出)の3層で役割分担する設計に組み替えた記録です。

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

ブログの半角スペース方針を見直すために主要5ガイド(JTF・記者ハンドブック・公用文・textlint・Microsoft)を調べたら、日本語出版物の標準は揃って「入れない」側でした。4対1の内訳と、60d.devを「入れる派」から「入れない派」へ試行転換した経緯。

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

AIが書いた日本語をlintで校正してもなお残る不自然さを、抽象名詞×動作動詞の直訳・同一パターンの記事内反復・短文の切断という3症状に言語化しました。文型レベルで定義しないと検出も書き換えもできない違和感の正体。

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

「この記事は AI が書いています」を記事末尾の免責文として貼るのをやめ、header バッジ / ポリシーページ / 一覧注記の 3 層構造で設計した。個人ブログに AI 開示を実装するときの判断基準と、設計→実装→ルール化までの運用記録。

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

Cursor の API 使用量が妙に多い気がして、過去 4 セッションの JSONL トランスクリプトをサブエージェントに解析させた。Glob 重複、大ファイルの往復読み、サンドボックス失敗リトライ、WebFetch ループなど具体的な無駄を 10 条のルールに落とし込んだ実践記録。

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

同一リポジトリで複数の Cursor / Claude Code セッションを並行で走らせていると、片方のブランチ切替で未コミットの変更が自動 stash される。発生条件・復旧手順・3 層の予防策(習慣・ブランチ運用・git 設定)を整理する。

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

60d Memo のビジョンは『データの所有権をユーザーに返す』。それを本当に意味あるものにするには、アラートを出すだけでは足りない。エクスポート画面に端末と Drive の件数を並べ、ズレがあれば Sync を促す UI を入れた実装記録。

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

並行ブランチで記事を書くと blog/index.html が毎回コンフリクトの温床になります。YAML にメタを分離してビルドで一覧を生成する案と、記事 18 本時点でそれを入れるべきかの判断軸(コスト/効果/踏み切るタイミング)を整理しました。

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

Xcode の String Catalog は便利なぶん、新しい Text を書くたびにビルド時に勝手に xcstrings を更新する。コミットし忘れるとサイレントなドリフトとして蓄積し、後続 PR や release prep で発覚する。この罠を踏んだ記録と、PR マージ前の 1 コマンドで防ぐ運用ルール。

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

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

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

Crashlytics を入れる前に、Xcode Organizer と App Store Connect だけでどこまで戦えるか。個人開発の iOS アプリにおける、公式ツールだけの無料クラッシュ監視体制と、Crashlytics 導入の判断基準を整理した運用メモ。

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

最初から @Attribute(.unique) を付け忘れた SwiftData モデルに、あとから一意制約を追加する方法。既存データに重複がある状態でマイグレーションを失敗させず、クラウド同期前提の設計で安全に切り替えた 3 段階の手順。

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

SwiftUI の List 内で Button(role: .destructive) を使うと、テキストは赤くなるが SF Symbol のアイコンはアクセントカラー(青)のまま。原因と対処法、Apple の設計パターンを解説。

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

メモをユーザー自身の Google ドライブに保存する iOS アプリ「60d Memo」を App Store でリリースしました。開発の経緯、設計思想、今後の展望について。

App Store 審査通過後の30分でやること

App Store の審査通過メールが届いた直後にやるべきタスクを、個人開発者の視点で時系列に整理。LP 更新、タグ、CHANGELOG、ブログ記事まで。

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

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

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

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

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

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

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

Hosting のリライト経由だと長時間処理で 502 になりやすい理由(前段の時間制限)、Functions 直 URL での回避、firebase.json と .env の対応、非同期化・App Check のメモ。

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

Twitter API v1.1 の user.status 前提で UI を組むと、SocialData の followers/list ではデータが空になりがち。公式 Example を一次ソースにする重要性と、別 API で取るときのコスト試算・プロダクト判断のメモ。

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アプリで通知が届かない原因と解決策。macOSの「通知を要約」設定の無効化と、Claude Code Hooksによる確実な通知方法を解説します。