83's

Top > Tags > Ruby

Ruby

タイトル一覧を表示 | 本文を表示

SQL logic error or missing database October 27, 2007 23:45

むう。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

ただ単純に連結するだけかと思ってたら違った。

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

思いつき。

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

これでnilvipper?って聞くと「は?(= nil)」と返してくるからこう書ける。

if NiChanneler.find_by_name(user_name).vipper?
  ...
end

ちょっと気持ち悪い。 けど、nilがNullObjectがわりになってると思えばまあわからなくもない。 ただRuby的にはダメなんだろうなぁ。基本的なクラスの中にこういう例外なやつがいるのは。

そろそろRuby会議について(ry June 17, 2007 23:49

この1週間、熱のこもったRuby会議のレポをいくつか目にしたので、 ここは内容のことよりもオレの個人的なレポをこっそり書いておこう。

  • 初日の朝に大雨に降られてずぶ濡れのまま東京入り。半日ずっと下半身が冷え込んでいた
  • 感動するには英語がわからなすぎたので、涙までは出なかった。隣に座ってた人がすごくわかってそうだった。くやしいっ! くやしすぎる!
  • 2日間体力がもたなかった。少し寝ちゃいました。つまみ出されなくてよかった……
  • Ruby会議関連の出費がその後の生活を圧迫中

ネガティブw 大きな声じゃ言えないぜ。

まあ行ってよかったのは間違いなくて、 いろんなところで働くRubyが見れたのがとても刺激になったな、と。 Railsだけじゃ狭いな、と。 みんなすげーな、と。 あと、世界は一人だけでは広がっていかないな、と。

これからどうなっていくかなRuby。あとオレ。

外部キー制約使ったときのTest::Unit::TestCase.fixtures June 06, 2007 21:26

MySQL……というかデータベースをいまいち使えてないんで 最近やっと外部キー制約を使ったオレなんだけど、 わかっておかないとあとでまたはまりそうなのでメモ。 言い回しがおかしいかも。

laboratoriesテーブルとstudentsがあったとして、 studentsが外部キーとしてlaboratoriesの属性に依存している場合、 まず次のようなことになる。

  1. studentsテーブルにデータをinsertするには、外部キーで参照するlaboratoriesのデータが存在しないといけない
  2. 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

読んだ。

こういうときはこれ、てのが簡単に説明されてて良いと思う。 とっかかりを与えてくれるというか。できることがひろがりんぐ。

Rubyクックブック ―エキスパートのための応用レシピ集
Lucas Carlson Leonard Richardson 株式会社クイープ
オライリー・ジャパン (2007/04/27)
売り上げランキング: 30473

さて、On Lispに戻るか……。

Rails以外でRailsのmigrationを使う April 23, 2007 23:15

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

Rubyist Magazine出張版正しいRubyコードの―RubyistのRubyistによる、Rubyistとそうでない人のための
青木 峰郎
毎日コミュニケーションズ (2007/03)
売り上げランキング: 985

るびまで読んでたけど、また読むと新しい発見が。

Joel on Software
Joel on Software
posted with amazlet on 07.04.09
Joel Spolsky 青木 靖
オーム社 (2005/12)
売り上げランキング: 83715

ストラテジー・レターが一番面白かった。

図解でわかる分散オブジェクト技術のすべて―ネットワーク&システム構築
小泉 修
日本実業出版社 (2001/10)
売り上げランキング: 137425

Bookoffでみつけた本。CORBAとかCOMとか。概要ばっかだけど、知識の整理のためにと思ってパラパラめくった。

ActiveRecordを単体で利用する時にテストでfixtureを使うには March 11, 2007 23:42

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_ENVestablish_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

迷惑メイルが最近多いので、携帯のメイルアドレスをかえようと思うんだけど、あんまり面白いアドレスがうかばない。

さすがに、使える記号が、「. _ -」の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 ´・ω・`) '())ショボーン