4月 06

/proc/cpuinfoのSerialを詐称する

$ cat /proc/cpuinfo | sed -e 's/Serial.*/Serial\t\t: 00000000deadbeef/' > /tmp/cpuinfo_fake
$ sudo chmod 444 /tmp/cpuinfo
$ sudo chown root.root /tmp/cpuinfo
$ sudo mount -o bind /tmp/cpuinfo_fake /proc/cpuinfo
$ tail /proc/cpuinfo
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

Hardware        : BCM2835
Revision        : a01041
Serial          : 00000000deadbeef

3月 28

mosh 1.3.0をDropbear sshdで利用してみる

moshの1.3.0がリリースされました.

moshはsshを置き換えようとしているソフトウェアで,ネットワークが遅いときにローカルエコーを表示したり,ネットワークが切り替わってもローミングしたりと便利なソフトウェアです.(NotePCで接続してサスペンドして別のネットワークでレジュームしてもすぐに使っていた端末にアクセスできる)

1.3.0でなにかおもしろい機能が増えたりしていないかなと眺めていると

  * Add --no-ssh-pty option for Dropbear compatibility and other issues.

Dropbearで使えるようになるオプションが増えているようです.
DropbearはOpenSSHに比べて大分小さなsshdです.組み込みとかで使われているのを見ます.でも機能が物足りないなと思うことも.

mosh + Dropbearの組み合わせを試してみました.

試したのはこんな感じの環境です.

Host : Raspbian jessie(Raspberry Pi 2B)
Client : Debian sid amd64

dropbearの準備

HostにDropbearをパッケージで導入します

$ sudo apt install dropbear

dropbearのhost鍵を用意

$ mkdir /tmp/dropbear
$ dropbearkey -t ecdsa -s 521 -f /tmp/dropbear/dropbear_ecdsa_host_key
  • -t 鍵種類
  • -s 鍵長
  • -f 鍵ファイル

接続時に解りやすいようにバナーファイル作成

$ banner dropbear > /tmp/dropbear/banner

Dropbearを2222番ポートで起動

$ dropbear -r /tmp/dropbear/dropbear_ecdsa_host_key -p 2222 -b /tmp/dropbear/banner -E
  • -r host鍵を指定
  • -p sshポート番号
  • -b バナーファイル
  • -E 標準エラー出力にメッセージ出力

Dropbearにssh接続できるか確認

$ ssh pi@192.168.2.200 -i ~/.ssh/id_ecdsa -p 2222
Host key fingerprint is SHA256:G3u9pP4ZrkZ2kWs9e+ly9MkEtnO0f4ebvkBS0ObGJQQ
+---[ECDSA 521]---+
|          E+.    |
|           .+ .  |
|           +.+   |
|           .*o . |
|        S ..o++ .|
|         +o++oo= |
|        oo.o= *+=|
|         ..+ *o**|
|         o+o=.O=o|
+----[SHA256]-----+

 #####   #####    ####   #####   #####   ######    ##    #####
 #    #  #    #  #    #  #    #  #    #  #        #  #   #    #
 #    #  #    #  #    #  #    #  #####   #####   #    #  #    #
 #    #  #####   #    #  #####   #    #  #       ######  #####
 #    #  #   #   #    #  #       #    #  #       #    #  #   #
 #####   #    #   ####   #       #####   ######  #    #  #    #

Authenticated to 192.168.2.200 ([192.168.2.200]:2222).

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~ $ 

mosh 1.3.0の準備

server側はsourceからbuild

$ sudo apt-get build-dep mosh
$ wget https://mosh.org/mosh-1.3.0.tar.gz
$ sha256sum mosh-1.3.0.tar.gz
320e12f461e55d71566597976bd9440ba6c5265fa68fbf614c6f1c8401f93376  mosh-1.3.0.tar.gz

※hashとgpg署名は以下のメールに,鍵は https://mosh.org/ の一番下にある.

sourceを展開してbuild

$ tar tvf mosh-1.3.0.tar.gz
$ tar xf mosh-1.3.0.tar.gz
$ ./configure --prefix=${HOME}/usr/local
$ make
$ install

host側はDebian sid amd64のパッケージを利用した

$ sudo apt install mosh
$ dpkg-query -W mosh
mosh    1.3.0-1

ということでホスト側はこんな状態に

  • OpenSSH : 22番ポート
  • Dropbear : 2222番ポート
  • mosh 1.2.4a-1+b2(pkg) : /usr/bin/mosh-server
  • mosh 1.3.0 : ${HOME}/usr/local/bin/mosh-server

この状態でDropbearとmosh 1.3.0を利用するにはこんな感じ

$ mosh pi@192.168.2.200 --ssh="ssh -p 2222" --server='${HOME}'/usr/local/bin/mosh-server

でも実際に繋ごうとするとエラーになってしまう.

接続元のmoshではこんなエラー

/usr/bin/mosh: Did not find mosh server startup message. (Have you installed mosh on your server?)

接続先のDropbearではこんなエラー

[20390] Mar 28 06:37:20 Child connection from 192.168.2.205:32888
[20390] Mar 28 06:37:21 Pubkey auth attempt with unknown algo for 'pi' from 192.168.2.205:32888
[20390] Mar 28 06:37:21 Pubkey auth succeeded for 'pi' with key md5 0b:fb:21:45:d6:a0:7d:57:02:24:9b:d3:ed:c7:c6:23 from 192.168.2.205:32888
[20391] Mar 28 06:37:21 ioctl(TIOCSCTTY): Input/output error
[20391] Mar 28 06:37:21 /dev/pts/1: No such file or directory
[20391] Mar 28 06:37:21 open /dev/tty failed - could not set controlling tty: No such device or address
[20390] Mar 28 06:37:21 Exit (pi): Disconnect received

ということで,mosh 1.3.0で入った--no-ssh-ptyを付けてみます.

$ mosh pi@192.168.2.200 --ssh="ssh -p 2222" --server='${HOME}'/usr/local/bin/mosh-server --no-ssh-pty

asciicast

うまく繋がりました.
試しに回線を切断して再接続すると自動的に繋がるのも確認 ☺

--no-ssh-ptyを~/.ssh/configとかに書いとけるといいんですけどね.今のところ毎回指定するしかなさそう?

2月 21

Raspberry Piでコンポジットで起動した後に解像度やディスプレイを変更する

コンポジット出力の解像度変更

Raspberry Piを起動するときにHDMIを接続した状態で起動すると高解像度で起動しますが,繋いでいないとコンポジット出力で起動してXの解像度が720×480になってちょっと手狭です.
xrandrで解像度を追加するとXの再起動もせずに高解像度に出来ます.

※xrandrコマンドは対象のX端末上か,DISPLAY変数を対象のものを指定して実行すること

  • 720x480しか選べない
$ xrandr 
Screen 0: minimum 320 x 200, current 720 x 480, maximum 2048 x 2048
HDMI-0 disconnected (normal left inverted right x axis y axis)
Composite-0 unknown connection 720x480+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   720x480       62.69* 
DSI-0 disconnected (normal left inverted right x axis y axis)
  • cvtコマンドで設定したい解像度を指定してModelineを調べる
$ cvt 1360 768
# 1360x768 59.80 Hz (CVT) hsync: 47.72 kHz; pclk: 84.75 MHz
Modeline "1360x768_60.00"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync
  • xrandrのmodeを作成する
$ xrandr --newmode "1360x768_60.00"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync
  • modeが増えている
$ xrandr 
Screen 0: minimum 320 x 200, current 720 x 480, maximum 2048 x 2048
HDMI-0 disconnected (normal left inverted right x axis y axis)
Composite-0 unknown connection 720x480+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   720x480       62.69* 
DSI-0 disconnected (normal left inverted right x axis y axis)
  1360x768_60.00 (0x248) 84.750MHz
        h: width  1360 start 1432 end 1568 total 1776 skew    0 clock  47.72KHz
        v: height  768 start  771 end  781 total  798           clock  59.80Hz
  • modeをComposite-0に追加する
$ xrandr --addmode Composite-0 1368x768_60.00
$ xrandr 
Screen 0: minimum 320 x 200, current 720 x 480, maximum 2048 x 2048
HDMI-0 disconnected (normal left inverted right x axis y axis)
Composite-0 unknown connection 720x480+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   720x480       62.69* 
   1360x768_60.00  59.80  
DSI-0 disconnected (normal left inverted right x axis y axis)
  • 設定したmodeに切り替える
$ xrandr --output Composite-0 --mode 1360x768_60.00

起動後にHDMIに切り替える

解像度の変更ではなく起動後にHDMI接続に切り替えるのもxrandrで出来ます.こちらもXの再起動は必要ありません.

  • HDMIケーブルを接続するとHDMI-0 connectedとなってmodeが選べるようになる
$ xrandr 
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 2048 x 2048
HDMI-0 connected 1366x768+0+0 (normal left inverted right x axis y axis) 580mm x 360mm
   1366x768      59.79*+
   1920x1080     60.00    59.94  
   1920x1080i    60.00    50.00    59.94  
   1280x1024     60.02  
   1152x864      75.00  
   1280x720      60.00    58.68    50.00    59.94  
   1024x768      75.03    70.07    60.00  
   832x624       74.55  
   800x600       72.19    75.00    60.32    56.25  
   720x576       50.00  
   720x576i      50.00  
   720x480       60.00    59.94  
   720x480i      60.00    59.94  
   640x480       75.00    72.81    66.67    60.00    59.94  
   720x400       70.08  
Composite-0 unknown connection (normal left inverted right x axis y axis)
   720x480       62.69  
   1360x768_60.00  59.80  
DSI-0 disconnected (normal left inverted right x axis y axis)
  • 一度にコンポジットを無効にしてHDMIを有効にしようとするとエラーとなる
$ xrandr --output Composite-0 --off --output HDMI-0 --auto
xrandr: cannot find crtc for output HDMI-0
  • 一度に行うのではなく先にコンポジットを無効にしてからHDMIを有効にするとうまく行った
$ DISPLAY=:0 xrandr --output Composite-0 --off
$ DISPLAY=:0 xrandr --output HDMI-0 --auto
  • 逆にHDMIからコンポジットに切り替えることも出来る
$ xrandr --output HDMI-0 --off
$ xrandr --output Composite-0 --mode 1360x768_60.00

環境

  • HW : Raspberry Pi B 2
$ screenfetch 
    .',;:cc;,'.    .,;::c:,,.    pi@raspberrypi
   ,ooolcloooo:  'oooooccloo:    OS: Unknown 8.0 jessie
   .looooc;;:ol  :oc;;:ooooo'    Kernel: armv7l Linux 4.9.11-v7+
     ;oooooo:      ,ooooooc.     Uptime: 4h 28m
       .,:;'.       .;:;'.       Packages: 1541
       .... ..'''''. ....        Shell: 3362
     .''.   ..'''''.  ..''.      Resolution: 1368x768
     ..  .....    .....  ..      DE: LXDE lxpanel 0.7.2
    .  .'''''''  .''''''.  .     WM: OpenBox
  .'' .''''''''  .'''''''. ''.   GTK Theme: Clearlooks [GTK2], Not Found [GTK3]
  '''  '''''''    .''''''  '''   Icon Theme: nuoveXT2
  .'    ........... ...    .'.   Font: Sans 10
    ....    ''''''''.   .''.     CPU: ARMv7 rev 5 (v7l) @ 900MHz
    '''''.  ''''''''. .'''''     RAM: 258MB / 922MB
     '''''.  .'''''. .'''''.    
      ..''.     .    .''..      
            .'''''''            
             ......       

6月 07

RaspbianでUVCデバイスが認識できなくて困る

昨日の話なのですが,Rasbianの入ったRaspberry PiでUVCのWebCam(logitech c270)が認識しなくて困りました.
接続してdmesgやlsusbには該当のvid/pidは出てきます.でも/dev/video?などは出てこず.
手動でomdule を読みこませようとするとこんなエラー.

$ sudo modprobe uvcvideo
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.9-v7+/modules.dep.bin'

apt update && apt upgradeでkernel更新したけど再起動して反映していない&Raspbianでは古いmoduleはupgraed時に消されるということだったようです.
再起動して新しいKernelにして解決でした.
通常のDebian等では残ってるのでちょっと嵌まりましたorz

6月 01

Raspbian jessieでもhiptextを試す

さっき

というのを書きましたが,なんとなくRaspberry Pi B+ の Raspbian jessie lite でも`hiptext`を試してみました.

$ sudo apt install build-essential libpng12-dev libjpeg-dev     libfreetype6-dev libgif-dev ragel libavformat-dev libavcodec-dev     libswscale-dev libgflags-dev libgoogle-glog-dev git
$ git clone https://github.com/jart/hiptext.git
$ cd hiptext
$ time make
   :
real    22m7.443s
user    21m53.190s
sys     0m8.910s

て感じでほぼREADMEのままmake一発でした.違ったのは導入パッケージに`git`が必要だったくらいです.
思いの外makeに時間が掛かりましたがRaspberry Pi B+で試しているので2Bや3Bだともっと速いでしょう.
Balls.pngやObama.jpgはうまく行き,さっきうまく行かなかったTux.pngは同じようにコケたので同じ動きのようです.

恐らく Debian jessie でも同様だと思います.

27293516472 deedbe97a4

3月 09

Radikoを自動的に録音してPodcast化してくれるradicastを試す

Radikoを自動的に録音してPodcast化してくれるradicastというものを見つけました.

昔はこんな感じで録音したりしていましたが仕様が変わって録音できなくなって対応というのが面倒で最近は録音していませんでした.たまに聞くときはAndroidのRazikoを使っています.でもradicastならお手軽に動かせてPodcastとして扱えるので便利そうということで試してみました.

試した環境はUbuntu 14.04 amd64/Debian stretch testing amd64/Rasbian jessieですが,Ubuntu環境では録音開始時に以下のようにコアダンプしてしまうようでうまく行っていません :-(

2016/03/09 05:20:00 [radiko] start record
2016/03/09 05:20:00 [radiko] GET http://radiko.jp/player/swf/player_3.0.0.01.swf
2016/03/09 05:20:04 [radiko] POST https://radiko.jp/v2/api/auth1_fms
Segmentation fault (コアダンプ)

dockerでも動きますが,今回は実機で動かしています.

必要なpkgの導入

$ sudo apt install libav-tools swftools rtmpdump golang-go

※Debian stretchの場合はlibav-toolsの代わりにffmpegを導入.

go getで導入

$ GOPATH=~/usr/local/go go get github.com/soh335/radicast

オプションはこんな感じでした.

$ ~/usr/local/go/bin/radicast -h
Usage of /home/mk/usr/local/go/bin/radicast:
  -bitrate string
        bitrate (default "64k")
  -buffer int
        buffer for recording (default 60)
  -config string
        path of config.json (default "config.json")
  -converter string
        ffmpeg or avconv. If not set this option, radicast search its automatically.
  -host string
        host (default "0.0.0.0")
  -output string
        output (default "output")
  -port string
        port (default "3355")
  -setup
        initialize json configuration
  -title string
        title (default "radicast")

設定ファイル作成

--setupオプションでスケルトンを作成して,

$ ~/usr/local/go/bin/radicast --setup > ~/usr/local/go/etc/radicast.json
$ cat ~/usr/local/go/etc/radicast.json
{
  "HOUSOU-DAIGAKU": [],
  "MBC": [],
  "RN1": [],
  "RN2": []
}

次のページを参考にcron形式で設定します.crontabと違い秒単位まで指定できるようです.

例えば"0 0 7 * * MON-FRI" だと月曜から金曜の07:00:00の番組を録音となります.
録音停止は自動的にされるようです.

$ cat ~/usr/local/go/etc/radicast.json
{
  "HOUSOU-DAIGAKU": [],
  "MBC": [
    "0 0 5 * * MON-FRI",
    "0 10 5 * * MON-FRI",
    "0 0 7 * * MON-FRI"
  ],
  "RN1": [],
  "RN2": []
}

実行

設定ファイルを指定して実行します.

$ ~/usr/local/go/bin/radicast -config=$HOME/usr/local/go/etc/radicast.json
2016/03/09 05:00:12 [radicast] station:MBC spec:0 0 5 * * MON-FRI
2016/03/09 05:00:12 [radicast] station:MBC spec:0 10 5 * * MON-FRI
2016/03/09 05:00:12 [radicast] station:MBC spec:0 0 7 * * MON-FRI
2016/03/09 05:00:12 [radicast] start new cron
2016/03/09 05:00:12 [server] start 0.0.0.0:3355

指定時刻になると,番組情報を取得して録音が始まり,番組終了時に録音が終了して次のジョブまで待機します.

2016/03/09 06:30:00 [radiko] start record
2016/03/09 06:30:00 [radiko] GET http://radiko.jp/player/swf/player_3.0.0.01.swf
2016/03/09 06:30:04 [radiko] POST https://radiko.jp/v2/api/auth1_fms
2016/03/09 06:30:05 [radiko] POST https://radiko.jp/v2/api/auth2_fms
2016/03/09 06:30:06 [radiko] GET http://radiko.jp/v2/api/program/today?area_id=JP46
2016/03/09 06:30:07 [radiko] start recording モーニング・スマイル
2016/03/09 06:30:07 [radiko] rtmpdump command: /usr/bin/rtmpdump --live --quiet -r rtmpe://f-radiko.smartstream.ne.jp --playpath simul-stream.stream --app MBC/_definst_ -W http://radiko.jp/player/swf/player_3.0.0.01.swf -C S:"" -C S:"" -C S:"" -C S:J_Rb9kLWN2Cb5XlcGqQjfw --stop 1853 -o -
2016/03/09 06:30:07 [radiko] converter command: /usr/bin/ffmpeg -y -i - -vn -acodec libmp3lame -ar 44100 -ab 64k -ac 2 /tmp/radiko240330221/radiko_0.mp3

データは以下のようにoutput以下に保存されています.

$ find output -ls
  6724248      0 drwxr-xr-x   1 mk       mk             36  3月  9 05:55 output
  6724778      0 drwxr-xr-x   1 mk       mk             44  3月  9 05:55 output/20160309053000_MBC
  6724327  10168 -rw-r--r--   1 mk       mk       10409132  3月  9 05:55 output/20160309053000_MBC/podcast.mp3
  6724779      4 -rw-r--r--   1 mk       mk            650  3月  9 05:55 output/20160309053000_MBC/podcast.xml

録音中のテンポラリファイルは/tmp以下に作られます.

$ ls -lA /tmp/radiko077215706/
合計 5184
-rw-r--r-- 1 mk mk 5223512  3月  9 07:10 radiko_0.mp3

録音したデータはPodcastとして配信されます.このURLは規定値ではlocalhostからしかアクセスできません.このURLをPodcast Aggregatorに指定してあげると普通にPodcastとして扱えます :)

$ xmllint http://localhost:3355/rss
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
    <channel>
        <title>radicast</title>
        <itunes:owner/>
        <itunes:image/>
        <itunes:category/>
        <item>
            <title>生島ヒロシのおはよう一直線 (2016-03-09 05:30:00 +0900 JST)</title>
            <itunes:author>生島ヒロシ</itunes:author>
            <itunes:summary> &lt;br /&gt;&lt;A href="http://www.mbc.co.jp/radio/" target="_blank"&gt;&lt;img src="http://www.mbc.co.jp/radio/radiko/bn/mbcradio_pr1410.png" alt="MBCradio" /&gt;&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;twitterハッシュタグは「&lt;a href="http://twitter.com/#!/search/%23mbc1107"&gt;#mbc1107&lt;/a&gt;」</itunes:summary>
            <itunes:image/>
            <enclosure url="http://localhost:3355/podcast/20160309053000_MBC.mp3" length="10409132" type="audio/mpeg"/>
            <pubDate>Wed, 9 Mar 2016 05:55:45 +0900</pubDate>
        </item>
    </channel>
</rss>

Podcast Aggregatorとこのサーバが別の場合以下のように-hostオプションを指定してインターフェイスに割り当てたipを指定するとそのネットワークからアクセスできるようになります.

$ ~/usr/local/go/bin/radicast -config=$HOME/usr/local/go/etc/radicast.json -host 192.168.2.203
  :
2016/03/09 07:42:34 [server] start 192.168.2.203:3355

proxy

は使えない感じかな?

$ w3m -dump http://radiko.jp/area
document.write('<span class="JP46">KAGOSHIMA JAPAN</span>');
$ tsocks w3m -dump http://radiko.jp/area
document.write('<span class="JP13">TOKYO JAPAN</span>');
$ ALL_PROXY=socks5h://localhost:8080 ~/usr/local/go/bin/radicast -setup
2016/03/09 07:56:00 [radiko] GET http://radiko.jp/player/swf/player_3.0.0.01.swf
2016/03/09 07:56:01 [radiko] POST https://radiko.jp/v2/api/auth1_fms
2016/03/09 07:56:02 [radiko] POST https://radiko.jp/v2/api/auth2_fms
2016/03/09 07:56:02 [radiko] GET http://radiko.jp/v2/api/program/today?area_id=JP46
{
  "HOUSOU-DAIGAKU": [],
  "MBC": [],
  "RN1": [],
  "RN2": []
}
$ tsocks ~/usr/local/go/bin/radicast -setup
   :
  "MBC": [],
   :
$ tsocks ~/usr/local/go/bin/radicast -setup
   :
  "MBC": [],
   :
$ ALL_PROXY=http://localhost:8080 ~/usr/local/go/bin/radicast -setup
   :
  "MBC": [],
   :

2月 26

rc-gui最新版のビルドメモ(20160226)

Rasbian jessieのGUIな設定ツールのrc-guiの言語ファイルの項目が増えているみたいなので試してみました.

Wi-FiのCountry Code辺りが増えてるみたいなんだけど画面上に見当たらないです.
対応デバイス繋がないと出ないのかな?

20160226_00:02:02-20553

訳はこんな感じ?

20160226_01:02:13-6226

とりあえずrc-guiはビルドに必要なパッケージ増えてたのでメモしておきます.
controlには未だ載ってないよう.

$ sudo apt-get build-dep rc-gui
$ git pull
$ ./configure --prefix=/opt/local
   :
configure: error: Package requirements ( gtk+-2.0 >= 2.18.0              libxml-2.0) were not met:
 
No package 'libxml-2.0' found
   :
$ sudo apt install libxml2-dev
$ ./configure --prefix=/opt/local
$ make
$ sudo make install

2月 19

cronに特化したPodcastアグリゲータ/ダウンローダのpodgetを試す

先日試したpodracerは何気に10年前のソフトでメンテナンスもされていないし,起動中に強制終了するとゴミが残って次から起動しなくなったりとかとか結構不満点が出てきました.

今は前処理を以下のようにして,

if [ $(pgrep podracer) ] ; then
  echo 'running podracer.'
  exit -1
fi
 
echo run podracer
if [ -f ~/.podracer/tempsub ] ; then
  rm ~/.podracer/tempsub
  echo 'rm tempsub'
fi

プレイリストもこんな感じで別に作ってます.

cd ~/podcasts
PODCASTLIST=($(cd ~/podcasts ; find . -mmin -$LISTTIME -type f -print0 | xargs -0n1 file | grep -i audio | cut -f1 -d:))
if [ ${#PODCASTLIST[@]} -eq 0 ] ; then
  echo 'podcast not found.'
  exit -1;
fi
 
echo num = ${#PODCASTLIST[@]}
ls -1tr ${PODCASTLIST[@]} > ~/podcasts/todayspodcast.m3u

後者はDebianの方にはバグ報告をしていますが音沙汰がない感じです.

他にないかなーと探して(apt-cache search podcast)podgetというものを見つけました.

$ apt show podget | grep -A99 Description:
 
Description: cron 用に最適化された Podcast アグリゲータ/ダウンローダ
 Podget はシンプルな podcast アグリゲータであり、定期的なバックグランドジョブ
 (すなわち cron) として起動するために最適化されています。RSS および XML フィード
 からの podcast のダウンロード、ファイルをソートしてフォルダやカテゴリごとに格納、
 iTunes PCAST ファイルおよび OPML リストからの URL のインポート、M3U および ASX
 プレイリストの自動生成、そして古くなったファイルの自動クリーンアップのサポート
 が特徴です。また、MS Windows サーバ上にホストされた podcast の UTF-16 自動変換も
 特徴です。
 podget を一旦起動すると、ユーザ設定ファイルを $HOME/.podget にインストール
 しますので、そのファイルをカスタマイズできます。

cronに特化していて便利そうなので試してみます.

導入

Debian stretch testing/Rasbian jessie/Ubuntu 14.04 で確認しました.

$ sudo apt install podget

初期化

$ podget -h
 
Usage /usr/bin/podget [options]
 
    -c --config <FILE>           Name of configuration file.
    -C --cleanup                 Skip downloading and only run cleanup loop.
    --cleanup_simulate           Skip downloading and simulate running
                                 cleanup loop.
                                 Display files to be deleted.
    --cleanup_days               Number of days to retain files.  Anything
                                 older will be removed.
    -d --dir_config <DIRECTORY>  Directory that configuration files are
                                 stored in.
    -f --force                   Force download of items from each feed even
                                 if they have already been downloaded.
    --import_opml <FILE or URL>  Import servers from OPML file or
                                 HTTP/FTP URL.
    --import_pcast <FILE or URL> Import servers from iTunes PCAST file or
                                 HTTP/FTP URL.
    -l --library <DIRECTORY>     Directory to store downloaded files in.
    -p --playlist-asx            In addition to the default M3U playlist,
                                 create an ASX Playlist.
    -r --recent <count>          Download only the <count> newest items from
                                 each feed.
    --serverlist <list>          Serverlist to use.
    -s --silent                  Run silently (for cron jobs).
    --verbosity <LEVEL>          Set verbosity level (0-4).
    -v                           Set verbosity to level 1.
    -vv                          Set verbosity to level 2.
    -vvv                         Set verbosity to level 3.
    -vvvv                        Set verbosity to level 4.
    -h --help                    Display help.

初回起動時に設定ファイルなどが作成されます.引数無しで実行すると初期設定の中のpodcastをダウンロードするので--cleanup_simulateオプションを付けて実行すると良さそうです.
設定ファイルは規定値では~/.podget以下に作成されます.

$ podget --cleanup_simulate
$ ls -lA ~/.podget
合計 8
-rw-rw-r-- 1 mk mk 3652  2月 19 05:34 podgetrc
-rw-rw-r-- 1 mk mk 1131  2月 19 05:34 serverlist
  • podgetrc : 設定ファイル
  • serverlist : podcastのリスト

設定ファイルの用意

お好みで設定ファイルの~/podgetrcを編集します.私は以下の辺りを書き換えました.

ログファイルを有効に

# Directory to store logs in
dir_log=/home/mk/POD/LOG

プレイリストの年月日の形式を書き換え

# Date format for new playlist names
date_format=+%Y-%m-%d

Podcastの取得数を3つに

# Most Recent
# 0  == download all new items.
# 1+ == download only the <count> most recent
most_recent=3

サーバリストの作成

取得するPodcastを~/.podget/serverlistに書いていきます.

書式はスペース区切りで

URL カテゴリー 番組名

になっています.podgetを実行した時に
カテゴリー/番組名/番組というふうにディレクトリが掘られます.
具体的にはこんな感じで書いていきます.

http://feeds.feedburner.com/weblogs/csc tech 電脳空間カウボーイズ
http://feeds.backspace.fm/backspacefm tech backspace.fm
http://www.joqr.co.jp/science-podcast/index.xml science 日立ハイテクプレゼンツ 大村正樹のサイエンスキッズ
http://www.tbsradio.jp/life/rss.xml etc 文化系トークラジオ Life
http://www.tbsradio.jp/cycle-r/index.xml bike ミラクル・サイクル・ライフ
http://sokoani.com/feed anime そこあに
  :

他のアプリケーションらの移行でOPMLファイルのエクスポートが可能な場合はそのファイルやURLを元にインポートできるようです.※未確認

$ podget --import_opml <FILE or URL>

若しくはPCAST形式(iTunes向け?)も同様に利用できるようです.※未確認

$ podget --import_pcast <FILE or URL>

OPML書き出しの機能もあります.但しこの機能は
Ubuntu 14.04の0.6.9にはなく,
Rasbian jessieの0.7.3,
Debian stretchの0.7.9には存在しました.

$ podget --export_opml /tmp/podcast.opml
podget
 
Session file not found.  Creating podget.22189 .
 
Export serverlist to OPML file: /tmp/podcast.opml
 
Closing session and removing lock file.
$ head /tmp/podcast.opml
<?xml version="1.0" encoding="utf-8" ?>
<opml version="1.0">
<head/>
<body>
<outline text="tech"><outline text="電脳空間カウボーイズ" type="rss" xmlUrl="http://feeds.feedburner.com/weblogs/csc" /></outline>
<outline text="tech"><outline text="backspace.fm" type="rss" xmlUrl="http://feeds.backspace.fm/backspacefm" /></outline>
<outline text="science"><outline text="日立ハイテクプレゼンツ 大村正樹のサイエンスキッズ" type="rss" xmlUrl="http://www.joqr.co.jp/science-podcast/index.xml" /></outline>
<outline text="etc"><outline text="文化系トークラジオ Life" type="rss" xmlUrl="http://www.tbsradio.jp/life/rss.xml" /></outline>
<outline text="bike"><outline text="ミラクル・サイクル・ライフ" type="rss" xmlUrl="http://www.tbsradio.jp/cycle-r/index.xml" /></outline>
<outline text="anime"><outline text="そこあに" type="rss" xmlUrl="http://sokoani.com/feed" /></outline>

実行

とりあえず引数無しで実行することでPodcastが取得できます.

$ podget
-------------------------------------------------
Category: anime         Name: そこあに
Downloading feed index from http://sokoani.com/feed
2016-02-19 07:37:15 URL:http://sokoani.com/feed [673868] -> "-" [1]
 
Downloading 0_s413.mp3 from http://sokoani.com/podpress_trac/feed/9818/0/
 :
 :

Podcastは規定値では~/POD以下にカテゴリ/番組名/番組ファイルの形で保存されます.

$ find ~/POD -type f | tail -3
/home/mk/POD/etc/JUNK 伊集院光 深夜の馬鹿力/files_20160216.mp3
/home/mk/POD/etc/JUNK 伊集院光 深夜の馬鹿力/files_20160202.mp3
/home/mk/POD/etc/JUNK 伊集院光 深夜の馬鹿力/files_20160209.mp3

また,~/POD/*.m3uとステプレイリストも作成されます.これは実行単位で作られるのかな?

$ ls -l ~/POD/*.m3u
-rw-rw-r-- 1 mk mk  946  2月 19 07:14 /home/mk/POD/New-2016-02-19.m3u
-rw-rw-r-- 1 mk mk 1924  2月 19 07:50 /home/mk/POD/New-2016-02-19.r2.m3u

うまく動作するようなら-sオプションを付けてcronに登録してあげると良さそうです.以下の例では毎時3分にpodgetを実行しています.

$ crontab -e
$ crontab -l | tail -2
# get podcast
3 * * * *       podget -s

podracerはPodcastを番組関係なく実行日のディレクトリに保存されてPodcast番組を探したりするのに不便でしたがpodgetだとカテゴリと番組でディレクトリが分かれるので便利です.
しばらく併用してみようと思います.

2月 05

configs moduleで/proc/config.gzを呼び出す

kernel buildしようと現在のconfigをコピーしようとしたところ/boot以下にも/proc/config.gzも見当たらない.こういう場合configsというモジュールを読み込むと/proc/config.gzが出来るらしい.

$ ls -l /proc/config.gz
ls: cannot access /proc/config.gz: No such file or directory
$ ls -la /boot/config-*
ls: cannot access /boot/config-*: No such file or directory
$ sudo modprobe configs
$ lsmod|grep configs
configs                30516  0
$ ls -l /proc/config.gz
-r--r--r-- 1 root root 29305 Feb  4 18:34 /proc/config.gz
$ zcat /proc/config.gz > /usr/src/linux/.config
$ sudo rmmod configs
$ ls -l /proc/config.gz
ls: cannot access /proc/config.gz: No such file or directory

これはRasbina jessieで遭遇しました.
Debian stretch amd64でも試してみたところmoduleがありませんでした.でも普通に/boot/config-x.x.xがあるので困らないです.

$ sudo modprobe configs
modprobe: FATAL: Module configs not found in directory /lib/modules/4.3.0-1-amd64

menuconfigではこの辺みたいです.

General setup
  [*] Kernel .config support
    [*]   Enable access to .config through /proc/config.gz[*]   Enable access to .config through /proc/config.gz
2月 04

雑なPadcastサーバを少しましにする

先日作ったPodcastサーバですがあれからずっと動かしていますが安定して動いているようです.雑さをましにするために少し修正しました.

プレイヤー部分はこんな感じで少し変わりました.

@reboot while true; do cvlc --ignore-config --extraintf=http --http-port=8081 --http-password='raspberry' ~/podcasts/todayspodcast.m3u --play-and-exit --norm-max-level=2.0 --sout='#transcode{acodec=mp3,ab=64,channels=1}:standard{access=http,mux=ts,dst=:8080}' ; done
40 * * * *      podracer ; cd ~/podcasts ; find . -mmin -1440 -type f -print0 | xargs -0n1 file | grep -i audio | cut -f1 -d: | xargs ls -1tr > ~/podcasts/todayspodcast.m3u
10 0 * * *  rm -rf ~/podcasts/`date --date '1 weeks ago' +\%F`
  • killせずに1周毎にVLCを呼ぶようにしてプレイリスト更新
  • Podcast取得を1時間に1度に変更
  • ボリュームのノーマライズ
  • ビットレートを64kにリアルタイムエンコーディング
  • プレイリストの作成も1時間に一度
  • プレイリストの順序を時間順にソート
  • プレイリストの内容はプレイリスト作成時から過去1日分(1440分)
  • 音泉の番組に対応(RSS化してpodracerに登録.簡単だけど公開すると怒られそうな気がする)

VLCのオプション

  • --ignore-config
    設定を読み込みません
  • --extraintf=http
    ウェブコントローラーを有効に
  • --http-port=8081
    ウェブコントローラーの待ち受けポートを8081番に
  • --http-password='raspberry'
    ウェブコントローラーの認証パスワードをraspberry
  • ~/podcasts/todayspodcast.m3u
    再生ファイル(プレイリストを指定)
  • --play-and-exit
    再生後終了する.これがないとプレイリストを再生後も起動しっぱなしになって次の周に入らない.(vlc://quitでも大丈夫だが,vlc://quitだとプレイリストにも表示される)
  • --norm-max-level=2.0
    ボリュームのノーマライズ.この値はもう少しいじったほうがいいかも?
  • --sout='#transcode{acodec=mp3,ab=64,channels=1}
    モノラル64kのmp3に変換している.Podcastを調べると殆どの番組が64kで一部40,96,128,160が混じっている.1日試したが32kでも大丈夫そう.
  • standard{access=http,mux=ts,dst=:8080}
    8080番ポートでHTTPライブストリーミング配信

VLCのオプションはmanにはあまり載ってなくて困っていたのですが,vlc -Hに大量のオプションが載っているのに気づいてからはかどりました.

$ vlc -h| tail -1
網羅的なヘルプを表示するためには、'-H'オプションを指定してください。
$ vlc -h | wc -l
372
$ vlc -H | wc -l
5674

その他細かいところで

  • 設置場所の変更
  • DNSに名前を登録して固定IPに(Androidでも名前でアクセス可能に)
  • 合わせてプレイリスト等のurlを名前に
  • hostnameの変更
  • sshd設定
  • iptable設定
  • OSの自動更新設定
  • watch dogの設定

といった辺りも設定しましたがこの辺は何時もの設定なので今回は省略.

と,こんな感じでだいたいやりたいことは出来たかなーという感じですが,VLCでなくMPD辺りで曲管理して再生,配信はまた別アプリでやったほうがいいような気もしてきました.VLCは1つで何でもできるしウェブコントローラーもあっていいのですが,MPDの方がリモート管理がしやすそうなので気が向いたらそっちも組むかもです.

今100円ショップのイヤホンを使って聞いているのでその部分が一番ストレスな感じです.