プログラマーのメモ書き

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

森ソフトのサイトに事例紹介を追加

仕事にちょっと余裕ができたので、森ソフトのサイトをアップデートしてみました。ついでに、事例紹介をいうページを追加してみたので、その際 hugo でつまずいたところなどをメモっておきます。

hugo および テーマのアップデート

まずは、ずいぶんと放っておきっぱなしだったので、 hugo と テーマ (universal) を新しくしておきます。

hugo のアップデート

まずは、 hugo から。

mor@DESKTOP-DE7IL4F:~/tmp$ wget https://github.com/gohugoio/hugo/releases/download/v0.108.0/hugo_0.108.0_linux-amd64.deb
mor@DESKTOP-DE7IL4F:~/tmp$ sudo apt purge hugo
mor@DESKTOP-DE7IL4F:~/tmp$ sudo apt install ./hugo_0.108.0_linux-amd64.deb 
mor@DESKTOP-DE7IL4F:~/tmp$ hugo version
hugo v0.108.0-a0d64a46e36dd2f503bfd5ba1a5807b900df231d linux/amd64 BuildDate=2022-12-06T13:37:56Z VendorInfo=gohugoio
mor@DESKTOP-DE7IL4F:~/tmp$ 

hugo のプロジェクトのディレクトリに移動して、今のサイトを表示させてみます。

mor@DESKTOP-DE7IL4F:/mnt/d/work/own_app/mywebsite$ hugo server
Start building sites … 
hugo v0.108.0-a0d64a46e36dd2f503bfd5ba1a5807b900df231d linux/amd64 BuildDate=2022-12-06T13:37:56Z VendorInfo=gohugoio
(中略)
Built in 2445 ms
Watching for changes in /mnt/d/work/own_app/mywebsite/{archetypes,content,data,i18n,layouts,static,themes}
Watching for config changes in /mnt/d/work/own_app/mywebsite/config.toml
Environment: "development"
Serving pages from memory
Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
Web Server is available at http://localhost:1313/ (bind address 127.0.0.1)
Press Ctrl+C to stop

特に問題なく動作してますね。

テーマをアップデート

テーマも随分と更新されていますので、追いつきます。

mor@DESKTOP-DE7IL4F:/mnt/d/work/own_app/mywebsite/themes/hugo-universal-theme$ git tag
1.0.0
1.0.1
(中略)
1.2.5
1.3
1.3.1
mor@DESKTOP-DE7IL4F:/mnt/d/work/own_app/mywebsite/themes/hugo-universal-theme$ 

1.3.1 までしか表示されません。が、Github を見ると1.4までリリース済みのようです。なので、タグを更新します。

mor@DESKTOP-DE7IL4F:/mnt/d/work/own_app/mywebsite/themes/hugo-universal-theme$ git fetch --tags
From https://github.com/devcows/hugo-universal-theme
 * [new tag]         1.3.2      -> 1.3.2
 * [new tag]         1.4        -> 1.4
mor@DESKTOP-DE7IL4F:/mnt/d/work/own_app/mywebsite/themes/hugo-universal-theme$ git tag
1.0.0
1.0.1
(中略)
1.2.5
1.3
1.3.1
1.3.2
1.4
mor@DESKTOP-DE7IL4F:/mnt/d/work/own_app/mywebsite/themes/hugo-universal-theme$ 

1.4 まで表示されるようになりましたね。

テーマを更新します。

mor@DESKTOP-DE7IL4F:/mnt/d/work/own_app/mywebsite/themes/hugo-universal-theme$ git checkout tags/1.4
Previous HEAD position was 00e1f20 Bump ansi_regex (#337)
HEAD is now at 1af54bd Not fail when folders doesn't exist. (#371)
mor@DESKTOP-DE7IL4F:/mnt/d/work/own_app/mywebsite/themes/hugo-universal-theme$ 

あれ?更新されませんね。

で、ここで更新したいと思って、あれこれ試しているうちに、 submodule の更新がうまくできなくなってしまいました。なので、一度テーマのディレクトリを削除してから、再度 git submodule update してやり直したら、問題なく更新できました。

テーマの一部をカスタマイズしているので、最新のテーマのファイルを対象に、カスタマイズを反映します。やりかたはこちらの記事と同じです。

ここまでできたら、ローカルで表示して問題ないことを確認しておきます。

事例紹介の追加

元々の universal は、ブログの記事(recent_post)から最新の4つをトップページに表示する構成になっています。森ソフトのサイトでは、ブログははてなブログを利用しているため、この部分を変更して『新着情報』としてニュースなどの告知に使っています。

そのほかにも、もともとのテーマだと、 testimonials (お客様の声)とか clients (顧客)とかも表示できるようになっています。これらを変更して事例紹介を作ろうかとも思ったのですが、トップページに表示する部分と詳細記事の部分から構成される形になるので、やはり前述のブログの部分(新着情報)を改良するのが手っ取り早そうです。

トップページ内で新着情報を表示する部分は、 layout/partials/recent_posts.html にまとまっているので、これを case_stydies.html の名前でコピーして、トップページに表示可能とします。

(前略)
        {{ partial "top.html" . }}

        {{ partial "nav.html" . }}

        {{ partial "carousel.html" . }}

        <!-- ここに移動 -->
        {{ partial "recent_posts.html" . }}

        {{ partial "features.html" . }}
(中略)
        {{ partial "see_more.html" . }}

        <!-- 位置を移動
        {{ partial "recent_posts.html" . }}
        -->

        <!-- 開発事例を追加 -->
        {{ partial "case_studies.html" . }}

        {{ partial "clients.html" . }}

        {{ partial "footer.html" . }}

    </div>
    <!-- /#all -->

    {{ partial "scripts.html" . }}

  </body>
</html>

(元々のテーマと表示する順番を少し変えています。)

recent_posts.html のファイルを見ると、最新の記事を取得する部分は、

                {{ $posts := .Paginate (where site.RegularPages "Type" "in" site.Params.mainSections) }}
                {{ range first 4 $posts.Pages }}
                <div class="col-md-3 col-sm-6">

となっているので、case_studies.html ではこの部分を content 以下に事例紹介記事を保存するフォルダ名である case_study を使って、

                {{ $posts := .Paginate (where site.RegularPages "Type" "case_study") }}
                {{ range first 3 $posts.Pages }}
                <div class="col-md-4 col-sm-6">

としておきます(表示する記事数も変更してます)。繰り返しになりますが、実際の事例紹介の記事は、 content/case_study/ 以下に追加するようにします。

これで、表示できるはずです。試してみると、

あれ?事例紹介にも新着記事が表示されます。

これはいったい、どうなってるんだ?

原因:同一ページ内で paginator を複数持てない

いろいろと調べまくったのですが、なかなか原因がわかりません。ふとその時、新着情報の部分を隠しても、表示がおかしいのだろうか?と思いついて、試してみると、ちゃんと表示されます。

ん?最初に取得したデータがキャッシュされてるようだぞ。で、調べてみると、ありました。

Pagination | Hugo

こちらの記事に、

If you call .Paginator or .Paginate multiple times on the same page, you should ensure all the calls are identical. Once either .Paginator or .Paginate is called while generating a page, its result is cached, and any subsequent similar call will reuse the cached result. This means that any such calls which do not match the first one will not behave as written.

としっかりと、2回呼び出しても最初のものが使われるよ、とあります。これですね。

なんでこんな仕様なんだろうかとよくよく考えてみると、異なる記事のセットに対して、ページネーションを行うということは、当然ページ数とかも違うわけだから、前のページの記事群や次のページの記事群を取ろうと思ったとき、ページが同一じゃないと困る、ということなんでしょうね、きっと。

本来はこの部分は、対象とする一連の記事群から、最新の記事を固定数分だけ取り出すだけでよく、ページ制御(移動)自体は不要なので、わざわざこれを使う必要もないはずです。

まあ、テーマの作者の意図まではわからないので、 recent_posts.html の部分はそのままにしておいて、コピーした事例紹介の部分(case_studies.html)については、

                {{ range first 3 (where .Site.RegularPages "Type" "case_study") }}
                <div class="col-md-4 col-sm-6">

のようにしておきます。

これで試してみると、正しく表示できました。

追加した記事が表示されない

さて、これで、事例紹介の機能を追加できたので、いくつかの記事を追加していきます。

すると、 hugo server でローカルで表示する際に、なぜか表示されない記事があります。記事の front matter に draft がないにも関わらず、表示されません。

こちらもかなり悩みましたが、わかってみれば簡単で、記事の日時が未来の日付になっていると、デフォルトでは公開されない、という仕様でした。

Basic usage | Hugo

上記を読むと、

  • draft が true
  • 未来の日付
  • 期限切れの記事

はデフォルトでは公開されないとのことです。

で、これらを表示したければ、 hugo server を実行するときにオプションを指定する必要があるとのことです。例えば、

hugo server -D -F

ということですね。 こうすると、無事に記事が表示されました。

GA4 に対応

hugo および hugo-univesal-theme はすでに Google Analytics の GA4 にも対応済みのようで、 トラッキングコードを GA4 のものに変更すれば、そのまま使えます。

終わりに

たまにしか hugo を触らないので、これなんだっけな?となってしまいがちです。そんなおり、下記の記事

静的サイトジェネレータ「Hugo」と技術文書公開向けテーマ「Docsy」でOSSサイトを作る | さくらのナレッジ

が一通りまとまっていて、思い出すのに重宝したので、載せておきます。ご参考までに。

QNAP NAS のスナップショットレプリカが2段階認証に対応したそうです(QTS 5.0.1)

以前、こちらの記事で書いたように、QNAP NAS のスナップショットレプリカは、2段階認証に対応していませんでしたが、 QTS 5.0.1 から対応したそうです。

QTS 5.0.1 | リリースノート | QNAP

早速、試してみます。なお、送信元、送信先とも、 QTS のバージョンは

5.0.1.2234 build 20221201

です。

送信先 NAS 側の設定

管理者アカウントに、2段階認証を設定します。詳しくは、こちらの記事をご覧ください。

スナップショットレプリカジョブの設定

さて、どうやってスナップショットレプリカの設定時に、2段階認証に対応させるんだろうかと思って、マニュアルを調べてみると、下記のところに2段階認証のことが記載されています。

スナップショットレプリカジョブの作成 | QTS 5.0.x

送信先NASのアカウントを設定するところで、接続テストを行う際に、

ダイアログが表示された場合は、2 段階認証を完了します。相手先 NAS が 2 段階認証を有効にしている場合には必須です。

とのことです。この書きっぷりからすると、どうもスナップショットレプリカジョブの作成で、一度送信先のNASに接続するんですが、そのタイミングで2段階認証を行えば、いいようです。

これって、既存ジョブの場合はどうなるんだろうか?

ちょっとわからないので、念のため既存ジョブの編集を行って、一度接続させてみます。

既存のスナップショットレプリカジョブを選択し、

『編集』を選びます。編集許可を持っていることを確認するために、送信先のNASへのログインを検証するダイアログが表示されます。

この時点で、ユーザー名、パスワードはすでに入力されているので、そのまま『確認』を押すと、

という、2段階認証用のダイアログが表示されます。これに、正しく認証コードを入力できれば、次の編集画面に進むことができます。

ですが、特にジョブの内容は変更しないので、一度『適用』を押してから、『閉じる』で編集を終了します。

動作確認

この状態で、スナップショットレプリカが正しく動作するか確認します。スナップショットレプリカジョブを開いて、『今すぐ実行』を押してみると、

こんな感じに問題なくジョブがスタートします。しばらく待って、無事にジョブが完了したので、問題ないようです。

上記の動作の様子からすると、スナップショットレプリカにおける2段階認証は、単にレプリカジョブ作成(編集)時に確認を行うという動作のようですね。てっきりジョブ実行時に2段階認証に対応するための、追加設定でもするのかと思ってました。

なんにせよ、これで、送信先のNASの管理者アカウントにも2段階認証を設定したうえで、スナップショットレプリカを動かせそうです。

三重県の入札資格を申請しました

国(全省庁統一資格審査)と伊勢市の入札資格は持っていたのですが、そういや三重県の資格って申請してないな、と思いたったので、ちょっと調べてみて申請してみました。

その時の手続きとか、思ったこととかいろいろとメモっておきます。

なお、正確なところは、三重県の Web サイトの入札関連のページを参考にしてご自分で理解してください。以下は、私なりにまとめてみたものになるので、間違いなどがあるかもしれません。こちらを参考にして、何らかの損失等があっても責任はとれませんので、ご注意ください。

三重県の入札の概要

入札って、自治体でいろいろと違ったりしますが、公共工事とそれ以外に分かれているパターンをしばしば見かけます。システム開発(ソフトウェア開発)とかは、『役務の提供』というやつになることが多い印象です(ハードウェアの購入と一緒になっていたりすると別の名目になったりもするのかな?)。

三重県の場合は、『公共事業調達』と『物件等調達』に分かれてて、『物件等調達』に役務の提供も入ることになるようです。

で、さらに、入札時の認証方式によって、対象となる案件の規模が異なることになるそうです。

  • ID・パスワード方式:少額の案件
  • ICカード方式:一般の入札

個人でも、 IC カードを購入して、電子認証方式をとったら、一般競争入札にも参加できるようです。あと、県外の事業者は IC カード一択だそうです。まあ、具体的に狙ってる入札案件があるわけではないので、とりあえず IC カードの購入はせずに、ID・パスワード方式でやってみようと思います。

情報のたどり方

参考までに、上記にあるような情報のたどり方がよくわからなかったので、ちょっと整理してみました。

Google で『三重県 入札』とか入れてググると、まず下記のページが表示されることが多いようです。

三重県|入札・契約:三重県電子調達システム

このページにある『物件等調達(物品・役務)』というでっかいボタンを押すと、

三重県|入札・契約:三重県電子調達システム(物件等調達)入口

というページが表示されます。ここから、『はじめての方へ』というリンクをたどると、

三重県|入札・契約:はじめての方へ(物件等調達)

が表示されます。このページに『システムの概要』(PDFです)というのがあるので、こちらを参考すると概要がつかめます。

にしても、わかりにくい。

入札資格の申請手続き

さきほど上にあげた『はじめての方へ』ページにある『少額物品用ID・パスワード方式を利用の方』という PDF ファイルを見ると、申請は2段階になっているようです。

  1. 三重県電子調達システム(物件等)利用登録
  2. 電子入札システムの利用者登録

一つ目の申請を行い、事業者登録用ID・パスワードの発行を受けます。次に、この登録用のID・パスワードを使って、入札で用いる少額物品用ユーザIDとパスワードの登録を行う、という手順のようです。

ということで、まずは、最初の利用登録を行います。

三重県電子調達システム(物件等)利用登録

さきほどの『はじめての方へ』ページにある『登録申込』のリンクをたどると、

三重県|入札・契約:利用登録申込(物件等調達)

というページが表示されます。ここから、『登録新規 本社登録』というのを選択すると

三重県申請・届出等手続の総合窓口 :手続詳細

というページが表示されて、ここから必要な書類一式がダウンロードできるようです。

にしても、わかりにくいなー。

事前に

をよく読めと書いてあるので、ざっと見ておきます(さきほどのページからリンクをたどると、

三重県|入札・契約:会計支援課(三重県電子調達システム(物件等))

というページにいくので、ここからPDFに到達できるようです)。実際の書類の書き方は、上記の2つ目のPDFを参考にするのがよさそうです。

あと、個人の場合は、提出書類のほかに、下記の証明書が必要です。

  • (市役所発行の)身分証明書
  • 成年被後見人、被保佐人、被補助人等について登記されてないことの証明
  • 印鑑証明書

1つ目と3つ目の書類は市役所で取ってきて、2つ目の書類は法務局で取ってきます。

法務局への申請

法務局は市役所の近くにあるので、一緒に行けばいいやと思いつつも軽く調べてみると、『成年被後見人、被保佐人、被補助人等について登記されてないことの証明』が、伊勢の法務局では取れないとのこと!

で、仕方なく、津の法務局に電話して尋ねると、津の法務局まで取りに来て手続きするか、東京の法務局に郵送で申請手続きをするかの2択とのことです。

登記されていないことの証明書の申請方法:津地方法務局

当面、津まで出かける予定もないので、郵送で申請することにします。上記のURLのところから、申請に必要な書類をダウンロードして、必要事項を明記し、手数料の収入印紙を張り付けて、運転免許証とかの本人確認書類のコピーを添えて、郵送すればOKです。

ちなみに、この『登記されていないことの証明申請書』の『証明事項』の欄に、出してほしい証明書を指定するのですが、この欄に複数の選択肢があります。そのうちの2つ

  • 『成年被後見人、被保佐人、被補助人とする記録がない。』
  • 『成年被後見人、被保佐人、被補助人、任意後見契約の本人とする記録がない。』

が、三重県が指定している証明書の名称『成年被後見人、被保佐人、被補助人等について登記されていないことの証明』と似ているけど、どちらも若干異なってます。『等』という書き方をどう考えればいいんだかわからないということです。で、ぴったりのがないと。

困るなー、こういうの。

仕方ないので、県に問い合わせてみると、『成年被後見人、被保佐人、被補助人とする記録がない。』を選べばよいとのことでした。ということで、下記のような内容で申請書を作りました。

にしても、三重県も似たような質問受けるだろうから、書き方のところにでも、注釈つけておいてくれればいいのになー。

県への申請

法務局に郵送で申請してから書類が届くまで1週間程度かかります。無事に書類が届いたら、県庁宛に申請します。郵送でも電子申請でもできるとのことです。電子申請(といっても必要書類をzipでまとめてアップロードするだけです)がお手軽なので早速やります。

しばらくして、無事に申請が通ると、郵送にて『三重県電子調達システム登録確認書(新規)』という書類が送られてきます。書類を提出してから、7~10日程度かかるそうなので、手続きに興味がある方は時間的な余裕をもって進めるのがいいかと思います。

電子入札システムの利用者登録

『三重県電子調達システム登録確認書(新規)』が送られてきたら、この書類に記載されている登録用IDとパスワードを使って、少額物品用のユーザIDとパスワードの登録を行います。

書類に同封の用紙にも手続きが書いてありますが、登録申請は、

三重県|入札・契約:三重県電子調達システム(物件等調達)入口

のページにある、『電子入札(物件等)』という大きいボタンを押して表示される、入札システムの画面からオンラインで行います。

少額物品用ユーザIDとパスワードを自分で決めて、電話番号等のその他の情報と一緒に申請するだけなので、こちらは大して手間がかかりません。 ですが、登録申請後、審査があるとのことだったんだけど、平日の日中にやったら、その日のうちに完了のメールが届きました。土日とか祝日を挟むと何日かかかるかもしれないので、ご注意ください。

最後に、入札システムにログインしてみて、無事にログインできるか試すと、問題なくログインできました。これで、一連の手続きが完了ですね。

参考

入札資格は更新が必要なことが多いです。

  • 全省庁統一資格審査:3年に一度
  • 伊勢市:毎年
  • 三重県:なし

とのことです。結構違いますね。

雑感

基本的にマイナンバーには懐疑的なんやけど、こういう手続きってマイナンバー一つを県に伝えるだけで、自動的に必要な書類を自治体間でやりとりして手続きを進めるようにできないのかな?

保険証代わりになるだけなら、マイナンバー使う意義は薄くて、連携させてこそ利便性を訴えることができると思うんだけどねー。 もし、これができるのなら、進んでマイナンバー使うんやけどね。

まあ、遠い道のりなんだろうな、きっと。