Raspberry PiでNHKラジオを自動録音する

これはとっくにここにポストしていた気がするけど、実はまだだったのですね。
ここに来るまでけっこう苦労したので載せておきます。

基本的にはriocamposさんのこのページを参考にしました。違いは http://www.nhk.or.jp/radio/config/config_web.xml を毎回参照して、akamaihd.net のURLが変更されていても対応することです。

ではRubyスクリプト。読めばわかるので説明は略。

#!/usr/bin/env ruby
# Usage: record_nhk.rb [options] area station duration outdir

require ‘optparse’
require “rexml/document”
require “open-uri”

URL = “http://www.nhk.or.jp/radio/config/config_web.xml”

# MYAREA is one of the followings
# sapporo  
# sendai  
# tokyo  
# nagoya  
# osaka  
# hiroshima  
# matsuyama  
# fukuoka  

params = ARGV.getopts(nil, ‘title:’, ‘artist:’, ‘album:’)

myarea = ARGV[0]
station = ARGV[1]
duration = ARGV[2]
outdir = ARGV[3]

xml = open(URL).read
doc = REXML::Document.new(xml)

radiru_config =  nil
doc.each do |e|
 if e.kind_of?(REXML::Element) and e.name == “radiru_config”
   radiru_config = e
   break
 end
end

stream_url= radiru_config.elements[‘stream_url’]

area = nil
stream_url.each do |data|
 if data.kind_of?(REXML::Element)
   if data.elements[‘area’].text == myarea
     area = data
     break
   end
 end
end

case station
when ‘r1’
 surl = area.elements[‘r1hls’].text
when ‘r2’
 surl = area.elements[‘r2hls’].text
when ‘fm’
 surl = area.elements[‘fmhls’].text
else
 surl = area.elements[‘fmhls’].text
end

now = Time.now.to_s.sub(/(\d\d\d\d-\d\d-\d\d)\s+(\d\d:\d\d):\d\d.*$/){ $1 + ‘_’ + $2.sub(/
:/, ‘-‘) }

meta = “”

if params[‘title’]
 meta += ” -metadata title=\”” + params[‘title’] + “\””
end

if params[‘artist’]
 meta += ” -metadata artist=\”” + params[‘artist’] + “\””
end

if params[‘album’]
 meta += ” -metadata album=\”” + params[‘album’] + “\””
end

ffmpeg_cmd = sprintf(“ffmpeg -t %s -i %s %s -write_xing 0 %s/%s.mp3”, duration, surl, meta
, outdir, now)

system(ffmpeg_cmd)

使いかたはcronでこんな感じです。趣味がわかってしまう…
sleep 30は遅延を考慮してですが、もっと多いほうがいいかも。

05 16 * * 0     sleep 30;/home/pi/NHK/record_nhk.rb –artist “DJ日本史” –album “トーク” tokyo r1 00:50:00 /disk/Music/Radio/NHK-R1/DJ  
30 19 * * 1-5   sleep 30;/home/pi/NHK/record_nhk.rb –artist “ベスト・オブ・クラシック” –album “クラシック” tokyo fm 01:40:00 /disk/Music/Radio/NHK-FM/Classic
15 21 * * 1-5   sleep 30;/home/pi/NHK/record_nhk.rb –artist “青春アドベンチャー” –album “ラジオドラマ” tokyo fm 00:15:00 /disk/Music/Radio/NHK-FM/Adventure
00 22 * * 6     sleep 30;/home/pi/NHK/record_nhk.rb –artist “FMシアター” –album “ラジオドラマ” tokyo fm 01:00:00 /disk/Music/Radio/NHK-FM/Theatre
05 10 * * 6     sleep 30;/home/pi/NHK/record_nhk.rb –artist “真打ち競演” –album “落語” tokyo r1 00:50:00 /disk/Music/Radio/NHK-R1/Sin-uti
20 19 * * 0     sleep 30;/home/pi/NHK/record_nhk.rb –artist “新日曜名作座” –album “ラジオドラマ” tokyo r1 00:30:00 /disk/Music/Radio/NHK-R1/Meisaku
30 10 * * 1-3   sleep 30;/home/pi/NHK/record_nhk.rb –artist “遠山顕の英会話楽習” –album “英語” tokyo r2 00:15:00 /disk/Music/Radio/NHK-R2/Rakushuu

Chromium-browserがパスワードを覚えてくれない

タイトルのとおりの症状です。Ubuntu 20.04。
「パスワードを保存できるようにする」も「自動ログイン」も有効にしていて「保存するか?」にYesと答えても、次回のログインでパスワードをひっぱってきてくれない。

ここを参考に ~/.config/chromium/Default/Login\ Data* を消してブラウザをリスタートしたら直りました。

BUFFALO WI-U2-433DHP をUbuntu 20.04で使う

最近家の二階ではやけにネットが遅いことに気付き、調べると光なのに2Mbit/sとかしか出てない。タブレットでは数十Mbit/s出てるので何でかと思ったら、後者は11aでつながってるのに前者は11g。今まで気付かなかったけど、デスクトップで使ってるUSB子機は11aに対応してなかったのでした。これまでSSIDは見えるのに何でつながらないだろうと思ってたけど、つながるわけないじゃん。WiFiルータから遠い二階なら11gのほうが良さそうなんだけど、めんどくさいので追求しません。

しょうがないので、11aをサポートしてるやつでLinuxでの実績があるのを探すとBuffaloのWI-U2-433DHPがあったので早速購入。しかし、実績を調べたページのようにやってもだめ。dmesgで見ると、モジュールを読み込んだ時点でエラーになってる。エラーメッセージを元に探すとこんなページがあり、どうもカーネルを5.6.4.2以降にしなければだめらしい。

そこでカーネルを管理するツールを探し、ここのmainlineというのを入れて、カーネルを5.6.19に上げました。

しかし、これでも同じようなエラーが出る。ここでちょっとメゲましたが、最初のページで紹介されていた https://github.com/zebulon2/rtl8812au ではなく、https://github.com/gnab/rtl8812au のほうからモジュール持ってきたらなぜかうまく行きました。

スマホとラズパイとWiFiルータ

また間があいてしまいました。

ADSLを解約してから、モバイルルータを家の中でも使っていたのだけど、やはり遅いし、どうにも使いにくい。あきらめて光にしたけど、今は混んでる時期なのか、工事は随分先に。そこでこれまでの家の中のWiFi環境をそのままに、ADSLモデムのかわりにスマホをつなぐことにします。これで他の機器は何も変更なしでいいので。構成は

スマホ—-(USB接続)—-Raspberry Pi3—-(Ethernet接続)—-Buffalo WiFiルータ

という感じです。もちろんスマホでUSBテザリングします。

すなおにスマホがusb0として認識されていればいいのですが、されてない場合は以下をやってみましょう。

$ sudo ifconfig usb0 up
$ sudo dhcpcd usb0

それで以下のようにIPが振られていてインターネットに接続できればOK。

$ ifconfig usb0
usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.42.116  netmask 255.255.255.0  broadcast 192.168.42.255

次にルータにつなぐeth0を設定しますが、めんどくさいので固定IPにします。/etc/dhcpcd.conf でこんな感じに。

interface eth0
static ip_address=192.168.0.10/24
static domain_name_servers=127.0.0.1

一方BuffaloのWiFiルータのインターネット側の設定も固定IPにして、

IPアドレス 192.168.0.2
デフォルトゲートウェイ 192.168.0.10
DNS(プライマリー) 192.168.0.10

などとします。

あとはforwardの設定をしておしまい。

動的には sysctl -w net.ipv4.ip_forward=1 で、パーマネントには
/etc/sysctl.conf で
net.ipv4.ip_forward=1
にします。そしてiptablesで以下のように。

sudo iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE
sudo iptables -A FORWARD -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o usb0 -j ACCEPT

参考にしたのは以下です。

https://superuser.com/questions/1505796/4g-lte-device-usb-tethering-raspberry-pi-ethernet-router-is-this-poss

ownCloudのセキュリティ&セットアップ警告

ownCloudの管理→一般に行くとこんな警告が出ます。

セキュリティ&セットアップ警告

  • トランザクションによるファイルのロックは、既定の低速データベースによるロックではなく、メモリベースによるロックを使用するように構成する必要があります。詳細については、ドキュメント↗ を参照してください。
  • HTTP ヘッダ の “Strict-Transport-Security” が少なくとも “15552000” 秒に設定されていません。 セキュリティを強化するため、セキュリティTipsを参照して、HSTS を有効にすることをおすすめします。
  • メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、を参照してください。

インストールガイド ↗をもう一度チェックして、ログ にあるエラーまたは警告について確認してください。

しかし、何をどうしろってのがよくわからないので調べました。

最初のトランザクションによるファイルのロックはマニュアルによると、 If your ownCloud server still has the File Locking app, you must visit your Apps page to verify that it is disabled; the File Locking app and Transactional File Locking cannot both operate at the same time. ということだけど、Appsに行ってもそんなもんはない。結局三つめのメモリキャッシュを設定したらなおりました。

二つめのStrict-Transport-Securityに関しては、https://doc.owncloud.com/server/10.4/admin_manual/configuration/server/harden_server.html#enable-http-strict-transport-security に従い、/etc/apache2/sites-enabled/default-ssl.conf の最後のほうに

       <IfModule mod_headers.c>
               Header always set Strict-Transport-Security “max-age=15552000; includeSubDomains”
       </IfModule>
       </VirtualHost>
</IfModule>

としてからapache2をリスタートして解決。

みっつめはとても苦労しました。PHP7.1とPHP7.3が混在してたこともややこしくしてたけど、とりあえずやったことを列挙しておきます。たぶん必要ないことも含め。基本のマニュアルは https://doc.owncloud.org/server/10.4/admin_manual/configuration/server/caching_configuration.html#memcached です。

sudo apt install php-apcu redis-server redis
sudo phpenmod apcu
sudo phpenmod redis
sudo systemctl restart apache2

ここで
sudo -u www-data php /var/www/owncloud/occ integrity:check-core
として何もエラーが出なければOK。あとは /var/www/owncloud/config/config.php の最後に

 ‘memcache.local’ => ‘\OC\Memcache\APCu’,
 ‘memcache.locking’ => ‘\OC\Memcache\Redis’,
 ‘redis’ => [
   ‘host’ => ‘localhost’,
   ‘port’ => 6379,
 ],

と追加しておけばいいです。そして再度apache2をリスタート。

nautilusのゴミ箱

nautilusで間違えて数十GBのフォルダをゴミ箱に入れてしまいました。

あわてて「ゴミ箱から元に戻す」をクリックしても、フォルダがでかすぎるせいかnautilusはフリーズ状態に。

元々ゴミ箱なんかほとんど使ってなかったので知らなかったけど、なんとなく
~/.Trash あたりに移動されただけだろと思ってたらみつからず。

findでちゃんと探すと

~/.local/share/Trash/files

なんてところにありました。ここから単に元の場所にmvして解決。ゴミ箱なんていらん気が。

minidlnaが立ち上がらない

さて、BuffaloのWiFiルータのメディア・サーバが使えなくなったので、以前使っていたRaspberry Piのminidlnaを有効にします。しかし、ステータスがexitedになって上がらない。ログにも何にも出ず。

いったん dpkg -r minidlna して入れなおすと、今度はログに

[2020/05/29 18:02:00] minidlna.c:355: warn: Creating new database at /var/cache/minidlna/files.db
[2020/05/29 18:02:01] minidlna.c:367: fatal: Failed to clean old file cache!  Exiting…

などと出ます。そこで思いついて /var/cache/minidlna の下を全部消すと動くようになりました。

ownCloudの更新とSamba外付けストレージ(結局失敗)

また日が開いてしまいました。

ownCloudのデータのディスクを移動したく、ついでにRaspberry PiでownCloudを10.2から10.4に上げてみると、PHPが7.0じゃだめで7.1が要るという。Raspbian GNU/Linux 10じゃ7.1はないんですよ。こんなのちゃんとdependencyで見てほしいぞ。

しょうがないので、https://raspberrypi.stackexchange.com/questions/70388/how-to-install-php-7-1/70394 を参考に

In /etc/apt/sources.list change stretch to buster, which is the next-stable/testing repository.
Update System sudo apt-get update && sudo apt-get upgrade
Remove previous PHP sudo apt-get remove ‘^php.*’
Install PHP 7.1 sudo apt-get install php7.1-fpm php7.1-cli or sudo apt-get install php7.1

で上げます。ownCloudのデータベースを移動するのは前はなぜかうまく行かなかったので、スクラッチから作って、現状のデータをアップするつもり。そこで /var/www/owncloud/config/config.php を消して最初からやりなおすと…

なんでこんなにいろいろ言われるんだろ?

すこしぐぐって
sudo systemctl reload apache2
とやると少し減ったけど、まだ本当にいろいろ足りないらしい。

sudo apt install php7.1-zip php7.1-sqlite3 php7.1-xml php7.1-intl  php7.1-mbstring php7.1-gd php7.1-curl
と入れたあと、reloadじゃだめな場合もあるので
sudo systemctl restart apache2
とします。

しかし、

と言われますたしかに今まではSQLiteだったけど、そこまで言われちゃしょうがない

sudo apt install php7.1-mysql

してから

sudo mysql
で入ったあと
CREATE DATABASE owncloud;
GRANT ALL PRIVILEGES ON owncloud.* TO ‘owncloud’@’localhost’ identified by ‘xxxxxxxxx’;
などとしておきます

さて、最近のownCloudから入ったらしい、Sambaを外部ストレージに指定するのを試します。BuffaloのWiFiルータのUSBにSSDを挿して簡易NASにしているのです。

そうすると、トップ階層に「SMB」として見えます。

だがしかし、まだ終わらない。UbuntuのownCloudクライアントがすぐ落ちるんですよ。syslogには以下のメッセージが

kernel: [119581.377081] traps: owncloud[2942] general protectio
n ip:7f490f66f436 sp:7ffed9a6b7e0 error:0 in libowncloudsync.so.2.4.1[7f490f5de000+119
000]

しょうがないので
/etc/apt/sources.list.d に

deb http://download.owncloud.org/download/repositories/10.2.1/Ubuntu_18.04/ /

の内容で owncloud.list を入れてowncloudを最新にしてみたもののダメ

結局Ubuntuを18.04から20.04に上げたら解決しました。元々上げるつもりだったからいいけどさ。

★★★★★★★★★★★★★★★★

けれどけれど、なんかSambaのディスクに上げようとすると、めっちゃ遅くてタイムアウトが続出。

結局Sambaはあきらめ、Raspberry PiにSDDをつなぎ直し、それをownCloudのデータ領域にしました。

BuffaloのWiFiルータにはメディアサーバ機能があって便利だったのだけど、また昔のようにRaspberry Piにminidlnaを入れて音楽サーバにしました。ここでもトラブルがあったのでまた別の項で。

unzipすると日本語が化ける

どこかから持ってきた.zipのファイルをunzipすると、ファイル名やディレクトリ名が化け化けしてびっくりということはけっこうあります。

たぶん元がUTF以外でエンコーディングされてます。unzipに「-O sjis」あるいは「-O euc」のオプションを付ければよろしい(sjisでもeucでも、どっちでも化けが直ることもあるので謎なのだけど)。でもUbuntuではこれで行けるけど、MacOSではこのオプションは使えないらしいです。

出典はここです。

Raspberry Piでeth0が見えなくなる

また随分間が空いてしまいました。

ラズパイをいじってて、apt-get upgradeしたあとrebootしたら、sshで入れない。

泣く泣くモニタとキーボードをつないで調べると、eth0がないじゃない(有線でつないでます)。

dmesgで調べたら、なんかeth0をリネームしたよ、などと出てくる。なんて余計なことしてくれるんだい。いろいろぐぐってみるとraspi-configで

Network interface names Enable/Disable predictable network interface names

をdisableすると良いとあったので半信半疑でやったら直りました。predictableってのはMACアドレスを使った名前になるようです。こんなの有効にした覚えないんだけどな。upgradeで勝手になったのだろうか。だとしたら迷惑な話だ。

このあたりに事情が載ってます。