OpenSSHを使ってRSA公開鍵認証なchroot付きSFTPサーバを立てる方法

簡単なように思えて,結構ハマったのでメモしておきます.
SSH サーバは既に稼働していることを前提に書きますので,SSH,SSHd の細かい設定は他サイト様に委ねます.

仕様および前提

sftpを許可するユーザ: ftpuser(シェルでのログイン不可)
ftpuserの所属グループ: ftpgroup
ftpuserのhome: /home/ftpuser
ftpuserに公開したいディレクトリ: /pass/to/chrooted

環境

$ lsb_release -drc
Description: Ubuntu 11.10
Release: 11.10
Codename: oneiric

$ uname -r
3.0.0-13-generic

$ ssh -v
OpenSSH_5.8p1 Debian-7ubuntu1, OpenSSL 1.0.0e 6 Sep 2011

まずサーバ側でftpgroup,ftpuser を作成します.

# groupadd ftpgroup
# useradd --create-home --home /home/ftpuser --shell /bin/false -g ftpgroup

確認

$ getent group | tail -n 1
ftpgroup:x:133:ftpuser

$ getent passwd | tail -n 1
ftpuser:x:1001:133::/home/ftpuser:/bin/false

/etc/group/etc/passwd を直接編集するという強行手段でも構わないのですが,ログオフが必要な上に結構危険です.
編集するにしても,vigrvipw という専用のコマンドがあります.

クライアント側でRSA鍵ペアを作成します.既に作成済みの場合,飛ばしてください.

$ ssh-keygen -t RSA -b 2048

できたら,エディタでもUSBメモリでもscp でも構わないので,クライアントの~/.ssh/id_rsa.pub をサーバの/home/ftpuser/.ssh/authorized_keys にコピーします. ((今回はPC1 -> PC2 へはssh可能,PC2 -> PC1 へはsftp のみ可能としたかったので,scp 使えるならsftp 要らないじゃん,というツッコミは無しで.))
通常のSSHと同じですね.
パーミッションは以下のように設定します.

/home                755   root:root (おそらくデフォルトでOK)
/home/ftpuser          755   root:root
/home/ftpuser/.ssh        700   ftpuser:ftpgroup
/home/ftpuser/authorized_keys  600   ftpuser:ftpgroup

処理系によっては,authorized_keys が700 の場合もあるようです.既にSSH ログイン可能なuser の/home/user/.ssh を確認してみてください.
ここで注意しなければならないのが,/home/ftpuser の所有者がroot だということです.とはいえ,ここまでは単にchown すればいいだけです.
問題はここからです. /passpass/to//pass/to/chrootedもそれぞれ所有者がroot かつ他ユーザの書き込み不可である必要があります.
「そうすべき」ではなく「そうする必要があります」.
これは,セキュリティの観点からルール化されたものです.詳しい背景はここに書いてあります
それじゃあ/pass/to/chrooted/media/hard_disk/ftp にしたいけど,/media/hard_disk の所有者は一般ユーザに残しておきたい・・・ということができないかというと,そんなことはありません.以下に方法例を書いておきます.と言ってもSimLink貼るだけです.

# cd /home/ftpuser
# ln -s /pass/to/chrooted ./
# chown root:root /pass/to/chrooted
# chmod 755 /pass/to/chrooted

/home/ftpuser の所有者はroot に設定してあるので,/pass/pass/to(あるいは/media/media/hard_disk)の所有者がroot である必要はなくなります.
また,/pass/to/chrooted の所有者はroot である必要があるのですが,/pass/to/chrooted/data の所有権はftpuser:ftpgroup で構いません.
普段使ってるユーザをftpgroup に加えておくか,/pass/to/chrooted/data のパーミッションを777 にでも設定すれば管理が楽でしょう.おそらく前者のほうがセキュリティ的には好ましいと思われます.

次に/etc/sshd_config をエディタで編集します

#AuthorizedKeysFile %h/.ssh/authorized_keys
AuthorizedKeysFile %h/.ssh/authorized_keys

#Subsystem sftp /usr/local/libexec/sftp-server
Subsystem sftp internal-sftp

# 最後の行に以下を追記.全角スペースは半角に変換
Match user ftpuser
 ChrootDirectory /home/ftpuser/chrooted
 AllowAgentForwarding no
 X11Forwarding no
 AllowTcpForwarding no
 ForceCommand internal-sftp

internal-sftp を使うのは,ftpuser はchroot をかけたディレクトリの外に出られないからです.
つまり,/usr/local/libexec/sftp-server にもアクセスできなくなるからです.

書けたら

/etc/init.d/ssh restart

クライアント側からサーバ(192.168.1.1)にアクセスしてみます.ssh -p-p はポートですが,sftpでは-P(大文字)です.

$ ssh -p 10000 ftpuser@192.168.1.1
Enter passphrase for key '/home/client_user/.ssh/id_rsa':
This service allows sftp connections only.
Connection to 192.168.1.1 closed.

$ sftp -P 10000 ftpuser@192.168.1.1
Enter passphrase for key '/home/client_user/.ssh/id_rsa':
Connected to 192.168.1.1.
sftp> exit

上手くいかなければssh -vsftp -v してみれば何か分かるかもしれません.
もう一度,所有権をまとめて書いておきます.

/home/ftpuser/:
drwxr-xr-x root:root .
drwxr-xr-x root:root ..
lrwxrwxrwx root:root share -> /pass/to/chrooted

/home/ftpuser/.ssh:
drwx------ ftpuser:ftpgroup .
-rw------- ftpuser:ftpgroup authorized_keys

/pass/to/chrooted
drwxr-xr-x root:root .
drwxrwxrwx ftpuser:ftpgroup data

nautilus のFile -> Connect to Server にでも登録しておくと便利かもしれません.

参考サイト
restrictive ssh problem (ForceCommand, ChrootDirectory): Write failed: Broken pipe
あるシステム管理者の日常: sftpとChrootDirectory(3)
 

Ubuntu 12.04 64bitでPT2を使う(Ubuntu 10.10〜12.04対応)

この記事は,あくまで技術上可能なことを一般論として説明したもので,PT2,カードリーダー,その他のハードウェアおよびソフトウェアの使用を推奨するものではありません.
また,この記事を読んだことにより読者に生じた一切の損害を管理人soraochiは負わないものとします.

話題にするには遅すぎる感はありますが,PT2 とB-CAS カード買ってきました.
B-CASカードのオマケでKTV-FSUSB2が付いてきましたが,これはまた今度改造します.

追記 KTV-FSUSB2(殻のほう)は友人にあげてしまいました


今回,PT2 をUbuntu 10.1011.10 64bit12.04 64bit で使ってみました.同様の記事が他ブログでも盛んに書かれていますが,中には怪しいものもあるような気がします ((あまり余所を批判したくないのですが,無条件にLNB電源をオンにすることを推奨するのは如何なものか)).
このブログも知識,手順,解決方法の面で怪しい点が多々あることは自覚しておりますが,ここはひとつ,先人の言葉を引用させていただき,開会の言葉とさせていただきます.

このページに存在するすべての間違いは、意図されていたかいなかったかに関わらず、読者のための練習問題もしくは冗談である

まずは環境紹介から.

マシンスペック

OS Ubuntu 11.10 64bit Ubuntu 12.04 64bit
CPU Core2Duo E8400
マザーボード GA-P35-DS3
ビデオカード GV-NX96T512HP

今回追加するハードウェア

主役 PT2 Rev.B
ICカードリーダー SCR3310-NTTCom (+青CAS)
予備のカードリーダー Reflex USB v2

ICカードリーダーを使えるようにしましょう.

sudo apt-get install libccid pcsc-tools libpcsclite-dev pcscd

B-CASカードの裏表に注意してください.B-CASカードの裏面が見えるように差し込むのが正解です.
これは,住基カード等では表面,B-CASカードでは裏面にICチップの接点があるのが原因だと考えられます.

できたら

sudo pcsc_scan

を実行してください.ズラズラと文字が出て,最後に

Japanese Chijou Digital B-CAS Card (pay TV)

が出たら上手くいってます.確認できたらCtrl+C で終了します.
もしマイナーなカードリーダーを使っていて,「Waiting for the first reader...」で止まってしまった場合はいるかのさんの記事を参考に/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist を編集します.

編集したら

sudo /etc/init.d/pcscd restart

を忘れずに.

それでもダメな場合(うちがそうでした)諦めましょう・・・と言いたいところですが,昔アキバで100円で買ったカードリーダーReflex USB v2 があったので,試しに使ってみました.
買ってきたままの状態ではLinux 64bit では使えないので,ファームをアップデートしてやる必要がありました.ファームのアップデートはUbuntu 11.10 64bit からでも可能です.
Reflex v2購入->SCR331に書き換えてみるテストを参考にSCMのホームページからSCR331のファームをダウンロードして/home/user にでも展開します.ファームの当て方の例を書いておきます(バージョンによって違うと思う)

cd FWUpdate_SCR531_SCR331_linux_USB_V5.25
./install.sh
./fwupdate_v1.6

Browse からSCR531_V525.bin を選択.Reader はそれっぽいのを選択 -> Download

その後,Linux 64bit用ドライバをインストールします.ここからダウンロードできます.稀奇特にも同型のものをお持ちの場合ご利用ください.

SCMのカードリーダーは,カードが刺さった状態で正常動作しているとLEDが点滅するようです.LEDがつきっぱなしの場合,B25のデコードが上手く行かない可能性が高いです.
多くの場合,テスト録画の段階で気付くと考えられますので,対処法は後ほど書きます.

さて,次にARIB STD-B25 仕様確認テストプログラムをmake install します.
ttp://www.marumo.ne.jp/db2007_b.htm#25 から「ARIB STD-B25 仕様確認テストプログラム」の最新版をダウンロードしてコンパイルするのがスジですが,下記方法の方がmakefileが既に作られてるので楽です.
インストールされるバージョンも0.2.4 で同じですので,下記を薦めます.

sudo apt-get install build-essential
wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip
unzip c44e16dbb0e2.zip
cd pt1-c44e16dbb0e2/arib25
make
sudo make install

Ubuntu 11.10 ではカーネルのバージョンが異なるため,従来の方法ではchardev 版ドライバのコンパイルが通りません.また,recpt1 のBS新 チャンネルに対応させるため,sourceforge のepgrec 置き場からrecpt1 のtar.gz をダウンロードしましょう

(2011 年10 月にBS のチャンネルが再編成されました.詳しくはググってください).
2011年12月03日現在の最新版では,解凍するとディレクトリ「pt1-7662d0ecd74b」ができます.
Kernel3系だとdriverのコンパイルに失敗するため,パッチ済みのpt1_pci.c

も合わせてダウンロードしておきます.

$HOME に展開したと仮定すると

cd ~/pt1-7662d0ecd74b/recpt1
make
sudo make install
cd ../driver
make
sudo make install

これで/usr/local/bin/ にb25 およびrecpt1 がインストールされます.
PT2を刺すと,Ubuntu 10.10 からは標準ドライバ(DVB版)が使われるようになったそうです.詳しい方がDVB 版で試しているようですが

僕は成功例の多い「chardev版」を使いました.
Ubuntu 11.10 でも引き続き「chardev版」を使います.12.04でも同様にchardev版を使います。

/etc/modprobe.d/blacklist.confの最後の行にblacklist earth-pt1 を追記すればDVB版ドライバはロードされなくなります.

sudo apt-get install mercurial autoconf automake
hg clone http://hg.honeyplanet.jp/pt1 PT2
cd PT2/driver
make
sudo make install

ここで一回再起動します.既にPT2 を刺してるかたは,再起動でなく電源オフ→オンしたほうが良いです.僕はこれでハマりました.

PT2 が認識されているかは

$ lspci |grep Xilinx
06:01.0 Multimedia controller: Xilinx Corporation Device 222a (rev 01)

chardev版ドライバが使用されているかは

$ ls -lart /dev/ |grep pt1
crw-rw-rw- 1 root video 250, 3 2011-03-03 20:58 pt1video3
crw-rw-rw- 1 root video 250, 2 2011-03-03 20:58 pt1video2
crw-rw-rw- 1 root video 250, 1 2011-03-03 20:58 pt1video1
crw-rw-rw- 1 root video 250, 0 2011-03-03 20:58 pt1video0

で確認ができます.「$ ls /dev/dvb/」でadapter0〜3が出てくるときは,DVB版ドライバがロードされています.

インストールできたら

recpt1 --b25 --strip 22 30 test.ts

を試してみましょう.SSD を使ってる等の理由で,カレントディレクトリに大きなサイズのファイルを作りたくない場合,予め適宜cd してください.
東京タワーから受信している場合,TBS(22ch)が30 秒録画されるはずです.

totem test.ts

再生できたら成功です.画質がとんでもなくショボいときは,アンテナの接続を疑いましょう.ワンセグで録画されている可能性があります.

もし下記のようなエラーが出たら

Recording...
b25->put failed
b25_decode failed (code=-4). fall back to encrypted recording.

B25 のデコードができていません.どうやらOneiric(Ubuntu 11.10)のスマートカード周りにバグがあるみたいです.Marverick(10.10) のものなら正常動作する可能性があります.(参考)Ubuntu11.10 で録画用サーバ

/etc/apt/sources.listの末尾に

deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu maverick main universe
deb-src http://ftp.jaist.ac.jp/pub/Linux/ubuntu maverick main universe
deb http://security.ubuntu.com/ubuntu maverick-security main universe
deb-src http://security.ubuntu.com/ubuntu maverick-security main universe

を追記後

sudo apt-get update
sudo apt-get remove pcscd libpcsclite-dev libpcsclite1 libccid libpcsc-perl pcsc-tools
sudo apt-get install pcscd=1.5.5-3ubuntu2.1 libpcsclite1=1.5.5-3ubuntu2.1 libccid=1.3.11-1

libpcsc-perl=1.4.8-1pcsc-tools=1.4.16-1 は,依存関係を解消できないらしく,簡単にはインストールできませんでした.

The following packages have unmet dependencies:
libpcsc-perl : Depends: perlapi-5.10.0

libpcsc-perl=1.4.8-1pcsc-tools=1.4.16-1 のLucid のdeb パッケージを拾ってきてインストールすると,動くには動くんですが依存関係が壊れてapt に叱られます.
それでは元も子もないので,次の方法を使いました.ただし,かなりゴリ押しな上に,メンテナに検証されていない組み合わせなのでお薦めはしません.

pcscd,libpcsclite1,libccidを,インストールしたバージョン(pcscd=1.5.5-3ubuntu2.1 libpcsclite1=1.5.5-3ubuntu2.1 libccid=1.3.11-1)で固定する.apt-get ならhold,Synaptic ならPackage -> Force version

apt-get install pcsc-tools=1.4.16-1

依存関係からlibpcsc-perl=1.4.12-1build1 がインストールされる

pcsc-tools とlibpcsc-perl のバージョンを固定する

ここで何をしているのかもう少し詳しく説明します.
まず,libpcsc-perl=1.4.8-1perlapi-5.10.0 に依存していて,pcsc-tools=1.4.16-1libpcsc-perl に依存しています.
Ubuntu 11.10 のperl5.12.4-4 なので,perl のバージョンを落とすという吹っ飛んだことをしない限りはlibpcsc-perl=1.4.8-1 はインストールできません.
しかし,pcsc-tools=1.4.16-1libpcsc-perl に依存しているにすぎず,libpcsc-perl=1.4.8-1 である必要は,少なくとも依存関係の上ではありません
ということで,libpcsc-perl のみをOneiric,他をMaverick でインストールするというゴリ押しをしたのでした.

以上の作業が終わったら,追加したmaverickのapt-lines はコメントアウトします.

次にepgrec

を使えるようにします.epgrec は,PHP で書かれた録画予約システムです.動かすには,PHP+Apache+MySQL が必要です.

sudo apt-get install apache2 php5 libapache2-mod-php5 php5-cli mysql-server php5-mysql

入っていなかった場合,インストールしたら念のため再起動しておいてください.
これでApacheがインストールされるのですが,もしセキュリティ的に気になるようであれば,/etc/apache2/apache2.conf,あるいは/etc/apache2/httpd.confにLocalからしかアクセスできない設定を記述してください.(まあ,ポートが野放しにでもなってない限り,外部からはアクセスできないと思いますが)

また,epgrec は「epgdumpr2」にも依存しています.epgdumpr2 は,「インストール前の準備」からepgdumpr2-utf8.tar.gz,あるいはepgdumpr2.tar.gzをダウンロードし,以下のようにインストールします.
epgrec およびepgdumpr2 はsourceforgeから最新版をダウンロードし,解凍しておきます.

cd epgdumpr2
make
sudo cp epgdump /usr/local/bin

test.tsのあるディレクトリで,$ epgdump test test.ts - | less を実行してズラーッっと番組名っぽいのが出てきたら成功です.

$ at を実行して The program 'at' is currently not installed が出てきたら,aptから入れてください.
また,上記サイト記載のとおり,apache2 からat を実行できるようにしておきます.

引用:

/etc/at.denyの設定
epgrecはWebサーバーのユーザーアカウント(Debian/Ubuntuはwww-data、RedHat?系ではapache)でatコマンドを実行しますが、セキュリティ上の配慮からatの使用禁止ユーザーリスト/etc/at.denyに、Webサーバーのアカウントが設定されている場合があります。
管理権限(root)で/etc/at.denyを開き、www-dataやapacheといった、Webサーバーのアカウントが含まれていないか調べ、含まれていたら、その行を必ず削除してください。

/etc/passwdの確認
一部のディストリビューションでは、セキュリティ上の配慮からWebサーバーのアカウントにnologin(ログイン不可)が設定されています。nologinのアカウントではatコマンドも利用できず、epgrecによる録画予約が機能しません。 rootアカウントで/etc/passwdを開き、Webサーバーのアカウント(apacheなど)のエントリを調べ、シェルの設定が/sbin/nologinに設定されているようなら、/bin/shに変更しておきましょう。

apache:x:48:48:Apache:/var/www:/sbin/nologin
↓下記のように変更
apache:x:48:48:Apache:/var/www:/bin/sh

以上の設定をしっかりと行っておかないと、録画予約に失敗します。

MySQLで,必要なテーブルを作っておきます.
この操作では,特段MySQLの設定をしていない場合MySQL のroot 権限が必要ですが,Ubuntu のroot 権限は要しません

mysql -u root -p

create database epg;
grant all privileges on *.* to [username]@localhost identified by '[Password]';
exit

username,password,データベース名(例ではepg)は,なんでも構いません.
よく分からなくなってしまったら,PHP もインストールしたことですし,PHPMyAdmin 使うといいです.

epgrec を

sourceforgeのreleaseページからダウンロードして展開,設定します.

tar zxvf epgrec-20100322.tar.gz -C /var/www/
cd /var/www/epgrec
cp config.php.sample config.php
cp do-record.sh.pt1 do-record.sh
gedit /var/www/epgrec/config.php

エディタでconfig.php 内のチャンネルマッピングを設定します.
物理チャンネルは,どの中継局から電波を取っているか(あるいはCATVのパススルーか,トランスモジュレーションか,集合住宅の場合U-U 変換,U-V 変換をしていないかetc・・・)によって異なります.東京タワーから電波を取っている場合,このページ記載の通りです物理チャンネルは,地上波デジタル/地上波アナログの場合,13ch〜62ch の間で設定されるチャンネルであり,リモコンのチャンネルとは一般に異なります.

設定できたら,ホームディレクトリ(あるいは大きいファイルが生成されても構わないディレクトリ)に移動し

OUTPUT=test.ts CHANNEL=22 DURATION=30 TUNER=0 MODE=0 TYPE=GR /var/www/epgrec/do-record.sh

を実行します.チャンネルは適宜変えてください.東京タワーから電波を取っている場合,上記コマンドでTBS が30 秒録画されたら成功です.上手くいかなければ,TUNER の番号(0〜3)を変えてみてください.
うまくいったら,http://localhost/epgrec/にアクセスします.言われるがままに設定してください.データベース名,パスワードはさっき設定したやつです.
もしなんらかの理由(SSD を使っている,他の大容量HDD に保存したい・・・等)で/var/www/epgrec/video/以下に録画したデータを直接置きたくない場合,この設定で相対パスを書いてもいいんですが,SimLink 貼っておくんでも大丈夫です.

ちゃんと設定したはずなのにEPG を受信できないチャンネルがある場合,電波の受信状態を確認してください.確認後,http://localhost/epgrec/getepg.phpにアクセスし,正常に取得できていればOKです.僕はここでハマりましたが,結局,分配器がショボかったのが原因でした.(分配器くらいケチらずいいものを買いましょう.あと,タコ足するならブースター付けましょう)

EPGを常に最新に保っておきたい場合,cronの設定が必要です.僕はいまのところ設定してません.必要になったらやればいいと考えてます.

EPG の自動更新は,例えば以下のように設定します.この場合,午前4時30分に更新されます.

crontab -e
30 4 * * * /var/www/epgrec/getepg.php

権限の与え方にもよるのですが,

sudo su
sudo www-data

を実行してからのほうが良いかもしれません.

あとはhttp://localhost/epgrec/にアクセスして録画予約するだけです.

・・・Ubuntu 10.10 よりはハードルが上がりましたが,できないことはないです.

参考URL
Ubuntu10.10を使って快適な地デジ録画環境を作る①〜④
epgrecのインストールと設定

追記(2012-05-05) カーネルのバージョンが変わったときは,ドライバの再インストールが必要です.aptからカーネルをアップデートした際にも必要です.

cd ~/pt1-7662d0ecd74b/driver
make
sudo make install

2011年3月  10.10版公開
2011年12月  11.10向けに全面改訂
2012年09月  12.04で動作確認.少しだけ改訂

gnuplotによる関数近似とガウス分布での例

gnuplotは,単体で最小自乗法による関数近似ができます.関数は計算機上で表現可能な任意関数ですので,テーラー展開,フーリエ級数展開,ガウス関数など,色々扱えます.
今回は例として,ガウス分布の関数近似が妥当であるかの検証をしてみます.

ガウス分布に従うデータとして,微小時間当たりの放射線量,試験の採点結果が有名です.
インターネットでいいデータがないかと探してみたら,次のものを見つけました.

平成23年新司法試験短答式試験結果 平成23年短答式試験結果[PDF:148KB]
平成23年新司法試験短答式試験得点別人員調(各科目最低ライン40%点以上)
http://www.moj.go.jp/jinji/shihoushiken/jinji08_00048.html

データを加工して,gnuplotで扱える形式にしました(問題があれば消しますので言ってください).上限,下限の点数については悩みましたが,140〜314点で考えることとしました.
結果テキスト

これをplotすると

set xrange [140:314]
set yrange [0:120]
plot 'sihou_s' pt 2 lt -1 lw 2


こうなります.どう見てもガウス分布です.

関数近似をする前に,μとσの初期値を与えてやらないと計算が上手く収束しません.
μは,理想的には最大値を与えているxとなるはずですので,μ=230を初期値とします.σは見当がつきにくいので,大雑把に目分量で20としておきます.
また,表中の全人数Nは,7797人です.

sigma=20
mu=230
f(x)=7797/(sqrt(2*pi)*sigma)*exp((-(x-mu)**2)/(2*sigma**2))
fit [140:314]f(x) "sihou_s" using 1:2 via sigma,mu

Final set of parameters Asymptotic Standard Error
======================= ==========================

sigma = 30.4499 +/- 0.3865 (1.269%)
mu = 229.571 +/- 0.4721 (0.2057%)

早速代入してみましょう

set xrange [140:314]
set yrange [0:120]
sigma=30.4499
mu=229.571
f(x)=7797/(sqrt(2*pi)*sigma)*exp((-(x-mu)**2)/(2*sigma**2))
plot 'sihou_s' pt 2 lt -1 lw 2, f(x) lt 1 lw 2 w l


概ね合っているように見えます.

ここで,じゃあ本当のμとσはいくらだったのか?という疑問が残りますが,表計算ソフトで一瞬で求まります.

μ=226.96
σ=29.489

このデータもさっきのグラフにまとめて載せてみましょう.

赤がgnuplotのfitにより求めたμとσによるガウス分布*N,青が表計算ソフトで求めたμとσによるガウス分布*N,黒が実測値とエラーバーです.
エラーバーで汚くなっておりますが,エラーバーの大きさの割に,赤と青が近いことが分かります.
ただし,実際の値はgnuplotが吐き出したAsymptotic Standard Errorの範囲内に収まっていないです.
gnuplotによる関数近似は手軽で有用かもしれないが,過信はよろしくないということが分かりました.

"Adobe Flash Player Setting"に対してクリックが効かなくなった時の対処法

Ubuntu 64-bit + Firefox3.6を使っております.
Cookieの要求などで,"Adobe Flash Player Setting"が出てもクリックが効かず,かといって押せないとFlashが使えなくなるという地味に痛い不具合に当たりました.

[ubuntu] no reaction when I click on the "Adobe Flash Player Setting" panel
これと同じ状況です.しかし上記フォーラムにある通りの方法で解決いたしました.すなわち,Flash Player Helpで設定すれば,"Adobe Flash Player Setting"で設定したのと同様の効果を得られるようです.

根本的解決は成されておりませんが,僕の環境では表題の件は解決いたしました.

Debian lennyからsqueezeにdist-upgrade

ルータ機をlenny からsqueeze にdist-upgrade しました.
SSH 経由でちゃちゃっとやりましたが上手くいきました.X は使っていないし使う予定もないので気楽でした.

自作のスクリプトやbind の設定ファイルをバックアップした後,

$ su
# apt-get update
# apt-get upgrade

# nano /etc/apt/sources.list

lenny を squeeze に変更.つまり,

sed -e s/lenny/squeeze/

squeeze からは debian-volatileが廃止されるようです.ついでに/etc/apt/sources.list から外しておきましょう.

# apt-get update
# apt-get upgrade
# apt-get dist-upgrade
# reboot

デフォルトのシェル(つまり/bin/sh)をdashにするか?という主旨のことをdist-upgrade 中に聞かれました.
よく分からないのでググったら,こういうことらしいです.

MEMO:はてな支店 [shell]dash

僕はbash に慣れきっているので(←もちろん賛否両論あることは知っています),「No」を選択しました.

アップグレード後,NATが上手く動作しなくなってしまったのですが,ルータの/etc/network/interfaces を見たり,クライアントのネットワークを再起動したりしていたら繋がるようになりました.

メイン機(Ubuntu 10.10 Maverick)とHTTPサーバ(Debian lenny)は,動いているアプリケーションがあまりにも多く,躓く可能性が高いので様子見にしました.そのうちやります.

参考URL
cpn blog vmware で Debian lenny から squeeze へアップグレード
Debian 6.0 Squeeze アップグレード

GPSを用いStratum 1 NTPサーバを構築することについての検討

2018年6月23日:TeXの記法について訂正いたしました

一般にPCの時計は精度が悪いので,何らかの方法で定期的に校正してあげる必要があります.
現在,うちではcron.dailyでntpdateを1日に1回実行しているのですが,最大で8秒ほどの誤差が出ていると考えられます.概念図を以下に示します.

もっとも,線形に誤差が増えていくとは限りません.また,1日目にntpdateを実行する直前の誤差⊿t1と,2日目にntpdateを実行する直前の誤差⊿t2は実際には異なります.それに,ntpdateは時刻を緩やかに訂正します.ですので,上図はあくまで概念図です.

図にも書きましたが,ntpdateを実行する直前と直後の時刻差の絶対値は8秒程度です[注1].8秒というのはあまりにも大きいです.
ntpdateを1日に8回実行すれば,誤差をいたるところで1秒程度に減らすことはできます[注2].しかし1秒の誤差ではまだ大きいですし,かといってNTPサーバに問い合わせる回数は増やしたくありません.そこで,GPS時計の出番です.

GPSというのは,ご存知のようにGlobal Positioning Systemの略称です.電波が,衛星からGPSレシーバに到達する時間を距離に換算し,位置を特定します.これが一般的な使われ方です.
逆に,一度位置を特定すれば,時刻を求めることができます.GPS衛星は原子時計を搭載していますので,求めた時刻はかなり正確です.これがGPS時計の原理です.

GPSレシーバの中には,衛星から受信した1PPS信号(矩形信号の立ち上がりが毎分の0.000...秒に一致している)を出力できるものがあります.
そんな面倒なことをしなくても,GPSからの時刻をセットすればいいじゃないかと思うかもしれませんが,次のような理由により1PPSを利用したほうがより正確です.

http://time.qnan.org/より引用

What is the difference between "PPS" and "GPS time"? PPS is simply an electrical signal pulsed by the GPS unit once a second. It very precisely indicates the start of a second. "GPS time" is the actual time of day, such as 12:34:56 UTC, that is provided in NMEA data as described in an earlier section. The downside of the GPS time is that it is much less precise than PPS, and so a PC that's attempting to synchronize with just NMEA data may be off by hundreds of milliseconds without knowing it. This is why it is important to combine the GPS time with the PPS signal, or use just the PPS signal from the GPS and acquire time-of-day from other sources such as Internet hosts.

また,サンプルがある程度集まれば,時刻のズレを20μ秒程度にできるようです.

After some minutes or hours of sampling your GPS, the system time will be adjusted to match the PPS output, and you should expect the absolute value of your offsets to be below 20 microseconds (0.020 ms).

20μ秒という値がどこから出てきたのか分かりませんが,1日に2秒誤差が生じる場合,1秒間に23μ秒の誤差が生じます[注3].多分こういうことなのではないかという概念図を下に示します.

ここで,$$ \Delta t' = \frac{\Delta t}{24 \times 3600} $$
ただし⊿tは24時間での誤差(一番上の図の⊿tに対応)

なんにせよ,マイクロ秒単位の時間を扱うので,GPSとPCとの接続は,RS-232Cなどの遅延が少ないものでないとダメです.USBなんて論外です.

そんな感じで,よさそうなGPSユニット(モジュール)を探してみました.

1.秋月のGT-720F
3200円と安価で,RS-232Cレベルの信号を出してくれるので手軽です.ただ,1PPS信号が出ないので却下.

2.GM-316
5000円程度と若干高いですが,1PPS信号も出ます.ただし,1PPS信号のパルス幅が1μ秒なので[注4],単安定マルチバイブレータやPICでの信号変換が必要.また,信号がCMOSレベルなので,外部回路でRS-232Cレベルに変換しなければならない.

3.Garmin 18x LVC
日本で買うと12600円するが,海外通販なら$60.95で買える
また,多くの人が使っているようで,簡単に導入できそう(参考1 参考2).

以上より,やるなら海外通販でGarmin 18x LVCでも買おうと思う.

NTPサーバ構築にあたって,本当はもう少し作業が必要ですが,今日はここまで.

[注1] うちのある1台のパソコンでの例.マザーボード,チップセット等により大きく異なる.本文中では誤差を絶対値で表すようにしたが,環境によりプラス方向,マイナス方向のどっちにもズレる.
[注2] max(abs(error)) < 1程度にできるという意味
[注3] 統計的手法でコンピュータで定義された1秒の長さを調整すれば,誤差をもっと追い込めるのではないかと思うのですが,LinuxPPSにそういった実装はないのでしょうか(←ちゃんと調べてないので不明).
[注4] 1μ秒はないだろと思ってデータシートを見てみたのですが,本当に1μ秒でした.

Ubuntu10.10(maverick)+Wacomタブレット+2画面でタカミンお絵描きチャット

表題の方法を書いておきます.

僕の環境は下記の通りです


・Ubuntu 10.10
・Wacom Bamboo Comic CTE-650
・1680x1050の液晶2台

問題は大きく分けて2つあります.

・FirefoxでJavaアプレットが使えない
・タブレットをUSBに繋いだだけの状態では,2画面に対してペンタブ1台がマッピングされていて,実質利用できる領域が狭い上にアスペクト比がおかしい

まずはFirefoxでJavaアプレットを使えるようにしましょう.


sudo add-apt-repository 'deb http://archive.canonical.com/ maverick partner'
sudo apt-get update
sudo apt-get install sun-java6-jdk sun-java6-plugin

通常使うJavaがOpenJDKになっている可能性があるので


sudo update-alternatives --config java

で,sun-javaを選びます.sun-javaのみがインストールされている場合は,次のようなメッセージが出るので次に進んでOKです.


There is only one alternative in link group java: /usr/lib/jvm/java-6-sun/jre/bin/java
Nothing to configure.

デフォルトだと,Firefoxのjavaへのパスが/usr/javaとなっているので,/usr/bin/javaに直します.Firefoxを開き,アドレスバーにabout:configと入力します.検索バーに/usr/javaと入力し,/usr/bin/javaに書き換え,Firefoxを再起動すればOKです.

次にタブレットの問題です.この方法で解決できます
日本語訳しときます(Bamboo Comic向けにソラオチが加筆修正しています)


Wacomのタブレットは今までHAL FDIで設定されてきたが,LucidからはHALが使われなくなったので,どうやって適切に設定すればいいのか私には分からないです.
でも,デフォルトのXOrg configを使ってる人なら,プライマリディスプレイだけでWacomタブレットを使うハックがあるよ.
これはあくまでBamboo Comic(注1)での例なので,自分のタブレットに合わせた設定を,コマンドを実行して探してください.

まず自分のタブレットの名前を調べます.STYLUSが含まれてる行を探しましょう.

$ xsetwacom --list -v
... Display is '(null)'.
... 'list' requested.
... Found device 'Virtual core XTEST pointer' (4).
... Found device 'Virtual core XTEST keyboard' (5).
... Found device 'Power Button' (6).
... Found device 'Power Button' (7).
... Found device 'Eleen USB Device' (8).
... Found device 'Wacom BambooFun 6x8 eraser' (9).
Wacom BambooFun 6x8 eraser ERASER
... Found device 'Wacom BambooFun 6x8 cursor' (10).
Wacom BambooFun 6x8 cursor CURSOR
... Found device 'Wacom BambooFun 6x8 pad' (11).
Wacom BambooFun 6x8 pad PAD
... Found device 'Wacom BambooFun 6x8 stylus' (12).
Wacom BambooFun 6x8 stylus STYLUS
... Found device 'Microsoft Microsoft 5-Button Mouse with IntelliEye(TM)' (13).

上の例だと「Wacom BambooFun 6x8 stylus」です.

次にタブレットのX軸解像度TXを調べます.

$ xsetwacom --get "Wacom BambooFun 6x8 stylus" BottomX
43296

この場合TX=43296です.次に,仮想デスクトップの解像度WXを調べます.

$ xsetwacom --get "Wacom BambooFun 6x8 stylus" SBottomX0
3360

この場合WX=3360です.液晶の解像度が一枚あたり1680x1050なので,1680*2の値と等しくなっています.
最後に,プライマリディスプレイのX軸解像度をSXとおきます(うちの場合SX=1680).

今回紹介するハックでは,タブレットのX軸解像度をTXを実際より大きく設定します.こうすることで,セカンドモニタを領域外に割り当てます.
まず,AX = TX * (WX / SX)という関係式からAXを求めます(うちの場合AX = 43296 * (3360 / 1680) = 86592 ).
もしカーソルがセカンドディスプレイの左側1ピクセルに飛ぶのを止めたいなら,少しAXを小さめに設定するといいですが,あくまで好みの問題です.
とにかく,AXを決めたら

$ xsetwacom --set "Wacom BambooFun 6x8 stylus" BottomX 86592

のようにタブレットのX軸解像度を設定します.

もし必要なら,Y軸についても同様に設定します.
このコマンドは再起動の度に実行する必要があるので,スクリプト(例えば~/.bashrc)に記述しておく必要があります.
定石としてはDeviceKit Rule(注2)で自動的に実行するのがいいのですが,そうしませんでした.

--------------------

注1:原文ではBamboo1という機種について書かれている

注2:/usr/share/X11/xorg.conf.d/50-wacom.conf あたりのことと思われる./usr/share/X11/xorg.conf.d/50-wacom.conf に記述する方法も別のフォーラムに書いてあったのですが,Ubuntu 10.10では上手く動かないようです.

以上で,タブレットの有効範囲をプライマリディスプレイのみにすることができます.

無事,takaminでお絵かきできるようになりました.

参考URL
[SOLVED] Configuring Xorg for dual screen, single wacom

ubuntu10.4でsun-javaを使う。Javaアプレットを見れるようにする。

Ubuntu Firefoxでアプレットを起動するとクラッシュ

Rでローソク足を書く

前回はgnuplotとshで色々頑張りましたが,統計処理はRに任せたほうが楽ではないかということで試してみました.
グラフ作成には,ローソク足チャートを書いてくれるquantmodというライブラリを使いました.

テキスト版


# usdjpy_hiasi.txtの1行目に
# "Date" "Open" "High" "Low" "Close"
# (間はタブ区切り)を追加すること
library("quantmod")
data <- read.zoo("usdjpy_hiasi.txt", header=T, sep=" ") data<-to.monthly(data) candleChart(data)

usdjpy_hiasi.txtから平成以降の日足データを読み込み,to.monthlyなる関数で月足に変換してグラフを描画させています.
前回のシェルスクリプトでゴリ押ししたのと比べてスマートです.さらに,グラフ表示はgnuplotと比べて綺麗です.

次に2010年の日足です.
gnuplotでは休場日を左詰めにして表示できなかったのですが,quantmodでは勝手にやってくれます.また,特に工夫しなくてもグラフ描画が綺麗です.

テキスト版


# usdjpy_hiasi.txtの1行目に
# "Date" "Open" "High" "Low" "Close"
# (間はタブ区切り)を追加すること
library("quantmod")
data <- read.zoo("2010_hiasi.txt", header=T, sep=" ") candleChart(data)

総評:gnuplotより楽で綺麗です.ただし,グラフをpngやepsに出力する方法が不明です.このままではシェルスクリプトで一括処理(あるいは自動処理)できません.

参考:
quantmod本家
http://www.quantmod.com/

Rでローソク足を描く
http://entre2formosas.blogspot.com/2010/11/r.html

Rでローソク足チャート
http://sohgetsu.blogspot.com/2009/04/r.html

gnuplotでローソク足を表示させる

twitterでこんなことをつぶやきました:

手軽かつ詳細に,環境に依存せず為替の履歴をローソク足で見られるサイト作ったら便利かなと思った.第一感ではCSVさえ手に入ればRuby + sh + crontabですぐできそうだが.

まあいきなりは無理ですので,とりあえず今日は,ドル円と日経225を月足で表示することにしました.
期間は,1980年代から現在までのデータを見つけられたので,まあその付近ということにしました.

すぐできるだろと思ってたら,データ加工に手間取り半日がかりの作業となりました.

・日経先物225
米Yahooのサイトに,月足のCSVデータがあったので簡単に作れました.

中身はこんな感じです.gnuplotで扱うために,カンマではなくタブで区切ってます.ですので厳密にはCSVではありません.

$ cat kabu.txt
# 年月日 始値 高値 安値 終値
2010/12/01 9939.8 10394.22 9918.55 10228.92
2010/11/01 9166.85 10157.97 9123.62 9937.04
2010/10/01 9440.52 9716.92 9179.15 9202.45

(略)

1984/03/01 9920 10929 9920 10929
1984/02/01 10201 10201 9830 10031
1984/01/04 9927 10236 9927 10196

set xdata time
set timefmt "%Y/%m/%d"
set format x "%Y"
set xlabel 'Year'
set title 'Transition of NIKKEI225 by soraochi'
set ylabel 'NIKKEI225 [Yen]'
plot "kabu.txt" using 1:2:3:4:5 with candlesticks linetype -1 notitle, 10000 lt 7, 20000 lt 7, 30000 lt 7

・ドル円
日足でのCSVは見つかったのですが(参考文献),月足のCSVは見つけられませんでした.
まず,拾ってきた日足データを下記のような形式に加工しました.


$ cat ./hiasi.txt
# 年月日 始値 高値 安値 終値
1989/1/03 123.60 125.56 123.35 123.60
1989/1/04 123.65 125.15 123.65 125.05
1989/1/05 125.05 125.76 125.05 125.59

(略)

2010/12/27 82.82 82.99 82.65 82.83
2010/12/28 82.80 82.81 81.81 82.36
2010/12/29 82.45 82.45 81.60 81.62

awkで扱いやすくするため,日付のフォーマットを日経225のときとは変えてあります.
このままでは日足なので,月足に変換するシェルスクリプトを書きました.

シェルスクリプトのテキスト版

#!/bin/bash

TEMPFILE=/tmp/rosoku.$$;

rm ./rosoku.txt;
touch ./rosoku.txt;

YEAR=1989;
while [ `test $YEAR -le 2010;echo $?` = 0 ]
do
 MONTH=1;
 while [ `test $MONTH -le 12;echo $?` = 0 ]
 do
  cat ./hiasi.txt | grep `echo $YEAR/$MONTH/` > $TEMPFILE;
  HAJIMENE=`cat $TEMPFILE | head -1 | awk '{print $2}'`;
  OWARINE=`cat $TEMPFILE | tail -1 | awk '{print $5}'`;
  TAKANE=`cat $TEMPFILE | awk 'BEGIN{ taka = 0.0 }{if ($3 > taka){taka = $3}}END{print taka}'`;
  YASUNE=`cat $TEMPFILE | awk 'BEGIN{ yasu = 1000.0 }{if ($4 < yasu){yasu = $4}}END{print yasu}'`;   echo -e "$YEAR/$MONTHt$HAJIMENEt$TAKANEt$YASUNEt$OWARINE" >> ./rosoku.txt;
  MONTH=`expr $MONTH + 1`;
 done
 YEAR=`expr $YEAR + 1`;
done

rm $TEMPFILE

月足の高値(安値)は,その月に属する日足の高値(安値)のうち最も高い(安い)ものです.twitterでつぶやいた通りです:

Σxi=A(for i:= 1 to N)のとき,集合Aの最小値は,部分集合xiの最小値xi_minのうちのどれかか.∀xi_minが既知なら,集合Aの最小値はN-1回の比較演算だけで求められると.

出力(rosoku.txt)は以下のようになりました

$ cat rosoku.txt
1989/1 123.60 130.98 123.35 130.50
1989/2 130.35 130.90 125.20 126.87
1989/3 126.85 133.55 126.85 132.77

(略)

2010/10 83.49 84.01 80.41 80.48
2010/11 80.33 84.41 80.24 83.65
2010/12 83.68 84.52 81.60 81.62

作った月足データをgnuplotで出力しました

set xdata time
set timefmt "%Y/%m"
set format x "%Y"
set title 'Transition of USDJPY=X by soraochi'
set xlabel 'Year'
set ylabel 'USDJPY=X'
plot "rosoku.txt" using 1:2:3:4:5 with candlesticks linetype -1 notitle, 80 lt 7 w l, 160 lt 7 w l

CSVデータは概ね加工できたので,次は任意の期間と足を指定できるCGIを作るかもしれません.

・参考文献
gnuplotでローソク足を表示させるのに参考になりました
http://park8.wakwak.com/~sohgetsu/cgi-bin/wiki.cgi?page=gnuplot

awkで文字列を扱う時,参考にしました
http://www.osaka-kyoiku.ac.jp/~kokugo/nonami/awk/awkmini.html

日銀の統計サイト.あまり役に立ちませんでした
http://www.stat-search.boj.or.jp/index.html

日経225の古いデータがあります
http://finance.yahoo.com/q/hp?s=^N225

ドル円,先物などのデータがあります
http://www.sankayo-jp.com/download.htm

ドル円の古いデータがあります
http://www.fxlabo.com/content/tradematerial/zai_deta.htm

Ubuntu10.10でVMware Playerが動かないときの対処法

見事に引っかかったのでメモしておきます.VMware Workstationについても同様かと思われます.

[Ubuntu][PC]VMwarePlayerが起動しない on Ubuntu 10.10

Ubuntu 10.10 and VMware Player 3.1

リンク先のスクリプトを回せば良いのですが,su,あるいはsudoを必要とするので自己責任でお願いします.
build-essentialが入っているかを確認しましょう.dist-upgrade時に消えてしまったのか,僕はこれでしばらく迷いました.