AndroidのGCMでニコ生アラートを受信してみる
ニコニコ生放送の通知が携帯のキャリアメールにしか届かないので Android で受け取る方法を調べてみた。
ニコ生アラート API
PCアプリ用のニコニコのサーバから生放送開始を受け取る WebAPI があるようです。
ざっくり説明すると
- http://live.nicovideo.jp/api/getalertinfo でサーバの IPアドレス と ポート番号 が XML で取れる。
- IPアドレス:ポート番号 に生ソケットで繋げて リクエストXML を1つ投げると生放送の開始が XML で落ちてくる。
- a) ソケットは繋ぎっぱなしで生放送の開始は PUSH で落ちてくる。
- b) ログインしても全放送の開始が PUSH されてくる。
- https://secure.nicovideo.jp/secure/login?site=nicolive_antenna でログインして
- http://live.nicovideo.jp/api/getalertstatus でユーザの参加コミュニティを取ってくる。
- 2 で PUSH されてくるデータを自前でフィルタリング。
となります。
ここで問題が1つ発生。
全放送の情報が落ちてくると10件/秒くらいのペースとなり、
Android にバックグラウンド処理させるのは無理が有りすぎます。
実際、Google Play 上がっている非公式のニコ生アラートのアプリは電池があっという間に無くなるとコメントが入っていました。
サーバを使う
放送開始の受信はサーバで行うしか無いと言うのが結論です。
幸い、家には 24時間稼働の RasipberryPi
が有るのでここで受信とフィルタリングを行い必要な通知のみ
GCM メッセージで Android に送ります。
Android アプリは GCM メッセージを受信した時に Android の通知に変換するサービスだけとなるので電池を消耗しません。
実装してみる
得に技術的に新しい事はしていないのでソースの解説とかははしょります。
ソースのSVNだけ置いておきます。
- サーバ:https://kotemaru.googlecode.com/svn/trunk/NicoNamaAlert
- クライアント:https://kotemaru.googlecode.com/svn/trunk/androidNicoNamaAlert
新しいトピックとしては GCM のサーバがバグっていてアプリのアンインストールに 対応できていないことが分かりました。(2014年4月現在)
どういう事かと言うとAndroid側でアプリがアンインストールされてもサーバにそれが通知されない為、
自動でユーザ登録の削除等が行えません。
一度、修正されたようですがその後ロールバックされた状態のようです。
もう一つ、GCM のメッセージは大きく遅延する事が有るのが分かりました。 通常は数秒で届きますが時々数分の遅延が発生します。 最大20分の遅延を確認しています。
実行結果
ユーザ登録します。
ちゃんと参加中のコミュニティの生放送の通知が届きました。
タップすると生放送のURLを起動するのでニコ動の公式アプリがインストールされていればそのまま生放送が見れます。
試して見たい方用に野良ビルドのアプリを上げて置きます。(ご利用は自己責任で)
デフォルトの設定で我が家の RaspberryPi に接続されるのでサーバは不要です。
※アンインストール前には必ず登録解除を行ってください。
※サーバは予告無く停止する事が有ります。ご了承ください。
所感
iPhone のニコ動公式アプリでは通知がサポートされているようなので Android でもいずれサポートされると思いますが 取り合えず今必要だったので作ってみました。
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 のアドレスがちゃんと振られていれば接続完了です。
RaspberryPiでJoypadからコマンド入力
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 すれば成功です。
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からコマンド入力
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.
問題無さげ。地味に嬉しい。
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 全部はカバーできないしメモリが減るのでこの方法でしばらく試して見ようと思います。
これでやっと落ちついて作業ができます。
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%程度で、コマ落ち等全くありませんでした。
とりあえず準備が整いました。
大変なのはここからですが...
RaspberryPiとはなんぞや
今、一緒に仕事をしている人から RaspberryPi なる物が有ることを聞いた。 ->買いました
大雑把に言うと前に紹介したスティック型アンドロイドの普通の Linux 版。
スペックは ARM11/700MHz、Mem/512M で中華Androidよりは一段下だが なんとお値段 3000円。
学習用なのでOS等全てオープンになっていて玩具としては最適だし、 なんと言っても不良品の不安が無い。
こちらの方が詳しくレビューしてくれていてフルHDの動画再生も行けるらしい。
アマゾンでも売ってるんだが何で直販より高いんだろ?