迷走局

技術ネタ

公開:2014/01/13
更新:2021/01/20
タグ: 情報技術

Webサイトの管理方法を見直してみた。(2021_01_20)

今まで、ちまちまとHTMLを書いて記事を更新していましたが、さすがに面倒になってきました。 とはいえ、ブログシステムに移行しようとすると、サーバーにも負荷がかかる上、移行が大変というデメリットもあったので、 Markdown表記が利用できる静的サイトジェネレーターを検討することにしました。

静的サイトジェネレーター Hugo

Gatsby Jekyll Next.js などの定番静的サイトジェネレーターを検討しました。 要件定義としては以下の通り。

  • 記事はMarkdown記述
  • 実行時のメモリ使用量が少ない
  • テンプレートが作りやすい
  • 保守管理が簡単

これらの条件で調査したところ、そこまで時間をかけずHugoの採用を決定しました。

Hugo Logo

使い慣れている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するようなケースとなります。

Git Web Server Deploy Diagram

こんな感じで、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で制御していますが、もっとスマートな方法は無いのかな……

Raspberry PI てるてる Raspberry PI てるてる (2.8KB)

標準出力をファイルにリダイレクトすると出力されない問題

デーモンにするために、標準出力をファイルにリダイレクトしたところ、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モデルとなります。

WD 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の電波を探しているんですよ?まさか持っていませんか?」と聞いたところ。

不届者「やべぇ、電源入れっぱなしだった」 という声が隣の席から聞こえてきました。

殺す

本物のフォックスハンティングを経験したことはありませんが、宝探しのようで思ったよりも楽しめました。 今後も、電波を漏らしている人を徹底的に駆逐していきたいと思います。