SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|

2016-09-27(Tue) 15年ぶりのアードベック

  画像の説明


2016-09-25(Sun) スプラトゥーン甲子園、東海地区大会、観戦


2016-09-22(Thu) ラズベリーパイ(pidora)でLED照明をPWM制御

  画像の説明


2016-09-17(Sat) ラズベリーパイ3B(Raspbian)で電子工作を始める

  先日、PICマイコンの開発環境を整えたことだし、ラズベリーパイ側をイジり始める。現在、ウチにはラズベリーパイが4台(A, B,B+, 3B)あるが、B+は無線アクセスポイント、Bは無線コンバータとして、実用に供しているので、3Bで開発を行う。なお、3BのNOOBSではpidoraが選べなかったので、Raspbianが入っているが、まぁ、開発する限りでは似たようなもんだろう。

  自作してもよかったが、面倒くさいので秋月で買っておいた、ブレッドボード用の変換コネクタをセットして開発開始。

  画像の説明

  まずは、定番のLEDの点灯。GPIOの状態を確認するため、まずはgpioコマンドを一発。

user@raspberrypi:~ $ gpio readall
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |★
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+

  適当なポートを出力モードに切り替える。

user@raspberrypi:~ $ gpio -g mode 25 out
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | OUT  | GPIO. 6 | 6   | 25  |

  あとは、ポートの電圧を上げ下げするだけ。

user@raspberrypi:~ $ gpio -g write 25 1
user@raspberrypi:~ $ gpio -g write 25 0

  シェルスクリプトでLEDを点滅。こりゃ、お手軽じゃ。

user@raspberrypi:~ $ while true; do gpio -g write 25 1; sleep 0.5; gpio -g write 25 0; sleep 1; done

  次はシリアルポート、なのだが、どうもPi3からBluetoothとの兼ね合いで扱いが厄介らしい。とりあえず、GPIOの14番をシリアル送信モードに切り替えてみた。

root@raspberrypi:~# gpio -g mode 14 ALT0 
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |

  でもってraspi-configでシリアルを有効にしてみた。

root@raspberrypi:~# raspi-config 
9 Advanced Options
A7 Serial
<いいえ>
<了解>

  この作業は、結局、以下の記述と等価らしい。

root@raspberrypi:/boot# diff config.txt.org config.txt
> enable_uart=0
root@raspberrypi:/boot# diff cmdline.txt.org cmdline.txt
< dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
> dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

  再起動して「echo 'aaa' > /dev/ttyAMA0」してみたが、bashが100%になってプロセスストール。通信速度を変えてみる。

root@raspberrypi:~# stty speed 115200 < /dev/ttyAMA0 
115200
root@raspberrypi:~# stty -g < /dev/ttyAMA0 
0:4:1cb2:a30:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

  更に謎の設定を追加してみる。

root@raspberrypi:/boot# diff config.txt.org config.txt
59a60,61
> enable_uart=0
> dtoverlay=pi3-miniuart-bt

  再起動すると、/dev/ttyS0が現れた。「echo 'aaa' > /dev/ttyS0」してみたが、プロセスストールはしなくなったものの、出ない。

  config.txtを「enable_uart=1」を変更してみる。

root@raspberrypi:/boot# diff config.txt.org config.txt
> enable_uart=1
> dtoverlay=pi3-miniuart-bt

  再起動して「echo 'aaa' > /dev/ttyAMA0」すると、なにやらシリアルに反応が得られた。通信速度を合わせてやったところ、いつもの自作のserialDebugスクリプトによる受信に成功した。

  とりあえず、PICの学習リモコンでも操作できるようにしてみるかな。


2016-09-12(Mon) Fedora24でsdccしてrakipicする

  先日、主たる環境をFedora24に移行したのだが、早々にPICマイコンを使って電子工作をする用事が出てきて、開発環境を整えることに。

  基本、オイラはフリーのCコンパイラであるsdccを愛用しているので、Fedoraの標準リポジトリから導入すればいいのだが、Fedoraはフリーソフト原理主義なので、非フリーのライブラリやインクルードファイルが故意に外されていて、毎度ややこしい作業が必要になるのが面倒くさい。また、バージョンが上がるとコンパイラの仕様もチョイチョイ変わるので、それでコンパイルが通らなくなって悩まされることも多い……って、いわんこっちゃない。いってるそばから両方とも引っかかったワイ。

  まずは、非フリーのライブラリやインクルードファイル関係。sdccのソースを持ってきて、ライブラリをコンパイルして、適切な場所にコピー……とかしようとしたが、以前のMINTと環境と様子が変わっていて何やらよくわからん。結局、非フリー除外のスイッチを外し、パッケージを丸ごと再ビルドするのが正解みたいだ。手順で言うと以下。これで、サクッとmakeが通るようになった。

# dnf install gputils
# dnf download --source sdcc
# rpm -ivh sdcc-3.6.0-2.fc24.src.rpm 
 
# vi rpmbuild/SPECS/sdcc.spec 
< %configure --enable-doc --disable-non-free STRIP=: ${OPTS}
> %configure --enable-doc STRIP=: ${OPTS}
 
# dnf install rpm-build
# dnf install python bison boost-devel flex latex2html lyx texlive-ulem texinfo
# dnf install gcc-c++
# rpmbuild -ba rpmbuild/SPECS/sdcc.spec 
 
# rpm -ivh rpmbuild/RPMS/x86_64/sdcc-3.6.0-2.fc24.x86_64.rpm

  次に、コンパイラの仕様もチョイチョイ変わる関係。PIC18系のコンフィグ指定のスタイルが変更されている。

< static __code char __at (__CONFIG1H) configword1h =
<   _IESO_OFF_1H &                  // Oscillator Switchover mode disabled
<   _FCMEN_OFF_1H &                 // Fail-Safe Clock Monitor disabled
<   _OSC_INTIO67_1H;                // Internal oscillator block, port function on RA6 and RA7
 
> #pragma config IESO   = OFF       // Oscillator Switchover mode disabled
> #pragma config FCMEN  = OFF       // Fail-Safe Clock Monitor disabled
> #pragma config OSC    = INTIO67   // Internal oscillator block, port function on RA6 and RA7

  最後に、自製のLinux用の秋月PICライタ「rakipic」もチョイチョイと修正。今回は、PIC16F688で赤外線リモコン信号の送信を行いたいので、ライブラリとサンプルプログラムも更新した。パッケージを置いておく。


2016-09-08(Thu) RubyGems環境をなんとかする

  個人的にCUI好きなのだが、GUIが必要な時もある。そんな時はcursesだ。リモートコンソール上でセミGUIが使える。作るのもラクだし、動作も軽快。てなわけで、これまで、これやら、これやら、これやらを作って、実用に供している。

  んが、いつしかRubyの標準添付ライブラリにcursesが含まれなくなってしまった。Fedoraのrubygem-xxxシリーズでの提供もない。別途、RubyGemsで入れろ、ということらしい。むぅ。

  ところが、たまにしかやらないし、ちょくちょくディストリの仕様側が変わるので、いつも試行錯誤になってしまう。そこで、現時点において、うまいことRubyGemsの環境を構築できた方法を「考え方つきで」メモしておくことにした。目的は「gem install curses」を成功させること。今回はFedora24で実行している。

  うおりゃ。

[root@xxx ~]# gem install curses
-bash: gem: command not found

  gemが入ってない。

[root@xxx ~]# dnf install rubygems

  うおりゃ。

[root@xxx ~]# gem install curses
……沈黙

  proxyの設定がない。

[root@xxx ~]# export http_proxy=http://proxy.example.com:8080/
[root@xxx ~]# export https_proxy=http://proxy.example.com:8080/

  うおりゃ。

[root@xxx ~]# gem install curses
Fetching: curses-1.0.2.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-3344-15aufht.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/include/ruby.h ★
 
extconf failed, exit code 1
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  ruby.hがない。

[root@xxx ~]# dnf install ruby-devel

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-3373-17xujbr.rb extconf.rb
checking for tgetent() in -ltinfo... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
 
Provided configuration options:
<略>
/usr/share/ruby/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first. ★
	from /usr/share/ruby/mkmf.rb:541:in `try_link0'
<略>
	from extconf.rb:29:in `<main>'
 
To see why this extension failed to compile, please check the mkmf.log which can be found here:
 
  /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log
 
extconf failed, exit code 1
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  development tools、要するにgccが入ってない。

[root@xxx ~]# dnf install gcc

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-3509-162u4n0.rb extconf.rb
checking for tgetent() in -ltinfo... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
 
Provided configuration options:
<略>
/usr/share/ruby/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
	from /usr/share/ruby/mkmf.rb:541:in `try_link0'
<略>
	from extconf.rb:29:in `<main>'
 
To see why this extension failed to compile, please check the mkmf.log which can be found here:
 
  /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log ★
 
extconf failed, exit code 1
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  ログを見てみる。

[root@xxx ~]# cat /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log
"gcc -o conftest -I/usr/include -I/usr/include/ruby/backward -I/usr/include -I.    -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -mtune=generic -fPIC conftest.c  -L. -L/usr/lib64 -L. -Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -fstack-protector -rdynamic -Wl,-export-dynamic  -m64   -lruby  -lpthread -ldl -lcrypt -lm   -lc"
gcc: error: /usr/lib/rpm/redhat/redhat-hardened-cc1: No such file or directory ★
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */

  /usr/lib/rpm/redhat/redhat-hardened-cc1がない。どのパッケージに入っているかわからないので調べる。

[root@xxx ~]# dnf provides /usr/lib/rpm/redhat/redhat-hardened-cc1
redhat-rpm-config-40-2.fc24.noarch : Red Hat specific rpm configuration files ★
Repo        : fedora
 
redhat-rpm-config-41-2.fc24.noarch : Red Hat specific rpm configuration files ★
Repo        : updates

  redhat-rpm-configパッケージということなので入れる。

[root@xxx ~]# dnf install redhat-rpm-config

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-3658-cnj5ie.rb extconf.rb
checking for tgetent() in -ltinfo... no
checking for tgetent() in -ltermcap... no
checking for ncurses.h... no
checking for ncurses/curses.h... no
checking for ncursesw/curses.h... no
checking for curses_colr/curses.h... no
checking for curses.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
 
Provided configuration options:
<略>
 
To see why this extension failed to compile, please check the mkmf.log which can be found here:
 
  /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log ★
 
extconf failed, exit code 1
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  ログを見てみる。

[root@xxx ~]# cat /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log
 :
 :
have_header: checking for curses.h... -------------------- no
 
"gcc -E -I/usr/include -I/usr/include/ruby/backward -I/usr/include -I.    -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -mtune=generic -fPIC  conftest.c -o conftest.i"
conftest.c:3:20: fatal error: curses.h: No such file or directory
 #include <curses.h>
                    ^
compilation terminated.
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <curses.h>
/* end */
 
--------------------

  curses.hがない。これはcursesの開発パッケージに入っている。

[root@xxx ~]# dnf install ncurses-devel

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-4359-1h9o77p.rb extconf.rb
checking for tgetent() in -ltinfo... yes
checking for ncurses.h... yes
checking for initscr() in -lncursesw... yes
header: ncurses.h
library: ncursesw
<略>
checking for function curses_version in ncurses.h... yes
checking for variable curses_version in ncurses.h... no
creating Makefile
 
To see why this extension failed to compile, please check the mkmf.log which can be found here:
 
  /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log
 
current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
make "DESTDIR=" clean
sh: make: command not found ★
 
current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
make "DESTDIR="
sh: make: command not found ★
 
make failed, exit code 127
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  makeが入っていない。

[root@xxx ~]# dnf install make

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
Successfully installed curses-1.0.2
Parsing documentation for curses-1.0.2
Installing ri documentation for curses-1.0.2
Done installing documentation for curses after 1 seconds
1 gem installed

  というわけで「gem install curses」に成功ッ!

  画像の説明

  cccdct復活!


2016-09-04(Sun) ラズベリーパイ(pidora)でメディアサーバする、そして心地良い目覚めへ

  ラズベリーパイで無線LANアクセスポイントを作り、ラズベリーパイで無線LANブリッジを作ったことにより、愛用のミニコンポ「DENONのRCD-N9」を正しく宅内LANに「有線」で接続することができた。こんな感じに。

  インターネット─[モデム]─宅内LAN─[無線アクセスポイント(ブリッジ)]…無線LAN…[無線ブリッジ(コンバータ)]─直結LAN─[ミニコンポ]

  このような構成にした動機は、RCD-N9の無線LAN接続機能が「どタコ」なことにある。無線経由でflac等を再生中、他の無線トラフィックが増えると、接続が切断され、音楽が切れるのだ。切れると、再接続まで時間がかかるし、曲の再生は最初からになってしまう。それが頻繁に発生する。

  実に「音楽が途切れる」という事態に対しては、恐ろしく高いレベルの腹立たしさを感じさせられるものである。仮にも高品質な音楽の再生を謳う機器においては「極力避けるべき事態」ではないのか。無線LANは不安定だから仕方ない、などということは断じてない。TCPという仕組み上、再生が止まることはあっても切れることはあり得ない。実際、動画サイトで切れるなどという事態に遭遇したことはないはずだ。

  ちょっとtcpdumpでパケットの様子を調べた限りでは、RCD-N9側のTCPスイートに問題があるようで、その点ではRCD-N9は疑うことのない超ド級のクッソプロダクトなのだが、それ以外の点は十分に及第点なので、その点はあきらめて、ラズベリーパイを噛ますことでフォローすることにしたのである。

  具体的にはどうするかというと、上述の通りRCD-N9とラズベリーパイ間を有線LANで直結とし、通信の安定性の低い無線LANの通信をLinuxのNFS接続で保障してやるのである。つまりラズベリーパイ上にDLNAサーバを配置するのである。

  NFSについては、サーバ側で公開の設定をしておいて、

server.itline.jp:/root # cat /etc/exports
/home/mediatomb 172.xx.xx.0/24(ro)

  ラズベリーパイ側でマウントするだけ。

xxxpi.itline.jp: /root # yum install nfs-utils
xxxpi.itline.jp: /root # mkdir /mnt/mediatomb
xxxpi.itline.jp: /root # mount server:/home/mediatomb /mnt/mediatomb/

  実用上は、起動時に自動マウントするよう、/etc/fstabに以下のエントリを加えておくことになる。

xxxpi.itline.jp: /root # cat /etc/fstab
server:/home/mrdiatomb  /mnt/mediatomb  nfs  defaults  0 0

  NFSマウントができたら、DLNAサーバであるMediaTombを導入する。作業はこれだけ。

xxxpi.itline.jp: /root # yum install mediatomb
xxxpi.itline.jp: /root # cd /etc
xxxpi.itline.jp: /etc # diff mediatomb.conf.org mediatomb.conf
< MT_INTERFACE="NOT_SET"
> MT_INTERFACE="br0"
xxxpi.itline.jp: /etc # cd mediatomb
xxxpi.itline.jp: /etc/mediatomb # diff config.xml.org config.xml
<     <name>MediaTomb</name>
>     <name>MediaTomb - xxxpi</name>
xxxpi.itline.jp: /etc/mediatomb # systemctl enable mediatomb
xxxpi.itline.jp: /etc/mediatomb # systemctl start mediatomb

  この後http://xxxpi:50500/にWebアクセスして、/mnt/mediatombのディレクトリを登録してやれば、RCD-N9のMUSIC SERVER機能で、flacファイル等を選択、曲を再生できるようになる。これにて、ハイパーミッドナイトサーバ(オイラは寝しなに音楽を聴くので)の完成である。

  だが、今回はまだ続く。

  オイラは起き抜けにも音楽を聴くのだが、それにRCD-N9のアラーム機能を使っている。開始時刻を6:00に設定、入力ソースにはCDを選択、寝る前に好みのCDをトレイにセットする。そして6:40頃に気分よく起き出すのだ。

  ところが問題がある。CDのセットが面倒くさい。毎日のアラームをセットすると休みの日にも流れてしまう(気づかないが)。CDの長さによって、起き出す時刻に曲が終わってしまったりする。

  仕方ないといえば、仕方ないが、そこをサッサとあきらめたりしないのがエンジニアである。インターネットラジオ機能で、自分専用に曲をストリーミング配信することで、上記をまとめて解決してしまうのである。おそらく、インターネットラジオ配信において、最短配信距離記録ギネス更新(直線距離10cm以下)という偉業達成の瞬間ではないかと思う。

  ストリーミング配信のアプリにはicecastを使う。例によって、ググると大量のサイトが引っかかるのだが、手順は書いてあるものの、その意図がよくわからない。どうも、こういうことのようだ。

  icecastは、フロントエンドサービスを行うアプリ。ウェブサーバとして振る舞い、インターネットラジオ聴取クライアントに曲を配信する。が、自らは曲を扱わず、インターネットラジオ配信クライアント(?)から曲の提供を受ける。

  icesは、インターネットラジオ配信クライアント。icecastにアクセスし、icecastが配信する曲を提供する。んが、icesはバージョン2からOggVorbis形式の配信しか対応していないようで、mp3形式では配信できない。古いicesはできるようだが、そんなものを使うべきではないだろう。

  ezstreamは、icesと同じく、インターネットラジオ配信クライアント。icecastにアクセスし、icecastが配信する曲を提供する。こっちはmp3形式での配信に対応している。

  上記はどれも、Icecastスイートとしてxiphという開発コミュニティで扱っているようで、ここはOggVorbisやflacの開発主体でもあるようだ。

  配信形式によって、アプリの使い分けが必要なことや、配信形式が特定の形式に限定されている意味がよくわからんが、なにせflacでの配信はできず、RCD-N9も対応していないので、mp3形式での配信が妥協点である。

  というわけで、icecastの導入、設定である。

xxxpi.itline.jp: /root # yum install icecast ezstream
xxxpi.itline.jp: /root # cd /etc
xxxpi.itline.jp: /etc # diff icecast.xml.org icecast.xml
<         <bind-address>127.0.0.1</bind-address>
>         <bind-address>0.0.0.0</bind-address>
xxxpi.itline.jp: /etc # systemctl start icecast

  とりあえず、これだけでhttp://xxxpi:8000/にアクセスすると結果が返るようになる。

  次は、ezstreamの導入、設定である。

xxxpi.itline.jp: /etc # cp /usr/share/doc/ezstream/examples/ezstream_mp3.xml ezstream.xml
xxxpi.itline.jp: /etc # find /mnt/mediatomb/YUMI_54_WITH3 -name "*.mp3" > /usr/share/icecast/playlist.m3u
xxxpi.itline.jp: /etc # diff ezstream.xml.org ezstream.xml
<     <filename>playlist.m3u</filename>
>     <filename>/usr/share/icecast/playlist.m3u</filename>
xxxpi.itline.jp: /etc # ezstream -c /etc/ezstream.xml 

  mp3ファイルを羅列したプレイリストファイルを生成し、ezstreamの設定ファイルに指定、ezstreamを起動する。この状態でhttp://xxxpi:8000/にアクセスすると演奏中の状態が確認できる。また、インターネットラジオ聴取クライアントにhttp://xxxpi:8000/streamを指定すれば、とりあえず音楽を聴くことができる。

  んが、これでは不満。オイラのライブラリはflacで構築しているのだ。百歩譲ってmp3配信は許容するが、ライブラリをmp3化するのは許容できない。二重に持つのもイヤだ。そこでezstreamの「リ・エンコーディング」機能を使う。

xxxpi.itline.jp: /etc # cp /usr/share/doc/ezstream/examples/ezstream_reencode_mp3.xml ezstream.xml
xxxpi.itline.jp: /etc # find /mnt/mediatomb/YUMI_54_WITH3 -name "*.flac" > /usr/share/icecast/playlist.flac.txt
xxxpi.itline.jp: /etc # diff ezstream.xml.org ezstream.xml
<     <filename>playlist.pl</filename>
>     <filename>/usr/share/icecast/playlist.flac.txt</filename>
<     <playlist_program>1</playlist_program>
>     <playlist_program>0</playlist_program>
>     <stream_once>1</stream_once>
<             <!-- <encode>Not supported Yet</encode> -->
>             <encode>lame - -</encode>
xxxpi.itline.jp: /etc # ezstream -c /etc/ezstream.xml 

  最初からflacのサンプル記述があるので、lameを噛ます指定を加えるだけだ。リアルタイムエンコーディングだから、配信中のCPU使用率はハネ上がるが、特に音飛びが起こるほどでもなく、問題はない。

  そして、今回はまだ続く。

  曜日によって、好みのアルバムが流れるようにし、どのアルバムを選択しても起床時刻である6:40に最後の曲の再生が終わり、その後にスプラトゥーンの「Now or Never!」もしくは「イマ・ヌラネバー!」が流れるようにしたい。要するに「あと1分!」のタイミングで「あと1分!」のBGMが流れるようにするというわけだ。

  というわけで作ったのがこのスクリプト。指定されたディレクトリのflac群から、再生時間が40分未満になるように適当に間引き、最後に「あと1分!」の曲を追加し、再生時間が50分ちょうどになるよう、頭に無音時間を追加したプレイリストを作成する。そしてcron機能により、5:50分からストリーミング再生を開始。

MAILTO=""
40 5 * * 2 ./create_morning_playlist /mnt/mediatomb/YUMI_03_HEAR > playlist.flac.txt
40 5 * * 3 ./create_morning_playlist /mnt/mediatomb/MARI_15_RAINSHINE > playlist.flac.txt
40 5 * * 4 ./create_morning_playlist /mnt/mediatomb/YUMI_05_AI_HA_GENKI > playlist.flac.txt
50 5 * * * /usr/bin/ezstream -c /etc/ezstream.xml

  RCD-N9の側ではアラーム機能の開始時刻を5:50に設定、入力ソースにはインターネットラジオのオレオレトリーミングチャンネルを選択。

  というわけで、夢の起床環境へまた一歩近づいた。これにて、ハイパーモーニングサーバの完成……といいたいところだが、実は、まだまだ実現したい機能があるのであった。それはまたそのうちに。


2016-09-03(Sat) ラズベリーパイを箱詰め

  アクセスポイントとして実用域に達してきたので、ラズベリーパイをケースに入れてやることにした。

  画像の説明

  とはいっても、今回、たかがケースに1000円も払うのが惜しくなったので買ってない。元箱を切り取って入れてやる。箱入りパイ。

  一応、底面はちゃんとネジで止めている。電源LEDがぼんやり透けて光るのがイイ感じ。


2016-08-30(Tue) PC環境をグレードアップ?

  突然だが、メインの環境であるMINT15のGUIが立ち上がらなくなってしまった。普段はサスペンドしてるんで、滅多に再起動なんてしないものの、再起動の際に立ち上がらない確率が高くなるような傾向があったので、気になってはいたんだよな。しかし、相手が確率だけに、明確に問題の箇所があるわけでもなさそうで、ちょっとトラブルシューティングは困難っぽい。

  記録によれば、MINT15は2013年6月21日にインストールして使い続けているようで、もう3年以上。そろそろ新しいディストリに移行するにもいいタイミングかもしれない。最近、処理が妙に重いのも解決するかもしれないしな。そこで、思い切ってFedora24に移行してみた。

  んが、新しい環境はすっきりしていてよいものの、処理が妙に重いのは解決しない。というか、重いのはブラウザだけだ……って、そうか、JavaScriptか。

  考えてみれば、いくらファンレスが静かだからって、今時ShuttleXS35V2というAtomD525(1.80GHz)のマシンを使っているうえ、それでもブラウザが重いからって、Operaの12.16を使い続けているオイラも大概なんだが。この3年間に、それだけJavaScriptが大々的に普及してきたということなのだろうな。そういえば、以前にGoogleマップが重いからって、Goo地図に逃げた気がするし、Operaでは見えないサイトが増えてきたので、同時にFireFoxを立ち上げて逃げたり……そうとう逃げまくってきたのも確かだ。正直、必要性に疑問を感じるようなJavaScriptばかりで、そんなもののせいでマシンを退役するのはバカバカしいが、JavaScriptを切ると、ほとんどのサイトが見えなくなってしまうのはイカンともしがたい。

  そこで、適当なファンレスマシンを購入しようと思ったが、どうも劇的に速度を改善できるようなマシンでは、ファンレスは望めないし、値段も結構するようだ。うーむ「メールとウェブ程度なら」なんてスペックの表現がよくあるが、オイラにとってはウェブが見えるスペックって、結構なハイスペックなんだよな。

  結局、考えあぐねて以前に購入したThinkPadのT500を引っ張り出してきて、それにディスプレイとキーボードをつなぐことにした。どういう気分でこんなお大臣なマシンを買ったのか忘れたが、こいつはCore2DuoP8700(2.53GHz)とかなりのハイスペック。しかもIntelのSSDに換装している。おぉ、速い! これは快適!

  ちなみに、本体のディスプレイが点灯していると、横目に入ってうっとおしいが、以下のコマンドでバックライトを消灯できることがわかった。ただし、スクリーンセーバが働くと、またバックライトが点灯してしまうことがあるので、とりあえずcron登録してゴマかしている。

echo -n 0 > /sys/class/backlight/intel_backlight/brightness

  オマケに、元のマシンはGUIこそ起動しないものの、時々ファイルをサルベージしたい時があるのでsshで接続することがある。その場合、GUIからはサスペンドできないが、以下のコマンドでサスペンド状態に移行できることがわかった。

echo -n mem > /sys/power/state

  そういえば、T500って、いつ買ったんだっけ……って、アレ?2009年9月30日って……7年前じぇねーか。うーむ、元のマシンより古かったのか。


2016-08-28(Sun) ラズベリーパイ(pidora)で無線LANアクセスポイントする

  先日「無線LANアクセスポイント自体をラズベリーパイで構築するのもいいかもしれん」などと書いたが、やってみることにした。

  市販の無線LANルータをアクセスポイントモードに設定し、無線ブリッジとして振舞わせたいのだが、どーにも安定しないのだ。有線側からのブロードキャストが無線側に飛ばない。arpが飛ばなければ、接続できない。改めて購入したローエンドな無線LANルータも、結局はダメな感じだ。そりゃ、フツーの人は無線側の端末からWANと通信できるだけで十分なのかもしれないが、わしゃ宅内のホスト同士の通信が必須なんだ。

  さて「ラズベリーパイ アクセスポイント」でググると大量のサイトが引っかかるのだが、どれもhostapdを使うことは共通しているものの、イマイチ内容がバラバラ。手順は書いてあるものの、その必要性がよくわからない。結局はhostapdに添付のドキュメントを読みつつ、試行錯誤が必要になった。

  今回、構成したい無線LANアクセスポイントは、いわゆるルータモードではなく、ブリッジモードで動作させたいので、まずはブリッジインタフェイスを作る。前回と違うのは固定IPアドレスを割り振るところだ(別にDHCPでは絶対ダメということはないが)。

[root@xxxpi ~]# nmcli connection add type bridge ifname br0 stp no
 
[root@xxxpi network-scripts]# diff -bc x.ifcfg-bridge-br0.org ifcfg-bridge-br0 
  DEVICE=br0
  STP=no
  TYPE=Bridge
! BOOTPROTO=dhcp
  DEFROUTE=yes
  PEERDNS=yes
  PEERROUTES=yes
--- 1,10 ----
  DEVICE=br0
  STP=no
  TYPE=Bridge
! BOOTPROTO=none
! IPADDR=172.xx.xx.xx
! NETMASK=255.255.255.0
! GATEWAY=172.xx.xx.xx
  DEFROUTE=yes
  PEERDNS=yes
  PEERROUTES=yes

  さて、ここから無線LANアクセスポイント化を開始する。上述したように、ラズベリーパイを無線LANアクセスポイント化する記事は多くあるのだが、よくわからないまま手順だけ書いてある記事が多いので混乱させられる。使用する無線LANアダプタなどに応じてアレンジを加える必要があるのだ。

  今回、使用した無線LANアダプタは、IO DATAのWN-G300UAなのだが、重要なのは製品名よりも搭載している無線LANチップの種類だ。この製品はRealtekの8192CUという無線LANチップを搭載しており、これが同じならば、OS的には同じ機器であるとみなしていい。

  このことは、機器をUSBコネクタに挿した状態で8192cuドライバが読み込まれているかどうかで判別できる。具体的にはlsmodコマンドで8192cuが表示されるか否かだ。

[root@xxxpi ~]# lsmod
Module                  Size  Used by
8192cu                540710  0 

  次に、無線LANアクセスポイント化に必要なhostapdというパッケージを導入する。

[root@xxxpi ~]# yum install hostapd

  ここが混乱ポイント。hostapdには「ドライバ」という概念が存在し、搭載している無線LANチップの種類に応じて「/etc/hostapd/hostapd.conf」の中で適切に指定してやる必要があるのだが、ここでいう「ドライバ」とは、上記の8192cuドライバ(カーネルモジュール)とは完全に無関係であり、上記でインストールしたhostapdというパッケージに含まれる「/usr/sbin/hostapd」という実行ファイルに、予め組み込み済みのものなのだ。

  そして、上記でインストールしたhostapdというパッケージに含まれる「/usr/sbin/hostapd」という実行ファイルには、Realtekの8192CU用のドライバが組み込まれていない。

  そこでどうするかというと、Realtek社が個別に配布している、hostapdパッケージをコンパイルして、実行ファイルだけまるごと差し替えてやる。これにより、Realtekの8192CUという無線LANチップを搭載した無線LANアダプタで、無線LANアクセスポイントを構成することができる。なんだよ、そういうことなのかよ、そうならそうと言ってくれよ。

  で、手順が以下。

・Realtekのサイトから8192CU用のパッケージをダウンロード
http://www.realtek.com.tw/downloads/searchView.aspx?keyword=RTL8192CU
0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
 
・展開、コンパイル、差し替え
[root@xxxpi ~]# unzip 0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip 
[root@xxxpi ~]# cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/
[root@xxxpi wpa_supplicant_hostapd]# tar xvfz wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz 
[root@xxxpi wpa_supplicant_hostapd]# cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd/
[root@xxxpi hostapd]# make
[root@xxxpi hostapd]# mv /usr/sbin/hostapd /usr/sbin/hostapd.org
[root@xxxpi hostapd]# mv /usr/sbin/hostapd_cli /usr/sbin/hostapd_cli.org
[root@xxxpi hostapd]# cp hostapd /usr/sbin/hostapd
[root@xxxpi hostapd]# cp hostapd_cli /usr/sbin/hostapd_cli
 
[root@xxxpi ~]# cd /etc/hostapd/
 
[root@xxxpi hostapd]# diff -bc hostapd.conf.org hostapd.conf
  ignore_broadcast_ssid=0
  
  # Uncomment these for base WPA & WPA2 support with a pre-shared key
! wpa=3
! wpa_key_mgmt=WPA-PSK
! wpa_pairwise=TKIP CCMP
! rsn_pairwise=TKIP CCMP
  
  # DO NOT FORGET TO SET A WPA PASSPHRASE!!
! wpa_passphrase=YourPassPhrase
 
  # Most modern wireless drivers in the kernel need driver=nl80211
! driver=rtl871xdrv
  
  # Customize these for your local configuration...
! interface=wlan0
! hw_mode=g
! ieee80211n=1
! channel=N
! ssid=XXXXXXXX
! eap_server=1
! wpa_group_rekey=7200

  hostapdを動作させる場合、wpa_supplicantが動作していると、処理が競合するっぽいので止めてやる。どうやら、単にサービスを止める設定をするだけでは、dbus経由で再起動がかかってしまうようなので、dbusの設定から殺しておく。

[root@xxxpi ~]# cd /usr/share/dbus-1/system-services/
[root@xxxpi system-services]# mv fi.w1.wpa_supplicant1.service x.fi.w1.wpa_supplicant1.service.org
[root@xxxpi system-services]# systemctl stop wpa_supplicant

  省電力モードが有効になっているとイマイチという情報があるので、無効にしておく。

[root@xxxpi ~]# cd /etc/modprobe.d/
[root@xxxpi modprobe.d]# vi 8192cu.conf
[root@xxxpi modprobe.d]# cat 8192cu.conf
options 8192cu rtw_power_mgnt=0

  最後にhostapdサービスを自動起動する設定を施し、一度、再起動して、再起動後に動作を開始していることを確認する。

[root@xxxpi ~]# systemctl enable hostapd
[root@xxxpi ~]# systemctl start hostapd
[root@xxxpi ~]# systemctl status hostapd

  なお、詳しい検証はしていないが、この直後にPSPやKOBOを接続しようとすると、認証が通らず、接続に失敗する現象が発生した。不思議なことに、PCから接続しようとすれば、接続に成功し、その後はPSPやKOBOも問題なく接続できるようになる。原因は不明。

  それと、接続が不安定な問題。しばしば接続が中断される感じ。注意深くログを見たら、きっかり10分毎に再接続する様子が確認できる。こりゃ、意図的なもんだな。

[root@xxxpi ~]# journalctl -u hostapd.service -n 1000 | grep -C 1 pairwise
 8月 28 14:54:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000115
 8月 28 14:54:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
 8月 28 15:04:33 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 IEEE 802.11: deauthenticated due to local deauth request
--
 8月 28 15:04:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000116
 8月 28 15:04:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
 8月 28 15:14:33 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 IEEE 802.11: deauthenticated due to local deauth request
--
 8月 28 15:14:55 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000117
 8月 28 15:14:55 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
 8月 28 15:24:33 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 IEEE 802.11: deauthenticated due to local deauth request
--
 8月 28 15:24:56 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000118
 8月 28 15:24:56 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)

  hostapdパッケージ添付のサンプル設定ファイル「/usr/share/doc/hostapd/hostapd.conf」の中に600という記述がないか探すと……ある。いくつかあるが「wpa_group_rekey=600」がクサい。試しに1200に変更したら……思った通り再接続の間隔が延びた。これだ。

  ようやく安定して使えるようになった。市販の無線LANルータの不安定さはない。やはり、きゃつらはちゃんとブリッジ動作してなかったんだな。時間と金のムダだったわい。さて「ハイパーモーニングサーバ」計画を次の段階に進めるとするか。