2009-04-17 (Fri)
■ テンポラリファイルを開いて hogefuga してリネームするようなコード 
こんなの書いたんですが。
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 はブロックにあてはまらないのでしょうか。ファイルシステムのお話に広がっちゃうんでしょうかね。難しい事は良く分からん。
2008-11-05 (Wed)
■ rails での has_and_belongs_to_many 
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 が使えないなんてイヤだーー!!
■ お久しぶりです 
とか何とか久しぶりに更新しましたこんにちは。いつの間にか LDR の購読者が倍くらいになってる気がするような。
2008-01-12 (Sat)
■ バグ? 
#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
なんでだろう。
rubikitch「+"fuga"」 ではなくて「 + "fuga"」 にしましょう。「+"fuga"」は"fuga"に単項+演算子が適用されています。
TaGaprint "hoge",n.to_s,"fuga"
ではどうでしょう.バグというより仕様ですね.
gabaありがとうございます。
例えば
"hoge" + (str.to_s) +("hoge")
は通りますけど
"hoge" + str.to_s +("hoge")
だとダメなんです。
これも同じ理由なんでしょうか?
Tagaたしかにすっきりしないですね.
単項+演算子の適用なら,+@メソッドがStringクラスにないので,
NoMethodError: undefined method `+@' for "fuga":String
のようなエラーがでそうなものですが.
gabaどうやらこれと同じっぽいです。
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
2007-11-25 (Sun)
■ rspec.vim 
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'
SeasonsLinux環境ではためしてませんでした・・・m( _ _ )m
合間で見てみますね。
Seasonsそういえば、Windows環境で、-cは、tempファイルにリダイレクトされなかったので、カットしました。
あと、Windows版のvimrunは、silentモードでもコマンドプロンプト画面が
でてくるので自作したものを使ってます。
SeasonsLinux用作っておきました。
gabaおお、ありがとうございます。
リダイレクト処理が問題だったんですね。
動くようになりました。
スクリプト、if has('win32') で win, linux 環境の振り分け出来るんで一個にまとめちゃうと良いかもしれません。
Seasonsそうですね。
今、vimrun書き直そうと思っているので、それとあわせてやっちゃいます。
Seasonsスクリプトをhasで切り替え&書き直したvimrun.exe付属でアップしておきました。
ブロックが終わったら自動でクローズされるってのは少し間違いで,
正確には,File.openにブロックを渡してあげたときだけ,よきにはからってくれます。