常識なのかもしれないが、コーディングしていて改めて気がついたのでメモ。

文字列の数字表現で”1234.56″といった感じのものを読んで整数なのか小数なのかをチェックする場合、マッチさせたいパターンは詳細なものから書く。
例えば以下のように書くと

全て整数として判断される。
このような場合は正規表現のより詳細なものから先に書いておく必要がある。

こうすれば小数は小数としてマッチするようになる。
もっとスマートなやり方があればコメントしていただきたい。

Rubyでは実行時にメソッドの動きを変更することができる。

例えば次のようなクラスをperson.rbというファイルに記述する。

次にchained_person.rbというファイルに次のように記述する。

aliase_methodでperson.rbのfunc1メソッドにfunc1_without_chainedという別名をつけて、次の行でfunc_with_chainedメソッドをfunc1メソッドとするように指定する。
そしてメインの処理を記述するファイルには以下のようにする。

これで環境変数CHAINEDに値が入っている場合はchained_person.rbのメソッドが呼ばれるようになる。
これはデバッグや違う環境でメソッドを変えたい場合にその部分だけ別ファイルに分離することができるので便利だ。

参考文献

実践 Rails -強力なWebアプリケーションをすばやく構築するテクニック 実践 Rails -強力なWebアプリケーションをすばやく構築するテクニック
株式会社クイープ

オライリージャパン 2008-10-27
売り上げランキング : 3881

Amazonで詳しく見る by G-Tools

Ubuntu 7.10 Subversionインストールメモ。
以前もSubversionのインストール方法は書いたのだが、今回はWebDAVを使うパターン。

まず以下のソフトウェアをインストールする。
(Apache2は入っているものとする)

# apt-get install subversion libapache2-svn

次にWebDAVの設定ファイルを編集する。

# sudo vi /etc/apache2/mods-enabled/dav_svn.conf

dav_svn.confに以下のように記述する。

<Location /svn_repos>
DAV svn
SVNPath /home/svn/repos

AuthType Basic
AuthName “Subversion Repository”
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
</Location>

LocationでアクセスするURLを指定し、SVNPathでsubversionのリポジトリディレクトリがあるところを指定する。

AuthTypeでベーシック認証を設定し、パスワードファイルのパスをAuthUserFileとして設定する。

パスワードファイルはhtpasswdコマンドで以下のように作成する。

# htpasswd -c dav_svn.passwd hoge

-cオプションはファイルを作成するときだけ使用する。

Subversionのリポジトリは以下のコマンドで作成する。

# sudo mkdir /home/svn
# sudo svnadmin create /home/svn/repos

ApacheがSubversionファイルを読めるようにwww-dataユーザーにファイルオーナーを変更しておく。

sudo chown -R www-data /home/svn

変更を有効にするためにapacheを再起動する。

sudo /etc/init.d/apache2 restart

Tortoise SvnなどのSubversionクライアントでhttp://ホスト名/svn_reposというURLでアクセスして確認する。

データベース設計でER図を描くのにWindows上でDia(0.96.1)を使っているのだが思いっきりはまってしまった。

1時間ほどかけて作ったER図が保存したにもかかわらずファイルにちゃんと書かれていなかった。
セーブしたファイルを見るとサイズが0になっている。
色々試してみた結果ファイルパスに日本語が含まれているとだめみたいだ。
ちなみに図に日本語を入れるのは問題ない。

DiaはもともとGnomeのアプリケーションだから日本語ファイル名を想定して作られていないのだろう。
まだちゃんと日本語対応していないのもあると思うが。
しかし、これからのGUIアプリケーションは Linuxといえどマルチバイトのファイル名は必須ではないだろうか。
せっかく作ったER図をまた一から作らなければ。

LinuxのWebサーバー経由でWindows 2003サーバーのコマンドをRubyスクリプト起動する 方法としてSSH経由で実行することを考える。

まずはWindows 2003サーバーにCygwinをインストールしてその上でsshdを起動させる。
/etc/sshd_configはデフォルトのままにしておく。
sshdデーモンを以下のコマンドで起動しておく。

# cygrunsrv -S sshd  (停止するにはcygrunsrv -E sshd)

Linuxサーバー側のRubyスクリプトを実行する。
ソースコードはこんな感じ。

rubygemsをrequireしないとnet/sshが読み込めないというエラーが発生した。
またこのライブラリではsshの中でコマンド一発実行すると終了してしまうのでsession.loopという関数で複数コマンドを実行できるようにしている。
Windowsのバッチファイルを実行するためにはcmd .. callというコマンドで実行する必要があるようだ。
コマンドだけではcygwinからうまく実行できなかった。
バッチファイルで呼んでいるコマンドによるのかもしれない。

Ubuntu 7.04 Serverにrcovをインストールしようとしてエラーが発生。

stdlib.hが見つからないというエラーを出していた。

ネットで調べてみるとbuild-essentialを入れれば大丈夫のようだ。

apt-get install build-essentialと打つがこんなエラーが発生。

エラー http://jp.archive.ubuntu.com gutsy-updates/main linux-libc-dev 2.6.22-14.47
404 Not Found
エラー http://security.ubuntu.com gutsy-security/main linux-libc-dev 2.6.22-14.47
404 Not Found
http://security.ubuntu.com/ubuntu/pool/main/l/linux-source-2.6.22/linux-libc-dev_2.6.22-14.47_i386.deb
の取得に失敗しました 404 Not Found
E: いくつかのアーカイブが取得できません。apt-get update を実行するか –fix-missing オプションを付けて試してみてください。

色々ネットで調べてみるとapt-getのdbをアップデートすればいいみたいだ。

# sudo apt-get update

# sudo apt-get install build-essential

うまくいった。

さらにrcovをインストール。

# sudo gem install rcov

Ubuntu Feistyにsubversionをインストール、設定にはまった。

まずはバイナリーのインストールは
apt-get install subversion
ですんなり終了。

subversion用のユーザーを作成
useradd -d /home/svn -s /bin/bash svn
でsvnユーザーでログインしなおす。
su – svn

リポジトリの作成を行う。
svnadmin create /var/svn/repos

既存のソースをリポジトリにインポート
svn import -m ‘initial import’ mysrc file://var/svn/repos/mysrc

リモートからアクセスしたいのでsvnserveの設定を行う。
/var/svn/repos/mysrc/conf/svnserve.confを以下のように記述。
anon-access = none
auth-access = write
password-db = passwd
authz-db-authz
realm= My Source Repository

anon-accessは匿名ユーザーのアクセスを禁止しているのだが、noneにしておかないと許可しているユーザーのアクセスのときに変なエラーがでてアクセスが拒否されてしまった。
Googleで調べるとここをnoneにしろと書いてあったがなんかバグらしい。
とりあえずこれでアクセスできた。

同じディレクトリにpasswdファイルを作成し以下のような感じでアクセスさせたいユーザー名とパスワードを記述。

user1 = pass1
user2 = pass2

パスワードはクリアテキストで通常のパスワードファイルのようにハッシュになっていない。
(大丈夫か?)

これでsvnserveを以下のように起動。

svnserve -d -r /var/svn/repos

-dはデーモンモードで起動するオプションで、-rはリポジトリディレクトリを指定する。
-rで指定しないとリモートでアクセスできなかったので必ず指定しなければいけないのだろう。

後はクライアントから以下のコマンドでアクセスしてみる。

svn checkout svn://svnホスト名/mysrc dir1

リポジトリのファイルがクライアントのdir1というディレクトリにダウンロードされる。
これでクライアントローカルでファイルの変更が可能になる。
変更後svn statusで見ると変更されたファイルリストが表示されるはずだ。

M aaa.c
M bbb.pl

変更されたファイルをsvnサーバーのリポジトリに反映させるにはcommitコマンドを使う。

svn commit aaa.c bbb.pl

アクセス制御の設定をちゃんとしておかないとここで拒否される。
自分はここではまって何回もリポジトリを作りなおしたり、設定ファイルの変更を行った。
svnserveの起動ユーザーとリポジトリファイルのオーナーがあっていないとアクセスエラーになってしまうので注意が必要だ。
root権限でsvnserveを起動するのは危険なのでsvnユーザーのようにsubversion専用のユーザーを作成し、そのユーザーでsvnserveを動かした方がいいだろう。

今日は半日これをずっとやっていて疲れた。
次はWebDAV経由でアクセスできるように設定しないと。

Javascriptでの複合データオブジェクトはこんな感じで書くことができる。

var data= { people :
{ name : "Taro Yamada",
address: "Tokyo Japan",
sikaku : [ ]
},
{ name : "Taro Yamada",
address: "Tokyo Japan",
sikaku : [ ]
}
};

ここでsikaku配列に後からオブジェクトを追加したいと思って以下のようにやると連想配列のキーが消えてしまった。

var tuika_sikaku = "{oraclemaster : \"gold\"}";
data['people']['people].each(function(s){
s.sikaku[0] = eval(tuika_sikaku);
}

これはtuika_sikakuをevalしてオブジェクト化してから配列に入れているのだが、tuika_sikakuの記述がまちがっているためにキーが消えてしまった。
正しくは
var tuika_sikaku = “({oraclemaster : \”gold\”})”;
( )が必要である。

Mongrelの不具合解消のため前の記事に書いた設定を行ったところアプリケーション実行時に以下のようなエラーが発生した。

Client does not support authentication protocol requested by server; consider upgrading MySQL client

gemで入れたmysqlモジュールが古いプロトコルしかサポートしていないのではないか。
とりあえず、MySQLサーバー側のパスワードを古いタイプにすると接続できた。
MySQLサーバーのmysqlデータベースで以下のコマンドを実行する。

update user set password=old_password(‘パスワード’) where user=’ユーザー名’;
FLUSH PRIVILEGES ;

情報元はこちら。

http://www.iwazer.com/~iwazawa/diary/archives/002934.html

Rails Mongrelを長く立ち上げていると全く反応しなくなる不具合がある。
MySQLのドライバーのバグみたいだ。
解決策としては二つあるようだ。

1 config/environment.rbに以下の行を追加する。

ActiveRecord::Base.verification_timeout = 14400

2 CベースのMySQLドライバーを導入する。
導入コマンドは以下の通り。

sudo gem install mysql

Railsは今成長期なのでかたまっていないのは仕方がないのだろう。
フォーラムやメーリングリストは要チェックだ。

情報源はこちら。
http://rubyforge.org/forum/forum.php?thread_id=9974&forum_id=5450