技術ログ
実装で詰まった話・解決策・コード公開
このカテゴリの記事 37 本 (2026年5月時点)。SaaS Diary の運営者 GRAMSHIFT が実体験ベースで執筆しています。
-
Why many 10-digit HTS codes have a blank duty rate in the USITC API
Asked for 6109.10.00.04 on 2026-09-14, the USITC Harmonized Tariff Schedule API returned the line with "general": "". The 16.5% rate was on 6109.10.00. How to fetch the heading and carry the rate down, why parent footnotes need their own field, how to parse rate text safely, and why the line's JSON cannot tell you which additional duties apply.
-
Exact TikTok follower counts are in statsV2; stats is rounded
On 2026-09-06 and again on 2026-09-14, stats.followerCount for Duolingo on TikTok said 18,000,000. statsV2, right next to it, went from 17,960,673 to 18,007,336. Where the exact count lives, the two HTTP 200 responses that are not a profile, and a daily history that only records real changes.
-
One comma, 77,085 companies: how the GLEIF API reads a pasted legal name
"Apple, Inc." matched 77,085 entities out of 3,429,265; "Apple Inc" matched 24. And the top hit for both is Apple Inc. A 2026-09-13 measurement of how GLEIF's LEI search treats commas, partial words, date ranges and codes it does not recognise.
-
A comma in aggFilters returns 5% of the trials, and filter.phase does not exist at all
2,598 studies instead of 51,889, delivered as a successful response. A 2026-09-13 measurement of the two phase filters on the ClinicalTrials.gov v2 API: the comma that keeps only your last value, and the parameter name that the API rejects outright.
-
HTTP 200 with 17 characters of text: 14 sites measured for empty server HTML
nhk.or.jp returns 5,856 bytes of HTML. It holds 17 characters of text and zero links to its own domain. Fourteen sites measured the same way, and the detection rule I settled on.
-
Only the first 1000 search results are available: GitHub Search API HTTP 422 at page 11
It says 7,705 matched, then hands over 1,000 — silently. A 2026-09-13 measurement of where the cap sits, when the 422 actually fires, and how many date slices it takes to get the rest.
-
Wayback CDX API 504 timeout: what it looks like and how to handle it
The CDX server returned a 504 as an nginx HTML page after 60,346 ms, on a one-second query with limit=1 and showResumeKey=true. When to retry a 504 and when to change the query instead, plus 503 and 403 answers, revisit rows with status "-" (377 of 3,000 in our sample) and status filters (5 of 24 monthly captures were 301s). From ten requests on 2026-09-13.
-
同じURLなのに Node だけ 403 — 既定の User-Agent が「node」の3文字だった
ブラウザでは開けるのにスクリプトからは403。原因はレート制限でもIP規制でもなく、Node の fetch が送っている3文字の User-Agent だった。ドメイン登録情報を10件引きながら測った記録。
-
取得したHTMLに本文が無い — 200 が返っているのに中身が17文字だったサイトの話
nhk.or.jp のトップページは 5,856バイトのHTMLを返す。そこに入っている本文は17文字で、同じサイトへのリンクは0本だった。14サイトを同条件で測って、「空」をどう判定するかを決めた記録。
-
GitHub Search API の 1,000件 上限 — 7,705件 一致でも 11ページ目は HTTP 422
7,705件 一致すると言いながら1,000件しか渡してこない。しかも黙って。2026-09-13 に実際に叩いて、上限の位置・422が出る条件・回避に必要な分割数を測った記録。
-
Companies House bulk data: 72,576 UK companies no postcode filter can match
Of 5,689,367 live companies in the 2026-09-01 Companies House Free Company Data Product, 62,702 have no address at all and 9,874 more have a UK address with no postcode in it. All 40,416 Charitable Incorporated Organisations are among them. Counted on every row of all seven files.
-
NPPES NPI API returns errors with HTTP 200, and skip repeats past 1,000
state=CA on its own came back HTTP 200 with "Field state requires additional search criteria" and no result_count. skip=1000, 1200 and 20000 returned the same 200 NPIs. A 2026-09-13 measurement of how the NPPES NPI Registry API reports refusals, zero results and paging.
-
公開ページを160枚作っても、検索に出る入口は増えなかった
使用例ページを921枚から1,081枚に増やした翌朝、サイトマップ上の枚数が1枚も動いていなかった。原因を外に求める前に、自分の作り方と自分の数え方を先に疑った記録。
-
Netlifyの無料枠はどこまで無料か — 300クレジットの中身と、サイトが止まる条件
Netlifyの無料プランは月300クレジット。本番デプロイは1回15クレジットなので月20回で上限に達し、1日1回デプロイする運用は月の半ばで止まります。使い切ると自動課金ではなくチームの全サイトが停止し、新規デプロイもできません。公式ドキュメントの単価と、実際に枯渇させた夜の経験をまとめます。
-
ERR_INVALID_PACKAGE_CONFIG の正体は、3バイトのBOMだった
プロジェクトを置いていないホームディレクトリで、nodeが Invalid package config を出し続けました。犯人はBOMだけが入った3バイトのpackage.json。Nodeが親をたどって設定を探す仕組みと合わさって、配下のスクリプトが全部巻き込まれていた話です。
-
毎週「準備OK」と報告していた監視が、一度も出していない申請を緑にしていた
準備状況の監視が毎週「良好」を返していました。準備は本当に整っていたので嘘ではありません。ただ、肝心の「出したのか」が項目に無く、申請は一度も出ていませんでした。外から測れる証拠で判定を作り直すまでの記録です。
-
サービスを止めたのに、特商法だけ「月額480円」のままだった
課金もログインも止めて、トップに告知も出した。それでも特定商取引法に基づく表記には月額480円が残り、案内していた解約導線は404でした。止めるときに直す場所のリストと、消えたこと・残ったことを両方確認する手順の記録です。
-
記事20本が、ずっと計測されていなかった — 「入れた」ではなく「返ってくるか」で確認する
集客用に書いた記事20本に、アクセス解析のタグが1つも入っていませんでした。エラーは出ません。トップのセッションは毎日増えるからです。全ページを数えて直し、公開URLで検算するまでの記録。
-
削除したはずの一文が、まだ公開されていた — バックアップを配信ディレクトリに置くな
法務文書から一文を削除した翌朝、配信ディレクトリの走査で .bak が3本 HTTP 200 で見つかりました。中身は削除前の版。原因・被害・直し方と、週1の見張りでは最悪7日気づけなかった監視設計の話です。
-
exit 0 は「動いた」の証明ではない — 無音で失敗する自動化を夜の点呼で捕まえる
タスク一覧が全部「結果0」で埋まっていても、その日の投稿が1本も出ていないことはあります。孤児プロセスで上限が効かない、通知の宛先が未設定で静かに消える、在庫監視では欠測に気づけない。3つの穴を塞いで、成果物を一次情報で数える夜の点呼を実装した記録です。
-
バックアップは毎日成功していた。一度も復元したことがなかった
バックアップの完了通知は毎日届いていました。でも「実際に復元したことは何回?」と自問したら答えはゼロ回。実際に緑のまま壊れていた事故が2件あります。毎月バンドルを復号して中身を数える復元訓練を実装し、検査自体もわざと壊して赤くなることを確認した記録です。
-
必ず解けるパズルを自動生成する — 麻雀ソリティアの逆生成アルゴリズム実装記
パズルを自作すると最初にぶつかるのが「生成した問題が必ず解ける保証」。牌をランダムに置くと一定確率で詰み盤が生まれ、プレイヤーは理不尽に負けます。満杯の盤からフリーペアを取り切って解の手順を先に作る「逆生成」で解保証を実装し、独立ソルバで二重検証した記録です。
-
個人開発でCapacitorアプリをGoogle Playに出すまでに踏み抜いた5つの落とし穴
Web資産を持っているならCapacitorで同じコードをGoogle Playに出せます。私は数週間で自作Webツール数本をPlayに提出しましたが、コードより「Web開発の常識が通じないネイティブ層」で時間を溶かしました。実際に本番で踏んだ5つの落とし穴と修正を実コード込みで共有します。
-
PowerShell の Set-Content で日本語 UTF-8 ファイルが壊れる話
PowerShell で「ファイルの一部を置換しよう」と Get-Content | Set-Content を回したら、日本語が全部文字化けして元に戻せなくなった。原因は Windows PowerShell 5.1 の既定エンコーディングが cp932(Shift-JIS)で、UTF-8 ファイルを読み書きするだけで多バイト文字が壊れるからです。私はこれで作業中の index.html を一度ダメにしました。
-
Stripe Webhook 冪等性 — 本番で重複処理を防ぐ実装3パターン (TypeScript)
Stripe Webhook は仕様として at-least-once delivery、同じ event.id が複数回届く前提で受信側を設計する必要がある。本記事では Stripe 公式仕様に基づく 3 つの冪等化パターン (DB UNIQUE 制約 / Redis SETNX / In-memory LRU) を TypeScript の動くコード付きで比較し、月イベント数とインスタンス数で選び方を示す。さらに公式が明記している『event.id 単独では識別できない稀ケース』(同じ subscription への別経路操作で別 event オブジェクト生成) と、その対応としての (event_type, object_id) 組合せ判定パターンも解説。saas-diary tech-log カテゴリの実装リファレンス系記事。
-
個人開発者のバックアップ戦略 (3年分のコードを守る)
個人開発者にとって、コードと環境設定は最も価値のある資産です。PCが壊れた日に「あれ、何ヶ月か前にバックアップを取った気がする」では遅すぎます。私が運用しているGoogle Drive一本化の自動バックアップ実装を共有します。
-
Fastify を1年運用してわかった Express との違い
Node.jsでWebサーバーを書くとき、ExpressとFastifyのどちらを選ぶべきか?私はGramShift Web側を当初Expressで作り、後にFastifyに移行しました。1年運用してわかった具体的な違いと、移行で得たメリットを共有します。
-
SQLite と PostgreSQL の違いと選び方 — 個人SaaSを1年運用して比較した
個人開発SaaSのDB選択でPostgreSQL/MySQLを選ぶのは過剰スペックなことが多いです。GramShiftは現在もSQLiteで運用しており、運用コストはほぼゼロ。スケール限界の判断基準と、SQLite運用の注意点を共有します。
-
GitHub ReleasesでElectronアプリを配布する実例
Electronアプリを個人で配布する場合、配布基盤のコストと管理工数が悩みどころです。私はGitHub Releasesを使った無料配布で17リリースを重ねてきました。具体的なワークフロー、CDN効果、ダウンロード統計の取り方まで実例で共有します。
-
Windowsタスクスケジューラで自動化する人がハマる3つの罠
Windowsタスクスケジューラで自動化を組むと、最初は必ずどこかで詰まります。exit 9009 が出る、bat が動かない、なぜか実行されない、そんな状況の原因はだいたい3つに集約されます。20以上のタスクを運用してきた経験から共有します。
-
AIで記事を月60本量産してみた現実 (コスト・品質)
AIで記事を月60本量産すれば、メディアサイトを短期間で立ち上げられるのか?私は実際にやってみました。Gemini Flashで月150-300円のコストで動かしながら、品質を保つために試行錯誤したプロンプト設計と、未だに残る課題を共有します。
-
Claude vs Gemini を実プロジェクトで使い比べたコスト
AI APIをプロジェクトに組み込む際、ClaudeとGeminiのどちらを選ぶか悩みますよね。私は両方を実プロジェクトで並行運用して、コスト・品質・速度を実測しました。月60本の記事生成、議事録要約、コード補完、それぞれで見えた差を共有します。
-
VPSのメモリリークを発見した夜のデバッグ記録
本番運用しているNode.jsサーバーが、3日連続で深夜にメモリを使い切って落ちる。pm2が自動再起動してくれるとはいえ、根本原因を放置するわけにはいきません。実際にheap snapshotで犯人を特定するまでの全手順を共有します。
-
Discord webhookで個人開発の異常検知基盤を作る
個人開発でSaaS本体+複数のWorkerを並走させていると、どこかが必ず異常を出します。その時に「気づかない」のが最大のリスクです。Discord webhookで月コストゼロのアラート基盤を作る設計と、私がGramShift運用で踏み抜いた落とし穴を共有します。
-
Electronアプリの自動アップデート機構を作る (実装記)
Electronアプリをエンドユーザーに配布すると、必ず「古いバージョンのままバグ報告してくる人」が出ます。自動アップデート機構を最初から組み込んでおくと、ユーザー対応の時間が大きく減ります。GramShift Desktopで17回リリースを重ねて整えた実装を共有します。
-
Stripeで月額課金を実装したときに詰まった3つの落とし穴
Stripe Subscriptionは「とりあえず動かす」までは簡単ですが、本番運用するとwebhook冪等性、3Dセキュア対応、解約処理のUX判断など、ドキュメントだけでは見えない落とし穴がいくつもあります。GramShift開発で実際に3週間かけて踏み抜いた3つの罠を、コード込みで共有します。
-
GramShiftのAIは何を判断しているのか - Gemini 2.5 Flash統合の実装中身
GramShiftは「AIハッシュタグ提案」を謳う自動化ツールですが、AIが実際に判断している箇所は限定的です。透明性のため、Gemini 2.5 Flash を使っている箇所、ハードコードの箇所、そして「行動学習」を意図的にしていない理由を実装レベルで開示します。