Raspberry Piで雑いpodcastサーバを作った

IMGP2678

先日試したpodracer

毎日実行して今日の分をまとめて再生して消してというように使う感じなのかもしれません.

ということで自動取得,自動再生すると家庭内ラジオのようにできるのではと思い試してみました.

環境はRaspberry Pi 1B (512MB)Rasbian jessieを導入したもので有線LAN 利用です.

導入パッケージ

podcast の取得のためにpodracer,プレイリストの配信にboaを利用,音声配信の為にvlc-noxを導入しました.

$ sudo apt install podracer boa vlc-nox

podcast 取得の準備

を参考にpodracerの設定をして下さい.~/.podracer/subscriptionsを用意した後1度catchup modeで実行しておきます.

$ podracer -c

これでRSS Feedをひと舐めして過去のpodcastを取得しないようにします.

VLC での配信テスト

以下の例ではpodracerで作成された今日のプレイリストをそのままhttp 8080ポートで配信して更にloopさせています.

$ cvlc  ~/podcasts/`date +\%F`/`date +\%F`-podcasts.m3u --sout '#standard{access=http,mux=ts,dst=:8080}' --loop

この状態で再生したい端末で $ cvlc http://raspberrypi.local:8080/ とか mplayer http://raspberrypi.local:8080/ などとしてアクセスすると再生されるはずです.
1曲毎に停まってしまい再度再生し直す必要がありますがこれは後で解決することにします.

VLC の設定

VLCで配信しますが,コントローラーも利用したいです.--extraintf=http オプションでwebコントローラーが利用できます.規定値では localhost 以外からアクセスできないので家のネットワークのどこからでもコントロールできるように /usr/share/vlc/lua/http/.hosts に利用可能なネットワークを登録しておきます.

192.168.1.0/24
192.168.2.0/24

以下のように実行するとwebコントローラーが8081ポートで起動します.パスワードは raspberry です.適当なブラウザで http://:raspberry@raspberrypi.local:8081/ な感じでアクセスするとコントローラが利用できると思います.

$ cvlc --extraintf=http --http-port=8081 --http-password='raspberry' ~/podcasts/`date +\%F`/`date +\%F`-podcasts.m3u --sout '#standard{access=http,mux=ts,dst=:8080}' --loop

Screenshot_2016-01-31-19-04-03

パスワードを設定しないとパスワードの設定を促す画面が表示されて利用できないようです.

http の設定(プレイリストの作成)

boaの標準では /var/www 以下がDocumentRootになっています.ここにメニュー用の index.html とプレイリストの podcast.m3u を用意しておきます.

権限は www-data.www-data なので,以下のような感じで権限を設定して編集するといいかもしれません.

$ sudo chown www-data.www-data /var/www
$ sudo -u www-data vi /var/www/index.html
   :
  • /var/www/index.html の例
<html>
<body>
<ul>
<li><a href="./podcast.m3u">m3u</a></li>
<li><a href="http://:raspberry@192.168.2.200:8081/">VLC control</a></li>
</ul>
</body>
</html>

※AndroidではAvahiでの名前解決がうまく行かないのでIP アドレスで書いています.環境に合わせて変更して下さい.

  • /var/www/podcast.m3u の例
http://192.168.2.200:8080/
http://192.168.2.200/podcast.m3u

1行目だけだと1番組分で再生が停止してしまうので,2行目で自分自身を呼び出して再起しています.これで2番組以降でも続けて再生されます.
※AndroidではAvahiでの名前解決がうまく行かないのでip アドレスで書いています.環境に合わせて変更して下さい.

自動起動とpodcast更新処理

crontab で起動時に自動的に再生が始まるように&定期的にpodcast更新&再生リスト更新&古いpodcastの削除処理をします.

crontab -e コマンドで編集します.

@reboot cvlc --extraintf=http --http-port=8081 --http-password='raspberry' ~/podcasts/`date +\%F`/`date +\%F`-podcasts.m3u --sout '#standard{access=http,mux=ts,dst=:8080}' --loop
3 */6 * * *     podracer;killall vlc;cvlc --extraintf=http --http-port=8081 --http-password='raspberry' ~/podcasts/`date +\%F`/`date +\%F`-podcasts.m3u --sout '#standard{access=http,mux=ts,dst=:8080}' --loop
10 0 * * *  rm -rf ~/podcasts/`date --date '1 weeks ago' +\%F`

1行目は @reboot で起動時にVLCを自動起動します.
2行目は6時間毎にpodcastを更新してVLCを起動しなおしています.
3行目で1週間前のpodcastデータを削除しています.

利用方法

ウェブブラウザで Raspberry Pi にアクセスします.

http://raspberrypi.local

以下のようなメニューが出て来ます.

Screenshot_2016-01-31-20-49-47

• m3u
• VLC control

m3u をクリックするとプレイリストがダウンロードされます.VLC 等の関連付けられたアプリケーションなどで再生できると思います.
Screenshot_2016-01-31-19-03-53

VLC control をクリックするとVLCのウェブコントローラーが表示されます.URLに認証情報を埋め込んでいるので認証はスキップされます.

問題点や改善点など

  • ブロードキャスト配信の断念. はじめブロードキャスト配信を試したのですが,かなりの頻度でパケットロスしてそのたびに音が途切れました.音が途切れるのはかなりストレスなので諦めました.プレイリストがなくても連続再生可能なのは良かったのですが…….
  • podcast更新時の番組強制終了.更新時にVLCをkillしています.番組の途中で切れてしまうので改善したいです.
  • podcast の音量や音質を揃える.試しにmp3/128kbpsや64kbpsにリアルタイムエンコーディングしつつ配信も試してみましたが Raspberry Pi でもCPU 25%前後なので実用的な感じです.
    帯域を絞ったストリームも同時配信するようにして外で聴きやすくするのもありかもしれません.
  • VLC から他のアプリケーションに変更.今回お手軽なので VLC を利用しましたが Gstreamer や ffmpeg などを試すのもありかもしれません.
  • スピーカーでも再生.環境によっては同時にスピーカーで再生してもいいかもしれません.
  • 番組情報の配信.今は未知のアーティストなどと表示される.アートワークも含めて改善したい.
    Screenshot_2016-01-31-20-50-06
  • 更新間隔の調整.ニュース番組など定時のある番組があるのでそれらに合わせて更新処理を行うようにすると便利かもしれません.
  • 名前解決.AndroidでAvahiが利用できないので家の中のDNSサーバに名前を登録してあげると便利かもしれません.
  • pifmを使ってFMラジオでも視聴.日本だと電波法違反になるので自重しました.


現在は主にAndroidアプリのVLCで再生しています.AndroidとPCはBluetooth A2DPで繋がっていて,PCで聞いています.PCから離れるときはAndroidにイヤホンジャックを差し替えるとシームレスに移動できます.

20160201_01:02:04-5807

Rasbian jessie で watchdog を設定する

Rasbian jessie 環境でも設定したのでメモとして.

パッケージの導入

$ sudo apt install watchdog

設定ファイル修正

/etc/watchdog.conf を以下のように編集

-#min-memory              = 1
+min-memory              = 5000
 
-#watchdog-device       = /dev/watchdog
+watchdog-device        = /dev/watchdog

min-memory はページサイズ.今回は4096*5000で約20MB.このサイズ(swapを含めた容量)を切ったら再起動するはず.大きいような気もするけどまずは動作確認のためにこのくらいにしてみる.

/etc/default/watchdog を以下のような感じに編集して bcm2708_wdog モジュールを読みこむようにする.

-watchdog_module="none"
+watchdog_module="bcm2708_wdog"

起動設定

$ sudo update-rc.d watchdog defaults
$ sudo update-rc.d watchdog enable

動作確認

再起動して

$ sudo reboot

モジュールの読み込み,デバイスの確認,デーモンの確認をする.

$ lsmod|grep dog
bcm2708_wdog            3926  1
$ ls -l /dev/watchdog
crw------- 1 root root 10, 130  1月 26 23:32 /dev/watchdog
$ ps -ef|grep dog
root       642     1  0 23:32 ?        00:00:00 /usr/sbin/watchdog

問題無さそうなら swap を無効にしてファイルシステムを read only や sync を有効にしておいてから Forkbomb で動作確認をしてみる.以下の例ではbashでのForkbomb

$ sudo swapoff -a
$ sync
$ sudo mount -o remount,ro /boot
$ sudo mount -o remount,sync /
$ :(){ :|:& };:

うまく再起動が走ったら後は /etc/watchdog.conf を詰めていく.

kernel panic 時の設定

bcm2708_wdog を使っているのでkernel panic 時にも watchdog は効くはずだけど念の為設定しておく.

/etc/sysctl.conf に以下を追記

kernel.panic = 180
kernel.panic_on_oops = 1

sysctl や再起動で反映.

$ sudo sysctl -p
kernel.panic = 60
kernel.panic_on_oops = 1

awk 製 3Dシューティングゲーム awkaster で遊んでみた

awk 製 3Dシューティングゲームがあると聞いて遊んでみました.

遊ぶには GNU awk 4.0.0 以上が必要です.Debian だと gawk というパッケージです.とりあえず遊んでみるにはこんな感じで.

$ sudo apt install gawk
$ wget https://raw.githubusercontent.com/TheMozg/awk-raycaster/master/awkaster.awk
$ awk -f ./awkaster.awk

操作はこんな感じです.

  • 1234 画面表示切り替え
  • WASD 移動
  • JL 回転(16回で1回転)/Shiftを押しながらで高速回転(8回で1回転)
  • SPACE 攻撃
  • X エレベーターに乗る(ゲームクリア)
  • Q 終了

以下は遊んでいる様子です.

asciicast

3Dシューティングというとスターフォックスを思い浮かべたのですが,単純な 3D RPG 的な感じです.Wolfenstein 3D と doom に触発されたそうです.Wolfenstein 3DWolfenstein 3D は知らないのですが確かに doom みたいな感じです.
ターン制?なので敵の赤球が出てきても慌てず操作できます.

敵に触れるとHPが減っていって0になるとゲームオーバーでこんなメッセージが出ます.

GAME OVER! YOU LOSE!
Credits: Fedor 'TheMozg' Kalugin
https://github.com/TheMozg/awk-raycaster
Gameplay testing - Alex 'Yakojo' & Danya 'bogych97'
Go away!

うまいことエレベーターに到着して X を押すとゲームクリアです.
但し ELEVATOR COMING0 になっている必要があります.これは初め 1000 で1操作で1カウントダウンされます.ゴールのエレベーターの場所は見た目わかりません
敵が沢山居るところの辺りにあるので探してみて下さい.
(私は判んなくて結局 source 読んでクリアしましたorz)

YOU WIN! YOUR SCORE: 4900
Credits: Fedor 'TheMozg' Kalugin
https://github.com/TheMozg/awk-raycaster
Gameplay testing - Alex 'Yakojo' & Danya 'bogych97'
Go away!

ちなみにそこそこ広い領域が必要です.領域が狭いと画面に収まりきらずずれてしまいます.フォントサイズを小さくするなどして列と行を確保しましょう.
GNU screen 上でも Rasbian jessie 上でも問題なく動きました.

昔こんな3D迷路とかをポケコンBASIC で作っていたのを思い出しました.最近のマイコンやRaspberry Pi でこういうゲームを作ってみるのも楽しそうですね :)
(Arduboy とか POCKETC.H.I.P. とか )

デジモノステーション2016年2月号付録の0SIMをRaspberry Piで試す

デジモノステーション 2016年2月号に0SIM by So-net というものが付録で付いてきて一部で流行っています.
雑誌「デジモノステーション」最新号 – DIGIMONO!(デジモノ!)

IMG_20151229_022627IMG_20151229_022636

これはこの雑誌を買って付いてきた付録のSIMを使うと雑誌代(620円)だけで開通手続き手数料無料で月あたり500MB迄無料で利用できるというもの.勿論他にSIMを刺す端末は必要です.

【0SIM by So-net】 詳細
形状:nanoSIM 規格:0SIM by So-net 種類:データ通信専用
データ量と料金(2段階定額)
0MB~499MB:0円
500MB ~ 2047MB:100円~1500円
2048MB ~:1600円
速度制限:なし(ただし5GBまで)/ NTTドコモ 4G LTE(下り最大225Mbps)
開通期限:2016年2月24日

上限もあるのでうっかり使いすぎても安心感があります.ちなみに上限をよく超えるようだと別のプランにしたほうがお得です.
一人で複数契約は出来ないのでたくさん買って500MBごとに差し替えて使うと言ったことは出来ない,3ヶ月利用しないと自動解約されるようなので寝かせておくことも出来ないよう.
普通に使うとあっという間に500MB超えちゃうでしょうけど使いようによっては便利に使えそう(気象センサのデータを送るとかなら余裕).ということで試してみたかったのですがここは鹿児島.都内から最低でも2日遅れなので試せないでいました.昨日やっとコンビニで入手出来たので試してみました.

ちなみにAmazonでは売り切れでマーケットプレイス扱いの物しか無いようです.その中で安いものはSIMなしと書かれているので注意しましょう.

今回はUSBモデムとして以前500円ほどで買った Docomo L-02C を Rasbian jessie を導入した Raspberry Pi 2B に接続して wvdial で接続しました.このモデムは結構電気を食うらしく電源がある程度大容量でないととても不安定になります.今回は秘密結社オープンフォース河野総統謹製の RaspberryPot という GPIO 経由での電源を利用しました.RaspberryPot は現在恐らく入手出来ません.Raspberry Hubu の電源部分を切り出したものなので Raspberry Hubu でも同じことが出来ます.
#ちなみに Pi で動かす前に Debian testing stretch amd64 な NotePC でも同様の設定で動くのを確認しています.Debian oldstable 以降なら全部同じ手順で行けると思います.


RaspberryHabu – FABLIB Wiki – FABLIB – OSDN
秘密結社オープンフォース

IMG_20151229_071104

開通手続き

次のページから開通手続きを行います.開通手続きの期限は2016年02月24日.
http://lte.so-net.ne.jp/r/0sim/a/

ログイン情報はSIMの台紙に書かれています.
IMG_20151229_022855

必要なソフトウェアの導入

$ sudo apt update && sudo apt upgrade
$ sudo apt install cu wvdial usb-modeswitch

<追記>
※必要なソフトウェアの導入にusb-modeswitchパッケージを追加
</追記>

利用ユーザ pidialout グループへの登録

この手続きをしないと,ダイヤル時など毎回 sudo しないといけません.

$ sudo addgroup pi dialout

※反映には要ログインしなおし

Docomo L-02C への APN登録

モデムへの接続と動作確認

/dev/ttyUSB2 部分は dmesg|tailなどとして確認して下さい.モデムの他に何も接続していなければ ttyUSB0~ttyUSB3 の4つのデバイスが確認できるはずです.

% cu -l /dev/ttyUSB2 -s 115200
Connected.
atz
OK

現在のAPN確認

AT+CGDCONT?
+CGDCONT: 1,"IP","mopera.net",,0,0,0
+CGDCONT: 11,"IP","mopera.net",,0,0,0

OK

APN(so-net.jp)を設定

AT+CGDCONT=1,"IP","so-net.jp"
OK

※次のようにして複数のAPNを設定することも可能

AT+CGDCONT=2,"IP","lte.nttplala.com"
OK
AT+CGDCONT=3,"IP","mineo-d.jp"
OK

APNが登録できたか確認

AT+CGDCONT?
+CGDCONT: 1,"IP","so-net.jp",,0,0,0
+CGDCONT: 11,"IP","mopera.net",,0,0,0
OK

設定の書き込み

ATZ0
OK

モデムから切断

~.

Disconnected.

ダイヤルアップのために wvdial の設定

/etc/wvdial.conf に以下を追記.

[Dialer 0sim]
Modem Type = Analog Modem
Phone = *99***1#
Carrier Check = no
Auto Reconnect = yes
Stupid Mode = yes

ISDN = 0
Init1 = ATZ
Init2 = ATH
Init3 = AT+CGDCONT?
Init4 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Dial Command = ATD
Modem = /dev/ttyUSB2
Baud = 115200

Username = nuro
Password = nuro

接続

$ wvdial 0sim

接続確認

$ w3m -dump http://ifconfig.me/all
ip_addr: 118.241.XXX.XXX
remote_host: XXXXXXXXXX.ap.nuro.jp
user_agent: w3m/0.5.3+debian-19
port: 44286
lang: ja;q=1.0, en;q=0.5
connection: 
keep_alive: 
encoding: gzip, compress, bzip, bzip2, deflate
mime: text/html, text/*;q=0.5, image/*, application/*, audio/*, video/*, x-scheme-handler/*, x-content/*, inode/*
charset: 
via: 
forwarded: 

利用状況確認

対のページからログインして利用状況が確認できます.また,400MB を超えるとメールでお知らせも来るらしいです.
ユーザWebメインメニュー

20151229_07:12:50-10076

ということで暫く試してみたいと思います.

※Amazonで雑誌を買う場合はSIMなしのものもあるのでよく確認して購入しましょう.

関連URL

<追記>

Twitterで/dev/ttyUSBnが見つからないという書き込みを見て導入パッケージが足りなかったのに気づきました.これが足りないとUSBモデム接続時のdmesgで以下のようにCD-ROMのsr0デバイスが出て来てttyUSBnは出てきません.

$ dmesg | tail
[417400.989925] usb 2-1.1: Product: docomo L02C
[417400.989927] usb 2-1.1: Manufacturer: NTT DOCOMO, INC.
[417400.989928] usb 2-1.1: SerialNumber: 353168046719530
[417400.990982] usb-storage 2-1.1:1.0: USB Mass Storage device detected
[417400.991062] scsi host11: usb-storage 2-1.1:1.0
[417401.988387] scsi 11:0:0:0: CD-ROM            LG       Autorun          2.00 PQ: 0 ANSI: 0
[417401.988771] scsi 11:0:0:0: Attached scsi generic sg2 type 5
[417401.999991] sr 11:0:0:0: [sr0] scsi-1 drive
[417402.000001] cdrom: Uniform CD-ROM driver Revision: 3.20
[417402.000257] sr 11:0:0:0: Attached scsi CD-ROM sr0

この時のベンダーID:プロダクトIDは1004:61ddです.

$ lsusb|grep LG
Bus 002 Device 027: ID 1004:61dd LG Electronics, Inc. 

この場合usb-modeswitchパッケージを導入して,

$ sudo apt install usb-modeswitch

USBモデムを接続し直すと出てきます.

$ dmesg | tail
[417994.525827] usb 2-1.1: Product: docomo L02C
[417994.525830] usb 2-1.1: Manufacturer: NTT DOCOMO, INC.
[417994.527296] option 2-1.1:1.0: GSM modem (1-port) converter detected
[417994.527511] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB0
[417994.527807] option 2-1.1:1.1: GSM modem (1-port) converter detected
[417994.527997] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB1
[417994.528217] option 2-1.1:1.2: GSM modem (1-port) converter detected
[417994.528346] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB2
[417994.528597] option 2-1.1:1.3: GSM modem (1-port) converter detected
[417994.528741] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB3

プロダクトIDも61ddから618fに変わりました.

$ lsusb|grep LG
Bus 002 Device 029: ID 1004:618f LG Electronics, Inc. Ally/Optimus One

何故CD-ROMデバイスが出てくるかというとWindows環境などでのツールやドライバ導入のためです.このCD-ROMデバイス中にツールやドライバが入っていて簡単に導入が出来るというものなのですが,Linux版のツールやドライバは入っていないです.usb-modeswitchパッケージはCD-ROMからUSBモデムへのデバイスの切り替えをしてくれます.

</追記>

Linux 環境での Raspberry Pi 向け OS 書き込みTips

このエントリは Raspberry Pi Advent Calendar 2015 の12月08日分です.
昨日は @2box2boさんの RaspberryPiと公式タッチディスプレイでマインクラフトするお話 | 流連荒亡 でした.公式ディスプレイ欲しいです…….

最近 Raspberry Pi はサブPC 的に使っててネタがない(普通に Linux Desktop なので……)ので紙製ケースの紹介でもしようかと思っていたのですが,Raspberry Pi に OS を書き込むのによく使う dd 関連のネタが少し溜まっているので今回はこれを紹介しようと思います.(NOOBS だとほぼ関係なくコピーするだけでいいんですが……)
Rasbina jessie / Debian stretch で検証していますが,Linux なら導入手順以外同じだと思います.Mac OS X / UNIX 系の OS でも使えると思います.

– 紙ケースの一例 –

dd(dataset definition) は GNU Coreutils の中に入っているのでほとんどの GNU/Linux だと標準で導入されていると思います.とても便利だけど使い方を誤るとシステムやデータをいとも簡単に壊してしまえます.注意して実行しましょう.

進捗状況確認

dd で sd 書き込み中にどのくらい進んだのだろうと確認したくなることがあります.

kill -SIGUSR1

dd のプロセスに対して SIGUSR1 シグナルを投げると進捗が確認できます.

dd のプロセス番号を確認

$ ps -ef|grep dd
   :
root      9273 32218  0 17:57 pts/1    00:00:00 sudo dd of=/dev/sdz bs=4M
root      9276  9273  9 17:57 pts/1    00:00:00 dd of=/dev/sdz bs=4M

9276 なので以下のように

$ sudo kill -USR1 9276

で,こんな感じに表示されます.

0+243258 レコード入力
0+243258 レコード出力
1224679424 バイト (1.2 GB) コピーされました、 17.2794 秒、 70.9 MB/秒
0+302681 レコード入力
0+302681 レコード出力
1532985344 バイト (1.5 GB) コピーされました、 20.8063 秒、 73.7 MB/秒

なのでこんなとか

$ sudo pkill -SIGUSR1 ^dd

こんな感じで叩くと良い感じだと思います.

% watch -n30 'sudo pkill -SIGUSR1 ^dd`

pv(Pipe Viewer)

pv(Pipe Viewer) というパイプの状況を確認できるプログラムがあります.dd の間にこれを挟んで進捗状況を確認できます.

導入

$ apt install pv

利用例

% zcat 2015-11-21-raspbian-jessie.zip | pv | sudo dd of=/dev/sdz bs=4M
5.81GB 0:06:12 [15.2MB/s] [                           <=>                      ]

-N で 名前の,-c でクラスタオプションになります.これを活用すると複数のパイプの監視もできます.

$ zcat ./2015-11-21-raspbian-jessie.zip | pv -cN zcat | xz | pv -cN xz | dd of=./2015-11-21-raspbian-jessie.xz
     zcat: 8.41MB 0:00:05 [1.09MB/s] [   <=>                                   ]
       xz: 3.96MB 0:00:05 [1.06MB/s] [   <=>                                   ]

GNU ddrescue / ddrescue

dd じゃないけど dd の代わりに GNU ddrescue を利用するとプログレスが表示されます.

$ sudo apt install gddrescue
$ sudo ddrescue /dev/zero /dev/null --force
GNU ddrescue 1.19
Press Ctrl-C to interrupt
rescued:     2969 MB,  errsize:       0 B,  current rate:     354 MB/s
   ipos:     2969 MB,   errors:       0,    average rate:     742 MB/s
   opos:     2969 MB, run time:       4 s,  successful read:       0 s ago
Copying non-tried blocks... Pass 1 (forwards)

でも標準有力入力を受け付けないようです.

$ zcat ./2015-11-21-raspbian-jessie.zip | sudo ddrescue - /dev/sdz --force
ddrescue: Can't open input file: No such file or directory

類似の ddrescue だと標準入力もOKなようです.こちらの場合のコマンド名は dd_rescue です.

$ sudo apt install ddrescue
$ zcat ./2015-11-21-raspbian-jessie.zip | sudo dd_rescue - /dev/sdz
dd_rescue: (warning): input  file is not seekable!
dd_rescue: (warning): Illegal seek
dd_rescue: (warning): Don't use sparse writes for non-seekable output
dd_rescue: (info): ipos:     91136.0k, opos:     91136.0k, xferd:     91136.0k
                   errs:      0, errxfer:         0.0k, succxfer:     91136.0k
             +curr.rate:   144981kB/s, avg.rate:   144776kB/s, avg.load: 38.4%

ddすると重い/固まる

環境によって dd 実行中にとても重くなってマウスカーソルさえカクカク動くようになり並行して別の作業ができないようにます.

ionice

ionice を使って dd の優先度を下げることができます.

% zcat ./2015-11-21-raspbian-jessie.zip | sudo ionice -c2 -n7 dd of=/dev/sdz

pv -L

pv コマンドの -L オプションでパイプの帯域制限ができます.

   -L RATE, --rate-limit RATE
          Limit the transfer to a maximum of RATE bytes per second.  A suffix of "k", "m", "g",  or  "t"  can  be
          added to denote kilobytes (*1024), megabytes, and so on.
% zcat cros.img.gz | pv -L 8192k | sudo dd of=/dev/sdz

cgroup

リソース管理の cgroups で書き込み帯域制限をしてみます.以下は dd というグループを作成し,自分のシェルをそこに登録.SD Card のデバイスを書き込み制限 1k で設定し,dd で動作確認をしました.想定通り 1kB/s しか出なかったようです.

$ sudo mkdir /sys/fs/cgroup/blkio/dd
$ echo $$ | sudo tee -a /sys/fs/cgroup/blkio/dd/tasks 
26041
$ ls -l /dev/sdz
brw-rw---- 1 root disk 179, 0 12月  6 18:42 /dev/sdz
$ echo "179:0 1024" | sudo tee -a /sys/fs/cgroup/blkio/dd/blkio.throttle.write_bps_device 
179:0 1024
$ sudo dd if=/dev/zero of=/dev/sdz bs=4k count=10
10+0 レコード入力
10+0 レコード出力
40960 バイト (41 kB) コピーされました、 40.0136 秒、 1.0 kB/秒

書き込み速度が遅い

ブロックサイズ変更

dd コマンドはブロックサイズが 512バイトと小さいです.このサイズを変更することで1度に処理する容量が多くなり速度が改善されます.このサイズは bs オプションで設定できます.規定値と同じ 512バイトの場合は, bs=512.1MB の場合は bs=1M というようにして容量の単位(Yまで!)も指定できます.最近の私は 4~16M を指定しています.

$ zcat 2015-11-21-raspbian-jessie.zip | sudo dd of=/dev/sdz bs=4M

GNU ddrescue

GNU ddrescue は効率のいい処理を自動的に行うそうです.効率の良いブロックサイズを探すよりこれを導入したほうが早いかもしれません.

パーティション情報の削除

OS イメージをこれまで使っていた SD に上書きすると古いデータが残ってしまうことがあります.パーティション情報を削除してから書き込むと綺麗に行くようです.

Windows/Mac OS X の場合は SD Assosietion がフォーマッタを提供しているのでこれを利用すると良いと思います.

dd

dd コマンドでパーティション情報が入っているであろう先頭部分を消します.以下の例では 1M を 1回なので先頭の 1M が 0 で埋められます.2行目の hdparm はおまじないで kernel に書き換わったよと教えてあげています.最近は即時反映されるような感じですが,以前はこれを叩かないとうまく反映されないことが多かったです.(いちいち抜き差ししてみたり)

$ sudo dd if=/dev/zero of=/dev/sdz bs=1M count=1
$ sudo hdparm -z /dev/sdz

以下のように count を指定しない場合は全領域書き込みます.時間はかかるけど確実?

$ sudo dd of=/dev/zero of=/dev/sdz bs=10M

全領域書き込む場合は shred -z /dev/sdz でも良いですね.

wipefs

wipefs はパーティション情報の wipe をしてくれるツールです.一瞬で動作するし便利です.
util-linux パッケージ内の wipefs です.

デバイスだけ指定して実行すると現在のパーティションの状況が確認できます.-a オプションでパーティション情報が削除されます.便利.

$ sudo wipefs /dev/sdz
offset               type
----------------------------------------------------------------
0x1fe                dos   [partition table]

$ sudo wipefs -a /dev/sdz
/dev/sdz: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdz: calling ioctl to re-read partition table: 成功です
$ sudo wipefs /dev/sdz

mount中のファイルシステムに書き込もうとすると終了するscript

dd は便利ですが,書き込み先を間違えるとシステムやデータを破壊してしまいます.私もつい一昨日やってしまいましたorz
#何故か /dev/mmcblk0 が /dev/sda へのシンボリックリンクとなっていた.
600GB の 先頭 1.5GB だからデータはほとんど救出できるだろうと思ったのですが,LUKS で暗号化していたのでメタデータが破壊され復旧は無理そうです.幸いデイリーバックアップがあるのでそちらから復旧中です.
(復旧中なのにどうやって書いているかというと Raspberry Pi 2 B にキーボードマウスモニタ取り付けて ReText で書いています.Web は midori でも重いので ssh -CY してファイルサーバのブラウザを使っています.使い慣れないキーボードが不便です><)

こういう悲しいことが起こらないようにできないものかと mount 中のデバイスに書き込もうとすると失敗させることができればいいのでは?と思ったのですがそういったオプションなどが見当たりませんでした.
それっぽいscript を書いてみました.

利用方法は,/usr/local/bin/dd としてこのスクリプトを用意して実行権をつけておいて通常の dd コマンドのように使うだけです.

$ wget -O - https://gist.githubusercontent.com/matoken/e051cefb78594520038d/raw/9ac20f31c590a043f1774f82068a99846ab7c4bb/dd.sh | sudo tee /usr/local/bin/dd
$ sudo chmod +x /usr/local/bin/dd
$ which dd
/usr/local/bin/dd
$ sudo which dd
/usr/local/bin/dd

マウント状態で書き込もうとすると失敗する.

$ sudo dd if=/dev/zero of=/dev/sdz
/dev/sdz seems to specify the file system in the mount.
Force Quit.

アンマウントして再実行すると dd が開始される.

$ sudo umount /dev/sdz1 
$ sudo dd if=/dev/zero of=/dev/sdz1

あまりテスト出来ていないので何かあったら教えてもらえると助かります.

おわり

ということで Raspberry Pi や kobo の SD Card に何度も書き込んだ時の Tips まとめみたいなものでした.ここ間違ってるよとかもっといい方法あるよとかおしえてもらえると助かります.(特に誤って書き込まないようにする方法)

「Raspberry Piではじめる どきどきプログラミング」を読んでみた

PEG(programming education gathering) の公式推奨本ということで「Raspberry Piではじめる どきどきプログラミング」を読んでみました。

実は少し前に「小学生からはじめるわくわくプログラミング」の方も読んでいました。こちらはPC でScratch を利用する本でした。
「Multi-Device UX Competition 2014」鹿児島アイデアソン – 301 Coworking & Share space in Kagoshima-shi, Kagoshima, Japan
に参加した時の商品で頂いたものです。)

なので、今回はRaspberryPi でScratch の本かなと思っていたのですが、それだけでなくMinecraftPi やMinecraftPi をScratch で操作する方法、Lチカ 等まで紹介されていました。

MinecraftPi については今回初めて知ったのですが、RasoberryPi + Rasbian 向けのMinecraft というだけでなく、他のMinecraft にはないプログラミング連携機能を持っているようです。

このプログラミング連携機能を使ってScratch からMinecraft を操作したり、Python から操作したりできるようです。

この本の中では「ものづくりを仮想世界で楽しもう」「ものづくりの自動化に挑戦しよう」として紹介されています。
Lチカのあたりは「現実の世界をプログラミングしよう」として紹介されています。
応用して電子工作で何らかのセンサと、Minecraft を連携させてみると面白そうだなと思いました。

恐らくRaspberryPi や部品の入手、ソフトウェアの導入のあたりを大人が手伝ってあげれば小学生でもひと通り試せるような感じです。
ワークショップなどを行う場合は導入済みのSD Card を用意しておくと良さそうです。
これをきっかけにプログラミングや電子工作に興味を持つ子供が増えていくといいなぁと思います。

(鹿児島でも現物を入手できる場所があるといいんですが…)

Debian/Ubuntu に Arduino IDE を導入する

今度の日曜日にフィジカルコンピューティングワークショップ Arduinoで遊んでみよう【定員20名】 に参加予定ですが,Linux での導入手順がないので.

実はパッケージが用意されています.
なので,

% sudo apt-get install arduino

で導入完了です.

しかし,このままではArduino に接続する際にroot 権限が必要になって面倒なので,Arduino のデバイスが自分のユーザで利用できるように dualout グループに登録しておきます.

% sudo addgroup user dialout
ユーザ `user’ をグループ `dialout’ に追加しています…
ユーザ user をグループ dialout に追加
完了。

※user 部分は自分のユーザに置き換えてください.

もし,以下のように表示されたら既に登録済みなので問題ありません.

% sudo addgroup mk dialout
ユーザ `mk’ はすでにグループ `dialout’ のメンバーです。

– ドライバは?
自動認識するので特に導入の必要はありません.Arduino  をPC に接続すると /dev/ttyUSB0 や /dev/ttyACM0 などとして認識されます.このデバイスをArduino IDE のポートに設定します.
#最後の0部分はデバイスが増えると1,2,3…と増えていきます.dmesg 等で確認できます.

– おまけ

最新のArduino IDE が使いたい!

例えばDebian Stable のWheezy ではArduino 1.0.1 ベースですが,公式サイトを見ると1.0.5 がリリースされています.
Debian — wheezy の arduino パッケージに関する詳細
Arduino – Software
新機能を使いたい場合やBETA版を使いたい場合などは標準パッケージのままでは利用できません.

以下はArduino IDE BETA を ~/opt 以下に導入する例です.
Arduino IDE をダウンロードします.32bit/64bit は uname -m 等で確認できます.以下の例では64bit になります.

% uname -m
x86_64
% wget http://downloads.arduino.cc/arduino-1.5.5-linux64.tgz

~/opt 以下に展開します.

% tar xvzfC arduino-1.5.5-linux64.tgz ~/opt

シンボリックリンクを貼っておく.(バージョンアップ時にリンクを貼り直して何時も同じパスで利用できるように)

% ln -s ~/opt/arduino-1.5.5 ~/opt/arduino-beta

起動しやすいようにメニューに登録しておく.(シンボリックの方を登録する)
Screenshot-ランチャのプロパティ
Screenshot-メイン・メニュー

Ardublock や Fritzing もお勧めです :-)
Getting Started with ArduBlock | Ardublock
Download – Fritzing

Ubuntu 12.04 へのMPLABX 導入

IMGP9924
PIC に手を出してみようと開発環境のMPLABX を導入してみました.
ライタは未入手なので,近々PICkit3 を入手予定です.

MPLABX の為にjre 6 を導入する.

OracleJRE が必要となっていますが,OpenJDK で問題なさそうなのでそちらを使います.

$ sudo apt-get install openjdk-6-jre

もし,複数のjre が導入されている場合は openjdk-6-jre を選択する.

$ sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 3 個の選択肢があります。

  選択肢    パス                                          優先度  状態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-7-oracle/jre/bin/java          1062      自動モード
  1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      手動モード
  2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1051      手動モード
  3            /usr/lib/jvm/java-7-oracle/jre/bin/java          1062      手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 1

MPLABX の導入

MPLABX | Microchip Technology Inc.
から
Linux (32-/64-Bit)以下から MPLAB® X IDE をダウンロード.

実行権を付与

$ chmod +x ~/Downloads/MPLABX-v1_30-linux-installer.run

$ sudo ~/Downloads/MPLABX-v1_30-linux-installer.run --help
MPLAB X IDE v1.30 v1.30
Usage:

 --help                         Display the list of valid options

 --version                      Display product information

 --unattendedmodeui <unattendedmodeui> Unattended Mode UI
                                Default: none
                                Allowed: none minimal minimalWithDialogs

 --optionfile <optionfile>      Installation option file
                                Default: 

 --debuglevel <debuglevel>      Debug information level of verbosity
                                Default: 2
                                Allowed: 0 1 2 3 4

 --mode <mode>                  Installation mode
                                Default: gtk
                                Allowed: gtk xwindow text unattended

 --debugtrace <debugtrace>      Debug filename
                                Default: 

 --installer-language <installer-language> Language selection
                                Default: en
                                Allowed: en ar bg ca da nl et fr fi de el es es_AR he hr hu it ja ko pl pt_BR pt ro ru no sl sk sq sv tr zh_TW zh_CN va cy cs

 --installdir <installdir>      Installation Directory
                                Default: /opt/microchip/mplabx

言語とパスを指定して実行.

$ sudo paco -p 'mplabx-1.30' "~/Downloads/MPLABX-v1_30-linux-installer.run --installer-language ja --installdir /opt/microchip/mplabx"

paco を挟んでいる.要らなければこんな感じで.

$ sudo "~/Downloads/MPLABX-v1_30-linux-installer.run --installer-language ja --installdir /opt/microchip/mplabx"

メニューから MPLAB IDE 起動.
インストーラは日本語が使えるが,IDE では日本語の選択ができないような.

参考URL

日本語ユーザマニュアル