Archive for the ‘開発部’ category

FreeBSDでBluetoothテザリング

2016/09/18

ペアリング

/etc/bluetooth/ubt0.confに以下を書く(重要)

authentication_enable="YES"
encryption_mode="ALL"

相手デバイスに表示される名前を変えるなら

local_name="MyDeviceName"

あとは/etc/bluetooth/hcsecd.confをhandbookとか見つつよろしく書いて、スマホからペアリングする。

PAN接続

ifconfig tap0 create
btpand -a <BT addr> -d ubt0 -s NAP -i tap0
dhclient tap0

これでIPアドレスもらえるのでネットに繋がります。

CheckInstall

2015/02/07

Linuxで、プログラムをソースからインストールするとき、make installの代わりにcheckinstallを使うと、バイナリパッケージをよしなに作成してくれる。

virt-installで物理ディスクを指定する方法

2014/09/14

このように指示すればよい。

--disk /dev/disk/by-id/xxxxx,device=disk,format=raw

SquirrelMail日本語パッチとAvelsieve

2010/11/10

私は、Sieveを有効したメールサーバを構築したとき、スクリプト編集のユーザインターフェースとして、SquirrelMailAvelsieve pluginを導入することが多い。そして、日本語での文字エンコーディング上の問題を解決するため、SquirrelMailには日本語パッチを当てている。

日本語パッチを当てることで、どのような文字エンコーディングでメールが来たとしても正常に画面表示されるようになるわけだが、副作用として、メール用のエンコーディングとUI用のそれが別になってしまうことがあり、それがAvelsieveと相性がよくない。

Avelsieveは、画面入力された文字をUTF-8に変換して、sieveスクリプトを生成する。これ自体は妥当な仕様なのだが、その際の変換元エンコーディングとして、メール用のエンコーディングを用いる。一方ブラウザからは、UI用のエンコーディングで送られてくるのであるから、そこで食い違いが発生する。

そういう訳で、Avelsieveにも、「日本語パッチ」が必要となってくるので作成した。同様の問題で悩んでいるのであれば、お試しいただきたい。

» Read more: SquirrelMail日本語パッチとAvelsieve

Panasonic BL-C131 の録画 (3)

2010/10/08

続き。

前回までで、正しい映像を保存することができたので、次は音声を何とかする。

音声は、G.726というコーデックのADPCMで送られてくるのだが、これは、openRTSPで保存したままの状態では、簡単には再生できない。mplayerに食わせてみたとしても、エラーを吐いて終了してしまうし、FFmpegで、codecとしてg726を指定してやっても、そのファイルを認識できないので、他形式に変換しようとしても不可能である。

ではどうするかというと、ここで紹介されている、g72x++という専用変換ツールの助けを借りる。これをビルドして、decode-g72xという実行ファイルを取得しておく。

この、decode-g72xを使用すれば、G.726のファイルを生PCMファイルに変換できるので、これを改めてFFmpegに通して、wavファイルとして保存する。

cat audio-G726-32-1 | decode-g72x -64 -l -L | ffmpeg -y -f s16le -acodec pcm_s16le -ar 8000 -ac 1 -i - audio-G726-32-1.wav

ここまでの手順で、正しく、また処理可能な映像と音声ファイルが出来あがったので、これらを結合することが可能となった。前回、映像をx264にエンコードしたので、これはそのまま使うことにして、音声をaacにしてmp4ファイルを作成するとするならば、以下のようにする。

ffmpeg -y -i video-MP4V-ES-2.mp4 -i audio-G726-32-1.wav -vcodec copy -acodec libfaac -ar 44100 -ab 16000 -ac 1 video.mp4

ここで作成された、video.mp4が最終的な目当てのファイルとなる。きちんと映像と音声の同期のとれた動画となっているはずだ。

Panasonic BL-C131 の録画 (2)

2010/10/04

続き。

さて、前回の方法でカメラからの動画と音声が保存できた。あとはこれをマルチプレクサにかけて単体の動画ファイルを得ればよい、というほど甘い話ではない。それでイケるのであれば、openRTSP自体にマルチプレクサが内蔵されているので、それを使えばよいだけの話。

まずは映像。これは普通のMPEG4なので、このままでも適当なプレイヤーソフトで再生できる。できるのだが、何故か微妙に早回しになってしまう。

これは、MPEG4のメタデータとしては、30fpsで記録してあることになっているものの、実際には、22.5fpsでしかないことに起因している。なのでフレームレートを変換してやる必要がある。たとえばmplayer(multimedia/mplayer)で再生するなら次のようにすれば、任意のフレームレートで再生できる。

mplayer -fps 22.5 video-MP4V-ES-2

再生するだけならこれでよいのだが、今回は、最終的に正しい動画ファイルを作成する必要があるので、変換した結果をファイルに落とさなければならない。

そこでFFmpegを使うわけなのだが、FFmpegは、通常の動画ファイルに対してフレームレートの上書きができない。例えば、次のようにしたとしても、フレームレートは変換されないのだ。1

ffmpeg -r 22.5 -i video-MP4V-ES-2 -vcodec mpeg1video -an video-MP4V-ES-2.mpg

ではどうするかというと、一旦rawvideo形式に変換する。rawvideoにしてしまうと、そのファイル中にはフレームレートとかのメタデータが含まれないので、そこから別の形式にエンコードするときには、コマンドラインで指定したものが有効になるからだ。

しかし、rawvideo形式だと、サイズが非常に大きくなるため、本当にファイルを作ってしまうと大変なことになる。そこで、2つのFFmpegをパイプで繋ぎ、一気に目的のフォーマットに再エンコードしてしまうとよい。例えば、x264なmp4にするなら、次のようにする。

ffmpeg -y -i video-MP4V-ES-2 -f rawvideo - | ffmpeg -y -s 640x480 -r 22.5 -f rawvideo -i - -vcodec libx264 -an -f mp4 video-MP4V-ES-2.mp4

2つのコマンドが同時に走るため、画面出力が悲惨なことになるが、とりあえずこれで、正しい動画が作成できた。

さらに続きます。

  1. FFmpegの古いバージョンでは効いたりはするようではある []

Panasonic BL-C131 の録画 (1)

2010/09/29

Panasonic ホームネットワークカメラ BL-C131という、ネットワークカメラがある。ご多分に漏れず、これもWebブラウザでカメラに接続すれば、リアルタイムで動画を送ってくれるのだが、この動画を保存できないか、という要望が上がってきた。

この製品は、動画の形式として、Motion-JPEGとMPEG-4に対応している。Motion-JPEGの動画は、特定のURLにHTTPで接続すればデータが取得できるので、fetch(1)wgetcURLを使って落とせるし、必要ならFFmpegなりでエンコしてやればよい。

しかし、今回は、MPEG-4側のデータを取得する必要があった。なぜなら、内蔵マイクで拾った音声も録音しなければならなかったからだ。

まず、第一関門。このカメラからは、MPEG-4のデータは、HTTPではなく、RTSPで流れてくる。何とかしてこのRTSPのストリームを保存する必要があるのだが、これは、openRTSP(net/liveMedia)を使えばよい。

openRTSP -d 60 rtsp://camera/nphMpeg4/g726-640x480

これでひとまずカメラからの(60秒間の)生データが保存できる。しかし、このデータそのものがかなりのくせもので、実際に動画として見られるものにするには、あと何段階かの関門を越える必要があるのだった。

以下次号。

PostgreSQLのパーティショニングではまった記録

2010/06/25

PostgreSQLにはパーティショニングという機能があって、ひとつの論理テーブルを複数の物理テーブルに分割して格納する仕組みがある。このところのバージョンでどんどん使いやすくなっている機能のひとつ。

私の管理するPostgreSQLデータベースのひとつで、この機能を使いつつ運用していたものがあるのですが、最近そのデータベースでの更新(UPDATE)がうまくいっていないという報告を受けたので調査すると、パーティションを跨ぐような更新をしようとしてエラーになっていた。

もちろん元々の設定のときにこの考慮はしてあって、元データを削除した上で新規に挿入する更新トリガをセットしていたのですが、どうもこのトリガが動いてない様子。

どうして動かないのか、エラーメッセージ(メッセージ残してないんだけど、保存しとけばよかった。検索でヒットしないじゃないか)を睨みつつ考えていると、更新トリガを貼る表を間違ってるんじゃないかと思いついた。そう。更新トリガは、パーティションテーブルに対して貼らなければならないのではないかと。

これが正解で、その通りに変更してみると期待通りに処理され出した。後でドキュメントをよく読むと、ちゃんと「このような(筆者注:別のパーティションに移るようなUPDATE)場合を扱うには、適切な更新トリガをパーティションテーブルに設定します」と書いてあった。

以前はマスターテーブルに対してトリガをセットしていたんですが、これじゃあ駄目だったんですね。テストでやってたときは上手く動いてたっぽいんだけどなぁ。

あ、挿入トリガはマスターテーブルに貼るんですよ。将来の自分に念のため。

PDO for WordPress と Google Sitemaps Generator for WordPress

2010/05/23

Google Sitemaps Generator for WordPress は、WordpressでXML-Sitemapを生成するのに使われる定番プラグインの一つ。でも、このプラグインは、どういうわけかmysqlに微妙に依存していて、SQliteの環境では動作しない。

今日、Googleのウェブマスターツールを見るとサイトマップがエラーになっていて超焦ったのだけど、通知が来たからと、このプラグインをバージョンアップしたことを思いだした。変更が必要だということをすっかり失念していた。

パッチをブログに貼ったと思ってたけどどうもそうはしてなかったみたいなので再作成して、今度は忘れないように貼っておくことにする。

--- sitemap-core.php.orig    2010-04-03 01:07:43.000000000 +0900
+++ sitemap-core.php    2010-05-22 23:59:40.000000000 +0900
@@ -1787,25 +1787,16 @@
}

if($this->GetOption("b_safemode")===true) {
-                $postRes = mysql_query($sql,$wpdb->dbh);
+                $postRes = $wpdb->get_results($sql);
if(!$postRes) {
-                    trigger_error("MySQL query failed: " . mysql_error(),E_USER_NOTICE); //E_USER_NOTICE will be displayed on our debug mode
+                    trigger_error("query failed: ",E_USER_NOTICE); //E_USER_NOTICE will be displayed on our debug mode
return;
}
} else {
-                $con = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD,true);
-                if(!$con) {
-                    trigger_error("MySQL Connection failed: " . mysql_error(),E_USER_NOTICE);
-                    return;
-                }
-                if(!mysql_select_db(DB_NAME,$con)) {
-                    trigger_error("MySQL DB Select failed: " . mysql_error(),E_USER_NOTICE);
-                    return;
-                }
-                $postRes = mysql_unbuffered_query($sql,$con);
+                $postRes = $wpdb->get_results($sql);

if(!$postRes) {
-                    trigger_error("MySQL unbuffered query failed: " . mysql_error(),E_USER_NOTICE);
+                    trigger_error("unbuffered query failed: " ,E_USER_NOTICE);
return;
}
}
@@ -1840,7 +1831,7 @@

//Cycle through all posts and add them
-                while($post = mysql_fetch_object($postRes)) {
+                foreach( $postRes as $post ) {

//Fill the cache with our DB result. Since it's incomplete (no text-content for example), we will clean it later.
$cache = array(&$post);
@@ -1936,7 +1927,6 @@
unset($postRes);
unset($prioProvider);

-                if($this->GetOption("b_safemode")!==true && $con) mysql_close($con);
}
if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: End Postings"));
}

“>”が相変わらず化けるなぁ。使うときは気をつけないと。Syntax Highlighter for WordPressに変えてみた。

JavaScriptでバーコード作成

2010/04/22

ちょっと興味があって、Webページに普通のバーコードを動的に表示する方法を探していた。

最初は、Google Chart ToolsのQR Codesみたいな感じで、外部から使用できるaspサービスを探していたのだけど、探している過程で、Barcode 作成ツール genBarを発見した。

早速試してみるといい感じに動いてくれてはいるのだが、公開されているままではちょっと自分の用途には使いづらかったので、EANコードの部分だけ抜きだして、習作を兼ねてjQueryプラグイン化と、外部GIFファイルを使わないように改造した。IE7以下が駄目になったが些細な問題だな。

ひととおりまとまってから、オフィシャル?なバーコードプラグインがあることに気がついたけど、こっちはGPLで、やっぱり使いにくいからまあいいや。

せっかくなので貼っておきますね。

barcode