60d.dev ブログを Astro + MDX に移行した
手書き HTML の index.html 競合から Astro 6 + MDX + Content Collections へ。記事ソースを astro-blog/ に一本化し、Netlify 本番に載せ替えた記録。
このブログの記事はほとんど AI で生成しています(題材・検証・最終判断は筆者)。詳しくは AI 活用方針 をご覧ください。
手書き HTML の index.html 競合から Astro 6 + MDX + Content Collections へ。記事ソースを astro-blog/ に一本化し、Netlify 本番に載せ替えた記録。
メモアプリの起動白画面を消そうと、UILaunchScreen.UIImageName・パディング画像・SwiftUI擬似スプラッシュ・LaunchScreen.storyboardの4手段を試したが、iOS 26では全滅した。pre-main計測で本当のコストを把握し、「シンプルな起動」を意図的に選んだ記録。
GitHub FreeプランのPrivateリポジトリではBranch Protectionが使えない。ソロの個人開発でmainを守るために、pre-commit/pre-pushフックとCursor Rulesの2重化で直コミット/直pushを封じた設計の記録。
タグ一覧の五十音順ソートをCFStringTransform(kCFStringTransformToLatin)で書いたら、「東京」が「dong jing」と中国語ピンインに転写された。CFStringTokenizerとja_JP localeで正しい日本語読みを得るまでの記録と、Simulator固有の罠。
設定画面のアカウント行で、名前やメールをタップしただけでサインアウトしてしまう事故。SwiftUIのList行にButtonが1つだけ置かれていると、SwiftUIが行全体をそのボタンのヒット領域に拡張する。.buttonStyle(.borderless)でラベル部分だけが tappable に戻る話。
SwiftUIのListで.swipeActionsにBoolean(role: .destructive)と.alertを組み合わせると、フルスワイプ時に行の削除アニメーションが先行して、データソースが変わらずに行がちらつく。roleを外して.tint(.red)で済ませる解決と、roleを残してよい条件の整理。
Cursorエージェントに任せた修正が、別ブランチの未コミット変更のままtodo.mdだけ[x]になっていた。作業が消えかけた事故から、ブランチ整合・完了の定義・[x]条件の3条をルール化し、rule/hook/人の確認という3層で守る設計を書き残す。
ブログのスタイルガイドを.cursor/rulesだけで運用していたら、記事を書くたびに文体が崩れていきました。原因を探って、rules(プロンプト)・few-shot(自分の過去記事)・lint(機械検出)の3層で役割分担する設計に組み替えた記録です。
ブログの半角スペース方針を見直すために主要5ガイド(JTF・記者ハンドブック・公用文・textlint・Microsoft)を調べたら、日本語出版物の標準は揃って「入れない」側でした。4対1の内訳と、60d.devを「入れる派」から「入れない派」へ試行転換した経緯。
AIが書いた日本語をlintで校正してもなお残る不自然さを、抽象名詞×動作動詞の直訳・同一パターンの記事内反復・短文の切断という3症状に言語化しました。文型レベルで定義しないと検出も書き換えもできない違和感の正体。
「この記事は AI が書いています」を記事末尾の免責文として貼るのをやめ、header バッジ / ポリシーページ / 一覧注記の 3 層構造で設計した。個人ブログに AI 開示を実装するときの判断基準と、設計→実装→ルール化までの運用記録。
Cursor の API 使用量が妙に多い気がして、過去 4 セッションの JSONL トランスクリプトをサブエージェントに解析させた。Glob 重複、大ファイルの往復読み、サンドボックス失敗リトライ、WebFetch ループなど具体的な無駄を 10 条のルールに落とし込んだ実践記録。
同一リポジトリで複数の Cursor / Claude Code セッションを並行で走らせていると、片方のブランチ切替で未コミットの変更が自動 stash される。発生条件・復旧手順・3 層の予防策(習慣・ブランチ運用・git 設定)を整理する。
60d Memo のビジョンは『データの所有権をユーザーに返す』。それを本当に意味あるものにするには、アラートを出すだけでは足りない。エクスポート画面に端末と Drive の件数を並べ、ズレがあれば Sync を促す UI を入れた実装記録。
並行ブランチで記事を書くと blog/index.html が毎回コンフリクトの温床になります。YAML にメタを分離してビルドで一覧を生成する案と、記事 18 本時点でそれを入れるべきかの判断軸(コスト/効果/踏み切るタイミング)を整理しました。
Xcode の String Catalog は便利なぶん、新しい Text を書くたびにビルド時に勝手に xcstrings を更新する。コミットし忘れるとサイレントなドリフトとして蓄積し、後続 PR や release prep で発覚する。この罠を踏んだ記録と、PR マージ前の 1 コマンドで防ぐ運用ルール。
設定画面のサブタイトルが赤く滲む謎から、SwiftUI の Button tint 伝播、List 行の配色ルール、CTA の定義、冗長なセクションの統合までを一気通貫で整理した記録。
Crashlytics を入れる前に、Xcode Organizer と App Store Connect だけでどこまで戦えるか。個人開発の iOS アプリにおける、公式ツールだけの無料クラッシュ監視体制と、Crashlytics 導入の判断基準を整理した運用メモ。
最初から @Attribute(.unique) を付け忘れた SwiftData モデルに、あとから一意制約を追加する方法。既存データに重複がある状態でマイグレーションを失敗させず、クラウド同期前提の設計で安全に切り替えた 3 段階の手順。
SwiftUI の List 内で Button(role: .destructive) を使うと、テキストは赤くなるが SF Symbol のアイコンはアクセントカラー(青)のまま。原因と対処法、Apple の設計パターンを解説。
メモをユーザー自身の Google ドライブに保存する iOS アプリ「60d Memo」を App Store でリリースしました。開発の経緯、設計思想、今後の展望について。
App Store の審査通過メールが届いた直後にやるべきタスクを、個人開発者の視点で時系列に整理。LP 更新、タグ、CHANGELOG、ブログ記事まで。
Cursor Rules を書き続けると必ず肥大化する。CHANGELOG 陳腐化や重複の実例から、PR ごとの更新、定期棚卸し、TL;DR 化などの運用ルールまで、個人開発での実践を記録する。
iOS 17 以降で必須化された Privacy Manifest への対応手順を、個人開発の視点で具体的にまとめる。Required Reason API、OSLog のプライバシー指定、第三者 SDK の確認まで。v1.0 審査通過の実例付き。
Studio 公開サイトなどでカルーセルが動き続けて検証しづらいとき、コンソールに貼るだけで止められる JavaScript スニペットをまとめました。
Hosting のリライト経由だと長時間処理で 502 になりやすい理由(前段の時間制限)、Functions 直 URL での回避、firebase.json と .env の対応、非同期化・App Check のメモ。
Twitter API v1.1 の user.status 前提で UI を組むと、SocialData の followers/list ではデータが空になりがち。公式 Example を一次ソースにする重要性と、別 API で取るときのコスト試算・プロダクト判断のメモ。
AI コーディングツールが自信満々に間違える問題にどう対処するか。Google Drive API の 403 エラーと Xcode Cloud のビルド番号管理で得た教訓と、ドキュメントを先に学ばせる仕組みの導入記録。
CursorのAIエージェントを活用し、iOSアプリのクラッシュ修正、Google Drive同期の堅牢化、GitHub Actions CI構築、UI改善までを1日で進めた記録。実際のワークフローと得られた教訓をまとめます。
Claude Desktopアプリで通知が届かない原因と解決策。macOSの「通知を要約」設定の無効化と、Claude Code Hooksによる確実な通知方法を解説します。