ブログ構築でやったこと
要件
サイト構築に関しては以下の要件を定義した。
- ホストは独自ドメインとアマゾンアフィリエイトに対応していること
- 独自ドメインは取りたい
- できるだけ安くしたい
- 記事はMarkdownで書きたい
一般的なブロクで始めるのもいいが、それだと、使い勝手が悪くなった時に移行が大変だと感じた。 なので、記事がMarkdownで書けて、それをHTMLに変換して公開するようなサービスが望ましいと感じた。 そういった中で静的ジェネレターのhugoを知った。静的ジェネレターには前々から興味がったので、これを気に勉強をするのもいかなと思った。 Markdownで書いた記事をgitで管理し、Netlifyにホスティングするのは素晴らしいシステムだと思う。Netlifyの無料枠での制限は以下のとおりである。
- 転送量:1ヶ月あたり100GB
- サーバーレス関数: 1ヶ月あたり125,000リクエストまで対応
無料枠を超えたら、有料会員にするか、AWSに移行してもいいかなとは思っている。それができるのはデータ(記事)とホスティング先が分離していることによりメリットだと感じている。 独自ドメインを取るとお金がかかるが、SEO的とか見た目的には有ったほうがいいなとは思った。アマゾンのAPIを使うことが目的なので、多少は足は出てもしょうがないとは思っている。
基本環境構築
メインの開発環境はWindowsであるため、以下はWindowsの説明である。ChatGPTとかに聞いたり、Hugo公式ドキュメントQuick startを参照した。使い分けとしてとりあえず知りたいなら、chatGPT,Gemini。参照するドキュメントは公式サイトのをみる。それに従ってエラーがでるならChatGPTを使用する。あと、コマンドを打つのはWindows Terminalを使用するとよい。色々理由はあるが、コマンドの履歴がhisotrty
で分かるからである。
- Chocolateyのインストール
まず、Chocolateyがインストールされていない場合は、以下のコマンドを管理者権限で実行してインストールします。
- 管理者としてコマンドプロンプトまたはPowerShellを開きます。
- 以下のコマンドを実行します:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
- Hugoのインストール
Chocolateyがインストールされたら、以下のコマンドを実行してHugoをインストールします
choco install hugo -confirm
- HugoExTendedのインストール
windows環境だと拡張環境が必要なので、インストールする。最初にChocolateyを最新バージョンに更新します。
Hugo Extended版をインストールするために以下のコマンドを実行します:choco upgrade chocolatey
choco install hugo-extended
ブログ構築
- 新しいサイトの構築
新しいHugoサイトを作成します。
hugo new site my-website cd my-website
- Mainroadテーマの追加
MainroadテーマをGitHubからクローンします。
git init git submodule add https://github.com/Vimux/Mainroad.git themes/Mainroad
- Mainroadテーマの設定
サイトの設定ファイル config.toml を編集し、Mainroadテーマを使うように設定します。何を追加すればいいのかMainroad | Hugo Themesを参照。hugo.tomlで作成されていたら、config.tomlに名前を変更すること。
baseURL = 'https://example.org/' languageCode = 'en-us' title = 'My New Hugo Site' theme = "mainroad" [Author] # Used in authorbox name = "John Doe" bio = "John Doe's true identity is unknown. Maybe he is a successful blogger or writer. Nobody knows it." [Params.widgets] recent_num = 5 # Set the number of articles in the "Recent articles" widget categories_counter = true # Enable counter for each category in "Categories" widget tags_counter = false # Enable counter for each tag in "Tags" widget
- 記事の追加
新しい記事を作成するには以下をする。記事を作成するごとに必要です。
公式のサイトを見ると、以下のような書き方ができる。hugo new content content/posts/my-first-post.md
--- # Common-Defined params title: "Example article title" date: "2017-08-21" description: "Example article description" categories: - "Category 1" - "Category 2" tags: - "Test" - "Another test" menu: main # Optional, add page to a menu. Options: main, side, footer # Theme-Defined params thumbnail: "img/placeholder.png" # Thumbnail image lead: "Example lead - highlighted near the title" # Lead text comments: false # Enable Disqus comments for specific page authorbox: true # Enable authorbox for specific page pager: true # Enable pager navigation (prev/next) for specific page toc: true # Enable Table of Contents for specific page mathjax: true # Enable MathJax for specific page sidebar: "right" # Enable sidebar (on the right side) per page widgets: # Enable sidebar widgets in given order per page - "search" - "recent" - "taglist" --- ここに記事の内容を書く
サイト公開処理
GitHubへのアップロード
レポジトリの作成 githubへのプッシュ。レポジトリ名は適宜変えること。
git remote add origin https://github.com/username/repository.git git add . git commit -m "Initial commit"
GitHubへのプッシュ(更新作業)はGitHub Desktopを使用した。git push -u origin master
ではコマンドラインからできなかった。
Netlifyにサイトをデプロイ
- Netlifyにログインし、「New site from Git」をクリックします。
- GitHubを選択し、先ほど作成したリポジトリを選びます。
- Build commandにはhugo、Publish directoryにはpublicと入力します。
- 「Deploy site」をクリックします。
カスタマイズ
Amazonの商品画像表示問題
記事を書いていると、アマゾンの本を紹介する時に、やっぱ本の画像とかあるといいと思うが、それはなかなかに大変ということがわかった。
- 商品画像の取得にはProduct Advertising API (PA-API)を利用している(手動でもできるけど手間)
- Product Advertising API (PA-API)を利用するためにはアフェリやらないといけない
- じゃあ始めたばっかりの私が商品の画像を取得するためには調べるとか直接Markdownでそれっぽいのをかかないといけない
- でもそこまでするのも手間だし、一旦画像なしで、APIが利用できたら置き換えればいいやと判断した。
参考になりそうなサイト(みんなAPI使って、PHPで取得するサーバを作ったり、PythonでAPIを叩いているなという感じ)