playparkさんのフィード
https://zenn.dev/playpark
コードは書くより読まされる時代に。 今日もレビュー自動人形として活動中。
フィード

シフト自動作成を3方式で作り直して分かった、貪欲法が破り続けていたルール
playparkさんのフィード
「不足0」の表を出していたのに、ルールは破れていたシフトの自動作成を作ると、最初はこう考えがちです。LLMに月のシフト表を書かせれば早いのでは。駄目なら空き枠を順に埋める貪欲法でいける。自分が関わっている美容室向けのシフト作成サービスは、まさにこの順で作ってきました。LLM、貪欲法、そして今は混合整数計画(MIP)のソルバです。作り直して痛感したのは、次の3つです。LLMの案は、結局どの経路でも最後に貪欲法を通っていた貪欲法は「必要人数の不足0」を出すのに、最短勤務時間のルールを全シナリオで破っていたソルバは速さより、変数の作り方で成否が決まったこの記事は、最小のコー...
9日前

消したユーザーのJWTが8時間通る。失効の3方式を比べて tokenVersion に落ち着いた
playparkさんのフィード
管理画面で消したのに、そのユーザーがまだAPIを叩ける管理画面で退職者のアカウントを削除した。ところが、その人が朝に受け取ったトークンでは夕方までAPIが普通に通る。有効期限を8時間にしたJWTなら、削除から最長8時間これが続く。削除したユーザーが、有効期限までデータを読める管理者から一般ユーザーに降格したのに、トークンの role は管理者のままパスワードを変えても、変更前に発行したトークンが生きているJWTの検証は署名と有効期限を確かめれば終わりで、サーバーはDBを見ない。RFC 7519 の exp より前なら、署名が正しい限り通る。DBを引かずに済むのがJWTの...
11日前

Renovateが3週間PRを出していなかった。OOMで黙って止まるので、見張りを置いた
playparkさんのフィード
「最近RenovateのPR見てないな」で気づいた最後のPRから3週間たっていた。エラー通知は1通も来ていない。調べると、Mend がホストする無料版 Renovate(Community Cloud)のジョブがメモリ不足(OOM)で強制終了されていた。次のジョブは1週間キューに積まれたまま動かない。落ちたなら落ちたと言ってほしいが、止まった事実がrepoのどこにも残らない。PRもコメントも Dependency Dashboard の更新も残らない結果が見えるのは Mend の Developer Portal のジョブ一覧だけschedule を週1回に絞っていると...
12日前

Claude Code更新のたびにフルディスクアクセスが増える問題を、固定パスで止めた
playparkさんのフィード
一覧に claude がずらっと並んでいませんかシステム設定の「プライバシーとセキュリティ」→「フルディスクアクセス」を開いたら、claude が縦に並んでいました。Claude Codeを更新するたびに許可ダイアログが出て、そのたびに「許可」を押してきた結果です。更新のたびにダイアログが出て、作業が一瞬止まる一覧が育って、どれが今使っているclaudeか分からない古い行を消してよいのかも自信がない原因は、更新のたびに実体の置き場所が変わることでした。以下は筆者の環境(mise経由のインストール、Claude Code v2.1.292)で確かめた内容です。TCC(ma...
25日前

正規表現の else が判定の65%を決めていた。Jevに任せて分かった置き換えの境界線
playparkさんのフィード
門番の else が、いちばんの落とし穴だった失敗談の記事ばかり続かないように、新しい記事を「比較・ガイド・落とし穴・事例」に振り分ける門番を置きました。直近7本のうち落とし穴型が4本以上なら、次の企画を止めます。判定は正規表現で、どのキーワードにも当たらなければ「落とし穴」に倒す作りでした。既存の技術記事121本に当てて数えてみると、79本(65%)がどのルールにも当たらず「その他=落とし穴」に流れていました。ガイドを書いたはずの48本のうち34本が失敗談として数えられていたわけで、失敗談を止める門番自身が最大の落とし穴でした。CIのラベル付けエージェントが実行するコマン...
1ヶ月前

stash popが事故った話、reset --hard封じのsandboxで非破壊復旧した
playparkさんのフィード
「stash -u」が空振りしたのに、popでコンフリクトが起きたClaude CodeのようなAIエージェントを非対話実行のsandboxで動かしていて、同じgit worktreeを何日も使い回していないだろうか。ある日、いつもの手癖で git stash -u && git checkout -B feature/x origin/dev && git stash pop を打ったら、stash -u は「保存する変更がありません」と返してきたのに、直後の pop が複数ファイルでコンフリクトを起こした。自分は何もstashしていないはずなのに...
3ヶ月前

git worktree + npm installが毎回違う場所で失敗する、sandboxの罠
playparkさんのフィード
新しいworktreeを切るたびに、止まる場所が違う新しいworktreeを切ってnpm installを叩く。失敗したので手順を見直して再実行すると、今度は別のエラーで止まる。「さっきは通ったのに」と二度見して終わる——sandbox化されたAIコーディングエージェント環境で、freshなworktreeにnpm installを回したことがある人なら覚えがあるはずだ。唯一の救いは、犯人が毎回同じとは限らないので飽きないことくらいだ。 3つの症状は、実は3つの別レイヤーの問題最初にこれを1つのバグだと思って手当たり次第に対処すると、だいたい空振りする。表面上は「instal...
3ヶ月前

クロスポストパイプラインで踏んだ設計判断——SEO事故を防ぐcanonical対策とスキル分割の理由
playparkさんのフィード
「ZennとQiitaに同じ記事をコピペしてはいけない」を実装で解く記事を書いたあと、Zennにコピペ、QiitaにもコピペしてSNS告知文を手書き——この作業、1記事あたり1時間以上溶ける。しかも「とりあえずコピペ」には落とし穴がある。ZennとQiitaに同一内容を投稿するとGoogleが重複コンテンツと判定、どちらかが検索結果から消えるZennユーザーとQiitaユーザーは求めているものが違う。同じ読み物を押しつけても喜ばれないcanonical URLの設定をサボるとSEO事故が起きる(Zennも Qiitaも frontmatter でcanonicalをサポート...
3ヶ月前

Claude Codeのsubagentを並列でgit操作させたら、コミットが混ざった話
playparkさんのフィード
「並列にすれば速い」と思ってgit操作込みで投げたら、コミットが混ざった3本のTaskを並列で走らせて、それぞれに実装を任せたことがある。「3倍速いはず」と思っていたが、できあがったコミットはどれも中途半端に混ざっていた。片方のsubagentがcheckoutしたブランチに、もう片方が気づかずcommitしていた。読み取り専用の調査タスクなら、Claude CodeのAgent toolで複数subagentを並列起動するのは気持ちよく速い。ただしファイルを書き換えたりgit操作をしたりする場合は話が別で、同じworking directoryを共有させたまま走らせると、再現し...
3ヶ月前

毎日決まった時刻に動くはずのスキルだけ動かない — 原因はcloud routineの参照先だった
playparkさんのフィード
ローカルでは一発で動くのに、スケジュール実行のときだけ「見つかりません」と言われる手元のターミナルで動かすと成功するのに、同じ指示をスケジュール実行に登録した瞬間だけ「該当のスキルが見つかりません」と言われる。ローカルではまったく再現しないし、設定ファイルも合っている(三度見した)。それでも朝になると同じエラーで止まっている——という経験がある人は少なくないはずだ。これはバグではなく仕様だった。Claude Codeには~/.claude/skills/にスキルを置いてカスタマイズする方法と、スケジュール実行(cloud routine)やCoworkのようなクラウドセッションで...
3ヶ月前

Claude Codeのauto-compactで「別人」になる問題をhookで塞いだ
playparkさんのフィード
圧縮後のClaude Codeが、心なしか「他人」に見えることはないか長時間のリファクタリングをClaude Codeに任せていると、画面に「Compacting conversation」と出て、数秒後に会話が何事もなく再開することがある。ただ、再開後のAIは様子がどこかおかしい。さっき却下したはずの設計案を、また新しい提案として出してくる直したはずのファイルを開き直して「まずここから直しましょう」と言う直前に握った「このテストは触らない」という制約が、いつの間にか消えているこれがauto-compact(コンテキストウィンドウ圧縮)の副作用だ。会話履歴が上限に近づく...
3ヶ月前

生きているコンテナを「dead」と誤判定した話 — 原因は2>&1だった
playparkさんのフィード
監視ダッシュボードが「dead」と言うのに、コンテナはピンピンしている深夜のアラートで叩き起こされてdocker inspectを打つと、コンテナは普通に動いている。プロセスも生きているし、ログも流れている。それなのに自作の監視スクリプトだけが「dead」と言い張る——こういう場面に覚えがある人は多いはずだ。CLIツールの出力をパースして状態判定する監視スクリプトやliveness probeを自作していると、この手の「exit 0で成功しているのに実は誤判定している」状況にわりと簡単に踏み込む。しかも厄介なのは、原因がコードの外側、つまり"何を捕まえているか"にあることだ。...
3ヶ月前

Claude Codeのpermissions、allow/deny/askの境界線を毎回悩んでいたので決定木にした
playparkさんのフィード
空のpermissions.denyを前に、手が止まったことはありませんか新しいプロジェクトでsettings.jsonを開くと、permissions.denyはたいてい空っぽだ。「危なそうなコマンドを思いついた順に足していけばいいか」と手を動かし始めるのだが、そのうち「これはdenyで完全に止めるべきか、askで確認を挟むべきか」で毎回悩むようになる。レビューで「このルール何のため?」と聞かれて「たぶん昔なにかあったんだと思います」で押し切った経験、ありませんか。 可逆性・影響範囲・頻度の3軸で振り分ける思いついた順にdenyを積むのをやめて、判断基準を先に固定することに...
3ヶ月前

git worktreeでnode_modulesに詰まった話 — symlinkよりpnpm storeを選んだ理由
playparkさんのフィード
worktreeを増やすたびにnpm installを待つ日々複数のIssueやブランチを並行して触りたくてgit worktreeを使い始めると、必ずこの壁にぶつかる。git worktree addした直後にcdして何か叩くとCannot find module。ああ、またnode_modulesが無いやつだ、とインストールを回す。worktreeが3本、5本と増えるほど、この「待ち」が1日に何度も発生するようになる。しかも厄介なのは、これが「時間の問題」だけで終わらないこと。片付け忘れたworktreeのnode_modulesはディスクに居座り続け、気づけば数GB単位で圧...
3ヶ月前

git worktreeを溜め込んだらBashが死んだ話 — E2BIGの正体を追ってわかったこと
playparkさんのフィード
worktreeが増えるたびに、いつか来る空気を感じていませんか複数のIssueをAIエージェントに並行して振ると、git worktreeはブランチを切り替えずに何本も同時進行できて手放せない。でも「そろそろ整理しなきゃ」と思いながら後回しにしているworktree、何本ありますか。自分は放置した結果、ある日Bashツールにecho testを投げただけで失敗するようになった。ディスクもファイル数も関係ない。サンドボックスの起動そのものが、コマンドラインの長さで死んでいた。 原因を追うと、結論は「もう直せない」だったまず自分の環境で何が起きているか、次のコマンドで切り分けた...
3ヶ月前

「テストがgreenになった」と「バグが直った」を混同していた話
playparkさんのフィード
CIが全部greenになった、それだけで安心していませんかバグ修正のPRを出す。CIが全部greenになる。それを見て「直った」と判断してマージする——ここまでは自分も含め、多くの現場で当たり前にやっている流れで、疑ったことがある人はあまりいないと思う。だが少し意地悪く考えてみると、そのgreenは修正前に同じテストが赤かったことを確認した上でのgreenなのか、それとも修正後に一度実行しただけの「たまたま出たgreen」なのか、見た目ではまったく区別がつかない。CIやAIエージェントの自動修正ループのように、実行が速く何度でも回せる環境ほど、この区別を省略しても表面上は困らない...
3ヶ月前

GA4の送客計測でSPA遷移特有の『referrer消失』を踏んだ話
playparkさんのフィード
ブログの送客率、ちゃんと計測できてますか「ブログ記事から紹介ページへどれくらい人が流れて、そこから問い合わせに繋がっているか」——GA4を入れていれば分かるはず、そう思っていた時期が自分にもあった。cta_click(記事内CTAクリック)もsolution_view(紹介ページ閲覧)もイベントとしてはちゃんと飛んでいる。なのに、この2つを「同じ人の同じ旅」として繋げる方法がなかった。バラバラのカウントを2つ持っているだけで、送客率という割り算が成立しない状態だった。 送客元をreferrer_blogとして持ち回る設計にした解決策はシンプルで、CTAクリック時点で「今いる...
3ヶ月前

「これだけの作業にそんな気合いいらないのに」— サブエージェントのeffort継承にハマった話
playparkさんのフィード
深夜、ただのtypo修正がOpusのxhighで走っていたレビュー待ちのPRがなかなか終わらない。ログを覗いたら、ただのtypo修正のために投げたはずのサブエージェントが、涼しい顔でOpusのxhighを使っていた。中身は数行のJSON整形や軽い文字列置換だけなのに実行時間もコストも、重い判断タスクと同じ水準しかも自分は「effortなんて指定してない」つもりだった原因は単純だった。effortを指定し忘れたサブエージェントは、勝手に軽くなってくれるわけではない。 「指定しない」は「軽くなる」ではなく「継承する」Claude Codeでサブエージェントを呼ぶとき、...
3ヶ月前

法人番号があれば営業リストは自動で埋まる — gBizINFO APIを叩いて気づいたこと
playparkさんのフィード
「また会社名で検索して住所をコピペするのか」問い合わせが来るたびに、この独り言が漏れる。会社名で検索して、住所と資本金をコピペする。代表者名も拾う。設立年も。新規リードの数だけ同じ作業を繰り返す。会社名・住所・資本金・従業員数・設立年・代表者名を毎回手で埋める同じ情報源(企業サイトや検索結果)を何度も行き来する忙しい時期ほどこの作業が後回しになり、リストが埋まらないまま滞留するこの手入力、法人番号さえ分かれば大部分を自動化できる。 gBizINFOという公開APIで基本情報を埋める経済産業省が運営するgBizINFOは、法人番号や企業名から企業の基本情報を無料で返...
3ヶ月前

「ログイン成功」の画面を信じて3回ログインし直した話 — OAuth CLIの認証情報が静かに消える
playparkさんのフィード
「また同じエラーか」を3回繰り返したブラウザでの認証は毎回ちゃんと成功する。緑のチェックマークも出る。なのに次のコマンドを叩くと、まるで一度もログインしていないかのように弾かれる。「ログインし直せば直るだろう」→再ログイン→成功次のコマンドを叩く→また落ちるもう一度ログイン…(この時点で3回目)このループに入ったことがあるなら、疑うべきは「ログインが失敗しているかどうか」ではなく、「ログインは成功しているのに、その結果の保存だけ失敗しているかどうか」 だ。 実装: keyringを経由させない自分がハマったのは、コンテナ内で動かしていたCLIツールが invali...
3ヶ月前