This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/65

Railsコア(RailTies)に対する./script/breakpointer機能拡張パッチが採用されました。

これによって、ブレークポイント到達時にこんな事ができるようになります。
   1  irb(#<topcontroller:0x40822a68>):002:0> show_source_list
   2  0001  class TopController < ApplicationController
   3  0002    def show
   4  0003->    breakpoint
   5  0004    end
   6  0005    
   7  0006    def index
   8  0007    end
   9  0008    
  10  => "/path/to/rails/root/app/controllers/top_controller.rb"
  11  irb(#</topcontroller:0x40822a68><topcontroller:0x40822a68>):004:0> show_call_stack 3
  12  vendor/rails/railties/lib/breakpoint.rb:536:in `breakpoint'
  13  vendor/rails/railties/lib/breakpoint.rb:536:in `breakpoint'
  14  app/controllers/top_controller.rb:3:in `show'
  15  => "/path/to/rails/root/app/controllers/top_controller.rb:3"
  16  </topcontroller:0x40822a68>

ブレークポイント周辺のソースリストの表示と、コールスタックの表示です。 show_source_listの方は、引数に行数を指定する事で、表示するソースリストの 範囲を変えることができます。

あとはステップ実行ができるようになれば、普通のデバッガど同等の事ができるようになりそうですね。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/65

posted by Png genki on Mon 10 Jul 2006 at 01:10

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/64

先日、自分が検索エンジンをほとんど使わなくなったことに気が付いて、ちょっとビックリしました。 あったとしても、せいぜい1ワードの単語の意味を調べるのに使うぐらい。 その場合でも、Googleじゃなくてgoo辞書(含むWikipedia)とかを使う事が多いです。 1日中パソコンの前にいて、Googleを一回も使わない日もあるんですよね。 1年前の自分だったら考えられない事です。

なぜそうなったかを考えてみると、明らかにソーシャルブックマークのフィードをRSSリーダで購読するようになったからですね。 使い始めた最初のうちはそんなに変化はなく、Googleも普通に使っていたのですが、 自分でブックマークしたエントリを同じくブックマークしている人とかのブックマークのフィード をRSSリーダに登録するようになってから、徐々に自分でウェブを巡回する必要性 が無くなって来た感じです。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/64

posted by Png genki on Sun 9 Jul 2006 at 20:03
7th Fri

Rubyist SNS

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/63

同僚から教えてもらったのですが、Rubyist SNSなるものがあるみたいです。

イベントの参加登録を行うのが目的で、暫定運用中との事。 早速参加してみました。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/63

posted by Png genki on Fri 7 Jul 2006 at 12:09

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/62

素人くさいSICP読書会に参加してきました。

ここのところ数回続けて参加できていなかったので、参加できて良かったです。

参加者数は、だいたい15名前後でした。今までと同様、演習問題を黙々と解いていくという形式で進められました。今回の範囲は、演習問題 2.9〜2.11でした。 間が空いていたので、前回までに進んだところを追いかけながら進めました。

途中、IntervalのWidthが減る事があるかどうか、という議論がありましたが、Widthは誤差のようなものなので、演算の結果として減る事は無いですね。

ということで、今回使ったコードを置いておきます(ちゃんと検証してないから書き間違いがあるかも)

;;7/5
(define (make-interval a b) (cons a b))
(define (lower-bound x) (car x))
(define (upper-bound x) (cdr x))

(define (add-interval x y)
  (make-interval (+ (lower-bound x) (lower-bound y))
                 (+ (upper-bound x) (upper-bound y))))

(define (mul-interval x y)
  (let ((p1 *1 (lower-bound y)))
        (p2 *2 (upper-bound y)))
        (p3 *3 (lower-bound y)))
        (p4 *4 (upper-bound y))))
    (make-interval (min p1 p2 p3 p4)
                   (max p1 p2 p3 p4))))

(define (div-interval x y)
  (mul-interval x
                (make-interval (/ 1.0 (upper-bound y))
                               (/ 1.0 (lower-bound y)))))

;; ex 2.8
(define (sub-interval x y)
  (make-interval (- (lower-bound x) (upper-bound y))
                 (- (upper-bound x) (lower-bound y))))

;; ex 2.10
(define (div-interval-2 x y)
  (if (and (>= (upper-bound y) 0) (<= (lower-bound y) 0))
      (display "error: divider is spanning zero.")
      (div-interval x y)))

;; ex 2.11
(define (mul-interval-2 x y)
  (define (pp-pp-mul s t)
    (make-interval *5 (lower-bound t))
                   *6 (upper-bound t))))
  (define (pp-mm-mul s t)
    (make-interval *7 (lower-bound t))
                   *8 (upper-bound t))))
  (define (pp-pm-mul s t)
    (make-interval *9 (lower-bound t))
                   *10 (upper-bound t))))
  (define (mm-mm-mul s t)
    (make-interval *11 (upper-bound t))
                   *12 (lower-bound t))))
  (define (mm-pm-mul s t)
    (make-interval *13 (upper-bound t))
                   *14 (lower-bound t))))
  (define (mm-pp-mul s t) (pp-mm-mul t s))
  (define (pm-pp-mul s t) (pp-pm-mul t s))
  (define (pm-mm-mul s t) (mm-pm-mul t s))
  (define (pm-pm-mul s t)
    (make-interval (min *15 (lower-bound t))
                        *16 (upper-bound t)))
                   (max *17 (lower-bound t))
                        *18 (upper-bound t)))))
  (define (pp s) (> (lower-bound s) 0))
  (define (mm s) (< (upper-bound s) 0))
  (define (pm s) (not (or (pp s) (mm s))))
  (cond ((and (pp x) (pp y)) (pp-pp-mul x y))
        ((and (pp x) (mm y)) (pp-mm-mul x y))
        ((and (pp x) (pm y)) (pp-pm-mul x y))
        ((and (mm x) (pp y)) (mm-pp-mul x y))
        ((and (mm x) (mm y)) (mm-mm-mul x y))
        ((and (mm x) (pm y)) (mm-pm-mul x y))
        ((and (pm x) (pp y)) (pm-pp-mul x y))
        ((and (pm x) (mm y)) (pm-mm-mul x y))
        ((and (pm x) (pm y)) (pm-pm-mul x y))))

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/62

  1. 1 (lower-bound x

  2. 2 (lower-bound x

  3. 3 (upper-bound x

  4. 4 (upper-bound x

  5. 5 (lower-bound s

  6. 6 (upper-bound s

  7. 7 (upper-bound s

  8. 8 (lower-bound s

  9. 9 (upper-bound s

  10. 10 (upper-bound s

  11. 11 (upper-bound s

  12. 12 (lower-bound s

  13. 13 (lower-bound s

  14. 14 (lower-bound s

  15. 15 (upper-bound s

  16. 16 (lower-bound s

  17. 17 (lower-bound s

  18. 18 (upper-bound s

posted by Png genki on Thu 6 Jul 2006 at 16:12

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/60

ドリコムRSSのクリップ用ボタンを作ってみました。

このページを追加

下記のようなHTMLを記述すると利用できます。

このページを追加

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/60

posted by Png genki on Tue 4 Jul 2006 at 03:10

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/59

両方とも素晴らしい内容です。 今後はドンドンRails関連の情報が充実していきそうですね。 非常に楽しみです。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/59

posted by Png genki on Tue 4 Jul 2006 at 01:59

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/58

長かった…。ようやく終わった。

大分疲れましたが、良い経験が得られました。

作品応募者の皆様、まだ微調整などあるかもしれませんが、ひとまずお疲れ様でした。

審査は明日(7月3日)からはじまります。どうぞよろしくお願いします。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/58

posted by Png genki on Sun 2 Jul 2006 at 15:20

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/56

GDCHARTの導入手順メモです。 まず、下記手順でGDCHARTをインストールします。リリース版は make install が出来ないので、最新の開発版を使った方が楽かもしれません。

cd /usr/local/src
wget http://www.fred.net/brv/chart/gdchart0.11.5dev.tar.gz
tar xvzf gdchart0.11.5dev.tar.gz
rm gdchart0.11.5dev.tar.gz
cd gdchart0.11.5dev
vim Makefile
ここでMakefileの中身のGD_INCLとGD_LIBを適切に設定します。 デフォルトでは/usr/localの下を見るようになっているので、パッケージマネージャを使ってgd-develを導入した場合はおそらく/usr/の下を見るようにした方が良いでしょう。
make
make install
これで gdchartが入りました。

さて、次はruby-gdchartです。 gdchartが入っていれば、後は普通に

cd /usr/local/src
wget http://www.cozmixng.org/~kou/download/gdchart-0.0.5.tar.gz
tar xvzf gdchart-0.0.5.tar.gz
rm gdchart-0.0.5.tar.gz
cd gdchart-0.0.5
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install
で完了です。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/56

posted by Png genki on Fri 30 Jun 2006 at 10:39

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/55

RailsCronプラグインを利用すると、定期的に繰り返される処理を簡単に実装する事ができます。 普通はこのような事を実現する為に cron を使う事が多いと思いますが、Railsアプリケーションは起動しっぱなしで使う事が多いので、こういう方法もありですね。

使い方はいたって簡単です。まずはプラグインをインストールします。

./script/plugin install -c http://svn.kylemaxwell.com/rails_cron/trunk/
続いて、lib/cron.rb を記述します。
module Cron
  def Cron.create_do_something_cron
    RailsCron.create(
      :command => "Cron.do_something",
      :start => Time.now,
      :every => 10.second)
  end

  def Cron.do_something
    # some works
  end
end
続いて、RailsCronを初期化します。
rake cron_start
これによって、rails_cronsテーブルが存在しない場合は作成され、ウェブサーバが再起動します。 そして実際にRailsCronオブジェクトを作成及び登録します。
./script/console
>> Cron.create_do_something_cron
RailsCronはActiveRecordオブジェクトなので、以上でDBに登録されます。

RailsCronプラグインを導入すると、下記のようなrakeターゲットが追加されます。

  • cron_start -- RailsCronをデーモンとして起動
  • cron_foreground -- RailsCronをフォアグラウンドで起動
  • cron_stop -- 正常(Graceful)に停止
  • cron_kill -- プロセスをkill
  • cron_graceful -- 正常に再起動
  • cron_restart -- プロセスをkillして再起動
  • cron_status -- ステータスを表示

cron を実行するユーザを指定したい場合は、RAILSCRON_SUDO環境変数を設定すると良いようです。詳細はこの辺に書かれています。 また、production環境で実行する場合は、RAILS_ENVの指定を忘れないように注意する必要があります。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/55

posted by Png genki on Thu 29 Jun 2006 at 18:02

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/54

以下は自分用にLife with qmailの内容を要約したものです。

まず、ソースファイルを/usr/local/srcにダウンロードし、展開します。

cd /usr/local/src
wget http://www9.jp.qmail.org/netqmail-1.05.tar.gz
wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
それぞれを展開。
tar xvzf netqmail-1.05.tar.gz
tar xvzf ucspi-tcp-0.88.tar.gz
tar xvzf daemontools-0.76.tar.gz

最初はqmailから。

cd netqmail-1.05
./collate.sh
mkdir /var/qmail
mkdir /etc/qmail
ln -s /etc/qmail /var/qmail/control
cd /usr/local/src/netqmail-1.05/netqmail-1.05
cp INSTALL.ids IDS
ここで、IDSの中身から下記のものを選ぶ(構成に応じて変更すること)
groupadd nofiles
useradd -g nofiles -d /var/qmail/alias alias
useradd -g nofiles -d /var/qmail qmaild
useradd -g nofiles -d /var/qmail qmaill
useradd -g nofiles -d /var/qmail qmailp
groupadd qmail
useradd -g qmail -d /var/qmail qmailq
useradd -g qmail -d /var/qmail qmailr
useradd -g qmail -d /var/qmail qmails
余談ですが、先頭のコメント部分の一括削除等は vim のVISUAL BLOCKモードだと作業がしやすいです。そして、
chmod +x IDS
./IDS
make setup check
./config-fast <メールアドレスの@の右側に来るところ>
これで qmail は完了。続いて ucspi-tcp のインストールです。
cd /usr/local/src/ucspi-tcp-0.88
patch < ../netqmail-1.05/other-patches/ucspi-tcp-0.88.errno.patch
make
make setup check
そして daemontools のインストール。
cd /usr/local/src/admin/daemontools-0.76/src
patch < ../../../netqmail-1.05/other-patches/daemontools-0.76.errno.patch
cd ..
package/install
以上でインストール作業は完了です。

さて、続いてnetqmailの設定を行います。 /var/qmail/rcを次のように記述します。

#!/bin/sh

# Using stdout for logging
# Using control/defaultdelivery from qmail-local to deliver messages by default

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start "`cat /var/qmail/control/defaultdelivery`"
続いて、
chmod 755 /var/qmail/rc
mkdir /var/log/qmail
echo ./Mailbox >/var/qmail/control/defaultdelivery
次に、/var/qmail/bin/qmailctlファイルを下記から持ってきます。
cd /var/qmail/bin
wget http://lifewithqmail.org/qmailctl-script-dt70
mv qmailctl-script-dt70 qmailctl
chmod 755 /var/qmail/bin/qmailctl
ln -s /var/qmail/bin/qmailctl /usr/bin
続いて、superviserディレクトリの設定を行います。
mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log
echo '#!/bin/sh' >> /var/qmail/supervise/qmail-send/run
echo 'exec /var/qmail/rc' >> /var/qmail/supervise/qmail-send/run
echo '#!/bin/sh' >> /var/qmail/supervise/qmail-send/log/run
echo 'exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail' >> /var/qmail/supervise/qmail-send/log/run
echo '#!/bin/sh' >> /var/qmail/supervise/qmail-smtpd/log/run
echo 'exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd' >> /var/qmail/supervise/qmail-smtpd/log/run
続いて/var/qmail/supervise/qmail-smtpd/runファイルを次のように記述します。
#!/bin/sh

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`

if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
    echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
    echo /var/qmail/supervise/qmail-smtpd/run
    exit 1
fi

if [ ! -f /var/qmail/control/rcpthosts ]; then
    echo "No /var/qmail/control/rcpthosts!"
    echo "Refusing to start SMTP listener because it'll create an open relay"
    exit 1
fi

exec /usr/local/bin/softlimit -m 2000000 \
    /usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
        -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
最後に、
echo 20 > /var/qmail/control/concurrencyincoming
chmod 644 /var/qmail/control/concurrencyincoming
chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-send/log/run
chmod 755 /var/qmail/supervise/qmail-smtpd/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
mkdir -p /var/log/qmail/smtpd
chown qmaill /var/log/qmail /var/log/qmail/smtpd
ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service
qmailctl stop
echo '127.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp
qmailctl cdb
既存のMTAをアンインストールします(これは構成によるのでここには書けません)。 あとは、sendmailをqmailで置き換えます。
mv /usr/lib/sendmail /usr/lib/sendmail.old
mv /usr/sbin/sendmail /usr/sbin/sendmail.old
chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old
ln -s /var/qmail/bin/sendmail /usr/lib
ln -s /var/qmail/bin/sendmail /usr/sbin
qmailctl start
以上で設定は完了です。

最後に、qmailctl statを実行して、下記のような感じに起動時間が進んでいることを確認します。

# qmailctl stat
/service/qmail-send: up (pid 29638) 7 seconds
/service/qmail-send/log: up (pid 29648) 7 seconds
/service/qmail-smtpd: up (pid 29637) 7 seconds
/service/qmail-smtpd/log: up (pid 29647) 7 seconds
messages in queue: 0
messages in queue but not yet preprocessed: 0
以上で全て完了です。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/54

posted by Png genki on Thu 29 Jun 2006 at 02:13