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 をつけると勝手にフラッシュしてくれるようなので、今回はこちらで対応しました。
用意したのは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ディスクをあっさり構築することができました。 ディスク起動時にに、消費電力を抑えるために、時間差で始動するなど、それっぽい動きをしています。
次に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の電波を漏らしているやつがいる!」
???「発信元を見つけ次第ぶっ殺せ!ヒャッハー」
という会話が、某会社で繰り広げられていたかはさておき、
会社で禁止されている無線LANルーターの電波で業務に支障が出ていたので、フォックスハンティングさながら、電波強度を元に発信源を調査してみました。
Androidがあれば、電波強度を調べるソフトウェアがあるようですが、機材の都合でMacBook Airを利用することにしました。 MacOS Xには電波強度を調べるコマンドがあるので、指定したAPのみ1秒毎に出力するスクリプトを組みました。
#!/bin/sh
#auth :sabagara
#usage :wifi_check.sh
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値で確認することができます。感覚的には以下のような感じです。
MacBook Airを持ちながら、職場を不審者さながらうろついていると、「何やっているの?」と声がかかったので、 すかさず「今、私物のポケットwi-Fiの電波を探しているんですよ?まさか持っていませんか?」と聞いたところ。
不届者「やべぇ、電源入れっぱなしだった」
という声が隣の席から聞こえてきました。殺す。
本物のフォックスハンティングを経験したことはありませんが、宝探しのようで思ったよりも楽しめました。 今後も、電波を漏らしている人を徹底的に駆逐していきたいと思います。
FreeBSD9.1からFreeBSD10のアップグレードを行ってみました。
カスタムカーネルを利用するので、カーネルビルドに面倒事がないように/usr/srcからmake buildworldします。 (freebsd-updateは、容量が貧弱な/varが悲鳴を上げるので不採用)
カーネルコンフィグレーションファイルですが、以下の2つは9.1では必要ではありませんでしたが、10.0からは無いとビルドが失敗するようになっていました。
device ahc
device ahd
また、さくらのVPSを利用しているので、サポートが開始されたVirtIOは有効にしてみました。
更に、今まではcsupを利用してソースを取得していましたが、提供が終わったので、svnで取得するようにしました。
# svn checkout svn://svn.freebsd.org/base/releng/10.0 /usr/src
# cd /usr/src
# make buildworld
# make buildkernel KERNCONF=SAKURA_KERNEL
# make installkernel KERNCONF=SAKURA_KERNEL
# shutdown now
# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a
# adjkerntz -i
# cp -pR /etc /old_etc
# mergemaster
# cd /usr/src
# make installworld
# mergemaster -p
# make delete-old
# reboot
上記手順で、/etcのバックアップの手順が入っていますが、実際には行わなずにmergemasterを行ったところ 失敗して/etc/passwdを消去してしまったため、泣く泣く修復作業を行いました…… 公式でもバックアップを取れと書いてあるので、コピーしておきましょう。
アップデートにPortsnapを使っていましたが、こちらもsvnに移行しました。
# svn checkout https://svn0.us-west.FreeBSD.org/ports/head /usr/ports
# portupgrade -af
# pkg check -d
# portsclean -CDP
古いライブラリの削除
# cd /usr/src
# make delete-old-libs
pkgdb -Fが使えなくなっているので、pkg check -dで検出された依存関係のパッケージをmake install
以上