<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Hugo on Keyuki Blog</title>
    <link>https://blog.keyuki.net/tags/hugo/</link>
    <description>Recent content in Hugo on Keyuki Blog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sat, 09 May 2026 10:46:38 +0900</lastBuildDate>
    <atom:link href="https://blog.keyuki.net/tags/hugo/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hugoブログの画像をGitHubに置かず、Cloudflare R2で管理することにした</title>
      <link>https://blog.keyuki.net/posts/hugo-blog-image-management-cloudflare-r2/</link>
      <pubDate>Sat, 09 May 2026 10:46:38 +0900</pubDate>
      <guid>https://blog.keyuki.net/posts/hugo-blog-image-management-cloudflare-r2/</guid>
      <description>&lt;h2 id=&#34;最初は画像もリポジトリに入れればいいと思っていた&#34;&gt;最初は画像もリポジトリに入れればいいと思っていた&lt;/h2&gt;&#xA;&lt;p&gt;HugoはMarkdownと画像をまとめてGitHubで管理できるのが強みのひとつです。記事ごとにフォルダを作り、その中に &lt;code&gt;index.md&lt;/code&gt; と画像をまとめて置く「Page Bundle」という構成が使えるので、記事と素材の対応が分かりやすくなっています。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;content/posts/&#xA;  2026-05-01-my-article/&#xA;    index.md&#xA;    cover.webp&#xA;    diagram.png&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この構成は直感的で、最初はこれで十分だと思っていました。&lt;/p&gt;&#xA;&lt;p&gt;ところが記事が増えていくにつれて、アイキャッチ画像・サムネイル・OGP画像を毎回用意するようになります。1記事あたり3〜5枚の画像が増えていくと、リポジトリのサイズがじわじわ膨らんでいくのではないかという、不安に駆られました。まだ、ほとんど記事書いてないですけど。Markdownファイル本体は数KBなのに、画像だけで数MBという状況はよくないのでは？と思うようになりました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;githubリポジトリが重くなるのが気になった&#34;&gt;GitHubリポジトリが重くなるのが気になった&lt;/h2&gt;&#xA;&lt;p&gt;Gitはテキストファイルの差分管理が得意なツールです。しかしバイナリファイル（画像・動画など）は差分を持たず、変更のたびにファイル全体が履歴として積み上がります。&lt;/p&gt;&#xA;&lt;p&gt;たとえばアイキャッチ画像を差し替えると、古い画像も新しい画像もGitの履歴に残ります。&lt;code&gt;git clone&lt;/code&gt; するたびにその全履歴を取得することになるので、リポジトリが年単位で成長すると無視できないサイズになります。&lt;/p&gt;&#xA;&lt;p&gt;CI/CDやCloudflare Pagesのビルドも同様で、ビルドのたびにリポジトリ全体をチェックアウトします。画像が増えれば増えるほど、ビルド時間に影響する可能性があります。&lt;/p&gt;&#xA;&lt;p&gt;「ブログ本文の変更履歴」と「画像アセットの保管場所」は、そもそも性質が違います。そう気づいてから、分けて管理したほうがすっきりすると思いました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;cloudflare-r2を画像置き場にした&#34;&gt;Cloudflare R2を画像置き場にした&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.cloudflare.com/developer-platform/r2/&#34;&gt;Cloudflare R2&lt;/a&gt;はCloudflareが提供するオブジェクトストレージです。Amazon S3と互換性のあるAPIを持ちつつ、&lt;strong&gt;エグレス料金（データ転送料）がかからない&lt;/strong&gt;のが特徴で、個人ブログの画像配信には手頃な選択肢です。&lt;/p&gt;&#xA;&lt;p&gt;無料枠は、ストレージ10GB・Class Aオペレーション（書き込み）100万回/月・Class Bオペレーション（読み込み）1000万回/月となっています。個人ブログで画像を置く用途であれば、まずストレージが上限に達することはありません。読み込み回数についても、1000万回というのは1日あたり約33万リクエストに相当します。そもそも個人ブログにそれだけのPVがあれば、もうブログで飯が食えています。このブログには当然そんなPVはないので、無料枠で一生やっていける気がしています。&lt;/p&gt;&#xA;&lt;p&gt;このブログはCloudflare Pagesで配信しているので、Cloudflare側に画像も寄せると運用がまとまりやすくなります。R2バケットにカスタムドメインを設定することで、画像URLを &lt;code&gt;https://images.keyuki.net/...&lt;/code&gt; という形で統一できます。&lt;/p&gt;&#xA;&lt;p&gt;記事のフロントマターには画像URLだけを書きます。画像本体はリポジトリに存在しません。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;featured_image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://images.keyuki.net/uploads/2026/05/sample-eyecatch.webp&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;thumbnail_image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://images.keyuki.net/uploads/2026/05/sample-thumb.webp&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;images&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;https://images.keyuki.net/uploads/2026/05/sample-og.jpg&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;hugo側ではurlを参照するだけにした&#34;&gt;Hugo側ではURLを参照するだけにした&lt;/h2&gt;&#xA;&lt;p&gt;移行後のリポジトリには、記事本文・テンプレート・CSS・設定ファイルだけが残ります。画像本体はR2に置き、Hugoはそこへのパスを参照するだけになりました。&lt;/p&gt;&#xA;&lt;p&gt;フロントマターで使っているフィールドの役割も整理しています。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;featured_image&lt;/code&gt;: 記事ページのメインビジュアル&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;thumbnail_image&lt;/code&gt;: 記事一覧のカードに表示するサムネイル&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;images&lt;/code&gt;: SNSシェア時のOGP画像（TwitterカードやOGタグで使用）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;この分担は&lt;a href=&#34;https://blog.keyuki.net/posts/pagespeed-blog-image-optimization/&#34;&gt;前の記事で書いたPageSpeed改善の取り組み&lt;/a&gt;とも関連しています。&lt;/p&gt;&#xA;&lt;p&gt;少し管理は面倒になりましたが、快適にサイトが見れるようにやっていくには、これがいいと今のところ思ってます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;よかったこと&#34;&gt;よかったこと&lt;/h2&gt;&#xA;&lt;p&gt;リポジトリを軽く保てるのが一番の効果でした。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;画像を差し替えてもGit履歴に古いファイルが積み上がりません。R2上で上書きすれば終わりです。&lt;/li&gt;&#xA;&lt;li&gt;アイキャッチ・サムネイル・OGPと用途別の画像を整理して置きやすくなりました。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;気をつけること&#34;&gt;気をつけること&lt;/h2&gt;&#xA;&lt;p&gt;移行してよかった一方で、いくつか注意点もあります。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;R2側のURL設計が後から変えにくい。&lt;/strong&gt; 記事から参照しているURLを変えると、過去記事の画像が壊れます。最初からディレクトリ構造とファイル命名規則を決めておく必要があります。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;画像を消すと記事の表示が壊れる。&lt;/strong&gt; GitHubのように「削除もバージョン管理する」という感覚はR2にはありません。不要になった画像でも、参照している記事がないか確認してから消す必要があります。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;GitHubだけ見ても画像の実体がわからない。&lt;/strong&gt; リポジトリを見ても画像は見えません。バックアップや棚卸しは別途R2側で行う必要があります。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;キャッシュと公開設定に注意する。&lt;/strong&gt; R2バケットのパブリックアクセス設定やCloudflareのキャッシュ設定を間違えると、画像が表示されなかったりキャッシュが意図せず残ったりします。&lt;/p&gt;&#xA;&lt;p&gt;「R2に置けば解決」ではなく、運用ルールをセットで決めることが大事だと感じました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;今の運用ルール&#34;&gt;今の運用ルール&lt;/h2&gt;&#xA;&lt;p&gt;実際にやっていることをまとめると、こんな感じです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;ディレクトリ構成&lt;/strong&gt;: 年月で分けています。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;uploads/&#xA;  2026/&#xA;    05/&#xA;      article-slug-eyecatch.webp&#xA;      article-slug-thumb.webp&#xA;      article-slug-og.jpg&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;ファイル命名規則&lt;/strong&gt;: 記事のslugをベースに、用途をsuffixで区別します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>PageSpeed改善で、ブログ画像の役割を分けることにした</title>
      <link>https://blog.keyuki.net/posts/pagespeed-mobile-thumbnail-image/</link>
      <pubDate>Thu, 07 May 2026 22:30:00 +0900</pubDate>
      <guid>https://blog.keyuki.net/posts/pagespeed-mobile-thumbnail-image/</guid>
      <description>&lt;h2 id=&#34;点数は出たけど何が起きたのかわからなかった&#34;&gt;点数は出たけど、何が起きたのかわからなかった&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://pagespeed.web.dev/&#34;&gt;PageSpeed Insights&lt;/a&gt; は、GoogleがWebページの読み込み速度を100点満点で評価してくれる無料ツールです。スマホでの表示速度（モバイル）とパソコンでの表示速度（デスクトップ）を別々に測定してくれます。&lt;/p&gt;&#xA;&lt;p&gt;昔々、ブックマークに入れていたものを掘り起こしたわけですね。&lt;/p&gt;&#xA;&lt;p&gt;このブログのモバイル版を測定したら、こんな数字が出ました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Performance: 67&lt;/strong&gt;（100点満点。低いほど遅い）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;LCP: 175.2秒&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Speed Index: 5.5秒&lt;/li&gt;&#xA;&lt;li&gt;Total network payload: 39,910 KiB（約39MB）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;LCP&lt;/strong&gt;（Largest Contentful Paint）は、ページを開いてから「一番大きなコンテンツ」が表示されるまでの時間です。175秒というのは、ほぼ「ページが完成しない」という意味になります。&lt;/p&gt;&#xA;&lt;p&gt;パフォーマンス67という点数は見れば悪いとわかりますが、最初は何を直せばいいのかよくわかりませんでした。&lt;/p&gt;&#xA;&lt;p&gt;調べてみると、原因はサーバーの遅さでも、JavaScriptのブロックでもありませんでした。&lt;strong&gt;トップページが大量の画像を読み込んでいた&lt;/strong&gt;のが問題でした。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;トップページが約39mbあった&#34;&gt;トップページが約39MBあった&lt;/h2&gt;&#xA;&lt;p&gt;サーバー応答は速かったです。JavaScriptのブロックも致命的ではありませんでした。大きかったのは、ひたすら&lt;strong&gt;画像&lt;/strong&gt;でした。&lt;/p&gt;&#xA;&lt;p&gt;トップページには最新記事のカードが並んでいます。各カードには記事のアイキャッチ画像が表示されます。見た目は小さなサムネイルですが、裏では5MB前後のPNGファイルをそのまま読み込んでいました。カードが10枚あれば、それだけで50MB近くになります。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;小さく表示しているから軽い、とは限らない。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;ブラウザは &lt;code&gt;width&lt;/code&gt; を小さく指定されても、画像ファイルのサイズは変わりません。表示を縮小しているだけで、5MBのPNGは5MBのまま読み込まれます。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;まず背景画像を軽くした&#34;&gt;まず背景画像を軽くした&lt;/h2&gt;&#xA;&lt;p&gt;最初に手をつけたのは、ヒーロー背景画像でした。&lt;/p&gt;&#xA;&lt;p&gt;ヘッダーに使っている &lt;code&gt;hero-background.jpg&lt;/code&gt; が&lt;strong&gt;約7.6〜7.9MB&lt;/strong&gt;ありました。見た目はきれいですが、7MBは明らかに過剰です。&lt;/p&gt;&#xA;&lt;p&gt;これを&lt;strong&gt;WebP&lt;/strong&gt;（ウェブピー）形式に変換しました。WebPはGoogleが開発した画像フォーマットで、JPEGやPNGより同じ見た目で大幅にファイルサイズを小さくできます。変換後は&lt;strong&gt;約283KB&lt;/strong&gt;になりました。同じ見た目で、ファイルサイズが約1/27になる計算です。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;background-image: url(&amp;#39;/images/hero-background.webp&amp;#39;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;背景画像の変換を含むいくつかの修正をまとめてデプロイしたあと、この段階で計測し直しました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Performance: 67 → &lt;strong&gt;75&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;LCP: 175.2秒 → &lt;strong&gt;5.0秒&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Total network payload: 39,910 KiB → 32,419 KiB&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;LCPは大きく改善しました。ただ、ペイロード（ページ読み込みに必要なデータの総量）はまだ32MBあります。トップページの記事カード画像がほぼそのまま残っていたからです。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;lazy-loadingだけでは足りなかった&#34;&gt;lazy loadingだけでは足りなかった&lt;/h2&gt;&#xA;&lt;p&gt;背景画像の変換と並行して、記事カードのテンプレートに &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; と &lt;code&gt;decoding=&amp;quot;async&amp;quot;&lt;/code&gt; も加えました。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;img&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;loading&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;lazy&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;decoding&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;async&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;760&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;height&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;424&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それぞれの意味はこうです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Xのリンクカードに画像が出ない原因を調べたら、featured_imageだけでは足りなかった</title>
      <link>https://blog.keyuki.net/posts/x-card-og-image-hugo-ananke/</link>
      <pubDate>Wed, 06 May 2026 19:00:00 +0900</pubDate>
      <guid>https://blog.keyuki.net/posts/x-card-og-image-hugo-ananke/</guid>
      <description>&lt;p&gt;こんなブログでも流入数を多少は増やしていきたいなという、気持ちで、試しに記事をXに投稿したとき、リンクカードに画像が出ませんでした。&lt;/p&gt;&#xA;&lt;p&gt;リンクカードというのは、XにURLを貼ったときに自動で表示される、タイトルと画像がセットになったあのプレビューのことです。ちゃんと出ると見栄えがいいし、クリックされやすくなる気がして、できれば表示させたいやつです。&lt;/p&gt;&#xA;&lt;p&gt;記事ページ自体を開くとアイキャッチ画像はちゃんと表示されていました。なのにXのカードには画像がない。「またX側の気まぐれか？」とも思ったのですが、せっかくなので原因をちゃんと調べることにしました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まずhtmlのソースを確認しました&#34;&gt;まずHTMLのソースを確認しました&lt;/h2&gt;&#xA;&lt;p&gt;Webページの裏側にはHTMLというファイルがあって、その中に「この記事のSNSカード用画像はこれです」という情報を埋め込む仕組みがあります。&lt;code&gt;og:image&lt;/code&gt; や &lt;code&gt;twitter:image&lt;/code&gt; といった「メタタグ」と呼ばれる記述がそれにあたります。&lt;/p&gt;&#xA;&lt;p&gt;まずそのメタタグが正しく出力されているかを確認しました。Hugo（このブログで使っている静的サイトジェネレーター）でサイトを一時的にビルドして、出力されたHTMLを調べました。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo --destination /private/tmp/keyuki-og-check --environment production&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rg -n &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;og:image|twitter:image|twitter:card&amp;#34;&lt;/span&gt; /private/tmp/keyuki-og-check/posts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果を見て、最初は「あ、タグ自体は出てる」と思いました。必要なメタタグは全部ありました。&lt;/p&gt;&#xA;&lt;p&gt;ところがよく見ると、どの記事もまったく同じURLを指していました。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;meta property=&amp;#34;og:image&amp;#34; content=&amp;#34;https://blog.keyuki.net/images/default-og.jpg&amp;#34; /&amp;gt;&#xA;&amp;lt;meta name=&amp;#34;twitter:image&amp;#34; content=&amp;#34;https://blog.keyuki.net/images/default-og.jpg&amp;#34; /&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;記事ごとの画像ではなく、全記事共通の &lt;code&gt;default-og.jpg&lt;/code&gt; という1枚の画像を指していました。&lt;/p&gt;&#xA;&lt;p&gt;「メタタグがない」のではなく、「メタタグはあるけど、指している画像が全部同じ共通画像だった」という状態でした。&lt;/p&gt;&#xA;&lt;h2 id=&#34;原因は-featured_image-と-images-の役割の違い&#34;&gt;原因は &lt;code&gt;featured_image&lt;/code&gt; と &lt;code&gt;images&lt;/code&gt; の役割の違い&lt;/h2&gt;&#xA;&lt;p&gt;このブログはHugo + Anankeというテーマで動いています。記事を書くとき、ファイルの先頭に設定を書く欄（「フロントマター」と呼びます）があって、そこにアイキャッチ画像のURLを指定していました。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;featured_image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://images.keyuki.net/uploads/2026/05/example-eyecatch.png&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで記事ページにはちゃんと画像が表示されます。ところがXのリンクカードはここを見ていませんでした。&lt;/p&gt;&#xA;&lt;p&gt;Hugoには &lt;code&gt;featured_image&lt;/code&gt; とは別に、SNSカード用のメタタグを生成するための &lt;code&gt;images&lt;/code&gt; という設定項目があります。HugoのOGP（Open Graph Protocolの略で、SNSにURLを貼ったときの見え方を制御する仕組みです）は、&lt;code&gt;featured_image&lt;/code&gt; ではなく &lt;code&gt;images&lt;/code&gt; を参照して動きます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;featured_image&lt;/code&gt; → 記事ページ上のアイキャッチ表示に使われる（Anankeテーマ固有の機能）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;images&lt;/code&gt; → SNSカード用メタタグの生成に使われる（Hugo本体の機能）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;images&lt;/code&gt; を設定していなければ、Hugoはサイト全体のデフォルト画像（&lt;code&gt;default-og.jpg&lt;/code&gt;）で埋めます。今回まさにその状態でした。&lt;/p&gt;&#xA;&lt;h2 id=&#34;画像サイズにも落とし穴がありました&#34;&gt;画像サイズにも落とし穴がありました&lt;/h2&gt;&#xA;&lt;p&gt;共通の &lt;code&gt;default-og.jpg&lt;/code&gt; を確認してみたら、解像度が &lt;code&gt;7200x4800&lt;/code&gt;、ファイルサイズが約7.6MBもありました。&lt;/p&gt;&#xA;&lt;p&gt;Xのリンクカードには画像のサイズ制限があります。大きすぎる画像はカードに表示されません。共通画像はその条件を超えていたため、仮にフォールバックとして読み込まれていたとしても表示されなかった可能性が高いです。&lt;/p&gt;&#xA;&lt;p&gt;SNSカード用の画像は &lt;code&gt;1200x630&lt;/code&gt;（横1200px × 縦630px）のJPEGで、ファイルサイズは数百KB以内に抑えるのが安全とされています。&lt;/p&gt;&#xA;&lt;h2 id=&#34;修正した内容&#34;&gt;修正した内容&lt;/h2&gt;&#xA;&lt;h3 id=&#34;各記事のフロントマターに-images-を追加しました&#34;&gt;各記事のフロントマターに &lt;code&gt;images&lt;/code&gt; を追加しました&lt;/h3&gt;&#xA;&lt;p&gt;公開済みの記事のフロントマター（ファイル先頭の設定欄）に &lt;code&gt;images&lt;/code&gt; を追加しました。SNSカード用の画像はアイキャッチとは別に、1200x630で作り直したものを使っています。&lt;/p&gt;</description>
    </item>
    <item>
      <title>個人ブログに Google Analytics と Microsoft Clarity を入れた理由</title>
      <link>https://blog.keyuki.net/posts/analytics-clarity-cloudflare/</link>
      <pubDate>Wed, 06 May 2026 10:00:00 +0900</pubDate>
      <guid>https://blog.keyuki.net/posts/analytics-clarity-cloudflare/</guid>
      <description>&lt;p&gt;ブログを整え直している流れで、アクセス解析まわりも見直しました。&lt;/p&gt;&#xA;&lt;p&gt;もともと Cloudflare Web Analytics は使っていましたが、今回は Google Analytics 4 と Microsoft Clarity も追加しました。&#xA;アクセス数を細かく追いかけたいというより、どの記事が読まれているのか、どこから来ているのか、読者がページ内でどう動いているのかを見られるようにしたかったからです。&#xA;まあ、そもそも誰も見にきてないんですけどね。やってみたいだけですね。&lt;/p&gt;&#xA;&lt;h2 id=&#34;もともと使っていた-cloudflare-web-analytics&#34;&gt;もともと使っていた Cloudflare Web Analytics&lt;/h2&gt;&#xA;&lt;p&gt;Cloudflare Web Analytics は、個人ブログにはかなり相性がいいと思っています。&#xA;軽くて、Cookie に依存せず、プライバシー寄りの設計です。まず全体のページビューや訪問傾向をざっくり見るだけなら、これで十分な場面も多いです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://developers.cloudflare.com/web-analytics/about/&#34;&gt;公式の説明&lt;/a&gt; によると、JavaScript の beacon と Performance API を使ってデータを収集しており、訪問者の個人データは収集・使用しない設計になっています。Core Web Vitals などのパフォーマンス指標の傾向も確認できます。&lt;/p&gt;&#xA;&lt;p&gt;「何人くらい来ているのか」「どのページが見られているのか」を日々ざっくり把握するには、これで十分です。&lt;/p&gt;&#xA;&lt;h2 id=&#34;それでも-ga4-を追加した理由&#34;&gt;それでも GA4 を追加した理由&lt;/h2&gt;&#xA;&lt;p&gt;GA4 は正直、個人ブログには機能が多すぎる面もあります。&#xA;ただ、流入元やページごとの傾向を後から掘れるのは便利です。SNS に投稿した直後の反応、検索から読まれた記事、内部リンクで回遊された記事などを見たいとき、Cloudflare より細かい分析ができます。&lt;/p&gt;&#xA;&lt;p&gt;GA4 の主な強みを整理すると:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;リアルタイムレポート&lt;/strong&gt;: 直近 5分 / 30分のアクティブユーザー、閲覧ページ、イベントをざっくり確認できる。正確な流入元の内訳は、通常のトラフィック取得レポートで後から確認する用途に向く&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;トラフィック・ユーザー分析&lt;/strong&gt;: どこから来ているか（検索、SNS、直接など）の内訳を見る&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;探索（Explorations）&lt;/strong&gt;: 標準レポートより深く、フィルタやセグメントを組み合わせて分析できる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;個人ブログでは全部使う必要はないです。「SNS に投稿したあと、どこから何人来たか」「検索から読まれている記事はどれか」といった目的を決めて、必要なところだけ見る使い方で十分だと思っています。&#xA;まだ書いたブログをSNSに投稿してないですね、やらないといけないですね。&lt;/p&gt;&#xA;&lt;p&gt;将来的に Search Console と接続してオーガニック検索の傾向を見たり、イベント設計をして内部リンクのクリックを追ったりもできるみたいですね。将来の選択肢は多い方がいいですからね。&lt;/p&gt;&#xA;&lt;h2 id=&#34;microsoft-clarity-を追加した理由&#34;&gt;Microsoft Clarity を追加した理由&lt;/h2&gt;&#xA;&lt;p&gt;Clarity は、数字というより読者の動きを見るために入れました。&#xA;他の人のブログで見て、なんだろうこれと思ってとりあえず、調べて、入れてみた感じです。&#xA;どこでスクロールが止まるのか、どのリンクが押されるのか、スマホで読みづらそうな箇所がないか。こういうことは、ページビューだけを見ていてもわかりません。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugoと Cloudflare Pages を組み合わせたブログ運用について</title>
      <link>https://blog.keyuki.net/posts/hugo-cloudflare-pages/</link>
      <pubDate>Mon, 05 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.keyuki.net/posts/hugo-cloudflare-pages/</guid>
      <description>&lt;p&gt;このブログの元となっている「Hugoと Cloudflare Pages」についてまとめます。&lt;/p&gt;&#xA;&lt;p&gt;Hugo（ヒューゴ）と Cloudflare Pages を組み合わせたブログ運用は、&lt;strong&gt;「早い・安い・高セキュリティ」&lt;/strong&gt; みたいな感じです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-全体の仕組み&#34;&gt;1. 全体の仕組み&lt;/h3&gt;&#xA;&lt;h4 id=&#34;step-1-記事の執筆ローカル環境&#34;&gt;Step 1: 記事の執筆（ローカル環境）&lt;/h4&gt;&#xA;&lt;p&gt;パソコン上で、Markdown（マークダウン）という記法を使って記事を書きます。&#xA;Hugoのコマンドを使えば、自分のPC内で瞬時にブログのプレビューを確認できます。&lt;/p&gt;&#xA;&lt;h4 id=&#34;step-2-保存と送信git-push&#34;&gt;Step 2: 保存と送信（Git Push）&lt;/h4&gt;&#xA;&lt;p&gt;記事を書き終えたら、そのファイルを「Git（ギット）」というバージョン管理ツールを使って、GitHubというインターネット上の「倉庫（リポジトリ）」へアップロード（Push）します。&lt;/p&gt;&#xA;&lt;p&gt;人間の作業はここまでです。&lt;/p&gt;&#xA;&lt;h4 id=&#34;step-3-自動検知とビルドcloudflare-pages&#34;&gt;Step 3: 自動検知とビルド（Cloudflare Pages）&lt;/h4&gt;&#xA;&lt;p&gt;GitHubに新しいファイルが届いたことを、Cloudflare Pagesが自動的に検知します。すると、Cloudflareのサーバー内でHugoが起動し、Markdownファイルを読み込んで、Webブラウザが表示できる「HTMLファイル」へと変換（ビルド）します。&lt;/p&gt;&#xA;&lt;h4 id=&#34;step-4-ブログの公開デプロイ&#34;&gt;Step 4: ブログの公開（デプロイ）&lt;/h4&gt;&#xA;&lt;p&gt;変換されたHTMLファイルは、Cloudflareにより、公開されます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-wordpressとの違い&#34;&gt;2. WordPressとの違い&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;&lt;strong&gt;特徴&lt;/strong&gt;&lt;/th&gt;&#xA;          &lt;th&gt;&lt;strong&gt;WordPress（動的サイト）&lt;/strong&gt;&lt;/th&gt;&#xA;          &lt;th&gt;&lt;strong&gt;Hugo + CF Pages（静的サイト）&lt;/strong&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;仕組み&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;注文を受けてから都度作成して表示する&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;あらかじめ作って並べておく&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;速度&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;データベースから素材を探して表示するため、少し時間がかかる。&lt;/td&gt;&#xA;          &lt;td&gt;既にある完成品（HTML）を渡すだけなので、&lt;strong&gt;早い&lt;/strong&gt;。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;セキュリティ&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;データベースに侵入されるリスクがある。&lt;/td&gt;&#xA;          &lt;td&gt;HTMLファイルだけなので、ハッキングの余地がほぼない。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;コスト&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;サーバー代や管理費がかかることが多い。&lt;/td&gt;&#xA;          &lt;td&gt;個人のブログ程度なら、ほぼ&lt;strong&gt;無料&lt;/strong&gt;で運用可能。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;3-メリット&#34;&gt;3. メリット&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;圧倒的な表示速度:&lt;/strong&gt; Hugoが生成する静的HTMLは非常に軽く、一瞬で表示されます。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;運用コストがほぼ0円:&lt;/strong&gt; Cloudflare Pagesは無料プランの枠が非常に大きく、独自ドメイン代（年間千円〜数千円）以外は無料で運用できるケースがほとんどです。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;サーバー管理が不要:&lt;/strong&gt; ソフトウェアのアップデートやセキュリティパッチ当てなどの面倒な作業がありません。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;バージョン管理:&lt;/strong&gt; 記事の履歴がGitに残るため、「間違って消した記事を元に戻す」といったことが簡単にできます。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;わたしは現在、Obsidianというmd(マークダウン)形式のエディターを利用して、ブログを書いています。Obsidianはプラグインが豊富で、Gitも導入できることから、この構成での相性が良いと考えました。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
