1 名前:one [2009/05/16(土) 10:06:50 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】 【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】 ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
116 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 08:04:42 ] >>107 [*1..10].sample(5) [*1..1_000_000].sample(1000)
117 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 08:09:23 ] >>115 なんでわざわざ同じことを何回も繰り返す? require File.expand_path('../../../../spec_helper', __FILE__)
118 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 09:32:24 ] File.expand_path の第2引数の扱いは undocumented だからな 現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら つまり、以下の4つは同じように /full/path/basedir/dir/file を返す File.expand_path('dir/file', '/full/path/basedir')) # マニュアルを素直に読む場合、第2引数はフルパス File.expand_path('dir/file', 'basedir')) File.expand_path('dir/file', File.dirname(File.expand_path('file_in_basedir')))) File.expand_path('dir/file', 'file_in_basedir')) というか、このへんは実験終了と称して次のバージョンくらいでぽっと無くなりそうで嫌だ
119 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 11:40:41 ] 第二引数なし・pathnameなしで一番短いのはこれかな require File.join(File.dirname(__FILE__), '../../../spec_helper') でも確かに、spec_helper.rbを自動or独自メソッドで読んでくれれば一番早いとは思う
120 名前:デフォルトの名無しさん [2009/05/21(木) 12:08:01 ] メモリ上で文字列の圧縮・展開を行いたいです。 そういったライブラリはありますか?
121 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 12:20:56 ] よーわからんが irb> require 'zlib' irb> str = "プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】 【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】 ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です" irb> p str.size 560 irb> z = Zlib::Deflate.deflate(str) irb> p z.size 375 こういう話ではなく?
122 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 12:53:49 ] >>121 ありがとうございます。zlibを調べてみますね。
123 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 13:31:52 ] すいません。 >>87 をお願いします。
124 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 13:48:27 ] >>123 socket_server.rb はライブラリではなく単なるアプリケーションで、同じページの server_client.rb の次に説明されてる
125 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 16:16:25 ] rspecにて、spec/hello_spec.rbから hello.rbを起動テストしようとしています。 しかし、NetBeansの "rspecテスト"からrspecを起動した場合だけテストに失敗してしまいます。 コマンドプロンプトから spec spec/hello_spec.rb では問題ないのですし、直接 ruby hello.rbでも問題ないです。 warningの文字列で、テストしているので起動時の "-w" をとれば成功するようになるのですが、 コマンドプロンプトからは -w をつけても問題ないのが気になります。 'my script should have no errors or warnings' FAILED expected not: =~ /warning/n, got: "(Rubyインストールディレクトリ)/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:138: warning: d:/my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8/specifications: Invalid argument\nHelloWorld\n" ./spec/hello_spec.rb:15: ./spec/hello_spec.rb:13:in `chdir' ./spec/hello_spec.rb:13: hello_spec.rbのソース require File.join(File.dirname(__FILE__), '/spec_helper.rb') describe "my script" do before do @bin_path = File.join(File.dirname(__FILE__), "/../hello.rb") end it "should have no errors or warnings" do pending "Hangs on JRuby" if PLATFORM =~ /java/ Dir.chdir(File.join(File.dirname(__FILE__), "/../")) do output = `ruby -w #{@bin_path} --help 2>&1` output.should_not =~ /warning/n output.should_not =~ /Error/n end end end
126 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 16:23:38 ] =~ というマッチャは見たことないな
127 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 16:35:42 ] >>124 さんきゅう。 同時に、「SocketServerというクラスがリファレンスにないぞ・・・」と思って いましたが、これも下の socket_server.rb で定義していたんですね。 納得。
128 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 17:06:27 ] >>125 推測だが、コマンドプロンプトとNetBeansが それぞれ違う場所にインストールされたrubyを使っていて、それで何かの問題が起こっているのでは? 実際にsource_index.rbの138行目見れば何か分かるかもよ >>126 あるよ
129 名前:125 mailto:sage [2009/05/21(木) 18:40:11 ] >>126 正規表現のマッチャみたいです。 >>128 ありがとうさんです。 source_index.rb見てても何故かよーわからんくて、 使われているのがNetBeans標準のjrubyでなくちゃんとMatzRubyにしたよなー、 と思って設定を見直していたころ、gemパスがバグっていたことになっていたことに気づきました。 1行1パスなのに、何故か、 /my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8 と : で区切って2つパスが記述してありました…(´・ω・`) 削除して、/my_home/.gem/ruby/1.8 だけにしたところ、 問題なく動きました! 今思うと、source_index.rbはの該当行はgemパスの処理のところでした。 おかげさまで、無事に解決いたしました。 ありがとうございました。
130 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 19:38:56 ] >>116 [*1..10]も1_000_000も知らなかった 前者のはRange#to_aと優劣あるんだろうか
131 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 19:44:56 ] >>109-112 , 116 Thx ごめんなさい。未だ試してないです。
132 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 00:16:37 ] >>118 > File.expand_path の第2引数の扱いは undocumented だからな Converts a pathname to an absolute pathname. Relative paths are referenced from the current working directory of the process unless <i>dir_string</i> is given, in which case it will be used as the starting point. 「dir_stringを始点として絶対パスに展開する」とちゃんと書いてあるだろ。 > 現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら 勝手にdirnameしてるわけではなくて、>>117 は>>114 より'..'が一つ多い。
133 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 00:18:05 ] >>130 [*1..10]のほうが(1..10).to_aより短い。 遅いけどな。
134 名前:デフォルトの名無しさん [2009/05/22(金) 05:39:26 ] スレ違いな質問で申し訳ないが、GnomeVFSのSSH接続で、鍵を指定することはできないの? 普通に ssh://user@host と指定しただけでは ~/.ssh 下しか探さないみたい。 Net::SSH は鍵を指定できたんだけど。。
135 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 15:46:03 ] eRubyについて教えてほしい eRubyで書かれたファイルの中に eRubyで書かれたファイルを埋め込みたい なんか出来そうな気がするのだけど イメージがまとまらないので、できるのなら教えてほしい。 具体的な運用としては Apacheで*.rhtmlのファイルをeRubyを通すように設定したサーバで 運用したいと思っている。 で、ページを構成する細かい部品をeRubyで書いて そのレイアウトをeRubyで定義できないかな〜って感じです。
136 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 16:03:52 ] <% require 'erb' %> <%= ERB.new(File.open(filename).read).result %> じゃダメなんだっけ?
137 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 16:09:11 ] >>132 日本語マニュアル不備だよね 基本の添付ライブラリのマニュアルが英語とかなにそれ
138 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 16:35:47 ] >>136 それでいけました ただ、単にERBオブジェクト作ってあげるだけでよかたんか。 これで、ヒャッホ〜イ!できそうです。ありがとう。
139 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 16:50:58 ] >>133 サンクス 数文字程度長いぐらいならわかりやすいほうが好みだから [*1..10]を選ぶ理由はなさそうだ
140 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 17:42:51 ] >>137 ri File.expand_path
141 名前:140 mailto:sage [2009/05/22(金) 17:44:48 ] いや、これも英語か。 ソースから抜き出してるから、日本語版を作るとなると ソースに日本語でドキュメントを書くか、 自動生成を諦めるかになるのかな。
142 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 17:46:35 ] ja.po 形式はどうだろう
143 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 17:49:56 ] そういえば、rubyをgettext対応させた人っていないのかな。
144 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 17:55:05 ] >>143 スクリプトの話?本体の話? 前者はライブラリがある
145 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 17:56:24 ] >>132 第2引数は /path/to/file を渡しても /path/to/ とみなして処理される 相対パスを渡しても、絶対パスに変換したあとで基点とみなされる startint point という語にそれだけの処理の意味を任せるのは初耳だ
146 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 18:16:07 ] >>141 日本語版のリファレンスにはReFeというツールが付属していてだな
147 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 18:30:33 ] >>145 > 第2引数は /path/to/file を渡しても /path/to/ とみなして処理される 違う。あやふやな知識で書くより、ちゃんと試してみることをすすめる。 File.expand_path("foo", "/path/to/file") #=> "/path/to/file/foo" File.expand_path("foo", "/path/to/") #=> "/path/to/foo" File.expand_path("../foo", "/path/to/file") #=> "/path/to/foo" File.expand_path("../foo", "/path/to/") #=> "/path/foo" > 相対パスを渡しても、絶対パスに変換したあとで基点とみなされる > startint point という語にそれだけの処理の意味を任せるのは初耳だ これも違う。重要なのは戻り値は絶対パスだということ。 File.expand_path("foo", "path") が "path/foo" だったら絶対パ スじゃないだろ? 絶対パスを返すという仕様が前提なんだから、相 対パスは他にどう扱いようがあるというんだ。
148 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 18:50:06 ] >>144 ruby-gettext-packageは知ってる。 本体の出力メッセージとかの話。
149 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 18:55:53 ] GNU gettextはLの付かないGPLだから、使うとRubyを Ruby's ライセンスではなくGPLで配布する必要が生じるかも。
150 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 18:56:19 ] www.nicovideo.jp/watch/sm5071807
151 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 19:01:06 ] 「読まない人は日本語でも読まない」wwww
152 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 19:16:33 ] インタプリタの出すメッセージは用語みたいなもんだから 翻訳するとかえってめんどくさいことになりそうな
153 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 19:23:19 ] 入ります
154 名前:デフォルトの名無しさん [2009/05/22(金) 19:28:51 ] みんな なでしこ やったことある?
155 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 19:40:55 ] このスレでその質問をするココロは?
156 名前:デフォルトの名無しさん [2009/05/23(土) 02:19:17 ] @port = port if( !port.nil? ) の解釈で質問です。 最初の@はインスタンス変数で、右辺のifは修飾子だと思うのですが、 ()内の「?」の意味が分かりません。 これがは文字コードリテラルとは思えませんし・・・ どういう意味(役割り)なのでしょうか?
157 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 02:24:44 ] nil? というメソッドです
158 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 02:48:30 ] いちおう補足、リファレンスでObjectクラスのインスタンスメソッドを眺めてみて しかしなんというか、不慣れな時期にそのコードというのは運が悪いな せめて @port = port unless port.nil? と書いてほしい
159 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 02:53:02 ] うーん。識別子に使える文字等の解説が見つからない。 ttp://www.ruby-lang.org/ja/man/html/_BBFAB6E7B9BDC2A4.html#a.bc.b1.ca.cc.bb.d2 ↑これ、ぶっちゃけ不正確じゃね?
160 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 02:59:45 ] >>157-159 さんきゅうです。 つまり if( !port.nil? ) というのは、「portが無効でないなら(不活性でないなら)〜」 ということでOKですか?
161 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 03:05:25 ] うんにゃ。 if( !port.ni? ) → if()
162 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 03:07:57 ] あら。途中で書き込んだ。 if( !port.ni? ) → if( !port.nil? == true ) → if( port.nil? == false ) で理解してくらはい。 port.nil? は boolean を返すことが期待されてるメソッドです(たぶん)。
163 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 05:05:12 ] Ruby に Boolean などというものはありませんが何か あーでも結構使ってるなー >>156 A if COND という構造だということはわかってるんだよね if はメソッドではなく制御構造だから、このカッコは引数のカッコではなく式を作る「まとめカッコ」だ 中身1つだけだから、本当はこのカッコは必要ない で、最初の ! は否定の NOT だ ttp://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html#not 直後にあるものの真偽の概念を逆転する つぎの port はなんらかのローカル変数またはメソッド呼び出しで、 ドットで繋がってる nil? は port の返り値のクラスの nil? というメソッド port のクラスで再定義されていないのなら、それは Object#nil? で、オブジェクトが nil である場合に true を返す まとめると、 「port の返り値が nli でない場合に、@port に port の返り値を代入する」 となる
164 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 05:14:20 ] Rubyではよっぽどでない限り @port = port unless port と書くけどな ・ port に false が入る可能性があって、それは nil とは違う処理が必要 ・ port が nil であるというのが何か重要なサインであってソース読み下し上目立たせたい というのでない限り、今回でいうところの 「port に何か入ってたら @port に入れとく」 というフツーの意図である限り、 Ruby では unless を使う
165 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 05:35:31 ] >>164 .gsub("unless", "if")
166 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 05:58:35 ] 「nil でない」なら if だと思う
167 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 10:07:30 ] # データからHTMLを作って返す def html html = String.new … return html end というように、メソッド内のローカル変数名とそのメソッドの名称が全く同じなのって、ある程度は紛らわしいですよね できれば避けるべきなんでしょうか?
168 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 10:58:18 ] 再帰のような処理と混同する可能性があるってこと? メソッド内1行目でローカル変数として定義されてれば読んでて混乱はしないと思う if (html = init_data) then みたいにどっかの文の途中でこっそり変数定義を使ってることがあるとか、 変数とメソッドを混ぜて使い倒してる処理があるとか、そういうのが1ヶ所でもあれば注意深く読む
169 名前:デフォルトの名無しさん [2009/05/23(土) 11:28:11 ] IOのexpertな方、教えてください >< # afio - manipulate archives and files COMMAND = "afio -oZ -" IO.popen(COMMAND, "r+") do |src| Find.find("/etc") do |f| src.puts(f.chomp) end src.close_write File.open("myArchive.afz", "w") {|dst| dst.write(src.read)} end afioコマンドが pipe_wait になって終了しません。 何が悪いのでしょうか?
170 名前:169 [2009/05/23(土) 11:49:24 ] ちなみに、コマンドライン上から $ find /etc | afio -oZ - 1>./myArchive.afz とやれば、何も問題なく動作するんです。 ワケワカメで頭が破裂しそうです ><
171 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 11:52:44 ] afioコマンドが、入力を読み切らずに何か書き出そうとして固まってるとか?
172 名前:169 [2009/05/23(土) 13:22:11 ] afioで作成されたアーカイブをバイナリエディタで読んでいてふと思ったのですが、 なにやらヘッダらしきものが書かれていて、その後ろにgzipで圧縮されたバイナリがずらーと並んでいる感じです。 このバイナリファイルをハッキングして、自分でライブラリを書いてしまえばいいと思いました。 外部のコマンドに投げるよりはよりキレイに書けるとおもいまつ。 ありがとうございました。
173 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 13:25:37 ] >>169 原因は>>171 の通りだろう。 アーカイブデータをなんか加工したいというんでなければ、直接書き出させた方がよい。 あとFind.findからyieldされるパス名はchompする必要はない、というかしてはいけない。 COMMAND = "afio -oZ myArchive.afz" IO.popen(COMMAND, "w") do |src| Find.find("/etc") {|f| src.puts(f)} end
174 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 13:39:58 ] >>172 manpageによるとcpioフォーマットだな Except in special cases discussed below, afio will create archives with the same format as ASCII cpio(1) archives. 以下に述べる特殊なケースをのぞいて、afioはASCII cpio(1)アーカイブと同じ フォーマットでアーカイブを作成する。 When creating an archive, the `large ASCII' header is used by afio to cover the following situations: アーカイブを作成する際、以下の場合は「large ASCII」ヘッダが使用される。 o A file has a size larger than 2 GB ・ 2GBよりも大きいファイル o The archive contains more than 64K files which have hard links ・アーカイブ中のハードリンクが64Kを越えるファイル o A file, directory, or special file has a UID or GID value larger than 65535. ・65535より大きいUIDやGIDを持つファイル、ディレクトリ、特殊ファイル
175 名前:169 [2009/05/23(土) 21:41:37 ] すみません、最後に勉強のためにも教えてください。 納得したらもう寝ます。 >>171 にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。 全て入力した後に IO#close_write も呼びましたし、他に意識することって何でしょうか。 Pythonの os.popen2 で同様の事をやってみたのですが、あっさりうまくいって クソワロタ状態です (;_;) >>173 ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで 何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。 > あとFind.findからyieldされるパス名はchompする必要はない、 > というかしてはいけない。 すみません、確かにchompする必要はありませんでしたね。 でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。 以上、よろしくお願いします。
176 名前:デフォルトの名無しさん [2009/05/23(土) 23:24:38 ] whileの条件による終了(ループ脱出?)が分かりません。 下記は受信サーバー側のSocket通信の記述で、クライアントからの 信号s(オブジェクト)を受信したらRubyを終了したいのですが・・・ while true Thread.start(gs.accept) do |s| print(s, " is accepted\n") puts(s.gets) s.close break # ここでは無効 end end どう変更すべきでしょうか?
177 名前:169 [2009/05/24(日) 00:19:36 ] あああ、pythonでうまくいったというのは勘違いでした。(test caseのミス) でも IO.popen("cat | afio -oZ -") のように、catコマンドをクッションにしてみたらうまくいきました。 なんでだろうね。 バッファの関係?? 朝起きたらlinux板でも行って聞いてみます。。もう疲れた。
178 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 01:15:44 ] >>175 > >>171 にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。 もちろんあり得る。それはプログラムの構造次第。afioの場合ファイル名を受 け取れば処理できるんだから、一つ分出力してもなにも不思議じゃない。 >>177 は、catでバッファリングされてclose_writeされるまでafioに何も渡されて ないんだろ。 > >>173 > ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで > 何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。 書き込みと読み込みでThreadをわける。 IO.popen(COMMAND, "r+") do |src| Thread.start do Find.find("/etc") do |f| src.puts(f.chomp) end src.close_write end File.open("myArchive.afz", "w") {|dst| dst.write(src.read)} end > でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。 "\n"で終わるファイル名を正しく扱えない。
179 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 01:19:36 ] >>176 mth = Thread.current while true Thread.start(gs.accept) do |s| print(s, " is accepted\n") puts(s.gets) s.close mth.raise(SystemExit) end end
180 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 01:32:45 ] >>176 gsってTCPServer? サンプルをコピーしたとするとwhileで囲う必要もスレッドを生成する必要も無いと思う s = gs.accept print(s, " is accepted\n") puts(s.gets) exit
181 名前:176 mailto:sage [2009/05/24(日) 02:49:36 ] >>179-180 Thx 確かにwhile文無しでもOKでした。 今回は ttp://www.ftnk.jp/~fumi/cl/2007-11-24-1.html を参考にしました。 すいません。もう一つ質問です。 上記HPのクライアント側を改変して2行のテキスト「memo.txt」を読み込み サーバーに渡すように data = File.read("memo.txt") puts data # チェック用 s.puts(data) を書きました。 クライアント側では2行で表示されるのですが、サーバーの表示 puts(s.gets) では最初の1行目のみが表示されます。 これは何故でしょうか?
182 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 03:57:22 ] 文字列がcopy on writeじゃないのが他の言語と違って結構ハマることが多いのですが、 何か気をつける方法ってないのでしょうか? Rubyでは全部オブジェクトってのはわかっているつもりなのですが…。 #!ruby -Ku a = "hage" b = a b << "UNKO==!!" def change_string(s) s << "(((^^)))))" end change_string(b) puts a, b 結果: hageUNKO==!!(((^^))))) hageUNKO==!!(((^^)))))
183 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 04:50:17 ] >>181 IO#gets が何をするメソッドなのかマニュアルで調べてみ >>182 それって別に文字列に限った話じゃないよね 配列、ハッシュ、その他のオブジェクト、なんでも当てはまる オリジナルでは無くてコピーが必要なら必ずdup,clone、を徹底するしかないかな
184 名前:176 mailto:sage [2009/05/24(日) 05:02:30 ] >>183 どうも。 readに変えたらOKでした。
185 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 05:45:31 ] >>182 Rubyのあらゆる変数(や定数)はただの参照タグだ a = HogeObject.new は HogeObject.new の処理の最後を辿って(return してた)そのオブジェクトに存在を許して それに a という参照タグを1個つけるという行為 b = a は a の処理の最後を辿って、つまりは a の返り値のオブジェクト、に b という参照タグを追加する行為 Ruby スクリプトは変数の名前を後生大事に覚えてるわけじゃない Rubyはスクリプトのそれが変数名だとわかったら、その変数が参照している先にあるオブジェクト (の保管場所を表す数値「オブジェクトID」)だけを記憶する だから、 a = なにか b = a と書いた時点で、変数 a も変数 b も全く同一のオブジェクトを指す(つまり、一般的にはあまり意味がない) a = "なにか" p a.object_id b = a p b.object_id p a.object_id == b.object_id
186 名前:182 mailto:sage [2009/05/24(日) 05:51:03 ] >>183 >>185 せっかく説明してくださって申し訳ないのですが 原理をわかってて言ってるのです…(´・ω・`) 他の言語のつもりで書いちゃうと、ついバグを埋め込んでしまう まあ、ユニットテストしっかりしろってことになるのだと思いますが…。
187 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 05:52:21 ] で、既存のオブジェクトを破壊せずに、その内容を利用した新たなオブジェクトを作りたい場合は、 その既存のオブジェクトを破壊しないような方法を意図的に使う a = "hage" b = a + "ADD" def change_string(s) s + "CHINGE!" end c = change_string(a) p a, b, c 結果: "hage" "hageADD" "hageCHINGE!" オブジェクトを「足して」新たなオブジェクトを作るようなメソッドが提供されていなかったらどうするか、というのなら そりゃ>>183 の言うようにオブジェクト内容自体を複製して新たなオブジェクトを作る dup や clone を使うしかあんめえ
188 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 05:54:44 ] >>186 「わかってない」と思う わかってるのなら“絶対に間違えない”から 逆にいうと、オブジェクトと変数の関係を理解するまではよーわからんバグで悩まされて 変数は安全のためにと称して全部 initialize やメソッド定義の 1行目で dup することになるんだけどな
189 名前:182 mailto:sage [2009/05/24(日) 05:57:44 ] >>188 「わかってる」のと「間違えない」というのは等しくないですよ。 わかってて、正しいことができるなら、俺は今頃、億万長者になってる
190 名前:182 mailto:sage [2009/05/24(日) 06:00:14 ] 変なところだけレスして煽りっぽくなってしもうた orz 流してくださいwww >>187 ああ、なるほど、確かに既存のオブジェクトを破壊しないでコピーされる場合は、OKですね。 >>188 メソッドなどで渡された引数とかなるべくdupするわけですか。なるほど。
191 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 06:01:54 ] >>189 いいえ、理解してないんです 「他言語を使いこなす俺がこれごときを理解できていないはずがない」というようにプライドが邪魔をしてるだけです 本当は理解してないのを見なかったことにして「他の言語と違って結構ハマる」と問題を差し替えているのです これは特に目新しい概念というわけでもありません きちんと理解しましょう
192 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 06:27:16 ] むしろ Ruby に慣れると、ほかのスクリプト言語で「同じデータ」を使う必要性が出てきたときに メモリでどういう状態になってるのかがとっても気になる Ruby なら同じものを使い倒してるということが感覚的にわかって安心できるんだけれど
193 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 06:41:45 ] >>190 よく読め dup なんてまずしない しなければならないときはもちろんするが、普通はしないで済む方法を考える 「とりあえず dup」をしないとわけがわからなくなる初心者は dup する、と言ってるだけ いい解説に出会えない独学系初心者の多くが通る無駄道ではあるが、 こんな期間は短いほどいいし、これに嵌る前に回避できれば最高だ
194 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 06:44:59 ] >>182 「copy on write」とかいってる時点でまるでわかってない
195 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 07:51:49 ] >>167 >というように、メソッド内のローカル変数名とそのメソッドの名称が全く同じなのって、ある程度は紛らわしいですよね >できれば避けるべきなんでしょうか? 心配なら変数名を _html とかに変えればオK >>194 ワハハ、その通りだ
196 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 08:09:06 ] 俺は「わかってれば絶対に間違えない」とは思わないな 他言語の経験が短い俺でも、たまにdupし忘れることがある 結局は慣れだろう ただ、時々ではなくて頻繁に間違えるというのであれば、ちゃんと理解できていないのかもしれない 実際に間違えたコード例を晒してもらえれば、もう少し具体的なアドバイスができるかも
197 名前:182 mailto:sage [2009/05/24(日) 08:35:40 ] >>194 うーん?頼む! 2chでよくあるのだけど、「コイツはアホ」とか「わかってない」とか言う時は「何故か」を明らかにしてほしいです。 言っている本人は本当にそうなのか判断できず、煽りかと思ってしまうので。 "copy on write"は書き換えたら、コピーされるという意味の用語です。 この言い方は一般的じゃないのかな? Delphiの組み込みのstringの機能がそう呼ばれているわけなんですが。 (ただ、この辺はけっこうマジック的な扱いで、 Delphiでも文字列と似たような振る舞いをする動的配列では、 copy on writeはしなかったりとDelphiの中でもけっこう戸惑う扱いです) >193 慣れたら、dupしないように書く、ということでしょうか?
198 名前:182 mailto:sage [2009/05/24(日) 08:40:25 ] ああ、でも書いていて思ったけど、 オブジェクトのメソッド呼び出しで copy on write がどうのって確かに変だよなー。 そもそも、組み込み型じゃないん(というよりコンパイラが特別扱いしてない)だし とはいえ、それよりも、 俺が聞きたいのは、どうすれば気をつけられるんでしょうか?ってことなんですが、 その答えは「理解しろ」ってことなんでしょうから、「お前はわかってない」なんていわれるんですよね…。
199 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 08:54:52 ] > どうすれば気をつけられるんでしょうか? 無駄に破壊的メソッドを使わないってだけでいいんではないかと思った。
200 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 09:02:24 ] >>185 が普段使いで必要十分な一般的な理解 これができない場合は無理
201 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 09:10:34 ] オブジェクトと参照の問題ってだけだからな
202 名前:196 mailto:sage [2009/05/24(日) 09:14:13 ] >>197-198 >どうすれば気をつけられるんでしょうか? 実際に間違えてるコードを見ないと、何とも言えないが とりあえず破壊的メソッドと非破壊的メソッドの違いを意識することは大事 あと copy on write に関しては、「Rubyにその概念はない」としか言えない なぜなら 破壊的メソッド → オブジェクトの内容を直接書き換える(オブジェクトのコピーはしない) 非破壊的メソッド → 元のオブジェクトのデータを読んで、それを元に新しいオブジェクトを生成して返す であって、どちらの場合も「書き換えたときにコピーする」という動作はしてないから "abc\n".chomp! # 文字列 "abc\n" の内容を変更する(新しい文字列は生成しない) "abc\n".chomp # 文字列 "abc\n" を元に、新しい文字列 "abc" を生成して返す
203 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 09:15:54 ] ・代入したり引数で渡すだけじゃコピーされないよ ・破壊的なメソッドには大概 ! とか = とか付いてるから目安にして気をつけてね としか
204 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 10:06:47 ] mutableと言いたいんだろcowじゃなくて てかcowは実装の詳細であってプログラマからは掩蔽されるものだ
205 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 10:09:22 ] >>197 きみはもしかしたらcopy on writeについては理解しているのかもしれないけど それがRubyとはまったく関係ないことが理解できてない
206 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 10:13:21 ] インスタンス変数の配列の要素への代入とか、ちゃんと最初にdupなりしておかないと わけわからんようにはなりそうだけどね。
207 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 10:28:53 ] >>206 どっかでの変更がリアルタイムに反映されるなにやら便利な配列として扱うような気もする ともあれ、目的を確定させた上で処理すべきだな とりあえず○○するとかそういうのはありえん
208 名前:169 [2009/05/24(日) 13:03:40 ] >>178 | \ __ / _ (m) _ピコーン |ミ| / `´ \ ('A`) ノヽノヽ くく そうか、子プロセスが終了するまで親プロセスはwait状態になるのか! IO.popen("ruby -e 'sleep(30)'", "w") do |io| p io.puts("my message") #=> nil puts "ok, all finished !" # After a few seconds... p io.close_write #=> nil puts "closed?" end うわー、完全に失念していましたよ。 wait状態だから、実際には IO#.close_write がコールされずに止まっていたわけか。 Threadを生成してやってみたらうまくいきました! 本当にありがとうございましたです。
209 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 14:56:40 ] ちゃうねん。 system(3) とかだと子が終わるのを待つけど、popenは同時に実行するためのAPI。 その例だと、何も読み込まない ruby -e 'sleep(30)' に io.puts("my message") で 書き込もうとして固まってるわけ。
210 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 15:58:43 ] 169の環境はMS-DOSなのかも知れない
211 名前:169 [2009/05/24(日) 16:23:30 ] ピコーン!今度こそわかりました。 IO.popenでafioコマンドにパイプを確立し、IO#.writeで標準入力に読み込ませる。 afio君は標準入力から来たファイル名を開いて、適切なフォーマットで標準出力に吐き出そうとする。 afio「さあバイナリができましたわよ。もらってちょうだい!随時出力するから。」 しかしreadされないため、 afio「なにやってんの!早くreadしてよ。わたしのバッファサイズはそんなに大きくないのよ。 メモリだって有限なんだから。あなたがreadしない限りいつまでもwaitするわ!」 ということなんですね。
212 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 18:00:14 ] 少しお聞きしたいのですが、 railsでrake db:migrateを行うと mysqlが以下のエラーを吐くのですが、 >rake db:migrate (in d:/web/redmine/redmine) == 1 Setup: migrating ========================================================= -- create_table("attachments", {:force=>true}) rake aborted! undefined method `each' for #<Mysql:0x803e550> (See full trace by running task with --trace) これって、MySQL 5.1はWindowsだとダメヨという既知な問題なのでしょうか? xamppごとMySQL 5.1を入れてしまっているもので、MySQL 5.0で上書きしてよいものかどうか・・・ Nabble - RubyOnRails Users - rake aborted! undefined method `each' for #<Mysql: www.nabble.com/rake-aborted!-undefined-method-%60each%27-for--%3CMysql:-td20760472.html
213 名前:212 mailto:sage [2009/05/24(日) 19:08:38 ] >>212 のサイトにあったInstantRailsのlibmySQL.dllを (rubyインスコディレクトリ)/bin に配置したところ、 無事にdb:migrateできました。 5.0のDLLだろうと思うので不安ではあるのですが、様子を見ながら使ってみようと思います。 >The problem is that libmysql.dll shipped with Mysql doesn't play well > with ruby 2.2.. > The solution is to download the libmysql.dll from: > instantrails.rubyforge.org/svn/trunk/InstantRails-win/InstantRails/mysql/bin/libmySQL.dll > and save this in your ruby bin directory ありがとうございました。
214 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 23:12:09 ] pc11.2ch.net/test/read.cgi/php/1241100447/ 【Ruby】Ruby on Rails Part7
215 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 23:24:50 ] 文字列を spl iして、文字種類の境界で分ける方法はありますか。 たとえば x=("abc123+456def").split(/??書き方不明/) とすると x[0]="abc" x[1]="123" x[2]="+" x[3]="456" x[4]="def" みたいにしたいのですが。
216 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 23:44:58 ] >>215 「文字種」の定義次第では可能。