リンクするaprのバージョンを0.9xから1.2xに

WebDAV(=Apache)でリポジトリにアクセスすると、500が返ってきてログにも何も残らないと言う現象に遭遇する。で、色々調べていくうちのSubversionとApacheのaprのバージョンの不整合が原因と言う事が分かった。 なお、Apache HTTP Server 2.0系で利用されて…

sudoのちょっとしたトラブル

root以外のユーザを指定してsudoを実行しようとすると、実行を許可されていません、みたいなエラーが出た。 $ sudo -u foo ls / Sorry, user hoge is not allowed to execute '/bin/ls /' as foo on host_name.色々調べていると、sudoersファイル内でユーザ…

mongrel_clusterは複数バージョンが混合していると古いバージョンが使われる

開発環境にmongrel_clusterの1.0.5を入れてソースを眺めていたら、cluster::statusと言う新しいコマンドが増えていたのだけれど、リストに出てこなかったので、0.2.1をアンインストールしたら出てきた。 この辺りはgem_pluginの仕様なんだと思うけど、仕組み…

全角スペース対応版strip

書いてみた。速度的にはまだまだ改善の余地があると思う。 class String def strip_with_full_size_space s = " \s\v" self =~ /^[#{s}]+([^#{s}]+)[#{s}]+$/ ? $1 : self end end ベンチマーク用のコード。 require 'benchmark' n = 50000 s1 = " 全半混在 …

irbの起動時はLoadErrorが発生しても無視されるが、その後のライブラリの読み込み等は行われない

.irbrcで require 'hogehoge' とやっても例外も警告も出なかったので、なんでだろうと思って調べてみた。 irbの起動処理はirb/init.rb内で行われる。このうち、irbrcを読み込んでいるのはIRB.run_configメソッドだと思われる。以下にコードを抜粋する。 def …

Subversionでhttp(s)のURLスキームを認識しない問題を解決する。

RetrospectivaのtrunkをGoogle Codeからcoしようとしたらエラーが出る。 $ svn co -q http://retrospectiva.googlecode.com/svn/trunk/ retrospectiva svn: 'http://retrospectiva.googlecode.com/svn/trunk' 用の URL スキームを認識できません色々調べてみ…

ActiveRecordから生のクエリを実行する

ActiveRecord::Base.connection.execute(sql) 返ってくるのは生のResultSetなので、アプリ側で解釈する必要がある。以下の例ではMySQLの場合。 rs = ActiveRecord::Base.connection.execute("show processlist") puts rs.class #=> Mysql::Result rs.each{|r…

MySQL/Rubyのバージョン確認方法

gemでインストールするMySQL/Rubyのバージョンは2.7と少々古いので、念の為に2.7.4にバージョンアップしておく。 require 'mysql' Mysql.const_get(:VERSION) => 20704 でバージョンをチェックする。 20704だと2.7.4になる。 今見てみたら1.9対応の2.8pre1が…

Rubyでの正規表現についての覚書

Rubyで正規表現オブジェクトを作る方法は以下の三通り。 /pattern/option %r{pattern}option Regexp.new('pattern', option) 通常扱うのは/pattern/option。所謂正規表現リテラルで、リテラル内には式展開を含める事ができる。 /hoge#{"foo"}/ # => /hogefoo…

csvからのインポート

こんな感じ。 LOAD DATA LOCAL INFILE "/home/data/sample.csv" REPLACE INTO TABLE csv FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'; 構文はMySQL公式のドキュメントが分かりやすい。 参考 MySQL :: MySQL 5.6 リファレンスマニ…

インストールモジュールを確認する

bin/httpd -M 2>&1 | sort actions_module (static) alias_module (static) asis_module (static) auth_basic_module (static) authn_default_module (static) authn_file_module (static) authz_default_module (static) authz_groupfile_module (static) a…

adv_attr_accessorの実装から感じるRailsの哲学

ActionMailerのソースを読んでいたら、 adv_attr_accessor :bcc と言うコードが合ったので、このadv_attr_accessorという謎のメソッドを調べてみた。 短かいコードだったので全文引用してしまう。 module ActionMailer module AdvAttrAccessor #:nodoc: def …

BackgrounDRbのWorkerオブジェクト削除タイミングについての悩み

BackgrounDRbのサンプルでよく見かけるのが以下のようなソース。 def start_background_task session[:KEY] = MiddleMan.new_worker(:class => :foo_worker, :args => "hoge") end #start_background_task.rhtmlから非同期で呼ばれるアクション def update_p…

Ctrl + Cで終了しないRubyプログラム

バッチ用のRubyプログラムをちょっと動かしてからCtrl + Cで終了させたものの、止まってくれなくて焦る。標準出力にガンガン出力されていく…。 kill -s 9 で強制的にKillするが、そもそもCtrl + Cで止まらないことが問題。 ちょっと考えてみたところ、原因は…

プレースホルダを遅延評価する

最近便利に使っているのがプレースホルダ(%s)を遅延評価させること。 要は動的な定数(?)を定義する事が出来る。 ソースを見た方が早いと思うのでさくっと。 SEARCH_URL = 'http://www.google.co.jp/search?q=%s' %w(ruby perl php).each{|word| puts SEAR…

Apache(mod_proxy_balancer) + mongrelで運用するときの注意点

Railsをproduction環境で運用していると、こんなエラーが頻発していることに気が付いた。 Processing ApplicationController#index (for ::1 at 2007-08-07 15:51:09) [GET] Session ID: 006a27e09f46dfe1bd6f6cc2258cfa8e Parameters: {} ActionController:…

MySQLリンク集

こつこつと貯めていたMySQLのリンク集を公開。 SBMでも良いんだけど、ある程度溜まってくるとページングで件数が区切られちゃって不便だし、こうやって並べることも出来ないから本気で情報収集したい場合は結局テキストでまとめちゃう…。 タグでエクスポート…

セッタが未定義もしくはprivateなインスタンス変数の内容をクラスの外部から取得する

追記 エントリ本文の内容は間違い。 instance_variable_getメソッドの引数にはシンボルだが、変数名のみではなく@を含む必要があった。 puts c.instance_variable_get(:write_only) rescue puts $!.message #=>`instance_variable_get': `write_only' is not…

正規表現オブジェクトの作り方と注意点

Rubyで正規表現オブジェクトを作る方法は以下の三通り。 /pattern/option %r{pattern}option Regexp.new('pattern', option) 一番利用頻度が高いのが/pattern/で、この場合patternには式展開を含める事ができる。 /hoge#{"foo"}/ # => /hogefoo/ ただし、opt…

AR#==

ActiveRecordの==はどう動くのか気になったので調べてみた。 例えばSNSで日記にユーザからコメントがついた場合、新着に表示する時にはまず日記を書いたユーザとコメントを書いたユーザが別かどうかを判定しなきゃいけない。 早速ソースを読む。 def ==(comp…

HTTP POST ≒ request.post?

例えば以下のようにlink_toメソッドを呼び出してリンクを作成すると、HTTP的にはPOST扱いとなる。 link_to("削除", {}, :confirm => "削除する?", :delete) HTTPリクエストは以下のように発行される。 POST / HTTP/1.1 (中略) _method=deleteで、このリクエ…

Developmentモードのログを日毎にローテートする

RubyのLoggerは簡易的ながらもローテーションする事ができるのでそれを使えば簡単にローテーションを実現できる。 config/environments/development.rbに以下を追記すると日毎にローテーションするようになる。 config.logger = Logger.new(config.log_path,…

ActiveSupportに年月表示用のメソッドを追加する方法

以下をenvironment.rbに追加する。 ActiveSupport::CoreExtensions::Time::Conversions.class_eval do def to_yymm strftime("%y/%m") end end MySQLの場合はDateTime型がRubyのTime型にマッピングされるからTime型を拡張している。 YYMM形式で表示したいシ…

date_selectヘルパーの注意点

date_selectヘルパーは引数で渡したインスタンス名とメソッド名から年月日の選択状態を自動的に判断してくれて便利なのだけれど、インスタンスがローカル変数だと値を読み取ってくれず、常に最新の日付になってしまうと言う問題がある。 date_select(object_…

ちょっと便利なObject#blank?メソッド

ActiveSupportの拡張。 Stringでnilもしくは空文字列を判断する制御文がシンプルになる。 #before if str && !(str.empty?) #after unless str.blank? 実装はこちらを。 http://dev.rubyonrails.org/browser/trunk/activesupport/lib/active_support/core_ex…

ActiveHeartはどのようにカラム名の日本語化を実現しているか

Base.set_field_namesメソッドでは定義したカラム名と日本語名の対照用ハッシュ(@field_names)を作成する。 そして、ActiveRecord::Base#human_attribute_name(column_name)と言うメソッドをaliasにより独自メソッドに置き換え、引数のカラム名が@field_name…

Railsではアクション内にConst変数を宣言することができない?

以下のようなコードをアクションに書いたらシンタックスエラーになってしまった。 Item = Struct.new("Item", :value, :name) case type when 'select' item.new(0, "選択して下さい") when 'search' item.new(0, "すべて") else item.new(0, "すべて") end …

ARのWhere句を構築してくれるEz-Where pluginの次期版が良さげ

ARではWhere句を構築するのに結構手間がかかるので、いくつかpluginが公開されている。 http://d.hatena.ne.jp/yukiwata/20070524/1179977530 とは言うものの、どれも機能的には貧弱に見えたのでこれだったら我慢して直で書いちゃおうかな、と思っていたらez…

IEでも動作を確認(RDoc をインクリメンタルサーチする greasemonkey スクリプト - 2nd life)

Trixieに突っ込んでIEでRDoc開いてみたら普通に動いた。素敵。 ただ、何故かは分からないけどIEだとARのRDocが開けない…。XMLパースエラーとか出ちゃう。 全文検索もあることだし、Railsに限ればHTMLHelp(Rails の htmlhelp - 2nd life)の方が個人的には便…

共同開発のコツ

やっていることもあればやっていないこともあり。 時間ができたら読み直して、吸収できるところは吸収していこう。 SBMだと後で読まない事に気づき始めた今日この頃。http://labs.unoh.net/2006/08/post_38.html http://labs.unoh.net/2006/08/trac_qatestin…