<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Hugo on Yoshiyuki Kurose</title><link>http://yoshiyuki-140.github.io/tags/hugo/</link><description>Recent content in Hugo on Yoshiyuki Kurose</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Mon, 15 Jun 2026 13:28:43 +0900</lastBuildDate><atom:link href="http://yoshiyuki-140.github.io/tags/hugo/index.xml" rel="self" type="application/rss+xml"/><item><title>タイトルからHugoのSlugを自動生成してくれるCLIツールを作ってみた!</title><link>http://yoshiyuki-140.github.io/posts/generate-hugo-slugs-cli-tool/</link><pubDate>Mon, 15 Jun 2026 13:28:43 +0900</pubDate><guid>http://yoshiyuki-140.github.io/posts/generate-hugo-slugs-cli-tool/</guid><description>&lt;h1 id="概要"&gt;概要&lt;/h1&gt;
&lt;p&gt;Hugo&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;は静的サイト生成のためのツールで，マークダウンで書いた記事等をHTML/CSSファイルにしてくれます．
しかしHugoは新しい記事のテンプレートを作る際にSlug&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;を考える必要があり，手間でした．
uuidgen&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;などを使っても同様の省力化はできますが，その場合は生成されるテンプレートファイル名と記事の中身が紐づかず管理が面倒になってしまいます．
そこで，軽量なローカルLLMを使うことでタイトルに意味が紐づいたSlugを生成してくれるCLIツール&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;を作成しました．&lt;/p&gt;
&lt;p&gt;&lt;img alt="動作例" loading="lazy" src="http://yoshiyuki-140.github.io/posts/generate-hugo-slugs-cli-tool/images/output.gif"&gt;&lt;/p&gt;
&lt;h2 id="仕組み"&gt;仕組み&lt;/h2&gt;
&lt;p&gt;&lt;img alt="コンポーネント" loading="lazy" src="http://yoshiyuki-140.github.io/posts/generate-hugo-slugs-cli-tool/images/image-1.png"&gt;&lt;/p&gt;
&lt;p&gt;仕組みはシンプルです．&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;① ユーザにセクション名と作成予定の記事のタイトルを聞きます．&lt;/li&gt;
&lt;li&gt;② LLMに適切なシステムプロンプトとユーザが入力した記事のタイトルを与え，Slugの候補を生成してもらいます．&lt;/li&gt;
&lt;li&gt;③ Slugの候補は必要に応じて再生成し，決まり次第hugoのコマンドを呼び出して記事のひな形を作成します．&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;p&gt;前提として，Ollama&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;とHugo&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;の&lt;a href="https://github.com/gohugoio/hugo#standard-edition"&gt;Standard edition&lt;/a&gt;をインストールしておく必要があります．&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hugo-llslug&lt;/code&gt;自体のインストール方法は&lt;a href="https://github.com/yoshiyuki-140/hugo-llslug/blob/main/docs/README.ja.md#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB"&gt;こちら&lt;/a&gt;にまとめました．
プラットフォームに合わせてインストールしてください．&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;このツールによりhugoで記事を書き始める手間が減り，かつローカルLLMなのでネットがない場所でも楽しく記事を書き始めることができます．&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://gohugo.io/"&gt;Hugo Top Page&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref1:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Glossary/Slug"&gt;Slug(スラッグ)&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;&lt;a href="https://man7.org/linux/man-pages/man1/uuidgen.1.html"&gt;uuidgenコマンド&lt;/a&gt;&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;&lt;a href="https://github.com/yoshiyuki-140/hugo-llslug"&gt;hugo-llslug GitHub&lt;/a&gt;&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;&lt;a href="https://ollama.com/"&gt;Ollama Top Page&lt;/a&gt;&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>ラズパイサーバーからGitHub Pagesへ移行</title><link>http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/</link><pubDate>Wed, 10 Jun 2026 23:26:11 +0900</pubDate><guid>http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/</guid><description>&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;ラズベリーパイからサーバー運用を始め，その後はデスクトップPCでKubernetesを動かすところまで経験しました．
この過程でネットワークの仕組みを学ぶことができました．&lt;/p&gt;
&lt;p&gt;こうした経験は，残しておかなければ忘れてしまうため，本稿にまとめます．&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="サーバー運用の変遷"&gt;サーバー運用の変遷&lt;/h2&gt;
&lt;p&gt;以下の画像は，直近でGitHubのプロフィールに掲載していたサーバーの運用記録です．&lt;/p&gt;
&lt;p&gt;&lt;img alt="自宅サーバーの運用記録" loading="lazy" src="http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/images/image.png"&gt;&lt;/p&gt;
&lt;h3 id="1-初期ラズベリーパイ"&gt;1. 初期：ラズベリーパイ&lt;/h3&gt;
&lt;p&gt;初期のサーバー構成は以下の通りです．&lt;/p&gt;
&lt;p&gt;&lt;img alt="自宅ラズベリーパイサーバー構成図" loading="lazy" src="http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/images/image-2.png"&gt;&lt;/p&gt;
&lt;p&gt;このラズパイサーバーは，空冷ファンとSSDを増設したものです．
可用性を向上させるために増設したのですが，周辺機器を増やした影響で電源供給が不安定になってしまっていました．
突発的にSSDの読み取りに失敗することがあり，頻繁にサーバーが落ちるエラーを抱えていました．&lt;/p&gt;
&lt;h3 id="2-中期デスクトップpc"&gt;2. 中期：デスクトップPC&lt;/h3&gt;
&lt;p&gt;ラズパイの電源課題を解決するため，余っていたデータ分析用のゲーミングデスクトップPCをUbuntu Server化し，運用を始めることにしました．&lt;/p&gt;
&lt;p&gt;マシンスペックが向上し，懸念だった電源回りも大幅に改善しました．この時期はコンテナオーケストレーションの学習を兼ねて，MicroK8sを導入．GitHubでビルドしたWebサイトのコンテナイメージを自動でPullし，K8sランタイム上で動作させていました．&lt;/p&gt;
&lt;p&gt;以前，環境構築の勉強のために一からKubernetesを構築した経験があったのですが，それに比べるとMicroK8sは簡単に導入でき，個人運用のコンテナランタイムとしては管理コストを抑えられる点が素晴らしいと感じました．&lt;/p&gt;
&lt;p&gt;加えて，Prometheusも導入し，Grafanaを利用してサーバーの状態を可視化していました．
MicroK8sでは，こうした周辺ツールの導入もアドオンとして用意されており，導入が手軽でした．&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img alt="Grafanaの管理画面" loading="lazy" src="http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/images/image-1.png"&gt;
Grafanaを導入したときのスクショです．きれいすぎてビビりました．&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;しかし，スペックや運用環境は大幅に向上したものの，物理的な単一ノードであることには変わりなく，可用性の低さが依然として課題となりました．&lt;/p&gt;
&lt;h3 id="3-現在github-pagesへの移行"&gt;3. 現在：GitHub Pagesへの移行&lt;/h3&gt;
&lt;p&gt;運用コストを抑えつつ，高い可用性を維持したいと考えた結果，最終的にWebサイトのホスティング先を GitHub Pages へ移行することにしました．
これにより，安価かつ高い可用性を実現できました．&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="学んだ技術"&gt;学んだ技術&lt;/h2&gt;
&lt;p&gt;今回のインフラ刷新と運用の変遷を経て，以下の技術への理解が深まりました．&lt;/p&gt;
&lt;h3 id="静的サイト生成とcicd"&gt;静的サイト生成とCI/CD&lt;/h3&gt;
&lt;p&gt;現在のWebサイトは，静的サイト生成ツールである Hugoを使って構築しています．記事の内容はMarkdownで執筆し，HugoでHTML/CSSにビルドしたものをGitHub Pagesで公開する仕組みです．&lt;/p&gt;
&lt;p&gt;デプロイの自動化（CI/CD）を整えるにあたっては，Hugo公式が提供しているGitHub Actions用のテンプレートを利用しました&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;．&lt;/p&gt;
&lt;p&gt;MarkdownをGitHubにPushするだけで自動的にサイトが更新される環境が整い，運用の手間が大幅に削減されました．&lt;/p&gt;
&lt;h3 id="cloudflare-zero-trustによる公開"&gt;Cloudflare Zero Trustによる公開&lt;/h3&gt;
&lt;p&gt;勉強のために始めた自宅サーバーですが，外部公開のステップでも大きな学びがありました．
通常ならポート開放が必要なところですが，Cloudflare Tunnel&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;を利用することで，ポートを閉じたまま安全に外部公開する仕組みを構築できました．&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ラズパイの故障対応から始まり，MicroK8sでの本格的なコンテナ運用，そしてGitHub Pagesへの移行と，目的や課題に応じてインフラを変化させていくプロセスが面白かったです．&lt;/p&gt;
&lt;p&gt;物理マシンを触りながらインフラ領域について学んだことを，今後の開発に活かしていきたいです．&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://gohugo.io/host-and-deploy/host-on-github-pages/"&gt;Host on GitHub Pages | Hugo&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/"&gt;Cloudflare Tunnel&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item></channel></rss>