2009年7月31日金曜日

GoogleMapsAPIでマーカーとマップにイベントを入れる場合に悩んだメモ

こんにちは、モリモルです。

GoogleMapsAPIで、マーカーとマップのそれぞれにイベントを入れたい場合に悩んだメモです。

GEvent.addListener(map,'click',function(){/*マップがクリックされたら*/});
GEvent.addListener(marker,'click',function(){/*マーカーがクリックされたら*/});

みたいで良いのかと思ってたら、マーカーをクリックした時に、マップのアクションまで実行されて悩んでたら、以下のようにすればいいんですね。。


GEvent.addListener(map, 'click', function(overlay,latlng){
if(overlay){
/*マーカーがクリックされた場合*/
}else{
/*マーカーじゃない場合*/
}

});

2009年7月28日火曜日

マルチバイト文字の設定

こんにちは、モリモルです。

マルチバイト文字関数の設定をphp.iniではなく、アプリ実行時にやっているのですが、よくよく忘れる設定のメモ。

mb_internal_encoding   →  mb_strlen とか
mb_regex_encoding    →  mb_ereg とか
mb_detect_order   → mb_detect_encoding

2009年7月14日火曜日

mod_rewriteムズカシ

こんにちは、モリモルです。

mod_rewriteで、アクセス対象ファイルがある場合はルールを摘要しないみたいなのは、以下のようなるのですが、それがVirtualHostディレクティブでうまく動作しなかった際のメモ。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/([0-9A-Za-z_]+)/([0-9A-Za-z_]+)/(.*)$ /index.php?c=$1&a=$2 [QSA,L]


以下のようにしたらうまくいきました。

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ $1 [L]
RewriteRule ^/([0-9A-Za-z_]+)/([0-9A-Za-z_]+)/(.*)$ /index.php?c=$1&a=$2 [QSA,L]


mod_rewriteが複雑で理解できてません。。
上記も間違っててるかも。。とりあえず動いたのでよしとします。うん。

2009年6月26日金曜日

__autoloadとPEAR Pagerでコケる

こんにちは、モリモルです。

smarty->cakePHP1.1->ruby->rails->cakePHP1.2->smartyという流れでsmartyに戻りました。

さて、ページ送りをつけるのに、cakeではPaginationなる便利なものがあるのですが、
フレームワークが使えないので、PEAR Pagerを利用してます。

アプリ全体で、__autoloadを利用していると、Pager::factoryで「Pager_Sliding.phpが見つからないよ!」とエラーになります。
Pager.phpのclass_existsの第二引数にfalseを入れて、__autoloadを抑制するとうまくいくようです。


if (!class_exists($classname, false)) {
include_once $classfile;
}

2009年3月18日水曜日

WEBrick/Windowsでのエラーについて

こんにちは、モリモルです。


windowsでwebrickを動かす際に、「cgi_runner.rb:47:in `exec':Exec format error」が出る際のメモ。
こちらを参考にしたら動きました。

:CGIInterpreterを追加すると解消されました。


server = HTTPServer.new(
:Port => "8088",
:BindAddress => "localhost",
:DocumentRoot => DOCROOT,
:CGIInterpreter => %("C:/Ruby/bin/ruby.exe")
)

2009年3月6日金曜日

Debian/syslog

こんにちは、モリモルです。syslog(ロギングデーモン)のメモです。

サーバープログラムには、ログの出力に「syslogを利用するもの」「使用しないもの」の2種類がある。
Apacheはsyslogを利用しない。



/sbin/syslogd
syslogデーモン

/etc/init.d/sysklogd
起動スクリプト

/var/run/syslogd.pid
pidファイル

/etc/syslog.conf
設定ファイル



設定ファイルの書式

[ファシリティ].[プライオリティ] [アクション]

ファシリティ
auth、authpriv、cron、daemon、kern、mail、syslog、local0 ~ local7など
デーモンがどのファシリティを使うかは、ソフト開発者が指定

プライオリティ
ログの重要度を示す
低 <-- debug、info、、notice、warning、err、crit、alert、emerg --> 高
ソフト開発者が指定

アクション
「ファシリティ」「プライオリティ」で分類されたログをどのように処理するかを指定
・ファイル出力
・コンソール出力
・パイプでプログラムへ渡す
・ユーザーに通知 など


ファシリティ・プライオリティの指定例


mail,ftp.warn
ファシリティ「mail」と「ftp」の「warn」以上を処理

mail.err
ファシリティ「mail」の「err」以上を処理

mail.*;mail.!warn
ファシリティ「mail」の「warn」以下を処理

「*」----全てのプライオリティ

kern.=warn
ファシリティ「kern」の「warn」のみを処理

.;daemon.none
ファシリティ「daemon」以外の全てを処理


アクションの指定例


/var/log/sample.log
ファイルへ出力

| /usr/bin/***.sh
パイプで他のプログラムへ渡す

/dev/console
ローカルコンソールへ出力

@remotehost
リモートホストのsyslogdへ送信

root,morimoru
rootとmorimoruのターミナルへ出力

*
全てのオンラインユーザーのターミナルへ出力



syslogdの設定を変えたら再起動
$sudo /etc/init.d/sysklogd restart

2009年2月28日土曜日

Debian/cronのメモ

こんにちは、モリモルです。

cron(クローン)のメモです。

/etc/init.d/cron
cronのrcスクリプト

/var/log/cron.log
cronのログファイル


ユーザーのcron設定

/var/spool/cron/crontabs/(ユーザー名)
各ユーザーのcronファイル

crontab [-u (ユーザー名)] {-l | -r | -e}

-e:編集、-r:削除、-l:表示

-eで起動するエディタは環境変数EDITOR or alternativeのeditor

書式
分 時 日 月 曜日 コマンド

[分の場合]
*/3 ----- 3分ごとに
0,1,10,45 ----- 0分、10分、45分
0,20-30,50 ----- 0分、20~30分、50分

[曜日の場合]
1-5 ----- 月~金

環境変数の設定
必要な場合は記述できる。

PATH=/usr/local/bin:/usr/bin
# m h dom mon dow command



rootのcron設定

/etc/crontab

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

test -x /usr/sbin/anacron....run-parts....
anacronがなければ、
run-partsコマンドで/etc/cron.*ディレクトリにある実行ファイルを全て実行する。

/etc/cron.dディレクトリ
細かい設定が必要な場合は、/etc/crontabと同じ書式でファイルを置いておく。

Debian/ユーザー管理

こんにちは、モリモルです。

ユーザー管理のメモです。


グループ

addgroup [--gid 1000] (新規グループ名)
グループIDは1000~29999の間で。

/etc/group
[グループ名]:x:[グループID]:[所属ユーザー]
パスワードはshadowなんでx
所属ユーザーは、デフォルトグループではなく、追加グループとして登録されたユーザー名。

グループにユーザーを追加
usermod [-g (デフォルトグループ)] [-G (追加グループ)] (ユーザ名)
adduser (ユーザー名) (グループ名)

グループの削除
groupdel (グループ名)
デフォルトグループに所属ユーザーがいる場合は削除できない


ユーザー

ユーザー追加
adduser [--uid 1000] [--gid 1000] [--disabled-password] (新規ユーザー名)

--disabled-password
パスワードをロック、プロンプトからログインできない。rootからはログイン可

/etc/skel
新規ユーザーを作成時に/home/ユーザー名でコピーされる

/etc/passwd
(ユーザー名):(ユーザーID):(所属グループID):,,,:(ホームディレクトリ):(シェルのパス)
morimoru:x:1000:1002:morimoru,,,:/home/morimoru:/bin/bash

/etc/shadow
(ユーザー名):(暗号化パスワード):(パスワードの有効期限とか、、)

ユーザー情報の変更
usermod [-d (ホームディレクトリ)] [-L] [-U] (ユーザー名)
-L:パスワードをロック
-U:パスワードをアンロック

ユーザーの削除
userdel [-r] (ユーザー名)
-r:ホームディレクトリも削除

2009年2月21日土曜日

Debian/init、ランレベルとか

こんにちは、モリモルです。

Debianのinitとか、ランレベルのメモです。

ランレベルの変更
telinit [-t 秒数] 【ランレベル】

/etc/iniitabを読み込み
telinit q
kill -HUP 1
initのプロセスIDが1。

以下、起動からの流れ

1--起動

2--init(/sbin/init)

3--/etc/inittabを読み込み

/etc/inittab

id:2:initdefault: <---ランレベルの指定
si::sysinit:/etc/init.d/rcS <---rcSスクリプトを実行

ランレベル
0:停止/1:シングルユーザー/2-5:マルチユーザー/6:再起動


4--rcSを実行、/etc/rcS.d/内のファイルを実行
これらスクリプトは、ハードウェアなどの基本的な設定を行う。

【S or K】【数値】【スクリプト名】
S:起動/K:停止、数値は実行する順番。

各ファイルは/etc/init.d/にある各rcスクリプトへのシンボリックリンクになっている。
/etc/rcS.d/

lrwxrwxrwx 1 root root 18 2009-02-02 22:54 S01glibc.sh -> ../init.d/glibc.sh
lrwxrwxrwx 1 root root 21 2009-02-02 22:55 S02hostname.sh -> ../init.d/hostname.sh



5--指定ランレベルのスクリプトを実行
/etc/rc*.dにあるスクリプトを実行。
rcS.dと同じで、/etc/init.d/にある各rcスクリプトへのシンボリックリンク。
K(停止)→ S(起動)の順で実行。

2009年2月14日土曜日

sudo

こんにちは、モリモルです。

sudoのメモです。

設定ファイル
/etc/sudoers

visudo
visudoコマンドで編集するエディタは、環境変数 EDITORに指定する。
export EDITOR=vim

この環境変数がないと、altervertiveのeditorが使われる。

debian:~# update-alternatives --display editor
editor - status is auto.
link currently points to /bin/nano


【ユーザー名】 【ホスト】=(【代行するユーザ】) 【実行できるコマンド】
morimoru ALL=(ALL) ALL
ユーザーmorimoruは、全てのホストから、全てのユーザーを代行して、全てのコマンドを実行できる。

%【グループ名】 【ホスト】=(【代行するユーザ】) 【実行できるコマンド】
%wheel ALL=(ALL) ALL
wheelグループのユーザーは、全てのホストから、全てのユーザーを代行して、全てのコマンドを実行できる。

(【代行するユーザー】)を省略すると、rootということになります。



Aliasを作っていろいろとまとめる

ローカルネットワークのエイリアス
Host_Alias LOCAL = 192.168.91.0/24

ユーザーをまとめたエイリアス
User_Alias DEV = morimoru, takaki

コマンドをまとめたエイリアス
Cmnd_Alias IFCONFIG = /sbin/ifconfig
Cmnd_Alias REMOVE = /bin/rm, /usr/bin/unlink, /bin/rmdir, /sbin/newfs
Cmnd_Alias SHUTDOWN = /sbin/shutdown, /sbin/halt, /sbin/poweroff


DEV LOCAL=(ALL) ALL, !IFCONFIG, !REMOVE, !SHUTDOWN

ユーザー(morimoruとtakaki)は、ローカルアドレスのホストからののみ、全てのユーザーとして、
コマンドエリアス(IFCONFIG/REMOVE/SHUTDOWN)意外のコマンドを全て実行できる。

morimoru@debian:~$ sudo -u root ifconfig
Sorry, user morimoru is not allowed to execute '/sbin/ifconfig' as root on debian.localdomain.



sudoのログ
sudoしたログは、/var/log/auth.logに記録されます。

morimoru@debian:~$ sudo tail -2 /var/log/auth.log
Feb 18 18:15:02 debian sudo: morimoru : TTY=pts/0 ; PWD=/home/morimoru ; USER=root ; COMMAND=/usr/bin/tail -2 /var/log/auth.log
Feb 18 18:15:14 debian sudo: morimoru : command not allowed ; TTY=pts/0 ; PWD=/home/morimoru ; USER=root ; COMMAND=/sbin/ifconfig

2009年2月9日月曜日

APT/インストール

こんにちは、モリモルです。

APT関連のメモが続きます。
APTでパッケージのインストールする場合です。

apt-get [-s] install パッケージ名/Debianバージョン

-sオプションを付けると、実際にはインストールせずに、インストール時にどうなるかを確認できます。


debian:~# apt-get -s install rails
(省略)
The following extra packages will be installed:
irb1.8 liberb-ruby libpgsql-ruby1.8 libpq4 libreadline-ruby1.8 libredcloth-ruby1.8 rake rdoc rdoc1.8 ruby
Suggested packages: <---- 入れたほうがよいパッケージ
libapache2-mod-ruby libapache-mod-ruby libapache2-mod-fcgid libfcgi-ruby1.8
Recommended packages: <---- 入れると便利なパッケージ
irb
The following NEW packages will be installed: <---- 依存パッケージ(APTが自動でインスコ
irb1.8 liberb-ruby libpgsql-ruby1.8 libpq4 libreadline-ruby1.8 libredcloth-ruby1.8 rails rake rdoc rdoc1.8 ruby
0 upgraded, 11 newly installed, 0 to remove and 3 not upgraded.
Inst libreadline-ruby1.8 (1.8.5-4etch4 Debian-Security:4.0/stable)
(省略)
Conf libreadline-ruby1.8 (1.8.5-4etch4 Debian-Security:4.0/stable)
(省略)

Inst ----- パッケージの展開
Conf ----- パッケージの設定
Rmv ----- パッケージの削除


パッケージのDLが途中で終了した場合
再度、「apt-get install パッケージ名」でダウンロードを再開してくれるみたいです。


debian:~# apt-get install rails
Reading package lists... Done
(省略)
Do you want to continue [Y/n]? y
Get:1 http://security.debian.org etch/updates/main libreadline-ruby1.8 1.8.5-4etch4 [197kB]
(省略)
10% [4 irb1.8 65813/236kB 27%] [3 libpq4 38728/290kB 13%]
【DLを中断】


debian:~# ls -l /var/cache/apt/archives/
total 208
-rw-r--r-- 1 root root 3530 Jan 12 2005 liberb-ruby_2.0.4+ruby1.8.2-1_all.deb
-rw-r--r-- 1 root root 197442 Dec 6 22:00 libreadline-ruby1.8_1.8.5-4etch4_i386.deb
【途中までダウンロード済み】


debian:~# apt-get install rails <-----再度インストール
debian:~# ls -l /var/cache/apt/archives/
-rw-r--r-- 1 root root 235540 Dec 6 20:55 irb1.8_1.8.5-4etch4_all.deb
-rw-r--r-- 1 root root 3530 Jan 12 2005 liberb-ruby_2.0.4+ruby1.8.2-1_all.deb
(残りのパッケージもDL)
-rw-r--r-- 1 root root 39354 Oct 17 2006 libpgsql-ruby1.8_0.7.1-10_i386.deb
(省略)
-rw-r--r-- 1 root root 18980 Jan 12 2005 ruby_1.8.2-1_all.deb


パッケージの展開 or 設定に失敗した場合
パッケージの展開で失敗した場合、パッケージの状態がUになります。
設定で失敗した場合は、Cになります。

debian:~# dpkg --list | grep iU
iU irb1.8 1.8.5-4etch4 Interactive Ruby (for Ruby 1.8)
iU liberb-ruby 2.0.4+ruby1.8.2-1 Tiny eRuby
(省略)


dpkg --configure --pending
設定をし直します。

debian:~# dpkg --configure --pending
Setting up libpq4 (8.1.15-0etch1) ...

Setting up liberb-ruby (2.0.4+ruby1.8.2-1) ...
(省略)


debian:~# dpkg --list | grep ruby
ii irb1.8 1.8.5-4etch4 Interactive Ruby (for Ruby 1.8)
ii liberb-ruby 2.0.4+ruby1.8.2-1 Tiny eRuby
(省略)


編集中

APT/依存性の確認

こんにちは、モリモルです。

まだまだ、APT関連のメモが続きます。

パッケージの依存性を確認するには、
apt-cache depends パッケージ名


debian:~# apt-cache depends rails
rails
Depends: ruby <------railsが依存してるパッケージ
(省略)
|Suggests: libapache2-mod-ruby <-----一緒に入れると便利なパッケージ
(省略)
Recommends: irb <---------入れないと機能の一部に支障があるかも。。
(省略)
Conflicts: <-----競合パッケージ(おそらくAPTが削除してくれる)

「Suggests」「Recommends」はAPTが自動的にインストールしてくれないようです。



逆に指定したパッケージに依存している、パッケージを調べるには、
apt-cache showpkg パッケージ名


debian:~# apt-cache showpkg rails
Package: rails
Versions:
(省略)
Reverse Depends:
mongrel,rails <------railsを必要とするパッケージ
(省略)
Dependencies:
(省略)
Reverse Provides:
(省略)

2009年2月7日土曜日

APT/パッケージ詳細

こんにちは、モリモルです。

しばらく、APT関連のメモが続きます。。


apt-cache show パッケージ名
パッケージの詳細をapt-lineから取得します。

Package: rails
Priority: optional
Section: web
Installed-Size: 12940
Maintainer: Adam Majer <adamm@zombino.com>
Architecture: all
Version: 1.1.6-3
Depends: ruby, ruby1.8 (>= 1.8.2-3), rake (>> 0.7.0), rdoc (>> 1.8.2), libpgsql-ruby1.8 | libmysql-ruby1.8 | libdbi-ruby1.8, libredcloth-ruby1.8, liberb-ruby
Recommends: irb (>> 1.8)
Suggests: libapache2-mod-ruby | libapache-mod-ruby | libapache2-mod-fcgid, libfcgi-ruby1.8
Conflicts: libdevel-logger-ruby1.8
Filename: pool/main/r/rails/rails_1.1.6-3_all.deb
Size: 1777424(省略)

Priority
パッケージの重要度らしいです。
optional(自由選択)/require(Debianに必須)/important、standard(インスコした方がよい)

Maintainer
アダムさんがメンテナンスしてくれているようです。

Version
【オリジナルバージョン番号】-【Debianのリビジョン】

Replaces
このパッケージをインストールすると削除されるパッケージ(APTの場合のみ)

Depends
依存パッケージ(APTがすべてインストールしてくれます。)

Recommends
インストールしないと、機能の一部に不具合がでるかもしれないパッケージ(APTはインストールしてくれません。)

Suggests
一緒にインストールすると便利なパッケージ

Conflicts
競合パッケージ、APTが削除してくれます。
Replacesとは異なり、代わりをしてくれません。

Filename
apt-lineのURL上のディレクトリ
ここからDLしてることになります。
http://ftp.jp.debian.org/debian/pool/main/r/rails/

APT/パッケージを検索

こんにちは、モリモルです。

引き続き、パッケージ関連のメモです。
前回は、apt-lineを追加したので各apt-lineからパッケージを探します。

sudoを探してみようと思います。


apt-cache search "検索文字"

検索文字を"sudo"にするより、" sudo "と前後に空白を入れると絞りやすいようです。

debian:~# apt-cache search " sudo "
(省略)
sudo - Provide limited super user privileges to specific users
sudo-ldap - Provide limited super user privileges to specific users



apt-cache show パッケージ名

「apt-cache show sudo」で各apt-line上にある、sudoパッケージの詳細情報を調べられます。

debian:~# apt-cache show sudo
Package: sudo
(省略)
Version: 1.6.9p17-2 <-----1コ
(省略)
Package: sudo
(省略)
Version: 1.6.8p12-4 <-----2コ
(省略)

パッケージが2コ選出されました。
これは、私がapt-lineに「testing」と「stable」の両方を入れているからです。

debian:~# apt-cache policy sudo
sudo:
Installed: (none)
Candidate: 1.6.9p17-2
Version table:
1.6.9p17-2 0
500 http://ftp.jp.debian.org testing/main Packages
1.6.8p12-4 0
500 http://ftp.jp.debian.org etch/main Packages

基本的にバージョンの新しい方がインストール候補になるので、
このまま、apt-get install sudoをすると、testingが入ってしまいます。

APT/apt-lineについて

こんにちは、モリモルです。
Debianをインスコしたので、メモです。

Debianはパッケージ管理に、APT(Advance Package Tool)を使ってます。

apt-line
APTでパッケージを拾ってくる先です。
/etc/apt/sources.listで設定ができます。
debian:~# cat /etc/apt/sources.list
#deb cdrom:[Debian GNU/Linux 4.0 r6 _Etch_ - Official i386 NETINST Binary-1 20081220-23:12]/ etch contrib main
#deb cdrom:[Debian GNU/Linux 4.0 r6 _Etch_ - Official i386 NETINST Binary-1 20081220-23:12]/ etch contrib main

deb http://ftp.jp.debian.org/debian/ etch main
deb-src http://ftp.jp.debian.org/debian/ etch main

deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib
deb http://security.debian.org/ stable/updates main contrib
deb-src http://security.debian.org/ stable/updates main contrib

deb http://ftp.jp.debian.org/debian/ testing main
deb-src http://ftp.jp.debian.org/debian/ testing main


「etch/updates」だと、apt.confでのAPT Priorityの設定がうまくいかなかった、
「stable/updates」に変更。


書式は、deb[-src] 「ベースURI」 「Debianバージョン」 「コンポーネント」

「deb」がバイナリ、「deb-src」がソースファイルです。
私の場合、ソースファイルはまず必要ないと思いますが、とりあえず入れてあります。

ベースURI
deb cdrom:、はインストール初期設定のAPTの設定において、cdromを選択したので記述されてました。
もう使わないので#でコメントアウトしてあります。

Debianバージョン
コードネーム(sarge、etchなど)もしくは、バージョン名(stable、testing、unstable)を指定できます。
インストールした現時点では、etchがstableなので、etchを指定すると安定版になるようです。

コンポーネント
・main/公式Debianパッケージ
・contrib/依存ファイルがDebianガイドラインに沿ってない
・non-free/このパッケージ自体も再配布できない
まず再配布など考えてないので、、特に気にせずすべていれました。


パッケージ情報を取得
#apt-get update
パッケージ情報を各apt-lineから取得してきます。
testingを追加したら、「メモリ不足です」と言われたので、
/etc/apt/apt.confに「APT::Cache-Limit "50000000";」を記述したら無事すべて取得できました。

「ftp.jp.debian.org」の「etch」と、「security.debian.org」の「etch/updates」を追加して、
定期的に、「apt-get update」、「apt-get upgrade」をしておけばセキュリティが最新な状態で保てるようです。
私の場合、apt-lineに「testing」が入ってますが、apt.confでベースのDebianバージョンがstableになっています。

2009年1月23日金曜日

RubyGemsについて

こんにちは、モリモルです。


morimoru@ubuntu:~$ ruby -e '$:.each{|path| puts path}'
/usr/local/lib/ruby/site_ruby/1.8
/usr/local/lib/ruby/site_ruby/1.8/i686-linux
/usr/local/lib/ruby/site_ruby
/usr/local/lib/ruby/vendor_ruby/1.8
/usr/local/lib/ruby/vendor_ruby/1.8/i686-linux
/usr/local/lib/ruby/vendor_ruby
/usr/local/lib/ruby/1.8
/usr/local/lib/ruby/1.8/i686-linux
.




morimoru@ubuntu:~$ gem environment gemdir
/usr/local/lib/ruby/gems/1.8


morimoru@ubuntu:~$ gem environment gempath
/home/morimoru/.gem/ruby/1.8:/usr/local/lib/ruby/gems/1.8

編集中・・・

2009年1月10日土曜日

クラスとか

こんにちは。モリモルです。

Rubyのクラスについて頭の中のイメージを図にしてみました。
これで良いのかな?間違ってるかもしれません。。


Objectクラス
Objectクラスはすべてのクラスのスーパークラスです。
Class#superclassでさかのぼって行くとObjectクラスにたどり着きます。

irb(main):251:0* String.superclass
=> Object
irb(main):252:0> Class.superclass.superclass
=> Object
irb(main):254:0> Fixnum.superclass.superclass.superclass
=> Object


ObjectクラスにClass#superclassをするとnilが返ってきます。

irb(main):261:0* Object.superclass
=> nil


Classクラス
Classクラスは「クラスのクラスです」
この「クラスのクラス」といのがイメージしにくいですよね。。

「クラスがクラスを持つ」ということは、Rubyではクラスもオブジェクトということになるようです。

irb(main):303:0* String.class
=> Class
irb(main):304:0> String.object_id
=> -605238788


つまり、SringクラスはClassクラスのインスタンスということになります。
Classクラスに定義されたClass#superclassインスタンスメソッドをSringをレシーバーとして使えるわけですよね。

Classクラスもオブジェクトで、そのクラスは自身を指しているようです。
なので、Classをレシーバーとしてsuperclassメソッドが使えるということかな。

irb(main):289:0* Class.class
=> Class
irb(main):290:0> Class.superclass
=> Module



Class#superclass

ごくごく当然なのですが、"abc"だったり、KernelをレシーバーにするとClass#superclassには辿り着けないようです。クラスじゃないからスーパークラスを返せないというより、そのメソッドにたどり着けないということですよね。


irb(main):318:0* "abc".superlcass
NoMethodError: undefined method `superlcass' for "abc":String
from (irb):318
from :0
irb(main):319:0>
irb(main):320:0* Kernel.superclass
NoMethodError: undefined method `superclass' for Kernel:Module
from (irb):320
from :0
irb(main):321:0>



Module#ancestors

Moduleクラスに定義されたインスタンスメソッドは、すべてのモジュール&クラスをレシーバーにして使えるようです。
Moduleがレシーバの場合はClass経由でグルっと回って使えるというイメージなのかな。

irb(main):349:0* Module.ancestors
=> [Module, Object, Kernel]


"abc"からはたどり着けないようです。

irb(main):368:0* "abc".ancestors
NoMethodError: undefined method `ancestors' for "abc":String
from (irb):368
from :0



Objectクラスのインスタンスメソッド
Object#object_id、Object#class、Object#instance_of?、Object#kind_of? とか。


Objectクラスのインスタンスメソッドはすべてのオブジェクトをレシーバーとして使えるようです。


irb(main):358:0* "abc".object_id
=> -605469638
irb(main):359:0> Object.object_id
=> -605233518
irb(main):360:0> Kernel.object_id
=> -605233578

2009年1月3日土曜日

WEBrick::HTTPServlet::CGIHandlerを使ってみました。

こんにちは、モリモルです。

WEBrickでCGIを動かしてみます。
使い方は、以前の自作サーブレットと同じような感じで、

HTTPServer#mount("URL", HTTPServlet::CGIHandler, "Rubyスクリプトへのパス")

第一引数のURLにアクセスがあるたびに、
第二引数のインスタンスを生成して、HTTPServlet::AbstractServlet#serviceを呼び出すようです。
第三引数のRubyスクリプトはHTTPServlet::CGIHandlerのコンストラクタに引数として渡されます。


では、簡単なCGIを作ってアクセスしてみます。
/var2/www/cgi/foo.rb

1 #!/usr/local/bin/ruby
2
3 require 'cgi'
4
5 cgi = CGI.new
6 print cgi.header({"type" => "text/html", "status" => "OK"})
7 print DATA.read
8
9 __END__
10 <html>
11 <body>
12 <h1>foo.rb</h1>
13 </body>
14 </html>


server.rb

1 #! /usr/local/bin/ruby
2 require 'webrick'
3 include WEBrick
4
5 server = HTTPServer.new(
6 :DocumentRoot => "/var2/www/html",
7 :Port => 20080,
8 :BindAddress => "myhost")
9
10
11 server.mount("/cgi", HTTPServlet::CGIHandler, "/var2/www/cgi/foo.rb")
12
13 trap("INT"){server.stop}
14
15 server.start


ブラウザから“http://192.168.91.128:20080/cgi”にアクセスしてみます。


表示されましたね。

2009年1月2日金曜日

WEBrickで“Cannot assign requested address”

明けましておめでとうございます。モリモルです。

正月休みを利用して、CentOSからUbuntuに乗り換えました。
乗り換えた後のWEBrickサーバーを起動で、“Cannot assign requested address”とエラーが出た際のメモです。

今までは、直接IPアドレスを入れていたのですが、
/etc/hostsに記述してあるホスト名に変更したら問題なく動きました。

server = HTTPServer.new(
:DocumentRoot => "/var2/www/html",
:Port => 20080,
:BindAddress => "myhost")
# :BindAddress => "192.168.91.128")