Raspberry Pi の Wi-Fi を自動再接続

気温、気圧をロギングしている Raspberry Pi Model B の Wi-Fi が不安定で、よく繋がらなくなる。電源周りが弱いと聞いたので電解コンデンサーを増設したけどあまり変わらなかった。その原因がわからないままにしたくはないけど、まずは計測したデータをちゃんととっておきたいので、「繋がらなくなったら再起動」するスクリプトを作った。

NTERFACE=wlan0
IP_FOR_TEST=192.168.1.1
NOTIFY_TO=notify@*****.com
PING_COUNT=1
STATUS_DOWN=~/$INTERFACE-connectivity-down
URL_FOR_RRDTOOL=http://*****.com/api/RaspberryPi/$INTERFACE/down
USER_FOR_RRDTOOL=********

ping -c $PING_COUNT $IP_FOR_TEST > /dev/null 2> /dev/null

if [ $? -ge 1 ]; then
    logger '$INTERFACE seems to be down, REBOOT to recover ...'
    touch $STATUS_DOWN
    sudo reboot
else
    if [ -e $STATUS_DOWN ]; then
        logger '$INTERFACE is up.'
        echo '$INTERFACE is up.' | mail -s 'check wlan0 of weather data logger' $NOTIFY_TO
        curl -u $USER_FOR_RRDTOOL -F 'number=1' $URL_FOR_RRDTOOL
        rm -f $STATUS_DOWN 2> /dev/null
    else
        curl -u $USER_FOR_RRDTOOL -F 'number=0' $URL_FOR_RRDTOOL
    fi
fi

ping が通らなかったら再起動する…というもの。
再起動したら、メール通知とRRDTOOLにもデータを投げておくことで、データの欠測の判断がしやすくなる。
気温、気圧は5分間隔で計測しているので、それよりも短い2分間隔でこのチェックスクリプトを実行するように cron に設定した。

2015年も、あけましておめでとう

昨年は、目の前の事に一心不乱に取り組めた年でした。

これほど多くの人とよく話をし、
それぞれの物事について「何が最高か」を
自分の中で常に模索し続けられたことは、
これまでの人生の中でも、貴重な一年間でした。

今後の人生の中で、物事を成すための大きな糧になると思う。

自ら新し価値を創造し、
常に社会の期待に応えられる人で在りたい。

Raspberry PiにRaspbianインストールメモ

Raspberry Pi に OS(Raspbian)をインストール

MacOSX での作業メモ。

1. Raspbian をダウンロードする

$ curl -L http://downloads.raspberrypi.org/raspbian_latest -o raspbian.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100  494M  100  494M    0     0   520k      0  0:16:12  0:16:12 --:--:--  904k

$ openssl sha1 raspbian.zip 
SHA1(raspbian.zip)= f072b87a8a832004973db4f5e1edb863ed27507b

Downloads の checksum と同じ事を確認する。

2. SDカードにOSを書き込む

SDカードを取り付けて確認する。

$ df
Filesystem    512-blocks      Used Available Capacity  iused    ifree %iused  Mounted on
/dev/disk0s2   235298960 154688048  80098912    66% 19400004 10012364   66%   /
devfs                375       375         0   100%      649        0  100%   /dev
map -hosts             0         0         0   100%        0        0  100%   /net
map auto_home          0         0         0   100%        0        0  100%   /home
/dev/disk1s1      114576     37840     76736    34%      512        0  100%   /Volumes/UNTITLED

デバイスが disk1 とわかったので、まずは unmount。

$ diskutil umount disk1s1
Password:
$ df
Filesystem    512-blocks      Used Available Capacity  iused    ifree %iused  Mounted on
/dev/disk0s2   235298960 154688056  80098904    66% 19400005 10012363   66%   /
devfs                375       375         0   100%      649        0  100%   /dev
map -hosts             0         0         0   100%        0        0  100%   /net
map auto_home          0         0         0   100%        0        0  100%   /home

続けて書き込む。
raw書き込みをしたいので、デバイスが disk1 ということは、書き込み先は /dev/rdisk1 ということになる。

$ unzip -p raspbian.zip | sudo dd bs=1m of=/dev/rdisk1
Password:
0+45200 records in
0+45200 records out
2962227200 bytes transferred in 436.999771 secs (6778555 bytes/sec)

書き込みが終わったら unmount してからSDカードを取り外す。

2012 in review

WordPress.com 統計チームによる、2012年のブログの年間まとめレポートです。

概要はこちらです。

2012年にエベレスト山の登頂に成功したのは600名でした。2012年にこのブログは約5,700回表示されました。もしエベレストに登った人たちだけがブログを見たとすると、同じ表示数に達するには10年間かかる計算になります。

レポートをすべて見るにはクリックしてください。

nginx + php-fpm で CodeIgniter を動かすメモ

事前に nginx と PHP-FPM がインストールされている前提になります。

ソースコードの配備

オフィシャルサイトからダウンロードできますが、今回は github から取得します。
安定版は 2.1-stable だったのでそれに。

$ cd /path/to/project
$ git clone git://github.com/EllisLab/CodeIgniter.git
$ git checkout 2.1-stable

続きを読む

ufw@Ubuntu でRuleを削除する

初期構築したあとは、ファイアウォールに手を入れることがあまりないので、
ufw でルールの追加・削除する構文はつい忘れがち。
今回は Rule を削除するときに簡単な?覚えやすい?方法を知ったのでメモ。
コマンドラインで numbered をつけると、行頭に番号が振られます。

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 80                         ALLOW IN    Anywhere

そして、以下のように、削除したい Rule を指定すれば削除できます。

$ sudo ufw delete 2

JavaScript の Array クラスを拡張してオブジェクトが含まれているか検索する

配列の中に要素が含まれているか検索したい時に、

var sample = ["foo", "bar"];
if ("bar" in sample)
    ... 

みたいな使い方をしたかったんだけど、
if-in はオブジェクトのプロパティ検索には使えても配列には使えないので、
Array クラスを拡張してみた。

/**
 * 配列にオブジェクトが含まれているか検索する
 *
 * @param {Object} オブジェクト
 * @return boolean 含まれていれば true
 *
 * @example
 * >>> var test = [1, 2, [3, 4], {foo: "bar"}, [5, 6]];
 * >>> test.contains([3, 4]);
 * true
 * >>> test.contains([1, 2]);
 * false
 * >>> test.contains({foo: "bar"});
 * true
 */
Array.prototype.contains = function(value) {
    for (var i in this)
        if (this.hasOwnProperty(i) && this[i].toString() === value.toString())
            return true;
    return false;
};

JavaScript の Array クラスを拡張して要素番号を指定せずに削除する

JavaScript の配列の要素を削除するには、delete や splice を使う方法がありますが、この場合は要素番号を指定する必要があります。

削除対象である要素の要素番号を求めるのが面倒だったので、削除したい要素の値を与えることで削除ができるように Array クラスを拡張することにしました。
拡張した Array クラスは、与える要素が文字や数値だけでなく、配列や連想配列にも対応しています。

/**
 * 配列に対象オブジェクトが含まれていたら削除する
 *
 * @param {Object} 削除したいオブジェクト
 * @return {Object} 削除したオブジェクト。含まれていない場合は false
 *
 * @example
 * >>> var test = [1, 2, [3, 4], {foo: "bar"}, [5, 6]];
 * >>> test.remove([3, 4]);
 * >>> console.log(test)
 * [1, 2, {foo: "bar"}, [5, 6]]
 * >>> test.remove({foo: "bar"});
 * >>> console.log(test);
 * [1, 2, [5, 6]]
 * 
 */
Array.prototype.remove = function(value) {
    for (var i in this)
        if (this.hasOwnProperty(i) && this[i].toString() === value.toString())
            return this.splice(i, 1)[0];
    return false;
};