2014/04/30

AndroidのGCMでニコ生アラートを受信してみる

ニコニコ生放送の通知が携帯のキャリアメールにしか届かないので Android で受け取る方法を調べてみた。

ニコ生アラート API

PCアプリ用のニコニコのサーバから生放送開始を受け取る WebAPI があるようです。

ざっくり説明すると

  1. http://live.nicovideo.jp/api/getalertinfo でサーバの IPアドレス と ポート番号 が XML で取れる。
  2. IPアドレス:ポート番号 に生ソケットで繋げて リクエストXML を1つ投げると生放送の開始が XML で落ちてくる。
    • a) ソケットは繋ぎっぱなしで生放送の開始は PUSH で落ちてくる。
    • b) ログインしても全放送の開始が PUSH されてくる。
  3. https://secure.nicovideo.jp/secure/login?site=nicolive_antenna でログインして
  4. http://live.nicovideo.jp/api/getalertstatus でユーザの参加コミュニティを取ってくる。
  5. 2 で PUSH されてくるデータを自前でフィルタリング。

となります。

ここで問題が1つ発生。
全放送の情報が落ちてくると10件/秒くらいのペースとなり、 Android にバックグラウンド処理させるのは無理が有りすぎます。

実際、Google Play 上がっている非公式のニコ生アラートのアプリは電池があっという間に無くなるとコメントが入っていました。

サーバを使う

放送開始の受信はサーバで行うしか無いと言うのが結論です。
幸い、家には 24時間稼働の RasipberryPi が有るのでここで受信とフィルタリングを行い必要な通知のみ GCM メッセージで Android に送ります。

Android アプリは GCM メッセージを受信した時に Android の通知に変換するサービスだけとなるので電池を消耗しません。

実装してみる

得に技術的に新しい事はしていないのでソースの解説とかははしょります。

ソースのSVNだけ置いておきます。

新しいトピックとしては GCM のサーバがバグっていてアプリのアンインストールに 対応できていないことが分かりました。(2014年4月現在)

どういう事かと言うとAndroid側でアプリがアンインストールされてもサーバにそれが通知されない為、 自動でユーザ登録の削除等が行えません。
一度、修正されたようですがその後ロールバックされた状態のようです。

もう一つ、GCM のメッセージは大きく遅延する事が有るのが分かりました。 通常は数秒で届きますが時々数分の遅延が発生します。 最大20分の遅延を確認しています。

実行結果

ユーザ登録します。

ちゃんと参加中のコミュニティの生放送の通知が届きました。

タップすると生放送のURLを起動するのでニコ動の公式アプリがインストールされていればそのまま生放送が見れます。

試して見たい方用に野良ビルドのアプリを上げて置きます。(ご利用は自己責任で)

デフォルトの設定で我が家の RaspberryPi に接続されるのでサーバは不要です。
※アンインストール前には必ず登録解除を行ってください。
※サーバは予告無く停止する事が有ります。ご了承ください。

所感

iPhone のニコ動公式アプリでは通知がサポートされているようなので Android でもいずれサポートされると思いますが 取り合えず今必要だったので作ってみました。


2014/04/17

RaspberryPiにGW-450Dを繋ぐメモ

衝動買いで 5Gz(11ac) の無線LANのルータとドングルを購入したので RaspberryPi で試そうと思ったらえらくハマったのメモ。

購入した製品はこちら。

ルータは 4000円からさらにキャンペーン割引で 3600円と 5GHz 対応の無線LANルータとしては暴安だったので購入。

ドングルはこの機種(GW-450D)が RaspberryPi で動作したとの情報をチラと見たので深く考えず購入。 そしてハマるw

GW-450D の Linux 用ドライバ

Linux用ドライバのソースはチップメーカーから供給されていて Planex のサイトからも落とせるようになっています。

しかし、これを README にしたがってコンパイルしてもエラーになります。

make: *** /lib/modules/3.10.25+/build: No such file or directory.  Stop.

これは Rasbian のバイナリイメージにカーネルのヘッダソースが含まれていない為です。

じゃあインストールしてやれば良いかと言うとバージョンの合うパッケージがありません。

$ sudo apt-cache search linux-header
linux-headers-3.10-3-all - All header files for Linux 3.10 (meta-package)
linux-headers-3.10-3-all-armhf - All header files for Linux 3.10 (meta-package)
linux-headers-3.10-3-common - Common header files for Linux 3.10-3
linux-headers-3.10-3-rpi - Header files for Linux 3.10-3-rpi
linux-headers-3.2.0-4-all - All header files for Linux 3.2 (meta-package)
linux-headers-3.2.0-4-all-armhf - All header files for Linux 3.2 (meta-package)
linux-headers-3.2.0-4-common - Common header files for Linux 3.2.0-4
linux-headers-3.2.0-4-rpi - Header files for Linux 3.2.0-4-rpi
linux-headers-3.6-trunk-all - All header files for Linux 3.6 (meta-package)
linux-headers-3.6-trunk-all-armhf - All header files for Linux 3.6 (meta-package)
linux-headers-3.6-trunk-common - Common header files for Linux 3.6-trunk
linux-headers-3.6-trunk-rpi - Header files for Linux 3.6-trunk-rpi
linux-headers-rpi - Header files for Linux rpi configuration (meta-package)
linux-headers-rpi-rpfv - This metapackage will pull in the headers for the raspbian kernel based on

ちなみに linux-headers-3.10-3-rpi をインストールしてビルドしたバイナリは insmod しようとするとバージョンチェックで蹴られます。

$ sudo insmod mt7650u_sta.ko
Error: could not insert module mt7650u_sta.ko: Invalid module format
$ dmesg
[  375.421162] mt7650u_sta: disagrees about version of symbol module_layout

じゃあ、カーネルのソースを落としてくればと思ったのですが Git リポジトリには最新の 3.10.37 のソースしかなくバイナリリリースされている 3.10.25 のタグが切られていません。
何の為の Git なのか意味不明なのですがとにかくそういうソース管理のようです。

結論

対処方の結論はこちらの参考サイトに書いてありました。

自分で最新のカーネルをビルドしなおしてそのソースを使えと言うことらしいです。
ドライバのインストールの為にカーネルのビルドが必要というだいぶ時代が逆行した感が有りますがしかたありません。

私の行った手順は参考サイトと微妙に違っているのでメモして置きます。

尚、これは 2014年4月時点 2014-01-07-wheezy-raspbian.zip を前提とした手順です。

準備

$ sudo apt-get update
$ sudo apt-get -y dist-upgrade
$ sudo apt-get -y install gcc make bc screen ncurses-dev

カーネルソース取得

$ wget https://github.com/raspberrypi/linux/archive/rpi-3.10.y.tar.gz
$ wget https://github.com/raspberrypi/firmware/raw/master/extra/Module.symvers

※wget で Module.symvers が取得出来ない場合はブラウザで取得できます。

カーネルのビルド

$ cd /usr/src
$ sudo su
# tar -xvzf ~/linux-rpi-3.10.y.tar.gz 
# cd linux-rpi-3.10.y
# cp ~/Module.symvers .
# gzip -dc /proc/config.gz > .config
# make oldconfig
# make clean
# make
# make modules_install
# mkdir boot
# make INSTALL_PATH=/usr/src/linux/boot install
# cp /usr/src/linux/boot/vmlinuz-3.10.37 /boot
# vi /boot/config.txt
    kernel=vmlinuz-3.10.37
# ln -s /usr/src/linux-rpi-3.10.y /lib/modules/3.10.37/build
# reboot

   …再起動…

$ uname -r
    3.10.37         <-- カーネルが更新されて要ることを確認

GW-450Dドライバのビルド

$ unzip gw-450d_driver_linux_v3002.zip
$ cd gw-450d_driver_linux_v3002
$ tar xvjf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
$ cd mt7610u_wifi_sta_v3002_dpo_20130916
$ vi common/rtusb_dev_id.c (コード追加)
    USB_DEVICE_ID rtusb_dev_id[] = {
    #ifdef MT76x0
            {USB_DEVICE(0x2019,0xab31)}, /* GW-450D */  <-- 追加
$ vi os/linux/config.mk (設定変更)
    HAS_WPA_SUPPLICANT=y
    HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
$ make
$ sudo make install
$ sudo rm -r /etc/Wireless/RT2860STA
$ sudo mkdir -p /etc/Wireless/RT2870STA
$ sudo cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
$ sudo insmod /lib/modules/3.10.37/kernel/drivers/net/wireless/mt7650u_sta.ko
$ iwconfig ra0
    ra0       Ralink STA  ESSID:"11n-AP"  Nickname:"MT7610U_STA"
              Mode:Auto  Frequency=2.412 GHz  Access Point: Not-Associated   
              Bit Rate:1 Mb/s   
              RTS thr:off   Fragment thr:off
              Link Quality=100/100  Signal level:0 dBm  Noise level:0 dBm
              Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
              Tx excessive retries:0  Invalid misc:0   Missed beacon:0

iwconfig が以下のようになる場合はビルドに失敗しています。

$ iwconfig ra0
ra0       No such device

ローカル環境の設定

環境毎に設定値は違います。

$ sudo vi /etc/modules (設定追加)
    mt7650u_sta
$ sudo vi /etc/Wireless/RT2870STA/RT2870STA.dat (設定変更)
    SSID=
    AuthMode=WPA2PSK     <-- ルータの設定に合わせる
    EncrypType=AES       <-- ルータの設定に合わせる
$ sudo vi /etc/network/interfaces (設定追加)
    allow-hotplug ra0
    auto ra0
    iface ra0 inet dhcp
    wpa-ssid “ルータのSSID”
    wpa-psk “ルータのパスワード”
# sudo reboot

   …再起動…

$ iwconfig ra0
    ra0       Ralink STA  ESSID:"ルータのSSID"  Nickname:"MT7610U_STA"
              Mode:Managed  Frequency=5.22 GHz  Access Point: 00:11:22:33:44:55   
              Bit Rate=135 Mb/s   
              RTS thr:off   Fragment thr:off
              Link Quality=100/100  Signal level:-49 dBm  Noise level:-68 dBm
              Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
              Tx excessive retries:0  Invalid misc:0   Missed beacon:0
$ ifconfig ra0
    ra0       Link encap:Ethernet  HWaddr 00:11:22:33:44:55  
              inet addr:192.168.0.201  Bcast:192.168.0.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:1618 errors:0 dropped:0 overruns:0 frame:0
              TX packets:79 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:468584 (457.6 KiB)  TX bytes:9181 (8.9 KiB)

ifconfig で DHCP のアドレスがちゃんと振られていれば接続完了です。


2013/08/25

RaspberryPiでJoypadからコマンド入力

RaspberryPiのUSB接続を認識するの続き。

RaspberryPiはキーボード/モニタ無しで LAN のみ接続で使っている人が多いと思うんだけど コマンドを実行したい時に ssh で接続するのが以外に面倒。

とくに shutdown と reboot ぐらいは端末が無くても出来るようにしたい。

で、思い付いたのが joypad で入力する方法。 GPIO を使ってボタンを付ける方法も考えたのだが物理的な工作とか考えると USB Joypad の方が圧倒的にコストパフォーマンスが良い。

今回、購入したのはこれ。安っ。

joypad の入力シーケンスから任意のコマンドを実行するスクリプトは自前で作成。

入力シーケンスと言うのは ↑↓←→ABAB みたいなゲームの隠しコマンドとかで使うやつ。 単独のボタンにコマンド割り当だとうっかり実行しちゃうので。

必要なアプリが2つあるのでインストールする。

$ sudo apt-get install joystick
$ sudo apt-get install gawk
メインの AWK スクリプト。gawk専用(/home/pi/jscmd/jscmd.awk)
BEGIN {
    loadConfig(CONFIG); # -v CONFIG=file_name
    namesSize = split(config["BUTTONS"], names, /,/);
    sequence = "";
    lastModify = systime();
}

/^Event: type 1,/ {
    n = $7; sub(/,$/,"",n);
    v = $9;
    key = names[n+1];
    flag[key] = v;
    if (v) addKey();
}

/^Event: type 2,/ {
    n = $7; sub(/,$/,"",n);
    v = $9;

    if (n == 0) {
        flag["RIGHT"] = (v>0)?1:0;
        flag["LEFT"]  = (v<0)?1:0;
    } else {
        flag["DOWN"] = (v>0)?1:0;
        flag["UP"]   = (v<0)?1:0;
    }
    if (v != 0) addKey();
}

func addKey() {
    t = systime();
    if (t > lastModify+2) sequence = "";
    lastModify = t;

    keys = "";
    for (i=1; i<=namesSize; i++) {
        if (flag[names[i]]) {
            keys = sprintf("%s+%s",keys,names[i]);
        }
    }
    sub(/^[+]/,"",keys);
    sequence = sprintf("%s %s",sequence,keys);
    gsub(/[ ]+/," ",sequence);
    gsub(/^[ ]/,"",sequence);

    print ">",sequence;
    if (config[sequence]) {
        print "exec ",config[sequence];
        system(config[sequence]);
        sequence = "";
    }
}

func loadConfig(CONFIG_FILE) {
    print "--- Config --------------------------";
    while ((getline < CONFIG_FILE) > 0) {
        idx = index($0,"=");
        if (idx <= 0) continue;
        key = substr($0,0,idx-1); sub(/^[ ]+/,"",key);sub(/[ ]+$/,"",key);
        val = substr($0,idx+1); sub(/^[ ]+/,"",val);sub(/[ ]+$/,"",val);
        print key,"=",val;
        config[key] = val;
    }
    print "-------------------------------------";
}
起動スクリプト(/home/pi/jscmd/jscmd-start.sh)
#!/bin/sh -fx

BASE=`dirname $0`
JSDEV=$DEVNAME
if [ "$JSDEV" = "" ] ; then
        JSDEV=/dev/input/js0
fi

cd $BASE
jstest --event $JSDEV | gawk -v CONFIG=jscmd.cnf -f jscmd.awk &
udev設定(/etc/udev/rules.d/10-joypad.rules)
ACTION=="add",\
        SUBSYSTEMS=="usb", \
        KERNEL=="js*", \
        RUN:="/home/pi/jscmd/jscmd-start.sh", \
        OPTIONS+="last_rule"
  • 設定の反映
$ sudo service udev reload
コマンド設定ファイル(/home/pi/jscmd/jscmd.cnf)
BUTTONS=A,B,X,Y,L,R,select,start,RIGHT,LEFT,DOWN,UP

UP UP DOWN DOWN A B A B = shutdown -h now
LEFT LEFT RIGHT RIGHT A B A B = reboot
  • 最初の BUTTONS はJoypadのボタンの定義。
    • jstest コマンドで確認して「,」区切りでボタンの名前を順番に並べる。
    • 十字キーが Axes: の場合は RIGHT,LEFT,DOWN,UP を最後に追加する。
  • 3行目以降が入力シーケンスとコマンドのペア。「=」区切り。
    • 入力シーケンスはBUTTONSで定義した名前を空白区切りで記述。
    • 同時押しの場合は「A+B」のように書ける。
      • 但し、「B+A」は不可。BUTTONSでの定義順の必要がある。
    • コマンドは1行以内。
jstestの使い方

joypad は製品毎にボタンの配置が異るのでテストツールで確認する。

$ jstest /dev/input/js0
Driver version is 2.1.0.
Joystick (USB,2-axis 8-button gamepad  ) has 2 axes (X, Y)
and 8 buttons (Trigger, ThumbBtn, ThumbBtn2, TopBtn, TopBtn2, PinkieBtn, BaseBtn, BaseBtn2).
Testing ... (interrupt to exit)
Axes:  0:     0  1:     0 Buttons:  0:off  1:off  2:off  3:off  4:off  5:off  6:off  7:off



これで Joypad をUSBに差して ↑↑↓↓ABAB と入力して shutdown すれば成功です。


2013/07/21

RaspberryPiのUSB接続を認識する

RaspberryPi で USB デバイスの抜き差しに応じてアプリの起動/終了をしたかったのでその調査メモ。

Linux では USB 制御は udev と言う仕掛けを使うらしい。

/etc/udev/rules.d/ に目的のデバイスの *.rules ファイルを記述すればOK。
rules ファイルは先頭が数字になっているので多分その順番で処理されるものと思われる。
rules の書き方は man udev でマニュアルが見れるが正直分かり辛い。

とりあえずサンプルをググりながら手持ちのJoyStickを認識する設定を書いてみた。

ルールファイル

/etc/udev/rules/10-joystick-test.rules:

ACTION=="add",\
        SUBSYSTEMS=="usb", \
        ATTRS{idVendor}=="0d9d", \
        ATTRS{idProduct}=="3011", \
        KERNEL=="js*", \
        RUN:="/tmp/test1.sh start", \
        OPTIONS+="last_rule"

ACTION=="remove",\
        SUBSYSTEMS=="usb", \
        ENV{ID_VENDOR_ID}=="0d9d", \
        ENV{ID_MODEL_ID}=="3011", \
        KERNEL=="js*", \
        RUN:="/tmp/test1.sh stop", \
        OPTIONS+="last_rule"
  • 1つの定義は1行で記述する。改行は「\」でエスケープできる。
  • 比較演算子が条件、代入演算子が処理と考えれば良い。
  • ACTION: "add"が接続、"remove"が切断。
  • SUBSYSTEMS: USB の場合は固定。
  • ATTRS: udevadm info コマンドで取れる属性値。
  • ENV: udevadm monitor コマンドで取れる環境変数値。
  • KERNEL: /dev/ 以下の名前と思えば良い。*はワイルドカード。
  • RUN: 実行スクリプト
  • OPTIONS: 多分無くても良い。サンプルに書いてあったのでそのまま。
  • add と remove で ATTRS と ENV の違いが有ることに注意。


udevadm info コマンド

以下のコマンドでデバイスの情報を色々表示してくれる。

$ sudo udevadm info -a -p $(udevadm info -q path -n /dev/input/js0)

但し、2013年6月時点のOSでは表示後ハングアップしてしまう。
Vendor/Productは dmesg でも見れるので無理に使う必要は無い。

udevadm monitor コマンド

起動して置いて USB を抜き差しすると接続ログとデバイス情報が吐き出される。

$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

UDEV  [258008.515110] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/input/input18/js0 (input)
ACTION=add
DEVLINKS=/dev/input/by-id/usb-HuiJia_4Axes_16Key_GamePad-joystick /dev/input/by-path/platform-bcm2708_usb-usb-0:1.2.1:1.0-joystick
DEVNAME=/dev/input/js0
DEVPATH=/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/input/input18/js0
ID_BUS=usb
ID_INPUT=1
ID_INPUT_JOYSTICK=1
ID_MODEL=4Axes_16Key_GamePad
ID_MODEL_ENC=4Axes\x2016Key\x20GamePad
ID_MODEL_ID=3011
ID_PATH=platform-bcm2708_usb-usb-0:1.2.1:1.0
ID_PATH_TAG=platform-bcm2708_usb-usb-0_1_2_1_1_0
ID_REVISION=4b24
ID_SERIAL=HuiJia_4Axes_16Key_GamePad
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030000:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=HuiJia
ID_VENDOR_ENC=HuiJia\x20
ID_VENDOR_ID=0d9d
MAJOR=13
MINOR=0
SEQNUM=1031
SUBSYSTEM=input
TAGS=:udev-acl:
UDEV_LOG=3
USEC_INITIALIZED=258008048772


実行スクリプト

/tmp/test1.sh:

#!/bin/bash
echo `date` $0 $1 $DEVNAME >> /tmp/test.log
  • 環境変数 DEVNAME はデバイス名が入っている。
  • その他に設定される環境変数はスクリプト内で env を実行すれば分かる。
実行結果

/tmp/test.log:

Sun Jul 21 18:46:35 JST 2013 /tmp/test1.sh start /dev/input/js0
Sun Jul 21 18:46:38 JST 2013 /tmp/test1.sh stop /dev/input/js0

ちゃんと呼ばれている。

後は JoyStick の操作を読み取って任意の処理を行うスクリプトを起動させれば良い。

RaspberryPiはshutdownボタンとか無いのが以外に不便なのだがこれで実現できる。 -> RaspberryPiでJoypadからコマンド入力


2013/07/15

RaspberryPiをDNSにする

前から自宅LAN用のDNSが欲しかったんだけど24時間稼働というハードルが以外に高く 実現できないでいた。

RaspberryPiにちょうど良いのでDNSにしてみた。

デフォルトでは入っていないようなのでインストール。

$ sudo apt-get install bind

しかし、この後困った。/etc/named.conf が無いのだ。

色々ググってやっと分かった。Debian系は /etc/bind/ なのね。
しかも named.conf が幾つかに分割されていて独自のお作法が有る様子...

良く分かんないけど適当にやったら動いたからメモっとく。

/etc/bind/named.conf.options:

acl localnet {
        192.168.0.0/24;
        127.0.0.1;
};

options {
        directory "/var/cache/bind";
        allow-query { localnet; };
        allow-transfer { none; };
        forwarders { 192.168.0.1; };      # 家のルータはNS持ってるので
        forward only;

        dnssec-validation auto;
        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };         
};

PS. forwardersが効いていなかったので修正

        allow-transfer { localnet; };
        dnssec-validation no;

/etc/bind/named.conf.local:

zone "myhome.jp" {
        type master;
        file "/etc/bind/myhome.jp.zone";
};

zone "0.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/myhome.jp.rev";
};

/etc/bind/myhome.jp.zone:

$TTL    86400
@       IN      SOA     ns.myhome.jp. root.myhome.jp. (
                        2013063001      ; Serial
                        3600            ; Refresh
                        900             ; Retry
                        604800          ; Expire
                        86400 ) ; Negative Cache TTL
;
@       IN      NS      ns.myhome.jp.   ; this host
@       IN      A       127.0.0.1
@       IN      AAAA    ::1
ns      IN      A       192.168.0.7     ; this host
rpi     IN      A       192.168.0.7     ; this host
router  IN      A       192.168.0.1     ;

/etc/bind/myhome.jp.rev:

$TTL    86400
@       IN      SOA     ns.myhome.jp. root.myhome.jp. (
                        2013063001      ; Serial
                        3600            ; Refresh
                        900             ; Retry
                        604800          ; Expire
                        3600 )  ; Negative Cache TTL
;
@       IN      NS      ns.myhome.jp.
7       IN      PTR     rpi.myhome.jp.
1       IN      PTR     router.myhome.jp.

で bind 再起動。

$ sudo service bind9 restart

参照側PCでDNSを設定して確認する。

$ sudo vi /etc/resolve.conf
domain myhome.jp
nameserver      192.168.0.7
$ nslookup rpi
Server:         192.168.0.7
Address:        192.168.0.7#53

Name:   rpi.myhome.jp
Address: 192.168.0.7

$ nslookup 192.168.0.7
Server:         192.168.0.7
Address:        192.168.0.7#53

7.0.168.192.in-addr.arpa        name = rpi.myhome.jp.

問題無さげ。地味に嬉しい。


2013/07/11

RaspberryPiのパーティション

RaspberryPiを購入してみたの続き。

とりあずOSを入れただけなのでその他の設定したメモです。

固定IPの設定

DHCPは不便なので固定IPを振ります。

$ sudo vi /etc/network/interfaces   #以下の修正を入れる
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.0.xxx
netmask 255.255.255.0
gateway 192.168.0.1

パーティションの切り直し

img ファイルは2Gの状態なのでSDカードサイズの16Gまで使えるようにします。
単純に最大まで使うだけならば raspi-config コマンドの expand_rootfs から行えます。

しかし、書込回数に上限のあるSDカードで /var がルートパーティションに有るのは嫌なので手動で /var 専用のパーティションを切る事にしました。

-> と思ったのですが今時のフラッシュメモリはウェアレベリング機能が入っていて同じセルに書き込まないらしいです。 なので意味無いのですがせっかくなのでパーティション分け方法のメモとして残します。

  • ルートパーティションを10Gに拡張
$ sudo fdisk /dev/mmcblk0

Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880     XXXXXXX     XXXXXXX   83  Linux

Command (m for help): d
Partition number (1-4): 2
Partition 2 is deleted

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (2048-xxxxxxx, default 2048): 122880   ←元と同じStart
Last sector, +sectors or +size{K,M,G} (8192-xxxxxxx, default xxxxxxx): +10G
Using default value 10485760

Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    21094399    10485760   83  Linux

Command (m for help): w

$ sudo reboot
  • ルートパーテションのファイルシステムを再構築します。
$ sudo resize2fs /dev/mmcblk0p2
$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
rootfs          10321208 1462516   8421024  15% /
/dev/root       10321208 1462516   8421024  15% /
devtmpfs          216132       0    216132   0% /dev
tmpfs              44880     232     44648   1% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs              89740       0     89740   0% /run/shm
/dev/mmcblk0p1     57288   18960     38328  34% /boot


  • 拡張領域に/var用の1Gのパーティションを切ります。
$ sudo fdisk /dev/mmcblk0
Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    21094399    10485760   83  Linux

Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): e
Partition number (1-4, default 3): 
Using default value 3
First sector (2048-30881791, default 2048): 21094400    ←End+1
Last sector, +sectors or +size{K,M,G} (21094400-30881791, default 30881791):
Using default value 30881791

Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    21094399    10485760   83  Linux
/dev/mmcblk0p3        21094400    30881791     4893696    5  Extended

Command (m for help): n
Partition type:
   p   primary (2 primary, 1 extended, 1 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (21096448-30881791, default 21096448): 
Using default value 21096448
Last sector, +sectors or +size{K,M,G} (21096448-30881791, default 30881791): +1G

Command (m for help): p
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    21094399    10485760   83  Linux
/dev/mmcblk0p3        21094400    30881791     4893696    5  Extended
/dev/mmcblk0p5        21096448    23193599     1048576   83  Linux

Command (m for help): w

$ sudo reboot
  • 作成したパーティションに現在の /var の内容をコピーして次回からマウントされるようにします。
$ sudo mkfs -t ext4 /dev/mmcblk0p5
$ sudo mount /dev/mmcblk0p5 /mnt
$ sudo apt-get install rsync    #デフォルトでは入ってませんでした
$ sudo rsync -av /var/ /mnt
$ sudo vi /etc/fstab  #以下の一行追加
/dev/mmcblk0p5  /var            ext4    defaults,noatime  0       1
$ sudo reboot
$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
   :
/dev/mmcblk0p5   1032088  675428    304232  69% /var


拡張領域に余裕を残してあるのはこの /var に書き込め無くなったら 別のパーティションを切って引っ越す作戦です。

RAMディスクを使う作戦も有るのですが /var 全部はカバーできないしメモリが減るのでこの方法でしばらく試して見ようと思います。



これでやっと落ちついて作業ができます。


2013/07/04

RaspberryPiを購入してみた

気になっていたRaspberry-Piを買ってみた。

購入先は正規代理店の RSコンポーネンツ株式会社 から。

ここはアマゾンより安いのでお勧めだが個人の場合、幾つか注意事項がある。

  • 個人でも「通常のRSとのお取り引き」を選んでユーザ登録を行う。
  • 土日祝日の配送は行わないので配送先に平日受け取れる場所を設定する。
  • 支払いは「クレジット」か「代引」とする。

基本的に法人相手の取り引きを行う会社だが例外的に個人でも受け付けていると形。

で発注すると翌日には届いちゃう。

専用ケースも購入したが保管用のケースが付いてくるのでこれに穴空けしても充分な感じ。

その他に買った物。

SDカードは新調したほうが良いと思うがその他は手持ちがあれば不要。
セルフ電源付きのUSBハブはUSB-HDDとか繋げる時には必要になるので無ければ買って置いた方が良いと思います。

インストール

ググれば沢山出て来ますが一応メモります。

以下のサイトからOS(201X-xx-xx-wheezy-raspbian.zip)をDLします。

展開して中の img ファイルをSDカードに書き込みます。

$ sudo dd if=201X-xx-xx-wheezy-raspbian.img of=/dev/XXX bs=10240000

書き込み先のデバイス名はOS依存です。FreeBSDでUSB接続の場合は /dev/da0 とかです。 Windowsの場合は専用ツールが必要だったりします。適当にググってください。

OSを書き込んだSDカードを挿入し電源を繋げれば起動します。
LANケーブルを差して置けば DHCP で sshd が起動するので ssh で接続します。

$ ssh pi@192.168.0.x
Password: raspberry

ログインできればセットアップ終了です。

動画再生

動画プレーヤーが最初からOSに入っているのでYoutubeから落してきたmp4を再生してみます。

$ omxplayer PentaAsibuto.mp4

Full-HD(1920x1080p/30fps) の動画ファイルをモニタの都合で 1280x720p 再生しています。
この時のCPU使用率は15%程度で、コマ落ち等全くありませんでした。

とりあえず準備が整いました。
大変なのはここからですが...


2013/05/12

RaspberryPiとはなんぞや

今、一緒に仕事をしている人から RaspberryPi なる物が有ることを聞いた。 ->買いました

大雑把に言うと前に紹介したスティック型アンドロイドの普通の Linux 版。

スペックは ARM11/700MHz、Mem/512M で中華Androidよりは一段下だが なんとお値段 3000円。

学習用なのでOS等全てオープンになっていて玩具としては最適だし、 なんと言っても不良品の不安が無い。

こちらの方が詳しくレビューしてくれていてフルHDの動画再生も行けるらしい。

アマゾンでも売ってるんだが何で直販より高いんだろ?


プロフィール
20年勤めた会社がリーマンショックで消滅、紆余曲折を経て現在はフリーランスのSE。 失業をきっかけにこのブログを始める。

サイト内検索

登録
RSS/2.0

カテゴリ

最近の投稿【RaspberryPi】

リンク

アーカイブ