2018年2月17日土曜日

gem update すると、Unable to require openssl エラー

CentOS7 環境に Ruby on Rails を構築する過程で gem update を行うと、Unable to require openssl エラーが発生した。

■ 今回の作業
  • Ruby と依存関係のあるパッケージを yum install
  • Ruby 2.5.0 を make install(yum のリポジトリだと古いため)
  • gem update

■ エラーメッセージ
# gem update --no-document
Updating installed gems
ERROR:  While executing gem ... (Gem::Exception)
    Unable to require openssl, install OpenSSL and rebuild Ruby (preferred) or use non-HTTPS sources

■ 環境の詳細
  • 環境:DTIのServersMan@VPS CentOS7(64bit版)

直接の原因は、openssl-devel パッケージがインストールされていないことなのだが、手順通り入れたはず。。確認したところ、以下の2つが initscripts が原因のエラーで中断されていた。
  • yum update
  • yum install openssl-devel

■ エラーメッセージ
# yum update
(中略)
Error: systemd conflicts with initscripts-9.49.17-1.el7_0.1.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

これは仮想化環境の障害対策として、initscripts パッケージの更新をブロックされているため。
http://www-wp.dream.jp/search.php/?p=23141

メッセージ通り、依存性エラーをスキップしてみると、
  • yum update --skip-broken
  • yum --skip-broken install openssl-devel

ダメだ、openssl-devel は依然として install 完了しない。
DTIでは障害対策として initscripts の update を止めているので、yum を使用して解決することは難しい。
必要であれば、make install か、CentOS6 を選択するしかなさそう。

2018年2月4日日曜日

Raspberry Piで USBスピーカ・マイクを使う

3.5mm ステレオミニプラグで接続するアナログスピーカだと、Raspberry Piでは雑音が大きくて使いにくい。USBであればデジタルで出力できるので、音質を改善できる。

Googleアシスタントで使用するUSBデバイスには設定が必要なのだが、USBサウンドデバイスを複数繋げた場合はどういう名前で認識されたのか分かりにくいので、順にテストすることが必要です。

■ USBスピーカの設定
今回は、「サンワサプライ USBスピーカー(ブラック) MM-SPU8BK」を使います。


USB接続すれば自動で認識されるはず。
認識されたら、カード番号、デバイス番号を確認します。

$ aplay -l
カード 1: MicroII [Audio Advantage MicroII], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0


今回の場合は、「カード 1」「デバイス 0」です。

デバイスをテストします。
$ speaker-test -D plughw:1,0 -t wav

デバイスの指定方法は、
plughw:<card number>,<device number>
なの、今回のUSBスピーカは plughw:1,0 となります。

この内容で、ALSA の設定ファイルに登録します。(下記を参照)

■ USBマイクの設定
今回は、感度高めのコンデンサータイプのマイクを使用します。

サンワサプライ USBマイクロホン MM-MCU01BK


こちらも自動認識されたら、カード番号、デバイス番号を確認します。

pi@raspberrypi:~ $ arecord -l
カード 0: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
サブデバイス: 0/1
サブデバイス #0: subdevice #0


今回の場合は、「カード 0」「デバイス 0」です。

デバイスをテストします。
$ arecord -D plughw:0,0 test.wav
上記で接続したUSBスピーカに出力してみます。
$ aplay -D plughw:1,0 test.wav

デバイスの指定方法は、同じく
plughw:<card number>,<device number>
なの、今回のUSBマイクは plughw:0,0 となります。

この内容で、ALSA の設定ファイルに登録します。(下記を参照)

■ ALSA(Advanced Linux Sound Architecture) の設定

この内容で、ALSA の設定ファイルに登録します。
シンプルにやるならば、ユーザのホームディレクトリにファイルを作成します。

Configure and Test the Audio
https://developers.google.com/assistant/sdk/guides/library/python/embed/audio

ALSA 設定ファイル
pi@raspberrypi:~ $ cat $HOME/.asoundrc
pcm.!default {
  type asym
  capture.pcm "mic"
  playback.pcm "speaker"
}
pcm.mic {
  type plug
  slave {
    pcm "hw:0,0"
  }
}
pcm.speaker {
  type plug
  slave {
    pcm "hw:1,0"
  }
}

これでデフォルトのサウンドデバイスが指定されたので、
検証してみます。

スピーカーテスト
$ speaker-test -t wav

マイクのテスト
$ arecord test.wav
$ aplay test.wav

これで動作すれば、Googleアシスタントの設定は妥当です。