技術ネタ
Webサイトの管理方法を見直してみた。(2021_01_20)
今まで、ちまちまとHTMLを書いて記事を更新していましたが、さすがに面倒になってきました。 とはいえ、ブログシステムに移行しようとすると、サーバーにも負荷がかかる上、移行が大変というデメリットもあったので、 Markdown表記が利用できる静的サイトジェネレーターを検討することにしました。
静的サイトジェネレーター Hugo
Gatsby Jekyll Next.js などの定番静的サイトジェネレーターを検討しました。 要件定義としては以下の通り。
- 記事はMarkdown記述
- 実行時のメモリ使用量が少ない
- テンプレートが作りやすい
- 保守管理が簡単
これらの条件で調査したところ、そこまで時間をかけずHugoの採用を決定しました。
使い慣れているgolangで実装されていているという要素もプラスとなりました。 (golangは良い言語だと思うけど、日付フォーマット指定方法はなんとかならなかったのかと思います)
今までのHTMLの記事をHTMLからMarkdownに変換し、Hugoで出力できる形式に修正するのは骨が折れましたが、 ついでに記事の修正などを行いながらなんとか完了。 Hugoでのテンプレートの作り方も、学習コストがかかりますが慣れれば実装しやすいですね。 最近は日本語での解説サイトも増えて、新規で採用しやすい状況になっているのかなと感じています。
そして、HTML出力処理もかなり速い! Mac mini 2018(Corei7)だと1.3秒で変換が終わります。 サーバー側で利用しているさくらVPSのサーバー(1core 2.4GHz)では20秒ほどかかってしまいますが実用上問題なく、メモリの使用量も30MByte程度で収まっており良い感じです。
Git Hookを利用した自動デプロイ
今まで、Subversionで管理していたWebサイト用リポジトリをGitに移行しました。 合わせて、Git Hookを使い、origin masterにpushしたら自動的にサーバー側でサイトを生成して公開するよう自動化の対応を行いました。
普段の作業はdevelopブランチで行い、公開する際にmasterブランチにPushするようなケースとなります。
こんな感じで、masterの時だけhugoのビルドを走らせるようにしています。 (環境によって実行ファイルのパスは違うので参考まで。FreeBSD12で全てportsでインストールした状態です。)
#!/usr/local/bin/bash
# Git Hook Post Received For wander-dept.git
while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
echo "Branch:$branch"
if [ "master" = "$branch" ]; then
# for Master Branch
pushd /usr/local/www/wander-dept/
/usr/local/bin/git --git-dir=.git pull
HUGO_ENV=production /usr/local/bin/hugo
popd
fi
done
# EOF
Raspberry PIを使って、雨を告知するプログラムを書いてみた (2015_11_30)
Raspberry PIを放置していたので、LEDで雨を知らせるアプリケーションを書いてみました。 プログラムのベースは、以前作成したシンプル日本天気予報を流用しようとしましたが、せっかくなので勉強がてらPythonで記述することにしました。
Pythonは構文を知っているものの、ほとんど利用した事がありませんでした。 始めは定数を外部ファイルにして使う方法などが不明でしたが、ファイルをimportするとモジュールになる感じだったのですね。
PHPがある程度使える私にとって、以下のページが分かりやすかったです。 http://phpy.readthedocs.org/en/latest/module.html
仕様と設計
1時間毎に天気APIに問い合わせして情報を取得。 当日、雨の予報の場合は点灯し、次の日が雨の場合はゆっくり点滅させるようにします。 また、API問い合わせに問題が生じた場合・その他エラーの場合は早く点滅させるようにしました。
GPIOを制御するスレッドと、定期的にデータをプルするスレッドの二つを動かしすことにしました。 点滅をsleepで制御していますが、もっとスマートな方法は無いのかな……
標準出力をファイルにリダイレクトすると出力されない問題
デーモンにするために、標準出力をファイルにリダイレクトしたところ、tailで監視しても出力されなくなってしまいました。 なぜかプログラム終了時に出力されるので、スレッド関連で問題があるかと調査をしたところ、単純にバッファに溜め込んでいただけでした……
Pythonはsys.stdout.flush()を使って出力バッファをフラッシュできますが、起動時オプションに -u をつけると勝手にフラッシュしてくれるようなので、今回はこちらで対応しました。
OS X El CapitanでソフトウェアRAID(1)を組みました (02015_10_16)
用意したのはWesternDigital製のWD20EZRX。これはRAIDが推奨されていない一般モデル。 RAIDを組むなら、本来はRedモデルにしなければなりませんが、24時間稼働しているわけでもなく、予算の都合もあり、Greenを選択しました。 また、WDはGreenモデルを廃止し、Blueモデルに統一するようなので、最後のGreenモデルとなります。
OS X Yosemiteまでは、ディスクユーティリティからRAID設定がでましたが、El Capitanでは廃止されたようなので、全てコマンドライン上で操作することにしました。 HDDをIMacに繋げて、% diskutil list で認識されているHDDを確認します。
私の環境では、新たに接続したHDDが、disk2とdisk3として認識されました。 はじめにこの2つの物理ディスクを束ねます。信頼性重視のRAID1(ミラーリング)をするコマンドを打ち込みました。
% diskutil appleRAID create mirror WorkStrage JHFS+ disk2 disk3
これで、JHFS+のRAIDディスクをあっさり構築することができました。 ディスク起動時にに、消費電力を抑えるために、時間差で始動するなど、それっぽい動きをしています。
FileVault2によるRAIDディスクの暗号化
次にRAIDディスクを暗号化します。(必要に応じてどうぞ) ディスクユーティリティでは、簡単にできる暗号化設定ですが、diskutilコマンドで行う場合は、手順が若干増えます。
まず、RAIDディスクに仮想ディスクを作成します。RAIDディスクも仮想ディスクじゃないの?と思われるかもしれませんが、あまり気にせず仮想ディスクを作成します。
% diskutil info /Volumes/BackupStrage/
...
Device Identifier: disk4
...
% diskutil cs create BackupStrage disk4
...
Core Storage LVG UUID: 271D48A9-XXXX-42B4-8B0C-DA2F25AEE52F
...
disk4のパーティション全体がApple_CoreStorageとなります。
作成した仮想ディスクから暗号化ディスクを作成します。 なお、暗号化ディスクの作り方は、すでにあるデータごと暗号化する方法と、真っ新にして暗号化ディスクを作る2通りの方法がありますが、AppleソフトウェアRAIDで作成されたディスクは、後者しか対応していません。 先ほど、仮想ディスク作成コマンド実行時に出た、LVGのUUIDを利用します。
% diskutil cs createVolume 271D48A9-XXXX-42B4-8B0C-DA2F25AEE52F ↩︎(続く)
jhfsx BackupStrage 100% -passphrase password
これで暗号化されたRAID1のディスクが完成しました! ソフトウェアRAIDと暗号化が組み合わさっていますが、快適に利用できています。
Wi-Fiフォックスハンティング (2015_07_03)
???「あっ!私物のポケットWi-Fiの電波を漏らしているやつがいる!」
???「発信元を見つけ次第ぶっ殺せ!ヒャッハー」
という会話が、某会社で繰り広げられていたかはさておき、 会社で禁止されている無線LANルーターの電波で業務に支障が出ていたので、フォックスハンティングさながら、電波強度を元に発信源を調査してみました。 Androidがあれば、電波強度を調べるソフトウェアがあるようですが、機材の都合でMacBook Airを利用することにしました。 MacOS Xには電波強度を調べるコマンドがあるので、指定したAPのみ1秒毎に出力するスクリプトを組みました。
wifi_check.sh
#!/bin/sh
#auth :sabagara
#usage :wifi_check.sh <AP Name>
AP_NAME=${1}
WIFI_CHECK="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s"
echo "check:${AP_NAME}"
while true
do
echo .
${WIFI_CHECK} | grep ${AP_NAME} | tr -s ' ' '\t' | cut -f2,4
sleep 1
done
これを起動し、MacBook Airで適当に周囲の電波を計測し始めます。 MacBook Airは正面側に対して、電波を受け取りやすいようですが、あまり気にせず電波の強い場所を探します。
電波の強さはRSSI値で確認することができます。感覚的には以下のような感じです。
- -90 : 遠い
- -50 : 10メートル以内
- -30 : 5メートル以内
- -15 : 発見!
MacBook Airを持ちながら、職場を不審者さながらうろついていると、「何やっているの?」と声がかかったので、 すかさず「今、私物のポケットwi-Fiの電波を探しているんですよ?まさか持っていませんか?」と聞いたところ。
不届者「やべぇ、電源入れっぱなしだった」 という声が隣の席から聞こえてきました。
殺す
本物のフォックスハンティングを経験したことはありませんが、宝探しのようで思ったよりも楽しめました。 今後も、電波を漏らしている人を徹底的に駆逐していきたいと思います。