<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>60d.dev ブログ</title><description>Web 開発、iOS、Cursor、AI 開発ワークフローなどを発信しています。</description><link>https://60d.dev/</link><item><title>60d.dev ブログを Astro + MDX に移行した</title><link>https://60d.dev/blog/astro-blog-migration-phase0/</link><guid isPermaLink="true">https://60d.dev/blog/astro-blog-migration-phase0/</guid><description>手書き HTML の index.html 競合から Astro 6 + MDX + Content Collections へ。記事ソースを astro-blog/ に一本化し、Netlify 本番に載せ替えた記録。</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate></item><item><title>iOSアプリの起動白画面に4種のLaunchScreenで挑んで全滅した話</title><link>https://60d.dev/blog/ios-launch-screen-white-flash-4-attempts/</link><guid isPermaLink="true">https://60d.dev/blog/ios-launch-screen-white-flash-4-attempts/</guid><description>メモアプリの起動白画面を消そうと、UILaunchScreen.UIImageName・パディング画像・SwiftUI擬似スプラッシュ・LaunchScreen.storyboardの4手段を試したが、iOS 26では全滅した。pre-main計測で本当のコストを把握し、「シンプルな起動」を意図的に選んだ記録。</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate></item><item><title>GitHub Pro なしでmainブランチを守る — ローカルgit hooksでBranch Protectionを代替する</title><link>https://60d.dev/blog/github-pro-free-main-branch-git-hooks/</link><guid isPermaLink="true">https://60d.dev/blog/github-pro-free-main-branch-git-hooks/</guid><description>GitHub FreeプランのPrivateリポジトリではBranch Protectionが使えない。ソロの個人開発でmainを守るために、pre-commit／pre-pushフックとCursor Rulesの2重化で直コミット／直pushを封じた設計の記録。</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate></item><item><title>iOSの五十音順ソートでCFStringTransformが使えない理由 — 漢字がピンインになる罠</title><link>https://60d.dev/blog/ios-japanese-gojuon-cfstringtokenizer/</link><guid isPermaLink="true">https://60d.dev/blog/ios-japanese-gojuon-cfstringtokenizer/</guid><description>タグ一覧の五十音順ソートをCFStringTransform(kCFStringTransformToLatin)で書いたら、「東京」が「dong jing」と中国語ピンインに転写された。CFStringTokenizerとja_JP localeで正しい日本語読みを得るまでの記録と、Simulator固有の罠。</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate></item><item><title>SwiftUIのList行にButtonが1つあると行全体がタップ領域になる — .buttonStyle(.borderless)でインラインに戻す</title><link>https://60d.dev/blog/swiftui-list-button-hit-area-borderless/</link><guid isPermaLink="true">https://60d.dev/blog/swiftui-list-button-hit-area-borderless/</guid><description>設定画面のアカウント行で、名前やメールをタップしただけでサインアウトしてしまう事故。SwiftUIのList行にButtonが1つだけ置かれていると、SwiftUIが行全体をそのボタンのヒット領域に拡張する。.buttonStyle(.borderless)でラベル部分だけが tappable に戻る話。</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate></item><item><title>SwiftUIのswipeActionsでrole: .destructiveと確認アラートを組み合わせると行がちらつく</title><link>https://60d.dev/blog/swiftui-swipeactions-role-destructive-flicker/</link><guid isPermaLink="true">https://60d.dev/blog/swiftui-swipeactions-role-destructive-flicker/</guid><description>SwiftUIのListで.swipeActionsにBoolean(role: .destructive)と.alertを組み合わせると、フルスワイプ時に行の削除アニメーションが先行して、データソースが変わらずに行がちらつく。roleを外して.tint(.red)で済ませる解決と、roleを残してよい条件の整理。</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Cursorエージェントの「宙ぶらりん作業」を防ぐ3条 — todo.mdが嘘をつく日</title><link>https://60d.dev/blog/cursor-agent-orphan-work-3-rules/</link><guid isPermaLink="true">https://60d.dev/blog/cursor-agent-orphan-work-3-rules/</guid><description>Cursorエージェントに任せた修正が、別ブランチの未コミット変更のままtodo.mdだけ[x]になっていた。作業が消えかけた事故から、ブランチ整合・完了の定義・[x]条件の3条をルール化し、rule／hook／人の確認という3層で守る設計を書き残す。</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate></item><item><title>.cursor/rulesだけでスタイルを守ろうとして崩壊した — プロンプト・few-shot・lintの3層設計</title><link>https://60d.dev/blog/cursor-rules-alone-broke-3-layers/</link><guid isPermaLink="true">https://60d.dev/blog/cursor-rules-alone-broke-3-layers/</guid><description>ブログのスタイルガイドを.cursor/rulesだけで運用していたら、記事を書くたびに文体が崩れていきました。原因を探って、rules（プロンプト）・few-shot（自分の過去記事）・lint（機械検出）の3層で役割分担する設計に組み替えた記録です。</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate></item><item><title>半角英数字の前後に半角スペースは入れるべきか — 5つのスタイルガイドが4対1で「入れない」だった話</title><link>https://60d.dev/blog/japanese-halfwidth-space-4-vs-1/</link><guid isPermaLink="true">https://60d.dev/blog/japanese-halfwidth-space-4-vs-1/</guid><description>ブログの半角スペース方針を見直すために主要5ガイド（JTF・記者ハンドブック・公用文・textlint・Microsoft）を調べたら、日本語出版物の標準は揃って「入れない」側でした。4対1の内訳と、60d.devを「入れる派」から「入れない派」へ試行転換した経緯。</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Opus 4.7が書く日本語の3症状 — 抽象名詞の直訳・列挙の反復・短文の切断</title><link>https://60d.dev/blog/opus-japanese-3-symptoms/</link><guid isPermaLink="true">https://60d.dev/blog/opus-japanese-3-symptoms/</guid><description>AIが書いた日本語をlintで校正してもなお残る不自然さを、抽象名詞×動作動詞の直訳・同一パターンの記事内反復・短文の切断という3症状に言語化しました。文型レベルで定義しないと検出も書き換えもできない違和感の正体。</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate></item><item><title>AI 主体で書くブログの開示は免責ではなく UX 設計だった — 3 層構造と CSS 10 行で作る読者との信頼</title><link>https://60d.dev/blog/ai-authored-blog-disclosure-design/</link><guid isPermaLink="true">https://60d.dev/blog/ai-authored-blog-disclosure-design/</guid><description>「この記事は AI が書いています」を記事末尾の免責文として貼るのをやめ、header バッジ / ポリシーページ / 一覧注記の 3 層構造で設計した。個人ブログに AI 開示を実装するときの判断基準と、設計→実装→ルール化までの運用記録。</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Cursor エージェントの無駄なツール呼び出しを減らす 10 のルール — 自分のトランスクリプトを AI に解析させた記録</title><link>https://60d.dev/blog/cursor-agent-efficiency-10-rules/</link><guid isPermaLink="true">https://60d.dev/blog/cursor-agent-efficiency-10-rules/</guid><description>Cursor の API 使用量が妙に多い気がして、過去 4 セッションの JSONL トランスクリプトをサブエージェントに解析させた。Glob 重複、大ファイルの往復読み、サンドボックス失敗リトライ、WebFetch ループなど具体的な無駄を 10 条のルールに落とし込んだ実践記録。</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Cursor を複数走らせると git stash が勝手に増え続ける — 並行 AI エージェントの working tree 事故と中間コミット運用</title><link>https://60d.dev/blog/cursor-parallel-agents-stash-recovery/</link><guid isPermaLink="true">https://60d.dev/blog/cursor-parallel-agents-stash-recovery/</guid><description>同一リポジトリで複数の Cursor / Claude Code セッションを並行で走らせていると、片方のブランチ切替で未コミットの変更が自動 stash される。発生条件・復旧手順・3 層の予防策（習慣・ブランチ運用・git 設定）を整理する。</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate></item><item><title>「データの所有権」を謳うアプリで、端末と Drive の件数ズレをユーザー自身が確認できる UI を作った</title><link>https://60d.dev/blog/data-ownership-count-drift-ui/</link><guid isPermaLink="true">https://60d.dev/blog/data-ownership-count-drift-ui/</guid><description>60d Memo のビジョンは『データの所有権をユーザーに返す』。それを本当に意味あるものにするには、アラートを出すだけでは足りない。エクスポート画面に端末と Drive の件数を並べ、ズレがあれば Sync を促す UI を入れた実装記録。</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate></item><item><title>手書き HTML ブログの index.html 競合から逃げる — 記事メタを YAML に分離して一覧を自動生成するかの判断</title><link>https://60d.dev/blog/static-blog-index-autogen-from-yaml/</link><guid isPermaLink="true">https://60d.dev/blog/static-blog-index-autogen-from-yaml/</guid><description>並行ブランチで記事を書くと blog/index.html が毎回コンフリクトの温床になります。YAML にメタを分離してビルドで一覧を生成する案と、記事 18 本時点でそれを入れるべきかの判断軸（コスト／効果／踏み切るタイミング）を整理しました。</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Xcode が黙って更新する Localizable.xcstrings のドリフト — PR マージ前に必須の 1 コマンド</title><link>https://60d.dev/blog/xcode-xcstrings-silent-drift/</link><guid isPermaLink="true">https://60d.dev/blog/xcode-xcstrings-silent-drift/</guid><description>Xcode の String Catalog は便利なぶん、新しい Text を書くたびにビルド時に勝手に xcstrings を更新する。コミットし忘れるとサイレントなドリフトとして蓄積し、後続 PR や release prep で発覚する。この罠を踏んだ記録と、PR マージ前の 1 コマンドで防ぐ運用ルール。</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate></item><item><title>60dメモの設定画面を3観点でリファクタ — サブタイトルの色、CTA の定義、情報階層</title><link>https://60d.dev/blog/60d-memo-settings-list-color-refactor/</link><guid isPermaLink="true">https://60d.dev/blog/60d-memo-settings-list-color-refactor/</guid><description>設定画面のサブタイトルが赤く滲む謎から、SwiftUI の Button tint 伝播、List 行の配色ルール、CTA の定義、冗長なセクションの統合までを一気通貫で整理した記録。</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate></item><item><title>個人開発の iOS アプリで Crashlytics を使わずクラッシュを監視する</title><link>https://60d.dev/blog/indie-ios-crash-monitoring-without-crashlytics/</link><guid isPermaLink="true">https://60d.dev/blog/indie-ios-crash-monitoring-without-crashlytics/</guid><description>Crashlytics を入れる前に、Xcode Organizer と App Store Connect だけでどこまで戦えるか。個人開発の iOS アプリにおける、公式ツールだけの無料クラッシュ監視体制と、Crashlytics 導入の判断基準を整理した運用メモ。</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate></item><item><title>SwiftData で @Attribute(.unique) を後から追加する</title><link>https://60d.dev/blog/swiftdata-attribute-unique-after-the-fact/</link><guid isPermaLink="true">https://60d.dev/blog/swiftdata-attribute-unique-after-the-fact/</guid><description>最初から @Attribute(.unique) を付け忘れた SwiftData モデルに、あとから一意制約を追加する方法。既存データに重複がある状態でマイグレーションを失敗させず、クラウド同期前提の設計で安全に切り替えた 3 段階の手順。</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate></item><item><title>SwiftUI の Button(role: .destructive) は List 内で SF Symbol を赤くしない</title><link>https://60d.dev/blog/swiftui-destructive-button-sf-symbol-color/</link><guid isPermaLink="true">https://60d.dev/blog/swiftui-destructive-button-sf-symbol-color/</guid><description>SwiftUI の List 内で Button(role: .destructive) を使うと、テキストは赤くなるが SF Symbol のアイコンはアクセントカラー（青）のまま。原因と対処法、Apple の設計パターンを解説。</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate></item><item><title>60d Memo v1.0 を App Store でリリースしました</title><link>https://60d.dev/blog/60d-memo-v1-released/</link><guid isPermaLink="true">https://60d.dev/blog/60d-memo-v1-released/</guid><description>メモをユーザー自身の Google ドライブに保存する iOS アプリ「60d Memo」を App Store でリリースしました。開発の経緯、設計思想、今後の展望について。</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate></item><item><title>App Store 審査通過後の30分でやること</title><link>https://60d.dev/blog/after-app-store-approval/</link><guid isPermaLink="true">https://60d.dev/blog/after-app-store-approval/</guid><description>App Store の審査通過メールが届いた直後にやるべきタスクを、個人開発者の視点で時系列に整理。LP 更新、タグ、CHANGELOG、ブログ記事まで。</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Cursor Rules は PR ごとに進化する — ルール肥大化問題と運用の工夫</title><link>https://60d.dev/blog/cursor-rules-evolve-per-pr/</link><guid isPermaLink="true">https://60d.dev/blog/cursor-rules-evolve-per-pr/</guid><description>Cursor Rules を書き続けると必ず肥大化する。CHANGELOG 陳腐化や重複の実例から、PR ごとの更新、定期棚卸し、TL;DR 化などの運用ルールまで、個人開発での実践を記録する。</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate></item><item><title>個人開発 iOS アプリの Privacy Manifest 対応チェックリスト</title><link>https://60d.dev/blog/ios-privacy-manifest-guide/</link><guid isPermaLink="true">https://60d.dev/blog/ios-privacy-manifest-guide/</guid><description>iOS 17 以降で必須化された Privacy Manifest への対応手順を、個人開発の視点で具体的にまとめる。Required Reason API、OSLog のプライバシー指定、第三者 SDK の確認まで。v1.0 審査通過の実例付き。</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate></item><item><title>カルーセルの自動再生を DevTools から止める JS スニペット集</title><link>https://60d.dev/blog/stop-carousel-autoplay-devtools/</link><guid isPermaLink="true">https://60d.dev/blog/stop-carousel-autoplay-devtools/</guid><description>Studio 公開サイトなどでカルーセルが動き続けて検証しづらいとき、コンソールに貼るだけで止められる JavaScript スニペットをまとめました。</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Firebase Hosting + Cloud Functions で 502 Bad Gateway が出たときの切り分けと対処法</title><link>https://60d.dev/blog/firebase-hosting-long-running-api-502/</link><guid isPermaLink="true">https://60d.dev/blog/firebase-hosting-long-running-api-502/</guid><description>Hosting のリライト経由だと長時間処理で 502 になりやすい理由（前段の時間制限）、Functions 直 URL での回避、firebase.json と .env の対応、非同期化・App Check のメモ。</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate></item><item><title>SocialData APIの罠：フォロワー一覧に「最新ツイート」が含まれない問題と対処法</title><link>https://60d.dev/blog/socialdata-followers-list-no-status/</link><guid isPermaLink="true">https://60d.dev/blog/socialdata-followers-list-no-status/</guid><description>Twitter API v1.1 の user.status 前提で UI を組むと、SocialData の followers/list ではデータが空になりがち。公式 Example を一次ソースにする重要性と、別 API で取るときのコスト試算・プロダクト判断のメモ。</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate></item><item><title>AIコーディングで同じ失敗を繰り返さないために：Google Drive API と Xcode Cloud の教訓</title><link>https://60d.dev/blog/ai-coding-lessons-drive-api-xcode-cloud/</link><guid isPermaLink="true">https://60d.dev/blog/ai-coding-lessons-drive-api-xcode-cloud/</guid><description>AI コーディングツールが自信満々に間違える問題にどう対処するか。Google Drive API の 403 エラーと Xcode Cloud のビルド番号管理で得た教訓と、ドキュメントを先に学ばせる仕組みの導入記録。</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Cursor × iOSアプリ開発：クラッシュ修正からCI構築まで、AIと進めた1日の記録</title><link>https://60d.dev/blog/cursor-ios-development-workflow/</link><guid isPermaLink="true">https://60d.dev/blog/cursor-ios-development-workflow/</guid><description>CursorのAIエージェントを活用し、iOSアプリのクラッシュ修正、Google Drive同期の堅牢化、GitHub Actions CI構築、UI改善までを1日で進めた記録。実際のワークフローと得られた教訓をまとめます。</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Claude Desktopの通知が来ない？ macOSの設定とClaude Code Hooksで解決する方法</title><link>https://60d.dev/blog/claude-notification-setup/</link><guid isPermaLink="true">https://60d.dev/blog/claude-notification-setup/</guid><description>Claude Desktopアプリで通知が届かない原因と解決策。macOSの「通知を要約」設定の無効化と、Claude Code Hooksによる確実な通知方法を解説します。</description><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate></item></channel></rss>