cd(change directory)コマンドの-(hyphen)オプションを今頃知る

以下の記事を読んで知ったのですが,

「さっきいた場所に戻る」の呪文を覚えておきたい。それは「cd -」だ。
画面のように、cdコマンドに引数として「-」のみを指定すると、直前にいたディレクトリに戻ることができる。

毎日何十回も叩いているであろうコマンドなのに知らなかったですorz

mk@x220:~$ cd usr/local/bin
mk@x220:~/usr/local/bin$ cd
mk@x220:~$ cd -
/home/mk/usr/local/bin
mk@x220:~/usr/local/bin$

なるほど確かに.
これは便利ですね.ちなみに同じようなことをするのにpushd/popdを使っていました.組み合わせて使っても大丈夫みたいですね.

mk@x220:~/usr/local/bin$ pushd /tmp
/tmp ~/usr/local/bin
mk@x220:/tmp$ cd
mk@x220:~$ cd -
/tmp
mk@x220:/tmp$ cd /
mk@x220:/$ popd
~/usr/local/bin
mk@x220:~/usr/local/bin$ cd

手元の環境でGNU bash 4.3.42, Zsh 5.2, DASH 0.5.8, BusyBox v1.22.1built-in shell (ash)で動作するのを確認しました.
#そしてpushd/popdDASH, ashに無いのを確認orz

しかしこういうの未だいっぱいあるんだろうなーorz




色温度を自動的に変更して健康に気を使う(ブルーライトカット)

backspace.fmでドリキンさんがf.luxがいいと言っているのを聞いて以前Linux環境でブルーライトカット系のアプリを少し試したのを思い出しました.

その時はdebianでf.luxは自分でリポジトリを登録するのが面倒でパッケージの用意されているgnome-shell-extension-redshiftredshiftを試してみたのでした.f.luxインスパイアらしいし.
これらはf.luxと同じようにネットワーク情報から位置情報を取得し,端末の場所の太陽の位置により色温度を変化させるアプリケーションです.夜は色温度を低くしてブルーライトを軽減させます.これによりブルーライトを睡眠前に受ける量が減って寝つきやすくなったり睡眠の質が良くなるかもという効果を期待しています.
しかし,gnome-shell-extension-redshiftはうまく有効にならず,redshiftは位置情報の取得に失敗して手動で動作させていたのでした.

今回もdebian環境でredshift-gtkを試してみました.これは実体はredshiftでタスクトレイに常駐するものです.一時的にon/offすることも簡単に出来るので便利です.

実行するとタスクトレイに電球と月のアイコンが表示されます.クリックすると以下のようなメーニューが.
20160211_06:02:18-13459

画像編集などで一時的に機能を切りたい場合などサスペンドする機能もあります.
20160211_06:02:31-13554

インフォメーションの表示.朝6時頃なので色温度がだんだん高くなっていくところです.
20160211_06:02:28-4511

設定ファイルの作成

規定値で動作させてもだいたい問題ないのですが,カスタマイズしたかったり位置情報が誤った場所のものになっている場合など設定を変更したくなることがあります.
redshiftをコマンドで実行する場合はオプションが指定できますが,redshift-gtkの場合は設定ファイルで指定可能です.
場所は~/.config/redshift.confです.;以降はコメントとして扱われるようです.

メインとなる[redshift]セクションの説明です.

  • temp-day : 昼間の色温度,規定値は5500
  • temp-night : 夜間の色温度,規定値は3700
  • transition : スムーズな遷移の無効有効の設定(0 or 1)
  • brightness-day : 昼間のブライトネス設定(0.1~1.0)
  • brightness-night : 夜間のブライトネス設定(0.1~1.0)
  • gamma : ガンマ値の設定(0.1~10.0)
  • adjustment-method : 調整方法の選択
$ redshift -m list
Available adjustment methods:
  drm
  randr
  vidmode
  dummy
 
Specify colon-separated options with `-m METHOD:OPTIONS'.
Try `-m METHOD:help' for help.
  • location-provider : ロケーションプロバイダの指定.listオプションで確認できます.現在はgeoclue2とmanualが選べるようです.
$ redshift -l list
Available location providers:
  geoclue2
  manual
 
Specify colon-separated options with`-l PROVIDER:OPTIONS'.
Try `-l PROVIDER:help' for help.

adjustment-methodを指定した場合それぞれのセクションでオプションを指定可能です.
内容は$ redshift -m randr:helpのようにメソッド名:helpで確認できます.

[redshift]
 :
adjustment-method=randr
 :
[randr]
screen=1

location-providermanualにした場合[manual]セクションで緯度経度を指定します.度.分のみで秒まで指定するとエラーとなります.
以下は鹿児島県の場合です.

[manual]
lat=31.33
lon=130.33

ということで今こんな感じで使っています.

; Global settings for redshift
[redshift]
; Set the day and night screen temperatures
temp-day=5700
temp-night=3600
; Enable/Disable a smooth transition between day and night
; 0 will cause a direct change from day to night screen temperature.
; 1 will gradually increase or decrease the screen temperature
transition=1
; Set the screen brightness. Default is 1.0
;brightness=0.9
; It is also possible to use different settings for day and night since version 1.8.
brightness-day=0.9
brightness-night=0.7
; Set the screen gamma (for all colors, or each color channel individually)
gamma=0.8
;gamma=0.8:0.7:0.8
; Set the location-provider: 'geoclue2', 'manual'
; type 'redshift -l list' to see possible values
; The location provider settings are in a different section.
location-provider=manual
 
; Set the adjustment-method: 'drm', 'randr', 'vidmode', 'dummy'
; type 'redshift -m list' to see all possible values
; The adjustment method settings are in a different section.
adjustment-method=randr
 
; Configuration of the adjustment-method
; type 'redshift -m METHOD:help' to see the settings
; ex: 'redshift -m randr:help'
; In this example, randr is configured to adjust screen 0.
; Note that the numbering starts from 0, so this is actually the second screen.
[randr]
screen=0
 
; Configuration of the location-provider:
; type 'redshift -l PROVIDER:help' to see the settings
; e.g. 'redshift -l manual:help'
[manual]
; kagoshima, japan
lat=31.33
lon=130.33

問題点?

redshiftを動かしているとブライトネスもこれで管理されます.手動で設定してもすぐにredshiftの設定に戻ります.バッテリー駆動中でブライトネスを下げてバッテリーの持ちを良くしようというような場合は困ります.とりあえずredshiftもブライトネスも手動設定して回避しています.

redshift-gtkを終了した状態で手動設定

$ redshift -O 3500
$ xrandr --output LVDS1 --brightness 0.3

それと夜ふかしさんのためにブルーライトカットの時間をずらす機能はないかなと思ったのですが見当たりませんでした.これは位置情報をmanualで設定して時差のある場所を設定するようにしたら実現できそうです.

Linuxで一部のパーティションの自動マウントを無効にする

Linuxで外付けHDDやUSBストレージなどを接続した時に一部のパーティションの自動マウントを無効にする方法です.

Gnomeで全てのメディアの自動マウントの切り替えをしたい場合は以下を参照して下さい.

対象パーティションの確認

対象のメディアをマウントした状態でblkidコマンドや/etc/mtabなどを参考に対象のUUIDを調べる

$ cat /etc/mtab
    :
/dev/mmcblk0p1 /media/mk/boot vfat rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro 0 0
/dev/mmcblk0p2 /media/mk/ec2aa3d2-eee7-454e-8260-d145df5ddcba ext4 rw,nosuid,nodev,relatime,data=ordered 0 0
$ sudo /sbin/blkid /dev/mmcblk0*
/dev/mmcblk0: PTUUID="ba2edfb9" PTTYPE="dos"
/dev/mmcblk0p1: SEC_TYPE="msdos" LABEL="boot" UUID="74BD-74CF" TYPE="vfat" PARTUUID="ba2edfb9-01"
/dev/mmcblk0p2: UUID="ec2aa3d2-eee7-454e-8260-d145df5ddcba" TYPE="ext4" PARTUUID="ba2edfb9-02"

ここでは

/dev/mmcblk0p1 -> 74BD-74CF
/dev/mmcblk0p2 -> ec2aa3d2-eee7-454e-8260-d145df5ddcba

GPartedなどを使うのもいいかもしれません.

20160211_05:02:10-12031

fatabの編集

/etc/fstabにnoautoオプション付きで記述します.対象パーティションをマウントした状態の/etc/mtabが参考になるでしょう.

UUID=74BD-74CF  /media/mk/pi-boot       vfat    noauto,rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=utf8,shortname=mixed,show
exec,utf8,flush,errors=remount-ro       0       0
UUID=ec2aa3d2-eee7-454e-8260-d145df5ddcba       /media/mk/pi-root       ext4    noauto,rw,nosuid,nodev,relatime,data=ordered   0       0

マウントしたい場合

手動でmountコマンドを実行したり,

$ sudo mount /media/mk/pi-root

Nautilus等で該当パーティションのアイコンをクリックしてマウントできます.

20160211_05:02:05-8216

ちょっと大げさですね.
root権の要らないもっとお手軽な方法がありそうな気がします.

Gnomeのメディア自動マウント切り替え

Gnome環境でUSBメモリなどのメディアを接続した際自動的にマウントしてほしくない場合の手順です.設定はdconfに書かれているので直接編集は出来ません.以下に説明するコマンドなどを利用して書き換えます.

書き換え対象は,
org.gnome.desktop.media-handlingの下のautomountです.
ここの値がtrueの場合自動マウントする, falseの場合自動マウントしないとなります.

dconfコマンド利用

現在の状況確認

$ dconf read /org/gnome/desktop/media-handling/automount
true

無効に設定する場合

$ dconf write /org/gnome/desktop/media-handling/automount false
$ dconf read /org/gnome/desktop/media-handling/automount
false

有効に設定する場合

$ dconf write /org/gnome/desktop/media-handling/automount true
$ dconf read /org/gnome/desktop/media-handling/automount
true

gsettingsコマンド利用

現在の状況確認(true->自動マウントする, false->自動マウントしない)

$ gsettings get org.gnome.desktop.media-handling automount
true

無効に設定する場合

$ gsettings set org.gnome.desktop.media-handling automount false
$ gsettings get org.gnome.desktop.media-handling automount
false

有効に設定する場合

$ gsettings set org.gnome.desktop.media-handling automount true
$ gsettings get org.gnome.desktop.media-handling automount
true

dconf-editor利用(GUI)

コマンドが面倒な場合はdconf-editorなどでGUIを使って変更も出来ます.

20160211_04:02:59-19728

コマンドで添付ファイル付きメールを送る2つの方法

Google+でmailコマンドで添付ファイル付きメールを送ろうとしている方の投稿のコメントにbase64でデコードして送るscriptを使ってますとか書いたのですが,これperl4でcgi全盛な大昔からやってる手法なので楽なものがあるのではと思い探してみました.

Debian stretch testingのs-nailを使う

Debian stretch testing/sid ではmailコマンドがbsd-mailxからs-nailに変わって添付ファイルオプションがあるようです.

 -a file     Attach the given file to the message.  The same filename conventions as described in the section COMMANDS apply: shell word expansion is
             restricted to the tilde ‘~’ and variables.  Shall file not be accessible but contain a ‘=’ character, then anything after the ‘=’ is assumed to
             specify the input character set and anything before ‘=’ the filename: this is the only option to specify the input character set (and don't per‐
             form any character set conversion) for text attachments from the command line, not using the ~@ tilde escape command.

こんな感じで使えました.

$ echo 'attach test(binary)' | mail -s "attach test mail" -a ./text.xz matoken@gmail.com

#はじめ.zipを送ろうとしてgmailサーバに弾かれました.そういえばそうだった……
##sendmail: 552 5.7.0 content and attachment content guidelines. xu1sm1469539pab.31 - gsmtp

普通にメール送るのに加えて-aオプションでファイルを指定する感じです.
オプションでSMTPサーバの指定も出来るようなのでMTAの設定をしていないような場合でも単体で使えそうです.

Debian jessieでbiabamを使う

s-nailはstretch testingからでjessieには入っていないようです.代わりに入っているのはbsd-mailxです.manをちょっと見た感じでは添付ファイルの扱いは載っていなさそう.でもきっと便利な何かがあるのでは?とapt-cache search mail attachとかして探してみるとbiabamというbash script製のものを発見.小さいし良さそうと試してみました.

biabam – bash attachment mailer

こんな感じで使えました.

$ sudo apt install biabam
$ echo 'attach test' | biabam ./test.xz -s "attach test from jessie" matoken@gmail.com

ちなみにmailコマンドで添付ファイルの方法を検索すると大抵mutt使う例が出てきますが,muttを既に設定済みの人でないと敷居が高いと思います.そういう場合に今回の方法はいいのではないかと思います.

しかし恐らく多国言語対応はして居なさそうなので日本語をSubjectやBODYに使う場合は素直にScriptを書いたほうがいいかもしれません…….
定形なら適当なMUAでメールのテンプレートファイルを作っておいて流し込んでmailコマンドに投げるようにしてもいいですね.




Tailsの導入にtails-installパッケージが便利

手元のUSBメモリに導入してあるTailsを最新にしようと思い立ちダウンロードしつつ導入ページを見てみると新しくなっていました.

これまではisoファイルを入手した後USBメモリその1に導入.その後USBメモリその1から起動したTailsから運用したいUSBメモリその2に導入する必要がありました.
(USBメモリその1はカスタマイズなどが出来なかったはず)

次のページがその方法の解説ページです.

しかし,DebianとUbuntu向けにインストーラが用意されていました.これを利用するとインストールのためのUSBメモリが必要なくisoファイルからUSBメモリに導入するだけでOKになっていました.

これは便利と早速試してみました.

Tailsの入手

次のページから入手出来ます.私はbittorrent経由で入手しました.ダウンロードの完了に1時間と少し掛かりました.

ダウンロードが済んだら署名確認をします.
公開鍵を持っていない場合はダウンロードページの下のTails signing keyという画像から入手してインポートします.

$ wget -qO - https://tails.boum.org/tails-signing.key | gpg --import /dev/stdin
gpg: 鍵58ACD84F: 公開鍵"Tails developers (offline long-term identity key) <tails@boum.org>"をインポートしました
gpg:           処理数の合計: 1
gpg:             インポート: 1  (RSA: 1)
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:  15  署名:  53  信用: 0-, 0q, 0n, 0m, 0f, 15u
gpg: 深さ: 1  有効性:  53  署名:  60  信用: 53-, 0q, 0n, 0m, 0f, 0u
gpg: 次回の信用データベース検査は、2016-02-19です

その後署名確認をします.

$ gpg --verify tails-i386-2.0.iso.sig
gpg: 署名されたデータが'tails-i386-2.0.iso'にあると想定します
gpg: 2016年01月26日 09時07分15秒 JSTにRSA鍵ID 752A3DB6で施された署名
gpg: "Tails developers (offline long-term identity key) <tails@boum.org>"からの正しい署名
gpg:                 別名"Tails developers <tails@boum.org>"
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガー・プリント: A490 D0F4 D311 A415 3E2B  B7CA DBB8 02B2 58AC D84F
副鍵フィンガー・プリント: BA2C 222F 44AC 00ED 9899  3893 98FE C6BC 752A 3DB6

tails-installerの導入

tails-installerパッケージを導入します.tails-installerパッケージはDebianではjessie-backports以降に用意されています.

jessieでbackportsを設定していない人は次のページを参考に設定して下さい.

今回はstretch(testing)なのでパッケージの導入だけです.

$ sudo apt install tails-installer

tails-installertails-installerを使ったTailsの導入

メニューからやコマンドラインからtails-installer-launcherを実行します.ちなみにawesome wm環境だと認証がうまく動かないようです.

<脱線>

以下のコマンドの実行に問題がありました: `/usr/bin/pkexec /usr/bin/syslinux  -d syslinux /dev/sdb1`。
詳細なエラーログは  '/tmp/tails-installer-ddjZmh' に書かれています。
Tails installation failed!
以下のコマンドの実行に問題がありました: `/usr/bin/pkexec /usr/bin/syslinux  -d syslinux /dev/sdb1`。
詳細なエラーログは  '/tmp/tails-installer-ddjZmh' に書かれています。

このログを見ると以下のようなエラーが記録されていました.syslinux実行時に/dev/ttyが見つからないと言っているようです.

/usr/bin/pkexec /usr/bin/syslinux  -d syslinux /dev/sdb1
Error creating textual authentication agent: Error opening current controlling terminal for the process (`/dev/tty'): No such device or address

端末から実行すると認証が走りました.多分上のエラーはこの認証を呼ぼうとしてどこに呼べばいいのか解らなかったんでしょうね.

$ LANG=C tails-installer-launcher
    :
==== AUTHENTICATING FOR org.freedesktop.policykit.exec ===
Authentication is needed to run `/usr/bin/syslinux' as the super user
Authenticating as: KenichiroMATOHARA,,, (mk)
Password:
==== AUTHENTICATION FAILED ===

しかし3回ほど試しましたがここの認証も正しいパスワードを入力しても失敗してしまうよう…….

</脱線>

とりあえずpolicykitのちゃんと動いているGnomeなどの環境では問題ない&policykitが動かない場合は`gksudo`経由で実行すればOKです.

$ gksudo tails-installer-launcher

InstallとUpgradeが選択できます.Installを選択した場合は新規インストールで既存のデータは消されるので注意が必要です.Upgradeを選択すると既に持っているTailsのメディアのアップグレードが出来ます.

20160209_05:02:03-18344

署名確認をしたisoファイルと導入先のデバイス(USBメモリ等)を指定してInstall Tailsを選択します.

20160209_05:02:22-18509

確認画面が出て,OKボタンを押すと初期化や展開が始まります.しばらく待ちましょう.

20160209_05:02:28-18561

以下の画面が表示されたら完了です.

20160209_06:02:51-24618

UNetbootin並にお手軽です.Debian/UbuntuとTailsを利用している方におすすめです :)
#そういえばUNetbootinはjessie以降から居なくなってる. > Debian Package Tracking System – unetbootin






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

雑な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円ショップのイヤホンを使って聞いているのでその部分が一番ストレスな感じです.

aptコマンドのedit-sourcesオプションが便利

Rasbianのパッケージサーバにjaistを指定していたのだけど最近遅いのでmirror listを見て

$ w3m -dump https://www.raspbian.org/RaspbianMirrors|grep -i japan -A1
Asia^*    Japan       JAIST                    (http|rsync)://ftp.jaist.ac.jp/pub/
                                               Linux/raspbian-archive/raspbian
--
Asia^*    Japan       WIDE Project Tsukuba NOC raspbian/raspbian/
                                               rsync://ftp.tsukuba.wide.ad.jp/
--
Asia^*    Japan       Yamagata University      http://ftp.yz.yamagata-u.ac.jp/pub/
                                               linux/raspbian/raspbian/

/etc/apt/sources.listをWIDEに変更した.

-deb http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian/ jessie main contrib non-free rpi
-deb-src http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian/ jessie main contrib non-free rpi
+deb http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/  jessie main contrib non-free rpi
+deb-src http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/  jessie main contrib non-free rpi

ところでaptコマンドのedit-sourcesオプションが便利なのでぜひ使うべき.visudoとかみたいに間違えると教えてくれる.

$ sudo apt edit-sources
E: Type 'eb' is not known on line 3 in source list /etc/apt/sources.list
Failed to parse /etc/apt/sources.list. Edit again?  [Y/n]

引数を付けて/etc/apt/sources.list.d/以下の編集も出来る

$ ls /etc/apt/sources.list.d/
google-chrome.list  gyazo_gyazo-for-linux.list  owncloud-client.list
$ sudo apt edit-sources owncloud-client

Debian jessie以降,Rasbian jessie以降,Ubuntu vivid(15.04)以降でそれぞれ利用可能だと思う.

apt (0.9.13.1) unstable; urgency=low
 
  [ Colin Watson ]
  * fix "apt-get  --purge build-dep" (closes: #720597)
  * fix regression that APT::Keep-Fds is not honored (closes: #730490)
 
  [ Michael Vogt ]
  * add "-f" option to "build-dep" as sbuild is using it to fix
    regression with cross-building (LP: #1255806)
  * add autopkgtest support for the integration testsuite
  * merge mvo/feature/short-list
  * merge mvo/feature/edit-sources
  * fix segfault in pkgDepCache::SetCandidateRelease() (closes: #709560)
  * reset terminal on error (closes: #730795)
  * fix apport report writing (LP: #1254499)
 
 -- Michael Vogt <mvo@debian.org>  Fri, 29 Nov 2013 20:50:17 +0100


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