• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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

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

6/15(木)に開催されたGreeLabsのオープンソーステクノロジー勉強会#4に行ってきました。

今回はミラクルリナックスCTOの吉岡さんと、Greeの岩崎さんがスピーカーでした。Postgresのスケールアップに関するボトルネック分析手法の紹介と、エンジニアのキャリアについてを吉岡さんが、ウェブデザインパターンの紹介を岩崎さんがされました。

今回はCPU数を増やしていく、というようなスケールアップの話でしたが、横方向のスケールアウト手法に関心がある人が多かったのかな? エンジニアのキャリアについては、35歳でやめるな、という言葉が印象に残っています。

ウェブデザインパターンについては、呼び方の標準化によってコミュニケーションが円滑になりそうだし、HTMLのid、class名を考えるのが楽になったりと、いろいろ楽しそうなので詳しく調査してみたいです。情報源として、下記のサイトが紹介されていました。

懇親会では、Greeの藤本さんやKBMJの笠谷さん、KLabの富田さん、GaiaXの山口さん、ADWAYSの小関さんらと話しました。

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

posted by Png genki on Fri 16 Jun 2006 at 00:48

同僚の吉留さんにお願いして、JR恵比寿駅からドリコム東京事務所までの地図を作ってもらいました。

map

だいたい徒歩5分ぐらいです。事務所のビルの前には、雨がしのげる屋根があります。

posted by Png genki on Thu 15 Jun 2006 at 15:03

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

6月10〜11日の二日間にわたり開催された、日本Rubyカンファレンス2006(a.k.a. RubyKaigi2006)でRails In Productionというパネルディスカッションのパネラーとして参加させていただきました。

参加者の皆様、スピーカーの皆様、そして何より運営スタッフの皆様、 大変お疲れ様でした。大変楽しい時間がすごせました。ありがとうございます。

それから、僕がプレゼンで使用した資料はこちらになります:


rubykaigi06_takiuchi.ppt

会場が縦に長いスペースと聞いていたので、文字が見やすい高橋メソッドを使わせていただいたところ、スピーカー控え室で本家の高橋さんに添削&ご指導いただけるという幸運に恵まれました(笑) でかいプレゼンを買わなければ。

でかいプレゼン 高橋メソッドの本

それにしても、コメンテーター陣が凄かったですねー。むしろこっちから質問したかった(笑)  DHHさんから質問される、という状況はなかなか考えられないですよね。

2日間ほとんどスピーカー控え室の中におりましたが、Rubyコミュニティの著名な方々が沢山いらっしゃいまして、非常にエキサイティングでした。まつもとさん、DHHさん、西さん(くまくまーの人)ともはじめてお会いする事ができました。

特に、西さんとActiveRecord周りの話や、Patchを書くときに言葉の壁に苦しんでいる事など、いろいろな話が出来て良かったです。ぜひRails勉強会にもいらしてくださいね。Maihaのイラストを描いてくださってありがとうございました!

舞波乙です。

それから印象的だったのは、会場にいらっしゃっていた外国人の皆様は、Zevさん、ストヤンさんといい、なかなかご一緒していて楽しい方が多かった事です。海外で開催されているRubyConfも、こんな楽しい方々がいっぱいいらっしゃるんでしょうね。いつか参加してみたいです。 英語の壁を越えた暁には(いつになるやら…)

今後ともRubyコミュニティの発展をお祈りいたします。願わくは、来年のRuby会議で再会できますことを。

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

posted by Png genki on Mon 12 Jun 2006 at 01:30

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

render_componentの挙動を調査する必要があったので、メモを残しておきます。 render_componentは、いわゆるWidgetのような、再利用可能なGUI部品をレンダリングするメソッドです。以下に、要点だけ抜き出したソースを示します。

長いので先に結論だけ書いておくと、render_componentでレンダリングされるコンポーネントのコードから、呼び出し元の外部コントローラにアクセスするには、ActionController#parent_controllerを介せばOKです。

$ vim vendor/rails/actionpack/lib/action_controller/components.rb
module ActionController
module Components
  base.helper do
    def render_component(options)
      @controller.send(:render_component_as_string, options)
    end
  end
  module ClassMethods
    # Track parent controller to identify component requests
    def process_with_components(request, response, parent_controller = nil)
      controller = new
      controller.parent_controller = parent_controller
      controller.process(request, response)
    end
  end
  module InstanceMethods
    # Extracts the action_name from the request parameters and performs that action.
    def process_with_components(request, response, method = :perform_action, *arguments)
      flash.discard if component_request?
      process_without_components(request, response, method, *arguments)
    end
  protected
    # Returns the component response as a string
    def render_component_as_string(options)
      component_logging(options) do
        response = component_response(options, false)
        if redirected = response.redirected_to
          render_component_as_string(redirected)
        else
          response.body
        end
      end
    end
  private
    def component_response(options, reuse_response)
      klass    = component_class(options)
      request  = request_for_component(klass.controller_name, options)
      response = reuse_response ? @response : @response.dup
      klass.process_with_components(request, response, self)
    end
    # determine the controller class for the component request
    def component_class(options)
      if controller = options[:controller]
        controller.is_a?(Class) ?
          controller :
          "#{ controller.camelize }Controller".constantize
      else
        self.class
      end
    end
    # Create a new request object based on the current request.
    # The new request inherits the session from the current request,
    # bypassing any session options set for the component controller's class
    def request_for_component(controller_name, options)
      request         = @request.dup
      request.session = @request.session
      request.instance_variable_set(
        :@parameters,
        (options[:params] || {}).with_indifferent_access.update(
          "controller" => controller_name, "action" => options[:action],
          "id" => options[:id]))
      request
    end
  end
end

request_for_componentの中身:
with_indifferent_accessは、ActiveSupportによるHashの拡張機能で、Symbolと文字列のkeyを同一視できるようにするものです。instance_variable_setというのは、RubyのObjectクラスのメソッドで、こんな感じにインスタンス変数を外部から設定できてしまいます:

obj = Object.new
p obj.instance_variable_set("@foo", 1)  # => 1
p obj.instance_variable_set(:@foo, 2)   # => 2
p obj.instance_variable_get(:@foo)      # => 2

というわけで、上記のようにcontrolleractionidの指定を挿げ替えてrequestオブジェクトを偽装しているわけです。

そして、最終的にklass.process_with_components(request, response, self)が呼び出され、render_componentの呼び出し元のcontrollerparent_controllerに設定し、制御を実行しています。

したがって、レンダリングされるコンポーネントの内部からは、parent_controllerを介して呼び出し元のcontrollerとやり取りを行う事ができます。

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

posted by Png genki on Wed 7 Jun 2006 at 01:37

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

ふつうのHaskell写経会に行ってきました。サイトはこの辺でしょうか?

12〜14人ぐらい集まって、淡々とペア写経をしました。SICPと比べるとだいぶテンポが速そうですね。3章の始めぐらいまで進みました。

ghci

Prelude> :t length
length :: [a] -> Int

のようにすると出てくる型変数(type variable)の[a], [b], ...というのが26個以上ある場合は枯渇しないんだろうか(ものすごくどうでも良いことなのですが、なんだかとても気になったのです)、という素朴な疑問に遭遇したので、角谷さんと一緒にちょっと調べたりしていました。

しかしよく考えると、この[a]とか[b]というのは、関数の型宣言時に人間がつけた記号をそのまま返しているだけのようなので、そんな心配はするまでも無かったようです。例えば;

foo :: [bar] -> [baz] -> [qux]

というような宣言をされていれば、ghci:tをしたときにはそのまま出てくるだけなんですね。

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

posted by Png genki on Tue 6 Jun 2006 at 22:18

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

RailTies(RailsのCore)への PATCH5003が採用されました。

ちょっと嬉しいです。

これによって、./script/generate pluginuninstall.rb が生成されるので、その中にプラグインのUninstallコードを書けるようになります。

例えば、install.rbでCSSとかJavaScriptとか画像ファイルをpublic/以下にコピーするプラグインなどで、./script/plugin remove時にそれらを取り除くようにする事ができます。

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

posted by Png genki on Sun 4 Jun 2006 at 15:11

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

CentOSにEthnaを導入する手順をメモしておきます。

まず、CentOSにPHP5.1.4を導入します。 RPMを使う場合は「武蔵流プログラマへの道 - CentOSでPHP5のRPMを作ったよ。」が参考になりそうです。ソースから導入する場合は、僕が以前書いた記事も多少は参考になるかも。

PHPの導入が完了したら、こちらを参考に下記を実行します。

# pear install http://ethna.jp/pear/Ethna-2.1.0-preview1.tgz

次に、include_pathの通ったディレクトリに/usr/share/pear/Ethnaを移動します。

# cp -R /usr/share/pear/Ethna /usr/local/lib/php/Ethna

それから、いくつか依存ライブラリがあるので、無い場合は導入しましょう。

# pear install PEAR/DB
# pear channel-discover pearified.com
# pear install pearified/Smarty

これで完了です。非常に簡単ですね。

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

posted by Png genki on Thu 1 Jun 2006 at 18:09