プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

Hugo で一覧ページを表示しない方法

Google Play で公開している避難所検索@伊勢ですが、ほそぼそとメンテナンスしています。

先日、Play Console を見ていたら、まだプライバシーポリシーを追加していなかったことに気づいたので、仕事が一段落したタイミングでプライバシーポリシーを追加しました。インターネット上にプライバシーポリシーのページを作って、そのURLを Play Console で指定するだけなのでそんなにややこしい話でもないはずです。

ということで、避難所検索@伊勢のサポートページに、サクッと追加しようと思いきや、意外と手間取ってしまいました。なので、その顛末をメモにしておきます。

避難所検索@伊勢のサポートページについて

森ソフトのWebサイトは Hugo で運用しており、その中の一つとして、避難所検索@伊勢のサポートページがあります。このページは、

サーバー名/escape/

で公開しており、 Hugo のディレクトリ構成は下記のようになっています。

content
├── about.md
├── contact.md
├── escape
│   ├── images
│   │   └── google-play-badge.png
│   └── index.md
├── maptile.md
└── news
    ├── 20180122.md

escape フォルダが、こちらの記事で少し触れた Leaf Bundle になっている形です(index.md ファイルとともに、画像ファイルを置いています)。

これに対して、プライバシーポリシーのページを

サーバー名/escape/privacypolicy/

のような形で追加したいと考えました。

問題

ところが、 content/escape のフォルダは Leaf Bundle のため、単純に別記事の .md ファイルを追加しても、記事として公開されません。 また、もし、 content/escape のフォルダを Branch Bundle に変更すると、複数記事を持つことができるのですが、記事一覧のリストページが生成されてしまいます (url も『 BrachBundle のフォルダ名/記事のファイル名』の形式になってしまいちょっと冗長です)。

なので、どう対応すればよいのか?ということで悩んでしまいました。

解決策

いろいろと試したところ、今回の結論としては、 Branch Bundle に変更して、リストページを自動的に生成させないようにすることで、対応しました(もっといい解決方法があるかもしれませんが、その辺は Hugo に詳しい方にお願いしたいと思います)。

以下で、実際に設定した内容について示したいと思います。

headless 設定について

Leaf Bundle だと、 Front matter に

headless: true

を追加すると、その Leaf Bundle を生成しないようにできるようです(これを Headless Bundle と呼ぶようです)。

実際、適当な Leaf Bundle を作って試してみると、 Leaf Bundle は headless になって、その URL でなにも表示されなくなります。

これと同じことが、 Branch Bundle でできれば、リストページが作成されなくなると思ったのですが、残念ながら Branch Bundle の場合は Front Matter に headless を追加しても普通にリストページが表示されました( headless は Leaf Bundle でのみ有効なようです)。

これだと困るので調べていくと、 Branch Bundle でリストページを生成しない方法がありました。

_build オプション

こちらの記事

How to disable list page only? - support - HUGO

に紹介されているように、Front Matter に _build オプションを追加すると、指定したページを生成しなくなるそうです。

ということで、 escape フォルダにある index.md を _index.md に変更し( Branch Bundle に変更し)、このファイルの Front Matter を下記のようにすると

---
title: "escape branch bundle"
date: 2021-05-31T22:40:00+09:00
_build:
  list: never
  render: never
  publishResources : false
---

このURL(サーバー名/escape/)でアクセスしても何も表示されません(404とかが返るのではなく、空白のページになります)。

できましたね。ということで、これでリストページを抑制することができれば、なんとかなりそうです。

URL を割り振りなおし

Hugo の各記事は Front matter の指定がなければディレクトリ構成から URL が決まります。一方、 Front Matter に url 変数を指定することでその指定した URL で記事を表示させることができます。

ということで、いままでの避難所検索@伊勢の説明ページを改めて、 content/escape/escape.md として保存し、

サーバー名/escape/

でアクセスできるように url 変数を設定します。

---
title: "避難所検索@伊勢 サポートページ"
date: 2021-05-24T10:35:00+09:00
url: "/escape/"
---

さきほどの _build オプションでリストページの生成を抑制していますが、抑制したものと同じ URL を指定しても問題なく表示されました。

レイアウトファイルを切り替え

さて、これで問題ないかと思ったのですが、現在のテーマの場合、リストページ以下の記事の表示と通常の記事では若干レイアウトが異なっています。

リストページ以下の記事の場合

通常の記事の場合

記事の右上に、日付があったり、記事の右側に検索窓があったりと微妙に異なっています。

上記で作成したプライバシーポリシーのページも、 Branch Bundle 以下にあるため、前者のレイアウトになっています。

このままでもいいんですが、やっぱり他とデザイン的に合わせたいので、これを通常の記事用のレイアウトを使うように変更しておきます。

Front Matter に layout 変数を指定するとレイアウトファイルを指定できるそうです。別の方法として、表示対象ページの Content Type を指定することで、結果的に適用するレイアウトファイルを切り替えることもできるようです。

今回は、一部変更した特別なレイアウトファイルを指定するのではなく、通常の記事のレイアウトを適用したいだけなので、後者の方法を採用しました。

具体的な設定方法

いま使っているテーマ(universal)を見ると layouts フォルダ以下に page というがあり、そちらに single.html というファイルがあります。

─ layouts
  ├── 404.html
  ├── _default
  │   ├── list.html
  │   └── single.html
  ├── archetypes
  │   └── default.md
  ├── index.html
  ├── page
  │   └── single.html
  └── partials
      ├── breadcrumbs.html

このファイルは、レイアウトファイルの探索順の type の説明

Type

Is value of type if set in front matter, else it is the name of the root section (e.g. “blog”). It will always have a value, so if not set, the value is “page”.

と書かれている場合の "page" に対応していると思われます(とはいえ、 layouts フォルダ以下のフォルダ名に関するドキュメントを見つけられなかったので、あくまでも推測です)。つまり、type指定がなく、かつセクション以下にない、通常の記事に対応したレイアウトファイルになります。

一方、 Branch Bundle 以下の記事など、セクション内の記事は上記の説明より type がセクション名になるので、こちらではなく _default/single.html を使うと思われます。

ということで、現状のままだと、この escape Branch Bundle は escape セクションとして扱われるので、 type の値もセクション名( escape )になり、検索窓付のレイアウトファイルが適用されることになっていそうです。

なので、Front Matter で type を page にすることで、通常の記事のレイアウトファイルを適用することができそうです。

実際に Front Matter に設定して試してみると、うまくいきました。

---
title: "避難所検索@伊勢 サポートページ"
date: 2021-05-24T10:35:00+09:00
url: "/escape/"
type: "page"
---

同様に、プライバシーポリシーの記事の Front Matter にも type を設定して、想定のように表示されるようにします。

---
title: "避難所検索@伊勢 プライバシーポリシー"
date: 2021-05-31T16:20:00+09:00
type: "page"
---

(こちらは url はデフォルトの値でよいので指定していません)

まとめ

一応、上記の設定でうまく表示することができました。使い始めは簡単なのですが、ちょっと手を加えようとすると英文の記事をあれこれ調べないといけないのがちょっと面倒ですね。もっと、日本語ドキュメントが増えてほしいなー。

Google Apps Script 新エディターでのデプロイについて

細々ですが、 Google Apps Script を使っています。 GAS でスクリプトを組んで、定期的に実行していたのですが、先日エラーが発生しました。

大した問題ではなかったので、簡単に修正したところまではよかったのですが、いざデプロイしようとおもったら、以前のエディタとちょっと違っていたので戸惑ってしまいました。

ということで、自分用のメモとして、デプロイ方法についてまとめておきます。

新エディタについて

改めて調べてみると、新エディタは 2020年12月 にリリースされているようです。

いろいろと変更点はあるようです。場合によっては新エディタだと困るケースもありそうですが、今回の私の場合は特に問題なかったです。変更点については、ネットで調べるとあれこれ出てきます。例えば、下記などをご参照ください。

Google Apps Script の新しい IDE の機能、変更点まとめ - Qiita

旧エディタでのデプロイについて

私が行っていたデプロイ方法はこんな感じでした。

  1. リリースしたい内容を保存
  2. メニューの『ファイル』->『版を管理』を選択
  3. バージョンを作成
  4. メニューの『公開』->『マニフェストから配置』を選択
  5. デプロイ画面で『Create』を選択し、発行したバージョン等を設定し、最後に『Save』ボタンを押す
  6. メニューの『編集』->『現在のプロジェクトのトリガー』を選択し、作成したデプロイに対してトリガーを設定

このようにして、トリガーで自動的に実行させていました。

新エディタでのデプロイについて

新エディタで修正後、エディタ画面の右上に『デプロイ』と書かれたボタンがあるので、これをクリックすると、下記のようなメニューが表示されます。

ここから、『新しいデプロイ』を選択すると、

のような画面が表示されます。『デプロイタイプを選択してください』とあるので、左側の『種類の選択』の歯車アイコンをクリックすると、

のようにメニューが表示されます。

しかし、ここには旧エディタにあった『マニフェストから配置』に対応するものが見当たりません。 『ライブラリ』以外のメニュー(ウェブアプリ、実行可能API、アドオン)は旧エディタにもあったものです。

なので、『マニフェストから配置』が『ライブラリ』に対応しているようにも思えますが、ライブラリというと作成して他のプロジェクト等で共有するというイメージがあるので、微妙に違っているようにも思われます。 このため、これどうしたらいいんだろうか?と小一時間ほど悩んだんですが、新エディタで『デプロイを管理』を選び、既存のデプロイを見てみると、

のように『ライブラリ』のところにURLが記載されています。

ということで、やはり、旧エディタの『マニフェストから配置』は、新エディタの『ライブラリ』としてデプロイすることに該当するんじゃないかな?と思われます。

一応、上記の推測を元に、実際に試してみると、特に問題も発生せずにデプロイできました。新たにデプロイしたものに、トリガーを設定したものも、問題なく実行できました。

分かってみれば簡単なことで、ライブラリを選択すればよかったようです(ライブラリ選択時に画面に表示される説明をよく読むと、プロジェクトを共有しないと結局他のユーザーから使えない旨のことが書かれてました)。

にしても対応がわかりにくいですよ > Google さん

タイルサーバー( Dell T105 )が壊れました

先日、タイルサーバーの様子を見てみると、電源が落ちてます。サーバーなので、常時稼働なのですが、何かあったようです。ここしばらく、ファンの音が急にうるさくなってきていたので、その関係で何かトラブルがあったな、と思われます。

とりあえず、一度電源を入れて起動してみると、

xxx Thermal Failure

(だったかな?)のような表示が起動時に出て、その後は問題なく立ち上がります。

でも、ファンの音が異様に静かなので、これは内部のどこかのファンが止まったなと感じて、ケースを開けて確認しようとしていると、チリチリっていう音と焦げ臭いにおいがしてきました。あ、これはやばいな、ということで、シャットダウンする暇もなく、電源を切りました。

においの発生元を探していくと、どうも電源っぽいです。 ただ、電源ユニットを外して(分解までしたのですが)、焼けた跡とかまでは見つけられなかったので、これが本当に原因かどうかまでは確定はできませんでした。

ま、そうはいっても、電源関係なので、2回目になりますが前回に引き続き電源ユニットを交換することにしました。

注文

以前の記事を見ると、2019年に交換してますね。それからわずか3年で、2度目の交換です。ちょっと早いですかね? まあ、壊れたものに文句を言っても始まらないので、まずは部品の注文です。

前回は Amazon で買ったのですが、 Amazon を見てみると新品で出品されているのはほとんどないようです。仕方ないので、 eBay を見てみると、新品とうたっているのが結構出ています。AliExpressも見たのですが、こちらは新品/中古品がよくわからなかったので、今回利用するのは諦めました。

若干、高い気がするのと到着までの日数がかかるのですが、eBay は商品がつかなかったりした場合に払い戻しが効くので使いました(以前経験ありです)。 ということで、良さそうな業者さんのを選んで注文します。到着まで半月以上かかるそうなので、気長に待ちます。

交換

電源の到着予定日は6月5日になっていたのですが、4月中にやってきました(注文後9日ですね)。ちょっと早すぎないか?というか到着予定日が遅すぎるんか。まあ、早い分には越したことないので、良しとします。

今回は N305P-06 という型番のがやってきました。

eBay の注文画面では L305P-01 となっていたので、

返品・交換をしようかとも思ったんですが、この型番の電源も T105 で使えそうなため、このまま使ってみることにしました。

さっそく交換です。 交換作業はそんなに難しくなく、以前の記事を見ながら、ちゃっちゃと終わらせます。

起動

電源ユニットを交換して、配線おこなって、コンセントをつなぐと、普段ならファンが回る音がするのに、うんともすんとも言いません。 あれ、なんかおかしいぞ?と思いよく見てみると、マザーボード上の LED がこんな感じに光って、

さらにフロントの電源ランプが点滅しています。これは、以前トラブルがあったときに見た、電源トラブルの証(ハードウェマニュアル参照)です。

何度か結線をやり直したり試しましたが、事態は変わりません。

うーん、型番違いが問題なのかなー。まあ、それよりも、交換したばかりでこれになるということは、電源ユニットの問題ではなく、マザーボード側のトラブルのほうが可能性が高いかなー。

あーあ。 せっかく電源ユニット買ったのに、無駄になってしまいました。

今後

さて、使っていなかったサーバーを再利用して動かしていたタイルサーバーでしたが、とうとうハードウェアトラブルで止まることになってしまいました。 ちょうど、このタイルサーバーを利用していたサービスも閉じたところだったので、今後どうするか思案どころです。

ちなみに、ネットを見てみたら、電源ユニットを何回か交換してる人が、そろそろ買い替えたほうがいいよ、とアドバイスもらってるのがありました。

Solved: T105 no power and steady amber LED on motherboard - Dell Community

これも 2009 年に買った筐体なので、そういう時期なんだろうな。

ま、いずれにせよ、サーバーを買い替えるか、 AWS に移行するか、タイルサーバーの運用をやめるか・・・などなど、いろいろと考えてからにしようと思います。

P.S. もし、電源ユニット欲しい方いればご連絡ください。着払いでよければお譲りします(日本国内に限ります)。