アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

Debianで指紋認証を使用する

最近は指紋認証を搭載したPCが増えてきました。業務用グレードなら大抵は標準装備かオプションで存在します。
便利そうなので(今更ながら)自分も導入してみました。

なお、今回導入したPCは Thinkpad X61s です。(6番で詳細)

1・モジュールのインストール
Linuxでは、pamを使って認証をしていますので、まずはpamにモジュールを追加します。
Thinkpad 指紋認証ググるとthinkfinger使えと出てきますが、今回はwheezy(testing)に入っているlibpam-fprintdを利用します。



apt-get install libpam-fprintd fprintd


これでpamの設定までしてくれます。簡単ですね。さすがパッケージ。
なお、/etc/pam.d/common-auth に下記のように追加されるはずです。


auth	[success=3 default=ignore]	pam_fprintd.so max_tries=1 timeout=10 # debug

ここのパラメータを調整して、リトライ回数とタイムアウトを設定できます。

2・事前準備
そのままだとxlockなどの一般ユーザ権限で動くアプリがアクセスできないため、
先に /usr/share/polkit-1/actions/net.reactivated.fprint.device.policy を書き換えます。
(ずっと/dev/bus以下のパーミッションが問題かと思ってハマっていました)

内容はただのXMLで、下記のように
net.reactivated.fprint.device.verify と
net.reactivated.fprint.device.enroll の
allow_any を yes に書き換えるだけです。


...
<action id="net.reactivated.fprint.device.verify">
...
   <defaults>
      <allow_any>no</allow_any> ←このnoをyesに書き換え
...
<action id="net.reactivated.fprint.device.enroll">
...
   <defaults>
      <allow_any>no</allow_any> ←このnoをyesに書き換え
...


3・指紋の登録

fprintd-enroll [ユーザ名]
で登録できます。
複数回指紋を読み取らせれば登録完了します。



hoge@:debian~$ fprintd-enroll hoge
Using device /net/reactivated/Fprint/Device/0
Enrolling right index finger.
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-completed


なお、manpageによれば、下記のように -f オプションで指を指定出来ます。


fprintd-enroll -f left-middle-finger hoge


ただし、pamの方で別の指選ぶ方法が不明で調査中です。
とりあえず右の人差し指だけでも使えれば便利なので、人差し指だけで使っています。

4・認証

通常のターミナルで認証や、sudo、XDMなどで指紋認証が使用出来るようになっているはずです。
xlockでは、パスワード認証のプロンプトが出るので、Enterを押してやると指紋を入力出来るようになります。

5・使用感

試しに導入してみましたが便利ですね。
xlock解除の手間が省けていい感じです。
ログインについては・・・ずっと起動しっぱなしなのでそれほど変わらず。

6・おまけ

自分のThinkpad X61s
CPU: Core2 L7300 @ 1.40GHz
RAM: 4GB

確か3,4年位使っていますが、性能は普段の開発なら十分です。
この間、ファンが壊れた事以外は特に問題もなく元気に動いています。
Thinkpadは保守パーツを購入可能なので、ファンは自力で修理。このままあと5年は戦えます。
社内ではいい加減買い換えろとか、macにしろとか言われますが。

KURO-RSとJuliusで家電をコントロールしてみた

最近はLinuxの設定ばかりでしたが、今回は趣向を変えてLinuxを使って生活をちょっとだけ便利にする方法を書きたいと思います。

KURO-RSと言えば、玄人志向から発売された赤外線学習リモコンキット。
JuliusはOSS音声認識エンジンです。
これらを組み合わせれば音声認識リモコンを作ってみました。

はじめに言っておきますが、私の方法では割と誤動作するので、
・ミッションクリティカルな事(医療、軍事などの人の生命に影響する事柄、多額の損害が発生する事柄など)には使用しないでください。
・誤動作しても自己責任でお願いします。
つまり、照明の操作など誤動作しても影響の少ない(電気代くらい)ものでご使用ください。

下記の環境で試しました。
・OS : Debian wheezy
   Linux pc 3.2.0-1-amd64 #1 SMP Sun Feb 5 15:17:15 UTC 2012 x86_64 GNU/Linux
・HW : ZBOXNANO-AD1
 AMD Fusionなマシン。消費電力が最大でも30W程度なので経済的です
 GPUの支援機構によりyoutubeとかニコニコの動画も普通に再生可能。
 GPUの性能がそこそこあるので、WMではCompizを使用した方がサクサク動く。

・照明リモコン: リモコンコンセントOCR-05 07-0155、リモコンスイッチOCR-04 07-0154
 http://www.amazon.co.jp/オーム電機-07-0155-リモコンコンセントOCR-05/dp/B0013L6ACM
 http://www.amazon.co.jp/オーム電機-07-0154-天井照明器具専用-リモコンスイッチOCR-04/dp/B0013L6ACC/

1・KURO-RSの設定


まずはデバイスを接続して、ドライバを組み込む。


# modprobe ftdi_sio vendor=0x0411 product=0x00b3

起動時に組み込むため、/etc/modprobe.d/設定ファイルを作成してください。
面倒ならば、上記コマンドをrc.localにに追記でも可。
※/dev/ttyUSBxの権限を一般ユーザでも書き込めるようにしておくと、一般ユーザでも操作できます。
今回は全部sudo使って作業しています。

2・KURO-RSで赤外線信号を読み取り・送信


ここでperl使ってかっこ良く書けばいいと思いますが、
すでに開発されている先人の知恵をお借りします。
作者に感謝して使います。

http://www.gcd.org/blog/2007/01/113/

そのまま上記サイトの内容を実施すれば使えるようになります。
※実は、KURO-RSについては数年前から使用していますが、今見てみるとなぜか修正している場所があるため、もしかしたら上記のサイトのものでは動かない部分があるのかもしれません。
 動かない場合は自分で修正してみてください。(自分の方はなんのために修正したかわかればその部分を公開すると思います)

以降はこちらのスクリプトを使用できるという事で話を進めます。

コードを登録、送信については実際に実行して確認します。

※私の場合は、照明を3つコントロールするため×ON,OFFということで6つ登録しています。

3・Juliusのインストール


下記から Linux版 Juliusディクテーション実行キット(4.1) をダウンロードしてきます。
私の場合はせっかくなので本体の最新版(4.2)もダウンロードしました。

http://julius.sourceforge.jp/
(ダウンロードメニューにて、Julius最新版、ディクテーションキットそれぞれ)

本体を解凍し、configureを実行します。


./configure --prefix=/usr/local/julius --enable-julian

(中略)

****************************************************************
Julius/Julian libsent library rev.4.2.1:

- Audio I/O
    primary mic device API   : alsa (Advanced Linux Sound Architecture)
    available mic device API : alsa oss
    supported audio format   : RAW and WAV only
    NetAudio support         : no
- Language Modeling
    class N-gram support     : yes
- Libraries
    file decompression by    : gzip command
- Process management
    fork on adinnet input    : no
 
  Note: compilation time flags are now stored in "libsent-config".
        If you link this library, please add output of
        "libsent-config --cflags" to CFLAGS and
        "libsent-config --libs" to LIBS.
****************************************************************

configureの結果で available mic device API の項目に対応できるエンジンが表示されます。
ですが、自分の場合はalsaで動かなかったため(マイクがモノラル16bit非対応?)OSSエミュレーションを使用しました。(後述)

4・Juliusの実行


私の場合はここでかなりハマリました。
最初はalsaにて実行しようとしましたがスピーカーから音はするのにjuliusでもarecordでも録音できず、何をやっても無音状態になりました。
結局のところpulseaudioを入れたところ、なぜか動作するように・・・。
(このあたりは環境依存になる思いますので、うまく行かないようなら別のカード挿してみる、別のエンジンを試してみるなど試行錯誤してみてください。
行き詰まったら休憩するのも手です。何かいい方法を思いつくかもしれません)



padsp julius-4.2.1/julius/julius -C dictation-kit-v4.1/fast.jconf -input mic -input oss -charconv euc-jp utf8 

※padspはpulseaudioでOSSエミュレーションをするためのコマンドです。

こちらで、マイクに話した内容が表示されれば成功です。

5・Julius設定


リモコンに使うならば、認識できる語彙は少ない方が精度が上がります。


</s>    []      silE
<s>     []      silB
光あれ:ヒカリアレ:光あれ:507        [光あれ]    h i k a r i a r e
全て消す:スベテケス:全て消す:507        [全て消す]    s u b e t e k e s u
蛍光灯つける:ケイコウトウツケル:蛍光灯つける:507        [蛍光灯つける]    k e i k o u t o u ts u k e r u
蛍光灯消す:ケイコウトウケス:蛍光灯消す:527        [蛍光灯消す]    k e i k o u t o u k e s u
ライトつける:ライトツケル:ライトつける:507        [ライトつける]    r a i t o ts u k e r u
ライト消す:ライトケス:ライト消す:507        [ライト消す]    r a i t o k e s u
スタンドつける:スタンドツケル:スタンドつける:507        [スタンドつける]    s u t a N d o ts u k e r u
スタンド消す:スタンドケス:スタンド消す:507        [スタンド消す]    s u t a N d o k e s u

辞書ファイルの書式を参考にこんな感じで専用の辞書を作成しておきます。(-wオプションで使用可能)

「光りあれ」については、前にどこかで見た動画で「なにそれかっこいい」と思ったので採用。
誤動作で全部消えてもつけやすいように短い言葉にする目的もあります。
それ以外はそのままの意味です。

これでひと通りの動作はできますが、
Juliusのオプションは全て設定ファイルに書くことができるので、fast.jconfをベースに下記のように設定します。
このファイルを-Cオプションで指定してやれば毎回他のオプションをつける必要はありません。

dictation-kit-v4.1/julius.conf


-w dictation-kit-v4.1/word.list
-h dictation-kit-v4.1/model/phone_m/hmmdefs_ptm_gid.binhmm
-n 5
-output 1
-input mic # マイク入力
-input oss # oss使用
-zmeanframe
-rejectshort 800 # しきい値より短い入力を無視
-module # サーバとして動作(後述)
-charconv euc-jp utf8 # 入出力エンコード指定(内部 euc-jp 出力 utf8)
-lv 5000 


6・Juliusに接続



Juliusはサーバとして動作させることが可能で、-moduleオプションを指定してやれば、ポート10500番で待ち受けます。
(-module ポート番号 と指定すれば変更も可能です)

この待受ポートにソケット通信で繋いでやればデータの受信ができます。

詳細な仕様はこちらをご確認ください。
http://julius.sourceforge.jp/index.php?q=doc/module.html

私の用途ではperlで書けばこんな感じです。
(特定の文字列を拾ったらirrcに命令を出すだけです)


#!/usr/bin/perl
use Switch;
use Socket;

socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')) || die;
connect(SOCK, sockaddr_in(10500, inet_aton('localhost'))) || die;

$str = '';
while(1) {
        recv(SOCK, $message, 30, MSG_WAITALL);
        $str .= $message;
        if ($str =~ /\./) {
                print $str;
                switch($str) {
                        case /光あれ/ {
                                system("./irrc -c2 lOn");
                                sleep 1;
                                system("./irrc -c1 l2On");
                                sleep 1;
                                system("./irrc -c3 l3On");
                        }
                        case /全て消す/ {
                                system("./irrc -c2 lOff");
                                sleep 1;
                                system("./irrc -c1 l2Off");
                                sleep 1;
                                system("./irrc -c3 l3Off");
                        }
                        case /蛍光灯つける/ {
                                system("./irrc -c2 lOn");
                        }
                        case /蛍光灯消す/ {
                                system("./irrc -c2 lOff");
                        }
                        case /ライトつける/ {
                                system("./irrc -c1 l2On");
                        }
                        case /ライト消す/ {
                                system("./irrc -c1 l2Off");
                        }
                        case /スタンドつける/ {
                                system("./irrc -c3 l3On");
                        }
                        case /スタンド消す/ {
                                system("./irrc -c3 l3Off");
                        }

                }
                $str = '';
        }
}

# SOCKET切断
close(SOCK);


Juliusを起動した後、上記スクリプトを実行すれば接続できるはずです。

ついでに起動スクリプトも書きます。
本当は/etc/init.d/で起動できる形式にすればかっこいいと思いますが、とりあえずこれで。


#!/bin/bash

exec padsp julius-4.2.1/julius/julius -C dictation-kit-v4.1/julius.conf 2>/dev/null  &
sleep 2
exec /usr/bin/perl socket.pl  &



以上で音声認識リモコンシステムは完成です。
この起動スクリプトを実行し、マイクに話しかければ操作できるかと思います。

7・使用感


概ね正常動作していますが、電話中はもとより、掃除機などの音や全く関係ない独り言などでも誤動作するため注意が必要です。
もしくは、通常では拾わない音(びっくりするほどユートピア!!とか)を3回唱えると操作を受け付けるか全て無視するか切り替えできるように実装してもいいかもしれません。
とはいえ、誤動作するより声で操作できる便利さの方が勝ってます。

例えば、下記のような時に便利さを実感できます。
・寝る前にベッドの上で操作
・読書するときに操作
・両手に荷物を持って家に帰った時に操作
・むしろ、荷物持ってなくても家から出入りする時に操作

半分ネタで構築しましたが、思ったより便利に使っています。

8・その他


この内容は、以前設定した内容を思い出しながら書いたため、全部動作チェックはしていないため、動作しない部分があるかもしれませんがご了承ください。
※現行動いているシステムをリセットしてもう一度構築はしたくなく、その他に実行環境が無いので・・・。

Linuxでディスプレイに表示中のXに対してVNCする(X11VNC)

今回は、知っているとちょっと便利かもしれないコマンドというか、アプリケーションを紹介します。

X11VNCとは?


ディスプレイに表示している内容をそのままVNCで表示できるVNCサーバです。

他のVNCサーバは、表示しているものとは別にXサーバを立ち上げることにより、複数人で使用できるようにします。
逆に言えば、物理ディスプレイに表示中の画面を拾うことができません。
これが利点であり欠点でもあります。

それを逆にしたものがX11VNCです。

表示中の画面が拾えるのが利点ですが、
例えば、会社PC(もちろんLinux)のlibreofficeでドキュメントを開いたままで帰ってしまい、自宅で編集できなくなってしまった場合(たまにありますよね)
sshでログインして、kill発行して強制終了するなどの荒業もありますが、保存前のデータがなくなる可能性があります。
出来れば安全に保存して終了させたい・・・そんなときに役立ちます。

その他、
・会社でIRCクライアントを開いたまま帰り、自宅でその内容を確認したい時
・会社PCにしか入っていないGUIアプリケーションを開いたまま(ry
・どうしても遠隔で動画を流す必要があるとき
・深夜に作業中の人を驚かせたい
などにも役立ちます。

または、サーバ用途の場合にも役立ちます。
例えば、
・DCのサーバに遠隔ログインして、起動中のアプリケーションを触る必要がある
・DCで作業中の担当者から、操作方法がわからないと言われたときに、実際に画面を動かして教える
スクリーンショットを取るようなアプリケーションを動かしていて、その様子を見る必要があるとき
などでも役立ちます。

インストール


大抵は、apt-getかyumで入るので割愛。


$ sudo apt-get install x11vnc

どうしてもソースから入れる人はググッてください。

使い方


一言で言えば、


$ x11vnc

以上。

5900番ポートで待ち受けますので、別のPCから適当なVNCクライアントでつなげば画面を表示できると思います。
なお、一度セッションが切れると終了するのでご注意ください。

manページ見てみたら、色々とオプションがあるようですので、興味があれば調べてみてください。

遠隔からの起動方法


通常、普段使っているときは起動せずに、必要になってから起動するかと思います。

とは言っても、普通のXアプリケーションなので、これだけです。


$ x11vnc -display :0

:0は起動中のX番号

遠隔からの接続方法


もし、ファイアウォールなどで5900などのポートが遮断されている場合や、経路が安全で無い場合について。
sshで入れている時点で、問題はないかと思います。いつものようにポートフォワードします。



$ ssh host_name -L 5900:localhost:5900

で、localhostに対してvncviewer起動。


使用感


普通のvncサーバです。gnomeとかkdeなら普通に使えると思います。

自分の場合は、サーバでもクライアントでもstumpwmを常用している関係で C-t が送れないため(C-t tとしても送れない)
stumpish 'gselect 2' などを毎回発行するとか、面倒なことになっていますが、非常用なのでこれでよしと。

おまけ


wakeonlan
言わずと知れた(?)遠隔起動のパケットを投げるコマンド。
スリープして帰った場合などに便利に使えると思います。

起動したいPCのBIOSで、下記設定をします。
・電源をつないでおく
WakeOnLanを有効に
・場合によっては、ethtoolでwolを有効にする必要がある


$ sudo ethtool -s eth0 wol g

※このeth0は、有線LANが確実につながっているNICを指定してください。

次に、eth0のMACアドレスをメモしておきます。(ifconfigを打ち、HWaddrの値)

起動したいマシンを、スリープかシャットダウンしてから、同じセグメントの別マシンで、


$ wakeonlan 起動したいマシンのMACアドレス

と打てば、起動するはずです。
起動しない場合は、下記を確認してみてください。
・LANケーブルが抜けている
・電源が完全に落ちている(NICに電源が供給されていない。古いマシンだと、WOL用の端子があるので、それを接続する)
wakeonlanが投げるパケットはブロードキャストなので、同じセグメントでないと起動しません。
・その他起動しない理由はいくつかあるようなので、ググッてください。

LinuxをDAAPサーバにする

LinuxをDAAPサーバにする

音楽を聞きながらコーディングされる方は多いのではないでしょうか?
静か過ぎるのは物足りないとか、PCが爆音過ぎてうるさいからなど、いろいろとあるかとおもいます。
最近ならy○utubeとかnicnic○動画などありますが、昔ながらのCDからリッピングして、ローカルに保存して聞いているも多いかと思います。

ですが、曲数が増えてくると、
・PCのローカルに入り切らない
・曲が分散して管理が面倒
・各マシンにコピーが手間
・パックアップ体制がない
などの理由で、ファイルサーバを使って一元管理したくなってくると思います。
(少なくとも自分はそうです)
NFSやSMBを使って共有するのも一つの手ですが、設定が面倒だったり、曲が増えるとどうしても重くなる場合があったり、PC以外では使えなかったりします。

そこで、手軽に使えるものとして、iTunesの共有機能があります。
これは、DAAPと言うプロトコルを使用しています。
iTunes同士なら何も考えなくても共有できますが、実はLinuxにもそれを喋るサーバの実装があり、名前は、firefly(mt-daapd)。
サーバはこれを使用すればOK。

クライアントは、同一セグメントならばiTunesが使えます。ただし、バージョンによっては使えないかもしれません。
Linuxなら、rhythmboxとかxmms2など、
androidでも、マーケットを探せばいくつか出てきます。

※注意※
このデーモンはデフォルトだと認証なしで再生出来ます。
著作権とか不正アクセスの問題がありますので、直接外部に公開しないようにしてください。
また、何があっても自己責任でお願いします。

1・インストール
debianのlennyまでは


$ sudo apt-get install mt-daapd

で入ります。

ただ、debianのsqueezeからは入ってません。
上記からフォークしたforked-daapdと言うサーバが入っていますので、


$ sudo apt-get install forked-daapd

でインストールしてください。

なお、今回はlennyのmt-daapdを使用することとします。

2・初期設定
/etc/mt-daapd.conf が設定ファイルです。

とりあえず、下記設定はしてください。


admin_pw = password
mp3_dir = /mnt/musics/

admin_pw は管理画面に入るパスワードです。今回は"password"
mp3_dir は音楽ファイルを置いている場所を指定します。

また、vorbisで保存している人で、クライアントがvorbisに対応している場合は、サーバ側でwavにデコードせずに直接vorbisを転送できるので、下記を追加しておくと幸せです。


never_transcode = ogg


次に、ブラウザで、 http://サーバ名:3689 にアクセス。
3689はdaapで使用するポートです。

Basic認証は、
ユーザ:admin
パスワード:設定したパスワード
で入ることが出来ます。

Start Full Scan をクリックすればあとは自動で設定したディレクトリをスキャンしてくれます。
(スキャンするファイルは、設定ファイルのextensionsに書いてある拡張子)
スキャンが終了したら、後はクライアントで聞くだけです。


3・クライアント
・rhythmboxの場合


$ sudo apt-get install rhythmbox rhythmbox-plugins


Music->Connect to DAAP share にサーバ名を入れればアクセス出来ます。

iTunesの場合
同一セグメントなら自動で発見するはずです。
見つからない場合は、avahi-daemonが起動しているが確認してください。

・その他クライアント
説明に従ってください。

繋がれば、音楽を楽しむだけですね。


4・使用感
スムーズに曲一覧をロード、再生出来ます。
回線はemobileくらいの速度があればそんなに苦労しなくても動きます。
以上。

強いて言えば、rhythmbox起動時にいちいちサーバ名を入力する必要があるくらいです。(DAAPの問題ではないですが・・・)

5・その他
著作権とか、不正アクセスなどがあるため、LAN内のみとか、VPN使うなど、直接外部には公開しないようにしてください。
(何があっても自己責任で)

自分の場合も自宅ローカル+VPNからのみアクセス可能になっています。
なお、DAAPサーバは自宅内にはありますが、セグメントが違うので、実はiTunesで使ったことは無いです。

6・余談

最近CDが増えてきました。多分120枚位あるかと思います。
棚の上に置いておいたら、地震で崩れて涙目でした。
極端にケースが破損したものは無かったのが不幸中の幸い。
東急ハンズで蓋付きのCDケースを買ってきたら、
・コンパクトにまとまる
・ホコリ防御
・積み重ねられる
など、かなり便利になり、おすすめです。

今回はほとんど技術を使っていないですが、Techカテゴリです。
Linuxで快適にコーディングするための環境構築です(キリッ

Debian+virt-managerでKVMを扱ってみた

最近、社内の開発Xenが遅い。
常時12,13台起動しているため、そろそろ新サーバを導入してもいいんじゃないかと考えています。

新サーバもXenにしようかと考えましたが、最近RedHatKVMをメインにすると言っているので、試しにKVMで仮想化してみました。
もちろんDebianです。
squeeze(testing)を使用しています。
(以前、クライアント機でチラッと使ってみた記事を書きましたが、今回は社内での開発用途で使うために構築しています)

1・KVMとは?
Linuxカーネルを使用した仮想化システム。(切替器でも某太陽社の製品でもありません)
AMD-Vなどの仮想化支援機構を使用するためシンプル。
さらに、デバイスドライバなどはLinuxのものを使用するため、Linuxの資産をそのまま活用出来ます。

2・virt-managerとは?
RedHat社からリリースされた仮想マシン管理ツール。
OSSなため、他ディストリビューションにも移植されています。
コマンド叩かなくても、クリックだけで管理出きるため便利。


3・インストール
ホスト側には、例のごとくapt-getでインストールします。



apt-get install kvm libvert-bin bridge-utils virt-manager


※なお、今回はXサーバは入れません。手元のPCにX-forwardします。
 ローカルで使用するなら、普通に起動してください。

管理に使用するユーザを、libvertグループに追加して置くと、一般ユーザで作業出来ます。

4・起動


$ ssh 192.168.100.100 -X
$ virt-manager

接続先設定が出てきたら、localhostを選択

5・新規作成

左上のNewボタンをクリックし、後は道なりに進んでいけば完成します。簡単ですね。

また、新規に領域確保・インストールだけではなく、既存のイメージからでも作成出来ます。
Xenで動いていたDebianのイメージをコピーして、
Newクリック->名前入力->import existing disk imageを選択->コピーしたイメージを選択->後は道なり
とすれば、問題なく起動しました。
ただし、自分の場合は、OS Type, VersionをGenericにしないと、virtioのドライバが入っていない関係で起動しないようです。
(もちろん、全て新規に作成した場合は動作します)

6・リソース管理など
マシンをダブルクリック->メニューのDetailsを選択 とすれば、概要だのCPU使用率やメモリ使用率の確認、その他変更などが出来ます。

この辺は触ってみれば分かると思います。

7・使用感など

KVMWindows7をいれていますが、MSOfficeくらいしか走らせないので、リモートデスクトップで快適に使用できます。
また、ゲストの方のDebianは問題なく動いています。

今回はあくまでも実験用で余っていたPCを流用して作ってみただけなので、新開発サーバを購入した時にはいろいろと性能を調査しようと考えています。
その時はまたブログに書くかもしれません。

この構成だと、本番サーバとしては不安が残るかもしれませんが、個人用開発用途程度なら実用的かと思います。

タイル型ウィンドウマネージャ stumpwm 導入

stumpwmとは、タイル型ウィンドウマネージャの一種。
ratpoisonの後継でcommon lispで実装されています。
Cで書かれたratpoisonより若干重くはなりますが、拡張性に優れており、設定ファイルもcommon lispでかけるのでいろいろと便利。

ついこの間ratpoisonからstumpwmへ乗り換えたので、導入について書いてみたいと思います。

1・乗り換えた理由
ratpoisonでもほとんど満足でしたか、一つ不満点がありました。
xrandrで解像度を変更するときに、ratpoisonを再起動しないと解像度が反映されないのが非常に面倒なことです。

再起動するとグループも再構成されてしまい、ウィンドウを再配置する必要があります。
(さらに自分の環境が悪いのかもしれませんが、既存のウィンドウを他のグループに移動しようとするとウィンドウが消えると言う妙な事柄になります)

最近割と頻繁にディスプレイを変えることがあり面倒なので、その辺に対応しているstumpwmをインストールしてみました。

2・インストール


$ sudo apt-get install stumpwm

以上。
common lispだとかいろいろ入ります。

3・設定
設定ファイルは ~/.stumpwmrc にcommon lispで記述します。


;; -*- lisp -*-
(in-package :stumpwm)
(setf *shell-program* "/bin/zsh")

;; 色
(set-fg-color "#000000")
(set-bg-color "#FFFFFF")
(set-border-color "#000000")
;; フォーカスがあるウィンドウの色
;; デフォルトは白ですが、何か自己主張が激しい(?)ので暗い赤に
(set-focus-color "#883333")
;; フォーカスが無いのは暗い青に
(set-unfocus-color "#333388")

;; フォント
(set-font "-xos4-terminus-bold-r-normal--14-140-72-72-c-0-iso8859-7")

;; あらかじめグループを作成しておく
(run-commands "gnewbg 1")
(run-commands "gnewbg 2")
(run-commands "gnewbg 3")
(run-commands "gnewbg 4")
(run-commands "gnewbg 5")
(run-commands "gnewbg 6")
(run-commands "gnewbg 7")
(run-commands "gnewbg 8")
(run-commands "gnewbg 9")
(run-commands "gnewbg 10")

;; 1番を選択
(run-commands "gselect 1")

;; 以下、独自コマンド
; urxvt起動
(defcommand urxvt () ()  (run-shell-command "urxvt"))

; 音楽プレーヤのコントロール
; audio_ctlはシェルスクリプトで、
; playが渡されたら rhythmbox-client --play 実行するように書いている
(defcommand mprev () ()  (run-shell-command "audio_ctl prev"))
(defcommand mplay () ()  (run-shell-command "audio_ctl play"))
(defcommand mpause () ()  (run-shell-command "audio_ctl pause"))
(defcommand mstop () ()  (run-shell-command "audio_ctl stop"))
(defcommand mnext () ()  (run-shell-command "audio_ctl next"))
(defcommand mshuffle () ()  (run-shell-command "audio_ctl shuffle"))
(defcommand mrepeat () ()  (run-shell-command "audio_ctl repeat"))
(defcommand volup () ()  (run-shell-command "audio_ctl volup"))
(defcommand voldown () ()  (run-shell-command "audio_ctl voldown"))
(defcommand mnotify () ()  (run-shell-command "audio_ctl notify"))

; music
(define-key *root-map* (kbd "M-z") "mprev")
(define-key *root-map* (kbd "M-x") "mplay")
(define-key *root-map* (kbd "M-c") "mpause")
(define-key *root-map* (kbd "M-v") "mstop")
(define-key *root-map* (kbd "M-b") "mnext")
(define-key *root-map* (kbd "M-s") "mshuffle")
(define-key *root-map* (kbd "M-r") "mrepeat")
(define-key *root-map* (kbd "C-0") "volup")
(define-key *root-map* (kbd "C-9") "voldown")
(define-key *root-map* (kbd "x") "mnotify")

; term
(define-key *root-map* (kbd "C-c") "urxvt")
(define-key *root-map* (kbd "c") "urxvt")

; colon
; stumpwmのデフォルトはセミコロンなため、コロンに変更して置く
(define-key *root-map* (kbd "C-:") "colon")
(define-key *root-map* (kbd ":") "colon")

;; group
;; M-Fxで切り替え *top-map* とすることでシングルストロークで実行出来る
(define-key *top-map* (kbd "M-F1") "gselect 1")
(define-key *top-map* (kbd "M-F2") "gselect 2")
(define-key *top-map* (kbd "M-F3") "gselect 3")
(define-key *top-map* (kbd "M-F4") "gselect 4")
(define-key *top-map* (kbd "M-F5") "gselect 5")
(define-key *top-map* (kbd "M-F6") "gselect 6")
(define-key *top-map* (kbd "M-F7") "gselect 7")
(define-key *top-map* (kbd "M-F8") "gselect 8")
(define-key *top-map* (kbd "M-F9") "gselect 9")
(define-key *top-map* (kbd "M-F10") "gselect 10")
(define-key *root-map* (kbd ",") "gmove")

;; window
;; 今いるウィンドウが分かりずらかったため書いてみた
;; 慣れれば必要ない
(defcommand sfnext () () (run-commands "fnext" "echo #########################################
#########################################
      C U R R E N T F R A M E
#########################################
#########################################
"))

(define-key *root-map* (kbd "C-b") "sfnext")
(define-key *root-map* (kbd "b") "sfnext")

; カーソルキーでフォーカス切り替え
(define-key *top-map* (kbd "M-Left") "move-focus left")
(define-key *top-map* (kbd "M-Right") "move-focus right")
(define-key *top-map* (kbd "M-Up") "move-focus up")
(define-key *top-map* (kbd "M-Down") "move-focus down")

; vim風のキーバインドでフォーカス切り替え
(define-key *top-map* (kbd "C-M-h") "move-focus left")
(define-key *top-map* (kbd "C-M-l") "move-focus right")
(define-key *top-map* (kbd "C-M-k") "move-focus up")
(define-key *top-map* (kbd "C-M-j") "move-focus down")

; FPS風(?)のキーバインドでフォーカス切り替え(左手だけで変更可能にするため)
(define-key *top-map* (kbd "C-M-a") "move-focus left")
(define-key *top-map* (kbd "C-M-d") "move-focus right")
(define-key *top-map* (kbd "C-M-w") "move-focus up")
(define-key *top-map* (kbd "C-M-s") "move-focus down")


そこそこ長くなった割にあまり詳しいことしてないですが、参考までに。

上記で、*top-map*は地味に便利です。
ツーストロークは指がもつれたりするので、連続でタイプする場合はシングルの方が便利です。

3・xmodmapなどのおまけ
脱線ですが、大抵の日本語キーボードは
|無変換|カナ|Alt|
みたいな配列になっていると思います。
自分の場合はカナは使わないので、Altにしています。



clear Mod1
keycode 101 = Alt_R Meta_R
add Mod1 = Alt_L Alt_R

xmodmapの設定はこんな感じです。

ratpoisonの時は keycode の設定だけで動いていましたが、stumpwmにしてから動かなくなったのでModの設定を追加しました。(環境依存かもしれません)

余談ですが、半角全角をエスケープにしておくと便利です。
(IMを有効にするのはソフト側で Ctrl-無変換にしています)


keycode  49 = Escape Kanji Kanji


カスタマイズと言えば、vimperatorについても、~/.vimperatorrc



"2.3.1 (created: 2010/04/07 18:56:53)

set runtimepath=/home/yuji/.vimperator
source! /home/yuji/.vimperatorrc.local

" vim: set ft=vimperator:

map A H
map S j
map D L
map W k
map Q <C-p>
map E <C-n>



上記のようにし、FPSっぽいキーバインドで操作可能にしてます。

ウィンドウ切り替えからブラウザまで、できるだけ左手で完結出きるようにしておくと、案外便利なのでおすすめです。

XRDPでLinuxをRDPサーバーにする

Linuxで遠隔操作と言えば、sshでコンソールにつないで作業が普通ですね。
64kbpsでも割と快適に操作でき、信頼性も高いツールです。
WebサーバーやDBサーバー用途などでは不便なことは有りませんが、クライアント用途となるとGUIで遠隔操作出来ないと辛い場面が有ります。
(Gimpを操作とか、ローカルの画像を確認など)

もちろん、X11をネットワーク経由で使うのがシンプルですが、
ネットワークが100Mでつながっているならともかく、細い帯域の場合は非常に重い。
前に自宅PCからThunderbirdX11-forwardしたところ、メールの一覧を描画するのに1分くらいかかったことが(ry
あと、vncはそれに比べればマシですが、それでも遅い。

その点、WindowsのRDP(リモートデスクトッププロトコル)は早い。
光100Mでつながっていれば、ほぼローカルにかと思えるほど早い。
社内でも、LinuxクライアントからXen上のWindowsに接続してMS-Officeなど触っていますが、非常に快適です。
M$頑張りすぎ。

クライアントのrdesktopがあるのだから、サーバーも無いかと思いググってみると、ありました。
その名も XRDP。

とりあえず入れて使ってみたので、以下その手順を書いておきます。

1・インストール

$ sudo apt-get install xrdp

以上。

2・ユーザーの追加

XRDPを使うユーザーはxrdpグループに登録する必要があるので、
/etc/group

(省略)
xrdp:x:113:hogeuser

のように、groupに追加してください。

3・サービス起動

$ sudo /etc/init.d/xrdp start

Debianなので起動しているとはおもいますが念のため)

4・クライアントから接続

$ rdesktop 172.16.10.100 -a 16 -g 1200x1600 -k ja -K

こんな感じ
ちなみに、オプションですが、

172.16.10.100 xrdpを起動したサーバーのIP
-a 16 色深度16bit(8か16しか受付ないようです)
-g 1200x166 解像度
-k ja キーボードのタイプを日本語に
        (したはずですが、効かないようです)
-K キー入力を完全にフックさせない

この状態で実行すると、ログイン画面が表示されるので、

Moduleはsessman-Xvncを選択し、
ユーザー名とパスワードを入力すれば、ログイン出来ます。

4・使用感

VNCより高速に感じます。
試しにyoutubeで適当な動画を再生してみたところ、コマ落ちはしますがなんとか見られるレベルです。
(VNCだと反応がなくなる・・・)

あとは、音の転送が出来ればなお良しですが、-r sound を追加しても音が出ない。
同じオプションでwindows機に繋ぐと音は出るのでサーバー側の問題。
(内部はVNC使っているからしょうがない?)

もしかしたら、その辺りうまい方法が有るかもしれないので、引き続き調査します。


余談
そういえば、音声転送が出来たら、iPadにRDPクライアント入れてゲームが出来そうです。

それか、windowsで同じ事すればできますね。
だが断る

まあ、どちらにろ、3G回線の場合は使い物にならないとは思いますのでWifi限定で。

外部からのsyslogを受信する

最近、社内で使用しているRTX-1000が不調で、突然telnetpingすら返さなくなる現象に悩まされています。
ログを詳細に取り、原因を究明するため、Linuxにsyslogを転送してログをとるようにしてみました。

1・RTX-1000側での設定



syslog host 172.16.0.100   # syslogサーバーのIP
syslog facility user       # facility名
syslog notice on
syslog info on
syslog debug on


設定はこれだけでOKです。

2・Linux側の設定

今回はせっかくなのでsyslog-ngをインストールしてみました。


$ sudo apt-get install syslog-ng


設定は、 /etc/syslog-ng/syslog-ng.conf を変更します。


source s_all {
        (省略)
        udp();  # これをつけないと外部から取得できない                                                                                                                                                 
}

# 保存先を指定
destination df_router { file("/var/log/router"); };                                                                                                                                                    

# フィルタの設定 172.16.0.1 からのログはフィルタにマッチ
filter f_router { host(172.16.0.1); };                                                                                                                                                                 

# ログの設定
log {
        # 全部のログから
        source(s_all);                                                                                                                                                                                 
        # f_routerフィルタのマッチするものを
        filter(f_router);                                                                                                                                                                              
        # df_routerの場所に記録
        destination(df_router);                                                                                                                                                                        
};                                                                                                                                                                                                     


C言語のような構文で割とわかりやすい書式です。

蛇足ですが、フィルタには以下のように条件を組み合わせることも出来ます。


filter f_router { host(172.16.0.1) or host(172.16.1.1); };                                                                                                                                             


設定が完了したら再起動します。


$ sudo /etc/init.d/syslog-ng restart


これでログの転送が出きるようになりました。

まだ、不安定になる現象は再現していませんがしばらくRTX-1000の状態を監視していればなにか分かるかもしれません。

・おまけ
フリーズの原因ですが、一つ心当たりがあります。
最初にフリーズしたとき、


|            |
|  ルーター  |
|  RTX-1000  |
|  ルーター  |
[↑ラックの棚]

のようにルーター同士でサンドイッチになっていいたため、筐体が触れないほど熱くなっていました。
もしかしたらコンデンサが熱でやられたのかもしれません。
外部からの攻撃よりも熱暴走が最大の敵・・・?

電子機器と熱は切っても切れない関係。そして最大の敵でもある。

世の中の管理者の皆さん。ルーターを雑に扱っていると、
忙しいときに限って壊れます。
普段から気にかけてあげてください。

ドキュメントスキャナで本を電子化

ドキュメントスキャナで本を電子化

最近、紙媒体が鬱陶しく思えてきました。
現在、コミックやラノベが合わせてかなりの数になり、読みたいものがすぐに出てこないことが多々あり困っています。
(読んでからしばらくして新刊が発売されたが、ストーリーをほとんど覚えていなかったので見返そうと思ったら、棚の奥深くに・・・)
買ったものはデータベース化しているので、買ったか買っていないかは分かっても、肝心のモノが出てこない。
さらに部屋は狭いので、保管場所に苦労する羽目に。(むしろ、そろそろ置く場所がなくなり平積みにしています)
PCならば、古いファイルでもとりあえずfindとgrepがあれば検索出来るのに・・・。

それなら電子化すればいい!

ということで、少々考えてみました。

電子化のメリット
・検索がすぐ出来る
・すぐに出てくる
iPhoneなどのモバイル機器で見ることが出来る(転送orWEBアプリでネット経由)
・場所をとらない(HDDさえあればOK)
・ディスプレイで読める

電子化のデメリット
・バラす必要がある
・手間がかかる(断裁、スキャン)
・HDDの容量を食う
・原本よりクオリティは下がる

ざっと思いついたところでこんな感じになりました。

自分としては、メリットの方が多いので断裁してスキャンすることに決定。
ググって見たところ、業務用の安いグレードでコストパフォーマンスがいいfi-6130を見付けて衝動買いしました。

自分の衝動買いにしてはいい買い物です。
第一に速い!
600dpiでも分速30P。200Pの雑誌なら7分程度。
さらに、ほとんどダブルフィードしない!
したとしても検知してすぐに止まる!

その上、TWAINに対応しており、Linuxで直接操作出来ます。
そういうことで、今回はLinuxでTWAIN対応のスキャナを使用する方法を書こうと思います。

1・SANEのインストール
SANEをインストールしてスキャナを使用出来るようにします。


$ sudo apt-get install sane sane-utils

例のごとく、以上。

2・スキャンしてみる
手っ取り早くスキャンするなら、


$ sudo xsane

でOK
rootで作業すると云々というメッセージはでますが、無視。
無視するのが嫌なら、lsusbでbusのIDを調べて/dev/bus/usb/以下のデバイスについてのアクセスを許可すればOK


sanzenin@nagisystem:~$ lsusb
Bus 002 Device 005: ID 0925:1801 Lakeview Research
Bus 002 Device 003: ID 04fe:000d PFU, Ltd
Bus 002 Device 002: ID 046e:5244 Behavior Tech. Computer Corp.
Bus 002 Device 004: ID 047d:2041 Kensington
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 006: ID 04c5:114f Fujitsu, Ltd
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

PFUFujitsuがみえますが、PFUの方はHHKBなのでFujitsuの方で。


sanzenin@nagisystem:~$ ls /dev/bus/usb/001/006 -l
crw-rw-r-- 1 root scanner 189, 5 2010-04-01 01:46 /dev/bus/usb/001/006

777にするか、ユーザーをscannerグループに追加するかはお好みで。

xsaneを起動すると、こんな感じ。



大まかな手順は、
1・原稿一枚をセット
2・左側のプレビュー画面での左下にあるAcquire previewをクリックし、プレビューを表示
3・プレビュー画面に表示された原稿を選択してトリミング
4・お好みで色などを調整
5・真ん中のメインウインドウ上部の読み取りページ数(ここでは32になっている部分)でページ数を指定
6・読み取る数だけ原稿をセットし、同ウィンドウのScanボタンでスキャン開始

右側のDF actionなどと書いてある部分はスキャナによって表示は異なるようです。
fi-6130の場合は、ダブルフィードを検出する方法の選択(傾き、超音波、長さ)、背景色(白、黒)、バッファの使用などの設定が出来ます。

細かいパラメータは詳しくないので割愛。

3・コマンドラインからスキャン
GUIは楽でいいですが、カラーページとモノクロページがランダムに入っている雑誌の場合、いちいち設定を切り替える必要があります。
設定をクリックして読むのは非常に面倒なわけで、コマンドでバッチ化出来ればかなり楽になります。また、独自のフロントエンドも作れたりします。
コマンドの場合は、scanimageを使用します。


$ sudo scanimage \
--format tiff \ # 出力はtiff画像
--mode Color \  # カラーモードでスキャン
--resolution 300 \  # 300dpi
-b \                # ?
--source 'ADF Duplex' \ # ADF両面
--bgcolor black \       # 背景色黒
--page-width 182 \      # 横182mm
--page-height 259 \     # 縦259mm
--df-action=Stop \      # ダブルフードした場合は停止
--df-thickness=yes \    # 重なり検知ON
--df-length=yes \       # 長さ検知ON
--brightness=12 \       # 明るさ12
--contrast=3 \          # コントラスト3
--batch="%.4d.tiff" \   # 連番の振り方
--batch-start=1         # 連番の開始

こんな感じでオプションを指定し、実行すればスキャン出来ます。
他のオプションは、scanimage --helpで確認可能です。
(スキャナに問い合わせて、独自のオプションも拾ってくるので、反応が帰ってこなくてもしばらく待ってください)

4・すごくいい加減なバッチ


#!/bin/bash

page=$((`ls | sort -n | tail -n 1 | grep -o '[0-9]*' | sed 's/^0*//'` + 1))
while true
do
echo "-----------------------------"
echo "Current page is $page"
echo "input [c/l]"
while true
do
read  type
if [ "$type" = "c" -o "$type" = "l" ]
then
break;                                                                                                                         
fi
echo "Undefined type. input c or l"
done

if [ "$type" = "c" ]
then
echo scan color
sudo scanimage \
--format tiff \
--mode Color \
--resolution 300 -b \
--source 'ADF Duplex' \
--bgcolor black \
--page-width 182 \
--page-height 259 \
--df-action=Stop \
--df-thickness=yes \
--df-length=yes \
--brightness=12 \
--contrast=3 \
--batch="%.4d.tiff" \
--batch-start=${page}

elif [ "$type" = "l" ]
then
echo scan lineart
sudo scanimage \
--format tiff \
--mode Lineart \
--resolution 600 -b \
--source 'ADF Duplex' \
--bgcolor black \
--page-width 182 \
--page-height 259 \
--df-action=Stop \
--df-thickness=yes
--df-length=yes \
--brightness=40 \
--contrast=55 \
--batch="%.4d.tiff" \
--batch-start=${page}

fi
page=$((`ls | sort -n | tail -n 1 | grep -o '[0-9]*' | sed 's/^0*//'` + 1))
done


いちいちカラーとモノクロのコマンドを打つのが面倒なので、簡単なバッチファイルを作成しました。
1・カラーとモノクロを選択
2・ADFに入っている原稿をすべてスキャン
3・スキャン終了したら最後の画像+1をbatch-startに設定し、1へ戻る

スクリプトも設定値もかなりいい加減なので、あくまでも参考程度にしてください。

現在、上記スクリプトGUIで出きるように空いた時間でちまちまプログラム組んでます。(perl-gtk使用)
こちらも出来たらそのうちに公開するかもしれません。
現在はボタンを押したらスキャン開始して、最新の画像をプレビュー表示することが目標ですが、将来的にはトリミングや画質調整が出来ればいいなとか思ってます。

あと、画質の設定値は色々と試行錯誤中。なかなか綺麗にならない。
単行本をスキャンするにあたって、表紙くらいは綺麗にスキャンしたい。モノクロ2値なページならそこそこ綺麗にスキャン出きるが・・・。

とりあえず、全書籍の電子化に一歩近づきました。漫画雑誌はすべてスキャンしようかと思います。
単行本についても雑誌が終わり次第着手。
ラノベは読み終わったものから着手。
漫画はiphoneでも何とか読めますが、ラノベは解像度が高くないとどうしても読みにくいので(約40x40をリサイズなしですべて表示する必要あり)後回しに。
ラノベを読むデバイスとして、iPadにはかなり期待しています。
大きさそこそこ、解像度そこそこ。
静かで持ち歩きも出来るとくれば、便利に使えそうです。

余談ですが、iPadについては日本の電子書籍よりも、個人で自炊したもののビューワとして普及したりしてと思ってみた今日この頃です。

さらに余談ですが、念のため・・・スキャンしたデータはどこかに公開とか流出とかさせないようにしてください。あくまでも私的利用の範囲内で。
自分の場合は、内部からのみアクセス可能なサーバーに保存。外部からは自分専用のOpenVPN経由でしかアクセス出来ないようにしています。(というか、自作ビューワが適当すぎてry)
あと、原本については、後々スキャンすることがあるかもしれないので、ダンボールに入れてクローゼットに保管しています。

OpenVPNで拠点間VPN

OpenVPNで拠点間VPN

元々、個人専用のWEBサーバーを立ち上げ、ファイルサーバーのデータを外部から参照可能にしているが、
単純にファイルを転送するだけならともかく、ディレクトリごとダウンロードや、一部だけ読み取ることなどは出来ないため割と不便。
解決法はWebDAVとかFTPとかいろいろとある中、どうせなら自宅ネットワークに直接接続出来れば、便利じゃないかと思いVPNを張ることを計画。
NFSとかFTPとかSVNとかrsyncなどの内部用の設定なため、外部に公開したらひどいことになる通信も使える!)
VPNといえば、IPSecとかPPTPなどの有名どころはありますが、割と設定が面倒で設定をしっかりしないと穴が開くこともあるので、設定が簡単な(デフォルトでもそこそこしっかりしている)OpenVPNを採用。

OpenVPNとは
SSLVPNの一つで、設定がシンプル。そこそこ堅牢。IPSecなどと違い、ユーザーランドで動作するのでセキュリティホールがあった場合にも影響が少ないはず。暗号化の方式も割と自由に選択可能。

以下、詳しいことはいつものとおり割愛して、具体的な設定方法。

インストール


$ sudo apt-get install openvpn


証明書の作成
まずは、easy-rsaをコピー


hoge@localhost:~$ sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa-hoge/


移動


hoge@localhost:~$ cd /etc/openvpn/easy-rsa-hoge/


お好みにより証明書の内容を編集(オレオレ証明書なので適当に)


hoge@localhost:/etc/openvpn/easy-rsa-hoge$ vi vars
##############
export KEY_COUNTRY="HO"
export KEY_PROVINCE="GE"
export KEY_CITY="hogecity"
export KEY_ORG="Hoge corp"
export KEY_EMAIL="me@myhost.mydomain"
##############


varsの内容を環境変数にセット


hoge@localhost:/etc/openvpn/easy-rsa-hoge$ . ./vars


CAを作成


hoge@localhost:/etc/openvpn/easy-rsa-hoge$ ./build-ca
Generating a 1024 bit RSA private key
......++++++
......++++++
writing new private key to 'ca.key'