CLI な podcast aggregator/downloader な podracer を試してみる

podcast aggregator に rhythmbox を利用しているのですが,たまにファイルが存在するのに何度やってもダウンロードに失敗したり NotePC で動かしているので容量の問題で古いのをファイルサーバに持って行ったりといった処理が面倒です.
CIL で動くものがあればファイルサーバで入手するようにして新しい物だけ手元に or ファイルサーバ経由で視聴するようにしら便利かもということで CLI で動く podcast aggregator が無いか探してみました.

$ apt-cache search podcast aggregator
gpodder - podcast client and feed aggregator
podracer - podcast aggregator/downloader

gpodder は GUI と CLI のセットで,podracer は CLI のみのようです.今回は podracer を試してみます.

導入

導入は apt 一発です.

$ sudo apt install podracer

設定ファイルの用意

~/.podracer/subscriptions というファイルに入手したいフィードを1フィード1行で書いておきます.# 行はコメントになるようです.

# 電脳空間カウボーイズ
http://feeds.feedburner.com/weblogs/csc
# backspace.fm
http://feeds.backspace.fm/backspacefm

実行

podracer コマンドを実行すると,~/.podracer/subscriptions からpodcast をダウンドードしてくれます.ダウンロードが完了すると自動的に終了します.

$ podracer

初回実行時には過去のものも入手するので時間が掛かるでしょう.特に画面には何も表示されないのでログファイル( ~/.podracer/podcast.log ) を確認するといいと思います.

$ tail -f ~/.podracer/podcast.log

取得した podcast は ~/podcasts 以下の日付ファイルの下に保存されます.この日付は実行日時です.

$ ls ~/podcasts
2016-01-27  2016-01-28
$ ls -lA ~/podcasts/2016-01-28
合計 59408
-rw-r--r-- 1 mk mk        0  1月 28 14:03 2016-01-28-podcasts.m3u
-rw-r--r-- 1 mk mk 60833627  1月 28 14:02 jlEV91AshKrq
$ file  ~/podcasts/2016-01-28/*
/home/mk/podcasts/2016-01-28/2016-01-28-podcasts.m3u: empty
/home/mk/podcasts/2016-01-28/jlEV91AshKrq:            Audio file with ID3 version 2.3.0

後は各種プレイヤーで再生できます.

$ mplayer ~/podcasts/2016-01-28/jlEV91AshKrq

ファイル名は podcast 提供者の物のままで同じディレクトリに格納されてしまうので名前が衝突したら多分新しい方で上書きされてしまいます.それとこのままではどのファイルがどの podcast なのかとかわからないですね.オプションも特に無いようなので沢山の podcast を保管しようという用途で使うのには向いていないかもしれません.
毎日実行して今日の分をまとめて再生して消してというように使う感じなのかもしれません.

追記)プレイリストの不具合?

podracer 実行時に 2016-01-28-podcasts.m3u のようなプレイリストが作られますが,mp3/ogg/m4a/m4b 以外の拡張子は登録されません.こんな感じで作り直すと良さそう.

$ ls -1A ~/podcasts/2016-01-28 | grep -v \.m3u$ > ~/podcasts/2016-01-28/2016-01-28-podcasts.m3u

この方がいいかな

$ ls -1A ~/podcasts/`date +%F` | grep -v \.m3u$ > ~/podcasts/`date +%F`/`date +%F`-podcasts.m3u

podracer 自体を修正してもいいかも.雑いけどこんなとか.
これだとサムネイル画像なども含まれてしまう.

$ diff -u /usr/bin/podracer podracer
--- /usr/bin/podracer   2015-07-04 22:39:26.000000000 +0900
+++ podracer    2016-01-28 18:34:40.317391930 +0900
@@ -415,10 +415,7 @@
                then
                (
                cd "$poddir"
-               find . -name \*.mp3 > "$m3u"
-               find . -name \*.ogg  >> "$m3u"
-               find . -name \*.m4a  >> "$m3u"
-               find . -name \*.m4b  >> "$m3u"
+               find . -name \* -type f | grep -v "$m3u" > "$m3u"
                )
        fi
 fi

追記2)
上の修正だとサムネイル画像なども登録されてしまう.
以下はその他のファイルを file command で調べて audio という文字列が入っていたら登録するもの.

$ diff -u /usr/bin/podracer ./podracer
--- /usr/bin/podracer   2015-07-04 22:39:26.000000000 +0900
+++ ./podracer  2016-01-28 19:12:31.980446668 +0900
@@ -419,6 +419,7 @@
                find . -name \*.ogg  >> "$m3u"
                find . -name \*.m4a  >> "$m3u"
                find . -name \*.m4b  >> "$m3u"
+               find . | egrep -v "\.mp3$|\.ogg$|\.m4a$|\.m4b$" | xargs file | grep -i audio | cut -f1 -d: >> "$m3u"
                )
        fi
 fi

So-net 0SIM が販売開始

以前書いたこの記事ですが,
デジモノステーション2016年2月号付録の0SIMをRaspberry Piで試す | matoken’s meme
付録ではなく通常販売開始されたようです.

デジモノステーションの付録との違いはプランが多いことと事務手数料が必要なかった(雑誌台は必要)のと早く試せた位?
プラン変更が可能なのかは見当たりませんでした.最低利用期間はないので解約して新規契約になるのかな?

もし沢山契約できたら IoT 的にも使えるなぁと思ってましたが,

※SIMカードはお一人様一枚までとなります。
※1:コラボSIMを含みます。

と流石にそういうことは出来ないよう.

個人とかで数カ所なら 0SIM に加え500円くらいのサービスをそれぞれ契約して使う感じですかね.

  • FREETEL の「使った分だけ安心プラン データ専用」の 299円/月〜
  • DMM mobile の「データSIMプラン ライト」の440円/月(固定料金低速200kbps)
  • ServersMan SIM の「ServersMan SIM LTE」の 467円/月(固定料金低速250kbps)

IoT だとコストは増える感じがするけど沢山契約できて管理機能も充実したソラコム辺りになるんですかね.

この分野は日本だと今のところここだけだと思うので
alternative が現れて欲しいところ.

コンビニ複合機印刷メモ

これまでコンビニの複合機での印刷はUSBメモリやスマホをUSBで繋いで出力していました.でもUSBメモリに前もってデータを移すのは面倒だったりスマホはうまく認識したりしなかったり設定を買えないといけなかったりでちょっと面倒でした.
最近は Wi-Fi に対応した複合機が増えた(近所も最近置き換わった)のでAndroidアプリをいくつか試してみました.

シャープの端末で利用できます.設置場所はサークルK,サンクス,ファミリーマート,ローソンです.アプリ内の「店舗を探す」から店舗の検索が可能です.
出力できるのは JPEG, PNG, PDF
コンビニで複合機を操作してスマホから Wi-Fi 経由でデータを転送してプリントします.ownCloud や Dropbox などのデータを印刷する場合は前もって端末にダウンロードしておく必要があります.

[Phone] ))) Wi-Fi ((( [複合機]

これもシャープの端末用です.PrintSmashPrintSmash と違いネットワークプリントのサーバにデータをアップロードして複合機でユーザIDを入力してデータを出力するものです.出力可能フォーマットは少し多くて,Microsoft Word 2007/2010,Microsoft Excel 2007/2010,Microsoft PowerPoint 2007/2010,PDF Ver.1.3/1.4/1.5/1.6/1.7,JPEG,PNG と MS Office が入っています.
利用にはアカウントの登録が必要です.
個人的には店頭で出力する時にタッチパネルでユーザID(英数で10文字)を入力するのが面倒 & MS Office をあまり使わないのでこのアプリはあまりつかっていません.

[Phone] ))) Network ((( [ネットワークプリントサーバ] —- [複合機]

Xerox の端末用です.設置場所はセブンイレブン.
コンビニで複合機を操作してスマホから Wi-Fi 経由でデータを転送してプリントします.ownCloud や Dropbox などのデータを印刷する場合は前もって端末にダウンロードしておく必要があります.アプリ内で印刷データを前もって登録しておくことができるので端末前でのスマホ操作を減らすことが出来ます.
出力対応フォーマットは Microsoft Office2007/2010/2013,PDF1.3-1.7,XPS,DocuWorks3.0以降,マルチページTIFF,JPEG,PNG,TXT,HTML と一番多いです.
更にスキャンサービスにも対応しています.端末でスキャンしたデータをスマホに取り込めるようです(スキャンサービスは未検証)

[Phone] ))) Wi-Fi ((( [複合機]

どんどん便利になっていきますね.ちょっとしたプリントや,同人誌のコピー誌なんかも :)
でも不安なのでUSBメモリにもデータを入れていくかネット上での登録もしています.最近バッテリが死にかけているようで70%以上から急に0%になって電源切れたりとかするので…….

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モデムへのデバイスの切り替えをしてくれます.

</追記>

フレームバッファで焼かれるあひるを録画する(あひる焼き Advent Calendar 2015)

この記事は あひる焼き Advent Calendar 2015の12月15日分の記事です.
#2度めですが1週間ほど空きがあったので.


🔥

以前こんな記事を書きました.

この時は

#terminal をフレームバッファも含めて動画でスクリーンショットとる方法が解らず今回は仮想マシンで実行してキャプチャしました.だれか端末のフレームバッファも含めての動画でのスクリーンショットのとり方を知ってる人が居たら教えて下さいo

という感じでフレームバッファの動画の録画方法が解らず,別のカメラで画面を録画していました.調べたら方法が見つかったので今回はその手順を紹介したいと思います.

といっても avconvffmpeg でフレームバッファを指定するだけです.
#Debian stretch からはまた libav から FFmpeg に戻るようです. > libav and FFmpeg: switch over

$ avconv -f fbdev -i /dev/fb0 fb.mp4
$ ffmpeg -f fbdev -i /dev/fb0 fb.mp4

これで録画したのがこちらです.

これで画面をカメラで録画したりしなくても焼かれるあひるが録画できるようになりました :)

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 まとめみたいなものでした.ここ間違ってるよとかもっといい方法あるよとかおしえてもらえると助かります.(特に誤って書き込まないようにする方法)

JOSMにJava8を使うように言われたのでJavaを変更する

JOSM を起動するとスプラッシュ画面に次のようなメッセージが><

JOSM – Java OpenStreetMap エディタ

このバージョンのJavaはもうすぐサポート対象から外れます。 Java 8以上にアップグレードしてください!

現在利用している Java は Debian stretch のパッケージで導入した Oracle Java 7 です.OpenJDK 7 でも同じメッセージが表示されます.
ディストリビューションがサポートしている間は脆弱性とかは修正されるだろうけど JOSM 側でサポート打ち切る可能性もあるので Java 8 を使えないか確認してみます.

% where java
/usr/bin/java
% /usr/bin/java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
% dpkg -l oracle-java7-jdk|grep ^ii
ii  oracle-java7-jdk 7u25         amd64        Java(TM) JDK, Standard Edition, Oracle(TM)

Oracle Java は未だパッケージにないけど OpenJDK 8 は存在するよう.

% apt-cache search oracle-java
oracle-java7-jdk - Java(TM) JDK, Standard Edition, Oracle(TM)
% apt-cache search openjdk-8  
openjdk-8-jre-jamvm - Alternative JVM for OpenJDK, using JamVM
openjdk-8-dbg - OpenJDK ベースの Java ランタイム (デバッグシンボル)
openjdk-8-demo - OpenJDK ベースの Java ランタイム (デモおよびサンプルファイル)
openjdk-8-doc - OpenJDK 開発キット (JDK) ドキュメント
openjdk-8-jdk - OpenJDK 開発キット (JDK)
openjdk-8-jre - OpenJDK Java ランタイム - Hotspot JITopenjdk-8-jre-headless - OpenJDK Java ランタイム - Hotspot JIT(ヘッドレス)
openjdk-8-jre-zero - Zero/Shark を用いた OpenJDK 用の代替 JVM
openjdk-8-source - OpenJDK 開発キット (JDK) ソースファイル

OpenJDK 8 を導入してこのシステムの規定値に設定します.

% sudo apt install openjdk-8-jre
% sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 4 個の選択肢があります。

  選択肢    パス                                          優先度  状態
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      自動モード
  1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      手動モード
  2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      手動モード
  3            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1069      手動モード
* 4            /usr/lib/jvm/jdk-7-oracle-x64/jre/bin/java       317       手動モード

Press <enter> to keep the current choice[*], or type selection number: 3
update-alternatives: /usr/bin/java (java) を提供するためにマニュアルモードで /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java を使います
% where java
/usr/bin/java
% /usr/bin/java -version
openjdk version "1.8.0_72-internal"
OpenJDK Runtime Environment (build 1.8.0_72-internal-b05)
OpenJDK 64-Bit Server VM (build 25.72-b05, mixed mode)
% /usr/bin/java -jar ~/bin/josm-latest.jar

無事起動して,警告メッセージは表示されなくなりました :)

https://www.flickr.com/photos/119142834@N05/23418744202/in/dateposted-public/

もし,他の Java アプリケーションが OpenJDK 8 を嫌がる場合はそちらを優先して JOSM は以下のようにして起動するようにしてもいいかもしれません.

% /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -jar ~/bin/josm-latest.jar

あひる焼きfortune

この記事は あひる焼き Advent Calendar 2015 – Adventar の12月05日分の記事です.

みんなでまったり #あひる焼き すればええんじゃないかなと思います。

ということで最近焼いたあひるの話を.

発端

fortune というフォーチュンクッキーのような格言をランダムに表示するプログラムがあります.様々な辞書データが存在していて自作も出来ます.

pi@raspberrypi ~ $ sudo apt install fortunes            # fortuneの導入
pi@raspberrypi ~ $ fortune                              # fortuneの実行
Some of us are becoming the men we wanted to marry.
                -- Gloria Steinem
pi@raspberrypi /tmp $ cat <<__EOF__> data               # fortuneのデータ作成
テスト
%
1行目
2行目
%
__EOF__
pi@raspberrypi /tmp $ strfile data                      # データ変換
"data.dat" created
There were 2 strings
Longest string: 16 bytes
Shortest string: 10 bytes
pi@raspberrypi /tmp $ ls data*
data  data.dat
pi@raspberrypi /tmp $ fortune data                      # 自作データを利用
1行目
2行目
pi@raspberrypi /tmp $ fortune data
テスト

その辞書データに @ahiru3netさんのあひる焼きに対するmentionを使うと楽しいかもしれないと思いました.でもデータを集めるのが面倒だなとつぶやいたところ @shimadahさんにGitHub を教えてもらいました.

それを元にコネコネして……うまくいかないところに@ahiru3netさんの助言.

焼けた

やってることはahiru_yakunaプラグインのmentionのデータをもらってきて乱暴にfortuneで利用できる形式に変換して~/.zshrc に登録してログイン時に台詞を出すようにしています.

mkdir ~/.fortune;wget -O - https://github.com/Na0ki/ahiru_yakuna/raw/master/config.yml|grep ^\-\ \" | sed 's/^-\ \"//'| sed 's/"$/\n%/' | sed 's/\\n/\n/g' > ~/.fortune/ahiruyaki && strfile ~/.fortune/ahiruyaki ~/.fortune/ahiruyaki.dat && echo fortune ~/.fortune/ahiruyaki >> ~/.zshrc

これでログインのたびに以下のようにメッセージが表示されるようになりました :)

焼いちゃうのか?!本当に焼いちゃうのか?!
pi@raspberrypi ~ $

もっと焼く

でもメッセージだけだとちょっとさみしいです.
そこで cowsay を使ってみます.cowsay はアスキーアートで書かれた牛などのキャラクタに指定した台詞を喋らせることの出来るプログラムです.都合のいいことに選択できるキャラクタの中にあひるがいます.あひるに喋ってもらいましょう!

pi@raspberrypi ~ $ sudo apt install cowsay                  # cowsay 導入
pi@raspberrypi ~ $ cowsay hello cow                         # cowsay 実行
 ___________
< hello cow >
 -----------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
pi@raspberrypi ~ $ cowsay -f duck hello duck                # あひるに喋らせる
 ____________
< hello duck >
 ------------
 \
  \
   \ >()_
      (__)__ _
pi@raspberrypi ~ $ cowsay -f duck あひる焼き                 # 日本語を喋らせる
 _______
< あひる焼き >
 -------
 \
  \
   \ >()_
      (__)__ _

日本語を喋らせると吹き出しがずれてしまいます.あひる焼きの台詞の殆どは日本語なのでこのままではまずいです.調べてみるとバグレポートされていました.

中国語?もやっぱりずれちゃうみたいです.
文字数と見た目のキャラクタの文字数のズレから起こっているようです.とりあえず日本語だけでも動くように出来ないかと euc-jp に変換して文字数を確認してといったダメな修正をしていたところGoogle+の以下の投稿のコメントで +Masakazu Takahashiさんがさくっとパッチを作ってくれました!

このパッチは報告しましたが,取り込まれてもstretch以降でしょう.ということでDebianだと以下のようにしてソースを入手してパッチを当てることが出来ます.

pi@raspberrypi ~/src $ sudo apt install libtext-charwidth-perl      # 必要なパッケージの導入
pi@raspberrypi ~/src $ apt-get source cowsay                        # cowsay の source 入手
pi@raspberrypi ~/src $ cd cowsay-3.03+dfsg1                         # ディレクトリ移動とパッチ適用
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ wget -O - https://gist.githubusercontent.com/emasaka/639a9168c6a9ddba044f/raw/1a55ec58ded59b3181f1721dbbe814a38d5ea4cb/cowsay-mbswidth.patch | patch -i -
patching file cowsay
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ ./cowsay -f duck あひる焼き
 ____________
< あひる焼き >
 ------------
 \
  \
   \ >()_
      (__)__ _

~/bin 辺りにコピーして使ったり,以下のような感じで既存のパッケージを置き換えてしまってもいいかもしれません.

pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ vi debian/control
- Depends: ${misc:Depends}, ${perl:Depends}
+ Depends: ${misc:Depends}, ${perl:Depends}, libtext-charwidth-perl
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ dpkg-buildpackage -b
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ sudo debi

さて,fortuneのことを忘れてしまいそうですが以下のようにしてあひる焼きfortuneの結果をあひるに喋らせます.

pi@raspberrypi ~ $ cowsay -f duck `fortune ~/.fortune/ahiruyaki`
 ______________
< ヒッヒッヒッ >
 --------------
 \
  \
   \ >()_
      (__)__ _

いい感じです :)

~/.profile 辺りに登録しちゃいましょう.aliasも設定してみます.

pi@raspberrypi ~ $ echo 'alias a="fortune ~/.fortune/ahiruyaki | cowsay -f duck"' >> ~/.profile 
pi@raspberrypi ~ $ echo a >> ~/.profile

これでlogin時や a と入力することで実行されます.

Last login: Fri Dec  4 23:32:05 2015 from 192.168.2.210
 ________________________________________________________________________________
/ あひる焼きというものには鮮度があります。焼けば焼くほどに、あひる焼きとは廃れて \
\ いくものなのです。                                                             /
 --------------------------------------------------------------------------------
 \
  \
   \ >()_
      (__)__ _
pi@raspberrypi ~ $ a
 ________________________
< バーニング通帳!!!! >
 ------------------------
 \
  \
   \ >()_
      (__)__ _

Xでも焼く

GUI の X 版のcowsayも存在します.こいつも試してみましょう.

pi@raspberrypi ~ $ sudo apt install xcowsay
pi@raspberrypi ~ $ xcowsay `fortune ~/.fortune/ahiruyaki`

https://www.flickr.com/photos/119142834@N05/23490968856/in/dateposted-public/

なかなか特徴的なcowが喋りました.せっかくなのであひるに喋らせましょう.吹き出しの向きと位置を変えてあひる画像を指定しています.

pi@raspberrypi ~ $ wget https://github.com/Na0ki/ahiru_yakuna/raw/master/ahiru240.jpg -O ~/.fortune/ahiru240.jpg
fortune ~/.fortune/ahiruyaki | xcowsay -l --bubble-at=0,-60 --image=$HOME/.fortune/ahiru240.jpg

https://www.flickr.com/photos/119142834@N05/23434841661/in/dateposted-public/

背景がちょっと邪魔なので透過処理をしてみます.

https://www.flickr.com/photos/119142834@N05/23149788589/in/dateposted-public/

いい感じです :)
例によってaliasにしておきます

pi@raspberrypi ~ $ echo alias xa='fortune ~/.fortune/ahiruyaki | xcowsay -l --bubble-at=0,-60 --image=$HOME/.fortune/ahiru240.png' >> ~/.profile

そんなこんなでみんなのおかげであひるがいい感じに焼けるようになりました.@shimadahさん, @ahiru3netさん, @emasakaさんありがとうございました!

#そうそう,以前はフレームバッファでもあひる焼きしてました.

最近のOSMマッピング方法2015

この記事は OpenStreetMap Advent Calendar 2015 の4日目の記事です.昨日の記事は,OpenStreetMap – Wheelchair=*タグで素敵なプレゼントを でした.
私もついWheelchair=*タグを後回しにしてしまっているのでもっと意識してマッピングしたいと思います.

さて,今日は私の最近のOSMマッピング方法をメモしておこうと思います.たまに聞かれることがあるので参考になる人も居るかもしれません.

私は最近引きこもりでチェアマッピングが主ですが,外に出るときにはGPSロガーなどを持って出歩いてサーベイして家に帰ってからPCで入力することが多いです.この時使っているアプリケーションなどの紹介をしたいと思います.

目的地に行く前

マッピングをするとき道路や建物があるのと無いのではやりやすさが大分違います.そこで前もって作業できる時間があるなら目的地の地図を確認して基盤地図情報などをトレースしておきます.

このときJava製のマルチプラットホームのアプリケーションの JOSM を利用しています.Windows/MacOSX/Linux 等で動作します.私はLinux上で利用しています.

以下のページに利用ガイドがあります.

基盤地図情報のトレースはそのままでは出来ないので次のページを参考に基盤地図情報 25000,および 2500 TMSの設定を行います.

これで基盤地図情報を背景にしてトレースが出来るようになります.以下はとある自転車屋さんに行こうと思い周辺の道路と建物をトレースした例です.(結局未だ行けていませんorz)

https://www.flickr.com/photos/119142834@N05/22884236284/in/dateposted-public/

https://www.flickr.com/photos/119142834@N05/23144556199/in/dateposted-public/

目的地でのサーベイ

私はGPSロガーの他にAndroid端末を利用しています.
端末は以下の2つを利用しています.どちらもちょっと古いので新しい端末が欲しいところです><

  • Galaxy Note II
    ペンが使える.SIMスロット破損で3G通信不可
  • Xperia Pro
    主に3Gモデムとして利用

Android端末に以下のようなアプリケーションを導入しています.

Mapの確認&POI登録に OsmAnd+

これは前もってOSMの地図データをローカルに保存(オンラインモードもあり)しておき,地図の確認やPOIの登録が出来ます.ちょこっとPOIを登録するのに使っています.

GPSロギングと写真撮影などに OSMTracker for Android™

GPSロガーを別途持っていますがそれ以外にこのアプリケーションを起動してロギング&写真撮影をしています.帰宅してからその情報をJOSMに取り込んでマッピングしています.

OSM登録データの確認に OSMfocus

POIは登録されているけれど詳細なデータも登録されているのかなど確認したいことがあります.そういった場合のこのアプリで確認ができます.

Screenshot_2015-12-04-18-37-02

手書きマッピングに OSM sketch

以前もOsmAnd+ のスクリーンショットを取得してその上に手書きでメモを取るといったことをしていたのですが,このアプリケーションではメモしたデータをそのままOSMにアップロードできます.アップロードしたデータはそのまま他のアプリケーションで編集に使えます.
メモをするときはちょっとコツがあって,意識して大きめに書かないと操作ま丸められてしまうようでうまく書けません.大きめのストロークでメモしてこまめにスクロールするとうまく書けます.
広告のない有料版があれば購入したいです.

※このアプリケーションは2015年10月31日に浜松で開催された State of the Map Japan 2015 in Hamamatsu 内の次の公演「プレゼンテーション:マッピング用スマホアプリを作ってみた」で知りました.現地にはいけませんでしたが中継で参加しました :)

Mapの閲覧に MAPS.ME

ローカルに地図データをダウンロードして閲覧できます.地図データも地域ごとにダウンロードできるので欲しい場所の地図だけをダウンロードできます.(最近はOSMAnd+でも可能)
このアプリケーションは以前は有料だったのですが去年の今頃無料になり,現在はオープンソースになっています.
#購入して数週間で無料になってちょっとがっかりしました><

その他

お店で買い物をしたらレシートをもらうようにしています.レシートにはお店の詳細な情報が書かれていることが多いです.スーパーやコンビニなどの選択肢が複数ある場合は情報の少ない方で買い物するようにしています :)
タグにはsource=receipt が使えます.

Android以外ではGPSロガー(Garmin Oregon300)とデジタルカメラを持ち歩いています.GPSログはOSMにアップロードしてトレース元のデータに,写真にはジオタグを埋め込んでJOSMで読み込んでマッピングしています.
Linux でのジオタグの埋め込み方はちょっと古いですが以下の資料を参照して下さい.MacOSXでも動作すると思います.

Windowsでは などのアプリケーションで実現できます.(轍はWineでも動作します)

帰宅後のマッピング

帰宅後はサーベイしたデータを元に入力していきます.GPSログ,ジオタグの含まれた写真,レシートなどを見ながら JOSM を利用しています.撮ったつもりの写真が無かったり,撮っていてもぶれてたり光の具合でうまく見えないということもよくあります.確実なのは再度現地に行くことですが,画像編集ソフトでシャープネスやコンストラストを変更すると読みやすくなることもあります.これにはマルチプラットホームアプリケーションの GIMP を利用しています.
GIMP – GNU Image Manipulation Program

やってみたいマッピング方法

広角のアクションカメラの利用

最近はアクションカムが色々出ていますが,以下のような広角のカメラでアーケードなどのGPSの電波状態の悪いところなどをビデオマッピングしたら便利そうと思っています.最近出た新型では解像度も上がったようなので看板などの文字も読みやすそうです.

GNESS 対応ロガーの利用

準天頂測量衛星などのGNESS対応のGPSレシーバーを利用して精度の高いログを取得してみたいと思っています.GPSモジュールを入手出来ていないので計画はストップしています><

おわりに

実際はバッテリが持たなくてうまくサーベイ出来なかったりしますが最近はだいたいこんな感じでマッピングしています..もっといい手順やアプリがあったらぜひ教えて下さい.

また,不定期で鹿児島らぐでマッピングカフェをしています.参加者ははほぼ私一人ですが興味のある方はチェックしてみて下さい.

#しかし,もっと外出してサーベイする機会を増やさないといけないです…….