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側でコピーしたデータの型を推測している様子です。

[VBA] CSVファイルの中身をソートする

CSVファイルの内容をソートする方法について

例えば、Excelシートに移してから、Excelの機能で並び替える。
(少量ならプログラム無くても可能)

これをVBAで繰り返しやるとしたら、例えば
Dim Fso As New Scripting.FileSystemObject
Dim List As Object
Set List = CreateObject("System.Collections.ArrayList")

Dim Fin As TextStream
Set Fin = Fso.OpenTextFile(Filename:="csvファイル1.csv")
Do Until Fin.AtEndOfLine
  List.Add (Fin.ReadLine)
Loop
Fin.Close

List.Sort

Dim Fout As TextStream
Set Fout = Fso.CreateTextFile(Filename:="csvファイル2.csv")
Dim Value As Variant
For Each Value In List
  Debug.Print Value
  Fout.WriteLine Value
Next
Fout.Close

2017年7月17日月曜日

[VBA] MSAccess の全テーブルを CSV に出力する

MSAccess のテーブルを CSV 形式のファイルに出力したい場合は、目的のテーブルからエクスポートしてやれば良いが、まとめて出力したい場合のサンプルです。

Dim Tabledef As DAO.Tabledef
For Each Tabledef In CurrentDB.TableDefs
 If Not Left(Tabledef.Name, 4) = "MSys" Then
  DoCmd.TransferText _
   TransferType:=AcTextTransferType.acExportDelim, _
   TableName:=Tabledef.Name, _
   Filename:=Tabledef.Name & ".csv"
 End If
Next


順序をカスタマイズしたいならば、テーブルでなくクエリを使って出力する。

2017年7月15日土曜日

[VBA] ExcelからDAOで接続すると「データベースの形式を認識できません」

Excel VBA から MSAccess への DAO による接続で、
「3343 データベースの形式 '*.accdb' を認識できません。」
というエラーメッセージについて。

ライブラリの参照設定が古くて(Microsoft DAO 3.6 Object Library)
新しい DAO も選べないので、デフォルトだと 3.6 のままです。

Debug.Print DAO.DBEngine.Version
3.6


MSAccess のバージョンに合う DAO を準備します。

MSAccess 2007 の場合は ACE 12 なので
Dim Engine As DAO.DBEngine
Set Engine = CreateObject("DAO.DBEngine.120")
Call Engine.OpenDatabase(Name:=ThisWorkbook.Path & "\xxx.accdb")


(資料)Office と データベースエンジンのバージョン
https://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine