つ積み上げログ技術ブログホームへ戻る

開発記録

技術記事一覧

実際に手を動かして詰まった点と、その解き方を書いた記事をまとめています。

記事
28
制作物
179
確認したリポジトリ
202
自主執筆 07SEO

日本語のタイトルは検索結果で30字しか出ない|検索語が切れる側に落ちていた

記事18本の平均順位は6.4で1ページ目なのに、90日のクリックが2件しかなかった。原因はタイトルの長さで、18本中17本が30字を超え、検索語が表示されない側に入っていた。実際に表示が付いていたクエリの語が、69字タイトルの55字目以降にあった。

SEOタイトルSearch ConsoleCTR
自主執筆 10インフラ

GitHub Pagesの証明書が発行されないのは順序のせい|cnameは最後に設定する

DNSもCAAもDNSSECも正常なのに、GitHub Pagesの証明書が1週間発行されなかった。原因は設定の順序で、Pagesを作ってすぐカスタムドメインを入れていた。デプロイして github.io 側で200を確認してからドメインを設定したら25秒で approved になった。

GitHub Pages証明書カスタムドメインDNS
自主執筆 11インフラ

お名前.comでDNSレコードが反映されないのはネームサーバーが別物だから

お名前.comのDNSレコード設定にAレコードを入れても1件も反映されなかった。原因はネームサーバーが取得時の既定値 dns1/dns2.onamae.com のままで、レコード設定が効くのは 01〜04.dnsv.jp を使っているドメインだけだった。144ドメインを一斉に調べたら19件が同じ状態だった。

お名前.comDNSネームサーバーGitHub Pages
自主執筆 16サイト運営

MXレコードが無いとメールは1通も届かない|問い合わせ先を載せたまま3サイトで起きていた

3つのサイトのフッターに info@ のアドレスを載せていた。削除依頼の窓口として全ページに出していたのに、MXレコードが1本も設定されていなかった。送られたメールはすべてエラーで返っていたことになる。Cloudflare Email Routing で受信できるようにするまでの手順を書く。

メールMXレコードCloudflareDNS
自主執筆 17CI/CD

GitHub ActionsのSSHタイムアウトを3回リトライする|毎日の同期が4日に3日落ちていた

毎日13時に走る同期処理が、4日のうち3日失敗していた。ログを見ると dial tcp のタイムアウト。コマンドが失敗したのではなく、TCP接続すら張れていない。接続の待ち時間を延ばし、間隔を空けて3回試すようにした実装を書く。

GitHub ActionsSSHデプロイリトライ
自主執筆 18設計

複数APIの突き合わせでIDを書き写さない|名前で引き当てる設計にした理由

3つのサービスのAPIから同じ分類のデータを集めることになった。最初はIDをコードに書いていたが、取り違えても誰も気づけない。名前で引き当てる方式に変えたところ、社ごとに呼び方が違うことや、そもそも存在しない分類があることが分かった。

API設計データ統合Python
自主執筆 19SEO

React SPAのHTMLが空でAIのクローラーに読まれない|curlで見ると中身が無い

Vite + React で作ったトップページを curl で取得したら、リンクが1つも入っていなかった。div id=root が空で、中身はすべてJavaScriptが描いていた。Googleは実行してくれるが、生成AIのクローラーの多くは実行しない。何が見えていなかったのか、どう直したのかを書く。

ReactSPASEOLLMO
自主執筆 20セキュリティ

PostgreSQLの関数はPUBLICに実行権がある|SupabaseのRLSを固めても匿名キーで呼べた

静的サイトの投稿機能をSupabaseで作った。行レベルセキュリティ(RLS)は3つの条件を満たすよう慎重に書いた。ところが匿名キーで実際に攻撃してみたら、投稿者が自分の投稿を承認済みにできてしまった。PostgreSQLの関数は既定でPUBLICにEXECUTE権限が付くためだった。

SupabasePostgreSQLRLSセキュリティ
自主執筆 21サイト運営

AdSense申請に必要なページ一式とプライバシーポリシーの書き方|使っているサービスから決める

AdSenseの審査に落ちたサイトを整えるなかで、プライバシーポリシーもフッターも無いことに気づいた。テンプレートを貼るのではなく、コードを調べて実際に使っているサービスだけを書いた。必要なページと、それぞれに何を書いたかをまとめる。

AdSenseプライバシーポリシーads.txtサイト運営
自主執筆 23サイト運営

noindexはAdSenseの審査に効かない|検索から消しても審査員には見えている

薄い自動生成ページ340本を noindex にしてサイトマップからも外した。それで対策は終わったつもりだった。しかし記事一覧を開くと、そのページへのリンクが343件並んだままだった。noindex は検索エンジンの索引から外す指定であって、審査員が見るのを止めるものではない。何を勘違いしていたのかを書く。

AdSensenoindexSEO審査
自主執筆 24サイト運営

AdSenseの「有用性の低いコンテンツ」の原因を記事340本の文字数で特定した

自動生成した記事340本を抱えた技術ブログが、AdSenseの審査に落ちた。理由は「有用性の低いコンテンツ」。感覚で直すのではなく、全記事の文字数と見出し構成を実測して原因を切り分けた。何が薄かったのか、どこを直したのかを数字で記録する。

AdSenseSEO自動生成noindex
自主執筆 25CI/CD

secrets: inherit 忘れでGitHub ActionsのSecretが空になる|再利用ワークフロー

週次のデータ更新のたびに、サイトから投票ボタンと口コミ欄が消えていた。原因は、再利用ワークフローを呼ぶときに secrets: inherit を書いていなかったこと。pushでのデプロイでは正常に動くため、手元では再現しない。同じ経路で続けて踏んだ3つの落とし穴と、その直し方をまとめる。

GitHub Actions再利用ワークフローSecretsデプロイ
自主執筆 26インフラ

Cloudflareのネームサーバーはゾーンごとに違う|pendingのまま19ドメイン止まった

未使用ドメインをCloudflare経由で301転送しようとして、19件が何時間経っても pending のままだった。原因は、Cloudflareが割り当てるネームサーバーの組がドメインごとに違うことだった。レジストリのwhoisで一件ずつ確認して初めて分かった経緯と、確認の手順をまとめる。

CloudflareDNSネームサーバー301リダイレクト
自主執筆 27運用・計測

GA4が計測されない4つの原因|283サイトを調べ、コード検索では分からなかった

「リポジトリにgtagが無い=GA4が動いていない」と思って283リポジトリをgrepしたら、154件が未計測という結果が出た。実際にサイトへアクセスして確かめ直したら、本当に困っていたのは5件だけだった。静的解析が嘘をつく理由と、GA4 Admin APIを使った確実な確認手順をまとめる。

GA4Googleアナリティクス運用Node.js

制作物の記録について

公開している GitHub リポジトリ179件については、 README とコミット履歴から構成と変更の流れを機械的にまとめた記録を用意しています。 読み物ではないため、この一覧には並べていません。

どんなものを作ってきたかは制作物のページから確認できます。 解説動画は、それぞれの記録のページに置いてあります。