2007-02-28 Wed
rsyncで任意のファイルだけをバックアップ
サーバを入れ替えたときに、サーバと開発環境を全く同じにしました。
# 今後はChangeLogで作業ログを管理しながら手動で同期しますが。
そのときにrsyncを使って、chalowで生成したファイルをアップロード
できるように設定することにしました。
まず、rsyncをサーバとクライアントの両方にインストール。
chalowで生成するHTMLファイルはひとつのディレクトリに、
どばっと生成されるので、単にrsyncするとファイル以外に、
画像ディレクトリなども同期することになっちゃいました。
それでも良いのですが、HTMLファイルだけ同期したいことが多いので、
cdとfindを使って任意のディレクトリ内の任意のファイルだけを
同期できるようにしたいと思います。以下がその設定です。
#!/bin/sh cd $HOME/public_html # すべてのhtml find *.html |rsync -avz -e ssh $HOME/public_html --files-from=- overlasting.dyndns.org:$HOME/public_html # 新しく追加したhtml #find *.html |rsync -uavz -e ssh $HOME/public_html --files-from=- overlasting.dyndns.org:$HOME/public_html # 全部 #rsync -avz -e ssh $HOME/public_html --files-from=- overlasting.dyndns.org:$HOME/public_html
cdで、HTMLが生成されるディレクトリに移動して、find *.htmlします。
次に、findで作ったリストをパイプで渡して、
--files-from=-で受け取ります。これでOK。
スクリプトを実行してみたら、きちんと動作してくれました。
こんな感じのスクリプトを書いておけば、
Subversionのdbファイルのバックアップとかも簡単そうです。
近日中に設定しようっと。
2007-02-25 Sun
自然言語処理ツールなどのインストール
先日構築を始めた環境に、自然言語処理や機械学習用の
アプリケーションをインストールしました。
TinySVM
本体
% wgetして解凍して中に入る
TinySVM-0.09
% ./configure
% make
% make check
% make install
Perlバインディング
% wgetして解凍して中に入る
TinySVM-0.04
% ./configure
% cd ../TinySVM-0.09
% mv perl perl_org
% mv ../TinySVM-0.04/perl .
% cd perl
TinySVM-0.09/perl/MakeFile.PLのLIBSに、-lstdc++を付け足す。
% perl Makefile.PL
% make
% make install
Mecab
24日にちょうどバージョンアップ。
MeCab
本体
% ./configure
% make
% make install
辞書
% ./configure --with-charset=utf8
% make
% make install
Perlバインディング
% perl Makefile.PL
% make
% make install
CRF++
本体
Chasen
Chasenはdarts-0.2とlibc6-devをインストールする。
また、Chasenはエラーを起こすので、以下を変更する。
chasen-2.3.3/lib/dartsdic.cpp
1800行目を変更
+/*(const char*)keys[size] = key.data();*/
+keys[size] = (char*)key.data();
darts-0.3を使うなら71行目を変更
+darts->set_array(cha_mmap_map(da->da_mmap));
本体
% ./configure
% make
% make install
Perlバインディング
% perl Makefile.PL
% make
% make install
YamCha
本体
Perlバインディング
CaboCha
本体
Perlバインディング
やることが同じなので、最後の方はグダグダですけれど、
TinySVMとChasenのインストールはよくハマるので、
自分のためにメモしておこう、って感じでした。
2007-01-08 Mon
今年はバーティカル検索が来る、らしい
Googleコードサーチや、Amazonの商品検索などに代表される、
目的特化・範囲限定型の検索、バーティカル検索が来るのでは、と、
ツイてる!ポッドキャスト新春2007中でたつをさんが語っていました。
以下、自分用メモ。
例として挙げられていたのは以下のような検索。
下流検索 : もう駄目だ。給料が低い。とか連発するネガティブな生き方
なブロガーによる記事を検索
アキバ検索:アキバな記事をクロールしてインデキシング
APIが沢山公開されているので、趣味に特化した検索アプリを
作りやすくなってきた。
おまけにバーティカル検索ならノイズレスなインデックスを作りやすい。
何がバーティカルなのかは難しい。
ブログ検索は複数ジャンルの記事が含まれた、
メタなジャンルの記事を検索するようなイメージがある。
ブログ検索はブロガーによる評判を検索できるので、
ユーザが目的をもって検索すれば、それなりにブログから
範囲をしぼった情報を得られそう。
例えば下流ブロガーによる評判を知りたいとか。
この話題を聞くだけでもツイてる!ポッドキャスト新春2007を
聞く価値があるような気がしました。
2006-12-30 Sat
SVK-2.0
SVK-2.0だー。
Chia-liang Kao (高嘉良) / SVK-v2.0.0 - search.cpan.org
いろいろ落ち着いたら入れてみよ。
2006-11-23 Thu
SubversionのDBが壊れたときの修復スクリプト
SubversionのDBが壊れたときに、svnadmin recoverでは回復しなかったので
スクリプトを書いて解決しました。
以前[2006-10-03-1]にSubversionのDBが壊れてしまったときに、DBを再構築したのですが
それはSubversionを使い始めたばかりだからです。
今ではリポジトリのサイズが300Mbyteを超えていて、
再構築するのが非常に面倒そうです。
なので、真剣に修復する方法を探したら、方法が見つかりました。
以下のページに書いてあった方法を試したのです。
Subversion Users: Re: DB Corruption
一回全てのdbファイルとlogファイルを消して、
bdbなファイルを全てダンプしてロードするのです。
そうすると直ってしまうのです。
以下が、SubversionのDBを修復するスクリプトです。自己責任でどうぞ。
recover.sh
#!/bin/sh mv log.* /tmp mv __db.* /tmp for bdb in changes copies nodes representations revisions strings transactions uuids lock-tokens locks do mv $bdb $bdb.org db4.2_dump $bdb.org | db4.2_load $bdb done svnadmin recover /path/to/svnrepos/ svnadmin verify /path/to/svnrepos/
このスクリプトを/path/to/svnrepos/db/へ設置して実行してひたすら待つのです。
「db4.2_*」は自分の環境で使えるBerkeley DB関連のコマンドに
置き換えてご利用ください。
2006-11-16 Thu
アルゴリズム勉強会
アルゴリズム勉強会に入会した。
といっても研究室内の勉強会なのでメンバーは研究室のメンバーだ(笑
実は勉強会は先週から始まっていて、今回は私が出席していない回の答え合わせ。
答え合わせと言っても入出力がサンプルと合っていれば良いので、
みんなで、あーだこーだとソースの解説や検討が中心である。
課題は動的計画法による文字列マッチの実装だった。
個人的に興味深かったことは参加メンバーの好みの言語や開発環境が全然違うこと。
同じ課題をそれぞれHaskel、C++、Perlで実装していたり、
環境もLinux PCやMac OS XのEmacs、Windows XPの秀丸などバラバラ。
実装も考え方がバラバラでとても興味深かった。
勉強会の終わりに早速来週までの宿題が出た。
課題はA*アルゴリズムによる8パズルの最適解算出プログラムの実装だった。
アルゴリズムの勉強をはじめるとなると、
最近のアルゴリズムを網羅したまとまった資料が手元にあると嬉しい。
2006-11-16 Thu
tracをアップグレード 0.10から0.10.2へ
少し前からtracを使っているが、昨日の夜にapt-get upgradeしたら
自分でインストールしたtracがdebianパーケージのtracで上書きされたっぽい。
普通にtracを
ソースから再インストールしてtarcのアップグレードをした。
やることは少ない。
tracのアップグレード 0.10から0.10.2
1、古いtracを移動する
tracの/usr/share/trac/と/usr/lib/python2.3/site-packages/trac/を
それぞれ、/usr/それぞれのパス/trac.backにmvする。
これをやっておかないと、次のセットアップで正しくインストールされない。
2、tracの0.10.2のtar.gzを解凍してsetup
python setup.py installする。
3、datefmt.pyを編集する。
私は日本語がeucJPな設定なので過去の設定を参考に編集。
今回は0.10のときのようにutil.pyは編集する必要なし。
4、tracプロジェクトをアップグレード
trac-admin /path/to/projenv upgradeやtrac-admin /path/to/projenv wiki upgradeを実行。
5、サーバー再起動
私はApache2を再起動しました。
以上でtracのアップグレード完了。
いまのところ日本語も正常に動いています。
私はtracプロジェクトを定期的に丸々バックアップしているので、
とくにバックアップせずにアップグレードを始めましたが、
定期的にバックアップをしていない方は、アップグレード前に
tracプロジェクトをバックアップしておくと良いと思います。
# dbが万が一壊れちゃったら泣くに泣けませんので。
2006-11-14 Tue
今日書いたプログラムの行数が何行なのか知りたいぞ
とあるディレクトリ以下のファイルの行数を数えて全て合計したい。
でも、そんな都合の良いコマンドは見つかっていない。
grepは合計を算出してくれないし、wcは再帰してくれない。
「grep -c -R」だと、まるでYAMLのハッシュみたいな出力になるので、
適当に整形したあkeysでforeachすればカウントできそう。
いらないディレクトリはgrep -v 'hoge'とかすれば消えるし。
「wc -l *」は、wc -lにパイプでリストを渡そうとしているときに、
「wc -l *ですよ」とM氏に教えてもらって感動した。
そうか、リストの各行にwcをかけることはできないか。
ディレクトリがあっても、その中を再帰的に見てくれないので、
全てディレクトリに対するパスを順に突っ込む必要があるような。
じゃあ、やっぱり「grep -c -R」で計算しよう。と思った夕方。
2006-11-08 Wed
puttyでCtrl+sしたときに画面がロックしたら
以前からputtyでCtrl+sしたときに画面がロックしたりしなかったりする。
それで、スクリーンがロックしたときには解除の方法が見つからなくて、
新しいputtyのウィンドウを立ち上げてpkillしてscreen -rしたりしてた。
別にssh通信のプロセスに問題が無いのにロックして解除できなくて、
一番駄目な解決方法を取り続けていたということだ。
ただ、それも極めて面倒だし、ネット上に「Ctrl+sしたら・・・」などと
書いている人を見かけないので、何か解決する方法があると思ってた。
今日、たまたま久々に区切りが付いた日だったので探してみたら、
あっさりとスクリーンのロックを解除する方法が見つかった。
「puttyでCtrl+sしたときに画面がロックしたら、Ctrl+qで解除。」
何というか、こんなことで悩んでpkillしてたのは私だけでは無いだろうか。
でも今後の時間の無駄が減ってツイてる!!
2006-11-08 Wed
モトヤシーダフォントの困ったところ
昨日から使い始めたモトヤシーダフォント+Consolasフォントにプチ不具合。
よくブログのフィードで見かける本文省略の後ろにつける、「…」って
ありますよね、あの「…」がモトヤシーダだとアンダーバーの太い版
みたいなんですよ。な、なんだってーー。
この「…」を画像化して表示してみましょう。「………___」

フィードをいじくっていて気が付いたわけではないのですが、
これは今、気が付いていて良かったなぁと思った。
他のよく見る単独記号は普通に表示されましたよ。
# √(ルート)が微妙かも
ということでモトヤシーダフォントを使う人は「…」に気をつけましょう。
2006-11-07 Tue
ConsolasフォントとモトヤシーダフォントをFontLinkして使う
9月ごろにConsolasフォントとモトヤシーダフォントをFontLinkして使うことが、
ソフトエンジニアの間で流行していた。
で、流行に乗らないと負けた気分になる私は試してみたけれど、
大きめフォントで作業していた私にとって、
モトヤシーダフォントはOsaka等幅フォントより魅力的に見えなかった。

# めちゃめちゃ大きい文字で開発していた。
時期が変わって、開発スタイルが少しづつ変化してくると、
大きめフォントではスクロールが多すぎて厳しいと感じはじめた。
今までは12ptだったけれど、なんとか10ptくらいまでサイズダウンしたい。
ところが、それまで愛用していたOsaka等幅フォントは、10ptや9ptの表示
に適していないように感じられた。ぶっちゃけ好みの文字じゃないのだ。
とくに半角英数字は見づらくて目が疲れる。

# 見づらい。目がチカチカする。
困り果てて別のフォントをいろいろ試してみると、
なんと先日見限ったConsolasフォントが10ptではめちゃくちゃ良好。
これだー、と思った私はモトヤシーダフォントも、きっと10ptなら
自分の好みの感じな表示になるに違いないと思った。
# じゃなきゃ使う人は多くないはず。
ということで、FontLink。
Consolasフォント+モトヤシーダフォントに関する記事を書いている人は
いるけど、Consolasフォント+モトヤシーダフォントのFontLinkについて
細かく書いている人がいなかったのでメモを残す。
●ConsolasフォントとモトヤシーダフォントをFontLinkする手順
1、Consolasフォントをゲットしてインストールする。
# リンク先が無くなったらConsolasとかググれば出てくる。
# Consolasフォントを手に入れるためにVisual Studioをインストールする必要なし。
2、モトヤシーダフォントをゲットしてインストールする。
# フリーフォントバーチ1とかフリーフォントアポロ1などもダウンロードできる。
# でも会員登録やら何やらは面倒くさいかもしれない。
3、レジストリをいじくる。全部自己責任。
まずはレジストリエディタを起動する。
# Windows XPの場合は、「スタート」→「ファイル名を指定して実行」→「regedit」。
次に、「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink」に移動する。
移動したら、右側のウィンドウを右クリックして新しい複数行文字列値を作る。
で、その複数行文字列値を以下のように編集する。
複数行文字列値の名前を右クリックして編集や名前の変更をする。
| 名前 | Consolas |
| データの値 | NFc1kp.ttc,NFモトヤシータ゛1等幅 |
ダの濁点が一文字分確保しているのがハメちっく。30分くらいハマった。
4、再起動
5、フォントをConsolasの10ptに設定して感動する。
他にもClearType設定とかしてるけど、Puttyでの設定後はこんな感じになった。

# 高級感ただよう。
ということで、 Consolasフォント+モトヤシーダフォントは超オススメ。
レッツMSゴシックから卒業。
2006-11-05 Sun
SpeedyCGIを使ってみた
ちょっと重たいスクリプトを連続して使うためにSpeedyCGIを使った。
SpeedyCGIを使うとSpeedy_baseというプロセスが、
mod_perlとApacheを連携したときのように一度実行したPerlスクリプトを
コンパイルした状態でメモリに保持してくれる。
なので、スクリプトに変更が無ければ繰り返し高速に実行できる。
使い方は極めて簡単。以下メモ。
1、SpeedyCGIをインストールする
CPANシェルで「install CGI::Speedy」とするだけ。
2、PerlスクリプトをSpeedyCGIを使うように変更する。
PerlスクリプトをSpeedy_baseに読み込むために、
Perlスクリプトの行頭で/usr/bin/speedyを使うように変更する。
#!/usr/bin/perl
から
#!/usr/bin/speedy -- -t20 -M1
のように変更する。
3、実行
普通のPerlスクリプトと同じように実行するだけ。
speedyはSpeedyCGIをインストールすると使えるようになる。
オプションも多いのでマニュアルをじっくり読む必要がありますが、
-tと-Mが一番重要。
-tオプションで指定した秒数以上Speedy_baseにリクエストしないと、
Speedy_baseがメモリを開放するし、-Mオプションで指定した数以上に
Speedyプロセス(Speedy_baseを利用するクライアント)は立ち上がらない。
らしい。正直使い慣れてはいないので今後要勉強。
SpeedyCGIの実行速度は使ってみて分かったけど激早い。
今後も使うべきときに使おうと思う。
2006-10-31 Tue
svkとCVSの連携
svkとCVSの連携を試してみた。
$HOME/cvsなどにチェックアウトしておいたproject_xを
svkにインポートして、svkからcoして使う。
% svk import //cvs_repos/project_x project_x
% cd ~/svk
% svk checkout //cvs_repos/project_x
ネットワーク経由で直接インポートするメリットが無いので、
上記のようなインポート方法にした。
こうすると$HOME/svk/project_xにもCVSディレクトリがあるので、
$HOME/svk/project_xからCVSのcommitとupdateができる。
逆にそれ以外のコマンドは有効に活用できないんだけど。
ちなみに、何故こんな面倒なことやってるのかというと、
自分の関わるお仕事にCVSでコードを管理しているのがあるのですが
CVSにコミットしまくるとコミットメール来まくりになるのです。
そのコミットメールの流れる範囲が結構拾い。
あんまり小粒なコミットをするのが気が引ける。
なので開発済み部分が大粒になるまでコミットしないのですが、
小粒のままでもコミットしまくりたい。
何故CVSなのにコミットしまくりにしたいかというと、
CVSにコミットしないで置いておいた、ほぼ完成のコードを
うっかり1週間放置してしまったあと、
うっかりコードを放置していることを忘れて
うっかりプロジェクトごと削除しちゃってたんですよ。
しかも1週間気が付かなかったし。
# 今朝気が付いて愕然。
これが自分の使ってるSubversionならsvnでもsvkでも、
他人の迷惑を気にしないで好きなだけコミットできる。
めちゃくちゃ気持ちよい。
なにより小粒なコミットは気分良い。達成感あるし。
ということで、以下の2点を狙ってsvk+CVSしました。
- うっかりプロジェクトを消してもsvkに入ってるから.svkを消さなければ大丈夫
- CVSでもsvkでコミットしまくってリズムにのる
結果、両方のねらいが成功して消しちゃった分はすみやかに再開発できました。
●参考文献
Practice of Programming - svkとCVSの連携
2006-10 -30 SATOU Toshinori <satou at lr.pi.titech.ac.jp>
2006-10-20 Fri
ChaSenのPerlモジュールをエラーでインストールできないとき
ChaSenのPerlモジュールをエラーでインストールできなくて
順番に解決した記録。
- ChaSenのバージョンは2.3.3。
- 以前darts 0.3をインストールしていたので、darts 0.2をインストール。
- ChsSen-2.3.3をconfigure、make、make install
- ChsSen-2.3.3/perl/MakeFile.PLのLIBSに「-lstdc++」を足す。
それでもエラーが出るなら、コンパイラのバージョンを疑う。
2006-10-20 Fri
TinySVMのPerlモジュールをエラーでインストールできないとき
debianでTinySVM-0.09のPerlバインドをインストール時に
コンパイルエラーでまくりだった。
どうやって解決したか。いろいろ試すと以下のようになる。
- TinySVM-0.09をconfigure、make、make installする。
- TinySVM-0.04のソースをダウンロードして、configureする。
- TinySVM-0.09/perlをTinySVM-0.09/perl_orgにする。
- TinySVM-0.04/perlをTinySVM-0.09にコピー。
- TinySVM-0.09/perl/MakeFile.PLのLIBSに、-lstdc++を付け足す。
普通はこの時点でmakeすると良いらしい。
自分はさらにエラーが出た。
いろいろ試したら、コンパイラのバージョンを3.3から3.4にアップ
したときにコンパイルが通った。ああ、もう。
# perl Makefile.PL # make CC=g++-3.4 # make install
自分の開発環境をきちんとコントロールできてなくて反省。
2006-10-20 Fri
sedとgrepで、あるディレクトリ以下のファイル中の文字列を一括置換
あるディレクトリ以下の、とある文字列を含むファイルのうち、
一部のファイルを除く全てのファイルを対象に、
文字列置換を一括してかけた。sedとgrepを使用した。
忘れそうなのでメモしておく。
% grep -lr とある文字列 * | grep -v '除外するパス' | xargs sed -i 's/とある文字列/置換後の文字列/g'
grepの-lオプションでマッチするファイル名だけ出力。
grepの-vオプションで。ファイルリストから除外したい文字を入力。
邪魔なものが沢山あるときは-vオプションで繰り返しフィルタリング。
sedの-iオプションで一括置換する。
2006-10-20 Fri
Debian Sarge Linuxのdefined in discarded sectionが再発
[2006-06-24-2]を見て解決。
エラーを検索エンジンで検索して自分のページが引っかかって凹んだ。
ここんとこ頻発してたエラーもこれが原因かも。
2006-10-19 Thu
VMware PlayerでdebianのIPを固定
開発にVMware Playerを使い始めてしばらく経ちました。
でも、まだまだ上手くいっていないことがあって、
今日はようやく静的にIPを与える方法を見つけました。
正確には,VMware Playerは内部で好き勝手にIP与えられるので
好みの静的にIPを与えていたのですが、何かが間違っていて
ネットワークが安定しなかったのです。
以下にVMware PlayerでdebianのIPを固定する方法をメモ。
0, 静的でも動的でも、ネットワークアドレスは同じなので
ifconfigなどで現在のIPを調べて算出する。
私は192.168.66.0がネットワークアドレスでした。
1, /etc/network/interfacesをエディタで開く
2, /etc/network/interfacesに以下のように設定を記述する。
auto eth0 iface eth0 inet static address 192.168.66.6 network 192.168.66.0 netmask 255.255.255.0 broadcast 192.168.66.255 gateway 192.168.66.2
3, /etc/init.d/networking restartする
ポイントはゲートウェイのアドレスは、ネットワーク上の2番で、
Windows側から確認できる1番ではないということ。
VMwareとWindowsは192.168.*.1と192.168.*.2の間で
ネットワーク接続しているってことか。
192.168.66.1と設定したときは、ネットワークの外からVMwareに
アクセスできるけれど、VMwareから外部に接続できるときと
できないときがあって正直良くわからない。一言で言うと不安定。
VMware Playerの性質なのか分からないけれど、
動的にIPを取得する設定にすると、たまにIPが動いてしまう。
192.168.66.66だったのに、192.168.66.67にずれちゃう。
これが1時間とか30分に一度起きるのでイライラする。
iface eth0 inet dhcpの行があると、コメントアウトしてるのに
読み込まれてしまってこまった。コメントにできてなかったのかな?
これがネットワークが不安定な原因だったのかも。
今回の設定でようやく安定したし、しばらくは様子見。
2006-10-12 Thu
connect.cで多段SSH接続する
SSHを使った多段接続をしたいけど、3分以上時間が無い!!
という忙しい現代人にとってconnectは救世主。便利。
手順は超簡単。
1、connent(connect.c)はソースで配布されているので、ダウンロード。
・connect.c
2、ソースを読むとたとえばLinuxなら以下のようなコンパイルを
指定されているので、素直に従ってコンパイル。
$ gcc connect.c -o connect
3、connect.cをコンパイルすると、connectができあがる。
PCの構成をlocal、remote1、remote2として、
localからremote1を経由して、remote2へ接続するときには、
このconnectをremote1の/usr/local/binなどのパスが通ったところに配置。
4、localからremote1を経由して、remote2へ接続するときには、
localの$HOME/.ssh/configとして、以下のような内容を記述。
HOST remote2
User Username@remote2
ProxyCommand ssh remote1 /pass/to/connect/on/remote1 %h %p
普段からlocale->remote1してremote1->remote2しているなら、
上記の設定が終わった時点で、localにおいてssh remote2すると、
2回パスワードを聞かれた後、local->remote2できます。
多段SSHが簡単にできるconnectですが、
私にとって一番魅力的なのは、
2段でも3段でも、connectを配置してconfigを書けば、
どこまででも多段接続できることでした。
この1年悩んだことが解決して嬉しかった。
参考文献:
cl.pocari.org - connectを使って簡単に多段SSHを実現する方法
2006-10-12 Thu
プロセス名でkillするpkillと、プロセス名をgrepするpgrepが便利
"pkill -f"で入力文字列と唯一一致する実行中のプロセスをkillする。
"pgrep -l"で入力文字列と一致実行中のプロセス名とIDを見れる。
両方とも極めて便利。


