◉RORK LABEN
●GPT6.1 — Rork のモデルメニューに GPT-6.1 Sol が加わりました(9月29日)。GPT-6 Sol と同価格で、1M トークンの文脈を読みます●10/12 — React Native 0.88.x の正式リリース予定まで残り6日。Expo SDK 58 安定版はその後で、Expo Go の更新で SDK 57 のサポートが落ちます●CRYPTO — expo-crypto の digest() が、TypeScript 上は ArrayBuffer を受けるのに Android のネイティブ側は TypedArray を求める、という Issue が出ています(修正 PR あり)●NEW — モデルメニューの入れ替わりを3種類に分けて、クレジットの行き先を台帳に残します●SDK58 — SDK 58 の安定版の日付は、昨日の確認時点ではまだ出ていませんでした●SHEET — expo-ui の BottomSheet で presentationBackground の素材が平らで不透明に描かれる、という報告が出ています●GPT6.1 — Rork のモデルメニューに GPT-6.1 Sol が加わりました(9月29日)。GPT-6 Sol と同価格で、1M トークンの文脈を読みます●10/12 — React Native 0.88.x の正式リリース予定まで残り6日。Expo SDK 58 安定版はその後で、Expo Go の更新で SDK 57 のサポートが落ちます●CRYPTO — expo-crypto の digest() が、TypeScript 上は ArrayBuffer を受けるのに Android のネイティブ側は TypedArray を求める、という Issue が出ています(修正 PR あり)●NEW — モデルメニューの入れ替わりを3種類に分けて、クレジットの行き先を台帳に残します●SDK58 — SDK 58 の安定版の日付は、昨日の確認時点ではまだ出ていませんでした●SHEET — expo-ui の BottomSheet で presentationBackground の素材が平らで不透明に描かれる、という報告が出ています
記事一覧/開発ツール
⬡ 開発ツール/2026-08-22上級

一括置換は全ファイル成功しました。壊れたのは、消さなかった行のほうです

生成コードに一括置換をかけると、一致した行ではなく隣の行が壊れます。運用中のプロジェクトで実際に起きた破損と、置換の不変条件を検査する20行のガードスクリプトをまとめました。

Rork575Expo212React Native238リファクタリング5運用9

✦ プレミアム記事

運営している技術サイトの記事ファイルから、アフィリエイトの定型誘導文をまとめて削除しました。行を指定して消すだけの、sed 一行で済む作業です。終了コードは 0。差分を眺めて、消えるべき行が消えたことも確認しました。

破損に気づいたのは、それから数週間後です。

しかも、壊れていたのは私が消した行ではありませんでした。

全件成功したあとに、後から見つかったもの

同じリポジトリの記事ファイル 975 本を、いまあらためて機械的に検査した結果が次の表です。すべて、あの一括削除より後に混入したものです。

検出した症状件数原因
本文が文の途中で終わっている36 本削除対象の直前にあった導入句だけが残った
見出しは残っているのに中身が空48 本見出しの下の段落だけが削除条件に一致した
コードブロックが閉じていない2 本閉じる側のフェンスが削除範囲に入った
本文に \ + ! のエスケープが残存36 本別の一括書き込みで混入し、そのまま気づかれなかった

48 本の「空の見出し」は、全部が同じ文言の見出しでした。段落を消す条件が、たまたまその見出しの直下だけに当たっていたわけです。見出しが残っているので、目次にも記事一覧にも普通に出てきます。開いて初めて何もないと分かります。

いちばん堪えたのは、この 4 種類のどれも、置換した瞬間には一切の兆候を出さなかったことです。

同じ1行の削除が、ファイルによって3通りに分かれます

この構造を最小の形で再現しました。Rork が出力するような Expo プロジェクトの断片を 4 つ用意して、legacy を含む行を消すだけの置換をかけます。実際にコードを整理するとき、誰もが一度は書く条件です。

for f in src/PaywallScreen.tsx src/LegacyBanner.tsx src/useCredits.ts locales/ja.json; do
  sed -i '/legacy/Id' "$f"; echo "$f exit=$?"
done

結果はこうなりました。

src/PaywallScreen.tsx exit=0
src/LegacyBanner.tsx  exit=0
src/useCredits.ts     exit=0
locales/ja.json       exit=0

なお、この sed -i は GNU sed の書き方です。macOS に入っている sed は -i に拡張子の引数を必ず要求するので、sed -i '' '/legacy/Id' "$f" のように空文字列を添えないと、そもそも実行の時点で止まります。私は自宅の iMac と Linux のコンテナを行き来していて、この一文字の違いに何度か手を止められてきました。止まってくれるだけまだ親切で、この記事で扱うのは止まらないほうの失敗です。

4 ファイルすべて成功です。ところが中身は 3 通りに分かれていました。

無害だったもの — PaywallScreen.tsx の該当行は単なる // TODO: legacy analytics のコメントで、消えても何も起きません。

コンポーネントごと消えたもの — LegacyBanner.tsx は、スタイルオブジェクトの内側にこう書かれていました。

    <View
      style={{
        // legacy spacing, keep until redesign
        padding: 12,
      }}
    />

消えたのはコメント 1 行だけです。それなのに、このファイルは中括弧の対応が 1 つ足りない状態になりました。理由は単純で、削除条件の大文字小文字を無視する指定(I)が、ファイル名由来の識別子 LegacyBanner を含む export function LegacyBanner() { の行にも当たっていたからです。開き括弧を持つ行が消え、閉じ括弧だけが残りました。

データとして壊れたもの — locales/ja.json が最悪でした。

{
  "paywall.title": "すべての機能を解放",
  "paywall.cta": "続ける",
}

末尾のキーが消えて、その手前の行のカンマが取り残されています。TypeScript ならビルド時に落ちますが、JSON は import の仕方によっては実行時まで露見しません。i18n の辞書やテーマ定義、app.config の付随ファイルは、この形の破損に対してもっとも無防備です。

辞書のキーが欠けたまま本番に出ると、画面には翻訳されていないキー文字列がそのまま並びます。App Store の審査で必ず弾かれる類の不具合でもないため、スクリーンショット付きの低評価レビューで初めて知る、という順序になりがちです。回避したいのは破損そのものというより、この気づく順序のほうでした。

同じ 1 行の条件が、コメント削除にも、コンポーネント消失にも、辞書の破壊にもなります。これが一括置換の実際の姿でした。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦一括置換をかける前に、自分のプロジェクトのどのファイルが「消した行の隣で壊れる」形をしているかを見分けられるようになります
✦置換が成功したことと、成果物が健全であることを切り分けて検査する仕組みを、依存ゼロのスクリプト1本で組み込めるようになります
✦破損に数週間気づかないという事態そのものを、置換のたびに止められるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-09-04
EAS の secret は「アプリに入れない」設定ではありません — 接頭辞と可視性を別々に決める
EXPO_PUBLIC_ の接頭辞は成果物に入るかを決め、EAS の可視性は誰が読めるかを決めます。二つを重ねたときに OTA 更新でだけ値が消える筋道と、出荷前に自分の手で確かめる手順をまとめました。
⬡ 開発ツール2026-07-30
Renovate が触ってよい依存と、触ってはいけない依存 — Expo SDK 57 の123パッケージを機械的に切り分ける
Rork 生成アプリに依存の自動更新を入れると、Expo が版を管理している123パッケージまで巻き込まれます。2026年7月30日時点の実測では、うち6件が npm の最新版へメジャー更新される差でした。除外リストを手で書かず SDK から機械生成する手順をまとめます。
⬡ 開発ツール2026-07-28
prebuild --clean で消える手入れを、上げる前に数える — Expo SDK 57 移行の棚卸し
Expo SDK 57 への移行前に、ios/ へ加えた手入れが prebuild の再生成でいくつ失われるかを数える手順をまとめました。素の差分649行のうち意味を持つのは3行。ノイズを正規化して実質的な変更だけを抽出するスクリプトと、config plugin への移し替えを実測つきで共有します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます