この日記にはツッコミを入れられます。 ツッコミを入れたい日付をクリックすると、フォームが現れます。
xreaでtDiaryを使う方法はxrea.com で tDiary を使う方法やインストールメモやXREA + tDiary + Namazuをどうぞ。
いろいろカスタマイズしまくっていた状態の Ubuntu から、ある程度クリーンな状態に戻したいと思って、 jaunty (9.04) から hardy (8.04LTS) に戻してみた。
デスクトップ版のインストーラだと余計なことをされそうなので、 netboot でのインストーラを使ってみた。
最近 IRC でタイトルを取得するボットを作っていて、いろいろなものが見つかっておもしろい。
などなど。
Rails を 2.1.2 から 2.3.2 にあげて active_record_store を使うように変更したら、ログインできなくなっていたので調べた。
ログイン操作前後でデータベースの状態を調べてみると、ログイン成功の情報が古いセッション ID の方に入っていて、新しいセッション ID の方は新規セッションになってしまっていた。
config/initializers/session_store.rb で get_session, set_session, find_session などを再定義してどこで呼ばれてるのか調べたりしていったところ、
という流れで
ということになっていた。
edge rails を確認してみるとすでに修正されていたので、以下のようなモンキーパッチで対処することにした。 get_session_model メソッドの呼び出しになっているところと get_session_model メソッドの定義が 2.3.2 からの変更部分。
# avoid Rails 2.3.2 sessions problem of active record
require "active_record/session_store"
module ActiveRecord #:nodoc:
class SessionStore #:nodoc:
private
def set_session(env, sid, session_data)
Base.silence do
record = get_session_model(env, sid)
record.data = session_data
return false unless record.save
session_data = record.data
if session_data && session_data.respond_to?(:each_value)
session_data.each_value do |obj|
obj.clear_association_cache if obj.respond_to?(:clear_association_cache)
end
end
end
return true
end
def get_session_model(env, sid)
if env[ENV_SESSION_OPTIONS_KEY][:id].nil?
env[SESSION_RECORD_KEY] = find_session(sid)
else
env[SESSION_RECORD_KEY] ||= find_session(sid)
end
end
end
end
関連: https://rails.lighthouseapp.com/projects/8994/tickets/2368-rails-232-sessions-problem
ruby-block.el 0.0.7 で以下のように defined? があると下の end の対応する位置が def ではなく if の行になってしまって不便に思っていたので調べてみた。
def hoge if defined?(hoge) end end
defined? をみているところはなさそうだったので、 font-lock-keyword-face をみているところをどうにかすればいいかと思って探してみると、 elsif を特別扱いしているのを見つけたので、そこを ruby-block-keyword-list を使うようにしてみたところ、上記の場合にちゃんと def の行になることが確認できた。
--- ruby-block.el~ 2009-07-08 21:04:33.000000000 +0900
+++ ruby-block.el 2009-07-08 21:04:16.000000000 +0900
@@ -205,7 +205,7 @@
string (current-word))
(setq point -1 face "" string "" check nil))
(when (and (eq face 'font-lock-keyword-face)
- (not (string= string "elsif"))
+ (member string ruby-block-keyword-list)
;; case: STMT if(or unless, while, untill) EXPR
(if (member string '("if" "unless" "while" "until"))
(let ((col (- point (ruby-block-get-line-start-pos))))
朝の新幹線で東京へ移動して、会場までの道のり動画 しか確認していなかったので、神保町駅から会場に向かった。
12:30よりちょっと早めについたけど入れた。 今回はスピーカーということで受付で名前を言っただけだったので、なりすましが簡単にできてしまいそうに思えた。
一橋記念講堂の方で、toRuby は途中で自由に抜けても OK というアナウンスがあったので、オープニングまでの間、企画部屋の toRuby をちょっと見学に行っていた。
Opening の後、英語だから toRuby の方に戻ればいいかと思っていたら、git のことについてはある程度知っていたからか、思っていたよりも意外と聞き取れてしまったので、そのまま最後まで聞いてしまった。
休憩の後は、特別会議室(1F) で gotoken さんの話と、前日IRC で Random が追加されたことの影響を受けたということを言っていた mrkn さんの話を聞いた。 席が足りていなかったので、gotoken さんの話の途中でスタッフが椅子を持ってきて席を増やしてくれていた。 後ろの方にいたので、声がマイクにあまり入っていなかった mrkn さんの話は聞こえにくかった。 BDD,ZDD の話も最初の方を聞いていたけど、休憩とメールチェックなどがしたかったので、途中で抜けた。
次は Rack の話も非常に気にはなっていたけど、笹田さんの話を優先して、また特別会議室(1F) にいった。
LT も見て、懇親会に。 いつものように疲れて体調が悪くなっていたので、既に知っている人と挨拶とかがメインだった。 日本Rubyのキーサインパーティー2009にも参加したけど、後の署名などをどうすればいいのかがいまいちよくわかっていない。 全員に色紙を持たされてサインを集めるというのもあって、基本的には求められたらこっちも書いてもらうという作戦にしてみたけど、あんまり集まりそうになかったので、一部の人にはこちらからサインして貰いにいってみた。
夜は早めに寝た。
企画部屋についてはるりまは二日目だと勘違いしてしまっていて、参加できなかった。すいません。
他の人と一緒の宿だったおかげで寝坊することなく、ちゃんと朝からいけた。
朝は一橋記念講堂(2F)にいた。 るりまはもっと手伝ってくれる人が増えるといいなあ。 るびまはそろそろなかださんに optparse の記事を書いてほしいと思っていたのを思い出したので、後で直接なかださんに言ってみた。
コミュニティアピールはコントっぽいのがおもしろかった。 途中まつもとさんが遅刻などの情報を twitter 経由というか friendfeed 経由で知った。
まつもとさんの話をきいて、stgit が(また)気になったけど、git のブランチを使うのと比べてどういう利点があるのか知りたいと思った。 一日目の github の人が dis っていた Mercurial の MQ 拡張のように覚えることが増えるだけであまり変わらないのなら必要ないかもしれない。
LT。 BigDecimal は非互換らしいと聞いて、使おうと思ったこともなかったので、 Decimal には期待したいと思った。そもそも必要なことがなさそうなので、どっちにしても使わない気もするけど。 途中、そろそろ本を買おうと思って、LT の途中で行ってみたが、ジュンク堂の中の人がやる気がなさそうだったので、また人が多いときに出直すことにした。 初心者向けのグラフィックライブラリはいくつか作る人がいるけど、GUIライブラリと同じで大流行するものがなかなか出てこない気がする。 Debian の CDN は jp だけかと思っていたけど、なんかそうじゃなさそうな感じの話だった。 ActiveLdap は最近使いはじめようとしていて、バックエンドが Ruby/LDAP とか Net::LDAP とか複数あって、どれがおすすめなのか教えて欲しいと思った。
休憩の後は特別会議室(1F)。 どれもおもしろかった。 concov は chkbuild で動かすだけでいいのなら、データ提供に協力したいと思ったけど、この後 Beer bust や翌日も含めて mame さんに会うことができなかった。
Beer bust は懇親会のときよりも知り合い同士が固まっていて、他の人の話の輪に入り辛く感じたので、なんかあまり人と話ができずに終わった。 RejectKaigi はなんだかよくわからないけど、RejectKaigi っぽい感じで良かった。
夜にプレゼンの仕上げをしていて眠かったので、朝はできるだけ寝ていた。
朝はスピーカーなので当然、中会議場(2F)にいた。
昨日の mput さんのをみて akr さんや arton さんの発表をききながら、rabbirc を使おうとがんばってみたが、「rabbit RubyKaigi2009.rd.txt.utf8 --druby-uri=druby://localhost:10101 --public-level」で起動して、別途 irb から「@rabbit.append_comment("test")」のように送ってみてもうまくいかなかったのであきらめた。
画面は「xrandr --output VGA --auto」としたら LVDS の 1400x1050 のうち、左上の方だけプロジェクターに出てしまって、rabbit を最大化すると 1400x1050 の方に最大化されてしまってプロジェクターの方では右や下が切れしまうので、諦めて window のまま大きくした。
亀が速いのは全然気づいていなかった。この日記を書いていて思い出したので、原因を調べて報告しておいた。
自分ではまったネタは最初の2つぐらいしかなくて、直前までかなり困っていたけど、発表に応募したのが採用されてから、RubyKaigiまでの間に何か使えそうなネタはないかとブログなどから探していたのが後半使えて、質問などもいくつか出てくるようなものになって非常にほっとした。
早めに終わって、大量に余った時間で akr さんの話を聞けたのは良かった。
午後の最初は特別会議室(1F)で tDiary の話などをきいた。 その後は一橋記念講堂(2F)の話をずっときいていた。
http://www.n-z.jp/presen/RubyKaigi2009/ においた。 PDF の方は下の方が切れているので後で更新するかも。
できるならRuby/LDAP、(拡張ライブラリだからインストールが大変とかで)面倒ならNet::LDAPがおすすめ ということらしいので、以前 gem で入れたはずなのに使えなくてあきらめた Ruby/LDAP についてもうちょっと調べてみた。
activeldap-1.1.0/lib/active_ldap/connection.rb の中で
def guess_available_adapter
if Object.respond_to?(:java)
"jndi"
else
ldap_ldif_path = $LOAD_PATH.find do |path|
File.exist?(File.join(path, "ldap", "ldif.rb"))
end
if ldap_ldif_path
"ldap"
else
"net-ldap"
end
end
end
ということをしていて、有効にしていない gem の lib は $LOAD_PATH に入っていないからだとわかったので、ActiveLdap で接続される部分 (User.find とか) より前で「gem "ruby-ldap"」としてみると Ruby/LDAP が使われるようになった。
上の「gem "ruby-ldap"」という方法は ActiveSambaLdap の asl-なんとかというコマンドには使えないので困った。
activesambaldap-0.0.7/rails_generators/scaffold_active_samba_ldap/templates/ の中にあるファイルが html.erb ではなく rhtml になっているのも気になった。
もう一点、ActiveSambaLdap の挙動を調べていて、下のような例外にはまった。
% ruby -rubygems -e 'require "active_samba_ldap";p ActiveSambaLdap::Base.method(:setup_connection)'
/home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/connection.rb:118:in `retrieve_connection': ActiveLdap::ConnectionNotSetup (ActiveLdap::ConnectionNotSetup)
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/connection.rb:71:in `connection'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/connection.rb:165:in `schema'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/object_class.rb:10:in `classes'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/object_class.rb:9:in `collect'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/object_class.rb:9:in `classes'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/base.rb:479:in `inspect'
from -e:1:in `p'
from -e:1
% ruby -rubygems -e 'require "active_samba_ldap";p ActiveSambaLdap::Base'
/home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/connection.rb:118:in `retrieve_connection': ActiveLdap::ConnectionNotSetup (ActiveLdap::ConnectionNotSetup)
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/connection.rb:71:in `connection'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/connection.rb:165:in `schema'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/object_class.rb:10:in `classes'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/object_class.rb:9:in `collect'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/object_class.rb:9:in `classes'
from /home/kazu/.gem/ruby/1.8/gems/activeldap-1.1.0/lib/active_ldap/base.rb:479:in `inspect'
from -e:1:in `p'
from -e:1
%
クラスが inspect 出来ないから Method オブジェクトも inspect 出来なくなってしまうと言う罠。
狭い画面をできるだけ有効に使いたいのに、 LXDE の lxpanel は自動で隠す設定にできないので、 devilspie で最背面にするようにしてみた。
LXDE だと自動設定の設定がどこにあるのかわからなかったので、 http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html の desktop ファイルを直接作成してログイン時に自動起動するようにした。
% cat ~/.devilspie/lxpanel.ds (if (is (window_class) "lxpanel") (below)) % cat ~/.config/autostart/devilspie.desktop [Desktop Entry] Type=Application Encoding=UTF-8 Version=1.0 Name=devilspie Exec=/usr/bin/devilspie %
遅くなってしまったけど、サインしてキーサーバに送って、キーサーバに送ったという情報をメールで送った。
今回実行したキーサインの手順は以下の通り。
昔の udev の rules は条件も設定も「=」で書いていてわかりにくかったが、最近の udev (たぶん udev 098 以降) では条件が「==」と「!=」で、設定が「=」と「+=」と「:=」のようにはっきりわかれているように見える。(詳細は udev(7) などを参照)
BUS="usb" などとかいてあるのが古い書き方のようで、USBRH driver for Linuxの 0.0.7 に入っている util/10usbrh.rules が古い書き方になっていて、インストールされてしまうとちゃんと使われなくて困る。
IRC で事前にささださんに OK をもらっていたので、いいタイミングと言うことで肉の日リリースでnadoka-0.7.1 をリリースしてみた。
RubyForge の自分が管理者になっているプロジェクトで「ファイル」、「Admin」あたりからファイルをリリースした。 今は画面が変わってしまったけど最初はいきなり「quick-release a file」というリンクの先と同じ画面だった気がする。
「quick-release a file」相当画面で以下のような感じで埋めていった。
そのほか、以下の手順でリリース前にあらかじめ preview リリースとしてアーカイブを作って IRC でアナウンス。誰も試していなかったかもしれない。
ファイルリリース後。
IRC での話題からいくつか。
[ruby-dev:38831] Re: [Bug #1787] URI ライブラリの正規表現パターン の「一般に、\d が [0-9] ではなくなった事態にどう対処するのが正しいでしょうか。」という話。
ML では話が続いていなかったので、IRC で話題を振ってみたら「\dのままにすべきか[0-9]に置き換えるべきか、個別具体的に検討」と言われたので、1とかにマッチしたくなければ\wの代わりに[A-Za-z0-9_]を使っていたのと同じように\dの代わりに[0-9]を使うことにする予定。
http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt の NEL とは何かという話。 http://hisashim.livejournal.com/134298.html 参照。
さらにこの記事から文字クラスの差集合の話。鬼車なら RE.ja.txt に
例. [a-w&&[^c-g]z] ==> ([a-w] and ([^c-g] or z)) ==> [abh-w]
と書いているように「A-Z&&[^P-R]]」で出来る。
文字クラスの中で文字を重ねる話から Ruby 1.9 - Feature #1831: Suggestion: warn on repeated character in character class - Ruby Issue Tracking System の話に。 「/[:lower:]/」のような間違いは気づきにくいので警告が出るとうれしい。 ちなみに「[:lower:]」は
/[[:lower:]]/
のように文字クラスの中で使う。
✑ http://d.hatena.ne.jp/ku-ma-me/20090729 を見て concov を VMware の中の Debian sid で試してみた。
% cd /home
% sudo mkdir concov
% sudo chown $(id -u):$(id -g) concov
% cd concov
% git cvsimport -v -d :pserver:anonymous@cvs.m17n.org:/cvs/ruby -C chkbuild chkbuild
(しばらく時間がかかる)
% wget -N http://dame.dyndns.org/misc/misc/chkbuild-coverage-date.patch
(略)
% cd chkbuild
% git checkout -b concov
Switched to a new branch 'concov'
% patch -p0 -i ../chkbuild-coverage-date.patch
patching file rbcoverage.rb
patching file chkbuild/build.rb
patching file chkbuild/main.rb
patching file chkbuild/ruby.rb
patching file chkbuild/svn.rb
patching file sample/build-ruby-coverage
% git commit -a -m 'apply http://dame.dyndns.org/misc/misc/chkbuild-coverage-date.patch'
[concov 297f680] apply http://dame.dyndns.org/misc/misc/chkbuild-coverage-date.patch 4 files changed, 12 insertions(+), 3 deletions(-)
% sudo adduser --disabled-login --no-create-home --shell /bin/false chkbuild
Adding user `chkbuild' ...
Adding new group `chkbuild' (1001) ...
Adding new user `chkbuild' (1001) with group `chkbuild' ...
Not creating home directory `/home/chkbuild'.
Changing the user information for chkbuild
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
% sudo adduser $(id -un) chkbuild
(略)
% cd /home
% sudo mkdir chkbuild
% sudo chown $(id -un):chkbuild chkbuild
% sudo chmod 2750 chkbuild
% cd chkbuild
% mkdir build public_html
% chgrp chkbuild build public_html
% chmod 2775 build public_html
drwxrwsr-x ではなく drwxrwxr-x になってしまったので、一旦抜けて入り直して補助グループに chkbuild グループ権限がある状態になってから再実行。 chmod の前の chgrp が出来ないと思っていたから、ちょっと意外だった。
% chmod 2775 build public_html % cd /home/concov/chkbuild % ln -s /home/chkbuild tmp
concov で使うものをインストール。
% gem-1.9.1 install --no-rdoc --no-ri ramaze sequel amalgalite thin ============================================================ Thank you for installing Ramaze! You can now do create a new project: # ramaze create yourproject ============================================================ Successfully installed rack-1.0.0 Successfully installed innate-2009.07 Successfully installed ramaze-2009.07 Successfully installed sequel-3.2.0 Building native extensions. This could take a while... Successfully installed arrayfields-4.7.4 Successfully installed amalgalite-0.10.0 Building native extensions. This could take a while... Building native extensions. This could take a while... Successfully installed eventmachine-0.12.8 Successfully installed daemons-1.0.10 Successfully installed thin-1.2.2 9 gems installed %
concov のインストール。
% cd /home/concov % git clone 'git://github.com/mame/concov.git' Initialized empty Git repository in /home/concov/concov/.git/ remote: Counting objects: 121, done. remote: Compressing objects: 100% (89/89), done. remote: Total 121 (delta 31), reused 109 (delta 26) Receiving objects: 100% (121/121), 148.41 KiB | 154 KiB/s, done. Resolving deltas: 100% (31/31), done. % cd concov % git checkout -b local Switched to a new branch 'local' % vi bin/concov % vi concov.conf % mkdir /home/chkbuild/concov-data % chmod 2775 /home/chkbuild/concov-data % sudo -u chkbuild bin/concov init % ramaze start
http://localhost:7000/ で「concov error: no data found; please register first」を確認。(都合により本当は localhost じゃなかったけど) thin は必要なかった。
% git commit -a -m "setup shebang"
[local 0e36d8f] setup shebang
1 files changed, 1 insertions(+), 1 deletions(-)
% vi update.rb
% chmod +x update.rb
% git add update.rb
% git commit -m "add update.rb" update.rb
[local 5608b10] add update.rb
1 files changed, 30 insertions(+), 0 deletions(-)
create mode 100755 update.rb
% time sudo -u chkbuild /home/concov/concov/update.rb
/home/concov/chkbuild/start-build:5:in `require': no such file to load -- chkbuild (LoadError)
from /home/concov/chkbuild/start-build:5
%
カレントディレクトリが /home/concov/chkbuild ではなかったのが原因だった。 git add し忘れに気づいたので、ついでに git commit --amend した。 「load "sample/build-ruby-coverage"」にしないといけないという話も聞いたので変更。
% cd /home/concov/chkbuild
% git add rbcoverage.rb sample/build-ruby-coverage
% git commit --amend
apply chkbuild-coverage-date.patch
http://dame.dyndns.org/misc/misc/chkbuild-coverage-date.patch
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch concov
# Changes to be committed:
# (use "git reset HEAD^1 <file>..." to unstage)
#
# modified: chkbuild/build.rb
# modified: chkbuild/main.rb
# modified: chkbuild/ruby.rb
# modified: chkbuild/svn.rb
# new file: rbcoverage.rb
# new file: sample/build-ruby-coverage
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# tmp
"COMMIT_EDITMSG" [変換済] 20L, 620C 書込み
[concov 7401884] apply chkbuild-coverage-date.patch
6 files changed, 83 insertions(+), 3 deletions(-)
create mode 100644 rbcoverage.rb
create mode 100644 sample/build-ruby-coverage
% git commit -av
use build-ruby-coverage
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch concov
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: start-build
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# tmp
diff --git a/start-build b/start-build
index 7cb2d10..e716822 100755
--- a/start-build
+++ b/start-build
@@ -2,11 +2,13 @@
#ENV['PATH'] = "/usr/local/bin:#{ENV['PATH']}"
+Dir.chdir(File.dirname(__FILE__))
+
require 'chkbuild'
#ChkBuild.rsync_ssh_upload_target("akr@boron.rubyist.net::upload")
-load "sample/build-ruby"
+load "sample/build-ruby-coverage"
#load "sample/build-gcc-ruby"
"COMMIT_EDITMSG" [変換済] 32L, 777C 書込み
[concov 64a2eaf] use build-ruby-coverage
1 files changed, 3 insertions(+), 1 deletions(-)
%
再実行。
% time sudo -u chkbuild /home/concov/concov/update.rb (略) 1293.62s user 191.08s system 50% cpu 49:11.04 total %
build log (chkbuild) のリンクをたどったときに invalid view format と出ていたので IRC で対処方法を教えてもらって
% ln -s /home/chkbuild/public_html/ruby-trunk-coverage public/chkbuild
とした。
✑ kou [できるならRuby/LDAP、(拡張ライブラリだからインストールが大変とかで)面倒ならNet::LDAPがおすすめで..]