只今Ruby勉強中

プログラミングRuby―達人プログラマーガイド

うさぎさんと一緒にRubyの勉強をしているオレの記録。

間違ってる所とかいっぱいあると思いますけど、誰でもコメント出来るので気軽に教えて下さい。

普段は 鷹の島 って所で書いてます。

現在のハマリポイント - yield, succ?, Proc & 後で

2009-04-17 (Fri)

テンポラリファイルを開いて hogefuga してリネームするようなコード 18:26  テンポラリファイルを開いて hogefuga してリネームするようなコード - 只今Ruby勉強中 を含むブックマーク

こんなの書いたんですが。

name = "loveneweb.txt"

newfile = File.open(name + ".tmp", "w")
File.open(name).each do |line|
   newfile.puts line
end
newfile.close
File.rename(name + ".tmp", name)

Windows で動かなかった。

hoge.rb:8:in `rename': Permission denied - loveneweb.txt.tmp or loveneweb.txt (Errno::EACCES) from hoge.rb:8

ファイルをちゃんと閉じてないのが原因っぽい。ブロック終了時に close してみた。

name = "loveneweb.txt"

newfile = File.open(name + ".tmp", "w")
File.open(name).each do |line|
   newfile.puts line
end.close
newfile.close
File.rename(name + ".tmp", name)

動いた。けどなんかダサいよね…。ブロックを別にしてみた。

name = "loveneweb.txt"

newfile = File.open(name + ".tmp", "w")
File.open(name) do |f|
   f.each do |line|
      newfile.puts line
   end
end
newfile.close
File.rename(name + ".tmp", name)

動いた。

ブロックが終わったら自動でクローズされるって聞いていたのですが、最初の例、これは linux なんですが、ここの each do end はブロックにあてはまらないのでしょうか。ファイルシステムのお話に広がっちゃうんでしょうかね。難しい事は良く分からん。

wocotawocota2009/04/26 22:24こんにちわ。
ブロックが終わったら自動でクローズされるってのは少し間違いで,
正確には,File.openにブロックを渡してあげたときだけ,よきにはからってくれます。

トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20090417

2008-11-05 (Wed)

rails での has_and_belongs_to_many 19:33  rails での has_and_belongs_to_many - 只今Ruby勉強中 を含むブックマーク

SQLite なんですが、find が遅くてたまらん事になってしまった。素敵なやり方をご存知の方は、是非教えてもらえると嬉しいです。

User っていうモデルと Group っていうモデルがあって、has_and_belongs_to_many でつながってる状態。User 数は1万件、Group 数は60件。で、User の中から特定の Group に所属してる User の一覧を作りたいんですが…。

これは、数秒かかるけどまぁ許容範囲。

User.find(:all, :include => :groups, :conditions => [ 'groups.name = ?', 'ほげほげ' ], :limit => 10)

並び替えたり、count を取ろうとするともう無理。1分くらい返事が返ってこない。1分も待ってたらカップラーメンが出来ちゃうYO!

User.count(:include => :groups, :conditions => [ 'groups.name = ?', 'ほげほげ' ])
User.find(:all, :include => :groups, :conditions => [ 'groups.name = ?', 'ほげほげ' ], :limit => 10, :order => 'username')

絶望しながら MySQL で同じ事を試したら、こちらは即座に返事が返ってきた。ていうか、マジ早過ぎなんですけど。

大好きな SQLite が使えないなんてイヤだーー!!

お久しぶりです 19:39  お久しぶりです - 只今Ruby勉強中 を含むブックマーク

とか何とか久しぶりに更新しましたこんにちは。いつの間にか LDR の購読者が倍くらいになってる気がするような。

トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20081105

2008-02-09 (Sat)

Time 23:03  Time - 只今Ruby勉強中 を含むブックマーク

一桁繰り上がった瞬間を逃した…。

irb(main):031:0> Time.at(1200000000)
=> Fri Jan 11 06:20:00 +0900 2008

次は三年後。

irb(main):032:0> Time.at(1300000000)
=> Sun Mar 13 16:06:40 +0900 2011
トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20080209

2008-01-12 (Sat)

バグ? 23:05  バグ? - 只今Ruby勉強中 を含むブックマーク

#to_s しながら、後ろに+"とかくっつけるて書くとSyntax Errorになる。

irb(main):001:0> n = 123
=> 123
irb(main):002:0> puts "hoge" + n.to_s + "fuga"
hoge123fuga
=> nil
irb(main):003:0> puts "hoge" + n.to_s +"fuga"
SyntaxError: compile error
(irb):3: syntax error, unexpected tUPLUS, expecting $end
puts "hoge" + n.to_s +"fuga"
                      ^
        from (irb):3
        from :0

to_s しなければ平気

irb(main):004:0> str = "hehe"
=> "hehe"
irb(main):005:0> puts "hoge" + str +"fuga"
hogehehefuga
=> nil

to_s するとやっぱりなる。

irb(main):007:0> puts "hoge" + str.to_s +"fuga"
SyntaxError: compile error
(irb):7: syntax error, unexpected tUPLUS, expecting $end
puts "hoge" + str.to_s +"fuga"
                        ^
        from (irb):7
        from :0

なんでだろう。

rubikitchrubikitch2008/01/13 13:53「+"fuga"」 ではなくて「 + "fuga"」 にしましょう。「+"fuga"」は"fuga"に単項+演算子が適用されています。

TaGaTaGa2008/01/14 01:34print "hoge",n.to_s,"fuga"
ではどうでしょう.バグというより仕様ですね.

gabagaba2008/01/14 16:42ありがとうございます。

例えば
"hoge" + (str.to_s) +("hoge")
は通りますけど
"hoge" + str.to_s +("hoge")
だとダメなんです。
これも同じ理由なんでしょうか?

TagaTaga2008/01/17 23:24たしかにすっきりしないですね.
単項+演算子の適用なら,+@メソッドがStringクラスにないので,
NoMethodError: undefined method `+@' for "fuga":String
のようなエラーがでそうなものですが.

gabagaba2008/01/22 23:41どうやらこれと同じっぽいです。
http://www.ruby-forum.com/topic/109823#541735

irb(main):001:0> 1 + 123.to_i +123
SyntaxError: compile error
(irb):1: syntax error, unexpected tINTEGER, expecting $end
from (irb):1
from :0
irb(main):002:0> 1 + 123 +123
=> 247

トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20080112

2007-11-25 (Sun)

rspec.vim 00:15  rspec.vim - 只今Ruby勉強中 を含むブックマーク

ruby いじるのちょっと久しぶり。

rspec.vim を作った方がいるので、試してみる。copen と連携とかしていて便利そう。

で、試してみたら、エラー(後述)が出た上にカレントディレクトリに「 -l 1 hoge_spec.rb」なんていう謎のファイルが出来てうまく実行出来ませんでした、ごめんなさい…。linux 環境だから何か違うのかな。ちょっと追ってる余裕がありません。

僕があの後に作ったやつは以下の奴でして、多分 b:rails_root を見てるんで rails.vim を使ってる事が前提になってるんですけど、もう忘れてしまいました。手元にテストに使えそうな rails 環境もなくて…ヤバい。

function! s:Rspec()
   if exists('b:rails_root')
      exe '!rake spec SPEC="'.expand('%:p').'" RSPECOPTS="-l '.line('.').' '.g:rails_rspec_opt.'"'
   else
      exe '!spec -l '.line('.').' '.g:rspec_opt.' %'
   endif
endfunction

if !exists('g:rspec_opt')
   let g:rspec_opt = '-fs -c'
end

if !exists('g:rails_rspec_opt')
   let g:rails_rspec_opt = g:rspec_opt
end

au BufRead,BufNewFile *_spec.rb command! Rspec call s:Rspec()

上で言ってたエラー

/var/lib/gems/1.8/gems/rspec-1.0.8/lib/spec/runner/behaviour_runner.rb:98:in `find_paths': File or directory not found: /tmp/v14656/2 (RuntimeError)
        from /var/lib/gems/1.8/gems/rspec-1.0.8/lib/spec/runner/behaviour_runner.rb:92:in `each'
        from /var/lib/gems/1.8/gems/rspec-1.0.8/lib/spec/runner/behaviour_runner.rb:92:in `find_paths'
        from /var/lib/gems/1.8/gems/rspec-1.0.8/lib/spec/runner/behaviour_runner.rb:47:in `prepare!'
        from /var/lib/gems/1.8/gems/rspec-1.0.8/lib/spec/runner/behaviour_runner.rb:19:in `run'
        from /var/lib/gems/1.8/gems/rspec-1.0.8/lib/spec/runner/command_line.rb:17:in `run'
        from /var/lib/gems/1.8/gems/rspec-1.0.8/bin/spec:3
        from /var/lib/gems/1.8/bin/spec:16:in `load'

SeasonsSeasons2007/11/26 01:46Linux環境ではためしてませんでした・・・m( _ _ )m
合間で見てみますね。

SeasonsSeasons2007/11/26 01:53そういえば、Windows環境で、-cは、tempファイルにリダイレクトされなかったので、カットしました。
あと、Windows版のvimrunは、silentモードでもコマンドプロンプト画面が
でてくるので自作したものを使ってます。

SeasonsSeasons2007/11/26 15:11Linux用作っておきました。

gabagaba2007/11/27 20:43おお、ありがとうございます。
リダイレクト処理が問題だったんですね。
動くようになりました。

スクリプト、if has('win32') で win, linux 環境の振り分け出来るんで一個にまとめちゃうと良いかもしれません。

SeasonsSeasons2007/11/28 01:06そうですね。
今、vimrun書き直そうと思っているので、それとあわせてやっちゃいます。

SeasonsSeasons2007/11/28 04:14スクリプトをhasで切り替え&書き直したvimrun.exe付属でアップしておきました。

トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20071125