Ruby
SQL logic error or missing database October 27, 2007 23:45
- Permalink
- Comments (2317)
- Trackbacks (0)
Ruby, SQLite, ActiveRecord
むう。ActiveRecordでSQLite3使ってみてるんだけど、スレッドの数2つ以上にして読み書きしてると SQL logic error or missing databaseてのが出るよ。 書き込みが集中してるときに出てるみたい。スレッドセーフじゃないのかな……。
あとtimeout指定してるのにたまにSQLite3::BusyException飛んでくるし。 まったく! SQLiteはまったく!
一応バージョン書いておくか……。最新の3.5じゃないんだねubuntuタン。
% sqlite3 --version 3.4.2
そういえばRailsのconfig/database.ymlでtimeout書けるのをソース見て知ったよ。
development:
adapter: sqlite3
dbfile: db/development.db
timeout: 10000
でもググると常識ぽい。
普通に使うときはこう。
ActiveRecord::Base.establish_connection(
:adapter => "sqlite3",
:dbfile => "foo.db",
:timeout => 10000
)
URI#+がかしこい October 22, 2007 23:50
- Permalink
- Comments (2188)
- Trackbacks (0)
Ruby
ただ単純に連結するだけかと思ってたら違った。
uri = URI.parse('http://example.com/foo/bar.html')
puts uri + 'hoge.html' #=> http://example.com/foo/hoge.html
puts uri + './hoge.html' #=> http://example.com/foo/hoge.html
puts uri + '/hoge.html' #=> http://example.com/hoge.html
puts uri + '../hoge.html' #=> http://example.com/hoge.html
puts uri + '..' #=> http://example.com/
puts uri + '.' #=> http://example.com/foo/
何も考えずに+したい勢い。 余計なコードがオレは何もしてないのにどんどん消えていく。 これはいよいよゆとりだと思うよ。
NilClass#method_missing #=> nil July 02, 2007 16:36
- Permalink
- Comments (381)
- Trackbacks (0)
Ruby
思いつき。
if a and a.b ... end
これ↑くらいならまだいいけど、nilかどうかチェックして次、みたいなの書くのが めんどくさくなってきたよ。代入があると特にそう思う。こんなのとか……。
if (neler = NiChanneler.find_by_name(user_name)) and neler.vipper? ... end
あ、ActiveRecordな例なので補足しておくと、
find_by_name_and_vipperとは書けない(DBにvipper属性がない)ケースってことで。
次のようにしてみる。
class NilClass
def method_missing(*args)
nil
end
end
これでnilにvipper?って聞くと「は?(= nil)」と返してくるからこう書ける。
if NiChanneler.find_by_name(user_name).vipper? ... end
ちょっと気持ち悪い。
けど、nilがNullObjectがわりになってると思えばまあわからなくもない。
ただRuby的にはダメなんだろうなぁ。基本的なクラスの中にこういう例外なやつがいるのは。
そろそろRuby会議について(ry June 17, 2007 23:49
- Permalink
- Comments (318)
- Trackbacks (0)
Ruby
この1週間、熱のこもったRuby会議のレポをいくつか目にしたので、 ここは内容のことよりもオレの個人的なレポをこっそり書いておこう。
- 初日の朝に大雨に降られてずぶ濡れのまま東京入り。半日ずっと下半身が冷え込んでいた
- 感動するには英語がわからなすぎたので、涙までは出なかった。隣に座ってた人がすごくわかってそうだった。くやしいっ! くやしすぎる!
- 2日間体力がもたなかった。少し寝ちゃいました。つまみ出されなくてよかった……
- Ruby会議関連の出費がその後の生活を圧迫中
ネガティブw 大きな声じゃ言えないぜ。
まあ行ってよかったのは間違いなくて、 いろんなところで働くRubyが見れたのがとても刺激になったな、と。 Railsだけじゃ狭いな、と。 みんなすげーな、と。 あと、世界は一人だけでは広がっていかないな、と。
これからどうなっていくかなRuby。あとオレ。
外部キー制約使ったときのTest::Unit::TestCase.fixtures June 06, 2007 21:26
- Permalink
- Comments (2272)
- Trackbacks (0)
Ruby, Rails
MySQL……というかデータベースをいまいち使えてないんで 最近やっと外部キー制約を使ったオレなんだけど、 わかっておかないとあとでまたはまりそうなのでメモ。 言い回しがおかしいかも。
laboratoriesテーブルとstudentsがあったとして、 studentsが外部キーとしてlaboratoriesの属性に依存している場合、 まず次のようなことになる。
- studentsテーブルにデータをinsertするには、外部キーで参照するlaboratoriesのデータが存在しないといけない
- laboratoriesのデータをdeleteするには、それを参照しているstudentsがあってはいけない
なので、ActiveRecordを使ったテストでfixtureを使うときには、
class FooTest < Test::Unit::TestCase fixtures :laboratories, :students ...
と書いて、データベースにlaboratories, studentsの順で追加しないといけない。 これは1による制約。
次にBarTestというテストを書くとして、そこではlaboratoriesのfixtureしか使わないとすると
class BarTest < Test::Unit::TestCase fixtures :laboratories ...
と書きそうなものだけれど、これは場合によってはfixtureのセットアップの段階でエラーになる。
というのも、fixtureをデータベースに追加する前に、BarTest.fixturesに渡された
テーブルのデータを削除する、つまり
DELETE FROM laboratories;
が行われているからで、この時もしデータベースのstudentsテーブルにデータが残っていた場合に 2の制約によりこのクエリが失敗するから。 例えばこの前でFooTestを実行していたりすると、 データベースにはstudentsのfixtureのデータが残っているのでそういうことになるぽい。
なのでstudentsのfixtureを使わないBarTestにおいても
class BarTest < Test::Unit::TestCase fixtures :laboratories, :students ...
と書く。すると
DELETE FROM students; DELETE FROM laboratories;
となって、正常にdeleteできる。
うーん、めんどくさい。
しかしデータベースの件にしろその他技術的な件にしろ、経験値が少な過ぎて凹む。
Rubyクックブック May 19, 2007 18:37
- Permalink
- Comments (322)
- Trackbacks (0)
Ruby, book
読んだ。
こういうときはこれ、てのが簡単に説明されてて良いと思う。 とっかかりを与えてくれるというか。できることがひろがりんぐ。
オライリー・ジャパン (2007/04/27)
売り上げランキング: 30473
さて、On Lispに戻るか……。
Rails以外でRailsのmigrationを使う April 23, 2007 23:15
- Permalink
- Comments (2308)
- Trackbacks (0)
Ruby
Rails以外でDBのテーブル作るときに、 Railsのmigrationでないと我慢できない患者さんはいますか。
(;´Д`)ノ
メモっとく。
% rake migrate % rake migrate VERSION=0
とかしたいので、Rakefileを作る。
# Rakefile
require "rubygems"
require "active_record"
ActiveRecord::Base.establish_connection(...省略...)
# セットしてないとnil.infoで落ちるから注意
require 'logger'
ActiveRecord::Base.logger = Logger.new(STDOUT)
task :migrate do
ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
end
db/migrateと指定しているのは、マイグレーションファイル(001_xxx.rb)のあるディレクトリ。 Rakefileからの相対パスだ。 ここにRailsと同じようにファイル名つけて同じように書いて放りこんでおけばokみたい。
こうしてSQLがなかなか身につかないオレ……。
読んだ April 09, 2007 14:56
毎日コミュニケーションズ (2007/03)
売り上げランキング: 985
るびまで読んでたけど、また読むと新しい発見が。
オーム社 (2005/12)
売り上げランキング: 83715
ストラテジー・レターが一番面白かった。
日本実業出版社 (2001/10)
売り上げランキング: 137425
Bookoffでみつけた本。CORBAとかCOMとか。概要ばっかだけど、知識の整理のためにと思ってパラパラめくった。
ActiveRecordを単体で利用する時にテストでfixtureを使うには March 11, 2007 23:42
- Permalink
- Comments (2253)
- Trackbacks (0)
Ruby, ActiveRecord
ActiveRecordを単体で使うときってのは、
モデル自体はrequire "active_record"でいいわけだけど
テストでfixture使おうと思ったらどうなるんだろうと思ってちょっと調べたのでメモ。
絶対忘れるからね!
ActiveRecord::Base.establish_connectionは今まで
ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:host => "localhost",
:username => "myuser",
:password => "mypass",
:database => "somedatabase"
)
みたいにオレはやってたんだけど、これじゃfixture使うにはダメみたい。
こうする。
ActiveRecord::Base.configurations = YAML.load_file(File.dirname(__FILE__) + "/database.yml") ActiveRecord::Base.establish_connection
ここのdatabase.ymlはRailsのと同じ。まあdevelopment/test/productionでなくてもいいけど。
どれを使うかはRAILS_ENVで切替える
(RAILS_ENVをdatabase.ymlから読んだハッシュのキーにするわけですな)。
だからRAILS_ENVはestablish_connectionする前にセットしておかないといけない。
忘れるとActiveRecord::AdapterNotSpecified例外が投げられる。
これで準備が整ったので、テストでfixturesを使いたいなら
いつものに加えてrequire "active_record/fixtures"でおk。
1 $:.unshift File.dirname(__FILE__) + "/../prog" 2 require "rubygems" 3 require "test/unit" 4 require "active_record" 5 require "active_record/fixtures" 6 7 RAILS_ENV = "test" 8 require "connection" 9 10 require "morph" 11 12 class MorphTest < Test::Unit::TestCase 13 self.fixture_path = File.dirname(__FILE__) 14 self.use_instantiated_fixtures = true 15 16 fixtures :morphs 17 18 def test_load_fixtures 19 assert @morph1 20 assert_equal "aa", @morph1.pos1 21 end 22 end
まだこれしか試してないけど、fixture読めてるんできっといいんだろう。
ちなみにrequire "connection"で上に書いた
ActiveRecord::Base.establish_connectionをしてる。
今後モデルが増えるようなら、1〜8行目と13, 14は別ファイルに追い出しちゃえばいいね。
あー結局なんも作ってないから今日も研究進んでないけどまあいいや。
そう言えばRailsのdatabase.ymlはERB経由するんだね。豆知識フエタ\(^o^)/
Rubyist臭漂うメールアドレス January 27, 2007 20:07
- Permalink
- Comments (327)
- Trackbacks (0)
Ruby, 駄反応
迷惑メイルが最近多いので、携帯のメイルアドレスをかえようと思うんだけど、あんまり面白いアドレスがうかばない。
さすがに、使える記号が、「. _ -」の3つしか使えないとなるとしんどいなぁ。括弧がつかえるとうれしいのになぁ。
@以下がインスタンス変数として見れそうだYO
- pp_@katamayu.net
- ruby_-e_puts_@katamayu.net
- proc_do_lal_a.to_yaml_end.call_@katamayu.net (takkan_mのからインスパイア)
- Mail.find_or_create_by_name_@katamayu.net
- link_to_yazu_@katamayu.net
l(エル)を|(パイプ)に見立てるのには感心した。 しかしオレのRubyのボキャブラリーしょべぇw
メールアドレスに使える文字によると、 本来はもうちょっといろんな記号が使えるみたいだな。=~とか{}とかsort!とかblank?とか$_とか、 もしかしてなんでもありか! あーでもSchemeは書けない……。(cons (quote ´・ω・`) '())ショボーン



