記事


技術ネタ


Raspberry PIを使って、雨を告知するプログラムを書いてみた (02015_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フォックスハンティング (02015_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=${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の電波を探しているんですよ?まさか持っていませんか?」と聞いたところ。

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

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

FreeBSD10にアップグレード (02014_04_12)

FreeBSD9.1からFreeBSD10のアップグレードを行ってみました。

worldの構築とカーネルのインストール

カスタムカーネルを利用するので、カーネルビルドに面倒事がないように/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

新しいworldの適用(シングルユーザーモード)

# 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を消去してしまったため、泣く泣く修復作業を行いました…… 公式でもバックアップを取れと書いてあるので、コピーしておきましょう。

Port Collecttionの再ビルド

アップデートに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

以上