2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Ruby 初心者スレッド Part 41

1 :◆SsSSsSsSSs :2011/02/10(木) 13:47:51
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。


2 :デフォルトの名無しさん:2011/02/10(木) 13:48:19
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
 ・「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」
  http://www.amazon.co.jp/gp/product/4797357401/
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
 ・「初めての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/
 ・「Ruby Way 第2版」(脱初心者向け)
  http://www.amazon.co.jp/dp/4798115339/
 ・ 「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
  http://www.amazon.co.jp/dp/4873113245/

以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません。
 ・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
  http://www.amazon.co.jp/dp/4873113946/



3 :デフォルトの名無しさん:2011/02/10(木) 13:48:40
Ruby 公式・非公式便利サイト2009

・Ruby Home Page 【公式、お役立ち度が微妙】
 http://www.ruby-lang.org/ja/
・Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
 http://www.ruby-lang.org/ja/man/
 http://www.ruby-doc.org/ 【詳しい英語版】
・HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
 http://elbereth-hp.hp.infoseek.co.jp/ruby.html
・Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
 http://www.ruby-doc.org/docs/ProgrammingRuby/
・Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
 http://jp.rubyist.net/magazine/

・逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
 http://www.namaraii.com/rubytips/
・はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
 http://d.hatena.ne.jp/keyword/Ruby

・RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
 http://www.rubyforge.org/
・GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
 http://github.com/

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 http://jp.rubyist.net/



4 :デフォルトの名無しさん:2011/02/10(木) 13:51:02
●関連スレ
Rubyについて Part 42
http://hibari.2ch.net/test/read.cgi/tech/1295081752/
●Railsスレ
【RoR】Ruby on Rails Part11
http://hibari.2ch.net/test/read.cgi/php/1292032736/
●アンチスレ
Rubyについて(アンチ専用) Part004
http://pc12.2ch.net/test/read.cgi/tech/1249737531/
●Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc12.2ch.net/test/read.cgi/tech/1155031689/
●GUIの使えなさを堪能するスレ
Ruby で GUI するスレ
http://pc12.2ch.net/test/read.cgi/tech/1269609576/
●ぶん投げスレ
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/

●前スレ
Ruby 初心者スレッド Part 40
http://hibari.2ch.net/test/read.cgi/tech/1292049975/
Ruby 初心者スレッド Part 39
http://hibari.2ch.net/test/read.cgi/tech/1287623173/
Ruby 初心者スレッド Part 38
http://hibari.2ch.net/test/read.cgi/tech/1282781922/
Ruby 初心者スレッド Part 37
http://hibari.2ch.net/test/read.cgi/tech/1274121477/



5 :デフォルトの名無しさん:2011/02/10(木) 13:51:37
【バージョンに関するよくある流れ】

Ruby 1.8.5(非安定板)→ Ruby 1.8.6(旧安定版、長期政権)→ Ruby 1.8.7(超お勧め)
Ruby 1.9.0(旧開発版)→ Ruby 1.9.1(旧1.9系列安定版)→ Ruby 1.9.2(1.9系最新安定版)

実のところ、よくできた教科書またはトラブル時に聞き倒せる師匠がいるなら 1.9.2 から入っても特に問題はない
1.9.2ユーザーの場合は「1.9.2使ってます」と断った上で質問してほしい由

【Windows版に関するよくある疑問】

初心者の人はとりあえず ActiveScriptRuby の 1.8.7 使っておけば間違いない(mswin32)
ttp://www.artonx.org/data/asr/
の題字のでかい 「ActiveScriptRuby 1.8.7(pなんとか) with-winsock2 tcl-stub」

マニュアルはWebで見ることもできるが手元にあると便利、1.8.7 の HTML ヘルプ版が
ttp://www.ruby-lang.org/ja/documentation/
の「Rubyリファレンスマニュアル刷新計画 chm版 1.8.7用」

夢のお告げ等、何かの間違いで Ruby の知識がない初心者時代から 1.9.2 を使いたいマゾい人は
ttp://www.artonx.org/data/asr/ の「Ruby-1.9.2-p数字 Microsoft Installter Package」

「Windows版Ruby」として紹介されることのある以下の「RubyInstaller」は
これ特有のトラブルの修復知識が必要なので今のところは初心者には勧めない(mingw32)
ttp://rubyinstaller.org/
このトラブルを回避できるようになったら初級者脱出かも



6 :デフォルトの名無しさん:2011/02/10(木) 22:04:40
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所

7 :デフォルトの名無しさん:2011/02/11(金) 09:42:30
スレたて乙

8 :デフォルトの名無しさん:2011/02/12(土) 17:56:10
プログラムの結果を出力する際は
基本的にはputsとprintとprintfを使い分ければいいのかな?
改行したいときはputsで
したくない時はprint
フォーマットしたい時はprintf
という感じでOKですか?

9 :デフォルトの名無しさん:2011/02/12(土) 18:28:34
p

10 :デフォルトの名無しさん:2011/02/12(土) 18:29:58
>>8
機能の違いを分かってればどれでもいいよ

11 :デフォルトの名無しさん:2011/02/12(土) 19:19:26
基本的にはputsしまくりだが、表示後の改行を確実に厳密にしたい場合はprintを使う
オブジェクトの内容を人間にわかりやすく表示するデバッグ用途ならp
いわゆるsprintフォーマットを使用したい場合は%やsprintfの結果をputsするのが多数派
標準エラー出力に表示するwarnというのもあるが誰も使ってない
$stderr.puts "error!" とか書く

12 :8:2011/02/12(土) 20:12:57
ありがとうございます!
pの存在を忘れてました。
そしてprintfの中に改行文字入れるよりputs sprintfなのか。なるほど。。

13 :デフォルトの名無しさん:2011/02/13(日) 09:15:09
puts "%x %d" % [10, 0xF]
とかもあるよね。

14 :デフォルトの名無しさん:2011/02/15(火) 17:00:55
>>11
そういや俺も warn の存在は知ってるけど何故かいつも $stderr.puts だな。
なんでみんな使わないんだろ?
「warn」だと字面的に目立たないからかなあ?

15 :デフォルトの名無しさん:2011/02/15(火) 17:26:09
warnが組み込みライブラリに入ったのって1.8に入ってからじゃないっけ
それ以前はstderr使うしか無かったと思うから、それでじゃね?

16 :デフォルトの名無しさん:2011/02/15(火) 19:00:52
warn知らなかった


17 :デフォルトの名無しさん:2011/02/15(火) 21:47:06
warnなんてあったのかw
宣伝不足じゃね?

18 :デフォルトの名無しさん:2011/02/15(火) 22:05:04
warn「うわ〜んT-T」

19 :デフォルトの名無しさん:2011/02/16(水) 03:54:19
warnなんてperlとの互換のために放置されてるだけで非推奨

20 :デフォルトの名無しさん:2011/02/16(水) 04:49:34
perlとの互換??

21 :デフォルトの名無しさん:2011/02/16(水) 12:01:25
さあ・・・

22 :デフォルトの名無しさん:2011/02/16(水) 13:26:38
>>19
非推奨kwsk

23 :デフォルトの名無しさん:2011/02/17(木) 00:37:36
なんで
(1..5).each(&method(:puts))

(1..5).each { |num| puts num }
になるの?

24 :デフォルトの名無しさん:2011/02/17(木) 01:20:01
それはもうそういうもんだとおもっていただくのがいちばんよろしいかと思われます
すぱぁと明確に説明できる人は今のところ現れておりませぬ
inject みたいにわかりやすい変形ができるならよかったのですが

25 :デフォルトの名無しさん:2011/02/17(木) 01:27:23
マクロとかテンプレートのノリだと思えばいいんじゃないか
というかそういう変形が出来ると初めて知ったのですが

26 :デフォルトの名無しさん:2011/02/17(木) 01:36:50
そうですか
(1..5).map(&(1.method(:+)))
=> [2, 3, 4, 5, 6]
おおっ、できました
それではなんとなく分かった気分になっておきます

27 :デフォルトの名無しさん:2011/02/17(木) 01:38:23
>>23
>(1..5).each(&method(:puts))
これは
proc_obj = method(:puts).to_proc()
(1..5).each(&proc_obj)
とおなじ。
そしてこれは
proc_obj = Proc {|x| puts x }
(1..5).each(&proc_obj)
とおなじ。
そしてこれは
(1..5).each {|x| puts x}
とおなじ。


てきとーに書いてみたので、まちがってたらごめん。


28 :デフォルトの名無しさん:2011/02/17(木) 01:53:25
proc_obj = method(:puts).to_proc()
から
proc_obj = Proc {|x| puts x }
を詳しく

29 :デフォルトの名無しさん:2011/02/17(木) 01:56:47
うむ
というか、それ以外は既に何度も出てきてる

30 :デフォルトの名無しさん:2011/02/17(木) 02:02:55
1.8だとクラスの特異クラスのスーパークラスはClassクラスの特異クラスなのに1.9だとクラスの特異クラスのスーパークラスはクラスのスーパークラスの特異クラスなんだね〜。
なんで仕様が変わったのかな?

31 :デフォルトの名無しさん:2011/02/17(木) 09:41:32
method(:puts)ってのはself.method(:puts)と同じ。
つまりself.putsをeachに渡してるわけだけど
このself.putsってのは大抵はKernel.putsのこと。
なので(1..5).each { |num| Kernel.puts num }と同じ意味になるって感じかなぁ…?

32 :デフォルトの名無しさん:2011/02/17(木) 10:01:45
>>27
>>(1..5).each(&method(:puts))
>これは
>proc_obj = method(:puts).to_proc()
>(1..5).each(&proc_obj)
>とおなじ。

to_proc()をつけなくても表面上の動作は変わらないのですが、>>27さんの例示では何故
to_proc()をつけているのでしょうか?

proc_obj = method(:puts)
(1..5).each(&proc_obj)

to_proc()をつけるつけないで意味合いが違うのでしょうか?

33 :デフォルトの名無しさん:2011/02/17(木) 10:14:16
http://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html#a.a5.d6.a5.ed.a5.c3.a5.af.c9.d5.a4.ad.a5.e1.a5.bd.a5.c3.a5.c9.b8.c6.a4.d3.bd.d0.a4.b7
これに書いてあるように&を付ける引数にはto_procを持つオブジェクトを渡すことができて
実はその時にto_procを呼んでprocオブジェクトに変換していますよーって話
>>27 は分かりやすいようにそれを明示してるだけだね

34 :デフォルトの名無しさん:2011/02/17(木) 10:20:28
>>32
動作に違いがないのはその通り。同じことを分かりやすく書いただけだから。
33が説明してくれてるけど、&proc_objとすると、暗黙的にproc_obj.to_proc()が呼ばれる。
それだと初心者にはわかりづらいだろうから、明示的に .to_proc() を呼びだしているだけ。

35 :デフォルトの名無しさん:2011/02/17(木) 10:48:11
Rubyは
if () {

}

みたいに括弧で書く方法は用意されてないのでしょうか?
basicみたいにendなど使うのに違和感があります

36 :デフォルトの名無しさん:2011/02/17(木) 10:59:20
>>33-34
なるほど、そういうことですか。
&をつけると、暗黙的にto_proc()が呼ばれるんですね。

37 :デフォルトの名無しさん:2011/02/17(木) 11:16:19
>>35
ない
if はブロック構造ではないので { } で代用することはできない
まあ、実際問題としてすぐ慣れる

38 :デフォルトの名無しさん:2011/02/17(木) 12:09:29
>>35
最初は気持ち悪いかもしれません。それは仕方ないです。
でもすぐに慣れると思います。Lispだと慣れない可能性大ですが、Ruby程度なら十分慣れます。

39 :デフォルトの名無しさん:2011/02/17(木) 12:32:37
これって作者の趣味でそうなったの?

40 :デフォルトの名無しさん:2011/02/17(木) 13:35:01
>>39
このへんは初期構造を引き継いでるので、本人の趣味と断じてしまえばまあ、そうなんだが、
Ruby では { } は
 ・ Hash リテラル {'one' => 1, :two => 2}
 ・ スコープを作るブロック構文 arr.each{|x| puts x}
 ・ リテラル中の埋め込み "#{mes}"
に既に使用されてて若干構文解析負荷が高い
それに加えて「スコープを作らない if かもしれないヨ〜」というのを付け加えるのはさすがにちょっと、
というようなのがあったんじゃないかなーと外野推測

41 :デフォルトの名無しさん:2011/02/17(木) 16:57:54
to_procの話題なら前スレでも出てるのに

42 :デフォルトの名無しさん:2011/02/17(木) 17:35:15
Ruby覚えたてのころよくやった遊び

def IF(bool)
if bool then yield end
end

IF(true){puts 'true!'}

elseは綺麗にかけない


43 :デフォルトの名無しさん:2011/02/17(木) 17:47:44
def THEN(&blk) blk end
def ELSE(&blk) blk end
def IF(bool,tblk=nil, fblk=nil)
if bool
if tblk.respond_to?(:call)
if block_given?
raise
else
tblk.call
end
elsif block_given?
yield
end
elsif fblk.respond_to?(:call)
fblk.call
end
end

IF(true){puts 'true'}
IF (true),THEN{puts 'true'},ELSE{puts 'false'}
IF (false),THEN{puts 'true'},ELSE{puts 'false'}

IF直後の空白重要
なんか、ぶさいく



44 :デフォルトの名無しさん:2011/02/17(木) 18:00:58
>>41
"結論"は出てない

45 :デフォルトの名無しさん:2011/02/17(木) 18:37:17
>>23は普段使わない機能の複合なのでめんどくさいのだよな
そもそも>>33のいうように、mes(&pr) とすると mes{|x| ...} の {|x| ...} 部分を
proc オブジェクトとして「分離して」おいて代入することができる

['a', 'b', 'c'].each{|x| puts x.upcase} #=> A B C
pr = proc{|x| puts x.upcase}
pr.call('yes!') #=> "YES!" # proc のいちばん一般的な使いかた
['a', 'b', 'c'].each(&pr) #=> A B C

> to_proc メソッドを持つオブジェクトならば、`&' 修飾した引数として渡すことができます
> (デフォルトで Proc、Method オブジェクトは共に to_proc メソッドを持ちます)。
ということで、内部的には to_proc メソッドが呼ばれて「ブロックが復元」されてるらしい

場面転換

method という関数的メソッドがあり、これは Object#method を呼ぶ
Object#method(name) は self の name というメソッドをレシーバとの関係ごと固定化してオブジェクトとして返す

m = Kernel.method(:puts)
m.call('message!') #=> "message!"

Method#call(args) という、proc とまったく同じ書き方(ここ最重要)で時間差起動することができる
で、これらを踏まえると

(1..5).each(&method(:puts)) は
(1..5).each(&putsメソッドのMethodオブジェクト)
(1..5).each(&呼ばれたときの引数をputsに渡すprocオブジェクトのようなもの)
(1..5).each(& proc{|x| puts x})
(1..5).each{|x| puts x}

となる
でどうよ

46 :デフォルトの名無しさん:2011/02/17(木) 19:18:39
いやそこじゃなくてレシーバや引数がどう決まるかがよく分からないんだ
&:foo
1引数のとき {|x| x.foo }
2引数のとき {|x, y| x.foo y}

&method(:foo)
{|x| self.foo x}


47 :デフォルトの名無しさん:2011/02/17(木) 21:03:53
今日始めた初心者です.

a = [ 1, 2, 3, 4 ]
a.inject {|a, b| a + b}
=>10

の後,

a
=>6

となるのが納得できません.

仕様書のどの辺に書いてあるか教えてください.


48 :デフォルトの名無しさん:2011/02/17(木) 21:12:14
読んで理解するような仕様書とかはないんだが、Ruby ではブロック引数は被ると考えてもらっていい
被らないバージョンのRubyも存在するが、互換性の問題でこれに頼った記述は全く勧められないので忘れてくれ

a.inject{|x, y| x + y}

とか書くのが一応回答

49 :デフォルトの名無しさん:2011/02/17(木) 21:15:50
>互換性の問題でこれに頼った記述は全く勧められない
そうなんだよなあ…
何がめんどくさいって、ここが問題で1.8ではうまく動作しないということを見つけるまでが果てしなくめんどくさい

50 :デフォルトの名無しさん:2011/02/17(木) 22:01:07
>>47
「a」.inject {|「a」, b| 「a」 + b}
上のaは全部同じオブジェクトなのでループしたときにaが上書きされる

51 :デフォルトの名無しさん:2011/02/17(木) 22:04:25
>>46
&:foo と &method(:foo)は見た目似ているけど
仕組みは全然違うから混同しちゃダメ。

後者はあくまでもself.method(:foo)のことで
self.foo をMethod Objectとして取り出しているので
{|x| self.foo x}と同じ意味になる。

&:foo の方はSymbol#to_procによってProc Objectに変換されるので
実際には :foo.to_proc がブロックとして渡されてる。
Symbol#to_procってのは
class Symbol
  def to_proc
    proc{|obj, *args| obj.send(self, *args)}
  end
end
な感じの定義なわけでつまり:foo.to_procは
proc{|obj, *args| obj.send(:foo, *args)}
ちょっと書き換えると
proc{|obj, *args| obj.foo(*args)}
となる。 つまり1つ目の引数のメソッドfooに残りの引数を引き渡す感じ
{|x| x.foo }とか {|x, y| x.foo y }と同じ動作になる

52 :デフォルトの名無しさん:2011/02/17(木) 22:32:50
OK, 理解した。ありがとう
&method(:foo)のほうは{|*args| self.foo *args}かな

しかし↓この説明でそこまで分かる人いるのか?
Symbol#to_proc -> Proc
self に対応する Proc オブジェクトを返します。

(1..3).collect(&:to_s) #=> ["1", "2", "3"]
(1..3).inject(&:+) #=> 6



53 :デフォルトの名無しさん:2011/02/18(金) 00:15:26
>Ruby ではブロック引数は被ると考えてもらっていい
1.9からは被らずにちゃんと遮蔽するよ
ついでに実験的仕様でブロックローカル変数を作れるようにもなった
a,b = :a,:b
[:foo].each do |a;b| # ;の後ろにブロックローカル変数を宣言できるぞ
b=:bar
p [a,b] #=> [:foo,:bar]
end
p [a,b] #=> [:a,:b]

1.8までは何でも書けたらしいね
a = [[:a,:b,:c]]
a.each{|a,$b,@c|}
p [a,$b,@c] #=> [:a,:b,:c]

>>50
ちょっとちがうんじゃね?
オブジェクトうんぬんじゃなくて、ローカル変数のスコープの話だと思うんだけど


54 :デフォルトの名無しさん:2011/02/18(金) 00:19:29
>>53
>互換性の問題でこれに頼った記述は全く勧められないので忘れてくれ

55 :デフォルトの名無しさん:2011/02/18(金) 00:35:39
ぐぇ〜,みんなありがとう.有名な話だったのね.

っていうか 1.8 が消え去るまで ruby やる気が失せた...

ありえないだろJK.

56 :47:2011/02/18(金) 00:38:00
↑ 47 でした.


57 :デフォルトの名無しさん:2011/02/18(金) 01:31:00
Rubyではローカルスコープの外に同名の変数があるとそれへの参照となり
なければ新たな変数の定義となる(ただし1.9系のブロック引数は常に後者)

宣言無しで変数を使えますよ系言語の欠点

外側に同名の変数があっても新たな変数を定義できるような構文が欲しくなることがある

58 :デフォルトの名無しさん:2011/02/18(金) 02:05:13
というか広めのスコープに1文字変数使うやつってなんなの?
ブロック等の一番せまいスコープならまだ許せる
i、jは例外だと思うけど、それでもスコープ狭くするべき
テンポラリでないなら変数にちゃんとした名前つけろ

59 :デフォルトの名無しさん:2011/02/18(金) 02:09:22
なんなのっていうやつなんなの

以下スタック食いつぶすまで続く

60 :デフォルトの名無しさん:2011/02/18(金) 02:10:55
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1 [2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.

61 :デフォルトの名無しさん:2011/02/18(金) 02:25:35
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1
[2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.


62 :デフォルトの名無しさん:2011/02/18(金) 02:59:54
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1
[2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.

63 :デフォルトの名無しさん:2011/02/18(金) 03:02:40
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1
[2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.

64 :デフォルトの名無しさん:2011/02/18(金) 03:20:10
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1
[2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.

65 :デフォルトの名無しさん:2011/02/18(金) 08:54:01
1.8のときは、自分でスタックに積んでた。

def local &block
local_vars = eval("local_variables", block)
name_of_vals_arr = "__local_vals"

loop do
break if local_vars.all?{|var| var != name_of_vals_arr }
name_of_vals_arr += "_"
end

eval("#{name_of_vals_arr} = [#{local_vars.join(',')}]", block)

yield

local_vars.each{|var| eval(var + " = #{name_of_vals_arr}.shift", block) }
end

i = 1
j = 2

puts "i = #{i}, j = #{j}" # => i = 1, j = 2

local do
i = "a"
j = "b"
puts "i = #{i}, j = #{j}" # => i = a, j = b
end

puts "i = #{i}, j = #{j}" # => i = 1, j = 2

66 :デフォルトの名無しさん:2011/02/18(金) 19:29:03
ファイルの先頭に追加書き込みってできるんでしょうか?
ファイルポインタを動かしても write を使うと後ろに書き込まれてしまいます。
よろしくお願いします。

67 :デフォルトの名無しさん:2011/02/18(金) 20:10:25
>>66
いわゆる挿入モードは一発ではできません、が回答だと思う…
そーゆーもんなので、どうしようもない

irb> File.open('a','w'){|f| f.puts "111\n222\n333\n444"}
irb> puts File.open('a'){|f| f.read}
111
222
333
444
irb> File.open('a','r+'){|f| body = f.read; f.rewind; f.puts "000\n#{body}"}
irb> puts File.open('a'){|f| f.read}
000
111
222
333
444


68 :デフォルトの名無しさん:2011/02/18(金) 20:35:31
Google Code Jam Japan 2011
http://code.google.com/codejam/japan

rubyでも参加できるらしいぞ。

69 :デフォルトの名無しさん:2011/02/18(金) 20:58:30
Rubyだと(処理性能的な意味で)力技で通せなさそうだな

70 :デフォルトの名無しさん:2011/02/19(土) 12:34:33
            end
          }
        end
      }
    end
  end
end
↑はちょっと大げさだけど混在が気持ち悪い。
みな賛同してますか

71 :デフォルトの名無しさん:2011/02/19(土) 12:35:55
皆さん、どうしてますか?

72 :デフォルトの名無しさん:2011/02/19(土) 12:52:13
基本{}はワンライナーで書くようにしてる

73 :デフォルトの名無しさん:2011/02/19(土) 15:20:15
>>70
あまり気にしてない

ちょっと慣れると、エンドという英単語を読んでるわけではない、という境地になる
ただのヨコ長のブロック終端記号だ

74 :デフォルトの名無しさん:2011/02/19(土) 15:43:09
>>70
>混在が気持ち悪い。
混在は気にしないかな。end自体は気にするけど。

75 :デフォルトの名無しさん:2011/02/19(土) 17:58:52
ブレースが見た目に浮くことを利用して
リソース管理や大域脱出のブロックはブレースを使って目立たせる
コーディングルールもあったはず

76 :デフォルトの名無しさん:2011/02/19(土) 23:28:37.73
ご意見ありがとうございました
参考にさせていただきます

77 :デフォルトの名無しさん:2011/02/20(日) 07:25:41.22
Windows上でファイルをRubyのプログラムに
ドラグ&ドロップしたときの実行パスを取得するには、どうすればいいのでしょうか?
よろしくお願いします。

プログラムを通常実行したなら、File.expand_path(__FILE__)でパスが取れるのですが、
ドラグ&ドロップ時には、File.expand_path(__FILE__)の中身が、
  C:/Documents and Settings/ユーザー名/実行ファイル名.rb
となってしまいます。

78 :デフォルトの名無しさん:2011/02/20(日) 07:44:55.62
>>77
期待通りだけど何がマズイ?

79 :デフォルトの名無しさん:2011/02/20(日) 07:46:08.87
>>77
聞き方がおかしかった。どういう値になるのを期待している?



80 :77:2011/02/20(日) 08:03:45.59
>>79
>聞き方がおかしかった。どういう値になるのを期待している?
c:\temp\program.exe
の上にファイルをドラッグしたら、c:\tempのパスが取得できることを期待しています。
(プログラム自体は、program.rbをexerbでprogram.exeに変換しています)

できれば「program.exeへのショートカット」上にドラッグしたとしても、
元のc:\temp\program.exeの実行パスを取得したいです。


81 :デフォルトの名無しさん:2011/02/20(日) 10:08:07.34
>>80
ttp://exerb.sourceforge.jp/man/doc/class.ja.html

82 :77:2011/02/20(日) 14:52:00.80
>>81
ありがとうございます。とても助かりました。

83 :デフォルトの名無しさん:2011/02/20(日) 23:24:10.74
>>70
Python に乗り換えた

84 :デフォルトの名無しさん:2011/02/21(月) 08:00:25.78
Windows上で ruby 1.9.2 を使い、ファイル名がUNICODEで
ファイルの中身がWindows-31Jのテキストファイルで正規表現を使うにはどうしたら良いの?
# coding:utf-8 と書くとファイルは開けるけど正規表現でエラー
# coding:Windows-31Jと書くとファイル名が文字化けして開けず


85 :デフォルトの名無しさん:2011/02/21(月) 08:09:36.27
文字エンコーディングの概念ない奴は1.8使えバーカバーカって煽られそうな内容だな
マジックコメントにはソースファイルの文字エンコーディングを記述する
openに渡すファイルパス名のStringオブジェクトの文字エンコーディングをUTF-8にして
マッチに使う正規表現の文字エンコーディングをWindows-31Jにすればよかんべ
Ruby1.9はぜんぶ別個にできるぞ

86 :デフォルトの名無しさん:2011/02/21(月) 08:50:12.61
あと、読み込むファイルのエンコーディングも
ばらばらに指定できるぞ。


87 :デフォルトの名無しさん:2011/02/21(月) 10:32:40.65
>>84
>ファイルの中身がWindows-31Jのテキストファイルで正規表現を使うにはどうしたら良いの?
こっちを優先して、コードはwindows-31jで書く。
ほんで、ファイル名を表す文字列はunicodeに変換してやる。

88 :デフォルトの名無しさん:2011/02/21(月) 10:49:29.19
おまい頭いいな

89 :デフォルトの名無しさん:2011/02/21(月) 14:13:01.98
Ruby初心者向け1.9文字エンコーディング教室とかサイト作ったら繁盛するかな

90 :デフォルトの名無しさん:2011/02/21(月) 15:09:28.21
絶対繁盛するからやってくれよ

91 :デフォルトの名無しさん:2011/02/21(月) 18:01:35.10
つーかファイル名をutf-8で直書きすれば普通に開けるのを今知った。M系APIだとばかり
ARGVはダメっぽい?

92 :84:2011/02/21(月) 20:18:15.66
自己解決しました。自分も>>87の方法に行き着きました。

あと、Encoding.default_internal がよく分かりません。
指定しておくと読み込んだ内容がその文字コードに変換されるのかと思ったんですが……


93 :デフォルトの名無しさん:2011/02/22(火) 00:51:00.99
>>80
ちょっと遅レスだが
require 'Win32API'
rubypath = "\0"*2048
Win32API.new('kernel32', 'GetModuleFileName', %w(i p i), 'i').call(0,rubypath,rubypath.size)
rubypath.rstrip!
p rubypath


94 :デフォルトの名無しさん:2011/02/22(火) 13:37:28.41
rvm使ってる人は自分用CGI起動するRubyとかgemとかどうしてるの?

95 :デフォルトの名無しさん:2011/02/22(火) 15:59:04.40
>>89
むしろ、昔から使ってるひと向けに

96 :デフォルトの名無しさん:2011/02/22(火) 16:05:11.22
中学生が書いたパッチ見たけどさっぱりわからなかった。

97 :デフォルトの名無しさん:2011/02/22(火) 16:30:55.98
むしろ中学生が書くとプログラムという半定型文法文の何が変わるつもりだったのか>>96に聞いてみたい

98 :デフォルトの名無しさん:2011/02/22(火) 16:40:10.29
たわいもないレスにむきになりすぎだとおもいます。

99 :デフォルトの名無しさん:2011/02/22(火) 17:26:16.31
これか

リアル中2、Ruby最年少コミッタに就任【増田(@maskin)真樹】
http://techwave.jp/archives/51599766.html

100 :デフォルトの名無しさん:2011/02/22(火) 17:34:49.25
これはいいニュースだ。将来は第2代教皇だな

101 :デフォルトの名無しさん:2011/02/22(火) 19:34:27.07
スレッドについて初心者が学ぶのに最適な書籍はあるでしょうか
手元にあるたのしいRubyには全く載っていませんでした

102 :デフォルトの名無しさん:2011/02/22(火) 20:00:56.10
そもそものスレッドに関しての知識があれば楽勝

とかいうようなシロモノなので結構厳しい

103 :デフォルトの名無しさん:2011/02/22(火) 21:58:19.20
ダグリーの本のRuby版みたいなのか
あったらいいね

104 :デフォルトの名無しさん:2011/02/22(火) 22:05:43.44
だれやねん、それ

105 :デフォルトの名無しさん:2011/02/22(火) 22:12:17.94
調べずに書くが、並列処理とかで有名な大学教授
JavaのConcurrentパッケージとか日本語訳もされてる
並列処理関連のJava本を書いてたような

106 :デフォルトの名無しさん:2011/02/23(水) 00:34:22.12
『Java並行処理プログラミング 』はいい書籍だが、
Doug Leaはダグリーって呼ぶのだろうか……?

107 :デフォルトの名無しさん:2011/02/23(水) 00:48:35.76
ダグ=リーかダッグ=リーだと思う

108 :デフォルトの名無しさん:2011/02/23(水) 01:54:16.68
>>106
普通に英語読みしたらダグリーだけど
実は英語圏出身じゃなくて読み方が微妙に違うとか何とかあるのかい?


109 :デフォルトの名無しさん:2011/02/23(水) 02:04:44.44
フルネームは Douglas Lea なわけで、
DougはDouglas の愛称のダグなので確定として、
Leaのほうは、英語読みすればリーかな、程度だなぁ。

ま、実際彼の名のカタカナ書きはダグ・リーが一般的。

110 :デフォルトの名無しさん:2011/02/23(水) 06:44:52.71
RubyとかCとかJavaとかLispとか色々使える人が、
「ここはRubyで書くかな」って判断する基準って何かありますか?

111 :デフォルトの名無しさん:2011/02/23(水) 06:54:51.44
>>110
そんなものはない
Rubyで書きにくい・動かしにくい・指定されてないから他の言語で書く

112 :デフォルトの名無しさん:2011/02/23(水) 07:53:36.19
Rubyのほうが低コストなとき

113 :デフォルトの名無しさん:2011/02/23(水) 09:02:46.90
Lisp以外との比較なら、メタプログラミングならRuby。
マクロならLisp。

114 :デフォルトの名無しさん:2011/02/23(水) 10:07:20.76
文字列処理が多いならRuby
再帰が多いならScheme
GUI扱うならJava
ライブラリ開発や、OSのAPIとか使いまくるならC

115 :デフォルトの名無しさん:2011/02/23(水) 16:06:26.92
class Vec
attr_accessor :x, :y, :z

def setp
@x = "@x"
self.y = "self.y"
z = "z"
end

def say
print x,' ',y,' ',z
puts
end
end

本を読みながらこんなの書いて実験してみたけど・・・
@変数とself.変数って同じ挙動だから好きな方使っていいんですよね?
高度な使い方すると違うかもしれないけど、そこまで到達してないから違いがわかんない

116 :デフォルトの名無しさん:2011/02/23(水) 16:55:45.56
var = 1

puts "this number is #{var}" => this number is 1
puts "this number is" + var => エラー

この仕様は何か意図があるんでしょうか。。
fixnumを自動でstringに変換してくれてもいいのに、って思ってしまいます。
譲って後者をエラーにするのであれば前者もエラーにすべきとも思います。
rubyistの方のどのように考えているのですか?

117 :デフォルトの名無しさん:2011/02/23(水) 17:09:35.97
>>115
ぶっちゃけ最初はよくわからないと思う
クラス定義の中から使うなら @変数 を使う、
クラス定義の外から使うならメソッド使う、でしばらくいっと毛

118 :デフォルトの名無しさん:2011/02/23(水) 17:30:30.29
>>116
var = 1
puts "this number is #{var}" # varがto_sされるのは誰が見ても明らか
puts "this number is " + var # これも明らか
other_var + var # どうだっけ

119 :デフォルトの名無しさん:2011/02/23(水) 17:32:18.51
>>118は + で一方のオペランドの自動変換を許した場合のシナリオ

120 :デフォルトの名無しさん:2011/02/23(水) 17:37:21.52
>>116
思いっきり大前提として、「+は表示用連結記号ではない」というのをしっかり認識して欲しいと思う
puts "STRING" + var は "STRING" + var つまり "STRING".+(var) の返り値を puts に渡してるに過ぎない
表示するときに便利とかどうでもよくて、String クラスのインスタンスメソッド + の処理結果を利用している

で、String#+ の引数に String クラスのオブジェクト以外がきたとき、どうするのが本来好ましいか

 ・ 引数のオブジェクトの to_s メソッドを勝手に試して、自身と連結して返す ← まちがい
 ・ 引数のオブジェクトが文字列と全く同じ動作をする場合にのみ、自身と連結して返す ← せいかい!

ということで、自分と同じ動作をするオブジェクトである場合に限って + で連結を試す
+ の引数になるということは String オブジェクトのメソッドが動作するとみなしてもよいということ
そういう「俺 String オブジェクトのつもりで頑張りますメソッドも作ってきました」という宣言が、to_str メソッド

"#{うめこみ}" で呼ばれる うめこみ#to_s は「オブジェクトを文字列で表現するとこんな感じ」を返す
書いているうちに飽きてきたのでトス

121 :デフォルトの名無しさん:2011/02/23(水) 17:42:16.67
String#+ が to_s を呼ばないのはなんで、という話はもう太古の昔からあるな

 Stringオブジェクト + foo

 "ABC#{foo}DEF"
ほど foo を文字列化する意図が明確ではないのでとりあえず例外出して止める、
+ で連結したいなら foo をなんとかして自力で文字列化しろ、というのがいちおう回答ではあるのだが

122 :デフォルトの名無しさん:2011/02/23(水) 17:47:51.62
str + num は、交換法則とか考えると面倒なので、例外がシンプルで良いと思う。

123 :デフォルトの名無しさん:2011/02/23(水) 18:14:52.42
% irb
irb(main):414:0> require 'self'
Principle of minimum surprise, by Matz

Explicit is better than implicit.
Ruby is far better than P^D
%

124 :デフォルトの名無しさん:2011/02/23(水) 18:57:21.91
puts "1" + 2
=> 12
こうなってほしいの? 俺は嫌だ。むしろ3になって欲しい

125 :デフォルトの名無しさん:2011/02/23(水) 19:02:59.66
>>> print "1" + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

126 :デフォルトの名無しさん:2011/02/23(水) 22:17:06.67
>>116
すでに124が書いているように、"1" + 2 が "12" になるべきか "3" になるべきかは
人によって意見が違う。
そういう、あいまいな解釈ができそうな場合はとりあえずエラーにしておき、
どちらの挙動を意図しているのかを書き手が明示するほうがいいと思う。
"1".to_i + 2
"1" + 2.to_s
またRubyではすでに "x=#{x}" のような埋め込み式が使えるから、
わざわざ "x=" + x を自動変換したいという要求は出ないと思うよ。

127 :デフォルトの名無しさん:2011/02/23(水) 22:17:50.61
>>120
説明が長いよ・・・初心者がそんなの読むわけないじゃん

128 :デフォルトの名無しさん:2011/02/23(水) 23:39:41.73
>>115
アクセサを作らずにやったら違いが解ると思う

129 :デフォルトの名無しさん:2011/02/24(木) 00:30:00.56
>>115
direct variable access と indirect variable access でぐぐって。
どっちを使うかはケースバイケース。

130 :116:2011/02/24(木) 02:47:08.45
回答してくれた方、丁寧にありがとうございました。よく分かりました。

#{うめこみ} と puts "string" + 1
を比較するのではなく、
#{うめこみ} と "string" + 1
を比較しないと駄目、というところで氷解しました。
確かに"string" + 1 だけでは何に変換すべきか分からないですね。

ただWebプログラミングの場合、
フォームから送られてきた値とか
DBから取り出した値とか
型がstrだかnumだか気にするのが面倒で
型を自動変換してくれない言語ではちょくちょくエラーになったりしますね。
まぁ予期しない型に勝手に変換して気付かぬバグが紛れ込むよりは良いのかなやっぱり。

131 :デフォルトの名無しさん:2011/02/24(木) 05:12:52.74
>>130
webなら普通Validator使う罠

132 :デフォルトの名無しさん:2011/02/24(木) 09:03:01.87
Ruby は、オープンクラスだから、便利だと思ったら自己責任で勝手に改造すればいい。
class String
 alias :__old_plus__ +
 def +(o)
   __old_plus__(o.to_s)
 end
end
こういう思いつきを簡単に試せるのが、rubyの楽しさ。

133 :デフォルトの名無しさん:2011/02/24(木) 09:17:01.96
>>132は初心者

134 :デフォルトの名無しさん:2011/02/24(木) 09:50:58.01
標準クラスの既存のメソッドを改変するのはよろしくないな

135 :デフォルトの名無しさん:2011/02/24(木) 12:58:09.08
#!/usr/bin/ruby

file = File.open('./test.txt','r+')
file.flock(File::LOCK_EX)
sleep(10)
file.close

こんなスクリプトを書いて実行中でも、対象ファイルをcatできたのですが、これはロックに失敗しているんでしょうか?


136 :デフォルトの名無しさん:2011/02/24(木) 13:00:11.37
もちろんです

137 :デフォルトの名無しさん:2011/02/24(木) 14:17:12.10
>>135
ロックには成功してるけど、 >>135 がロックを理解してないと思われ。
cat じゃなくてそのスクリプトを 2 個同時に動かしてみて。
で、ロックについてもっとちゃんと調べれ。

138 :デフォルトの名無しさん:2011/02/24(木) 17:03:42.52
他人ですが調べてみた

flockはアドバイザリ・ロック(紳士協定)でしかなく
ファイルのアクセス権とは無関係
ファイルの入出力をも排他制御するのは強制ロックといい、OS依存の処理になる

で、どうでしょうか?


139 :デフォルトの名無しさん:2011/02/24(木) 23:02:15.32
>>135
>>138

なるほど。ぐぐってもrubyで強制ロックを行う方法がでてこないのですが、rubyでは提供されていないのしょうか?
flockもunixのシステムコールだということなので同様にできると考えたのですが…

140 :デフォルトの名無しさん:2011/02/24(木) 23:18:12.87
fcntlやioctlを使えば、対象OSのシステムコールで出来るのと同等のことは
出来ると思うが、そもそもOS/ファイルシステムによってmandatory lockは
できたりできなかったり。


141 :デフォルトの名無しさん:2011/02/24(木) 23:29:38.28
Linuxの場合。ほぼ10年前の文章
ttp://homepage1.nifty.com/~tetsu/ruby/diary/0102.html

マウントオプションがいるんだな…


142 :デフォルトの名無しさん:2011/02/24(木) 23:35:33.82
>>139
そのUnixシステムコールflockが紳士協定なの。

143 :デフォルトの名無しさん:2011/02/25(金) 00:13:54.42
まぁ、できないということを納得するにはまずは flock(2) を読むことだな。
(man 2 flock)


144 :デフォルトの名無しさん:2011/02/25(金) 02:01:01.22
arr.values_at(*foo())ではなくarr.values_at(foo())と書けるようにしたい
values_atの引数に複数のインデックスを渡しつつ
*を書かずにすむ方法はないでしょうか?


145 :デフォルトの名無しさん:2011/02/25(金) 03:39:27.41
>>144
Array#values_atを書き換えるしかないと思う。
Array.class_eval do
 alias _orig_values_at values_at
 def values_at(*args)
  _orig_values_at(*args.flatten)
 end
end


146 :デフォルトの名無しさん:2011/02/25(金) 06:45:32.64
やっぱりそうですか。ありがとうございました。

147 :デフォルトの名無しさん:2011/02/27(日) 18:40:21.92
URLのサブドメインを除去したドメインのみを取得したいです

uri = Addressable::URI.parse("http://hibari.2ch.net/").normalize
p uri.host

これだと「hibari.2ch.net」が返ってきますが「2ch.net」だけ返ってくるメソッドは無いのでしょうか
正規表現で頑張るしかないのでしょうか

148 :デフォルトの名無しさん:2011/02/27(日) 18:46:39.76
サブドメインという概念はURIそのものにはないと思う
正規表現使うしかないねえ

149 :デフォルトの名無しさん:2011/02/27(日) 19:05:17.09
for(int i=array.size(); i>=0; --i){
 f(i)
}

をrubyで書く場合

for i in 0..array.size-1
 f(array.size-1-i)
end

(array.size-1).downto(0) do |i|
 f(i)
end

より一般的な書き方ってありますか?

150 :デフォルトの名無しさん:2011/02/27(日) 19:24:32.41
(0...array.size).reverse_each{|i| f(i)}が比較的分かりやすい

151 :デフォルトの名無しさん:2011/02/27(日) 19:35:05.18
>>150
おお・・・それがわかりやすいですね、ありがとう
>>149元コードがバグってました(/ω\) ハズカシー

152 :デフォルトの名無しさん:2011/02/27(日) 22:48:36.58
ふぅん…
each_indexはあるのにreverse_each_indexはないのか…

153 :デフォルトの名無しさん:2011/02/27(日) 22:54:14.49
別になくてもなんとかなるよね、と言ってしまってから需要が発覚した好例

154 :デフォルトの名無しさん:2011/02/28(月) 00:44:49.10
each_indexってArrayのメソッドだったのか

155 :デフォルトの名無しさん:2011/02/28(月) 08:32:07.09
indexがないコンテナ、というのも存在しうるからEnumerableのメソッドには出来んだろ

156 :デフォルトの名無しさん:2011/02/28(月) 13:15:54.56
reverse.each_index

157 :デフォルトの名無しさん:2011/02/28(月) 13:25:53.47
メソッドチェーンではだめなのですよ

158 :デフォルトの名無しさん:2011/02/28(月) 14:04:23.12
質問だよおっかさん
gem の spec/ とかのテストディレクトリは lib/ ディレクトリのネスト具合を正確に反映させるべきすかね

一身上の都合で AAA::BBB::111 という妙に深い名前の gem ライブラリスクリプトを2個ほど作ります
 lib/aaa/000.rb    # require 'aaa/000' 用
 lib/aaa/bbb/111.rb
 lib/aaa/bbb/222.rb
bbb/ には特にファイルはありません
で、spec/ ディレクトリに 111_spec.rb を作りたいのですが
 spec/aaa/bbb/111_spec.rb
 spec/111_spec.rb
 spec/aaa_bbb_111_spec.rb
どれが普通っぽいですか?

159 :デフォルトの名無しさん:2011/02/28(月) 14:09:05.25
IDEやらエディタマクロで、実装とspecを相互に行き来できる機能が
あるけど、その手のって、たぶん実装とspecのパスが対応している
ことを仮定していると思う。

160 :デフォルトの名無しさん:2011/02/28(月) 16:04:22.73
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper') とか書かないといけなくなって若干めどい
まあ既存のどれかのをコピペすればいけるが

161 :デフォルトの名無しさん:2011/02/28(月) 19:18:08.04
irb起動後にechoのon/offは切り替えられないのかい?

162 :デフォルトの名無しさん:2011/02/28(月) 19:32:21.95
echo ってなんじゃらほ

$ irb -f
irb>"string!"
=> "string!"
irb> irb_context.return_format
=> "=> %s\n"
irb> irb_context.return_format = "%s\n"
"%s\n"
irb> "string!"
"string!"

ということで、起動後の irb の設定変更は irb_context のメソッドを通じて行う
irb_context とだけ入力するとなんかいろいろ出てくる
conf. は irb_context の別名で被る可能性が大なので irb_context. で指定するのが無難

163 :デフォルトの名無しさん:2011/02/28(月) 19:42:22.14
できました。ありがとう。
irb> irb_context.echo=false

164 :デフォルトの名無しさん:2011/03/01(火) 09:21:40.09
簡易なオートロード機能を考えています。
ひとまず自分で書いたコードを載せます(1.8系です)

# グローバル定数
SCRIPT_LINES__ = { __FILE__ => File.readlines(__FILE__) }
# Moduleを拡張
class Module
def const_missing(name)
const_name = name.to_s
filename, line_no = caller(0)[1].split(":") # 呼び出し元の情報
line = SCRIPT_LINES__[filename][line_no.to_i-1] # SCRIPT_LINES__よりコード行を取得=>"t = Mobi::MobiMobi::FooBar.new"
if const_name = /([:_0-9a-zA-Z]*#{name}[:_0-9a-zA-Z]*)/.match(line) # 定数部分を抽出=>"Mobi::MobiMobi::FooBar"
const_name = const_name[1]
file = const_to_path(const_name) # 自前の別メソッドによりパスを得る=>"mobi/mobi_mobi/foo_bar"
begin
require file
const = const_get(name)
rescue LoadError # 通常の定数呼び出しだった場合に備えてLoadErrorは無視
else
return const
end
end
raise NameError, "uninitialize constant #{const_name}"
end
end
# 実行
t = Mobi::MobiMobi::FooBar.new

165 :164:2011/03/01(火) 09:22:26.92
(続き)
これは一応うまくいくのですが、デバッグコードみたいなのを使ってるのと、
$SAFEが0じゃないとSCRIPT_LINES__を使えないので、いまいちと感じています
でも他にconst_missingで"Mobi::MobiMobi::FooBar"を得る方法がわかりません。
上のコードの場合、const_missingに送られるのは:Mobiだけなので
mobi.rbやmobi/mobi_mobi.rbが存在すれば順に読み込まれてうまくいきますが、
モジュール階層のディレクトリのみであればLoadErrorで止まってしまいます。
定義済み定数と照らしながらディレクトリ階層内を走査していくほかないでしょうか。

166 :164:2011/03/01(火) 09:28:25.55
>>165 mobi.rbやmobi/mobi_mobi.rbが存在すれば
すいません、今すぐ確認できないんですが
これうまくいかなかったと思います。

167 :デフォルトの名無しさん:2011/03/01(火) 12:19:38.92
  ∩___∩ 未だ連絡ゼロクマー
  | ノ  ___ヽ
  /。・゚・(____ `・゜゚・。 いつでも連絡するクマー
  |    u( _●_)ヽ 〉
 彡、   |∪|   /  誰か助けるクマー
. /    ヽノ . /´
         .____
        / ヽ、  _ノ\
      / (○)iji(○)\    正義がキチガイ呼ばわりされたんだぞ。
     /    (__人__)   \
     |       |::::::|     |  義憤に駆られることはないのかお?
     \       l;;;;;;l    /l!| !
     /     `ー'    \ |i  Rubyistとして後ろめたさはないのかお!
   /          ヽ !l ヽi
   (   丶- 、       しE |そ  一生後悔することになるお!
    `ー、_ノ       煤@l、E ノ <
               レY^V^ヽl  そこのあなた!勇気を出すんだお。
       ____
     /      \  助けて欲しいんだお・・・
   /  _ノ  ヽ、_  \ 同じ釜の飯を食ったんだお・・・
  / o゚((●)) ((●))゚o \  いつも一人で居残り残業してたんだお・・・
  |     (__人__)    | あまりの悲しさに、むせび泣いたこともあったお
  \     ` ⌒´     / そんなやる夫を見捨てるのかお?

       ____ このままだったら一生恨むお
     /      \ たとえ誰がなんと言おうと、強烈な違和感なんだお
   /  _ノ  ヽ、_  \ 直観がモノ言ってんだお
  /  o゚⌒   ⌒゚o  \  えっぇっえ〜ん。え〜ん。
  |     (__人__)    |  えっぇっえっぇっ。うっぅっぅうー。。。
  \     ` ⌒´     / うええ〜ん。。。えぐっぇぐっうっうっううぅー。。。

168 :デフォルトの名無しさん:2011/03/01(火) 12:21:52.19
わけがわからないよ。

169 :デフォルトの名無しさん:2011/03/01(火) 12:34:54.82
>>168
ム板でスレひとつしか取得してないからそうなる

170 :デフォルトの名無しさん:2011/03/01(火) 12:43:13.48
新着レスの内容読まなくても複数のスレを表示しておくのは必須だよね
自衛とはいえ我ながらアホくさいとは思うんだが

171 :デフォルトの名無しさん:2011/03/01(火) 14:19:51.69
>>170
なんか余裕だよね。
どんな対策したの?2ch禁止令とか出したの?
なんか2chに書き込んでも駄目な気がした。
奴らが書き込むことはないんだろうね!
ましてや、メールしてくるなんてないんだろ?

もうちょっと他の手考えるわ。
こっちは必死こいて頑張ってきとんねんで

しかし、余裕の態度は気になる。
何らかの対策しやがった臭い

ま、なんにしろ、もう2chには書き込まないよ
もっと有意義なことに時間使うわ
レスあんがと

172 :デフォルトの名無しさん:2011/03/01(火) 15:24:26.41
>>170
マルチポストとか多い板だからな
書き込みしてからマルチだと気づいたときの虚しさったらないぞ

173 :デフォルトの名無しさん:2011/03/02(水) 08:50:04.70
書き込みがマルチでないことと、自分の質問がコピペされてマルチ扱いにされてないかのチェックは必ずしないといかん
めんどくさい

174 :デフォルトの名無しさん:2011/03/02(水) 08:58:36.37
過去に俺も何度かやられたが、
メインであろうスレに一番最初に書かれてれば本物とみなしてあまり気にしないぞ

というわけで質問どうぞ

175 :デフォルトの名無しさん:2011/03/02(水) 10:00:50.37
Rubyが64bitでコンパイルされているかどうか調べる方法はありますか。
今は (2**32).class が Fixnum だったら64bit、Bignumだったら32bitというふうに
判定してるんですが、もっとすまーとな方法があれば教えてください。
require 'rbconfig' してもそれらしきものはありませんでした。

176 :デフォルトの名無しさん:2011/03/02(水) 10:20:39.68
CONFIG["target"] とかは?

177 :デフォルトの名無しさん:2011/03/02(水) 11:37:16.30
>>168-174
話が見えないな。どっかのマルチが出たって話を
ここに集まってきてしゃべってるのか

178 :デフォルトの名無しさん:2011/03/02(水) 11:54:18.40
うわ!こんなゴミクズ言語使ってる低能たちいたいの

かわいそう かわいそう

179 :デフォルトの名無しさん:2011/03/02(水) 12:00:01.76
日本語もろくに使えない低能にゴミクズ言語扱いされるのって…

180 :デフォルトの名無しさん:2011/03/02(水) 12:07:33.29
>>177
ttp://hibari.2ch.net/test/read.cgi/tech/1295081752/255
ttp://hibari.2ch.net/test/read.cgi/tech/1200175247/933


181 :デフォルトの名無しさん:2011/03/02(水) 13:07:06.82
春休みか…

182 :デフォルトの名無しさん:2011/03/02(水) 14:34:11.66
>>176
require 'rbconfig'
puts Config::CONFIG['target'] #=> i686-apple-darwin10.6.0
だめみたいですね。


183 :デフォルトの名無しさん:2011/03/02(水) 14:44:36.86
pack('P') とか使えないかね


184 :デフォルトの名無しさん:2011/03/02(水) 14:56:38.41
StringIO に書き込んだ文字列を取得する方法って rewind とかして read しかないですか?
いちいち sio.rewind; str = sio.read って書くのめどいです

185 :デフォルトの名無しさん:2011/03/02(水) 15:20:00.34
>>184
sio.string は?

186 :デフォルトの名無しさん:2011/03/02(水) 15:20:46.14
>>184
StringIO#string


187 :デフォルトの名無しさん:2011/03/02(水) 16:00:44.43
>>183
どう使うんでしょうか。

188 :デフォルトの名無しさん:2011/03/02(水) 16:31:38.56
Windows 32bitしか知らないのでよくわかりませんが
RUBY_DESCRIPTION や RUBY_PLATFORM
で判別できないと面倒ですね

64bitのRubyだと
p [""].pack("p").size
したときに 8 になるんでしょうか?
これってポインタのサイズを見るってことですよね


189 :デフォルトの名無しさん:2011/03/02(水) 17:32:30.93
2011年2月のプログラミング言語インデックス

1 Java     18.482% ↑ 7ヶ月連続1位
2 C.       14.986% ↓
3 C++       8.187% ↓
4 Python     7.038% ↑ 5位から4位へ浮上。2ヶ月連続で順位を上げている。
5 PHP.      6.973% ↓ 4位から5位へ下落。下落傾向
6 C#        6.809% ↑
7 (Visual)Basic 4.924% ↓
8 Objective-C  2.571% ↑ 安定化傾向
9 JavaScript   2.558% ↑
10 Perl.       1.907% ↓
http://journal.mycom.co.jp/news/2011/03/01/064/index.html

190 :デフォルトの名無しさん:2011/03/02(水) 18:58:57.86
…おかしいな、朝作ったときはもっとこうシンプルなライブラリだったはずなのだが

191 :デフォルトの名無しさん:2011/03/02(水) 19:06:02.59
>>190
そういうときは寝て起きると不要なものが浮いてきます

64bit判定はバージョン文字列判定的にはできねーというのが定説だった気がする
実際の動作で判定するのが現状安定
もしかしたら今後なにかあるかもしれないけど、現状は無理っぽい

192 :デフォルトの名無しさん:2011/03/02(水) 21:30:37.16
>>188
Rubyが64bitモードでコンパイルされたかどうかってのは、ポインタサイズで判定すべきものなんでしたっけ?
intのサイズだと思ってけど、違うのかな。
(2**32).class が Fixnum なら 64bit、Bignumなら32bitだと思ってた。



193 :デフォルトの名無しさん:2011/03/02(水) 23:43:26.86
>>183 pack('P') とか使えないかね
とあったんで ポインタサイズでも判別できるのかな?と思っただけです
WindowsXPしかないんで、確かめようも無いのですが

intじゃなくて VALUEのサイズですね
VALUEのサイズはポインタと同じで
64bit Windowsでは unsigned long long
それ以外だとunsigned long なのかな

64bitとか未知の世界だ


194 :デフォルトの名無しさん:2011/03/03(木) 12:32:03.30
>>192
64ビットWindowsはLLP64だからintもlongも32ビット。
ポインタサイズじゃないと判定できないかも。

195 :デフォルトの名無しさん:2011/03/03(木) 17:51:59.45
>>194
そうか、自分が知りたいのは、x86_64かどうかだ。
今実行中のRubyバイナリがx86_64かどうかを調べる方法ってあります?
require 'rbconfig'
p Config::ARCHFLAGS #=> "-arch i386 -arch x86_64"
はコンパイル時のフラグであって、実行時にどっちなのかはわかんない。

196 :デフォルトの名無しさん:2011/03/03(木) 18:33:56.80
実行ファイル自身のマジックナンバーで分かるのだろうか。
でも、同じx86_64でもELFだったりPEだったりMach-Oだったりあるか。


197 :デフォルトの名無しさん:2011/03/03(木) 18:45:13.60
MacOSのことはよくわからんのでググったら
ユニバーサルバイナリなので
PowerPCのとx86のとx86-64のとがひとつの実行ファイルとかになってて
実行ファイル見ても判別付かんことがわかった

64bitかの判別なら(2**32).class が Fixnum かどうかでいいんじゃないの?
ポインタが64bitならVALUEも64bitになって
Fixnumはポインタサイズ-1 になるんじゃないのかな

PowerPC32,PowerPC64,x86,x86-64 を判別したいとかなら
C拡張作るか、OSのAPI呼ぶとかしないとだめなんじゃないの?


198 :デフォルトの名無しさん:2011/03/03(木) 18:50:22.52
まったく自信がないし
64bit Windowsで確かめることもできないけど
Windowsならばおそらくこんなの(XP以降)

require 'Win32API'
current_process = Win32API.new('Kernel32.dll','GetCurrentProcess',%w[v],'v').call
bIsWow64 = "\x0"*4
Win32API.new('Kernel32.dll','IsWow64Process',%w[i p],'i').call(current_process,[bIsWow64].pack('p')).zero? || raise
puts bIsWow64.unpack('l').first.zero? ? '32bit' : '64bit'

Macだとdlライブラリとかでできるのかな?


199 :デフォルトの名無しさん:2011/03/03(木) 18:58:05.50
おっとそういえば、WindowsにもIA64版がありました
GetNativeSystemInfo とか呼んでCPUアーキテクチャも見ないとだめかな


200 :デフォルトの名無しさん:2011/03/04(金) 05:49:29.71
[nil].pack("P") が一番速いと思う
(2**32).class を見る方法は、Fixnum の範囲がポインタのサイズではなく、long のサイズ依存だからダメ
もっとも、多くの場合は RUBY_PLATFORM でいい気がするけど

201 :デフォルトの名無しさん:2011/03/04(金) 10:40:22.34
open-uriで、タイムアウトをくらったらリトライするメソッドを作っています。
こんな感じです。
def get_html_doc(url)
trial ||= 0
open(url, 'r:binary') do |io|
return Nokogiri::HTML(io.read.toutf8, nil, 'utf-8')
end
rescue Errno::ETIMEDOUT => e
trial += 1
if trial < RETRY
retry
else
raise e, e.message, e.backtrace
end
end
これをrspecでテストしたいのですが、
タイムアウトをくらってもリトライで成功するケースが
テストできません。
1回目のトライではopenでErrno::ETIMEDOUTをraiseして、
2回目のトライではopenがraiseしないようなrspecってどう書きます?
こんな感じでできたらいいのですが、
kicked = false
should_receive(:open).exactly(2).times do
unless kicked
kicked = true
raise Errno::ETIMEDOUT
end
end
get_html_doc('/dev/null').should be_nil
should_receive節の中でraiseするとrspecに怒られてしまいます。
何かうまい方法はないでしょうか。

202 :デフォルトの名無しさん:2011/03/04(金) 11:49:59.64
思いつかないときは自分の知ってる分野に引きずり込んでお茶濁せってじっちゃんが言ってた

$ cat getweb_spec.rb
require 'rspec'
require 'webmock/rspec'
require 'open-uri'

def getweb(url)
t = false
begin
open(url).read
rescue Errno::ETIMEDOUT
unless t then t = !t; retry else raise end
end
end

describe "getweb" do
before do
@url = 'http://host/'
WebMock.stub_request(:get, @url).to_raise(Errno::ETIMEDOUT).to_return(:body => 'BODY')
end
it "gets a file over Error::ETIMEOUT" do
getweb(@url).should eql('BODY')
WebMock.request(:get, @url).should have_been_made.twice
end
end
# -----------------------------

$ rspec -fs getweb_spec.rb

getweb
gets a file over Error::ETIMEOUT

203 :デフォルトの名無しさん:2011/03/04(金) 16:00:27.82
>>200
>もっとも、多くの場合は RUBY_PLATFORM でいい気がするけど
その定数にx86_64という文字列が入ってくれるならいいんだけど、そうじゃないよね。
もしかして1.9なら入ってたりするのかな。

204 :デフォルトの名無しさん:2011/03/04(金) 16:06:39.81
> >>200
> >もっとも、多くの場合は RUBY_PLATFORM でいい気がするけど
> その定数にx86_64という文字列が入ってくれるならいいんだけど、そうじゃないよね。
> もしかして1.9なら入ってたりするのかな。

環境とバージョンにもよるけど、amd64とかx64とかx86_64とか。
しかしそもそも、1.8 on Windowsだとmswin64対応してませんぜ

205 :デフォルトの名無しさん:2011/03/04(金) 16:13:52.77
>>204
うちんところは入っとらん。
irb> RUBY_PLATFORM
=> ""i686-darwin10.6.0""
どういうときに入ってるの?linuxじゃないとだめ?

206 :デフォルトの名無しさん:2011/03/04(金) 16:49:53.07
>>205
それは32bit版だと思います
[nil].pack("p").sizeが4じゃないですか

207 :デフォルトの名無しさん:2011/03/04(金) 17:18:05.56
>>206
いやいや、そうでもないみたいよ
ttp://ktjx.blogspot.com/2009/12/mac-os-x-ruby-os.html
によると
OS付属、MacPorts、自分で入れたものでそれぞれ
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin10]
ruby 1.8.7 (2009-12-24 patchlevel 248) [x86_64-darwin10.2.0]
みたいになるそうだ

それぞれの実行ファイルは
% file /usr/bin/ruby
/usr/bin/ruby: Mach-O universal binary with 3 architectures
/usr/bin/ruby (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/ruby (for architecture i386): Mach-O executable i386
/usr/bin/ruby (for architecture ppc7400): Mach-O executable ppc

% file /opt/local/bin/ruby
/opt/local/bin/ruby: Mach-O 64-bit executable x86_64

% file ~/local/bin/ruby
/Users/katsuji/local/bin/ruby: Mach-O 64-bit executable x86_64
なんだって


208 :デフォルトの名無しさん:2011/03/04(金) 17:25:19.04
>>200
64bit RubyだとFixnumは63bitだと思ってたら
Windowsでは31bitなのね、とほほ
ruby.hみたら
#define FIXNUM_MAX (LONG_MAX>>1)
#define FIXNUM_MIN RSHIFT((long)LONG_MIN,1)
ってなってた
ググったら、互換性のためにlongじゃないとまずいだろってことになったみたいですね
せっかくVALUEが64bitなのに、半分しか使えないとは

PHPの文字列が2Gまでしか対応してないっていうブログ記事を思い出して
RStringを見たら、これまたサイズがlongだった
64ビットだと2G超のメモリも確保できると思うんですけど
WindowsだけStringも2G制限のままなのか


209 :デフォルトの名無しさん:2011/03/04(金) 17:32:01.37
ところで、Fixnum#sizeを使えばFixnumの実装上のサイズが返ってくるのでした
Windows以外の64bitRubyだと 1.size > 4 なんでしょうね
Fixnum::MAXとかFixnum::MINとかがあれば手っ取り早いのですが

WindowsXPのJRubyだと8が返ってきました……
これはもうあれだ
実行中のCPUアーキテクチャを取得する定数なんかを用意するしか


210 :デフォルトの名無しさん:2011/03/04(金) 18:50:44.73
instance.hoge.moge.method1()といった具合に、
クラスのインスタンスメソッドをhogeやmogeで分けたいです。

現状は、instance.method2()やinstance.method3()程度でしかできず、
深い階層を使った呼び出しができていません。

 class Testdrive
  def method2()
  end
  def hoge.moge.method1()
  end
 end
としてみましたが、undefined local variable or methodが返ります。

クラスをネストで定義して、initialize()呼び出し時に
入れ子のクラスを@hogeなどに代入するとできますが、
都度行うのは手間なので、何か慣例となっているやり方が
あるのではないかと考えています。
どのようにしたらよいでしょうか。

211 :デフォルトの名無しさん:2011/03/04(金) 19:32:49.11
メソッドチェーンは単なる記述じゃなくて、レシーバに対するメソッド呼び出しの連続だ
レシーバに存在しないメソッドは呼べない

212 :デフォルトの名無しさん:2011/03/04(金) 19:35:01.85
>>210
そんなことの前になぜ分けるのか
instance.hoge.moge.method1()ってパッと見どう考えても「instance#hogeの戻り値にその戻り値のクラスが持つmogeメソッドを実行し〜」でしょ
@ary.to_s.gsub!(/abc/, "def")
余計なことを考えてるだけにしか思えない

213 :デフォルトの名無しさん:2011/03/04(金) 19:38:11.38
def hoge
self
end
def moge
self
end
とかしたいのかと思ったがさすがにちがうよな。


214 :デフォルトの名無しさん:2011/03/04(金) 19:47:09.74
>>213
や、テクニーク的にはそうなのだろ
メソッドチェーンが繋がる外見であることが、なんだか重要らしいし

でもレシーバという概念を勉強して卒業してほしいよかん
あれって無意味ににょろにょろ繋がってるわけじゃないのよw

215 :デフォルトの名無しさん:2011/03/04(金) 20:22:56.72
>>211
メソッドチェーンで、hogeメソッド、mogeメソッド、
metho1メソッドと返り値を流したいわけではないです。

method1以外にもいくつかmogeに関するインスタンスメソッドがあり、
それを人間の目でまとまっているように見せておきたいのです。

現状だと、metho1を定義するのに、
def hoge_moge_method1()
end
とするか

別途クラスを定義してinitialize時に
@mogeなどに代入するしかないので不便です。

>>213
selfについて分からないので調べてみます。

216 :デフォルトの名無しさん:2011/03/04(金) 20:28:30.04
もしかして
instance.hoge.tap {|h| h.moge.tap {|m| m.method1 } }

※ きっと違う。



217 :デフォルトの名無しさん:2011/03/04(金) 20:35:07.04
 class Testdrive
  def initialize
  #@hoge = Hoge.new() #?
  end
  def medthod4()
  end
  class Hoge
  def method5()
  end
  def method6()
  end
  end
 end

これをインスタンス化して、
instance.method4()
instance.hoge.method5()
とそれぞれ呼び分けたいです。

method5とmethod6はHogeについてのメソッドなので、
Hogeについてのメソッドを呼んでいますよってことを分かり易くしたいのです。

selfについては読みました。
>>213にさらに
def method1
end
を追記しておけば
hoge.moge.medhod1()でもmoge.hoge.method1()でも何でもいけるってことで合っていますか。

218 :デフォルトの名無しさん:2011/03/04(金) 20:54:33.29
>>215
メソッドチェーンは単なる記述じゃなくて、レシーバに対するメソッド呼び出しの連続だ
その仕組みを勝手に変えられても、とても困る

まあそのへんの見かけ重視でメソッドの呼ばれ方を見かけ上変えたのがDSLなんだけど

219 :デフォルトの名無しさん:2011/03/04(金) 20:59:50.45
まあ、昔ちょっと流行ったことがある
メソッドチェーンするだけで何もしない、読み下し用メソッド

class C
def foo
puts "foo"
self
end
def bar
puts "bar"
self
end
def and
self
end
end

c = C.new
c.foo.and.bar

ただ、小手先ニヤニヤドヤ顔っぽくてあまり気持ちよくないというので最近は廃れた

220 :デフォルトの名無しさん:2011/03/04(金) 21:02:32.51
Rubyのやり方を理解していないということですね。
class Net
class Http
end
class Ftp
end
end
とあったときに、
Netをインスタンス化した際に、
instanceからHttpクラスのインスタンスメソッドや
Ftpクラスのインスタンスメソッドを呼び出すには、
どのようにコーディングするのがよいのでしょうか。

私よりもプログラミングに疎い者が簡単な調節で
新しい処理を作れるようにしたいので、
>>218にあるDSLはまさにうってつけなのでしょうけれど、
私にDSLを設計するほどの技量がなくできる範囲で
扱いやすいクラスを作ろうと考えています。

221 :デフォルトの名無しさん:2011/03/04(金) 21:10:30.32
>>220
それは Net::Http や Net::Ftp (標準クラスのじゃないよな?) を
インスタンス化するところ。


222 :デフォルトの名無しさん:2011/03/04(金) 21:12:58.46
wxRuby と RubyQt だとどっちが使いやすいですか?

223 :デフォルトの名無しさん:2011/03/04(金) 21:16:24.87
>>222
具体的にどんなもの作るつもりか2行半くらいで

224 :デフォルトの名無しさん:2011/03/04(金) 21:18:20.85
>>220
http = Net::Http.new(...)
http.foo(....)

ftp = Net::Ftp;new(....)
ftp.bar(....)

これがRubyの基本だよ。何も難しい話は無いと思うんだけどな。

225 :デフォルトの名無しさん:2011/03/04(金) 21:22:53.84
>>221
そうですか。
リファレンス見てたら例としてあげられそうだったのであげました。

ありがとうございます。
ということは定義したクラスを実際に使う時に、
HttpなりFtpなりをそれぞれnew()するしかないということでしょうか。

一度のnew()でどのクラスのインスタンスメソッドなのか
分かりやすい状態を作り出すというのは難しいのですか。

226 :デフォルトの名無しさん:2011/03/04(金) 21:25:11.17
みなさんレスありがとうございます。

>>224
それで私も基本は構わないのですが、
new()を1度呼び出すだけでHttpもFtpもインスタンス化できるように
クラス定義の段階で細工できないかと考えています。

227 :デフォルトの名無しさん:2011/03/04(金) 21:30:43.70
class C
def initialize
@foo = Foo.new
@bar = Bar.new
end
def foo; @foo; end
def bar; @bar; end
end
class Foo; def f; puts "f!"; end; end
class Bar; def b; puts "b!"; end; end

c = C.new
c.foo.f
c.bar.b


228 :デフォルトの名無しさん:2011/03/04(金) 21:30:49.37
>>226
>new()を1度呼び出すだけでHttpもFtpもインスタンス化できるように

それなら、こんな感じかな?

class Net
def initilize
 @http = Http.new(....)
 @ftp = Ftp.new(....)
end
attr_reader :http, :ftp

class Http; ....; end
class Ftp; ....; end
end

net = Net.new
net.http.foo(....)
net.ftp.bar(....)

229 :227:2011/03/04(金) 21:32:26.10
6秒勝った…!

230 :デフォルトの名無しさん:2011/03/04(金) 21:39:16.64
>>227
>>228
うまくいきました。どうもありがとうです。
私のやりたいことは実現できそうです。
アクセサについても調べていましたが、
シンボルの記述をミスしていました。

これで次のコーディングに進めそうですが、
net.ftp.bar(....)
これは最初にレスを頂いたメソッドチェーンと形式が非常によく似ています。
違いについてもう少し知りたいのですが、
何と調べると解説ページなど出てくるか教えて下さい。

231 :デフォルトの名無しさん:2011/03/04(金) 21:46:29.87
報告になります。
class A
def initialize()
@b = B.new()
end
attr_reader :b

class B
def initialize()
@c = C.new()
end
attr_reader :c

class C
def bar()
puts 'bar'
end
end
end
end

a = A.new()
a.b.c.bar()

これでやりたいことができました。
本当にありがとうございます。

232 :デフォルトの名無しさん:2011/03/04(金) 21:56:34.91
なるほど、def foo; @foo; end
はselfの代わりに@fooを返すということで、
c.foo.fはメソッドチェーンではあるんですね。

クラスをネスト表記する利点について、調べてみることにします。
ネスト表記で納得できなければまた質問に来るかもしれませんが、
その時はまたレスくれると有難いです。

だらだらと書いて済みません、
ありがとうございました。

233 :デフォルトの名無しさん:2011/03/04(金) 21:56:50.47
>>207
なるほど、1.8だとx86_64用なのにi686を名乗ることがあるんですねぇ

>>208
Rubyで2GBのString扱いたい事ってあります?
あるなら次のABI互換性破壊時に提案するのが正解ですかね

>>209
そもそも何がやりたくてlongとかポインタのサイズを調べているんでしょうか
たぶんそれによって話が違ってきます

234 :デフォルトの名無しさん:2011/03/04(金) 21:59:06.73
メソッドを呼び出したオブジェクトって取れませんかね?
selfを引数にして渡すしかない?

235 :デフォルトの名無しさん:2011/03/04(金) 22:22:04.43
できねっす。
Rubinius では出来なくもないようだけど。
あと、MRI 1.8.4 あたりまではバグを突いて取得可能だった。


236 :デフォルトの名無しさん:2011/03/04(金) 22:28:56.74
>>232
>クラスをネスト表記する利点

クラスはモジュールの一種である(サブクラスである)から、
クラス定義のネストはモジュールの階層的な構造を表現するという意味がある。
いわゆるモジュラプログラミングとか構造化設計の具体化になる。
>>228のコードについて、モジュール構造を(意識的に)明示して書き直してみると、
以下のようになる。(冗長だけど、例ということで....)

module Net
class Net; .... end
class Http; ....; end
class Ftp; ....; end
end

net = Net::Net.new
net.http.foo(....)
net.ftp.bar(....)

また、クラス特有の階層とは継承(インヘリタンス)を意味するけど、
これら二つ(モジュール構造とクラス継承)は混同しやすいので注意したい。

237 :デフォルトの名無しさん:2011/03/04(金) 22:35:22.57
>>223
Windows用のネットワークゲーム管理サーバーとその管理ツールです


238 :デフォルトの名無しさん:2011/03/04(金) 22:43:29.36
>>235
ありがとう

239 :デフォルトの名無しさん:2011/03/04(金) 22:55:46.14
>>237
…wxでいいんじゃね
なんかモノによっては物凄く遠回りになりそうな気もしなくもないが

240 :デフォルトの名無しさん:2011/03/05(土) 05:48:27.14
html = <<<http://ruby.com>>> # htmlの内容を取得
みたいな `` と同格なユーザーが戻り値や副作用を好きに定義できる文字列?ってないですよね。

foo("a")
"a".foo
にするのが普通なんでしょうが。

241 :デフォルトの名無しさん:2011/03/05(土) 06:49:32.07
一部の演算子は実体がメソッドなので再定義可能だけど
<<http...>>みたいにはどうやってもできないと思う
Rubyマニュアルの演算子のとこ見てね

とはいえこういうことはできるみたい
require 'open-uri'
def `(uri); URI.read(uri); end
html = `http://www.example.com/`

242 :デフォルトの名無しさん:2011/03/05(土) 07:35:25.66
>>240
f("aaa") は f "aaa" とかけて、さらにスペースをなくして f"aaa" と書ける。
これじゃだめ?

243 :デフォルトの名無しさん:2011/03/05(土) 08:00:01.25
>>210だと思うんだけど、「そういうのぜんぜんわかりやすくない」から
初心者というものを完全に勘違いしたシステムには枚挙に暇がないけれど

244 :デフォルトの名無しさん:2011/03/05(土) 08:45:40.00
>>240
どうしてそうしたいのか、そのほうが好ましいのかをじっくりと考えてみるべき。
新しい演算子や構文を作ることは(小細工しないと)できない


245 :デフォルトの名無しさん:2011/03/05(土) 09:09:08.53

              -― ̄ ̄ ` ―--  _
          , ´         ,    ~  ̄、"ー 、
        _/          / ,r    _   ヽ ノ
       , ´           / /    ●   i"
    ,/   ,|           / / _i⌒ l| i  |
   と,-‐ ´ ̄          / / (⊂ ● j'__   |
  (´__   、       / /    ̄!,__,u●   |
       ̄ ̄`ヾ_     し       u l| i /ヽ、
          ,_  \           ノ(`'__ノ
        (__  ̄~" __ , --‐一~⊂  ⊃_
           ̄ ̄ ̄      ⊂ ̄    __⊃
                   ⊂_____⊃

246 :デフォルトの名無しさん:2011/03/05(土) 09:56:17.83
まあ文句ばかり言ってても非生産的だぬ

「プログラミング知らない人にも極力わかりやすいようにする」アプローチはいくつかある
いちばんメジャーなのは、設定ファイルを分離してユーザーにデータだけ書かせることだ
プログラムロジックを記述する必要がなければ、だいたいの人はだいたいそれなりに納得する

** 管理者が頑張って作る実行スクリプト

require 'yaml'
require 'open-uri'

data = YAML.load_file('config.yml')
url = data['url']
name = data['name']
html = open(url).read
title = html.scan(/<title>(.+?)</)[0]
puts "#{name}さんこんにちは!\n#{url} のタイトルは #{title} です!"

** ユーザーが自由に記述する config.yml の中身(2行)

url : http://www.ruby-lang.org/en/
name : デフォルトの名無し

** 上記2つを同じディレクトリに入れて実行した結果

デフォルトの名無しさんこんにちは!
http://www.ruby-lang.org/en/ のタイトルは Ruby Programming Language です!

247 :デフォルトの名無しさん:2011/03/05(土) 10:53:43.57
設定だけUnicodeで保存してくれ、と事務方向けのサービスを
用意したら、メモ帳でUTF16とかBOM付きUTF8保存されて
YAMLロードでコケたトラウマが…


248 :デフォルトの名無しさん:2011/03/05(土) 10:59:05.53
UTF-8やUnicode関連のファイル保存オプションが膨大すぎて、
どれで保存するのが妥当なのか常用してても忘れるエディタとか

このへんYAMLのほうで自動でなんかどうにかしてくれるとよかったのだけど
でもその変な文字がデータとして必要になる可能性もあるから駄目だな

249 :デフォルトの名無しさん:2011/03/05(土) 11:11:56.38
日本人向けの設定ファイルは文字エンコーディング自動判別できるくらいの初期コメントを書いておくのが重要
ときどき、リソースフォークが恋しくなる

250 :デフォルトの名無しさん:2011/03/05(土) 17:18:47.50
def my_sort(e, list)
if 0 == list.size then
nil
elsif list.first == e then
list
else
my_sort(e, list[1..list.size]) << list.first
end
end
puts my_sort('C', ['A', 'B', 'C', 'D']).join()
#=>CDBA

eに与えた値を先頭にして、配列を並べなおしたいのですが、
CDBAとなってしまいます。
CDABとこれを変えたいです。
どのようにしたらよいでしょうか。

251 :デフォルトの名無しさん:2011/03/05(土) 17:26:40.80
再帰使うのやめたら?w
その再帰ではどう見てもCDABだぞw
頭の中で追えてる?

252 :デフォルトの名無しさん:2011/03/05(土) 17:27:19.71
間違えたw
正:どうみえてもCDBAだぞw

253 :デフォルトの名無しさん:2011/03/05(土) 17:40:34.99
>>250
def my_sort(e, list)
return if !list
i = list.index(e)
i ? list[i..list.size] + list[0...i] : list
end
もっとカッコイイ書き方は他の人に考えてもらってくれ…。
とりあえずこれでCDABにはなるから…。

254 :デフォルトの名無しさん:2011/03/05(土) 17:44:15.82
漏れのピットフォールレーダーが!listに反応しています

255 :デフォルトの名無しさん:2011/03/05(土) 17:44:19.61
並びなおすっていうのがどういうことかよくわからんが
roteteさせるって事?
def my_sort(e, list)
if list.empty?
nil
elsif list.first == e or !(ind = list.index(e))
list
else
list[ind..-1] + list[0..ind-1]
# list.rotate(ind) #Ruby 1.9.2以上だとroteteがある
end
end
p my_sort('A', []) # => nil
p my_sort('X', ['A', 'B', 'C', 'D']) # => ["A", "B", "C", "D"]
p my_sort('A', ['A', 'B', 'C', 'D']) # => ["A", "B", "C", "D"]
p my_sort('C', ['A', 'B', 'C', 'D']) # => ["C", "D", "A", "B"]
p my_sort('D', ['A', 'B', 'C', 'D']) # => ["D", "A", "B", "C"]


256 :デフォルトの名無しさん:2011/03/05(土) 17:47:44.80
>>251
printf()デバッグで逐次見ているので、
CDBAになるのが正しいことは把握しています。

解決するコードも書けるのですが、
コードが数倍に膨らむのでよい書き方が他にあるのではないかと。

>>250
ありがとうございます。助かります。

257 :デフォルトの名無しさん:2011/03/05(土) 17:59:48.18
def mysort(z,x)
z=z[0].unpack('C*')[0]-1
x.sort_by{|x| x=x.unpack('C*')[0]; ((x - z > 0)? x-z+26 : x) }
end
p mysort('C',['A','B','C','D'])

258 :デフォルトの名無しさん:2011/03/05(土) 18:01:10.55
>>255
うまく動きます。
rotateと言うのですね、1.9.2以降にあげたら置き換えることにします。

259 :デフォルトの名無しさん:2011/03/05(土) 18:20:27.03
もうちょっと出来るか

def mysort(z,x)
 z=z.ord-1
 x.sort_by{|x| x=x.ord; ((x-z > 0)? x-z+26 : x) }
end
p mysort('C','ABCD'.split(//)).join

260 :デフォルトの名無しさん:2011/03/05(土) 18:28:51.74
K&Rみたいなコードだな

261 :デフォルトの名無しさん:2011/03/05(土) 18:31:01.80
どちらにしてもまったく意味のないコードだ

262 :デフォルトの名無しさん:2011/03/05(土) 19:03:56.42
'ABCD'.split(//)
%w(A B C D)

263 :デフォルトの名無しさん:2011/03/05(土) 19:04:30.50
>>233 >そもそも何がやりたくて
>>175 の人は何をしたいんでしょうね?
私は単に興味がわいて調べてみただけなんで
すると、64bitWindowsではFixnumが31bitのままだったんで、ちょっとがっかりな感じ

> Rubyで2GBのString扱いたい事ってあります?
そんな大きいStringが必要になる処理はRuby向きじゃないでしょうが
64bit LinuxとかだとStringもメモリいっぱい使えそうなのに
Windows版だけが残念だなぁと
Windowsサーバーなんて、すでに64bit版だけだし
次期Windowsも64bit版だけになるかもしれないというのに


264 :デフォルトの名無しさん:2011/03/05(土) 19:32:35.75
>>233
同じマシンでも、x86とx64ではRubyの性能が違うので、どちらでコンパイルされているのかを知りたかったから。
1.8と1.9の性能を比較する時に、1.8がx86で1.9がx64でコンパイルされていたことが発覚し、
これじゃあベンチマークの意味なくね?と言われた。
たしかにその通りなので、x86かx64なのかを**Rubyのスクリプトから**調べる方法を探してた。
結局、Rubyではできないらしい。しょぼん。

265 :デフォルトの名無しさん:2011/03/05(土) 19:55:16.85
ヨドバシカメラの近くまで行ったんでパソコンコーナー覗いたんだが
今のプレインストールはみんな64bit Windowsなのな

266 :デフォルトの名無しさん:2011/03/05(土) 20:49:07.04
ふへぇ
16bitOSはもう時代遅れなのか

267 :デフォルトの名無しさん:2011/03/05(土) 21:57:04.73
>>264
いや、だから[nil].pack('P').sizeが4か8かでわかるって

268 :デフォルトの名無しさん:2011/03/05(土) 22:04:18.36
>>264
MacOSでCPUがPowerPCじゃなくx86とわかっていてMatzRuby限定なら
[nil].pack('p').size == 4 ? '32bit' : '64bit'
とか
1.size == 4 ? '32bit' : '64bit'
で、いいんじゃないですかね


269 :デフォルトの名無しさん:2011/03/05(土) 22:14:00.62
つまり現在使ってる人に直接聞いて選択してもらえってことですね

270 :デフォルトの名無しさん:2011/03/05(土) 22:54:08.55
自動判別させるのはかなり骨だと思う

271 :デフォルトの名無しさん:2011/03/06(日) 00:00:50.03
数値を入力させたいのですが、
12 23 34
みたいに一行に複数の数字がある場合にいいやり方とかありませんか?

272 :デフォルトの名無しさん:2011/03/06(日) 00:11:58.38
s = '12 23 34'
ia = s.split(/\D/).map {|x| x.to_i}

273 :デフォルトの名無しさん:2011/03/06(日) 00:12:49.61
String#scanとかString#splitとか。


274 :デフォルトの名無しさん:2011/03/06(日) 00:34:31.84
>>273
ありがとうございました

275 :デフォルトの名無しさん:2011/03/06(日) 00:35:57.07
>>261
アルファベット1文字であることを前提とされてもねえ…

276 :デフォルトの名無しさん:2011/03/06(日) 01:10:52.82
>>259,260
自分ならこう書くかな。(冗長ではあるけど、可読性を優先して)

def mysort(z, x)
 z = z.ord - 1
 x.sort_by { |x|
  x = x.ord

  if x - z > 0
   x - z + 26
  else
   x
  end
 }
end

p mysort('C','ABCD'.split(//)).join

ポイントは「Rubyの条件分岐が(文ではなくて)式である」こと。
以前は K&R C風の条件演算子(? .. : ..)を使っていたけど、
判定条件が複雑になってくると読み辛くなってきたので、
すべてif/case式を使うようになった。

277 :デフォルトの名無しさん:2011/03/06(日) 01:18:36.67
>>275
馬鹿が増えたぞw

278 :デフォルトの名無しさん:2011/03/06(日) 01:21:33.24
本当にA B C D というアルファベットの1文字で用が済む可能性は限りなく低い
質問をするためにわざわざ本質部分を抜き出した結果の表記である可能性が極めて高い

なのになんでアスキーコードとか使う気になるの本当に本気で馬鹿なのと思う

279 :デフォルトの名無しさん:2011/03/06(日) 01:40:43.48
文字列操作派とコレクション操作派は昔から聖戦を続けてるからな
たぶんどっちも退かない(w

今回はコレクションのまま操作するのが正解だけれど

280 :デフォルトの名無しさん:2011/03/06(日) 01:53:26.25
まぁソートっていうメソッド名から色々想像しちゃうわな…。
ソートするんら、ってんでああなるんだろうな。

281 :デフォルトの名無しさん:2011/03/06(日) 03:34:42.96
my_rotateのほうがいいな

282 :デフォルトの名無しさん:2011/03/06(日) 06:41:57.96
p my_sort('C', ['A', 'B', 'C', 'D']) # => ["C", "D", "A", "B"]
を満たすだけのメソッドを定義する

っていうネタをやってるんだろうに
無粋な人たちですな

完全な仕様が提示されてないんだから
間違いとは言い切れないでしょうよ


283 :デフォルトの名無しさん:2011/03/06(日) 06:55:02.44
間違いでいいと思う
少なくとも初心者スレには不要

284 :デフォルトの名無しさん:2011/03/06(日) 06:59:19.90
なんでもかんでも初心者にとってよくないからって排してしまうのはよくない
実は技術的に興味深い話だったりすることもあるし
(Rubyは文字列同士の比較ができるのでASCIIコードに変換するのは
ネタとしても微妙な気はするけど)

自分もこれを他山の石としたいと以下略

285 :デフォルトの名無しさん:2011/03/06(日) 09:43:00.85
いやそれについてはLinuxタコの時代からさんざん試されて結論は出ている
「初心者の質問にオタクのニヤニヤした仄めかしは不要」

C言語の相談室みたいなの覗いてた人なら痛いほどわかるはずだw
あれもチシキノスイを集めた無意味なコード書く人がとれとれぴちぴちカニ料理

286 :デフォルトの名無しさん:2011/03/06(日) 09:50:42.16
回答があれくらい混沌とするくらいが言語として成熟してていいんじゃないかと思うことが稀にあるが…

まあ、参考にすべきでないという突っ込みくらいはその都度適宜入るだろうしなんとかなると思う
次の質問の方どうぞ

287 :デフォルトの名無しさん:2011/03/06(日) 13:26:03.07
Rubyのやり方がわかりません。教えてください。

288 :デフォルトの名無しさん:2011/03/06(日) 13:41:05.47
いいよ。
rubyの初心者かな?プログラミング自体初心者かな?


289 :デフォルトの名無しさん:2011/03/06(日) 13:46:29.03
>>287
わからないのはどんな場面?インストール?
環境は?win、mac、linux とバージョンも教えて

290 :デフォルトの名無しさん:2011/03/06(日) 14:02:15.47
すいません。Ruby on rails(つづりあってますかね?)を覚えるためだけにRubyをやりたいと思います
Windowsなんですが種類がいっぱいどれをインストールしたらいいのか分かりません
これはこうって書かれている説明も読みましたが自分の用途に向いているものなのか分からず選択できません
主にWebページ用に利用する場合は何をインストールしたら良いでしょうか?

291 :デフォルトの名無しさん:2011/03/06(日) 14:21:51.49
>>1
> Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
ということでこっち
【RoR】Ruby on Rails Part11
http://hibari.2ch.net/test/read.cgi/php/1292032736/


292 :デフォルトの名無しさん:2011/03/06(日) 14:25:44.28
優しく受け入れて突き返す

293 :デフォルトの名無しさん:2011/03/06(日) 14:26:58.53
わかりました

294 :デフォルトの名無しさん:2011/03/06(日) 14:32:50.45
今railsに使うんであれば、ruby 1.8.7-p334かな
自分は330つこーとった・・・バージョンアップしよっとw

295 :デフォルトの名無しさん:2011/03/06(日) 14:38:51.91
>>292
専門性の高いスレのほうがよかんべ
少なくともこのスレはRailsに対するFAQを持ちあわせてない

296 :デフォルトの名無しさん:2011/03/06(日) 14:46:22.15
んだべな

297 :デフォルトの名無しさん:2011/03/06(日) 15:01:56.49
んだんだ

298 :デフォルトの名無しさん:2011/03/06(日) 15:05:29.34
だらー

299 :デフォルトの名無しさん:2011/03/06(日) 15:19:12.02
>>298
最近それが静岡弁だということを知った

300 :デフォルトの名無しさん:2011/03/06(日) 15:25:21.99
同じ静岡でも「だら」は駿河(中部)の方言で、
遠州(西部)は三河の影響で「ずら」を使い、
伊豆(東部)は関東系に近かったりする

301 :デフォルトの名無しさん:2011/03/06(日) 15:34:28.86
埼玉は東京に隣接した都市なので方言が無い
田舎はいいね。羨ましいよ。

302 :デフォルトの名無しさん:2011/03/06(日) 15:38:04.52
でも所ジョージの奥さんはおにぎりのことをおぬぐりと呼ぶからなあ

303 :デフォルトの名無しさん:2011/03/06(日) 15:42:25.16
茨城は関東地方のはずだけど、
県庁に常駐するSEさん達の方言はすごかったなw

304 :デフォルトの名無しさん:2011/03/06(日) 15:44:40.86
埼玉人は異常に東京に詳しい。
休日の池袋と渋谷にいる人間の5割は埼玉人です。
神奈川に劣等感を持っており、千葉を見下すのが埼玉人。

305 :デフォルトの名無しさん:2011/03/06(日) 16:15:26.43
1.8と1.9って1.9から始めたらダメですか?
pythonも2.7と3.2ありますけど3.2でググリながらやって覚えてます
ライブラリを使ったりするまで時間も掛かりますので標準のもので何か作れればいいのでrubyを覚えられる頃ぐらいに1.9のライブラリとか出てくればいいかななんて思っていたりしてるのですが
1.8っていうのはメンテナンスだけされるってだけですよね?

306 :デフォルトの名無しさん:2011/03/06(日) 16:18:07.85
そういうスタンスなら1.9.2でなんの問題もないと思う。


307 :デフォルトの名無しさん:2011/03/06(日) 16:37:14.75
>>305
>>1-5 あたりとりあえず最初に嫁

308 :デフォルトの名無しさん:2011/03/06(日) 16:42:53.63
            / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
           /                     \   やる夫に対してうしろめたさを感じるような
         /                        \
        /      ―――            ――― \  人生歩んで欲しくないお
      /          _                _   \
     /          /´ ,..::::::::::.ヽ ヽ         /´ ,..:::::::::::.ヽ ヽ \ 全うな人生をみんなに歩んで欲しいんだお
   /        ,'  ,;::::::::::::::::::', ',       ,'  ,;:::::::::::::::::::', ', \
  /          {  {:::::::::::::::::::::} }        {  {::::::::::::::::::::::} }  \  過去の行いを悔いながら
/           '、 ヽ::::::::::::::/ /        '、 ヽ::::::::::::::/ /      \
|            (;;;;;;;;;;)) ̄ /       |     \   ̄          | 過ごす人生なんて楽しくねーお
|            /'       /        ∧      ',               |
|          {{        {        / ヽ     }               | 今ならまだ許せるお
|           ヽ       ヽ___/ __ \___ノ            |
\          人        ヽ   ´    `  '             / 次回期日が刻一刻と迫ってるお。
  \           ( し.)                                 /
   \       `¨                           /    助けて欲しいんだお。
    /                                     \
   /                                          \  お願いなんだお。

309 :デフォルトの名無しさん:2011/03/06(日) 16:43:56.63
それはあれか

とりあえず標準のライブラリがあればよくて自分で情報を集める能力がある
→ 1.9系列で鉄板

ってテンプレに入れろということか

310 :デフォルトの名無しさん:2011/03/06(日) 16:56:11.74
1.8を前提にした1.9学習術、みたいなのを教えてくれる師匠がいないなら、1.9から始めるのはあんまりお勧めしない
提示されたサンプルやぐぐって見つけたコードが1.9では(一見動作してるようで実は)動かない理由を判別するのが手間だ

完全に1.9だけしかない世界で1.9だけ学んで1.9だけ使うなら1.9.2から始めるのがおすすめだが、
そんな世界は残念ながらまだない
外部の変なファイル、外部の変な文字エンコーディング、1.9を意識しないコードやサンプル、
そういったものと学習と並行して戦わないといけないのでしんどいぞ

たとえば>>246は1.9では動作しない
$ ruby ./hello.rb
/home/ch2/hello.rb:9: invalid multibyte char (US-ASCII)
/home/ch2/hello.rb:9: invalid multibyte char (US-ASCII)

UTF-8 でファイルを作成したとして、hello.rb の先頭に # coding: utf-8 という行を追加する

$ ruby ./hello.rb
デフォルトの名無しさんこんにちは!
http://www.ruby-lang.org/en/ のタイトルは ["Ruby Programming Language"] です!

サンプルの表示となぜか違う
これは Array#inspect の返り値が 1.9 で変更になったことの影響による
title = html.scan(/<title>(.+?)</)[0] を title = html.scan(/<title>(.+?)</).flatten[0] に変更

$ ruby ./hello.rb
デフォルトの名無しさんこんにちは!
http://www.ruby-lang.org/en/ のタイトルは Ruby Programming Language です!

これでやっと「ネットで見つけたサンプルが自分の Ruby で動く」ことになる
この知識を 1.9 で Ruby を最初に学ぶ前提に置くのはやっぱなんか違うだろ

311 :デフォルトの名無しさん:2011/03/06(日) 17:00:09.43
Pythonのリストの子要素に再帰的に__str__が適用されないのと同じ理屈だから
Pythonっ子にはどうってことないよ

312 :デフォルトの名無しさん:2011/03/06(日) 17:00:45.09
まちがいた

× これは Array#inspect の返り値が 1.9 で変更になったことの影響による
○ これは Array#to_s の返り値が 1.9 で変更になったことの影響による

じゃあ>>246

# coding: utf-8
require 'yaml'
require 'open-uri'

のように親切に書いて投稿するようにすればいいのかっていうとね、
「コピペしてファイルに保存」した結果のファイルが UTF-8 だとは限らなくてね、

313 :デフォルトの名無しさん:2011/03/06(日) 17:25:34.17
そのときはinvalid multibyte char (UTF-8) になるだろう

314 :デフォルトの名無しさん:2011/03/06(日) 21:15:49.56
異常なまでな独善的さで1.8.7をゴリ押しするやつが頭おかしいって、
ずっと昔からしかも何度も何度も結論出てるだろ。蒸し返すな。

315 :デフォルトの名無しさん:2011/03/06(日) 21:21:42.06
>>1.9.2お勧め

316 :デフォルトの名無しさん:2011/03/06(日) 21:24:04.12
おぼえることたくさんで絡み合った1.9に手を出して挫折してくれないと本が売れません
地道な営業活動はいつか実を結びます

317 :デフォルトの名無しさん:2011/03/06(日) 21:26:42.64
自分が1.9系列を使えるということと、初学者が1.8よりも1.9を習得しやすいということは全く別

318 :デフォルトの名無しさん:2011/03/06(日) 21:36:09.09
>>314
すまんかった。ガチみたいだ

319 :デフォルトの名無しさん:2011/03/06(日) 21:38:16.80
「Ruby1.9初心者スレ」というのがあってもいいかなあと思うことはけっこうある

>>316-317
1.9.xを使うなと言ってる人は別にいないんだよな
なんかアレルギー持ちがいるっぽいんだが
ここが初心者スレだということを忘れてる人がいるらしい
>>310の問題はわりと根深い
「俺も苦労したんだからお前も苦労しろこれが唯一の道だ」的なスタンスはあんまり好きではない
1.8.7を学んでから1.9.xを学ぶという、おそらく現状躓き最小であろう道の何がまずいというのかさっぱりだ

320 :デフォルトの名無しさん:2011/03/06(日) 21:41:43.89
どこがねぶかいのですか(棒

321 :デフォルトの名無しさん:2011/03/06(日) 21:53:05.09
ここにいる人は、時期的な問題で、1.8 を学んでから 1.9 に手を出した人がほとんどだと思う
そーゆー意味で、経験を元にして正しく初心者にアドバイスできる人は一人もいないハズw
1.8 をベースにしてる時点で、1.9 差分取得の容易さはどーにもならない
たのしい Ruby ですら、いまだに 1.8 ベースでの差分学習になってる

どっかに「1.9 から始めたけどそれから追加で 1.8 学んでも余裕でした」みたいなニューエイジがいないもんか
あるいは完全 1.9 ベースで進めて、1.8 情報は
「ちなみに過去の 1.8 ではエンコーディング指定を書かないので大混乱でしたwwwww」
みたいなコラムに追い出す参考書とか
次の版の本ではそうなったりしないかな

322 :デフォルトの名無しさん:2011/03/06(日) 21:57:32.13
世の中が1.9ベースに移行してねえという事実そのものが、習得難易度への回答なような…
そんなにも初心者向けならみんな即っと習得して即っと書き換えて即っと移行してると思うの

323 :デフォルトの名無しさん:2011/03/06(日) 22:05:16.00
>>321
差分学習が容易ってほんと?たとえば?

324 :デフォルトの名無しさん:2011/03/06(日) 22:09:07.78
>>322
一応、普段使いは1.9.2なんだけどね
1.8.7がある以上、初心者にいきなり1.9.2勧める気はしないわ
Rubyのこともプログラミングのことも嫌いになってほしくないもん

325 :デフォルトの名無しさん:2011/03/06(日) 22:14:51.80
なんか、1.9って「優しくない」よね。「易しくない」じゃなくてさ。
1.8のことで困った、技術のある人たちが作ったのだということはよくわかるけれど、それってとても……

326 :デフォルトの名無しさん:2011/03/06(日) 22:21:11.14
windowsのコードページ65001でirbが起動できないのはなんで?

327 :デフォルトの名無しさん:2011/03/06(日) 22:24:42.13
Windows環境で始めるなら断然1.9.2
unicodeファイル名扱えるしね

328 :デフォルトの名無しさん:2011/03/06(日) 22:31:13.75
1.8.6で十分ですよ。

329 :初心者:2011/03/06(日) 23:03:17.85
初心者としては新しいバージョンに惹かれるのです

330 :デフォルトの名無しさん:2011/03/06(日) 23:16:09.83
1.9.2行っとけ たいがい動く

331 :デフォルトの名無しさん:2011/03/06(日) 23:25:16.51
1.9.2からはけっこう普通に使える印象なんだけど。
Railsもすでに対応しているし、まだ1.9に未対応な、メジャーどころのアプリやライブラリって何かある?

332 :デフォルトの名無しさん:2011/03/06(日) 23:30:50.24
常に最新版を使いたいのでwindows用で自分でソースをコンパイルしたい
初心者では難しいですか?
C#でMessageBoxなら出せるスキルはあります

333 :デフォルトの名無しさん:2011/03/06(日) 23:37:06.82
>>331
Ruby本体の習得煩雑度の問題な気がする
ぐぐっても1.8ベースの情報が多くて、1.9にコンバートするのには1.8経験がないと困るというのは
まあ実際問題としてよくあることで、初心者の壁になると言われれば、まあ、そうかなという…

334 :デフォルトの名無しさん:2011/03/06(日) 23:40:17.33
>>332
1.8と1.9の最新安定版なら、頑張ってくれてる人がかなり早いタイミングでWindowsバイナリを提供してくれる
ので、おおむね自力コンパイルの必要はない

335 :デフォルトの名無しさん:2011/03/06(日) 23:40:48.77
1.9の日本語マニュアルってないの?

336 :290:2011/03/06(日) 23:42:18.44
無事回答を頂けました ありがとうございます

337 :デフォルトの名無しさん:2011/03/07(月) 02:26:47.46
Linux で Ruby のインストール
http://www.kkaneko.com/rinkou/ruby/rubyinstalllinux.html

Ruby Facetsってメジャーっぽい扱いなんですが、
みんなさん使っていますか?

338 :デフォルトの名無しさん:2011/03/07(月) 08:14:33.82
>>337
やっべ初めて聞いたw
基本他力本願なんで、人の作ったプラグインやライブラリを入れて
やってます。

339 :デフォルトの名無しさん:2011/03/07(月) 08:30:58.27
>>338
Facetsなんて使わなくていいよ
はしかみたいなライブラリだ
ActiveSupportだけrequireするような滑稽さを感じる

340 :デフォルトの名無しさん:2011/03/07(月) 10:13:20.55
>>326
コードページ65001にするとバッチファイルが動かなくなるからじゃないかな。
Windows 7で直っていると思った。

341 :デフォルトの名無しさん:2011/03/07(月) 11:23:05.25
Windowsなんですが1.9.2-p180が使いたいです
公式サイトには古いのしかありませんでした
どこでダウンロードできますか?

342 :デフォルトの名無しさん:2011/03/07(月) 12:14:08.20
 (⌒  (      )  ⌒)  何かすればすぐレンラク・ツーホーなんでしょ?
(             )  )
  (_ヽ_ハ从人_ノ_ノ  できることが限られてるんだよね。私はね
        | || | |
     ノ L,l ,|| |、l、      正義が負けるのか?それが正しいわけないだろ?
     ⌒:::\:::::/::\
    / <●>::::<●>\   裁判は証拠主義、証拠主義。そりゃもっともだ、だが 
   /    (__人__)   \
   |       |::::::|     |  俺が正しいってこと分かってんだろーがっ!
   \       l;;;;;;l    /l!|
   /     `ー'    \ |i   かーっ、腹立つなー!
 /          ヽ !l ヽi
(   丶- 、       しE |    ドンッ!
  `ー、_ノ       煤@l、E ノ >
             レY^V^ヽ

       /.: ̄ ̄ ̄ ̄ ̄ \  黙ってるだけ、確かに黙ってるだけだよね
      /: : :             \  でもさあ、お前らが黙ることで苦しむ人間がいるんだよ
    /: : : :             \  ねえ、聞いてる?良心が痛まない?
  /: : : : : :               \  あなた方は真実を知ってるよね?
/ : : : : : : : ___ノ'′   ゙ヽ、___     \ お願いだから、真実を伝えるメールを下さい
l  : : : : : :.; '⌒`       ´⌒ヽ     l 嘘を言って欲しい訳じゃない、真実を知りたいんです
|   : : .::;;(。o〇 )     ( 〇o。);;::   | どうしても、どうしても真実と思えないんだ
l   : : : :°o゚゚~'"´      `"~゜o゚;°  l 準備書面が事実ならば、伝え忘れるわけがないんだよ
\ : : : : : : 。;゚(    j    ) ; 。+/ 誰が発案者かは間違いなく主張してくる事実なんだ
  \: : : : : : ::`┬‐'´`ー┬′ +  /   そこを主張しなかった理由を知りたい
  /ヽ: : : : : : : |/⌒⌒、|    イ\   見当はついている
  : : : : : : :゚: : : ゚´ ̄~:j ̄`  ;     \ そこを証拠で立証したいだけなんだ
  : : : : . : : . : : ;  '"``    +    \

343 :デフォルトの名無しさん:2011/03/07(月) 12:20:58.39
あらやだ、先月出たやつのバイナリがどこにもないな
MinGWをインストールして自力でコンパイルするしかないわ

344 :デフォルトの名無しさん:2011/03/07(月) 12:30:41.67
ま、立証できなかったからといってすぐ負けるわけじゃないんだけどね。
他の事実から立証していけばいいんだけど、
楽して裁判に勝ちたいから協力してって言ってるだけだけどね。

345 :デフォルトの名無しさん:2011/03/07(月) 12:48:22.34
いや少なくとも RubyInstaller のはあるだろ、と思ったらあった
ttp://rubyinstaller.org/downloads/
MinGW の Ruby になるので、思いっきり古い gem ライブラリをインストールするときにエラーが出ることがある
そのときは gem install hogehoge ではなく gem install --platform mswin32 hogehoge とオプションつきにするといい

346 :デフォルトの名無しさん:2011/03/07(月) 18:31:05.20
ナイトリー ビルド とかは難しいの?

347 :デフォルトの名無しさん:2011/03/07(月) 18:43:49.72
>>340
おお、ほんとに動かねえ
サンクス

348 :デフォルトの名無しさん:2011/03/07(月) 18:46:55.69
>>346
そこまで大多数にエッジ追いかけてもらって意味のある大人気のソフトウェアじゃないしなあ
クライアントプログラムなら開発版バイナリ公開するのにも意義があるけど、スクリプト言語ではな…

ちなみに、ある程度のマシンスペックがあればRubyのコンパイルは現実的な時間で終わる
ナイトリーはアレだが、週1で更新して遊んで試すということは可能
バイナリ公開されてないだけで、自分用のを適宜開発最新版にしてる人はいるはず

「誰も日本語をpで表示して使ってなかったZEやっちゃったZE!」というエンバグの過去があるので、
ある程度知識のある人が開発版コンパイルして日常使用してもらうのは実はありがたい
ただ、初心者スレ向きの話じゃないなw

349 :デフォルトの名無しさん:2011/03/07(月) 19:10:16.58
>>346
人手が足りてないとか何とか
(まあ人手が足りてるオープンソースなんてあるのか知らんが)

350 :デフォルトの名無しさん:2011/03/07(月) 19:24:21.82
最新版おっかけるような人に求められてるスキルとして、
自力でビルドできる、とかは当然含まれてるので、ナイトリービルドのバイナリとか
あまり意味がない。

351 :デフォルトの名無しさん:2011/03/07(月) 19:28:29.89
確かWindows環境だともう入手困難なかなり昔のコンパイラが必要なんだっけ?
VC++ 6あたりだっけか

352 :デフォルトの名無しさん:2011/03/07(月) 19:29:20.36
>>348
/opt 以下にインストールしちゃえという事で、自前コンパイルしてたけど、仮想環境内で
ものの5分くらいでコンパイルは終わってた気がする

353 :デフォルトの名無しさん:2011/03/07(月) 19:31:46.98
>>351
mswin32 を今から環境そろえて作るのはもう無理
今からやる人は mingw になると思う

コンパイル経験さえあれば怖くないので興味のある方はどうぞ

354 :デフォルトの名無しさん:2011/03/07(月) 19:53:53.39
Rubyは不親切な人が多いのですね
最新版あげてくれたらいいのに

355 :デフォルトの名無しさん:2011/03/07(月) 19:54:25.78
諸先輩方に悩みを聞いて頂きたく、筆をとらせていただきました。
テキスト形式で出納帳をつけており、スクリプトで月別に集計しています。
先日、Ruby のバージョンにより計算時間が4倍ほど異なることに気が付きまして、
どのように修正すれば良いのかアドバイスを頂きたいのです。

ずいぶんと昔に例題をコピーして書いたものなので、実は自分でも何をしているのか
忘れてしまいました。根本的に誤っているのであれば、サンプルのようなもを教えて
頂けると助かります。

1.スペック
マシン: 600MHz, 384MB
Ruby : $ /usr/bin/ruby --version
ruby 1.6.8 (2002-12-24) [powerpc-darwin7.0]
$ /usr/local/bin/ruby --version
ruby 1.9.2p180 (2011-02-18 revision 30909) [powerpc-darwin7.9.0]
出納帳: UTF-8 768KB 11013行
自分 : 40 童貞


356 :355:2011/03/07(月) 19:55:20.94
2.実行結果
$ time /usr/bin/ruby suitou.rb 2000
2000.01月の支出額 253421 円
...
2000.12月の支出額 345123 円
------------------------------------------
2000年の支出総額 3946492 円

real 0m1.285s
user 0m0.980s
sys 0m0.070s

$ time /usr/local/bin/ruby suitou.rb 2000
2000.01月の支出額 253421 円
...
2000.12月の支出額 345123 円
------------------------------------------
2000年の支出総額 3946492 円

real 0m4.456s
user 0m3.720s
sys 0m0.120s

3.出納帳(suitou.csv)
2000.01.01,1000,食費,外食,メイド喫茶,*
2000.02.02,2000,教養,HなDVD,立花書店,*
2000.03.03,3000,交通費,地獄-天国,Rails,*
...


357 :355:2011/03/07(月) 19:58:55.81
4−1.スクリプト
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
# Created by: Cherry 2002.06.26
# Last modified: 2010.04.15

ref_file = "/Users/cherry/suitou.csv"
sum = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
sougaku = 0

$pat = ARGV.shift

hoge = ["#{$pat}.01", "#{$pat}.02", "#{$pat}.03", "#{$pat}.04",
"#{$pat}.05", "#{$pat}.06", "#{$pat}.07", "#{$pat}.08",
"#{$pat}.09", "#{$pat}.10", "#{$pat}.11", "#{$pat}.12"]


358 :355:2011/03/07(月) 19:59:38.08
4−2.スクリプト
open("#{ref_file}") {|file|
while l = file.gets
if l =~ /^#{$pat}/
hairetsu = l.split(/,+/)
for i in 0..11
if hairetsu[0] =~ /#{hoge[i]}/
sum[i] += hairetsu[1].to_i
end
end
end
end
}

for j in 0..11
puts "#{hoge[j]}月の支出額 #{sum[j].to_s.rjust(6)} 円"
sougaku += sum[j]
end

puts "------------------------------------------"
puts "#{$pat}年の支出総額 #{sougaku} 円"


359 :デフォルトの名無しさん:2011/03/07(月) 20:22:51.18
open(ARGF.filename + ".ecc") {|file|
while l = file.gets
l=l.to_i
ls=@I[ii]
ii=ii+1

lines += 1
fields += l.to_s.split(',').size
l^=(@P_y%(2**8*ls))
for i in 0..31
salt[i]=0
end
while(l>0)
i=0
while(i<ls)
salt[i]=l&0xff
salt[i]=sprintf("%c",salt[i])
l=(l>>8)
i=i+1
end
end
i=ls-1
while(i>-1)
g.write(salt[i])
i=i-1
end
end
これをCで書くとどうなりますか?教えてください。よろしくお願いします。

360 :デフォルトの名無しさん:2011/03/07(月) 21:11:25.25
あれ、あまり速くならない

# -*- coding: utf-8 -*-
ref_file = "/Users/cherry/suitou.csv"
sums = {"01" => 0, "02" => 0, "03" => 0, "04" => 0, "05" => 0, "06" => 0,
"07" => 0, "08" => 0, "09" => 0, "10" => 0, "11" => 0, "12" => 0}
sougaku = 0

target_year = ARGV[0]
re_target_year = /^#{target_year}/

open("#{ref_file}") {|file|
while line = file.gets
if line =~ re_target_year
hairetsu = line.split(/,+/)
if hairetsu[0] =~ /\d\d\d\d\.(\d\d)\.\d\d/
month = $1
else
raise "日時の表記が不正です:#{line}"
end
sums[month] += hairetsu[1].to_i
end
end
}
sums.sort_by{|pair| pair[0].to_i}.each do |month, sum|
puts "#{target_year}年#{month}月の支出額 #{sum.to_s.rjust(6)} 円"
sougaku += sum
end

puts "------------------------------------------"
puts "#{target_year}年の支出総額 #{sougaku} 円"


361 :デフォルトの名無しさん:2011/03/07(月) 21:23:32.37
余談だけど、Ruby1.9が速いってのは嘘だから
「速くする事もできる」が正確
普通なスクリプトを普通に作ったら、1.8よりも遅い

362 :デフォルトの名無しさん:2011/03/07(月) 21:29:15.80
RubyをCに変換するソフト知りませんか?

363 :デフォルトの名無しさん:2011/03/07(月) 21:33:15.10
>>361
全ての文字列がエンコーディング情報つき文字列になったのに、それで速くなるわけないじゃん

364 :デフォルトの名無しさん:2011/03/07(月) 21:50:22.48
>>361
>「速くする事もできる」が正確
詳しく

365 :デフォルトの名無しさん:2011/03/07(月) 21:50:35.01
http://anlyznews.blogspot.com/2011/02/objective-c.html
これ見たらどうみても1.9のほうが早いみたいだが・・・?

366 :デフォルトの名無しさん:2011/03/07(月) 22:02:27.44
>>360は1.9.2のほうが遅いなあ

367 :デフォルトの名無しさん:2011/03/07(月) 22:08:08.66
>>365
Rubyにはマイクロベンチマークのセットがあるので、
外部からよくわからんソースを引っ張ってくる必要はない

http://jp.rubyist.net/magazine/?0025-Ruby19_Performance
http://jp.rubyist.net/magazine/?0025-TheGreatRubyShootout
http://programmingzen.com/2010/07/19/the-great-ruby-shootout-july-2010/

1.9ではメソッドディスパッチとかの基本的な足回り部分は高速化されているが
文字列関係の処理はM17Nの関係で遅くなることがある
また、大部分がCで記述されているという点に変化はないので、
実アプリでの高速化はせいぜい数割程度

368 :355:2011/03/07(月) 22:13:12.35
>>360さん
改良ありがとうございました。これは1.9以降用になりますね?
自分にとって "01" => 0 と sort_by, pair というものが新しい概念ですが、
調べて身に付くようにしたいと思います。

$ time /usr/local/bin/ruby suitou_2ch_360.rb 2000
real 0m0.741s
user 0m0.470s
sys 0m0.090s

ブレはありますが、おおむね 0.8秒以内(5倍増し!)で計算が完了するように
なりました。1.6.8 よりも早くなってる〜。
これでこのマシンをまだまだ使ってやれます。


>>361さん
アルゴリズムを勉強した方が良いということですね?がんばってみます。


369 :デフォルトの名無しさん:2011/03/08(火) 01:39:10.61
railsからruby始めますって人には
rails installerがいいの?

rubyのホームページには、バイナリを使う場合は
mswin版とmingw版の違いはないって書いてあるけど
実際のとこどうなの?

xpにはmswin、7にはmingwってのはガセ?


370 :デフォルトの名無しさん:2011/03/08(火) 08:14:04.25
WindowsでUTF8だかUNICODEだかのファイル名やテキストを
操作するスクリプト書きたいんですが
どのバイナリだと可能でどのバイナリだと不可能みたいのってあるんですか?
-KuというのをつけておけばどれでもOK?

371 :デフォルトの名無しさん:2011/03/08(火) 08:19:09.66
>>369
Railsやるって人はRailsスレに行ったほうが的確なアドバイスがもらえるかと思う
ttp://hibari.2ch.net/test/read.cgi/php/1292032736/
一般論として、Rubyインストール後にgem install railsでRails一式と自分に必要なものをインストールするのは
若干の知識と根性がいる
オールインワンなモノが自分にあったもの全部用意してくれるなら、それに頼ったほうがいんでないかね

mswinとmingwには動作的違いはないことになってるのだが、
「名前は違うけど動作おんなじ」というシステムのことをrubygemsが考えてくれなかったので、
mingwが一般認知される前に作られた古いバイナリつきgemライブラリが時々mingwを弾く、対処は>>345

>>5にもあるんだけど、稀に躓いてもいい(回復できる)のならmingwのほうがいいと思う、なにより新しいw
Ruby学習中に本質でないトラブルがジェットストリームアタックなので、手一杯な初心者には勧めない

>>370
Unicodeファイル名は扱えない(若干の語弊あり)
UTF-8で書かれたテキストファイルの内容は扱える

372 :デフォルトの名無しさん:2011/03/08(火) 08:55:23.19
>Unicodeファイル名は扱えない(若干の語弊あり)

内部はA系のAPI固定ってことなんですかね。
Ruby.NET(Iron Ruby?)も軽く調べつつ
とりあえずPowerShellでやることにします。

ありがとうございます。

373 :デフォルトの名無しさん:2011/03/08(火) 09:41:33.07
>>354 壊れてて自力じゃどうしようもできないこともありえるナイトリービルドを提供するのが
「親切」だと思うような危篤な人はあなたぐらいです。

374 :デフォルトの名無しさん:2011/03/08(火) 11:34:08.56
ここまでの流れからすると1.8だとUTF-8を扱えないからWebサイト作るときはSJISかEUCしか使えないって事ですか?
基本的にHTMLはUTF-8でやりたいので厳しいですね

375 :デフォルトの名無しさん:2011/03/08(火) 13:34:01.97
何かの入力を元にランダムな文字列を作成する場合は
Digest::SHA1などのハッシュ関数を使うと思うのですが、

入力元データが無く、単純にランダムな文字列を作成したい場合は
ハッシュ関数を使う必要は無いでしょうか?
0~1とa~zをランダムで選んで適当な数だけくっつければOKですか?

具体的にはユーザーから送られてくる画像に対して、出来る限りダブらないような任意のunique_idを振りたいのです。

よろしくお願い致します。

376 :375:2011/03/08(火) 13:39:30.10
すいません、付け足しです。
自分で調べた限り、SecureRandomというモジュールで安全なランダム文字列を作れるとのことですが、
入力元データが無い以上、
0~1とa~zをランダムで選択してくっつける方法よりもセキュアにランダム文字列作る方法があるとは思えないのですが
この考え方は間違ってるのでしょうか。

377 :デフォルトの名無しさん:2011/03/08(火) 13:49:12.46
画像に振るIDにセキュアとか関係ないと思うが
連番が一番信頼できるIDなのだが、連番じゃダメなのか?

378 :375:2011/03/08(火) 13:55:23.44
セキュアの意味は、同じ文字列を生成しないという意味だと思っていたのですが、違うのですか?

連番にできれば一番効率もいいと思うのですが、仕様でランダム文字列で管理するように決まっていまして
下っ端PGの自分には意見する権利が無いのです。

379 :デフォルトの名無しさん:2011/03/08(火) 14:10:12.42
まあ、あれだ、
http://example.com/upload/012.jpg があったら 011.jpg や 013.jpg を探されるけど
http://example.com/upload/d3id9f.jpg があったら「前」や「次」のファイルを探そうとは思わない

というセキュリティばっちりの、お前んちのパソコンは加減乗除しかできない電卓かなにかかという仕様なのだろう

380 :デフォルトの名無しさん:2011/03/08(火) 14:26:37.98
>>376
SecureRandomはシステムからアクセス可能な最大レベルの乱数発生器を使用してランダム数列を作る
というかむしろ、そういうのが入手不可能だった場合は実行できずに例外出して死ぬ
自前で「らんだむにする」なんてのよりもよっぽど偏りがないぞ

ただ、既存との被りチェック機能はないので、それのチェックは自力でやる必要あり
過去と被る可能性がかなり低いというだけで、絶対被らないというわけではない
100まんこのデータIDが溜まってしまった場合、作ったIDが過去と被らないかのチェックは100まん回行う必要がある

これのコストを許すことができない場合は>>377の言うように素直に連番にする
これは少なくとも絶対に被らないから、被りチェックのコストはゼロだ

381 :デフォルトの名無しさん:2011/03/08(火) 14:27:03.60
>>378
セキュアは「安全」という意味で、
大体こういう場合は「セキュリティ的に問題がない」みたいな意味。
ネットの辞書で調べられるでしょ。

ランダム文字列がいいなら、
現在時間のTimeオブジェクトにランダム数値の文字列をくっつけてハッシュとか、
かっこつけたければsaltとして真ん中に適当な文字列を入れ込むとか。
まあなんでもいいと思うよ。

>>379
ああ、エロ画像の一括ダウンロードとかか

382 :デフォルトの名無しさん:2011/03/08(火) 14:33:46.81
>>378
「セキュアな」というのは、
悪意のあるユーザーが乱数の規則性を発見しようとしても困難だという意味
単に衝突を回避したいというのであれば、
乱数を元に十分なだけ文字列を並べればいい

そうすると乱数の種が問題だが、まあ現在時刻とかでもいいかもね
あんまり厳密なことを求めてないようだし

383 :デフォルトの名無しさん:2011/03/08(火) 14:40:49.54
>>380
コリジョンについてのはどうなんだろうね
そのへん脅すとたいてい連番でいいよって言ってくれるもんなんだが

いや、衝突なんてまず起きないけどさ…

384 :デフォルトの名無しさん:2011/03/08(火) 14:46:59.77
ひとえに「万一衝突が起きたらどうなるか」によるな
地球が爆発しますとかなら連番にしておいたほうが無難
過去のファイルが上書きされて公開されますとかなら菓子折りでも持って謝りに行っとけ

385 :デフォルトの名無しさん:2011/03/08(火) 14:51:40.10
Rubyに向いてない処理ってどういうのですか?

386 :デフォルトの名無しさん:2011/03/08(火) 15:07:20.31
Ruby 関係ないけど、連番+乱数みたいなフォーマットにすればコリジョンは発生しないのでは?

387 :375:2011/03/08(火) 15:25:19.08
皆様ありがとうございます。
しかし乱数発生器という概念がやはりよく分かりません。。

たとえば以下のようにランダム文字列を作った場合、

source = ('a'..'z').to_a + (0..9).to_a
a = Array.new(10){source[rand(source.size)]}
a.join

同じくa~zと0~9を用いてこれよりランダムな10桁の文字列を作るのは不可能ではないですか?
全ての桁で何にも依存せずにランダムに文字を決めているのだからこれ以上分散させようが無いと思うのですが。
推測もしようがないと思います。

388 :デフォルトの名無しさん:2011/03/08(火) 15:35:53.77
連番というか、日付をプラスするというのはよく見るね
/upload/20110308/a8b3c7f382.jpg
これなら万一の場合の被害範囲も小さいので説得も簡単だろう
その日のディレクトリ内のファイルなんて多くて1万とかだろ(適当)
「本日のディレクトリ内にファイルが既に存在したら再抽選」という処理でも間に合うはず

まあ、そんな小細工しなくても、結果の文字列がじゅうぶんに長ければ衝突の心配はほぼない
正確を期すと「衝突しないわけではありません」と答えるしかないのが大変辛いところではあるが

Ruby関係ないな

389 :デフォルトの名無しさん:2011/03/08(火) 15:45:08.83
>>385
Rubyで実行して1秒以上かかるような処理は本質的に向いてない
まるちめでぃあとか数値計算とかGUIぐりぐりとかあのへんは苦手分野だ
一般的なゲームも、他の言語と比べた場合はあんまり得意とは言えない
頑張ればなんとかならなくもないのだが、「敢えてRubyでやることに意義がある」という状態なので、
結果が欲しいだけという一般なピーポー様は素直に他の言語で作ろうPythonとかどうすかPython

>>387
その rand() の精度が問題
たとえば、100万回を3回実行したけど毎回1が100個ほど多い、とかだと困る
乱数の種として oasjfoiefdasifj を与えると 4829384 番目の7文字目に同じ数字が出るとか
100万回の結果をプロファイリングすると乱数の種の4文字目は34パーセントの確率で1だとか
普段の使用ではこんなの気にするのは基地外レベルだが、乱数発生器としては失格

SecureRandom.hex とかが重宝されているのは、ランダム数字から16進数を導き出す計算に偏りがないため
rand() で被る確率と SecureRandom で被る確率そのものは、前者のほうがはるかに高いはず
SecureRandom 相当が自由に使用できるなら、乱数発生に SecureRandom を使用しない理由は何もないと思うよ

390 :デフォルトの名無しさん:2011/03/08(火) 16:38:47.31
被らない乱数製造機

ransuu = 1..1000000000.to_a.sort_by{|x| rand}

ransuu.pop


391 :375:2011/03/08(火) 16:48:22.61
うーむ、とても難しいですね(汗)
今の自分にはちょっと理解できないですが、頂いたレスをもう一度じっくり読んでみます。
ありがとうございました。

392 :デフォルトの名無しさん:2011/03/08(火) 16:51:40.85
だから何も言わず SecureRandom 使え
天文学的確率でしか被りませんと胸を張れる
rand() は一意になる ID のようなものを作るのにはもともと向いてないのだ

393 :デフォルトの名無しさん:2011/03/08(火) 17:03:18.87
>>375
> 具体的にはユーザーから送られてくる画像に対して、出来る限りダブらないような任意のunique_idを振りたいのです。

1) スレッドセーフにシーケンスな整数を割り振り
2) 受付時間を整数にして使う

2ちゃんのdatなんかは後者でファイル名つけてるね。

394 :393:2011/03/08(火) 17:04:24.51
あ、スレ読めてなかったスマソ…。忘れて…。

395 :デフォルトの名無しさん:2011/03/08(火) 18:35:34.34
>>372
1.9.2ならunicodeファイル名扱えるよ

396 :デフォルトの名無しさん:2011/03/08(火) 18:37:26.00
>>376
入力元データがないなら、乱数を使ってデータを作ればいい。
require 'digest/sha1'
seed = [rand(), rand(), rand(), rand(), Time.now.to_f].pack('ddddd')
p Digest::SHA256.hexdigest(seed)

ところでhexdigest()は0-9a-fまでの16文字を使うけど、これを0-9a-zまでの文字を
使うようにすれば、同じ情報量でも生成される文字列は短くできるよね。
0-9a-zまでなら36文字か。0-9a-zA-Zと'-'と'_'を使えば、64文字。
hexdigest()のかわりに、バイト列をこの64文字を使って表現する方法を
だれか教えてください。



397 :デフォルトの名無しさん:2011/03/08(火) 18:56:10.67
近いところで
SecureRandom.base64(32)
=> "97LXeNU4g2xG75E0qmvX0+kI34zJkw1+fh/XvJAvEOY="


398 :デフォルトの名無しさん:2011/03/08(火) 19:12:31.88
>>397
できれば任意のバイナリを受け取る方法が知りたい。


399 :デフォルトの名無しさん:2011/03/08(火) 19:58:08.87
>>398
ヒント:
 0と1の2文字しか使わない2進数
 0から7の8文字しか使わない8進数
 0から9の10文字しか使わない10進数
 0からfの16文字しか使わない16進数
 0から_までの64文字しか使わないのは

400 :デフォルトの名無しさん:2011/03/08(火) 20:02:17.95
ハッシュはキーがシンボルなら key:val って書けるじゃん
で値もシンボルなら key: :val ってなって見た目ががっかりなんだが
ここらへん開発陣に問題意識はある感じですかね?

401 :デフォルトの名無しさん:2011/03/08(火) 20:06:28.18
追いかけてないが、特になかったと思った
値もシンボルというのはそういうの的には稀だし

402 :デフォルトの名無しさん:2011/03/08(火) 20:08:27.01
Pythonを覚える場合はRuby覚える必要ってないですか?

403 :デフォルトの名無しさん:2011/03/08(火) 20:09:56.77
ない

404 :デフォルトの名無しさん:2011/03/08(火) 20:12:46.15
>>398
バイナリを6ビットずつに区切って、使いたい文字に割り当てればよろしい。

405 :デフォルトの名無しさん:2011/03/08(火) 20:14:43.65
つまりBASE64と

406 :デフォルトの名無しさん:2011/03/08(火) 20:38:07.26
そうですか。今日ちょうどそういうのがあったので
dir=Dir.glob '*.*'.encode Encoding::UTF_8
dir.each{|e| puts e.encode Encoding::WINDOWS_31J, undef: :replace, invalid: :replace, replace: '?'}

407 :デフォルトの名無しさん:2011/03/08(火) 21:05:05.66
>>404
それをやってくれる便利なメソッドかライブラリがないでしょうか。

408 :デフォルトの名無しさん:2011/03/08(火) 21:13:05.22
base64

409 :デフォルトの名無しさん:2011/03/08(火) 21:35:08.75
[SecureRandom.hex(16)].pack("H*")

410 :デフォルトの名無しさん:2011/03/08(火) 21:38:12.40
あーすまん。よく読んでなかった

411 :デフォルトの名無しさん:2011/03/09(水) 01:19:25.20
>>400
先日IRCでちょっと話題になったな
問題意識がないわけじゃないがノーアイディア

412 :デフォルトの名無しさん:2011/03/09(水) 10:07:55.18
劣化って程じゃないんだね
安心してPS3版買えるよ
教えてくれてありがとう

413 :デフォルトの名無しさん:2011/03/09(水) 11:54:14.36
どういたしまして

414 :デフォルトの名無しさん:2011/03/09(水) 12:42:49.62
>>411
というかJSON互換なんだから値は数値と文字列しか想定してないだろ

415 :デフォルトの名無しさん:2011/03/09(水) 13:05:56.75
>>414
JSON互換ならキーはクォートされた文字列でなければならない。
YAML互換と言うべきだろう。

416 :デフォルトの名無しさん:2011/03/09(水) 13:34:21.60
>>415
YAMLの仕様にはシンボルなんてない。
もしシンボルが使えたら、それはSyck独自拡張。

417 :デフォルトの名無しさん:2011/03/09(水) 13:34:51.73
てか所詮リテラルレベルで互換性語ってもかなり滑稽だ
「どっかから○○形式の記述をコピペしてここで使える」という以上の意義をまったく見出せない

418 :デフォルトの名無しさん:2011/03/09(水) 13:41:15.96
そうだ!
:key => :value
って表記法はどうかな?

419 :デフォルトの名無しさん:2011/03/09(水) 13:44:30.84
>>414-416の展開がそのまんま答だなw
みんなして「○○記述形式でよくある、なんかコロンで繋ぐやつ」という認識でしかねえw
だから実際に何形式なのかを言葉にするとガンガンすれ違う

解釈後に生成されるオブジェクトからして、Ruby引数オリジナルと考えるのが一番真っ当だと思う

420 :デフォルトの名無しさん:2011/03/09(水) 14:16:22.94
たぶんPythonのキーワード引数の踏襲。


421 :デフォルトの名無しさん:2011/03/09(水) 16:24:50.31
引数以外でも使えるよ
{kew: 'value'} => {:kew=>"value"}


422 :デフォルトの名無しさん:2011/03/09(水) 16:31:03.59
>>420
Matzの趣味的にはCommon Lispだろう

423 :デフォルトの名無しさん:2011/03/09(水) 22:32:49.71
Ruby1.9.2でWindowsのUnicodeテキストファイル UTF-16LE(改行:<CR+LF>)+BOM を
読み書きするにはどうしたらよろしいのでしょうか?

abc<CR+LF>
を読むとバイト列が [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10]
となってLFの2バイト目が分断されているようです

それとBOMの適切な処理方法があれば教えてください。
(設定によってBOMを読み飛ばしてくれたりバイトオーダーを設定できたりする機能があれば)

ソース
# coding: utf-8

$stdin.binmode
#$stdout.binmode

$stdin.set_encoding 'utf-16le'
$stdout.set_encoding 'utf-16le'

while row = gets
p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10]
print '#', row
end


printのところでエラー
xxxx.rb:11:in `write': incomplete "\n" on UTF-16LE (Encoding::InvalidByteSequenceError)

424 :デフォルトの名無しさん:2011/03/09(水) 23:01:22.09
>>423
質問の一部にだけしか回答できないけど

> LFの2バイト目が分断されているようです
getsのline separatorが10 00ではなく10になっているとかじゃないか

425 :デフォルトの名無しさん:2011/03/09(水) 23:09:47.00
getsって意外とめんどくさいよね

426 :デフォルトの名無しさん:2011/03/09(水) 23:13:59.29
>>423
gets のあとで tell すると 11 と返ってきたけど、これって
次に読むのが最後の1バイト(00)っていう状態かしら。


427 :デフォルトの名無しさん:2011/03/09(水) 23:17:23.08
getsは使うときドキドキするね

$stdin.binmodeを外すとどうなるだろう

428 :デフォルトの名無しさん:2011/03/09(水) 23:19:50.29
gets は $/ を区切りとするんだけど、これがそのままだと 0x10 なので、
$/ = "¥r¥n".encode('UTF-16LE') としたらうまくいった。
BOMをむしるところまでは出来ないけど。

>>427
binmode は ascii-incompatible なエンコーディングを読むときに必要だと
怒られる。



429 :デフォルトの名無しさん:2011/03/09(水) 23:41:14.14
>>428
なるほど。やってみた

`set_encoding': ASCII incompatible encoding needs binmode (ArgumentError)

テキスト読むのにbinmodeにしろとか気持ち悪いね
BOM, $/ともども手当てしてあってもおかしくないんだけど

430 :デフォルトの名無しさん:2011/03/10(木) 00:03:48.58
NoMethodError: undefined method `to_utf8' for "\343\201\277\343\201\213\343\202\223":String
(#^ω^)ピキピキ

431 :デフォルトの名無しさん:2011/03/10(木) 00:07:24.88
(::゚∀゚::) そんなにピキピキしてないで俺でも食えよ

432 :デフォルトの名無しさん:2011/03/10(木) 00:07:52.94
$/ をケアするとして、こいつはあいにく特定のIOに結びついたものでは
ないので、やるとすれば、getsが毎回その時点での $/ を対象IOの
エンコーディングに合わせて変換することになるんだろうな。

IOインスタンスごとに line_delimiter みたいなプロパティを用意して、
デフォルトがそれになるようにするのがよいのかもしれん。
あれ、ないんだっけ…?



433 :デフォルトの名無しさん:2011/03/10(木) 00:12:40.29
getsはデリミタとして使用する文字列を引数にとるだろ
まったく試してないが gets("\r\n".encode('UTF-16LE')) でいけるはずだ
あと>>428はマカー

434 :デフォルトの名無しさん:2011/03/10(木) 00:38:45.19
WebKit通すとバックスラッシュが yen になっちまうからばれるんだよね…


435 :423:2011/03/10(木) 00:51:17.63
改行の読み込みはデリミタ指定でうまくいきました。ありがとうございました。
BOMはとりあえず見てみぬふりをします。

# coding: utf-8

$stdin.binmode # バイナリモードでないとエラー :in `set_encoding': ASCII incompatible encoding needs binmode (ArgumentError)
# $stdout.binmode # バイナリモードだと改行が<LF>

$stdin.set_encoding 'utf-16le'
$stdout.set_encoding 'utf-16le'

while row = gets("\r\n".encode('utf-16le'))
p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10, 0]
 print '#', row.chomp, "\n" # <CRCRLF>対策
end


436 :デフォルトの名無しさん:2011/03/10(木) 01:08:58.29
BOMについてはまともに対応しようとすると大変らしいので(よくわからない)、
とりあえず$stdinを2バイトseekしてから使い始めとけばいいんじゃないかな。


437 :デフォルトの名無しさん:2011/03/10(木) 01:15:35.90
なにその誤爆するまで前進

438 :デフォルトの名無しさん:2011/03/10(木) 07:52:45.66
IO#getsだとちゃんと改行を読むね
open('hoge','rb:UTF-16LE') do |io|
while row = io.gets
p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10, 0]
end
end
p $/ #=> "\n"

Kernel#getsの不具合なのかな


439 :デフォルトの名無しさん:2011/03/10(木) 08:07:06.44
それと、Ruby1.9.2だとBOM判別、読み飛ばし機能が付いてた
open('hoge','rb:BOM|UTF-16BE') do |io|
while row = io.gets
p row.each_byte.to_a #=> [ 97, 0, 98, 0, 99, 0, 13, 0, 10, 0]
p row.encoding #=> #<Encoding:UTF-16LE>
end
end

openのモード指定でexternal-encodingがUTF系のときBOM|をつけると
BOMを判別してエンコーディング決定&BOM読み飛ばし
BOMがなければ指定されたエンコーディングに

1.9でIOのクラスメソッドが ハッシュ引数をとるようになったので
IO.foreach('hoge',mode:'rb:BOM|UTF-16LE'){|row| p row.each_byte.to_a}
とかできる
でも
IO.foreach('hoge',binmode:true, external_encoding:'BOM|UTF-16LE')
みたいな external_encodingでの指定は効かなかった
対応し忘れ?
例によってドキュメントないけどorz


440 :デフォルトの名無しさん:2011/03/10(木) 08:26:13.93
> mode:'rb:BOM|UTF-16LE'

やっぱこの記法キモいわ
あ、でも1.9専用って示すのにはいいかも

441 :デフォルトの名無しさん:2011/03/10(木) 18:19:42.88
>>438-439
ほう……俺が考え付くようなことは既に実装されてるんだね

>>440
一瞬新しいハッシュの記法かと思った

442 :デフォルトの名無しさん:2011/03/11(金) 07:46:49.98
>>441
新しいハッシュの記法だと思ってた。
ハッシュじゃないならmode:の部分がベアワードでエラーになりそうな気がするから。

443 :デフォルトの名無しさん:2011/03/11(金) 14:13:43.92
Ruby初心者を脱した自覚くらいはあって、
これからかっこいい中級者になりたいなと思ってるんだけど、
そのために必要なぷろぐらみんぐちしきとかを勉強できる本とかないもんですかね
っていうか足りない知識ってなんだろう

444 :デフォルトの名無しさん:2011/03/11(金) 14:18:06.57
デザインパターンとかリファクタリングとかあのへんの本を読むと、今なら面白いかも
あとソフトウェアテスト関係
Webに関連する生活をしてるならHTTPのRFCとか

他人のライブラリソースを読むのもいいけれどね

445 :デフォルトの名無しさん:2011/03/11(金) 14:27:16.65
配列内の要素をソートしたいのですが、方法が分かりません。

具体的には、scoreというインスタンス変数を持ったBookクラスがあり、
このBookクラスのオブジェクトの配列book_listがあるとします。
book_list内のBookオブジェクトをscoreの高い順に並び替えたいのですが、
自分で考える限り、以下のような感じで力尽きます。

sorted_book_list = []
book_list.each do |b|
sorted_book_list.each_with_index do |sb, i|
if b.score > sb.score
# i番以降の要素を全て一つ後ろにずらす処理がここで必要だが実現できたとしてもパフォーマンスが酷そう。
sorted_book_list[i] = b
break
end
end
end

もっとスマートな方法があれば教えて頂けないでしょうか。

446 :デフォルトの名無しさん:2011/03/11(金) 15:00:13.72
sorted_book_list = book_list.sort {|a, b| a.score <=> b.score }

447 :デフォルトの名無しさん:2011/03/11(金) 15:34:37.78
Perlだとハッシュテーブルの配列の大きさを

keys %hash = 64;

と指定できるのですが、Rubyにもそういう機能はありますでしょうか?

448 :デフォルトの名無しさん:2011/03/11(金) 15:37:39.50
>>445
book_list.sort_by {|book| book.score }

>>447
残念ながらない

449 :デフォルトの名無しさん:2011/03/11(金) 15:48:19.11
>>448
ないですか。
d

450 :445:2011/03/11(金) 23:34:16.09
>>446
>>448
ありがとうございます!
まさに求めていた機能です。勉強になりました。

451 :デフォルトの名無しさん:2011/03/15(火) 11:20:01.58
>>444
GoFなデザインパターンは、Rubyみたいな後発で動的で完全オブジェクトで
プロックとブロックが跋扈してるような言語ではあまり新鮮な有り難味がないかも
「あーこれ名前ついてたんだー」とか思うことがしばしばある

452 :デフォルトの名無しさん:2011/03/15(火) 18:10:19.84
ちょっとjavascriptに浮気してくる。
ウェブサイトに必須のようだから。

453 :デフォルトの名無しさん:2011/03/17(木) 20:02:07.00
0から99までの数字の配列が欲しいのですが、

i = [0..100]
puts i

とやっても期待した結果が得られません。
(実行結果=[0..100])
配列をバラバラにして取得するにはどうすればいいでしょうか?


454 :デフォルトの名無しさん:2011/03/17(木) 20:06:49.06
(0..100).to_a

455 :デフォルトの名無しさん:2011/03/17(木) 21:05:24.01
0..100 だと 0, 1, 2, ..., 98, 99, 100 になる。
末尾を含まないRangeは 0...100 (ドット3つ)

456 :デフォルトの名無しさん:2011/03/17(木) 21:40:39.05
>>453
(0..99).to_a だな
Range クラスというのがある
開始と終了と succ メソッドの返り値(と比較メソッド)だけ見てる変なクラスだ

457 :デフォルトの名無しさん:2011/03/17(木) 21:44:20.33
to_a する方法はいろいろあるけど、元のコードに一番近いのは
それよりもこれじゃないかと思った。

[*0..99]

458 :デフォルトの名無しさん:2011/03/17(木) 23:00:58.58
[*0...100]

459 :デフォルトの名無しさん:2011/03/18(金) 00:55:26.51
あんまり話題としては取りざたされないけど
Rangeクラスって、Rubyの特徴的な機能の一つだよね

これも何かほかの言語にあった機能を、Rubyが取り込んだものなんだろうか

460 :デフォルトの名無しさん:2011/03/18(金) 01:05:24.55
状態を持つ演算子としての .. (...) は Perl 由来。
その状態をRuby以前にオブジェクト化したものがあるかは生憎知らない。


461 :デフォルトの名無しさん:2011/03/18(金) 10:05:59.40
>>453
>i = [0..100]
>puts i
これは
r = 0..100
i = [r]
と同じである、つまり
・「0..100」というRangeオブジェクトが1つだけ入った配列
になる。
0から99までの配列の作り方は>>454以降を参照。

462 :デフォルトの名無しさん:2011/03/18(金) 16:10:31.92
Perlだと範囲演算子はリストに展開するからRubyも同様と思ったのかも

463 :デフォルトの名無しさん:2011/03/18(金) 18:36:28.23
何をするかにもよるが、Rubyの場合Rangeのまま使っちゃうのもアリ
Rangeもイテレータ呼んだり出来るからね

464 :デフォルトの名無しさん:2011/03/18(金) 18:59:06.05
0..9.to_a

って書けるようになったんだっけ?
1.9で演算子?の優先順位が変わったとか。
代わってないか。

465 :デフォルトの名無しさん:2011/03/18(金) 19:01:44.69
変わってないからみんな括弧つけてるじゃん。


466 :デフォルトの名無しさん:2011/03/18(金) 20:17:55.76
有理数のリテラル

467 :デフォルトの名無しさん:2011/03/18(金) 22:18:53.23
> [*0..99]
これどういう意味?

468 :デフォルトの名無しさん:2011/03/18(金) 22:51:01.34
範囲オブジェクトをリストに展開

469 :デフォルトの名無しさん:2011/03/18(金) 23:04:00.96
to_aしてから展開する
[*1..3] == [1,2,3]

マニュアル見たら [*obj] の説明は無かったが
メソッド呼び出しの最後の引数に*をつけると、配列を展開して渡せる
それと同じことが 配列リテラルでもできる
[0,1,2,*7..9] == [0,1,2,7,8,9]

Ruby 1.9からは、ちょっと拡張されて
最後の引数だけじゃなくてどこでもよくなって、複数でも可能に
[*1..3,5,*7..9] == [1,2,3,5,7,8,9]


470 :デフォルトの名無しさん:2011/03/18(金) 23:47:42.59
一時期 to_splat というメソッド名があったのだが、今はないようだ。


471 :デフォルトの名無しさん:2011/03/19(土) 03:34:32.77
>ruby -E utf-16le -e "$stdin.binmode"
-e: ASCII incompatible encoding needs binmode (ArgumentError)
どうすれば?

472 :デフォルトの名無しさん:2011/03/19(土) 08:14:35.15
それあれだよね、中身としては binmode 以前の

$ ruby -E utf-16le -e ""
-e: ASCII incompatible encoding needs binmode (ArgumentError)

> ruby -E utf-16le -e ""
<internal:prelude>:3:in `require': incompatible character encodings: Windows-31J
and UTF-16LE (Encoding::CompatibilityError)

とか出るのをどうすればいいかという話だよね

473 :デフォルトの名無しさん:2011/03/19(土) 14:10:46.54
>>468-469
質問した人じゃないけど、すごくわかりやすいです。
横からd

474 :デフォルトの名無しさん:2011/03/19(土) 14:44:21.99
まったくのRuby初心者ですが
Windowsユーザーの方に質問です
みなさんはどのような環境でプログラミングされていますか?
RDEやEclipse、NetBeans等いろいろあるので
どれを選択すべきか悩んでいます
意見を頂けないでしょうか?

475 :デフォルトの名無しさん:2011/03/19(土) 14:51:00.17
>>474
基本はVirtualBox上にLinux入れて、自前コンパイルをインストールした環境。
パッケージングシステムとgemの相性が悪いので…

んで、Windows上で使うものの時にはNetBeans + JRubyで。
rawrでexe化が出来るので…。Macのappも作れるよ。

476 :デフォルトの名無しさん:2011/03/19(土) 15:59:44.25
基本的にはエディタとコマンドプロンプトだと思うの
IDEがない時代に考えられた言語で、スクリプト単体で動作するように作られてるから

標準入力と標準出力をきちんと把握したあとで
(悲しいけどこれ最重要、IDEべったりの人はここで詰まる)
IDEがサックサクの環境ならEclipseでいいんでないかね
NetBeansが次点人気
RDEはとりあえず初心者は捨てていい

あと、Javaや.netのような親切で高度で指一本な連携サポートはできないのでご注意

477 :デフォルトの名無しさん:2011/03/19(土) 16:07:19.44
RubyをIDEで始めてしまうと、実際のスクリプトの実行方法がよくわからないことになるからな…
IDE上からは実行できるんですが普通に使う方法がわかりませんというのはFAQに近い
エディタとコマンドプロンプトで作って、ある程度納得してから進む道決めたほうがいいかもしれん

うまい教科書があるといいんだけど

478 :デフォルトの名無しさん:2011/03/19(土) 16:10:44.33
その手の根性主義はもう流行らないと思う

479 :デフォルトの名無しさん:2011/03/19(土) 16:15:33.40
だって、IDEのRubyサポートって初心者に全然優しくないもの
あんなものを最初に触らせること自体「俺ならできる、だからお前もやれ!」という体育会系の思考だわ

480 :デフォルトの名無しさん:2011/03/19(土) 16:24:47.12
あれはJavaとかC++とかでEclipseやNetBeansを使い慣れている人が
Rubyでも似たようなことをしたいと思って使うもんだ

Ruby初心者には若干厳しく、統合開発環境初心者には鬼だ
そのへん見極めて勧めないと逆効果になりかねん

481 :デフォルトの名無しさん:2011/03/19(土) 16:36:06.27
意見を下さった方、ありがとうございました

482 :デフォルトの名無しさん:2011/03/19(土) 16:37:39.54
viとemacsどっちがいいの?

483 :デフォルトの名無しさん:2011/03/19(土) 16:49:36.59
宗教論争になるので両方試せ。


484 :デフォルトの名無しさん:2011/03/19(土) 17:24:16.66
Emacs → あの Emacs で Ruby スクリプトが書ける
Vim → あの Vim で Ruby スクリプトが書ける

メリットだと思うほう使え

485 :471:2011/03/19(土) 17:32:37.82
>ruby -E utf-16le:utf-8 -e ""
で行けた

486 :デフォルトの名無しさん:2011/03/19(土) 17:35:27.03
>>485
それは要件満たしてるのか?

487 :471:2011/03/19(土) 20:28:00.07
ok

488 :デフォルトの名無しさん:2011/03/19(土) 21:14:01.61
[1,2,3,4,5,6].each{|a,b| puts a,b}
で、12,34,56と消費するイテレータってないんですか?
[[1,2],,,というのはなしで

489 :デフォルトの名無しさん:2011/03/19(土) 21:18:30.87
each_slice

490 :デフォルトの名無しさん:2011/03/20(日) 02:00:07.70
30%の需要があるとのことなので、出てくるかと思ったが、出ないのね。
ありそうなので、探したんだけど、無いから自分で作った。
習い初めのものなので、つっこみはご勘弁。

# 多次元配列と文字列の複製
# dataの値を新しいアドレスを作成して複製
def copy(data)
if Array.try_convert(data) == nil
String.try_convert(data) ? data.dup : data
else
(0 ... data.size).map{|i|
copy(data[i])
}
end
end


491 :デフォルトの名無しさん:2011/03/20(日) 03:10:30.28
>>490
Marshal.load(Marshal.dump(data)じゃいやだったの?

492 :デフォルトの名無しさん:2011/03/20(日) 04:15:52.14
つっこみはご勘弁ってならなぜ貼ったのだろう

493 :デフォルトの名無しさん:2011/03/20(日) 06:58:31.33
誤爆だろ
多次元配列はRubyにはない

494 :デフォルトの名無しさん:2011/03/20(日) 07:15:53.69
アドレスもないしな

多次元配列自体は存在できないわけではないんだが、専用にクラス作らんといかんぬ

495 :デフォルトの名無しさん:2011/03/20(日) 13:28:18.96
Ruby の構造的仕様だな

obj[x][y][z] が

 obj[x, y, z]

ではなく

 retx = obj[x]
 rety = retx[y]
 retz = rety[z]
 return retz

というレシーバ依存のメソッドチェーンである時点で、もうどうしようもない
単純には諦めてネストした巨大な配列にするしかなく、実用的には NArray gem を使うとかしかないわ

496 :デフォルトの名無しさん:2011/03/20(日) 15:58:00.20
Python の NumPy みたいなものがあればいいんだよね?

497 :デフォルトの名無しさん:2011/03/20(日) 15:59:56.68
>>496
だから NArray ではご不満ですか

498 :デフォルトの名無しさん:2011/03/20(日) 19:00:14.35
本当の意味での多次元配列実現したいならクラス作っちゃうかな

499 :デフォルトの名無しさん:2011/03/20(日) 19:21:54.20
>>498


500 :デフォルトの名無しさん:2011/03/20(日) 20:19:24.33
雑魚どもが

501 :デフォルトの名無しさん:2011/03/20(日) 20:57:00.75
ポインタと参照みたいなもんだから
そう刺々しくせずに生温かく見守ってあげてください

502 :デフォルトの名無しさん:2011/03/20(日) 22:06:39.16
多次元配列ではないというのは単に言葉尻の問題ではなく実際的な脅威
なんでわざわざ同じように間違えるまで放置しなければならないのかと

503 :デフォルトの名無しさん:2011/03/20(日) 22:19:45.81
いやだってary[0][1]はRuby使いにとってary[0]のそのまた[1]にしか見えないでしょ
どこが実際的な脅威なのか不明

504 :デフォルトの名無しさん:2011/03/20(日) 22:29:57.66
なんでもいいんだが、Ruby 次元配列 -"NArray" あたりでぐぐったのはほぼ全部
「ary[0][1]はRuby使いにとってary[0]のそのまた[1]にしか見え」てない実例だと思う

505 :デフォルトの名無しさん:2011/03/20(日) 22:41:55.58
ネストしただけの配列を多次元配列と呼んでいる時点で
「私Rubyわかってませんこれからここで勢いよく躓きますみなさん見ててください」
と言ってるようなもんだろ

m = Array.new(3, [])

と書いてあったら危険なのと同じ
それは違いますそれは動きませんと言ってあげること自体は非難されるべきではない(今回は言い方がアレだが)
なんでニヤニヤ笑いながら手を差し伸べずに眺めて失敗してから先輩風吹かせて「いやーそれはねー」とか言うの

506 :デフォルトの名無しさん:2011/03/20(日) 22:48:39.13
>>505
先生、それは単に参照とはなんぞやの問題です
多次元配列以前の問題です

507 :デフォルトの名無しさん:2011/03/20(日) 22:54:52.23
>>505
「ネストした配列は多次元配列ではない」というのは、
それと同様にtrap::Arrayに書かれていてもおかしくないと思う

>>506
たぶんこのレベルの話をしてる
ttp://www.ruby-lang.org/ja/man/html/trap_Array.html

508 :デフォルトの名無しさん:2011/03/20(日) 22:56:44.90
ていうかこれぶっちゃけバグだよね
誰も得しないだろ

509 :デフォルトの名無しさん:2011/03/20(日) 23:05:16.65
>>507
まさに参照の問題じゃない
同じオブジェクトを指すという

510 :デフォルトの名無しさん:2011/03/20(日) 23:17:12.97
うわあバカがいる
配列が出てこない str.gsub(/re/, '\1') とかにしたほうがよかったか
>>505は具体的な配列の動作の話してるわけじゃないぞ

511 :デフォルトの名無しさん:2011/03/20(日) 23:23:46.56
>>510
誰に言ってるかわからないからアンカつけれ

512 :デフォルトの名無しさん:2011/03/21(月) 11:48:09.04
>>480
IDEはIDEに慣れた人が使う開発環境だよ
特にRubyのようにIDEの利用者が少ないなら、JavaやC#のようにサクサク使えないのを分かった上でIDEに慣れた人が使うものだと思うよ
もしWindowsでC#やVB.netをvimやemacsで開発する人がいたらちと酔狂だなとは思うかもしれないが、慣れている環境というのを差し引くのは難しいよ

俺の結論も>>475なんだが>>474が初心者なら特に多くの人が使っていない開発環境を積極的に使う理由がないな
趣味でちょっとしたスクリプトを書くのなら何でもいいんだがな

513 :デフォルトの名無しさん:2011/03/22(火) 09:34:14.49
Windowsギライなジジイの押し付けがましい意見は参考にならない。まで読んだ

514 :デフォルトの名無しさん:2011/03/22(火) 10:47:09.45
Windows使いはさっさとNetBeans(RDEその他はよく知らないけど使い物になるなら何でもいい)入れとけ。
コード補完+ステップ実行+変数ウォッチできるだけでも開発効率が段違い。

ruby.exe+テキストエディタな環境と排他でもなんでもないから
IDEでパーツ作って残りは従来環境で仕上げてテストする事も普通にできる。

2011年にもなってIDEは是か非かなんてあまりにも不毛すぎるよ。

515 :デフォルトの名無しさん:2011/03/22(火) 11:22:11.43
5年後も同じ論争やってると思うよ。正解なんてないから。

516 :デフォルトの名無しさん:2011/03/22(火) 14:45:58.74
Amazonのレビューだと「たのしいruby」はプログラム自体が初めての者には難易度が高いとのことですが
そういった者に向く入門書はないでしょうか
調べてみると「Ruby1はじめてのプログラミング」が良いらしいですがこちらは如何でしょう

517 :デフォルトの名無しさん:2011/03/22(火) 15:53:07.01
>「たのしいruby」はプログラム自体が初めての者には難易度が高い
くっそー誰だそんなやたらピンポイントに的確なレビューしてる奴は
ttp://www.amazon.co.jp/product-reviews/4797357401/
提供する問題が若干独り善がりであるという指摘は前からうっすらあった
書き換えたの送ったら更新してくれるかなあ

Ruby1ってあれだよねピンクのガゼルの大きいやつ
ttp://www.amazon.co.jp/dp/4798117994/
Rubyの初心者向け薄い本は当人の当たり外れが大き過ぎるので
できれば事前に立ち読みとかしてマッチングしてもらえるとまいっちんぐなことにならないんだが

内容としては普通に初心者向けだと思う
…つまり、下手したら本の半分くらいが自分にとって不要な記述である可能性があるってことだけど
たのしいRubyより前に位置する本であることは保証するよ
1.9に関する記述がなかった気がするが、まあそれは必要になってから上乗せで勉強すればええ

518 :デフォルトの名無しさん:2011/03/22(火) 17:40:21.14
プログラミング自体の初心者なら

http://www.amazon.co.jp/dp/4873112923 これか
http://www.amazon.co.jp/dp/4798019437 これ

519 :デフォルトの名無しさん:2011/03/23(水) 11:33:45.48
「天気予報サイトの現在の予報マーク(↓こんなの)を表示するライブラリ」を作り、gem で管理したいです
ttp://i.yimg.jp/images/weather/general/forcast/clouds_sun_st.gif

この画像をローカルにキャッシュしたいのですが、ディレクトリをどこに置いていいのかわかりません
Otenki::Config とかクラスを作って、ユーザが事前に指定しない場合は動作しない、みたいなのがいいんでしょうか

 Otenki::Config.cache_dir = "/home/ch2/otenki/cache" # 必須
 Otenki.new.show

インストール先に勝手に gems/otenkiview-0.1.2/cache/ を作ってそこに一律保存する、みたいなのってよくないですよね?

520 :デフォルトの名無しさん:2011/03/23(水) 12:11:05.93
>>519
うーん、現在の天気を調べるクラスは別にいいんだけど
画像までライブラリに含むのはどうかと思うなあ
ライブラリ使う人が違う画像を使いたいと思ったらどうするの?

521 :デフォルトの名無しさん:2011/03/23(水) 12:18:48.81
本来なんて呼ぶのかわからないんだけど、
gems/libname-1.0.0/ のライブラリホームにスクリプトが書き込むのはよろしくないな
パーミッションの関係で書き込めないことが多いし、スーパーユーザーで書き込んだら上書きできない

永続的な設定ファイルとかをどうしようかというのはみんな悩んでるんだけどね

522 :デフォルトの名無しさん:2011/03/23(水) 12:26:35.20
ライブラリが書き込むディレクトリはユーザーに手動で指定させるしかあんめえ
いつのまにか $HOME/.otenki/cache/ みたいなのを作る糞ライブラリもあるけどな

523 :デフォルトの名無しさん:2011/03/23(水) 20:18:16.60
インストール時にgemが参照する第三者のリソースもディプロイしたい、
という話ではないのか。
↑なら post_install フックでやりゃいいんだけど。


524 :デフォルトの名無しさん:2011/03/23(水) 20:33:35.92
cache なので、たぶん

doc = Nokogiri.parse(open(天気予報サイト).read)
yohou_text = doc.at('今日の天気文字列').inner_text
mark_src = doc.at('img/今日の天気マーク')['src']
local_cache = @cache_dir + File.basename(mark_src)
File.open(local_cache, 'w'){|f| f.print(open(mark_src).read)} unless File.exist?(local_cache)

puts <<EOS
<title>今日のお天気</title>
<img src="file://#{local_cache}">
今日の天気は#{yohou_text}です!
EOS

とかやるんじゃないの
で、@cache_dir の初期値をどうしましょうと
ライブラリが共通で使うなら gem インストール時になんか適当に自動で GET すればいいじゃんね

525 :デフォルトの名無しさん:2011/03/24(木) 01:10:55.51
shareディレクトリとかどう?
Linux使ったことないから、こういう目的にshareを使って良いものなのかどうかわからないけど

526 :デフォルトの名無しさん:2011/03/24(木) 01:33:01.49
運用状況により容量可変となるディレクトリだから、shareじゃなくて、/var/libじゃね?

ただ、ふと考えてみたら、他のユーザーが使った後にはシステムデフォルトの画像が変わってるかもしれないって、
結構、嫌な仕様じゃね?

527 :デフォルトの名無しさん:2011/03/24(木) 05:14:06.81
お前らはWebブラウザのキャッシュをログインユーザー全員で使い回す気なのかと小一時間
まあ、そういうような共用読み書きディレクトリの指定方法がないのも確かなんだが
Webのキャッシュって言ったら普通はログインユーザーごとに個別だろ、普通は

意外とこのへんの基本設定のデファクトって固まってないのね

528 :デフォルトの名無しさん:2011/03/24(木) 05:28:34.06
ユーザーに設定で指定させるのが普通だろ
指定されてなかったらデフォルト使うのではなくエラーで止める

ユーザーが指定しなくても適当にクラスをnewしてgetするだけで
適当にホームにディレクトリ掘って永続保存してあら便利、みたいなのはキモいのでやめるべき

529 :デフォルトの名無しさん:2011/03/24(木) 09:37:28.58
> 「天気予報サイトの現在の予報マーク(↓こんなの)を表示するライブラリ」

そもそもこれはキャッシュなのか

530 :デフォルトの名無しさん:2011/03/24(木) 09:43:17.91
いろいろ動作説明が足りないのは間違いないな
てかそこを突っ込んでどうする

531 :デフォルトの名無しさん:2011/03/24(木) 09:50:57.66
>>530
ライブラリ動作用のユーザーディレクトリ位置なんてうまい固定回答がない分野なので、
初心者スレとしてはもうそこらへん突っ込むしかないのよ
知りませんってレスするわけにはいかないだろプライドとしてw

532 :デフォルトの名無しさん:2011/03/24(木) 12:09:49.67
どこそこにフォルダを作ってくれって言われただけで思考停止する情弱もいるし
ホームディレクトリに勝手に設定ファイル作るソフト排除してたら何も出来ないよ
俺はユーザの指定が無いならホームに勝手に作っていいと思う派

533 :デフォルトの名無しさん:2011/03/24(木) 12:37:45.18
少なくとも gem ライブラリを使用するようなユーザーは
プログラミングが可能な程度のPCリテラシ持ちだとみなしてよいでそ
ほとんど存在しないものに対してコストをかけるこことほど間抜けなものもない

534 :デフォルトの名無しさん:2011/03/24(木) 13:35:56.84
>>532
セキュリティ考えろよカス、ユーザに確認とれメンテ苦労するわ

535 :デフォルトの名無しさん:2011/03/24(木) 18:55:38.82
2KBの自分用スクリプト書くのに半日ほどかかった
Ruby始めて4年くらいなのだがなんか絶望した

536 :デフォルトの名無しさん:2011/03/24(木) 21:02:35.45
別に良いんじゃね、自分用なんだしそんな気に病むこともねえべ

537 :デフォルトの名無しさん:2011/03/24(木) 21:19:58.84
単体テストつきとかなら別にいいんじゃね
無軌道に書いて半日とかはさすがになんかちょっとアレだが

538 :デフォルトの名無しさん:2011/03/24(木) 21:23:42.74
>>534
セキュリティって何ですか?おいしいの?
>>519のプログラムがセキュリティを確保するにはどうしたらいいの?

539 :デフォルトの名無しさん:2011/03/24(木) 21:37:41.15
まぁ、ユーザーが自分で掘っていたディレクトリと名前がかぶったら
悲惨だよね。


540 :デフォルトの名無しさん:2011/03/24(木) 22:47:39.98
テストの話が出てたので

expected ってリテラルのような実際の値で書くべきだよね?

 def arr_change(arr)
  arrを標準メソッドでアレしてコレした配列
 end

に対して

 expected = arrを標準メソッドでアレしてコレした配列
 arr_change(arr).should eql(expected)

というテスト書いても実際的な意味はないですよね

 expected = [741, 332, 93, (中略), 23140, 9847, 30994, 4, 43098]
 arr_change(arr).should eql(expected)

と、若干長いリテラルになったとしても書くべきですよね

541 :デフォルトの名無しさん:2011/03/24(木) 23:02:24.27
>>538
セキュリティしらないの?

542 :デフォルトの名無しさん:2011/03/25(金) 00:21:37.34
>>541
知らないな
アプリケーションがホームにディレクトリ掘ったりファイル作ったりするだけで
破綻してしまうようなセキュリティてどんなん
もちろんそのアプリケーションが悪意を持って作られたってんなら話は別だが

>>534
一応言っておくと俺は>>532で「ユーザの指定が無いなら」と前置きしてるんだから
ユーザに確認しなくてもセキュリティが確保できる方法を示してくれよ
人の事をカス呼ばわりするんだからそれくらい出来るだろう?

543 :デフォルトの名無しさん:2011/03/25(金) 00:30:02.92
どんだけファビョってんだよ

544 :デフォルトの名無しさん:2011/03/25(金) 00:47:27.54
知らないなら、人を批判する立場ではない
5年後に自分の文章を読んでみろ、カスと呼ばれた意味がわかる
俺は教えない

545 :デフォルトの名無しさん:2011/03/25(金) 01:03:44.47
セキュリティとか言いたいだけのカスだもんな
知らない事は教えられんわな

せっかくだから俺が>>519のプログラムを作るならこのようにするってのを書いとく
(gemはOSのパッケージシステム使ってて意識した事無いんで考慮してない)
ライブラリの提供する機能は指定場所日時の天気をSymbolやStringで返すだけ。
問題の画像ファイルはそのライブラリを使用するアプリケーションが用意する。
利用者に同じ画像ファイルを使わせるために配布物の中にあらかじめ納めておく。
用意できず他所から持ってくるならインストール時にユーザに確認を取ってからやるか
手動でダウンロードさせる。
各ユーザの設定ファイルでファイルの場所を指定するのも良いだろう。
どっちにしてもキャッシュやセキュリティ等の問題は発生しない。

546 :デフォルトの名無しさん:2011/03/25(金) 01:07:55.13
インストールというフェイズが存在する gem ライブラリであるというのが
この場合はかなり大きなウェイト占めてると思うんだが

547 :デフォルトの名無しさん:2011/03/25(金) 01:14:24.04
個人的には妥当な線として

1.ネットワーク上のリソースだろうが、ローカルなリソースだろうか同一メソッドで統一したアクセスを可能にする
2.ローカルリソースはライブラリじゃなくて、アプリ側に準備して貰う(サンプルをドキュメントに添付すれば一応標準リソース)
3.ネットワーク上のリソースアクセスに関しては、トラフィックを減らしたいならプロキシでなんとかして貰う(アプリがローカルに落としても良いが…)

まぁ、全部ライブラリで面倒見ようとするからメンドクサイので有って、可変部分ならアプリ側に任せるのが筋じゃね?

548 :Perl忍者 ◆M5ZWRnXOj6 :2011/03/25(金) 10:22:27.52
復活させた。なぜ死んだのか 20秒以内前 TweetIrcGatewayから

# あっ、このまま起き続けて死ぬ死んでる 1分未満前 TweetIrcGatewayから

Load Averageがこの時間帯に1くらいまで上昇してた 8分前

DoS食らってる 31分前 TweetIrcGatewayから


549 :デフォルトの名無しさん:2011/03/25(金) 10:35:37.35
>>546
ライブラリのあるディレクトリにユーザーが書き込みできない可能性が高いからね…
ユーザーが持つべきデータのディレクトリは
ユーザーが明示的に指定するまで使わない/動かないのがいちばんいいような気がする

一般GUIアプリケーションならホームに適当にディレクトリ掘っても許されそうだけど、ライブラリじゃねえ

550 :デフォルトの名無しさん:2011/03/25(金) 10:36:20.77
初心者が絶えて久しいな

551 :デフォルトの名無しさん:2011/03/25(金) 14:14:22.53
初心者の質問してよいですか?
  File.readlines(filename)
  IO.readlines(filename)
  File.open(filename).readlines
このようなreadlinesでファイルをよむと得られた配列の要素に改行が含まれるのですがこの動作は想定されたものなのでしょうか?
配列の要素に改行が欲しくないのでつい
  File.read(filename).split("\n")
としていてこれはこれでわかりやすいのですが釈然としません
readlinesは本来はどのような時つかうものなのでしょうか?

ruby 1.9.2-p180です

552 :デフォルトの名無しさん:2011/03/25(金) 14:49:21.63
line なんだからそりゃ改行つきだろう
行改の直後から行改の直後までが「行」だ

ただ、この正確な動作はあまり直感的ではなく文句がつきまくったので
String#lines という改行抜きで配列にするメソッドが 1.9 と 1.8.7 についた

553 :デフォルトの名無しさん:2011/03/25(金) 15:11:35.16
チョップすればいんじゃね

554 :デフォルトの名無しさん:2011/03/25(金) 15:41:59.47
RUBY_DESCRIPTION=> "ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin9]"

# String#lines で Enumerator が返る。
File.read('/etc/passwd').lines.class
=> Enumerable::Enumerator

# Enumerator なのでそのままいろいろ出来る。
File.read('/etc/passwd').lines.grep(/root/).first
=> "root:*:0:0:System Administrator:/var/root:/bin/sah\n"

# 配列でないと出来ないことをやりたい場合は to_a すべし。
irb(main):003:0> File.read('/etc/passwd').lines.shuffle
NoMethodError: undefined method `shuffle'
irb(main):004:0> File.read('/etc/passwd').lines.to_a.shuffle
=> (略)

尚、各行は改行そのまま。不要なら map(&:chomp) する。


555 :デフォルトの名無しさん:2011/03/25(金) 18:44:23.72
> String#lines という改行抜きで配列にするメソッドが 1.9 と 1.8.7 についた
俺の1.9.2には付いてないみたいだ


556 :デフォルトの名無しさん:2011/03/26(土) 22:23:11.97
ありがとうございます
そういうものなのですね
chompするなりすることにします


557 :デフォルトの名無しさん:2011/03/27(日) 10:30:33.33
Loggerってスレッドセーフですか?

558 :デフォルトの名無しさん:2011/03/27(日) 10:37:04.69
write時に@mutex.synchronizeしてるからスレッドセーフなんじゃね?


559 :デフォルトの名無しさん:2011/03/27(日) 11:24:54.32
おお、ほんとだ。助かった。

560 :デフォルトの名無しさん:2011/03/27(日) 11:42:30.35
rubyフォージ?(スペル忘れた)いいですね
常に最新版が提供されてていいですね
公式サイトで紹介されてる国内の配布サイトのは古いのばっかりでやる気を感じられない

561 :デフォルトの名無しさん:2011/03/27(日) 11:57:29.59
表示系ライブラリはスレッドセーフとか考えないと駄目なのかなあ
めんどくさいなあ

562 :デフォルトの名無しさん:2011/03/27(日) 12:09:32.53
自作ライブラリがスレッド上で動作する可能性を織り込んで対策するようになれば初級脱出

563 :デフォルトの名無しさん:2011/03/27(日) 12:22:56.92
Rubyのスレッドはよーく考えてセッティングしないと逆に遅くなるので嫌い

564 :デフォルトの名無しさん:2011/03/28(月) 21:25:58.93
>>560
何の最新版かしらんが
rubyフォージよりも最新版を見たければrubygems.orgやgithub見ておけばいいんでないの

565 :デフォルトの名無しさん:2011/03/28(月) 22:05:35.57
>>564
単にRAAが打ち捨てられただけなのでは?


566 :デフォルトの名無しさん:2011/03/29(火) 17:31:27.83
すみません余所にも書いたのですが返事がなかったためここでも質問させていただきます。

RubyをEmacsで使おうとして苦戦しております。

http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=Emacs

このサイトにて、
「Debianの"ruby-elisp.deb"のようにパッケージが利用できるなら、
それをインストールする。ソースからビルドした場合などは、
適当な場所(たとえば~/site-lispなど)にmisc/*.elをコピーする。
そして~/.emacsに次のように書いておく」
と書いてあります。

最後の部分は恐らくパスを追加するということなのだと思うのですが、
私はパスを追加するとはコントロールパネルから辿って行って、絶対パスを
ペーストするやり方しか知らないので、ここがよくわかりません。

~/.emacsって言うのはどこを指していて、どうやって書き込めばいいのでしょうか?

567 :デフォルトの名無しさん:2011/03/29(火) 17:36:41.38
そのチルダはホームディレクトリのことだけど
EmacsやるまえにLinux入門みたいなの一冊買ったほうがいいよ

568 :デフォルトの名無しさん:2011/03/29(火) 17:37:44.10
Emacsを勉強するかRubyを勉強するかどっちか片方だけにしておけ
Emacsの知識がないならRubyに慣れるまではとりあえずふつうのエディタ使え

569 :デフォルトの名無しさん:2011/03/29(火) 17:39:27.26
~ってのはホームディレクトリ。
ababaさんがログインしたらだいたい、
/home/ababa
それか
env | grep HOME=
としてみてもわかる。
そこに、,emacsっていう名前のファイルがあればそれを編集。

570 :デフォルトの名無しさん:2011/03/29(火) 18:43:25.24
Windowsの予感!

571 :デフォルトの名無しさん:2011/03/29(火) 18:49:11.05
…ぬ、ぬう……

Windows版Emacs(というかXEmacs)にはイヤな思い出しかないんだが
とりあえず、そのサイトはWindowsを対象にしてないのは確かだ

572 :566:2011/03/29(火) 19:33:14.48
みなさんご親切にありがとうございました。
なんとかやってみます。

573 :566:2011/03/29(火) 19:34:06.79
あ、windowsでやってます。
使いにくいのでcygwin使ってるんですが、ちょっと仕様が違ったりするんですかね??

574 :デフォルトの名無しさん:2011/03/29(火) 20:18:34.29
日本でサマータイムが導入されたらどう対応したらいいんですか?


575 :デフォルトの名無しさん:2011/03/29(火) 20:49:46.05
>>573
仕様っつーか、ちょっとしたトラブルとかのときに
Cygwinの問題なのかWindowsの問題なのかソフトの問題なのかよーわからんことになる。

576 :566:2011/03/29(火) 20:54:38.03
>>575
(´・ω・`)え。。

(´・ω・,';,';,',

(´・ω,';,';,',

(´・ω・,';,';,',

(`・ω・´)仕方ないのでこのままがんばってみます!
meadowってやつで頑張ってみます!ありがとうございました!

577 :デフォルトの名無しさん:2011/03/30(水) 00:04:56.49
普通のテキストエディタでいいじゃない

578 :デフォルトの名無しさん:2011/03/30(水) 01:20:36.88
ノーパソ使ってるとemacsのほうが結局使いやすいかも。
導入時に多少てこずったとしても。

579 :デフォルトの名無しさん:2011/03/30(水) 10:30:04.55
Rubyの導入したくご教示お願いします
Windowsを利用してます
Apache2.2も入れてます
主に日々の作業を自動化する目的で利用するのとCGIの勉強用途に利用します

http://rubyinstaller.org/downloads/からRuby 1.8.7-p334をダウンロードしてインストールしました
gem update --systemでgemは1.6.2にアップデートできました
ほかに何かインストールや設定するものはございますでしょうか?

RedmineとRuby on railsも入れてみたいなと思うのですが
ApacheのドキュメントルートがC:\www\docroot\で
ユーザーディレクトリがC:\user\*\public_htmlとなっております(*の部分は適当に付けたユーザー名が入ります)
gemでインストールする場合はユーザーディレクトリに入れて動かしたいのですがディレクトリの指定は可能でしょうか?


580 :デフォルトの名無しさん:2011/03/30(水) 11:00:35.17
Rails使う場合は全部をRails風にしたほうがいいと思う
RailsとCGIはあんまり相容れないから
Railsのお話はこちら
ttp://hibari.2ch.net/test/read.cgi/php/1292032736/

Apache さんが使う gem は Apache さん用にインストールするか
gem をシステムワイドにインストールして Apache さんに使わせるかだと思う

gem はユーザーのホームに .gemrc があればそれを読むので
そこに gem: "--user-install" とでも書いとけ

581 :デフォルトの名無しさん:2011/03/30(水) 11:14:10.38
前スレ1〜10ぐらい昔にputで文字列を出力するのがイヤで引退した者です
昔からprintとpってありました?
put、print、pの違いが分かりません


582 :デフォルトの名無しさん:2011/03/30(水) 11:18:04.34
コマンドラインからruby -Ks test.rbとして呼び出すのを
この-Ksをファイルの中に書いてruby test.rbで呼ぶ方法を教えてください

583 :デフォルトの名無しさん:2011/03/30(水) 11:35:03.01
>>37-38
ありがとうございます


584 :デフォルトの名無しさん:2011/03/30(水) 12:34:04.19
>>581
>>11

>>582
スクリプトの1行目に適当に

#!ruby -Ks

と書いておくというのはどう
あらゆる環境で動作するかどうかは保証できないけど

$KCODE を使う場合は

$KCODE = "s"
load "./test.rb"

と書いた main.rb を ruby main.rb で呼ぶとかそういう小細工が必要

585 :デフォルトの名無しさん:2011/03/30(水) 12:37:52.82
winならバッチにするとか

ruby -Ks -x "%~0"
goto :eof

#!ruby

586 :デフォルトの名無しさん:2011/03/30(水) 12:41:40.87
for i in 1..10
print rand(3)+1, "\n"
end

どうもRubyの乱数生成は偏りがある感じがあるのですが
良い乱数生成方法はございますか?

587 :デフォルトの名無しさん:2011/03/30(水) 12:55:20.16
>>586
その結果を見てわかるようなレベルの偏りは存在しない

588 :デフォルトの名無しさん:2011/03/30(水) 13:06:41.71
>>586
Rubyの乱数はMTだからそんなに粗悪な値は出ないはずだけど

常に偏らない値が欲しいならこんなんにするしかない
乱数生成とは又違う話だけど
[1,1,1,2,2,2,3,3,3,rand(3)+1].shuffle

589 :デフォルトの名無しさん:2011/03/30(水) 13:18:07.66
確かに、サイコロ5回振って1が3回出ても怒らないのに
1から6までの乱数を返すルーチンで1が3回返ったら怒る人は稀にいる
乱数による各々の出目は平均的でなければならないんだってさ

590 :デフォルトの名無しさん:2011/03/30(水) 13:25:18.42
いまさらながら、確率ってなんか不思議だな。
サイコロ振りまくったら、出目ごとの出た回数が平均的になっていくなんて。

591 :デフォルトの名無しさん:2011/03/30(水) 13:37:28.98
スゴロクで1が連続で出ると萎えるじゃん

592 :デフォルトの名無しさん:2011/03/30(水) 14:20:03.56
複数回の試行を1事象としてみたとき、
偏って同じ目が出るという事象も
平均して出るという事象も
ぜんぜん出ないという事象も
生じる。


593 :デフォルトの名無しさん:2011/03/30(水) 18:07:33.88
Ruby 1.8.7 です。
以下のようなフォームでメールアドレスを入力し「次へ進む」を押すと、
登録完了メールがユーザに届くプログラムを作成中です。

<form method='post' action='test.rb'>
<input type='text' name='email'>
<input type='submit' value='次へ進む'>
</form>

メールを送る機能は既に完成し、メールの送信自体は行えているのですが
上記のフォームを実際に使用してみると Internal Server Error と表示されてしまいます。
また、エラーが発生するにも関わらずメールは意図したとおりのアドレスに送信されます。
作成して利用しているスクリプトの概要は以下のとおりです。

mail = TMail::Mail.new
mail.to = 'hoge@hoge.jp'
mail.from = 'hoge@hoge.jp'
mail.subject = '登録完了'.tojis
mail.date = Time.now
mail.mime_version = '1.0'
mail.set_content_type 'text', 'plain', {'charset'=>'iso-2022-jp'}
mail.body = ('登録完了いたしました').tojis

Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.sendmail(mail.encoded, mail.from, mail.to)
}

何が原因なのでしょうか?なにかおわかりになる方がいらっしゃれば、助言お願い致します。


594 :デフォルトの名無しさん:2011/03/30(水) 18:16:37.50
他のやり方でやってみたら?
俺昔どうやってたかな?と調べたら以下のようにやってた。
kconv使うかどうかはさておき、他のパラメータの与え方はこんなもん。
これで十分?

mailbody = Kconv.tojis(mailbody)
Net::SMTP.start(smtphost, smtpport) {|smtp|
src = <<EndOfMail
From: #{mailfromaddr}
To: #{mailtoaddr}
Subject: #{subject}
Content-Transfer-Encoding: 7bit
Content-Type: Text/Plain; charset=iso-2022-jp

#{mailbody}
EndOfMail
smtp.send_mail src, mailfromaddr, mailtoaddr
}

595 :Perl忍者 ◆M5ZWRnXOj6 :2011/03/30(水) 18:18:56.42
お前がバカだからだよ原因は

596 :デフォルトの名無しさん:2011/03/30(水) 18:24:59.21
>>593
HTTPレスポンスとしてはどういうものを返しているの?
ちゃんと200が返るようになってるの?


597 :デフォルトの名無しさん:2011/03/30(水) 18:34:44.13
>>594
確か自分も以前そのやり方でやろうとしていたんですが、
そのやり方でのユーザ名とパスワードの設定方法が
わかんなくて今のやり方に行き着いたような気がします。
でも、他のやり方を探してみるのはありですね。
ちょっとやってみます。ありがとうございます。

>>596
ありがとうございます。
正しいやり方なのかどうかはわからないのですが、
先ほどのスクリプトの末尾に

print "Content-Type: text/html\n\n"
print "OK"

のようにやってみたりはしました。
我流?というか常識的なところを理解してません、
正しいやり方を教えていただけるとありがたいです。

598 :デフォルトの名無しさん:2011/03/30(水) 19:26:05.15
>>593
>上記のフォームを実際に使用してみると Internal Server Error と表示されてしまいます。
うん、

……ってそれで終わりかよ!
Internal Server Error ってことは Apache のログにエラーの出力があるだろそれ読めよ!

599 :デフォルトの名無しさん:2011/03/30(水) 19:40:55.23
思いっきり補完すると
「ローカルで問題なく動作するスクリプトをサーバに設置するとなぜか動作しません」
なわけで、そりゃサーバ側の環境が悪いんじゃないん、というお話に

HTTP サーバのエラーログあたりに原因究明の鍵というかそのまま答が表示されてるはずなんだけど
たぶんそれを読む権限がなく、HTTP サーバがどうやって Ruby を実行してるか調べることもできないと推測
おまけにそれの原因は >>593 に書いたスクリプト以外の部分にあると

$SAFE=1 と先頭に書いた上でローカルでスクリプト実行してたらなにか warning が出るかも
CGI がファイル作成できるのなら、$stderr を捻じ曲げてファイル出力にしてサーバ実行するとなにか書いてあるかも
$stderr = File.open('error.txt') と先頭に書いて error.txt を実行後に読んでみるとか

600 :デフォルトの名無しさん:2011/03/30(水) 19:43:24.33
× $stderr = File.open('error.txt')
○ $stderr = File.open('error.txt', 'w')

601 :デフォルトの名無しさん:2011/03/30(水) 20:08:26.76
>>595
消えろカス

602 :デフォルトの名無しさん:2011/03/30(水) 20:13:13.99
>>601
今のところレスしたのお前だけだぞ

603 :デフォルトの名無しさん:2011/03/31(木) 09:58:02.54
>>598 >>599 >>600
ありがとうございます!
ご教授いただいたとおりにやってみましたので報告致します。

まずは Apache のエラーログを見てみました。
が、以下のように表示されているだけでした。
Premature end of script headers:test.rb, referer: http://foo/bar.html
とりあえずここに有益な情報はないと判断しました。

つぎに「HTTP サーバがどうやって Ruby を実行してるか調べることもできない」という部分ですが、
具体的に何をどうすればよいのかがわからなかったので保留させていただきました。

つぎに「先頭に」$SAFE=1 と $stderr = File.open('error.txt', 'w') を書き足した上で、
ローカルでスクリプトを実行してみました。
この「先頭に」の位置ですが、

#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.
(ここ)
require "rubygems"
require "cgi"
require "tmail"
require "net/smtp"
と判断しました。


604 :デフォルトの名無しさん:2011/03/31(木) 10:03:35.76
再度ローカルにてスクリプトを実行した結果、出力されたエラーは以下のとおりでした。

C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/defaults.rb:43:in `exist?': Insecure operation - exist? (SecurityError)
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/defaults.rb:43:in `default_path'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:726:in `path'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:57:in `installed_spec_directories'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:47:in `from_installed_gems'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:1025:in `source_index'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/gem_path_searcher.rb:135:in `init_gemspecs'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/gem_path_searcher.rb:14:in `initialize'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:984:in `new'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:984:in `searcher'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:206:in `try_activate'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:57:in `require'
from test.rb:9

ちなみに require 以下に $SAFE=1 と $stderr = File.open('error.txt', 'w') を書き足した場合は
特にエラーは出力されませんでした。


605 :デフォルトの名無しさん:2011/03/31(木) 10:26:10.68
一番肝心な「エラー出力先をファイルにした上でサーバで実行」がないぞ
ローカルで$SAFEを上げて実行してセキュリティエラーが出るのはそりゃ当たり前

というか、もしかして>>596の言うように HTTP としてのレスポンスが何もないだけなんじゃ…
CGI なんだから、リクエストに対して返すレスポンスのステータスが空文字列だとまずい
適当な「メール送信しましたありがとうございます」なHTMLを返すとかにしておけ

606 :デフォルトの名無しさん:2011/03/31(木) 10:31:16.38
こういうときのステータスって201?

607 :デフォルトの名無しさん:2011/03/31(木) 10:37:20.29
>>606
「○○さんありがとう! トップに戻る」というカスタムなHTMLを返したいなら200
ブラウザ真っ白の空っぽのボディでいいなら201か202
静的な「ご利用ありがとうございました.html」に飛ばすだけなら302

608 :デフォルトの名無しさん:2011/03/31(木) 11:01:13.61
>>605
申しわけありません、報告し忘れていました。
サーバ上で実行=ブラウザでアクセス と思ってよろしいでしょうか??
もしそうであればファイル error.txt に出力された内容は、上記のエラー内容と全く同じでした。

レスポンスに関してなのですが >>597 で書いたようにこのスクリプトの末尾に
print "Content-Type: text/html\n\n"
print "OK"

header = cgi.header({"charset"=>"Shift-JIS"})
puts header
puts <<-EOS
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=Shift-JIS'/>
<meta http-equiv='Content-Language' content='ja'/>
<title>test</title>
</head>
<body>
<p>OK</p>
</body>
</html>
などとやってはみているのですが、現状うまくいっておりません。
なにか間違っているのでしょうか??

609 :デフォルトの名無しさん:2011/03/31(木) 11:08:14.44
サーバ上で$SAFE=1にしても同じなのは当然だろ…

610 :デフォルトの名無しさん:2011/03/31(木) 11:24:53.15
わかってない人同士が混乱してるなw

CGI は HTTP レスポンスを「返さなければならない」
200 でいいから返しておけ
返し方わからないなら今日は作るの諦めろ

サーバの CGI が $SAFE=1 で実行されている場合、
PATH がワールドに対して読み書き可能になっていると、
require でセキュリティエラーが出ることがある
ttp://www.ruby-lang.org/ja/man/html/_A5BBA5ADA5E5A5EAA5C6A5A3A5E2A5C7A5EB.html
gem の変数が環境変数由来なので、たぶんここでもセキュリティエラーが出る可能性がある
warn $SAFE をどっかに書いてサーバで実行して値確かめて、0以外が表示されたら $SAFE が原因

スクリプトの本体は実行されてるそうなので、最終的な HTTP レスポンスをうまく返せてない説に一票
NPH で実行されてて、自前で HTTP ステータスを書き出さないといけないのだろう

print "HTTP/1.1 200 OK\r\n"
print "Content-Type: text/html\r\n\r\n"
print "<html>done.</html>"


611 :デフォルトの名無しさん:2011/03/31(木) 11:41:15.72
そもそもCGIでページを表示させるのはできてるの?

cgi = CGI.new
cgi.out({"type" => "text/html", "charset" => "shift_jis"}) {
<<END
あばば
END
}

メールと組み合わせず、まず表示だけやってみたら?

612 :デフォルトの名無しさん:2011/03/31(木) 12:09:20.80
>>611
ありがとうございます、表示はできています。
>>593
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.sendmail(mail.encoded, mail.from, mail.to)
}
のところをコメントアウトして、代わりに >>611 のような適当な HTML を
表示させるような命令を書けば普通に表示されます。

なので >>610 の NPH で〜というのも恐らく違うのではないかと思います。
実際に「自前で HTTP ステータスを書き出す」というやつも試してみましたが、
うまくいきませんでしたし…。

>>610 さん、本当にありがとうございます。
先ほどからお話にあがっている $SAFE というものについて調べてみようと思います。

613 :デフォルトの名無しさん:2011/03/31(木) 12:19:12.13
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
}

これだけにしてうまくいってる?startのパラメータは正しい?

> のところをコメントアウトして、代わりに >>611 のような適当な HTML を

そもそも、コメントアウトしたらまずいんじゃない?
なんらかの表示をさせてる?
なんらかの表示をさせなきゃ、
Premature end of script headers:test.rb,
って出るのも当然かも。


614 :デフォルトの名無しさん:2011/03/31(木) 12:45:45.41
>>613
>>611 で「メールと組み合わせず、まず表示だけやってみたら?」とのことだったので、
「表示だけなら出来てますよ」と回答したつもりだったのですが…。
もしずれたことを言っていたら申し訳無いです…。

Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
}
これだけにしてうまくいってる?startのパラメータは正しい?

というのは、
smtp.sendmail(mail.encoded, mail.from, mail.to)
を外したら表示がうまくいくかということでしょうか??
とりあえずやってみましたが表示はうまくいきません。

パラメータに関してですが、いちおうメールの送信は正常に出来てはいますので、
今のところは正しいのではないかと判断しています。
わたしの未熟さゆえ、アドバイスの意味が理解出来ていない可能性がありますが、
ありがとうございます。

615 :デフォルトの名無しさん:2011/03/31(木) 12:52:09.51
> パラメータに関してですが、いちおうメールの送信は正常に出来てはいますので、

なるほど。Net::SMTP.startのブロックは正しく動いてると。

> >>611 で「メールと組み合わせず、まず表示だけやってみたら?」とのことだったので、
> 「表示だけなら出来てますよ」と回答したつもりだったのですが…。

いえ、それについてはこちらが早とちりしたかも。うん、了解。テスト了解、その次の話。

一般的に、エラーメッセージを得たら、それをコピーしてそのままぐぐりって学ぶのが正解。
Premature end of script headersでぐぐったらいっぱい情報を得れると思う。

 メッセージの意味
 cgiプログラムがContent-Type ヘッダを出力する前に終了した

だから、メール送信をさせようとしたときも、なんらかの出力をして、
そのうえでスクリプトが終わるようにしないといけないんでは? という話。

616 :デフォルトの名無しさん:2011/03/31(木) 12:58:12.62
>>610
再度ご報告。
スクリプトのいろんな箇所に warn $SAFE と書いて
実行してみましたが error.txt に出力されたのは 0 のみでした。
(いちおう申告、先頭の $SAFE=1 はコメントアウトしました)

ありがとうございます。

617 :デフォルトの名無しさん:2011/03/31(木) 12:59:11.91
>>613の1段落目と2段落目は別の話だな
>>610にもあるが、CGI は HTTP のレスポンスを絶対に返さなければならない
「メール送るだけの CGI だからメールだけ送って終わり」ということはできない
Web ブラウザ経由で指示をしたなら、なんらかの返事をブラウザへ返さないと Web サーバはエラーとみなす

"Premature end of script headers" と Web サーバに記録されるエラーは典型的で、
・ Web ブラウザに返す返事の(HTTP 1.1/200 OK 等の)前に CGI がエラーや警告を出して混ざってわけわかめ
・ Web ブラウザに返す返事が、そもそも HTTP ステータスすら 1文字もない
のどちらかのときによく起こる
絶対に後者ではないという確証が得られてから、前者の CGI 本体のエラー潰しをする

HTTP 1.1/200 OK だの Content-Type: text/html だの、cgi.out だのの表示をしろというのは症状チェック用ではない
そもそもの CGI 動作に必須なものだ

618 :デフォルトの名無しさん:2011/03/31(木) 15:09:53.83
>>615 >>617
ありがとうございます。
誤解を与えてしまっていたようで申しわけありません。
たぶん私が「200 を返す」が何を指しているのか、
はっきり確信出来ていなかったのが原因なのではないかと思います。

テスト用などではなく、必須という認識は一応あるので、スクリプトの末尾には必ず
「HTTP 1.1/200 OK だの Content-Type: text/html だの、cgi.out だの」は表示しています。
わたしの最初の書き込みが >>593 なのですが、このソースの直後に

print "Content-Type: text/html\n\n"
print "<html>OK</html>"

のように必ず書いています。

現在の状況を私の見解でまとめてみます。
上記の「200 を返す」文を加えたソースを使用しても、
メールは飛ぶのですがブラウザには Internal Server Error と表示されます。
エラーの内容は Premature end of script headers です。
メールは飛ぶのでメールのところのプログラムは正常なのかな、と思いたいのですが
>>612 に書いたようにメールの部分3行をコメントアウトして実行すると、
当然メールは飛ばないのですがページ(<html>OK</html>)は表示されます。

メール部分は正常に動いているように思えるのに、疑わしいのもメール部分なのかな…
と、勝手に思っております。みなさま、どう思われるでしょうか?

619 :デフォルトの名無しさん:2011/03/31(木) 15:20:19.72
なるほど。メール部分三行を生かすと、ページは表示されないと?
メールを送ったあとにスクリプトが異常終了してるのかな?

begin
 メール部分三行
rescue => exc
 print "Content-Type: text/html\n\n"
 print "<html>#{exc}</html>"
end

みたいに一度してみたら?




620 :デフォルトの名無しさん:2011/03/31(木) 15:49:45.88
>>619
ありがとうございます。
試してみたのですが変わらず…です。
うーん…。

621 :デフォルトの名無しさん:2011/03/31(木) 16:21:02.69
>>619 で「メールを送ったあとにスクリプトが異常終了してるのかな?」と言われた件を検証してみました。
と言っても

begin
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
rescue => exc
print "Content-Type: text/html\n\n"
print "<html>#{exc}</html>"
end
print "Content-Type: text/html\n\n"
puts <<-EOS
<html>
<body>
<p>OK</p>
</body>
</html>
EOS


としただけなのですが。
結果、一度の実行で2通メールが送られてきました。
どういうことなのでしょうかw もう謎が深まるばかりです…。

622 :デフォルトの名無しさん:2011/03/31(木) 17:02:22.52
二通?? えーっw

print "Content-Type: text/html\n\n"
s = 'OK'
begin
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
rescue => exc
s = exc.inspect
ensure
puts <<-EOS
<html>
<body>
<p>OK</p>
</body>
</html>
EOS
end

みたいにしてContent-Typeを必ず出してみるとか。



623 :デフォルトの名無しさん:2011/03/31(木) 17:03:03.39
おっと。

<p>#{s}</p>

で。

624 :デフォルトの名無しさん:2011/03/31(木) 17:09:47.00
>>622
あ、すみません。

begin
 Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
  smtp.send_mail(mail.encoded, mail.from, mail.to)
 }
rescue => exc
 print "Content-Type: text/html\n\n"
 print "<html>#{exc}</html>"
end

Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
 smtp.send_mail(mail.encoded, mail.from, mail.to)
}

print "Content-Type: text/html\n\n"
puts <<-EOS
<html>
<body>
<p>OK</p>
</body>
</html>
EOS

の間違いでした。
もしメールを送信した直後に異常終了してるなら、
2回目の送信が行われるわけないと思ったわけです。

625 :デフォルトの名無しさん:2011/03/31(木) 17:17:34.61
>>622
うーん、試してみたがやはりだめです…。
なんども申し訳ない。ありがとうございます(涙)

626 :デフォルトの名無しさん:2011/03/31(木) 18:25:51.18
ところで
print "Content-Type: text/html\n\n"
って\nだけでいいの?
\r\n\r\nじゃないのかな

WindowsでRubyで遊んでるだけの私にはWebサーバーのことはよくわからんけど
OSとかWebサーバーが何なのかとか、手元にサーバーがあるのかとか
サーバーの環境をもっと詳しく書かないとアドバイスしにくいんじゃないのかな


627 :デフォルトの名無しさん:2011/03/31(木) 19:15:38.80
>>610,617
200 OKはWebサーバ側で勝手に付け加えてくれるよ
もしCGIスクリプト側でつけるのが必須なのであれば

print "Content-Type: text/html\n\n"
print "<p>hello, ruby cgi!</p>"

すら動かない

>>626
ApacheならLFしかなくてもCR LFに直してくれるよ
他も似たようなものじゃないか

628 :デフォルトの名無しさん:2011/03/31(木) 20:16:53.66
content-type出力の前後でerror.txtに何かメッセージを出力してみたら?

629 :デフォルトの名無しさん:2011/03/31(木) 20:31:18.82
ところで>>624を見る限り2通送られるのは正常じゃないか
メール送信処理がふたつ書いてあってどっちも実行されてるんだろうから

1通だけ送りたいのなら2番目のNet::SMTP...を削れば済むような

630 : 忍法帖【Lv=5,xxxP】 :2011/03/31(木) 20:35:18.06
というわけでこんな感じか

begin
 Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
  smtp.send_mail(mail.encoded, mail.from, mail.to)
 }
 print "Content-Type: text/html\n\n"
 print "<p>OK</p>"
rescue => exc
 print "Content-Type: text/html\n\n"
 print "<p>exception raised</p>"
end

631 :デフォルトの名無しさん:2011/03/31(木) 20:47:21.59
てゆーか、実行の余分なコストはゼロなんだろうし、
エラーが出なくなるまでスクリプトの内容削っていけばいいのに
もし10行くらいになってもエラーが消えなければ、個人情報がない範囲でスレに書け

632 :デフォルトの名無しさん:2011/03/31(木) 21:17:45.71
>>629
もしメールを送信した直後に異常終了してるなら、
2回目の送信が行われるわけないと思ったわけです。


633 :デフォルトの名無しさん:2011/03/31(木) 21:50:46.00
>>632
なるほど了解
ただ>>624だと一回目のメール送信直後に例外が発生した場合にややこしい

とりあえず確認すべきはprint "Content-Type: text/html\n\n"の前に
標準出力に何か出力していないかどうか。あとは>>631の言う通り

634 :デフォルトの名無しさん:2011/04/01(金) 09:52:59.91
            )
             (
         ,,        )      )
         ゙ミ;;;;;,_           (
          ミ;;;;;;;;、;:..,,.,,,,,
          i;i;i;i; '',',;^′..ヽ
          ゙ゞy、、;:..、)  }
           .¨.、,_,,、_,,r_,ノ′
         /;:;":;.:;";i; '',',;;;_~;;;′.ヽ
        ゙{y、、;:...:,:.:.、;:..:,:.:. ._  、}
        ".¨ー=v ''‐ .:v、,,、_,r_,ノ′
       /;i;i; '',',;;;_~⌒¨;;;;;;;;ヾ.ミ゙´゙^′..ヽ 
       ゙{y、、;:...:,:.:.、;、;:.:,:.:. ._  .、)  、}
       ".¨ー=v ''‐ .:v、冫_._ .、,_,,、_,,r_,ノ′
      /i;i; '',',;;;_~υ⌒¨;;;;;;;;ヾ.ミ゙´゙^′.ソ.ヽ
      ゙{y、、;:..ゞ.:,:.:.、;:.ミ.:,:.:. ._υ゚o,,'.、)  、}
      ヾ,,..;::;;;::,;,::;):;:;:; .:v、冫_._ .、,_,,、_,,r_,ノ′



635 :デフォルトの名無しさん:2011/04/01(金) 09:59:52.63
みなさんありがとうございます。

>>631 >>633
10行にはならなかったんですが、スクリプトの頭からお尻までが↓です

#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.

require "rubygems"
require "cgi"
require "tmail"
require "net/smtp"

mail = TMail::Mail.new
mail.to = "hoge@hoge.jp"
mail.from = "hoge@hoge.jp"
mail.subject = "test title".tojis
mail.date = Time.now
mail.mime_version = "1.0"
mail.set_content_type "text", "plain", {"charset"=>"iso-2022-jp"}
mail.body = "test body".tojis

Net::SMTP.start("foo.bar.jp", 25, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
print "Content-Type: text/html\n\n"
print "<html>OK</html>"


636 :デフォルトの名無しさん:2011/04/01(金) 10:05:53.04
>>626
ありがとうございます、たしかにそうかもしれません。
環境は

OS は Windows7 の 64bit
サーバーは Apache 2.2.16 (Win32)
Ruby のバージョンは 1.8.7

自分の PC に Apache インストールしていろいろやってるかんじです。
よろしくおねがいします。

637 :デフォルトの名無しさん:2011/04/01(金) 10:17:02.05
メールは tmail を使用する必要は必ずしもない
これだと rubygems と tmail が不要になる
cgi ライブラリも使用してないようなので外した
これで駄目な場合は…

#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.
require "net/smtp"

from = "hoge@hoge.jp"
to = "hoge@hoge.jp"
mail_body = <<EOM
Date: Fri, 1 Apr 2011 10:03:27 +0900
From: #{from}
To: #{to}
Subject: test title
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp

test body
EOM
Net::SMTP.start("foo.bar.jp", 25, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail_body, from, to)
}
print "Content-Type: text/html\n\n"
print "<html>OK</html>"

というか外部にSMTP接続してるのね
Net::SMTP ってなにか警告出すことってあったっけ

638 :デフォルトの名無しさん:2011/04/01(金) 11:21:46.50
>>637
ありがとうございます。
試してみましたが、やはりうまくいきません。
今までと同じでメールは送信されるのですが、ページが表示されません。

プログラム云々ではなく、環境の問題なのでしょうか…?

639 :デフォルトの名無しさん:2011/04/01(金) 11:39:11.44
>cgi ライブラリも使用してないようなので外した
今回は頼ったほうがいいような気がする

ていうか
print "HTTP/1.1 200 OK\r\n"
は書いても害はないだろ
サーバ設定上不要だったら最初から全体がテキストとして余分に表示されるだけだ
そのとき改めて外せばいい

640 :デフォルトの名無しさん:2011/04/01(金) 11:46:02.15
>>635の最初と最後の二行ずつだけにしたスクリプトがエラーになるなら
ruby.exe の場所間違ってるか apache の設定じゃないかな

641 :デフォルトの名無しさん:2011/04/01(金) 12:38:18.11
>>640
>>612 に書いたようにメールの部分3行をコメントアウトして実行すると、
当然メールは飛ばないのですがページ(<html>OK</html>)は表示されます。

642 :デフォルトの名無しさん:2011/04/01(金) 12:45:46.89
>>635
メール送信を、表示のあとにもってきたら?

643 :デフォルトの名無しさん:2011/04/01(金) 13:04:28.21
>>641
CGIスクリプトとしてではなく単にコマンドラインから
C:\>ruby >>637のスクリプト.rb
とかしたらどうなるか試してみた?

644 :デフォルトの名無しさん:2011/04/01(金) 15:24:22.34
>>642
うーん、それでもだめでした…。
ありがとうございます。

>>643
はい、それだとエラーも出ずうまくいきます。
ありがとうございます。

645 :デフォルトの名無しさん:2011/04/01(金) 15:30:16.02
windowsです
gemでインストールしたライブラリってどこのフォルダにインストールされるのですか?


646 :デフォルトの名無しさん:2011/04/01(金) 16:39:50.13
>>645
ruby -rubygems -e "p Gem.dir" で表示されたディレクトリの中
cache/ と doc/ と gems/ と specifications/ の4つのディレクトリを(通常は)すべて使う

647 :デフォルトの名無しさん:2011/04/01(金) 16:40:58.07
>>646
ありがとうございます
確認dけいました

648 :デフォルトの名無しさん:2011/04/01(金) 17:08:18.64
おなかすいた

#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.

from = "hoge@hoge.jp"
to = "hoge@hoge.jp"
mail_body = <<EOM
Date: Fri, 1 Apr 2011 10:03:27 +0900
From: #{from}
To: #{to}
Subject: test title
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp

test body
EOM
@error = []
begin
require "net/smtp"
Net::SMTP.start("foo.bar.jp", 25, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail_body, from, to)
}
rescue Exception => ex
File.open('smp_error.txt', 'w'){|f| f.puts ex.backtrace }
@error << ex.backtrace
end
print "HTTP/1.1 200 OK\n"
print "Content-Type: text/plain\n\n"
puts @error

649 :デフォルトの名無しさん:2011/04/01(金) 17:13:33.58
>>644 です
問題がすべて解決したわけではないのですが、大きな進展がありましたのでご報告致します。

今まで Windows 7 上で Apache2.2.16 / Ruby 1.8.7 を動かして開発をしてきたのですが、
今回手元にあった Windows XP に Apache2.2.17 と Ruby 1.8.7 をインストールし、
問題のスクリプトを実行してみたところ、正常に HTML のページが表示されました。

何が原因なのかは依然わかりませんが、皆さまのご協力のおかげで解決に一歩近づけました。
ありがとうございます、心より感謝致しております。

650 :デフォルトの名無しさん:2011/04/01(金) 17:20:58.00
というかwindows用apacheって都市伝説かと思ってた。
実際に動かしている人がいるとは驚きだ。

651 :デフォルトの名無しさん:2011/04/01(金) 17:43:50.18
>>648
できるのであればなにかごちそうしたいです。
ありがとうございます。

実行してみたのですが 7 でも XP でも動作しませんでした。
ただし XP の方では

print "HTTP/1.1 200 OK\n"

この行を削除すると正常に動作し、ページも表示されました。
また、どちらの OS でも smp_error.txt というファイルは作成されませんでした。

>>650
Windows での情報が少ないな、とは思っていたのですがやはりそうなんですね。
ちょうどいろいろ不便で、限界を感じていたところだったので、
土日を利用して CentOS で環境を構築してみようかと思います。

652 :デフォルトの名無しさん:2011/04/01(金) 19:47:52.10
SMTP.startだけやってsmtp.send_mailしないとどうなる?

653 :デフォルトの名無しさん:2011/04/01(金) 19:57:00.25
ブロックの有無にかかわらず、HELO だけして接続を終了する
接続そのものは行われるので、変な接続先やパスワードを設定するとエラーが出る

654 :デフォルトの名無しさん:2011/04/01(金) 19:59:59.90
>>651
CentOSでRuby使うのだけはやめておけ

というかわざわざCentOS使う人が多いのはなんで?

655 :デフォルトの名無しさん:2011/04/01(金) 20:04:55.98
RedHat厨の残党では?

656 :デフォルトの名無しさん:2011/04/01(金) 20:09:32.19
CentOS自体は悪いもんじゃない
パッケージのRubyが5年前の不安定版のままなだけ

657 :デフォルトの名無しさん:2011/04/01(金) 20:11:19.04
ソースからいれてるけどそれでもダメなの?
aptとかyumとかそんなの一切使わないけど

658 :デフォルトの名無しさん:2011/04/01(金) 20:14:32.26
>>652
おなじです。表示までいかないです。

>>654
あ、そうなんですね。ありがとうございます。
逆にこれがおすすめってのありますか?

>>657
自分もそうしようとしてました。これ参考にしたらいけるのかなーって。
http://d.hatena.ne.jp/rx7/20100611/p1

659 :デフォルトの名無しさん:2011/04/01(金) 20:15:38.19
>>652>>651宛てだぞ>>653

660 :デフォルトの名無しさん:2011/04/01(金) 20:16:18.48
普通はソースからコンパイルしてインストールしたりしません
特に初心者は

新しい言語環境試すのにとりあえず最新版をコンパイルしてホームにインストールとかするのはマニアだけです

661 :デフォルトの名無しさん:2011/04/01(金) 20:21:23.27
どんだけ初心者かにもよるよな
Linuxもプログラミングもはじめてでちゅこんぱいるってなに、という人には勧めないが、まあ、そんな程度だ

662 :デフォルトの名無しさん:2011/04/01(金) 20:27:57.48
普通はソースから入れるものだろ
まあ趣味の世界でしかrubyを動かす事のない人にはパッケージで管理してればいいよ

663 :デフォルトの名無しさん:2011/04/01(金) 20:40:43.62
Rubyにおける「普通の環境」って何よ
個人的には普通なんて存在しないと思うよ

664 :デフォルトの名無しさん:2011/04/01(金) 21:48:09.19
>>663
現時点でならRVMだな!

665 :デフォルトの名無しさん:2011/04/02(土) 16:09:15.09
松本尊師はデビアン使ってたはず。尊師と同じ環境じゃないと解脱出来ないだろうね。

666 :デフォルトの名無しさん:2011/04/02(土) 16:11:05.27
rubyをCみたいにコンパイルして利用する事はできますか?
PHPやPERLやPYTHONでは出来るのですがRubyではあまり聞かないので

667 :デフォルトの名無しさん:2011/04/02(土) 16:20:32.35
>>666
「コンパイル済み」の状態のバイナリを持ち歩くことはできない

Ruby実行環境ごとひとつのexeファイルにまとめてスクリプトを実行することはできる

668 :デフォルトの名無しさん:2011/04/02(土) 17:42:38.81
いぐざーぶとかまだ開発してるのかな。


669 :デフォルトの名無しさん:2011/04/02(土) 19:27:42.05
Ruby始めようとサイトいったんだけど、英語版が充実しててワロタ
Try Ruby 日本語サイトにも置いといてくれよ

670 :デフォルトの名無しさん:2011/04/02(土) 21:04:47.20
exerbは開発進んでるけど、Ruby 1.9.xにはまだ未対応ぽい
個人的にはそれで困ったことはないが

671 : ◆LLLLLLLLL. :2011/04/03(日) 09:35:49.67
| ̄:/ : : /: : : : : : : :i: : : i: :\ : :\    \
|: / : : : / : : : : :.i: : : : |: : : :|: : : |: : : i     '
: :|: : : : |: : i: : : :|: : : /i|: : :|:| : : :|: : : |     |
: :|: : : : |: :.|:斗 十‐/ i|: :∧-‐ト|: : : |     |
: :|: : : : |イ|: :|:/ |:/   |:/ |ハ: : |: : : |  \_,ノ
: :|: : : : | レヤ示ト     rテv|:./|: : : :|
ヽ|: : : : |/{:::::::i }     トイ レ: :|/|/   関東地方 
( |: : : : 代c::ノソ     レリ |: : : : |       東北地方 北海道地方
.〈.|: : : : |x`¨       、¨x.|: : : i:|    にいる
\|i: : : :|        ,   /|: : : i:|      すべての 愛すべき 国民へ 告ぐ
∨リ\: :iト 、      `´ ィ  |: : /|リ      
‐┴―\|- 〈 >rァ 爪|V  |/
:::::::::::::::::::::::ヽ \ リ
::::::::::::::::::::::::__\
:::::::::::::::/ ::r――‐へ      rっr‐-、_
:::::::::/ :://      ∧. | ̄ ̄ ̄| | | | | ̄ ̄ ̄ ̄ ̄ ̄ ̄|..
:::/ ::/ /          ヽ|.    L|_|_ト'           |
/ ::::/  /         \   ただちに 逃げろ    |
. :::/ |/           |                 |

672 :デフォルトの名無しさん:2011/04/03(日) 20:20:05.21
MacO

673 :デフォルトの名無しさん:2011/04/03(日) 20:41:41.53
コンソールから年代を入力し, 入力された年代の天気のデータが記載されたhtmlページを取得, 保存したいと思っています
例えば, ( http://weather.jp/XXXX.html ) というページの, 2010年のhtmlを保存( 2010.txt )しようとした場合,


year = gets().to_i
output_file = File.open( )
open( )



となると思います


これらの File.open( )と open( ) には どのように記述すればよいでしょうか?

今回の場合,
File.open の中には ("2010.txt" , "w") , open の中には ("http://weather.jp/2010.html") が最終的に入力されれば良い, ということは分かりますが
数字が変数に代入されている場合どのようにして記述してやればいいのでしょう?

674 :デフォルトの名無しさん:2011/04/03(日) 20:50:41.10
Rubyの基本動作の解説をどっかで読んだほうがいいと思うぞ
StringとArrayとHashの3つだけ眺めてわかった気になるだけでもかなり違う

で、文字列の中に変数(やメソッド返り値)の結果を埋め込むには
文字リテラルを "" で囲って作った上で #{ } を使う

year = 2010
path =

675 :デフォルトの名無しさん:2011/04/03(日) 20:52:44.84
year = gets.to_i
"http://weather.jp/#{year}"
"http://weather.jp/%d" % year

あとruby getweather.rb 2011とかしてコンソールから起動する場合は
コマンドライン引数2011をARGV[0]で取れるよ

676 :デフォルトの名無しさん:2011/04/03(日) 21:00:16.67
がーん、TabとEnterがほぼ同時に押ささった(北海道弁)
>>674続き

year = 2010
path = "#{year}.txt"

とすると、path は "2010.txt" になる
あと、かんたんスクリプトの作り方として、外部入力確定は後回しにしたほうがいいと思うぞ

year = 2010 # あとで外部入力にする
url = "http://weather.jp/#{year}.html"
path = "#{year}.txt"
html = open(url).read
File.open(path, 'w'){|f| f.print(html)}

とかやって、2010.txt がうまく書き込まれるようになってからおもむろに year をなんとかする

677 :デフォルトの名無しさん:2011/04/03(日) 21:08:40.86
>>674-676
…どうやらとても基本的なことを学び足らなかったようですね…
課題に向かうときは簡単な土台から積み上げていくテクニック おっしゃるとおりです

もう少し下積みしてからもう一度挑戦したいと思います. ありがとうございましたm(_ _)m

678 :デフォルトの名無しさん:2011/04/04(月) 05:25:55.51
open( )でurlまで開けるの?知らなかった

679 :デフォルトの名無しさん:2011/04/04(月) 05:30:36.59
通常は開けない
require 'open-uri' として open メソッドを書き換える必要がある
open の引数の信頼性に注意

680 :デフォルトの名無しさん:2011/04/04(月) 12:48:59.07
>>663
Rubyにおける「普通の環境」=rvm

681 :デフォルトの名無しさん:2011/04/05(火) 01:16:21.14
rubyでipadのアプリを開発しようと思ったが、
Rhodes + Macが無いと無理なんでしょうか?

どうも解説ページが少なくてわからない・・・。


682 :デフォルトの名無しさん:2011/04/05(火) 03:12:07.44
ruby+cocoaみたいなののipad,iphone版みたいなフレームワークってないよね。

683 :デフォルトの名無しさん:2011/04/05(火) 04:50:03.97
自作ライブラリで open(path){|f| f.read} にするか File.open(path){|f| f.read} にするかは結構迷う

684 :デフォルトの名無しさん:2011/04/05(火) 09:15:46.40
>>683
なんで?

685 :デフォルトの名無しさん:2011/04/05(火) 16:36:21.75
>>684
>>679でわかるようにKernel#openは書き換えられてるかもってことでは?

686 :デフォルトの名無しさん:2011/04/05(火) 21:27:18.56
>>682
そっか、ないんですね・・・。

世の中のipadアプリケーションエンジニアは
みんなMac持ちなのか・・・?

687 :デフォルトの名無しさん:2011/04/05(火) 22:26:39.05
少なくとも、Rubyでどうにかしようと思ってる人はいないと思う
データ関連いじるならまだしも

688 :デフォルトの名無しさん:2011/04/06(水) 01:04:18.28
>>686
WebアプリならiPadに最適化されたUIにする手もあるがネイティブアプリを開発したいんだよな

> 世の中のipadアプリケーションエンジニアは
> みんなMac持ちなのか・・・?

もしそこに気付けなかったのならiPadでの開発はやめておいた方がいいかもしれない

689 :デフォルトの名無しさん:2011/04/06(水) 08:37:45.89
vm使えばええやん

690 :デフォルトの名無しさん:2011/04/06(水) 08:59:19.72
l.callで呼び出せる理由はなんとなくわかるのですが、l[]で呼び出せる理由がわかりません。
何故関数が呼び出されるのでしょうか?

irb(main):001:0> l = lambda{puts "lambda"}
=> #<Proc:0x00007ff619093dc0@(irb):1>
irb(main):002:0> l.call
lambda
=> nil
irb(main):003:0> l[]
lambda
=> nil

691 :デフォルトの名無しさん:2011/04/06(水) 09:08:25.40
[]をcallと同等にした理由は、見かけが()に似ているから。

692 :デフォルトの名無しさん:2011/04/06(水) 09:38:55.16
>>690
単なる.call()の略記法としてそういうメソッドが定義されてるだけ
本当は()にしたかったんだろうけど、言語仕様的に無理があるんで
それっぽい表記で、かつメソッドとして有効な名前として[]が選ばれた

693 :690:2011/04/06(水) 09:50:05.74
>>691-692

勉強になりました。
ありがとうございました。

694 :デフォルトの名無しさん:2011/04/06(水) 12:47:49.62
>>693
今は3種あるのかな
Proc#call
Proc#[]
proc_obj.()

695 :デフォルトの名無しさん:2011/04/06(水) 13:08:26.82
今から1.9って勉強したらダメなんですか?
マニュアルってそろってないのですか?

696 :デフォルトの名無しさん:2011/04/06(水) 13:20:54.54
Rubyの知識がある人向けのマニュアルはある
文字エンコーディングに関して造詣がある人向けのガイドもある

が、どちらに関しても初心者な人が読めるかどうかまでは保証しない
ぐぐって出た記述がRuby1.9で動作するかどうかは初見ではわからないので、それで挫折しない心も必要

697 :デフォルトの名無しさん:2011/04/06(水) 13:35:05.88
イロイロ言われてはいるんだが、 Ruby 1.9.2 が初めてのプログラム言語というのでないならおk
ASCII-8BIT のことを「つまりバイナリです」と言われて納得してもらえるくらいの事前知識があれば問題ない

698 :デフォルトの名無しさん:2011/04/06(水) 13:50:29.27
自宅窓鯖からレンサバへ移行するため
C++で作っていたCGIを移植するべくRubyを始めようと思っています
一般的なプログラミングと文字コードに関して一通りの知識を有しています
それでもやはりRuby初学者は1.8から始めるべきでしょうか
1.9では速度も相当改善されていると聞きます
なので1.9から始めたいという気持ちが強いのですが
よく考えるとレンサバでは1.8しか使えないことがほとんどなので
選択の余地がありません。本当にありがとうございました。


699 :デフォルトの名無しさん:2011/04/06(水) 14:22:27.75
>1.9では速度も相当改善されていると聞きます
一般の人がふつうに(Ruby上で)文字列作ってふつうに文字列使うライブラリではふつうに遅いよ
ベンチマークが速いのは、単に負担がかかる動作を回避してるからに過ぎない

700 :デフォルトの名無しさん:2011/04/06(水) 14:26:35.70
レン鯖に入っているのはそれこそ1.8.5以下だったりすることも…


701 :デフォルトの名無しさん:2011/04/06(水) 14:31:26.81
Ruby1.9で速くなった部分と遅くなった部分とがあって、
ライブラリ中で速くなった部分がたくさん使われてて遅くなった部分があまり使われてないと
最終的にそのライブラリは「Ruby1.9では速くなった」になる
そんだけ

遅くなった筆頭がたまたま文字列作成だったので、
文字列たくさん作るようなライブラリは1.8よりも遅くなる可能性が高い

702 :デフォルトの名無しさん:2011/04/06(水) 14:38:16.71
php4→php5のようにいつかは1.9に移行するなら今のうちに1.9使ったほうがよくないのですか?

703 :デフォルトの名無しさん:2011/04/06(水) 14:46:50.20
移行自体は未練がましくのろのろと進んでるよ

ただ、それはRubyを学んで使い倒してる人の間でのお話で、
初心者スレとしては「いきなりRuby1.9は逆にめんどくさいぞ」というのが一応結論
めんどくさくてもいいなら1.9から始めるといい
ひょっとしたら君にとってはめんどくさく感じられないかもしれないし

このスレの想定する初心者というのはかなり初心者だから

704 :デフォルトの名無しさん:2011/04/06(水) 18:04:20.52
レン鯖で1.9が動かせるかどうか確認するのが先決じゃなかろうか

705 :デフォルトの名無しさん:2011/04/06(水) 18:46:53.32
>>694
Ruby 1.9 以上で 引数がひとつだけならば
Proc#===
を演算子形式で呼べる
lambda{|x| 2**x} === 3 # => 8
本来はcaseなどで真偽値を返す用途に使うのだろうけど

カリー化すれば複数の引数も何とか
(lambda{|x,y| x**y}.curry === 2) === 3 # => 8

メソッドとして呼べば複数の引数も渡せる
lambda{|x,y| x**y}.===(2,3) # => 8

で、「you普通にcallしちゃえよ」と突っ込まれる


706 :デフォルトの名無しさん:2011/04/06(水) 19:32:48.32
すいませんgemをインストールすることで、gemからRubyをインストール&アップデートすることも可能なのでしょうか?
また、gemというのはPythonやPHPやApacheなどにも対応してそうですね
linuxのaptみたいなのがwinでも使えると便利ですね

707 :デフォルトの名無しさん:2011/04/06(水) 20:21:24.20
pikじゃないの

708 :デフォルトの名無しさん:2011/04/06(水) 23:30:10.87
>>706
gemで直接Ruby本体(ruby)をアップデートすることはできない
でも707も言ってるとおり、pikというソフトウェアを使うと似たようなことはできる
コマンドラインからのrubyの一発インストールとか、バージョンアップとか

709 :デフォルトの名無しさん:2011/04/06(水) 23:50:25.53
pik使ってみたいと思います
pik教えてくれてありがとうございます

710 :デフォルトの名無しさん:2011/04/07(木) 02:43:36.63
>>688
そうですね。Rubyでネイティブアプリを作りたいです。
やはり無理なのか・・・。

711 :デフォルトの名無しさん:2011/04/07(木) 16:05:35.89
だからVMとかググレカス

712 :デフォルトの名無しさん:2011/04/07(木) 23:20:18.54
>>706
定番はrvmだがWindowsならpikだと思う
pikはRuby本体のインストールだけならmingw版やさらにDevKit(gemのコンパイルに使う)がバイナリですぐに入るしむしろrvmより楽かもね


713 :デフォルトの名無しさん:2011/04/08(金) 15:40:26.26
RubyとPython両方使えるに質問です

以下の各ケースでは、どちらの言語を選択したらよいでしょうか?

1.ゲームを作る場合
2.レンタルサーバを借りてWEBサイトを制作する場合

個人的な未開として1についてはライブラリの選択肢が多いほうを選択したいのですが、どちらが多いのかわかりません。
2についてはPythonだとバージョンにより特定のライブラリが使えなかったりするので互換性の面でRubyのほうがいいのかなと考えてます。


714 :デフォルトの名無しさん:2011/04/08(金) 15:51:35.16
見解(けんかい)

715 :デフォルトの名無しさん:2011/04/08(金) 16:21:13.78
ttp://www.google.com/search?num=50&hl=ja&lr=lang_ja&q=%22%E5%80%8B%E4%BA%BA%E7%9A%84%E6%9C%AA%E9%96%8B%22
最近のGoogleさんは物凄くて鼻血が出ちゃうわ

で、まあ、どっちにしてもPythonでいいんじゃないのと思う
ゲームみたいなのを作るのも、安い共用レンタルサーバでCGIとしてガンガン動作させるのも、
今のところRubyの得意分野ではない

716 :デフォルトの名無しさん:2011/04/08(金) 17:01:22.26
俺はRubyしか触ったこと無いんだけどRubyの利点ってなんなの?

717 :デフォルトの名無しさん:2011/04/08(金) 17:21:35.08
例えばCできる人が初めて触ってもCの書き方で何となく動かせるとか
文字列操作が強力でテキストファイルの整形を手軽にできるとか

718 :デフォルトの名無しさん:2011/04/08(金) 17:27:59.24
perlだってpythonだって同じじゃん。

719 :デフォルトの名無しさん:2011/04/08(金) 17:32:35.10
メリットが欲しいならJavaやれJava
就職できるぞwww

720 :デフォルトの名無しさん:2011/04/08(金) 17:35:20.77
記述の方向性が違うだけで、単体としての中身はあまり変わらないよ
第三者ライブラリとか含めるとかなり違うが

721 :デフォルトの名無しさん:2011/04/08(金) 17:36:56.38
ttp://www.namaraii.com/rubytips/でRubyの勉強を始めたいと思います
Ruby1.9.2です
基本的に問題ないでしょうか?

722 :デフォルトの名無しさん:2011/04/08(金) 17:39:41.26
そのサイト久しぶりに見た
1.9で動作する記述はあったっけ?

723 :デフォルトの名無しさん:2011/04/08(金) 17:42:53.51
>>722
日本語文字列とかじゃなければだいたい大丈夫なはず
まあ、動かなかったらこことかで聞けばいい
3回くらい躓けば慣れる程度のことだし

スレ的には躓きまくることでRubyそのものを諦められてしまうことを恐れてるっぽいが

724 :デフォルトの名無しさん:2011/04/08(金) 18:04:02.41
Ruby1.8.7をダウンロードしてMinGWでコンパイルしてインストールしたのですが、

'require':no such file to load -- openssl(LoadError)

というエラーが出て動きません。
Cygwinでは予め入っているので動きます。どうすれば動くようになる
でしょうか?よろしくお願いします。

725 :デフォルトの名無しさん:2011/04/08(金) 18:22:51.83
openssl入れろ

726 :デフォルトの名無しさん:2011/04/08(金) 18:40:45.96
require 'digest/sha1'
でも同じエラーが出ます。

727 :デフォルトの名無しさん:2011/04/08(金) 19:17:17.67
digest/sha1が入ってないんじゃね

728 :デフォルトの名無しさん:2011/04/08(金) 19:21:46.45
だからコンパイル時にopensslが見つからなかったのでSSL関連が全部取り除かれてるんだよ
マニュアルくらい読め

729 :デフォルトの名無しさん:2011/04/08(金) 19:40:21.63
1.6のころは何もしなくても動いたのに、あれこれやらなきゃ動かなく
なったスクリプト言語はもう卒業かな。sha1なんてどこで手に入れれ
ばいいの?NTL使ってC++に移植したほうがいいかも。

730 :デフォルトの名無しさん:2011/04/08(金) 19:42:57.22
一々探してインストールするのがマンドクセ。
第一ネットしかしない一般ユーザーがRubyを動かすために態々Ruby
インストールするなんてWindows環境じゃありえないし。

731 :初心者ですが:2011/04/08(金) 19:48:29.44
Winならここで最新版落とせるけどだめですか?
http://rubyforge.org/frs/?group_id=167&release_id=45627

732 :デフォルトの名無しさん:2011/04/08(金) 19:53:05.57
http://doc.ruby-lang.org/ja/1.9.2/doc/index.htmlにversion 1.9 未対応リファレンスと書かれているのですが
1.9をやるうえでこのマニュアルは参考にしてはいけないのですか?

733 :デフォルトの名無しさん:2011/04/08(金) 20:05:47.50
>>732
完成版ではありません網羅してませんという程度の意味
現状、内容そのものは合ってはいる
致命的に不足してるが

734 :デフォルトの名無しさん:2011/04/08(金) 20:17:31.71
ほしい情報はあまり載ってないよね
実際のソース読んだほうが早い

735 :デフォルトの名無しさん:2011/04/08(金) 20:22:03.03
>>731
やっぱり動かないよ。require 'digest/sha1' LoadError

736 :デフォルトの名無しさん:2011/04/08(金) 20:23:11.55
Cで書かれているのではない部分に関しては、Rubyスクリプトを提示したほうが早い場合は多い
ローカル変数名とかを適切にしまくって短めのメソッドにしてる場合、
(日本語の)文章で説明するより早そうな場合も多々…

737 :デフォルトの名無しさん:2011/04/08(金) 20:23:44.35
Cygwinでコンパイルするとエラーで止まるし。
どういう開発してるんだ?

738 :デフォルトの名無しさん:2011/04/08(金) 20:26:19.84
WinのコマンドプロンプトでRubyを動かしてます
1.9.2での日本語表示についてご教示お願いします
# -*- encoding: utf-8 -*-
require "kconv"
a = "あ"
puts Kconv.tosjis(a)
で日本語が表示できました
しかし日本語があるごとに毎回Kconv.tosjis()を書くのは面倒です

ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/45331
を元に以下のようにしてPHPのecho()みたいにしてみました
# -*- encoding: utf-8 -*-
require "kconv"
def echo(*arg)
puts NKF.nkf("--ic=UTF-8 --oc=Windows-31J", arg.map{|x|x.to_s}.join("\n"))
end
a = "あ"
echo(a)

もっと楽な方法ってございませんか?

739 :デフォルトの名無しさん:2011/04/08(金) 20:33:44.35
これって手動で全部パスを通す必要があるの?
http://rubyforge.org/frs/?group_id=167&release_id=45627


740 :デフォルトの名無しさん:2011/04/08(金) 20:36:36.37
とりあえず>>5
その上で、mswin32ではなくmingw32を選ぶ理由を述べよ
さらに、マニュアルとかすっ飛ばして自前でコンパイルしようとする理由も述べよ
それと、解説サイト探さずにファイルだけ持ってきてどうにかしようとする理由も言ってくれるとうれしい

741 :デフォルトの名無しさん:2011/04/08(金) 20:53:28.30
>>738
# -*- encoding: utf-8 -*-
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
puts "ねこだいすき"


> TYPE ja.rb
# -*- encoding: utf-8 -*-
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
puts "縺ュ縺薙□縺・☆縺・

> ruby ja.rb
ねこだいすき

>

742 :デフォルトの名無しさん:2011/04/08(金) 20:56:20.20
$stdout.set_encoding を使わずに、スクリプトの実行時に

ruby -EWindows-31J:UTF-8 ja.rb

としてもいい
本当はこっちのほうがいいんだけど、なんかこれがうまく動かないWindowsの環境があったはず

743 :デフォルトの名無しさん:2011/04/08(金) 20:57:09.62
>>740
1.自分のマシンに最適化して-march=core2 とかコンパイルオプションを
付け足して早く動かしたいから。
2.昔と同じ感覚でやっているので。昔のRubyは簡単に覚えられてmake
一発すぐ完成だったのに、最近のは使わない機能だけが肥大化して、
本当に使いたい部分が後回しにされている。昔はマニュアルなんか要
らなかったし読むのも面倒くさい。
3.楽でしょ?お手軽さが一番なんだよ。

あ、後パス通したら動いたので感謝。まだ使えるねw

744 :デフォルトの名無しさん:2011/04/08(金) 20:59:23.01
バージョン1.0くらいのRubyでも外部ライブラリは必要だったはず

745 :デフォルトの名無しさん:2011/04/08(金) 21:25:58.83
>>742
うちの
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
では動作しないっぽい気がする
いい機会だし1.9.2に上げよう
っていうか2009もないわな

746 :デフォルトの名無しさん:2011/04/08(金) 21:31:24.01
>>741-742
すごい・・・すごすぎます


747 :デフォルトの名無しさん:2011/04/08(金) 21:34:03.07
>>742
-EWindows-31J:UTF-8
って
-E Windows-31J:UTF-8
でも動くんだけどどうなってるんだこれ
-EWindows-31J:UTF-8でググってもヒットしなかった

748 :デフォルトの名無しさん:2011/04/08(金) 22:12:06.41
ttp://www.openspc2.org/reibun/Ruby/var/006/index.html
ttp://www.openspc2.org/reibun/Ruby/var/007/index.html

a = [1,2,3,4]
b = a
puts b[2]



a = [1,2,3,4]
b = a.dup
puts b[2]

は結果は同じなんですが何が違うのでしょうか?

749 :デフォルトの名無しさん:2011/04/08(金) 22:13:57.39
>>747
Rubyに対する引数から
・ "-Eなんとか" を探して、先頭の -E を取り除いて使う
・ "-E" を探し、見つかったらその次の引数を使う
という処理をすればいい
基本的にはRubyの中で正規表現を頑張りまくってる状態


750 :デフォルトの名無しさん:2011/04/08(金) 22:21:03.73
>>748
Object#dupはオブジェクトを複製して新しいオブジェクトを作る
a.object_idとb.object_idを表示してみるとわかるかも

オブジェクトとはなんぞやということがわからなければその勉強をするといい
Rubyには必須の知識で、理解すれば効率が上がるぞ

751 :デフォルトの名無しさん:2011/04/08(金) 22:29:45.69
勉強になりました

752 :デフォルトの名無しさん:2011/04/08(金) 22:53:45.83
PHPからRubyに来た口だけどi++とか--iとか出来ないのがきもい
i +=1 と i-= 1って書くのめんどくさい

753 :デフォルトの名無しさん:2011/04/08(金) 22:59:21.24
Twitter、検索結果表示が“3倍速く”なったと発表――フロントエンドの切り替えで
Twitterは、フロントエンドをRuby on RailsからBlenderに切り替えた結果、検索結果の待ち時間が大幅に改善されたと発表した。

http://www.itmedia.co.jp/news/articles/1104/07/news043.html
-----------------
急成長する検索ニーズに対処するために検索エンジンを書き換え、リアルタイム検索エンジンを立ち上げた。
その際にバックエンドをMySQLからJavaベースのテキスト全文検索エンジンLuceneに移行した。
また先週、フロントエンドをRuby on RailsからBlenderと呼ばれるJavaサーバに切り替えた。
待ち時間の短縮は、こうした取り組みの成果だという

754 :デフォルトの名無しさん:2011/04/08(金) 23:03:42.32
>>752
まあ皆さんそうおっしゃるのですが、
実のところ i = i + 1 のようなコードを書く機会は Ruby では極めて稀なので
やっぱどうでもいいかなあとか1ヵ月後くらいには思ってます

あれば便利かもしれないけど、どうしても使うなら i+=1 でもいいか、みたいな

755 :デフォルトの名無しさん:2011/04/08(金) 23:18:17.22
irb> 3.times{|i| p i}
0
1
2
irb> (3..5).each{|i| p i}
3
4
5
irb> (10..30).step(10){|i| p i}
10
20
30
irb> 8.upto(11){|i| p i}
8
9
10
11
irb> ['a', 'b', 'c'].each_with_index{|x, i| puts "#{i}: #{x}"}
0: a
1: b
2: c

で足りなかったらまたおいで

756 :デフォルトの名無しさん:2011/04/08(金) 23:37:45.73
while(true)〜endでできるのにloop{〜}が無限ループ用に用意されてる意味が理解できない
これも後一ヶ月修行をしろということかっ!

757 :デフォルトの名無しさん:2011/04/08(金) 23:44:25.39
>>756
PHPでできるんだからRubyなんてやる必要ないだろ

758 :デフォルトの名無しさん:2011/04/09(土) 00:44:44.48
そうなんだよな
他言語経験者がi++とか○○は当然あるに違いないと思ってたものがなかったり
privateとか微妙に意味が違ったりすると戸惑うよな

759 :デフォルトの名無しさん:2011/04/09(土) 01:38:24.34
>>723
WindowsでRuby使おうとしたら
インストールするところで何選んで良いか判らなくて躓いたわ

760 :デフォルトの名無しさん:2011/04/09(土) 07:02:53.15
>>757
うむ
冗長なAでできるから端的なBいらないじゃんをつきつめるとRubyは使われない可能性は高いw

761 :デフォルトの名無しさん:2011/04/09(土) 07:11:33.11
Ruby ではループカウンタはまず使わない
Array#each か Hash#each のイテレーションを使うかまたは>>755みたいに整数でくるくる回す
配列の内容全部が必要なのなら、添え字アクセスはひとまず忘れて、each する構造にできないかを最初に考える

>>759
アレで理解できる一握りの人だけが Windows で Ruby を使うことができます
>>5でいいと思うけどね

762 :デフォルトの名無しさん:2011/04/09(土) 09:46:39.56
>>759
だいたいの場所で、ActiveScriptRubyが第1のお薦めになってない?
まあ今はRubyInstallerとかRumixとか、他にも候補あるから迷うのはわかるが

763 :デフォルトの名無しさん:2011/04/09(土) 09:49:29.76
>>759
WindowsでRubyは
http://rubyinstaller.org/
が定番だと思うよ

764 :デフォルトの名無しさん:2011/04/09(土) 10:29:03.39
http://rubyinstaller.org/downloads/http://rubyforge.org/frs/?group_id=167って中身同じなの?

765 :デフォルトの名無しさん:2011/04/09(土) 10:30:48.63
まだ定番とはいえないだろう
英語だし、mingw版だし
「次の選択肢」くらいの位置になってるとは思うけど

766 :デフォルトの名無しさん:2011/04/09(土) 10:43:57.20
rubyinstallerで入れてgemをupdateしてpikいれてaddが一番楽だったな

767 :デフォルトの名無しさん:2011/04/09(土) 11:27:28.10
>>764
URLが同じなら同じだろう

というかオフィシャルサイトのダウンロードページだけにするのが筋だな
rubyforgeのページ見せられてオフィシャルだと判断できるような人はおらん
単純に>>731のスジが悪い

768 :デフォルトの名無しさん:2011/04/09(土) 11:38:42.79
Ruby1.9.2

a = 123.45
b = a.to_a
puts b

実行するとundefined method `to_a' for 123.45:Float (NoMethodError)エラーになるのは何故ですか?

769 :デフォルトの名無しさん:2011/04/09(土) 11:43:25.04
Floatクラスにto_aが無いよってエラーに書いてあるよね

770 :デフォルトの名無しさん:2011/04/09(土) 11:46:38.41
過去には Object#to_a があったのだが、なくなった。


771 :デフォルトの名無しさん:2011/04/09(土) 11:48:50.25
ていうか Hash 以外の to_a の存在は忘れてくれ
古い解説ではもやもやしたベンリ機能のように書いてあることがあるんだが、
Object#to_a は今後使用しないことになったので [ ] で括ってリテラルで書いてくれ
a = 123.45
b = [a]
p b

配列っぽくなりうる Hash を to_a するのはアリだが、
h = {'k1' => 'v1', 'k2' => 'v2'}
p h.to_a

それ以外の「ひとつしかない」オブジェクトを to_a するのはダメ

772 :デフォルトの名無しさん:2011/04/09(土) 11:50:59.06
>>766
それが楽だと思うんだけどね
まず初めての人なら"pik入れてadd"のところはのちのちでいいかもしれない

>>768
ruby 1.8でもなくなるって警告出てたんだけどな
warning: default `to_a' will be obsolete

773 :デフォルトの名無しさん:2011/04/09(土) 11:57:37.06
こんにちは質問させてください!!

RubyGemsでインストールすると古くて動かないようなrubyで作られた便利なプログラムがある時に
最新版やforkされたソース(主にgitリポジトリから取得)だと動くことがあります
すかし、そのようなプログラムはRubyGemsのディレクトリ構成のせいか、
(便利プログラム)/bin/以下のファイルを/usr/local/binのようなパスを通った場所においても
`require': no such file to load
になり動いてくれません。

絶対パスだと動くようなのでaliasを作ればいいのですが、
一般的にこのようなRubyGemsの構造をしたプログラムの最新版のソースから利用するときの
ベストプラクティスは何かありますでしょうか?
bundler??とかいうのを使うのでしょうか

774 :デフォルトの名無しさん:2011/04/09(土) 11:58:39.72
> (便利プログラム)/bin/以下のファイルを/usr/local/binのようなパスを通った場所においても
> `require': no such file to load
> になり動いてくれません。

(便利プログラム)/bin/以下のファイルを/usr/local/binのようなパスを通った場所にシンボリックリンクをおいても

の間違いでした

775 :デフォルトの名無しさん:2011/04/09(土) 12:04:47.34
これからRubyを学ぶものは1.9から始めたほうがいいんだよね


776 :デフォルトの名無しさん:2011/04/09(土) 12:10:09.04
ふつうに gem コマンドでインストールすると、パスの通った位置に、
(便利プログラム)/bin/以下のファイル
をloadするスクリプトがインストールされる。たとえば、
~/.gem/ruby/1.9.1/gems/bundler-1.0.10/bin/bundle をロードする
~/.gem/ruby/1.9.1/bin/bundle (こっちはパスが通っている)
みたいな関係。

後者はどのgemでもほぼ同じだから、まねして作ってやればよい。

あるいは、ソースを取ってこれるのだから、rakeでgemを作って(ターゲットは
gemとかpackageとかpkgとかいろいろ)、
gem install --local でインストールしてもよい。


777 :デフォルトの名無しさん:2011/04/09(土) 12:11:08.95
>>773
git clone https://github.com/user/hogehoge
cd hogehoge/
rake pkg
gem install pkg/hogehoge-1.0.1.gem

rake pkg は rake build かもしれない
ようは開発版のソースから gem パッケージを手元で生成してインストールしてしまうという荒業
バージョン番号が同じだと既存の hogehoge-1.0.1 が上書きされるので、 rake で適当にバージョン上げれ

>>775
>>695-704

778 :デフォルトの名無しさん:2011/04/09(土) 12:14:49.97
1.9から始めて心が折れないとよいが

779 :デフォルトの名無しさん:2011/04/09(土) 12:16:28.69
勉強になりました
ありがとうございます

780 :デフォルトの名無しさん:2011/04/09(土) 12:27:12.86
rubygems が bundler を内部で使うようになってから gem install に毎回5分くらいかかるんですが
なんか回避方法はありませんか

781 :デフォルトの名無しさん:2011/04/09(土) 12:32:05.25
>>780
それは単にBundlerの展開データ量に実メモリが追いついてないんだろう
gem installを行うためには空きメモリが200MBくらい必要

ちなみに必要となるのはそのうちの2KBくらいのデータだ
それを探すために公開されてる全データを取得して展開してサーチしてる

782 :759:2011/04/09(土) 12:35:31.69
こんなにいっぱいレスもらえるとは思いませんでした
みなさん本当にありがとうございました

783 :デフォルトの名無しさん:2011/04/09(土) 12:47:32.61
Rubyってbasicみたいだよね
何かVBやってるみたい
C#派ならPHPか!?

784 :デフォルトの名無しさん:2011/04/09(土) 13:00:02.77
コレクションとイテレーションとオブジェクトとメソッドコールが言語中枢を侵してるRubyと同じって
なんかずいぶん先進的なBasicやってたんだな

785 :デフォルトの名無しさん:2011/04/09(土) 14:25:02.28
>>781
gem作った人ってストリームって知らないの?

786 :デフォルトの名無しさん:2011/04/09(土) 15:10:01.81
>>785
そんなもの必要ないだろ
サーバの負担にもならないし、全部メモリに展開したほうが早い

787 :デフォルトの名無しさん:2011/04/09(土) 15:25:44.70
まあ、ああいうのは開発者さんの環境ではサクサク動くのだろうとは思う

788 :デフォルトの名無しさん:2011/04/09(土) 16:09:19.50
>>771
Enumerable#to_a は別名があるとはいえ、別に忘れなくても良いと思うんだ…

789 :デフォルトの名無しさん:2011/04/09(土) 22:11:31.08
>>786
swapがないVPSでgemがインストールできなかった当時の全俺がないた

790 :デフォルトの名無しさん:2011/04/09(土) 22:18:01.58
そもそものgemクライアントとして、こんなにたくさんのgemが登録されることを予期してはいなかった
だから途中で破綻するはずだったんだが、間の悪いことに開発者のマシンがスペックアップしたので
本当なら遅くなって使い物にならなくなるはずのシステムが普通に使えてしまった

世の中そんなもんだよね

791 :デフォルトの名無しさん:2011/04/09(土) 22:20:20.92
だれかgemをフォークして作り直してくれ。
Pythonで。

792 :デフォルトの名無しさん:2011/04/09(土) 22:26:44.55
eggじゃだめなん?


793 :デフォルトの名無しさん:2011/04/09(土) 23:40:49.80
>>752
お帰りください

794 :デフォルトの名無しさん:2011/04/10(日) 06:42:01.76
いやいや、i++で1増えるほうが気持ち悪いから。
ってかこれこれ誰が考えたんだよ。
C言語作った奴か?

795 :デフォルトの名無しさん:2011/04/10(日) 07:02:40.24
まあオブジェクト指向が机上の空論か学者のオモチャだったころのイケてるフィーチャーだったものなので
現在のRubyのようにイテレータがきちんと枚挙をサポートしてれば出番は確実に減る

796 :デフォルトの名無しさん:2011/04/10(日) 07:36:51.42
i++はC++からだったと思う

797 :デフォルトの名無しさん:2011/04/10(日) 08:39:36.13
i++ はCが考案されたときPDP-11のアセンブラ命令にそのまま落とせて便利じゃね?
と思って作られたもの。


798 :デフォルトの名無しさん:2011/04/10(日) 09:03:51.43
うそつくな。B言語にあるじゃないか。
http://cm.bell-labs.com/cm/cs/who/dmr/kbman.html

799 :デフォルトの名無しさん:2011/04/10(日) 09:15:30.57
http://cm.bell-labs.com/cm/cs/who/dmr/chist.html

> Thompson went a step further by inventing the ++ and -- operators, [...].
> They were not in the earliest versions of B, but appeared along the way.

訳)ケンは大きいつづらを、リッチーは小さなつづらを選びました。
すると中には黄金虫が

800 :デフォルトの名無しさん:2011/04/10(日) 10:35:35.16
Cの次はPといううわさが大昔にあったな。


801 :デフォルトの名無しさん:2011/04/10(日) 10:49:37.97
class Test
def a()
return b()
end
def b()
return "bbbb"
end
private :b
end

test = Test.new()
puts test.a()

メソッドaはpublic、メソッドbはprivate。
メソッドaからメソッドbを呼び出せて、メソッドbを直接呼び出したらエラーになるようにしたいと思います。
Ruby1.9.2です。
この書き方で合ってますでしょうか?
特にprivateの仕方はマニュアルの通りに書いたのですが、サイトによっては
ttp://www.nslabs.jp/access-control.rhtmlのように
private
def pri
p true
end
と書いたり,
ttp://blog.s21g.com/articles/561のように
class Foo
def self.bar
end
private_class_method :bar
end
と書いたりしてあってどれが正しいのか判断できません

802 :デフォルトの名無しさん:2011/04/10(日) 11:02:40.64
>>801
まず、private について。
privateは、引数なしで呼ばれた場合は、その後のメソッドが全てprivateになる。
引数をつけて呼ばれた場合は、引数のメソッドをprivateにする。
なので、その例ではどちらでもbをprivateにできる。

んで、private_class_method だけは意味が違う。
それは通常のメソッドではなく
クラスメソッド(Testから作ったオブジェクトではなく「Test自体」が持つメソッド)をprivateにするもの。

803 :デフォルトの名無しさん:2011/04/10(日) 11:04:59.76
追記。
class Foo
def self.bar

という記述は、さっき上に書いたように
「Fooから作ったオブジェクト」ではなく「Foo自体」のメソッドを定義する書き方。
だからprivateにするのに、private_class_methodを使っている。

804 :デフォルトの名無しさん:2011/04/10(日) 12:13:49.92
privateって構文じゃなくてメソッドだったのか
しらんかた

805 :デフォルトの名無しさん:2011/04/10(日) 12:37:14.78
ということはprivate_class_methodを使っておけば間違いないという事であってますか?

806 :デフォルトの名無しさん:2011/04/10(日) 13:18:40.65
いいえ

メソッドのアクセス制限を利用したいなら、
Rubyにおけるメソッドの所属の仕組みの知識は必須になるます
既存言語と違うというだけで、わかってしまえばたいしたことないので、ちょっと時間割いてくださせ

807 :デフォルトの名無しさん:2011/04/10(日) 13:28:52.20
若干の語弊あり

・ Ruby には オブジェクトに属するインスタンスメソッドというものしかない
・ Ruby のクラスは、Class クラスのオブジェクトを定数で呼んでるだけである
   String クラスは、 STRING = Class.new{ なんか色々設定 } にコンセプト上は同一
   irb> p String.class #=> Class
・ クラスもオブジェクトなので、それに属するインスタンスメソッドというのもありえる
・ クラスに属するインスタンスメソッドなので、じゃあクラスメソッドって呼ぶことにしようぜ

ということで、クラスメソッドはクラス自体を self とするインスタンスメソッドだ
private_class_method は、書かれた文脈からわざわざクラスメソッドを探して private を実行する

てことで、どれも必要っちゃ必要。用途は>>802
メソッド定義の書き方を工夫して private 1個で済ます人のほうが多いかなという印象

808 :通報オタク君:2011/04/10(日) 13:52:20.37
>amachang 今粛々と民事刑事の方面で進めています。一応、すべて証拠として保存しなければいけないので、冗談でも今はこのスレに変なこと書き込まないでください。
>2011/01/28


http://hibari.2ch.net/test/read.cgi/prog/1291518728/

>1 :amachang撲滅振興協議会:2010/12/05(日) 12:12:08
> amachangが憎い・・・・amachangが許せない・・・・

> ククク・・・・クククククク・・・・・
> クックックックックックックッ・・・・・
> クー、クー、クー、クー、クー、クー・・・・・
>
> もう許せない。
> もはや沸き上がる滅意を抑えることが出来ない!!!

809 :デフォルトの名無しさん:2011/04/10(日) 15:53:03.95
■test.xml
<?xml version="1.0"?>
<root>
<item>
<title>Ruby</title>
<date>2011/04/10 12:15:22</date>
</item>
<item>
<title>Java</title>
<date>2011/03/25 21:38:57</date>
</item>
</root>
■test.rb
require "rexml/document"
file = File.new("test.xml")
xml = REXML::Document.new(file)
puts xml.elements['root/item[2]/title']

これでxmlからJavaというデータを取得できるのですが
このJavaの部分をPythonに書き換えるには何を使えば良いのでしょうか?
検索しても新たに追加する方法は見つかるのですが更新・書き換え方法が見つかりません

810 :デフォルトの名無しさん:2011/04/10(日) 16:05:32.98
xml.elements['root/item[2]/title'].text = 'Python' とかありそうな予感

811 :デフォルトの名無しさん:2011/04/10(日) 16:14:58.46
おお!すごいですね!
Rubyって簡単にxmlの操作ができますね
これで更新は出来たのですが、PHPののDOM関数のように書き換えと同時にxmlに書き込んでるわけではないのですね
データの追加・更新をしたら
fp = open(ファイル名, "w")
fp.print xml
fp.close
って書き込まないとダメってことでしょうか?

812 :デフォルトの名無しさん:2011/04/10(日) 16:26:36.17
うん。メモリ上のXMLツリーをいじくってるだけなので
いじりおわったらファイルに自分で書き出す

813 :デフォルトの名無しさん:2011/04/10(日) 16:30:07.50
勉強になりました
ありがとうございます

814 :デフォルトの名無しさん:2011/04/10(日) 20:19:27.43
utf-8のwebページを取ってきて、取ってきたページをscanで特定の文字列を抜き取りました。
抜き取った文字列をputsしたときに以下のエラーが出たのですがどのように解決したらよいでしょうか?
スクリプトファイルはUTF-8で保存してあり、ファイルの先頭には
# -*- encoding: utf-8 -*-
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
と書いてます。


`write': "\xE5" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J (Encoding::UndefinedConversionError)


815 :デフォルトの名無しさん:2011/04/10(日) 22:18:31.36
ハッシュの値で検索かけて、該当するキーを全て取得したいです(Ruby1.8.7)

hash = {:a => 1 ,:b => 1 ,:c => 2}
p hash.index(1) #=> :a

:aと:bが配列になって返ってきてくれると嬉しかったのですが、いずれか一つしか返ってこないようです
全て返ってくるメソッドってないでしょうか?

816 :デフォルトの名無しさん:2011/04/10(日) 23:23:58.75
たぶん無かったと思う。find_allとか使って何とかしたほうがいいんじゃないかな

817 :デフォルトの名無しさん:2011/04/10(日) 23:27:39.18
hash.select{|_,v| v == 1}.map{|k,_| k }
でもいいんじゃない

818 :デフォルトの名無しさん:2011/04/10(日) 23:30:25.06
http://rubyforge.org/frs/?group_id=167で配布されているrubyinstaller-1.9.2-p180.exeを使ったのですが
Ruby/tkが入っていませんでした
gemでtkを入れたいのですがパッケージ名は何になりますでしょうか?
gem tkでは入れられませんでした

819 :デフォルトの名無しさん:2011/04/11(月) 01:20:23.64
>>818
そりゃそうだろうな、入ってるはずはない
オフィシャルにいくとインストーラーがあるのでそれ使わせてもらえ

820 :デフォルトの名無しさん:2011/04/11(月) 01:47:17.31
ねむい

>>814
ttp://doc.ruby-lang.org/ja/1.9.2/method/String/i/encode.html

その設定をしてputs時にUndefinedConversionErrorということは、
puts対象の文字列をUTF-8からWindows-31Jにしようとしたけど
Windows-31Jにできない文字が含まれていましたごめんなさい指示くださいということだろう
その文字が具体的に何かは知らん

正規表現での切り出しが間違っていないのなら
(たとえばUTF-8でファイルに書き出してエディタで読むと文字化けなしとか)、
String#encodeを直接使うしかない
puts の前で str.encode!(::Encoding::Windows_31J, :undef => :replace) とかしろ

821 :デフォルトの名無しさん:2011/04/11(月) 01:52:03.35
>>817
selectとdetectとcollectとrejectとinjectは紛らわしいから使用禁止じゃムキー

822 :デフォルトの名無しさん:2011/04/11(月) 01:57:53.45
injectはいいセンスだと思う
関数型言語みたいにfoldlでもいいような気もするけど、
あえて挿し込むというイメージを持たせた辺りはRubyらしい

823 :デフォルトの名無しさん:2011/04/11(月) 02:10:20.47
select, collec, injectとかはSmalltalkでしょ

824 :822:2011/04/11(月) 03:20:13.24
そうだったのかッ!! 長年の謎が解けた

825 :デフォルトの名無しさん:2011/04/11(月) 08:21:54.09
injectは書き方が違うのでパッと見でも区別できる
他は無理だな

826 :デフォルトの名無しさん:2011/04/11(月) 11:30:40.41
hash.reject{|_,v| v != 1}.keys
という書き方あるな。でも欲しい条件が真じゃなくて、
要らない条件を書くからパッと見分かりづらいな駄目だこりゃ
rejectだけEnumerableじゃなくてHashクラスにあるからハッシュ返すのね

827 :デフォルトの名無しさん:2011/04/11(月) 12:26:08.18
REXMLで要素を追加するときに改行やインデントも入れたいのですが出来ませんか?
libxmlに乗り換えるべきでしょうか?

828 :デフォルトの名無しさん:2011/04/11(月) 12:28:30.24
rootに追加すると

<?xml version='1.0'?>
<root>
<item name='Ruby'><date>Mon Apr 11 12:25:20 2011</date></item></root>

と、なるので

<?xml version='1.0'?>
<root>
 <item name='Ruby'>
   <date>Mon Apr 11 12:25:20 2011</date>
 </item>
</root>
(インデント部分はタブとと考えてください)
としたい

829 :デフォルトの名無しさん:2011/04/11(月) 13:24:59.10
要素を追加するたびに改行やインデントをいれるんじゃなくて
操作しおわった最後の(直列化する)段階で清書するなら

doc = REXML::Document.new(...)
...
pprinter = REXML::Formatters::Pretty.new(4) # スペース4つでインデント
pprinter.write(doc, $stdout) # 標準出力$stdoutに書き出し

出力先は$stdout以外にFileインスタンスなんかでもOK
doc.write($stdout, 4)でもいけるんだけど今は廃止されてるとか

文字列で清書の結果を受け取る場合はとりあえずの方法
require 'stringio'
f = StringIO.new
pprinter.write(doc, f)
print f.string

830 :デフォルトの名無しさん:2011/04/11(月) 13:39:53.73
まさしく検索で見つかったdoc.writeでやってしまいました
Formattersのほう使わせて頂きます
ありがとうございます

831 :デフォルトの名無しさん:2011/04/11(月) 14:14:56.83
■test.rb
require "class1"
class1 = Class1.new()
puts class1.a()

■class.rb
class Class1
def a()
return "aaa"
end
end

クラスファイルを外部に残して、使いたいときにメインファイルから呼び出して使いたいのですが
test.rbのrequireの所でエラー(`require': no such file to load)になります
どちらのファイルも同じフォルダに入っています
どのように外部ファイルを読み込めるのでしょうか?

832 :デフォルトの名無しさん:2011/04/11(月) 14:17:52.22
すみません
require "./class1.rb"
としたら読み込めました

何故require "./class1.rb"じゃないと読み込めないのでしょうか?
何故require "class1.rb"とrequire "./class1.rb"は同じフォルダのクラスを指してないのですか?


833 :デフォルトの名無しさん:2011/04/11(月) 14:22:52.82
$LOAD_PATHにカレントディレクトリが含まれてないとか?

834 :デフォルトの名無しさん:2011/04/11(月) 14:29:58.23
というか1.9では最近含まれなくなった

835 :デフォルトの名無しさん:2011/04/11(月) 14:41:53.59
test というファイル名や Test というクラス名はあまりよくない
実害は少ないとは思うのだが

>>832
require は $LOAD_PATH の中から該当するファイルを探して読み込むのだが、
Ruby 1.9.2 からは $LOAD_PATH からカレントディレクトリが取り除かれたので
カレントディレクトリの自作ファイルを require 一発では読み込めなくなった

ただ、require でカレントディレクトリのファイルを読む事故の防止のために外してるだけなので
(たとえば、カレントディレクトリに瓜の情報を書いた uri.rb というファイルを置いて
require 'uri' すると、URL 用の組み込みの URI クラスがそれ以降どうやっても読めない)

 ・ 相対パスですとパスで明示して require './class1.rb' と書く
 ・ require_relative 'class1' と書いて、書いたファイルからの相対パスで探してもらう

ということは何も問題ない
1.9.1 以前でも動作する前者が人気

836 :デフォルトの名無しさん:2011/04/11(月) 15:04:20.11
line = STDIN.gets
case line
when 1
puts "1"
when 2
puts "2"
else
puts "none"
end

1と2を入力してもnoneが表示されます
どこか間違えてるのかアドバイスお願いします

837 :デフォルトの名無しさん:2011/04/11(月) 15:08:58.80
1.9を使っているので相対パスで./など明示的に書くクセを付けようと思います
あとFile.dirname(__FILE__) + "/class1.rb"と書く方法もあったので、気分に応じてプロジェクト毎に使い分けたいと思います
ありがとうございます


838 :デフォルトの名無しさん:2011/04/11(月) 15:21:14.88
>>836
標準入力から返ってくるものは文字列なので、 整数 1 にも整数 2 にもマッチしないので else に着く

あと標準入力は今は STDIN ではなく $stdin を使うほうがいい

839 :デフォルトの名無しさん:2011/04/11(月) 15:23:03.33
>>836
思ったとおりに動かない場合は

line = STDIN.gets
p line # <--
case line

とかする癖をつけるといいよ

840 :デフォルトの名無しさん:2011/04/11(月) 15:27:36.34
改行がくっついてるなんて思いませんでした
pってデバッグの役割みたいなものなんですね便利ですねこれは

line = $stdin.gets
case line
when "1\n"
puts "1"
when "2\n"
puts "2"
else
puts "none"
end

1\nって書くのが気持ち悪いけどRubyはこういうもなんだと言い聞かせるしかないですね

841 :デフォルトの名無しさん:2011/04/11(月) 16:11:23.87
IO#gets は行志向だから、「行」の文字列が丸ごと返る
行って言うくらいだから、もちろん改行つきだ
改行が不要な場合、ふつうは String#chomp する

line = $stdin.gets.chomp
case line
when "1"
puts "one"
when "2"
puts "two"
else
puts "none"
end

842 :デフォルトの名無しさん:2011/04/11(月) 16:35:44.81
他の言語の一行読むメソッドは行末の改行を削るものもあるから
もちろんとは言えないよ

843 :デフォルトの名無しさん:2011/04/11(月) 17:18:52.05
行は改行記号を含むだろ普通
Rubyのgetsは通常の行の概念に沿ってるというだけの話

844 :デフォルトの名無しさん:2011/04/11(月) 17:21:16.12
getsといえばC言語のgetsが真っ先に思い浮かぶなー

845 :デフォルトの名無しさん:2011/04/11(月) 17:48:19.75
ダンディ坂野

846 :デフォルトの名無しさん:2011/04/11(月) 18:04:50.59
>>843
テキストファイルの末尾が改行で終わらない場合は?
行は普通改行を含むものとしてもメリットはないと思うけどな
含んだり含まなかったりする、としておくほうが無難

847 :デフォルトの名無しさん:2011/04/11(月) 20:00:13.90
Ruby1.9.1でファイルを書き込みモードで開くときは
f = File::open("sample.txt", "w")とf = open("sample.txt", "a")どちらで書く事が推奨されてますか?
好みの問題であればFile::は省略しようと思います

848 :デフォルトの名無しさん:2011/04/11(月) 20:40:34.65
openをFile::openの略だと思っているのならそれは間違い。

849 :デフォルトの名無しさん:2011/04/11(月) 20:59:09.35
モード w とモード a もそもそも別物

850 :デフォルトの名無しさん:2011/04/12(火) 13:58:10.10
RubyでIEで開いたページ内のフォームにタイピングするマクロを作りたいのですが
どのようなキーワードで検索したらよいのでしょうか?
以前、過去スレ(過去半年分)でそういうやりかたが書いてあったのを記憶しているのですが見つかりませんでした

851 :デフォルトの名無しさん:2011/04/12(火) 14:01:27.08
watir

852 :デフォルトの名無しさん:2011/04/12(火) 15:34:27.06
初心者だけど1.9から始めてよかったと思う
言われてるほど難しいものってないよ

853 :デフォルトの名無しさん:2011/04/12(火) 16:42:36.53
難しいっていうかめんどくさいんだよ
文字エンコーディング関連

何も考えずにエラー出さないで一発で書けたことないぞ

854 :デフォルトの名無しさん:2011/04/12(火) 16:47:32.64
>>852
それ言ってたの書き込み数は多かったけど一人だけだから

855 :デフォルトの名無しさん:2011/04/12(火) 18:10:41.50
今から使うんだったら1.8使う理由ないだろ

856 :デフォルトの名無しさん:2011/04/12(火) 18:30:51.72
require "〜"
「〜」の部分の読み込む標準ライブラリ名の一覧ってマニュアルのどのページをみたらよいのでしょうか?
例えばrequire "kconv"のkconv


857 :デフォルトの名無しさん:2011/04/12(火) 18:37:53.53
http://doc.ruby-lang.org/ja/1.9.2/library/index.html
このページをお探しで?

だったら、 http://doc.ruby-lang.org/ja/1.9.2/doc/index.html

標準添付ライブラリ
・All libraries

ってところ。

858 :デフォルトの名無しさん:2011/04/12(火) 18:49:38.56
>>852
今からなら1.9でいいと思うんだけどねえ

>>853
ASCII-8BITの面倒くささ

859 :デフォルトの名無しさん:2011/04/12(火) 18:55:50.57
>>857
ありがとうございますっ!

860 :デフォルトの名無しさん:2011/04/12(火) 19:06:06.75
昔は単なるめんどくささ以上に手放しで進められる状態じゃなかったのは間違いない
で、当時お勧めされてなかったというのはそれはそれで何か問題あるの?

861 :デフォルトの名無しさん:2011/04/12(火) 19:53:54.10
まあ、いつまでも引っ張る人というのはどこにもいるものでして…

UTF-8だけ使ってると楽だよね1.9

862 :デフォルトの名無しさん:2011/04/12(火) 20:20:55.55
railsが1.9に正式対応したのが大きいんじゃない
それから一気に他のライブラリも対応したし

863 :デフォルトの名無しさん:2011/04/12(火) 20:43:07.90
>>861
問題ないなら日本語は最初からUTF-8使おうぜムーブメントの後押しをしたのは間違いない
今のRubyはたいていUTF-8だ

864 :デフォルトの名無しさん:2011/04/12(火) 20:45:16.72
テンプレはこれからも1.8.7を推進するのですか?

865 :デフォルトの名無しさん:2011/04/12(火) 20:47:59.27
EUC-JP-MSとかCP932とか難しいです

866 :デフォルトの名無しさん:2011/04/12(火) 21:08:36.88
>>864
どっちか片方なら1.8.7でいいんじゃないのかね
前にもちらっとあったが、
このスレの想定してる初心者は文字エンコーディングに関する知識もないという仮定っぽいし

867 :デフォルトの名無しさん:2011/04/12(火) 22:23:49.50
既にプログラミング言語の経験があるなら1.9.2で問題あんめえ
全くの初めてなら、悪いこと言わんので1.8.7にしとけ

868 :デフォルトの名無しさん:2011/04/12(火) 22:35:24.11
Ruby 2.0って2038年1月19日まで出ないのですか?

869 :デフォルトの名無しさん:2011/04/12(火) 22:40:55.31
>>851
ありがとうございます。試してみます

870 :デフォルトの名無しさん:2011/04/13(水) 02:54:29.74
文字エンコーディングの問題だけで1.8.7推奨してんの?

871 :デフォルトの名無しさん:2011/04/13(水) 06:06:51.94
あとはマニュアルが1.8系に比べ弱いとかが指摘されていたような

個人的には初心者も含めどんどん1.9使ってもらって
本当の初心者が1.8ではなく1.9を使うとどういうところでハマるのか
情報を蓄積していったほうがいいと思う
最初から1.9を対象にした入門書(artonさんの本とか)も出てきてるし

872 :デフォルトの名無しさん:2011/04/13(水) 06:25:32.82
>>870
あなたたちプロの人間にはたいしたことのないものかもしれませんが、
文字列操作しないライブラリなんてないんだし、
そこの使い勝手が悪いというのは初心者の全てに影響します

初心者向け解説があるならまだしも、そんなものは現存しないようだし

873 :デフォルトの名無しさん:2011/04/13(水) 06:36:40.28
>>872
1.8で日本語文字列の長さを得るのってどうやってやるんだっけ?

874 :デフォルトの名無しさん:2011/04/13(水) 06:38:55.80
…まあ、誰が人柱になるか、人柱になったあとのフォロー体制が整っているかという問題は大きい
初心者が飛び込んで怪我しても大丈夫な環境が用意されているかというと、かなり怪しいなw
Cと英語が読めて当たり前というのはかなり人を選ぶという自覚くらいは持って頂きたいところ

875 :デフォルトの名無しさん:2011/04/13(水) 06:46:40.18
Cは読めなくても何とかなるが
英語が読めないと、エラーメッセージの意味がわからなくて致命的だからな・・・
「なんかよくわからんけど日本語処理でエラー出た」で諦めてしまう

876 :デフォルトの名無しさん:2011/04/13(水) 06:50:33.56
>>873
require 'kconv'
str = "日本語deアベシ".tosjis
p str.split(//s).size #=> 8

正規表現でうまく拾えない場合はアウト

877 :デフォルトの名無しさん:2011/04/13(水) 06:54:18.73
>>876
半角カタカナをkconvすると全角になるのでコード自体0点

878 :デフォルトの名無しさん:2011/04/13(水) 06:56:43.12
文字数なんだから全角であってんじゃん
もしかして濁点が文字だとか思ってる韓国人?

879 :デフォルトの名無しさん:2011/04/13(水) 06:57:32.22
>>876
>>872に皮肉で言ったに決まってるだろ察しろよこのすかぽんたぬす

880 :デフォルトの名無しさん:2011/04/13(水) 07:03:57.01
>>873 >>876
jcode.rb

881 :デフォルトの名無しさん:2011/04/13(水) 07:06:05.15
>>880
あれ戻ってこないから嫌いなんだよね
使い終わったら jcode.rb の効果を取り除くとか、そういうことができれば使い倒したんだけど…

882 :デフォルトの名無しさん:2011/04/13(水) 07:09:32.24
昔は標準のメソッドを書き換えるのがクールだったんだよ

883 :デフォルトの名無しさん:2011/04/13(水) 07:10:57.37
まだobsoleteになってなかったのか

884 :デフォルトの名無しさん:2011/04/13(水) 07:27:13.54
リテラルで半角カタカナになってる以上、変換後も半角カタカナだと「思ってた」はず
そうでないなら "日本語でアベシ" と全角で書けばいい
リテラルでは半角カタカナだったけどメソッドチェーンで全角に即変換されて消えるんですねえ、なんてのに教育的効果はねえ
変換後も人間に読める形の(それこそ文字数同じの)リテラルで普通に書けるんだから、
だったら最初から変換後のをわかりやすく書いと毛

>>881
jperl みたいなもんだなあと思って見てた(Java Perl ではなく Japanese Perl のほう)
動作書き換えすぎて jcode がないと保守できないコードになる上に
日本語知らないライブラリでのバグも増えそうだったので、早々に使うのやめちゃったよ

885 :デフォルトの名無しさん:2011/04/13(水) 08:28:55.24
半角カタカナの文字数を数えるサンプルなのに全角で書いたら意味ないじゃんw

886 :デフォルトの名無しさん:2011/04/13(水) 10:39:45.05
htmlとcssしかできない初心者だけど
初めての言語がRuby1.9だけど別に1.9でもいいかなと思ってるよ

887 :デフォルトの名無しさん:2011/04/13(水) 11:49:43.90
違う文字コードのデータを扱う時点で、
何も知らない超初心者を想定するというのがおかしい。

888 :デフォルトの名無しさん:2011/04/13(水) 12:03:27.08
プログラム経験者ですが文字コードがサッパリなんで1.8のままだよ

889 :デフォルトの名無しさん:2011/04/13(水) 12:09:59.50
1.8 はあと 10 年くらい使われる

890 :デフォルトの名無しさん:2011/04/13(水) 12:20:39.28
新しいものに移行できない老害は1.8を使い続けるしかないもんな

891 :デフォルトの名無しさん:2011/04/13(水) 21:43:01.90
numericの「5」を「+5」という風に表示するにはどうすればいいのでしょうか?


892 :デフォルトの名無しさん:2011/04/13(水) 21:51:21.97
以下のようなテキストファイルがあります

{
ここに不特定の文字列が何十行にも入ります
}

ファイルの最後には必ず}の文字列があります(前後にタブや改行を含む場合あり)
ファイルの最後の}を見つけて、}の前に特定の文字列を追加したいのですが
ファイルの最後の}を見つけて}を「特定の文字+}として置換したらいいのかなと考えてます。
このファイルの最後の}の見つけ方はどうやって見つけたらよいでしょうか?
}はファイルの最後だけでなく、ファイルの途中に何度も出てきます

893 :デフォルトの名無しさん:2011/04/13(水) 21:58:07.82
正規表現

894 :デフォルトの名無しさん:2011/04/13(水) 22:04:39.70
>>891
printf("%+d", 5)
s = "%d" % 5; printf(s)

>>892
idx = text.rindex('}')
text[idx] = "特定の文字+}"

895 :894:2011/04/13(水) 22:06:15.61
ああっと訂正
s = "%+d" % 5; printf(s)

896 :デフォルトの名無しさん:2011/04/13(水) 22:29:59.83
% が既に sprintf なので、printfじゃなくてprintね。


897 :891:2011/04/13(水) 22:50:18.10
なるほどありがとうございました


898 :デフォルトの名無しさん:2011/04/13(水) 23:13:45.30
>>894
ありがとうございます

899 :デフォルトの名無しさん:2011/04/13(水) 23:37:36.75
なんだろう、今までケンカで明け暮れて警察に何度も補導されるような人生を送ってきたのに
ここの人たちは皆俺に優しくしてくれる

900 :デフォルトの名無しさん:2011/04/13(水) 23:45:48.40
>>896
ああそうか。指摘ありがとう超ありがとう

901 :デフォルトの名無しさん:2011/04/14(木) 11:43:55.91
Windowsでメジャーな開発環境を教えてください

902 :デフォルトの名無しさん:2011/04/14(木) 14:44:38.44
python それは吸引力の衰えないただ一つの(ry

903 :デフォルトの名無しさん:2011/04/14(木) 15:15:20.45
>>902
アクティブ何とか

904 :デフォルトの名無しさん:2011/04/14(木) 20:07:21.50
実行環境
OS名:Ubuntu10.04
Ruby:Ruby1.8.7

【やりたいこと】
>>
愛/あい 藍/あい AI/あい
朱/あか 赤/あか AKA/あか
<<
これを
>>
愛 藍
朱 赤 AKA
<<
と言う形で一括置換をしたいです
ひとまず
各行をstrに格納して
str.gsub(/\/.*\s/,"")としてみたのですが思うように動きませんでした.
どうすればよいのでしょうか?よろしくお願い申し上げます.


905 :デフォルトの名無しさん:2011/04/14(木) 20:17:27.58
愛 藍 AI
朱 赤 AKA

じゃないの?

str.gsub(/\/[^\s]+/,'')

906 :デフォルトの名無しさん:2011/04/14(木) 20:18:12.58
>>905
そうです.
ありがとうございます.

907 :デフォルトの名無しさん:2011/04/14(木) 21:13:47.34
スラッシュが正規表現リテラルに入るときは高確率で %r 使う俺。

908 :デフォルトの名無しさん:2011/04/15(金) 11:06:24.00
軽量言語というのはプログラマーに取って負担が少ないという話を聞いて、勉強しやすいのかなと思いましたが
Rubyは初めてプログラミングに手を出す者が学ぶ言語としては難しい方でしょうか?

909 :デフォルトの名無しさん:2011/04/15(金) 11:24:45.31
プログラミング言語を勉強して何をやりたいかによる

言語の勉強が目的なら他の言語にしておけ
就職や転職に有利なのがいいならJavaとかC#にしておけ
「ふつうのWindowsプログラム」を作りたいなら他の……、まあ、とりあえずRuby以外にしておけ
シェアウェア(死語?)で小遣い稼ぎとかしたい場合も他の言語にしておけ
レンタルサーバとか借りてなんか自作で投稿とかデータとかのサイトみたいなの作りたい場合も、
そのレンタルサーバでRuby1.8.7以降が使えるかどうかを先にチェックだ

これらを踏まえてなお「そういうことを欲しない」のなら、
Rubyはそんなあなたにとっておおむね読みやすく書きやすくちょっぴり遅い
全くの手探りで進められるほどのシロモノではないが、解説なり教科書なりがあれば問題はなかろう

910 :デフォルトの名無しさん:2011/04/15(金) 11:37:43.73
全くのプログラミング初心者にRubyをやらせて挫折したって話は聞いたことがない。
本当の意味で使いこなすには程遠いが、やりたいことを動かすまでのハードルは低いかと。

911 :デフォルトの名無しさん:2011/04/15(金) 11:43:22.92
>>910
じゃあとりあえずメモ帳作りたいですみたいなこと言い出したらどうしようもないぞ
メモ帳作りたいならRubyやらせるべきじゃないだろ
どう言い訳しても少なくとも「めもちょうのぶぶん」はRubyではないわけで

プログラムには標準入力と標準出力があって〜これがWebでは〜みたいな話をするには最適だが、
そういったものを望んでプログラミングを始める人がいるとはそうそう思えん

912 :デフォルトの名無しさん:2011/04/15(金) 11:47:02.31
>>911
どうだろうねえ

というかもう若くないし若い人べったりの環境でもないので、
今の「プログラム作ってみたい」と考える人が思うところのプログラムがナニを指してるのかよくわからん
昔は、えー、そうだな、20世紀は完全に プログラム=クライアントサイドプログラム で、
Windowsで動くexeでインストーラがあってウィンドウが出てマウスでぽちぽち音がジャーンみたいなのがそうだったんだけど、
今の人はプログラムと言うとサーバサイドのプログラムも考慮に入れてくれてるもんなのかね

913 :デフォルトの名無しさん:2011/04/15(金) 11:47:10.80
Rubyは入門しやすい
Rubyは万能ではない
ただそれだけ

914 :デフォルトの名無しさん:2011/04/15(金) 11:51:29.96
>>911
んー、そこまで過保護にしなくてもいいのでは。

915 :デフォルトの名無しさん:2011/04/15(金) 11:56:27.09
このスレいちいちレスがくどいw

916 :デフォルトの名無しさん:2011/04/15(金) 12:05:43.86
じゃああっさりめの回答

いいんじゃないかな
とりあえず入門書一冊買ってRubyインスコして試してみては

917 :デフォルトの名無しさん:2011/04/15(金) 12:09:09.96
Windowsで動かすプログラム作りたいなら最初は他のやれ
サーバ上のは得意だがレンタルサーバでRuby1.8.7が動くかどうか先に調べれ
Rubyそのものは難しくはないが、あなたの想像していたものの7割くらいはそもそも作れない

918 :デフォルトの名無しさん:2011/04/15(金) 12:51:36.58
>>908
僕はプログラミング初心者ですがRubyは判りやすいと思いますよ
本当はGoogleApiEngineで無料サーバとして使いたいのでJavaかPythonを覚えたかったのですが

919 :デフォルトの名無しさん:2011/04/15(金) 12:57:12.72
前はマクロとして使ってたけど
今じゃrailsにしか使ってないわ

920 :デフォルトの名無しさん:2011/04/15(金) 14:11:49.50
HSPでいいんでないの?

921 :デフォルトの名無しさん:2011/04/15(金) 15:38:16.26
Rubyの学習は非線形でガクガク、躓く箇所がある。
暗黙にプログラミングの常識を要求する=LL的よくあるコードは楽

Pythonの学習曲線は平坦でつまずく箇所が少ない。暗黙知の代わりにPythonそのものの知識をかなり要求する=面倒だが潜在的な汎用性がある?
あとPythonのサイトには初心者と超人の中間が大勢いるけど、Rubyのサイトにはいない

学習前のリサーチではこんな印象でした
プログラミングの抽象度が高く初期の学習がスムーズなのでは、と思ってRubyをはじめました
あってるかどうかは判りません

922 :デフォルトの名無しさん:2011/04/15(金) 15:43:07.98
rubyというかブロックというか、
便利なフリして下手したらメンテしにくい、
ごっつごってごてぐっちゃぐちゃの構造へ突っ走ってる時はある。

923 :デフォルトの名無しさん:2011/04/15(金) 17:12:21.67
>>922
じゃあRuby以外のプログラムはメンテナンスしやすいんですね!!

924 :デフォルトの名無しさん:2011/04/15(金) 17:25:16.75
ブロックってメソッド呼び出しに局所化されているから
メンテしにくさとは逆を行ってないか?

925 :デフォルトの名無しさん:2011/04/15(金) 17:47:12.82
>>923が真理だと思う
たぶんそれは言語の特性ではなく単に書く人のせいだw

926 :デフォルトの名無しさん:2011/04/15(金) 17:49:55.48
だらだらブロックのネストを書いたりと
読みにくく、手を入れにくくする方法は沢山あるから、
この辺りは、どんな言語でも、書き手次第だろうね。

927 :デフォルトの名無しさん:2011/04/15(金) 18:50:35.27
内側から読まないと意味のわからないネストとかね

928 :デフォルトの名無しさん:2011/04/16(土) 00:47:35.16
コミッタの質がここまで低い言語は他に無いと思うよ

929 :デフォルトの名無しさん:2011/04/16(土) 02:26:09.08
RubyMineというIDEを使い始めたのですがマルチバイト文字をコンソールに表示させたときの挙動で躓きました

puts "あ" #=> あ
print "あ" #=> あ

p "あ" #=>"\343\201\202"
pp "あ" #=> "\343\201\202"

この挙動の違いはIDE自体に問題があるのか、それともrubyのpやppが特別な動きをしているのでしょうか?
NetbeansなどのIDEでは普通にマルチバイト文字を表示できていましたので戸惑いました

930 :デフォルトの名無しさん:2011/04/16(土) 02:51:24.42
中学生でもスーパーRubyハッカーというのに、お前らときたら・・・
ttp://www.atmarkit.co.jp/news/201104/14/sora.html

931 :デフォルトの名無しさん:2011/04/16(土) 02:53:59.75
>>928
ま、コミッタがコミットしてRuby作っていったんだけどね。
ブロックやネストの話からコミッタにまで普通話が飛ぶか?

Rubyにまでやってきて一々嫌味いいたいんですね。
これだからPythonの馬鹿には手を焼くんだよなあ
┐(´д`)┌ヤレヤレ

932 :デフォルトの名無しさん:2011/04/16(土) 07:23:17.35
>>929
NetBeans なんかのほうが通常ではない動作をしている

Ruby 1.8 において、本来、使用日本語に関する情報が何もなければ、
非アスキー文字の含まれる文字列に対する String#inspect、
つまりそれを引数にとった関数的メソッド p はバイナリ表記をする
(Ruby 1.9 では日本語として区切って表示するようになってしまった、個人的には改悪)

p はデバッグ表記用メソッドなので、
人間に読めるように表示したいなら人間表示専用の puts や print 使え

なお、 ruby の起動時に -Ku や -Ks などで日本語モードが指定されてると、
String#inspect は日本語体系がそれであるとみなしてバイナリを区切って表示する
「何もしてない」のに Ruby 1.8 の p で日本語が表示できる場合、
どこかの誰かがあなたに無断でそれを指定している
(IDE内コンソールである場合は、勝手に変換している可能性すらある)
$KCODE="u" や $KCODE="s" をスクリプト内で誰かが指定していても同様

933 :デフォルトの名無しさん:2011/04/16(土) 09:32:02.57
「文字列を絶対に10進表記にして表示する」という簡便な一発メソッドがあればよかったのに

934 :デフォルトの名無しさん:2011/04/16(土) 09:48:31.02
何が何でも無理やり10進表記してくれるto_iがあるじゃないか
というか具体的な入力と出力をplz

935 :デフォルトの名無しさん:2011/04/16(土) 09:53:08.70
>> "アホか".to_i
=> 0

936 :934:2011/04/16(土) 10:43:37.51
>>935
「何が何でも無理やり」ってのはその挙動を指してるんだけど
to_iにしても10進表記にしてるわけじゃなくて単に整数にしてるだけだね
変なレスして失礼しました

937 :デフォルトの名無しさん:2011/04/16(土) 11:50:12.15
String#dump

938 :デフォルトの名無しさん:2011/04/16(土) 11:53:44.23
>>937
dump は p と死ぬほど相性が悪いので嫌い

まあこのへん推し進めると文字列自体にエンコーディング情報くっつける Ruby 1.9 になるんだがw

939 :929:2011/04/16(土) 12:03:50.47
>>932
IDEのRuby起動オプションに-Kuを追加することでpでも日本語を表示できるようになりました
わかりやすい説明ありがとうございます 勉強になりました

940 :デフォルトの名無しさん:2011/04/16(土) 19:54:44.45
下のunlessのような条件分岐はどういう意味があるのでしょうか?
基本は
unless ?? then
??
end
って感じで覚えていたので少し混乱しています

str.each_char do |c|
count[c] = 0 unless count[c]
count[c] += 1
end

941 :デフォルトの名無しさん:2011/04/16(土) 20:06:45.75
if と unless は(Perlのように)後置できる

式 if 条件



if 条件 then
 式
end

と同じだ
1行で書けて便利、という程度の意味

str.each_char do |c|
 unless count[c] then
  count[c] = 0
 end
 count[c] += 1
end

942 :デフォルトの名無しさん:2011/04/16(土) 20:11:26.85
nilが入ってたら0で初期化して1増やすってコードだな

943 :940:2011/04/16(土) 20:20:40.18
なるほどそうだっんですね。
お二方ありがとうございました!

944 :デフォルトの名無しさん:2011/04/16(土) 20:57:19.56
いえいえどういたしまして

945 :デフォルトの名無しさん:2011/04/16(土) 21:55:20.78
a += 1 は a = a + 1
だけど
a ||= 0 は a = a || 0 ではなくて
a || a = 0

で、あってる?


946 :デフォルトの名無しさん:2011/04/16(土) 22:10:03.35
たしかそうだけど何が違うんだっけと思ったらちゃんと書いてあった
ttp://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html

947 :デフォルトの名無しさん:2011/04/16(土) 22:30:51.84
へぇそんな違いがあったのか。
無駄な代入処理を行わないための仕様なのかな?

948 :デフォルトの名無しさん:2011/04/16(土) 23:57:51.72
nullをnilって書かないといけないのに違和感
nullって書かせてくれよ

949 :デフォルトの名無しさん:2011/04/17(日) 00:01:54.50
>>947
というより ||= 演算子自体が
「最初に使われるときには初期化、次回以降はスルー」って処理を意識してると思われ

950 :デフォルトの名無しさん:2011/04/17(日) 00:10:25.58
>>948
nullとnilとの違いとかそういう話?
元々は形容詞と名詞の違いらしいし
厳密な区別なんてせずに片方で良いと思うが…

使うのがnullじゃないとヤダヤダってんなら
他にも色んな言語がやれなくなるな
NoneとかNothingとか、相当する要素は色々あるから

951 :デフォルトの名無しさん:2011/04/17(日) 09:16:25.30
>>948
一般的な null とは違うので nil と呼ぶ
null やundef は予約語的な「無」だが、nil は NilClass のインスタンス(オブジェクト)だ
無であるならメソッドを受け付けないはずだが、メソッドだってきちんと動作する
「とりあえず全部オブジェクトにしようぜ」というコンセプトのもと、
いわゆる null や undef を表すために作られた決め事

…まあ、だからわざわざ lisp の言葉を持ってきたんだろう
これが null オブジェクトまたは予約語 null だったら大混乱必至だったと思う

952 :デフォルトの名無しさん:2011/04/17(日) 10:10:05.08
※よろしくお願いします。
ruby で,あるページを取得したのですが、

『フレーム対応のブラウザでない場合は、本画面が表示されます。』

と返ってきます。どうすれば、ページの文字列を取得できるのでしょうか??

953 :デフォルトの名無しさん:2011/04/17(日) 10:12:00.37
それ、取ってきたページのNOFRAMES要素が見えてるだけじゃねーの?
取ってきたページのFRAME要素のSRC属性のURLにさらにリクエストかければいいんじゃねーの?


954 :デフォルトの名無しさん:2011/04/17(日) 10:27:52.87
>>931
Pythonの悪口を言っている奴がいると聞いてすっ飛んできました。
(#゚Д゚)ゴルァ!!

http://hibari.2ch.net/test/read.cgi/tech/1302692765/85
[ プログラム ] 【Perl,PHP】LLバトルロワイヤル16【Ruby,Python】

85 名前:デフォルトの名無しさん [sage]: 2011/04/16(土) 23:46:38.57
ここ、Rubyの関係者が粘着してるだろ。
なんだよ、>>79-80 からの話題替えはw
この流れはまずいって思ったんだろうなw

Rubyのコミッタのつぶやきまとめ

http://twitter.com/nari3/statuses/57992001030860801
nari3: "Rubyの力でたのしいなかまがぽぽぽ〜ん at RubyKaigi2011"

http://twitter.com/sora_h/status/2906062620
学校で今日はちょっと別のところに自転車で移動したんだけど、そこで学校に戻る
ときに豚同級生がカギをなくして、30分位まってた後に結局ポケットにあったとか
言って皆キレる。俺は「ヴァカだろ死ねよ!!」って言っておいた。同級生いじめは
ストレス解消。 12:37 AM Jul 29th, 2009 YoruFukurouから 1人がリツイート

http://twitter.com/sora_h/status/10014881594
皇太子の子供が不登校になったと聞いて。いじめか、いい
ぞもっと(ry なんでもないです。 12:59 AM Mar 5th, 2010 Termtterから

ガベージコレクションのアルゴリズムと実装 [単行本]
"http://www.amazon.co.jp/ガベージコレクションのアルゴリズムと実装-中村-成洋/dp/4798025623"

中村 成洋 (著) 相川 光 (著) 竹内 郁雄 (監修)

955 :デフォルトの名無しさん:2011/04/17(日) 10:29:20.09
せめて初心者じゃない方荒らしてくれ

956 :デフォルトの名無しさん:2011/04/17(日) 10:40:48.32
>>952
HTML に関する知識がないご様子
HTML の基本的な勉強してからやろう
そっちのほうが躓くことなくスムーズにコトが進むぞ

957 :デフォルトの名無しさん:2011/04/17(日) 10:49:23.69
PHPみたいにHTMLに<?php〜?>でRubyを埋め込んで利用する方法って用意されてますか?

958 :952:2011/04/17(日) 10:57:52.99
>>953
ありがとうございます。
自分はOperaを使ってるんですが、Operaで、
[ページのソースを表示]っていうメニューをクリックすると『フレーム対応でないとだめ』
のソースが表示され、
[フレームのソースを表示]っていうメニューをクリックすると、目的のページソースが表示されます。

しかし、目ぼしいSRCは記述されておらず、ruby でどうやればフレーム内のソースを取得できるのか
困ってます。。。

どなたか、ヒントだけでもいいので、何かありませんでしょうか?


959 :デフォルトの名無しさん:2011/04/17(日) 11:01:30.57
urlもhtmlもさらさずにエスパーしろと言われても無理。
まずはhtmlのframeの項の説明読もうよ。すっごい簡単だから。

960 :デフォルトの名無しさん:2011/04/17(日) 11:02:51.96
>>956
偉そうな講釈は結構。


961 :デフォルトの名無しさん:2011/04/17(日) 11:07:06.57
ヒント: えちいサイトだろうが気にせずURLを貼る

962 :デフォルトの名無しさん:2011/04/17(日) 11:07:13.08
>>960
優しい先生が欲しいならお金払わないと

963 :953:2011/04/17(日) 11:16:35.14
>>953
ありがとうございます。取れました。

964 :デフォルトの名無しさん:2011/04/17(日) 14:24:05.29
Rubyコミュニティは厨の匂いがプンプンしますね

965 :デフォルトの名無しさん:2011/04/17(日) 17:46:05.15
Mac上のRuby(1.8.7)でコマンドラインプログラムを作っています。

Terminal.appを立ち上げてSTDIN.getsでユーザーに文字入力させる
のですが、日本語文字列を入力するとき、deleteキーでの消去が
文字単位にならず、何とも微妙な感じです。

1文字消すのにdeleteの打鍵が2回必要だったり、文字列によっては
最後まで消去できなかったりして(実際には消えているようですが
画面には残ります)ストレスがたまります。

ちなみにTerminalで普通にシェルを使うときには上記の問題は
でません。アドバイスよろしくお願いします。

966 :デフォルトの名無しさん:2011/04/17(日) 18:00:25.74
そのへんの環境揃えるのめんどくさいんだよね

require 'readline'
while s = Readline.readline("INPUT>", true) do
p s
end

967 :965:2011/04/17(日) 18:48:31.50
>>966
ありがとうございました。うまく行きました。
Readlineは聞いたことがありましたが、
こういうときに使うものなんですね。

968 :デフォルトの名無しさん:2011/04/17(日) 19:02:09.57
RubyInstallerで入れたのですがTKが入っていませんでした
TKはどのサイトから入手できますでしょうか?
gemからインストールする事は出来ないのですか?

969 :デフォルトの名無しさん:2011/04/17(日) 19:15:17.18
だから入ってないの当たり前だってそもそも入れてないんだから
ttps://github.com/oneclick/rubyinstaller/wiki/faq#bundled_short

で、Tk が必要なのに RubyInstaller を選択したお間抜けさんは通常は Ruby/Tk Kit を使う

970 :デフォルトの名無しさん:2011/04/17(日) 19:33:59.77
RubyInstallerめんどくさいよね…

971 :デフォルトの名無しさん:2011/04/17(日) 19:35:43.83
このスレWindowsネタになると変なスイッチ入っちゃう人いるのねw

972 :デフォルトの名無しさん:2011/04/17(日) 19:37:49.72
初心者スレなのにね

973 :デフォルトの名無しさん:2011/04/17(日) 19:45:43.02
>>970
お勧めされてないのには理由があるってことだな
素直にActiveScriptRuby使え

974 :デフォルトの名無しさん:2011/04/17(日) 19:57:38.03
aptで入れろよカス

975 :デフォルトの名無しさん:2011/04/17(日) 21:56:43.31
標準添付と銘打たれているライブラリが、さりげなく入ってないのはtrapだよな・・・
お間抜けさんというか、多くの初心者はRuby/Tkも入ってると思うだろう

まあRubyInstaller以外でも似たようなのはあるから、どっちもどっちではあるけど

976 :デフォルトの名無しさん:2011/04/17(日) 22:02:14.50
ASRが意図的にてんこもりなんだよね
いらん物までゴテゴテついてるという見方もできなくもない

977 :デフォルトの名無しさん:2011/04/17(日) 22:58:27.30
Pythonみたいに公式でWindows用バイナリが配布されてて
Tkinter込みなので、そのままTkが動かせるのはいいなぁと思う


978 :デフォルトの名無しさん:2011/04/17(日) 23:08:09.25
Pythonは公式が大量のライブラリ添付する方針だからな

979 :デフォルトの名無しさん:2011/04/17(日) 23:30:18.68
Windows7でActiveScriptRubyをインストールして
gem installすると
ERROR: While execution gem ... (Errno::EACCES)
Permission denied - C:/PROGRA~1/ruby-1.8/bin/rackup.bat
ってエラーがでてうまくいかないのはなぜ?
そのディレクトリは書き込み可能にしてるんだけど。

980 :デフォルトの名無しさん:2011/04/18(月) 00:09:39.05
asrって古いからいやです
新しいものを使いたいのでriを使いたいのです

981 :デフォルトの名無しさん:2011/04/18(月) 01:37:56.22
riと書くとリファレンス閲覧ツールのほうと間違えるから略さないほうがいいよ。
文脈で違うと分かるけどさ。


982 :デフォルトの名無しさん:2011/04/18(月) 06:46:18.67
>>979
エラーとしてはまあそのまんま
そのファイル「が」パーミッションのエラーを起こしてる
そのファイル「で」パーミッションのエラーを起こしてるんじゃないので、bin/ だけいじってもダメ
gem install -V hogehoge すると、たぶん該当フォルダの書き込み表示したところでエラーだ

いくつか方法はあるんだけど、gem をホームのフォルダに user-install してしまうというのはどう
ユーザーのホームのフォルダの中にある .gemrc という6文字ファイルの先頭が

---
gem: "--user-install"

という2行になるように編集
それ以降、gem はすべてホームのフォルダの .gem/ というフォルダの中に入る
あと、rubygems 本体の更新ができないので
 C:\Program Files\ruby-1.8\lib\ruby\bin
 C:\Program Files\ruby-1.8\lib\ruby\vendor_ruby
の2つの書き込み権をrubyさんかgemさんのどっちかに対してどうにしかしておく

何からの理由でユーザーインストールせずパーミッションだけで解決したい場合は、上記の2フォルダに加えて
 C:\Program Files\ruby-1.8\lib\ruby\gems
の3つくらいに対して、rubyさんかgemさんが書き込み可能にしておく

983 :デフォルトの名無しさん:2011/04/18(月) 10:55:08.92
>>982
サンクス。
ちょっと今時間がないので、試したらまた報告します。

294 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)