1 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:21:25 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 ★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。 (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に完全対応していないためです。) 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。 関連スレやURLは>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
768 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 23:59:30 ] これではどう? a = 'abc def' data = [['(\w+)', '<\1>'], ['(> <)', '> < \1 > <']] data.each{|reg, rep| a.gsub!(/#{reg}/, rep)} a => "<abc> < > < > <def>"
769 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:09:09 ] >>768 なにそのわかりやすくしようとする気概をぜんぜん感じない例
770 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:10:57 ] >>765 766-768が書いているようにgsub!の第2引数で置換パターンを書いたほうが 単なるstringでパターンを渡せるので簡単だと思う 766,767が書いてるパターンの前の '&' って どういう意味?
771 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:21:13 ] >>770 ttp://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html
772 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:26:03 ] なるほどProcを渡してるのねthx 俺には768の方がわかりやすいな、例は見づらいが
773 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:42:38 ] だって先生が gsub はブロック使えって言ったんだもん言ったんだもん言ったんだもん >>766-768 irb> data = {/k1/ => 'v1', /k(2)/ => 'v\1', /k3/ => lambda{|m| m.sub(/k/,'v')}} irb> str = 'k1, k2, k3' irb> data.each_pair do |re, p| p.kind_of?(Proc) ? str.gsub!(re, &p) : str.gsub!(re, p) end irb> p str "v1, v2, v3" 思ったことに近いことができましたーうおー 助かりましたせんきゅうです
774 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 03:46:28 ] 1byte文字以外をマッチする方法を教えてください s="123123456456" s.gsub!(/〜/){|c| uni_enc(c) } p s => 123%uFF11%uFF12%uFF13456%uFF14%uFF15%uFF16 みたいに1byteじゃない文字だけ変換して置換したいです よろしくお願いします
775 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 06:56:24 ] $KCODE='s' s="123123456456" s.gsub!(/./){ |ch| (ch.length==2) ? "(#{ch})" : ch } puts s;
776 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 07:36:20 ] 1バイトじゃない文字だって言ってるのにわざわざ2バイトをチェックするとはこれいかに
777 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 14:27:57 ] # coding: sjis # Ruby1.9以降か正規表現エンジンに鬼車を使用 s="123123456456" s.gsub!(/[^\p{ASCII}]/){|c| "%u"+c.encode('utf-8').ord.to_s(16) } p s
778 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:08:32 ] test = {"うし"=>5, "うま"=>3, "うし"=>1, "うし"=>2, "うま"=>4} test.each{|key, val| } これを実行したら最後二つの"うし"=>2と"うま"=>4しか処理が実行されないんですが キーの要素が一緒だと前にある奴は消されてしまうんですか? またこれをハッシュの数分だけ実行させることはできないんでしょうか?
779 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:22:15 ] >778 ハッシュの意味を勉強してこい
780 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:30:11 ] 配列の配列を使う方法 test = [ ["うし", 5], ["うま", 3], ["うし", 1], ["うし", 2], ["うま", 4] ] test.each {|k, v| use(k, v) } 値が配列になったハッシュを使う方法 test = {"うし"=>[5, 1, 2], "うま"=>[3, 4] } test.each {|k, a| a.each {|v| use(k, v) } }
781 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:44:49 ] 文字列 a0-0 a0-1 a0-2 a0-3 a1-0 a1-1 a1-2 a1-3 a2-0 a2-1 a2-2 a2-3 から任意が選ばれた配列a a=["a0-0","a2-2","a2-3"] より、 配列bを作成したいのですが、 なにか良い方法はないのでしょうか? b=[[1,0,0,0],[0,0,0,0],[0,0,1,1]]
782 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:51:33 ] 只今から上位エスパー召喚の儀を執り行う
783 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:54:09 ] "a0-0" → [1, 0, 0, 0] "a2-2" → [0, 0, 0, 0] "a2-3" → [0, 0, 1, 1] という対応があるように見えるのだが、2つめは [0, 0, 1, 0] ではない? どういうルール?
784 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:55:50 ] >>782 失敗してるぞw
785 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:58:38 ] こうだな a=["a0-0","a2-2","a2-3"] b = Array.new(3){ Array.new(4, 0) } a.each do |x| if /a(\d)-(\d)/ =~ x b.push[$~[1].to_i][$~[2].to_i] = 1 end end p b #=> [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 1]]
786 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 18:00:09 ] >>782 成功したぞw
787 名前:785 mailto:sage [2010/01/19(火) 18:00:44 ] ごめん。こうだったね。 > b.push[$~[1].to_i][$~[2].to_i] = 1 b[$~[1].to_i][$~[2].to_i] = 1
788 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 18:02:57 ] >>783 a0-0 は配列aにあるから 1 a0-1 はないから0 a0-2 はないから0 a0-3 はないから0 これにより[1,0,0,0]です。 a2-0 はないから0 a2-1 はないから0 a2-2 はあるから 1 a2-3 はあるから 1 これにより[0,0,1,1]です。 このようなルールです。
789 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 18:26:34 ] >>785 ありがとうございます。 この方法で問題なく解決しました。
790 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 22:18:49 ] こういう3択クイズで選んだ結果をファイルに出力して、解答ファイルと照らし合わせる場合 どうすればいいのでしょうか? require 'cgi' c = CGI..new hoge = c["va"] print "Content-type: text/html; charset=EUC-JP\n\n" print "<html><head><title></title></head><body>\n" print "<p>" if hoge == 1 print "<p>問題1</p>\n" print"<form method=\"POST\" action=\"./test.rb\">\n" print"<input type=\"radio\" name=\"va\" value=\"2\">ア print"<input type=\"radio\" name=\"va\" value=\"2\">イ print"<input type=\"radio\" name=\"va\" value=\"2\">ウ print"<input name=\"ok\" type=\"submit\" value=\"OK\">\n" print"</form>\n" elsif hoge == 2 略 end print "</p></body></html>\n"
791 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 22:32:03 ] >>790 Rubyは基本、HTTPのクエリ文字列とかを隠蔽しない そのときどんなデータがどのように送られてくるものなのか、HTTPの勉強をするといいぞ
792 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 23:06:30 ] >>791 ありがとうございます 勉強して何とかやってみます
793 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 08:35:06 ] >>791 事実だから仕方ないが、あんま威張ることじゃないけどねえ Railsで作ってRailsで表示してRailsで受け取れば抽象度高くできそうだが、もうCGIではないな
794 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 08:36:21 ] そりゃ言語としてWEBだからって何かするのはPHPくらいだろう。
795 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 08:49:20 ] あほまるだし
796 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 12:53:24 ] 質問です! 文字列を受け取ってスペースと記号を削除した文字列を返すメソッドを作りたいんですが どうすればいいでしょうか? ちなみに条件はgsubメソッドをつかうこと 記号は全角も半角も含む(","とか"。"とか"?"とか"?"とか) どなたかお願いします
797 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 12:56:49 ] >>796 Rubyの宿題教えてください。2限目 pc12.2ch.net/test/read.cgi/tech/1200175247/
798 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 13:10:06 ] >>797 スレ違いでしたね すいません わざわざありがとうございます
799 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 13:48:31 ] RDEは軽いからお手軽なGUIのirbみたいなイメージで 自作メソッドとかの動作確認的な風に使うな
800 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 14:45:43 ] railsを勉強しようと思うんですが、初心者向けで お勧めの本はありますか?あるいは、これは読んで おくべき本でも構いません。 Webでいろいろ読んだのですが、modelのassociation やAjaxが難しく感じました。
801 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 14:50:41 ] うむ、スレのテンプレすら読めんような注意力では何もかもが難しかろう 【Ruby】Ruby on Rails Part8 pc11.2ch.net/test/read.cgi/php/1252842574/
802 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 14:53:24 ] Railsの初心者スレってありそうでなさそうで需要ありそうだがやっぱめんどいからなしで
803 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 16:16:05 ] >>801 ありがとう。
804 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 16:21:54 ] >>800 初心者が最低限これだけあればまずはなんとかなる!って書籍を3つ。 というか俺が実際にRails初心者レベルで仕事で使った本 ・RailsによるアジャイルWebアプリケーション開発 www.amazon.co.jp/dp/4274067858/ ・Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応 www.amazon.co.jp/dp/4839928266/ ・Railsレシピブック 183の技 www.amazon.co.jp/dp/4797336625/ あとは、webサイトだけど公式のガイド。ちょっとしたわからんことはまずこれ見たら大体すむ Ruby on Rails guides guides.rubyonrails.org/ 毎回聞かれてるんで、Railsスレテンプレに入れといていいと思うんだ・・・
805 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 16:23:43 ] 質問いいでしょうか? Ruby 1.8.7にて、ブロックつきメソッドの呼び出したブロックの返り値を得たいのですが、 ブロック内で return "UNKO!!" すると、 unexpected return (LocalJumpError) と言われます。 break "UNKO!!" では問題ないようなのですが、これはこういうものなのでしょうか?
806 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 17:03:26 ] >>804 紹介ありがとう とりあえずそれらと公式サイトで始めてみます
807 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 17:04:09 ] >>805 トップレベルでreturn使っていない? def f(a) a.each{ return 1 } end a = [1,2,3] f(a) # これはだいじょうび a.each{ return 1 } # でもこれはダメ
808 名前:805 mailto:sage [2010/01/20(水) 17:50:49 ] >>807 ありがとうございます。 エラーでない方法をお聞きしたいというよりも、もう少し具体的に聞くべきでした。 こちらの期待する動作としては、 ”UNKOoooooooOOOO!!”と”f is finisheeeeeeeedddddd!!111”ともに表示させたいのです。 breakの代わりにreturnだと”f is finisheeeeeeeedddddd!!111”が表示されませんよね・・・?(fから抜けてる?) 実際のコードではa.eachではなくeachの代わりに自分で定義したブロックを必要とするメソッドを呼び出してます def f(a) puts a.each{ break "UNKOoooooooOOOO!!" } puts "f is finisheeeeeeeedddddd!!111" end a = [1,2,3] f(a) # これはだいじょうび #a.each{ return 1 } # でもこれはダメ
809 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:01:04 ] breakはブロックの脱出、returnはメソッドの脱出ってこと だからそのfの中でretrunを使ったら内部ブロックでだろうとfを脱出する 同様にこれも無理 def f break end f
810 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:09:10 ] ある案件で始めてRubyをいらうことになったのですが、 訳がわからず困っています。 取り合えず、"RailsによるアジャイルWebアプリケーション開発”のT部 HelloWorldプログラムを作成して動かすまでを試してみて、 ああ、PHPでSmarty使ってMVCモデルで作成するのを自動、徹底 してる感じだなと思い、そのまま本チャンプログラムに挑みましたが・・・ ・まず、.rhtmlがTopページしかなく、MVCとも.jsファイルばかり。 ・ブラウザに表示してソースコードを見てみると、1万行近い ソースコードで表示と一致していない。 ・ブラウザのURL表示がページ遷移しても常に一緒。 と、始めて見る構成でした。 私のRubyの理解が足りないと思い、U部以降を読み進めようと思いましたが このプログラム構成が特殊だから、参考書読み進めても効果は薄く それよりプログラムの解析を続けるべきでないかと思い直しました。 皆さんに質問ですが、こういった構成は一般的なのですか? それなりにある手法ならば、読むべき参考書、検索のキーとなる 単語を教えていただけたらと思います。 要領得ない質問ですみませんがお願いします。。。
811 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:17:27 ] >>810 お前には絶対に無理だ
812 名前:sage [2010/01/20(水) 18:20:39 ] せめて日本語で頼む。
813 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:31:08 ] >>804 の罪は重い
814 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:34:15 ] これは俺でも煽る 直前読めずにスレのルールすら理解できないようでは駄目だろうな
815 名前:810 mailto:sage [2010/01/20(水) 18:51:22 ] >>814 >関連スレやURLは>>2-5 あたりを見てください。 >Ruby on Rails の質問は Webプログラミング板の Rails スレへ。 これですか? もっと詳細に質問すべきだったのかもしれませんが、 個々のプログラムの質問以前に全体として???だったもんで。。。 >>810 ,813 つまり、初心者レベルでないから私には到底無理ってことですか? それならそれで上にそう報告しますので助かります。 それでもやれって言われそうですが・・・。 逆に、参考書読んだらわかるようなことを質問するなというのであれば すみません。 参考書、全部読んでみます。 取り合えず、初心者参考書レベルの問題なのかだけでも教えて下さい。
816 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 19:11:01 ] >>815 君が書いてる質問の中に、Rubyそのものに関する話題は一切ない。 Railsスレへ行きなされ。 >>813 が書いてるのは、たぶん、Railsスレへ行けということが示されてるのに わざわざ餌を撒いてここに君を留まらせた罪が重いってこと。
817 名前:810 mailto:sage [2010/01/20(水) 19:13:22 ] >>816 そうですね。。。 すいません。 Railsスレにいきます。 スレ汚し失礼しました。
818 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 19:21:36 ] >>817 読んでないことを期待するが、40パーセントくらいしか悪くないのでそれほど謝る必要はない 残り40パーセントは>>804 で、残り20パーセントはたまたま重なったタイミング
819 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 19:39:51 ] >>808 eachごとの結果がほしいのなら ブロックの外で定義した配列に 欲しい結果を入れておく。 またはブロックのto_aとか 701へのレス703, 709参照。
820 名前:804 mailto:sage [2010/01/21(木) 10:54:34 ] 俺の名誉のために言っておくが、>>810 の言っていることは、 "RailsによるアジャイルWebアプリケーション開発”のサンプルコードの話じゃなくて、 >>810 が取り組んでる仕事のコードだと思うぞ
821 名前:804 mailto:sage [2010/01/21(木) 10:55:31 ] ごめん >>816-818 読んでなかった。餌まいてスマソ
822 名前:805 mailto:sage [2010/01/21(木) 10:56:56 ] ありがとうございます! >>809 > breakはブロックの脱出、returnはメソッドの脱出ってこと ああ!それです。まさにその1行が聞きたかったのです。 俺はもっとよい聞き方を憶えないといけないな・・・
823 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 11:43:10 ] こうして>>804 はプライドも外聞もズタズタになったのであった。
824 名前:デフォルトの名無しさん [2010/01/21(木) 12:57:39 ] 1. ruby -e 'puts ARGF.read' file.txt 2. ruby -e 'puts $<.read' file.txt 1.の文では正しくfile.txtの内容が表示されるのですが、 2.の文で「指定されたファイルが見つかりません。」と怒られます。 リファレンスマニュアルの$<の項には 「つまり定数 ARGF の別名。 」 と書いてあるので、 1.と2.で同じ結果を期待したんですけど。 どこが間違ってるんでしょうか? Ruby1.9.1でOSはWindowsXPです。 よろしくお願いします。
825 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 13:06:28 ] あ,自己解決しました。 Windowsの<とか>とかってエスケープするか ""で括らなきゃいけなかったんでした。 1. ruby -e "puts ARGF.read" file.txt 2. ruby -e "puts $<.read" file.txt または 2. ruby -e 'puts $^<.read' file.txt なら同じ結果になりますね。 スレ汚しスマソ。
826 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 13:10:22 ] >>824 「指定されたファイルが見つかりません。」を出してるのは実はcmd.exeだ 「<」を誤認識してる ということで cmd.exe から < をエスケープすればよい cmd.exe のエスケープ文字は ^ だから、 ruby -e 'puts $^<.read' file.txt
827 名前:816 mailto:sage [2010/01/21(木) 14:12:27 ] 別に810や804を責めたいわけでもないんだが、質問と回答は 適切な場所でやった方がいいよ、ってことで。
828 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 14:15:52 ] >>826 すみませんすみません ありがとうございました。
829 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 14:33:03 ] >>810 >・まず、.rhtmlがTopページしかなく、MVCとも.jsファイルばかり。 >・ブラウザに表示してソースコードを見てみると、1万行近い > ソースコードで表示と一致していない。 >・ブラウザのURL表示がページ遷移しても常に一緒。 > と、始めて見る構成でした。 これはAjaxでページを作ってるんだろう。Railsうんぬんはさほど関係ない。 > 私のRubyの理解が足りないと思い、 いや、JavaScriptやAjaxの知識が足りないだけだと思う。
830 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 14:34:48 ] >>801
831 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 17:50:52 ] riっていらないよね
832 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 17:58:09 ] rubygem パッケージマニュアルとしての ri に関しては、「とりあえず入れておく」というようなもんでもないな既に 現時点で ri を利用してないのなら、 --no-ri で飛ばしてOK 基本的にロクなこと書いてないしソースを grep したほうがおおむね速いので、rdoc もなくてもいい rdoc がきっちりしているライブラリのみ、マニュアル読む機会があるときだけ rdoc コマンドで構成するか、 あるいはネットで公開されてる rdoc を読めばいい
833 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:04:47 ] refeはいるけど、riはいらない
834 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:13:46 ] デフォで--no-ri -no-rdocしても特にデメリットはないね インストール速いしディスクアクセスも少なくて済むしいいことだらけ
835 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:37:04 ] 俺は.gemrcに書いたが、デフォルトでそうであれ、とまでは思わない。
836 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:41:39 ] 自分の作るライブラリにはRDocをていねいに書く 自分がインストールするライブラリではrdocは使わない
837 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:46:04 ] 日本語でいいならコメント書くんですがー
838 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:54:48 ] >>837 あちらさんの使ってるフォント自体に日本語文字がないから、本気で表示が崩れるぞ 外国語の文字も適当に表示できるフォントの認知度が高いのは日本くらいだ
839 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:59:50 ] とりあえず日本語でコメントを書きまくり、英語の得意な人がプロジェクトに参加してくれることを祈るというのはどう 英語でコメント書くの大変だって言うような人が作るライブラリなんて、どうせ最初に使うのは日本人が主だろうしさ
840 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 20:14:17 ] そうだな、とりあえず日本人向けオンリーででもまず本体クオリティ上げるのが第一かもしらん 英語ドキュメント書けないからと言って諦めるのはもしかしたら勿体無さ過ぎるかもしれない
841 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 22:08:16 ] 質問です。ある1つのディレクトリ内にあるファイルを更新時間順にソートしてファイル名を連番(数字のみ)にしようと以下のコードを書きました。 def consecutivenum(path) i = 1 files = Dir.glob("#{path}/*").reject{|name| FileTest.directory?(name)} files.sort{|a, b| File.mtime(a) <=> File.mtime(b) }.each{|name| File.split(name)[1] =~ /.+(\..+)/ File.rename("#{name}", "#{File.split(name)[0]}/#{i}#{$1}") i += 1 } end 実行するとファイルが消去されたりコピーされたりしてしまいます。 試しにDir.glob(#{path}/*)だけを実行したところ、存在しないファイル名が混じっていました。 また、そのファイルをFileTest.exist?に送るとtrueが返ってきます。Windowsの隠しファイルでもありませんでした。 何がどうなっているのかさっぱりわかりません。OSはVistaでRubyのバージョンは1.8.7です。 ご助力よろしくお願いします。長々と失礼しました。
842 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 22:40:56 ] > 存在しないファイル名が混じっていました 存在します または、UNICODEファイル名です UNICODEファイル名だった場合、Rubyから扱うことはできません
843 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 23:30:17 ] てか存在しないファイル名とか教えてくれりゃ結構一発だったり
844 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 23:33:11 ] 察してください、まで読んだ
845 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 00:28:53 ] >>842 >>843 ファイル名ですが、エクスプローラーやコマンドプロンプトのdirで確認できずにrubyで検出されたのは 6.jpg 2.ini の二つです。
846 名前:841 mailto:sage [2010/01/23(土) 00:29:59 ] 失礼 >>845 の書き込みは>>841 の者です。念のため。
847 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 00:59:11 ] 本当に存在しないファイルなの? そのディレクトリで system('start 6.jpg') ってやればjpegに関連付けられたアプリで 6.jpg が開くから確かめてみたら?
848 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:01:01 ] あとは dir /x とか
849 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:08:43 ] >>847 6.jpgについてはエラーが出ましたが、2.iniは開かれました。 >>848 6.jpg、2.iniいずれも出ませんでした
850 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:16:26 ] 2.iniがでてきたってことは、ファイル自体はあるってことだよね? でもdirでは出てこないのか・・・謎だ・・・ require 'win32ole' fso = WIN32OLE.new('Scripting.FileSystemObject') fso.GetAbsolutePathName('2.ini') とかしてみたら?
851 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:27:40 ] >>850 さきほどまでのフォルダではなくtempフォルダのパスが出ました。 今度はそのtempフォルダで start 2.ini を実行しましたが開かれず、dirでも見つかりませんでした
852 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:35:45 ] とりあえずスクリプトに $KCODE = 'SJIS' を付けて実行してみるべき FileSystemObjectで見えているパスはWindowsで見えているパスなので fso経由で2.iniが見えているのにdirで見えないのは、ちょっと不思議
853 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:48:34 ] $KCODE = "SJIS"を付けてみましたが特に変わりないようです (ただ、コンソールの作動場所のせいかスクリプトの保存場所のせいかまた別のパスが返ってきましたが) >>850 のスクリプトはなにを意味するのですか?2.iniの代わりに適当な文字列を入れてもパスが返ってくるのですが・・・
854 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 02:49:29 ] まだいるかな? attrib *.* はどう?
855 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 02:52:21 ] なんかの拍子にシステムファイルになったんじゃない? フォルダオプション→表示→保護されたオペレーティング〜 のチェック外してみ
856 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 14:46:40 ] dir で出てこなくて dir /a で出てくるなら 存在はしてるけど何らかの属性がついてて、そのせいでエクスプローラーに表示されないだけだな
857 名前:デフォルトの名無しさん [2010/01/23(土) 15:10:59 ] ./hoge.rb を実行するときに例えば ./hoge.rb --debug のようにしてデバッグモードにして そのときだけ状態メッセージを print するためにはどのようにするのは ruby 的にエレガントでしょうか?
858 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 15:12:05 ] もはやRubyとは関係ないな
859 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 15:43:41 ] >>857 読み手にとっていちばん妥当なもの require 'logger' @log = Logger.new(@logfile||$stdout) @log.debug "debug log message" if @log 書く人が楽だがメソッド名に独り善がり感またはどや顔が滲み出たもの def D(msg) return unless @debug_output @debug_output << msg @debug_output << "\n" end @debug_output = $stderr D "debug log message" 後者のタイプで def LOG(msg) を時々見る
860 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 17:54:08 ] >>859 ありがとうございます! 後者のDをDoyagaoとして使いたいと思います(違)^A^K二つの視点から例を出していただきとても参考になりました!
861 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 18:59:49 ] >>841 です >>854-856 2.iniがシステムファイルとして存在していました。相変わらず6.jpgは見つかりません。
862 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 19:46:16 ] どこにだよ tempか? 最初のフォルダの中のファイルは全部連番に変わったのか? tempのファイルも全部か?
863 名前:デフォルトの名無しさん [2010/01/23(土) 21:43:18 ] ブロックスペシャルファイル(readするとバイト列が得られます)の長さを 調べたいのですが、実際にreadすることなしにこれを実現する方法はありますか? パッと思いついたのは、openしてからファイルの末尾にseekして 先頭からのpositionを得るという方法ですが、他にはありますか。
864 名前:863 [2010/01/23(土) 21:46:20 ] 例えばこんな感じです: File.open("/dev/sda") do |io| io.seek 0, IO::SEEK_END io.pos # /dev/sda のバイト列の長さ end
865 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:49:18 ] 関数の外で@も@@も付けずに定義した変数はいったいどこに保存されるのでしょうか? x = 10 def func x = 20 end func puts x #=>10 これがxが20にならないので、最初に定義したxはグローバルには見えないどこかに閉じ込められてるのかな。
866 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:50:04 ] >>863 完全にUNIX/Linuxプログラミングの話題じゃまいか
867 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:51:41 ] >>866 を、Rubyで実現するにはどうすればいいですかという話だろう
868 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:53:55 ] >>865 変数のスコープという概念を勉強してくれ ごく端的に説明すると消えるというか、スコープを抜けるとアクセス不可になって取り出す手段がなくなる def の「中」のローカル変数は def の「外」からはアクセスできない だからメソッドの引数で「中」に入れてメソッドの返り値で「外」に出す
869 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:57:27 ] File.statでサイズ読めないかね
870 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:02:55 ] 俺もそうおもた
871 名前:863 [2010/01/23(土) 22:03:17 ] >>869 やってみたのですが size = 0 になっています。 statコマンドで調べても0バイトになっています。 そもそも、ブロックスペシャルファイルのバイト列の長さって、デバイス依存な気がします。 つまり「ファイルサイズ=バイト列の長さ」は成り立たない、ということかも知れません。
872 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:03:31 ] $ sudo ruby -e "p File.stat('/dev/sda')" #<File::Stat dev=0xe, ino=5003, mode=060660, nlink=1, uid=0, gid=6, rdev=0x800, size=0, blksize=4096, blocks=0, atime=Sat Jan 23 18:12:33 +0900 2010, mtime=Sat Jan 23 18:12:33 +0900 2010, ctime=Sat Jan 23 18:12:55 +0900 2010>
873 名前:863 [2010/01/23(土) 22:06:31 ] >>872 ふむ、、やっぱり size = 0 ですね。。 バイト列の長さがデバイス依存(つまり不定値)なのは、よく考えてみればわかります。 /dev/null は常に長さ0ですし、/dev/zero は無限大。 難しいです。。
874 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:11:19 ] そもそもなににつかうん
875 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:12:16 ] やっぱりUNIXスレで聞いたほうがいいと思うんだ カーネルとファイルシステムの知識が必要だし Ruby初心者スレで聞くような話題じゃないよ
876 名前:865 mailto:sage [2010/01/23(土) 22:18:31 ] >>868 ありがとうございます。 ただ、自分が不思議に思ったのは、外から関数内の変数にアクセスできないことではなく、 関数の外の変数に内側からアクセスできてないことです。 一般的に内側から外側の変数にはアクセスできると思うので。 x=20の段階で、外側の変数に代入するのではなく、新しい変数を作ってしまっているのが不思議なんです。
877 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:18:59 ] >>876 変数のスコープという概念を勉強してくれ
878 名前:863 [2010/01/23(土) 22:19:06 ] >>874 LVM の論理ボリュームのスナップショットを自動で作成しようかと。 ただし、論理ボリュームの大きさが: ・Xバイト以下だったら、それと同じ大きさのスナップショットを作成 ・Xバイトより大きければ、Xバイトのスナップショットを作成 という処理をしたかったのですが、論理ボリュームの大きさを調べるために 外部のコマンドに投げるのは嫌だったので、どうせならデバイスファイルの中身の大きさを調べちゃえ、みたいな感じです。 >>875 すみません、そうします。 カーネルの知識はありませんが。。
879 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:22:19 ] はいさよなら