2017年6月22日木曜日

libasound によりPCM音声録音

libasound によるPCM音声録音の例題です。

Linux や Raspberry にてコマンドラインからマイクに接続し音声を WAVE ファイルとして保存します。
libasound がインストールされていない場合、下記のコマンドによりインストールしてください。 また、例題のような自分で録音用のコーディングをしなくてもツール群が提供されています。 alsa-utils に含まれる arecord コマンドにて録音、aplay コマンドにより再生が可能です。
この arecord コマンドにより、PC にマイク機器が接続されているかを確認することができます。 表示される「カード 1」が例題にて使用するマイク番号で、使用するマイクの記述方法は「hw:1」や「plughw:1」と言う形式になります。
「hw:1」を利用するとマイクからの入力がそのまま録音されるので 44100Hz 等のサンプリングレートを変えることはできませんが、「plughw:1」を利用するとソース上からダウンミックスした形でサンプリングレートを変更することができます(標準は 8000Hz で 他のサンプリングレートも指定できます)。

例題では、使用するマイクの番号、サンプリングレート、保存する秒数を指定して録音を開始し、ファイル名「record_マイク番号.wav」にて保存しています。
実行結果

2017年6月21日水曜日

WAVE/PCM 音声の生成

WAVE/PCM 音声を生成する例題です。

WAVE 音声に関して以前まとめたものはこちら(WAVEファイルの読込み/再生

WAVE 音声のフォーマットに合わせてヘッダを書き込み(2ch, 44100Hz)、sin 波形の振幅を徐々に大きくした音声を生成しています。 実行結果(Audacity にて表示)

ローカルネットワークから NetBios 名の取得

ローカルネットワークから Windows および Samba でのファイル共有を行っているマシンの NetBios 名を取得する例題です。

例題では、自機のIPアドレスからスキャンを行うIPアドレスの範囲を設定し、それぞれのアドレスに対して NetBios 名を取得しています。
NetBios 名を解決するための手順を省略している部分もあるため上手く取得できない場合もありますが、Windows マシンでは概ね正常に動作しています(Samba のネームサーバー/nbmd に対して取得できない場合も)。 実行結果

2017年6月20日火曜日

CGI に対応した HTTP リクエストによるファイル保存

CGI に対応した HTTP リクエストによるファイル保存の例題です。

ソケット通信を用いて HTTP リクエストを行う場合、レスポンスヘッダに含まれる Content-Length が 0 となり正しく本文が取得できない場合があります(libcurl 等を用いるとその辺の処理は自動的に行ってくれます)。
Apache サーバーに index.html 等のファイルを直接要求した場合にはそのようなことはありませんが、リクエストしたページが CGI で構成されている場合にそういう状況が発生します。
CGI はファイルの読み出しやページの生成の都合に応じて、逐次転送を行いますので、Content-Length の代わりにこれから送信するバイト数を16進数字にて送信しその本文を送信した後、転送が終われば 0 の文字列を送信します。

CGIによるファイル送信の流れ
レスポンスヘッダ
9bd9
[9bd9バイト分のデータ]
e000
[e000バイト分のデータ]
0
例題では、HTTP リクエストを送信後 Content-Length が含まれるかどうかで CGI かどうかを判定し、受信処理により取得された本文をファイルとして保存しています。 実行結果

libjpeg によるカラーバーの作成

libjpeg により JPEG 画像でのカラーバーを作成する例題です。

apt-get や brew(OSX)等により libjpeg をインストール後、libjpeg へのリンク(-ljpeg)を追加しビルドしてください。

例題では、128x32 のサイズの RGB画像が作成され、JPEGファイルとして保存されます。
HDDの使用率等を示すようなカラーバーが作成されます(例題では50%の使用率)。 実行結果(カラーバー:50%の使用率)

NTPサーバーからの時刻取得

NTPサーバーから時刻を取得し表示する例題です。

NTPサーバー(time.asia.apple.com)は適宜変更してください。
実行結果

レーベンシュタイン距離により名前の類似度順に並べ替え

レーベンシュタイン距離により名前の類似度順に並べ替え表示する例題です。

例題では、「佐藤浩市」と言う名前に対する類似度をレーベンシュタイン距離により計算し、その距離に応じて qsort により近い順に並べ替えて表示しています。
実行結果