どこにでもいるような普通の一般人が、たまに自分用メモを書いてる。

メモ置き場を Hugo に移行した

日付:

これまでこのメモ置き場は WordPress で運用してきたが、本体もプラグインもしょっちゅうアップデートがあって面倒になったこともあり、Hugo に移行することにした。


wordpress-to-hugo-exporter を使えば楽ができそうだと思ったが、案外そうでもなかった。

  • 動作させるのに PHP の zip extension が必要
extension=zip.so

これは結構動作環境を限定すると思う。

  • 出力される .md の frontmatter が YAML。TOML なら良かったのに。しかたないので全部直した。
  • 出力される markdown が汚い。
  • さらに当サイトでは電力料金比較表があり、これは WordPress の固定ページとして作ったので、PHP であり静的 HTML ではない。
    しかたないのでこれは Hugo 用の .md (と言いつつ中身はほとんど HTML) を出力するように改造した。
    PHP CLI で実行すれば .md ができる。

Hugo で WordPress 的な年月日別アーカイブ

WordPress では パーマリンク設定を /%year%/%monthnum%/%day%/%postname%/ にしていた。
この場合、親ディレクトリ (/2018/07/10/) に日別アーカイブ、さらに遡れば月別、年別アーカイブがあった。
Hugo らしいやり方ではタクソノミーを作ることになる。この場合パスが /archives/2018/07/10/ 等のように、冒頭にタクソノミーの slug を含むパスになってしまう。
WordPress 時代のパーマリンクをそのまま維持したいが、Hugo にはそうした機能がないため、泥臭い形で実装した。

  • 記事は content/post/ 下に
  • content/archive_yearly/ に年別アーカイブ用ダミーファイルを配置
  • content/archive_monthly/ に月別アーカイブ用ダミーファイルを配置
  • content/archive_daily/ に日別アーカイブ用ダミーファイルを配置

config.tomlでパーマリンク設定。
キモは post と archive_* のパーマリンク構造を合わせること。

[permalinks]
post = "/:year/:month/:day/:slug/"
archive_yearly = "/:year/"
archive_monthly = "/:year/:month/"
archive_daily = "/:year/:month/:day/"

次に各アーカイブのテンプレート。私はテーマ下に入れているが、まあ適宜よしなに。

年別
themes/example/layouts/archive_yearly/single.html

{{define "main"}}
{{$archive_year := .Date.Year}}
<h1>{{$archive_year}}年</h1>
<ul>
{{range (where .Site.Pages "Section" "post").ByDate}}
{{if eq .Date.Year $archive_year}}
<li>{{printf "%04d/%02d/%02d" .Date.Year .Date.Month .Date.Day}}<br /><a href="{{.Permalink}}">{{.Title}}</a></li>
{{end}}
{{end}}
</ul>
{{end}}

月別
themes/example/layouts/archive_monthly/single.html

{{define "main"}}
{{$archive_year := .Date.Year}}
{{$archive_month := .Date.Month}}
<h1>{{$archive_year}}年{{printf "%02d" $archive_month}}月</h1>
<ul>
{{range (where .Site.Pages "Section" "post").ByDate}}
{{if eq .Date.Year $archive_year}}{{if eq .Date.Month $archive_month}}
<li>{{printf "%04d/%02d/%02d" .Date.Year .Date.Month .Date.Day}}<br /><a href="{{.Permalink}}">{{.Title}}</a></li>
{{end}}{{end}}
{{end}}
</ul>
{{end}}

日別
themes/example/layouts/archive_daily/single.html

{{define "main"}}
{{$archive_year := .Date.Year}}
{{$archive_month := .Date.Month}}
{{$archive_day := .Date.Day}}
<h1>{{$archive_year}}年{{printf "%02d" $archive_month}}月{{$archive_day}}日</h1>
<ul>
{{range (where .Site.Pages "Section" "post").ByDate}}
{{if eq .Date.Year $archive_year}}{{if eq .Date.Month $archive_month}}{{if eq .Date.Day $archive_day}}
<li><a href="{{.Permalink}}">{{.Title}}</a></li>
{{end}}{{end}}{{end}}
{{end}}
</ul>
{{end}}

これで archive_daily/2018-07-10.md があれば /2018/07/10/index.html に2018年07月10日の記事一覧が出力される。

このダミーファイルも手作業でいちいち作ってたら面倒でかなわないので、自動化する。

content/post/*.md を読んで、

date = “2018-07-10T00:00:00+09:00”

みたいな行を見つけたら、

  • content/archive_yearly/2018.md
  • content/archive_monthly/2018-07.md
  • content/archive_daily/2018-07-10.md

をそれぞれ作成。というもの。

content-src/archives.php

<?php
// make archives

$dir = dirname(dirname(__FILE__)) . '/content/post/';
$archive_yearly = dirname(dirname(__FILE__)) . '/content/archive_yearly';
$archive_monthly = dirname(dirname(__FILE__)) . '/content/archive_monthly';
$archive_daily = dirname(dirname(__FILE__)) . '/content/archive_daily';

cleandir($archive_yearly);
cleandir($archive_monthly);
cleandir($archive_daily);

$dh = opendir($dir);
while(($file = readdir($dh)) != false) {
	if(preg_match('/\.md$/', $file) === 1) {
		$matches = array();
		$str = file_get_contents(sprintf('%s/%s', $dir, $file));
		$array = explode("\n", $str);
		for($i = 0; $i < count($array); $i++) {
			if(preg_match('/date\s*=\s*"(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})T/', $str, $matches) === 1) {
				file_put_contents(sprintf('%s/%04d.md', $archive_yearly, $matches['year']), sprintf("+++\ndate = \"%04d-01-01T00:00:00+09:00\"\ntitle = \"%04d年\"\n+++\n%04d", $matches['year'], $matches['year'], $matches['year']));
				file_put_contents(sprintf('%s/%04d-%02d.md', $archive_monthly ,$matches['year'], $matches['month']), sprintf("+++\ndate = \"%04d-%02d-01T00:00:00+09:00\"\ntitle = \"%04d年%02d月\"\n+++\n%04d-%02d", $matches['year'], $matches['month'], $matches['year'], $matches['month'], $matches['year'], $matches['month']));
				file_put_contents(sprintf('%s/%04d-%02d-%02d.md', $archive_daily , $matches['year'], $matches['month'], $matches['day']), sprintf("+++\ndate = \"%04d-%02d-%02dT00:00:00+09:00\"\ntitle = \"%04d年%02d月%02d日\"\n+++\n%04d-%02d-%02d", $matches['year'], $matches['month'], $matches['day'], $matches['year'], $matches['month'], $matches['day'], $matches['year'], $matches['month'], $matches['day']));
				break;
			}
		}
	}
}
closedir($dh);



function cleandir($d) {
	if(file_exists($d)) {
		$dh = opendir($d);
		while(($file = readdir($dh)) != false) {
			if(preg_match('/\.md$/', $file) === 1) {
				unlink($d . '/' . $file);
			}
		}
	}
	else {
		mkdir($d);
	}
}

(ぶっちゃけ CI 使う場合 cleandir() は必要ないが、手元でビルドして public/ をアップロードするケースも考えられるので一応……)

php content-src/archives.php

すると、各アーカイブ用ダミーファイルが生成される。
ここで PHP を使っているのは、すでに電力料金比較表の生成で PHP を使っているから。どうせ1個使ってるんだから PHP に揃えてしまえと。

Hugo を使う場合ほとんどの人が CI を使うだろうし、Netlify ではビルドで PHP を使えるので、まあまあ使い物になるのではないか。

Netlify のビルドコマンド:

php content-src/archives.php; hugo

WordPress では年月日別アーカイブで本文を表示しているが、その点だけは追従していない。
日付とタイトルがあってリンクされればそれで用は済むと思うので。

当サイトは記事数が少ないので問題にならないが、記事数が多い場合は年別アーカイブぐらいにはページネーションを入れた方がいいかも知れない。


Hugo でこういうアーカイブを作る場合、普通はアーカイブ用のタクソノミーを作って list.html で出力するのが大半だと思うが、それでは WordPress 同様の /YYYY/MM/DD/ ではなく /archives/YYYY/MM/DD/ のようなパスになってしまう。
既存サイトを Hugo に移行する場合、パーマリンク構造を変化させずに移行することが重要だと思われるので、年月日別アーカイブのページを single.html で post のパーマリンク構造内に出力する形にした。

電力料金比較表を更新 (2018/06/27)

日付:

実際のページ更新は後日で、今日の時点ではまだローカルでデータを更新しただけ。

修正点:

  • 料金計算テーブルを各社の最新情報に更新。
  • 本サイトが WordPress から Hugo に移行するため、静的 HTML を出力するように変更。
  • 同じ理由で表示する契約容量の変更方法をフォームからタブに変更。
  • 当該契約容量でサービスを提供していない (または新規契約ができない) 事業者について、従来「提供なし」と表示していたが、事業者ごと表示しないことにした。

HiFormance の激安 VPS を契約してみた

日付:
タグ:

HiFormance激安 VPS に飛びついてみた。
今のところめちゃ快適。

カタログスペックはこんな感じ。

  • 11.99 USD / 年
  • vCPU 2コア
  • メモリ 4GB
  • ディスク 20GB (SSD)
  • 月間転送量 4TB
  • 場所 カリフォルニア州ロサンゼルス (ping rtt 110ms 程度)
  • OpenVZ

支払い完了後、即開通。
しかし CPU が古い。Xeon X5650。LET での宣伝投稿に書かれていたのはもっと新しい CPU なのだが。さらにカーネルが古い。2.6 系。
まあこれでもベンチマークはなかなかのもので、特にディスクアクセスがかなり高速。ConoHa 以上の数字が出てる。

LET では「PM くれたら宣伝通りの CPU 積んでるノードに移転するよ」と言っていたので PM すると、HiFormance のサイトでサポートチケット開いてくれとの返事。言われたとおりにすると「今すぐやっちゃっていい?」と来たので「やってくれ」と返すと、その7分後には新ノードの情報が到着。
なかなか対応が早い。

ベンチマーク (スクリプトはこれ) はこんな感じ。

System Info
-----------
Processor       : Intel(R) Xeon(R) CPU E3-1240 v6 @ 3.70GHz
CPU Cores       : 2
Frequency       : 3700.000 MHz
Memory          : 4096 MB
Swap            : 4096 MB
Uptime          : 0:19

OS              : Debian GNU/Linux 9
Arch            : x86_64 (64 Bit)
Kernel          : 4.9.0
Hostname        : ********


Speedtest (IPv4 only)
---------------------
Your public IPv4 is ***.***.***.***

Location                Provider        Speed
CDN                     Cachefly        95.3MB/s

Atlanta, GA, US         Coloat          28.0MB/s
Dallas, TX, US          Softlayer       43.3MB/s
Seattle, WA, US         Softlayer       48.4MB/s
San Jose, CA, US        Softlayer       82.6MB/s
Washington, DC, US      Softlayer       10.5MB/s

Tokyo, Japan            Linode          9.99MB/s
Singapore               Softlayer       8.08MB/s
Taiwan                    Hinet           10.9MB/s

Rotterdam, Netherlands  id3.net         6.17MB/s
Haarlem, Netherlands    Leaseweb        47.8MB/s


Disk Speed
----------
I/O (1st run)   : 942 MB/s
I/O (2nd run)   : 1.2 GB/s
I/O (3rd run)   : 1.0 GB/s
Average I/O     : 314.733 MB/s

(Disk Speed の Average I/O がおかしいのはスクリプト側の問題で、MB/s だろうが GB/s だろうがとにかく前の数字を足して3で割ったものに「MB/s」をつけてるので)

かなりいい感じ。


(2018/12/18 追記)

いやはや見事にやられた。夜逃げである。12月14日にホストごとダウン。
そして昨日は廃業のお知らせが一時的に出ていた。
PayPal に異議 (dispute) を出し、その後クレーム (claim) にエスカレーション。


(2018/12/28 追記)

PayPal が全額返金裁定。
昔はこういうサーバー関係に返金なかったんだけど、今は助かった。

iCop EBOX-3310A-JSK

日付:

ある意味シンクライアントのような、用途を限った極小 PC といった感じの EBOX。

  • iCop EBOX-3310A-JSK
  • CPU : DM&P Vortex86DX 1GHz
  • メモリ : DDR2 512MB オンボード
  • ストレージ : なし

Vortex86 というマイナー CPU 搭載機を使ってみたくてヤフオクで購入。
売り手は結構な数を所有しているようで、落札履歴を見るといくつも出てくる。


消費電力の小ささが特徴的で、ワットチェッカーで見る限り 10W。昨今のスティック PC ならもっと小さいが、発売時期を考えればかなりのものと言うべきだろう。
比例してというか処理能力はやはり低く、同じ 1GHz でも Via Nano U3500 より体感的に遅い印象。
CrystalMark の数字を見ても、同クロックの VIA C3 に ALU でやや劣り FPU は半分以下といったところ。VIA 同士でも C3 と Nano では同クロックで性能差があるので、Nano より遅いと感じたのは間違いではなかったようだ。
Atom 230 1.6GHz と比べると ALU は 1/4 以下、FPU は 1/8 以下というスコアで、色々パワー不足は推して知るべし、いや、体感できる。
金属筐体で天板がヒートシンクなので、ファンレスでも冷却能力は安心できそうだ。

メーカーサイトでは 600MHz と書かれているが、実際 1GHz で動いている。
メモリはオンボードで増設できないので、512MB を前提にソフトウェア面を考えることになる。


ストレージのインターフェイスとしては44ピン IDE ポート (オス) があり、さらに CompactFlash、microSD(HC) のスロットがある。
メーカーサイトの記述ではあくまで「IDE DOM support」なので、本来は IDE DOM (Horizontal) を使うべきなんだろう。
DOM ではない普通の IDE ストレージデバイスを使うには、メスメスケーブルが必要。筐体内のスペースが狭いので、長い方より短い方が向いていると思われる。
ヤフオクの出品ページでは「2.5インチストレージ内蔵可能」と書かれていたが、内蔵はかなり厳しいと思われる。一応2.5インチ HDD を固定するためのネジ穴はついているのだが、シリアルポートへの配線がものすごく圧迫される上に、基板の IDE 端子と HDD の IDE 端子の位置が左右にずれているので、長い方をたたんでどうにかという感じ。高さ 7mm ならなんとかなりそうだが、9.5mm ではまず無理。
mSATA-IDE 変換基板 (half slim) で mSATA SSD を使えることは確認した。
CF、microSD ともに挿入したカードは IDE HDD として認識されブートも可能なので、カードが余っていればその方が手っ取り早い。


Vortex86DX CPU は i586 互換だが i686 非互換で、OS の選択肢は結構限られてくる。
普段使っている Debian は stretch 以降で i686 を要求するため NG。Alpine も同様。64bit はもちろん非対応なので Arch 等も当然 NG。
Debian jessie、Gentoo は動作するが、jessie はすでに oldstable で2020年6月に LTS も終了するため先がなく、Gentoo はインストール時にカーネルビルドがあって CPU パワーの低いマシンにはあまり向かない。
FreeBSD は安定動作したので、これを採用。


(2018/06/29 追記)

FreeBSD 11.2-RELEASE が出たので freebsd-update upgrade -r 11.2-RELEASE したのだが、時間かかりすぎてつらい。晩飯後に実行したけど全然終わらないので途中で寝た。


(2020/03/12 追記)

Debian jessie でベンチマークをとってみた。VPS でよく使っている nench.sh

CPU: SHA256-hashing 500 MB
    62.445 seconds
CPU: bzip2-compressing 500 MB
    225.286 seconds
CPU: AES-encrypting 500 MB
    110.420 seconds

かなり遅い。特に bzip2 は AMD Geode LX 800 (500MHz) よりも所要時間が長い。

今更ながら GitLab と BitBucket に登録してみた

日付:

GitHub3年前に登録していたものの、GitLab BitBucket は未登録だった。
当サイトは Hugo に移行する計画があるので、これらも登録してみようと思った次第。
GitHub は Microsoft に買収されたし、他の類似サービスも確保しておけば安泰だというわけ。


どちらも普通に登録完了。

BitBucket には Academic プランがあって、内容的には Standard プラン相当が無料で提供されると考えて良い。
大学のメイルアドレスを登録することで自動的に Free プランから Academic プラン変更される。
大学以外のメイルアドレスでサインアップしていても、設定→一般→メールエイリアスで大学のメイルアドレスを追加するだけ。


静的サイトホスティングとして考えると、やはり GitHub Pages に一日の長がある。

GitLab Pages は SSL 化可能とはいえ、手動で証明書をセットする必要がある。無料で済ませようと思うと、3ヶ月ごとに Let’s Encrypt の証明書を手動で調達しなくてはならないわけだ。

BitBucket はカスタムドメインが使用できない。

GitHub Pages は自動的に Let’s Encrypt の証明書を調達・更新してくれる。

とはいえ結局、あくまで Git リポジトリとして使い、ホスティングは Netlify を使うのがベストであるように思われる。CI のビルドの早さも含めると。


私は GitHub の Micro プランが無料で使える立場なわけだが、これってどうせプライベートリポジトリ5個までだし、無制限の GitLab や BitBucket は良いぞ……と思っていたが、GitHub も2年前に無制限になったようだった。あんまり使わないので気づかなかった。タハー。

さらば XVM Labs

日付:
タグ:

4年前に契約した XVM Labs の激安 VPS だが、今年2月に終了のお知らせが来た。

終了と言っても突然サービス終了ではなく、契約の更新ができなくなるというもの。
激安 VPS 界隈では「今月末で閉めます」程度はよくある話で、私など業者が夜逃げという事例にも多く出くわしているが、さすがに10年以上継続しているところはしっかりしている。

この契約期間満了がついに到来してしまった。

年 2.99 USD、メモリ 512MB、IPv4 アドレス4個というスペックで、色々実験的な運用をさせてもらった。
その中の一つが Pleroma インスタンス

ありがとう、さようなら。

HP t5740 シンクライアント

日付:

厳密には t5740 じゃなくて t5740wi Internet Appliance なわけだが、ぶっちゃけ中身は t5740 だし、OS イメージも t5740 のものがそのまま入るしで。

  • hp t5740wi
  • CPU : Intel Atom N280 1.66GHz
  • メモリ : DDR3 SO-DIMM 2GB x2
  • ストレージ : IDE DOM 2GB
  • OS : Windows Embedded Standard 2009

t5570t510 よりも幅が狭いので、たぶん2.5インチ SSD は内蔵できないと思われる。

ただ、本機はメモリスロットが2個ある。よりによって 64bit 非対応 CPU 搭載機種に!

t5570 の時と同様、soltec41 氏が mSATA SSD を t5740 の SATA ポートにマウントする変換基板「SOL313-0」を製作されているので購入。
配置的に t5570、t510 よりもスペーサーによる安定性が低いので、標準のスペーサーから SOL313-0 付属のネジ止めスペーサーに交換するメリットが大きい。ネジでガッチリ固定すればぐらつかない。

Wyse 5010 D90D7 シンクライアント

日付:

  • Wyse 5010 D90D7
  • CPU : AMD G-T48E 1.4GHz (2コア)
  • GPU : RADEON HD 6250 280MHz
  • メモリ : DDR3 SO-DIMM 2GB
  • ストレージ : SATA DoM 4GB
  • OS : Windows Embedded Standard 7

マザーボードには SATA 端子が、マザーボードと水平についている。
HP t5570 や t510 では垂直のところ、水平だ。SSD がかなり短くかつ幅も狭くないと入らない。メモリスロットにぶつかったり、背面端子用の基板にぶつかったり。
SATA Half-Slim、JEDEC MO-297 準拠のものなら入る (ただしネジ止めできない)。

SATA Half-Slim とうたっていても、たとえば mSATA を横向きに配置する SATA-mSATA 変換基板は MO-297 より明らかに大きく使用できない。
AliExpress で SATA Half-Slim とうたっている KingDian などの SSD は問題ない。
SATA-M.2 2242 の変換基板 (これも M.2 2242 を横向きに配置) がほぼ MO-297 通りのサイズなので、使い回しを考えるとこれがベストと思われる。

メモリスロットは1個で、8GB も問題なく認識した。

iPhone SE 使用開始

日付:

今月末で電波が止まるワイモバイル (旧イーモバイル) の携帯電話を使ってきたのだが、iPhone SE 一括1円という巻き取りで移行した。
届いた iPhone SE はバッテリーが完全に空っぽになっていて、そのため初期設定に少し手間取ることになった。
早い話、時計が盛大にずれているのでそれを直して再起動する必要があった。

それに気づくまでああでもないこうでもないと情報を探し回る羽目に。
初期設定の Apple ID ログインがまずできない。
Safari でアクセスする HTTPS サイトが片っ端から証明書エラー。
iOS 11 にアップグレードすれば直るかと思いきや、そのダウンロードさえもコケる有様。

設定項目を片っ端から見ていると、時計が半年前。諸悪の根源はこいつか!!


昨今の5インチスマートフォンよりやや細身で、片手で使うにはやはりこのサイズが使いやすい。
普段使っている SIM フリー安物 Android 端末 (MVNO) と比べると、確かに iPhone の出来は良い。
前に使ったことがある iPhone 4s の頃と違って、ちゃんとテザリングもできるし。
しかし ATOK Passport に入っているのに iOS 版 ATOK を別途購入しなくてはならないのは Apple のせいで、しかたないから買ったけれども腹立たしい。

初詣 (平成30年)

日付:
タグ:

昨年と同じく、終電での移動。

前回も列が短いと感じたが、今回はさらに短くなっていた。
お守りもらっておみくじ引いて (大吉)、前回より5~10分早いぐらい。

初詣の個人的なお目当て、ふかしてるじゃがバターは、なんと1軒しか見当たらない。絶滅危惧種。
あと串焼き食べたり。
境内で「動物保護」とか言って募金活動してる男がいたが、あれは許可とってんのかねえ。胡散臭いのでお断り。

始発までeワールド府中店で3時間パック。
PC に Office 2007 が入ってるんだが、これ延長サポート終わったんだよね。
近辺にいびきのうるささを競うようにズゴゴゴとやかましい客が複数いて参った。

始発で帰った時点で眠気が激しく、初日の出は行かないことに。

10億円引換券の予定が300円引換券に化けたり色々沈んで去年はアレだった。今年は良い年になるといいなあ。