ご挨拶
本ブログの最初の投稿。
地方の大学を中退後、ものの見事に就活に苦戦し、フリーランスエンジニアとして独立し、なんとか生き延びてきた私。
前々から、何かしらアウトプットをしなければとは考えていたものの、重い腰が上がらず数年が経過。。。
ふと思い立ち、このブログを作ろうと考えたのが、2025/04/18(翌日が30歳の誕生日。20代最後の日)である。
本業でも行なっている、バックエンドエンジニア(フルスタックに片足をツッコミ気味), DevOps関連の投稿や、
趣味で行なっている、電子工作, 自宅サーバー, 3Dプリンタに関しての投稿も行いたい。
個人的な偏見だとも思うが、理系の技術職として、ふわっとした感じに受け取れる"です・ます調"の記載に気持ち悪さを感じる為、“である調"での記載をさせていただく。 ご容赦いただきたい。
本投稿のはじめに
このブログは、静的サイトジェネレーターの「Hugo」を使用して構築されている。この記事では、ブログの技術的な構成、使用しているツール、ワークフロー、こだわった点などについて解説する。Hugoに興味がある方や、半年後の自分の参考になれば幸いである。
テーマは、とりあえずで入れて、後々気に入らなければ変えれば良い程度で、適当に人気そうなものを採用した。初期構築には、最近本業の方でも積極的に利用が進められているcline+claude3.7の力を大いに借りた。(あまり細かいconfigが分かっていないので、ゆくゆくチューニングしていく予定。)
技術スタック
このブログは以下の技術スタックで構成されている:
Hugoについて
Hugoは、Go言語で書かれた高速な静的サイトジェネレーターである。以下の特徴がある:
- 高速なビルド: 数千ページのサイトでも数秒でビルド可能
- クロスプラットフォーム: Windows、macOS、Linuxで動作
- テーマ: 豊富なテーマが利用可能
- Markdown: コンテンツはMarkdown形式で記述
- ショートコード: 拡張機能を簡単に追加可能
はまりポイント
最初は、Hugoをhomebrew経由でインストールした(最新であった0.146.3)のだが、何故か本番ビルドの際にエラーで転けた。
しばらく彷徨った結果、直近のHugoのバージョンアップによる問題であることが判明。
(PaperModのレポジトリでIssueが上がっていた)
その為、どうせ他でも使うだろうとの目論見も含めて、npm経由でHugoを導入することにした。(私は自称、熱心なnode信者である。)
https://www.npmjs.com/package/hugo-extended
素敵なことに、npmのパッケージのバージョンとHugoのバージョンが一致している模様。
前述のIssue内にあった情報をもとに、一つ前のマイナーバージョンである、0.145.0を導入。
既に修正PRは作成されているので、マージされたらどこかのタイミングでアップデート予定
にしても、ブログを始めようとして、初っ端からハマるとは幸先の悪い。。。
プロジェクト構造
このブログのプロジェクト構造は以下のとおりである:
blog.untan.tech/
├── archetypes/ # 記事のテンプレート
├── assets/ # SCSS, JS, フォントなどのアセット
├── content/ # ブログコンテンツ
│ ├── posts/ # 記事ファイル
│ ├── archives.md # アーカイブページ
│ └── search.md # 検索ページ
├── data/ # Hugoデータファイル
├── layouts/ # カスタムレイアウト(必要に応じて)
├── static/ # 画像などの静的ファイル
├── themes/ # テーマ
│ └── PaperMod/ # PaperModテーマ
├── _scripts/ # カスタムスクリプト
├── hugo.toml # サイト設定ファイル
└── package.json # npm設定ファイル
設定ファイル(hugo.toml)
Hugoの設定はHugo.tomlファイルで管理している。主な設定項目は以下のとおりである:
baseURL = 'https://blog.untan.tech/'
languageCode = 'ja-jp'
title = 'エンジニアの裏庭'
theme = 'PaperMod'
# 基本設定
enableRobotsTXT = true
buildDrafts = false
buildFuture = false
buildExpired = false
enableEmoji = true
# PaperMod設定
[params]
description = "技術系ブログ - バックエンドエンジニアリング、電子工作、3Dプリンタ、自宅サーバー、DevOps"
defaultTheme = "auto" # dark, light, auto
ShowReadingTime = true
ShowShareButtons = true
ShowPostNavLinks = true
ShowBreadCrumbs = true
ShowCodeCopyButtons = true
ShowToc = true
記事の作成ワークフロー
新しい記事の作成
記事のタイトルをいちいち付けるのはとても面倒だと考え、最初はUUIDかULIDのようなものを検討していた。
しかし、Claude君に聞いたところ、SEO的には意味のある単語の方が好まれるらしい。(SEO周りは全然知見がない。。。)
なので、代替案として提案された、日付+意味のある文字列.mdを採用。
これを実現する為に、せっかく導入したので、nodeを活用した。
新しい記事を作成するには、以下のnpmスクリプトを使用する:
npm run new_page -name=記事の名前
このコマンドは、_scripts/new-page.jsスクリプトを実行し、以下のような処理を行う:
- 現在の日付を取得(YYYY-MM-DD形式)
- 指定された名前をハイフン区切りに正規化
Hugo new posts/YYYY-MM-DD-記事の名前.mdコマンドを実行- 記事のテンプレートファイルを生成
記事の編集
生成された記事ファイルは以下のようなフロントマター(メタデータ)を持つ:
---
title: "記事のタイトル"
date: 2025-04-18T21:43:33+09:00
draft: true
tags: ["タグ1", "タグ2"]
categories: ["カテゴリー"]
description: "記事の説明"
toc: true
---
これらのメタデータを編集し、本文をMarkdown形式で記述する。
ローカルプレビュー
記事を編集しながら、以下のコマンドでローカルプレビューを確認できる:
npm run start_dev
ブラウザで http://localhost:1313/ にアクセスすると、リアルタイムでプレビューが表示される。
PaperModテーマのカスタマイズ
このブログでは、PaperModテーマを使用している。PaperModは以下の特徴を持つ人気のHugoテーマである:
- レスポンシブデザイン
- ダークモード/ライトモードの切り替え
- 検索機能
- 目次(TOC)
- コードのシンタックスハイライト
- SEO対策
テーマのカスタマイズは主にhugo.tomlファイルで行うが、より高度なカスタマイズが必要な場合は、assets/css/extended/ディレクトリにCSSファイルを追加することも可能である。
デプロイ方法
このブログはCloudflare Pagesを使用してデプロイしている。デプロイの流れは以下のとおりである:
- GitHubリポジトリにコードをプッシュ
- Cloudflare PagesがGitHubリポジトリの変更を検知
- 自動的にHugoビルドを実行
- ビルドされたサイトをCloudflare CDN経由で配信
ビルド設定は以下のとおりである:
- フレームワークプリセット:
hugo - ビルドコマンド:
hugo --minify - 公開ディレクトリ:
public - 環境変数:
HUGO_VERSION: 0.145.0
検索機能の実装
PaperModテーマには検索機能が組み込まれている。この機能を有効にするために、以下の設定を行っている:
content/search.mdファイルの作成hugo.tomlの[outputs]セクションでJSON出力を有効化- メニューに検索ページへのリンクを追加
まとめ
このブログは、Hugoという高速な静的サイトジェネレーターとPaperModというテーマを使用して構築されている。Markdownで記事を書き、GitHubでバージョン管理し、Cloudflare Pagesで自動デプロイする、というモダンなワークフローを採用している。
静的サイトジェネレーターを使用することで、以下のメリットがある:
- 高速なページ読み込み: 動的なサーバー処理が不要
- セキュリティ: 攻撃対象となるサーバーサイドコードがない
- 低コスト: 静的ファイルのホスティングは無料または低コスト
- バージョン管理: コンテンツをGitで管理可能
今後も、このブログを通じて技術的な知見を共有していく。