[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/16 20:51 / Filesize : 256 KB / Number-of Response : 901
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 22



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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

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 <<」の右側って任意の式がかけるの?


405 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 11:37:07 ]
ただの特異クラス定義だから、任意の式というか、メソッドを追加したいオブジェクトを返すものを1個書く
class Hoge < HogeBase
は「HogeBaseクラスに以下のメソッドを追加したHogeクラスを作る」という感じなのに対して
class Hoge << hoge
は「オブジェクトhogeに以下のメソッド動作を一時的に追加して便利に使うぞ」という感じ

irb> s = 'nyonyonyo'
irb> class << s ; def hello; puts 'hello!'; end; end
irb> s.hello
hello!
irb> s = nil
irb> s.hello
NoMethodError: undefined method `hello' for nil:NilClass
from (irb):5
from :0


406 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 17:43:46 ]
gemsのライブラリ見ると、シングルトンでこれ使ってるの多いな

module HogeModule
 class << self;
    def application
      @application ||= HogeModule::Application.new
      @application
    end
    def application=(app)
      @applicaiont = app
    end
 end
end

で、
HogeModule.application.run
みたいな感じで使う

407 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 17:44:23 ]
>  class << self;
 class << self

408 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 20:29:39 ]
初心者の質問じゃないですけど、いいですか?

class Foo
 class << self
  def hello; puts "hello"; end
 end
end



class Foo
 def self.hello; puts "hello"; end
end

は、Foo.hello の挙動はまったく同じですけど、内部での仕組みもまったく同じですか?
class << self のほうは、Fooの特異クラスにインスタンスメソッドを追加することで、
def self.hello のほうは、Fooの特異メソッドを定義するという説明になるかと思いますが、
両者はまったく同一のことを行っているという解釈でいいでしょうか。


409 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 20:36:41 ]

  ☆ チン

        ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
          ヽ ___\(\・∀・)<  初心者の質問じゃない質問まだー?
             \_/⊂ ⊂_)_ \____________
           / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
        |  ̄  ̄ ̄ ̄ ̄ ̄ ̄:| :|
        |           .|/


410 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 20:36:43 ]
いいです

411 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 21:39:55 ]
厳密に言うと

class Foo
 class Bar
  def hello; puts "hello"; end
 end
end



class Foo; end
class Foo::Bar
 def hello; puts "hello"; end
end

くらいは違う。




412 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 22:38:52 ]
両者の違いが問題になるようなクラス設計をしてはいけないな

413 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 02:30:36 ]
>>411の上と下って具体的にどう違うの?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<256KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef