1 名前:730 [2008/09/15(月) 17:25:21 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9 は不安定な開発版であり初心者には全く向きません】 【最新安定版の Ruby1.8.7 の使用をお勧めします】 ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。 1.9 の新機能の一部が利用可能なので初学者にお勧めです。 ※ただし十分安定しているとは言えないので プロダクション環境での利用にはお勧めしません。 関連スレやURLは>>2-8 あたりを見てください。Ruby on Railsの質問は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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
304 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 12:13:37 ] バージョンアップ後のフォローを求めるアホもいるので注意 ちゃんと冒頭に「バージョン○○を対象にします」って書いてあんじゃんよ
305 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 15:00:25 ] >>304 今回の select option に限って言えば、どのバージョンでもあるわな
306 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 19:14:46 ] ruby gemsでdescriptionで検索することってできないのでしょうか? gem search --details --both --all hoge とやっても、名前でしか検索ができません。 説明欄も検索したいのですが・・・
307 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:24:06 ] searchは最終的にSourceIndex#searchに処理を委譲してて、 そこでは名前がマッチするモノを探しているだけのようだ。 rubygems/source_index.rbの spec.name =~ gem_pattern and というところ(手元だと272行め)を (spec.name =~ gem_pattern or spec.description =~ gem_pattern) and のように変更すればdescriptionも検索対象にできる。 他にsummaryなども、orで連結して探すようにできるはず。 残念ながら、--detailは出力をkwskするためのオプションだな。
308 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 11:44:41 ] OSはXP Home SP3、Rubyは1.8.6(最終版)です。 以下のプログラムを実行してもうまく動かず、何がいけないのか分からず困っています。 sum =0 puts "点数を入力してください。" a=0 ←なんとなく初期化してみた。あってもなくてもダメ for i in 1..5 print i, "番:" a = gets.chomp sum += a ←ここが鬼門。ためしにforのiにするとちゃんと動く # print a,"\n" # sleep 1 end print "sum=#{sum}" おそらく7行目のsum += aが問題なのですが何がいけないんでしょうか・・・? 助言頂けるとありがたいです。
309 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 11:49:49 ] "うまく動かず"を出し惜しめせずに書けw
310 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 11:51:06 ] sum += a.to_i かな
311 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:07:40 ] >>309 コマンドプロンプトだと1つ目の数値を入れたとたん終了・・・ >>310 できた!thx! getsで入力した数値を文字列だと思ってたのか・・・orz ほんとありがとう、数値ひとつ入力するのに1時間奮闘してた・・・
312 名前:311 mailto:sage [2008/10/02(木) 12:26:45 ] またすぐに聞きに来てごめんなさい・・・orz aを配列にしたとたん動かなくなりました・・・ 実行しても「点数を入力してください」すら表示されず終わります。 sum =0 puts "点数を入力してください。" a[] ←いらなそうだけど一応宣言 for i in 1..5 print i, "番:" a[i] = gets.chomp sum += a[i].to_i end .to_iの使い方がおかしいのかもと思い、その行をコメント化してみたりしましたがうまくいかず・・・ gets辺りで躓いてると思います。 お手数ですがどなたかアドバイスください。 入力で躓きまくってる私はRuby向いてないのかなぁ・・・orz
313 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:34:11 ] sum = 0 ary = [] puts "点数を入力してください" for i in 1..5 print i, "番: " ary[i-1] = gets.chomp.to_i end sum = ary.inject(0) {|a, x| a + x } print "合計: ", sum, "\n"
314 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:37:37 ] どういう勉強の仕方をしてるのか気になる。
315 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:39:51 ] >>312 「実行」って、コマンドプロンプトから ruby hoge.rb とかしてる? 普通はこうなる > ruby hoge.rb 点数を入力してください。 hoge.rb:3: undefined local variable or method `a' for main:Object (NameError) あと入門書嫁
316 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:49:11 ] 本題に関係ないとはいえ一応書いておくが、Rubyでforはめったに使わない 普通はブロックを使う
317 名前:312 mailto:sage [2008/10/02(木) 12:50:02 ] >>313 おお・・・ちゃんと動く・・・ありがとです。 for文の中でsumに足していかないとは・・・! sum周りが初見なんで調べないとですね。 ともあれthxです。 >>314 Cは多少やってたのでCの頃に書いた簡単なプログラムをRubyに書き直してみてるところです。 文法がずいぶん違って躓きまくりです・・・ >>315 いや、「.rb」をそのままダブルクリックで実行してます。 だからsleep入れたりしてすぐに消えないようにしてたり・・・ 基本はRDEで実行してます。 「たのしいRuby 第2版」を参考にしてますが、必要な所だけ探して読んでるのがいけないかもですね・・・
318 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:19:11 ] コマンドライン実行のスクリプトをダブルクリックしてどうする 正常終了でウィンドウ閉じるだろ
319 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:36:57 ] 最後にsystem('pause')入れたりする
320 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:02:52 ] >>317 RDE使ってるなら、プログラムを実行した後 下の出力ウインドウにエラーメッセージとか出てるんじゃないか? それを貼り付けるべし 出ないようならコンソールから実行
321 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:22:57 ] >>318 いやだからsleep入れたりしてるんですが、エラーの時は関係なく終わるんです。 >>319 Rubyの場合はスタンダードライブラリを読み込まなくても使えるんですね。(Rubyには存在しない? 活用させていただきます。 >>320 一応出ますね。以後貼り付けます。 みなさんありがとうございます。またすぐに来そうで心配ですが、その時はよろしくお願いします。
322 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:02:43 ] バッチファイルにしてやればエラーが出てもポーズさせるようにできるよ。 ruby -x "%~0" || pause と書けばエラーが出たときに限ってとまる。 test.bat ruby -x "%~0" pause goto :eof #!ruby put "hello"
323 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:08:34 ] >>322 横からだがサンクス これを.rbに関連付けしておけばよいのか・・・ || でエラー時だけ止まるのかいいな、これ
324 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:15:24 ] rdocで#:nodoc:と指定されてる要素も無理矢理ドキュメント化するような オプションとか方法とかってありますか?
325 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:44:42 ] >>324 そんなのはないから自分で #:nodoc:を消せばいいじゃん cp -pr src1 src2 find src2 -type f | xargs perl -pi 's/:nodoc://'
326 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 01:37:13 ] >>325 なるほど 参考にさせていただきます ありがとうございました
327 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 02:38:35 ] >>325 そこでrubyでもsedでもなくperlかよw
328 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:54:46 ] >>327 1 linerでの置換ならrubyよりperlのほうが便利 sedは-pオプションがない
329 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 12:52:51 ] www.goto.info.waseda.ac.jp/~fukusima/ruby/python-j.html これ教えてもらってpythonから宗旨替えするのを検討してるんだけど 本当にpythonのモジュールが問題なくつかえるの? ctypes boost.python numpy matplotlib PIL が使えるかが一番問題なんだけど
330 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 13:02:03 ] >>329 現在の Ruby は 1.8.7 です
331 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 13:09:37 ] (いろいろとpython側もruby側も追随してないだろうから、やめるのが吉、ってことか...)
332 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:59:38 ] >>329 作者に聞くか、自分で試してみるしかない。 つうか、PerlやPHPならまだしも、Pythonから宗旨替えする理由って何?
333 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:24:32 ] >>332 借りてるレンタルサーバーでRubyは動くけど pythonが動かない railsが便利なら使ってみたい
334 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:30:26 ] >>333 Railsを実用的な速度で使うなら、 別プロセスのサービス(MongrelやFastCGI)か Apache組込のPassengerが必要になる。 レンタルサーバではどちらもできないことが多いので、注意。
335 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:35:41 ] Windowsで、text ディレクトリのテキストファイルに対して start コマンドを使おうと require 'shell' sh = Shell.new Dir.glob("text/*.txt").each do |path| path.gsub!(/\//,"\\") sh.system("start", "#{path}") end というスクリプトを作りましたが c:/ruby/lib/ruby/1.8/shell/command-processor.rb:352:in `find_system_command': Command not found(start). (Shell::Error::CommandNotFound) というエラーが出ます。どうしたもんでしょうか。
336 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:46:08 ] 普通にsystem使ったら?
337 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 22:09:57 ] >>328 sedのデフォルトの動作が -p 指定時のPerlと同じだろ。 おまえさんが言いたいのは -i じゃないのか? でもこれも GNU sedならあるけどね。
338 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 22:12:47 ] >>335 gsub!の置換後の文字列だけどそれでいいのか? あと startはcmd.exe の内部コマンドだからそれだとまずいだろう
339 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:13:37 ] >>337 >おまえさんが言いたいのは -i じゃないのか? その通りだ orz エスパーさんくす
340 名前:デフォルトの名無しさん [2008/10/03(金) 23:40:05 ] nanoc: a Ruby CMS that generates static HTML ≫ home nanoc.stoneship.org/ nanocというRuby製のCMSを使ってみています。 nanoc autocompileコマンド時にhttpdサーバーが立ち上がります。 しかし、ブラウザでlocalhost:3000/ というデフォルトのアドレスにアクセスしても 画像が何故か読まれません。 そこで、autocompileコマンドのソースを追って調べていたのですが、 nanoc: lib/nanoc/extra/auto_compiler.rb@55a1480e2719 nanoc.stoneship.org/hg/nanoc/file/55a1480e2719/lib/nanoc/extra/auto_compiler.rb (ちょうど上記ソース)、255行目の File.read(path) ってもしかして、 Window環境だとバイナリ読めなくないですか? irbで試しましたが、pngを読むと、 irb(main):028:0> a = File.read "gradient-nav-white.png" => "\211PNG\n" みたいになってしまいます。
341 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:58:19 ] >>340 ソース読んでないけど、たぶんその通り UNIX畑の人間が書いたスクリプトには、バイナリモードを考慮してないものがある 最近だとRackでも見た
342 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:00:57 ] nanoc は面白そうだと思ってはいるんだが >>340 読めませんねえ module Nanoc::Extra class AutoCompiler def serve_file(path) [ 200, 'Content-Type' => mime_type_of(path, 'application/octet-stream') }, [ File.open(path,'rw'){|f| f.read} ] ] end end end をスクリプトの前に書いて再チャレンジだ >>341 ある意味とてもカッコ悪いよな
343 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:01:14 ] PNGのマジックナンバーに含まれるEOF文字で止まっているようですね。 バイナリモードのopenを使うように書き換えないといかんのかな。
344 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:03:24 ] なんか足りなかった module Nanoc::Extra class AutoCompiler def serve_file(path) [ 200, {'Content-Type' => mime_type_of(path, 'application/octet-stream') }, [ File.open(path,'rw'){|f| f.read} ] ] end end end Ruby のモジュールの多くは自前のスクリプトの先頭で書き換えることができる きっとこれから何度もお世話になると思うので覚えておくといい けっこう明確なバグ(で、自前で何とかなるもの)が残ってたりするもんだ
345 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:07:32 ] あれ、アクセスフラグrbじゃなくてrwなの?
346 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:10:45 ] rb だな
347 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:16:27 ] msっていつになったらテキストモードをなくすの?
348 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:24:32 ] >>347 Cやれ
349 名前:340 [2008/10/04(土) 00:48:47 ] みなさんありがとう。上手くいきました trap::IO - Rubyリファレンスマニュアル www.sakalab.org/prog-ruby/ruby-man-html-20080121/trap_IO.html > IO.readはファイルを開くときにバイナリモードにしないので、 > バイナリモードの存在する環境でバイナリファイルの読み込みに使うと 内容が壊れることがあります。 これかい!しかし何でこんな罠があるんだ。 罠ってのはバイナリモードじゃなくてIO.readのことだけど。 nanocの作者 mac っぽいし? -----lib/binary_patch.rb----- module Nanoc::Extra class AutoCompiler def serve_file(path) # Build response [ 200, { 'Content-Type' => mime_type_of(path, 'application/octet-stream') }, [ File.open(path, 'rb'){|f| f.read } ] ] end end end ------------------- >>344 参考に、これをサイトデータの lib 以下に放り込んでおくとOK的な。 後でさくーしゃにパッチ投げるか…… しかし、grepかけたら、他にも File.read あったり、 File.openでバイナリモードにしてないところがあるから、 直すところがいくつもありそうw
350 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:18:38 ] これはホントは標準添付の便利メソッドのフリしてバイナリモードガン無視の File.read が悪いんだよね ライブラリ作者はあんまり悪くない(注意不足なだけ) 2.0 では直ってたりするのかしら
351 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:29:27 ] 1.9にはIO.binreadというのがあるようだ。 あと、1.9以降はstdioと絶縁したんだっけか?
352 名前:デフォルトの名無しさん [2008/10/04(土) 01:48:42 ] ついでに別の質問があります。 nanoc で nanoc autocompile コマンド時にhttpサーバーと一緒にブラウザも起動したいのだけど、 httpサーバー起動前にブラウザが立ち上がりきってしまって上手くいかない・・・。 gemにあった launchyで起動させているんだけども、httpサーバー(デフォではThin) 起動後かもしくは、数秒後に起動することはできないでしょうか? 当初はこんなコードです。 require 'rubygems' require 'launchy' module Nanoc::Extra class AutoCompiler alias original_start start # :nodoc: # Boot web browser before original start def start(port, handler_name) port ||= 3000 Launchy.open("localhost:#{port}/ ") if defined?(Launchy) original_start(port, handler_name) end end end
353 名前:デフォルトの名無しさん [2008/10/04(土) 01:51:50 ] で、Threadを使ってみようとしたんだけどもネイティブスレッドじゃないせいか 上手くいきませんでした。何かよい方法はないものでしょうか? def start(port, handler_name) port ||= 3000 t = Thread.new do Sleep(3) Launchy.open("localhost:#{port}/ ") if defined?(Launchy) end original_start(port, handler_name) t.join end
354 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 02:37:21 ] >>352 while (3000ポートに接続できない) sleep(1) # 1秒待つ end
355 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 02:44:59 ] >>335 WindowsでRubyならWIN32OLEで一択. require 'win32ole' fso = WIN32OLE.new('Scripting.FileSystemObject') shell = WIN32OLE.new('WScript.Shell') Dir.glob('text/*.txt').each do |path| shell.Run(fso.GetAbsolutePathName(path)) end 下記記事も参照すると吉 ttp://jp.rubyist.net/magazine/?0004-Win32OLE
356 名前:352 [2008/10/04(土) 02:52:37 ] >>354 どうも original_start() でキー入力待ちになってしまうのです。 sleepするところだけメインと平行して走らせることができないかな、と思ったしだいです。 gemにあった win32-thread もつかって見ましたが、 > nanoc autocompile win32 thread mode (rubyパス)/lib/ruby/gems/1.8/gems/launchy-0.3.2/lib/launchy/b rowser.rb:25: [BUG] cross-thread violation on rb_thread_schedule() ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. とか出るしダメポ……
357 名前:デフォルトの名無しさん [2008/10/04(土) 02:53:16 ] >>355 「全部WSHで書けばいいじゃん」って思うよね? うん,俺もそう思う. Jscriptとかも使ってみると意外と便利なんだよなぁ.
358 名前:352 mailto:sage [2008/10/04(土) 02:57:28 ] 深夜に何度もすいません。 キー入力待ちでもsleep後に平行してブラウザが起動してくれました。大丈夫でした。 httpdの起動が遅いせいか、どうもタイミングが悪かったようです。 >>354 を実装してみたいと思います。ありがとうございます。
359 名前:352 mailto:sage [2008/10/04(土) 03:33:52 ] # Boot web browser before original start def start(port, handler_name) require 'open-uri' require 'resolv-replace' require_gem('launchy', true) port ||= 3000 t = Thread.new do uri = "localhost:#{port}/ " loop do begin exit_loop = false open(uri) do |f| puts "Eureka #{uri} !"; exit_loop = true end break if exit_loop rescue end sleep(1) end puts "Launching browser..." Launchy.open(uri) if defined?(Launchy) end original_start(port, handler_name) t.join end >>354 をこんな感じで行けました。 もっと短くかければよかったのですが。
360 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 04:06:35 ] テキストモードとか意味不明。 ただこういうバグを生むために存在するとしか考えられん。 まあでもそういうのを考慮する環境がクライアント機では90%以上を占めてるので仕方ないか。。
361 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 04:10:20 ] だからCやれって テキストモードが生まれたわけがわかるから
362 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 04:35:54 ] >>361 Cは平素より使用しているが、どうしてテキストモードなるものが存在する必要があるかは理解できない。 ここで、「ググレ」やリンクを貼る行為ではなく、あなたの言葉での説明希望。
363 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 07:12:40 ] ちゃんとした文責のある文章を拒否して、名無しさんの言葉だけ求めるってw 「知りたい」んじゃなくて「追い込みたい」のが丸わかり。 土曜の早朝から何を厨臭いことを。
364 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 07:17:11 ] 隔離スレにお帰り
365 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 08:31:49 ] むしろCのstdioがマシンごとに改行の内部表現が異なることを意識して テキストモードとバイナリモードを用意して抽象性を確保してるんだから UNIX使いもちゃんと使い分けろって話になりはしないの?
366 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 09:50:05 ] >>363 煽るだけならCスレへお帰りください
367 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 10:23:42 ] >>362 >Cは平素より使用しているが、どうしてテキストモードなるものが存在する必要があるかは理解できない。 たんに、プラットフォームによって改行を表す記号が違うので、それを隠蔽して互換性を確保するモードを用意しただけ。 >ここで、「ググレ」やリンクを貼る行為ではなく、あなたの言葉での説明希望。 ほんとにCやってるなら、このくらい分かるだろ。 まずは「教えてください」という言葉を覚えような。
368 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 11:01:03 ] >>367 >まずは「教えてください」という言葉を覚えような。 お前は文章に「教えてください」って文字列が入ってないと納得できない正規表現脳なのか
369 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 11:10:12 ] デジタルリサーチとAppleのせいってことで終了にしとけ。 ttp://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89
370 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 12:46:31 ] >>365 普通UNIX使いは改行記号がが\nのとき、\r\nのとき、\rのときそれぞれを考慮したコードを書きます。 なぜならUnix使いはおそらくwindowsをはじめとする他の環境を触ったことがあり、 それらで改行がどう表現されるかを知っていて、 かつbフラグは無視される環境であることがほとんどだから。 >>367 だからね、それは「テキストモードが必要な理由」にはならないんだよw なぜなら普通は上に書いたようなことをやるから。 あれば便利かと思って作ったんだろうが、現状むしろあることのほうが害。バグの原因になる。 こんぐらい少し考えればわかるだろwww
371 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 12:56:18 ] >>368 その文字列を探す様子をたとえるのに、正規表現はないだろう。
372 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:09:55 ] pc11.2ch.net/test/read.cgi/tech/1221967332/87 こいつ何言ってるの?
373 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:21:33 ] >>370 >普通UNIX使いは改行記号がが¥nのとき、¥r¥nのとき、¥rのときそれぞれを考慮したコードを書きます。 書かない。ふつうは printf("foo¥n"); としか書かない。printf("foo¥r¥n") なんて書くわけない。 本気でそんな主張をするなら、世の中のUNIX用ツールで改行コードを使い分けているソースの例を挙げて、 それが一般的であることを示してくれ。 >なぜならUnix使いはおそらくwindowsをはじめとする他の環境を触ったことがあり、 触っただけで、自分のコードにそこまでの移植性を考えるわけない。 たとえばUNIXとWindowsではパス区切り文字が違うが、それを考慮しているコードは多くない。 改行コードの違いなんか考えるわけがない。 >それらで改行がどう表現されるかを知っていて、 >かつbフラグは無視される環境であることがほとんどだから。 bフラグを無視するのはUNIX系だけでは? Windowsでは無視されないんだから、「bフラグは無視される環境であることがほとんど」なわけがない。
374 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:27:07 ] >>372 お前の存在をズバリ言い当ててるのでは?
375 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:50:17 ] >>373 >それが一般的であることを示してくれ。 まあ\rは無視することもあるな、Macだけだし、はっきり言っておかしいから。 出力は、自分の環境で動けばいいから(移植するときに考えればいい)printf("foo\n")でもいい。 外部に出力する場合は規格通りにすればよい。 当たり前だが、問題なのは出力よりも入力。なぜならどのようなデータがくるか分からないから。 ここで注意すべきなのは、ただ単に改行までシークする場合は \nと\r\nは改行位置を捜すのに両方\nを捜せばいいから問題にならない。 よって、考慮はしているがそれが実際にコード上に現れないことも多い。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ しかし、考えなければならない事もある、たとえばhttpの改行は\r\nである必要があるが、 \nである環境もあるかもしれない。例えば、Httpのヘッダとボディ部を分けるのは "\n\n"と"\r\n\r\n"の両方の可能性がある。 (規格上は後者のみ正しいが、もしかしたら前者の可能性もあるかもしれない。) よってその場合には分けた処理が必要になる。実例として、MPlayerの MPlayer/stream/http.cのhttp_is_header_entire()。 wgetのhttp.cなどを参考にしても、もし改行が\nの場合、\r\nの場合両方とも正しく処理できるように なっている様がわかる。 でもそれが一般的である証明なんて誰にもできませんよ。もちろん一般的でない証明もできません。 >改行コードの違いなんか考えるわけがない。 考えなければならない時は考えるほうがよいです。考えないとバグの原因になる可能性がありますので。 >「bフラグは無視される環境であることがほとんど」なわけがない。 Unix使いは、って書いあるじゃんwwwww なんで同じ文の中に書いてあって前提が途中で変わっちゃうのwwwww?
376 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 14:08:35 ] この場合、「一般的であることを示す」のは至難の業だわな。 いったい何百例出せばいいのかと(数例で納得するのは逆におかしい)。 それでいて、いかにも「正当な要求をした俺と、応えられないコイツ」的な構図が 出来上がるから、まぁ、ある種の人間はこの質問をすることを凄く好むんだよね。 「知りたい」んじゃなくて「追い込みたい」のが丸わかり。 土曜の昼に何を厨臭いことを。
377 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 14:46:13 ] >>376 久々に切れのある内容のスレを見た。 尊敬する。 あなたの言うとおり!!
378 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 16:17:01 ] >>376 なに語ってるのか知らんけど、 >普通UNIX使いは改行記号がが¥nのとき、¥r¥nのとき、¥rのときそれぞれを考慮したコードを書きます。 なんておかしなことを書いてあるから、それが「普通」である根拠を示してくれといってるだけ。 答えられないならでしゃばんなよ。
379 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 16:20:17 ] IDの出ないスレは自演が楽だな。
380 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 16:21:10 ] >>375 >wgetのhttp.cなどを参考にしても、もし改行が¥nの場合、¥r¥nの場合両方とも正しく処理できるように >なっている様がわかる。 wget はネットで使うんだから、どちらにも対処できるようにするのは普通だろ。 それこそunixもwindowsもmacも関係ない話。 これをbフラグの話で持ち出すほうがおかしい。
381 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 16:46:28 ] >>378 > なに語ってるのか知らんけど、 知らんまま反応した当然の結果として、まるで的外れだから、「知る」までは黙ってていいよ。
382 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 18:34:37 ] unixはバイナリモードしかなくても、改行コードがファイル毎にバラバラでも テキストを問題なく扱えるし、windowsでも当然可能 # 可能にしてるのはライブラリやアプリケーション、だけど問題はそこじゃない 不必要なテキストモードを残しているばかりに>>340 の様な問題が起こる appleがOSXでCRを捨てたようにwinもさっさとテキストモードを廃止してほしいもんだ
383 名前:340 mailto:sage [2008/10/04(土) 19:03:40 ] なんか、俺のせいで半荒れ?でスマナイ 俺はネイティブ言語はDelphiくらいしかつかわないけど、 テキストモードとかバイナリモードなんて意識したことない。 File.readのテキストモードとかの区別って結局どこから来てるんですかね?
384 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 19:25:51 ] >>383 Rubyを作るときのCの…えー、WindowsのCライブラリから来ている 結局としては、テキストであるという判断をどの層で誰がやるかという話に過ぎない
385 名前:352 mailto:sage [2008/10/04(土) 19:33:12 ] >>384 そっか、C言語のライブラリのせいなのね・・・
386 名前:340 mailto:sage [2008/10/04(土) 19:36:58 ] ん?レス番残ってた 340です。
387 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 19:42:25 ] 1.9はstdioを捨てたと聞いたが、そうするとテキストモードに関する 状況は変化するの?
388 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 18:24:44 ] >>387 ユニバーサルニューラインが入ってる。 www.garbagecollect.jp/~usa/d/200808c.html#id20080825_P1
389 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 19:15:07 ] >>388 > "r"なら、"rt"と"rb"のどちらの扱いになるかはプラットフォーム依存。 > とりあえず、いわゆるUNIXなら"rb"と同様に、mswinやmingwなら"rt"と同様になる。 ちょw 問題解決されてなくないですか?
390 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 19:17:52 ] ああ、違うのかな? 前みたいに適当に"r" だけだとどっちにしろ環境依存になるから、 バイナリかテキストかを意識しなくちゃいけないわけか
391 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 20:19:17 ] テキストだとエンコーディングも意識する必要があるしのう。 文字=バイトで凝り固まった外人どもよりはこのへん日本人は意識しやすいだろうけど。
392 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 00:31:26 ] >>389 本質的に問題なのはテキストモードを区別するという慣習だから、 Rubyだけで解決できる性質の問題じゃない。 Windows全体で「CRLFを使うのはやめよう」という流れにならない 限り解決しようがない。
393 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:51:56 ] 結局いつものRubyが糞なのが根源的な原因だけど対応するのが面倒だから 個々の環境(というかいつもWindows狙い撃ち)で対応しやがれというお話ですね。
394 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:00:53 ] 俺の場合、Windows(つかSJIS/CP932)一辺倒の頃は むしろ「LFなんて糞、CR+LFに統一しる」と思ってた 今はそうでもないが、昔の俺以外にもそう思ってる奴は居るかも
395 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:31:20 ] ラインをフィードしただけで「行の先頭」に行くUNIXは変 キャリッジをリターンしただけで「次の行」に行く旧Macも変 「カーソルを行頭に戻してから行を送る」というCRLFを具現したWindowsが意味的に妥当 とは思う っていうか電脳化した時点でCRLFという概念作っとけよもう 何が悲しくてコンピュータでタイプライタのエミュレーションなんぞしなければならんのか
396 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:38:48 ] SJISが普通に使われるWindowsでは2バイトあった方が誤読しにくい
397 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 08:21:28 ] >>395 それは端末を中心に考えているから。だから「行頭に戻る」と「次の行に移動する」をわけて考えてしまう。 UNIX作ったひとはテキストを扱うことを考えてて、それでテキストの「行末」が欲しかっただけだから、 それを1文字で表現したことは、そんなにおかしな話ではない。
398 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 10:46:45 ] CP/Mの呪縛? EOFとかCR/LFとか
399 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 11:10:10 ] read() より下のレイヤであれこれやる Windows が変、ってことで
400 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 12:31:57 ] >>394 統一しる!までは思わんがw どっちかというと、UNIXとかの人にバイナリで読む時とかちゃんと、"rb" つけてくれ!頼む!って感じ。 いろんなソースいじっていると本当にそう思うw
401 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 12:33:07 ] なーーんか、そろそろRuby本スレみたいな雰囲気で 初心者さんが質問しにくくなってきている気がするので移動しませんか?w
402 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 17:10:17 ] s = "s = 'abcde'"; p s; eval(s); p s を実行すると↓のようになります。 "s = 'abcde'" "abcde" eval の中の変数をローカルにするには、eval(s) の代わりに eval("def tmpfunc() #{s} end; tmpfunc") などとするしかないでしょうか? 関数持ちだすのもなんかアレな気がして…
403 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 17:20:59 ] sandbox_binding = (class << Object.new; binding() ; end) s = "s = 'abcde'" p s # => "s = 'abcde'" eval(s, sandbox_binding) p s # => "s = 'abcde'" なんか汚してもいいBindingでevalするのはどうでしょう
404 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 09:05:04 ] >>403 > class << Object.new こんな書き方できるんだ... 「class <<」の右側って任意の式がかけるの?