Ruby 初心者スレッド Part 28

このエントリーをはてなブックマークに追加
1one
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】
   【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
    ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です

関連スレや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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2one:2009/05/16(土) 10:08:33
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
http://www.amazon.co.jp/dp/4797336617/
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
「初めてのRuby」
http://www.amazon.co.jp/dp/4873113679/

以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください
「Rubyレシピブック 第2版 268の技」(初心者向け)
http://www.amazon.co.jp/dp/4797340045/
「プログラミング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/
3one:2009/05/16(土) 10:09:14
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/
4one:2009/05/16(土) 10:09:55
関連スレ

本スレ
Rubyについて Part 35
http://pc12.2ch.net/test/read.cgi/tech/1238194350/

アンチスレ
Rubyについて(アンチ専用) Part003
http://pc11.2ch.net/test/read.cgi/tech/1207233348/

Railsスレ
【Ruby】Ruby on Rails Part7
http://pc11.2ch.net/test/read.cgi/php/1241100447/

Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc11.2ch.net/test/read.cgi/tech/1155031689/

Ruby 1.9 系列スレ
魁け! Ruby 1.9.X
http://pc11.2ch.net/test/read.cgi/tech/1201603546/
5デフォルトの名無しさん:2009/05/16(土) 10:16:28
いちおつ
6デフォルトの名無しさん:2009/05/16(土) 11:33:25
ポーニテールなんだからね!
7デフォルトの名無しさん:2009/05/16(土) 13:00:41
前スレより:
>982 名前: デフォルトの名無しさん Mail: 投稿日: 2009/05/16(土) 04:43:41
>ruby1.8.6です。
>ファイルアクセスが他のソフトとぶつかる場合で質問です。
>
>Rubyで周期的にXMLファイルを上書きしていますが、この上書きのタイミングと
>他のソフトによるXML読み込みが衝突した場合(と思われる時)、
> in 'initialize': Permission denied - new XML.xml (Errno::EACCES)
>
>というエラーメッセージが出ます。
>そこでRubyの振る舞いとして、他のソフトがファイルアクセス中は上書きを延期するか、
>あるいは別の方法で衝突を回避したく思います。
>何か良い方法はありますでしょうか?
>
>なお別のソフト側で衝突回避を試みましたが、上手くいかないためRubyに望みを
>託すことにしました。
8デフォルトの名無しさん:2009/05/16(土) 13:02:31
>>7
File#flock を使ってロックすればいいんじゃないでしょうか。

File.open('file.xml', 'w') do |f|
 f.flock(File::LOCK_EX)
 f.write('<?xml version="1.0" ?>')
end

でどうよ?
9デフォルトの名無しさん:2009/05/16(土) 13:07:35
>>8
Perlなんかでやってたときは、そのロックだと
ファイルの書き込みオープンでファイル空っぽ
 →(他のプロセスからの読み出しの可能性)
 →ファイルロック
になるから駄目、だったような。
Rubyのブロックでその辺どうなるんだろ
10デフォルトの名無しさん:2009/05/16(土) 13:25:42
このスレって前スレ書かないんだな

Ruby 初心者スレッド Part 27
http://pc12.2ch.net/test/read.cgi/tech/1238632943/
11デフォルトの名無しさん:2009/05/16(土) 13:52:09
すまん、前スレにもなかったもんで。書いとくもんかな?
12デフォルトの名無しさん:2009/05/16(土) 13:58:53
>>9
マルチプロセスだからブロックだろうとなんだろうと関係ない。
・非破壊的にopen
・ロック
・上書き
とやらないとダメだろう

File.open('file.xml', 'r+') do |f|
 f.flock(File::LOCK_EX)
 f.truncate(0)
 f.rewind
 f.write('<?xml version="1.0" ?>')
end
13デフォルトの名無しさん:2009/05/16(土) 14:01:32
でもinitializeでEACCESってことは、その「他のソフト」側はロックじゃなくて
書き込み禁止にしてるような気がするんだが。
そうなるとロック以前にエラーになるわけで、ポーリングしかないんじゃないかな。
14デフォルトの名無しさん:2009/05/16(土) 14:15:40
flockはNFS越しだと通らなかったりするから
使わない方がいいと思う
15デフォルトの名無しさん:2009/05/16(土) 16:40:28
前スレ1000はRuby的には10**3だな。
16デフォルトの名無しさん:2009/05/16(土) 17:34:47
1_000とか
17デフォルトの名無しさん:2009/05/16(土) 18:37:17
どうも。前スレの982です(ファイルアクセスが他のソフトとぶつかる場合で質問)。
前スレ>>983さん,本スレ>>7-9>>12-14さん、有難うぎざいます。

細かい点ですが、

前スレ>>983
直接
 File.open(path,'w'){|f| f.write(data)}
するのではなく
 File.open(path_v,'w'){|f| f.write(data)}
 File.rename(path_v, path)

ここで、path でなく path_v としているのは、
何か意味があるのでしょうか?
18デフォルトの名無しさん:2009/05/16(土) 18:46:57
ファイルのロックとはあんまり関連しないが、別名ならなんてもいいんじゃね

というかその質問をするってことは動作の意図わかってないんか
19デフォルトの名無しさん:2009/05/16(土) 19:23:07
>>14
最近の Linux だと NFS でもちゃんと flock できたりするから驚きだ。
20デフォルトの名無しさん:2009/05/16(土) 20:07:01
>>17
詳しくないけど、

・排他ロックしてないけど、書き込み途中(=壊れた状態)のファイルを読まれる心配がない。
  (そんなことできるのかどうか知らないけど。)
・万一書き込み中にこけてもデータが壊れない。

って感じではないかと。
2117:2009/05/16(土) 21:54:36
>>18, 20
色々有難うございます。

試しに例外処理を
begin
File.open('newXML.xml', 'w') {|f|
f.write new_xml
}
rescue
puts "XML, unable!"
end

の形で使ったところ、衝突中は上書きがスキップされますが
強制終了は無くなりました。
22デフォルトの名無しさん:2009/05/17(日) 02:33:30
Rubyの実行で質問です。

現在、勉強用に買った書籍付録の実行環境+DOSプロンプトで例えばABC.rbを
 C:\>ABC.rb
などどして実行していますが、アイコンクリックなどの方法で実行する
ことは出来ますか?
23デフォルトの名無しさん:2009/05/17(日) 02:46:51
できるけど、標準出力の特性上、意図したとおりの動作にはならないと思われ
ダブルクリックで実行したいのなら自前でウィンドウ作る言語やったほうがいいぞ
24デフォルトの名無しさん:2009/05/17(日) 02:58:33
>>22
Exerbを使えば実行ファイルにできる

ただ、普通の(標準入力や標準出力を使う)スクリプトだと
実行してすぐにウインドウが閉じるので、あまり意味をなさない
RubyでGUIアプリケーションを作るのなら役に立つ
25デフォルトの名無しさん:2009/05/17(日) 03:26:55
>>22
可能
ただし、設定方法はOSによって異なる
「拡張子 関連付け」で検索
26デフォルトの名無しさん:2009/05/17(日) 03:46:18
>>22
たぶん、CUIに慣れていないってことなんだろうか。
キーボード入力が不慣れってことならどうしようもないけど、それはプログラミングの
上では避けては通れないので、ないことにして。
勉強の為なら、>>23-24の言うとおり、とにかくまずは標準入出力での試行錯誤が
気楽で楽しいかも。そのためには・・・

まず、Windowsのコマンドプロンプトを、少しでも使いやすくすることを考えてはどうか。
Windous2000以上なら、DOS窓でも入力補完機能が付いている。
ショボいけど、ヒストリー(コマンド履歴)機能もある。
これらを知ってると知らないとでは、かなり違うはず。
ttp://journal.mycom.co.jp/special/2002/xpcommand/001.html

あとそれでも不満なら、補完ツールを入れるという手段もある。
たぶん、ckw + NYACUS(or PowerShell) って人もそれなりにいるかと思う。
ttp://d.hatena.ne.jp/hideden/20071115/1195229532

とりあえず参考になれば。
2726:2009/05/17(日) 03:48:15
×Windous2000
○Windows2000
これは恥ずかしい;;
見なかったことにして・・・。
28デフォルトの名無しさん:2009/05/17(日) 03:52:42
>>23-24
thx
Exerbは確かに直ぐに終了しますが、puts "Hello, World" も

puts "Hello, World"
sleep 2

と小細工すれば動作確認出来ました。
29デフォルトの名無しさん:2009/05/17(日) 04:02:10
>>28
pts "Hello, World"
sleep 2

って書いてみ
3022&28:2009/05/17(日) 04:03:04
大変失礼しました。動作環境を書いていませんでした。

OS) WinXP-Pro(SP2)
Mem) 4GB(実質3.24GBですがw)
Ruby) 1.8.6


>>25-26
有難うございます。
31デフォルトの名無しさん:2009/05/17(日) 04:55:44
ruby %* | pause

確か、こんな感じのdo_ruby.batファイルとか作って.rbに関連付けておけばよかった気がした。
失敗した時だけ待つ

常に待つなら、

ruby %*
pause
32デフォルトの名無しさん:2009/05/17(日) 05:04:21
まー実際問題としてはいちいちダブルクリックとかフォーカス当ててEnterとかやってられんのだがね
33デフォルトの名無しさん:2009/05/17(日) 05:16:27
まあ、世の中には少しだけ便利なバッチファイルとしてrubyを使う人も
いるわけで、定形の作業用スクリプトをたまに起動するだけなら
>>32なんて問題にならないし、
人に説明する場合でも、コマンドプロンプトを開いてコマンドを入力させるより
アイコンをダブルクリックの方が楽だったりする
場合もある
34デフォルトの名無しさん:2009/05/17(日) 08:14:42
>>31
それ知らなかったよ。サンクス
3534:2009/05/17(日) 09:04:59
正確には、ruby %* || pause だね
36デフォルトの名無しさん:2009/05/17(日) 14:26:56
>>35
一見パイプの拡張かと思ったらexitコードの論理和かよ
cmdで使えたなんて知らなかった
37デフォルトの名無しさん:2009/05/17(日) 14:47:10
>>35
うる覚えだった。スマソw
38デフォルトの名無しさん:2009/05/17(日) 14:52:47
「うろ覚え」な。

今覚えとこうな。
39デフォルトの名無しさん:2009/05/17(日) 15:16:47
得意げに typo に突っ込んでいるかも知れないという危惧を
少しは抱くべきではないだろうか
40デフォルトの名無しさん:2009/05/17(日) 15:21:33
41デフォルトの名無しさん:2009/05/17(日) 15:27:59
「うる覚え」は少なくとも誤記ではないな
「う・る・お・ぼ・え」と書くつもりで正しく書いてるだけだ
その人にとっては「うる覚え」が完全に正しい

もちろん「うろ覚え」が辞書上も多数派的にも"正しい"が、
だからといって今更「うる覚え」がなくなるわけでもなく
42デフォルトの名無しさん:2009/05/17(日) 15:30:24
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /
43デフォルトの名無しさん:2009/05/17(日) 20:31:45
今日1日かけて自作スクリプトのクラス名やメソッド名を書き換えてそれに伴う構造再構成をした
見通しがちょっとよくなったような気がする
Rubyあんまり関係ないな
44デフォルトの名無しさん:2009/05/17(日) 20:35:40
def hoge
 h = Hash.new
  …
 return h
end

というメソッドを勢いで作ってしまうことはある
適切な名前を付けるべきだとは思うんだけどね
45デフォルトの名無しさん:2009/05/17(日) 21:12:55
CRubyでは通るけどJRubyではまだ通らないようなテストがあります。
で、とりあえずこのテストをJRubyで通るようにするのはあとまわしにすることに決定しました。
このとき、そのテストに『今はテストが失敗するけどあとまわしにするよ』というような目印をつける方法が
Test::UnitかRSpecにあったと思うんですけど、どなたかご存じないですか。
ぐぐろうにもキーワードが思いつきません。
46デフォルトの名無しさん:2009/05/17(日) 21:16:01
>>44
「スコープが広いものにほど明瞭な(長い)名前を付けよ」って一般原則からすれば
メソッドが十分短いならhは許されるだろう。hogeは不味いだろうけど
というか、極端に長すぎるのも考え物
記述密度が上がって逆に可読性を落としてしまう

Linusに言わせれば
>Modula-2 や Pascal のプログラマとは違って、C言語プログラマは 「こ
>の変数は一時的に使われるカウンターである(ThisVariableIsATemporaryCounter)」
>などというような気のきいた名前は使いません。C言語プログラマは、"tmp" な
>どの十分に書きやすく、それでいて少なくとも分かりにくくはならない変数名を
>選ぶものです。

Rubyも立場的には近いと思う
to_sとか、意味が通る限りにおいて短い名前を希求する
47デフォルトの名無しさん:2009/05/17(日) 21:19:50
>>45
RSpecのpendingのことかな
詳しくはるびまの連載記事に載ってる
48デフォルトの名無しさん:2009/05/17(日) 21:39:47
>>47
それです。さんきゅー。あいしてる。
49デフォルトの名無しさん:2009/05/18(月) 11:07:46
>>12
>File.open('file.xml', 'r+') do |f|
> f.flock(File::LOCK_EX)
> f.truncate(0)
> f.rewind
> f.write('<?xml version="1.0" ?>')
>end

'r+' だとファイルが存在しなかったときにエラーになるよね。
それがいやで、自分は 'r+' じゃなくて 'a' にしてるんだけど、なにか問題あるでしょうか。
詳しい人のコメント求む。
50デフォルトの名無しさん:2009/05/18(月) 11:18:10
'a' はファイルの最後から書き込む
'r+' はファイルの先頭から書き込む

対象のファイルが全くの空である場合は動作が「たまたま」同一
51デフォルトの名無しさん:2009/05/18(月) 11:20:57
なら IO::CREAT|IO::WRONLY で
52デフォルトの名無しさん:2009/05/18(月) 11:24:10
>>49
「あるはずのファイルが無い」とか「書けるはずなのに(権限などで)書けない」なんてのは
似たようなもんで、どのみちきっちりやるならチェックなり例外処理なりしなきゃいけない。
つまり、こまけぇこた(ry
53デフォルトの名無しさん:2009/05/18(月) 11:38:29
>>49

def exclusive_write(path, content)
 body = lambda{|f|
  f.flock File::LOCK_EX
  f.write content
  f.truncate f.tell
 }
 File.open(path, 'r+', &body)
rescue Errno::ENOENT
 File.open(path, 'w', &body)
end

自分の過去を掘り返してきたらこんなんが出てきた。
正しいかどうかは…。
54デフォルトの名無しさん:2009/05/18(月) 11:48:30
>>48
> あいしてる
これは、

 あいしてる ( ^з^)-☆Chu!!

までやるべき
5517:2009/05/18(月) 17:02:45
前スレの982です(ファイルアクセスが他のソフトとぶつかる場合で質問)。

皆さんのレスを一通り見ましたが、File.openの箇所で工夫するというのが定石
なのでしょうか?
本を読んでいたら、 File.readable?(path) と File.writable?(path) なるものが
ありましたが、(これらが未だ登場しないといいうことは)使うと何か弊害が
生じるのでしょうか?
56デフォルトの名無しさん:2009/05/18(月) 17:54:21
>>50
>'a' はファイルの最後から書き込む
>'r+' はファイルの先頭から書き込む

そうなんだけど、今の場合は f.truncate(0) して f.rewind(0) してから書き込んでいるから、
最初のファイルポインタの位置は関係ないよね。

>>51
これって何?初めて見るんだけど。マニュアルに書いてある?
57デフォルトの名無しさん:2009/05/18(月) 18:05:17
58デフォルトの名無しさん:2009/05/18(月) 18:07:42
>>52
そういえば昔、CGIだけどレンサバの容量の制限(quota?)でファイルが書けず、
1日分のデータが無くなったってトラブルがあったな・・・(遠い目
59デフォルトの名無しさん:2009/05/18(月) 18:11:38
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /
60デフォルトの名無しさん:2009/05/18(月) 18:46:21
マジックコメントをとりあえず強制的に utf-8 あたりで自動挿入する機能とかないかな
Emacsでいいんだけど
61デフォルトの名無しさん:2009/05/18(月) 19:00:04
62デフォルトの名無しさん:2009/05/18(月) 21:16:28
1.9に添付されてるruby-mode.elを使え
63デフォルトの名無しさん:2009/05/19(火) 01:53:42
http://wonko.com/files/crackup-1.0.1.tar.gz

こいつのソース見てくれ。殆どの処理が module として定義されて
普通に実行しただけでは何も起こらないよね?

これはどうなっているの?
よくわからないけど、rubygems がゴニョゴニョしていると考えていいのかい。
64デフォルトの名無しさん:2009/05/19(火) 02:20:21
crackup-1.0.1$ rak "at_exit|END"
lib/crackup.rb
288| at_exit do

まったく読み込んでないが、これじゃないか。
65デフォルトの名無しさん:2009/05/19(火) 02:26:30
単純にmodule直下で色々やってるだけっぽいけど
6663:2009/05/19(火) 02:36:16
>>65
すまん、勘違いしていた。さんくす。
67デフォルトの名無しさん:2009/05/19(火) 08:09:15
>>60
検索すると、マジックコメントが Ruby(と Ruby が参考にした Python)独自のものだと思ってる人がちょくちょくいる模様
これ Emacs 自身が解釈する文字列で、読み込むファイル全般で効くから
-*- coding: utf-8 -*-
の行があったら Emacs はその文字エンコーディングだとみなして読み込むから
嘘だと思ったら

-*- ruby -*-

とだけ書いた hoge ファイルを Emacs で読み込んでみるといい
いわゆる拡張子がなくて判断情報がないはずなのに ruby-mode になるからさ
-*- perl -*- と書いたら perl-mode に、 -*- html -*- と書いたら html-mode になる
68デフォルトの名無しさん:2009/05/19(火) 09:50:33
>>67
ほー知らなかった。emacsはそういう機能があるんだな。vimも似たようなのなのなかったっけ?
69デフォルトの名無しさん:2009/05/19(火) 11:28:56
70デフォルトの名無しさん:2009/05/19(火) 16:27:04
Rubyの、文字列中に任意の式を埋め込む機能は式展開という名前らしいですが、
これを英語でいうと何といいますか。
71デフォルトの名無しさん:2009/05/19(火) 16:58:19
まんまだけどembedded expressionとか?
72デフォルトの名無しさん:2009/05/19(火) 17:20:32
ruby-doc.org の Programming Ruby だと、その他のエスケープと一緒に
substitution となってるな。
73デフォルトの名無しさん:2009/05/19(火) 20:31:20
少しお聞きします。
メソッドチェーンの途中で nil があってもそれ以後予期に計らってくれる便利なハックや方法はありませんでしょうか?

Delphi Prismのコロン演算子みたいなのです(例がマイナーすぎてスマソ・・)
Colon Operator - Delphi Prism
http://prismwiki.codegear.com/en/Colon_Operator
7473:2009/05/19(火) 20:36:41
すいません。
>>73 ですが、既存のgemsとかのユーティリティ的なものがあればそれキボンという感じです。
わがままですいません…。
Activeなんたらとかにないのかなーと探しているのですが、見つからず
75デフォルトの名無しさん:2009/05/19(火) 20:40:43
((o = obj.hoge()) && (o = o.page()) && (o = o.moge()) && o.done()) || (puts "nil!!!")

・・・ごめん、忘れてw
76デフォルトの名無しさん:2009/05/19(火) 20:59:01
演算子として使いたいなら、言語機能として組み込まれないとどうにもならないように思える
あえて小手先の拡張でなんとかするなら・・・こんな感じか?

obj.send_if_defined(:method1).send_if_defined(:method2)
77デフォルトの名無しさん:2009/05/19(火) 21:08:54
>>73
眺めた程度ではリンク先の意味を理解できず申し訳ないのだけど
良きに計らうっていうのは具体的にどういう挙動を期待してる?

ふとこんなのを思いついた
class Nil; def method_missing; return nil; end
78デフォルトの名無しさん:2009/05/19(火) 21:22:12
>>73
メソッドチェーンを使わないか、
期待した返り値にならない場合は例外出して抜けるメソッドだけをチェーンに使うか、
NoMethodError を rescue する
79デフォルトの名無しさん:2009/05/19(火) 21:59:40
>>70
variable interpolation
いや、
expression interpolationだな。
80デフォルトの名無しさん:2009/05/19(火) 22:00:42
>>73
ActiveSupportのObject#tryおよびそれの同等品でどうか。
実態はsendだが、nilにだけはnilを返すように定義されている。
81デフォルトの名無しさん:2009/05/19(火) 22:17:57
ま た R a i l s か
でもこれ確かに便利だな

ttp://d.hatena.ne.jp/takihiro/20090204/1233745492
82デフォルトの名無しさん:2009/05/20(水) 01:11:27
tryを1.9に取り込むって話はどうなったんだっけ?
83デフォルトの名無しさん:2009/05/20(水) 01:18:26
>>82
catch〜tryのtry?
それとも
84デフォルトの名無しさん:2009/05/20(水) 01:39:50
haskellのめいびーがうんたらかんたら
85デフォルトの名無しさん:2009/05/20(水) 02:18:00
>>82
名前がよければ採用してもいいという話になっていたと思うが、
誰かが思い出させないとそれきりかな?
いちおうRedmineには入っていたハズ。

8673:2009/05/20(水) 04:16:49
ActiveSupportのtryですね。確かにそんな感じですw
ちょっと使ってみようと思います。

> require 'activesupport'; [4649, "HageUnko", nil].map{|i| i.try(:+, i) }
[9298, "HageUnkoHageUnko", nil]

ありがとうございました。
87デフォルトの名無しさん:2009/05/20(水) 04:51:55
WinXP-ProでRubyは1.8.6です。
ttp://www.func09.com/wordpress/archives/154 
を参考にSocketサーバーを作りたいと思っています。

先ずは、server_client.rb中の require "socket_server" について調べましたが、
リファレンス ttp://www.ruby-lang.org/ja/man/html/socket.html には socket_server
というライブラリはありません。

もしかして、ある時期から単に socket になったのでしょうか?
参考サイトの日付は2007年10月です。
8887:2009/05/20(水) 06:35:46
(補足)
目標は、厳密にはXMLSocketサーバーです。
89デフォルトの名無しさん:2009/05/20(水) 10:43:00
obj = PStore.new(path)
pstore = obj.transaction
p pstore.roots
pstore.close

とすると、2行目で止まって、Ctrl+C すると

/usr/lib/ruby/1.8/pstore.rb:296:in `flock': Interrupt
from /usr/lib/ruby/1.8/pstore.rb:296:in `transaction'
from /home/俺/上記ファイル.rb:2:in `hoge_method'

というようになるようになってしまったんだが、
似たような現象にぶち当たった経験があるとかで原因の心当たりある人いる?
90デフォルトの名無しさん:2009/05/20(水) 11:31:07
flockってことはファイルロックしっぱなしなんじゃないのか?
他のスクリプトやエディタ(てことはないか・・・)が開いててロックしているとか
91デフォルトの名無しさん:2009/05/20(水) 12:34:18
>>90
あ、ほんとだ、超でっかいpstoreのトランザクションの奥で同じファイルをPStore.newしてる
何がどうなっていつのまにこうなったんだ、これ

まあいいや、ありがとう
92デフォルトの名無しさん:2009/05/20(水) 15:02:35
>>79
>interpolation

さんくすです
93デフォルトの名無しさん:2009/05/20(水) 15:17:04
存在してないファイルからpstoreで読み込んだときに何が返るかの記憶法あるかな
nil だったか空のハッシュだったかぜんぜん覚えられないんだが
94デフォルトの名無しさん:2009/05/20(水) 15:17:49
irbでさくっと試せ
95デフォルトの名無しさん:2009/05/20(水) 15:21:43
わざわざターミナル開いて

irb
require 'pstore'
PStore.new('1').transaction{|p| p[p.roots.first]}

これを打つのがしんどいから聞いてるんだよ逆切れ
96デフォルトの名無しさん:2009/05/20(水) 15:25:05
PStoreでハッシュを保存してるとわけわかめになることが全くないでもない

というかなんであれは ENOENT とか発生しないのは何故?
97デフォルトの名無しさん:2009/05/20(水) 15:34:21
>>93-95
言うのをめんどくさがるから却ってめんどくさくなる好例だなw
まあそのコードが一発で出てきたところから推測できるように
rootsの初期値は空のArray
nilもHashもfirstが通らん
98デフォルトの名無しさん:2009/05/20(水) 15:49:54
pstore は、ファイルが存在しているかどうかを全く関知しない

ファイルがそもそも存在しない場合も、
ファイルはあるけど登録が空である場合も、
ファイルがあって何らかのデータが登録されてる場合も、
transaction の返り値オブジェクトの [] メソッドはハッシュのように振舞うし、
fetch メソッドはキーの有無をチェックして例外を出す

ということで、 ファイル自体が無い場合もそのキーでの登録が無い場合も一律 nil だな
nil をキーとして何かデータが登録されていると誤動作するであろう pstore 利用スクリプトは時々見る
99デフォルトの名無しさん:2009/05/20(水) 18:00:35
ruby 1.8.6 で日本語を slice しようと思ってます。

ttp://taiyaki.org/ruby/jstring/

が定番でしょうか?
最終版が 2003-5-7 ですが、枯れているのか
放置されているのか分からなくて。
100デフォルトの名無しさん:2009/05/20(水) 18:14:13
>>99
UTF-8で、
puts "日本語".scan(/./u)[1]

とかではいかんのでしょうか?
10199:2009/05/20(水) 18:32:30
>>100
できました。ステキ。

/./u の u がないともっとステキなのですが、
これはどうしようもないのでしょうか。
102デフォルトの名無しさん:2009/05/20(水) 18:41:55
じゃあメソッド作って隠せ
それで>>99と同じになる
103デフォルトの名無しさん:2009/05/20(水) 18:47:03
>>101
$KCODE設定だけでいけるんじゃないかと。
詳しくは知らない

ttp://www.ruby-lang.org/ja/man/html/FAQ_C6FCCBDCB8ECA4CEBCE8A4EAB0B7A4A4.html
104デフォルトの名無しさん:2009/05/21(木) 00:14:09
ファイルからUTF8のテキストデータを読んだのですが、

p line[0,2]

としても期待どおりに文字を切り出せません。
どう書けばよいのでしょうか?
105デフォルトの名無しさん:2009/05/21(木) 01:01:58
>>104
期待とは line = 'こんにちは' のとき line[0,2] #=> 'こん' ということ?

1.8系 $KCODE = 'u' 前提
1.8.6 までなら line.split(//)[0,2].join
1.8.7 なら line.chars.to_a[0,2].join でも。
おまけ line[0, 6] # 漢字(1文字3バイト)のみからなるのが確実な場合

1.9系
エンコーディングが正しければ、それで期待どおりになる。
106デフォルトの名無しさん:2009/05/21(木) 01:25:29
>>105
ありがとうございます。うまくいきました。
107デフォルトの名無しさん:2009/05/21(木) 02:02:56
1〜10の数字のうち、ランダムに5個を選ぶ記述で悩んでいます。

単純に r=rand(10) r=r+1 を5回やるとしても、5,4,8,8,7と同じ数が並ぶ
可能性があり、条件式で判別するのは元の数が増えた場合を考えると
スマートではないような気がします。
(数が増えて100万個の中から1000個を選ぶとか)

何か良い方法はありますか?
108デフォルトの名無しさん:2009/05/21(木) 02:37:07
>100万個の中から1000個を選ぶ
大きな量でも扱える方法が少量の際でもスマートとは限らないから
別個に考えた方がいいと思う

とりあえず一例
ary = []
(1..10).each{|i| ary << i }
5.times{ puts ary.delete_at(rand(ary.length)) }
もちろん数が大きい時には向かない
109デフォルトの名無しさん:2009/05/21(木) 02:38:04
なんで書き込んだ直後に(1..10).to_aを思い出すかなorz
110デフォルトの名無しさん:2009/05/21(木) 02:48:19
numbers=[]
while numbers.size<5
  numbers|=[rand(10)]
end
こんな感じかな
乱数の出てきた順番がどうでもいいならSet使ったほうが良いと思うが
111デフォルトの名無しさん:2009/05/21(木) 02:49:31
>>107
step.0 選ばれた数の総数 n = 0
step.1 1を選ぶ確率 5/10
step.2 2を選ぶ確率 (5-n)/9
step.3 3を選ぶ確率 (5-n)/8
...
nが5になるまでstepごとに0から1の一様乱数を発生させて確率以下ならその数を選択することを続ける
112デフォルトの名無しさん:2009/05/21(木) 03:54:58
それと選ぶ総数が全体数の半分以上なら選ばない数の方を選択して
それを全体から除外するようにしたほうが特に全体数が多い場合は現実的な効率はいいと思う
起こりうる最悪ケースではどちらでも変わらないし全体数の半分程度を選ぶとかではあまり関係ないけど
それから全体数が多いときは一様乱数の有効数字の桁数が問題になるかもしれないので
0から1の浮動小数でなく選択確率の分母以下の整数値をランダムに生成して分子と比較するとかの方がいいかも
でもそれでよくなるかどうかは乱数の生成方法次第だしそもそも100万個くらいならこれは問題ないのかな?
113デフォルトの名無しさん:2009/05/21(木) 04:19:05
100まんこのランダム抽出程度なら手抜きで作っても普通に終わるだろ

result = Array.new
max = 1_000_000 ; period = max / 100
$stdout.sync = true
print 'prepareing...' ; base = (1..max).to_a ; puts "done"
while e = base.delete_at(rand(base.size)) do
result << e
print '.' if (result.size % period).zero?
end
puts
p result.size
p result[0],result[max]

ごめん嘘ついた
インジケータ1個も出ない(w
114デフォルトの名無しさん:2009/05/21(木) 05:50:28
spec_helper.rb って spec コマンドが勝手に探して自動で読んでくれる便利なファイル名とかそういうのじゃないのね

require '../../../spec_helper'

とか spec ファイルの最初に書くのカッコ悪いんだけどもこれは構造上仕方ないのかな
115デフォルトの名無しさん:2009/05/21(木) 06:01:28
それだとカレントディレクトリ以外で spec コマンド使ったときに動作しないぞ

require "#{File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..', '..', '..', 'spec_helper'))}"

こうだな
長大なファイルパスを記述するのが面倒だから spec_helper を使おうと思ってる人には逆に憂鬱かもしれん
しかしこれ1行で済むとも言えるが
116デフォルトの名無しさん:2009/05/21(木) 08:04:42
>>107
[*1..10].sample(5)
[*1..1_000_000].sample(1000)
117デフォルトの名無しさん:2009/05/21(木) 08:09:23
>>115
なんでわざわざ同じことを何回も繰り返す?

require File.expand_path('../../../../spec_helper', __FILE__)
118デフォルトの名無しさん:2009/05/21(木) 09:32:24
File.expand_path の第2引数の扱いは undocumented だからな
現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら
つまり、以下の4つは同じように /full/path/basedir/dir/file を返す

File.expand_path('dir/file', '/full/path/basedir')) # マニュアルを素直に読む場合、第2引数はフルパス
File.expand_path('dir/file', 'basedir'))
File.expand_path('dir/file', File.dirname(File.expand_path('file_in_basedir'))))
File.expand_path('dir/file', 'file_in_basedir'))

というか、このへんは実験終了と称して次のバージョンくらいでぽっと無くなりそうで嫌だ
119デフォルトの名無しさん:2009/05/21(木) 11:40:41
第二引数なし・pathnameなしで一番短いのはこれかな

require File.join(File.dirname(__FILE__), '../../../spec_helper')

でも確かに、spec_helper.rbを自動or独自メソッドで読んでくれれば一番早いとは思う
120デフォルトの名無しさん:2009/05/21(木) 12:08:01
メモリ上で文字列の圧縮・展開を行いたいです。
そういったライブラリはありますか?
121デフォルトの名無しさん:2009/05/21(木) 12:20:56
よーわからんが

irb> require 'zlib'
irb> str = "プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】
   【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
    ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です"
irb> p str.size
560
irb> z = Zlib::Deflate.deflate(str)
irb> p z.size
375

こういう話ではなく?
122デフォルトの名無しさん:2009/05/21(木) 12:53:49
>>121
ありがとうございます。zlibを調べてみますね。
123デフォルトの名無しさん:2009/05/21(木) 13:31:52
すいません。
>>87をお願いします。
124デフォルトの名無しさん:2009/05/21(木) 13:48:27
>>123
socket_server.rb はライブラリではなく単なるアプリケーションで、同じページの
server_client.rb の次に説明されてる
125デフォルトの名無しさん:2009/05/21(木) 16:16:25
rspecにて、spec/hello_spec.rbから hello.rbを起動テストしようとしています。

しかし、NetBeansの "rspecテスト"からrspecを起動した場合だけテストに失敗してしまいます。
コマンドプロンプトから spec spec/hello_spec.rb では問題ないのですし、直接 ruby hello.rbでも問題ないです。

warningの文字列で、テストしているので起動時の "-w" をとれば成功するようになるのですが、
コマンドプロンプトからは -w をつけても問題ないのが気になります。

'my script should have no errors or warnings' FAILED
expected not: =~ /warning/n,
         got:    "(Rubyインストールディレクトリ)/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:138: warning: d:/my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8/specifications: Invalid argument\nHelloWorld\n"
./spec/hello_spec.rb:15:
./spec/hello_spec.rb:13:in `chdir'
./spec/hello_spec.rb:13:

hello_spec.rbのソース
require File.join(File.dirname(__FILE__), '/spec_helper.rb')
describe "my script" do
  before do
    @bin_path = File.join(File.dirname(__FILE__), "/../hello.rb")
  end
  
  it "should have no errors or warnings" do
    pending "Hangs on JRuby" if PLATFORM =~ /java/
        
    Dir.chdir(File.join(File.dirname(__FILE__), "/../")) do
      output = `ruby -w #{@bin_path} --help 2>&1`
      output.should_not =~ /warning/n
      output.should_not =~ /Error/n
    end
  end
end
126デフォルトの名無しさん:2009/05/21(木) 16:23:38
=~ というマッチャは見たことないな
127デフォルトの名無しさん:2009/05/21(木) 16:35:42
>>124
さんきゅう。
同時に、「SocketServerというクラスがリファレンスにないぞ・・・」と思って
いましたが、これも下の socket_server.rb で定義していたんですね。

納得。
128デフォルトの名無しさん:2009/05/21(木) 17:06:27
>>125
推測だが、コマンドプロンプトとNetBeansが
それぞれ違う場所にインストールされたrubyを使っていて、それで何かの問題が起こっているのでは?
実際にsource_index.rbの138行目見れば何か分かるかもよ

>>126
あるよ
129125:2009/05/21(木) 18:40:11
>>126
正規表現のマッチャみたいです。

>>128
ありがとうさんです。

source_index.rb見てても何故かよーわからんくて、
使われているのがNetBeans標準のjrubyでなくちゃんとMatzRubyにしたよなー、
と思って設定を見直していたころ、gemパスがバグっていたことになっていたことに気づきました。

1行1パスなのに、何故か、
/my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8
と : で区切って2つパスが記述してありました…(´・ω・`)

削除して、/my_home/.gem/ruby/1.8 だけにしたところ、
問題なく動きました!
今思うと、source_index.rbはの該当行はgemパスの処理のところでした。

おかげさまで、無事に解決いたしました。
ありがとうございました。
130デフォルトの名無しさん:2009/05/21(木) 19:38:56
>>116
[*1..10]も1_000_000も知らなかった
前者のはRange#to_aと優劣あるんだろうか
131デフォルトの名無しさん:2009/05/21(木) 19:44:56
>>109-112, 116
Thx

ごめんなさい。未だ試してないです。
132デフォルトの名無しさん:2009/05/22(金) 00:16:37
>>118
> File.expand_path の第2引数の扱いは undocumented だからな

Converts a pathname to an absolute pathname. Relative paths are
referenced from the current working directory of the process unless
<i>dir_string</i> is given, in which case it will be used as the
starting point.

「dir_stringを始点として絶対パスに展開する」とちゃんと書いてあるだろ。

> 現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら

勝手にdirnameしてるわけではなくて、>>117>>114より'..'が一つ多い。
133デフォルトの名無しさん:2009/05/22(金) 00:18:05
>>130
[*1..10]のほうが(1..10).to_aより短い。
遅いけどな。
134デフォルトの名無しさん:2009/05/22(金) 05:39:26
スレ違いな質問で申し訳ないが、GnomeVFSのSSH接続で、鍵を指定することはできないの?
普通に ssh://user@host と指定しただけでは ~/.ssh 下しか探さないみたい。

Net::SSH は鍵を指定できたんだけど。。
135デフォルトの名無しさん:2009/05/22(金) 15:46:03
eRubyについて教えてほしい

eRubyで書かれたファイルの中に
eRubyで書かれたファイルを埋め込みたい

なんか出来そうな気がするのだけど
イメージがまとまらないので、できるのなら教えてほしい。

具体的な運用としては
Apacheで*.rhtmlのファイルをeRubyを通すように設定したサーバで
運用したいと思っている。
で、ページを構成する細かい部品をeRubyで書いて
そのレイアウトをeRubyで定義できないかな〜って感じです。
136デフォルトの名無しさん:2009/05/22(金) 16:03:52
<% require 'erb' %>
<%= ERB.new(File.open(filename).read).result %>
じゃダメなんだっけ?
137デフォルトの名無しさん:2009/05/22(金) 16:09:11
>>132
日本語マニュアル不備だよね
基本の添付ライブラリのマニュアルが英語とかなにそれ
138デフォルトの名無しさん:2009/05/22(金) 16:35:47
>>136
それでいけました
ただ、単にERBオブジェクト作ってあげるだけでよかたんか。
これで、ヒャッホ〜イ!できそうです。ありがとう。
139デフォルトの名無しさん:2009/05/22(金) 16:50:58
>>133
サンクス
数文字程度長いぐらいならわかりやすいほうが好みだから
[*1..10]を選ぶ理由はなさそうだ
140デフォルトの名無しさん:2009/05/22(金) 17:42:51
>>137
ri File.expand_path
141140:2009/05/22(金) 17:44:48
いや、これも英語か。

ソースから抜き出してるから、日本語版を作るとなると
ソースに日本語でドキュメントを書くか、
自動生成を諦めるかになるのかな。


142デフォルトの名無しさん:2009/05/22(金) 17:46:35
ja.po 形式はどうだろう
143デフォルトの名無しさん:2009/05/22(金) 17:49:56
そういえば、rubyをgettext対応させた人っていないのかな。
144デフォルトの名無しさん:2009/05/22(金) 17:55:05
>>143
スクリプトの話?本体の話?
前者はライブラリがある
145デフォルトの名無しさん:2009/05/22(金) 17:56:24
>>132
第2引数は /path/to/file を渡しても /path/to/ とみなして処理される
相対パスを渡しても、絶対パスに変換したあとで基点とみなされる
startint point という語にそれだけの処理の意味を任せるのは初耳だ
146デフォルトの名無しさん:2009/05/22(金) 18:16:07
>>141
日本語版のリファレンスにはReFeというツールが付属していてだな
147デフォルトの名無しさん:2009/05/22(金) 18:30:33
>>145
> 第2引数は /path/to/file を渡しても /path/to/ とみなして処理される
違う。あやふやな知識で書くより、ちゃんと試してみることをすすめる。

File.expand_path("foo", "/path/to/file") #=> "/path/to/file/foo"
File.expand_path("foo", "/path/to/") #=> "/path/to/foo"
File.expand_path("../foo", "/path/to/file") #=> "/path/to/foo"
File.expand_path("../foo", "/path/to/") #=> "/path/foo"

> 相対パスを渡しても、絶対パスに変換したあとで基点とみなされる
> startint point という語にそれだけの処理の意味を任せるのは初耳だ
これも違う。重要なのは戻り値は絶対パスだということ。
File.expand_path("foo", "path") が "path/foo" だったら絶対パ
スじゃないだろ? 絶対パスを返すという仕様が前提なんだから、相
対パスは他にどう扱いようがあるというんだ。
148デフォルトの名無しさん:2009/05/22(金) 18:50:06
>>144
ruby-gettext-packageは知ってる。
本体の出力メッセージとかの話。
149デフォルトの名無しさん:2009/05/22(金) 18:55:53
GNU gettextはLの付かないGPLだから、使うとRubyを
Ruby's ライセンスではなくGPLで配布する必要が生じるかも。
150デフォルトの名無しさん:2009/05/22(金) 18:56:19
151デフォルトの名無しさん:2009/05/22(金) 19:01:06
「読まない人は日本語でも読まない」wwww
152デフォルトの名無しさん:2009/05/22(金) 19:16:33
インタプリタの出すメッセージは用語みたいなもんだから
翻訳するとかえってめんどくさいことになりそうな
153デフォルトの名無しさん:2009/05/22(金) 19:23:19
入ります
154デフォルトの名無しさん:2009/05/22(金) 19:28:51
みんな なでしこ やったことある?
155デフォルトの名無しさん:2009/05/22(金) 19:40:55
このスレでその質問をするココロは?
156デフォルトの名無しさん:2009/05/23(土) 02:19:17
@port = port if( !port.nil? ) の解釈で質問です。

最初の@はインスタンス変数で、右辺のifは修飾子だと思うのですが、
()内の「?」の意味が分かりません。

これがは文字コードリテラルとは思えませんし・・・
どういう意味(役割り)なのでしょうか?
157デフォルトの名無しさん:2009/05/23(土) 02:24:44
nil? というメソッドです
158デフォルトの名無しさん:2009/05/23(土) 02:48:30
いちおう補足、リファレンスでObjectクラスのインスタンスメソッドを眺めてみて

しかしなんというか、不慣れな時期にそのコードというのは運が悪いな
せめて @port = port unless port.nil? と書いてほしい
159デフォルトの名無しさん:2009/05/23(土) 02:53:02
うーん。識別子に使える文字等の解説が見つからない。

ttp://www.ruby-lang.org/ja/man/html/_BBFAB6E7B9BDC2A4.html#a.bc.b1.ca.cc.bb.d2
↑これ、ぶっちゃけ不正確じゃね?
160デフォルトの名無しさん:2009/05/23(土) 02:59:45
>>157-159
さんきゅうです。

つまり if( !port.nil? )  というのは、「portが無効でないなら(不活性でないなら)〜」
ということでOKですか?
161デフォルトの名無しさん:2009/05/23(土) 03:05:25
うんにゃ。
if( !port.ni? ) → if()
162デフォルトの名無しさん:2009/05/23(土) 03:07:57
あら。途中で書き込んだ。

if( !port.ni? ) → if( !port.nil? == true ) → if( port.nil? == false )
で理解してくらはい。
port.nil? は boolean を返すことが期待されてるメソッドです(たぶん)。
163デフォルトの名無しさん:2009/05/23(土) 05:05:12
Ruby に Boolean などというものはありませんが何か
あーでも結構使ってるなー

>>156
A if COND という構造だということはわかってるんだよね

if はメソッドではなく制御構造だから、このカッコは引数のカッコではなく式を作る「まとめカッコ」だ
中身1つだけだから、本当はこのカッコは必要ない

で、最初の ! は否定の NOT だ
ttp://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html#not
直後にあるものの真偽の概念を逆転する
つぎの port はなんらかのローカル変数またはメソッド呼び出しで、
ドットで繋がってる nil? は port の返り値のクラスの nil? というメソッド
port のクラスで再定義されていないのなら、それは Object#nil? で、オブジェクトが nil である場合に true を返す

まとめると、
「port の返り値が nli でない場合に、@port に port の返り値を代入する」
となる
164デフォルトの名無しさん:2009/05/23(土) 05:14:20
Rubyではよっぽどでない限り
@port = port unless port
と書くけどな

 ・ port に false が入る可能性があって、それは nil とは違う処理が必要
 ・ port が nil であるというのが何か重要なサインであってソース読み下し上目立たせたい

というのでない限り、今回でいうところの
「port に何か入ってたら @port に入れとく」
というフツーの意図である限り、 Ruby では unless を使う
165デフォルトの名無しさん:2009/05/23(土) 05:35:31
>>164.gsub("unless", "if")
166デフォルトの名無しさん:2009/05/23(土) 05:58:35
「nil でない」なら if だと思う
167デフォルトの名無しさん:2009/05/23(土) 10:07:30
# データからHTMLを作って返す
def html
 html = String.new
 …
 return html
end

というように、メソッド内のローカル変数名とそのメソッドの名称が全く同じなのって、ある程度は紛らわしいですよね
できれば避けるべきなんでしょうか?
168デフォルトの名無しさん:2009/05/23(土) 10:58:18
再帰のような処理と混同する可能性があるってこと?
メソッド内1行目でローカル変数として定義されてれば読んでて混乱はしないと思う

if (html = init_data) then みたいにどっかの文の途中でこっそり変数定義を使ってることがあるとか、
変数とメソッドを混ぜて使い倒してる処理があるとか、そういうのが1ヶ所でもあれば注意深く読む
169デフォルトの名無しさん:2009/05/23(土) 11:28:11
IOのexpertな方、教えてください ><

# afio - manipulate archives and files
COMMAND = "afio -oZ -"

IO.popen(COMMAND, "r+") do |src|
  Find.find("/etc") do |f|
    src.puts(f.chomp)
  end
  src.close_write
  File.open("myArchive.afz", "w") {|dst| dst.write(src.read)}
end

afioコマンドが pipe_wait になって終了しません。
何が悪いのでしょうか?
170169:2009/05/23(土) 11:49:24
ちなみに、コマンドライン上から
 $ find /etc | afio -oZ - 1>./myArchive.afz

とやれば、何も問題なく動作するんです。
ワケワカメで頭が破裂しそうです ><
171デフォルトの名無しさん:2009/05/23(土) 11:52:44
afioコマンドが、入力を読み切らずに何か書き出そうとして固まってるとか?
172169:2009/05/23(土) 13:22:11
afioで作成されたアーカイブをバイナリエディタで読んでいてふと思ったのですが、
なにやらヘッダらしきものが書かれていて、その後ろにgzipで圧縮されたバイナリがずらーと並んでいる感じです。

このバイナリファイルをハッキングして、自分でライブラリを書いてしまえばいいと思いました。
外部のコマンドに投げるよりはよりキレイに書けるとおもいまつ。

ありがとうございました。
173デフォルトの名無しさん:2009/05/23(土) 13:25:37
>>169
原因は>>171の通りだろう。
アーカイブデータをなんか加工したいというんでなければ、直接書き出させた方がよい。
あとFind.findからyieldされるパス名はchompする必要はない、というかしてはいけない。

COMMAND = "afio -oZ myArchive.afz"
IO.popen(COMMAND, "w") do |src|
Find.find("/etc") {|f| src.puts(f)}
end
174デフォルトの名無しさん:2009/05/23(土) 13:39:58
>>172
manpageによるとcpioフォーマットだな

Except in special cases discussed below, afio will create archives
with the same format as ASCII cpio(1) archives.
以下に述べる特殊なケースをのぞいて、afioはASCII cpio(1)アーカイブと同じ
フォーマットでアーカイブを作成する。

When creating an archive, the `large ASCII' header is used by afio to
cover the following situations:
アーカイブを作成する際、以下の場合は「large ASCII」ヘッダが使用される。

o A file has a size larger than 2 GB
・ 2GBよりも大きいファイル

o The archive contains more than 64K files which have hard links
・アーカイブ中のハードリンクが64Kを越えるファイル

o A file, directory, or special file has a UID or GID value larger
than 65535.
・65535より大きいUIDやGIDを持つファイル、ディレクトリ、特殊ファイル
175169:2009/05/23(土) 21:41:37
すみません、最後に勉強のためにも教えてください。
納得したらもう寝ます。

>>171にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。
全て入力した後に IO#close_write も呼びましたし、他に意識することって何でしょうか。
Pythonの os.popen2 で同様の事をやってみたのですが、あっさりうまくいって
クソワロタ状態です (;_;)

>>173
ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで
何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。

> あとFind.findからyieldされるパス名はchompする必要はない、
> というかしてはいけない。
すみません、確かにchompする必要はありませんでしたね。
でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。

以上、よろしくお願いします。
176デフォルトの名無しさん:2009/05/23(土) 23:24:38
whileの条件による終了(ループ脱出?)が分かりません。
下記は受信サーバー側のSocket通信の記述で、クライアントからの
信号s(オブジェクト)を受信したらRubyを終了したいのですが・・・

while true
Thread.start(gs.accept) do |s|
print(s, " is accepted\n")
puts(s.gets)
s.close
break # ここでは無効
end
end

どう変更すべきでしょうか?
177169:2009/05/24(日) 00:19:36
あああ、pythonでうまくいったというのは勘違いでした。(test caseのミス)
でも
 IO.popen("cat | afio -oZ -")
のように、catコマンドをクッションにしてみたらうまくいきました。

なんでだろうね。
バッファの関係??
朝起きたらlinux板でも行って聞いてみます。。もう疲れた。
178デフォルトの名無しさん:2009/05/24(日) 01:15:44
>>175
> >>171にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。
もちろんあり得る。それはプログラムの構造次第。afioの場合ファイル名を受
け取れば処理できるんだから、一つ分出力してもなにも不思議じゃない。

>>177は、catでバッファリングされてclose_writeされるまでafioに何も渡されて
ないんだろ。

> >>173
> ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで
> 何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。

書き込みと読み込みでThreadをわける。

IO.popen(COMMAND, "r+") do |src|
Thread.start do
Find.find("/etc") do |f|
src.puts(f.chomp)
end
src.close_write
end
File.open("myArchive.afz", "w") {|dst| dst.write(src.read)}
end

> でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。
"\n"で終わるファイル名を正しく扱えない。
179デフォルトの名無しさん:2009/05/24(日) 01:19:36
>>176
mth = Thread.current
while true
Thread.start(gs.accept) do |s|
print(s, " is accepted\n")
puts(s.gets)
s.close
mth.raise(SystemExit)
end
end
180デフォルトの名無しさん:2009/05/24(日) 01:32:45
>>176
gsってTCPServer?
サンプルをコピーしたとするとwhileで囲う必要もスレッドを生成する必要も無いと思う

s = gs.accept
print(s, " is accepted\n")
puts(s.gets)
exit
181176:2009/05/24(日) 02:49:36
>>179-180
Thx 確かにwhile文無しでもOKでした。
今回は ttp://www.ftnk.jp/~fumi/cl/2007-11-24-1.html
を参考にしました。

すいません。もう一つ質問です。

上記HPのクライアント側を改変して2行のテキスト「memo.txt」を読み込み
サーバーに渡すように
data = File.read("memo.txt")
puts data # チェック用
s.puts(data)

を書きました。
クライアント側では2行で表示されるのですが、サーバーの表示 puts(s.gets)
では最初の1行目のみが表示されます。
これは何故でしょうか?
182デフォルトの名無しさん:2009/05/24(日) 03:57:22
文字列がcopy on writeじゃないのが他の言語と違って結構ハマることが多いのですが、
何か気をつける方法ってないのでしょうか?
Rubyでは全部オブジェクトってのはわかっているつもりなのですが…。

#!ruby -Ku

a = "hage"
b = a
b << "UNKO==!!"

def change_string(s)
s << "(((^^)))))"
end
change_string(b)

puts a, b

結果:
hageUNKO==!!(((^^)))))
hageUNKO==!!(((^^)))))
183デフォルトの名無しさん:2009/05/24(日) 04:50:17
>>181
IO#gets が何をするメソッドなのかマニュアルで調べてみ

>>182
それって別に文字列に限った話じゃないよね
配列、ハッシュ、その他のオブジェクト、なんでも当てはまる
オリジナルでは無くてコピーが必要なら必ずdup,clone、を徹底するしかないかな
184176:2009/05/24(日) 05:02:30
>>183
どうも。
readに変えたらOKでした。
185デフォルトの名無しさん:2009/05/24(日) 05:45:31
>>182
Rubyのあらゆる変数(や定数)はただの参照タグだ
a = HogeObject.new は HogeObject.new の処理の最後を辿って(return してた)そのオブジェクトに存在を許して
それに a という参照タグを1個つけるという行為
b = a は a の処理の最後を辿って、つまりは a の返り値のオブジェクト、に b という参照タグを追加する行為

Ruby スクリプトは変数の名前を後生大事に覚えてるわけじゃない
Rubyはスクリプトのそれが変数名だとわかったら、その変数が参照している先にあるオブジェクト
(の保管場所を表す数値「オブジェクトID」)だけを記憶する

だから、
a = なにか
b = a
と書いた時点で、変数 a も変数 b も全く同一のオブジェクトを指す(つまり、一般的にはあまり意味がない)

a = "なにか"
p a.object_id
b = a
p b.object_id
p a.object_id == b.object_id

186182:2009/05/24(日) 05:51:03
>>183 >>185
せっかく説明してくださって申し訳ないのですが
原理をわかってて言ってるのです…(´・ω・`)

他の言語のつもりで書いちゃうと、ついバグを埋め込んでしまう
まあ、ユニットテストしっかりしろってことになるのだと思いますが…。
187デフォルトの名無しさん:2009/05/24(日) 05:52:21
で、既存のオブジェクトを破壊せずに、その内容を利用した新たなオブジェクトを作りたい場合は、
その既存のオブジェクトを破壊しないような方法を意図的に使う

a = "hage"
b = a + "ADD"

def change_string(s)
s + "CHINGE!"
end

c = change_string(a)

p a, b, c

結果:
"hage"
"hageADD"
"hageCHINGE!"

オブジェクトを「足して」新たなオブジェクトを作るようなメソッドが提供されていなかったらどうするか、というのなら
そりゃ>>183の言うようにオブジェクト内容自体を複製して新たなオブジェクトを作る dup や clone を使うしかあんめえ
188デフォルトの名無しさん:2009/05/24(日) 05:54:44
>>186
「わかってない」と思う
わかってるのなら“絶対に間違えない”から

逆にいうと、オブジェクトと変数の関係を理解するまではよーわからんバグで悩まされて
変数は安全のためにと称して全部 initialize やメソッド定義の 1行目で dup することになるんだけどな
189182:2009/05/24(日) 05:57:44
>>188
「わかってる」のと「間違えない」というのは等しくないですよ。
わかってて、正しいことができるなら、俺は今頃、億万長者になってる
190182:2009/05/24(日) 06:00:14
変なところだけレスして煽りっぽくなってしもうた orz 流してくださいwww

>>187
ああ、なるほど、確かに既存のオブジェクトを破壊しないでコピーされる場合は、OKですね。

>>188
メソッドなどで渡された引数とかなるべくdupするわけですか。なるほど。
191デフォルトの名無しさん:2009/05/24(日) 06:01:54
>>189
いいえ、理解してないんです
「他言語を使いこなす俺がこれごときを理解できていないはずがない」というようにプライドが邪魔をしてるだけです
本当は理解してないのを見なかったことにして「他の言語と違って結構ハマる」と問題を差し替えているのです

これは特に目新しい概念というわけでもありません
きちんと理解しましょう
192デフォルトの名無しさん:2009/05/24(日) 06:27:16
むしろ Ruby に慣れると、ほかのスクリプト言語で「同じデータ」を使う必要性が出てきたときに
メモリでどういう状態になってるのかがとっても気になる
Ruby なら同じものを使い倒してるということが感覚的にわかって安心できるんだけれど
193デフォルトの名無しさん:2009/05/24(日) 06:41:45
>>190
よく読め
dup なんてまずしない
しなければならないときはもちろんするが、普通はしないで済む方法を考える
「とりあえず dup」をしないとわけがわからなくなる初心者は dup する、と言ってるだけ

いい解説に出会えない独学系初心者の多くが通る無駄道ではあるが、
こんな期間は短いほどいいし、これに嵌る前に回避できれば最高だ
194デフォルトの名無しさん:2009/05/24(日) 06:44:59
>>182
「copy on write」とかいってる時点でまるでわかってない
195デフォルトの名無しさん:2009/05/24(日) 07:51:49
>>167
>というように、メソッド内のローカル変数名とそのメソッドの名称が全く同じなのって、ある程度は紛らわしいですよね
>できれば避けるべきなんでしょうか?

心配なら変数名を _html とかに変えればオK

>>194
ワハハ、その通りだ
196デフォルトの名無しさん:2009/05/24(日) 08:09:06
俺は「わかってれば絶対に間違えない」とは思わないな
他言語の経験が短い俺でも、たまにdupし忘れることがある
結局は慣れだろう

ただ、時々ではなくて頻繁に間違えるというのであれば、ちゃんと理解できていないのかもしれない
実際に間違えたコード例を晒してもらえれば、もう少し具体的なアドバイスができるかも
197182:2009/05/24(日) 08:35:40
>>194
うーん?頼む!
2chでよくあるのだけど、「コイツはアホ」とか「わかってない」とか言う時は「何故か」を明らかにしてほしいです。
言っている本人は本当にそうなのか判断できず、煽りかと思ってしまうので。

"copy on write"は書き換えたら、コピーされるという意味の用語です。
この言い方は一般的じゃないのかな?
Delphiの組み込みのstringの機能がそう呼ばれているわけなんですが。
(ただ、この辺はけっこうマジック的な扱いで、
Delphiでも文字列と似たような振る舞いをする動的配列では、
copy on writeはしなかったりとDelphiの中でもけっこう戸惑う扱いです)

>193
慣れたら、dupしないように書く、ということでしょうか?
198182:2009/05/24(日) 08:40:25
ああ、でも書いていて思ったけど、
オブジェクトのメソッド呼び出しで copy on write がどうのって確かに変だよなー。
そもそも、組み込み型じゃないん(というよりコンパイラが特別扱いしてない)だし

とはいえ、それよりも、
俺が聞きたいのは、どうすれば気をつけられるんでしょうか?ってことなんですが、
その答えは「理解しろ」ってことなんでしょうから、「お前はわかってない」なんていわれるんですよね…。
199デフォルトの名無しさん:2009/05/24(日) 08:54:52
> どうすれば気をつけられるんでしょうか?
無駄に破壊的メソッドを使わないってだけでいいんではないかと思った。
200デフォルトの名無しさん:2009/05/24(日) 09:02:24
>>185が普段使いで必要十分な一般的な理解
これができない場合は無理
201デフォルトの名無しさん:2009/05/24(日) 09:10:34
オブジェクトと参照の問題ってだけだからな
202196:2009/05/24(日) 09:14:13
>>197-198
>どうすれば気をつけられるんでしょうか?
実際に間違えてるコードを見ないと、何とも言えないが
とりあえず破壊的メソッドと非破壊的メソッドの違いを意識することは大事

あと copy on write に関しては、「Rubyにその概念はない」としか言えない
なぜなら

破壊的メソッド → オブジェクトの内容を直接書き換える(オブジェクトのコピーはしない)
非破壊的メソッド → 元のオブジェクトのデータを読んで、それを元に新しいオブジェクトを生成して返す

であって、どちらの場合も「書き換えたときにコピーする」という動作はしてないから

"abc\n".chomp! # 文字列 "abc\n" の内容を変更する(新しい文字列は生成しない)
"abc\n".chomp # 文字列 "abc\n" を元に、新しい文字列 "abc" を生成して返す
203デフォルトの名無しさん:2009/05/24(日) 09:15:54
・代入したり引数で渡すだけじゃコピーされないよ
・破壊的なメソッドには大概 ! とか = とか付いてるから目安にして気をつけてね
としか
204デフォルトの名無しさん:2009/05/24(日) 10:06:47
mutableと言いたいんだろcowじゃなくて

てかcowは実装の詳細であってプログラマからは掩蔽されるものだ
205デフォルトの名無しさん:2009/05/24(日) 10:09:22
>>197
きみはもしかしたらcopy on writeについては理解しているのかもしれないけど
それがRubyとはまったく関係ないことが理解できてない
206デフォルトの名無しさん:2009/05/24(日) 10:13:21
インスタンス変数の配列の要素への代入とか、ちゃんと最初にdupなりしておかないと
わけわからんようにはなりそうだけどね。
207デフォルトの名無しさん:2009/05/24(日) 10:28:53
>>206
どっかでの変更がリアルタイムに反映されるなにやら便利な配列として扱うような気もする

ともあれ、目的を確定させた上で処理すべきだな
とりあえず○○するとかそういうのはありえん
208169:2009/05/24(日) 13:03:40
>>178
       |
   \  __  /
   _ (m) _ピコーン
      |ミ|
    /  `´  \
     ('A`)
     ノヽノヽ
       くく
そうか、子プロセスが終了するまで親プロセスはwait状態になるのか!

 IO.popen("ruby -e 'sleep(30)'", "w") do |io|
  p io.puts("my message") #=> nil
  puts "ok, all finished !"

  # After a few seconds...
  p io.close_write #=> nil
  puts "closed?"
end

うわー、完全に失念していましたよ。
wait状態だから、実際には IO#.close_write がコールされずに止まっていたわけか。
Threadを生成してやってみたらうまくいきました!
本当にありがとうございましたです。
209デフォルトの名無しさん:2009/05/24(日) 14:56:40
ちゃうねん。
system(3) とかだと子が終わるのを待つけど、popenは同時に実行するためのAPI。

その例だと、何も読み込まない ruby -e 'sleep(30)' に io.puts("my message") で
書き込もうとして固まってるわけ。
210デフォルトの名無しさん:2009/05/24(日) 15:58:43
169の環境はMS-DOSなのかも知れない
211169:2009/05/24(日) 16:23:30
ピコーン!今度こそわかりました。

IO.popenでafioコマンドにパイプを確立し、IO#.writeで標準入力に読み込ませる。
afio君は標準入力から来たファイル名を開いて、適切なフォーマットで標準出力に吐き出そうとする。
afio「さあバイナリができましたわよ。もらってちょうだい!随時出力するから。」

しかしreadされないため、
afio「なにやってんの!早くreadしてよ。わたしのバッファサイズはそんなに大きくないのよ。
   メモリだって有限なんだから。あなたがreadしない限りいつまでもwaitするわ!」

ということなんですね。
212デフォルトの名無しさん:2009/05/24(日) 18:00:14
少しお聞きしたいのですが、
railsでrake db:migrateを行うと mysqlが以下のエラーを吐くのですが、

>rake db:migrate
(in d:/web/redmine/redmine)
== 1 Setup: migrating =========================================================
-- create_table("attachments", {:force=>true})
rake aborted!
undefined method `each' for #<Mysql:0x803e550>

(See full trace by running task with --trace)


これって、MySQL 5.1はWindowsだとダメヨという既知な問題なのでしょうか?
xamppごとMySQL 5.1を入れてしまっているもので、MySQL 5.0で上書きしてよいものかどうか・・・

Nabble - RubyOnRails Users - rake aborted! undefined method `each' for #<Mysql:
http://www.nabble.com/rake-aborted!-undefined-method-%60each%27-for--%3CMysql:-td20760472.html
213212:2009/05/24(日) 19:08:38
>>212のサイトにあったInstantRailsのlibmySQL.dllを (rubyインスコディレクトリ)/bin に配置したところ、
無事にdb:migrateできました。
5.0のDLLだろうと思うので不安ではあるのですが、様子を見ながら使ってみようと思います。

>The problem is that libmysql.dll shipped with Mysql doesn't play well
> with ruby 2.2..
> The solution is to download the libmysql.dll from:
> http://instantrails.rubyforge.org/svn/trunk/InstantRails-win/InstantRails/mysql/bin/libmySQL.dll
> and save this in your ruby bin directory

ありがとうございました。
214デフォルトの名無しさん:2009/05/24(日) 23:12:09
215デフォルトの名無しさん:2009/05/24(日) 23:24:50
文字列を spl iして、文字種類の境界で分ける方法はありますか。
たとえば
x=("abc123+456def").split(/??書き方不明/)
とすると
x[0]="abc"
x[1]="123"
x[2]="+"
x[3]="456"
x[4]="def"
みたいにしたいのですが。
216デフォルトの名無しさん:2009/05/24(日) 23:44:58
>>215
「文字種」の定義次第では可能。
217デフォルトの名無しさん:2009/05/25(月) 00:02:58
>>215
たとえば、シンプルでいいなら下記のようなことはできる(splitじゃないけど)

"abc123+456def".scan(/[a-zA-Z]+|\d+|\W+/) #=> ["abc", "123", "+", "456", "def"]

んだから、>>216の言うとおり「文字種」を定義すれば可能。
で、それを定義してるUnicodeブロックなるものもあるらしい
ttp://module.jp/blog/regex_unicode_prop.html

Rubyでは鬼車採用の1.9以降、になるのかな?
詳しくないけど、参考になれば
218デフォルトの名無しさん:2009/05/25(月) 03:58:48
Rubyの使用メモリ量を調べるにはどう書けば良いのですか?
219デフォルトの名無しさん:2009/05/25(月) 04:05:30
>>218
できません
220デフォルトの名無しさん:2009/05/25(月) 05:24:54
Ruby自体から知る方法は確かにないが、環境依存で外部ツールを読んで取得するライブラリがrubygemにあったと思う
221デフォルトの名無しさん:2009/05/25(月) 08:25:31
undefined method `inner_text' for nil:NilClass (NoMethodError)

…う、うぜえ
222デフォルトの名無しさん:2009/05/25(月) 12:13:12
どうでもいいけど、委譲関係ってマニュアルもるびまも要領得ないよね
223デフォルトの名無しさん:2009/05/25(月) 12:16:27
メモリ使用量、ヒープの個数くらい
Cのメモリマネージャから取れるようにしておけばいいのに
無理な環境は0にしておいて
224デフォルトの名無しさん:2009/05/25(月) 12:29:00
>>222
あんま多用して欲しくないんだよ
たぶん
225デフォルトの名無しさん:2009/05/25(月) 15:11:55
GnomeVFS for Python の gnomevfs.get_file_info() ※
に相当する GnomeVFS for Ruby のメソッドをご存じの方いましたら教えてください。

http://www.pygtk.org/pygnomevfs/gnomevfs-functions.html#function-gnomevfs--get_file_info
226デフォルトの名無しさん:2009/05/25(月) 15:31:28
これ廃止予定じゃない?
227デフォルトの名無しさん:2009/05/25(月) 15:34:51
>>225
File.statじゃあかんの?
gtkとかgnomeとかってAPIコロコロ変えるから嫌い
228デフォルトの名無しさん:2009/05/25(月) 15:38:36
>>227
VFSごしにウンタラカンタラしたいのだろう
229デフォルトの名無しさん:2009/05/25(月) 15:41:44
Gnomeの開発者も、VFSはもうやる気がないみたいだがw
230デフォルトの名無しさん:2009/05/25(月) 15:48:04
>>221
asin = doc.at('ASIN').inner_text

こんなのだろ
doc.at('ASIN') が nil になる可能性があるから

tag_asin = doc.at('ASIN')
asin = if tag_asin then tag_asin.inner_text else nil end

みたいに場合分けで書かなければいけない
こういうのってなんかイイ書き方ないもんかね
231デフォルトの名無しさん:2009/05/25(月) 15:53:09
232デフォルトの名無しさん:2009/05/25(月) 18:23:28
>>219-220
てんきゅう
233デフォルトの名無しさん:2009/05/25(月) 19:07:46
>>217
>scan(/[a-zA-Z]+|\d+|\W+/)

ありがとうございます。
scan にこんな使い方があったんですね。
こんな正規表現の記法は知りませんでした。
あまり難しいことはまだ無理なので、これでいきます。
234デフォルトの名無しさん:2009/05/25(月) 19:45:24
>>222
疲れてるときは全然読めないな
何言ってるかさっぱりわからん
用途別にまとめてくれてると頭に入ると思う
235デフォルトの名無しさん:2009/05/25(月) 19:54:10
>>233
一応補足しておくと、 \W とかの文字クラス表現は中身を確認しておいた方がいいよ
例示だから適当でいいんだけど、>>217のは "_" とかスルーするね。
また、改行やスペースの扱いとか、意図通りに動かすためにはちょっと気をつけて。
236デフォルトの名無しさん:2009/05/25(月) 23:24:11
本格的なものが必要なら、
StringScannerとかを使って自力で解析器を書くべきかもしれない
237デフォルトの名無しさん:2009/05/27(水) 14:06:21
質問
トップレベルにて定義されたメソッドの一覧を取得する方法はありますか?

toplevel_methods = Object.private_instance_methods
toplevel_methods -= Kernel.private_instance_methods

で、大体は絞り込めるのですが、トップレベルに未知のモジュールが include される
場合などを考えるとこのやり方では心もとないです。

トップレベルで定義されたメソッドだけをきれいに抽出する方法はないものでしょうか。
238デフォルトの名無しさん:2009/05/27(水) 15:00:51
Object.private_instance_methods(false)

* 1.8 系だと initialize も含まれる
* ふつうに、
  class Object
   def bar
   end
   private :bar
  end
 とした場合との区別がつかない
239237:2009/05/27(水) 15:25:23
自己レス

あれこれ考えた結果、無理にトップレベルでやろうとするのが間違いと気付きました。
モジュールでラップして MyModule.instance_methods(false) で済みますね

お騒がせしました。
240デフォルトの名無しさん:2009/05/27(水) 20:50:38
初心者です。Webrickでキャッシュプロキシを作ろうと思ったのですが、
実装例を見つけられませんでした。とりあえず書いてみたのですが問題があります。
1.ヒットした場合にWebサーバにアクセスしないでブラウザに戻す方法がわからない。
2.WEBrick::HTTPResponseのインスタンスを単純に復元しただけでは上手く表示できない。

#/usr/bin/ruby 1.8.7p72 webrick 1.3.1 winXP
require 'webrick'
require 'webrick/httpproxy'

db = Hash.new()
rcHandler = Proc.new() do |req, res|
if db.key?(req.unparsed_uri)
res = db[req.unparsed_uri]
end
end

handler = Proc.new() do |req, res|
db[req.unparsed_uri] = res
end

config = {
:BindAddress => '127.0.0.1',
:Port => 8080,
:ProxyContentHandler => handler,
:RequestCallback => rcHandler
}
s = WEBrick::HTTPProxyServer.new(config)
[:INT, :TERM].each{|sig| Signal.trap(sig){s.shutdown}}
s.start

実装例とかヒントをいただけたらありがたく思います。
241デフォルトの名無しさん:2009/05/27(水) 21:09:52
NicoProxy2とか
242デフォルトの名無しさん:2009/05/27(水) 21:56:44
かなり前の知識しかないけど、webrickってresponseしかいじれないんじゃなかったっけ。
requestは無理だったきがす
243デフォルトの名無しさん:2009/05/27(水) 22:14:41
>>240
俺がやってるのはこんな感じ

class MyProxyServer < WEBrick::HTTPProxyServer
 def proxy_service(req,res)
  if req.request_uri がキャッシュされてるなら
   # キャッシュを読み込んでresにセット
  else
   super
   # resをキャッシュファイルに保存
  end
 end
end
244240:2009/05/27(水) 22:51:04
>>243
なるほど、マイリマシタ。
RequestCallbackハンドラなんて要らなかったよう。
方向を間違えると収拾つかなくなるいい例ですね。
ありがとうございました。
245240:2009/05/27(水) 22:56:46
>>242
リクエストはRequestCallbackハンドラで変更可能だと思います。
一応、240のプログラムは完動品ですので、よかったら試してみてください。
どうもありがとう
246デフォルトの名無しさん:2009/05/28(木) 14:16:14
RubyGemsのアップデートに失敗してしまいます。
ねーよって言われるんですが、どうしたものでしょうか?
Windowsでのアップデートは失敗した覚えがないのですが…

> sudo gem update --system
Updating RubyGems...
Bulk updating Gem source index for: http://gems.rubyforge.org
Attempting remote update of rubygems-update
ERROR: While executing gem ... (Gem::GemNotFoundException)
Could not find rubygems-update (> 0) in any repository

環境:
・Ubuntu 8.04 LTS
・Ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux] (aptitudeで入れた)
・RubyGems 0.9.4 (aptitudeで入れた)
247246:2009/05/28(木) 14:24:30
すいません。5回くらい試していたら、無事に入りました
恐れ入ります。
248デフォルトの名無しさん:2009/05/28(木) 14:35:40
バージョン1.1以前のrubygemsは粗大ゴミなのでとっとと入れ替えましょう
Debianパッケージでrubygemをインストールするとrubygemのアップデートが実質不可能になるのでアンインストールすることをお勧め

まあ、そうするとDebianパッケージシステムで管理できない野良パッケージシステムができてしまうんだけど、
まあ、背に腹は変えられん
249デフォルトの名無しさん:2009/05/28(木) 16:52:12
array[0][:value] == 'dog' || array[0][:value] == 'cat'
みたいなのをもっと短くできんもんでしょうか?
array[0][:value].equal?('dog', 'cat')
みたいな感じに。rubyならできるような気がするのですが・・どなたか教えていただけるとうれしいです。
250デフォルトの名無しさん:2009/05/28(木) 16:57:42
['dog', 'cat'].include?(array[0][:value])
251デフォルトの名無しさん:2009/05/28(木) 16:58:23
['dog', 'cat'].include? array[0][:value]
252デフォルトの名無しさん:2009/05/28(木) 19:51:25
%w[dog cat].include?(array[0][:value])
253デフォルトの名無しさん:2009/05/28(木) 19:59:58
case array[0][:value]
when 'dog', 'cat'
end

じゃだめなの?
254デフォルトの名無しさん:2009/05/28(木) 20:11:25
用途による
>>249みたいなのは後置の if みたいなので1行で条件が書けることが望まれてるんだろう
255デフォルトの名無しさん:2009/05/28(木) 20:15:34
>>253
短くなってないじゃん。

>>254
case str when "dog","cat"; true; else; false; end
256デフォルトの名無しさん:2009/05/28(木) 20:25:04
Windowsで、RubyとC言語で書かれた2つのプログラムでテキストファイルを使って情報をやりとりしたいんだけど
Rubyからテキストファイル開くときにC言語のプログラムから読み書き禁止させたいんだけど、そういうことできるの?
C言語だと_fsopenてのがあるけど、RubyのFile.open にはそういう機能ないっぽいんだけど・・・
257デフォルトの名無しさん:2009/05/28(木) 20:31:59
>>255
1行にまとめることができるというのと、1行で書けるというのには天と地ほどの差があるのだよ
258デフォルトの名無しさん:2009/05/28(木) 20:41:16
>>257
そうか?
少なくともこの場合、戻り値のある式であればいいんじゃね?
259デフォルトの名無しさん:2009/05/28(木) 21:07:32
ちょうどいま Object#in? (定義はinclude?の主客転倒)という
メソッドの導入の是非についてのスレッドがML(えーごの)で出てますな。
# 何度めやら。
260デフォルトの名無しさん:2009/05/28(木) 21:23:49
>>256
_fsopen は C言語の機能ではない。
_fsopen はなんか「読み書き禁止」なんてしなくてむしろ共有読み書きをするっぽい。
Rubyでファイルの共有とか排他とかはFile#flock
261デフォルトの名無しさん:2009/05/28(木) 21:25:11
include? を持つ引数を取って、みたいな感じかな
あってもいいんじゃないとか思うが、あんまり賛同されてなさそうな雰囲気
262デフォルトの名無しさん:2009/05/28(木) 22:20:05
      (∀`*)
(●´Д`) { {
263デフォルトの名無しさん:2009/05/28(木) 23:29:10
>>259
なんかそれ実際に使えるようにしたライブラリなかったっけ
どこかで見た記憶はあるんだけど、思い出せない
264デフォルトの名無しさん:2009/05/29(金) 00:15:36
facetあたりじゃね?
265デフォルトの名無しさん:2009/05/29(金) 00:28:23
266249:2009/05/29(金) 00:47:11
おー色々ありがとうございます。
結局
['dog', 'cat'].include?(array[0][:value])
これがいいかな、と・・後置のif文なので。
in?みたいなメソッド、今のところは無いんですねぇ。
今MLで話になってるみたいですが、in?みたいなの導入のネガティブな点って何があるんでしょう?
267デフォルトの名無しさん:2009/05/29(金) 01:10:58
>>266
> これがいいかな、と
ぶっちゃけ、それしか出てないという気もw (caseはネタだろ)

でも、
> 後置のif文なので
ってのは、caseでもいけるっていう話で

> 今MLで話になってるみたいですが、in?みたいなの導入のネガティブな点って
これのことだろうな↓
ttp://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-core/23543?23446-23591

斜め読みでは、
「あったら便利だぜ」 vs 「んなもんKernelに入れるってのはどうなの」
って感じに見える。
過去にもあったんなら、もうちょっと丁寧な話もしてたのかな。
詳しい人の解説を期待してみたりして。
268デフォルトの名無しさん:2009/05/29(金) 01:16:02
Kernel#in? (Objectじゃなかた)への反対意見は

* どこかの集合に含ま「れる」というのはメンバーの特性と言えるのか
* 実装は簡単だから自分の環境でやっとけばいいじゃん
* すべてのオブジェクトの名前空間を汚染してまで導入すべきもの?

などがあるようだ。
269デフォルトの名無しさん:2009/05/29(金) 08:58:43
>>264-265
SUGEEEEE! こんなライブラリがあったのか
今まで全然知らなかったんだけど、実はけっこう有名なライブラリ?
270デフォルトの名無しさん:2009/05/29(金) 09:06:31
アプリケーションサーバに興味のある人にとってはそこそこ有名
わざわざそんなことやろうという人そのものが稀なので、それ以外の人にとってはさっぱり
271デフォルトの名無しさん:2009/05/29(金) 12:54:49
-talkだと結構名前を見かけるが、実は日本じゃあまり知られてない?
272デフォルトの名無しさん:2009/05/29(金) 13:12:30
日本のRubyユーザーってRubyを何に使ってるのか正直よくわからん
273デフォルトの名無しさん:2009/05/29(金) 13:22:19
>>272
同感。
最近別言語から Ruby をはじめたんだけど、
有名アプリも少ないし、日本語の扱いや
Rails 以外だと Web が面倒だったり。開発環境も貧弱。
1.9 の非互換で騒がれていないものな。
PHP なら 4 → 5 で騒がれたけど。
1 日でできる blog くらいしか作ってないのか?という感じ。
274デフォルトの名無しさん:2009/05/29(金) 13:28:11
1日で作れるような100行単位の日常スクリプトを作り倒しまくってるというのは確かだと思う
かつてのUnixユーザーがシェルスクリプト作りまくるのが日常だったように、
Rubyユーザーは自分用スクリプトを作りまくって日常を便利に過ごす

んが、まあ、これはこれで一部の人だろうな
最近作った・手直ししたもの挙げていけばアクティブユーザーの傾向が少しでも掴める?
275デフォルトの名無しさん:2009/05/29(金) 13:34:17
276デフォルトの名無しさん:2009/05/29(金) 13:41:13
>>275
Rubyに関係ないスレのURL張られても困る
> 島根
> 島根
> 鳥取
> 島根
> 鳥取
> 島根
277デフォルトの名無しさん:2009/05/29(金) 16:34:09
ゲーム
と言いたいところだが、今のところRubyベースで有名なゲームは皆無に等しいな
RPGツクールのスクリプトで使われてはいるが

274の言うように日常のツールとして使うと超便利で、あと他には
* 大小問わずWebアプリケーション(CGIアプリケーション)を作りたいとき
* RADを使わずにGUIアプリを作りたいとき(WxRubyなどを使う)
* 簡単な数値・確率計算がしたいとき
なんかに使う

特にRakeの便利さは異常
俺はもうRakeなしでは快適なPCライフを送れない

>>273
Webアプリならそこそこ有名なのはあるよ。tDiaryとか
あとWeb周りが面倒だったのは昔の話で、今はWEBrickやRackがあるからむしろ楽なはず
278デフォルトの名無しさん:2009/05/29(金) 16:50:24
処理が少しくらい遅くても重くても作りやすくてメンテしやすいほうがいいこともある、という裏方用途にガッチリはまったので、
Rubyが表舞台に出てくるのは、Rubyが普及すれば普及するほど減るような気がしてならない

「シェルスクリプトって使ってる人いるんですか? シェルスクリプトのメジャーなアプリケーションってなんですか?」
という問いに答えにくいのとおそらく一緒になる

という空想

ある程度使えるようになれば普段で使えるじゃん、と気づく日が来る(ただしコンピュータ利用環境依存)んで、
初心者の人は肩肘張らずにダラダラやるといいと思う

質問ある方どうぞん
279デフォルトの名無しさん:2009/05/29(金) 16:58:23
時間があったら絶対に Java | C | PHP で書き換えるから、と言われつつ
ずっと Ruby スクリプトのまま時々呼ばれて便利に動いてる、みたいなのが個人的理想
UNIX文化に傾倒して夢見すぎかもしれないが、理想くらい楽しく行きたいと思う
280デフォルトの名無しさん:2009/05/29(金) 18:25:30
便利スクリプトに使ってますよ。ベターPerlみたいな感じ。

ゲームのスクリプトを生成したりとか、
他の言語のサポート用スクリプトにベターmakeなrakeもつかってる
281デフォルトの名無しさん:2009/05/29(金) 21:20:18
日本人作った言語なら日本語のドキュメント豊富なはず。
PerlやPHPの方が日本語の資料多いじゃん。
他に移行。
282デフォルトの名無しさん:2009/05/29(金) 21:23:48
>>281
ばいばーい。
283デフォルトの名無しさん:2009/05/29(金) 23:26:24
ドキュメントが豊富でも言語自体に魅力が無ければ意味が無い
perlやphpが魅力的だと思うなら、お前にrubyは向いてないよ
284デフォルトの名無しさん:2009/05/29(金) 23:38:15
幼女から熟女まで余裕でいける俺にはなんの苦も無いぜ。
285デフォルトの名無しさん:2009/05/30(土) 00:33:30
>>281 には KENT の Perl入門がお似合い
286デフォルトの名無しさん:2009/05/30(土) 01:01:24
るりまってあんま読まれてないのかな?
287デフォルトの名無しさん:2009/05/30(土) 03:14:26
大小問わずウェブは辞めといたほうが吉。
基本は使い捨てだよ。メンテ必要なのは向いてない。
288デフォルトの名無しさん:2009/05/30(土) 05:45:29
君の見てるウェブはメンテナンスフリーなんだな
うらやましいよ
289デフォルトの名無しさん:2009/05/30(土) 05:58:42
いやいや、PerlやPHPの方がよいと思ったら、すでにそっちへ行ってるw

PHPはドキュメントは豊富。これはPHP案件の時マジ助かった。
しかし、ちょっと踏み込むと全然ドキュメントなかったりする…
DateTimeクラス?とかドキュメントなくて、なきそうになった
2chでDateTimeについて質問したら、PHPがオブジェクト指向言語だと思うなよ、とか
あげくに、オブジェクト指向言語氏ねとか煽られるし。所詮その程度。

Perlは10年前にやったがモダンPerl覚える気ねえや…
モダンPerl憶えるくらいならRubyの方がラクチン
幸い、Perlの資産は書き捨てばっかで少なかったし
290デフォルトの名無しさん:2009/05/30(土) 09:49:53
お尋ねします。
あるファイル内の文字列を一文字単位で並び替えることは可能でしょうか?
それを各行単位とファイル単位の二種類のやり方で並び替えたいのです。

1.元ファイルの例

 あいうえお
 かきくけこ
 さしすせそ

2.各行単位の並び替えで希望する結果

 おえういあ
 こけくきか
 そせすしさ

3.ファイル単位の並び替えで希望する結果

 そせすしさこけくきかおえういあ

実際の文字列は例と違ってバラバラなので、
A-Z や Z-A のようなソート機能は使えません。
このようなプログラムをRubyで組みたいのです。
291デフォルトの名無しさん:2009/05/30(土) 09:59:22
reverse でいいんじゃね?
292デフォルトの名無しさん:2009/05/30(土) 10:04:07
俺ならスタックに入れてreverse
293デフォルトの名無しさん:2009/05/30(土) 10:08:04
irb(main):006:0> puts "あいうえお".reverse
ィえういあ

なんか化けるな。KCODE='s'のせいか?
WindowsだとUTF-8でirb使う手段がないんだが、みんなどうしてるんだろ
294デフォルトの名無しさん:2009/05/30(土) 10:10:26
str.split(//).reverse.join
295デフォルトの名無しさん:2009/05/30(土) 10:14:41
str.split(//E).reverse.join # E は str の文字エンコーディング1文字

どう小細工しても文字ごとの配列を作らざるを得ないので素直に巨大な配列を作るべし
296デフォルトの名無しさん:2009/05/30(土) 13:02:26
gsub!(/\n/,"") で改行が削除(置換)できません。何故?
297デフォルトの名無しさん:2009/05/30(土) 13:08:08
できてるけどなあ。

¥nのバックスラッシュが 0x5Cではなく 0xA5 になってるとか。
実は改行が ¥r¥n だったとか。
298デフォルトの名無しさん:2009/05/30(土) 13:19:47
\n は「改行」という集合じゃないんだよね
あくまで LF という文字そのもの 1個
LF 以外の改行があるならそれも併記しないと駄目
299デフォルトの名無しさん:2009/05/30(土) 13:22:56
>>297
\n , \r\n , \r の全部でやってみましたが変わりません。
Windows環境だから \r\n ですが、
今まで \n で問題なくマッチてしていました。試しに、

line.gsub!(/\n/,"問題")

でやってみたら行末に「問題」が追加されて改行はそのままですし。
置換のはずが追加の動作になっています。
理由がサッパリ判りません。
300デフォルトの名無しさん:2009/05/30(土) 13:27:44
>>299
そもそも line には \n が含まれているのか?
p line でデバッグしてみ。
301デフォルトの名無しさん:2009/05/30(土) 13:28:12
対象文字列を inspect とか dump とかしてみるといいよー。
302デフォルトの名無しさん:2009/05/30(土) 13:39:47
>>300
置換前を p line してみると各行に \n がありました。
置換後には \n が無くなっていました。
これを見ると置換は成功しているようです。

エディターの問題なんでしょうか。
でもエディタ側で CR+LF , CR .LF を区別して表示してみると
CR+LFが残っているんですよね。
もうちょっと頑張って原因を探ってみます。
303デフォルトの名無しさん:2009/05/30(土) 13:45:12
File.openするときに binary モードになってないとか、
あと、DOS窓からコピーすれば CRLF になるとか。
304デフォルトの名無しさん:2009/05/30(土) 13:55:40
>>302
原因を探るも何も、それが全てじゃ>改行コードの(意図しない)混在

自分でも
> Windows環境だから \r\n ですが、
と書いているように、環境(というかむしろそのデータを吐き出すアプリ)に依って、
その3パターンが入り乱れるなんて、不注意でよくあるケース。
# CR単独、ってのはほぼないけど。

FTPのアスキーモードでファイルの上げ下げをしたり、また適当な設定のエディタで
読み書きすることによっても、テキストデータの改行コードはさくさく変換されつづける。
たまに CRCRLFとかになってて悲しくなることがある。

個人的には、アスキーモードとかテキストモードとか言う改行コードの自動変換処理を
絡ませてろくな事になった記憶がない。
Windowsだけど、自分のスクリプトやそこで使うデータは全部LFで保存してる。
# メモ帳で読めないとか知ったこっちゃない。
305デフォルトの名無しさん:2009/05/30(土) 19:59:29
Ruby初心者ですが、他言語の経験はそれなりにあります。

やりたいこと。
Rubyで外部コマンドを起動して、それを任意のタイミングで終了させたいです。


より詳細に。
自分のプログラムの通信をTCPdumpを使って調べたい。
ただし、何回も実験を繰り返すので、手で起動、終了を繰り返すのは避けたい。

今考えている手法
マルチスレッドでプロセスをつくり、その上でTCPdumpを走らせる。
メインのスレッド上では、自分のプログラムを起動し、しばらくするとそれが終了する。
すると、マルチスレッド上のTCPdumpにシグナルを送って停止させる。
これを数十回繰り返す。


どのように解決すればよいでしょうか。
もしよろしければアドバイスいただけると助かります。
306デフォルトの名無しさん:2009/05/30(土) 20:13:13
これまた Ruby 関係ないな
動いてる tcpdump に SIGINT か SIGTERM を適当に送れ
307デフォルトの名無しさん:2009/05/30(土) 20:13:17
書き忘れましたが、起動の仕方は分かります。
ただ、Ctrl-cで終了させるプログラムをどのように停止させるかが分かりません。
308デフォルトの名無しさん:2009/05/30(土) 20:18:22
なるほど。こっちもOSのコマンドを利用するわけですか。
ジョブ番号を出す、tcpdumpのジョブ番号を取得、kill
ってわけですね。

めんどうですが、その方法でやることにします。
ありがとうございました。
309デフォルトの名無しさん:2009/05/30(土) 20:25:09
どう見ても他言語の経験もそれなりにしかありません、の間違いだな。
質問も回答も全くRuby関係ないw
310デフォルトの名無しさん:2009/05/30(土) 20:39:04
>>308
Rubyから子プロセスにシグナルを送れるよ。
311デフォルトの名無しさん:2009/05/30(土) 20:52:34
>>310
おお、本当ですか。
今調べてみたんですが、それは
http://www.ruby-lang.org/ja/man/html/Process.html
であっておりますでしょうか?

これを使ったら、
process.pidの値を取得して、
kill(pid)
のように出来るので
上のコードよりかは幾分綺麗になりそうですね。
ありがとうございます。
312デフォルトの名無しさん:2009/05/31(日) 02:29:50
文字列を与えられた時、アルファベットを大文字小文字区別せずに出現頻度順に小文字で並べた文字列を返すプログラムを作る問題がわかりません。
313デフォルトの名無しさん:2009/05/31(日) 02:38:47
何がわからないの?宿題は自分でやるもんですよ?
314デフォルトの名無しさん:2009/05/31(日) 06:34:44
315デフォルトの名無しさん:2009/05/31(日) 16:06:17
hoge::huga

hoge#huga
はどういう意味ですか?
316デフォルトの名無しさん:2009/05/31(日) 16:12:59
クラス名やメソッド名を連結するときの表記に使う :: と # の違いだと解釈

:: はクラスやメソッドや定数を連結する表記に使い、実際のスクリプト上でもそのように動作する
# はインスタンスメソッドを表す表記に用いられ、実際のスクリプト上では動作しない、マニュアル専用の表記

A::B::C は
Aクラス(かモジュール)の中にあるBクラス(かモジュール)の中にあるCクラス(かモジュール)、
または、
Aクラス(かモジュール)の中にあるBクラス(かモジュール)の中にある定数C
原理上、スクリプトを参照しない限り、見かけではこの2つを区別できない

A#hoge は、Aクラスのインスタンスメソッドhoge
a#hoge は、オブジェクト a のクラスで定義されているインスタンスメソッド hoge

マニュアルのどっかに書いてあった気がする
317デフォルトの名無しさん:2009/05/31(日) 16:40:18
>>316
ありがとうございます。

318デフォルトの名無しさん:2009/05/31(日) 16:43:22
>>316
クラス名#メソッド名 という表記、例えば String#upcase というのを見るのですが、
これはStringクラスのインスタンスの持つupcaseというメソッド、という意味でいいですか?
見ようによってはクラスメソッドに見えます。
319デフォルトの名無しさん:2009/05/31(日) 16:49:56
インスタンスメソッドを URI#path のように # つきで書くような人間は、
クラスメソッドは絶対に URI.parse のように . で繋げて書くから混同されてる可能性は(誤記以外には)ない
安心しれ
320デフォルトの名無しさん:2009/05/31(日) 17:34:25
>>316
これ、テンプレでFAQに入れといていい気がする。

俺も毎回なんだっけ?と迷うからなんだけど
321デフォルトの名無しさん:2009/05/31(日) 18:03:24
なんでそんなに迷うんだよ…

特殊なのはインスタンスメソッドのマニュアル記載法の # だけで、あとは通常のスクリプト内記法と一緒じゃんよ
ドットは
「マニュアルでのクラスメソッド」
「スクリプト内のインスタンスメソッド」
「スクリプト内のクラスメソッド」
の3つがあってややアレだが、
たいていの場合、 . の左は「明らかにクラス名」か「明らかに変数名」のどっちかだろ?

左が@始まりや全部小文字の変数名だったらとりあえずインスタンスメソッドの起動記法だと思え
だから、マニュアルに “小文字.メソッド” があったら変数に対するコピペ実行可能なインスタンスメソッドチェーンだ
例: arr.join の場合、「arrはローカル変数っぽい」から、「arrが指すオブジェクトのクラスのインスタンスメソッドjoin」だとみなす
   「変数arrにクラスオブジェクト本体が入ってたらクラスメソッドが起動する可能性が」とか余計なことは考えない

左が大文字で始まってる「明らかにクラス名」の場合はクラスメソッドのマニュアル記載法&スクリプト内のクラスメソッドだ
例: uri.path と URI.parse は連結法はドットで同一だが、
   前者は変数っぽいので「変数uriの指すオブジェクトのクラスのインスタンスメソッドpathを起動するようにする」という指示記述
   後者はクラスっぽいので「クラス(またはモジュール)URIのクラスメソッドparse」を指すマニュアル記述または起動指示

文字化して書いててどうでもよくなってきた
もしかして、この辺の区別って実は本当の初心者にはつけづらかったりする?
322デフォルトの名無しさん:2009/05/31(日) 18:11:06
本当の初心者って?
323デフォルトの名無しさん:2009/05/31(日) 18:16:53
オブジェクトに属するメソッドとクラスに属するメソッドの違いをてきとーにより分けられない人
324デフォルトの名無しさん:2009/05/31(日) 19:41:33
>>321
なげーよ
もっと簡潔にかけるだろ、あんたなら
325デフォルトの名無しさん:2009/05/31(日) 19:55:06
テンプレ用に短いのキボン
326デフォルトの名無しさん:2009/05/31(日) 20:39:30
つカルシウム
327デフォルトの名無しさん:2009/05/31(日) 22:05:45
やっとプログラミングに慣れきた者ですが、
ネットや本のコードを読むときで、

一つ一つのステ−トメントや式を追う時に、

これが、
インスタンス変数、ローカル変数、定数(クラスもその一種?)、メソッド と判別できるようになって、
少し自信がつきました。

デ−タ?の動き?だけでにとどまらずに、、変数のパタ−ン、メソッドと変数の見分けなどを意識できるようになるのが、
本当の初心者には一つの壁だと思います。

テンプレを書くまで、実力が上がってないけれど、、
328デフォルトの名無しさん:2009/05/31(日) 22:38:19
>>326
カルシウムって・・・
やめろよ頭悪いと思われるぞ。
329デフォルトの名無しさん:2009/05/31(日) 22:39:45
>>328
乳酸菌取れよ
330デフォルトの名無しさん:2009/06/01(月) 13:36:21
カルシウムと言われて真っ先に金属カルシウムを思いつく>>328さんは秀才
「ナトリウムの過剰摂取は身体によくない」と言われて「水と反応して火花散らすから当然だな」
「カルシウムを摂ると身体にいい」と言われて「あんなにイオン化傾向が高いものを摂取するなんて信じられん」


このスレ何のスレだっけ
331デフォルトの名無しさん:2009/06/01(月) 13:58:23
>>321みたいなのは『初めてのRuby』あたりに書いてないかい
332デフォルトの名無しさん:2009/06/01(月) 14:03:31
3ヶ月前に作りかけだったスクリプトの製作を再開しようとしたのだが
コメントつきなのになにやってるかさっぱりわからん
333デフォルトの名無しさん:2009/06/01(月) 14:07:53
スクリプトでそんなに長いの書くなよ。
一画面に収まらなくなってきたらもっとまともな言語使うべき。
334デフォルトの名無しさん:2009/06/01(月) 14:15:39
>>333
まともってなに?
委員会が設計したこと?
335デフォルトの名無しさん:2009/06/01(月) 14:20:53
>>334
事前コンパイル&リンクが必要な言語はコンパイル時間の間に精神を落ち着けることができるので
コンパイル不要な言語より質の高いプログラムを記述することができます
336デフォルトの名無しさん:2009/06/01(月) 14:48:38
スクリプト言語でさくっと作って浮いた時間でお茶でも飲む方がいいよ
337デフォルトの名無しさん:2009/06/01(月) 16:02:12
>>335
>事前コンパイル&リンクが必要な言語はコンパイル時間の間に精神を落ち着けることができるので

でもコードを書いているときに多大なストレスを感じてしまうんだよな、
事前コンパイル&リンクが必要な言語は。むずかしいのう。
338デフォルトの名無しさん:2009/06/01(月) 16:49:06
そんなにあの間が好きならsleepでも噛ませとけw
339デフォルトの名無しさん:2009/06/02(火) 02:09:00
in?の話がちょっと出てる。
qwik.jp/lang-Pattern/DSL.html
340デフォルトの名無しさん:2009/06/02(火) 08:54:16
リンクの貼り方がわかりにくすぎるよ…パパン
341デフォルトの名無しさん:2009/06/02(火) 08:58:17
リンクだったのか。気づかんかった
342デフォルトの名無しさん:2009/06/02(火) 09:08:26
というか「対応するサイトがありません」と言われる
343デフォルトの名無しさん:2009/06/02(火) 10:36:18
339 じゃないけど
ttp://qwik.jp/lang-pattern/DSL.html
344デフォルトの名無しさん:2009/06/02(火) 13:02:24
Apache 2.2 + Passenger 環境で、
現在 Rails アプリを DocumentRoot 直下に a/ や b/ に置き、

RailsBaseURI /a
RailsBaseURI /b

にして

example.com/a/
example.com/b/

のように複数動かしています。

Sinatra も

example.com/c/
example.com/d/

のように複数動かしたいのですが、どうすればいいでしょうか。
サブドメインを取らないで実現したいのです。
RailsBaseURI のような SinatraBaseURI があれば簡単なのですがw
345デフォルトの名無しさん:2009/06/02(火) 18:37:58
>>344
自己解決しました。
RailsBaseURI ではなく
RackBaseURI でいけました。
346デフォルトの名無しさん:2009/06/03(水) 03:39:04
>>344
ほへー、Passenger使うとサブドメインじゃなくてもいけるんですね。
347デフォルトの名無しさん:2009/06/03(水) 04:10:20
すいません。irbやRailsのコンソールをcygwinのターミナル上から使う方法ってないものでしょうか?
cygwin版のrubyのirbだとcygwinのターミナルからは使えるのですが、
mswin32版だとエラーが出てしまい使えません。
コマンドプロンプトのbash上からは起動できるのですが…

> irb.bat
.irbrc successfully loaded
(rubyインスコdir)/lib/ruby/1.8/irb.rb:270:in `dup': can't dup NilClass (TypeError)
from (rubyインスコdir)/lib/ruby/1.8/irb.rb:270:in `prompt'
from (rubyインスコdir)/lib/ruby/1.8/irb.rb:122:in `eval_input'
from (rubyインスコdir)/lib/ruby/1.8/irb/ruby-lex.rb:207:in `call'
from (rubyインスコdir)/lib/ruby/1.8/irb/ruby-lex.rb:207:in `prompt'
from (rubyインスコdir)/lib/ruby/1.8/irb/ruby-lex.rb:221:in `initialize_input'
from (rubyインスコdir)/lib/ruby/1.8/irb/ruby-lex.rb:228:in `each_top_level_statement'
from (rubyインスコdir)/lib/ruby/1.8/irb.rb:146:in `eval_input'
from (rubyインスコdir)/lib/ruby/1.8/irb.rb:70:in `start'
from (rubyインスコdir)/lib/ruby/1.8/irb.rb:69:in `catch'
from (rubyインスコdir)/lib/ruby/1.8/irb.rb:69:in `start'
from (rubyインスコdir)/bin/irb.bat:21

> ruby -v
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]

確認したターミナル:ck 3.2.1、Poderosa 3.0.0
348デフォルトの名無しさん:2009/06/03(水) 15:05:55
こんにちは、質問があります。

if条件式の途中で改行を入れるとエラーになります。

if a > b
  or b > c then
    puts 'foo'
else
    puts 'bar'
end

rubyでは条件式は一行で書く必要があるんでしょうか?
複数行で各方法があれば教えてください。
349デフォルトの名無しさん:2009/06/03(水) 15:17:16
>>347
irbはああみえてかなり特殊な芸をしてるんで、
できればターミナルに合った固有のを使って欲しいところではある

>>348
条件式とか関係なく、Ruby の改行は「その行で終わっているように解釈できそうなら終わったとみなす」が基本

if a > b ↓
と書いた場合、if ○○ が終わったとみなされる

or の後ろには何かが来るのが構成上確実なので
if a > b or ↓
こう書くか、あるいはそんな条件なんていちいち覚えてらんねーので素直に改行をバックスラッシュでエスケープして
if a > b \↓
こう書け
350デフォルトの名無しさん:2009/06/03(水) 17:00:21
Object#tap みたいなので、自分自身でなく実行結果を返すメソッドってもうある?

class Object
def tap_and_return
return yield(self)
end
end
351デフォルトの名無しさん:2009/06/03(水) 17:58:47
inspect で日本語を表示する境目ってなに?
表示できる場合と表示できない場合があるような気がするんだけど、
何か設定とかinspectメソッドの作り方とかに依存するの?
352348:2009/06/03(水) 22:54:39
>>349
丁寧な解説ありがとうございます。

すっきりしました。
353デフォルトの名無しさん:2009/06/04(木) 00:08:29
RSpec で、あるオブジェクトのメソッドが呼ばれたかどうかを調べる方法ってあったと思うのですが、失念しました
どなたかご存じないですか?

it "should be called" do
 obj = Foo.new
 do_somethod()
 obj.method(:value) .should be_called
end

こんな感じでなんかあったと思うんですけど、キーワードがわからなくてぐぐれない。

>>351
$KCODEを設定しているかどうかじゃないでしょうか。
354デフォルトの名無しさん:2009/06/04(木) 00:32:37
>>353
obj.should_receive(:value) [ .and_return(something) ]

do_method()の中で obj.valueが呼ばれるのなら、その前に↑を。
355デフォルトの名無しさん:2009/06/04(木) 00:34:26
あ、もとのコードに倣ったつもりだったが、正しくは
obj.should_receive(:method).and_return(:value)
こうか。
356デフォルトの名無しさん:2009/06/04(木) 02:43:05
>>354,355
さんくすです
357デフォルトの名無しさん:2009/06/04(木) 18:43:28

ちょっと質問…これのインストール方法を教えてください。

http://popen4.rubyforge.org/


>gem install POpen4
ERROR: could not find gem POpen4 locally or in a repository

といわれてしまいます。
gem install --remote --include-dependencies POpen4
もどうようでした。
358デフォルトの名無しさん:2009/06/04(木) 18:51:37
$ gem search -r POpen4

*** REMOTE GEMS ***

POpen4 (0.1.1)
shairontoledo-popen4 (0.1.2)
359デフォルトの名無しさん:2009/06/04(木) 20:33:14
Rubyでcsvの処理をしたいと思っています。
標準のライブラリがあるようなのでこれを色々いじってるのですが…。

require 'csv'

hoge = CSV.open('x.csv', 'r', '\t')

区切り文字をタブにしようとするとうまくいきません。以下のようなエラーがでてしまいます。
csv.rb:1330:in `initialize': can't convert String into Integer (TypeError)


hoge = CSV.open('x.csv', 'r', ',')でも同様です

hoge = CSV.open('x.csv', 'r')とすると大丈夫なのですが…。

なぜなのでしょうか?
360デフォルトの名無しさん:2009/06/04(木) 20:34:05
>>358
--remote 指定でsearchすると確かに見つかるんですが、入れられません・・・
361デフォルトの名無しさん:2009/06/04(木) 20:55:50
>>360
調べた
最近の gem に全く対応してないからインストールできないし、
インストールしてもソースの require_gem の部分を書き変える必要があるな
362デフォルトの名無しさん:2009/06/04(木) 20:58:00
>>361
そっかー古いわけか。
デプロイツールのVladのWindows版パッチがpopen4をrequireしてたので、
入れてVladを動かせないかと思ってたんだけど、
githubの方の(shairontoledo-popen4)入れてもなんかrequireできないのよね…
363デフォルトの名無しさん:2009/06/04(木) 20:58:16
>>359
''で囲むと\tみたいな特殊文字を解釈してくれないから
""で囲んだほうがいいかも

hoge = CSV.open('x.csv', 'r', "\t") # ←こんなかんじ

ただ、手元の環境だと>>359でもエラーは出なかった。。。
(ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux])
364361:2009/06/04(木) 21:06:13
あー、gem の部分全部書き換えないと駄目だ
めんどい
パス

インストール自体は gem のファイルを ttp://rubyforge.org/frs/?group_id=1768 からダウンロードして
gem install ファイル名 すれば入るから適当に書き変えれ
365359:2009/06/04(木) 23:32:01
>>363
どうも不安定なバージョンだったようです
安定バージョンをインストールしなおしてうまくいきました
ありがとうございました
366デフォルトの名無しさん:2009/06/05(金) 01:15:56
すいません質問です。
(2/2).to_s
=> "1"
だけど,

"2/2".to_i
=> 2
になってしまう。

これを1にする簡単な方法はないですか?
分かる方よろしくお願いします。
367デフォルトの名無しさん:2009/06/05(金) 01:48:37
>>366
String#to_iすると先頭から整数に変換可能なところまでを整数化して
あとは無視するので、先頭の"2"だけが2になってる。

簡単なのは eval "2/2" で、"2/2" をRubyコードとして実行(評価)する。
"2/2"が外部から来た信頼できない文字列だったらやっちゃ駄目。
368デフォルトの名無しさん:2009/06/05(金) 01:52:48
>>366
to_iは文字列を整数とみなして変換してくれるメソッドであって
数式として評価してくれるわけではない

文字列を評価したいのなら、例えば明示的にevalを用いること
eval "2/2"
=> 1

なお一般的に、evalは注意深く用いられるべきメソッドだと認識されている
最低限の注意として、信用できない入力をそのままevalに与えない
使用は最小限に・・・・・・ここぞという部分にピンポイントで用いるべし
369デフォルトの名無しさん:2009/06/05(金) 09:43:14
Ruby勉強しようと思ってアマゾンで本を探したけど、
どの本も高すぎ(>_<)
370デフォルトの名無しさん:2009/06/05(金) 09:54:48
町に図書館はないのか
371デフォルトの名無しさん:2009/06/05(金) 10:08:32
図書館のruby本、2002年初版とかが多いよな。
勉強には使えるけどね。
372デフォルトの名無しさん:2009/06/05(金) 10:52:09
絶対的な価格が安いとは言わないが、相対的には安いと思うぞ
これが「高すぎる」のなら、プログラム関連の書籍はどれも「高すぎる」
373デフォルトの名無しさん:2009/06/05(金) 13:22:14
金と時間を返せと言いたくなる本もあるが、良書は1冊1万円でも安いと思うけどね。
そんなこと言ったら9割方のエンジニアの経費の方がずっと高いよ。
5000円なんてかなり悪くても3時間分くらいだろ。もらってるやつは1時間以下じゃん。
実際その時間で良書1冊分の働きをしてるやつなんてどのくらいいるのだろうか。
374デフォルトの名無しさん:2009/06/05(金) 13:28:56
いや、まず本を買ってRubyを始めようなんて人はカジュアルユーザーがほとんどだろ
そういう人にプログラマ/エンジニアの論理で物を説いてどうする

『たのしいRuby 第2版』の3000円の出費は目をつぶって欲しいところだ
ネットで散発的に学んでもなんとかなるとは思うけど、そういうのはプログラミングに慣れた人向けだよなあ
375デフォルトの名無しさん:2009/06/05(金) 14:53:44
とほほ...
本好きな俺はカジュアルユーザー扱いだ。
376デフォルトの名無しさん:2009/06/05(金) 15:02:48
必要かどうかをネットで調べる前にとりあえず本を買うのは単にお金持ちだろ
そこは胸を張ってよい
377デフォルトの名無しさん:2009/06/05(金) 16:43:39
>>369
http://www1.tf.chiba-u.jp/~shin/tutorial/

徹底して本を買わずにケチってみるのもいいかもしれない
漏れはとりあえず本買っちゃうタイプだから
378デフォルトの名無しさん:2009/06/05(金) 17:37:04
たまには書籍もいいよ。
俺はドキュメントをスクリーン越しに読むより、紙をぺらぺらめくって読む方が好きだ。
379デフォルトの名無しさん:2009/06/05(金) 17:39:51
必要かどうか自分の目で確かめるんじゃなくて、ネットで調べる方がよしとされるのか。
近くに大きな本屋がないなら仕方ないけど、時代を感じさせるなあ。
380デフォルトの名無しさん:2009/06/05(金) 18:10:09
だってマニュアルがネット上にあるんだもの
381デフォルトの名無しさん:2009/06/05(金) 18:23:40
蔵書野郎の俺への挑戦か?

rubyはいつになったらまともなリファレンス本でるんだよ
382デフォルトの名無しさん:2009/06/05(金) 18:26:21
>>380
スカスカじゃんかよw
おまえは組み込みライブラリくらいしか使わないのかもしれないけど
383デフォルトの名無しさん:2009/06/05(金) 18:34:15
まあ基本はソース嫁だからな。
それにも関わらず「Rubyではじめる気軽なプログラミング」というフレーズの本があるしよくわからん。
384デフォルトの名無しさん:2009/06/05(金) 18:42:09
その手の本ありすぎるわりに実用的な逆引きとかリファレンスが少ないのがRuby
近いうちにPythonのほうが書籍充実してると言われる日が来るな
385デフォルトの名無しさん:2009/06/05(金) 18:49:35
ついこのまえ逆引き本の分厚いやつ出たよ
レビューはとんと見かけないが
386デフォルトの名無しさん:2009/06/05(金) 18:53:51
と極力自然にナチュラルにたまたまうまい書籍があるよという流れに見えるようにしながら
発売1週間のるびきちの本の宣伝に持っていこうとする一連のサクラの書き込みだと見える俺は
心がたいへん腐っている

Ruby逆引きハンドブック
ttp://www.amazon.co.jp/dp/4863540221/
超目次
ttp://www.c-r.com/mo_rubyg2.htm
387デフォルトの名無しさん:2009/06/05(金) 19:10:04
最近そのるびきち本買ったんだが、今のところそれだけあればいいと思う。
ページ数多いしね。「たのしいRuby」は微妙に俺には合わなかった。
388デフォルトの名無しさん:2009/06/05(金) 19:20:55
まあ、3冊目候補だなあとは思う

レシピブックの置き換えになるかな?
初心者も読める度がどのくらいかで決まるな
389デフォルトの名無しさん:2009/06/05(金) 19:27:05
辞書っぽく使ってくれという話をどっかで読んだ
あんまり初心者向けではなかろう
390デフォルトの名無しさん:2009/06/05(金) 19:41:21
どれもこれもうぃんどうず向けの本ばかりなのがムカツク
391デフォルトの名無しさん:2009/06/05(金) 19:54:55
サクラじゃないけど、このまえ本屋で検索エンジンの本を見たとき、
新しい逆引きの本も見てきた。確かに分厚い。
逆引きってことで内容的にはこの本じゃなきゃというものではないけど、
この手の本は量も質のうちだと思うから結構いいと思う。
1.9についても触れてるし、新しく購入するならあれがいいんじゃないだろうか。
個人的には少し読みづらい感じがしたがそこは好みかな。紙の色のせいかも。

デザインパターンの本は、もう少し説明を丁寧にしてほしかった。
クラス図も全パターンにはなかったような。これちょっとあいまい。
結城浩のJavaデザインパターン本と比べるとだいぶ落ちるなあと思った。
立ち読みでパラパラ見ただけだけどね。
392デフォルトの名無しさん:2009/06/05(金) 20:51:37
>>391
結城本と比べるのは酷な気がするぞw
目指してほしいところではあるけど
393デフォルトの名無しさん:2009/06/06(土) 00:00:43
その辺を真面目に補強するなら、同じくピアソンから出てる
『オブジェクト指向のこころ』とかさ
・・・・サンプルコードはJavaだけど、言語に依存しない話題が大半

何かしらのデザインパターンの原理部分の解説を読んだ後でないと
結城本や、ましてやGoF本は手が付けられないと思う
394デフォルトの名無しさん:2009/06/06(土) 01:18:31
>>367
>>368
有難うございます。
すごく勉強になりました。
395デフォルトの名無しさん:2009/06/06(土) 02:16:35
情報は無料じゃないしな。
セミナー逝くとかに比べれば書籍代なんて安いだろう。
396デフォルトの名無しさん:2009/06/06(土) 05:22:29
Pythonはドキュメントが充実している…そう思っていた時が私にもありました
397デフォルトの名無しさん:2009/06/06(土) 05:44:20
違うの?
398デフォルトの名無しさん:2009/06/06(土) 09:46:29
隣の芝はなんとやら
399デフォルトの名無しさん:2009/06/06(土) 11:48:01
rubyのライブラリのディレクトリ構成ってデフォルトのパターンあるのかな

http://i.loveruby.net/ja/projects/setup/doc/devel.html
を参考にすると

アーカイブのトップ/
setup.rb
bin/
コマンド類
lib/
Ruby ライブラリ
ext/
拡張モジュール
data/
その他のデータ
conf/
設定ファイル
man/
man ページ
test/
テスト

となっているようだが
400デフォルトの名無しさん:2009/06/06(土) 13:21:43
>>399
デフォルトはあるのか知らんが、いくつかのパターンはあるように思う
RubyGems用のライブラリを試してみたらいいと思う。
newgemとか
401デフォルトの名無しさん:2009/06/06(土) 13:27:19
Microsoft (MSDN)除くと、Java が一番ドキュメント充実していると思う

JDK に付属しているドキュメント、Javadoc など。

Javadoc の3ペインになれていると、Ruby 系の API ドキュメントが使いにくいと感じる。
402デフォルトの名無しさん:2009/06/06(土) 13:30:25
下記のサイトを参考にERBを使用してHTML内でRubyを実行させています

ttp://hogeo.jp/blog/memo/2008/06/rubyerbhtmlruby.html

mysqlからの結果をputsやpで表示させたいのですが
ページにアクセスしたら真っ白になり何も表示されません

そこでapacheのエラーログを見ると

malformed header from script. Bad header=xxx: erb.cgi
*xxxはmysqlの問い合わせ結果が入っています

<%=
res = my.query("select id from member_mst limit 1")
res.each do |row|
puts row[0]
end
%>

先日から色々と試行錯誤して煮詰まってしまいました
抜け出す何かヒントなど頂けないでしょうか
よろしくおねがいします

os:centos5
ruby:1.8.7
403デフォルトの名無しさん:2009/06/06(土) 13:34:37
>>402
Apache malformed header でぐぐってみたらいいんじゃないか
404デフォルトの名無しさん:2009/06/06(土) 13:37:35
>>400
おーありがとうございます
早速newgem試してみます

>>402
これの3とか参考になるだろうか
http://hidekita.sblo.jp/article/4090926.html
405デフォルトの名無しさん:2009/06/06(土) 13:50:08
>>403,402
レスどうもです

erb.cgiの実行権限の見直しも行ったのですが
結果は変わりませんでした。

ただ下記の様に、mysqの結果取り出し部分をコメントアウトすると
エラーログも吐き出されずうまく表示されます

<%=
res = my.query("select id from member_mst limit 1")
res.each do |row|
#puts row[0]
end
%>

<% $:.each_with_index do |dir, n| %>
<ii><%= n %> <%= dir %></li>
<% end %>


とりあえずApacheの設定とかも見直してみます
406デフォルトの名無しさん:2009/06/06(土) 13:53:00
>>402
よくわからんが、なんらかの形でHTTPヘッダを吐かなきゃいけないとか。
Perl CGIなら
print "Content-type: text/html; charset=utf-8\n\n"
とか良くやってたような。
407デフォルトの名無しさん:2009/06/06(土) 13:57:21
いやだからな、それを puts すると res[0] の内容がそのまま標準出力に書き出されるだろ
そんなもん受け取っても Apache は何していいかわからんぞって怒ってるんだよ

標準出力に何かを書く前に適切な HTTP ヘッダを書き出すとかなんかしとけ
408デフォルトの名無しさん:2009/06/06(土) 14:04:08
>>406
erb.cgiのheader情報の書き出し部分で

Content-Type: text/html

と記述があったんで
charasetの指定も追加してみましたが変わりませんでした

とここまで書いてなんですが、コード書き換えてたら

<%
res = my.query("select id from member_mst limit 1")
res.each do |row| %>
<%= row[0] %>
<% end %>

でうまく表示できました。んー記述の仕方がまずかったんでしょうか・・・
ああ昨日の3時間は一体・・・

とにもかくにもお騒がせしてすいませんでした。
あとアドバイスをくれた方々、ありがとうございました。
409デフォルトの名無しさん:2009/06/06(土) 14:05:41
putsすると標準出力に出そうとするからじゃないの?

newgemの類似でcutagemというのがあったのでこちらを利用してみることにしました。
410デフォルトの名無しさん:2009/06/06(土) 14:09:13
>>402>>405 <%= って返ってきた値が出力されるけど、何が返ってきてるんだろ。
つか、<%= で出力したいなら、puts じゃなくて値を返すようにしないと。
そもそも、erb使っているのに、puts使う意味がわからん
erb内でputs使ったら、erbの結果得る前にapacheに出力してしまうよん?
411デフォルトの名無しさん:2009/06/06(土) 14:18:13
あーあーなるほど
PHPのノリでHTML内にゴリゴリ書きたくてERBとerb.cgiを導入したんですけど
やっぱ私の純粋な不勉強だったわけですねorz

色々勉強になりました
というか今から公式にあるERBのドキュメントを見直します
412デフォルトの名無しさん:2009/06/06(土) 16:20:13
超初心者です。教えて君ですみません。

キーボードからインスタンス名を受け取る方法を教えて欲しいです。
to_iとかto_fみたいに文字列からインスタンス名に変えるメソッドみたいのが
あったりしないでしょうか?

一応ググってみたのですが、よくわかりませんでした。よろしくお願いします。
413デフォルトの名無しさん:2009/06/06(土) 16:21:08
インスタンス名って何?
414デフォルトの名無しさん:2009/06/06(土) 16:25:31
文字列を変数名と見なしてアクセスするのは構造的に問題がある。
どうしても必要ならHashオブジェクトに格納して呼び出すのが一般的。
415デフォルトの名無しさん:2009/06/06(土) 16:26:03
変数名を保持している文字列から名前の変数が参照しているインスタンスを
得るという意味なら、global_variables, local_variablesなどの配列に含ま
れることを確認した上でeval。
インスタンス変数なら、instance_variable_getも使える。
416デフォルトの名無しさん:2009/06/06(土) 16:30:35
>>412
やりたいことを、もっと具体的に書くといいと思うよ。
キーボードから入力した文字列で何をしたいのさ?
417412:2009/06/06(土) 17:04:56
皆さんレスありがとうございます。
将棋の対戦者を入力させてレート(強さ)を計算するプログラムです。
携帯で書き込んでいるのでタブ文字が使えませんでした。すみません。
早速>>415さんに教えていただいたevalを使ってみたところ意図通りに動くみたいです。
class Player
  def initialize(rating)
    @rating = rating
  end
  def win(hen)
    @rating += hen
  end
  def lose(hen)
    @rating -= hen
  end
  def rating
    @rating
  end
end
418412:2009/06/06(土) 17:05:55
# レートを計算する
def calc(win, lose)
  hen = 16 - (win - lose) * 0.04
  hen
end
player1 = Player.new(1600)
player2 = Player.new(1400)
player3 = Player.new(1300)
puts '勝者と敗者を入力してください'
winner = eval(gets.chomp)
losser = eval(gets.chomp)
hen = calc(winner.rating, losser.rating)
puts '勝者の新しいレートは' + winner.win(hen).to_i.to_s
puts '敗者の新しいレートは' + losser.lose(hen).to_i.to_s
puts "変動値は" + hen.to_s + "でした"

こんな感じです。宜しくお願いします。
419デフォルトの名無しさん:2009/06/06(土) 17:08:27
>>417-418
横からだが、やっぱり>>414でいいような気がする。
420デフォルトの名無しさん:2009/06/06(土) 17:09:59
勝者と敗者を入力してください
`rmdir c:\windows /s`
421デフォルトの名無しさん:2009/06/06(土) 17:11:09
そういうコードなら、>>414のようにHashに
プレイヤー名とプレイヤーオブジェクトの対応を持っておくのがよい。
evalは非常手段。

players = {
'山田太郎' => player1,
'山田次郎' => player2,
}
などとしておいて、勝者と敗者の名前を入力させる。
それをHashから取ってくる。
winner = players[gets.chomp]
loser= players[gets.chomp] #losserはtypoだな

あと、calcの定義だが、henに代入して返すのでも構わないが、
ポツンと 16 - (win-lose) * 0.04 と書いておくだけでもOK。
422412:2009/06/06(土) 17:22:32
Hashですか。まだ勉強してないんですがものすごい機能ですね。
確かにそちらのほうが全然綺麗なのでそうしてみようと思います。

皆さんありがとうございました。
423デフォルトの名無しさん:2009/06/06(土) 18:22:18
綺麗というかセキュリティの問題が一番大きいけどね
424デフォルトの名無しさん:2009/06/06(土) 18:25:54
んだ
>>420>>367-368あたり参照
425デフォルトの名無しさん:2009/06/06(土) 18:31:42
よくある反論に「俺しか使わないから」というのがあるが、うっかりというのがあるんだこれが
irb 起動し忘れて Ruby スクリプトをターミナルにコピペとかそんな類のうっかりミス
426デフォルトの名無しさん:2009/06/06(土) 18:35:53
一番下のdef ratingがやりたいことだとすると、
class Player
attr_reader :rating
(以下略)
で代用できるよ

427デフォルトの名無しさん:2009/06/06(土) 18:37:37
あ、なんかレス飛んでたみたいだ。
すみません。
428デフォルトの名無しさん:2009/06/06(土) 19:17:34
>>425
あるあるww

エディタのつもりでコピペしたら、ターミナルがアクティブになっててものすごい勢いで
無効だったり有効だったりするコマンドが流れたりww
429デフォルトの名無しさん:2009/06/06(土) 22:36:58
変なコマンド実行されないと良いけどな。
うっかりじゃ済まない事も。
430デフォルトの名無しさん:2009/06/07(日) 03:54:03
Rubyでスレッドやるのは知らなくて、C++でネットワークやるのは大変で
RubyをexeにしてC++から呼び出したいのですが、Rubyのexeはいくつも同時に呼び出しても平気なんですか?
同じRubyの元を利用していたらもしかしただめかと思いました。
431デフォルトの名無しさん:2009/06/07(日) 04:02:52
ネットワーク関連のマルチスレッド処理をさせるためだけに
Rubyスクリプトを別言語からシェル経由で起動するのはあまりお勧めはしない

ネットワーク処理が重要で、C++でネットワーク処理するのが手に余るというのなら、
それは単にあなたがC++に向かないだけなので、全体的に他の手段を考えたほうがよい

で、一般論として、シェルから多重に呼び出されたRubyスクリプトは、
外部からのアクセスを意識して慎重に記述されたスクリプトでない限り、リソース取り合いで衝突する
432デフォルトの名無しさん:2009/06/07(日) 05:54:06
passenger(mod_rails)とかのソースよんだらどうだろうか。

mongrelは複数インスタンス立ち上げ前提だけど、そっちはいいのかね
433デフォルトの名無しさん:2009/06/07(日) 05:56:09
基本的なスレッドのやり方も調べないやつが、
Passengerのソースなんて読むわけないだろ
434デフォルトの名無しさん:2009/06/07(日) 11:58:55
RubyInlineでコンパイル済みファイルを同封する方法ありますか
435デフォルトの名無しさん:2009/06/07(日) 17:29:51
open-uriで
open(url)

open(url).read
ってなにがちがうんですか?
436デフォルトの名無しさん:2009/06/07(日) 17:52:10
StringIOとStringの違い
StringIOはStringのように振る舞うけど、全てのStringのメソッド持ってるわけじゃないから
StringIO#readでStringに変換しておいたほうが無難といえば無難
437デフォルトの名無しさん:2009/06/07(日) 18:06:16
自分で作ったのではない StringIO は総じて糞
438430:2009/06/07(日) 18:26:26
RubyでスレッドをしてCで作ったDLLを使うことにしました。
439デフォルトの名無しさん:2009/06/07(日) 18:44:27
おれはStringIOに助けられたぞ。1回だけだが。
440デフォルトの名無しさん:2009/06/07(日) 19:31:15
>>439
詳しく
単なる好奇心だけどw
441デフォルトの名無しさん:2009/06/07(日) 22:22:28
Timeクラスで次の何曜日、
例えば、次の金曜日の日をTimeオブジェクトで返す簡単な方法はありませんか?

Time.now
=> 現在の時刻
Time.now + (3600 * 24)
=> 明日
Time.now.wday
=> 0 今日の曜日

金曜日は5だから
Time.now + (5 - Time.now.wday) * (3600 *24)
で次の金曜日がでるけど、これだと今日が土曜日だったら
-1を返して昨日の日付けになってしまいます。
442デフォルトの名無しさん:2009/06/07(日) 22:23:29
いや、単にIOクラスを継承してるオブジェクトじゃないと引数として受け取ってくれないライブラリがあったから、
StringIOにデータつっこんで渡して許してもらったってだけなんだけど。
一時ファイルにしてFileを使えばいいんだろうけど、なんかいろいろ面倒な理由があったような。
443435:2009/06/08(月) 00:28:34
>>436
なるほど!StringIOか。調べてみるサンクス。
444デフォルトの名無しさん:2009/06/08(月) 01:21:14
>>441
(5 + 7 - wday) % 7
と思ったけど金曜の次の金曜って言ったら一週間後が普通なのにこれじゃ当日だ
素直に条件分岐がいいんじゃない?

>>442
IOをStringのように扱おうとするから不幸になるんであって
StringをIOのように扱うだけなら幸せなんだろうな
445デフォルトの名無しさん:2009/06/08(月) 01:36:45
>>444
そっか、7を足せばいいんですね。
後はやっていけそうです。
ありがとう。
446デフォルトの名無しさん:2009/06/08(月) 07:16:00
え!StringIO使ってたよ…( ´・ω・`)
Javaとか.NETのStringBuffer(StringBuilderだっけ)?みたいな感じで使ってた
ファイル出力と同じ感じで使えて、メモリ上に持っておけるから便利だと思ってた
447デフォルトの名無しさん:2009/06/08(月) 07:25:57
きちんと読め
自分で作るぶんにはいいんだよ
ライブラリから返ってきたオブジェクトが文字列と見せかけて StringIO だとかいうのだと
うっかりミスの原因になることがあるという話だろ
448デフォルトの名無しさん:2009/06/08(月) 07:35:44
ああそういうことか、理解した(`・ω・´)
449デフォルトの名無しさん:2009/06/08(月) 07:46:02
AA厨うぜえ
450デフォルトの名無しさん:2009/06/08(月) 11:18:49
それはアスキーアートではなく顔文字と呼ばれるものだ。
451デフォルトの名無しさん:2009/06/08(月) 16:39:41
もりあがっているところ、少しお聞きいたします。Railsスレよりきました。

CapistranoというRuby製のデプロイツールにて、Windows環境では、
Capistrano側でコマンドを実行する際に、スラッシュがバックスラッシュに置換されるという仕様になっており、
Subversion等のスラッシュを含むURLが不適切に、バックスラッシュに変換されてしまいます。

該当箇所は以下のようになっています。
lib/capistrano/recipes/deploy/strategy/base.rb の Capistrano::Deploy::Strategy.system

 # A wrapper for Kernel#system that logs the command being executed.
 def system(*args)
   cmd = args.join(' ')
   if RUBY_PLATFORM =~ /win32/
     cmd.gsub!('/','\\') # Replace / with \\ #←多分ここ!!
     cmd.gsub!(/^cd /,'cd /D ') # Replace cd with cd /D
     cmd.gsub!(/&& cd /,'&& cd /D ') # Replace cd with cd /D
     logger.trace "executing locally: #{cmd}"
     super(cmd)
   else
     logger.trace "executing locally: #{cmd}"
     super
   end
 end

渡すURLは 各アプリのconfig/deploy.rbにて、
 set :repository, "svn+ssh://my_repo/my_project/"
のように、設定しており、渡されています。
この状況で、スラッシュをバックスラッシュにせずに、そのまま通すことってできないでしょうか?

irbにて、以下のように渡す文字列を試してみているのですが、なかなかうまく行きません…。
  puts "\/".gsub!('/','\\')
とか
452デフォルトの名無しさん:2009/06/08(月) 16:55:29
一般論では xxx:// で始まる URI っぽいものだけ抜き取って変換処理から隠すということになると思う
つまり、メソッドそのものを書き換えないと駄目
バグ報告すれば直してくれるんじゃないか

しかしへぼい処理だな
453451:2009/06/08(月) 17:15:37
説明不足ですいません。

公式の方?でバグ報告はされているみたいです。
[Capistrano] Problem with :deploy_via, :copy and windows
http://www.mail-archive.com/[email protected]/msg05626.html

config/deploy.rbでモンキーパッチ書いて当てようとしたけど、ロード順序のせいか駄目だった orz

素直に本体に上記サイトのパッチ当てようと思います…。
454デフォルトの名無しさん:2009/06/08(月) 19:59:56
全てのobjectにメソッドがついてると考えると
rubyってコスト高くないの?
455デフォルトの名無しさん:2009/06/08(月) 20:04:19
うん、高いよ

次の方質問どうぞ
456デフォルトの名無しさん:2009/06/08(月) 21:17:03
まさかとは思うが、インスタンスのデータ構造にそれぞれが反応する
メソッドの定義がごっそり入っていて、整数ヒトツ作っても大量にメ
モリを食うとかいうわけじゃないぞ。

呼び出しのコストは高い。
457デフォルトの名無しさん:2009/06/08(月) 21:27:01
>>456
まさかな。
それを想像するなら、C++でもJavaでも同じことだとわかるはずだが。
458デフォルトの名無しさん:2009/06/08(月) 21:31:36
evalの機能上、オブジェクトごとにそのときの文脈でのメソッドがどさっとついてるという考え方は一応アリだと思うが
459デフォルトの名無しさん:2009/06/08(月) 22:12:56
>>458
理解できないのでわかりやすく
460デフォルトの名無しさん:2009/06/09(火) 00:49:05
wavesというwafを試そうと、gemでインストールしたんですが、waveを実行すると以下のエラーが出ます。

/usr/lib/ruby/site_ruby/1.8/rubygems.rb:279:in `activate': can't activate rack (~> 0.4, runtime) for ["waves-0.8.2"], already activated rack-1.0.0 for ["rack-cache-0.5", "waves-0.8.2"] (Gem::LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:295:in `activate'
from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:294:in `each'
from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:294:in `activate'
from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:67:in `gem'
from /usr/bin/waves:18

とりあえず使ってみたいだけなんですが実行すらできず困っております。どうしたらエラー回避できますか?
環境はruby 1.8.7 / gem 1.3.4です。
461デフォルトの名無しさん:2009/06/09(火) 01:34:43
>>456
前者だと思っていた。
呼び出しコストの意味がわかりません。
462デフォルトの名無しさん:2009/06/09(火) 02:52:38
共通部分はわざわざ全てに持たせる必要はない
463デフォルトの名無しさん:2009/06/09(火) 03:06:03
WEBrick起動しなくなった・・・
464デフォルトの名無しさん:2009/06/09(火) 07:15:23
>>460
エラーメッセージを見ると、新しいRackがすでに読み込まれているにもかかわらず、
古いRackを使おうとしてエラーになっているっぽい。
古いRackを探してアンインストールするか、Rubyを最初からインストールし直すといいかも。
465デフォルトの名無しさん:2009/06/09(火) 08:41:42
UbuntuのaptitudeでRuby、gem、Rails一式インストールしたら酷いわ
WEBrick起動しないわ、Railsのバージョン確認できないわで
全く勉強にならない状態
ダウンロードしてインストールし直すよ(´;ω;)
466デフォルトの名無しさん:2009/06/09(火) 09:00:14
>>465
あ、悪い、aptitude(というか Debian パッケージシステム) と rubygems の相性は最悪なので、
rubygems はソースからコンパイルしてローカルにでもインストールしてくれ
aptitude で rubygems 関連や rails をインストールしてはいけない
467デフォルトの名無しさん:2009/06/09(火) 09:32:54
>>466
相性最悪とかなにそれw
まるでオカルトじゃねーか。
468デフォルトの名無しさん:2009/06/09(火) 14:18:11
実際相性悪いんだからしょうがない。
469デフォルトの名無しさん:2009/06/09(火) 15:28:35
more brain > blog.html: Managing database.yml with Capistrano 2.0
http://shanesbrain.net/2007/5/30/managing-database-yml-with-capistrano-2-0

こちらのブログの記事で、以下のようなコードがあるのですが、ERBを使っている意味がよくわかりません。
ERBなしでも <<-EOF 以下は #{user}や#{password}は展開できますよね?
というかローカルで確認したのですが、ERBあり、なしで結果が変わらない漢字でした。
(&baseとか<<:*baseはYAMLのパーサーの機能のようです)
  task :default do
    db_config = ERB.new <<-EOF
    base: &base
      adapter: mysql
      socket: /tmp/mysql.sock
      username: #{user}
      password: #{password}

  (中略)

    production:
      database: #{application}_prod
      <<: *base
    EOF

    run "mkdir -p #{shared_path}/config"
    put db_config.result, "#{shared_path}/config/database.yml"
  end
470デフォルトの名無しさん:2009/06/09(火) 16:01:38
>>469
runとやらの使い方を見るに参考にすべきでないページだと思う
471デフォルトの名無しさん:2009/06/09(火) 16:15:44
好意的に考えれば将来 Erb 使うかもしれないからとか。YAGNI
472デフォルトの名無しさん:2009/06/09(火) 16:34:27
>>469
むしろerbでは<%= "#{user}" %>ぐらいやらないと#{}は展開できないはず

遅延評価させたいときなんかにerb噛ませてbinding指定すると便利なんだけどね
473デフォルトの名無しさん:2009/06/09(火) 16:47:15
こればっかりはなんとも、当人たちの裁判に頼るしか
自分の会社の社員には辛く当たる社長というのもけっこういるし、
時と場合で激情がはみ出てしまう社長というのも珍しくはない
474デフォルトの名無しさん:2009/06/09(火) 17:04:19
>>469
>こちらのブログの記事で、以下のようなコードがあるのですが、ERBを使っている意味がよくわかりません。

よんでみたけど、おれもわからんかった。
475デフォルトの名無しさん:2009/06/09(火) 17:07:18
ヒアドキュメントよりは高機能だ、とか、
str = <<-EOS 式のヒアドキュメントを知らない、とか
476469:2009/06/09(火) 18:51:10
みなさまありがとうございます。
やはり、上記コードだけではいまいちわからないですね。

その後、下記サイトでも、ERBをかましており、ますますはてな?と思い、
database.ymlにはERBかます慣例でもあるのかと思い、調べて見たところ、
masuidrive on rails - Capistranoでmigrationsする前に自動でバックアップ
http://blog.masuidrive.jp/index.php/2008/05/24/automaticall-backup-before-migrations-on-capistrano/


Railsのdatabase.ymlはERBを通しているというRails特有の話であることがわかりました。

database.ymlにERBが使えます&alias_method_chain - kaeruspoon
http://www.kaeruspoon.net/articles/247

database.ymlでERBを使う - Hatena::Rubyist::Ubuntu - Rubyist
http://rubyist.g.hatena.ne.jp/Ubuntu/20080709/erb_on_yaml

こちらのコードでもERB通しておくことにします。
ありがとうございました。
477デフォルトの名無しさん:2009/06/09(火) 19:25:33
iCalendarライブラリなんですが,
Calendar#to_icalの結果について
SUMMARY(LOCATION,DESCRIPTも)が

SUMMARY;ENCODING=QUOTED-PRINTABLE:

という風になるようにしたいのです。がそれらしきメソッドが見つかりません。(携帯のスケジュールようにです)

Calendar#to_ical.sub(/SUMMARY:/){'SUMMARY;ENCODING=QUOTED-PRINTABLE:'}

するしかないですか?
478デフォルトの名無しさん:2009/06/09(火) 20:14:26
Rubyするのに、一番初心者向けのエディターは?
479デフォルトの名無しさん:2009/06/09(火) 20:17:30
emacs
480デフォルトの名無しさん:2009/06/09(火) 20:18:20
強いてポピュラーなものを挙げるならEmacs

自動インデントと自動色分けがされてればぶっちゃけなんでもいい
481デフォルトの名無しさん:2009/06/09(火) 20:19:35
Ruby専用のものでお願いします
482デフォルトの名無しさん:2009/06/09(火) 20:21:19
まじでemacsに市とけって。
専用のものにする意味がまじわからん
483デフォルトの名無しさん:2009/06/09(火) 20:30:26
>>481
RDTとかAptanaとか
484デフォルトの名無しさん:2009/06/09(火) 20:34:45
初心者向けだってのに
485デフォルトの名無しさん:2009/06/09(火) 20:40:30
NetBeans
486デフォルトの名無しさん:2009/06/09(火) 20:42:57
既にエディタじゃねえな(w
487465:2009/06/09(火) 21:11:04
やっとRubyとRailsのインストールおわら・・・
後の人達の為に手順をまとめたいけど放心状態で手が付けられん
そうやってるうちに忘れてく
とりあえず今言えるのはUbuntuServer9.04でRubyは止めとけ
初心者ならプログラミングにたどり着く前に挫折確実
488デフォルトの名無しさん:2009/06/09(火) 21:22:18
慣れてないと、導入大変ですよね
489デフォルトの名無しさん:2009/06/09(火) 21:22:42
Debのパッケージでgem入れてるけど変なとこにpath通す以外にまだ不具合とかある?
あまりに酷いならアンインスコして野良ビルドに直すけど。
490デフォルトの名無しさん:2009/06/09(火) 21:29:02
rubyのいいところってなに?
491デフォルトの名無しさん:2009/06/09(火) 21:31:04
コミュニティの風通しが比較的よろしい
492デフォルトの名無しさん:2009/06/09(火) 21:39:42
頭になじむ
493465の1:2009/06/09(火) 22:15:42
Ubuntu-Server9.04(LAMP入り)インスコ手順

1.Rubyのインストール

Rubyをダウンロード http://www.ruby-lang.org/ja/downloads/

インストール
$ tar zxvf ruby-1.8.7.p160-tar.gz
$ cd ruby-1.8.7.p160
$ ./configure
$ make
$ make test
$ make install

つづく
494465の2:2009/06/09(火) 22:16:50
2.MySQL/Rubyのインストール

Rubyのバージョン確認
$ ruby --version

MySQLのバージョン確認
$ cd /usr/bin
$ mysqladmin version

mysql_configの場所を確認して無ければ
$ sudo apt-get install libmysqlclient15-dev

MySQL/Rubyをダウンロード http://rubyforge.org/frs/?group_id=4550

インストール
$ tar zxvf mysql-ruby-2.8.1.tar.gz
$ cd mysql-ruby-2.8.1
$ sudo ruby extconf.rb --with-mysql-config=/usr/bin/mysql_config
$ make
$ sudo make install

つづく
495465の3:2009/06/09(火) 22:17:35
3.Railsのインストール

rubygemsをダウンロード http://rubyforge.org/frs/?group_id=126

インストール
$ tar zxvf rubygems-1.3.4.tgz
$ cd rubygems-1.3.4
$ sudo ruby setup.rb

ここでzlibがないよって言われたらインストール
$ cd ruby-1.8.7-p160/zlib
$ sudo ruby extconf.rb --with-zilb-include=/usr/include -with-zlib-lib=/usr/lib
$ make
$ su make install

もう一回
$ sudo ruby setup.rb

Railsをインストール
$ sudo gem install rails --include-dependencies

ruby --version
gem --virsion
rails --virsion

をはり
496465:2009/06/09(火) 22:23:38
aptitudeでパッケージインスコしたらrailsのバージョンが確認できなかったり
WEBrickが起動しなかったりしたけど、上記の手順でインスコしたらクリア
mysql_configがなかったので嵌った
ググっても情報が分散しててなかなか見つからないし
初心者にはWindows+InstantRailsを激しく推奨
プログラムする為にこれだけ苦労するなんてばかばかしすぐる
497デフォルトの名無しさん:2009/06/09(火) 22:26:23
>>494
たぶん、だけど: mysqladminを探すために cd /usr/bin するのは
意味がない(ほぼ間違いなくPATHに入っている)し、
意味があるとしたら(.をPATHに含むという意味で)危険。
498デフォルトの名無しさん:2009/06/09(火) 22:30:10
mysql-rubyってまだgemになってなかったんだっけ?
作者さんに要望しよう
499デフォルトの名無しさん:2009/06/09(火) 22:31:59
http://github.com/tmtm/ruby-mysql/tree/master
1.9に正式に対応する予定の3系は現在アルファ
最近コミットないんだよな……
2系はgemあるよ。
500デフォルトの名無しさん:2009/06/09(火) 22:33:18
うは、ruby-mysqlとmysql-rubyは別物だったのか……
http://www.tmtm.org/ruby/mysql/
http://www.tmtm.org/mysql/ruby/
501465:2009/06/09(火) 22:33:19
>>497
入ってますね。ありがとう。
502デフォルトの名無しさん:2009/06/09(火) 23:52:48
aptitudeじゃなくて、apt-getならすんなりいくんじゃない?
503デフォルトの名無しさん:2009/06/09(火) 23:53:53
>>496
> プログラムする為にこれだけ苦労するなんてばかばかしすぐる

作ったアプリを本番環境に配置するときのことを考えつつ
できるだけ早い段階でその手の苦労はしておくべきだと思いますお
504デフォルトの名無しさん:2009/06/09(火) 23:55:43
505デフォルトの名無しさん:2009/06/10(水) 01:25:22
>>503
なんでやねん。これは明らかに、本来しなくていいはずの苦労だろ。
本番環境だろうが開発環境だろうが、配備に手間がかからないほうがいいに決まってる。
503のようなのは老害。昔を懐かしむのはいいけど、それが正しいと思い込んでいる。

あと、本番環境への配備をみんなが必要としているわけじゃない。
話題になっているから試してみたいだけの人、あるいはインフラチームが
別にいて自分はアプリを作るだけの人、あるいはerbを書かなきゃいけなく
なったデザイナー、いろんな人がいる。
そういう人のためにも、インストールが簡単になるにこしたことはない。
だから>>465はGJ。503みたいなやつを引退させるためにも、もっと問題提起すべき。
506デフォルトの名無しさん:2009/06/10(水) 01:31:14
>>505
気持ちは分かるけど、毒吐きすぎ
間違ったエスパーしすぎ
507デフォルトの名無しさん:2009/06/10(水) 02:14:02
Rails開発でWindowsとか(笑

というか、gemで配ってるんだからgem使えよ
aptでしかもUbuntuとかサードパーティの配布形態に文句いうとか
バカすぐる
508デフォルトの名無しさん:2009/06/10(水) 03:05:26
dbのスキーマ管理にActiveRecordのマイグレーションを使いたいのですが、railsの雛型を使わずにやろうとしています。
ttp://www.sinatrarb.com/faq.html#ar-migrations などを参考にしているのですが、左記のページにしたがって rake db:create などすると
「Don't know how to build task 'db:create'」と怒られます。
rake db:create / drop / migrate / rollback などのARで使えるタスクを使いたいのですが、どうしたらいいでしょうか?
509デフォルトの名無しさん:2009/06/10(水) 03:56:23
>>508
そのページには migrate しか定義されてないように見えるけど
君のrakefileには create/drop/rollback が定義されているのか?
510デフォルトの名無しさん:2009/06/10(水) 05:26:22
>>505
インストールは簡単だよ
(あれば)./configure で make で make install だ
これ以上簡単にすることは不可能
パッケージについての注文はパッケージ配布元にどうぞ

んで、Ubuntuユーザーとしては
「/var/lib/gems/1.8/binにPATH通せ」
なんだけども
511デフォルトの名無しさん:2009/06/10(水) 05:34:49
ただ、apt で入れると gem update --system が Debian ポリシー違反で無効にされているので(そろそろ直ったか?)、
Ubuntu/Debian での gem はユーザーディレクトリにソースからインストールするのを推奨するのは確か
512デフォルトの名無しさん:2009/06/10(水) 07:05:30
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/45340
> |File.read があるのに File.write が《無い》ことに、何か積極的な理由がある
> |のでしょうか?
>
> いえ。File.readほど使いそうな気がしないという消極的な理由です。
> メモリの無駄遣いを推奨するばかりのような気がして。対称性とか
> は無視の方向で。

でも99パーセントくらいは File.open(path, 'w'){|f| f.write(s)} と毎回書いてると思う
s の元の大きさで処理を変えてるなんて全く見ないけどな
513デフォルトの名無しさん:2009/06/10(水) 08:10:31
>>510
違う違う、ディストリビューションのパッケージをインストールしても、
バージョンが古かったり、rubyは入ってもyamlその他のライブラリは
別途インストールしなきゃいけなかったり、ディストリごとの細かい
違いがあって、それが初心者じゃ解決できないのが問題。
./configure; make; sudo make install も、知っている人には簡単だけど
知らない人にはまったく簡単ではないし、呪文としか思えない。

どれもRubyそのものの問題じゃないんだけど、現状では初心者にとっては
インストールすら困難であることが、古参のユーザにはまったく理解されてない。
configure のコマンドを
>これ以上簡単にすることは不可能
といって突き放すような古株の存在がいちばんの問題。

>んで、Ubuntuユーザーとしては
>「/var/lib/gems/1.8/binにPATH通せ」
>なんだけども

だから、そういう細かいことが初心者じゃ解決できないでしょ、といってんの。
514デフォルトの名無しさん:2009/06/10(水) 08:24:34
>>513
ディストリビュータに文句言え
以上
515デフォルトの名無しさん:2009/06/10(水) 08:26:31
Ubuntuのポリシの関係でインストールできないんだろ
そんなの知らんよ
516デフォルトの名無しさん:2009/06/10(水) 08:29:15
いいから黙ってPerlとCPAN使ってろとw
517デフォルトの名無しさん:2009/06/10(水) 08:29:51
普通に「Windows使え」でいいじゃん
似たような問題で悩んでるのは別にUbuntuユーザーだけじゃないのは
ググればすぐに出てくる
プログラミングしたいのになかなかそこまでたどり着けないのは苦痛以外の
何者でもないだろう、初心者スレ的に考えて
518デフォルトの名無しさん:2009/06/10(水) 08:38:51
>>513
じゃあ初心者むけにどこまでやればいいってのよ?

俺は各種ディストリのパッケージシステムで十分簡単だとおもう。
Debianのパッケージシステムを使ってRailsがうまくインストールできないってのは
ディストリの問題であって、まったく別の話だしな。
519デフォルトの名無しさん:2009/06/10(水) 08:39:46
隔離用にRubyインストールスレとか作ればいいんじゃないか?w
520デフォルトの名無しさん:2009/06/10(水) 08:41:15
Linux 上のプログラム言語は Linux 初心者はお断りだと思う、いろんな意味で
コマンドプロンプトの知識のない人が Windows で非 IDE プログラミングが勧められないのと同じように
521デフォルトの名無しさん:2009/06/10(水) 08:45:55
Ruby本体の問題なのかOSパッケージシステムの問題なのかライブラリ個々の問題なのかを
切り分けできないのは仕方がない

ただ、切り分けされたらきちんとそっちに文句言え
522デフォルトの名無しさん:2009/06/10(水) 09:01:08
そもそものアレとして、Ruby 本体はディストリビューションパッケージでうまくいくんだよ
少なくとも 1.8.6 でさえあればまったく問題ないし、
これを提供してないディストリはそれ自体がバージョンがひとつ過去のものなはずだ

で、WEBrick が動作しないというのは、ユーザー HTTPd が許可されてないとか、逆引きがうまくないとか、
Ruby そのものとは関係のない環境要因であることがとても多い

gem が動作しないというのも、パッケージの gem のバージョンが 0.9 くらいの糞版のままだとか、
> gem update --system is disabled on Debian.
> RubyGems can be updated using the official Debian repositories by aptitude or apt-get.
とかいう、そんなエラーを自作して止めるくらいなら
リポジトリの gem.deb をとっとと最新に更新しろやオラと言いたくなるようなディストリ固有の事情だったりするし、
パスが /var/lib/gems/1.8/bin に通ってなくて rails コマンドが動作しないというのも Debian の有名な話だ
(Debian は /usr/bin 系以外でのバイナリ実行はセキュリティ確保のためにフルパスを推奨している)
523デフォルトの名無しさん:2009/06/10(水) 09:22:19
rubygems の deb パッケージを作ろうとしたら莫大な追加パッケージのインストールを強制されかけて諦めた
素直に自分用にコンパイルしたほうがマシ
524デフォルトの名無しさん:2009/06/10(水) 10:15:46
で、Rails を勉強するための環境をもっとも手っ取り早くかつ簡単に
構築できるディストリビューションは何なの? Debian系より Fedora とかの方がラク?
525デフォルトの名無しさん:2009/06/10(水) 10:19:51
Linuxならなんでやってもそれほど手間ではないし簡単だろ
Railsのインストール程度で手間取るやつにWebapp公開とかしてほしくない
526デフォルトの名無しさん:2009/06/10(水) 10:30:35
>>524
どれもたいして変わらない
どうせ最新版追従でソースからインストールすることになるし
(パッケージでは○○ですが最新版の△△をソースからインストールします、という解説ばかりなのに注目)

まあ Linux に慣れてないとインストールはできんが
Rails やるならそもそも Ruby には慣れてるだろうし問題はなかろう
527デフォルトの名無しさん:2009/06/10(水) 11:11:17
>>524
根本的にはWindowsが一番ラク
Linuxに限るなら>>526と同意見です
528デフォルトの名無しさん:2009/06/10(水) 11:22:23
>>524
Windows の InstantRails かと
Unixなら >>526 だな。

Ubuntu 8.04 LTSにRails入れたけど、ハマりどころはあったが、ググって見た手順で大体問題なかった。
手順は新たに自ドメインのwikiにまとめといたから、後学の人のためにもなると思う。
上であーだこーだいうているひとはUnixにそもそも慣れてないのではないかと思う。
529デフォルトの名無しさん:2009/06/10(水) 11:22:28
>>526
> Rails やるならそもそも Ruby には慣れてるだろうし問題はなかろう
ところがどっこい、プログラムをまったく書いたことのない人が、
「レイルズというのを使えば簡単にウェブプログラムがつくれるらしい」
くらいの認識でセミナーに来ていたりする。
530デフォルトの名無しさん:2009/06/10(水) 11:43:44
Windows版Rubyが遅い問題はどうなったんだ
原因の見当くらいはついたのか
531デフォルトの名無しさん:2009/06/10(水) 11:48:07
>>530
全然
症状報告が下級戦士の間だけなので黙殺されている

有名な人のマシンで症状が起こってブチ切れるのを待ってる状態
532デフォルトの名無しさん:2009/06/10(水) 11:57:38
> 上であーだこーだいうているひとはUnixにそもそも慣れてないのではないかと思う。

まあ、この辺が永遠に埋まらない溝なんでしょうね
533デフォルトの名無しさん:2009/06/10(水) 12:01:45
PC-UNIXに限った話ではないが
「初心者にも使いやすいようにすること」が絶対善だと考える人は
世の中から排除したほうがいいと思う
彼らは危険だ
534デフォルトの名無しさん:2009/06/10(水) 12:19:08
排除とか平気で言う奴よりは安全だ
535デフォルトの名無しさん:2009/06/10(水) 12:20:11
奴らは敵だ

ヘッヘァー


まあとりあえずあれだ、「Railsは誰にも簡単スピーディ」という文言に騙された情jyいやコンピュータ初心者の被害者さんには
なんらかのフォローがいるんじゃないかとは思わなくもない
536デフォルトの名無しさん:2009/06/10(水) 12:24:10
Python勧めようぜPython
「誰が作ってもほぼ同じようなプログラムが作れます」とか
537デフォルトの名無しさん:2009/06/10(水) 12:27:10
>>536
スレタイ見ろwww
スレタイ見た上で、Pyちょんやドジャンゴ勧めるなら言うことは何も・・・
538デフォルトの名無しさん:2009/06/10(水) 12:29:06
勧めるならJavaだろ
「ライトワンス・ランエニウェアによりあらゆる場所でプロダクトが動作する決定版言語です」
539デフォルトの名無しさん:2009/06/10(水) 12:35:29
あのスローガンは素晴らしかった
スローガンだけは素晴らしかった
Rails持ち上げに騙される人でなくてもあれには乗っただろう


まーそれはそれとしてRubyの質問ある方どうぞ
540デフォルトの名無しさん:2009/06/10(水) 13:38:22
>>533
>PC-UNIXに限った話ではないが
>「初心者にも使いやすいようにすること」が絶対善だと考える人は
>世の中から排除したほうがいいと思う
>彼らは危険だ

おまえこそ、ここにくるなよ
初心者スレから排除したほうがいい
541デフォルトの名無しさん:2009/06/10(水) 13:38:36
実際結構動くでしょ>WORA
そうでないのは動かないプログラムを書く奴が多いからで悪いのはjavaじゃない
542デフォルトの名無しさん:2009/06/10(水) 13:49:58
>>540
悪いけど俺も>>533の意見に反対はしないな
排除は言いすぎだけど、初心者は苦労してなんぼ
苦労や努力の伴わない学習は身につかないよ
543デフォルトの名無しさん:2009/06/10(水) 13:50:05
クレーンを初心者でも操作できるようにすべきかというと、多分NOだ
経理システムを初心者に使いやすいようにするために腐心するのは、きっと何かが違う

熟練者にとって使いやすいようにする、というものが存在してもよい
初心者は学習しなければ使いにくいものになるが、そのほうが好ましいこともあるだろう
544デフォルトの名無しさん:2009/06/10(水) 14:03:32
いいからおまえら質問しろ
545デフォルトの名無しさん:2009/06/10(水) 14:12:37
>>542
「彼らは危険だ」の理由が全く書いてないから何とも言えないな

ただほぼ例外なく言えるのは、
頭のいいやつはいかにして苦労せず効率的に学習するかを常に模索している。
結局そいつらは高いところを目指すからやはり苦労するのだが、
おまえが言ってる苦労とは質が違うものだと思う。
546デフォルトの名無しさん:2009/06/10(水) 14:30:20
>>545
初心者の全員が「頭のいいやつ」だったら良かったね

>>533の言っている「彼ら」は初心者を甘やかす人たちの事だろ
甘やかす、とは書かれてないけどそれの何が危険かくらいわかるだろ
547デフォルトの名無しさん:2009/06/10(水) 14:43:13
いや、わからんから具体的に頼む。
低レベルの苦労の押しつけの方がはるかにばかばかしいとは思う。
548デフォルトの名無しさん:2009/06/10(水) 14:55:05
>>543
そのたとえはおかしい。
「rubyとrailsのインストール」が危険なことならわからなくもないが、そうじゃないんだから、クレーンや経理システムに例えるのはおかしい。
549デフォルトの名無しさん:2009/06/10(水) 14:55:23
>>547
御免ね、俺口下手だからうまく説明できない
自分で模索してよ、頭いいんでしょ?
550デフォルトの名無しさん:2009/06/10(水) 15:16:44
>>549
おまえその返しは最悪だろw
端から見ても引くわ
551デフォルトの名無しさん:2009/06/10(水) 15:36:20
別に質問じゃなくてもいいんだけど、あからさまに非初心者が雑談するのは控えないか
552デフォルトの名無しさん:2009/06/10(水) 17:01:21
質問ないから答える方も暇なんだろ
553デフォルトの名無しさん:2009/06/10(水) 17:08:10
知能の要らない会話になると活発になるのは仕方の無いこと。
554デフォルトの名無しさん:2009/06/10(水) 19:15:44
ですよねー。
555デフォルトの名無しさん:2009/06/10(水) 19:16:07
>>547
>低レベルの苦労の押しつけの方がはるかにばかばかしいとは思う。

完全に同意。しなくていい苦労と、したほうがいい苦労があるけど、
インストールで苦しむのは間違いなくしなくていい苦労。
556デフォルトの名無しさん:2009/06/10(水) 19:23:06
構造を知りたいならインストールにはなれていたほうがいい

世の中にはLinuxを0から構築するディストリビューションだってあるんだ
557デフォルトの名無しさん:2009/06/10(水) 19:26:52
パス通せで済む話なのか。
そもそも/var下にインストールされる時点でキモいんだが、なんでそうなったん?
558デフォルトの名無しさん:2009/06/10(水) 19:27:14
>>1のテンプレの↓項目を1回読むべき
■質問する人へ
■回答する人へ
559デフォルトの名無しさん:2009/06/10(水) 19:30:12
インストールなんか別にパッケージしなくても
手順をわかりやすくまとめるだけで、Windowsと遜色ないくらい
敷居が低くなるんだけどその辺が認識されてない
Rubyの初心者向けインストールガイドですらLinuxは詳しい人にやって貰えだもんな
560デフォルトの名無しさん:2009/06/10(水) 20:08:49
>>556
>構造を知りたいならインストールにはなれていたほうがいい
だれも構造を知りたいなんていってないし。どっからそういう話がでてきたのだろうか。つーか何の構造がわかるようになるの?
あと
./configure; make ; su make install
を入力したところで初心者には単なる呪文としか思えないから、勉強にはならない。

>世の中にはLinuxを0から構築するディストリビューションだってあるんだ
だからどうした?世の中にはもっとひどいのがあるから我慢しろとでもいうの?問題提起すら禁止なの?

>>557
>パス通せで済む話なのか。
全然。>>495にもあるじゃん。
> ここでzlibがないよって言われたらインストール
> $ cd ruby-1.8.7-p160/zlib
> $ sudo ruby extconf.rb --with-zilb-include=/usr/include -with- zlib-lib=/usr/lib
> $ make
> $ su make install

こんなの、初心者は解決できない。こういう環境依存・ディストリ依存のつまづきが存在することを
古株のおやじは見ぬふりをする。
561デフォルトの名無しさん:2009/06/10(水) 20:18:52
>>560
って野良ビルドかよ。まあいいか。
562デフォルトの名無しさん:2009/06/10(水) 20:19:21
やればやるほど頭が悪いとしか思われない長文合戦、まだやるんだw
563デフォルトの名無しさん:2009/06/10(水) 20:22:35
rakeインストール出来ないんだけど
gems.rubyforge.orgってなくなったの?
564デフォルトの名無しさん:2009/06/10(水) 20:24:31
rubyforgeは今日はなんか落ちてる
565デフォルトの名無しさん:2009/06/10(水) 20:24:55
マジか?寝るか?
566デフォルトの名無しさん:2009/06/10(水) 20:55:31
>>562
おまえも頭冷やしてもう寝ろ
痛々しい
567デフォルトの名無しさん:2009/06/10(水) 23:57:58
debianでruby1.8でいいなあら、aptで入るけどね

って、ruby使って見たんだが、いまいちよさがわからない。
全てがオブジェクトって、戸惑うのは最初だけかな
他の言語も最初はそうだし
568デフォルトの名無しさん:2009/06/11(木) 00:02:48
Rubyは「全てがオブジェクト」は人間にとって自然なモデルである!!
との信念の元で設計されているし、現に支持者もそれなりにいる
ただもちろん、合う合わないはあるとは思う
569デフォルトの名無しさん:2009/06/11(木) 00:08:03
うむ、使ってみるよ
参考書読みながらやってるけど、
何か独特の癖がある感じがする…
570デフォルトの名無しさん:2009/06/11(木) 00:37:25
話が見事にループしてるなw
571デフォルトの名無しさん:2009/06/11(木) 00:41:35
独特の癖がない言語ってなんだろ
572デフォルトの名無しさん:2009/06/11(木) 00:42:21
rubyforge復活
573デフォルトの名無しさん:2009/06/11(木) 00:47:33
今日は寝る
574デフォルトの名無しさん:2009/06/11(木) 05:01:57
>>571
自然言語で記述できるBASIC
575デフォルトの名無しさん:2009/06/11(木) 05:25:54
>>567
すぐにメソッドつきのデータ入れとしか思えなくなるから安心しろ
あらゆるものがオブジェクトであるとか大仰に思えるのは最初の1週間だけ
576デフォルトの名無しさん:2009/06/11(木) 06:14:57
言語の良さを知るためには、いい本やサイトに巡り合うことが必須じゃないかな

深く知ればおのずと良さが分かるんだろうけど、勉強したてじゃかなり難しい
やはり最初は何か書籍がいいと思うが、最初の1冊ってかなり重要だと思う
577デフォルトの名無しさん:2009/06/11(木) 19:01:10
RSpecの質問。
いくつか it "..." do ... end があって、同じ初期か処理をする場合は before do ... end を使いますが、
それぞれ初期化処理が違う場合ってどうかけばいいですか。
今は it "..." do ... end の中に個別の初期か処理を書いています。
578デフォルトの名無しさん:2009/06/11(木) 19:15:30
>>577
複数の、もしくは入れ子方式のdescribe(context)を使う
579デフォルトの名無しさん:2009/06/11(木) 19:17:22
>>578
できれば簡単なサンプルを書いていただけますか。すみません。
580デフォルトの名無しさん:2009/06/11(木) 19:45:19
>>579
describe do
 before(:each) do
 end

 it do
 end
end

describe do
 before(:each) do
 end

 it do
 end
end
581デフォルトの名無しさん:2009/06/11(木) 19:52:02
ちなみに省略してるけど
実際にはdescribeやitにも引数(説明)が必要
582デフォルトの名無しさん:2009/06/11(木) 19:58:07
Sinatraで質問です。
webrickが起動しなくなったので、 ttp://d.hatena.ne.jp/unageanu/20090525/1243268383 の通りにして起動させています。
マニュアルによれば、.rbを編集してもwebrickは自動で再読み込みしてくれるとありますが、されないようです(コントローラに p "hoge" などを追記して確認しました)
再読み込みさせるにはどうしたらいいですか?
583デフォルトの名無しさん:2009/06/12(金) 00:50:36
事故解決しました。changelogにshotgun使えってありました。
584デフォルトの名無しさん:2009/06/12(金) 17:54:41
>>575
「データ入れ」という考えだとハマるぞ、rubyでは。
585デフォルトの名無しさん:2009/06/12(金) 18:05:19
データじゃないとしたらなにが入ってるの?
データが入ってないとオブジェクトの区別すらできないじゃん
AというオブジェクトとBというオブジェクトを区別するための情報ってデータだろ?
586デフォルトの名無しさん:2009/06/12(金) 18:19:19
>>585
オブジェクトと変数をごっちゃにするなって話だろ

> AというオブジェクトとBというオブジェクトを区別するための情報ってデータだろ?
区別する、の意味による。eql? と equal?
587デフォルトの名無しさん:2009/06/12(金) 18:53:52
は?
588デフォルトの名無しさん:2009/06/12(金) 19:00:24
ひ?
589デフォルトの名無しさん:2009/06/12(金) 19:33:01
>>560
君の考えは
日本語もろくに扱えないのに英語勉強してるようなもんだ
590デフォルトの名無しさん:2009/06/12(金) 20:42:10
英語を学んでから日本語を学ぶのはマズい事らしい
591デフォルトの名無しさん:2009/06/12(金) 20:53:49
>>590
アンカーつけることを知らないのか、
自分の発言に自信がないのか
わからんが、

基礎の話なのに
日本語もしゃべれずにあちこち手を広げたところで身につかねぇよm9(^Д^)プギャー!!
592デフォルトの名無しさん:2009/06/12(金) 22:33:27
>>589
お前は「英語を勉強するより前に、まずラテン語の基礎を学べ」と言われてそれを学ぶのか?
593デフォルトの名無しさん:2009/06/12(金) 22:53:05
プログラミング言語はその環境に生まれれば自然に身に着く語学とは違うだろ、同じ言語でも。
594デフォルトの名無しさん:2009/06/12(金) 23:02:28
すぐに比喩使う奴ってオライリー読み過ぎじゃないの?
595デフォルトの名無しさん:2009/06/12(金) 23:26:06
これって行末にセミコロンいらないんだね。
596デフォルトの名無しさん:2009/06/12(金) 23:48:21
んで、変数は何なの?
データのいれものなの?
オブジェクトのいれものなの?
597デフォルトの名無しさん:2009/06/12(金) 23:51:20
「最終回」って文字列を取得して、
文字が何文字あるのか、
カウントするプログラムはどう書くの?
598デフォルトの名無しさん:2009/06/12(金) 23:56:08
def hoge
return 3
end
599デフォルトの名無しさん:2009/06/13(土) 00:43:13
>>592
m(__)m ゴメン日本人に話しかけて他と思い込んでいたよ。
600デフォルトの名無しさん:2009/06/13(土) 01:33:10
>>599
return 3 と書いてあるから、たぶん日本語は読めてるんじゃないかな。質問の回答がわからなかっただけで。許してやってくれ。

>「最終回」って文字列を取得して、
どこからどう取得するのか分からんから答え用がない。

>文字が何文字あるのか、
一文字ずつ分解して数えればいい。
ttp://www.ruby-lang.org/ja/man/html/FAQ_C6FCCBDCB8ECA4CEBCE8A4EAB0B7A4A4.html

10.4 日本語を含む文字列から1文字ずつ文字列を取り出すにはどうしますか
をみてくれ。
601デフォルトの名無しさん:2009/06/13(土) 05:59:59
>>596
変数の話なんて別にしてないじゃん

何かデータというもやもやしたものが形になったのがオブジェクトだろ
データが入れ物に入ったと言っても、まあ別にそう間違いでもない

ちなみにRubyの変数はラベルというメタファが一番近い
オブジェクト自体はRubyが管理してるオブジェクト置き場から一歩も動かない
ラベルをオブジェクトにぺたぺた貼ってそのラベルの名前で呼ぶ
ラベルが1枚も貼られてないオブジェクトは誰も使わないゴミとしてメモリから定期的に取り除かれる
602デフォルトの名無しさん:2009/06/13(土) 06:16:26
なるほどなるほど
603デフォルトの名無しさん:2009/06/13(土) 07:39:06
Windows版のRubyのirbを立ち上げておくと、
CPU占有率が偉く高くなる問題って報告されて無いでしょうか?
いつまでたっても直らないので気になってます。

うちの環境でcsrss.exeとruby.exeで計18%くらい、ワンコア計算で72%くらい消費します。
プロンプト待機で、何もしていなくてもです!

環境:Windows Vista SP2(32bit)

>ruby --version
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]
604603:2009/06/13(土) 07:39:55
>>603
マシンスペック書き忘れたorz

環境追記
CPU: Core2Quad Q6600 2.2GHz
Memory: 2GB
605デフォルトの名無しさん:2009/06/13(土) 09:19:53
>>601
猫がいろんな軒先でえさをもらう時に
それぞれの家で
「タマ」とか
「ショコラ」とか
「プリン」とか
それぞれ別名で呼ばれるのと一緒か
猫は猫なのに
606デフォルトの名無しさん:2009/06/13(土) 09:20:50
そして誰からもエサをもらえなくなった猫は死んでしまうのですね
シュールだ
607デフォルトの名無しさん:2009/06/13(土) 13:02:15
rubygems の各パッケージの ri と rdoc のドキュメントのインストール処理がとっても遅いんですが、
これは一応既知の仕様でいいですか?
608デフォルトの名無しさん:2009/06/13(土) 13:15:02
その場で作ってるから遅い
609デフォルトの名無しさん:2009/06/13(土) 13:53:25
見る予定がないなら
gem: --no-ri --no-rdoc
と ~/.gemrc に書いておく。
610デフォルトの名無しさん:2009/06/13(土) 14:52:00
代入についての質問です。初歩的な質問だとは思いますが、宜しくお願いします。

例えば
str = "abc"
str2 = str
str2.chop!
とするとstrとstr2は同じオブジェクトを指しているので
strも"ab"となるのは理解できました。ですが、
str = "abc"
str2 = str + "d"
str2.chop!
str2.chop!
としても、strは"abc"のままです。
ということはstr2 = str + "d"というのは、新しく"abcd"というオブジェクトが
作られて、それをstr2が指したということになるのでしょうか?
611デフォルトの名無しさん:2009/06/13(土) 15:00:52
>>607
ドキュメントを事前に生成してから配布ってやるとやたら容量でかくなるんだよね
サーバ資源の温存に協力してると思ってください

>>610
yes
同様にString#chopなら新しくオブジェクトが作られるし
String#+の代わりにStrng#<<を使えば破壊的(オブジェクト書換)になる
str2 = str
str << "d" # str2 == "abcd"
str3 = str2.chop

# str2 = str << "d"
ちなみに代入と破壊的メソッドを同時に使うのは
返値の関係でできないことがあるから、避けておいた方が無難
612デフォルトの名無しさん:2009/06/13(土) 15:02:00
object_id(または__id__)で確かめてみたら?
613デフォルトの名無しさん:2009/06/13(土) 15:03:40
>>605-606
その例えいいな。これから使わせてもらおう
614デフォルトの名無しさん:2009/06/13(土) 15:07:47
つ 『耳を澄ませば』
615デフォルトの名無しさん:2009/06/13(土) 15:08:29
生まれて初めてriを使ったので記念カキコ

>C:\Documents and Settings\hoge>ri String#+
> --------------------------------------------------------------- String#+
> str + other_str => new_str
> ------------------------------------------------------------------------
> Concatenation---Returns a new +String+ containing _other_str_
> concatenated to _str_.
>
> "Hello from " + self.to_s #=> "Hello from main"
616デフォルトの名無しさん:2009/06/13(土) 15:12:50
だれからも構われなくなった猫は保健所が連れていくんだろう
そして保健所の仕事が悪いと野良猫が溜まって不衛生に・・・
617デフォルトの名無しさん:2009/06/13(土) 15:46:45
ガーベジコレクション発動?
618デフォルトの名無しさん:2009/06/13(土) 16:34:03
>>607
つまりは、rdoc や ri は
「実際の規模のライブラリのマニュアルを生成させると、気になるくらいに処理が遅い」
ということだ
速くなる予定は今のところ特にないので、新しいマシン買うか寝てる間にインストール済ませろ
619デフォルトの名無しさん:2009/06/13(土) 16:40:37
>>610
ありがとうございます。よくわかりました。
620デフォルトの名無しさん:2009/06/14(日) 00:04:28
Rubyのキーコード認識法が分かりません。

目標としては、(勝手な記述ですが) puts "キーコードは #{ruby_key}" とか書いて
Bキーが押される → キーコードは 66
1キーが押される → キーコードは 97
Ctrl+F → キーコードは 17と70

という感じで表示したく思います。
環境は、WinXPのRuby1.8.6です。
621620:2009/06/14(日) 01:01:31
(補足)
Rubyの動作をアプリケーションのショートカットキー操作のように制御したく
思っています。
そのために、キーコードの把握をしたいです。

動作制御の例としては、Ctrl+Shift+T → 指定した外部txtの読み込み 
622デフォルトの名無しさん:2009/06/14(日) 03:03:34
>>620
最初に間違いを指摘しておくと文字コードはキーコードではない
文字 B の値が 66(0x42) の場合は文字コード(アスキーコード)

押されたキーを判別する方法はプログラムの動作環境によって異なる
文字端末ならgetc,gets,curses、GUIライブラリなら個別に専用のメソッドを使う事になる
# 通常は文字コードで取得出来る、キーコードを取得出来る場合もある

だから、どんな環境でどのライブラリを使ってプログラムを作りたいのか
を教えてもらわないと答えられない

ちなみに文字の文字コードはこうすればわかる
s = "Bye"
puts s[0] #=> 66
623デフォルトの名無しさん:2009/06/14(日) 06:28:57
(コーディング以前の問題なのですが)別の言語でオリジナルのRubyエディタを
作ったのですが、これでrbファイルを生成しても(それが正しく動作するものであっ
ても)DOSプロンプトでEnterを押すと何も起こらず(無視されて)、次のコマンド
入力の『>』が出ます。
※ 普段はWinXP-ProのWordPadを使用

この「スルーされた」rbファイルもWordPadで再度保存すると正常に動作します。
しかしオリジナルのRubyエディタではUTF-8とShift-JISの両方でrbファイルを生成
していますが、両方共スルーされます。

考えられる原因は何でしょうか?
必要であれば、オリジナルのRubyエディタで生成させたrbファイルをUpできます。
(普通にRubyのアイコンになりますが・・・)
624デフォルトの名無しさん:2009/06/14(日) 07:51:27
うpした方がいいんじゃないだろうか
状況は分かってもそのファイルがどうなってるのか分からないから
625デフォルトの名無しさん:2009/06/14(日) 09:23:53
C:> ruby origedit.rb
としても何も出ない
C:> ruby wpedit.rb
と実行すれば期待通りに実行するってこと?
文字コードや改行コードを確認してみちゃどうかな
626623:2009/06/14(日) 13:51:35
>>624-625
レス有難うございます。

http://uproda11.2ch-library.com/182353GSO/11182353.zip でUpしました。
構成は、2個のRubyファイル(hello.rb,OSC04b.rb)とUpローダー下限サイズ
調整用のJPG1枚です。

hello.rbは単純に puts "Hello, World" だけで、OSC04b.rbは周期的にランダムな
値が画面で表示されるものです。共にこのままでは前述の通りスルーされますが、
WordPadで同名で同じ場所に保存(つまり上書き)すると正常に動作します。

当方の開発環境は、WinXP-Pro(SP2),メモリ3.24GB,実行ソフトは書籍「初めての
Rubyプログラミング」秀和システム(著:山本 団)に付録していたActiveRubyを
使っています。
(実際の実行操作はDOS上です)
627デフォルトの名無しさん:2009/06/14(日) 14:00:33
vim で見ると
# hello.rb^Mputs "Hello, World"^M
となっている。

改行コードが ^M だな。
全部先頭のコメント行として扱われているのでは?
628デフォルトの名無しさん:2009/06/14(日) 14:24:47
>>626
>>627の言う^M ってのは、文字コードで言うと 0x0D(CR)だねえ
これを標準の改行コードと見なすのはMacだけでは

0x0A もしくは 0x0D 0x0A で保存できるように、その自作エディタとやらを
修正するのがいいとおも
629デフォルトの名無しさん:2009/06/14(日) 14:30:14
>aragaki4.jpg
何ぞこれ
630デフォルトの名無しさん:2009/06/14(日) 14:39:05
おまけだろ。
しかし正直に言うとだな、、おっと誰か来たようだ。
631623&626:2009/06/14(日) 15:16:06
>>627-628
さんきゅうです。rbファイル保存時の改行を0x0Dでなく0x0Aにして解決しました!

>>629-630
主な目的はサイズ調整用です。
632デフォルトの名無しさん:2009/06/14(日) 18:15:04
問題は無事解決したようだが、aragaki4.jpgだけは保存させてもらった。
633デフォルトの名無しさん:2009/06/14(日) 20:03:23
>>628
OS9までな。
OSXはUNIX改行コード。
634デフォルトの名無しさん:2009/06/15(月) 14:08:08
>>622
レス有難うございます。

プログラムの目的はSocket通信で、ライブラリはsocketとthreadを使っており、
実行は通常のDOSでやっています。
とりあえず文字コードを先に把握しようと思い、下のkeyIn_02.rbを書きました。
# keyIn_02.rb
chars = "abcdefghijklmnopqrstuvwxyz 0123456789"
#
i = 0
for i in chars
puts "#{chars[i]}\n"
i+=1
end

しかし、自己代入のところで
 keyIn_02.rb:7:in `+': can't convert Fixnum into String (TypeError)

と出ます。どうすべきでしょうか?
635デフォルトの名無しさん:2009/06/15(月) 14:16:48
>>634
DOSってmsdjppか?

> i = 0
> for i in chars
> i+=1
iが被ってる
636デフォルトの名無しさん:2009/06/15(月) 14:16:49
>>634
Ruby では for 構造をまず使わない
どのくらい使わないかというと、それのどこが間違ってるかマニュアルを確かめないと指摘できないくらい使わない

str = "abcdefghijklmnopqrstuvwxyz 0123456789"

0.upto(str.size) do |i|
puts str[i]
end
637デフォルトの名無しさん:2009/06/15(月) 14:17:01
for i in chars で、i には chars から 1 文字ぶん切り出した文字列が入ってるから。
てか ruby らしいスクリプトという観点からは、for はあまり使わない。
638デフォルトの名無しさん:2009/06/15(月) 14:21:49
>>634
ループの部分を下に置き換えて実行してみ
for i in chars
 puts i
 exit
end
639デフォルトの名無しさん:2009/06/15(月) 14:28:02
>>634
>>621に書いてある「Ctrl+Shift+T → 指定した外部txtの読み込み」と
Socket通信の繋がりがいまいちわかんない
デスクトップアプリとかユーティリティとか作りたいんじゃないの?
640デフォルトの名無しさん:2009/06/15(月) 15:27:03
>>636
てか、 for ってわかりにくいよな
あれを使いこなせる人は素直に尊敬する
641デフォルトの名無しさん:2009/06/15(月) 15:49:02
BASICからきた俺はつい「for」からプログラムを書き始めてしまう。
642デフォルトの名無しさん:2009/06/15(月) 17:41:31
>>634
1.8.7以降ならeach_char使うのがベストかと
エラーメッセージから7行目のiがStringになってると把握できるからそこから解決策を導けるようになって欲しい。
643デフォルトの名無しさん:2009/06/15(月) 20:21:42
↓これってどういうアプリなんでしょう?
MOONGIFTの記事よんでもイマイチよくわからない

MOONGIFT: ≫ メッセージを転送するWeb Hooksサーバ「Watercoolr」:オープンソースを毎日紹介
http://www.moongift.jp/2009/06/watercoolr/

公式:
Watercoolr - Gossip for web applications
http://watercoolr.nuklei.com/
644デフォルトの名無しさん:2009/06/15(月) 20:22:31
>>643追記 フレームワークのSinatra製らしいです。

ソース:
jcapote’s watercoolr at master - GitHub
http://github.com/jcapote/watercoolr/tree/master
645デフォルトの名無しさん:2009/06/15(月) 20:34:42
MOONGIFTは話半分に読んどけ
これを頼りに自分から何かするサイトじゃない
他のサイトで紹介解説されてから手を出すのが吉
646デフォルトの名無しさん:2009/06/15(月) 20:40:26
>>645
その、「他のサイトで紹介解説」しようとしているのが643なんじゃないかな。

で、webhookはHTTPを理解してないとつらいような気がする。
643はHTTPの理解はOK? 理解してたら公式サイトの絵で十分分かると思うよ。
647デフォルトの名無しさん:2009/06/15(月) 20:41:58
648634:2009/06/15(月) 21:17:42
>>635-642
レス有難う。

636さんの記述を下記のように改変して上手くいきました。
# KeyIn_03.rb
chars = "abcdefghijklmnopqrstuvwxyz 0123456789"
0.upto(chars.size) do |id| # 1.upto()だと98から始まる
if id < chars.size then
puts chars[id]
end
end


>>639
具合的には(621に書いている通り)キーによるRubyの動作制御です。
今回は [a〜z]:97〜122,[0〜9]:48〜57 は分かったのですが、やはり
CtrlキーやPauseキーのコードが分かりません。DOSプロンプトのバージョンは
 Microsoft Windows XP [Version 5.1.2600]
です。
Rubyではキー定数というのはないのでしょうか?
(ググりましたが公式のページには見つかりませんでした)
649デフォルトの名無しさん:2009/06/15(月) 21:29:46
>>648
リアルタイムキー入力てーと、OSがハードウェアをどう抽象化してるか、
っていうわりと低いレベルのものだから、ネイティブなAPI(ioctlとかWin32APIとか)を使う必要がありそう。
650デフォルトの名無しさん:2009/06/15(月) 21:41:22
>>648
windows-prにそのへんの定義が・・・キーコードはないのか
gccあたりからwin32apiのヘッダファイルもらってきて確認するのが王道だと思うけど
その程度なら受け取ったキーコードをそのまま吐き出すコード書いて
実際にコンソールでキー入力してみたほうが早い

でもどうやってキー入力を監視してる?
getsじゃキーから文字入力を受け付けることはできても
キー自体を監視してるわけじゃないからpauseとか無理なはず
aが97っていうのもキーコードではなく文字コードだろうし
651デフォルトの名無しさん:2009/06/15(月) 21:42:38
Ruby/SDLを使うという裏技もある
652デフォルトの名無しさん:2009/06/15(月) 21:46:18
>>648
どんな言語でも普通は標準入力を扱うから、
それで入力できないものは標準のやりかたでは取得できないんじゃないかな。
例えばCtrlキー単独とか。
DOSプロンプト用のプログラムも標準入出力が基本で、
リアルタイムのキー入力は昔ならBIOSやハード直接、今ならOSのAPIで取得するものかと。
653デフォルトの名無しさん:2009/06/15(月) 21:53:58
Windowsへコールバック関数を登録して、イベント受けとるん?
654デフォルトの名無しさん:2009/06/15(月) 22:08:05
>>648
こんなものを投下してみる。

require 'Win32API'
getkey = Win32API.new("user32", "GetAsyncKeyState", "I", "I")
loop do
puts "ctrl\n" if getkey.call(0x11) != 0 then
end

Win32APIでgetAsyncKeyStateを呼び出して現在のキー状態をチェックする。
なんとなく!=0ではマズい気がするが。
ってゆーか仮想キーコードってどうやって調べればいいんだろね。
winuser.h参照って言ってもみんなが持ってるわけでもなし。
655654:2009/06/15(月) 22:10:51
後置法に書き換えたときにthen消し忘れた><
最後に確認してから書き込めと。
656デフォルトの名無しさん:2009/06/15(月) 22:30:38
winuser.h持ってないのは自由だが、そういう奴はWin32API使うなで良いと思うよ
ところで"define VK_RETURN"でぐぐったらこんなん出たで
ttp://www.freefoote.com/f3c/documentation/vkey.html
657デフォルトの名無しさん:2009/06/16(火) 00:31:55
rubyで、正規表現とscanでファイルから特定の情報を抜き出すプログラムを作っているのですが
抜き出した情報 A B Cを
配列に"#{A} #{B} #{C}"
といった形で入れる際に、Cが空でも空として代入してしまいます。
変数が空かどうかを調べる条件式はどのようにすればいいでしょうか
658デフォルトの名無しさん:2009/06/16(火) 00:42:09
変数はコンテナではないので、「空」と言われてもピンときません。
659デフォルトの名無しさん:2009/06/16(火) 01:31:12
>>657
そういうのは言葉で説明するよりサンプルコード用意したほうがいいよ

たぶんこんな感じじゃないかと思う
m = /(\S)(\S)(\S)?/.match("ab")
a, b, c = m[1], m[2], m[3]
array << "#{a} #{b} #{c}"

このとき正規表現にマッチはしても3番目のキャプチャはないからcはnilになる
そのため配列に加わるのは"a b "になるけど
質問はこれを"a b"にしたいってこと・・・と予想はしてみたけどなんか違う気がする

悪いけど実例交えてもう一度質問をお願い
660デフォルトの名無しさん:2009/06/16(火) 03:41:35
>>643-647
コレ読んだらなんとなくわかりました。
はてなブックマーク Web Hookとは - はてなキーワード
http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF%20Web%20Hook

webアプリでイベントが合った時に、別のCGIやwebサービス(のURL)を呼び出してもらうものでよいのかな。
661デフォルトの名無しさん:2009/06/16(火) 05:25:04
>>659
たぶん正しい
マッチの取得に scan のブロックと $1 や $2 を使っているのだろう
これだと「増減」に一発対応できなくて非常にめんどくさい

まあ、現実的な解は
 ・ scanでマッチを行う
 ・ $1 や scan の返り値などを使って結果を取得、一時的な変数に全部入れる
 ・ 個々の変数が空かどうかを .empty? などで調べて、配列に入れるためのデータを整形する
 ・ 配列に入れる
という手順を踏むことだと思う
662デフォルトの名無しさん:2009/06/16(火) 08:26:20
ブロックを再帰的に呼び出す事は可能ですか。

arr.each do |e|
 if e.is_a?(Array)
  e.each(&block) # ここでブロックを再帰的に呼び出したい
 else
  puts e
 end
end

実際のコードはちょっと違うんですけど、ブロックを再帰的に呼び出したいというのが目的です。
663デフォルトの名無しさん:2009/06/16(火) 09:51:18
いったんblock = proc do〜endでProcオブジェクト作ってからarr.each(&block)
664デフォルトの名無しさん:2009/06/16(火) 09:55:31
Ruby はブロックを内部から認識することができない

[1,2,3].each do |e|
end

というブロックがあったとして、each を認識することも [1,2,3] を認識することもできない
>>663のようにしたほうがわかりやすいし速い、というのが作者の弁
665デフォルトの名無しさん:2009/06/16(火) 10:01:54
こうかなあ?

f = proc do|e|
 if e.is_a? Array
  e.each do |e|
   f.call e
  end
 else
  puts e
 end
end

arr.each do|e|
 f.call e
end
666デフォルトの名無しさん:2009/06/16(火) 10:02:38
松本教祖がデビアン使いである以上、リナックスが前提だしな。
教祖が信者の環境の世話までする訳が無い。修行して教祖と同じ高みまで上ってこいとか言われるだけ。
667デフォルトの名無しさん:2009/06/16(火) 12:09:40
それって、rubyの方言を作るって事になるな
668デフォルトの名無しさん:2009/06/16(火) 12:44:30
>>665
なぜそこまで&を憎む
669デフォルトの名無しさん:2009/06/16(火) 12:50:41
>>659
> m = /(\S)(\S)(\S)?/.match("ab")
array << m[1..3].compact.join(" ")
670デフォルトの名無しさん:2009/06/16(火) 12:57:48
>>668

&で書ける?

直感的には&で書けるような気がしたんだけど、
それはイテレータ(ブロック引数をとるメソッド)を自分で書く場合であって、
この場合みたいに、イテレータに渡すブロックの中でどうにかしたい場合は
&じゃどうにもならないと思ったんだけど。
671デフォルトの名無しさん:2009/06/16(火) 13:02:58
fに代入してそれ使っちゃってるんだから&fでも同じことじゃん
f = proc do|e|
if e.is_a? Array
e.each(&f)
else
puts e
end
end

arr.each(&f)
672デフォルトの名無しさん:2009/06/16(火) 13:10:56
あー、渡すときにも&で渡せたんだ。
忘れてた。受ける側しか使いこんでなかったw
673デフォルトの名無しさん:2009/06/16(火) 13:15:48
さすが初心者スレ
674デフォルトの名無しさん:2009/06/16(火) 13:16:28
いいんだよ
675デフォルトの名無しさん:2009/06/16(火) 13:18:19
>>669
回答側が提示したてきとーな具体例を最適化して誰が得するのかw
676デフォルトの名無しさん:2009/06/17(水) 01:05:23
なんか C 入りの gem パッケージのソースがあるとき、トップで rake すると C 部分のコンパイルとかが終わるよね

rake の途中で Makefile が作られてるんだけど、その Makefile を編集した上でコンパイルしたいです
ruby extconf.rb で Makefile を作ることはできたんだけど、これを組み込んで rake する方法がわかりません
rake tmp/中略/Makefile で tmp ディレクトリで使う Makefile だけを作ることもできたんだけど、
これから「再開」させる方法がわかりません
Makefile は extconf.rb を反映してるということがわかったんだけど、ま
677デフォルトの名無しさん:2009/06/17(水) 10:12:01
678デフォルトの名無しさん:2009/06/17(水) 10:16:23
じゅうこわい
679デフォルトの名無しさん:2009/06/17(水) 12:40:31
ちょいと質問があります。

既存のPDFを弄れるRubyのライブラリはありませんでしょうか?
JavaのiTextみたいなのです。

1から生成するタイプのPDFライブラリだと、↓Prawnのようにいろいろ見つかるのですが…。
http://prawn.majesticseacreature.com/

既存のPDFを読み込んで要素を追加するようなものと、となるとなかなか見つかりません。

既存のものに外部ツールで上にのっけるみたいなのでもいいので、何かRubyでできる方法があればなーと思います。
680デフォルトの名無しさん:2009/06/17(水) 13:41:12
681デフォルトの名無しさん:2009/06/17(水) 16:53:07
Ruby1.8.6でdRubyの勉強を始めました。
本に記載してあったサンプルを試したところ、データの送受信は成功しましたが、
分からない点が2つ出ましたので質問させて頂きます。
※コードは全文記載すると著作権上問題がありますので、若干改変しています。

# サーバー側
require 'drb'
obj = ["drb", "server"]
DRb.start_service("druby://localhost:54321", obj)
DRb.thread.join # (本より)必ずスレッドが終わるのを待つこと!

# クライアント側
require 'drb'
DRb.start_service
obj = DRbObject.new_with_uri("druby://localhost:54321")
obj.each{|i|
p i
}

Q1) 「必ずスレッドが終わるのを待つこと!」とは、具体的にどういう作業が
 要求されるのでしょうか?

Q2) クライアントに "drb" "server" と出た後もサーバーは稼動状態になっています。
 サーバーの処理を終了するにはどうしたら良いでしょうか?
682デフォルトの名無しさん:2009/06/17(水) 17:15:23
>>681
A1
そのまんまThread#join
メインスレッド(普段意識せずに処理を行なわせてる部分)が処理を全て終えると
子スレッドがどんな状況だろうとruby全体を終了させるから
子スレッドの終了を待つにはメインスレッドを待機させる必要がある
そしてThread#joinはその子スレッドが終わる(合流する)まで待機するメソッド

A2
Signal.trap(:INT) { DRb.stop_service }
と書いておいてInterrupt起こせばよかったと思う
683デフォルトの名無しさん:2009/06/17(水) 21:43:16
>>682
有難うございます。
やってみます。
684デフォルトの名無しさん:2009/06/17(水) 21:44:37
やってから書け
685デフォルトの名無しさん:2009/06/17(水) 22:13:57
rubyは遅いという話を聞いたので、素数を求めるの書いてみた
偶数は省く、元となる値の1/2まで総当りで割り切れるか
という条件の下でやってみたら、2..10000で10秒…

エラトステネス使えば全然早いんだろうけど
686デフォルトの名無しさん:2009/06/17(水) 22:24:43
>>685
おなじことをpythonやjava、perlでやったらどうなの?
687デフォルトの名無しさん:2009/06/17(水) 22:51:06
>>685
結果だけでなくソースも晒してくれると参考になる。
実行環境およびRubyのバージョンもあるといいな。
688デフォルトの名無しさん:2009/06/17(水) 23:22:54
>>685
なんの検証にもなってない
689デフォルトの名無しさん:2009/06/17(水) 23:30:58
とりえあず、自分でやってみるやつはいないんだなw
690デフォルトの名無しさん:2009/06/18(木) 00:16:35
まあこんな感じか

N = 1000000
prime_cand = Array.new(N + 1)

2.upto(Math.sqrt(N)) do |i|
 unless prime_cand[i]
  (i * 2).step(N, i) {|k| prime_cand[k] = 1 }
 end
end

(2 .. N).each {|i| puts "#{i}" unless prime_cand[i] }
691デフォルトの名無しさん:2009/06/18(木) 00:21:04
#include <stdio.h>
#include <math.h>

#define N (1000000)

int main() {
  int prime_cand[N + 1] = {0};

  prime_cand[1] = 1; //1は素数でない
  for (int i = 2; i < sqrt(N); i++)
    if (0 == prime_cand[i])
      for (int k = i * 2; k <= N; k += i)
        prime_cand[k] = 1;

  for (int i = 1; i < N + 1; i++)
    if (0 == prime_cand[i])
      printf("%d\n", i);

  return 0;
}
692デフォルトの名無しさん:2009/06/18(木) 00:24:39
public class Eratos {
  public static void main(String[] args) {
    final int n = 1000000;
    final boolean prime_candidate[] = new boolean[n + 1];

    prime_candidate[1] = true; //1は素数でない
    for (int i = 2; i < Math.sqrt(n); i++)
      if (!prime_candidate[i])
        for (int k = i * 2; k <= n; k += i)
          prime_candidate[k] = true;

    for (int i = 1; i < prime_candidate.length; i++)
      if (!prime_candidate[i])
        System.out.println(i);
  }
}
693デフォルトの名無しさん:2009/06/18(木) 00:35:29
>>689
2chなめんなよ、クズm9(^Д^)プギャー!!
694デフォルトの名無しさん:2009/06/18(木) 00:48:49
後は、計測結果だけか。
695デフォルトの名無しさん:2009/06/18(木) 01:56:01
>>685の言ってる通りでやってみた
割と可読性無視な方法
2が素数とみなされないのは仕様
N=10000 >> 1
result = Array.new
i=nil; i2=nil; j=nil
1.upto N do |i|
i2 = i << 1 | 1
result << i2 if 2.upto(i){|j| break nil if i2 % j == 0}
end
puts result
696デフォルトの名無しさん:2009/06/18(木) 02:52:07
>>695

>N=10000 >> 1

>i2 = i << 1 | 1
ってどういう意味?
697681:2009/06/18(木) 04:57:57
>>682さんのA2をやってみましたが、変化はありませんでした。
また、trap(:INT) → trap(:EXIT) も試しましたが駄目でした。
どうすべきでしょうか?
698デフォルトの名無しさん:2009/06/18(木) 08:10:44
>>680
え、いや、もちろん検索はしたのですが、
1から生成するライブラリばかりで、既存のものを読み込んで追記できるライブラリが見つからないのです・・・
699デフォルトの名無しさん:2009/06/18(木) 08:21:55
>>698
既存のPDFを読み込んで追記するには、既存のPDFをパースできるライブラリが必要。
たぶんそういうのがまだないんじゃないかな。しらんけど。
700デフォルトの名無しさん:2009/06/18(木) 08:25:51
>>698
ruby-listとかのメーリングリスト生きてるからそこで聞いてみたら?

701デフォルトの名無しさん:2009/06/18(木) 08:26:04
検索ですぐ引っかかるHaruってのはどうなのよ
フォントのサブセット埋め込みにも対応してるっぽくてよさげに見えるが
702デフォルトの名無しさん:2009/06/18(木) 08:28:11
こんな糞アルゴリズム検証して、なんか人類の進歩の役立つの?
703デフォルトの名無しさん:2009/06/18(木) 09:56:24
立つよ
人のやることを糞呼ばわりして何もしないよりはね
704デフォルトの名無しさん:2009/06/18(木) 10:09:07
>>702
立たないよ。結果だけが曲解されながら独り歩きして風評が広まるので、むしろ害悪。
705デフォルトの名無しさん:2009/06/18(木) 10:39:57
曲解されたなら、正せばいい。
風評が広まるのは、正しい情報を知っている人が正しい情報を広める努力をろくにしていないから。
706デフォルトの名無しさん:2009/06/18(木) 10:46:24
>>705
悪貨は良貨を駆逐する。
はっきり言って10倍努力しないと、まともな情報を広めることなんてできない。
そんなことするぐらいならコード書きますわ。
707デフォルトの名無しさん:2009/06/18(木) 10:56:10
ケンカすんなw
708デフォルトの名無しさん:2009/06/18(木) 11:01:34
単純なループでもrubyは遅いだろ。 
アルゴリズムがどーたらいわれてもな、全て同じアルゴリズムで書けばいいだけだ。

つーか、rubyに最適化されたアルゴリズムがあるなら、それを教えてほしいくらいだな
rubyの場合、こうかけば早い!ってな
709デフォルトの名無しさん:2009/06/18(木) 11:03:34
>>706
する前から言い訳ばかりだな。
まずはしてから言おうぜ。
710デフォルトの名無しさん:2009/06/18(木) 11:18:09
>>702
君は相当優秀か、相当馬鹿なのかどちらかだろうな
711デフォルトの名無しさん:2009/06/18(木) 11:22:41
人類の進歩に役立つの?に吹いた。
マジレスすんなよw
どっちかというと>>706みたいな自分では何もしないのに人の邪魔するやつこそが悪貨。
黙ってコード書いとき。
712デフォルトの名無しさん:2009/06/18(木) 11:24:48
Ruby ユーザは PHP 並みにひどいですね
713デフォルトの名無しさん:2009/06/18(木) 16:16:33
>>697
手元の1.8.6 mswin32で試してみたらInterrupt自体が押した時には起きないね
たしかsocketの仕様がそんなだったかも
次にアクセスしたとき(socketのブロックが終わった時)に遅れて発生する

おまじないみたいな話だけど、これを足すと反応するようになった
Thread.start{ loop{ sleep 5 } }
714デフォルトの名無しさん:2009/06/18(木) 17:08:15
>>713
今頃になってから言うのもなんだけどsignalにこだわる必要なくない?
DRb.thread.join の替わりに gets 書いとけばいいと思うんだけど
715デフォルトの名無しさん:2009/06/18(木) 17:12:27
目からウ○コ
716デフォルトの名無しさん:2009/06/18(木) 17:26:12
>>714
それのほうが手っ取り早いんだけど、環境書いてないからgetsは避けた
ttp://www.ruby-lang.org/ja/man/html/trap_timeout.html
717デフォルトの名無しさん:2009/06/18(木) 19:16:25
目からウタコ・京
718デフォルトの名無しさん:2009/06/18(木) 19:17:03
目からウンベルト・エーコ
719デフォルトの名無しさん:2009/06/18(木) 20:42:43
rubyでmanみたいなマニュアルを探したところ、riとrefeが見つかりました。
この2つのコマンドを、それぞれ引数にクラス名やメソッド名を取って使っているのですが、他に使い方はありますか?
720681, 697:2009/06/18(木) 21:58:04
>>713-716
WinXP-Pro(SP2)です。
Rubyは1.8.6です。

timeoutは使えませんね。
721デフォルトの名無しさん:2009/06/19(金) 06:43:36
Jrubyってrubyとjava同時に使えるの?
だったらruby勉強しておけば
Jrubyは特に勉強することってない?
722デフォルトの名無しさん:2009/06/19(金) 06:59:44
>>721
・Javaアプリのデプロイの方法

他詳しい人頼む
723デフォルトの名無しさん:2009/06/19(金) 07:11:25
詳しくはないけど、JavaのAPIを知らなければJRubyの価値は8割減だと思う
724デフォルトの名無しさん:2009/06/19(金) 07:22:08
エラトステネスを使って書いてみた


prime_arr = Array.new
max = 10000

2.upto max do |x|
if(prime_arr[x] == nil)
2.upto max do |y|
if(y*x) < max
prime_arr[x*y} = 1
end
end
end
end

これで、一千万なら65sec
10億までやったらメモリ4G食い尽くした上に
スワップを数G単位で消費して未だにおわん…
725デフォルトの名無しさん:2009/06/19(金) 07:24:45
あっ書き写すときに最後のネストにbreak忘れた

if (y*x) < max
 prime_arr[x*y]
else
 break
end

726デフォルトの名無しさん:2009/06/19(金) 07:29:31
「Cでしこしこ慎重に作った外部モジュール」の代わりに既存のJavaの全てが使えるRubyがJRuby

Java使えない人は素直にCRubyやっとれ
727デフォルトの名無しさん:2009/06/19(金) 08:01:29
外部モジュール書くときに、JavaとかScala使えるってことかな?
結構面白そうではあるが
728デフォルトの名無しさん:2009/06/19(金) 08:34:19
JRubyはcallccが使えない。
729デフォルトの名無しさん:2009/06/19(金) 10:10:56
String.new("こんにちは")

これで、なんも出ないんだけど、なんで?
エラーも出ない。
730デフォルトの名無しさん:2009/06/19(金) 10:14:48

 な め て る の か
731デフォルトの名無しさん:2009/06/19(金) 10:29:24
>>729
irbは入力された式を評価した値を表示するけど、
rubyはprintとかで表示しなければ、実行するだけだから。
732デフォルトの名無しさん:2009/06/19(金) 10:47:13
a = String.new("こんにちは")
puts a;

これで出た。
733デフォルトの名無しさん:2009/06/19(金) 11:00:36
if文って、thenはいらないの?
734デフォルトの名無しさん:2009/06/19(金) 11:09:54
1行にまとめて書く時には必要
735デフォルトの名無しさん:2009/06/19(金) 11:18:59
改行 or セミコロン or then
736デフォルトの名無しさん:2009/06/19(金) 13:33:18
javaのAPIをrubyからごにょごにょするためのものだしな。
英語もラテン語も知らないと、英語でラテン語について記述するのは無理じゃないか?ってノリ。
rubyとjavaの基本を抑えてから、マニアックな地雷原を歩き始めるべき。
737デフォルトの名無しさん:2009/06/19(金) 13:36:28
あともうひとつのメリット(?)は、
Java VM と JRuby インストールしておけば、MRI などの Ruby の実装をインストールしなくても、
Ruby プログラムが動かせるということだね。

メリットと言えるかどうかわからないけど。
738デフォルトの名無しさん:2009/06/19(金) 16:26:09
Eric4はRuby1.9に対応していますか?
LinuxにRuby1.8と1.9をインストールしてるのですが、
Eric4で1.9を使うとエラーが出てスクリプトが実行できません。
739デフォルトの名無しさん:2009/06/19(金) 23:14:13
RDEで、
(["
などの括弧を青から違う色に変える設定場所を教えてください。
740デフォルトの名無しさん:2009/06/20(土) 00:28:16
Rubyはクラスベースの言語ですか?それともプロトタイプベースでしょうか?
741デフォルトの名無しさん:2009/06/20(土) 00:32:38
クラスベースだがプロトタイプベースでやろうと思えばそれっぽくもできる。
742デフォルトの名無しさん:2009/06/20(土) 00:41:38
>>741
ありがとうございます。
ネットで調べると、クラスベースと言ってる人とプロトタイプベースと言ってる人がいてモヤモヤしてたのですが
なるほどそういうことでしたか。
743デフォルトの名無しさん:2009/06/20(土) 01:21:52
これで変数エラーがでるのが理解できない



for i in 1..10
 p i
end

p i
744デフォルトの名無しさん:2009/06/20(土) 01:27:38
出なかった。
ruby 1.8.7 (2009-06-08 patchlevel 173) [i686-darwin9.7.0]
ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-darwin9.7.0]
745デフォルトの名無しさん:2009/06/20(土) 01:49:17
あっ、家かえって来てやったら出ないな。 debina lenny ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
会社のCentOSでやったら出たんだが…versionみてないや
746デフォルトの名無しさん:2009/06/20(土) 06:37:04
>>728
具体的にはどんな不都合があるんでしょ。でも、ブロックは使えるよね。
747デフォルトの名無しさん:2009/06/20(土) 06:38:34
>>740
どっちもできる、だろうけど、基本クラスベースを思って置けばよいかと思うけど
748デフォルトの名無しさん:2009/06/20(土) 17:47:13
Hashをpとかppするときに、順序考慮してくれないのがイヤんなのですが、
eachするときに、自動でキーでソートされてるHashライブラリか、モンキパッチみたいなのはないでしょうか?
749デフォルトの名無しさん:2009/06/20(土) 17:49:29
Windosのコマンドプロンプトすごいつかいずらいんだけど。
みんなはコマンドプロンプトから入力するときって何使ってる?
750デフォルトの名無しさん:2009/06/20(土) 17:50:04
ハッシュに順序?
751デフォルトの名無しさん:2009/06/20(土) 17:50:12
それは代入の手法をちゃんと把握してないからじゃないのか?
752デフォルトの名無しさん:2009/06/20(土) 17:51:04
>>749
そう思ったら、Unixのプラットフォームでやれと言われるお^^
753デフォルトの名無しさん:2009/06/20(土) 17:53:27
順序が<=>での比較結果という意味なら知らないけど、
挿入した順を保存という意味なら1.9を使うか、あとは
ActiveSupportなどあちこちにあるOrderedHashが使える。

754デフォルトの名無しさん:2009/06/20(土) 18:00:58
>>748
てきとーにデバッグプリントしたときにキー探すのがめんどくさいんだよなw
p h.sort
配列化されるのには目をつむってほしい
each云々は、Hashはそういう使い方するものじゃないからパス


ってなんかエラーでるな
NoMethodError: undefined method `<=>' for :c:Symbol

・・・Symbol#<=>は1.9からなのか、ぜんぜん気づかなかった
755デフォルトの名無しさん:2009/06/20(土) 18:08:07
require 'pp'
pp h
したら、キーでソートされないか?


それより最近Vimを使うようになったんですけど
VimでRubyのコメントを入力するにはどうしたらいいですか
0 i # ESC j
0 i # ESC j
...
とかめんどくさい
756748:2009/06/20(土) 18:33:43
サンクスー

>>753
なにそれ1.9だと、順序保存なんだ!

> ActiveSupportなどあちこちにあるOrderedHashが使える。
ま た R a i l s かwww
ActiveSupportなんでもあるなww

>>754
h.sortだと配列になるんですね…。配列になってもいいときはそれでもよいですね。

>>755
pp hash だとソートされない感じ…。

とりあえず、OrderedHash使ってみよ…
と思ったけど、HashからOrderedHashへ変換できねえよヽ(`Д´)ノ ウワァァン!!
ActiveSupportのソースみたけど、変換ルーチンねえよ!
757デフォルトの名無しさん:2009/06/20(土) 18:41:49
挿入順序の情報を持たないものから持つものへの単純変換とかできないだろw

hash.sort.each {|v| ohash[v[0]] = v[1] }
OrderedHash知らないけどソートそのままでぶち込むならこんな感じでいいんじゃない?
758748:2009/06/20(土) 18:43:05
>>757
まあ、確かに単純変換はできんか・・・。
しこしこ変換してみます。

というか、初期化したいだけなので、地道に
hash["hage"] = "unko"
で入れていけば問題はないみたいです。
759748:2009/06/20(土) 18:44:18
OrderedHash、ppで出力したら中身がArrayで泣いた orz

結局、sortとかしたのと、変わらないか…。

とりあえず、ありがとうございました。
760デフォルトの名無しさん:2009/06/20(土) 20:10:33
>>756
>pp hash だとソートされない感じ…。
すまん勘違いだった
761デフォルトの名無しさん:2009/06/20(土) 21:22:10
>>755
commentout.vim でググるといいことがあるかも知れない
762761:2009/06/20(土) 21:25:41
と思ったら新規にコメントを挿入する話だった orz
763デフォルトの名無しさん:2009/06/20(土) 21:29:33
>>755
I # ESC j

でいいだろうに、後ESCの場所はホームポジションの
すぐそばに変更な。
vimはコマンドと移動方法とか色々組み合わせて、
ソースも操りやすいように書いて、脳汁出すためのも
のだ。
764デフォルトの名無しさん:2009/06/20(土) 22:23:11
>>749
NYACUSとかckwtとかMinGW+Msysとか
765764:2009/06/20(土) 22:28:03
訂正、ckwtではなくckwでした
766デフォルトの名無しさん:2009/06/20(土) 23:10:27
Rubyには文字型は無いのですか?
Javaであれば、'a'のようにシングルクォーテーションで括ると文字型になりますが、Rubyだと文字列になってしまいます。
767デフォルトの名無しさん:2009/06/20(土) 23:17:09
無い。「文字は長さ1の文字列である」と解釈する
768766:2009/06/20(土) 23:28:04
>>767
なるほどjavascriptとかと同じですね。
ありがとうございます。
769デフォルトの名無しさん:2009/06/20(土) 23:32:37
1.9だと、文字という意図を示したい場合のリテラルは
?あ
のように書く。
値はつまるところ長さ1のStringインスタンス(="あ")だが。

1.8では、この表記はそのとき使っている文字コードでの整数値になる。
770デフォルトの名無しさん:2009/06/20(土) 23:33:37
例がまずかった。1.8だと ?マルチバイト1文字 は書けないね。
771デフォルトの名無しさん:2009/06/21(日) 01:33:42
所詮スクリプト言語
772デフォルトの名無しさん:2009/06/21(日) 02:13:59
文字列と文字を使い分けたい時ってどんなとき?
773デフォルトの名無しさん:2009/06/21(日) 09:44:59
>>755
スレチだけど、The NERD Commenterがすっげー便利でずっと使ってる。
774デフォルトの名無しさん:2009/06/21(日) 11:32:39
Sinatraのソース見てて気がついたんだけど

def foo(opt1 = {}, opt2 = {})
end

foo(:a => 10, :b => 20)

こう書くと、opt2じゃなくてopt1にオプションが入るんだな
今まで末尾のHash引数に入るものだとばかり思ってた
どういう仕組みになってるんだろう
775デフォルトの名無しさん:2009/06/21(日) 14:30:30
こうなるよう期待したのに
opt1[0] =10
opt2[0] =20

このように動作してるって事だろ?
opt1[0] =10
opt1[1] =20
opt2[0] =nil
776デフォルトの名無しさん:2009/06/21(日) 16:07:27
開発陣もよい仕様だと思わなかったのか、trunkではopt2に入るな
「どういう仕組み」って不満ではなく文字通りの意味ならeval.cとparse.y読んだらよくね
777デフォルトの名無しさん:2009/06/21(日) 16:18:07
ごめん大嘘
1.9でもopt1に入る
778デフォルトの名無しさん:2009/06/21(日) 17:08:54
あくまで糖衣構文であって、評価器にとっては
foo({:a => 10, :b => 20})
となると、もっともな挙動かとも思う
779デフォルトの名無しさん:2009/06/21(日) 18:10:44
一般論として、Rubyでは

 def mes(keywordhash1, keywordhash2)

という定義のメソッドはよくない
いわゆるキーワードハッシュは、多少無理してネストさせてでも1つにまとめるべき
780デフォルトの名無しさん:2009/06/21(日) 18:13:06
Railsは、そんなメソッドがてんこもりだけどね。
781デフォルトの名無しさん:2009/06/21(日) 18:43:36
>>780
ってことは、もし Ruby のバージョンが変わり、 >>776 のように opt2 に入るようになったら、
それまでの Rails は急に動かなくなるってこと?
782デフォルトの名無しさん:2009/06/21(日) 18:57:44
>>774
foo(:a => 10, :b => 20, :c=30)
と書いたときにはどういう風に引数を解釈して欲しいんだろう
783デフォルトの名無しさん:2009/06/21(日) 18:59:47
>>782 typo
foo(:a => 10, :b => 20, :c=>30) ね
784774:2009/06/21(日) 19:17:42
俺が想定してたのはこういう動作

foo({}, {:a => 10, :b => 20})

ただまぁ、>>778を見ると納得はできる
785デフォルトの名無しさん:2009/06/21(日) 19:59:33
>>784
その想定はないw
786デフォルトの名無しさん:2009/06/21(日) 21:55:48
>>784
俺はそう思ってて、ちょっとビックリしてた。
定義側の最後のハッシュになるんじゃなくて、
呼び出し側の最後の引数がハッシュにまとまるんだなーと。
787デフォルトの名無しさん:2009/06/22(月) 01:27:10
初心者スレなのにレベル高い
788デフォルトの名無しさん:2009/06/22(月) 02:43:53
どこがレベルが高いんだ
789デフォルトの名無しさん:2009/06/22(月) 10:02:32
ブロックの「ふつう」の返り値ってレシーバ? ブロックの最終の値?
tick.tack.toe というメソッドチェーン可能なメソッドがあったとして

tick{|e|
 e.tack.toe
}

tick{|e|
 e.tack
}.toe

tick{|e|
 e.foo
}.tack.toe

どれが tick.tack.toe と同じ値になってることが期待されるように見える?
790デフォルトの名無しさん:2009/06/22(月) 10:10:09
>>789
「どれもアリ」だ
そのへんは tick のマニュアル読むしかあんめえ
each と map の動作の違いみたいなもんだからな

ただ、tick.tack.toe のようにメソッドチェーンが繋がることがごく当たり前の当然な規定事項である場合、
一番目と二番目をサポートし、一番最後の「ブロックの中の返り値は捨てる」という動作はサポートせずに

tick{|e|
 e.foo
 e
}.tack.toe

とユーザーに明示的に書かせるべきだと思う
つまり inject 状態
791デフォルトの名無しさん:2009/06/22(月) 13:52:14
rubyのガーベッジコレクッションはJavaやjavascriptみたいに参照されなくなったオブジェクトを自動で廃棄してくれると考えていいのですか?
792デフォルトの名無しさん:2009/06/22(月) 14:00:16
なんか中国産のパチモノみたいな名前だなw

Rubyも同じ、というかそれ以外のGCを俺は知らない
793デフォルトの名無しさん:2009/06/22(月) 14:03:11
要は、何を以って参照されなくなったと看做すか、の違いだからな。
それを元にやることはいっしょだ。

とりあえず、リファレンスカウント方式ではない、とだけ。
794デフォルトの名無しさん:2009/06/22(月) 16:07:21
>>791
自動的に回収されるけど、運が悪いと回収されないことがある。
興味があれば「保守的ガーベージコレクション」でぐぐってみよう。
795デフォルトの名無しさん:2009/06/22(月) 16:37:34
そういう微細なことを指摘する理由はなんだろうと最近思う
796デフォルトの名無しさん:2009/06/22(月) 16:37:40
ガーベッジコレクッション
797デフォルトの名無しさん:2009/06/22(月) 16:42:40
微細なことを質問してるんじゃないかと解したんだろう。
わざわざRubyの、とか断るからには。
798デフォルトの名無しさん:2009/06/22(月) 16:46:18
そもそもの "Javaやjavascriptみたいに" という表現がなんかアレだ
799デフォルトの名無しさん:2009/06/22(月) 18:02:03
あれ?レスが消えた?
800デフォルトの名無しさん:2009/06/23(火) 16:45:56
each を使わず map とかで ruby らしく実装した
コードを集めたサイトはないですか?
801デフォルトの名無しさん:2009/06/23(火) 16:50:26
気取らずに普段からふつーに map 使えばいいじゃん?

arr.each do |str|
 puts "<#{str}>"
end

と書かずに

puts arr.map{|str| "<#{str}>"}

と書くだけでえすぷりの香りがほら
802デフォルトの名無しさん:2009/06/23(火) 17:04:37
>>801
ありがとうございます。
巨大な配列だとメモリを使わない方法とか、
なんかそういうのも知りたくて。
803デフォルトの名無しさん:2009/06/23(火) 17:11:19
map は写像だから配列は常に2倍2倍だ
写像後のメモリを気にしなければならないのなら map は「使ってはいけない」し
配列として存在するときのメモリがそもそも気になるなら
加工済み配列を作らずに初期データででっかい each を回せ
804デフォルトの名無しさん:2009/06/23(火) 17:21:33
もしかしてmap!と言いたかったんじゃないかと推察する
805デフォルトの名無しさん:2009/06/23(火) 17:30:30
map に困るくらいでけぇ配列を map! したら置き換えコストだけでおなかおっぱおだと思う
素直に each で1個ずつ使い捨てしたほうがまだマシかと
806デフォルトの名無しさん:2009/06/23(火) 18:00:15
>>803-805
ありがとうございます。
807デフォルトの名無しさん:2009/06/23(火) 22:00:59
mapってなんだ???
マッピングとなんか関係ある?
808デフォルトの名無しさん:2009/06/23(火) 22:06:22
写像のこと。
bump mappingなんかのmappingのことなら同じ意味。

809デフォルトの名無しさん:2009/06/23(火) 22:10:20
map するということとは関係あるが、地図を作るという意味のマッピングとは特に関係しない
(現実と一対一で対応する紙の上の点という意味では合ってるが省略)
っていうか写像っていう言葉が出てるんだしそっちから調べてくれ

大量のA → <AからBへの変換装置> → 同数のB

この説明は間違ってるが、おーむねこれが写像だ
数学の関数も写像の概念が通る
f = 2x+1 という関数を表す Ruby コードは arr.map{|x| x*2+1}

とかいう高尚なものは一切忘れて「配列Aを配列Bにする機能」だと思ってくれてオケェ
810デフォルトの名無しさん:2009/06/23(火) 23:06:33
>>807
配列の全要素に同じ関数を適用する。
811デフォルトの名無しさん:2009/06/23(火) 23:19:16
ここの全単写ってやつだよね
http://ja.wikipedia.org/wiki/%E5%85%A8%E5%B0%84
812デフォルトの名無しさん:2009/06/24(水) 03:54:22
スタンドアロンでHTAでRubyを走らせる方法があったら教えてください
ActiveRubyなら可能ですが動作にはActiveRubyのインストールが必須で
作ったものを配布する用途にはあまり向きません
JSRubyならそのままは知らせることが可能ですが付属ライブラリがしょぼすぎます・・・orz
813デフォルトの名無しさん:2009/06/24(水) 04:12:40
>>812
一応聞こう
HTAって何?
814デフォルトの名無しさん:2009/06/24(水) 04:43:48
812じゃないが
HTML Application。HTML + ActiveScript
815デフォルトの名無しさん:2009/06/24(水) 04:53:42
>>814
いやそれは知ってる
>>812の文面から>>812がナニをHTAとして扱ってるのか気になった
816デフォルトの名無しさん:2009/06/24(水) 04:55:39
多分単純に.htaファイルを他のものなしで動くようにしたいんだろう。
ムチャな話だけど。
817デフォルトの名無しさん:2009/06/24(水) 05:50:26
arr.map{|x| x*2+1}

だけ見ると、lambda式みたいだな
818デフォルトの名無しさん:2009/06/24(水) 06:34:57
>>812
試してないが、スクリプト側を子プロセスとして走らせるのはどうだろうか
Vbsでできるのか知らんけどCreateProcess + CreatePipeとか
ファイルでやり取りする程度ならShellExecute("cmd.exe /C 〜")とか
819デフォルトの名無しさん:2009/06/24(水) 07:04:34
>>817
irb> f = lambda{|x| x*2+1}
irb> p [1, 2, 3].map(&f)
[3, 5, 7]
820デフォルトの名無しさん:2009/06/24(水) 07:40:19
irb> f = lambda{|x| x+"様"}
irb> p [山田,スズキ, 田中].map(&f)
[山田様,スズキ様, 田中様]
821デフォルトの名無しさん:2009/06/24(水) 07:54:58
mapはRubyらしいというよりはPerlらしいにおいがほのかに。
map{..}.grep{...}とかやるともう。
822デフォルトの名無しさん:2009/06/24(水) 08:10:55
あれは map という名前の由来がいちおう Lisp なので云々

map は Perl5 からだよね
Ruby より早いのか
823デフォルトの名無しさん:2009/06/24(水) 08:14:23
Perl ははやく Ruby みたいな見やすくてわかりやすいイテレータを導入して欲しい
書いててどこがコレクションでどこか変換関数でどこが変換用変数なのかよくわからん
824デフォルトの名無しさん:2009/06/24(水) 08:25:39
ならRubyでいいじゃん
825デフォルトの名無しさん:2009/06/24(水) 08:29:07
ていうかRubyは
「ブロック処理とイテレーションが文法レベルでサポートされててかっちょええ」
というただ1点だけでここまで生き延びたんで、そう簡単に真似っこされても困る

次の質問の方どうぞ
826デフォルトの名無しさん:2009/06/24(水) 13:10:08
「普通にオブジェクトを返すが、条件次第で nil を返す」という hoge というメソッドがあって、
hoge の返り値が真かどうかを調べる hoge? というメソッドを作ったときに

def hoge?
 ! hoge.nil?
end

というのがびみょーになんかアレなんだけど、こー、もうちょっとイイ感じに書けないもんすかね
nil かどうか調べて、その真偽を反転するというのがなんかちょっと
827デフォルトの名無しさん:2009/06/24(水) 13:19:57
>>812
RubyからWin32OLEでIE呼んでもHTAと似たようなことはできなかったっけ?
828デフォルトの名無しさん:2009/06/24(水) 13:29:05
HTAってハイパースレッドアーキテクチャーとかかと思った
829デフォルトの名無しさん:2009/06/24(水) 13:51:20
def hoge?
 hoge ? true : false
end

hoge が false を返しても偽になるけど。
830デフォルトの名無しさん:2009/06/24(水) 14:01:14
俺ならこれかな
def hoge?
 not hoge.nil?
end

! はあんまり好きじゃないってだけだけど・・・って見た目の話じゃないのか

hogeの返値がたとえばStringかnilだっていうなら
hoge.class == String
とか

>>829
hoge.nil? ? false : true

・・・うーんw
831デフォルトの名無しさん:2009/06/24(水) 14:21:08
(A)何かしらのオブジェクト、あるいは、(B)存在しないという意味でnil
を返すってときに、true とか false とかを (A) に含めて欲しくない。
なので見やすさから >>829を支持する。

それかいっそ alias hoge? hoge でもいいじゃん。
832デフォルトの名無しさん:2009/06/24(水) 14:26:21
> それかいっそ alias hoge? hoge でもいいじゃん。

え・・・
833デフォルトの名無しさん:2009/06/24(水) 14:43:14
def hoge?
 hoge
end
という意味でしょ
ふつうhoge?といえば@hogeに対して行うからaliasが使えないけど

>true とか false とかを (A) に含めて欲しくない
それはhogeがtrueを返すなら含めるしかないわけで、外野にはなんとも

でも言われてみれば?付きメソッドの返値がboolである必要はないんだよな
もはやhoge?の存在意義が怪しいw

もしhogeがfalseとnilを区別するなら考えなきゃならんけど
そうなると今度はnil?を避けられなくなる
834デフォルトの名無しさん:2009/06/24(水) 15:19:40
? つきのメソッドは true か false のどちらかを返すべきだろう
= つきのメソッドが内部変数代入を伴うと期待されるのと同じように、
[] というメソッドがキーつきフェッチを行うことが期待されるのと同じように
835デフォルトの名無しさん:2009/06/24(水) 15:27:55
ふつーは、
hoge の返り値が nil か false 、または hoge の存在探知の結果が偽である → hoge? は false
hoge の返り値が nil でも false でもなく、 hoge の存在検知の結果も真である → hoge? は true
だろ

たとえば hoge の返り値が配列だったとして、 空の [] が返ってきたとき、
「[] は nil でも false でもないから hoge? は true を返すべき」とはならんだろ
通常は配列に詰まって返ってくるべきところ、配列が空になる事態が起こればそれは 偽 でいいじゃん?
836デフォルトの名無しさん:2009/06/24(水) 16:02:02
>>834
>? つきのメソッドは true か false のどちらかを返すべきだろう
? つきのメソッドは 真 か 偽 のどちらかを返すべきだろう
だったら賛成できる。
837デフォルトの名無しさん:2009/06/24(水) 16:05:54
>>836
だからRubyのオブジェクトは偽でなければすべて真であって、どっちかの状態しかねえんだよ
それと全く同じ状態を返すメソッドなんて hoge? として存在させる意義ねえだろ
そういうのは素直に hoge とその運用に任せるべき
if hoge then puts 'hogeあるよー' end みたいな
838デフォルトの名無しさん:2009/06/24(水) 16:06:47
>>834
昔はそう思ってたんだんだけどね
でも演算子defined?の時点で真ならString、偽ならnilを返す仕様と知ってどうでもよくなった
839デフォルトの名無しさん:2009/06/24(水) 16:08:51
>>837
その理屈はaliasの存在理由すら否定されるw
840デフォルトの名無しさん:2009/06/24(水) 16:10:22
true が true 以外に全くマッチしやがらねえというのが問題の根っこな気がする

"33" == true
"33" === true

このへんが真を返すなら

puts '真だ' if hoge === true

とか書けるのに
841デフォルトの名無しさん:2009/06/24(水) 16:12:59
>>839
違う
842デフォルトの名無しさん:2009/06/24(水) 17:16:57
>>840
何を言っているのか分からない
どの辺にマッチしてどの辺にマッチしなければ理想なんだ
843デフォルトの名無しさん:2009/06/24(水) 17:35:35
>>840
そんなPHPみたいな言語になったら躊躇なくRubyを捨てる


質問なんですけど、RSpec で複数の before() に似たような処理があるときって、
なにかまとめる方法はありますか。
今はアドホックに def xxx() を定義して複数のbefore() から呼び出しているんですが
これでいいのか疑問が湧いてきたので。
RSpec の流儀みたいなのがあれば教えてください
844デフォルトの名無しさん:2009/06/24(水) 17:59:03
>>840
値だけ書いとけばいいだけじゃん
845デフォルトの名無しさん:2009/06/24(水) 18:05:45
rubyからchasenを使いたいんですが、ruby-chasenがダウンロードできなくて困っています。
どなたか持ってたらいただけないでしょうか?
846デフォルトの名無しさん:2009/06/24(水) 18:16:59
>>845
同じく困って PHP を使った
847デフォルトの名無しさん:2009/06/24(水) 18:34:30
trueは真を意味する代表的な値であるだけで、普段は使う機会少ないよな。
848デフォルトの名無しさん:2009/06/24(水) 18:42:49
え・・・
849デフォルトの名無しさん:2009/06/24(水) 18:54:35
モーツァルト効果(笑)とかばっかじゃねーの?
精神病院に行った方がいいよpwwww
850デフォルトの名無しさん:2009/06/24(水) 18:55:38
誤爆
851デフォルトの名無しさん:2009/06/24(水) 20:27:43
「そういえば、『出産は満月に多い』と聞いたことがある。」
出産と満月(Matzにっき)
http://www.rubyist.net/~matz/20041028.html

こっちの方がうさん臭いけどな。
幾人かの医師や助産師に聞いてみたら、因果関係はないと言われた。
852デフォルトの名無しさん:2009/06/24(水) 20:41:08
それは統計的な結果なのか?
それとも医師や助産婦の経験的な記憶によるものなのか?
おれはいつが満月かなんて全く意識してないから分からないのだが、
医師や助産婦はそれを意識してるということだろうか。
853デフォルトの名無しさん:2009/06/24(水) 20:58:27
854デフォルトの名無しさん:2009/06/24(水) 21:23:00
あと書き忘れたので>>853に追記
Windows環境ならRuby/ChaSen Win32API版もいいらしい、試してないが
ttp://www.mizimada.net/2008/02/12/rubychasen-via-win32api/
855デフォルトの名無しさん:2009/06/24(水) 22:57:50
windows上で、指定された画像ファイル(とりあえずjpeg,bmp)の色深度と画素数だけ調べたいと思っています。

何か追加ライブラリがないと出来ないと思うのですが、
最終的にはexerbで実行ファイルを配布可能な形にしたいので、ImageMagickは使いづらいと思っています。
image_sizeでは画素数は分かるけど色深度はしらべられないみたいです。

適当なライブラリないでしょうか。
856デフォルトの名無しさん:2009/06/24(水) 22:58:42
Rubyのクロージャ(Procオブジェクトとブロック)について教えてください。
javascriptの関数もクロージャですが、実装は全く異なるのでしょうか?
同じクロージャでも言語によって全然実装が異なるのか、あるいはだいたい同じ実装の仕方をするものなのかを知りたいのです。
例えばjavascriptの場合、関数が呼ばれるごとにActivationオブジェクトというスコープが作られて、関数定義時のスコープチェインに追加されますが
RubyのProc#callでも同じような動作をしますか?
857デフォルトの名無しさん:2009/06/25(木) 05:50:19
また exerb 厨か
858デフォルトの名無しさん:2009/06/25(木) 05:51:00
Activationオブジェクトに関してはその通りだと思うけど、それはクロージャに限らずメソッド呼び出しでも同じこと。
(いちおうRubyではメソッド≠クロージャね。)
「クロージャの実装」とわざわざ断り書きをいれるからには、通常は変数スコープの共有方法についての話だと思ってしまった。
859デフォルトの名無しさん:2009/06/25(木) 06:21:19
いやrubyにactivationなんて無いから
860デフォルトの名無しさん:2009/06/25(木) 07:32:30
>>855
まったく試してないが適当なことを言うと
Ruby/SDLで色深度の取得とかできないかな。Surfaceとして読み込んでから深度を調べる感じで
861デフォルトの名無しさん:2009/06/25(木) 12:46:09
>>859
activationレコードのことだろ?
関数呼び出しを行う言語ならどれも内部に持っていると思うけど。
それがRubyスクリプトからは見ることも触ることもできないというだけで。
862デフォルトの名無しさん:2009/06/25(木) 14:00:49
>>857
まあそう言わず
スクリプト言語に無理なことはそもそもやらせない、という原則を
Rubyにおいて良くも悪くも壊したのが Exerb だしさ
863856:2009/06/25(木) 14:30:20
>>858
ありがとうございます。
Activationオブジェクトが通常のメソッド呼び出しでも作られるとは知りませんでした。
でもそうなるとクロージャと、クロージャでない関数(またはメソッド)の実装上の違いって何なのでしょうか?

例えば入れ子の関数(クロージャ)があるときに、内側の関数が外側関数のActivationを保持するためにこのスコープを持ち歩く
という理解だったため、Activationがクロージャの機能を実現してると思ってました。
ここら辺はオライリーのJavaScript第5版という本で勉強しました。
言語に拠らないもっと根本的な知識が無いと実装を理解するのは難しいでしょうか?
864デフォルトの名無しさん:2009/06/25(木) 14:49:30
>>863
このへん詳しくないからなんだけど、javascriptだって関数実行時はローカル変数のために
いつでもactivationオブジェクトが生成されるはず
ttp://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/10_Execution_Contexts.html#section-10.1.6

>言語に拠らないもっと根本的な知識が無いと実装を理解するのは難しい
両側から攻めるべきかと
rubyで内部の話をするにはソースコード読むしかないけどw
865デフォルトの名無しさん:2009/06/25(木) 14:52:37
JavaScriptでは関数=クロージャだけど、Rubyではメソッド≠クロージャ。
クロージャってのは本来変数のスコープに関しての概念だから、関数と切り離して考えた方がいいと思うよ。
Activation Record(駆動レコード)は関数呼び出しのある言語ならどれでも備えているもの。
コンパイラの本を読むとたいてい書いてある。
866デフォルトの名無しさん:2009/06/25(木) 15:12:14
activation recordは生成されるが、RubyではActivationオブジェクトのような
オブジェクトとして見えたりはしない。
867856:2009/06/25(木) 15:21:20
ありがとうございます。
なるほど…クロージャは関数とは同列では無いわけですね。少しすっきりしました。
考えてみればrubyのクロージャのブロックも単純な処理のまとまりでした。
>>864さんのリンク詳しいですね。理解が深まりました。

自分なりに考えをまとめてみると、
関数がクロージャになるのは、関数自体の機能とは無関係で、入れ子に関数を定義したときにクロージャが発生するというイメージでしょうか。
つまり、「ある処理のまとまり」をデータとして扱える言語なら確実にクロージャを実現できそうです。
Rubyのメソッドはクラスの中に定義しなければならないためメソッド単位でデータとしてretunすることが出来ないのでクロージャを実現できないと。
このように考えると、Javaの無名クラスでクロージャっぽいことが出来るけど不便だ、という評価もなんとなく分かりました。
868デフォルトの名無しさん:2009/06/25(木) 15:55:17
ファーストクラスオブジェクト関数とクロージャがごっちゃになってる気もする
それらが切り離されてる具体例は知らないけど、概念としては別物
869856:2009/06/25(木) 17:03:38
また新しい言葉が…やっぱり中身を知ろうとすると難しいですね。
コンパイラの本を探して勉強してみることにします。
870デフォルトの名無しさん:2009/06/25(木) 17:08:26
Java 7 でクロージャの導入が検討されていたり、
関数型言語が少しブームになってきたことを考えると、

クロージャの概念そのものについて勉強するのも良さそうですね
871デフォルトの名無しさん:2009/06/25(木) 17:17:08
無名関数があればクロージャ作れると思ってたけど違うの?
872デフォルトの名無しさん:2009/06/25(木) 17:24:57
クロージャっていうのは、関数をオブジェクトとして扱えるかどうかでしょ?

Java の話だけど、無名関数は、あくまでも文法上、関数名をつけずに宣言しているだけで、内部では
オブジェクト扱いされていないからちょっと違うのでは
873デフォルトの名無しさん:2009/06/25(木) 17:32:11
>クロージャっていうのは、関数をオブジェクトとして扱えるかどうかでしょ?
ぜんぜん違う。

実行時コンテキストを持っているからクロージャー(Closure)でしょ。
874デフォルトの名無しさん:2009/06/25(木) 17:41:40
CSVがうまく読み込めない。
ソースは
CSV.open("./test.csv", 'w') do |writer|
writer << ["ruby", "perl", "python"]
writer << ["java", "C", "C++"]
end
CSV.open("./test.csv", 'r') do |row|
puts row
puts row
end
でなぜか実行結果が
#<CSV:0xc7c158>
#<CSV:0xc7c158>
となる。
環境は、
ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mswin32]
WindowsXP
もしかしてインストールがうまくいってないのかな?
875デフォルトの名無しさん:2009/06/25(木) 17:45:08
一般的にクロージャ=レキシカルスコープ+ファーストクラスオブジェクト

レキシカルスコープの時点でクロージャと呼べる気もするけど役には立たなさそうw

>>874
puts row.join(", ")
876デフォルトの名無しさん:2009/06/25(木) 17:45:26
色深度という言葉を聞くとアルシンドを思い出す。
877874:2009/06/25(木) 17:49:30
>>875
ごめん、それはもうやったんだ。
file.rb:12:in `block in <main>': undefined method `join' for #<CSV:0xec3344> (NoMethodError)
とかいうエラーでる。
書き込みは出来てるんだけど、なぜか読み込めないんだ。
878デフォルトの名無しさん:2009/06/25(木) 17:56:50
>>877
1.8.7だと>>874がちゃんと動くよ(openのブロック引数にArrayが入る)
仕様が変わったか別のライブラリを読み込んじゃってるんじゃない?
879デフォルトの名無しさん:2009/06/25(木) 18:00:46
puts row.join(", ")
だとデータ中に , を含むデータがある場合に困るね。
880デフォルトの名無しさん:2009/06/25(木) 18:04:56
>>874
require 'csv'
CSV.open("./test.csv", 'wb') do |writer|
writer << ["ruby", "perl", "python"]
writer << ["java", "C", "C++"]
end
CSV.open("./test.csv", 'rb') do |csv|
csv.each do |row|
puts row
end
end
881デフォルトの名無しさん:2009/06/25(木) 18:24:16
>>853
すげー。ありがとうございます。
882874:2009/06/25(木) 18:33:31
>>880
動いた。ありがとう。
CSVライブラリの仕様が1.9.1で変わってるのかな?
883デフォルトの名無しさん:2009/06/25(木) 18:57:54
>>882
Ruby1.9.1 の csv.rb は fastercsv 寄り
通常の open または IO なんかと同じようにメソッドを使う

CSV.open("./test.csv", 'rb').each do |row|
p row
end

このへんが適解
出力は

["ruby", "perl", "python"]
["java", "C", "C++"]
884855:2009/06/25(木) 20:35:24
結局ファイルをバイナリで開いて必要な情報を読み取るという力技にしてしまいました。

>>860
ありがとうございました。次の機会に試してみます

>>862
すみません、無理なことさせてますよね……

885デフォルトの名無しさん:2009/06/25(木) 21:15:47
>>884
それを勧めようとして、その前に自分で試したところで挫折したから黙ってたんだけど
JPEGの色深度のところはどうやった?
886デフォルトの名無しさん:2009/06/25(木) 21:16:19
クロージャを理解するのは苦労じゃ
887デフォルトの名無しさん:2009/06/25(木) 21:18:51
実装がめんどい
クロージャーを実装するのは苦労じゃ〜
888デフォルトの名無しさん:2009/06/25(木) 21:24:45
>>885
すべてのJPEGに対応する必要は無く、
 JFIF形式の8bitグレースケールの画像か、それ以外かを確認すればよい
という目的だったので、
JFIFであることを確認して、
それ以降をeach_byteでスキャンしてFFC0の並びになるところを探して、
そこから数バイト取得して、って流れでやりました。
889デフォルトの名無しさん:2009/06/25(木) 22:05:26
>>888
なるほど、水平サイズの直後のやつか
890デフォルトの名無しさん:2009/06/26(金) 17:34:10
cp file1.txt file2.txt
ln file1.txt file3.txt
としたときに、file1.txt と file3.txt とがハードリンクされたものであることを
Rubyで調べようとしたら、どうしたらいいでしょうか。
891デフォルトの名無しさん:2009/06/26(金) 17:38:12
stat = File.stat(path)
stat.nlink #=> ハードリンク数
stat.ino #=> iノード番号
892デフォルトの名無しさん:2009/06/26(金) 17:50:44
ありがとうございます。
893デフォルトの名無しさん:2009/06/27(土) 00:52:10
俺と Matz がハードにリンク!
894デフォルトの名無しさん:2009/06/27(土) 01:14:23
1.up_o 10 |x|
 p x
end

p x

で、なぜエラーになるのだ
895デフォルトの名無しさん:2009/06/27(土) 01:15:55
ぐあ、1.uptoですたい
896デフォルトの名無しさん:2009/06/27(土) 01:28:59
エスパーしてみるけど君がやりたいのはもしかするとこういうことか?

1.upto 10 do |x|
p x
end
897デフォルトの名無しさん:2009/06/27(土) 01:35:08
いや、何がいいたいかと言うと
ループないで使用された、xが
ループ抜けた後で使うとエラー
になるという…
898デフォルトの名無しさん:2009/06/27(土) 01:43:15
x は仮変数だから
899デフォルトの名無しさん:2009/06/27(土) 03:07:31
アホ過ぎだろ
900デフォルトの名無しさん:2009/06/27(土) 03:09:12
いや、初心者スレだから・・・。
なんでエラーになるかというと、ブロック内で定義された変数は、
ブロックの外では使えないからです。
901デフォルトの名無しさん:2009/06/27(土) 05:35:22
でもブロックの外にあった変数とたまたま名前が同じだった場合は
ブロックの外にあった変数がブロックの中で最後に使われてた値が残っちゃうけどね!

x = "x!"
[1,2,3].each{|x| puts "hoo"}
p x #=> 3

上記は "x!" じゃなくて 3 だよ!

s = "very important string"
puts "s is #{s} before block"
['one', 'two', 'three'].each do |count|
s = count.upcase
puts s
end
puts "after block, s is #{s}"

適当すぎる変数名をあちこちで使い回す癖のある人は気をつけたほうがいいよ!
あと見かけが似てるけど if はブロックつきメソッドじゃないから
ブロックの中で定義した新変数はブロックの外に持ち越されるよ!

[1,2,3].each{|x| y=x}
p y rescue puts "each では y ないです"
if true then
y = 4
end
p y rescue puts "if では y ないです"
902デフォルトの名無しさん:2009/06/27(土) 05:49:08
ブロック仮変数として1文字の e や x に人気があるんだが、
1
2
3
[1, 2, 3] done!
4
5
6
[4, 5, 6] done!

とかいう表示を期待して

[[1,2,3], [4,5,6,], [7,8,9]].each do |x|
x.each{|x| p x}
puts "#{x.inspect} done!"
end

と素直に書くと非常にがっかりさんモードになる

ちなみに Ruby1.9 では期待通りに動作するのでスクリプト頒布には注意
この動作に依存したスクリプト作る人なんて滅多にいないとは思うけどね
たいていはこの動作を避けるように仮変数はそもそも別名にしてるはずだから
むしろ 1.9 の人が 1.8 用に作ってハマる可能性のほうが高そうだ
903デフォルトの名無しさん:2009/06/27(土) 08:48:00
変数にはスコープというのがあるから >>897

>>896の例ではxはイテレータブロック内のみで参照できる限定されたスコープで、
>>901の例では、イテレータブロック外であらかじめ参照されているので、
イテレータブロックよりもひとつ外のスコープになる。

マトリョーシカのような入れ子構造を創造するとわかりやすい。
904デフォルトの名無しさん:2009/06/27(土) 15:45:40
0,1,2〜を与えると、
a,b,c〜を返すお手軽メソッドはありませんでしょうか?

例:
(0..10).each {|x| puts get_alphabet(x) }

出力例:
a
b
c
d
e
f
g
h
i
j
905デフォルトの名無しさん:2009/06/27(土) 15:52:56
def get_alphabet(x); (?a + x).chr; end
906デフォルトの名無しさん:2009/06/27(土) 16:00:14
1.9.1でも動作するように
def get_alphabet(n) ; ('a'[0].ord + n).chr ; end
907デフォルトの名無しさん:2009/06/27(土) 16:13:13
>>905-906
ありがとうございます!

%w(a b c d ....)[i] || i
みたいにやろうとしてたww
Rubyは文字型ないからやりぬくいーと思ってました

似たようなことできるんですね
908デフォルトの名無しさん:2009/06/27(土) 16:31:04
ちょう手軽でちょうわかりやすい
('a'..'z').to_a[x]

p ('a'..'z').to_a[0]
"a"
p ('a'..'z').to_a[1]
"b"
909デフォルトの名無しさん:2009/06/27(土) 17:45:16
>>906
1.8.6で動かなかった…(´・ω;:..
鯖で動かないハメくらった。Ubuntuめー。
910デフォルトの名無しさん:2009/06/27(土) 17:48:42
>>908
サンクス
>>905-906だと30.timesとかみたいに、アルファベット範囲超えた時に変なので、
超えたときも考慮して、こんな感じでやってみます。to_aがまあ富豪的ですが…

def get_alphabet(n) ; ('a'..'z').to_a[n] || n.to_s ; end
911デフォルトの名無しさん:2009/06/27(土) 20:15:00
(n+10).to_s(36)
912デフォルトの名無しさん:2009/06/27(土) 20:16:48
>>890
File.identical?("file1.txt", "file3.txt")
913デフォルトの名無しさん:2009/06/28(日) 06:23:01
独習Ruby
ttp://www.amazon.co.jp/dp/4798117854/
踏み込みが浅いなと思ったらやたら広範囲だったでござるを地で行く本
良くも悪くも「普通」のRubyの本がやっと出たという感じ

  「本はやっぱ極力新しいほうが新しい情報も載ってていいんじゃね」
  「ネット上で調べればわかるったって本で纏まってるのに意味があんだよこれだから素人は」
  「Rubyなんてひとまず使えるのが一番で思想とかこまけぇこたぁいいんだよ!!」

と考える書籍大好きさん向け
プログラミング自体の初学者さんにはお勧め度が正直わりと下がるが、
いちおうまとまってはいるので if then else くらいはなんとかなる程度のRuby初心者さんの補強、
または一通り舐めてみたい他言語者さんのサブ言語習得時サポートにどうぞ


以下目次
ttp://www.seshop.com/detail.asp?pid=10586&mode=spec
Rubyの基礎知識・文法・数値・文字列(普段使う程度の1.9対応)・日時・配列・ハッシュ・
メソッドとクラス・クロージャ・例外処理・出入力・ネットワーク・スレッド
第13章 簡単なアプリケーション開発の例(単純なHTTPソケット通信サーバ)
第14章 オブジェクト指向の設計・開発(紹介)
第15章 テスト駆動開発(Test::Unitをてきとーに)
第16章 デザインパターン(さらっと)
第17章 開発に役立つツール
17.1 RDoc(文法程度)
17.2 Ruby Gems(日常利用)
17.3 Rake (日常利用できる程度の文法)
914デフォルトの名無しさん:2009/06/28(日) 07:02:18
イラネ
915デフォルトの名無しさん:2009/06/28(日) 07:10:50
独習からLLってことでムトゥ神が書いてるのかと思ったけど

独習Ruby (大型本)
株式会社テクノロジックアート (著)

漏れもイラネ
916デフォルトの名無しさん:2009/06/28(日) 07:17:30
>>913の目次見る限り惹かれるけど、
> 株式会社テクノロジックアート (著)
これって地雷会社?
917デフォルトの名無しさん:2009/06/28(日) 07:17:53
目次を見るとなかなか惹かれるな
とりあえず本屋で探してみよう
918デフォルトの名無しさん:2009/06/28(日) 07:28:50
うお不評

>>916
うん、まあ、なんだ、翻訳モノではなんというか、こう、そう、しいて言うなら英語に強くなれるというか

翻訳+テクノロジックアート+長瀬嘉秀+アジャイルで満貫(アジャイルはUMLでも可)
今回は2つしか当てはまってないからなんとかなるよ、たぶん
919デフォルトの名無しさん:2009/06/28(日) 08:21:54
>>913-918
宣伝乙
920デフォルトの名無しさん:2009/06/28(日) 08:46:25
本の宣伝というよりはSEshopの宣伝だろうなぁ
そのサイトの管理人、いたるところにURL貼り付けてる。
Amazonで買った方がいいよ
921デフォルトの名無しさん:2009/06/28(日) 08:50:26
>>920
Amazon宣伝乙
922デフォルトの名無しさん:2009/06/28(日) 08:52:22
>>920
SEShopって翔泳社のサイトだぞw
それでも中の人が工作してると思うのなら別に止めないが
ちなみに推薦書スレなんかでも貼られる頻度は高くない

貼られるのは長瀬がらみの(ry
923デフォルトの名無しさん:2009/06/28(日) 09:10:21
スレ的Ruby書籍としては正当な部類だと思うがね
少なくとも検索エンジン云々よりはこのスレ向きだ

技術書スレ的にもまあ話題満載というか
924デフォルトの名無しさん:2009/06/28(日) 09:26:16
翻訳が酷いといえばクイープの方が凄いぞ
ruby wayとかの。
925デフォルトの名無しさん:2009/06/28(日) 09:49:16
クイープ翻訳の好きな俺もいるんだがな
926デフォルトの名無しさん:2009/06/28(日) 09:55:42
>>924
オライリーの翻訳やりだした頃は印象よかったんだけど・・・

PowerShell in ActionやWindowsプログラミングの極意なんかは
途中で読むのをやめてしまった
翻訳のせいなのかは知らないが
927デフォルトの名無しさん:2009/06/28(日) 10:44:33
>>913
やっぱ例の黄色本か。
オライリーの動物本よりはとっつきやすいがな。
928デフォルトの名無しさん:2009/06/28(日) 10:53:26
この手の本はPHPでたくさん出てるけど、あまり深い物がないような。

インプレスの基礎シリーズでもRailsが出てるが、
メジャーなシリーズで取り上げられるというのは、
需要が出てきてるってことかもしれんのでその点は歓迎する。
929デフォルトの名無しさん:2009/06/28(日) 10:56:30
一応独習シリーズは定評がなくもないので、せっかくならもうちょいイイのを作って欲しかったとは思う
930デフォルトの名無しさん:2009/06/28(日) 14:22:23
Rubyからメールを送るには今のところどのライブラリ使えばいい?
配布の予定はないけれど、エラーのときメール送るだけだからあまり大きくないのがいいなあ
931デフォルトの名無しさん:2009/06/28(日) 14:23:16
あ、バージョンは1.8.7
1.9で使う予定は今のところない
932デフォルトの名無しさん:2009/06/28(日) 14:30:22
>>930
「送る」だけなら net/smtp
933デフォルトの名無しさん:2009/06/28(日) 14:30:28
actionmailer
934デフォルトの名無しさん:2009/06/28(日) 14:36:17
TMailでいいじゃん?
935デフォルトの名無しさん:2009/06/28(日) 14:37:22
tmailは受けるほう
936デフォルトの名無しさん:2009/06/28(日) 14:43:04
TMailが便利なのは送る寸前までだな
送信自体はnet/smtpのはず
937デフォルトの名無しさん:2009/06/28(日) 14:49:22
sendmail入れてruby simplemailを使うのも簡単だぜ
938デフォルトの名無しさん:2009/06/28(日) 14:52:12
エラー通知みたいな用途ならシェルから mail コマンド使うのが一番楽だと最近気づいた
939デフォルトの名無しさん:2009/06/28(日) 15:14:08
質問お願いいたします。

ログ出力にLoggerを使っておうとしております。
 log = Logger.new(STDOUT)
すると、標準出力にログがでます。
 log = Logger.new("hoge.log")
とすると、ファイルにログが出ます。

現在困っていることには、STDOUTと"hoge.log"、両方に同時に出力したいのです。
どうしたものでしょうか?
今は、
 log = Logger.new("hoge.log")
 log.info("hage!!")
 puts "hage!!"
みたいに両方書いているのですが、なんだかなーという感じです。
940939:2009/06/28(日) 15:30:37
Logger::LogDevice.writeを上書きしようとか思ってたのですが、

なんだか、
 log = Logger.new(STDOUT)
にしといて、
ruby hoge.rb | tee hoge.log
としておけばいい気がしてきました…。
941デフォルトの名無しさん:2009/06/28(日) 15:51:10
> Logger.new(logdev, shift_age = 0, shift_size = 1048576)
> Logger オブジェクトを生成する。
> logdev には記録するファイル名か、write と close が定義されたオブジェクト(IO オブジェクトなど)を与えます。

ということで

class Tee
def initialize(file)
@stdout, @file = $stdout, File.open(file, 'a+b')
end
def write(s); @file.write(s); @stdout.write(s); end
def close; @stdout.close; @file.close; end
end

require 'logger'
tee = Tee.new('teetest.txt')

log = Logger.new(tee)

log.info('1!')
log.info('2!')
log.info('3!')
942デフォルトの名無しさん:2009/06/28(日) 15:55:22
>>939
log4r
943デフォルトの名無しさん:2009/06/28(日) 16:27:57
Duck Typeのかつやく
944デフォルトの名無しさん:2009/06/28(日) 16:29:45
ありがとうございます。

>>941
なるほど、writeとcloseがあるクラスを渡しさえすればいいのかww

>>942
log4rだと logger.addで出力先を追加できるんですね…。
参考:log4rの基本的な使い方のメモ - 是非に及ばず
http://d.hatena.ne.jp/mingos/20080118/1200620800


次からこっち使います!
945デフォルトの名無しさん:2009/06/29(月) 20:49:53
速いriで現在でも動作するものって何がありますか?
946デフォルトの名無しさん:2009/06/29(月) 20:56:39
fastRIはRDocのバージョンアップに追随できなくて死んだんだっけか
他の探さんといかんな
947デフォルトの名無しさん:2009/06/29(月) 22:11:22
rdoc の記述で質問です
HTML に書き出したとき、HTML のタグをそのまま表示させるようにすることはできますか?
948デフォルトの名無しさん:2009/06/29(月) 22:17:30
>>947
<pre> で囲む記述内でならできるけど、いわゆるインラインで行う方法はない

・ 文字装飾のタグのうち先頭に\がついたものはそのまま表示する
・ HTML はそのまま表示される
・ & は & に変換される

という処理になってる
2番目と3番目が同時に行われてるのが極悪というかむしろバカ
949デフォルトの名無しさん:2009/06/29(月) 22:19:22
ああ、つまんないことに
「&は&amp;に変換される」が正解

普通、2番目やったら3番目はやらないもんだ
950デフォルトの名無しさん:2009/06/30(火) 10:20:03
Ruby1.8用の Rubygems と Ruby1.9 用の Rubygems の両方をインストールしたシステム上で
両方を使い分ける方法はありますか?
951デフォルトの名無しさん:2009/06/30(火) 11:40:07
質問です。 yumで入れた拡張ライブラリをビルドし直したい場合って
どうすればいいんでしょう?

OSをアップグレードしたせいで、ライブラリのバージョンがビルド時と
違うよって警告を出すモジュールがあります。特定のモジュール
だけの話なら一度削除して入れ直せばいいと思うのですが、
気持ち悪いので全部ビルドし直したいです。
yum rebuild-all
みたいな意味の操作って出来ませんか?
952デフォルトの名無しさん:2009/06/30(火) 11:41:27
>>951
ごめんなさい、yumじゃなくてgemです。
gemで入れた拡張ライブラリを全部ビルドし直したいです。
953デフォルトの名無しさん:2009/06/30(火) 11:42:53
それに必要なのは「ビルドし直す」ではないと思うんだがどうか
ってか誤爆か
954デフォルトの名無しさん:2009/06/30(火) 11:45:20
gem には -v オプションがある
要求されてるバージョンを指定してインストールすればいい
955951:2009/06/30(火) 11:54:33
説明下手でごめん
rubyには関係ないlibABC-1.0.soがあって、
それにリンクしているrubyの拡張ライブラリXYZをgemで入れてあった

libABCを1.1に上げたので、XYZも念のためビルドし直した方が
いいと思うんだけど、どうすれば?という質問です。

XYZを一度削除してまたインストールすれば問題ないと思うんだけど、
それを全てのインストール済みgemについて一度に出来ませんか?
956デフォルトの名無しさん:2009/06/30(火) 12:03:53
>>955
通常は必要ない
/usr/lib ディレクトリあたりから適当に最新のを読み込んで利用する

gem ライブラリ側で警告があるとすれば、それは gem ライブラリ側でその lib に未対応だというだけだ
外部 lib の特定のバージョン限定で動作保証しているんだろう
gem ライブラリがその外部 lib のバージョンに対応するのを待つしかないな
957951:2009/06/30(火) 13:06:51
最初からちゃんと具体例を出すべきだった、ごめん
nokogiriを使ってるスクリプトがあって、これが
WARNING: Nokogiri was built against LibXML version 2.7.2, but has dynamically loaded 2.7.3
というメッセージを出すようになった。
それで、nokogiriをgemでuninstall, installし直したら出なくなって動作もしてる、
だったら他のパッケージも再インストール必要?、という事でした

>>956
基本的には気にしなくていいと言うことですね
ありがとう
958デフォルトの名無しさん:2009/06/30(火) 13:17:28
Ruby1.9.1 の Rubygems ってどうなってるの?
ライブラリひとつも読み込まないんだが
959デフォルトの名無しさん:2009/06/30(火) 13:26:17
gem19 environment の結果の GEM PATHS に無ければ無い
たまにディレクトリに載っててもそこから読まない環境があるらしいが、その場合は Ruby 1.8.7 使え
960デフォルトの名無しさん:2009/06/30(火) 13:36:47
 - GEM PATHS:
   - /usr/local/lib/ruby1.9/gems/1.9.1
  - $HOME/.gem/ruby/1.9.1/gems
  - $HOME/.gem/ruby/1.9.1
  - $HOME/.gem/ruby


$ ls -R $HOME/.gem/ruby/1.9.1/
$HOME/.gem/ruby/1.9.1/:
bin cache doc gems specifications
961デフォルトの名無しさん:2009/06/30(火) 15:08:15
form_tag :action => "update", :id => @item do
 :
みたいなメソッドの引数のHashの括弧が省略できる仕様について、どこかに
公式のドキュメントはないでしょうか?

Railsでけっこうhash引数がメソッド呼び出しに多様されていて、けっこうハマることがあったので、
どんな感じに動くようになっとるんかと、気になりました。
962デフォルトの名無しさん:2009/06/30(火) 15:22:45
「ハッシュの場合はカッコを省略できます」以上のものではないよ

もし「ハッシュでなくても動作する」とかいうのであるなら、それはメソッド定義側でそのように作ってるだけだ
963デフォルトの名無しさん:2009/06/30(火) 15:31:15
結論は962のとおりだけど、
>>961
>けっこうハマることがあったので、
初心者がどうハマるのか興味あるので詳しく。
964デフォルトの名無しさん:2009/06/30(火) 16:49:50
Ruby1.9上のNokogiriでlibxml2.7.3を使えてる人いる?
WARNING: Nokogiri was built against LibXML version 2.6.32, but has dynamically loaded 2.7.3
こんな警告が出るんだけれど

コピペで /usr/lib/libxml2.so を 2.6.32 に戻して nokogiri.so を再コンパイルした場合は何も言われない
2.7.3 の libxml.so を /usr/lib に置いて nokogiri.so を再コンパイル(nokogiri 再インストール)したら上記警告

Ruby1.9 のときだけバージョン固定でもしてあるのかな
965デフォルトの名無しさん:2009/06/30(火) 17:17:51
libXMLのヘッダはどうした
dynamically loadedっつってんだから
コンパイル時にsoファイルがどうだろうと関係なかろうさ
966965:2009/06/30(火) 17:20:27
ごめん、関係ないってことはないな
2行目以降は無視してくれ
967デフォルトの名無しさん:2009/06/30(火) 17:56:28
あ、うっかりしてた
$ cat /usr/include/libxml2/libxml/xmlversion.h | grep "define LIBXML_DOTTED_VERSION"
#define LIBXML_DOTTED_VERSION "2.6.32"
おー

(中略)

p Nokogiri::VERSION #=> "1.3.2"
p Nokogiri::LIBXML_VERSION #=> "2.7.3"
p Nokogiri::LIBXML_PARSER_VERSION #=> "20703"

お、直った
うん、どうもありがとう
968デフォルトの名無しさん:2009/06/30(火) 23:43:10
>>961
見つけた
リファレンスマニュアル>Rubyの文法>リテラル>ハッシュ式
のところ
969デフォルトの名無しさん:2009/07/01(水) 04:10:08
>>963
> 初心者がどうハマるのか興味あるので詳しく。

例えば、Railsのform_tagはこんな風な宣言になってて、
 form_tag(url_for_options = {}, options = {}, *parameters_for_url, &block)
普段、
 form_tag(:controller=>'items',:action=>'update')
みたいに書いていて、:method => 'get'を指定したくなった時に、
 form_tag(:controller=>'items',:action=>'update', :method=>'get')
みたいに書いてうごかねーとか行ってしまったことがあります。

:controllerと:actionは url_for_options に渡すべきもので、:methodは2番目の options に渡すもので、
そもそも全然違うので、一度わかってしまえば全然悩むことではないんですが…。
まあ、本来は下記のように書くわけです。
 form_tag({:controller=>'items',:action=>'update'}, :method=>'get')

>>968
ありがとう、見つけられました。
970デフォルトの名無しさん:2009/07/01(水) 08:05:30
RSpec は Ruby1.9 で一部動かないのか
っていうか spec1.9 みたいなコマンドないの
971デフォルトの名無しさん:2009/07/01(水) 08:10:13
>>970
それは単に gem で format-executable オプションを使う、という話ではないよな?
972デフォルトの名無しさん:2009/07/01(水) 08:23:16
まあ Ruby 1.8 と Ruby 1.9 を併用してるとめんどくさいのは確かではある

>>970
gem/ruby/1.9.1/bin/spec のファイル名を spec1.9 とかそういうのに変えておけ(w
973デフォルトの名無しさん:2009/07/01(水) 10:21:19
まだ1.9は早いよ。1.8で十分。
974デフォルトの名無しさん:2009/07/01(水) 10:28:36
1.9 は 2, 3 年後という感じ?
975デフォルトの名無しさん:2009/07/01(水) 11:47:31
まあ誰かが使わないとよくならんし、
使って文句いうぶんには問題なかろう
976デフォルトの名無しさん:2009/07/01(水) 14:07:51
バージョン1.8.6です
配列の全ての要素が同じかどうか調べるにはどう書くのがスマートでしょうか
今のところ素直にeach回して調べてますが、もう少しスマートな書き方ありそうだなぁと思ってます
977デフォルトの名無しさん:2009/07/01(水) 14:13:55
>>976
arr.uniq.size == 1
978デフォルトの名無しさん:2009/07/01(水) 14:14:01
細かい仕様を追記です。
要素が空の場合、もしくは仲間はずれが居る場合は、falseを返します
全ての要素が同じ内容である場合のみ、trueを返します。
979デフォルトの名無しさん:2009/07/01(水) 14:15:19
>977
あああ、最強です、ありがとうございmす
980デフォルトの名無しさん:2009/07/01(水) 16:32:04
>>977
irbでやってみた。
おおーっと思った。
981デフォルトの名無しさん:2009/07/01(水) 21:01:12
1.9.1でvendor_rubyというディレクトリが導入されてるようですが、
これってsite_rubyとどう使い分けるんですか?
982デフォルトの名無しさん:2009/07/01(水) 21:41:57
1.8.7にもありますな。
http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7/NEWS

たとえばLinuxのディストリだと、Ruby本体以外にディストリで
パッケージングしているライブラリなんかがvendor_ruby向き。
site_rubyはホストの管理者が入れる用。
983デフォルトの名無しさん:2009/07/01(水) 21:46:17
site ディレクトリは /usr/local とどう違うんだ、とか考えると頭が痛くなるな
/usr/local 以下に site_programname を作るのは勘弁して欲しい
984デフォルトの名無しさん:2009/07/01(水) 22:40:53
漢数字から算用数字に変換するのってなんかいい方法無い?
985デフォルトの名無しさん:2009/07/01(水) 22:50:00
>>982
わかりやすい説明ありがとうございました
986デフォルトの名無しさん:2009/07/01(水) 22:58:16
文字コード別に辞書作るのが面倒だ。
987デフォルトの名無しさん:2009/07/01(水) 22:59:02
>>984
2005年のLLDN「キミならどう書く」のあたりのウェブ日記とかをあされば
そこにあるプログラムにそういうルーチンが含まれてると思う。
988デフォルトの名無しさん:2009/07/02(木) 01:13:44
>>986>>987
サンクス。今自分で作ってたら、
"十"
っていう表記を入れると別の部分でsyntax errorが出るんだけど、
これってどうにか回避できない?

環境は
activescriptruby
ruby1.8
RDEで開発と実行
windowsXP
989988:2009/07/02(木) 01:27:44
自己解決

option => デバッグコマンド にある
Ruby's optionのnormal modeに”-Ks”を入れたら上手くいった。
一応require 'jcode'で$KCODE='s'ってやってるんだけど。


これが効くのって正規表現だけじゃないんだな。
990デフォルトの名無しさん:2009/07/02(木) 02:20:18
$KCODEはそれが代入された以降から有効なんだけど
自身のスクリプトは当然、実行されるよりも先にパースが行われるから
コマンドラインオプションで指定しないと間に合わない

一行目で指定しておくのが吉
#!ruby -Ks
http://www.ruby-lang.org/ja/man/html/Ruby_A4CEB5AFC6B0.html#a.a5.a4.a5.f3.a5.bf.a5.d7.a5.ea.a5.bf.b9.d4.a4.ce.b2.f2.bc.e1

>"十"
8F5C、つまりこれと同じ
"\x8F\"
991デフォルトの名無しさん:2009/07/02(木) 11:24:17
shebangに書いてたら、ソース内にダメ文字みたいなの書いててもOKなんだっけ?
992デフォルトの名無しさん:2009/07/02(木) 11:42:09
コマンドラインでオプション指定するのと全く同じ。
993デフォルトの名無しさん:2009/07/02(木) 11:47:36
英文字一文字でかす shebang を利用する美しい仕様ですね
994デフォルトの名無しさん:2009/07/03(金) 01:26:40
最近仕事で「PHPの経験はないの?」と聞かれます。
Webサーバー上での動作でPHPと比較したとき、Ruby(on Rails)の長所・短所って何ですか?
995デフォルトの名無しさん:2009/07/03(金) 01:30:32
それを聞いて相手に言って説得力があるのか?
996デフォルトの名無しさん:2009/07/03(金) 01:30:56
長所
 ・ PHPじゃないこと

短所
 ・ PHPじゃないこと

仕事で使う程度のPHPくらいなんとかしろ
精密なプログラムが必要になることも精密なプログラマが必要になることも良くも悪くもまずない
997デフォルトの名無しさん:2009/07/03(金) 01:47:22
Webサーバープログラムの標準がいまはphpだろ。
998デフォルトの名無しさん:2009/07/03(金) 01:49:51
Ruby on Railsの利点は自分が知ってるだろ
phpがだめな理由、使わない理由も自分で説明しろよ
納得できれば注文を変えてくれる可能性
999デフォルトの名無しさん:2009/07/03(金) 01:53:01
Railsの弱点
Railsが万能であり,PHPやJavaなど既存の環境をすべて置き換えられるという訳ではない。
Railsの作者であるDavid Heinemeier Hansson氏は元々PHPユーザーであり,
いまでも37signalsのページではPHPが使われている。
Railsはしっかりしたモデルを持ったデータベースアプリケーションには向いているが,
メールフォームやアンケートなど,遷移の少ないものでは,その利点をあまり発揮しない。
またPHPなどに比べて,メモリーを消費すると言う問題もあり,
資源の少ないサーバーでの運用には注意が必要である。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060424/236113/
1000デフォルトの名無しさん:2009/07/03(金) 01:55:00
1000!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。