2018年4月15日日曜日

Raspberry Pi に、自動で開始するサービスを追加する

Raspberry Pi の起動時に、自動で Bluetooth PAN を開始する

以前はこういう場合は chkconfig コマンドでしたが、Raspbian Stretch だと新しく systemctl を使用します。
https://wiki.archlinux.jp/index.php/Systemd

前記事の Bluetooth PAN のセットアップ スクリプト(bt-pan) であれば、

$ cat /etc/systemd/system/bluetooth-tethering.service
[Unit]
Description=Bluetooth Tethering
After=networking.service bluetooth.service dbus-org.bluez.service

[Service]
ExecStart=/home/pi/bt-pan client 00:00:00:00:00:00
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target


Raspberry Pi の起動時に自動で開始するように、"有効" に切り替えます。
$ sudo systemctl enable bluetooth-tethering

屋外で使用する場合は、Bluetooth テザリングの接続先を準備してから Raspberry Pi を起動する必要があります。

2018年4月14日土曜日

Raspberry Pi を Bluetooth 経由でスマートフォンから操作する

Android タブレットから Raspberry Pi へ Bluetooth で接続して、VNC のリモートデスクトップを操作する方法です。(SSH でも同様に可)

今回使用したもの
  • Nexus 7 (2013)
  • Raspberry Pi Zero WH (Raspbian Stretch with desktop)

Raspbery Pi のうち、Bluetooth を標準装備しているものは BlueZ 等は導入済みであり、追加のパッケージは必要ない。
$ apt-cache show bluetooth
Package: bluetooth
Source: bluez
Version: 5.43-2+rpt2+deb9u2
(以下略)


VNC で接続するためには、Raspberry Pi 側に Bluetooth 経由でアクセスできる IPアドレス が必要になるが、これは Raspberry Pi からタブレットへ、Bluetooth テザリングで接続すれば済む。

■ Android 側での設定
  1. BluetoothをONにする
  2. BluetoothテザリングをONにする
  3. VNC互換のクライアントをインストール
    VNC Viewer - RealVNC Limited

■ Raspberry Pi 側での設定
  1. VNCサーバを「有効」にする
    Raspberry Pi のスタートメニュー > 設定 > Raspberry Pi の設定 > [インターフェース]タブ
  2. BluetoothをONにする
  3. Bluetoothのペアリングを行い、タブレットの Bluetooth と接続する
  4. テザリングを開始する(下記)

まずは、Raspberry Pi でペアリングしたタブレットの Bluetooth デバイスアドレス(BD Address) を確認します。
$ bluetoothctl
以下は bluetoothctl のセッション
# devices
Device 00:00:00:00:00:00 nexus7(これがペアリングしたタブレットのBD Address)
# quit


Raspberry Pi のテザリングを開始するためには、Bluetooth PAN (Personal Area Network) の設定が必要です。GitHub で提供されている Bluetooth PAN のセットアップ スクリプトが使用できます。
https://github.com/mk-fg/fgtk#bt-pan

$ wget https://raw.githubusercontent.com/mk-fg/fgtk/master/bt-pan
$ chmod a+x bt-pan
$ sudo ./bt-pan client 00:00:00:00:00:00(上記 タブレットの BD Address を指定する)
$ ifconfig bnep0
bnep0: flags=4163 mtu 1500
inet 192.168.xx.xx netmask 255.255.255.0 broadcast 192.168.xx.xx
(以下略)

これで Bluetooth PAN で使える IPアドレス(192.168.xx.xx) が有効になったので、タブレットの VNC クライアントからこのアドレスに接続すればOK

Raspberry Pi の起動時に、自動で Bluetooth PAN を開始するには、次の記事を参照
Raspberry Pi に、自動で開始するサービスを追加する

2018年4月10日火曜日

Raspberry Pi で Wi-Fiアクセスポイントの名前が見えない

Raspberry Pi Zero WH で Wi-Fi の SSID 一覧が表示されるが、目的の接続先の名前が表示されない場合の対処について。強引に CLIの設定で乗り切る前に、確認したほうがよい設定ミスの可能性があります。

Raspberry Pi のスタートメニュー > 設定 > Raspberry Pi の設定 > [ローカライゼーション]タブ
・「無線LANの国」を、JP (Japan) に変更

通常の Wi-fi 機器であれば、これで再起動すれば、目的の SSID が表示されるはず。

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アシスタントの設定は妥当です。

2017年9月2日土曜日

[VBA] MSAccessテーブルのレコード数を確認する

MSAccessテーブルのレコード数を、Excelにまとめて出力するサンプルです。

Dim Engine As DAO.DBEngine
Dim Database As DAO.Database
Dim TableDef As DAO.TableDef

' 3343 データベースの形式を認識できません エラー対策
Set Engine = CreateObject("DAO.DBEngine.120")
Set Database = Engine.OpenDatabase("データベース.accdb")

Dim RowNum As Long
RowNum = 1

For Each TableDef In Database.TableDefs
  If Left(TableDef.Name, 4) = "MSys" Then GoTo CONTINUE
  ' リンクテーブルは除外
  If Len(TableDef.Connect) > 0 Then GoTo CONTINUE

  Debug.Print TableDef.Name
  Cells(RowNum, 1).Value = TableDef.Name
  Cells(RowNum, 2).Value = TableDef.RecordCount
  RowNum = RowNum + 1

CONTINUE:
Next

Excelの表をMSAccessテーブルに貼り付けすると、欠落する

Excelで作った表をMSAccessテーブルにコピペすると、欠落するケースがあります。
状況によって事情が異なります。
  • 1行目が欠落するケース
  • 特定のカラムがカットされるケース

■ 1行目が欠落するケース

1行分が消失します。これは見出しチェックが働いて、1行目を見出しとしてカットしてしまうためです。

Access2010にてExcelからAccessテーブルへのコピー+ペーストで登録されないレコードがある。
https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_access-mso_other/access2010%E3%81%AB%E3%81%A6excel%E3%81%8B/6192e312-a292-49e3-9ce5-65e15e5238d0


■ 特定のカラムがカットされるケース

1行目以降でも発生するものです。

1.テキスト型なのに、数値だけで構成されることが多いケース

(例)テーブル定義
フィールド1 (テキスト型)
フィールド2 (テキスト型)
フィールド3 (テキスト型)

コピペするExcelのデータ
フィールド1フィールド2フィールド3
id1name1123456
id2name2123456
id3name3123ABCD

これを、MSAccessテーブルに貼り付け
フィールド1フィールド2フィールド3
id1name1123456
id2name2123456
id3name3 
フィールド3の最後の行だけ、消失しています。


2.数値だけで構成されるが、関数で出力したものを含むケース

コピペするExcelのデータ
フィールド1フィールド2フィールド3
id1name1123456
id2name2123456
id3name3123456
数値に見えるが、実際は関数が出力した文字列であったケースです。

これを、MSAccessテーブルに貼り付け
フィールド1フィールド2フィールド3
id1name1123456
id2name2123456
id3name3 
フィールド3最後の行が消失ます。

上記から、テーブルのカラム型ではなく、Excel側でコピーしたデータの型を推測している様子です。