1read 100read
2012年4月プログラム5: Ruby 初心者スレッド Part 48 (947) TOP カテ一覧 スレ一覧 2ch元 削除依頼
【マック】Macintoshプログラミング質問箱 (479)
PureBasic (130)
【bzr】Bazaarでバージョン管理 Rev 3 (887)
EAを語るスレ (227)
【】configure大嫌い【RMS】 (491)
iモード携帯電話用Java(iアプリ) Part22 (817)

Ruby 初心者スレッド Part 48


1 :12/02/08 〜 最終レス :12/05/05
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
前スレ
Ruby 初心者スレッド Part 47
http://toro.2ch.net/test/read.cgi/tech/1322819329/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/

2 :
【RoR】Ruby on Rails Part13
http://kohada.2ch.net/test/read.cgi/php/1320393984/
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://hibari.2ch.net/test/read.cgi/tech/1155031689/
書籍:ほぼ公式
「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」 (プログラミング自体が初めてでない人向け)
http://www.amazon.co.jp/dp/4797357401/
「初めてのRuby」 (同上)
http://www.amazon.co.jp/dp/4873113679/
書籍:紙のマニュアルに相当
「Rubyレシピブック 第3版 303の技」((脱)初心者向け基礎テクニック集、1.9対応)
http://www.amazon.co.jp/dp/4797359986/
「プログラミングRuby 第2版 言語編」(初心者向け参考書)
http://www.amazon.co.jp/dp/4274066428/
現在、1.8 系列の最新である Ruby 1.8.7 と 1.9 系列の最新である Ruby 1.9.2 の2系統が存在
肝心な部分がわりと違い、プログラムはそのままでは動作せず、予備知識も別個。両対応させるには相応の追加記述が必要
1.9.2 用の教科書があるなら 1.9.2 から始めても構わないが、1.8 用のスクリプトやライブラリは 1.9.2 では動作しないので注意
Windows用Rubyは、Ruby以外のものもあらかた入っているActiveScriptRubyと
http://www.artonx.org/data/asr/
RubyだけインストールされるRubyInstallerの2種類存在
http://rubyinstaller.org/downloads/
何が必要なのかわからない人はとりあえずActiveScriptRuby使っと毛
chm(HTMLヘルプ)式のダウンロードできるマニュアルが便利
http://www.ruby-lang.org/ja/documentation/

3 :
最新の安定版であるruby 1.9.3-p0が各ミラーサイトから入手できます。
[ tar.bz2 | tar.gz | zip ]
ダウンロード
http://www.ruby-lang.org/ja/downloads/

4 :
・ いつものエディタとターミナルという普段着でお越し下さい
・ エディタ初めてならRubyスクリプトをを着色してくれる(できればオートインデントの)エディタ好きなの選べ
・ いわゆるIDEはRubyの学習に際しては恐ろしくコスパが悪いのでRubyのためだけに新規導入するのはお勧めしない
Q. XXX を使ってるんですが Ruby も覚えたほうがいいんでしょうか?
A. 好きにしろ

5 :
      ,―ヽ_(((((_、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    IPA Rubyスレにようこそ
      i、  \   ./  /
       \   ーー   ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |

6 :
>>1
ようやく立ったなw

7 :
ファイルのエンコードがUTF-8のとき前提で
Shift_JISとEUC-JPをUTF-8に変換する定式コードを教えてください
ググってもいろいろあるみたいでどれが定番なのか分かりません

8 :
Ruby1.9.3です

9 :
変換できない文字があったときにどうなって欲しいのかで書き方が違うのだな
あと1.8.7でも動作する書き方とか

10 :
1.8.7は切り捨てますのでruby1.9.3で動けば問題ないです
変換できない文字が出てもエラーにならなければ問題ありません

11 :
require 'kconv'
'にほんご'.toutf8

12 :
>>11
この方法で今後は統一します

13 :
勉強用に貯めてきたサンプルを読み返したら
ファイルの先頭にこう書いてありました
#!ruby -Ks
これはなんですか?

14 :
http://www.rubylife.jp/ini/japan/

15 :
理解しました

16 :
# -*- encoding: utf-8 -*-

# coding: utf-8
の書き方の違いは何ですか?どっちも同じですか?

17 :
Rubyからは「最初のほうに"coding: なんとか"という文字列が書いてあるコメント行がある」という点でどっちも同じ
上で書くとEmacsがUTF-8で書かれたファイルだと解釈する

18 :
意地でも>>16のどちらも書きたくない場合
コマンドラインオプションとかで同等の効果をもたせる方法ないんですか

19 :
コマンドラインからコードを書きたいのですがどうやるのでしょうか?
例えば p 1+1をコマンドラインに書いて実行したいのです
わざわざファイルに書いてから実行するほどでもないような計算するのが目的です
環境はWindows Ruby1.9.3です

20 :
irb使え

21 :
irbで出来ました!
rubyって打ってもそういうモードにならなくて「ruby コマンドライン」でググってもでてこなかったのであきらめるところでした

22 :
ちなみにruby -e 'p 1+1'でもいける

23 :
>>22のやり方は、ワンライナー(one liner)と呼ばれているね

24 :
str.gsub!(/aa(\d+?)aa/, "bb#{$1}bb")
こういうことをやりたいんですけど、どうやったらうまくいきますか?

25 :
すみませんこうですね。。
str.gsub!(/aa(\d+?)aa/, 'bb\1bb')

26 :
s='foo.bar'
t='foo.baz'
で先頭から共通する文字列'foo.ba'を取得するうまい方法って無いですか。
ループで一文字ずつスキャンするしかないですかね。

27 :
windowsでsystem('dir')の返り値を変数に入れる方法を伝授してください

28 :
>>26
結局はループしてるんだけど、文字列2個程度なら
>> t.chars.with_index.take_while{|c,i| c == s[i]}.map(&:first).join
=> "foo.ba"
とか
>> t.chars.zip(s.chars).take_while {|e| e[0] == e[1]}.map(&:first).join
=> "foo.ba"
とか
本格的にやるならtrie木について調べるといいと思う。

29 :
メインphp使いですけどrubyってコード記述量少なくていいですね

30 :
まつもとゆきひろ「public static void mainなど、コンピュータに伝える約束事が多くて、
やりたいことが頭の中から逃げてしまう。簡潔さは力なのです(中略)
“実行可能疑似言語”と呼ばれる何言語でもないコードが示されることが多い。
それはPascalもどきとか、Algolもどきで書いてある。
もどきといっても、アルゴリズムをちゃんと記述できている。
だったら、それを理解できる言語を作ればいいじゃん、ということで、ある意味、それがRubyの目標です」
「ソフトウェアは工業製品ではない」、Rubyのまつもと氏が講演 − @IT
http://www.atmarkit.co.jp/news/200904/10/matz.html
2009/04/10
メタ言語のことで、一般にBNFやBN記法と略される
バッカス・ナウア記法 − Wikipedia

31 :
CGIの動作をWindowsのコマンドラインからテストするために簡単なスクリプトを書いています。
・呼び出し
ruby -w foo.cgi param1=hoge method=GET
・パラメータ受け取り(GETリクエストをシュミレーション)※一部略
ENV['QUERY_STRING'] = ARGV.join('&')
あとはcgi.rb任せです。
ですがcgi.rbがSTDINからパラメータを受け取る場合(POST)
どうやってセットしたらいいのでしょうか。

32 :
cmd.exeってheredocはないんだっけか。
標準入力に食わせたいだけなら
type post_data.txt | ruby -w foo.cgi ...
でいいんじゃないの?
※そういえば、CGI.rb を使っているスクリプトを直接端末から起動すると
パラメータを受け取るモードになる機能があったような。

33 :
そうなんだけど標準入力とクエリ文字列両方同時に扱うにはひと手間かかったような
% ruby -rcgi -e'cgi=CGI.new;p cgi.params'
(offline mode: enter name=value pairs on standard input)
a=1&b=2
{"a"=>["1"], "b"=>["2"]}
% echo x=3 | ruby -rcgi -e'cgi=CGI.new;p cgi.params'
{"x"=>["3"]}

34 :
utf-8で保存したrbファイルの先頭に
#!ruby -Ks
って書くのと
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
って書くのどちらがよいですか?
Windows ruby1.9.3です

35 :
>>32-33
大変参考になりました。cgi.rbにあらかじめそのような機能がついていたとはorz
CGIスクリプトは今どきのRESTfulな感じで、リクエストメソッドを意識した作りでしたため
cgi.rbのオフラインモードではENV['REQUEST_METHOD']に値が入らず、うまくいきませんでした。
作成中のコマンドライン用追加スクリプトの段階で(cgiインスタンス作成前に)
ENV['REQUEST_METHOD']に値を入れると、パラメータが無効になってしまうようでした。
そこで以下のように起動し(-dオプションを追加)
ruby -w -d -rcgi foo.cgi
(offline mode: enter name=value pairs on standard input)
param1=hoge&method=post
cgiインスタンス作成後に以下のコードを入れておくことにしました
ENV['REQUEST_METHOD'] ||= (@cgi['method'] ? @cgi['method'].upcase : 'GET') if $DEBUG
ぎこちない感じではありますが、ともあれこれでテストを進められそうです。
ありがとうございましたm(_ _)m

36 :
Class.new で作ったクラスオブジェクトに名前を付ける方法ってどうするの?
c = Class.new
p c.name #=> nil
c.name = 'Foo' はだめだった

37 :
>>36
http://doc.ruby-lang.org/ja/1.9.3/class/Module.html
のModule.newを見れば分かると思うよ

38 :
>>37
ありがとうございます。
ということは、動的に名前をつけたい場合はevalするしかない?
c = Class.new
name = "Foo"
eval "#{name}" = c"

39 :
Module#const_set辺りでどうにかなんないかなー検証してないけど

40 :
const_setでおk

41 :
@で始まる変数が何か分かんないので質問します
class Cls
 def self.foo
  @var = 'varrrrr'  ### この@varは何変数なんでしょう?###
 end
 def bar
  @var  # nil
  @@var # NameError
  self.class.var # NoMethod
  Cls.var   # NoMethod
  Cls.instance_variable_get(:@var) # == OK! ==
  Cls.class_variable_get(:@@var)  # NameError
 end
 def self.baz
  @var # OK
 end
end
@varはClsクラスオブジェクトのインスタンス変数か、あるいはClsの特異クラスの
インスタンス変数なのでしょうか?だとして、それはClsのインスタンスから見ると
一体何なんでしょう

42 :
たとえばこんなSingletonモジュールがあったとして
module Singleton
 def self.included(cls)
  cls.instance_eval do
   def get_instance
    @instance ||= new
   end
   private_class_method :new
  end
 end
end
これはオブジェクトの関連からはどう説明すればいいんでしょうか
インスタンスをクラスオブジェクトに突っ込んでいるように見えるのですが…
evernoteに生のタコを突っ込んで保存するようなものではないのでしょうか

43 :
@が1個ついてるんだから、インスタンス変数
で、 def self.メソッド名 の中で定義されてるから、
そのクラスを表す、Ruby 組み込みクラスである Class クラスのオブジェクトに属する(=Classクラスのインスタンスに属する)インスタンス変数
class C; end
p C.class #=> Class ← これ
最近はこのインスタンス変数がしょっちゅう使われてて、呼び名がないと説明に困るというので、
「クラスCのクラスインスタンス変数」という呼び方が他の言語から借りて使われてる
ただのインスタンス変数なので、クラスのオブジェクト部分でいわゆるアクセサメソッドを自作するか、
class C << self
attr_reader :var
end
クラスのオブジェクトに対して instance_variable_get/set しないと利用できない
で2、クラスメソッド(=クラスオブジェクトに属するインスタンスメソッド)の定義を def self.hoge のようにドットつきでしてる人であっても、
クラスインスタンス変数のアクセサを作るときは
class クラス名 << self
インスタンスメソッドな書き方
end
という再オープン記述を使うことが多い

44 :
>>41-42
>@varはClsクラスオブジェクトのインスタンス変数
です
>インスタンスをクラスオブジェクトに突っ込んで
ます
その理解であってる
呼び方は「クラスインスタンス変数」(smalltalk起源?)
普通にインスタンス変数だからインスタンス(Cls自身)以外からは見えないので
Clsのインスタンスがどうとか気にする必要は無い
class Cls
@var = 'クラスインスタンス変数'
def initialize ; @var = 'インスタンス変数' ; end
def var ; @var ; end
def self.var ; @var ; end
end
puts "Cls.new.var は #{Cls.new.var} です"
puts "Cls.var は #{Cls.var} です"

45 :
Emacsなんかでは「UTF-8として有効な文字」はそのまま、
「UTF-8に含まれてなさそうなコントロールコードや不完全なバイナリの連なり」は^@みたいな表示で着色されて表示されます
これと似たような処理(をするための振り分け)はどうしたらいいもんでしょう
コントロールコードっぽい配列と、UTF-8っぽい配列の2つに分けたいです

46 :
そういうのは簡単にしようと思ってコントロールコードでsplitとかするとたいてい失敗するよ
UTF-8にマッチする正規表現でscanとかsplitして、マッチしないものを「コントロールコードその他」にするとうまくいく

47 :
HTTPのライブラリの定番てなんですか?
いろいろ試してみたいのですがnet/httpとnokogiri以外にありますか?

48 :
require 'open-uri'

49 :
HTTP のライブラリだってのに Nokogiri 入ってるのってなんでじゃらほ
Web から HTML やファイルとかを取得したいのなら、標準の Net::HTTP
HTML から正規表現じゃなく HTML 構造を頼りにテキストデータを取り出したいのなら、gem の Nokogiri
上記2つが融合したもので、リンクをクリックしたりしてページアクセスもできるのが、gem の Mechanize
libcurl と呼ばれる巷では定番の外部ライブラリを利用することでネットアクセスを実現してるのが、gem の curb
好きなの使え

50 :
>>48-49
ありがとうございます
シンプルにやりたいときはopen-uriかNet::HTTP + Nokogiri
便利屋になるならMechanize
並列でアクセスさせたいときはcurb
を使います
とりあえずopen-uriが一番シンプルだったのでここからcurbまでサンプル作って覚えてみます

51 :
読み込んだライブラリのクラス名を取得方法を伝授してください
例えばrequire "date"だったらDateとDateTimeの2つのクラス名が知りたいです

52 :
それは無理
$LOAD_PATHからdate.soかdate.rbを探してクラス定義を正規表現で探せばできるけど、それほど完全でもない
というか、それが必要になることはないはず
衝突の回避はユーザーに任せろ
完全初心者が使ってることを前提にするのはやめよう

53 :
まじすか諦めます

54 :
たびたびすいません今質問したものです
質問1
マニュアルの見方を教えてください
http://doc.ruby-lang.org/ja/1.9.3/library/index.html
このページのライブラリ名は全てrequire "〜"にそのまま書いていいようになってますか?
質問2
クラス名からメソッド一覧を取得したいので
p Dir.methodsって書いて表示できたんですが
例えばhttp://doc.ruby-lang.org/ja/1.9.3/class/Date.html
特異メソッドとインスタンスメソッドを別々に取得して表示させる方法はありませんか?

55 :
マニュアル読め
とループ回答
>>54
ひとつめYES
スラッシュ「/」や大文字もそのまま書く
irb> require 'english'
LoadError: no such file to load -- english
irb> require 'English'
irb>
ふたつめ
ttp://doc.ruby-lang.org/ja/1.9.3/method/Object/i/singleton_methods.html
ttp://doc.ruby-lang.org/ja/1.9.3/method/Module/i/instance_methods.html
このマニュアル、一覧ページにアンカーがないから使いにくいなあ
irb> require 'date'
irb> p Date.singleton_methods(false)
[:_strptime, :_parse, :_iso8601, :_rfc3339, :_xmlschema, :_rfc2822, :_rfc822, :_httpdate,
:_jisx0301, :julian_leap?, :gregorian_leap?, :leap?, :new!, :valid_jd?, :valid_ordinal?, :valid_civil?,
...
irb> p Date.instance_methods(false)
[:strftime, :asctime, :ctime, :iso8601, :rfc3339, :xmlschema, :rfc2822, :rfc822, :httpdate,
:jisx0301, :ajd, :amjd, :jd, :day_fraction, :mjd, :ld, :year, :yday, :mon, :mday, :month, :day,
...

56 :
>>43,44
ありがとうございます
ぐぐりやすくなって捗りました
 

57 :
>>51
require前後でObject.constants比べてみたりClass#inherited書き換えてみるとか?
全然完全じゃないけど
class Class
 def inherited(sub)
  puts "#{sub} < #{self}"
 end
end
before = Object.constants
require 'date'
p Object.constants - before
Dateの方は元々定義されてるしどちらの方法でも検出できないなぁ
Module#method_addedとかも見ておけば一応いけそう?

58 :
やっぱ時代は1.9.3だよな
1.8.7厨は労外w

59 :
大江戸RubyKaigiでhttpライブラリを比較する発表があったっけ。

60 :
end書きたくないからほとんど{}で囲ってるんだけどそうするとifのendが目立ってしょうがないお

61 :
デフォルトを end にして、 File.open とか重要なブロックだけ
{}にして目立たせる流派はあったと思うが、逆はちょっと無理があるんじゃないの

62 :
>>61
やっぱそうか・・・クラス定義とか関数定義とかみんなendだもんな
rubyやる人はブロックの変数を|で囲うのも抵抗なかったの?めっちゃ違和感あるんだけど

63 :
a = [1,2, 3, 4, 5]
a.each do |b|
puts b*b
end

64 :
smalltalkerだったので||自体には違和感なかったな。

65 :
>>63
チョコのお返しにいくらかかるか計算してるんですね。わかります

66 :
>>62
Ruby文法をしっかり読んだわけじゃないが、
| が無いとブロックの外側を参照している変数と区別がつかなくなるんだと思う
かといって、他の言語で何か素晴らしい表記法があるかというと
微妙な所で。引数に\付けたり()でくくったり、いろいろ書き方はあるけど
| より明らかに良いと言えるほどでも……

67 :
バイナリファイルのデータを読みだして、
イテレータで値を出力しようと思ったのですが、
データが化けてしまいます。
以下の@なら問題なし、Aだと化けます。
どうしてでしょう?
f = File.Open("hoge.dat", "rb")
data_array = f.Read(16)
# @ 問題なし
for i in 0..15
print data_array[i]
end
# A文字が化ける
data_array.each{ |num|
print num
}

68 :
>>67
X data_array.each{ |num|
O data_array.each_char{ |num|

69 :
>>68
できましたー。ありがとーです。

70 :
>>55
>>57
理解しました

71 :
>>67
Ruby1.8だと思いますが
data_array[i] は、文字列のバイト位置の1バイトの数値表現

each メソッドの ブロック引数は、文字列を改行直後で分割した一行分の文字列
と、得られるものが違います
each_charは、文字列を文字単位で分割した一文字
と、これまた違うのですが
理解の方は大丈夫でしょうか?
さらに、each_charは$KCODEの影響を受けてそのサイズが変わりますよ
お望みの機能はeach_byteだと思われますが

72 :
Ruby 1.9以降では
data_array[i] のように文字列を添え字アクセスしたものは
バイト位置の数値ではなく、文字単位の位置での一文字が得られます
また、文字列のeachメソッドはなくなりました
1.8と1.9の非互換な部分です
文字列のeachの代わりには
each_char、each_line、each_byte、each_codepointなどを使います

73 :
                        r_‐、_
                    _, -ー::L._.」‐-、` 、
                /‐ '´ ̄ ̄ ̄`¨ヽ:::丶ヽ
              /  ,        ,  \:::ヽヽ    ヘ
            r./  /|/',   /l/ |    i::::||
       へ    L| /   ',/     l/|   !:厶l    |
           /∨ ○       ○  /  l下、_〕_.  |
       |      /              /  i !__ト、
       |      !     ┌┐    'イ  /   l
              丶、._  ̄ ___/ /     l
                  l/!  ̄r::t水ァ::j/     ',
                   /r――――i::::K   ト、 ヽ
                  ムf」       「ヽ::i、 |\! \ |
                  __j」 2  ヘェ ヽ、|」_ヽ_    ヽ
            r┐≧:|_____!::::::::::::::::/
            l___!L.-i_i⌒!-」、|\::::::::ヽ _
                     └‐ '´     ̄ ̄

74 :
RubyのスレッドモデルはGILとのことですが、
http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF%E3%83%AD%E3%83%83%E3%82%AF
このwikiの説明を見ると、
同時に実行できるスレッドは常に一つだけ、と読み取れます。
つまり一つのプロセスの中ではスレッドが平行して実行されないと。。これって何のためのスレッドなんですか?

75 :
ネットからデータを読みこんだりしているときに
他の作業ができるでしょ

76 :
マルチスレッドの目的は2つあってひとつはマルチCPU、マルチコアを活用してパフォーマンスを上げること。
もう一つは2つ以上の処理をそれぞれ(見た目上)独立して動かすことで
一方が他方をブロックするのを避けること。
例えばGUIを動かしつつ裏でネットワークで通信処理するとかね。
Rubyのマルチスレッドは後者を狙ったもの。

77 :
処理で起こることが全部「自前のCPUをごりごりして作成するもの」な場合、Rubyのスレッドのメリットはほぼ無い
スレッドのメリットが生きるのは「外部に問い合わせると1秒かかる」「その間に返答以外のデータを処理したい」みたいなとき
問い合わせを別スレッドにして、返答が来るまで別なことをしていればいい
ただし、その返答データが必要な処理いっこしか持ってないような場合は、
返答待ちしかやることがない状態になってしまうのでこれまたスレッドのメリットが無い
>>76の前者のマルチプロセッシングなスレッドには未対応

78 :
ふーむ、なるほど。。
単にマルチスレッドと言っても、
物理的に並列で実行できるスレッドモデルもあるし
Rubyのように実際は並列じゃないけど、待ち時間などを有効利用するだけのスレッドモデルもあると。
後者はOSのプロセス切り替えと同じように考えればいいのかな?
そうするとIO待ちのように明らかに無駄が出来る処理のみをスレッド化して、
単純に速度を上げるために並列化しまくる、みたいなことは意味をなさないということですかね。
難しいけど何となく分かりました。ありがとうございます。

79 :
並列(pararell)処理と並行(concurrent)処理の違いだね
前者は物理的な(=ハードウェアとしての)マルチプロセッサ(or コア)が並ぶ処理を指す
後者は前者を含む概念であり、論理的な(=ソフトウェアとしての)並んで行う処理を指す
シングルプロセッサでも並行処理は可能だけど、それを並列処理とは呼ばない
多くの資料ではこれらの単語を正確に使い分けているけど、
中にはごっちゃにしているものもあるので、注意が必要

80 :
あと並列処理/並行処理と非同期処理(asyncronous)もごっちゃにしやすい概念
前者は物理的/論理的な処理の並びを意味するけど、
後者は並行処理を実現する手段(実装)の一つにすぎない
たとえばGUIは非同期処理の典型的な例だけど、一般にこれを並行処理とは呼ばない
ただし、BeOSのようにスレッドを前提にしたGUI実装もあるけど、これは例外
もう一つの例として、Ruby標準ライブラリのXMLRPC4Rには、
スレッドを使って複数のリクエストを並行に実行する call_async というメソッドがある
これは厳密には誤った命名であり、正しくは call_concorrent あるいは
(ネットワーク上での分散型並列処理という意味で)call_pararell と命名すべきだった
もう今はAJAX(Ayncronous JavaScript and XML)という技法が普及したから、
同じ間違いが繰り返される可能性は低いだろう
まあ、細かい事はどーでもいーんだよ、という話でもある

81 :
詳しい方がいるので便乗してお聞きしたいのですが、
Railsなどで使われるWebrickでは、一つのリクエストを逐次実行することしか出来ないですよね。
例えばあるアクション内でsleepを実行すると、その後のリクエストは全て待たされる。
Railsで各々のリクエストはスレッドとなって処理されるからsleepでブロックされるはずは無いと思うのですが、何故こんな挙動になるんでしょうか。

82 :
【激白】西田昌司「民主党は振り込め詐欺と同じだ!」
http://www.nicovideo.jp/watch/sm16994357
西田昌司「お人好しを食い物にする民主党」
http://www.nicovideo.jp/watch/sm16994346
上野周辺 民主党本部前座り込み117日目 2/16
http://www.nicovideo.jp/watch/sm16993687
【桜ものがたり】#18 長谷川三千子、明治憲法と日本の国柄[桜H24/2/16]
http://www.nicovideo.jp/watch/so16987847
【お知らせ】ことばで聞く古事記、週末の講演会など[桜H24/2/16]
http://www.nicovideo.jp/watch/so16987840
【今週の御皇室】皇室の在り方、陛下の御言葉を振り返って 弐[桜H24/2/16]
http://www.nicovideo.jp/watch/so16987838
【西村眞悟】今の国政を撃つ![桜H24/2/16]
http://www.nicovideo.jp/watch/so16987834
【水島総】山梨での講演、神道と頑張れ日本[桜H24/2/16]
http://www.nicovideo.jp/watch/so16987805
【エネルギー安保】東電の国有化プロセスと人材流出の危機[桜H24/2/16]
http://www.nicovideo.jp/watch/so16987804
【三宅教雄】我が国領海警備の実情と課題[桜H24/2/15]
http://www.nicovideo.jp/watch/so16987357

83 :
>>81
Rubyの組み込みメソッドsleepは発行元のプロセスを指定秒数ブロックさせる仕様だから、
そのプロセスに所属するすべてのスレッドも一緒にブロックされてしまう
だから、>>81のWebrickでsleepを用いた時の挙動は正しいと言える
もしもある特定のスレッドだけを指定秒数だけブロックさせたいのなら、
タイマーとスレッド間同期機構を使ったコードを自力で実装しなければならない
あとRailsの場合には、Rails自身がリエントラントで設計されていないから、
コントローラの入り口で(=リクエストを受け付けた直後に)排他制御しているらしい
したがって、Railsアプリ内で不用意にスレッドを待たせるとRailsプロセス全体が
ブロックしてしまう可能性があり、上記のWebrick以上に慎重なスレッド設計が求められる
ただし、自分はRailsに詳しくないので、最新版での仕様等はRailsスレで確認して欲しい

84 :
wow...すばらしい。ありがとうございます。
とても勉強になりました。
これはJavaから来た人には色々引っかかりそうですね

85 :
require 'webrick'
s = WEBrick::HTTPServer.new(:BindAddress =>'localhost',:Port => 48080)
s.mount_proc("/") do |req,res|
body = "before sleep(5) : #{Time.now}\n"
sleep(5)
body << "after sleep(5) : #{Time.now}\n"
res.status,res.content_type,res.body = 200,"text/plain",body
end
trap('INT'){s.shutdown}
s.start
# 端末Aからアクセス(13-18秒)
before sleep(5) : Fri Feb 17 13:07:13 +0900 2012
after sleep(5) : Fri Feb 17 13:07:18 +0900 2012
# 端末Bからアクセス(15-20秒)
before sleep(5) : Fri Feb 17 13:07:15 +0900 2012
after sleep(5) : Fri Feb 17 13:07:20 +0900 2012
webrickではブロックされてないと思うなあ
>>83の言うrailsの排他制御じゃないの?

86 :
Windowsでruby1.8、とかじゃね?

87 :
>>84
ゴメン、>>83は「大ウソ」だった
マニュアルには明記されていないけど、sleepがブロックさせるのは(プロセスではなく)
スレッドらしく、実際に以下のコードも生成された各スレッドは並行に実行される
 for i in 1..5
   Thread.new(i) { |j|
     while true
       printf "=== WAIT: %d ===¥n", j
       sleep 5
       printf "=== ACT: %d ===¥n", j
     end
   }
   sleep 1
 end
実行環境は、MacおよびWindow上のRuby 1.8.7
じゃあ、ナゼ>>81の例が並行に実行されなかったのかは分からん(重ね重ね、ゴメン)

88 :
(>>87に追記)
>>87のコードの最後に、メインスレッドを待たせ続ける sleep の1行が必要

89 :
require "sqlite3"
database = SQLite3::Database.new("db");
sql = "select * from table"
database.execute(sql) do |row|
puts row
end
って書いてるんですが、sqlの最後にセミコロンを書いても書かなくても動くんですが
ググっても書かないで教えてるサイトとかかなりあるのですが
セミコロンは書かなくてもいいのでしょうか?

90 :
>>81
あるリクエストがこけたら他のリクエストが全部こけるってこと?
恐ろしいフレームワークだな。
>>89
さすがにそれぐらいはrailsが面倒見てくれるはず。

91 :
Railsは関係ないだろ
sqlite3がきちんと処理してくれる

92 :
>>89 B shellとかAWKとかRubyと同じようにSQLも、行の最後とかのセミコロンが無ければ
勝手に補完する、って仕様なんじゃない?

93 :
残念ハズレ

94 :
>>89
マニュアルこれでいいのかな
http://rdoc.info/github/luislavena/sqlite3-ruby/master/SQLite3/Database#execute-instance_method
execute()は単一のステートメントを実行するものなので
ステートメントの区切り記号である ; を書く必要がない
ページの頭にあるサンプルでも ; はついてない

95 :
トランザクションの中で複数のsqlを実行するときにセミコロンがないと困るだろ

96 :
railsでプログラミングしているけど
改行コードをLFにしてテキストを返す方法がわからない…(汗
自分が思った以上に初心者で焦っています…

97 :
Railsはここでは使ってる人も少ないし板違い
【RoR】Ruby on Rails Part13
http://kohada.2ch.net/test/read.cgi/php/1320393984/

98 :
事故解決した
lf = "\015"
でいけましたわ

99 :
「はじめてのRuby」が全然わからないんだが俺は手に取る本を間違えたのか?

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
愛国Ruby (344)
ゲームプログラムなら俺に聞け23 (721)
クラス名・変数名に迷ったら書き込むスレ。Part21 (442)
国産オープンソースDIコンテナSeasar2 その16 (468)
JavaScriptスレ2 (347)
【SL4】Windows Phone 7 アプリ開発スレ Part3【XNA】 (432)
--log9.info------------------
【遺産?】遺品整理【ゴミ?】 (213)
一日一度ひろゆきにお礼を言うスレin掃除全般 (939)
人の家を外から見たとき気になるところ (810)
人間関係の掃除ってどうすればいいの? (935)
整理整頓の達人のセクハラ被害者のスレ 4 (585)
掃除・整理・捨て作業をしたら褒められるスレ (282)
全国同時多発掃除! 第4戦 (821)
【大掃除の】引越しする人おいで【チャンス】 (773)
魔法の粉 重曹 Part5 (714)
【掃除全般】テレビ番組・雑誌 Part1 (405)
掃除板雑談スレ くずかご2個目 (128)
掃除機のホースが吸い込んだよ軍手を (307)
お風呂掃除 〜その4 (572)
カムバック!ダスキンサーブ氏 (946)
【せっけん】石鹸洗濯・掃除 Part4【石けん】 (759)
儲けたいなら会社を綺麗に (360)
--log55.com------------------
AKB48×SHOWROOM ★1858
【金持ち】NMB吉田朱里、時間潰しの買い物で20万円使い、その後スタッフ多数に焼肉奢る 「正直潤ってます」と儲かってることを認める
【悲報】SKEヲタがSHOWROOMで11歳の林美澪ちゃんに卑猥な言葉を言わせてしまう
バカ「GWが終わったらまた感染者数は3桁に戻る!」本日の感染者数22人!完全に収束したじゃんwwwwwwwww
【NGT48】荻野由佳 応援スレ★68【おぎゆか】
【AKB48】横山由依応援スレ696【ゆいはん】
【AKB48】向井地美音応援スレ 84【みーおん】
【AKB48本スレ】1日1人&自由議題を語ってるよ【OUC48実況】+5