Ruby 初心者スレッド Part 48at TECH
Ruby 初心者スレッド Part 48 - 暇つぶし2ch1:デフォルトの名無しさん
12/02/08 06:00:47.06
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお

前スレ
Ruby 初心者スレッド Part 47
スレリンク(tech板)


るりまサーチ (リファレンス検索)
URLリンク(rurema.clear-code.com)

Rubyist Magazine - るびま
URLリンク(jp.rubyist.net)

逆引きRuby
URLリンク(www.namaraii.com)

2:デフォルトの名無しさん
12/02/08 06:05:33.11
【RoR】Ruby on Rails Part13
スレリンク(php板)
【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)

書籍:ほぼ公式
「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」 (プログラミング自体が初めてでない人向け)
URLリンク(www.amazon.co.jp)
「初めてのRuby」 (同上)
URLリンク(www.amazon.co.jp)
書籍:紙のマニュアルに相当
「Rubyレシピブック 第3版 303の技」((脱)初心者向け基礎テクニック集、1.9対応)
URLリンク(www.amazon.co.jp)
「プログラミングRuby 第2版 言語編」(初心者向け参考書)
URLリンク(www.amazon.co.jp)

現在、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と
URLリンク(www.artonx.org)
RubyだけインストールされるRubyInstallerの2種類存在
URLリンク(rubyinstaller.org)
何が必要なのかわからない人はとりあえずActiveScriptRuby使っと毛
chm(HTMLヘルプ)式のダウンロードできるマニュアルが便利
URLリンク(www.ruby-lang.org)

3:デフォルトの名無しさん
12/02/08 06:12:35.15
最新の安定版であるruby 1.9.3-p0が各ミラーサイトから入手できます。
[ tar.bz2 | tar.gz | zip ]

ダウンロード
URLリンク(www.ruby-lang.org)

4:デフォルトの名無しさん
12/02/08 06:15:06.06
・ いつものエディタとターミナルという普段着でお越し下さい
・ エディタ初めてならRubyスクリプトをを着色してくれる(できればオートインデントの)エディタ好きなの選べ
・ いわゆるIDEはRubyの学習に際しては恐ろしくコスパが悪いのでRubyのためだけに新規導入するのはお勧めしない

Q. XXX を使ってるんですが Ruby も覚えたほうがいいんでしょうか?
A. 好きにしろ

5:デフォルトの名無しさん
12/02/08 06:28:43.23
      ,―ヽ_(((((_、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-―-、   ・ /
    i、  <(EEEEE)> ∵/    IPA Rubyスレにようこそ
      i、  \   ./  /
       \   ーー   ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |


6:デフォルトの名無しさん
12/02/08 07:31:40.24
>>1

ようやく立ったなw

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

8:7
12/02/08 16:14:01.19
Ruby1.9.3です

9:デフォルトの名無しさん
12/02/08 16:45:26.21
変換できない文字があったときにどうなって欲しいのかで書き方が違うのだな
あと1.8.7でも動作する書き方とか

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

11:デフォルトの名無しさん
12/02/08 17:38:32.35
require 'kconv'
'にほんご'.toutf8

12:7
12/02/08 17:55:44.76
>>11
この方法で今後は統一します

13:デフォルトの名無しさん
12/02/08 22:11:06.63
勉強用に貯めてきたサンプルを読み返したら
ファイルの先頭にこう書いてありました
#!ruby -Ks
これはなんですか?

14:デフォルトの名無しさん
12/02/09 00:07:04.11
URLリンク(www.rubylife.jp)

15:デフォルトの名無しさん
12/02/09 11:13:57.76
理解しました

16:デフォルトの名無しさん
12/02/09 18:32:05.29
# -*- encoding: utf-8 -*-

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

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

18:デフォルトの名無しさん
12/02/10 18:07:10.12
意地でも>>16のどちらも書きたくない場合
コマンドラインオプションとかで同等の効果をもたせる方法ないんですか

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

20:デフォルトの名無しさん
12/02/10 19:44:58.96
irb使え

21:デフォルトの名無しさん
12/02/10 20:56:34.37
irbで出来ました!
rubyって打ってもそういうモードにならなくて「ruby コマンドライン」でググってもでてこなかったのであきらめるところでした

22:デフォルトの名無しさん
12/02/10 21:54:10.35
ちなみにruby -e 'p 1+1'でもいける

23:デフォルトの名無しさん
12/02/10 22:46:31.53
>>22のやり方は、ワンライナー(one liner)と呼ばれているね

24:デフォルトの名無しさん
12/02/11 01:25:52.30
str.gsub!(/aa(\d+?)aa/, "bb#{$1}bb")

こういうことをやりたいんですけど、どうやったらうまくいきますか?

25:デフォルトの名無しさん
12/02/11 01:55:13.30
すみませんこうですね。。
str.gsub!(/aa(\d+?)aa/, 'bb\1bb')

26:デフォルトの名無しさん
12/02/12 14:49:57.55
s='foo.bar'
t='foo.baz'
で先頭から共通する文字列'foo.ba'を取得するうまい方法って無いですか。
ループで一文字ずつスキャンするしかないですかね。

27:デフォルトの名無しさん
12/02/12 14:59:45.57
windowsでsystem('dir')の返り値を変数に入れる方法を伝授してください

28:デフォルトの名無しさん
12/02/12 15:43:51.93
>>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:デフォルトの名無しさん
12/02/12 18:38:04.33
メインphp使いですけどrubyってコード記述量少なくていいですね

30:デフォルトの名無しさん
12/02/12 19:00:46.18
まつもとゆきひろ「public static void mainなど、コンピュータに伝える約束事が多くて、
やりたいことが頭の中から逃げてしまう。簡潔さは力なのです(中略)
“実行可能疑似言語”と呼ばれる何言語でもないコードが示されることが多い。
それはPascalもどきとか、Algolもどきで書いてある。
もどきといっても、アルゴリズムをちゃんと記述できている。
だったら、それを理解できる言語を作ればいいじゃん、ということで、ある意味、それがRubyの目標です」

「ソフトウェアは工業製品ではない」、Rubyのまつもと氏が講演 - @IT
URLリンク(www.atmarkit.co.jp)
2009/04/10

メタ言語のことで、一般にBNFやBN記法と略される
バッカス・ナウア記法 - Wikipedia

31:デフォルトの名無しさん
12/02/12 21:14:27.94
CGIの動作をWindowsのコマンドラインからテストするために簡単なスクリプトを書いています。
・呼び出し
ruby -w foo.cgi param1=hoge method=GET
・パラメータ受け取り(GETリクエストをシュミレーション)※一部略
ENV['QUERY_STRING'] = ARGV.join('&')
あとはcgi.rb任せです。

ですがcgi.rbがSTDINからパラメータを受け取る場合(POST)
どうやってセットしたらいいのでしょうか。

32:デフォルトの名無しさん
12/02/12 21:19:07.11
cmd.exeってheredocはないんだっけか。
標準入力に食わせたいだけなら

type post_data.txt | ruby -w foo.cgi ...
でいいんじゃないの?

※そういえば、CGI.rb を使っているスクリプトを直接端末から起動すると
パラメータを受け取るモードになる機能があったような。


33:デフォルトの名無しさん
12/02/12 21:26:49.12
そうなんだけど標準入力とクエリ文字列両方同時に扱うにはひと手間かかったような

% 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:デフォルトの名無しさん
12/02/12 21:40:14.27
utf-8で保存したrbファイルの先頭に
#!ruby -Ks
って書くのと
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
って書くのどちらがよいですか?
Windows ruby1.9.3です

35:31
12/02/12 23:21:50.26
>>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:デフォルトの名無しさん
12/02/13 14:41:17.36
Class.new で作ったクラスオブジェクトに名前を付ける方法ってどうするの?
c = Class.new
p c.name #=> nil

c.name = 'Foo' はだめだった


37:デフォルトの名無しさん
12/02/13 15:12:51.75
>>36
URLリンク(doc.ruby-lang.org)
のModule.newを見れば分かると思うよ


38:デフォルトの名無しさん
12/02/13 16:48:57.93
>>37
ありがとうございます。
ということは、動的に名前をつけたい場合はevalするしかない?
c = Class.new
name = "Foo"
eval "#{name}" = c"

39:デフォルトの名無しさん
12/02/13 17:58:53.99
Module#const_set辺りでどうにかなんないかなー検証してないけど

40:デフォルトの名無しさん
12/02/13 20:21:21.77
const_setでおk


41:デフォルトの名無しさん
12/02/14 02:45:58.49
@で始まる変数が何か分かんないので質問します

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:41
12/02/14 02:46:39.12
たとえばこんな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:デフォルトの名無しさん
12/02/14 03:43:40.90
@が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:デフォルトの名無しさん
12/02/14 06:16:09.40
>>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:デフォルトの名無しさん
12/02/14 09:11:26.93
Emacsなんかでは「UTF-8として有効な文字」はそのまま、
「UTF-8に含まれてなさそうなコントロールコードや不完全なバイナリの連なり」は^@みたいな表示で着色されて表示されます
これと似たような処理(をするための振り分け)はどうしたらいいもんでしょう
コントロールコードっぽい配列と、UTF-8っぽい配列の2つに分けたいです

46:デフォルトの名無しさん
12/02/14 09:19:12.01
そういうのは簡単にしようと思ってコントロールコードでsplitとかするとたいてい失敗するよ
UTF-8にマッチする正規表現でscanとかsplitして、マッチしないものを「コントロールコードその他」にするとうまくいく

47:デフォルトの名無しさん
12/02/14 10:50:19.26
HTTPのライブラリの定番てなんですか?
いろいろ試してみたいのですがnet/httpとnokogiri以外にありますか?

48:デフォルトの名無しさん
12/02/14 10:54:06.78
require 'open-uri'

49:デフォルトの名無しさん
12/02/14 10:57:30.71
HTTP のライブラリだってのに Nokogiri 入ってるのってなんでじゃらほ

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

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

51:デフォルトの名無しさん
12/02/14 14:50:58.04
読み込んだライブラリのクラス名を取得方法を伝授してください
例えばrequire "date"だったらDateとDateTimeの2つのクラス名が知りたいです

52:デフォルトの名無しさん
12/02/14 15:19:49.04
それは無理
$LOAD_PATHからdate.soかdate.rbを探してクラス定義を正規表現で探せばできるけど、それほど完全でもない

というか、それが必要になることはないはず
衝突の回避はユーザーに任せろ
完全初心者が使ってることを前提にするのはやめよう

53:デフォルトの名無しさん
12/02/14 15:33:55.52
まじすか諦めます

54:デフォルトの名無しさん
12/02/14 15:39:41.07
たびたびすいません今質問したものです
質問1
マニュアルの見方を教えてください
URLリンク(doc.ruby-lang.org)
このページのライブラリ名は全てrequire "~"にそのまま書いていいようになってますか?

質問2
クラス名からメソッド一覧を取得したいので
p Dir.methodsって書いて表示できたんですが
例えばURLリンク(doc.ruby-lang.org)
特異メソッドとインスタンスメソッドを別々に取得して表示させる方法はありませんか?

55:デフォルトの名無しさん
12/02/14 16:06:39.74
マニュアル読め

とループ回答
>>54
ひとつめYES
スラッシュ「/」や大文字もそのまま書く
irb> require 'english'
LoadError: no such file to load -- english
irb> require 'English'
irb>
ふたつめ
URLリンク(doc.ruby-lang.org)
URLリンク(doc.ruby-lang.org)

このマニュアル、一覧ページにアンカーがないから使いにくいなあ
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:41
12/02/14 18:33:52.64
>>43,44
ありがとうございます
ぐぐりやすくなって捗りました

 

57:デフォルトの名無しさん
12/02/14 18:41:59.05
>>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:デフォルトの名無しさん
12/02/14 19:26:57.13
やっぱ時代は1.9.3だよな
1.8.7厨は労外w

59:デフォルトの名無しさん
12/02/14 20:26:03.34
大江戸RubyKaigiでhttpライブラリを比較する発表があったっけ。


60:デフォルトの名無しさん
12/02/14 21:18:58.41
end書きたくないからほとんど{}で囲ってるんだけどそうするとifのendが目立ってしょうがないお

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

62:デフォルトの名無しさん
12/02/14 21:37:17.10
>>61
やっぱそうか・・・クラス定義とか関数定義とかみんなendだもんな
rubyやる人はブロックの変数を|で囲うのも抵抗なかったの?めっちゃ違和感あるんだけど

63:デフォルトの名無しさん
12/02/14 22:09:43.13
a = [1,2, 3, 4, 5]
a.each do |b|
puts b*b
end

64:デフォルトの名無しさん
12/02/14 22:26:22.27
smalltalkerだったので||自体には違和感なかったな。


65:デフォルトの名無しさん
12/02/14 22:28:34.45
>>63
チョコのお返しにいくらかかるか計算してるんですね。わかります

66:デフォルトの名無しさん
12/02/14 22:34:00.12
>>62
Ruby文法をしっかり読んだわけじゃないが、
| が無いとブロックの外側を参照している変数と区別がつかなくなるんだと思う

かといって、他の言語で何か素晴らしい表記法があるかというと
微妙な所で。引数に\付けたり()でくくったり、いろいろ書き方はあるけど
| より明らかに良いと言えるほどでも……

67:デフォルトの名無しさん
12/02/14 23:25:36.32
バイナリファイルのデータを読みだして、
イテレータで値を出力しようと思ったのですが、
データが化けてしまいます。

以下の①なら問題なし、②だと化けます。
どうしてでしょう?

f = File.Open("hoge.dat", "rb")

data_array = f.Read(16)

# ① 問題なし
for i in 0..15
print data_array[i]
end

# ②文字が化ける
data_array.each{ |num|
print num
}

68:デフォルトの名無しさん
12/02/14 23:54:20.50
>>67
X data_array.each{ |num|
O data_array.each_char{ |num|


69:67
12/02/15 00:57:37.78
>>68
できましたー。ありがとーです。

70:デフォルトの名無しさん
12/02/15 10:42:40.96
>>55
>>57
理解しました

71:デフォルトの名無しさん
12/02/16 01:29:42.33
>>67
Ruby1.8だと思いますが
data_array[i] は、文字列のバイト位置の1バイトの数値表現

each メソッドの ブロック引数は、文字列を改行直後で分割した一行分の文字列
と、得られるものが違います
each_charは、文字列を文字単位で分割した一文字
と、これまた違うのですが
理解の方は大丈夫でしょうか?

さらに、each_charは$KCODEの影響を受けてそのサイズが変わりますよ
お望みの機能はeach_byteだと思われますが


72:デフォルトの名無しさん
12/02/16 01:32:03.89
Ruby 1.9以降では
data_array[i] のように文字列を添え字アクセスしたものは
バイト位置の数値ではなく、文字単位の位置での一文字が得られます
また、文字列のeachメソッドはなくなりました
1.8と1.9の非互換な部分です

文字列のeachの代わりには
each_char、each_line、each_byte、each_codepointなどを使います


73:デフォルトの名無しさん
12/02/16 02:46:14.57
                        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:デフォルトの名無しさん
12/02/16 23:36:19.48
RubyのスレッドモデルはGILとのことですが、
URLリンク(ja.wikipedia.org)
このwikiの説明を見ると、
同時に実行できるスレッドは常に一つだけ、と読み取れます。
つまり一つのプロセスの中ではスレッドが平行して実行されないと。。これって何のためのスレッドなんですか?

75:デフォルトの名無しさん
12/02/16 23:57:10.88
ネットからデータを読みこんだりしているときに
他の作業ができるでしょ

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

77:デフォルトの名無しさん
12/02/17 00:15:38.90
処理で起こることが全部「自前のCPUをごりごりして作成するもの」な場合、Rubyのスレッドのメリットはほぼ無い

スレッドのメリットが生きるのは「外部に問い合わせると1秒かかる」「その間に返答以外のデータを処理したい」みたいなとき
問い合わせを別スレッドにして、返答が来るまで別なことをしていればいい
ただし、その返答データが必要な処理いっこしか持ってないような場合は、
返答待ちしかやることがない状態になってしまうのでこれまたスレッドのメリットが無い

>>76の前者のマルチプロセッシングなスレッドには未対応

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

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

80:デフォルトの名無しさん
12/02/17 02:23:31.52
あと並列処理/並行処理と非同期処理(asyncronous)もごっちゃにしやすい概念
前者は物理的/論理的な処理の並びを意味するけど、
後者は並行処理を実現する手段(実装)の一つにすぎない

たとえばGUIは非同期処理の典型的な例だけど、一般にこれを並行処理とは呼ばない
ただし、BeOSのようにスレッドを前提にしたGUI実装もあるけど、これは例外

もう一つの例として、Ruby標準ライブラリのXMLRPC4Rには、
スレッドを使って複数のリクエストを並行に実行する call_async というメソッドがある
これは厳密には誤った命名であり、正しくは call_concorrent あるいは
(ネットワーク上での分散型並列処理という意味で)call_pararell と命名すべきだった

もう今はAJAX(Ayncronous JavaScript and XML)という技法が普及したから、
同じ間違いが繰り返される可能性は低いだろう
まあ、細かい事はどーでもいーんだよ、という話でもある

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

82:デフォルトの名無しさん
12/02/17 06:30:42.73
【激白】西田昌司「民主党は振り込め詐欺と同じだ!」
URLリンク(www.nicovideo.jp)

西田昌司「お人好しを食い物にする民主党」
URLリンク(www.nicovideo.jp)

上野周辺 民主党本部前座り込み117日目 2/16
URLリンク(www.nicovideo.jp)

【桜ものがたり】#18 長谷川三千子、明治憲法と日本の国柄[桜H24/2/16]
URLリンク(www.nicovideo.jp)

【お知らせ】ことばで聞く古事記、週末の講演会など[桜H24/2/16]
URLリンク(www.nicovideo.jp)

【今週の御皇室】皇室の在り方、陛下の御言葉を振り返って 弐[桜H24/2/16]
URLリンク(www.nicovideo.jp)

【西村眞悟】今の国政を撃つ![桜H24/2/16]
URLリンク(www.nicovideo.jp)

【水島総】山梨での講演、神道と頑張れ日本[桜H24/2/16]
URLリンク(www.nicovideo.jp)

【エネルギー安保】東電の国有化プロセスと人材流出の危機[桜H24/2/16]
URLリンク(www.nicovideo.jp)

【三宅教雄】我が国領海警備の実情と課題[桜H24/2/15]
URLリンク(www.nicovideo.jp)


83:デフォルトの名無しさん
12/02/17 12:41:45.79
>>81
Rubyの組み込みメソッドsleepは発行元のプロセスを指定秒数ブロックさせる仕様だから、
そのプロセスに所属するすべてのスレッドも一緒にブロックされてしまう
だから、>>81のWebrickでsleepを用いた時の挙動は正しいと言える
もしもある特定のスレッドだけを指定秒数だけブロックさせたいのなら、
タイマーとスレッド間同期機構を使ったコードを自力で実装しなければならない

あとRailsの場合には、Rails自身がリエントラントで設計されていないから、
コントローラの入り口で(=リクエストを受け付けた直後に)排他制御しているらしい
したがって、Railsアプリ内で不用意にスレッドを待たせるとRailsプロセス全体が
ブロックしてしまう可能性があり、上記のWebrick以上に慎重なスレッド設計が求められる
ただし、自分はRailsに詳しくないので、最新版での仕様等はRailsスレで確認して欲しい

84:デフォルトの名無しさん
12/02/17 13:05:34.75
wow...すばらしい。ありがとうございます。
とても勉強になりました。
これはJavaから来た人には色々引っかかりそうですね

85:デフォルトの名無しさん
12/02/17 13:09:01.17
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:デフォルトの名無しさん
12/02/17 13:30:42.73
Windowsでruby1.8、とかじゃね?

87:83
12/02/17 13:54:58.59
>>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:83
12/02/17 13:59:04.16
(>>87に追記)
>>87のコードの最後に、メインスレッドを待たせ続ける sleep の1行が必要

89:デフォルトの名無しさん
12/02/17 15:14:35.08
require "sqlite3"
database = SQLite3::Database.new("db");

sql = "select * from table"
database.execute(sql) do |row|
puts row
end

って書いてるんですが、sqlの最後にセミコロンを書いても書かなくても動くんですが
ググっても書かないで教えてるサイトとかかなりあるのですが
セミコロンは書かなくてもいいのでしょうか?

90:デフォルトの名無しさん
12/02/17 15:19:34.98
>>81
あるリクエストがこけたら他のリクエストが全部こけるってこと?
恐ろしいフレームワークだな。

>>89
さすがにそれぐらいはrailsが面倒見てくれるはず。

91:デフォルトの名無しさん
12/02/17 15:26:41.44
Railsは関係ないだろ
sqlite3がきちんと処理してくれる

92:デフォルトの名無しさん
12/02/17 16:26:33.33
>>89 B shellとかAWKとかRubyと同じようにSQLも、行の最後とかのセミコロンが無ければ
勝手に補完する、って仕様なんじゃない?

93:デフォルトの名無しさん
12/02/17 16:27:38.97
残念ハズレ

94:デフォルトの名無しさん
12/02/17 16:40:30.43
>>89
マニュアルこれでいいのかな
URLリンク(rdoc.info)

execute()は単一のステートメントを実行するものなので
ステートメントの区切り記号である ; を書く必要がない
ページの頭にあるサンプルでも ; はついてない

95:デフォルトの名無しさん
12/02/17 16:59:13.60
トランザクションの中で複数のsqlを実行するときにセミコロンがないと困るだろ

96:デフォルトの名無しさん
12/02/17 19:24:26.14
railsでプログラミングしているけど
改行コードをLFにしてテキストを返す方法がわからない…(汗

自分が思った以上に初心者で焦っています…


97:デフォルトの名無しさん
12/02/17 19:31:15.06
Railsはここでは使ってる人も少ないし板違い
【RoR】Ruby on Rails Part13
スレリンク(php板)

98:96
12/02/17 19:32:05.01
事故解決した
lf = "\015"
でいけましたわ

99:デフォルトの名無しさん
12/02/19 22:55:19.77
「はじめてのRuby」が全然わからないんだが俺は手に取る本を間違えたのか?

100:デフォルトの名無しさん
12/02/19 23:04:15.83
>>99
全然といっても全部わからないわけじゃないだろうから
とりあえずわからないところ挙げてみれ

101:デフォルトの名無しさん
12/02/19 23:09:00.81
>>99
Yugui氏の「初めてのRuby」のことであれば、
いくつも言語が使えてプログラミングの諸概念自体は十分分かっているが
それをRubyで表現するやり方が分からないユーザー向け

本自体は素晴らしい出来だと思うが、あなたがプログラミング初心者ならば
対象読者から外れているのかもしれない

それに、いくつも言語を知ってる熟練者でも、合わない本ってのはあると思う

102:デフォルトの名無しさん
12/02/19 23:23:52.52
>>100
最初から読み進めてるはずなんだが一度も解説される事もなく色んな命令がでてくる
配列の説明のとこで挫折というか飽きてきた
どこがわからないというより掴みどころがない
個々のサンプルはググりながら調べて読めるんだがそれじゃ入門書の意味がない

>>101
言語はもう片手じゃ足りない程度は使ってきた
趣味で使った言語を含めると両手でも足りない
しかも、Rubyだって社内ツールを数本ほど書いてる

どうやら俺の地頭が悪いか、単純に合わない本だったかどちらかなんだろう
このまま読み進めたほうがいい?それとも他にオススメの本ある?

103:デフォルトの名無しさん
12/02/19 23:53:07.35
>>102
ちょっと漠然としすぎていてアドバイスのしようがない
ググる必要があったコードって具体的にどれ?

104:デフォルトの名無しさん
12/02/20 00:40:59.36
配列も分からずにどうやって社内ツール作るんだ?

105:デフォルトの名無しさん
12/02/20 00:45:45.37
配列の説明で挫折っていうのは、
たとえば
a = []
a << 1
a << 3
a.each do |i|
p i
end

これが何してるか分からないってこと?

106:デフォルトの名無しさん
12/02/20 00:47:38.75
>>104
ランチャープログラムとか

107:デフォルトの名無しさん
12/02/20 00:55:47.70
Rubyで社内システム作ったったwww

#!/usr/bin/ruby
puts `社内システム`

108:デフォルトの名無しさん
12/02/20 01:51:29.55
>>104
配列のないプログラミング言語では社内ツールのようなものは作れなかったのだろうか
いや、決してそんなことはない
配列はいわばデザインパターンでしかない

109:デフォルトの名無しさん
12/02/20 02:21:52.96
>>102
ちょっとうろ覚えだが、『初めてのRuby』は薄いぶんだけ
Webドキュメントぐらい読めるよね~ってのが前提になっていた気がする

ジュンク堂とか紀伊国屋とか、
デカ目の本屋ならRubyコーナーがあったりするから
そこで自分に合う本を探してみては

110:デフォルトの名無しさん
12/02/20 02:34:24.08
Webドキュメントっていうのが公式のリファレンスマニュアルを指すのなら
真逆ですお

111:デフォルトの名無しさん
12/02/21 04:11:08.70
>>102
Programming Ruby 1.9 あたりはどう?
電子書籍版なら安い。

112:デフォルトの名無しさん
12/02/21 04:52:32.42
>>110
>本書を最後まで読めば、読者はリファレンスマニュアルを自在に読みこなし、Rubyライブラリを活用した
>高度なプログラミングを習得する準備ができていることでしょう。

まえがきにちゃんと書いてあった
yuguiさんごめんなさい

113:デフォルトの名無しさん
12/02/21 19:38:48.39
電子書籍って本を表示するモニターが必要なんだよね
モニターもうひとつ買って横に並べたら便利かなとか思ったけど
その分で本を何冊も買えるんだよね

持ち運びには便利なんだけど持ち歩かない本はやっぱり
電子書籍じゃなくて紙媒体のほうがいいんだよね

114:デフォルトの名無しさん
12/02/21 21:32:34.10
電子書籍用にandroidの安いスレートとか買えば幸せに慣れるよ。
ipadはもう時代遅れ。。

115:デフォルトの名無しさん
12/02/22 01:51:26.46
すいません質問です

Ruby で外部コマンドの stdout, stderr, $? を
それぞれ分けて Ruby のプログラム内に取り込みたいのですが
どうやるのが定石なんでしょうか?

116:デフォルトの名無しさん
12/02/22 01:56:24.75
Open3.popen3

117:115
12/02/22 02:03:00.16
>116
すいません. Open3.popen3 でコマンドの
終了ステータスを得るにはどうすればよいのでしょうか?

118:デフォルトの名無しさん
12/02/22 02:13:12.24
>>117
URLリンク(ruby-doc.org)
このあたり?
「ri Open3.popen3」でも見られるよ。

119:デフォルトの名無しさん
12/02/22 02:19:12.87
>>117
もし1.8使ってるならちょっとわからない($?じゃ取れないかも)
1.9のpopen3であればブロックの第四引数にvalueを呼ぶ

120:デフォルトの名無しさん
12/02/22 02:31:10.30
>>119
URLリンク(bugs.ruby-lang.org)
Bug #1287: $? not set after Open3::popen3
> ruby 1.8 don't have a way to know the exit status because double fork is used.


121:115
12/02/22 02:33:04.34
>118,119
なるほど,1.8のドキュメントを
読んでいたのでできないものだと思っていました.
1.9ならできるんですね.ありがとうございました.

122:デフォルトの名無しさん
12/02/22 08:14:30.38
1.8.7にバックポートマダー

123:デフォルトの名無しさん
12/02/22 10:03:36.41
1.9系で動くCMSってありませんか?

124:デフォルトの名無しさん
12/02/22 11:04:15.29
>>123
nanoc3 とか。
一般的なCMSとは異なるけど。

125:デフォルトの名無しさん
12/02/22 11:17:43.60
こういうのあるんですね
ためしてみます
RubyはあんまりWEB系のCMSをみかけないのですすがRORがあるからなのかもしれませんが
RORが強すぎてRubyでCMSとかってあんまり需要がないからでしょうか?

126:デフォルトの名無しさん
12/02/22 11:22:38.10
>>125
Radiant CMS があるよ
Ruby 1.9/Rails 3 に対応しているし、
www.ruby-lang.org も、これで動いている
また、非公式ながら有志による日本語ホームページもある

127:デフォルトの名無しさん
12/02/22 12:42:29.34
おおありがとうございます

128:デフォルトの名無しさん
12/02/22 18:10:09.03
@val1 = @val2 > @val3 ? @val2 - @val3 : @val2
@val2が3回@val3が2回出てくるのが納得いかないんだけど
まっとうな方法では短くするのは無理ですか?
ググろうにもキーワードが分からないし誰か教えてください

129:デフォルトの名無しさん
12/02/22 18:26:41.52
>>128
valが整数なら
@val1 = @val2 % @val3
とか?


130:129
12/02/22 18:30:16.06
ごめん、>>129だと@val2が@val3の2倍以上の場合
同じことにならんから、忘れておくれ



131:デフォルトの名無しさん
12/02/22 18:49:45.15
>>128
大差はないが。

@val1 = @val2 - (@val2 > @val3 ? @val3 : 0)
または、
@val1 = @val2
@val1 -= @val3 if @val2 > @val3


132:デフォルトの名無しさん
12/02/22 20:54:11.99
>>128
「もしval2がval3よりも大きければval2とval3の差を、そうでなければval2の値を利用する」
ロジックそのまんまなのだから、@val2が3回@val3が2回出てくるのは当たり前だと思うのだがどうか
どのへんが「消えそう」だと思う?

133:デフォルトの名無しさん
12/02/22 21:46:22.15
>>131の最後のやつがいちばんわかりやすいだろう。

134:デフォルトの名無しさん
12/02/22 22:07:26.01
全くわかりやすくはない

135:デフォルトの名無しさん
12/02/22 22:19:26.63
>>115
ruby 1.9.3p125 (2012-02-16 revision 34643) [i386-mingw32] で

require 'open3'
stdout_str, stderr_str, status = Open3.capture3('ruby -e"$stderr.puts %!stderr!;puts %!stdout!;exit(5)"')
p [stdout_str, stderr_str, status]

で終了コード取れた

WindowsのRuby 1.8だと Open3.popen3は動かない
forkできんと言われて終了


136:デフォルトの名無しさん
12/02/22 22:50:03.49
>>129-130
逆に言えば2倍未満の場合は有効ってことでメモしときました
ありがとうございます

>>131
単純化していうと「一回の式に同じ変数名が何度も出る」のを何とかできたらなあと思っているんです

>>132
当たり前なのは一応理解しています
理解はしてても、冗長だと感じてしまうのは事実なのでなにかないかと思った次第で
>どのへんが「消えそう」だと思う?
自分の知識ではどのへんも「消えそう」じゃないので困ってます


普通の書き方では無理ということのようなので納得することにします
ありがとうございました

137:デフォルトの名無しさん
12/02/23 01:42:51.41
Ruby以前の問題で申し訳ないのですが
ソースをコンパイルするのに必要なライブラリはどこかに書いてありますでしょうか

CentOS6.2を使う予定でzlib-devel、readline-devel、openssl-develあたりが必要なのは解ったのですが
他のライブラリも知りたいです。

138:デフォルトの名無しさん
12/02/23 01:51:51.18
1.9の場合、付いてくる拡張ライブラリ全部コンパイルするなら
iconv, curses, ffi, libyaml, バークレーdb, gdbm, tcl/tk
あたりかな。

ext/*/extconf.rb を have_library で grep してみれば確実だと思うけど。


139:137
12/02/23 01:53:39.55
>>138

ありがとうございます。
ext/*/extconf.rb を 確認してみます。

140:デフォルトの名無しさん
12/02/23 01:57:19.08
(名前で分かるかもしれないけど)
たとえば crypto は、実は opensslの一部だったりするのでちうい。


141:デフォルトの名無しさん
12/02/23 02:56:29.51
>>137
一度yumでruby 1.8を入れて削除すれば必要なライブラリが揃いそう。

142:デフォルトの名無しさん
12/02/23 15:16:43.78
ruby1.9を使っています。
Structで作った構造体のメンバに配列や連想配列を加えたいのですが、どのように書くかわかっていません。

初歩的なことのようにも思いますが、検索などで見つけられておらず、
教えていただけないでしょうか。

143:デフォルトの名無しさん
12/02/23 15:33:06.45
言語によってはデータ格納に実際的に利用できるのが構造体しか実質存在しないようなものもあるが、
Rubyにおいては言語設計レベルから配列とHashを使い倒せと言われているので、
わざわざ不便なStructを最初から使うようなことはせずに、ふつうの用途では配列とHashのネストを使う
オブジェクト指向言語なのにデータ呼び出しがメソッドの形してないじゃないかとか、細かいことは気にするな

144:142
12/02/23 15:47:06.47
わかりました。
郷に入れば郷に従えで、やってみます。

ありがとうございました。

145:デフォルトの名無しさん
12/02/23 22:05:21.19
構造体は構造体で便利だと思うんだが

MyStruct = Struct.new(:list,:table)
s = MyStruct.new(Array.new,Hash.new)
s.list << 'hello' << 'world'
s.table[:key] = :value
puts s.list.join(' ')
s.table.each{|k,v| puts '%s = %s'%[k.inspect,v.inspect]}
class MyStruct
def [](key) ; self.table[key] ; end
end

146:デフォルトの名無しさん
12/02/23 22:18:34.82
Structの問題は「構造体しか使ってない人」が他言語から来たときに、
Rubyでも構造体を使うんだと思って使用してしまうことだな

147:デフォルトの名無しさん
12/02/23 22:24:26.46
すいません
Rubyのマニュアルにサンプルが付いてないのってやっぱり開発者の意向だからでしょうか?
開発者にコンタクトを取ってサンプルを提供と化したらふるぼっこにされますかね?

148:デフォルトの名無しさん
12/02/23 22:39:47.02
ものすごく端的に誰にも気を遣わずに誤解と参加者撤退を恐れずに言うのならば、
マニュアル作成に参加した人たちにマニュアル作成のセンスや技術(の共有)がぜんぜんなかったからに尽きる

これを指摘してしまうとマニュアルの作成や管理に参加する人が誰もいなくなってしまう畏れがあった
マニュアル部分が揃ってないことのほうが大問題だったから、当時は些事だとされて敢えて誰も何も言わなかったのだ

まあ、つまり、わかってはいたんだよ
「こんなんじゃなくてほんとはもっとなんとかしなきゃいけないよねー」「だよねー」くらいのぼんやりしたやり取りはあった

149:デフォルトの名無しさん
12/02/23 22:50:57.50
ということは今はコンタクト送らないほうがいいですよね
自分でマニュアルと連動したツリーでサンプルを書いていって
いつかマニュアルに取り入れてもらえるような感じになればいいかな程度でやってみようかなと思います

150:デフォルトの名無しさん
12/02/23 22:52:48.80
RubyとCに精通した人がやってたというのも大きい
ソース読んで知ってるからサンプルとか書く理由がないし、
CやC++でのアレです以上、みたいな1行説明で充分通じるから説明するメリットもない
第一、そんな余計なことぐだぐだ書いたらマニュアルが長くなって読みにくいし使いにくいじゃないか

まあそのおかげで本も売れてRubyも商業的に一時期注目浴びたんだしいいんじゃねみたいななにか
マニュアルが完備してたら本は売れなかったかもしれないし、じゃあRubyで本出すかという出版社も少なかった可能性がある

151:デフォルトの名無しさん
12/02/23 22:55:01.94
matzがマニュアル作るとか面倒くさいって公言してるじゃん

というか、マニュアルとは関係無いけど
ruby界隈の人ってムッツリこそこそ技術を出し惜しみする人が多いんだよ

152:デフォルトの名無しさん
12/02/23 22:55:03.63
まじすか
やっぱり名乗り出てtwitterで晒しあげられそうなのでやめときます

153:デフォルトの名無しさん
12/02/23 23:03:42.92
>>150
ちょっと擁護しておくと、当時のRubyユーザーは、
そういう他言語知識前提のマニュアルでも理解してもらえるようなバックグラウンド持ちの人が多かったんだよ
開発の初期は尖ったユーザーがわらわら集まることが多いけど、Rubyだってそうだったのだ

今みたいに
「Rubyでプログラミング始めました!Cってなんですか放送できますか」
みたいな人がネットで独学なんて稀だったし、優先度上げてリソース割く意義が薄かった
…人員リソース管理なんてしてなかったけどな

154:デフォルトの名無しさん
12/02/23 23:05:53.71
>>152
晒されても死ぬわけじゃないんだからやっちゃえYO

「本当に動く」サンプルによる補完はぜひお願いしたい
die()がRubyにあると勘違いしたPerl使いがいたのは記憶に新しい

155:デフォルトの名無しさん
12/02/23 23:07:24.76
いやだってRubyのためにやって叩かれたらむかつきますしね

156:デフォルトの名無しさん
12/02/23 23:50:54.35
あんまりよその言語を知らないのだけど
本格的なマニュアルを作った日本のコミュニティーってあるの?
英語マニュアルの翻訳じゃなくて

ところで
やる気がある人なら
るりまプロジェクトに参加したらいいんじゃないだろうか
人的リソースが足りてるわけじゃないだろうし
「ぼちぼちと例を増やしていく要員」とかでもいいと思うのだけど

るりまプロジェクトに「参加するには」
必要なもの¶
* Subversion
* 開発中の ruby 本体をビルドできる環境
* 1.8.x の最新のバージョンの ruby 本体 (できれば trunk を含めた全てのバージョン)
 o patch level に関しては最大のものを用意するのが望ましい
* 1.9.x の最新のバージョンの ruby 本体 (できれば trunk を含めた全てのバージョン)
なんかハードル高いな

るりまプロジェクトに「貢献するには」
ドキュメントの誤り・改善点を指摘する¶
issues からチケットを登録してください。チケットを登録する際、アカウントが必要になりますが誰でも取得可能です。 (プロジェクトメンバに登録して欲しい場合は ML で報告してください。)
* ドキュメントの単純な誤り指摘 (バージョン間違いなど)
* ドキュメントをよりよくするための提案 (説明文追加など)
* あるメソッドのサンプルコード提供
* 既に上がっているチケットに対するコメント
こっちかな


157:142
12/02/24 08:52:42.08
>>145
ありがとうございます。
4,6,8行目が理解できていませんが、やりたいことはやれそうな気がします。

ちなみに、昨日作っていたプログラムは、あの後ハッシユと配列で作ってみました。
ハッシュのキーを指定するところが少しまどろっこしく感じましたが、
以外と簡単にできました。

158:デフォルトの名無しさん
12/02/24 10:38:33.13
俺はPHP並みのマニュアルを作りたい

159:uy
12/02/24 17:18:44.88
>>128 一般人にはこういう発想はないんだろうが、
その手の小さな計算は、こうやって定義を増やしていって暗記する
人のスペックが上がれば使えるようになる

v1 = 0
v2 = 8
v3 = 3

def ifltnlt a , b
  return yield if a > b 
  a
end


v1 =
if v2 > v3 
  v2 - v3 
else
  v2
end

p v1

a = ifltnlt v2 , v3 do
  v2 - v3
end
p a
   

ゲームなどで、Mobなどのパターンを大量に作らなければならないような処理の場合
ソースコード効率を求めたらこういうのばかりになってくる

160:デフォルトの名無しさん
12/02/24 19:05:20.43
ruby1.9.3で勉強をしたいのですがredmineも使ってみたい
なのでruby1.8.7も一緒にインストールしたい
Windowsでこういう悩みを解決する方法を教えてください

161:デフォルトの名無しさん
12/02/24 20:28:22.97
最近redmineの1.9対応がものすごく進んだと聞いた気がする。


162:デフォルトの名無しさん
12/02/24 21:47:03.78
>>160
別の場所にインストールすれば共存できるんじゃない。

Redmineからforkしたものとして、ChiliProjectというものがあるね。
これは1.9.3対応。
URLリンク(www.chiliproject.org)
どの程度安定しているかは知らない。

163:デフォルトの名無しさん
12/02/25 12:57:15.84
Perlでいう map {$_ => 1} @a のようなことをRubyでやるのに
h = {}; a.each {|x| h[x] = true }
はhを2回書く必要があってエレガントでないし
a.inject({}) {|h, k| h[k] = true; h }
Hash[*a.map {|x| [x, true] }.flatten(1)]
とかだと分かりにくいんですが、何かいい方法ないでしょうか。
Hash#to_aでalistに変換されるのだから、
a.map {|x| [x, true] }.to_hash
のように、Array#to_hashでalistをHashに変換してくれるといいなと思うんですが。

164:デフォルトの名無しさん
12/02/25 13:45:01.28
>> RUBY_DESCRIPTION
=> "ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]"
>> a = %w(a b c d e f g)
=> ["a", "b", "c", "d", "e", "f", "g"]
>> Hash[a.map{|x|[x,true]}]
=> {"a"=>true, "b"=>true, "c"=>true, "d"=>true, "e"=>true, "f"=>true, "g"=>true}

165:163
12/02/25 14:20:08.01
>>164
おお、Hash[] に直接alistを指定できるんだ!長年の不満が解消されたよ。ありがとう!
ちなみにリファレンスマニュアル見たら一応書いてあった。
URLリンク(doc.ruby-lang.org)
self[*key_and_value] -> Hash の(4)に書いてあったけど、
self[other] -> Hash のところに書くべきだろこれ。

166:デフォルトの名無しさん
12/02/25 15:02:04.78
rubyでwebアプリをつくろう思うんだけど hamlつかってやる際参考なるサイトありますか?

167:デフォルトの名無しさん
12/02/25 15:23:07.32
書いてある順番がおかしいんだろうな
先にkey_and_valueのことが書いてあればわかるが、最初にあると何に対してotherなんだって感じ

168:デフォルトの名無しさん
12/02/25 15:43:40.70
>>161
まじっすか
でもぐぐっても対応してる情報が見つかりません

>>162
これいいですね

169:デフォルトの名無しさん
12/02/25 16:03:22.38
>>168

URLリンク(forza.cocolog-nifty.com)

対応するのは1.4だろうね。

170:デフォルトの名無しさん
12/02/27 14:48:36.31
Emacsで上で使うとなんかすっごいRubyプログラミングが便利になる定番プログラムとかライブラリとかありますか

171:デフォルトの名無しさん
12/02/27 19:00:03.50
>>170
1:あります
2:初心者丸出しの奴にそんなもの教えても意味ねえよ
3:条件によるだろアホか
どれがいい?

172:デフォルトの名無しさん
12/02/27 19:07:09.26
1かつ具体的に詳しく

173:デフォルトの名無しさん
12/02/27 20:56:03.21
eclipse使えばいいよ。

174:デフォルトの名無しさん
12/02/27 21:44:01.66
ruby1.9.2を使っています。

文字置換について教えて下さい。

文字コードが全てutf-8で扱っている前提で

org = "第1回"
temp = org.gsub(/第(.+)回/,"\1")

として"1"だけを取り出したいと考えています。
ところが上記を実行すると、
"1"と入って欲しい所が
tempは"\u0001"となります。

どうすれば"1"として取り出しできるでしょうか。



175:デフォルトの名無しさん
12/02/27 21:59:40.06
たまたま1だったから分かりづらいのかもしれないけど、
"" の中のバックスラッシュエスケープ記法として解釈されてる。
'' の中なら ' と ¥ 以外のエスケープは解釈されず、置換結果文字列記法における ¥1 になる。
つーか置換にはブロック使え。

176:デフォルトの名無しさん
12/02/27 22:16:19.56
なんでgsubの第2引数使う人がいるんだろう
どっか本にでも書いてあるんだろうか
燃やすから教えろ

177:デフォルトの名無しさん
12/02/27 22:18:20.03
ありがとうございます、おかげさまで理解できました。

ブロックを使うというのは、今回の例でいくと
temp = org.gsub(/第(.*?)回/) {$1}
となる訳ですね。
これなら""の誤りも確かにでにくいですね。


178:174
12/02/27 22:21:43.21
>>176
ググルで
「ruby 文字列 置換」
で検索してトップのほうにでるサイトのいくつかは、第二引数で使用しているもので
それがスタンダードなのだと思っていました。

179:デフォルトの名無しさん
12/02/27 22:47:47.59
うんにゃ、subとgsubの第2引数は通常使用しない
代わりにブロックを使う(ブロックの最後の返り値で置き代わる)
他の言語で一般的な「ばっくすらっしゅ1」という記法を許容するために
(または、「ばっくすらっしゅ1」ではなくバックスラッシュに続く数字1だと書くために)
めんどくさい書き方をしなければならないので人気がない

irb> s = "第76回"
irb> puts s.gsub(/第(.+?)回/,"\\1")
76

180:デフォルトの名無しさん
12/02/27 22:54:45.74
そんな嘘吐かずに個人的には非推奨とだけ言えばいいのに

URLリンク(www.koders.com)

181:デフォルトの名無しさん
12/02/27 23:19:15.96
URLリンク(rurema.clear-code.com)

一応るりまには、第2引数で$1, $2, $3...や\を使う時は注意が必要だから
間違いを避けて可読性を上げるためにブロック付きのsubやgsubを使うべきとは書いてるな。

$1とか\が絡まなきゃ第2引数使ってもよくね?わざわざブロック作るのも面倒だし
というのは俺の個人的な意見。

182:デフォルトの名無しさん
12/02/27 23:43:34.76
スレ的には「そもそも第2引数はないもんだと思って覚えてもらう」がベストだと思うがねえ
書くときにあらゆるものに注意して書けるくらいなら世の中からバグはもっと減っていてもいい

183:デフォルトの名無しさん
12/02/27 23:46:05.33
じゃあそういう仕様にしろよカス

184:デフォルトの名無しさん
12/02/28 00:00:43.41
無理
>>179の言う通り、\2などの「バックスラッシュと数字」を文字列リテラルで指定するためには第2引数のような仕様が、
文字列リテラルとして指定しない方法としてはブロックで $1 のように記述できる仕様が、どちらも必要

っていうか、第2引数がめんどくさ過ぎるからブロックで書けるようにしたんじゃなかったっけ
まあめんどくさいんだけど、将来マッチつき置換に書き変えるときにうっかりバグ仕込むよりはマシかと考える

185:デフォルトの名無しさん
12/02/28 00:19:58.36
g?subの第二引数を使ってる標準ライブラリは教育的観点から一度標準から外すべき
さあgrepしてみよう

186:デフォルトの名無しさん
12/02/28 07:28:33.81
ここまでのまとめ

gsubメソッドとgsub!メソッドは、文字列の中で正規表現のパターンにマッチした部分をすべて指定の文字列に置換します。

文字列で置換
str.gsub(pattern, replacement)
Ruby 1.9では、パターンの中で(?<名前>パターン)という形でカッコに名前を付けられます。第2引数replacementの中では、\k<名前>という書式でそのカッコに当てはまる部分を埋め込めます。
s = "one two, three four, five six"
puts s.gsub(/(?<first>\w+)\s+(?<second>\w+)/, '\k<second> \k<first>')

ハッシュで置換
Ruby 1.9 Ruby 1.9では、第2引数に{ マッチした文字列 => 置換文字列 }のようにハッシュを指定できます。次の例は、文字列中の< > & "をHTMLの文字参照に置き換えています。
s = '<hello> & "world"'
puts s.gsub(/[<>&"]/,
"<" => "<", ">" => ">", "&" => "&", '"' => """)

ブロックを使った置換
str.gsub(pattern) {|match| block }
s = "hello, world"
puts s.gsub(/\w+/) {|word| word.capitalize }

187:デフォルトの名無しさん
12/02/28 07:46:00.03
>>174
いまさらだけど
そもそもの要求が置換じゃないんだからgsubを使うのが間違い
マッチした部分を取り出したいだけならslice,[]の方がいい

temp = org[/第(.+?)回/,1]

それとマッチさせるのが数字限定なら.よりも\d
上の場合は漢数字とか全角とかあるかもしれんけど

188:デフォルトの名無しさん
12/02/28 16:11:10.74
多倍長整数(Bignum、符号なし)をArray#pack("Q")によりパックした文字列を
他のマシン(Windows、32ビット環境)で動作するrubyプログラムに送信したとします。

このとき、受信した文字列をString#unpack("Q")で変換するのは危ないですかね?
Cのlong longのサイズに依存しているということは、相手の環境によっては正しく変換されない可能性もあるんですよね・・・。
rubyは多倍長整数が扱えるので、何とかして環境を意識せずに扱いたいのです。

じゃぁ、整数をテキストとして送信すればいいじゃないか、と思われるかもしれませんが
事情により固定長のデータで送らなければならないのです。

189:デフォルトの名無しさん
12/02/28 19:14:45.10
どんな事情かを語らずにそんなクイズみたいなことされてもなぁ。

190:デフォルトの名無しさん
12/02/28 19:25:50.40
packとunpackは「同じマシン」でやることが前提
なんとなくunpackするだけでどんなマシン由来のデータも元に戻るなんてことはない
送信プロトコルや事前外部人力情報で相手の環境が知らされないのだとしたら、どうしようもないかもしれない

191:デフォルトの名無しさん
12/02/28 22:30:50.66
るりまのpackフォーマットより
システムに依存しないデータを扱うときには n, N, v, V を用います。
エンディアン非依存、整数サイズ非依存 (ネットワークプロトコルなどに適切)
n: big endian unsigned 16bit
N: big endian unsigned 32bit
v: little endian unsigned 16bit
V: little endian unsigned 32bit

これの64bit版があればいいのにね

今のところ、自前で32bit 二つにするしかないんじゃない
ll = 12345678901234567890
u = (ll >> 32) & 0xFFFFFFFF
l = ll & 0xFFFFFFFF
data = [u,l].pack('NN')
ll2 = data.unpack('NN').inject{|r,x| (r<<32)+x}
p ll2 # => 12345678901234567890
p ll == ll2 # => true


192:デフォルトの名無しさん
12/02/28 22:40:46.94
Q> と Q< は?


193:デフォルトの名無しさん
12/02/29 00:05:39.77
そんなものがあったとは
Ruby 1.9.3 でエンディアン指定が追加されたのか

ll = 12345678901234567890
data = [ll].pack('Q<')
ll2 = data.unpack('Q<').first
p ll2 # => 12345678901234567890
p ll == ll2 # => true


194:デフォルトの名無しさん
12/02/29 01:21:06.83
文字列を連結する場合に、
a = a + b
a << b
後者が圧倒的に速いようです

原因としては、前者だと新しいオブジェクトが作られていしまい、後者だと作られないからという理解でいいでしょうか?

195:デフォルトの名無しさん
12/02/29 02:20:42.12
よろしいです
まあ、速度差が出るなんてよっぽどだけど…
本質的には別個の動作であり、どっちかがどっちかの代わりになるものではないです(本当は)

なお a << b << c は単に a.concat(b).concat(c) であり、b は変化しません
irb> a, b, c = 'A', 'B', 'C'
irb> a << b << c
irb> p a
"ABC"
irb> p b
"B"
これが "BC" になると思ってる人が時々いますが、後ろから処理しそうな見た目に惑わされず前からメソッドチェーンとして考えて下さい

196:デフォルトの名無しさん
12/02/29 09:25:03.86
>>195
なるほど、勉強になるなあ。
func(a << b , b << c , c << a) だと左から順に評価されるので
a << b << c も同様だと、つい考えそうになる。

197:デフォルトの名無しさん
12/02/29 09:47:03.34
>>196
a << b << c という形式は、擬似的に書けば「a.<<(b).<<(c)」なんよ
んで、基本的に<<は処理後のa自身を返すのがマナーなんで
ずっとaに対する処理となる

…一応仕様上は<<が自身以外のものも返すことは出来るが
混乱させるだけなので基本やらない

198:デフォルトの名無しさん
12/02/29 11:21:19.51
>>197
>…一応仕様上は<<が自身以外のものも返すことは出来るが

できないんじゃないかなあ。
def <<(x); return "not self"; end
とかしても、Rubyのパーサが「<<」の戻り値を無視して、戻り値としてreceiverを強制的に使うようになってるはず

199:デフォルトの名無しさん
12/02/29 11:48:12.61
Rubyerって何でPHPに敵対心むき出しなの?
どんだけだよ
URLリンク(j.ktamura.com)

200:デフォルトの名無しさん
12/02/29 12:00:59.76
>>198
1.8.6では強制的にreceiverが戻り値になることはないようだ。
URLリンク(codepad.org)

手元のruby 1.9.3p125でも同様の結果だった。

201:デフォルトの名無しさん
12/02/29 15:01:01.55
>>199
そのページ主がRubyer?で、世界中のRubyユーザを代表していると?

202:デフォルトの名無しさん
12/02/29 16:10:37.89
>>199=>>201

203:デフォルトの名無しさん
12/03/01 17:25:32.12
Rubyerって初めて聞いた

204:デフォルトの名無しさん
12/03/02 00:14:55.29
ちなみにRugbyはラグビーな

205:デフォルトの名無しさん
12/03/02 00:16:28.85
↓絶妙なオチでこの話題を終わらせてくれ

206:デフォルトの名無しさん
12/03/02 09:10:07.04
うんこ

207:デフォルトの名無しさん
12/03/02 13:09:43.46
Ruby UserでRuserってのはどうだ

決してLoserではない

208:デフォルトの名無しさん
12/03/02 13:46:45.56
PHPって主にwebで使われてるじゃないですか
Rubyは主にどの分野で使われているものでしょうか?

209:デフォルトの名無しさん
12/03/02 14:05:09.25
主に「外に出ない」部分で使われてます
賄い料理みたいな分野と言えばなんとなくわかってもらえますかぬ

毎日の賄い料理が便利に作れたり美味しく作れても客に出すメニューに載ることはまず無いが、
客に出すメニューの内容が賄い料理の経験で良い方向に変化することはありえるし、
「ただいま食事中」で店が長時間止まるようなこともなく、マズい昼食で料理人のテンションが下がることもない

210:デフォルトの名無しさん
12/03/02 15:09:12.43
それは例えばLinuxでシェルスクリプトを書くのに使われるとか
受信したメールを処理するなどの内部で処理するシステムを書くときに使われるってことでしょうか?

211:デフォルトの名無しさん
12/03/02 15:38:43.32
URLリンク(www.google.co.jp)

212:デフォルトの名無しさん
12/03/02 15:43:01.17
>>210
シェルスクリプトを知っているのなら、それのベターな代替位置だと思ってもらっていい
あなたやわたしが手元で作ってせいぜい10人が手元で使うもの
会社のサーバのcronで毎日ぐりぐり動いてるよくわからない何か
動作を書きなおすことはあっても、パフォーマンス計測して速度をチューニングされることはないようなプログラム
あとで絶対にCで作り直すからと言われつつも絶対にそのまま使われるプログラム

昔のPerlのようなもの(CGI用途?違うもっと前だ)という例えがどのくらい伝わるもんなのかよくわからん
キラキラしてテカテカした画面ができたり電気屋に箱がうず高く積まれたり雑誌の一面を飾ったりするようなサービスはできないが、
文房具のようにないと困るプログラムの作成言語
つまり糊

213:デフォルトの名無しさん
12/03/02 16:34:16.23
でも実際は、ちょっとした雑務処理をrubyで書くことはあまり無いよな。
シェルスクリプトの方が、汎用性あるし読める人が多いし。
わずかな作業効率と自己満のためだけにrubyで書くってのも馬鹿らしい。エンジニアとして糞

214:デフォルトの名無しさん
12/03/02 16:59:05.11
同一のIOを複数のスレッドが弄るとどうなりますか?

require 'socket'
sock = TCPSocket.open 'localhost', 80
t = Thread.start { loop { sock.write "HELLO" } } # 永遠に書き出す
loop { sock.read 4096 } # 永遠に読み出す
t.join
sock.close

215:デフォルトの名無しさん
12/03/02 17:40:42.73
iCORE7とか結構いいCPU積んでるパソコンを持ってる人に伺いたいんですが
Rubyのコンパイルってどのくらい時間がかかりますか?
自分のはセレロンなんですけど2時間かけても終わりません
速度が速くなるならパソコンの買い替えをしたいんですが

216:デフォルトの名無しさん
12/03/02 17:53:45.39
「シェルスクリプトで書ける」分野というのはそんなに広くはない
sedやawkとかの外部コマンド使いだしたらそれは「読みやすいシェルスクリプト」としての意味はないし、
シェル組み込みだけで書くなんて面倒にも程がある
一部LinuxディストリビューションでPythonがメインスクリプトとして採用されたのには理由があるってことだな
まあ、別にいいけど

217:デフォルトの名無しさん
12/03/02 18:00:22.38
>>214
ぐちゃぐちゃになります

>>215
20分くらい?
コンパイル仕事にしてるんでなけりゃ別に無理してまで買う必要はないとは思うが

218:214
12/03/02 18:13:12.63
>>217
マジで?
TCPのIOでもダメなんだ、やべぇな。。書き直しだ

219:デフォルトの名無しさん
12/03/02 18:13:58.00
コマンドを順々に実行するならシェルスクリプトが最強効率だけど、
自前でデータ持つとかになると途端に…

220:デフォルトの名無しさん
12/03/02 18:29:29.90
>>219
bash4では連想配列が使えるぞ
まあ、bashでシェルスクリプト書く奴はいないとは思うんだが

221:デフォルトの名無しさん
12/03/02 19:07:07.87
>>218
ソケットは受信用と送信用のバッファ持ってるから
受信または送信を行うのがひとつのスレッドだけなら問題ないよ

ただ受信バッファがカラならreadはブロックするし
送信バッファが満杯ならwriteはブロックする

222:デフォルトの名無しさん
12/03/03 03:42:09.06
>>215
さすがに2時間もかかってコンパイル終わらないようだと買い換えた方が良いのでは。
今はパソコンも安いし。
ちなみに手元のマシンだとconfigureから始めて4分くらい。
(rubyのバイナリ作るだけなら一瞬だけど。)

223:デフォルトの名無しさん
12/03/03 04:31:31.08
セレロンは糞

224:デフォルトの名無しさん
12/03/03 12:25:56.34
そうですか
やっぱ新しいの買おう
最近のスペックのは5万でもいいのあるし買っておきます

225:デフォルトの名無しさん
12/03/03 12:31:18.61
3万程度で自作しろ

226:デフォルトの名無しさん
12/03/03 12:34:41.11
福岡のルビービジネス広がる 参加企業5年で8倍に
URLリンク(www.nikkei.com)

227:デフォルトの名無しさん
12/03/03 13:15:24.06
日経が記事にしたってことはそろそろ終息ですな

228:デフォルトの名無しさん
12/03/03 16:23:07.10
<div>
<div class="test">aaaaaaaa</div>
<div class="test">bbbbbbbb</div>
</div>
上のHTMLの2番目のテキストbbbbbbbbを取得したくてXPathを利用してこう書きました
require "rexml/document"
include REXML
doc = Document.new File.new("test.xml")
result = XPath.first(doc, "//div[@class='test'][2]")
print result.text
これで取得はできるのですが以下のような構造だと取得できません
<div>
<div class="test">aaaaaaaa</div>
<div class="a">
<div class="test">bbbbbbbb</div>
</div>
</div>
HTMLの構造が分からないのでピンポイントで//div[@class='test']という書き方で取得したいのですが
//div[@class='test'][2]で取れません
どなたかご教示お願いいたします

229:デフォルトの名無しさん
12/03/03 16:36:05.93
//div[@class='test']な要素を最初のひとつだけではなく
全部返してくれるメソッドがあればいいわけだけど
チュートリアル見た限りではXPath.matchが使えそうだよ

doc = Document.new File.new("test.xml")
result = XPath.match(doc, "//div[@class='test']")
p result[1].text

230:デフォルトの名無しさん
12/03/03 16:40:47.55
勉強になりました
無事取れました
ありがとうございます

231:デフォルトの名無しさん
12/03/04 12:01:19.82
WindowsにRubyインストーラーで配布されているexeかzipから入れようと思います
zipから入れた場合は自分で環境変数を追加しますが
それ以外にすることはありますか?
インストーラーで入れるとアンインストールしてからインストーラー立ち上げるのが面倒くさかったり
複数のバージョンを切り替えるのが面倒くさいのでzipから入れたいと考えてます
C:\rubyにパスを通して、1.8.7と1.9.3をフォルダ名を切り替えて利用したいため

232:デフォルトの名無しさん
12/03/04 12:38:26.77
あとは関連付けくらいか

233:デフォルトの名無しさん
12/03/04 12:47:00.72
関連付けってしてないのですがしないとダメですか?
rbファイルはテキストエディタに関連付けはしてます
実行するときはコマンドプロンプトからおこないます

234:デフォルトの名無しさん
12/03/04 19:26:48.42
俺もそうしてる
ダブルクリック時はテキストエディタで開いて編集
どう考えても実行する回数より編集する回数のほうが多いから(あくまでも俺の場合

235:デフォルトの名無しさん
12/03/04 20:03:40.17
& # 12487 ; & # 12473 ; & # 12494;

↑こういう文字列を日本語に変換できますか?

236:デフォルトの名無しさん
12/03/04 20:27:57.24
楽にやるなら CGI.unescapeHTML(s)
まじめにやるなら数値抜き出して pack('U')


237:デフォルトの名無しさん
12/03/04 22:32:49.52
ありがとうございます
#!/usr/local/bin/ruby -Ku書いて、CGI.unescapeHTMLでできました。

238:デフォルトの名無しさん
12/03/05 00:11:15.44
Rubyスクリプトの実行はコマンドプロンプトやファイラーからだけで
エクスプローラーをまったく使ってないので
関連付けとかいらないんだけど

適切に関連付ければ
拡張子rbをbatファイルみたいな実行可能ファイルみたいに扱えるようになったりする

デフォルトが「エディタで開く」だと
コマンドプロンプトでスクリプト名だけ書いてもエディタで開いちゃう
デフォルトが実行するやつになってると
hoge.rb foo bar
で実行できる
環境変数PATHEXTに.rbを追加すると、拡張子無しの
hoge foo bar
で実行できる


239:デフォルトの名無しさん
12/03/05 06:59:19.26
ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]でMS Excelで出力したcsvファイルを処理しようとしているのですが,

require 'csv'
CSV.foreach("hoge.csv", 'r') do |row|
p row
end

としても
C:/ruby/lib/ruby/1.9.1/csv.rb:1198:in `delete': can't convert Symbol into String (TypeError)
と表示され,うまくcsvファイルが読み込めません。

webで検索して 'r' を 'r:sjis' としてみたり,元のcsvファイルを utf-8 に変換してみたりしても状況は変わりませんでした。

csvファイルのの扱い方など教えていただけないでしょうか。

240:デフォルトの名無しさん
12/03/05 18:16:53.46
>C:/ruby/lib/ruby/1.9.1/csv.rb:1198:in `delete': can't convert Symbol into String (TypeError)


241:デフォルトの名無しさん
12/03/05 20:52:16.32
>>239
'r' は不要というかそこにStringは来ない。エンコードを指定したい場合は、
CSV.foreach("hoge.csv", encoding: "shift_jis")

> foreach(path, options = Hash.new, &block)
> ...
> The options parameter can be anything CSV::new() understands. This method
> also understands an additional :encoding parameter that you can use to specify
> the Encoding of the data in the file to be read.

242:67
12/03/05 21:09:32.25
>>67
>f = File.Open("hoge.dat", "rb")
>
>data_array = f.Read(16)

今更質問の追加ですいません。。
上記のように、バイナリファイルを16Byte読み出し、

puts data_array[0]

とすると、データが化けてしまいます。

もちろん
data_array.each_byte{ |num|
print num
}
とすると、うまくデータは取得できます。

配列要素を取得するにはどうすればいいのでしょうか?
テキストファイル制御のサンプルは多いのに、
バイナリデータを取り扱うサンプルは少ないなあ。。


243:デフォルトの名無しさん
12/03/05 21:15:39.14
まあ>>68の回答が思いつく限り最悪だったからな

244:デフォルトの名無しさん
12/03/05 21:51:30.93
相変わらず質問のしかたがまずいですねぇ
「データ化ける」だけではよくわかりません
~になって欲しいのに
~になります
というように具体的に書いてもらわないと
それと、RubyのバージョンとかOSとかも書くといいでしょう

Ruby1.9以降だと想像すると
puts data_array[0]
は、data_arrayの先頭1バイトの「文字」を表示しますよ

puts data_array[0].ord
だとどうですか?


245:67
12/03/05 22:00:47.88
質問の仕方がまずくてすいませんでした。

rubyは1.9.2です。

やりたいことは、
「ファイルの先頭から数バイト、バイナリデータとして読み出して、
配列に格納し、先頭要素の値が所望の値、例えば0x0Aだったら、次の処理へ、、
という逐次処理をしたいと思ってます。

そのために、まずはファイルから読み出したデータがちゃんと配列に格納されたか、
チェックしたくて、putsコマンドで確認していました。

246:デフォルトの名無しさん
12/03/05 22:05:34.61
Ruby 1.8でも動かす可能性があるなら

data_array.bytes.to_a[0]
data_array.unpack("C16")[0]

という手もある。
バイナリファイルを扱うならunpackはほぼ必須だろう。

247:67
12/03/05 22:34:40.65
ありがとうございます!

ファイルから取得した配列は、バイト単位の要素になってるわけじゃないんですね?

文字単位?

だから、希望の単位に分割させるためにunpackを用いる、という理解でいいんですかね。

unpack、packの使い方をちゃんと理解しないといけませんね。

248:デフォルトの名無しさん
12/03/05 22:56:06.08
>>67
f.readの返り値はArrayではなくStringなのでdata_arrayという変数名は混乱の元。
unpackはStringをArrayに変換するメソッド。
data_array[0] の [] はArrayではなくStringに対するメソッド。Ruby 1.8と1.9で動作が違う。

249:デフォルトの名無しさん
12/03/06 13:59:52.09
rubyをはじめてみようと思ったのですがバイナリを落とせません。
ここの 1.9.2 i386 (32bit)というバイナリなのですが。
URLリンク(www.garbagecollect.jp)

250:デフォルトの名無しさん
12/03/06 14:01:01.31
宣伝うぜえ
今はRubyInstallerの時代だろうが

251:デフォルトの名無しさん
12/03/06 16:28:37.86
Ruby 1.9.2を使っています。下のコードをもっと短く書く方法はないでしょうか?
notebook = notebooks[notebooks.index{|n| n.name == "目的のノートブック" }]
notebooksが二度出てきてしまうのが気になります・・・

252:デフォルトの名無しさん
12/03/06 16:35:49.97
notebooks.find{|n| n.name == '...' }

253:251
12/03/06 16:37:43.54
>>252
ありがとうございます!Enumerableにfindというメソッドが定義されているのですね。
大変勉強になりました _ _

254:デフォルトの名無しさん
12/03/07 14:34:52.32
pattern = '\d'
while gets
print if /#{pattern}/
end

上記の場合正常に動くのですが

while gets
print if /\d/
end

こう直接書くと警告が出るのはなぜなのでしょうか?
(~/\d/とすれば出なくなったのですが)


255:デフォルトの名無しさん
12/03/07 15:18:42.01
うん、まあ、とりあえず、警告を読む努力はしてみてくれ
わけわからん警告も確かに多いんだが、最初からどうせわけわからんのだろうと放棄されるとちょっと寂しい

> warning: regex literal in condition

ということで、ふつうの正規表現リテラルをマッチ先省略表記で書くことはできない

irb> while gets; print if /\d/ end
(irb):1: warning: regex literal in condition
1
1
irb> while str=gets; print if str =~ /\d/ end
1
1

あと、Rubyにおいて $_ を利用した省略の書き方は全く行なわれない
きちんとローカル変数に代入しておくことを強く推奨

256:デフォルトの名無しさん
12/03/07 15:19:46.66
なんか足りなかった

while str=gets; print str if str =~ /\d/ end

257:デフォルトの名無しさん
12/03/07 16:00:42.10
ちなみに
print if /a/ while gets
は通るよ。>255と同じ警告がでるけど。

258:デフォルトの名無しさん
12/03/07 16:07:33.86
StringIOってどういう目的で使われるんですか?

ファイルからIO作る場合は、
中身を読むためにファイルを直接扱うよりも、読み取るためのインタフェースを持ったIOを作る
ということだと思うので直感的に分かります。

でもStringってそれ自体が生のデータですよね。何のためにIOクラスを作るんですか?

259:デフォルトの名無しさん
12/03/07 16:16:38.72
Ruby製でGUIで作ったソフトで有名なのってなんでしょうか?

260:デフォルトの名無しさん
12/03/07 16:19:33.91
>>259
ありません

261:デフォルトの名無しさん
12/03/07 16:24:37.79
>>258
printやreadが可能でありながら、実際のファイルに紐付いていないオブジェクトがStringIO
わかりやすいところでは「ファイルに書き込みするメソッドにIOの代わりに渡して中身を検分」という芸ができる
StringIOという名前は実のところあんまし実態を反映してない

262:デフォルトの名無しさん
12/03/07 16:46:35.35
>>258
ファイルと同様にStringIOはどこまで読んだか覚えていてくれるのが大きい

例えば <続くデータの長さを示す4バイトの文字列><データ> なんて
構造を持つ文字列を解析するのに次のどちらが楽かは明白

len = sio.read(4).to_i
data = sio.read(len)

pos = 0
len = buf[pos...pos+4].to_i
pos += 4
data = buf[pos...pos+len]
pos += len

263:デフォルトの名無しさん
12/03/07 18:12:29.87
>>261
>>262
ありがとうございます!面白いですね。
必要に迫られて生まれたクラスではなく、利便性のためにあるクラスということですね。


264:デフォルトの名無しさん
12/03/07 20:44:03.17
Stringインスタンスに対してかぶせてStringIOを作ることより、
空で作って、IOを引数にするメソッド(ロガーとか)に渡して、
あとで検分するのに使うケースが、個人的には一番多い。


265:デフォルトの名無しさん
12/03/07 20:46:56.90
1.9.3で推奨される文字コードの変換方法をそれぞれのパターンで教えてください
パターン1:変換できない文字があった場合、適当な文字に変換してスクリプトを走らせる
パターン2:変換できない文字があった場合、エラーを出してスクリプトが止まる

266:デフォルトの名無しさん
12/03/07 20:55:54.84
String#encodeのオプションに

パターン1: invalid: :replace, undef: :replace, replace: '〓' のように渡す。
パターン2: デフォルト(invalid: nil, undef: nil)で例外出して死ぬ。



267:デフォルトの名無しさん
12/03/07 21:03:17.58
>>265
変換できない文字があった場合、適当な文字に変換してもいいのならパターン1を使う
変換できない文字があった場合、エラーを出してもいいのならパターン2を使う

本気でどうでもよくて考えるのめんどくさくて言い訳もめんどくさい場合はパターン1の大家であるNKFにぶん投げる

268:デフォルトの名無しさん
12/03/08 01:39:07.24
>>259
LimeChatがRubyCocoaで作られていた。
今は違うみたいだけど。

269:デフォルトの名無しさん
12/03/08 02:53:29.72
>>259
有名かは知らないけれど、mikutter というのをたまに見かける

270:デフォルトの名無しさん
12/03/08 02:56:43.39
RPGツクール…はゲームの記述言語としてだから違うか。


271:デフォルトの名無しさん
12/03/08 10:53:50.25
なるほほど・・・
Python製のGUIソフトだとpycronとかkeyhacやキーボードランチャ(名前忘れました)があるんですが
RubyであまりないのはRubyはGUIに弱いからとかそういう理由があるのでしょうか?

272:デフォルトの名無しさん
12/03/08 11:02:53.21
Rubyは、おそいのです。しろうとがみても、こわいほどおそい

273:デフォルトの名無しさん
12/03/08 11:05:23.39
>>271 「RubyはGUIに弱い」
ruby tk
でぐぐったらでてくる

274:デフォルトの名無しさん
12/03/08 11:27:45.00
「多種多様なTcl/Tk拡張ライブラリが存在
→ ほぼすべてをRuby/Tkから利用可能」

RubyTk-seminar200709
永井さんとこのRuby/tk講習会資料2007(テキストとサンプルソース)
URLリンク(www.dumbo.ai.kyutech.ac.jp)
URLリンク(jp.rubyist.net)

275:デフォルトの名無しさん
12/03/08 11:29:59.44
やろうと思えばできるんだけど、わざわざやる必要がないので盛り上がってない、以下スパイラル
Windowsなら.netでいいし、絵を貼りつけたランチャー程度ならHSPとかでもいいし、Linuxでも動作したいならPythonでいい
せっかくのRubyなのにわざわざめんどくさい用途に使う理由ないじゃん? みたいな感じ

高枝切りバサミで具材切ってカレー作ったとして、それは凄いかもしれないが、真似しようとも思わないし、普及するとも思わないだろ

276:デフォルトの名無しさん
12/03/08 11:37:37.71
でも鋏の機構をそのままにマジックハンドつけたらバカ売れしたというのがRailsなので、そうそう無碍にするようなもんでもない
ただ、スレ的におすすめするようなもんでもないのは間違いないが

慣れた人が試しにやってみるようなもん

277:デフォルトの名無しさん
12/03/08 11:43:06.55
tkは使ったことあるけど、なんかRubyっぽい書き方にならなくてあんまり好きじゃない。

278:デフォルトの名無しさん
12/03/08 11:45:32.24
すみません、質問です。
トップレベルにメソッドを定義したのですが、
トップレベルのselfの特異メソッドでは無いようです。
いったいどこに定義されたのでしょうか?
ご回答よろしくお願いします。

def zzz1; 111; end
class << self
def zzz2; 222; end
end

#どっちも同じように呼び出せる
p zzz1 #=> 111
p zzz2 #=> 222

#zzz1はどこに?
p self.methods.select{|i| i =~ /zzz/} #=> [:zzz2]

279:デフォルトの名無しさん
12/03/08 11:46:13.96
Pythonで作ってあるのはクロスプラットフォームで動かせて、コンパイルが不要で使う人がスクリプトを修正してすぐに動かせるのがメリットかなと思ってました

280:デフォルトの名無しさん
12/03/08 11:58:25.13
>>278
irb> def nya; end
irb> p Object.private_methods.include?(:nya)
true


281:278
12/03/08 12:03:58.05
>>280
なるほど、privateとpublicの違いがあったんですね!
よくわかりました。素早いご回答ありがとうございました。

282:デフォルトの名無しさん
12/03/08 12:07:17.85
トップレベルでのメソッド定義は、特異メソッドになるのではなくて、
トップレベルにおける self ( main とか呼ばれてる)のクラス(つまり Object )の
プライベートメソッドになる。

283:278
12/03/08 12:25:06.42
>>282
ほんとだ!
つまり、他のクラスからでも呼び出せるようになるということですね。
Javaとは少し勝手が違うので難しいですね。
分かりました、ありがとうございました!

def zzz1; 111; end
class << self
def zzz2; 222; end
end

p Object.private_instance_methods.select{|i| i =~ /zzz/}

class Hoge
p zzz1 #=> 111 呼び出せる!
p zzz2 #=> NameError
end

284:278
12/03/08 12:34:39.85
Rubyでは親クラスのprivateインスタンスメソッドをサブクラスから呼べるんですね。
呼べるからこそ、上記の動作(Objectのprivateインスタンスメソッドをどこからでも呼び出せる)になるわけですが。
protected なら分からなくもないのですが・・・

class A
private; def aaa1; return 111; end
protected; def aaa2; return 222; end
end

p A.private_instance_methods.select{|i| i =~ /aaa/} #=> [:aaa1]
p A.protected_instance_methods.select{|i| i =~ /aaa/} #=> [:aaa2]

class B < A
def bbb
p aaa1 #=> 111 サブクラスから親クラスのprivateインスタンスメソッドを呼び出せる!
p aaa2 #=> 222
end
end

BBB.new.bbb

285:デフォルトの名無しさん
12/03/08 13:09:05.20
>>284
じゃあ聞こう
どうしてJavaの動作が「正しい」の?

286:278
12/03/08 13:13:07.72
>>285
「正しい」とは思っていませんよ。
privateメソッドをサブクラスから呼び出せたら、
protectedメソッドと同じ挙動になるのでprotectedの意味が無くなると感じただけです。

287:278
12/03/08 13:26:16.35
しかしこのprivateの挙動はいただけないですね。
Javaとは関係なしに。

とにかく、Rubyの挙動はわかりました。
大変参考になりました。
ありがとうございました。

288:デフォルトの名無しさん
12/03/08 13:45:01.38
>>286
だから、

いや、わかんないならいいよ

289:デフォルトの名無しさん
12/03/08 13:45:39.35
むかしはMatzも変えようとしてたけど、あまり大きな仕様変更はしない方針になったのでそのまま

290:デフォルトの名無しさん
12/03/08 13:49:02.14
>>288
なんでRubyの挙動が「正しい」と思ってるの?

291:デフォルトの名無しさん
12/03/08 13:49:45.00
Rubyの実装が正しいとは思わないが、Javaとは言語が違うんだから動作も違いうるということを意識してくれない人も困る

292:デフォルトの名無しさん
12/03/08 13:50:43.91
privateだけ使え派と、意味的にはprotectedなんだからprotected使え派に別れます
私は_hogehogeみたいに、メソッド名にアンダースコア付ける派です

293:278
12/03/08 13:53:03.63
>>283 で、「Javaとは少し勝手が違う」としか言ってないんですが・・・
勝手に「Javaが正しいと思ってる」と思わないで欲しいです・・・

294:デフォルトの名無しさん
12/03/08 13:53:43.46
>>291
JavaはJavaしか知らない人がとっても多い
(しかも特定のフレームワークをみんなが使ってるJavaだと勘違いしてたりもする)
せっかく別の言語なんだから、なにもかも別だと最初から思って欲しいなあ

295:デフォルトの名無しさん
12/03/08 13:54:40.23
>>293
あなたについての話はもう誰もしてないから帰っていいよ

296:デフォルトの名無しさん
12/03/08 13:54:45.32
rubyのは実装間違えただけだから

297:278
12/03/08 13:55:49.04
そうですか、さようなら。

298:デフォルトの名無しさん
12/03/08 13:57:47.22
>>296
じゃあどんな実装なら正しいの?

299:デフォルトの名無しさん
12/03/08 13:59:01.41
privateがあればいいんだよ

300:デフォルトの名無しさん
12/03/08 14:03:02.77
動作はこれでも構わないけど名前が間違ってるというのはよく聞く

301:デフォルトの名無しさん
12/03/08 14:12:42.12
まあrubyに限らずprotectedはいらないね

302:デフォルトの名無しさん
12/03/08 14:20:08.18
protectedを無くすなら、レシーバ付きのprivateメソッドの呼び出しを許さないとな

def <=> other
 #self.xxx と other.xxx を比較(xxxはprivate)
end

303:デフォルトの名無しさん
12/03/08 15:38:57.98
>>293
誰かの書き込みみて、そういやこういうことがあったなっていう居酒屋談義だから気にしないほうがいいよ。

304:デフォルトの名無しさん
12/03/08 15:43:30.91
>>293
>>286はなんだったのか
後になって変なこというから誰も相手にしたくないんだよ。もうRuby使わないで

305:254
12/03/08 15:46:28.03
>>255
レスありがとうございます。警告は読みました。なので最後の一文があります。
疑問点はなぜif /#{pattern}/では警告が出ず、if /\d/では警告が出るのか
というところでした。

>あと、Rubyにおいて $_ を利用した省略の書き方は全く行なわれない
$_を使う人はいないということでしょうか。
書く際はすらすら書けて便利だと思うのですが、
やはり可読性が下がるからなのかもしれませんね。

306:デフォルトの名無しさん
12/03/08 16:03:06.58
>>304
しつこい。
あんた性格悪いね。

307:デフォルトの名無しさん
12/03/08 16:09:53.54
>>305
/\d/ならパース時にどんな正規表現か確定できるけど
/#{ptn}/はptnの内容に依存するから
(パースし終えてからの)実行時にならないと確定できない
だからパース時には警告できない、とかそんなところだと思う

暗黙の$_を使うのはワンライナーぐらいだと思う
Perlに慣れてない人が読んだらまず読み違えるし

308:デフォルトの名無しさん
12/03/08 16:17:00.38
と思ったけどif /#{ptn}/;でも警告してしまって問題ない気もする
何か都合が悪いんだろうか。えらい人解説してください

309:デフォルトの名無しさん
12/03/08 16:45:24.69
>>305
前者だと、なぜ警告がでないんでしょうね?
実装のもれだと思いますけど

Rubyが出来た当初はPerlにならって$_を暗黙のレシーバーや引数として使うようになってましたが
いまとなっては、暗黙の引数はよくないだろうと言うことに

なかでも特に
条件式部分の単独の正規表現リテラルは
~/正規表現リテラル/ 扱いにするというのは
やり過ぎなので廃止の方向で
とう言うことなのでしょう

ちなみにワンライナーでコマンドラインに書いた場合には警告されません


310:デフォルトの名無しさん
12/03/08 18:28:44.43
>>308,309
えらい人でもなんでもないけど、
>>307上段の解釈、つまり「動的文字列だから」でいいんジャマイカと思うよ

311:デフォルトの名無しさん
12/03/08 21:10:58.99
なんかRORのおかげか、RUBY人口すごい増えた気がする。

312:デフォルトの名無しさん
12/03/08 22:53:54.86
え、いまさら?

313:デフォルトの名無しさん
12/03/08 23:27:28.55
生の正規表現リテラルを ~演算子が付いてるような扱いにするのが問題なので
やはり、単純な警告漏れだと思うのですよ

式展開をする場合はパースのしかたがちょっと違ってて
警告するようになってないだけなんじゃないでしょうか


314:デフォルトの名無しさん
12/03/09 09:19:50.06
ここで言っててもらちがあかんぞ。
rubyコミッタの看板背負って発言してる奴はここには誰もいないんだから。

315:デフォルトの名無しさん
12/03/09 19:09:43.87
>>295
>あなたについての話はもう誰もしてないから帰っていいよ
ここは初心者がずれた質問をしてもかまわない場所。
おまえこそ初心者スレに来るな。

316:デフォルトの名無しさん
12/03/09 19:33:49.99
すいません、アドバイスお願いします
Rubyを勉強するのですがやっぱりIDEから入ったほうがいいですか?
やっぱりメソッド?とかインポートするライブラリの名前を覚えてない状態なので
はじめはIDEの補完に頼りながらがいいのかなとおもっているのですがどうなんでしょうか?
慣れてきたらテキストエディタに移行するといいでしょうか?

317:デフォルトの名無しさん
12/03/09 19:42:31.10
初心者はまずvimを使いましょう
そこそこ慣れてきたらvimです
もう一人前かなと思ったらvimにするとよいでしょう

318:デフォルトの名無しさん
12/03/09 20:51:03.21
なんでもいいから、IDE入れて補完がどの程度役に立つか体感してみたらいいよ。


319:デフォルトの名無しさん
12/03/09 20:58:01.80
>>316
>>4 Rubyのためだけに新規導入するのはお勧めしない

320:デフォルトの名無しさん
12/03/09 21:13:53.96
# ダメ
str = "abc\tdefg\th"
1 while(str.sub!(/\t+/, ' ' * ($&.size * 8 - $`.size % 8)))
p str

# イイ
str = "abc\tdefg\th"
str =~ /\t+/
1 while(str.sub!(/\t+/, ' ' * ($&.size * 8 - $`.size % 8)))
p str

subの第一引数の正規表現より前で行われた正規表現の結果が
subの第二引数で用いた$&や$`に入るんですね。
仕様として捉えるべきなのでしょうか。
タブを空白に置き換えようとしました。


321:デフォルトの名無しさん
12/03/09 21:26:40.26
いや、違いますね。subは一切$&に関与しないようでした。
こうしたらうまくいきました。2回マッチさせているので非効率ですが・・。
str.sub!(/\t+/, ' ' * ($&.size * 8 - $`.size % 8)) while(str =~ /\t+/)
p str


322:デフォルトの名無しさん
12/03/09 21:33:27.53
# ゆとり
s.split(/\t/).map{|e|e.ljust(8)}.join

323:デフォルトの名無しさん
12/03/09 21:35:30.83
※ 正真正銘のゆとりであってお手本ではありません

324:デフォルトの名無しさん
12/03/09 22:07:20.63
>>316
【初心者のためのVim入門】
Vimを起動したら、以下の手順で編集モードが開始します。
少し長いですが頑張って覚えましょう。
[:] → [q] → [!] → [Enter] → [e] → [m] → [a] → [c]→ [s] → [Enter]



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch