<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>技術メモ on Keyuki Blog</title>
    <link>https://blog.keyuki.net/categories/tech/</link>
    <description>Recent content in 技術メモ on Keyuki Blog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Tue, 12 May 2026 18:00:00 +0900</lastBuildDate>
    <atom:link href="https://blog.keyuki.net/categories/tech/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>NumLock の必要性に関する考察</title>
      <link>https://blog.keyuki.net/posts/numlock-necessity/</link>
      <pubDate>Tue, 12 May 2026 18:00:00 +0900</pubDate>
      <guid>https://blog.keyuki.net/posts/numlock-necessity/</guid>
      <description>&lt;p&gt;NumLock は、普段はほとんど意識されないキーです。&#xA;しかし、何かの拍子にオフになると、テンキーで数字を打っているつもりがカーソル移動になり、急に存在感を放ちます。&lt;/p&gt;&#xA;&lt;p&gt;押した覚えはない。けれど、確かに何かが変わっている。&#xA;あー、、となる。&lt;/p&gt;&#xA;&lt;p&gt;この記事では、NumLock を「不要なキーだ」という愚痴だけで片付けず、なぜ生まれ、なぜ今も残っているのかを考えます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;numlock-は何を切り替えているのか&#34;&gt;NumLock は何を切り替えているのか&lt;/h2&gt;&#xA;&lt;p&gt;NumLock は、テンキーを「数字入力」として使うか、「カーソル移動・ナビゲーション」として使うかを切り替えるキーです。&lt;/p&gt;&#xA;&lt;p&gt;試しにテンキーをよく見てみると、&lt;code&gt;4&lt;/code&gt; のキーに &lt;code&gt;←&lt;/code&gt;、&lt;code&gt;8&lt;/code&gt; に &lt;code&gt;↑&lt;/code&gt;、&lt;code&gt;2&lt;/code&gt; に &lt;code&gt;↓&lt;/code&gt;、&lt;code&gt;6&lt;/code&gt; に &lt;code&gt;→&lt;/code&gt; が印字されているキーボードがあります。&lt;code&gt;7&lt;/code&gt; に &lt;code&gt;Home&lt;/code&gt;、&lt;code&gt;1&lt;/code&gt; に &lt;code&gt;End&lt;/code&gt;、&lt;code&gt;9&lt;/code&gt; に &lt;code&gt;PgUp&lt;/code&gt;、&lt;code&gt;3&lt;/code&gt; に &lt;code&gt;PgDn&lt;/code&gt;、&lt;code&gt;0&lt;/code&gt; に &lt;code&gt;Ins&lt;/code&gt;、&lt;code&gt;.&lt;/code&gt; に &lt;code&gt;Del&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;数字専用のエリアだと思っていたのに、ナビゲーション操作まで兼ねていた。私はこれを初めてちゃんと見たとき、少し驚きました。&lt;/p&gt;&#xA;&lt;p&gt;NumLock は「数字を固定するキー」というより、「テンキーの役割を切り替えるキー」と呼ぶほうが正確なんですよね。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なぜ昔は必要だったのか&#34;&gt;なぜ昔は必要だったのか&lt;/h2&gt;&#xA;&lt;p&gt;初期の PC キーボードは、現代ほどキー数が豊富ではなかったそうです。矢印キーや Home・End・Page Up・Page Down が独立して並んでいるのが当然、という感覚は、わりと最近の話です。&lt;/p&gt;&#xA;&lt;p&gt;そのような環境では、テンキーに複数の役割を持たせることは合理的な設計でした。数字を入力したいときは NumLock をオンにして、カーソルを動かしたいときはオフにして方向キーとして使う。キーの絶対数が少ない中で、限られたスペースを有効に使おうという発想です。&lt;/p&gt;&#xA;&lt;p&gt;意味があったんです。当時の設計者を責める話ではなく、制約の中でちゃんと考えた結果がこれだったということです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;現代ではなぜ不要に見えるのか&#34;&gt;現代ではなぜ不要に見えるのか&lt;/h2&gt;&#xA;&lt;p&gt;現代のフルサイズキーボードには、矢印キーと独立したナビゲーションキー（Home・End・Page Up・Page Down・Delete）が揃っています。テンキーにカーソル操作を期待する必然性は、ほとんどなくなりました。&lt;/p&gt;&#xA;&lt;p&gt;多くのユーザーにとって、テンキーは「数字を素早く入力するためのエリア」です。その前提に立つと、NumLock は「できることを増やすキー」ではなく、「できていた数字入力を突然できなくするキー」に見えます。&lt;/p&gt;&#xA;&lt;p&gt;テンキーで &lt;code&gt;1&lt;/code&gt; を押したら &lt;code&gt;End&lt;/code&gt; が動いた。この体験、何度やっても慣れないんですよね。キーを引っこ抜きたくなる衝動に駆られます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;問題は状態を持つキーであること&#34;&gt;問題は「状態を持つキー」であること&lt;/h2&gt;&#xA;&lt;p&gt;NumLock の本質的な厄介さは、押した瞬間にあるのではなく、&lt;strong&gt;状態が残ること&lt;/strong&gt;にあります。&lt;/p&gt;&#xA;&lt;p&gt;キーボードには、押すたびに状態が切り替わる「トグルキー」が存在します。NumLock、CapsLock、Insert がその代表です。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;CapsLock&lt;/strong&gt;: アルファベットを大文字入力に固定する&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Insert&lt;/strong&gt;: テキスト編集を挿入モードと上書きモードで切り替える&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;NumLock&lt;/strong&gt;: テンキーの役割を数字入力とカーソル操作で切り替える&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;これらのキーに共通するのは、押した瞬間ではなく「後になって気づく」という体験です。なぜか挙動が変わっている。何が起きているのか分からない。そのじわじわした不快さがある。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Claude Code を純正 Claude と Ollama で使い分けるために ollama-cc を作った</title>
      <link>https://blog.keyuki.net/posts/claude-code-ollama-cc-wrapper/</link>
      <pubDate>Sat, 09 May 2026 18:00:00 +0900</pubDate>
      <guid>https://blog.keyuki.net/posts/claude-code-ollama-cc-wrapper/</guid>
      <description>&lt;p&gt;Claude Code の操作感はかなり気に入っています。&#xA;ファイルを読んで、コマンドを実行して、差分を見ながら進める作業ハーネスとしては優秀で、できればこの操作感のまま使い続けたい。&lt;/p&gt;&#xA;&lt;p&gt;ただ、Claude Pro のレート制限は自分の使い方だとかなり厳しく感じました。&#xA;せめて計画は純正 Claude に任せて、実装作業はもう少し安いモデルに逃がせないか。そんな動機で Ollama 経由の Claude Code を試し始めました。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;この記事の結論&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;純正 Claude Code は &lt;code&gt;claude&lt;/code&gt; のまま使う&lt;/li&gt;&#xA;&lt;li&gt;Ollama 経由で使いたい時だけ &lt;code&gt;ollama-cc&lt;/code&gt; を起動する&lt;/li&gt;&#xA;&lt;li&gt;接続先の切り替えは、毎回のコマンド実行時にだけ環境変数として渡す&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;前提環境&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ollama v0.14.0 以降（Anthropic API 互換対応）&lt;/li&gt;&#xA;&lt;li&gt;Claude Code（最新版）&lt;/li&gt;&#xA;&lt;li&gt;macOS（自分の環境は macOS）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;他の選択肢も見たがいったん-ollama-pro-に寄せた&#34;&gt;他の選択肢も見たが、いったん Ollama Pro に寄せた&lt;/h2&gt;&#xA;&lt;p&gt;Ollama に決め打ちしていたわけではなく、Z.ai のコーディングプランや MiniMax のトークン課金プランも見ました。&#xA;ただ、Z.ai は検討している間に大きく値上げされ、当時は速度面の評判も気になりました。正直、契約しない理由を探していたところもあると思います。&lt;/p&gt;&#xA;&lt;p&gt;MiniMax は速くて安いという評判を見かけましたが、試しに Ollama Cloud 経由で触った範囲では、日本語の返事が自分の普段使いには少し厳しそうでした。&lt;/p&gt;&#xA;&lt;p&gt;その点、Ollama Pro はオープンモデルをいくつか試せて、Claude Code の操作感と組み合わせるにはちょうどよさそうに見えました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;何が起きたのか分からなかった&#34;&gt;何が起きたのか分からなかった&lt;/h2&gt;&#xA;&lt;p&gt;Claude Code をいつも通りの Claude Pro と、Ollama Cloud のモデル経由の両方で使いたくなりました。&lt;/p&gt;&#xA;&lt;p&gt;ところが、同じ Mac であれこれ起動しているうちに、純正の &lt;code&gt;claude&lt;/code&gt; が API エラーになったり、Ollama 用に起動したつもりの画面が Claude Pro の初期設定に流れたりしました。&lt;/p&gt;</description>
    </item>
    <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>メインPC変更 M4 Mac miniを買った話</title>
      <link>https://blog.keyuki.net/posts/m4-mac-mini-workstation/</link>
      <pubDate>Tue, 05 May 2026 01:03:00 +0900</pubDate>
      <guid>https://blog.keyuki.net/posts/m4-mac-mini-workstation/</guid>
      <description>&lt;h2 id=&#34;m4-mac-miniを購入しました&#34;&gt;M4 Mac miniを購入しました。&lt;/h2&gt;&#xA;&lt;p&gt;これまでは古いノートPCや手元の端末でなんとかしていましたが(愛着はあった)、AIを勉強したり、その他作業をしていく上で、やはり据え置きのちょっとはパワーのあるマシンが欲しくなりました。&lt;/p&gt;&#xA;&lt;p&gt;そこで選んだのが、M4 Mac miniです。&lt;/p&gt;&#xA;&lt;p&gt;実際に使ってみると、iPadからSSHやJump Desktopで接続して作業できる環境がかなり快適でした。一方で、大規模なローカルLLMを本格的に回すには限界もあります。&lt;/p&gt;&#xA;&lt;p&gt;この記事では、なぜMac miniを買ったのか、どんな用途で使っているのか、実際に買ってよかった点・微妙だった点をまとめます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;きっかけはopenclawだった&#34;&gt;きっかけはOpenClawだった&lt;/h2&gt;&#xA;&lt;p&gt;Mac miniを買おうと思ったきっかけは、OpenClawでした。&lt;/p&gt;&#xA;&lt;p&gt;当時、OpenClawがとても話題になっていて、自分でも本格的に触ってみたいと思うようになりました。OpenClawはAIエージェントや外部ツールを組み合わせて動かす仕組みなので、試すにはある程度安定した環境が必要です。&lt;/p&gt;&#xA;&lt;p&gt;ただ、当時メインで使っていたLet&amp;rsquo;s noteの調子がだんだん悪くなってきていました。OSの不調を直すほどの技術力は私にはありません。普段使いならまだしも、Dockerを動かしたり、CLIツールを入れたり、常時起動に近い形で使ったりするには少し不安があります。&lt;/p&gt;&#xA;&lt;p&gt;「これからAIツールを色々試していくなら、ちゃんとした作業用のPCが必要だな」&lt;/p&gt;&#xA;&lt;p&gt;そう思って、Mac miniを買うことにしました。&lt;/p&gt;&#xA;&lt;p&gt;結果的に、Mac miniはかなり良い選択でした。OpenClaw、Claude Code、Ollama、Docker、まわりの作業を集約できるようになり、iPadやiPhoneからリモートで触れる環境も作れました。&lt;/p&gt;&#xA;&lt;p&gt;今振り返ると、Mac miniは単なるPCの買い替えではなく、AI時代の作業環境を整えるための投資だったと思います。（思いたいです）&lt;/p&gt;&#xA;&lt;h2 id=&#34;欲しかったのは安定して動く開発用マシン&#34;&gt;欲しかったのは「安定して動く開発用マシン」&lt;/h2&gt;&#xA;&lt;p&gt;Mac miniに求めていたのは、普段使いのPCではなく、AIツールや自動化環境をいつでも動かせる自宅の作業基地でした。（私は非エンジニアですが、、興味はあるんですね）&lt;/p&gt;&#xA;&lt;p&gt;具体的には、こんな用途を想定していました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;OpenClaw / Discord bot / Telegram連携のような常駐系ツールを動かしたい&lt;/li&gt;&#xA;&lt;li&gt;Claude Code、Codex、まわりの作業環境を試してみたい&lt;/li&gt;&#xA;&lt;li&gt;DockerやCLIツールを常に触れる環境にしたい&lt;/li&gt;&#xA;&lt;li&gt;iPadやiPhoneから外出先でもアクセスしたい&lt;/li&gt;&#xA;&lt;li&gt;古いLet&amp;rsquo;s noteや古いMacBook Proでは、常駐運用に不安があった&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ノートPCを開きっぱなしにしておくのではなく、据え置きの常駐マシンとして置いておけるのが大きいです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なぜmac-miniにしたのか&#34;&gt;なぜMac miniにしたのか&lt;/h2&gt;&#xA;&lt;p&gt;Mac miniを選んだ理由は、流行っていたから、、もとい、自分の用途にかなり合っていたからです。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;省スペース&lt;/strong&gt;: 机の端に小さな箱を置いておく感覚で済む&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;静か&lt;/strong&gt;: 常時稼働させる機械として、静音性は大きい&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;消費電力が少ない&lt;/strong&gt;: 24時間動かしても電気代が気にならない&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;常時起動に向いている&lt;/strong&gt;: スリープ運用もしやすい&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;macOSなのでAI系CLIとの相性が良い&lt;/strong&gt;: Claude Codeや各種CLIツールがそのまま動く&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;iPadやiPhoneからリモート操作しやすい&lt;/strong&gt;: SSH + Tailscaleでどこからでも接続できる&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;外付けSSDを使えば本体ストレージ少なめでも運用できる&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;「サーバーを置く」というより、「机の端に小さな箱を置いておく」感覚で済むのがMac miniの強みです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;選んだ構成m4--24gbメモリ&#34;&gt;選んだ構成：M4 / 24GBメモリ&lt;/h2&gt;&#xA;&lt;p&gt;構成はM4チップ・メモリ24GBにしました。&lt;/p&gt;&#xA;&lt;p&gt;メモリは当初から「最小構成でいいのか」「盛るべきか」をかなり悩みました。結果的に24GBにしておいてよかったと思っています。&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>
