Ruby 初心者スレッド Part 29

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2デフォルトの名無しさん:2009/07/03(金) 12:55:47
【よくあるしつもん】
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/
3デフォルトの名無しさん:2009/07/03(金) 12:56:28
Ruby 公式・非公式便利サイト2009

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

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

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

日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
http://jp.rubyist.net/
4デフォルトの名無しさん:2009/07/03(金) 12:57:12
関連スレ

Rubyについて Part 36
http://pc12.2ch.net/test/read.cgi/tech/1246174168/

アンチスレ
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/07/03(金) 12:57:56
前スレ

Ruby 初心者スレッド Part 28
http://pc12.2ch.net/test/read.cgi/tech/1242436010/
6デフォルトの名無しさん:2009/07/03(金) 13:57:32
instance_variable_get()
instance_variable_get()
instance_variable_defined?()
はありますが
instance_variable_delete()
はないでしょうか。
あるオブジェクトからインスタンス変数を完全に取り除く方法があれば教えてください。
7デフォルトの名無しさん:2009/07/03(金) 14:16:18
現状ではない
8デフォルトの名無しさん:2009/07/03(金) 14:19:45
というかそのへんに依存したコードは書くべきではないと思う
9デフォルトの名無しさん:2009/07/03(金) 15:13:57
>>6
remove_instance_variable

ちなみに俺は>>8の意見には反対、使っても全然OK派


10デフォルトの名無しさん:2009/07/03(金) 15:54:57
リフレクション機能を使うべき場面で使うのは全然問題ないのだが、今が使うべき場面なのかどうかは真剣に考慮しよう。
11デフォルトの名無しさん:2009/07/03(金) 16:18:30
98パーセントくらいは使う必要ないよね
12デフォルトの名無しさん:2009/07/03(金) 16:23:58
プログラミング言語ruby読んでクラス定義とかのフックの柔軟さを知ったときは
キモッって思った一方これ使ったら綺麗に書けそうなプログラムがあるなあとも思った
13デフォルトの名無しさん:2009/07/03(金) 16:28:20
多くは「○○という機能を使ってみた」程度であるのは否定はしない
ふつーに書いたほうがわかりやすいし、多くの場合動作も速い
14デフォルトの名無しさん:2009/07/03(金) 17:22:37
普通に書けるなら普通に書くのがいい
さらに特殊なケースへの対応として、
プログラマがその気になればRubyは大抵の無茶を許してくれる
15デフォルトの名無しさん:2009/07/03(金) 17:57:24
仕事でRubyを使う場合は、どんな業務になりますか?
やはりWeb系ですか?
16デフォルトの名無しさん:2009/07/03(金) 17:58:27
>>15
仕事でRubyを使うことはないです
強いて言うなら趣味グラマーの用途しかありません
17デフォルトの名無しさん:2009/07/03(金) 18:14:43
>>15
サーバは自前で用意するから、という案件が2年でやっと2個

Java, PHP > 量産の壁 >> Perl >> なんかシャレにならない壁 >> Ruby on Rails > Python (激レア)

こんな感じ
「こんなソフト作ってという仕事取ってきたからじゃあRubyで作ろうぜ」というのはまずありえない
言語は伏せるけどシステム作るから買ってーという営業込みでないとお金にならない

Rubyが社内ツールとしての地位を確立してて、
とっても便利に業務進めてる会社に心当たりがこれまた2つあるが、
じゃあこの便利なRubyでシステム作って売ろうぜという話には間違ってもなってないようだ

まあ適材適所って奴だな
Rubyを使えるということを評価する会社はいい会社だと思うが、Rubyしか使えない人を雇う会社は駄目会社
18デフォルトの名無しさん:2009/07/03(金) 18:26:58
>>16
なるほど、そうですか。残念ですね。

>>17
やっぱり、Java、PHPなんですね。
まだまだ普及というか認められていないんですね。

趣味でしこしこ勉強します。
19デフォルトの名無しさん:2009/07/03(金) 18:28:17
>>18
認めるというか、Rubyにする必要性がないといった感じ
20デフォルトの名無しさん:2009/07/03(金) 18:43:24
Webサービスを作って、ベンチャー起業で金稼ぐのならRubyでも行けるかもしれないが
そもそも日本でベンチャーを興すのは難しいらしいしな
21デフォルトの名無しさん:2009/07/03(金) 18:55:04
>>19
それだと今後も期待薄ですね。
>>20
限られた人らのツールになりそう。

22デフォルトの名無しさん:2009/07/03(金) 22:01:18
>>9
>remove_instance_variable
ありがとうございます。これってprivateメソッドだったんですね。
Object.new.methods.grep(/instance/) で探してたので、見つけられませんでした。
精進します。
23デフォルトの名無しさん:2009/07/03(金) 22:21:11
とりあえず、rubyの遅さとメモリ量の食い方で、自分のサーバーで適当に
遊んでるくらいしか使ってないなー。

あっ、後初期設定だるいかなー
apacheにfast cgi入れてうんたらかんたらは面倒〜
24デフォルトの名無しさん:2009/07/03(金) 22:45:14
だれか
RAA - net-yjwsを持ってない?もしくは配布している所知らない?
http://raa.ruby-lang.org/project/net-yjws/
のファイル配布先であるmoonwolfのサーバが死んでるみたいで手に入らない.
インターネットアーカイブで引っこ抜けるかなと思ったけどそっちでもダメでした.
25デフォルトの名無しさん:2009/07/03(金) 23:48:07
下にある 0.0.20060523.tar.gz のリンクはruby-lang.orgに
置かれている実tar玉で、生きているようだ。
とりあえずそれで凌げるかどうか試してみては?
2624:2009/07/04(土) 01:06:42
>>25
そっちもブラウザでやってみたんですけどFirefoxでは
内容符号化 (Content-Encoding) に問題があります
IEとChromeではつながらず。
UnixからwgetではDLできたけど展開できませんでした
27デフォルトの名無しさん:2009/07/04(土) 01:37:19
リンクは...tar.gzになってるけど中身はHTMLみたい
28デフォルトの名無しさん:2009/07/04(土) 12:42:27
質問があります
$stdoutでファイルを指定し、そこに結果を入れるようにしたのですが、
できたファイルを開くと、結果の頭部分しか入っておらず、困っています
エラーはでていませんし、標準出力の場合や、リダイレクトをした場合は結果の全てがきちんと出力されています
プログラムは以下です

sv = STDOUT.dup
$stdout = File.open("ファイル名", "w")
結果を出力
$stdout = sv

わかる方いましたら教えていただけないでしょうか
OSはLinuxでRubyのバージョンは1.8.5です
29デフォルトの名無しさん:2009/07/04(土) 12:48:04
flushしてみたら?
30デフォルトの名無しさん:2009/07/04(土) 12:52:48
・ ファイルに出力するよモードになったときはファイルに出力
・ ファイルに出力するよモードじゃないときは標準出力に出力
・ これを $stdout への代入だけで切り替えたい

という処理をしたいと推測

いちいち>>29するのはコードが面倒になると思うので、
sync=true したファイルIOオブジェクトを $stdout に指定しろ
31デフォルトの名無しさん:2009/07/04(土) 12:55:32
>>28
本筋とは関係ないけど、たぶんそれSTDOUTをdupする必要はないな

$stdout = STDOUT

でおk
32デフォルトの名無しさん:2009/07/04(土) 12:59:17
元に戻すならsv = $stdoutのほうがいいような
まあどちらにしてもdupは要らんね
33デフォルトの名無しさん:2009/07/04(土) 13:07:04
>>29
やってみましたが、結果は同じでした・・

>>30
下手な質問で申し訳ありません;
>・ ファイルに出力するよモードになったときはファイルに出力
>・ ファイルに出力するよモードじゃないときは標準出力に出力
>・ これを $stdout への代入だけで切り替えたい
で合っています

が、やはりできませんでした
すいません・・

>>31
>>32
わかりました
やり直してみます

みなさんありがとうございます
34デフォルトの名無しさん:2009/07/04(土) 13:29:26
f = File.open("ファイル名", "w")
f.sync = true
$stdout = f

これでなんとかなんね?
35デフォルトの名無しさん:2009/07/04(土) 13:42:35
>>34
できませんね…
自分がLinux初心者のため、出来たファイルを開く際、文字コードに関する不具合(文字化けとか)によって
中身がおかしいのかもしれないです
別の方法でやってみますね
助けてくださってありがとうございました
36デフォルトの名無しさん:2009/07/04(土) 13:49:26
よくわからんけど、グローバルな$stdoutに代入していいのかにょ?
37デフォルトの名無しさん:2009/07/04(土) 13:51:54
代入できるように定数とグローバルの両方が存在してる
38デフォルトの名無しさん:2009/07/04(土) 13:53:38
>>37
おk把握
39デフォルトの名無しさん:2009/07/04(土) 15:54:40
たのしいRubyを読んでいます。
クラスとモジュールの違いがよく理解きないです。
解りやすく教えてほしいです。
40デフォルトの名無しさん:2009/07/04(土) 16:01:27
違う本よめ
41デフォルトの名無しさん:2009/07/04(土) 16:05:53
クラス

  普段使うもの
  処理を分類したもの(メソッド)を起動するオブジェクトの生成器
  基本的にはこれだけで生きていける

モジュール

  普段使わない
  ガチ初心者のうちは自分から作らなくてもいいというかむしろ忘れろ
  initialize できない(そもそも作れない)
  クラスAとクラスBに共通メソッド群Mを持たせたいという場合、Mをモジュールにすると楽
  クラスMを作って継承しても用が済むことがほとんどだが、モジュールにしたほうが本当はいい
42デフォルトの名無しさん:2009/07/04(土) 16:07:53
クラスはモジュールの一種

つまりクラスはモジュールとしての機能を全て持っていて
その上で、特別にインスタンス化することができる
具体的には、あのnewってのができる
43デフォルトの名無しさん:2009/07/04(土) 16:09:21
必ず親があるのがクラス(親を指定しなければObject)、親のないのがモジュール。
継承して使うのがクラス、includeして使うのがモジュール。
Classクラスのインスタンスなのがクラス、Moduleクラスのインスタンスなのがモジュール。
ModuleはClassのスーパークラス。
44デフォルトの名無しさん:2009/07/04(土) 16:18:15
初心者スレ的には>>41に一票

まーあれだ、半年くらいダラダラ使ってればある日突然わかるからあんま心配すんな
日常的には「よくわからんけど○○らしい」程度の理解で充分
45デフォルトの名無しさん:2009/07/04(土) 17:02:41
>>28
同じようなことしてるけど、

#最初
$stdout=File.open("filename""w")
出力
#最後
$stdout=STDOUT

ってなってた。
46デフォルトの名無しさん:2009/07/04(土) 17:35:52
ある日突然オブジェクト脳が閃く感じか。
47デフォルトの名無しさん:2009/07/04(土) 18:42:42
すべてはClassクラスのインスタンスということで良いのでしょうか?
Ruby1.9.1では、BasicObject、Object、Class、Moduleもすべて。
48デフォルトの名無しさん:2009/07/04(土) 19:01:08
…あんまそんなこと気にしないほうがええぞ
49デフォルトの名無しさん:2009/07/04(土) 19:17:11
>>48に同意しつつも答えとく

>>47
>すべてはClassクラスのインスタンス
とりあえず
class Foo; end
は暗黙的にObjectを継承するし
obj = Foo.new
のobjはObjectインスタンスの性質も多く含むけど(というかこの場合そのまんま)
あくまでもobjはFooのインスタンスであってObjectのインスタンスとは呼ばない
という前置きをした上で

全てのクラスそのものがClassインスタンスっていうのは正しい
Object.new.class #=> Object
Object.class #=> Class
「インスタンスを生成する役割を持つもの」がClassクラスのインスタンスであり
Rubyではそれを「クラス」と呼ぶ

でもそれによって生成されたインスタンスは「クラス」ではない
もちろんClassのインスタンスという特例は除く
50デフォルトの名無しさん:2009/07/04(土) 19:39:58
>>49
Rubyではすべてがオブジェクトであるという文言が
気になった次第です。

>>48
Classクラスのインスタンスはクラスオブジェクト(Object、Fooなど)
ということになるんですね。

クラス(Class)のインスタンスがクラスオブジェクト(Foo)で、
クラスオブジェクトFooもまたインスタンスを生成してと。。

やはり必要時以外は考えないようにします。
5139:2009/07/04(土) 22:06:38
みなさん、ありがとうございました。
けっこう、すっきりしました。
52デフォルトの名無しさん:2009/07/04(土) 23:11:56
その辺のぼやーんとした認識に直視せざるを得なくなる本が
プログラミング言語Ruby
凄い濃い本だが確かに初心者にはお勧め出来ない
53デフォルトの名無しさん:2009/07/04(土) 23:38:46
まああれは
どの言語にも一冊はあるような「しっかりした本」だから・・・・・・
細かい挙動を確かめたくなった時に、手にとればいい
54デフォルトの名無しさん:2009/07/05(日) 12:18:05
class Widget
def initialize(x, y)
@x = x
@y = y
end
end

インスタンス変数に @x = x と書くのと self.x = x は同じ意味ですか?
55デフォルトの名無しさん:2009/07/05(日) 12:26:40
この場合のメソッド定義内で書く self.x = は インスタンスメソッド Widget#x= を起動する
インスタンスメソッド Widget#x= の内部でインスタンス変数 @x にアクセスしてるかどうかは x= の定義による
56デフォルトの名無しさん:2009/07/05(日) 12:29:15
おそらく、自メソッドの引数 x と被るインスタンスメソッド x を起動したいんだが、
そのまま x とだけ書くと引数の変数 x にアクセスしてしまうので
それを避けるために明示的にメソッド x を指示したいのだろう
57デフォルトの名無しさん:2009/07/05(日) 12:39:56
class C
def initialize(x)
puts "x は #{x} です"
puts "self.x は #{self.x} です"
end
def x
return "メソッド"
end
end

C.new('引数')

結果

x は 引数 です
self.x は メソッド です
58デフォルトの名無しさん:2009/07/05(日) 12:44:38
>>55
>>56
レスありがとうございます。

セッター(x=、attr_writer、attr_accessor) を明示的に定義しなければ、self.x は

def x=(x)
@x = x
end

が実行されたのと等価なので、結果は同じということですよね。
59デフォルトの名無しさん:2009/07/05(日) 12:49:26
>>57
レスありがとうございます。

僕はゲッター、セッター

hoge = self.x
self.x = poge

がメソッドだというのを忘れがちです。
6058:2009/07/05(日) 12:51:43
>>58
セッター(x=、attr_writer、attr_accessor) を明示的に定義しなければ

これはウソでした。

セッターattr_writer、attr_accessor は必要です。
61デフォルトの名無しさん:2009/07/05(日) 13:19:27
他の言語にあるセッターやゲッターというものはRubyには存在しない
あれはただの値を返すメソッドで、attr* はメソッド定義を肩代わりする略記に過ぎない

module AttrReader
 def attr_reader(arr)
  arr.each do |method_name|
   eval("def #{method_name}
        return @#{method_name}
       end")
  end
 end
end

class C
 include AttrReader
 attr_reader([:x])
end



class C
 attr_reader :x
end

はリクツ上おおむね同じ動作をする
attr* を使う動作上のメリットというのは何もない
メソッド定義書くのがちょっと短縮されるというだけだったりする
62デフォルトの名無しさん:2009/07/05(日) 13:40:03
>>61
なるほど。
だからreader、writerと呼ばれるんですかね。
63デフォルトの名無しさん:2009/07/05(日) 14:36:28
Ruby作者ってしゃべりかたが変わっていないか?
なにか障害をもっているの?
64デフォルトの名無しさん:2009/07/05(日) 14:38:34
早口なだけじゃね?

俺もリアル世界では早口って言われる。
相手が聞き取りやすいようにゆっくり話すように心がけているが ...orz
65デフォルトの名無しさん:2009/07/05(日) 14:41:45
>>63
matzのことなら、最低限一般水準程度には普通に、また俺的にはとても知性的にかつ
フレンドリーに喋ったり発信しているように見受けられる
まあコミュニケーションには受け手の問題もあるのは知ってるので、>>63の見解も
頭から否定する気はないが
66デフォルトの名無しさん:2009/07/05(日) 14:43:16
誰だったかが言うには
「頭の回転が速すぎて口が追いついてない」
67デフォルトの名無しさん:2009/07/05(日) 14:48:42
どうしてIBMとか大企業に就職しなかったの?
68デフォルトの名無しさん:2009/07/05(日) 14:49:37
隔離スレでやれ
69デフォルトの名無しさん:2009/07/05(日) 14:52:51
70デフォルトの名無しさん:2009/07/05(日) 14:53:20
>>67
飼い慣らされると痛い目に遭うから、だと思う。
71デフォルトの名無しさん:2009/07/05(日) 15:08:55
>>67
在学中に有名になってしまって、就職する必要がなくなった。
72デフォルトの名無しさん:2009/07/05(日) 16:48:57
>>71
??
chainmail?
73デフォルトの名無しさん:2009/07/05(日) 19:32:27
単に入社試験で落とされたとかだろ。
74デフォルトの名無しさん:2009/07/05(日) 19:34:54
クリエイターとして生きることができた人に「どうして就職しなかったんですか」というのは単なる愚問だ
就職しなくても生きられたから就職しなかったというだけに過ぎない
75デフォルトの名無しさん:2009/07/05(日) 20:40:04
なんか特定の条件のときに特定の TestCase クラスのユニットテストを実行しないという芸当は可能ですか
76デフォルトの名無しさん:2009/07/05(日) 20:43:40
test_ で始まるメソッドを undef すればいいんじゃね
77デフォルトの名無しさん:2009/07/05(日) 21:30:21
既存のクラスのメソッド定義を、include のようなものであとから書き換えることはできますか?
対象となるクラスは既に他のクラスを継承してるので、追加メソッド群をクラスにして継承してもらうことはできません。
78デフォルトの名無しさん:2009/07/05(日) 21:42:39
該当クラスのオブジェクトが生成されるより前に、
「該当クラス定義を再オープンしてメソッド定義を書き換える」というeval系の何かを適当に実行
79デフォルトの名無しさん:2009/07/05(日) 21:55:03
>>77
普通にdefするだけじゃだめなの?

class A < S
end

class A
 def extra_method
 end
end

もしくは、単にincludeするとか
80デフォルトの名無しさん:2009/07/05(日) 22:06:15
>>79
includeでクラスのメソッド定義を上書きできるとは初耳だな
81デフォルトの名無しさん:2009/07/06(月) 01:01:03
>>80
superclassよりは優先されるから一応は出来る
自身のメソッド定義は覆せないけどね

「既存のクラス」の名前を決め打ちで利用されてるのではなければ
もう一度継承して(「既存のクラス」をsuperclassにして)からincludeすればいい

決め打ちされてるなら・・・>>79の方法になるんじゃないかなぁ

とてもお勧めできない方法
class Foo; end
class Bar < Foo; end
Foo = Bar
Foo.new.class #=> Bar
82デフォルトの名無しさん:2009/07/06(月) 01:18:46
>>77の質問の意味がいまいち良くわからないんだよねえ
具体的なコード片とかが無いとどう困ってるのかわからなくて答えにくい
83デフォルトの名無しさん:2009/07/06(月) 01:24:10
まあ全くお勧めしないが
module Hoge
def included(c)
c.class_eval do
alias fuga_original fuga
def fuga; (処理) end
end
end
end
とかやったのをincludeすればいけるかもしれない
84デフォルトの名無しさん:2009/07/06(月) 02:44:40
open-uriに関する質問です。
特定のurlで下記のスクリプトがエラーを出力します。
エラー文: `close': closed stream (IOError)

============= ここから ============
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}

url = 'http://gimpo.2ch.net/bakery/subject.txt' # errorが起きる
url2 = 'http://anchorage.2ch.net/live/subject.txt' # errorが起きない
url3 = 'http://gimpo.2ch.net/salt/subject.txt' # errorが起きる

open(url, header) do |io|
 Zlib::GzipReader.wrap(io) do |gz|
  puts gz.read # urlの中身が出力されたあとにerrorが起きる
 end
end
============= ここまで ============

open-uri, zlib, 2chの鯖のどこに問題があるのでしょうか?
openのブロック付き呼び出しの中でさらに別のIOオブジェクトをブロック付きで呼び出していることが原因なのかと考えたのですが、
特定のurlでのみ起きる理由が分かりません・・・。
85デフォルトの名無しさん:2009/07/06(月) 02:46:08
ちなみに↓のスクリプトではエラーが起きません。

============= ここから ============
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}

url = 'http://gimpo.2ch.net/bakery/subject.txt' # errorが起きる
url2 = 'http://anchorage.2ch.net/live/subject.txt' # errorが起きない
url3 = 'http://gimpo.2ch.net/salt/subject.txt' # errorが起きる

open(url, header) do |io|
 Zlib::GzipReader.wrap(io).readlines.each do |line|
  puts line
 end
end
============= ここまで ============
86デフォルトの名無しさん:2009/07/06(月) 03:27:42
>>84
Zlib::GzipReader.wrapが自動的にioをcloseし
さらにopenのブロック実行後にioをcloseしようとするから
IOErrorが出るのは正しい動作
url2でエラーが出ない方がおかしいんだけど何故かはわからん

要するにcloseが二回実行されないようにすればいいんだが
それはリファレンスマニュアルでZlib::GzipReader.wrapの所を嫁
87デフォルトの名無しさん:2009/07/06(月) 04:02:24
>86
レスありがとうございます。
解決策のほうも分かりました。
ところで>85の例でエラーが出なかった理由は
Zlib::GzipReader.wrapがcloseされていなかったからioもcloseされず、ioがopenによって正しくcloseされたからという理解でよろしいでしょうか?
IOオブジェクトを用いる場合には

file = IO.open(foo)
begin
<処理>
ensure
file.close
end

IO.open(foo) do |io|
<処理>
end

のどちらかで記述するというのが常識ですが、
IO.open(foo).read のような使い方をするとそのIOオブジェクトはcloseすることができなくなってしまうのでしょうか?

重ね重ねの質問ですが、長らくの疑問で調べても分からなかったのでご回答いただけるとありがたいです。
88デフォルトの名無しさん:2009/07/06(月) 04:52:41
> ところで>85の例でエラーが出なかった理由は ...
あってる

> IO.open(foo).read ...
これではIOインスタンスへの参照がないからcloseしようがない、開きっぱなし
data = (io = IO.open(foo)).read とすればio.close出来るけど普通はIO.read(foo)とするな
ほっとけばGCが何とかしてくれると聞いたような違ったような?
89デフォルトの名無しさん:2009/07/06(月) 05:08:25


`close': closed stream (IOError) は、おーざっぱには
「閉じようと思ったIOオブジェクトが何者かによって既に閉じられてました姉さん事件です」
エラーだ

Zlib の close は引数の IO オブジェクトごと close する
通常は超親切機能なんだが、引数の IO オブジェクトがブロックつきだった場合、
IO 側のメソッドのブロックの ensure で行われる io.close で「既に閉じられてた」エラーが起こる
Zlib のブロックの最後で明示的に Zlib::GzipFile#finish を呼ぶと、厄介な Zlib::GzipFile#close は起動されない

…というようなことが、Zlib::GzipReader の GzipReader.wrap のマニュアルのとこに書いてあるぞ
ttp://www.ruby-lang.org/ja/man/html/Zlib_GzipReader.html#GzipReader.2ewrap

>>84
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}

url = 'http://gimpo.2ch.net/bakery/subject.txt'
url2 = 'http://anchorage.2ch.net/live/subject.txt'
url3 = 'http://gimpo.2ch.net/salt/subject.txt'

[url,url2,url3].each do |url|
open(url, header) do |io|
Zlib::GzipReader.wrap(io) do |gz|
p gz.read
gz.finish # ここ!
end
end
end
90デフォルトの名無しさん:2009/07/06(月) 09:30:36
UTF-8 文字列に対する NKF.guess がだいたいいい感じに動作する文字数って何文字くらい?

irb> NKF.guess("ねこだいす")
5
irb> NKF.guess("ねこだいすき")
6
irb> NKF.guess("ねこだいすきっ")
5

とかいう結果でちょっとぐんにょりしてるので
91デフォルトの名無しさん:2009/07/06(月) 09:36:09
これは非常に有名な話だが、読点を入れると NKF.guess の誤認識の確率が素晴らしく減る

irb> NKF.guess("ねこ、だ")
6
irb> NKF.guess("ねこ、だい")
6
irb> NKF.guess("ねこ、だいす")
6
irb> NKF.guess("ねこ、だいすき")
6
irb> NKF.guess("ねこ、だいすきっ")
6
irb> NKF.guess("、")
6

ということで、読点入れた文章使え
92デフォルトの名無しさん:2009/07/06(月) 09:37:46
nkfにバグのあるバージョンのrubyを使ってないか?
最近ruby-talkでそんな話題があった気がするが。
9392:2009/07/06(月) 09:39:16
1.8.7 patchlevel 160 ではこんな感じ
irb(main):002:0> NKF.guess("ねこだいす")
=> 6
irb(main):003:0> NKF.guess("ねこだいすき")
=> 6
irb(main):004:0> NKF.guess("ねこだいすきっ")
=> 6
94デフォルトの名無しさん:2009/07/06(月) 09:55:04
文字列を自由に設定できるのなら読点入れるのが間違いないとは思う
95デフォルトの名無しさん:2009/07/06(月) 09:58:22
それならそもそもguessする必要ないだろ
96デフォルトの名無しさん:2009/07/06(月) 10:19:41
字句解析には、まともに使えないってことだな。
97デフォルトの名無しさん:2009/07/06(月) 10:28:41
文字コード推定と字句解析の関連をkwsk
98デフォルトの名無しさん:2009/07/06(月) 10:52:17
Mule や Emacs が、読み込んだファイルの文字コードを自動判定するのは
ご存じだと思うが、Meadow 2 や Meadow 3は、 UTF-8 のファイルの文字コードを、けっこう間違える。

一方、秀丸はほぼ絶対間違えない。

これらの違いは何だろうかということと、同じような実装をNKF でもできないのかな?と思った。
99デフォルトの名無しさん:2009/07/06(月) 10:55:06
ほうほう、つまり CP932 と UTF-8 以外の優先度を下げろと
10098:2009/07/06(月) 11:05:55
いや、そういうつもりはない、というか秀丸とかは、内部でそういう実装になっていたのか。
知らなかったよ
101デフォルトの名無しさん:2009/07/06(月) 11:12:29
結果的に正しく判断される確率が高い方がいい
102デフォルトの名無しさん:2009/07/06(月) 12:04:51
そのためには文脈情報が要るんだよ

HTML だったら charset 読んでみるとか
句読点が改行文字の直前にあったら日本語だと思ってみるとか
東欧辞書にマッチするバイト列が頻出したら Latin-2 だと思ってみるとか

Iconv が guess に該当する機能を一切提供してないのは手抜きじゃなくて必然
多エンコーディングに対応すればするほど指数関数的に推測のコストは上がる

日本語だけ取っても Shift_JIS と CP932 と EUC-JP と EUC-JP-MS の4つを区別するのは至難
っていうか規格をちょっとずつ混ぜるなめんどくさいから
あとケータイ絵文字入り文字列をキャリア情報なし端末情報なしの素で送ってくる奴は即死刑で
103デフォルトの名無しさん:2009/07/06(月) 12:33:21
次の質問の人どうぞ
104デフォルトの名無しさん:2009/07/06(月) 15:37:50
/usr/local/lib/ruby1.9/1.9.1/minitest/unit.rb:359:in `puke':
   incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)

イライラ
105デフォルトの名無しさん:2009/07/06(月) 15:54:27
rrseをUTF8で使うにはどうすればいいですか?
106デフォルトの名無しさん:2009/07/06(月) 15:56:26
>>104
Ruby1.9向けテストで「なんかどっか書き間違ってる」時に出るやつだな
具体的にどのへんの行で詰まってるとかヒントぜんぜんなし
かろうじて -v でテストのメソッド名が出るくらい
107デフォルトの名無しさん:2009/07/06(月) 15:58:00
>>105
rdoc のファイルと同じエンコーディングを -K とかで指定すればいいんじゃね
108デフォルトの名無しさん:2009/07/06(月) 16:09:03
>89
詳細な解説ありがとうございます。
ためになりました。

>88
>普通はIO.read(foo)とするな
IOオブジェクトを簡単に読み取るにはこの方法を使えばいいんですね。
しかしopen-uriで拡張されたopenには同等のメソッドがありませんね。
URI.parse(foo)がIO.read(foo)と同等のことができますが、
URI.parseはHTTPリクエストのオプションをつけて動かすことができないんですよね。
URI.parse(uri, 'hogehoge' => 'foobar')のように。

アドバイスをいただき>84での問題は解決したのですが次の問題が発生してしまいました。。
109デフォルトの名無しさん:2009/07/06(月) 16:09:48
下記のスクリプトがエラーを吐きます。
エラー文: `initialize': buffer error (Zlib::BufError)

困ったことに、通ったり通らなかったりします。
原因はたぶんですが2chのサーバが出力しているgzip圧縮したsubject.txtのほうだと思います。
板内のスレいずれかにカキコミがあればsubject.txtは書き換わるため、通る場合と通らない場合があるのだと予想しています。
しかしエラー文の意味がよく分からず、どのように回避すればよいのかが分かりません。
ちなみに拾ってきたgzip化subject.txtファイルをHDDに書き込んでアーカイバで開くと正しく読み取れています。

============= ここから ============
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}

url = 'http://gimpo.2ch.net/bakery/subject.txt' # errorが一度も起きていない
url2 = 'http://gimpo.2ch.net/kagu/subject.txt' # errorが起きたり起こらなかったりする

open(url, header) do |io|
 Zlib::GzipReader.wrap(io) do |gz|
  puts gz.read # urlの中身が出力されたあとにerrorが起きる
 end
end
============= ここまで ============
110デフォルトの名無しさん:2009/07/06(月) 16:19:50
>>109
原因は一発でわかったが、そろそろあんま話したくない
HTTPの知識のない状態でなに作る気なん?
111デフォルトの名無しさん:2009/07/06(月) 16:23:31
別にいいじゃん。初心者スレなんだし。
答えるのいやなら他行けば?
112デフォルトの名無しさん:2009/07/06(月) 16:25:29
libwww-perlの轍踏む気にはならんね
113デフォルトの名無しさん:2009/07/06(月) 16:29:29
まあサイトや回線にどんだけ負荷かけて裁判起こされようが知ったこっちゃないが、
このへんがわかんないのはそもそも辛いと思うんだがどう
open-uri で open してテキストを read する以外の事をしようと思うなら、別途勉強がいると思う
114デフォルトの名無しさん:2009/07/06(月) 16:36:36
2chにアクセスするアプリケーションは自力で調べて作ってもらうというのが一応不文律だったりする
115デフォルトの名無しさん:2009/07/06(月) 16:43:06
>>109
open-uriは便利に見えるけどハマると厄介、net/httpの使い方をおぼえろ
res = Net::HTTP.get_response(URI(url))
txt = res.body
if res['content-encoding'] =~ /gzip/
 txt = Zlib::GzipReader.wrap(StringIO.new(txt)) {|gz| gz.read }
end
puts txt

>>110
原因を教えてもらえないだろうか?
うちの環境では例外が発生しないので問題がわからない
116デフォルトの名無しさん:2009/07/06(月) 16:43:45
content-encoding見てないのはマズいと思うけど
>>109はHTTPレベルの問題じゃないような
117デフォルトの名無しさん:2009/07/06(月) 16:45:14
付け加えておくとgzじゃないものを食わせた時は
Zlib::GzipFile::Error: not in gzip format
118デフォルトの名無しさん:2009/07/06(月) 16:47:52
もなじら名乗ってない時点で問題外
119デフォルトの名無しさん:2009/07/06(月) 16:49:01
>109のスクリプトを書き間違えていました。
============= ここから ============
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}

url = 'http://gimpo.2ch.net/bakery/subject.txt' # errorが一度も起きていない
url2 = 'http://gimpo.2ch.net/kagu/subject.txt' # errorが起きたり起こらなかったりする

open(url, header) do |io|
 Zlib::GzipReader.wrap(io) do |gz|
  puts gz.read # urlの中身が出力されたあとにerrorが起きる
  gz.finish #<= 書き忘れ
 end
end
============= ここまで ============

>110
2chのスレのdatを収集するプログラムです。
たまに気がつくとスレが1001になってdat落ちしてしまって、最後に開いた地点までしか読めなくなるのが悲しいので、
過去に開いたことがあるスレを定期的に拾いなおしてくれるプログラムを作りたいと思いまして。
プログラム自体は完成していて意図した通りに動くのですが、
転送量を少しでも削減したくてdatだけではなくsubject.txtを拾うときにgzip化しようと欲を出したらうまくいかなくなりました。
120デフォルトの名無しさん:2009/07/06(月) 16:54:41
スレ更新をせず書き込んでしまいました。

>113
一応、DLする度にsleep 1.0 を入れています。
これでは不十分でしょうか?

>114
それは大変失礼しました。
今後は自力解決したいと思います。

>115
datの取得ではnet/httpを使っています。
一つのdomainから複数のファイルを拾うときにはnet/http, 1つのファイルを拾うだけならopen-uriというふうに使い分けていました。
121115:2009/07/06(月) 17:17:01
header渡してなかった
txt = URI(url).read(header)
if txt.content_encoding.include?('gzip')
 :
122デフォルトの名無しさん:2009/07/07(火) 10:40:42
すいません。
Ruby 1.9.1を使用しているのですが、クラスを生成する時にinitializeメソッドで初期化を行うと思うのですが、ファイルの内容で初期化をしたい時に、そのファイルが存在しない場合、クラスの生成をしないようにするにはどうすればいいのでしょうか?
やはり、newメソッドをオーバーライドするしかないのでしょうか?
123デフォルトの名無しさん:2009/07/07(火) 10:43:11
>>122
日本語でおk
124デフォルトの名無しさん:2009/07/07(火) 10:48:27
class Hoge
 def initialize
  YAML.load_file('config.yaml').each do |k, v|
   eval("@#{k} = #{v}")
  end
  p "Hoge initialized."
 end
 def self.make
  File.exist?('config.yaml') ? self.new : nil
 end
end

で、Hoge.make を Hoge.new の代わりに使うようにする
125デフォルトの名無しさん:2009/07/07(火) 11:01:38
>>124

ありがとうございます。
126デフォルトの名無しさん:2009/07/07(火) 11:04:09
>>124
エスパー乙
エスパー内容から逆に元の質問を読解すると、こうかな。

 インスタンスを生成する際、initializeメソッドが実行されるが、
 特定の条件によってインスタンスを生成せず、かつ、例外を
 送出せずにnilを返したい場合、どのようにすればよいか?

もちろん、一般的には例外発生でいいと思うんだが、それじゃ
なんかまずい? >>122
127デフォルトの名無しさん:2009/07/07(火) 11:12:49
>>126

分かりづらい質問の書き方ですいませんでした。
例外発生でも問題ないと思いますが、124さんの回答がしっくりくるので、124さんの回答を参考にさせていただきたいと思います。
128デフォルトの名無しさん:2009/07/07(火) 13:42:40
Rubyが他言語に比べて最も優れている機能は何?
129デフォルトの名無しさん:2009/07/07(火) 14:07:44
極力オブジェクト指向なスクリプト言語であることそのもの

なにかRuby固有の機能というのは存在しない
スクリプト言語としてさまざまな現代的機能がまとまった形になっていることが、強いてあげれば最大の機能
130デフォルトの名無しさん:2009/07/07(火) 14:33:06
意識せずに使えるクロージャ
他は似たりよったり
131デフォルトの名無しさん:2009/07/07(火) 16:06:19
if が値返すとこ
132デフォルトの名無しさん:2009/07/07(火) 16:45:05
残念
133デフォルトの名無しさん:2009/07/07(火) 16:47:51
>>128
信者のウザさ
134デフォルトの名無しさん:2009/07/07(火) 16:49:09
128じゃないけど、Smalltalkと比べた時の強み・弱みってあるかな。
この比較にけっこう興味ある。
135デフォルトの名無しさん:2009/07/07(火) 17:08:49
なにその「カレーとスパゲティどっちがおいしい?」みたいな質問
136デフォルトの名無しさん:2009/07/07(火) 17:15:44
Smalltalkと比べると、強みは普通の言語であること、弱みも普通の言語であること、ということになりそうだ。
137デフォルトの名無しさん:2009/07/07(火) 17:16:59
てゆーか Smalltalk との比較行為が妥当な言語ってそれだけで価値があると思うんだが
138デフォルトの名無しさん:2009/07/07(火) 17:17:49
Perlと比較してどうなのかね
139デフォルトの名無しさん:2009/07/07(火) 17:18:43
>>138
強み:日本語環境の充実
弱み:ライブラリの少なさ
    Rubyにするメリットがない
140デフォルトの名無しさん:2009/07/07(火) 17:23:28
>>134
弱い強いは立ち位置で真逆になるから、あくまで「違い」としてなら、
UNIX的であるか、そうでないか(あえて言えばSmalltalk的か)というのは中でも目立つ違いかもね。
卑近なところでは、OS としての機能を持つか(Smalltalk)、持たないか(Ruby)とか、
IDEや開発ツールを含むか(Smalltalk)、あくまで言語処理系の枠内にとどまるか(Ruby)とか。

あと、ちょっとその Smalltalk 的(ダイナブック的。アラン・ケイ的思想)なこととも関連するけれど、
Ruby処理系は一般的に TATWD = Turtles all the way down ではないこと。加えて、
処理系を含めたプロダクトが「動かしながら変えてゆくこと」を想定してないこと(UNIX的。C言語的)は
Smalltalkを選ぶかRubyを選ぶかの判断基準になるかも。端的には言語使用を利用者が自由にいじれるか的なところ。

これらと遅いことを除けば、RubyにあってSmalltalkに(Smalltalk的視点から)劣るところはほとんどないのでは?
逆にそういうふう(つまり、UNIX的な立ち位置ではSmalltalkに負けないよう)に意識してRubyは作られているはず。
141デフォルトの名無しさん:2009/07/07(火) 17:52:16
>>139がRuby使ってないのはわかった
142デフォルトの名無しさん:2009/07/07(火) 18:04:36
日常で特段困らんレベルだとは思うが、
日本語関連で Perl よりなにか抜きん出てる面があるとはあんま思えんな
143デフォルトの名無しさん:2009/07/07(火) 18:07:02
やっぱ仕事のことを考えると、Perl覚えたほうがお得ということか?
144デフォルトの名無しさん:2009/07/07(火) 18:15:07
>>143
お前は英語しゃべれたほうがお得だろうかとかわざわざ考えるのか?
145デフォルトの名無しさん:2009/07/07(火) 18:18:41
普通はどっちかしか出来ない奴よりは両方出来る奴をとるな
146デフォルトの名無しさん:2009/07/07(火) 18:21:59
一つ身につけるだけでイッパイイッパイとかどんだけー。
147デフォルトの名無しさん:2009/07/07(火) 18:25:13
どっかでも書いたけど、Rubyだけしかできない奴は業務上はゴミ以下のクズ

ただし、何か他の言語が使えてなおかつRubyもできるという場合は、
Ruby以外の言語を使えると申告した場合よりもいい会社に目をかけてもらえる確率が結構上がると思われる
148デフォルトの名無しさん:2009/07/07(火) 18:27:06
Rubyしかできないって、プログラマですらないじゃん。
一つのメソッドに縛られない、より一般的な方法を知らない人は世界が狭いのぅ。
149デフォルトの名無しさん:2009/07/07(火) 18:31:38
JavaやPHPはどうせ業務べったりだろうし就職してからその会社の様式で習えばいいやと思って
RubyとPythonとSchemeをそれなりに勉強してたら
そのままプログラマとして一度も就職できなかったという選択の要領の悪い俺様が通りますよ

まあ派遣で倉庫仕分けじゃどっちみち意味ねーなwwwww
150デフォルトの名無しさん:2009/07/07(火) 18:32:47
緑の人のレスは面白いなあ
151デフォルトの名無しさん:2009/07/07(火) 20:45:04
日本語環境が充実してると実感した事は無いな。
javaみたいに環境で出力合わせてくれる訳でもないし。
152デフォルトの名無しさん:2009/07/07(火) 21:43:16
>>149
あんたは半年後の俺
153デフォルトの名無しさん:2009/07/07(火) 21:51:47
就職を有利にしたいのに日本でRubyとかPythonはないだろ・・・
おとなしくjavaかC#でもやっときゃいいのに
154デフォルトの名無しさん:2009/07/07(火) 22:03:11
このスレ、あんまり社会人プログラマいないのか?
155デフォルトの名無しさん:2009/07/07(火) 22:06:51
学生です ><
156デフォルトの名無しさん:2009/07/07(火) 23:35:32
COBOLプログラマです><
157デフォルトの名無しさん:2009/07/08(水) 05:42:05
>>154
社会人プログラマやってるなら初心者スレなんか要領よく速攻で通過して欲しいもんだが
158デフォルトの名無しさん:2009/07/08(水) 05:53:14
いっこだけ

>>153
業務の役には全く立たないんで、趣味でCだのJavaだのC#だのPHPだのやり込んでも無駄
趣味で2年やって学んだことは、会社では1ヶ月で学べてお釣りがくる

ただ、プログラミングに挫折しない性質を持っているという事前証明にはなるが、そんなの上記言語でなくても充分だ
159デフォルトの名無しさん:2009/07/08(水) 06:12:20
>>158
無駄ではないだろ。
会社にも糞グラマはいるからな。
160デフォルトの名無しさん:2009/07/08(水) 16:47:19
派遣屋が売り込みやすい言語のスキル磨いてもなあ。
161デフォルトの名無しさん:2009/07/08(水) 16:56:32
仕事で Java, PHP やって
家で Ruby, Python など好きなのやればいいんじゃないの。
162デフォルトの名無しさん:2009/07/08(水) 17:08:44
就職する前の話だろ
163デフォルトの名無しさん:2009/07/08(水) 17:11:22
C Java C# PHP が業務に役立たないとか一体どんな仕事なんだろ
金融系?
164デフォルトの名無しさん:2009/07/08(水) 17:17:37
>>163
「趣味で」という最重要な句をわざわざ外すのはなんで
165デフォルトの名無しさん:2009/07/08(水) 17:33:59
趣味でやってたときのことって50パーセントくらいは単に役に立たなくて
49パーセントくらいの割合で逆に邪魔になるよね
趣味でやってた頃の知識経験が役立ったなんて思ったことねーぞ
166デフォルトの名無しさん:2009/07/08(水) 17:38:24
趣味が何かによる問題
167デフォルトの名無しさん:2009/07/08(水) 17:41:30
>>164
どこが重要なの?
「趣味」を「義務」とか他の語に置き換えても
「業務の役には全く立たないんで、(略)無駄」としか読めない
168デフォルトの名無しさん:2009/07/08(水) 17:46:53
趣味で色々やってたおかげで
どこの職場で何を作っても即戦力になれるよ。
やる内容によるのかもしれない。
169デフォルトの名無しさん:2009/07/08(水) 17:49:12
知ってるだけで、すぐに手を動かせるだけで全然違うよな。
趣味でも楽しんでせっせと色々作ってる人は有利だと思う。
170デフォルトの名無しさん:2009/07/08(水) 18:01:49
言語限定してるし知識としての問題じゃね
Cを趣味で使ってる人はCでの業務に強いかどうかとか

あまり関係ない気がするが
171デフォルトの名無しさん:2009/07/08(水) 18:23:54
趣味が何かによる問題
172デフォルトの名無しさん:2009/07/08(水) 18:38:03
実際にモノを作るやつは役に立つ傾向があるんじゃないだろうか
いじるのが好きなだけというやつは・・・な気がする
173デフォルトの名無しさん:2009/07/08(水) 19:08:21
仕事でプログラムを組むという点に絞れば、趣味でやってる時に覚えたことが7割、その仕事のために新規に覚えたことが3割、って感じだけどなあ。
設計段階で必要な業務知識とかは、そりゃその仕事やらん限り知ることはないわけだけど、設計手法とかはほとんど趣味で学んだことだし。
174デフォルトの名無しさん:2009/07/08(水) 19:52:22
すいません質問させてください。
Floatのインスタンスが1.0のようにFixnumの1と同じだったら1に、1.2のようにFixnumで表せない数値だったら1.2のままにする、みたいなメソッドってありませんでしょうか?
教えていただけると幸いです。
175デフォルトの名無しさん:2009/07/08(水) 20:04:38
>>174
def f(x)
 y = x.to_i
 x == y ? y : x
end
名前思いつかなかった
176デフォルトの名無しさん:2009/07/08(水) 20:17:22
compact/simplifyとか?
ruby facetsあたりに同じ役割のメソッドがあるかもな
177デフォルトの名無しさん:2009/07/08(水) 20:28:09
>>175
その例、Fixnumの範囲なら問題ないが、
むちゃくちゃ桁数が大きくなると誤判定が起きるね。

実用上問題ないだろうからどうでもいいか。
178デフォルトの名無しさん:2009/07/08(水) 20:37:34
>>177
誤差じゃなくて?
179デフォルトの名無しさん:2009/07/09(木) 10:58:30
>>174
Float または Integer を返す、というメソッドは公式メソッドとしてはあんまありえない動作なんで、
ふつーに if で書けふつーに
180デフォルトの名無しさん:2009/07/09(木) 11:07:50
>>178
もちろん誤差で。
誤差があるにも拘らず同一とみなされてInteger化されること自体が問題だよね。
181デフォルトの名無しさん:2009/07/09(木) 11:11:58
ん、まあ、なんだ、
割り算が割り切れたら整数で、割り切れなかったら小数で返して欲しいというようなマルチな要望は時々見る

10 / 2 => 5
10 / 4 => 2.5

これ、標準ではできないんだよね

10 / 2 => 5
10 / 4 => 2

10.quo 2 => 5.0
10.quo 4 => 2.5

どっちか
182デフォルトの名無しさん:2009/07/09(木) 12:03:46
>>180
それはFloatへの理解不足という根本的な問題だと思う
183デフォルトの名無しさん:2009/07/09(木) 13:06:59
>>182
そもそも、型が違うものを比較して「同じだったら」とかいう発言が
出てくる時点で理解が根本的に不足してるのは明らかだけどね。
184デフォルトの名無しさん:2009/07/09(木) 13:32:16
型を変換したいというよりは、表示の都合で出力の際にそういう文字列で出したい、
というのなら要望としてわかる気がする。

文字列処理的な解決方法でも良いのかも。
185デフォルトの名無しさん:2009/07/09(木) 16:00:16
質問、Windows で UTF-8 文字列を標準出力にいきなり出力したとして、簡単に読む方法はある?

require 'open-uri'
puts open("http://www.ruby-lang.org/ja/").read.scan(/<title>(.+?)<\/title>/)

というコードをコピペで実行したとして、
「あっ UTF-8 かじゃあやり直し」という簡便な手段でやり直しはできる?
186デフォルトの名無しさん:2009/07/09(木) 16:04:32
>>185
irb> require 'open-uri'
=> true
irb> puts open("http://www.ruby-lang.org/ja/").read.scan(/<title>(.+?)<\/title>/)
繧ェ繝悶ず繧ァ繧ッ繝域欠蜷代せ繧ッ繝ェ繝励ヨ險隱・Ruby
=> nil
irb> puts open("http://www.ruby-lang.org/ja/").read.scan(/<title>(.+?)<\/title>/).tosjis
NoMethodError: undefined method `tosjis' for #<Array:0x35a0f84>
    from (irb):3
irb> puts open("http://www.ruby-lang.org/ja/").read.scan(/<title>(.+?)<\/title>/).to_s.tosjis
NoMethodError: undefined method `tosjis' for #<String:0x35987e4>
    from (irb):4
irb> require 'kconv'
=> true
irb> puts open("http://www.ruby-lang.org/ja/").read.scan(/<title>(.+?)<\/title>/).to_s.tosjis
オブジェクト指向スクリプト言語 Ruby
=> nil
irb>
187デフォルトの名無しさん:2009/07/09(木) 16:17:24
こんなサイト発見。
イプシロンを使った浮動小数点の同値判定
ttp://d.hatena.ne.jp/tociyuki/20090620/1245503707
これで適当にメソッド作ればいいんじゃね?
188174:2009/07/10(金) 00:05:36
いろいろレスありがとうございます。
うーんやっぱり公式のメソッドはないんですね。
勉強になりました。
189デフォルトの名無しさん:2009/07/11(土) 10:36:11
そもそも別だしね。
実数と虚数を比べるようなものだし。
190デフォルトの名無しさん:2009/07/11(土) 10:38:35
「別」ではない
真に別であるなら変換などできない
一応何らかの規則で変換できてしまう以上、別だと表現するほどのもんでもない
191デフォルトの名無しさん:2009/07/11(土) 15:41:48
Windows環境なのですが、

 ruby -Ku script/server

して文字コード指定しても立ち上がる mongrel 1.1.5のエラーメッセージがSJISになってしまうのですが、
これ何故なんでしょうか?
192デフォルトの名無しさん:2009/07/11(土) 15:42:28
ごめん、Railsスレと間違えた・・・誤爆
193デフォルトの名無しさん:2009/07/11(土) 15:55:09
mongrel詳しくないけど、ruby一般として-Kオプションの値($KCODE)を見て
出力する文字列の文字コードを変えるスクリプトは滅多にない

基本的にはrubyの文字列処理方法へのヒント
http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html#a.24KCODE
194デフォルトの名無しさん:2009/07/11(土) 17:59:04
なんでRubyには固定小数点数が組み込みで無いの?馬鹿なの?死ぬの?
195デフォルトの名無しさん:2009/07/11(土) 18:14:21
まー、そりゃ、浮動小数点をメインに据えたからだろ
浮動小数点がメインだから組み込み、固定小数点はサブだから BigDecimal で擬似的になんとかする

固定小数点数が組み込みで選べる言語ってそう多くないと思うんだけど
196デフォルトの名無しさん:2009/07/11(土) 18:29:13
Cobolくらいじゃない?
197デフォルトの名無しさん:2009/07/11(土) 19:21:23
>>194
この手のネタは本スレでお願いします
http://pc12.2ch.net/test/read.cgi/tech/1246174168/
198デフォルトの名無しさん:2009/07/11(土) 19:39:35
そんな基本的なこともわからんやつを本スレに誘導するな

情報処理試験の本でも紹介しとけ
199デフォルトの名無しさん:2009/07/11(土) 20:10:31
>>195
Common Lispに有理数型があったような
200デフォルトの名無しさん:2009/07/11(土) 20:24:13
固定小数点数というとおよそ10進前提で話すような気もする。
201デフォルトの名無しさん:2009/07/11(土) 21:27:04
逆引きハンドブック買ったですよ
細か〜いとこでハマってたんですが
華麗にスルーできましたよ

これで1.9系をメインで使っていけそうです
いやぁいい本に出合えました
202デフォルトの名無しさん:2009/07/11(土) 23:29:59
>>200
信号処理屋が二進数の固定小数点数で演算するのは良く見るが。
非力なプロセッサでリアルタイム処理するのに。
つーか浮動小数点数なんぞ無かった……
203デフォルトの名無しさん:2009/07/12(日) 00:08:57
>>201
ネットでみれるから買わない
204デフォルトの名無しさん:2009/07/12(日) 00:13:59
>>201
宣伝乙
205デフォルトの名無しさん:2009/07/12(日) 01:36:39
本をほめたら宣伝かよw
まあ今どき業務でもなければ1.8系なんて使ってたのは>>201だけだったかもな
206203:2009/07/12(日) 01:42:26
>>205
宣伝にもなってるだろ?
わかるか?
207デフォルトの名無しさん:2009/07/12(日) 03:29:05
そういえば python スレには
やたら特定の本を勧める香具師がいるな
著者か出版社の自演としか思えん
208デフォルトの名無しさん:2009/07/12(日) 03:40:11
それは断定できないだろうが、
何にせよ粘着されてるのは不幸なことだ
209デフォルトの名無しさん:2009/07/12(日) 04:07:36
201で〜す
2chっぽい素敵なレスに大満足です

ま、本は店頭で手にとって選べるんで
某大作RPG9のような悲劇は起きないから
いいじゃないですか

1.9で文字コード周りでハマってたのが
解決したのですよ
ちょいとコツつかむと一気に先に進める感じ
ほんとRubyは楽しいですわ

あ、ちなみに思いっきり業務で〜す
量が多いだけのシンプルな仕事ですけどね
210デフォルトの名無しさん:2009/07/12(日) 04:23:31
Rubyでデータベース使うときってなに使ってます?postgresql?mysql?sqlite?
多分、何に使うかっていう問題になると思うんですけども。
文字数カウントする位だったらどれ選びます?sqliteが手軽そうかなと思ったんですけど
211デフォルトの名無しさん:2009/07/12(日) 04:25:15
文字数じゃねぇや、単語数だ。
212デフォルトの名無しさん:2009/07/12(日) 04:25:52
hash
213デフォルトの名無しさん:2009/07/12(日) 07:29:36
うむ

あと、複数のスクリプトが「同時」にアクセスする可能性があるのでない限り、永続化は pstore でいい
214デフォルトの名無しさん:2009/07/12(日) 07:37:20
今ならPStoreよりは、YAML(YAML::Store)とかJSONとかの方がオススメ
215デフォルトの名無しさん:2009/07/12(日) 07:47:38
YAMLとかは無駄度がさらに一段階上乗せされてるから苦手だ

テキストファイルとして読む機会がないのにYAMLやJSONベースで保存する意味なんてなくね
割り切ってるPSTOREのほうがまだマシと思う
216デフォルトの名無しさん:2009/07/12(日) 08:09:06
JSONって型指定できたっけ
217デフォルトの名無しさん:2009/07/12(日) 08:11:50
>テキストファイルとして読む機会がないのにYAMLやJSONベースで保存する意味なんてなくね
だってPStoreだとバージョンが古くなったときに読めないし
218デフォルトの名無しさん:2009/07/12(日) 08:15:18
それはRubyが(ry
219217:2009/07/12(日) 08:22:07
付け加えると
デバッグ中にデータファイルの中身を見たくなることが往々にしてあるため
そうした場合に見るのが面倒だという点でも、PStoreはあまりおすすめできない
220デフォルトの名無しさん:2009/07/12(日) 10:40:00
>>217
これは何度でも言うが、Marshal の仕様が変わったのだとしたらそもそも大改修が必要だ
そんなときのために普段便利な PStore を諦めるより、
そのときになって旧 Marchal から新 Marshal へのコンバータ書いたほうがきっと早い
221デフォルトの名無しさん:2009/07/12(日) 11:13:02
ruby/GTKの1.9版はありますか?
レポジトリや公式を見ても見つからないのです
222デフォルトの名無しさん:2009/07/12(日) 13:20:21
PStoreのYAML実装であるYAML::Storeまじおすすめ
yaml/store.rb見て単純さにびっくりしたw
223217:2009/07/12(日) 13:50:16
>>220
>普段便利な PStore
便利も何もYAMLと比べたときに特に便利な点がないよね、って話だよ
それまでにPStoreで蓄積したデータがあるのならともかく、今から新しく使い始める人に
PStoreを勧めるべき理由はほとんどない
(ファイルの小ささやdumpの早さはあるけど、それを気にするぐらいなら別のDBを使うべき)

それと何度でも言うが、Marshal.dumpで出力したデータは
Marshalのバージョンが古いと読み書きできなくなる
http://www.ruby-lang.org/ja/man/html/Marshal.html
224デフォルトの名無しさん:2009/07/12(日) 14:39:28
>>223
>それと何度でも言うが、Marshal.dumpで出力したデータは
>Marshalのバージョンが古いと読み書きできなくなる

これはその通りだけど、それが実際に発生する可能性がどれだけあるのやら。
これを心配するなら、YAMLライブラリの互換性のほうがよっぽど心配。
PStoreのデータが読めなくなったことは過去数年ないけど、YAMLは1.8.3前後で
dumpの仕様が変わって困ったことになった。

まあ、あまり起こりもしないことを大げさに宣伝することはないんじゃない?
225デフォルトの名無しさん:2009/07/12(日) 14:40:45
頭の片隅に入れておくべき事ではあると思う
226デフォルトの名無しさん:2009/07/12(日) 14:46:57
普通にDB使えよ。さすが学生スレ
その考え方じゃ仕事にありつけんぞ
227デフォルトの名無しさん:2009/07/12(日) 14:49:55
だって、標準添付されていないから・・・
228デフォルトの名無しさん:2009/07/12(日) 14:56:32
> それと何度でも言うが、Marshal.dumpで出力したデータは
> Marshalのバージョンが古いと読み書きできなくなる
これってYAMLだって同じじゃねーの

> 普通にDB使えよ。
そうそう、DBMとかな
229デフォルトの名無しさん:2009/07/12(日) 15:11:34
現状SQLite一択っしょ。
PHPが早々にエンジンごと標準添付にしたのはGJだったと思うんだ。
230デフォルトの名無しさん:2009/07/12(日) 15:15:54
SQLite標準添付はうらやましいなぁ
231デフォルトの名無しさん:2009/07/12(日) 15:20:27
入れればいいじゃん・・・
232デフォルトの名無しさん:2009/07/12(日) 15:42:01
>>205

> まあ今どき業務でもなければ1.8系なんて使ってたのは>>201だけだったかもな

えー、そうなのか
今調べたら、1.8.5 だった。
上げるの面倒だな、おかしくなったらやだし。
233デフォルトの名無しさん:2009/07/12(日) 15:46:13
db不要な場合も有るので、標準添付は抵抗有るな。
常に最新版/安定板追っかけてくれる保証も無いし。
234デフォルトの名無しさん:2009/07/12(日) 15:54:10
SQLiteはSQL書かなきゃならんだろ
Marshal,YAMLはrubyのインスタンスをそのまま保存できる
open('my.db','w') {|f| f.write(Marshal.dump(hash)) }
hash = Marsha.load(File.read('my.db'))
一度でも使った事があれば>>210程度の用途にSQL系DBなんか勧めない
235デフォルトの名無しさん:2009/07/12(日) 16:09:28
SQLiteは「サーバの向こう」でのみ使う人がよく使う
自分のマシンでやる機会があるならこんなん日常用途に絶対選ばんぞ
236デフォルトの名無しさん:2009/07/12(日) 16:14:16
だから学生スレなんて言われるんだよ
237デフォルトの名無しさん:2009/07/12(日) 16:26:05
>>236
「だから」って何?理由を書いてよ。10行くらいまでなら読んであげる。
あ、初心者スレだからわかりやすくお願いね(ハート)
238デフォルトの名無しさん:2009/07/12(日) 16:26:19
>>236
あなたが何歳なのかは知りませんが、おっさんどもは
ゆとり君たちに負けないように、自分の技術にさらに磨きをかけるよう頑張ってください。
239デフォルトの名無しさん:2009/07/12(日) 17:41:02
SQLiteってRuby1.9.2に入るんだっけ
240デフォルトの名無しさん:2009/07/12(日) 17:53:06
>>226
適材適所という言葉がありまして

>>228
少なくともYAMLのバージョンはMarshalほど頻繁には変わらない
もちろん>>224のような例もあるから、どっちもどっちという印象ではあるが
241日記 ◆wSaCDPDEl2 :2009/07/12(日) 19:29:06
平成21年7月12日(日)

今日から、勉強を始める。

「たのしいRuby」
43ページ 2.3 正規表現まで投了
242デフォルトの名無しさん:2009/07/12(日) 19:31:16
ランダムに被らないように5個のデータの中から4個取り出す方法についての質問です
入れ替えで上手くいかなくて被ってしまいます、どうしたらいいのでしょうか?

b=0
a=[1,2,3,4,5]
while b <= 4
srand
puts a[rand(a.length)]
c=a[rand(a.length)]
a[rand(a.length)]=a[rand(a.last)]
a[rand(a.last)]=c
J=a.pop
b+=1
end
243デフォルトの名無しさん:2009/07/12(日) 19:40:38
>>241
「投了」って降参してどうする
244日記 ◆wSaCDPDEl2 :2009/07/12(日) 19:54:38
>>243
投了じゃなくて読了だった(笑)

245デフォルトの名無しさん:2009/07/12(日) 20:03:43
>>242
配列の中での入れ替えをやらない方が良い
delete_atで指定した位置の要素をとってこれるから、そっちを使うべき

あとwhileよりは、eachやtimesを使うのがオススメ
一例

list = [1,2,3,4,5]
poped = []
4.times do
 sliced_index = list[rand(list.size)]
 poped << list.delete_at(sliced_index)
end
246デフォルトの名無しさん:2009/07/12(日) 20:09:02
a.sort_by{rand}[0..3]
a.shuffle[0..3]
247デフォルトの名無しさん:2009/07/12(日) 20:39:28
>>245-246
ありがとうございます
これから、参考にやってみます
248デフォルトの名無しさん:2009/07/12(日) 23:01:01
redMineのスレってないのかな?
249デフォルトの名無しさん:2009/07/13(月) 02:10:18
Rubyって何で今になっても公式ドキュメントができないのでつか?

みんな我が強いからでつか?
250468:2009/07/13(月) 02:52:52
251デフォルトの名無しさん:2009/07/13(月) 05:19:33
たとえば
3481
という数字(4桁/0含む)が与えられたとき
0 = 3 + 4 - 8 + 1
1 = 3 + 4 - 8 * -1
2 = -(3 + 4 - 8 - 1)
3 = 3 * 4 - 8 - 1
4 = (3 / (4 + 8))^-1
...
のように加減乗除のみで整数を順に造っていってください
252デフォルトの名無しさん:2009/07/13(月) 07:52:21
>>251
いやです
宿題スレへどうぞ
253デフォルトの名無しさん:2009/07/13(月) 09:48:02
> 加減乗除のみ
254デフォルトの名無しさん:2009/07/13(月) 09:53:40
了解
255デフォルトの名無しさん:2009/07/13(月) 10:47:02
>>240
>少なくともYAMLのバージョンはMarshalほど頻繁には変わらない
いや、YAMLは変わる。すくなくとも1.8.4までは頻繁に変わってた。
Marshalって変わったか?具体的にどのバージョンでどう変わった?
256デフォルトの名無しさん:2009/07/13(月) 11:06:06
>>248
redMine の何を聞きたいのかわからないけど、
webprog 板の Rails スレのほうが、いろいろ答えが得られると思う
257デフォルトの名無しさん:2009/07/13(月) 13:13:23
>>248
この板ではBTSスレで扱ってる。
258デフォルトの名無しさん:2009/07/13(月) 19:02:53
英語勉強して、
英語のメーリングリストのぞいた方が早い
259日記 ◆wSaCDPDEl2 :2009/07/13(月) 19:19:58
平成21年7月13日(月)
今日は、Arrayクラスを学んだ。
Array.new
%w
to_a
split

%wはとても便利だ。
indexに-1を指定すると最後の要素を指せる事を始めて知った。
260デフォルトの名無しさん:2009/07/13(月) 19:39:05
261日記 ◆wSaCDPDEl2 :2009/07/13(月) 19:40:03
>>260
次から、そこへ行きます。
ありがとう
262240:2009/07/13(月) 20:13:28
>>255
ruby 1.6.0 => 4.4
ruby 1.8.x => 4.8
ruby 1.9.x => 4.8

なるほど、確かにマイナーバージョンも1.8.0以降は変わってなかった
すまんかった

ところでYAMLの非互換ってのは、具体的にどんな変更があったんだ?
263デフォルトの名無しさん:2009/07/13(月) 21:39:22

ruby -e "def hoge(n); p n; hoge(n + 1); end; hoge(0)"
でどこまでいく?うちは3920
264デフォルトの名無しさん:2009/07/13(月) 22:01:07
>>263
1148 で落ちた。

c:\> ruby -v
ruby 1.8.5 (2006-08-25) [i386-mswin32]

CoreDuo T2500(2Ghz)、MEM 3GB、Win XP Pro(32bit)

メモリが3GBもあるからもっと行くかと思ったんだけど・・・
Java でもそうだけど、スタックはヒープとは違う領域だから、
メモリがいくつあってもスタック領域も増やさないとダメなのかな?

Ruby でも、Java の VM オプションみたいにいろいろ指定できるのですか?

ちなみに >>263 の環境を教えてほしい
265デフォルトの名無しさん:2009/07/13(月) 22:25:22
14716
-e:1:in `hoge': stack level too deep (SystemStackError)
from -e:1:in `hoge'
from -e:1

スペック低いはずだが…
266デフォルトの名無しさん:2009/07/13(月) 22:33:27
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9.7.0]
0
:
6295
-e:1:in `hoge': stack level too deep (SystemStackError)

ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-darwin9.7.0]
0
:
8186
-e:1:in `hoge': stack level too deep (SystemStackError)
267デフォルトの名無しさん:2009/07/13(月) 22:34:33
>>264

ruby 1.8.5 (2006-08-25) [i386-mswin32]
mswin32ってことなら、スタックサイズはヒープとは別個に決まってる。
たぶん、PEヘッダーをいじるツールで変更できるけど
rubyの起動時に指定とかはできないと思う。
268263:2009/07/13(月) 22:46:21
>>264
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Core2Duo CPU E8500 3.16GHz
メモリは4GBで3GB認識
OSはUbuntu9.04

ちょっと,
ttp://doruby.kbmj.com/akio0911_on_rails/20081212/Mechanize__Hpricot__MeCab__

ここのいじって13KB位のテキストファイル開いて上のURLみたいに出現頻度調べて遊んでたら

main.rb:12:in `each': stack level too deep (SystemStackError)
from main.rb:13:in `each'
っていうエラーが.
def each(&b)
b[self]
self.next.each(&b) if self.next
end
の所なんだけど,どうすればいいかわかる?
269デフォルトの名無しさん:2009/07/14(火) 00:07:10
1148
1GB
1.8.5
XP home

少ない
270日記 ◆wSaCDPDEl2 :2009/07/14(火) 00:14:53
>>263
僕は、14840だったw
271デフォルトの名無しさん:2009/07/14(火) 01:59:32
俺もはかってみようとレポジトリの奴ではかったら3900
あぁ、ホールふさがれた奴あったなと思ってtar.gz落としてきてそっちでやると6900
でも、require 'rubygems'が使えなくなった。
自分でmakeした時にgem周辺でPATH通さないといけない所ってどこ?
272デフォルトの名無しさん:2009/07/14(火) 02:10:37
>>263
68804
273デフォルトの名無しさん:2009/07/14(火) 02:28:03
2173
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-freebsd7]
AthlonXP3000+(2.16GHz)
Mem1GB

>>268
mecabを使って無いから確かな事は言えないが元のソースが間違ってる気がする
def each(&b)
 node = self
 while node
  b[node]
  node = node.next
 end
end
274デフォルトの名無しさん:2009/07/14(火) 05:06:02
やっぱり動作がeachらしくなくて気にくわない
class MeCab::Tagger
 def parseToNodes(*args)
  arr,node = [],self.parseToNode(*args)
  while node
   arr << node
   node = node.next
  end
  arr
 end
end
− nodes = m.parseToNode(text)
+ nodes = m.parseToNodes(text)
275264:2009/07/14(火) 10:52:29
>>268 どうもありがとう。

>>264>>269 で、搭載メモリ量は違うのに
結果が同じということは、スタックサイズは Ruby のバージョンで決まってしまう
(搭載物理メモリ量は関係ない)ということですね。

>>267
Java だと -Xss などの VM オプションを与えることで、実行時に
メモリ割当量を変えることが出来ますが、Ruby の場合は、
以下のような理解であってますか?

・そういうオプションは用意されていない
・Ruby は C で書かれているが、C をコンパイルするときに、ヘッダファイル等で
 スタックサイズ等はハードコーディングされている
・「PEヘッダーをいじるツール」(これがよくわかりませんが)をつかうことで、
 その固定値を変えることが出来る

276デフォルトの名無しさん:2009/07/14(火) 12:29:11
>>275
だいたい理解はあってる。
厳密に言うと、mswin32版のスタックサイズはwin32/Makefile.subで指定されていて、リンク時に確定される。
デフォルトではスタックサイズは2MBなので、Makefileに例えば
STACK=0x400000
とか書いてビルドすれば4MBにできる。

このリンク時に指定されたスタックサイズは実行ファイルのPEヘッダに格納されているので、それを何らかの手段で書き換えれば、いちいち自前でビルドしなくてもスタックサイズの変更は可能。
277デフォルトの名無しさん:2009/07/14(火) 13:07:51
specファイルを書く時に、複数のファイルにまたがって共通するコードはどこにかけばいいですか。

278デフォルトの名無しさん:2009/07/14(火) 13:09:18
>>275
>Java だと -Xss などの VM オプションを与えることで、実行時に
>メモリ割当量を変えることが出来ますが、

これいいよねー
メモリサイズだけじゃなくてGCまわりとか、上級者用オプションとして
Rubyでも用意してほしい
279デフォルトの名無しさん:2009/07/14(火) 13:22:57
>>277
describeをネストするか、shared exampleを使う。
280264:2009/07/14(火) 13:43:57
>>276
どうもありがとう、理解できました。
ようするにコンパイル結果のバイナリをいじっちゃえってことか。

>>278
そこで JRuby ですよ(笑)
Java のいいところは、言語仕様の比較はここでは避けるが、VM としては
-Xmx でメモリサイズも変えられるし、GC の挙動、アルゴリズムも変えられる。GCログも出力できる。

Ruby もそうなっていくといいな。
Ruby Enterprise Edition だけでもそういうのを実装していくとか。
281デフォルトの名無しさん:2009/07/14(火) 13:48:21
そうやって Ruby も Java みたいに Write Once, Run Anywhere じゃなくなるのか
282デフォルトの名無しさん:2009/07/14(火) 14:29:39
>>281
まるで的外れ
283デフォルトの名無しさん:2009/07/14(火) 14:50:40
>>282
完全に的外れ
284デフォルトの名無しさん:2009/07/14(火) 14:56:28
このスレ自体が的外れ
285デフォルトの名無しさん:2009/07/14(火) 16:36:29
>>284
正解
286デフォルトの名無しさん:2009/07/14(火) 20:14:11
結局、実行環境依存なほうが都合のいい事が多いしな。
実際、rubyもデビアン前提で、ウィンドウズはさっぱりだったりするし。
287デフォルトの名無しさん:2009/07/14(火) 20:19:02
>>277
普通にrequireしたんじゃだめなの?
288デフォルトの名無しさん:2009/07/14(火) 23:39:34
>>281
VMのオプションでメモリサイズやGCログを指定できることと、Write once Run Anywhere はまるで関係ない。
まさに的外れ。
289デフォルトの名無しさん:2009/07/15(水) 01:11:20
>>263
ulimit -s unlimited
でやってみたらどこまでも伸びていってHDにスワップにいっちゃったから
切った。
290デフォルトの名無しさん:2009/07/15(水) 13:55:48
単なる環境依存か。
291デフォルトの名無しさん:2009/07/16(木) 12:45:56
Enumerableなインスタンスをeachで回してる途中でeachから抜けるにはどうしたらいいでしょうか?
例えばこんな動作を期待しています。
[0,1,2].each do |x|
 each_return x if x = 1
end
#=> 1

292デフォルトの名無しさん:2009/07/16(木) 13:04:03
break
293デフォルトの名無しさん:2009/07/16(木) 13:21:08
break に戻り値はありますか?
294デフォルトの名無しさん:2009/07/16(木) 13:29:22
[0,1,2].each {|x| break x.to_s * 5 if x == 1}
# => "11111"
295デフォルトの名無しさん:2009/07/16(木) 14:04:44
sunkuso
296デフォルトの名無しさん:2009/07/16(木) 14:07:10
Rubyっていつも語順がおかしいよな。まともな感覚ならこうあるべき。
each([0,1,2]) {|x| if x == 1 then x.to_s * 5; break; end}
297デフォルトの名無しさん:2009/07/16(木) 14:14:46
ものすごく視野が狭いな
298デフォルトの名無しさん:2009/07/16(木) 14:15:17
一般的なオブジェクト指向の厳格さとPerl由来の便利さを程よくミックスさせた、使いやすいシステムだと思うよ
eachをレシーバ依存の一般メソッドにするか予約語関数的メソッドにするかは作者の頭の中でひと悶着あったと思う
299デフォルトの名無しさん:2009/07/16(木) 14:20:33
>>296
each だけなら別にそれでもいいが、each_with_index とか each_pair とかあのへんどうするんだよ
300デフォルトの名無しさん:2009/07/16(木) 14:21:38
後置ifはperlのまね?
301デフォルトの名無しさん:2009/07/16(木) 14:22:06
mix-inもダメダメになるなw
302デフォルトの名無しさん:2009/07/16(木) 14:31:19
>>299
現在の print に引数渡すときと同じことだ
あれは自前で文字列にして渡すだろ

つまり、引数に渡す時点で自前で必要な配列にする
つまり、こうだ

arr = ['one', 'two', 'three']

each(arr.zip([1, 2, 3])){|e, i|
puts "#{i} 番目は #{e} です"
}

イエスジャスティス
303デフォルトの名無しさん:2009/07/16(木) 14:33:45
puts が流行って #display が流行らなかった理由と併せて考えると面白いかもしれない
304デフォルトの名無しさん:2009/07/16(木) 14:44:38
>>300
いえす。
Perlのは何由来だったかな。ラクダ本に載ってた気がしたんだが。
305デフォルトの名無しさん:2009/07/16(木) 14:47:56
each_pair はあれだが each_with_index は $. でよかった
306デフォルトの名無しさん:2009/07/16(木) 15:20:17
[1,2,3].find{|n| n.even? } #==> 2
みたいのないなそういや
307デフォルトの名無しさん:2009/07/16(木) 15:30:29
one night
308長文失礼します:2009/07/16(木) 21:24:58
2日間悩んでいます。お力を貸していただけるとありがたいです。
Rubyそのものの記述ミスじゃないのかな?と思い始めてきましたが
解決方法が見つけ出せないでいます。

当該ファイルとエラーログなどをまとめました。
http://www.dotup.org/uploda/www.dotup.org244140.zip.html

・環境
CentOSのバージョン CentOS release 5.3 (Final)
rubyのバージョン 1.8.5 (2006-08-25) [i386-linux]
httpdのバージョン Server version: Apache/2.2.3

・詳しい内容
open-uri.rb を使ったプログラムがサーバーを通すと動きません。
LAN内の別のパソコンからhttp://192.168.x.x/test.cgiで実行すると
画面に何も表示されません。

プログラムの内容は、下記のアドレスの一番上のプログラムです。
http://www.ruby-lang.org/ja/man/html/open_uri.html
309長文失礼します:2009/07/16(木) 21:25:52
rubyファイルとしてコマンドラインから ruby test.rb
または、CGIファイルとして ./test.cgi
として実行した場合は、目的の出力が画面(GNOME端末上)に現れます。
また、print("hello,Ruby\n")のプログラムはサーバーを通して実行できます。

LAN内の別のパソコンからhttp://192.168.x.x/test.cgiで実行すると
画面に何も表示されません。

・エラーメッセージ
/var/log/httpd/error.log を見ると
過去ログ(part12)の866と似たようなエラーがでています。
http://www.bookshelf.jp/2ch/tech/1178167650.html
過去ログの相違点としては、'initialize'の後ろが下のようになっています。
:
getaddrinfo: Temporary failure in name resolution
(
SocketError
)
310長文失礼します:2009/07/16(木) 21:26:52
・その他
ネットワーク・プロキシの設定 では インターネットに直接接続する になっています
セキュリティレベルの設定 では ファイアーウォールが有効になっていて
SSHとHTTPにチェックを入れています。

telnet www.ruby-lang.org 80 の結果は下のようになりました。
Trying 221.186.184.68...
Connected to www.ruby-lang.org (221.186.184.68).
Escape character is '^]'.

・最終的にやりたいこと
http://○○/test.cgi へのアクセスでhtmlコードが表示されるようにしたい

よろしくお願いします。
311デフォルトの名無しさん:2009/07/16(木) 21:49:42
>>308
> プログラムの内容は、下記のアドレスの一番上のプログラムです。
嘘だ
それは「そのままでは動かない」
その4行のほかに書いてあることがあるはず
312デフォルトの名無しさん:2009/07/16(木) 21:52:11
>>311
すみません。cgiはこのようになっています。

#!/usr/bin/ruby



require 'open-uri'



print("Content-Type: text/html; charset=utf-8 \n\n")



open("http://www.ruby-lang.org/") {|f|

f.each_line {|line| p line}

}
313デフォルトの名無しさん:2009/07/16(木) 21:54:02
>>311
横から見てコピペしてみたら、普通にそのまま動きましたが何か
314デフォルトの名無しさん:2009/07/16(木) 22:15:54
getaddrinfoがエラー出してる時点でできれば関わりたくないんだが、

#!/bin/sh
echo "Content-Type: text/plain\n\n"
ping -c 1 www.ruby-lang.org

たぶんこれでも似たようなエラーが出るはず
ApacheがDNS関係の設定か何かを読んでないのだろう
315デフォルトの名無しさん:2009/07/16(木) 22:27:25
>>313
ワロタw


SELinuxの機能をオンにしてる(よな?たぶん・・・)時点でおれはダメ
SELinux登場以前のノウハウが通用しなくてきつすぎる

とりあえずオフにしてくれなきゃ原因となりうるものが多すぎ
オフにしたら動いたりしてな
316デフォルトの名無しさん:2009/07/16(木) 22:33:55
>>313
すみません。私の説明不足でした。
>>314
面倒なものに助言をくださりありがとうございます。
シェルスクリプトをcgiとして取り扱うのは初めてなので
方法が合っているか分かりませんが拡張子を.cgiとしてchmodで755を与えて
サーバーを通してみてみました。
error.logは
[error] ping: unknown host www.ruby-lang.org
[error] Premature end of script headers: test3.cgi
[error] File does not exist: /var/www/html/favicon.ico
となりました。 DNS関係の設定ですね 調べてみます。ありがとうございます。
317デフォルトの名無しさん:2009/07/16(木) 22:41:04
>>315
SELinuxの設定を確認したら、Enforcingモードになっていました。
今、無効化して再起動をしたところ実行できましたorz

本当にありがとうございました!!

スレ汚しごめんなさい。
318デフォルトの名無しさん:2009/07/16(木) 22:46:45
助言をいただいたほかのみなさんもありがとうございました!!
319デフォルトの名無しさん:2009/07/16(木) 22:58:10
ようするにセキュリティを甘くすることによって解決したわけだから、
他にまっとうな方法があるならそちらを使うべきなんだよね。
俺もSE以前の知識で止まってるので皆目わからんが。
320デフォルトの名無しさん:2009/07/16(木) 23:42:59
そう、本当は何も解決してないどころか事態はより悪くなっている
321デフォルトの名無しさん:2009/07/16(木) 23:44:38
SELinuxってなんであんなに寄せ付けない感があるんだろ
勘どころがまったくわからない
これは少数派ではないと勝手に思ってる
322デフォルトの名無しさん:2009/07/17(金) 00:49:04
まっとうな方法をアドバイスできない時点で
自分も悪い事態の中で動かしてるんじゃないのか?
323デフォルトの名無しさん:2009/07/17(金) 01:19:16
CentOS インストールするときに最初にやることは
SELinux を無効にすることだろうが
324デフォルトの名無しさん:2009/07/17(金) 02:40:17
CentOS使ってるいみなくね
325デフォルトの名無しさん:2009/07/17(金) 05:48:22
SELinuxが必要でCentOSを使ってる人は少数
たいていの人にとっては「なぜかついてきた邪魔な機能」でしかない
326デフォルトの名無しさん:2009/07/17(金) 08:46:41
ようするにセキュリティを甘くすることによって解決したわけだから、
他にまっとうな方法があるならそちらを使うべきなんだよね。
俺もSE以前の知識で止まってるので皆目わからんが。
そう、本当は何も解決してないどころか事態はより悪くなっている
SELinuxってなんであんなに寄せ付けない感があるんだろ
勘どころがまったくわからない
これは少数派ではないと勝手に思ってる
まっとうな方法をアドバイスできない時点で
自分も悪い事態の中で動かしてるんじゃないのか?
CentOS インストールするときに最初にやることは
SELinux を無効にすることだろうが
CentOS使ってるいみなくね
SELinuxが必要でCentOSを使ってる人は少数
たいていの人にとっては「なぜかついてきた邪魔な機能」でしかない
327デフォルトの名無しさん:2009/07/17(金) 11:15:13
Rubyの話をしようや
328デフォルトの名無しさん:2009/07/17(金) 13:48:47
じゃあ、Rubyの話を、
セキュリティは、そこら辺にあるマニュアル通りでおk
どこがの事業で大規模に人が集まってくるようなら考える。
専門家に任せたりd(^-^) ね!
329デフォルトの名無しさん:2009/07/17(金) 17:39:41
Rubyって全然エコじゃないよね。
Cの何十倍くらい電力効率悪いんだろう。
330デフォルトの名無しさん:2009/07/17(金) 17:46:29
またエコ厨か。
331デフォルトの名無しさん:2009/07/17(金) 17:52:12
Cで開発する時にかかる余分な設備維持費とか人件費とかも考えないとね。
332デフォルトの名無しさん:2009/07/17(金) 18:19:41
>>329
マシン、CPUはそうだが、
作る時間を大幅節約できるので、その分の食費、クーラー代、通勤費、残業代
コストを減らせる。
333デフォルトの名無しさん:2009/07/17(金) 18:34:27
Cって全然エコじゃないよね。
アセンブラの何十倍くらい電力効率悪いんだろう。
334デフォルトの名無しさん:2009/07/17(金) 18:46:41
アセンブラに夢見すぎ
335デフォルトの名無しさん:2009/07/17(金) 19:51:58
>>332
長く使うプログラムならCで元が取れる
336デフォルトの名無しさん:2009/07/18(土) 00:20:40
長く使うにはある程度メンテが必要な気もする
337デフォルトの名無しさん:2009/07/18(土) 03:29:28
完璧なプログラムにはメンテナンスなど必要ない
338デフォルトの名無しさん:2009/07/18(土) 05:23:58
完璧なプログラムなどといったものは存在しない。
完璧な絶望が存在しないようにね。やれやれ。
339デフォルトの名無しさん:2009/07/18(土) 12:31:24
stdio.hも後になってセキュリティホールが見つかったりしてるしな
340デフォルトの名無しさん:2009/07/18(土) 17:41:03
長く使うプログラムはCで書けばいい
なんでもかんでもRubyで書こうと思うのが間違ってるんだ
適材適所って言うじゃない
無論、エコを語るならどれだけ長く使えば元が取れるのかは正確に計算する必要があるけど。
341デフォルトの名無しさん:2009/07/18(土) 17:42:13
> なんでもかんでもRubyで書こうと思うのが間違ってるんだ
そんな奴はいない
342デフォルトの名無しさん:2009/07/18(土) 17:53:49
> 長く使うプログラムはCで
それはない
343デフォルトの名無しさん:2009/07/19(日) 01:54:50
Cで書くとCPUがんばりすぎて発熱が多くなってエコに悪いんじゃないかな
344デフォルトの名無しさん:2009/07/19(日) 10:18:39
コンパイルとか無駄だから、最初からバイトコードで記述すべきだよな。
345デフォルトの名無しさん:2009/07/19(日) 16:37:43
>>338
春樹乙
346デフォルトの名無しさん:2009/07/19(日) 18:30:36
IO.pipe の代わりに使える物ってなにがあるかな?

http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-list/41847?41795-42004
> > msvcおよびmingw版ruby,で1000バイト以上をパイプに書き込むとwriteがブロックしてしまうのですが、これは仕様でしょうか?
> 1.8における仕様ということにさせてください。
にあるような問題が発生してしまうので困ってる。

書き込み側は #write, #close
読み込み側は read, eof? あたりに反応してくれれば十分なんだけど…
347デフォルトの名無しさん:2009/07/19(日) 18:51:36
>>346
rake使うときにshでコマンドを実行すると、パラメータが途中で切れてたのはそれか……ひどい仕様だ
348デフォルトの名無しさん:2009/07/19(日) 21:09:42
WindowsでRubyを使う奴は情弱

繰り返す。

WindowsでRubyを使う奴は情弱

情報強者のプログラマはWindowsなんてゴミを使っちゃだめ
あれはお年寄りと子供用のOSだ。
349デフォルトの名無しさん:2009/07/19(日) 21:25:08
Linuxは嫌いなのでお断りします
350デフォルトの名無しさん:2009/07/19(日) 21:29:09
っス

あらゆることに大人の修行を求める>>348さんパネェっす
妥協せず全て全力で学び全力で研究する修羅の世界を行くの流石っす
351デフォルトの名無しさん:2009/07/19(日) 21:36:45
>>348
大学で初めてUnixさわった子が言いそうな発言だなぁ
352デフォルトの名無しさん:2009/07/19(日) 21:40:06
>>350
OSなんて適当でいいんだよな
自動車がATで充分な場合が多いのと一緒

世の中のあらゆることにプロフェッショナルではいられない以上、
世の中のほとんどに対しては「年寄りか子供」程度のアプローチしかできん
353デフォルトの名無しさん:2009/07/19(日) 21:42:48
まあお前らがそれならそれでいい。

ただ、努力をすることを忘れた瞬間から人は堕落する。
せいぜい適当な態度で適当な仕事を適当にやって適当な給料もらってりゃいい。

俺はそれじゃ我慢できない。給料もらってる以上、仕事は本気でやりたい。
354デフォルトの名無しさん:2009/07/19(日) 21:44:03
どうして自分の仕事を他人に強制するの?
355デフォルトの名無しさん:2009/07/19(日) 21:45:45
>>353が強制にみえるの?馬鹿なの?アホなの?
356デフォルトの名無しさん:2009/07/19(日) 21:47:15
>>355
妄想はいいから
仕事を探せよ
http://www.hellowork.go.jp/
357デフォルトの名無しさん:2009/07/19(日) 21:48:29
Windowsをお子様お年寄りのOSと見るなんてまるっきり利用者視点じゃない
とてもじゃないがプログラマの視点とは思えないわw
358デフォルトの名無しさん:2009/07/19(日) 21:49:24
ずいぶん狭い価値観だな。
OSなんて自分が使いやすい物を使えばいいだろ。
結果さえ出れば、道具は何を使っても構わないと思うがな。
359デフォルトの名無しさん:2009/07/19(日) 21:51:20
道具Aが道具Bとうまく合わないからって文句を言うのは筋違いだよな。
360デフォルトの名無しさん:2009/07/19(日) 21:54:43
if RUBY_PLATFORM =~ /mswin/

( ´,_ゝ`)プッ
361デフォルトの名無しさん:2009/07/19(日) 21:54:50
大工は100円ショップのトンカチで仕事しない
362デフォルトの名無しさん:2009/07/19(日) 22:02:42
そりゃトンカチは普通、自分一人しか使わないからな
363デフォルトの名無しさん:2009/07/19(日) 22:11:42
なんか前にも見たことあるような気がするな
364デフォルトの名無しさん:2009/07/19(日) 22:19:02
デジャブじゃね?
365デフォルトの名無しさん:2009/07/19(日) 22:24:13
マトリックスに修正が加えられたということよ
366デフォルトの名無しさん:2009/07/19(日) 22:25:44
手荒れにはやっぱり
367デフォルトの名無しさん:2009/07/19(日) 22:39:34
これだけ普及してるWindowsの評価はともかくとして、
RubyみたいなUNIXコマンドラインツールをWindowsで使うのが
価値半減というのはわかるけどね。正式なサポートもないし。
368デフォルトの名無しさん:2009/07/19(日) 22:57:13
俺はコマンドプロンプトだとターミナル以上にRubyを使う場面が多いw
コマンドプロンプトは機能が貧弱だからな…
かと言ってPowerShellはシェルとしては微妙に使いにくい気がするし(慣れだろうけど)
369デフォルトの名無しさん:2009/07/19(日) 23:22:25
むしろCUIの貧弱なWindowsだからこそ、Rubyのパワーが欲しくなるという場面もあるよね
370デフォルトの名無しさん:2009/07/20(月) 00:02:41
http://pc12.2ch.net/test/read.cgi/unix/1172665195/
Microsoft Windows Services for UNIX (SFU)
371デフォルトの名無しさん:2009/07/20(月) 00:07:37
Microsoft Windows Services for UNIX users (SFU)
372デフォルトの名無しさん:2009/07/20(月) 01:40:36
>370
そのスレの内容を見たか?
373デフォルトの名無しさん:2009/07/20(月) 06:56:38
趣味なら何を使っても自由だが、仕事ならお客さんが求めるものに対して
プロフェッショナルである必要があるんじゃないかな。
仕事だからWindowsはダメとかそういう話ではなくて。
とりあえず仕事でRubyはアリエナイと言っておく。
374デフォルトの名無しさん:2009/07/20(月) 07:04:22
PowerShell覚えるくらいなら不自由でもRubyを使いたい
どうせそんなにシビアなバッチ書かないし
375デフォルトの名無しさん:2009/07/20(月) 07:53:25
>>373
>とりあえず仕事でRubyはアリエナイと言っておく。

ここは同意できないというか、どうしてRubyはありえないのか根拠を詳しく聞かせてほしいな。
自分は、実際に仕事でWebサイトの構築をRuby(Rails)で3年くらいやっているけど、問題になったことはないので。
2日目のRubykaigiにも行って来たけど、楽天、リクルート、ニフティなどの大手サイトでの実績を聞くことができたよ。
月間6000万PVのサイトでもRailsで対応できているって事だったけど。


376デフォルトの名無しさん:2009/07/20(月) 08:03:04
うん、実行環境のサーバごと提供できるのなら、Rubyはそれほど選択肢から外れるわけでもない

多くの場合は実行環境がすでに固定されてるし、リプレースにもあんまし向かんが
メンテナンス人員が派遣屋で即購入できることが重要である案件も結構あるしな
377375:2009/07/20(月) 08:09:27
ちなみに自分が会社で使っているPCはWindowsだけど、開発サーバはCentOS。
(本番環境がRedHatだからなるべく近い環境にしている)

PCのOSがWindowsなのは、会社の方針。
USBメモリを使えなくしたり、WindowsUpdate、ウイルスチェックの強制実行などを中央サーバから指示できるなど管理上の理由。
数百台以上あるPCを管理するには、Windowsのほうが便利だよね。
普通の会社だと、個人でOSを自由に選べるという事は少ないと思うんだけど、どうなんだろうか?
378375:2009/07/20(月) 08:20:58
>>376
そういう話なら、納得できます。
自分もRuby(Rails)で仕事をさせてもらう場合、常に実行環境のサーバごとの提供ができる時だけなので。
あるいは、root権限を一時的に使わせてもらえて、使用するミドルウェアの選定を任せてもらえる時とか。

実行環境がすでに固定されている場合、リプレースには向かないというのは同意。

379デフォルトの名無しさん:2009/07/20(月) 11:02:51
Ruby って意外と使えないんですね
380デフォルトの名無しさん:2009/07/20(月) 11:13:08
あなたも含め、Rubyコミュニティががんばる事で使える場面が増えていくでしょう
381デフォルトの名無しさん:2009/07/20(月) 12:15:47
>>379
だから誰かが作ったレール利用したプログラミング人生送りたいならJava選べJava
めちゃくちゃ安定だから
何血迷ってるのよ
382デフォルトの名無しさん:2009/07/20(月) 12:38:50
>>380
がんばります
>>381
Java嫌いです
383デフォルトの名無しさん:2009/07/20(月) 13:43:39
テキスト内にある改行を2個目以降は
スペースに変換するにはどう書けばいいですか?

"foo\nbar\nhoge" => "foo\nbar hoge" とやりたいです。

split("\n") で分割してから
array[0] + "\n" + array[1, array.size-2].join(" ")
でできるのですが

正規表現とgsub でもっと簡単にできないでしょうか?
384デフォルトの名無しさん:2009/07/20(月) 13:47:59
>>383
ご要望とは違うが、文字数を減らして書いてみた。

(ar = str.split("\n")).shift + "\n" + ar.join(" ")
385デフォルトの名無しさん:2009/07/20(月) 13:58:31
伝統的な方法は
1 while s.gsub!(/(¥n.+)¥n/m) { |m| "#{$1} " }
# 破壊的なので必要ならdup

1.9だと
s.gsub(/(?<=¥n)(.*?)¥n/) { "#{$1} " }
386385:2009/07/20(月) 14:00:01
量指定子(*?とか+とか)が適当だった……
387385:2009/07/20(月) 14:00:55
しかも消し忘れの /m。吊ってくる。
388デフォルトの名無しさん:2009/07/20(月) 14:01:59
>>385
内容に全く関係ないが、なぜわざわざ \(バックスラッシュ) を ¥(¥) で記述するw
なんか2chで変換がかかるのかな?
389デフォルトの名無しさん:2009/07/20(月) 14:07:19
見栄えの問題だろ
2chは特に何もしない
390デフォルトの名無しさん:2009/07/20(月) 14:10:31
>>389
いやいやw それは少し変だろ
\って書いてあるんならわからんでもないが
391385:2009/07/20(月) 14:12:24
ターミナルのバックスラッシュ(左上から右下への斜線のグリフ)を
ペーストしただけなのだが、0x5Cではなく0xA5になってる?
392デフォルトの名無しさん:2009/07/20(月) 14:15:41
そういやMacは簡単に打ち分けられるんだよな、バクスラと円
うちのMacbookはデフォルトが円なせいでよく打ち間違えるのがやっかい
393デフォルトの名無しさん:2009/07/20(月) 14:17:56
>>391
うん。というより、HTMLなので &yen; になってる。
単純に書き込みに使うブラウザのマッピングの問題なんだろうか。
394デフォルトの名無しさん:2009/07/20(月) 14:20:16
>>384はただのバックスラッシュ(U+005C)
>>385は円記号になるもの(¥)

バックスラッシュをU+00A5に内部変換するコピペシステムはあって欲しくないんで、
たぶん2ch専用ブラウザがなにかお節介を焼いたのだろう
395デフォルトの名無しさん:2009/07/20(月) 14:25:40
「Windowsでは円記号でクォートします」と書いてあるんで
素直に Yen Sign でクォートしたらエラーになったでござるの巻
396デフォルトの名無しさん:2009/07/20(月) 14:33:38
スレチながら、気になったので実験してみた。Macのターミナルで作業。

$ echo <バックスラッシュ><バックスラッシュ> > x.txt
$ cat x.txt
<バックスラッシュ>
$ open x.txt # 関連付けされたテキストエディット(Macの「メモ帳」)で開く。
名前を付けて保存→y.txtで保存。
$ cat y.txt
<円記号>

ちょwwwwwwwwww

397デフォルトの名無しさん:2009/07/20(月) 14:50:13
>>396
テキストエディットはなにもしなければMacLatinかMacJapaneseで保存する
398デフォルトの名無しさん:2009/07/20(月) 16:58:31
>>397
ご指摘のとおり。
早速UTF-8保存をデフォにしますた。
399デフォルトの名無しさん:2009/07/20(月) 17:37:26
質問です。
自分のサイトのRubyで書かれたCGIページにリクエストが要求されると、自動的にtwitterに発言を投稿してくれるプログラムを書きたいと思っています。
twitter関係のRubyアプリを調べたところ、twitter4Rというものがあるらしく、使ってみたのですがうまくいきません。
ローカルで実験してみると、どうやらRubygemsというものがなければ動かない(?)ようだということがわかりました(dllをbin配下に追加したら、ローカルからはtwitterに投稿できました)。
ですが、自分のサイトが置いてあるレンタルサーバでは、権限がないためRubygemsがインストールできません(問い合わせたところ、導入予定もないとのことです)。
レンタルサーバのRubyバージョンは1.8.2です。
レンタルサーバ上でtwitterに投稿できるような、解決策はありませんでしょうか?
400デフォルトの名無しさん:2009/07/20(月) 17:39:37
Perlでやれば
401デフォルトの名無しさん:2009/07/20(月) 17:42:09
うん、Perlでやればいい
最悪、

 system("perl post_to_twitter.pl #{message}")

とでもしてRubyスクリプトの中でPerlスクリプト呼べば普通にできる
402デフォルトの名無しさん:2009/07/20(月) 17:45:28
Net::HTTP で直に書くという選択肢は…なさそうだな
コマンドライン twitter 投稿アプリケーションを別途起動する、というのが素直な解決策だと思う
403デフォルトの名無しさん:2009/07/20(月) 17:46:05
zipで手に入れてきてlibをカレントか好きなところに展開
カレント以外なら$LOAD_PATHの配列ににパス追加してからrequire

でもtwitter apiぐらいnet/httpで叩けばいいと思う
404デフォルトの名無しさん:2009/07/20(月) 17:51:35
>>400-403
回答ありがとうございます。
Rubyはかなり初心者なので、Net:HTTPはちょっときつそうです。
WEB探してもNet:HTTPからtwitterAPI呼んでるものが見つからないので(ほとんどみんなgems使ってる例)・・・・。
もうcgi自体はRubyで作ってしまってるので、>>401さんのやり方でやってみようかな。
Perlの書き方調べつつがんばってみます。
405デフォルトの名無しさん:2009/07/20(月) 17:51:53
net/httpsはいらない?それなら大分ハードルは低そう
406デフォルトの名無しさん:2009/07/20(月) 17:57:01
messageなるものをそのままコマンドの引数に渡すのかよ
危なすぎるだろ

なぜ>>403のレスの内容をスルーしてるのか分からん
ちなみにおれは>>403じゃないぞ
407399:2009/07/20(月) 18:01:18
>>401さんのやり方は危ないとのことなので、>>403さんのやり方でやってみます。
libを適当につくって、
$LOAD_PATH << "libのパス"
require "Rubygems"
でいいのかな?
408デフォルトの名無しさん:2009/07/20(月) 18:04:30
例って・・・basic認証付きでstatus=messageをPOSTするだけだぞ
net/httpの範囲そのまんま
ttp://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses%C2%A0update

あとgemはもう忘れろ
409デフォルトの名無しさん:2009/07/20(月) 18:47:08
>>407
libの中身を取り出すのなら、もうrubygemsは関係ないよ
だからrequire "rubygems"は必要ない

あと、Twitter4rはjsonに依存しているようなので
jsonのlibも必要になると思われる
410デフォルトの名無しさん:2009/07/20(月) 18:51:08
親切にありがとうございます。よくわかっていなくてすいません。
とりあえずrubygemsのlibをカレントにぶちこんで、require 'twitter'してみたところ、また失敗してしまったようなので、
>>409さんの言うjsonってやつを探してみます。
411デフォルトの名無しさん:2009/07/20(月) 18:55:50
$LOAD_PATHを試しに出力してみな
require "twitter"はtwitter.rbを$LOAD_PATHそれぞれのパスに探しに行くから
./twitter.rbは見つけられても./lib/twitter.rbは見つけられない

だからパスを追加するか、カレントにtwitter.rbが来るように配置しなおす
$LOAD_PATH << "./lib"
412399:2009/07/20(月) 19:03:16
twitter.rbはカレントに置いています。
フォルダ構成は、
twitterフォルダ(twitter.rbの依存)
rubygemsフォルダ
rbconfigフォルダ
insert.cgi(twitter.rbをrequireしたいcgi)
twitter.rb
rubygems.rbなど(他にubygems.rbなど)
json関連(object.rbなど)
となっています。
これでもtwitter.rbをrequireすると失敗しているようです(コメントアウトすると正常終了するが、しないと真っ白の画面が表示される)。
413399:2009/07/20(月) 19:06:08
ちなみに、実行権限は、.rbファイル、.cgiファイルには755を設定しています。
414デフォルトの名無しさん:2009/07/20(月) 19:07:59
まずは、実行したときの $LOAD_PATH だけを確認するCGI(BODYで返すなり
/tmpに書き出すなり)を実行してみれ。
415デフォルトの名無しさん:2009/07/20(月) 19:10:50
あと、Dir.pwd も。
416デフォルトの名無しさん:2009/07/20(月) 19:11:56
>>412-413
たぶんtwitter.rbは読めているが、読んでいる途中にエラーがあるんだろうな
$LOAD_PATHより前に、まずエラー内容を表示するところからだ

insert.cgi全体をbegin〜rescue Exception〜endで囲んで
エラー内容を表示できるようにしておいた方が良いよ。cgi_exceptionを使っても
ttp://cgi-exception.rubyforge.org/
417デフォルトの名無しさん:2009/07/20(月) 19:12:17
>>406
> messageなるものをそのままコマンドの引数に渡すのかよ
> 危なすぎるだろ
なんで?
ただの文字列という情報しかないのにそんなに怯えるのはなぜ?
418399:2009/07/20(月) 19:13:27
作ってみました。test.cgi

$LOAD_PATH.each {|a|
print a
print "<br>"
}

これが実行結果です。
/usr/local/lib/ruby/site_ruby/1.8
/usr/local/lib/ruby/site_ruby/1.8/i686-linux
/usr/local/lib/ruby/site_ruby
/usr/local/lib/ruby/vendor_ruby/1.8
/usr/local/lib/ruby/vendor_ruby/1.8/i686-linux
/usr/local/lib/ruby/vendor_ruby
/usr/local/lib/ruby/1.8
/usr/local/lib/ruby/1.8/i686-linux
419399:2009/07/20(月) 19:14:39
>>415,416
ありがとうございます。
やってみますが、飯に呼ばれたので10分ほどいってきますー。
420デフォルトの名無しさん:2009/07/20(月) 19:15:11
すごい bad knowhow を見ている稀瓦斯
421デフォルトの名無しさん:2009/07/20(月) 19:18:12
>>419
もっとゆっくり食べなよ・・・
422デフォルトの名無しさん:2009/07/20(月) 19:21:32
>>420
いちばん簡単な「自力でAPI経由でPOSTする」「外部プログラムに直接委託する」の2つを封じられたら
あとは汎用性のないグダグダしかないぞ
423デフォルトの名無しさん:2009/07/20(月) 19:23:59
?
424399:2009/07/20(月) 19:25:52
>>418
.
が抜けていました。
Dir.pwdは以下です。
/home/sites/lolipop.jp/users/lolipop.jp-dp44048366/web/s
425399:2009/07/20(月) 19:33:46
お、CGI-Exceptionいれてみたら、エラーメッセージでました(これrequireだけでいいって楽でいいですね・・)
Status: 500 Internal Error Content-Type: text/html X-CGI-Exception: 0.3.0
./rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- json (LoadError)
from ./rubygems/custom_require.rb:31:in `require'
from ./twitter.rb:23
from insert.cgi:11:in `require'
from insert.cgi:11

該当箇所:
def require(path) # :doc:
gem_original_require path #31行目
rescue LoadError => load_error
426399:2009/07/20(月) 19:35:59
jsonは、
array.rb
lexer.rb
object.rb
util.rb
をいれてたのですが足りないっぽいのでgem_original_requireってやつ探してみます。。
427デフォルトの名無しさん:2009/07/20(月) 19:45:02
>>426
require "json"
なんだからjson.rbがないと

それにしてもライブラリがgemsをrequireしてるのは行儀わるいような
428399:2009/07/20(月) 19:55:09
jsonって、ここでダウンロードできるやつでいいんですよね?
http://sourceforge.jp/projects/freshmeat_ruby-json/resources/
これ解凍してもjson.rbはないんですけど・・・・。
429デフォルトの名無しさん:2009/07/20(月) 20:00:19
ローカルでgem install jsonして増えたファイルぶち込め
430デフォルトの名無しさん:2009/07/20(月) 20:00:47
そうか、gemで入れてないからgemのリポジトリ以外のを入れてしまうわけか。
http://json.rubyforge.org
ここの入れて。
431399:2009/07/20(月) 20:07:59
長時間ほんとすいませんorz
>>430のjson.rbをいれてみたら新しいエラーが・・・・。
いれたのはjson-1.1.7のlib配下、json.rbとjsonフォルダです。

Status: 500 Internal Error Content-Type: text/html X-CGI-Exception: 0.3.0
./json/pure.rb:13: uninitialized constant JSON::Iconv (NameError)
from ./rubygems/custom_require.rb:31:in `gem_original_require'
from ./rubygems/custom_require.rb:31:in `require'
from ./json.rb:8
from ./rubygems/custom_require.rb:31:in `gem_original_require'
from ./rubygems/custom_require.rb:31:in `require'
from ./twitter.rb:23
from insert.cgi:11:in `require'
from insert.cgi:11
432399:2009/07/20(月) 20:13:06
json.rbの中身

require 'json/common'
module JSON
require 'json/version'

begin
require 'json/ext'
rescue LoadError
require 'json/pure' # 8行目
end
end

こうなってるんだけど、'json/ext'フォルダは存在してるけど空っぽ。
これは問題ありませんか?
433デフォルトの名無しさん:2009/07/20(月) 20:13:58
iconvのrequireに失敗してるんだろうな
434デフォルトの名無しさん:2009/07/20(月) 20:15:46
>>432
それは自分で考えてみて
別に難しい話じゃないから
435399:2009/07/20(月) 20:19:46
わかりました、ありがとうございました。
またどーーーーーしてもわからないエラーにぶち当たったら持ってきます。
長時間すみませぬ。
436デフォルトの名無しさん:2009/07/20(月) 20:21:09
READMEを読めばわかると思う。
extなしですませる方法も載ってるよ。
437436:2009/07/20(月) 20:26:54
ごめん、私の想像していた理由ではないようだ。
438デフォルトの名無しさん:2009/07/20(月) 20:30:47
そういえばJSONはIconv入ってないとだめなんだな……すまん、忘れてた
もう素直にTwitter4rを諦めて、自力で(Net::HTTPで)何とかした方が早い気する
439デフォルトの名無しさん:2009/07/20(月) 20:35:23
lib/json/pure.rb って
6行め:begin
7行め: require 'iconv'
13行め: rescue Errno::EINVAL, Iconv::InvalidEncoding
54行め: LoadError
となってる。
iconvがロードできなければ54行めで捕捉することを期待してるんだろうけど、
それ以前の rescue をチェックするタイミングで定数 Iconv が必要になって
こういうエラーになっているようだな。
該当 rescue 節の順序を逆にすれば作者の期待するエラーになる、はず。
440399:2009/07/20(月) 20:46:07
せっかくここまでやったので、帰ったらiconvいれてやってみますー。
441デフォルトの名無しさん:2009/07/20(月) 20:46:56
>>435
いや難しくないと言ったのは>>432の部分だけで(>>432自身に問題ない理由まで記されている)
>>431>>433>>439のiconvのほうは少々厄介

rubyのiconvバインディング自体は標準添付だけど
たぶんサーバに大元のiconv本体が存在しない

require 'iconv'
と書いただけのスクリプトでエラーでるなら諦め
442デフォルトの名無しさん:2009/07/20(月) 20:53:00
jsonとiconvの関係については作者にバグレポを送っておいた。
が、元の質問の解決には結局関係なかったな。

既に言われているように、素直に Net::HTTP を使う方向で考えたほうがよさそう。
443399:2009/07/20(月) 20:54:42
いままでと同じようにiconv.rbをツッコムのじゃむりぽ?
444デフォルトの名無しさん:2009/07/20(月) 20:59:09
聞いてばっかりいないでiconvがなにかを調べてごらん
445デフォルトの名無しさん:2009/07/20(月) 21:08:51
しかし今時Iconv必須なJSONもひどいな

>>443
むり。レンタルサーバーで何とかするのは絶望的
twitter4rは諦めた方がいい
446399:2009/07/20(月) 21:10:29
わかりました。
長時間どうもでしたー。
自力でチャレンジしてみまする。
447デフォルトの名無しさん:2009/07/20(月) 21:19:10
>>417
クロスサイトスクリプティングもSQLインジェクションも
攻撃の手段はただの文字列だよな。それと同じ。
コマンドインジェクションってかなり基本なのだが。
448デフォルトの名無しさん:2009/07/20(月) 21:23:16
信頼できない入力だとは誰も言ってないという話だろ
449デフォルトの名無しさん:2009/07/20(月) 21:25:25
うんにゃ。>>417の表現だけを取ってみると危険性が見える。
初心者スレで安全側に立ってレスすることは悪くないと思う。
450デフォルトの名無しさん:2009/07/20(月) 21:26:18
"CGIで呼ばれました" というような固定文字列である可能性は低くない気はするな
451デフォルトの名無しさん:2009/07/20(月) 21:27:39
そのへん言うとNet::HTTPなんて使うべきではないのだよな
素人が自力でHTTPやるなんて愚の骨頂
452デフォルトの名無しさん:2009/07/20(月) 21:32:27
ENV['QUERY_STRING'] 触るのも禁止でひとつ
453デフォルトの名無しさん:2009/07/20(月) 21:33:47
>>448
それは屁理屈にもなっていない

おまえは外部から入力された文字列をブラウザで表示させるとき、
内容によってサニタイジングしたりしなかったりするのか?
もしそうならそれはやめた方がいい。
454デフォルトの名無しさん:2009/07/20(月) 21:40:35
そういや escapeshellarg みたいなのって Ruby にはないんだよな
455デフォルトの名無しさん:2009/07/20(月) 21:44:20
>>453
横だが、わざわざしてないと考えるほうがおかしいとは思わないのか?
456デフォルトの名無しさん:2009/07/20(月) 21:45:40
puts "日本語" と書いて文字化けするかどうか気にしないのと同じレベルだと思う…
これに文句いわないだろ
457デフォルトの名無しさん:2009/07/20(月) 21:51:48
>>456
そもそも大前提が、>>399
> 自分のサイトのRubyで書かれたCGIページにリクエストが要求されると、
> 自動的にtwitterに発言を投稿してくれるプログラムを書きたいと思っています。

これじゃないのか?
それなら、
puts "ほげほげ"

ではなく、
cgi = new CGI
puts cgi['hogehoge']

などを想定するのもそれほどずれてはいないし、確認するのもお節介とはいえおかしくはない
458デフォルトの名無しさん:2009/07/20(月) 21:54:27
あれ。なんかRubyではないコードを書いてしまったような気もするw
459デフォルトの名無しさん:2009/07/20(月) 22:02:23
>>454
system('cmd', 'opt', 'args')

の配列形式を使えばややマシ
やや
460デフォルトの名無しさん:2009/07/20(月) 23:24:43
セキュリティの話か
このあたりはWeb開発目的で作られただけあって
PHPをやってるエンジニアの方が強いだろうな
461383:2009/07/20(月) 23:28:12
>>384-385
ありがとうございます!
462デフォルトの名無しさん:2009/07/21(火) 11:00:24
escapeshellarg って Web に限らず、
コマンドラインなプログラムにも重宝するのに。
463デフォルトの名無しさん:2009/07/21(火) 11:35:26
だから>>459のargに入れれば若干マシだってば
完全無敵な自動エスケープは存在しないんだからさ
464デフォルトの名無しさん:2009/07/21(火) 11:47:28
セキュリティに「若干マシ」という概念ってあるんだね
465デフォルトの名無しさん:2009/07/21(火) 11:49:35
そりゃ「完全」が無い以上当然のことだとは思わんのかな
466デフォルトの名無しさん:2009/07/21(火) 11:59:34
「全く何もしてない」と「○○より若干マシ」の2態しかないような気がする

>>464
んじゃ書いてみ
467デフォルトの名無しさん:2009/07/21(火) 12:14:23
>>464は貯金とかしてるのかな。
たとえばそれを明日、手持ちのキャッシュカードで引き落とせることはまず期待するよな。
それも言ってしまえば確率論による期待にしか過ぎんわけだが、それは理解できるのかな。
また、世の中はそれで十分回るのよ。
468デフォルトの名無しさん:2009/07/21(火) 12:19:35
根本的には、信用できない入力を自動で安全にする方法は存在しない
プログラミング上は、信用できない入力を扱った時点で愚の骨頂
469デフォルトの名無しさん:2009/07/21(火) 12:25:44
つまりlocalhostでやれということですね、わかりません。
470デフォルトの名無しさん:2009/07/21(火) 12:47:37
しかしつまらんスレだな
471デフォルトの名無しさん:2009/07/21(火) 16:05:47
sqlite3使って
db =SQLite3::Database.new("data.db")
sql =<<SQL
create table the_table(
name varchar(10),
age interger,
sex varchar(1)
);
SQL
db.execute(sql)
supername = ["God",1000,"n"]
db.execute("insert into the_table values("#{supername}")")
p db.execute("select * from the_table")
db.close
ってやってもエラー
式展開使えないですかね?
472デフォルトの名無しさん:2009/07/21(火) 16:16:48
"" で括られた文字列の中でさらに " を使いたい場合は、
覚えるの簡単な方法としては \ でエスケープする
db.execute("insert into the_table values(\"#{supername}\")")
473デフォルトの名無しさん:2009/07/21(火) 16:17:17
これはw
474デフォルトの名無しさん:2009/07/21(火) 16:23:38
SQLインジェクション対策じゃまいか
パラメタバインディング機能があるだろうからそっち使ったほうがいいかと
475デフォルトの名無しさん:2009/07/21(火) 16:30:04
あんまRuby関係ないようなな…
476471:2009/07/21(火) 16:41:08
>>472-475
おぉ!ほんとですね。Rubyあんまり関係なかったですね。
SQLを使ったのがruby-sqlite3が始めてだったんでそんなもんかと思ってました。
ありがとうございます
477デフォルトの名無しさん:2009/07/21(火) 17:35:24
ここはイテレーターを回して喜ぶスレです
ネットワークプログラミングもXMLやJsonもファイルシステムもDBも
Rubyとは一切関係ありません
478デフォルトの名無しさん:2009/07/21(火) 17:43:41
unko
479デフォルトの名無しさん:2009/07/22(水) 13:57:14
is_a? よりも kind_of? のほうが人気があるって本当?
480デフォルトの名無しさん:2009/07/22(水) 14:20:00
それはガチ
481デフォルトの名無しさん:2009/07/22(水) 14:35:06
なんで to_s, to_a なの?
to(String), to(Array) じゃダメだったの?
482デフォルトの名無しさん:2009/07/22(水) 14:36:49
それは String に自分の変換を依頼するということ?
483デフォルトの名無しさん:2009/07/22(水) 14:44:17
class Hoge
 def to(klass)
  case klass
  when String then self.data.to(String) # 旧来の to_s
  when Array then self.data # 旧来の to_a
  end
 end
end

こんな処理をしてもいいんじゃね、という話だと思う
484デフォルトの名無しさん:2009/07/22(水) 15:51:47
to_s to_i to_f to_a to_sym tojis tosjis toeuc toutf8 ...
メソッドオーバーロードのある言語ならいざ知らず
rubyではtoの変換候補が増える度にメソッドの上書きが酷い事になる

こんな方法考えたけどto_*を定義するより無駄が多いと感じる
def to(klass) ; send("to#{klass}") ; end
485デフォルトの名無しさん:2009/07/22(水) 15:57:55
あとは>482みたいな方法もあるが
それだとクラスを1つ作る度に組み込みクラスを拡張することになるね
486デフォルトの名無しさん:2009/07/22(水) 16:09:35
変換方法をブロックで与えればおk
・・・・・Rubyには立派なオブジェクトシステムがあるのに
何でわざわざディスパッチテーブルを
自前で書かねばならんのかとは思うけど
487デフォルトの名無しさん:2009/07/22(水) 22:50:58
rubyでhtmlパースして本文だけ抜き出そうとしてるんだけど、現在hpricot最強?
488デフォルトの名無しさん:2009/07/22(水) 22:52:09
nokogirlじゃなかったnokogiriというのが追い上げる展開。

489デフォルトの名無しさん:2009/07/22(水) 22:56:47
たぶん今はNokogiri最強

pure rubyでhtmlパースできるものがあればもっと最強なんだが
490デフォルトの名無しさん:2009/07/22(水) 23:17:57
Nokogiriが無難
HpricotはUTF-8に変換したHTMLを渡さないとどうにもならん
491デフォルトの名無しさん:2009/07/22(水) 23:36:07
Ruby会議でもアーロンさんのセッションを聞いていたんだけど、
Nokogiri は、内部で libxml を使っているとのことだけど、
Windows 版はどうなるの? セッション中でも、あるいは下記を見ても
Windows の Ruby でも nokogiri は使えるとのことですが、
http://d.hatena.ne.jp/kitamomonga/20090615/ruby_nokogiri_with_latest_libxml2_by_hand

windows の ruby で gem install nokogiri すると、dll とかが自動的にインストールされるのでしょうか?

関連して、Linux 等で外部のライブラリを使おうとする gem を、jruby 環境でインストールすると、どうなるの?
たとえば今回の nokogiri とか
492デフォルトの名無しさん:2009/07/22(水) 23:38:09
>>490
>HpricotはUTF-8に変換したHTMLを渡さないとどうにもならん
まじ?普通にEUC-JP渡してたんだが。
493デフォルトの名無しさん:2009/07/22(水) 23:54:41
>>491
Windows環境があるなら試せばいいじゃんそんなん
ちなみに gems\1.8\gems\nokogiri-1.3.1-x86-mswin32\ext\nokogiri\ ディレクトリに
iconv と libxml2 と libxslt と libexslt と zlib1 の dll が置かれて使用される
コミコミなのである意味バージョン差異問題とか一番めんどくさくないのがWindows
Linux とかのほうが実は面倒だったりする
494デフォルトの名無しさん:2009/07/23(木) 00:22:45
>>492
require 'rubygems'
require 'hpricot'
require 'kconv'
html = '<html><title>にほんご&nbsp;タイトル</title></html>'.toeuc
doc = Hpricot.parse(html)
p doc.at('title').inner_text == 'にほんご タイトル'.toeuc
p doc.at('title').inner_text == 'にほんご タイトル'.toutf8
p doc.at('title').inner_text == "にほんご#{Hpricot.uxs('&nbsp;')}タイトル".toeuc
p doc.at('title').inner_text == 'にほんご'.toeuc+ Hpricot.uxs('&nbsp;') +'タイトル'.toeuc

最後だけ true
つまり、文字参照のとこだけが強制的に UTF-8 の文字で挿入される
これはリクツ上仕方ないんだけれども、日本語 HTML にはなかなか厳しい
Hpricot のいいところはバイトの並びが保存されて文字コードが不変とみなせるとこなんだが、
ここであっさり綻びてる

古いバージョンの ? で置換されてたころのほうがまだマシだったという悲しいオチが
495デフォルトの名無しさん:2009/07/23(木) 00:40:26
Nokogiri は Ruby1.9 で

#!ruby1.9
# -*- coding: utf-8 -*-
require 'rubygems'
require 'nokogiri'
require 'kconv'

html = '<html>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>日本語!</title></html>'.tosjis
doc = Nokogiri::HTML.parse(html)

p Marshal.dump(doc.at('title').inner_text)
p Marshal.dump('日本語!'.toutf8)

これが

"\x04\bI\"\x11\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E\xEF\xBC\x81\x06:\rencoding\"\x0EShift_JIS"
"\x04\bI\"\x11\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E\xEF\xBC\x81\x06:\rencoding\"\nUTF-8"

となるのを直したバージョンを早く公開して欲しい
496デフォルトの名無しさん:2009/07/23(木) 01:06:36
ああ、force_encoding してしまってるのか
1.9初期によくあったエンコーディング関連の勘違いのコードがまだ残ってるのかな
497491:2009/07/23(木) 10:36:46
>>493
レスどうもありがとうございました。
Windows 環境でやってみたところ、dll がダウンロードできました。
これは便利だ。

○本番環境は Linux で開発は Windows の場合、
 本番の Linux のディストリビューションの libxml のバージョンはいくつか?
  Windows 版で入るのはいくつか?
  本番のアプリケーションではどのバージョンで使いたいか?
  それを決めたら、それぞれの環境をそれに合わせる
といったことが必要そうですね。

JRuby ではこれからやってみます。
498デフォルトの名無しさん:2009/07/23(木) 11:01:18
Windows以外では、ユーザーディレクトリとかに最新版libxml2をインストールして
それを読むようにnokogiri.soを作るようにする以外の選択肢はないと思う
システムのlibxml2を最新版にできるなら問題はないんだが

libxmlは「何かバグがあったからバージョンを上げる」の典型なんで
古いバージョンは必ずバグ持ちだぞ
499デフォルトの名無しさん:2009/07/23(木) 13:30:39
本番で採用したらメンテ地獄に成る典型だな。
もうちょっと精査してからリリースすれば良いのに。
500デフォルトの名無しさん:2009/07/23(木) 14:02:11
libxml2 は 2.7.0 から 2.7.2 までが地獄
&amp; や &lt; を全部切り落とすとか意味不明仕様
ユーザー全員が自前でアプリケーション側を書き換えて対処したという逸話が
ttp://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=libxml2+WordPress&num=50
501デフォルトの名無しさん:2009/07/23(木) 14:03:45
よし、誰かElementTreeをHTML対応で移植してくれ
502デフォルトの名無しさん:2009/07/23(木) 14:25:39
2.7.2 ってバージョン番号は、そろそろ安定してくるころなんだがw
GCCを思い出してみると。
(?.x.y が x < y になるまで待てとか言われなくなったのがそのころ)
503デフォルトの名無しさん:2009/07/23(木) 16:47:40
>>495
それ最新でも?
504デフォルトの名無しさん:2009/07/23(木) 16:58:52
どうなんだろうね、github にあるのは直ってると期待したいところだが、
これで困るのは非 ASCII 文字圏ユーザーだけだから、
これまで誰も気にしなかったのと同様に案外誰も気づいてないかもしれないな
505デフォルトの名無しさん:2009/07/23(木) 17:03:15
標準添付への道は遠いな
506デフォルトの名無しさん:2009/07/23(木) 17:11:04
いや、有名だと言われてるライブラリでも専門外はこの程度ってことで
逆に自作公開モチベーションが上がるんじゃないかと思われるということにするのはどう
507デフォルトの名無しさん:2009/07/23(木) 17:25:59
git で gem ライブラリをいじって遊んでます
ある程度「できた」ライブラリを自分用に普段使いしたいんですが、
git 管理の lib ディレクトリをそのまま gem ライブラリのディレクトリの lib ディレクトリとして cp する方法しか思いつきません
なんかもうちょっとうまい方法ありませんか?
508デフォルトの名無しさん:2009/07/23(木) 20:21:19
>>507
自分でgemパッケージを再生成してインストールするというのはだめなん?
たぶんRakefileがあるはずだから、インストールも簡単だとおもうけど。
509デフォルトの名無しさん:2009/07/23(木) 21:14:08
しつもん
class A
class B; end
class C; end
end

というでっかいクラスがあって、これを継承したクラス K を作ります

class K < A
end

もともとの A::B のメソッドの中で A::C.new と書いてあった場合、
K で同じメソッドを呼んだら空気を読んで K::C.new が呼ばれたりしますか?
呼ばれない場合、もともとの A のクラスを書く人が
「A が継承される可能性」を考慮してクラス関係を記述する必要があったりしますか?
A::C.new と書く代わりに eval("#{self.class}::C").new と書く、みたいな
510デフォルトの名無しさん:2009/07/23(木) 21:16:27
yes
511デフォルトの名無しさん:2009/07/23(木) 21:22:26
>>509
> もともとの A::B のメソッドの中で A::C.new と書いてあった場合、
> K で同じメソッドを呼んだら空気を読んで K::C.new が呼ばれたりしますか?
Aと明示してるのにKが参照されたらバグだろ

> 呼ばれない場合、もともとの A のクラスを書く人が
> 「A が継承される可能性」を考慮してクラス関係を記述する必要があったりしますか?
ある

> A::C.new と書く代わりに eval("#{self.class}::C").new と書く、みたいな
が、evalはいらない
self.class::C.new
512デフォルトの名無しさん:2009/07/23(木) 21:39:39
前から思ってるんだけど

class A
class B; end
class C
class D
def initialize; B.new; end
end
end
end
A::C::D.new

これがエラーにならないのはおかしいと思う
D が知ってるのは A と C の2つと、D と同じ「深さ」に定義されてるクラスだけだと思うんだが
D から B は A::B という経路でしかアクセスできないのが当たり前に見える
513デフォルトの名無しさん:2009/07/23(木) 21:48:07
まあ、下手にパスっぽく表記されてるのでパス的構造を大事にしたい気持ちはわかる

class A
ConstA = "A"
class B
ConstB = 'B'
class C
ConstC = 'C'
def initialize; p ConstA, ConstB, ConstC; end
end
end
end
A::B::C.new

これが問題なく A,B,C を表示できるのに納得してもらえたなら話は早いんだけれど
知ってるクラスの定数はそのまま利用できるのがRubyの定数スコープ
514デフォルトの名無しさん:2009/07/23(木) 22:00:18
A::C と A::B::C の C は同一だってことだけどな

class A
class C
def msg; 'fine'; end
end
class B
class C
def msg; 'polluted'; end
end
p C.new.msg
end
end


"polluted"
515デフォルトの名無しさん:2009/07/23(木) 22:19:13
ファイルにeuc-jpで
puts "日本語"
と書かれたものを
cygwinコンソール(Shift_Jis)で文字化けせずに表示ってできますか?
516デフォルトの名無しさん:2009/07/23(木) 22:23:11
>>515
自動ではできません
puts するたびに tosjis などで変換するか、
ruby というシェルスクリプトを作ってそれを呼ぶかしてください
517デフォルトの名無しさん:2009/07/23(木) 22:45:24
>>516
なるほど、わかりました
ありがとうございます
518491, 497:2009/07/24(金) 02:22:57
JRuby でやってみた。JRuby 初体験。

Windows Xp / jdk 1.6.0 u12 / JRuby 1.3.1

JRuby をインストールして c:\Ruby\jruby-1.3.1\bin にパスを通した後、

c:\> jruby -S gem install nokogiri
で入った。

c:> nokogiri http://www.ruby-lang.org
c:/Ruby/jruby-1.3.1/bin/../lib/ruby/1.8/ffi/library.rb:18:in `ffi_lib': Could not open any of [xml2, xslt, exslt] (LoadError)
  from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/lib/nokogiri/ffi/libxml.rb:5
  from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/lib/nokogiri/ffi/libxml.rb:31:in `require'
  from c:/Ruby/jruby-1.3.1/bin/../lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
  from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/lib/nokogiri.rb:10
  from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/lib/nokogiri.rb:31:in `require'
  from c:/Ruby/jruby-1.3.1/bin/../lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
  from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/bin/nokogiri:7
  from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/bin/nokogiri:19:in `load'
  from c:\Ruby\jruby-1.3.1\bin\nokogiri:19

ruby 本体の ffi でエラーになっている。
JRuby で gem で nokogiri をインストールすると、>>493 さんのいうような libxml2 の dll などは
もちろんインストールされない。

でも ffi は JRuby でも有効だそうなので(ググってみたところ)、JRuby に Java で実装した
libxml2 のライブラリを自分で作って(作れないけど)含めれば、JRuby で nokogiri も動くかも、ということなのだろう。
519デフォルトの名無しさん:2009/07/24(金) 04:54:07
>>494
たまに起こる文字化けそれかー。
じゃあ

html = '<html><title>にほんご タイトル</title></html>'.toutf8
doc = Hpricot.parse(html)
p doc.at('title').inner_text.toeuc

ってやればいいってことだよね。
toeucとtoutf8の2回やると精度落ちそうだな・・・
520デフォルトの名無しさん:2009/07/24(金) 05:38:09
この問題の根っこは

 「&nbsp; に対応する文字が Unicode の No-Break Space(U+00A0、C2A0) にマッピングされてる」
 「日本語文字コードには該当文字が存在しない」

の2つ
だいたいの用途においては

 「&nbsp; を通常のホワイトスペースと混用して利用されても構わない」
 「ただし、&nbsp; の存在が完全に取り除かれるのは困る」

だと思われるので、
ttp://d.hatena.ne.jp/kitamomonga/20090610/ruby_hpricot_enables_char_entity
にあるように、

Hpricot::NamedCharacters['nbsp'] = 32

として &nbsp; の置換文字データをふつうのホワイトスペースに設定しなおすというのが次善
&#160; とか &#xA0; とか数値実体参照で書かれてる場合には無力だけど、
大部分はこれでなんとかなるだろう
下手に返り値を toeuc とかすると、 EUC-JP や Shift_JIS にない文字である C2A0 は取り除かれるぞ

irb>p "にほんご\302\240タイトル".toeuc == 'にほんごタイトル'.toeuc
true

521デフォルトの名無しさん:2009/07/24(金) 06:14:16
doc.at('title').inner_text.gsub(/\302\240/n){' '}

解決
522デフォルトの名無しさん:2009/07/24(金) 06:24:30
nokogiriもUTF8でかえってくるみたいだから、結局どっちでもおなじなんじゃないの?
523デフォルトの名無しさん:2009/07/24(金) 06:44:33
Hpricot は元々の HTML の文字コードが「保存」されてる
SHIFT_JIS の HTML をパースすれば、それの inner_text は(上記例外がなければ)必ず SHIFT_JIS 文字列
パースの時点で失われる文字はたぶん無い

Nokogiri は libxml2 の仕様で、HTML の文字コードがなんであっても inner_text は UTF-8 で返ってくる
内部では iconv を使ってるので、引数指定した or meta で見つけた charset で存在し得ない文字が
HTML に含まれてるとエラーを(無言で)出してその文字だけすっ飛ばしてパース処理される

「も」ではなく、UTF-8 で返ってくるのは Nokogiri だけ
524デフォルトの名無しさん:2009/07/24(金) 09:56:31
>>514
じゃあ定数は旧来のグローバル変数の被りと同じような問題持ってるじゃん
525デフォルトの名無しさん:2009/07/24(金) 11:00:19
>>514
> A::C と A::B::C の C は同一だってことだけどな
違うだろ。

> p C.new.msg
> end
C.new.msg #=> "fine"
> end
526デフォルトの名無しさん:2009/07/24(金) 12:26:52
これは再オープンされる
きちんとコピペしたか?
527デフォルトの名無しさん:2009/07/24(金) 12:34:29
test/ ディレクトリの test_ で始まるファイルをテストしたいです
ls test/test_*.rb | while read line do ruby $line done みたいにすれば動作はしますが、
毎回 ruby を起動しててなんか遅いし気持ち悪いです
528デフォルトの名無しさん:2009/07/24(金) 12:56:25
>>526
$ /usr/bin/ruby -v -e 'class A; class C; end; class B; class C; p ancestors; end; end; end'
ruby 1.8.6 (2008-08-11 patchlevel 287) [universal-darwin9.0]
[A::B::C, Object, Kernel]

$ /usr/local/bin/ruby18 -v -e 'class A; class C; end; class B; class C; p ancestors; end; end; end'
ruby 1.8.8dev (2009-06-16 ruby_1_8 23704) [x86_64-darwin9.0]
[A::B::C, Object, Kernel]

$ /usr/local/bin/ruby19 -v -e 'class A; class C; end; class B; class C; p ancestors; end; end; end'
ruby 1.9.2dev (2009-07-24 trunk 24260) [universal.x86_64-darwin9.0]
[A::B::C, Object, Kernel, BasicObject]
529デフォルトの名無しさん:2009/07/24(金) 12:58:42
>>527
testrb test
530デフォルトの名無しさん:2009/07/24(金) 13:06:50
あ、test/unit で、sleep できたかどうかをテストする方法ってないですか?
setup で作れないような内部オブジェクトのメソッドで sleep されるので、
setup で作った @obj に特異メソッド sleep を追加して横取りという手は使えなさそうな気がします
531デフォルトの名無しさん:2009/07/24(金) 14:25:19
>>527
$ ls test/test_*.rb | xargs -n1 ruby
でもいいし、Rubyインストールしたらtestrbというコマンドもついてくるはずなので
$ testrb test
でもいいかも
532デフォルトの名無しさん:2009/07/24(金) 14:29:28
せっかくだからruby使えよ
$ ruby -e 'Dir.glob("test/**/test_*.rb").each {|f| load(f)}'
533デフォルトの名無しさん:2009/07/24(金) 14:32:03
>>530
「sleep できたかどうか」ってどう判断するわけ?
Kernel#sleepは例外で中断されない限りは失敗しないし、中断されれば例外はtest/unitで捕捉されるだろ。
534デフォルトの名無しさん:2009/07/24(金) 14:35:23
sleep の待機時間の時間差でスレッドが連携するとかいう曲芸でない限り、
「sleep の前後のメソッドが動作した」
「sleep に渡す時間の値が妥当だった」
の2点調べれば用が済むような気もする
535デフォルトの名無しさん:2009/07/24(金) 15:03:30
スクリプトの中から、現在のスクリプトを実行しているRubyの実行ファイルのパスを知ることはできますか。

たとえば
/usr/bin/ruby foo.rb
なら /usr/bin/ruby を起動し、
/usr/local/ruby1.9/bin/fuby foo.rb
なら /usr/local/ruby1.9/bin/fuby を起動するようなスクリプトを考えています。
536デフォルトの名無しさん:2009/07/24(金) 15:12:23
535
たぶん
require 'rbconfig'
File.join(RbConfig::CONFIG.values_at('bindir', 'ruby_install_name'))
537デフォルトの名無しさん:2009/07/24(金) 15:17:35
インタプリタ名をRubyスクリプトから直接取得することはできません
プロセス一覧とカレントディレクトリを総合的に考えて引くしかなさそう

特殊な起動したときに外してもいいのなら、
>>536のようにシステムにインストールされてる ruby を調べる方法がある
538デフォルトの名無しさん:2009/07/24(金) 15:18:33
>>535
環境依存でよければ File.readlink("/proc/#{$$}/exe") とか。
539デフォルトの名無しさん:2009/07/24(金) 19:30:54
>>536-539
ありがとうございます。
536の方法をベースに、RbConfigがあればそれを使い、なければ 'ruby' を使うことにします。

540デフォルトの名無しさん:2009/07/24(金) 20:43:45
http://www.ruby-lang.org/ja/documentation/
を開くと
「もしあなたがプログラミングの初心者で、他の言語の経験がなければ、最初にチュートリアル を読むとよいでしょう。」
って書いてあったのでそのリンクをクリックすると

Not Found
The requested URL /~shin/tutorial/index.rb was not found on this server.

でした。本当にありがとうございました。
rubyかpythonかで迷っていたんですが、迷わずpythonを選ぶことができました。
pythonのチュートリアルページは大変面白くて分かりやすいです。
541デフォルトの名無しさん:2009/07/24(金) 21:03:03
先週末までは存在した外部サイトだからな
追随できなくても仕方がない
542デフォルトの名無しさん:2009/07/24(金) 21:06:03
         ┌─┐
        │●│
        └─┤
       _   ∩
      ( ゚∀゚)彡
    ┌─┬⊂彡
    │●│ おっぱい!おっぱい!
    └─┘      おっぱい!おっぱい!
543デフォルトの名無しさん:2009/07/24(金) 21:21:54
ほんとだ、18日まではあったっぽいね
544デフォルトの名無しさん:2009/07/24(金) 21:40:22
545デフォルトの名無しさん:2009/07/24(金) 21:44:43
他人様の gem の Manifest.txt って手で変更するん?
546デフォルトの名無しさん:2009/07/24(金) 21:49:36
生成方法が不明なら手書きしかないな
変な自動生成しても二度手間だし
547デフォルトの名無しさん:2009/07/25(土) 19:32:01
548デフォルトの名無しさん:2009/07/25(土) 19:36:31
>>495
ttp://gist.github.com/154667
たぶん次のリリースでは直るだろ
549デフォルトの名無しさん:2009/07/26(日) 02:27:17
vine linuxでrubyをやろうと思うんですが、エディタは何がイイですか?
GUIではnetbeans入れてみたのですが、emacsかviどちらがいいでうか?
どっちもまだ触ったばかりです。
550デフォルトの名無しさん:2009/07/26(日) 03:56:51
551デフォルトの名無しさん:2009/07/26(日) 04:22:49
>>549
emacsもviもクセのあるエディタだから、どちらが自分の好みかを先に決めた方がいい

>>550のスレって読んでわかるか?
552デフォルトの名無しさん:2009/07/26(日) 04:25:59
[[A,B,C]
[a,b,c]
[1,2,3]
]
のA,a,1だけを取得する時はどうすればいい?
553デフォルトの名無しさん:2009/07/26(日) 04:29:52
>>552
data = [[A,B,C], [a,b,c], [1,2,3]]

result = Array.new
data.each do |a|
result << a[0]
end

p result

または

data = [[A,B,C], [a,b,c], [1,2,3]]
p data.map{|a| a[0]}
554デフォルトの名無しさん:2009/07/26(日) 04:34:43
>>549
そう聞くということは Emacs も vim も使えない状態だと思うのでひとまずは Emacs
理由は、Ruby スクリプト書くことにしか労力をつぎ込めないから

vim はキー操作が邪魔にならなくなるまでがとりあえず面倒だし、
NetBeans/Eclipse は「使わない」機能がてんこもりだ

Ruby の学習書レベルは、着色程度以外特に何の補助もないエディタで書くことを想定してる
555デフォルトの名無しさん:2009/07/26(日) 04:36:58
>>553
新しく作ってそこに毎回プッシュするか、mapで毎回おいておくかですね。
ありがとうございます。
556デフォルトの名無しさん:2009/07/26(日) 04:43:33
ねこび〜んやEclipseは他の言語、具体的にはJava、でIDEを使ってた人向け

ちょうど、EmacsやVimで文章やスクリプトを書いてた人がruby-modeを求めて使うのに近い
557デフォルトの名無しさん:2009/07/26(日) 14:37:25
>>552
富豪的でもよければ data.transpose[0]
558デフォルトの名無しさん:2009/07/26(日) 14:41:08
map のほうがわかりやすそうな transpose のほうが本質的なような微妙な感じだな
559デフォルトの名無しさん:2009/07/26(日) 18:51:02
オペレーティングシステムのバージョンを調べる方法ってありますか?
Windows2000とXPを判別したいのですが。
560デフォルトの名無しさん:2009/07/26(日) 19:00:58
Windowsならrequire 'Win32API'して
GetVersionExとかGetProductInfoを呼べばいいんじゃない?
561デフォルトの名無しさん:2009/07/26(日) 19:06:59
testrb1.8 がステキなんですが、ruby -w で試すとかそういうオプションはありませんか
最後に gem の Rakefile を rake したときに初めて大量の警告に気づくとかもう嫌です
562デフォルトの名無しさん:2009/07/26(日) 23:57:35
>>559
お手軽にcmd.exe の内部コマンドのverを呼んでみるとか
puts `ver`.strip

Microsoft Windows 2000 [Version 5.00.2195]
とか
Microsoft Windows XP [Version 5.1.2600]
とか得られる
手元に 2000とXPしかないんで Vistaとか7はどうなるのかは知らない
563デフォルトの名無しさん:2009/07/27(月) 00:13:39
Windows2008 x64環境でRailsをやりたいんですが

Ruby本体はx64でビルドできたけど
mongrelとかが色々エラー出て


Rubyはx64、mongrelはx86とかって大丈夫なんでしょうか?

両方x86にしたほうがよい?
564デフォルトの名無しさん:2009/07/27(月) 00:16:48
両方x86
565デフォルトの名無しさん:2009/07/27(月) 03:19:46
>>562
なるほど。良い方法ですね。ありがとうございます。
566デフォルトの名無しさん:2009/07/27(月) 03:24:46
>>560 の方が無難かと
567デフォルトの名無しさん:2009/07/27(月) 08:28:53
えー。でもAPIの知識無いし、こっちの方が割と簡単だし。
ライブラリがあれば良いんだけどね>(制作希望)
568デフォルトの名無しさん:2009/07/27(月) 08:53:48
RubyではWindowsは嫌われてるから無理
569デフォルトの名無しさん:2009/07/27(月) 09:52:10
挨拶文に入れたいとかいう用途ならまだしも、Windowsのバージョンが必要になる処理って
どうせWindows api使うんじゃないの
570デフォルトの名無しさん:2009/07/27(月) 09:58:18
     よく2chの情報はいい加減とか、正しくない情報が多いとか言われるけど、
    僕にとっては大事な情報源です。
    たまにはボロクソ言われることもあるけど、みんな親切に教えてくれる。
    いつもありがたいと思ってる。
571デフォルトの名無しさん:2009/07/27(月) 10:15:29
Windowsのバージョン表示してくれる、verというコマンドがあるらしいよ
572デフォルトの名無しさん:2009/07/27(月) 10:16:42
573デフォルトの名無しさん:2009/07/27(月) 11:48:18
windows-prでwindow/system_infoに定義はされてるから
数行ですぐできるんじゃないかなとやってみたけど
OSVERSIONINFO構造体作るのがめんどくさかった

APIコール用の構造体を作るのに便利な方法ってある?
574デフォルトの名無しさん:2009/07/27(月) 11:51:56
あるが、残念ながら俺専用だ
575デフォルトの名無しさん:2009/07/27(月) 13:30:51
>>570
どこを縦読みするんですか。2行目ですか。
「くにまつ」
国松さんですか。
576デフォルトの名無しさん:2009/07/27(月) 14:04:12
逆です。「妻肉」です。
577デフォルトの名無しさん:2009/07/27(月) 21:54:47
>>568
嫌われているつーか
Windows上でRuby使うのは色々と余計な苦労が多いし
578デフォルトの名無しさん:2009/07/27(月) 21:59:33
むしろWindowsにRubyが嫌われている。
579デフォルトの名無しさん:2009/07/27(月) 22:00:48
Windowsはいろいろと使いづらい。
ライブラリもWinに特別なロジック与えているし。
システムプログラミングもやってらんね、って感じだな。
580デフォルトの名無しさん:2009/07/27(月) 22:22:49
MacもUNIXになっちまったから、非UNIXはいろいろ立場がつらいよね。
581デフォルトの名無しさん:2009/07/27(月) 23:36:00
Windowsの場合は、C#の誘惑が強すぎて、rubyを捨てるか悩むことになる
582デフォルトの名無しさん:2009/07/27(月) 23:40:55
そんなに競合する言語だとは思わないけどなあ
583デフォルトの名無しさん:2009/07/27(月) 23:56:24
ぜんぜん競合してないよ。だからC#でやれば楽なんじゃん
584デフォルトの名無しさん:2009/07/27(月) 23:56:55
IronRuby でいいじゃん
585デフォルトの名無しさん:2009/07/28(火) 05:30:11
WindowsAPIを簡略化して利用できるようなラッパークラスがあれば良いんだけどな。
Windows標準の構造体や手続きを集約させて、ruby的に利用できる形にしたような物。

あとは、適当にそこから派生させて、ファンクションコールを書いていけば、割と簡単な気がする。
586デフォルトの名無しさん:2009/07/28(火) 07:04:27
>>585
それがMS的にMFCだったのだろ?
587デフォルトの名無しさん:2009/07/28(火) 07:22:25
>>585
Visuaruby
588デフォルトの名無しさん:2009/07/28(火) 09:20:21
>>585
数が膨大なので「集約」が辛すぎる。
589デフォルトの名無しさん:2009/07/28(火) 09:27:49
てかそれができるなら新たにWindows用プログラム言語がひとつ作れるな(w
590デフォルトの名無しさん:2009/07/28(火) 09:30:15
むかし、typedefを抜き出してまとめてみたことがある
http://ponte.s206.xrea.com/typedef/
591デフォルトの名無しさん:2009/07/28(火) 09:31:25
Ruby on windows
592デフォルトの名無しさん:2009/07/28(火) 10:03:19
>>586
じゃあ、MFRだなw
593デフォルトの名無しさん:2009/07/28(火) 10:05:39
いや、RubyFoundationClassか。
594デフォルトの名無しさん:2009/07/28(火) 10:07:47
>>590
うはw
吐き気がしたw
595デフォルトの名無しさん:2009/07/28(火) 10:28:51
労多くして益少なしか。

エレガントじゃないコードを、豊富な財源と大量の人員投入という力業で成してるのがWindowsなのか・・・
596デフォルトの名無しさん:2009/07/28(火) 11:00:35
質問です。
Linux上でbashシェルスクリプトをRubyに移植しているのですが、外部コマンド
実行後のコマンド終了ステータスを調べる方法がわかりません。具体的な外部
コマンドはzenityというコマンドですが、シェルスクリプトでは

zenity --question
echo $?

とすると、ダイアログが出て[OK]を押すと$?に0が返ってきて[キャンセル]を押
すと1が返ってくるので、そのまま判定できるのですが、rubyだとirbで見たところ

rb(main):001:0> msg=`zenity --question`
=> ""
irb(main):002:0> p msg
""
=> nil
irb(main):003:0> $?
=> #<Process::Status: pid=17975,exited(1)>

$?には返ってきているみたいですが、どう判定に利用したらいいのかわかりません。
こういう時はどうすればいいのでしょうか?
597デフォルトの名無しさん:2009/07/28(火) 11:17:13
598デフォルトの名無しさん:2009/07/28(火) 11:20:45
system('ls hoge')
puts "hogeはありません" unless $?.exitstatus.zero?
599デフォルトの名無しさん:2009/07/28(火) 13:37:41
>>598
unless system('ls hoge')
puts "hogeはありません"
end

systemはコマンドが成功(EXIT_SUCCESSで終了)したときtrue、
それ以外でfalse
600デフォルトの名無しさん:2009/07/28(火) 13:46:32
Ruby.NET
601デフォルトの名無しさん:2009/07/28(火) 13:52:13
>>599
>>596読め
systemメソッドかどうかで使い道が違うようではイカン
602デフォルトの名無しさん:2009/07/28(火) 14:08:50
>>601
> シェルスクリプトでは
> zenity --question
> echo $?
と書いてるのでzenityの出力をとりたいんではないと思うんだが。
つまり>>596のやりたいことはこうではないかと。

if system("zenity", "--question")
 puts "OK"
else
 puts "Cancel"
end
603デフォルトの名無しさん:2009/07/28(火) 14:13:19
説明しよう! zenity とは、
「OK / キャンセル等の各種コモンダイアログを表示し、どのボタン等がマウスで押されたかを整数で返す」
という、組み合わせで超便利になる Gnome コマンドだ!

よって今回必要なのは終了コードだけだな
604デフォルトの名無しさん:2009/07/28(火) 14:34:21
しっかしzenityって仰々しい名前だよなw
XとかKDEみたいにGDialogとかじゃいけなかったんだろうか
605デフォルトの名無しさん:2009/07/28(火) 14:40:39
つまり本当に書くべきコードは 0 か 1 で分岐するこれか

case system('zenity', '--question', '--text 押してくだし')
when 0 then
puts 'OKが押されました'
when 1 then
puts 'キャンセルが押されました'
else raise 'UnknownError'
end
606デフォルトの名無しさん:2009/07/28(火) 15:11:54
>>605
お前通信簿に「人の話を聞かない」ってよく書かれてたろ
607デフォルトの名無しさん:2009/07/28(火) 15:37:49
>>606
終了ステータス 0 以外は任意なのよ
1 が異常終了と決まったわけでもない

zenity はあくまでメッセージとして 0 と 1 を送信してるんだろうから、case 分岐がたぶん妥当だと思われ
608デフォルトの名無しさん:2009/07/28(火) 15:41:41
だから、ドキュメント読めよ。 systemの戻り値は終了ステータスか?
609デフォルトの名無しさん:2009/07/28(火) 16:11:51
10個前のレスも読まないやつがドキュメント読むかよ
610デフォルトの名無しさん:2009/07/28(火) 17:19:05
rubyのchasenモジュールで40,000文字(バイト)越えたあたりで
セグメントエラーでるのって直しようない?
611デフォルトの名無しさん:2009/07/28(火) 17:28:26
rubyでやるのが間違い。perlかphpで。
612デフォルトの名無しさん:2009/07/28(火) 17:51:32
>>610
バイト数が違うけどこれじゃないのか?
ttp://chasen.aist-nara.ac.jp/chasen/faq.html.ja#B-1
613デフォルトの名無しさん:2009/07/28(火) 18:07:17
>>612
puts str.size
Chasen.sparse(str)
でセグメントフォルトでるまでやると40000までいって落ちる
‘chasen file_name‘だと落ちない

>>611
パール勉強するか・・・
614デフォルトの名無しさん:2009/07/28(火) 18:58:53
「優秀なマネージャ」と思えない。
仕事での過去の駄目マネージャたちを思い出して参加する気が萎える。
615デフォルトの名無しさん:2009/07/28(火) 19:02:38
>>614
本スレにお帰りください
616デフォルトの名無しさん:2009/07/28(火) 19:05:49
ここは学生プログラマ対象でつ
617デフォルトの名無しさん:2009/07/29(水) 00:12:55
"\\d+\\-\\d+"
でいちいち\エスケープしないで済む表記ってないの?
618デフォルトの名無しさん:2009/07/29(水) 00:21:14
>>617
""のかわりに''で囲めば、'と"に付けたエスケープだけが解釈される。
619デフォルトの名無しさん:2009/07/29(水) 00:23:08
'と"じゃない、'とばっくすらっしゅ
620デフォルトの名無しさん:2009/07/29(水) 01:12:10
サンクス
''は\\を解釈するもんだと思ってたけどそれに加えて\単体でもいいのか。
文字列リテラル読み返したら確かにそう言ってるな。微妙に勘違いしてた。
621デフォルトの名無しさん:2009/07/29(水) 01:20:41
だれか、Refe2の簡単な入れ方おせーて
622デフォルトの名無しさん:2009/07/29(水) 02:15:44
623デフォルトの名無しさん:2009/07/29(水) 10:02:43
ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-freebsd7]
で、

xxx.rb
----
begin
raise Exception, "xxx"
rescue
puts "exception!!!"
puts $!
end
----
というファイルをrequireすると、例外が補足出来ないですが、回避方法ありますか?

↓結果
C:\home\temp>irb
irb(main):001:0> require 'xxx'
./xxx.rb:4: xxx (Exception)
from C:/home/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
from C:/home/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from (irb):1:in `irb_binding'
from C:/home/ruby/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
from C:/home/ruby/lib/ruby/1.8/irb/workspace.rb:52

624デフォルトの名無しさん:2009/07/29(水) 10:04:20
↑バージョン間違えました。
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
ちなみに、上記のバージョンでもエラーメッセージは多少違いますが、同様の挙動です。
ついでに言うと、JRuby 1.3.1でも同様です。

$ irb
irb(main):001:0> require 'xxx'
Exception: xxx
from ./xxx.rb:2
from (irb):1:in `require'
from (irb):1
625デフォルトの名無しさん:2009/07/29(水) 10:19:26
無指定rescueはExceptionクラスを拾わない
http://www.ruby-lang.org/ja/man/html/_C0A9B8E6B9BDC2A4.html#begin

だからrescue Exception・・・にするよりは投げる例外をStandardErrorなどにしたほうがいい
626デフォルトの名無しさん:2009/07/29(水) 10:32:02
rescueで例外を拾えばおk
627デフォルトの名無しさん:2009/07/29(水) 10:35:28
てか、raise するだけの場合はメッセージだけ書いて RuntimeError 出すのでいいじゃん
引数で Exception クラス自体を指定する人は久しぶりに見た

あと irb で自作スクリプト読ませて実行したいときは require じゃなく load 使うといいぞ
628デフォルトの名無しさん:2009/07/29(水) 11:57:50
1年半振りぐらいにまたRubyでもしようかと思っています。

バージョンが1.9.1とすごく上がっているのですが、今PCに入っている1.8.6からバージョンアップした
ほうがいいのでしょうか?

スキルは初心者を少し抜けたぐらいだと思います。
1.9.1を入れたほうがいいとした場合、お薦めの書籍を教えてください。
629デフォルトの名無しさん:2009/07/29(水) 12:02:13
>>628
>>1よく読んでくれ
630デフォルトの名無しさん:2009/07/29(水) 12:13:43
>>629
dです。

1.8.7がいいとのことですね。
了解。
631デフォルトの名無しさん:2009/07/29(水) 12:32:34
> 【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】

今年になって出てる書籍は1.9対応の方が多いと思うが、
このテンプレおかしくないか?
632デフォルトの名無しさん:2009/07/29(水) 12:48:20
ここで言うサポートというのは「1.8 系列の解説を参考にしなくても単体でわかるもの」だろ
1.8 がメインで 1.9 がコラムとしてくっついてるという程度ではまだ駄目
今の俺らが 1.6 系列や 1.8.2 時代の情報を無いものとして扱ってるのと同程度になってるもの

「Rubyの文字列は文字列データ本体とエンコーディング情報がペアになっています」

というカンジの、1.8 を切り捨てた説明の書籍やサイトがどんどん出れば消してもいいと思うけど…
633デフォルトの名無しさん:2009/07/29(水) 13:03:54
まつもと某などの開発者インタビューを見ると、
1.9のほうが便利だからもう移って欲しいって書いてあったぞ
634デフォルトの名無しさん:2009/07/29(水) 13:04:55
>>633
スレタイ200回くらい嫁
635デフォルトの名無しさん:2009/07/29(水) 13:25:29
初心者なら 1.9 からはじめてもいいんじゃないの。

ttp://www.atmarkit.co.jp/news/200907/24/ruby.html
636デフォルトの名無しさん:2009/07/29(水) 13:28:21
Railsがruby 1.9を正式サポートするまではダメだろ

今は起動ぐらいはするんだけど、ちょっと突っ込んだことをやろうとすると
やっぱりダメだし

637デフォルトの名無しさん:2009/07/29(水) 13:30:41
PHPやPythonのバージョンいくつが主流かを考えると……
638デフォルトの名無しさん:2009/07/29(水) 13:33:36
>>635
やってみ
本質的でない情報不足で詰まること請け合い

情報不足で詰まりかねない 1.9.1 を初学者に使わせるくらいなら、
俺は情報たっぷりで「誰もまだやってない」分野が上記よりはぐっと少ない 1.8.7 を強く推す
639デフォルトの名無しさん:2009/07/29(水) 13:35:44
初心者にとって一般ユーザーから得る恩恵は大きいんだから
一般ユーザーに移行を促したこのタイミングはないだろ
640デフォルトの名無しさん:2009/07/29(水) 13:38:07
Windows機を買うのにXPとVistaどっち選ぶ?って感じ
MicroSoftなら当然Vistaを推すよね
641デフォルトの名無しさん:2009/07/29(水) 13:40:27
つか「1.8.7を学んでRubyに慣れてから1.9.1に移行する」というプランの何がまずいのよ
寿命があと2ヶ月だとかそういうのならRubyなんて忘れて親孝行とかしろ
642デフォルトの名無しさん:2009/07/29(水) 13:48:58
世の中には

 ・ エッジな人
 ・ 活発な人
 ・ 初学者・利用オンリーユーザー

の3種類がいる

エッジな人は1.9.0時代から使い倒してて、地雷とか踏み抜いて今は1.9.2preで遊んでる
活発な人は1.9.1を使うべきで、それなりに試行錯誤しつつ自作ライブラリやらを踏み固める
初学者や利用者は素直に1.8.7を使うべき
次(か、その次)のフェーズでは、初学者や利用者にも1.9.xが適するようになっていることだろう
643デフォルトの名無しさん:2009/07/29(水) 14:12:31
とりあえずテンプレ維持だな
次の質問の方どうぞ
644デフォルトの名無しさん:2009/07/29(水) 14:27:00
>>642
初学者は1.9.1じゃないの?
使い方が分かってきたころに覚えなおしとか、まぞい。
645デフォルトの名無しさん:2009/07/29(水) 14:27:04
>>643
>>631と言いたくなる気持ちはわかるし、語弊は減らしておかない?

【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだ不十分です】
646デフォルトの名無しさん:2009/07/29(水) 14:27:13
lib/aaa/hoge111.rb
lib/aaa/hoge222.rb
lib/aaa/hoge333.rb

という AAA::Hoge111 クラス等があります
hoge 関係が多くなったので、

lib/aaa/hoge/hoge111.rb
lib/aaa/hoge/hoge222.rb
lib/aaa/hoge/hoge333.rb

というようにディレクトリ掘って整理しました
この場合、他からこんな経緯はわからないわけで、
やっぱり AAA::Hoge::Hoge111 というように、ディレクトリに対応してクラスもネストさせるべきでしょうか?
647デフォルトの名無しさん:2009/07/29(水) 14:29:07
>>644
だからやってみろって
1.9.1オンリーで
「使い方がわかった」というところまで行かないから
648デフォルトの名無しさん:2009/07/29(水) 14:29:26
>>644
急がば回れって言うだろ?
649デフォルトの名無しさん:2009/07/29(水) 14:29:56
>644
いや、それはそんなにマゾくないと思うぞ。
基本が解ってれば追加情報だけで良いんだから。
初心者にはその基本が解るまでの間が一番マゾいワケで
そんな間に検索しても解らないような問題にブチ当たるのが一番マゾいかと。
650デフォルトの名無しさん:2009/07/29(水) 14:35:00
>>646
はい
サブディレクトリ構造はクラスネスト構造に対応「しているべき」

hoge 関連だからって AAA::HogeLoader を hoge ディレクトリにまとめてはいけない
めんどくさいけどね
651デフォルトの名無しさん:2009/07/29(水) 14:36:57
>>646
そもそも名付け方が迷走してる気がするw
AAA::Hoge::Fooとかにはできないの?
652デフォルトの名無しさん:2009/07/29(水) 14:41:36
クラス構造がディレクトリ構造と同一だとうれしいけど
別にそうでなくても構わない。。

lib/aaa/hoge/111.rb
lib/aaa/hoge/222.rb
lib/aaa/hoge/333.rb

あと、名前規則はこうであってほしい
653デフォルトの名無しさん:2009/07/29(水) 14:44:36
1.8.7 使うくらいなら 1.9.1 でいいと思うけど
654デフォルトの名無しさん:2009/07/29(水) 14:51:23
hoge に当たるものが実は Error とかだったりしたらどうしようとドキドキです
655デフォルトの名無しさん:2009/07/29(水) 14:57:55
あー
11111Error

Error::11111
にしたら座り悪いことこの上ないな

ユーザーがまず参照しないようなファイルであるなら、ちょっとくらい変な構造でも問題ないと思う
656デフォルトの名無しさん:2009/07/29(水) 15:03:24
>>654-655
Errorごときでそんなにファイル作るなよw

それにHoge::Hoge111はイヤだけど
Hoge::111Hogeならそんなに悪くもない
657デフォルトの名無しさん:2009/07/29(水) 15:16:29
ディレクトリを切る以上、(出来れば)
require 'aaa/hoge/111'
だけで、単独で使えるようなクラスにしてほしい
658デフォルトの名無しさん:2009/07/29(水) 15:19:32
全世界の gem ライブラリ作者から>>657様宛に抗議のファクシミリがぞくぞく届いております
659デフォルトの名無しさん:2009/07/29(水) 15:30:40
hoge/111.rbがrequire 'hoge'して結局全部ロードってことでよろしいか?
660デフォルトの名無しさん:2009/07/29(水) 15:51:23
ライブラリ利用者がスクリプト書き換えないで済むならOK
利用者が自分だけならもう何やってもいいよ
661デフォルトの名無しさん:2009/07/29(水) 17:40:08
>>646
しなくていいと思うよ
そもそもクラスとファイル構造を、完全に対応させる必要はない
(ライブラリなら話はまた変わってくるが)
662デフォルトの名無しさん:2009/07/29(水) 17:47:51
>>632が少なくともここ半年、
Ruby関連の本をろくに読んでないことは分かった
663デフォルトの名無しさん:2009/07/29(水) 17:59:46
>>661
パスが lib で始まってるのはたいていライブラリだ
勉強になったな
664デフォルトの名無しさん:2009/07/29(水) 19:38:46
>>646
>やっぱり AAA::Hoge::Hoge111 というように、ディレクトリに対応してクラスもネストさせるべきでしょうか?

クラス構造とディレクトリ構造が対応していたほうがわかりやすいけど、
絶対そうすべきだというほどでもない。
そのライブラリのユーザとしては、「使う人」と「(ソースを)読む人」が考えられると思うけど、
まずは「使う人」の都合を最大限に優先し、その邪魔をしない範囲で「読む人」のことを考えればいいんじゃないかなあ。

665デフォルトの名無しさん:2009/07/29(水) 19:43:37
実際問題として多言語がらみで1.9で使えないライブラリとかアプリがまだまだある。
ほとんどなくなるまでは初心者には1.8推奨。
666デフォルトの名無しさん:2009/07/29(水) 20:03:08
それおまえの個人的な推奨だろ
スレの推奨ってわけじゃないから「おれ推奨」とかにしてくれよ
スコープは明確にしてくれ
667デフォルトの名無しさん:2009/07/29(水) 20:09:34
まあ何言ってもおまえの意見でスレは変わらないから
俺でも何かできたという夏の思い出作りは他所でやってくれ
668デフォルトの名無しさん:2009/07/29(水) 20:14:36
???

まあ何か気持ち悪いしどうでもいいや・・・
669デフォルトの名無しさん:2009/07/29(水) 20:17:10
おれ推奨(笑)
670デフォルトの名無しさん:2009/07/29(水) 20:18:55
>>663
ダウト

たとえばaaaという名前のアプリケーションであれば
lib/aaa/ 以下にアプリケーションのコードを入れることがある
この場合、「ライブラリである」とは言えない
671デフォルトの名無しさん:2009/07/29(水) 20:19:55
>>665
他言語が絡まなくても、動かない拡張ライブラリがあまりにも多いからなー
どう考えても初心者に1.9.xを推奨できる段階ではない
672デフォルトの名無しさん:2009/07/29(水) 20:23:44
毎度ループしているな
673デフォルトの名無しさん:2009/07/29(水) 20:27:25
山崎パンスレがここにあると聞いてやってまいりました
674デフォルトの名無しさん:2009/07/29(水) 20:38:02
動かないとかどうせ試してもないで言ってるんだろうけどな。
まあどこのスレもたぶんそんなもんだw
675デフォルトの名無しさん:2009/07/29(水) 20:50:45
>>674
現時点でnokogiriが動かないんですが何か
676デフォルトの名無しさん:2009/07/29(水) 21:07:59
おれが使ってるのはNokogiriじゃなかったのか
677デフォルトの名無しさん:2009/07/29(水) 21:09:20
nukogirlだったとかいうオチ
678デフォルトの名無しさん:2009/07/29(水) 21:19:37
679デフォルトの名無しさん:2009/07/29(水) 21:44:53
とりあえず1.9.1p0(mswin32)で色々入れて、requireで検証してみた
ちなみにgithub(のgemレポジトリ)はデフォルト設定じゃないので除外

Nokogiri 1.2.3:Segmentation Fault
Mechanize 0.9.3:Nokogiri使ってるので無理
Hpricot 0.6.164:Segmentation Fault
WxRuby 2.0.0:Segmentation Fault
SQLite3-ruby 1.2.5:動く

予想以上にひどい状況だった
680デフォルトの名無しさん:2009/07/29(水) 21:49:48
hpricotは0.7以降で調べてみて。
681デフォルトの名無しさん:2009/07/29(水) 21:51:26
あああ、githubは除外したのね。
682デフォルトの名無しさん:2009/07/29(水) 22:04:38
p0ってw話に出たNokogiriも1.2系とか
昔のバージョン引っ張り出して文句言うのはおかしいと思わないのか?
683デフォルトの名無しさん:2009/07/29(水) 22:39:35
>>682
まず落ち着いてスレタイを読み直すんだ
684デフォルトの名無しさん:2009/07/29(水) 22:52:29
よく使われるライブラリほぼ全部が、無設定でgemから入れて問題なく
動くようになるまで、「初心者」に1.9系を勧める必要はないだろう。

@ITの記事でも、既にrubyアプリケーション資産を持っている人に対して、
1.9が当たり前になってから移行したんじゃ遅いから、そろそろ移行を
開始しろ、と言ってるだけなので、逆に言えばまだ1.9は当たり前じゃない
ことを認めている。
イノベーターは既に移行済み、アーリーアダプターは移行を始めている。
今から動き始めないとアーリーマジョリティーにもなれないよ、という
それだけの話。
今現在初心者な奴はそんな前の連中に倣う必要も意味もない。

685デフォルトの名無しさん:2009/07/29(水) 23:10:05
しつこいよ
686デフォルトの名無しさん:2009/07/29(水) 23:31:55
そろそろgithubレポジトリを、RubyGemsが標準で見に行くようにしてもいいんじゃね
実際、初心者が最新版(Hpricot0.7以降とか)を見つけられないのは不便だ
687デフォルトの名無しさん:2009/07/30(木) 01:10:15
1.9.1p0(mswin32)は…マズい…
RubyGems1.3.5が動かない。
688デフォルトの名無しさん:2009/07/30(木) 02:00:54
mswin32での導入部分をなぞってみたけど、1.9.1バイナリ入手の時点で厳しいな・・・
まあ1.8.7もそう変わらないけど

one-click ruby installerが1.9対応してからが本番かもしれない
689デフォルトの名無しさん:2009/07/30(木) 02:30:23
mswin32はどっかのバカが管理人を怒らせて
更新が止まってるんじゃなかったか?実は>>684だったりしてな
1.9.2もプレビューが出てるし、ワンクリックなんて待ってられん
690デフォルトの名無しさん:2009/07/30(木) 04:25:31
何言ってるんだ?
Ruby初心者だからってコンピュータ初心者だと限ったものでもないだろ
最新版ソースダウンロードして自分のVCでコンパイルするだけだ
簡単じゃん
691デフォルトの名無しさん:2009/07/30(木) 05:34:54
最新版の追っかけなんて問題解決の障害にしかならん
そーゆーのは開発者やテスト部隊のする事だ
初心者には安定版を提供しておけば良い
692デフォルトの名無しさん:2009/07/30(木) 05:36:56
693デフォルトの名無しさん:2009/07/30(木) 09:10:52
Ruby初心者ってどういう意味だ?
a. いくつかの言語を習得していて、Rubyをさわり始めたばかりの人
b. プログラミング言語自体が初めての人

これらによってだいぶ話が変わってくると思うが。
694デフォルトの名無しさん:2009/07/30(木) 09:21:28
おおむね b
他言語も制御構造触った程度の人を脳内想定

組み込みCとJava案件抱えてるけどRubyにも興味あったからマニュアル読んで始めて半月とか
そういうような人はあんま想定してないと思う
695デフォルトの名無しさん:2009/07/30(木) 09:36:59
>>689-690
なるほど、こういう人たちがいるがために今の状況があるわけか
696デフォルトの名無しさん:2009/07/30(木) 09:38:59
炙り出された
やっぱり初心者スレにもいるんだ
697デフォルトの名無しさん:2009/07/30(木) 10:18:39
はやく初心者スレでも、おおっぴらに1.9.xが語れるぐらいの段階になってほしいなー
「初心者はまず1.9.xから使い始めるべき」と言えるようになると嬉しい
698デフォルトの名無しさん:2009/07/30(木) 10:38:09
非・完全初心者以外の人が大挙して 1.9.1 を使い倒して
外部ライブラリを対応させまくるしかないねえ

これは「初心者向け 1.9.1 解説が足りない」というレベルの話ではない
それ以前
新人さんを迎えるためにおおわらわで大掃除とか椅子並べとかしてる状態
699デフォルトの名無しさん:2009/07/30(木) 10:39:48
>>689
怒ってるから更新が止まってるのかどうかは知らないけど、
なぜかftpサイトに最新リリースのバイナリはあるね。

ftp://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/
700デフォルトの名無しさん:2009/07/30(木) 10:41:28
ん、二重に否定して初心者になってるか
「非・完全初心者」か「完全初心者以外」のどっちかでよろしこ

自分の利用してるライブラリで testrb1.9 test/ してエラーが出たらちょっと頑張ってみるとか
や、Debian 系列以外で testrb1.9 が用意されてるの見たことないが
701デフォルトの名無しさん:2009/07/30(木) 10:50:34
クラス変数 @@hoge を参照してるインスタンスメソッドがあります
@@hoge の値による挙動の違いを Test::Unit でテストしたいです

もしかして、テスト中にクラス変数を変更したら「リセット」できなかったりしますか?
702デフォルトの名無しさん:2009/07/30(木) 12:36:18
>>701
「リセット」というのがどういった動作を指すのか良く分からん
@@hoge を初期化した時の値に戻って欲しいのであれば
Test::Unit::TestCase#setup 等でその値を再代入するしかない
class Hoge
 def hoge=(h) ; @@hoge = h ; end
end
class TestHoge < Test::Unit::TestCase
 def setup
  @hage = Hoge.new
  @hage.hoge = :Hoge
 end
 :
703デフォルトの名無しさん:2009/07/30(木) 14:14:09
すごい低レベルな質問で申し訳ないんだが、
テキストファイルの特定の行の次の行を読み込むにはどうすればいい?
704デフォルトの名無しさん:2009/07/30(木) 14:20:08
「特定の行」まで読み捨ててから次の行を読む。
705デフォルトの名無しさん:2009/07/30(木) 14:36:41
行ごとに配列にして、特定の行の入ってる要素の次の要素を使う
706デフォルトの名無しさん:2009/07/30(木) 14:41:21
IO は Enumerable なので
Enumerable#findと組み合わせるとか。

if f.find{|line| line が 「特定の行」 かどうか }
 target_line = f.gets
end
707703:2009/07/30(木) 14:51:35
>>704-706
即レスどうもです!がんばってみます!
708デフォルトの名無しさん:2009/07/30(木) 15:51:39
injectについて質問なのですが、

以下のサイトのrubyの回答で、injectを使って、ディレクトリ表記の文字列からなる配列を、木構造を模したHashにしています。
http://ja.doukaku.org/102/nested/
関係有る部分だけ、コピペします。
path_list = %w(
abc\\def
abc\\def\\gh
abc\\def\\ij
abc\\jk\\lm
de
)
h = {}
path_list.each{|path|
path.split(/\\/).inject(h){|k,v|
k[v] ||= {}
}
}

その結果が、(これは、僕のところで動かした結果)
h # => {"de"=>{}, "abc"=>{"jk"=>{"lm"=>{}}, "def"=>{"ij"=>{}, "gh"=>{}}}}

injectへの初期値に指定した変数(この場合 h) #その前に宣言されていてinjectの取るブロックの外にスコ−プがある。
は、どのように変更されているのでしょうか?

injectでのブロック変数(この場合、k,v)は、
kの方は最初に初期値が入り、その後、ブロックで最終的に評価された値が入る。
vはレシ−バの各要素が順次、代入されるということは理解しているつもりです。
今まで、初期値(h)は、その値が、最初にブロック変数(k)に代入されて、それ以降に、なにかの影響を受けてるのでしょうか?
709デフォルトの名無しさん:2009/07/30(木) 16:00:03
いやごく普通に、inject(x) の x を初期値として使ってるだけだと思うんだが
ブロック内で初期値として与えられたオブジェクトがどう使われるかなんじゃね
破壊的に使われるなら破壊されるだけだし、今回のように破壊されてないなら(アクセス方法があるなら)ずっと残る
710デフォルトの名無しさん:2009/07/30(木) 16:06:15
Ruby1.8.6をWinXP-Proで使っています。
Socket通信で、受け取った情報をテキストファイル化できず困っています。

tcpSocket = TCPserver.open("localhost",60001)
tcpSocket_ac = tcpSocket.accept # 接続を受け付ける
として
puts(tcpSocket_ac.read) # これは表示される
File.open('ReplyaData.txt', 'w') {|f|
f.write tcpSocket_ac.read # ファイルに書き込む
}

としてReplyaData.txtが生成されましたが、中身が空っぽです。
受け取った情報自体は puts(tcpSocket_ac.read) で表示されるのですが・・・

アドバイス願います。
711デフォルトの名無しさん:2009/07/30(木) 16:15:34
>>710
putsの行でreadしてしまってるのが原因

試しに
File.open("example.txt"){|f|
 p f.read
 p f.read
}
ってやってみ
IOクラスやその派生っていうのはただの文字列とは違って
「どこまで読んだ」という情報も持ってる
712デフォルトの名無しさん:2009/07/30(木) 16:18:33
バイナリは'wb'でopen
713デフォルトの名無しさん:2009/07/30(木) 16:19:46
>>708
ひとつ前の結果に v が登録されていなければ空のハッシュを v 名義で登録し、
登録したその新規ハッシュを次の処理に使う
v が登録されていれば登録されているハッシュを使う

という処理を繰り返す



abc の場合
{ }
{ 'a' => {} }
{ 'a' => { 'b' => {} } }
{ 'a' => { 'b' => { 'c' => {} } } }

abccd の場合
{ }
{ 'a' => {} }
{ 'a' => { 'b' => {} } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => { 'd' => {} } } } }

abc abd の場合
{ }
{ 'a' => {} }
{ 'a' => { 'b' => {} } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => {}, 'd' => {} } } }
714710:2009/07/30(木) 17:30:51
>>711-712
さんきゅうです。712さんの'wb'を使って
replyData= tcpSocket_ac.read と一旦格納し、

puts replyData
File.open('ReplyData.txt', 'wb') {|f|
f.write replyData
}
とすれば、Txtファイルの中身が出来ました。
(711さんの記述を実行するとsyntaxエラーになります)

しかし受け取ったデータには本来改行3箇所があり、DOSでは
その改行が反映されていたのですが、ReplyData.txtでは改行が
無視され1行になってしまっています。

どうしたら良いでしょうか?(バイナリの性ですか?)
715デフォルトの名無しさん:2009/07/30(木) 17:36:25
まともなエディタで開けば
716デフォルトの名無しさん:2009/07/30(木) 17:37:07
>>714
2chにコードを書き込むときはインデントに全角スペース使われることあるから
コピペするときには注意

テキストにbフラグはいらない
717デフォルトの名無しさん:2009/07/30(木) 18:59:13
def f1(s); return "f1: #{s}"; end
f = f1
f("a")

という感じで関数(メソッド?)を変数に入れておいてあとで呼びだしたいのですが、
f = f1 は wrong number of arguments になってしまいます
ruby ではどうすればいいのでしょうか?
718デフォルトの名無しさん:2009/07/30(木) 19:07:53
>>717
f = method(:f1) # または 'f1'
f.call("a")
# スコープに注意
719デフォルトの名無しさん:2009/07/30(木) 19:26:39
まあ、99.5パーセントくらいの割合で必要のない処理だけどな
文法の一覧テストみたいなの作ってるのでない限りたいていはもっといい方法がある
720デフォルトの名無しさん:2009/07/30(木) 20:42:06
まぁ、CやJavaScriptやPython辺りから来た人だとそんな書き方したくなるかもね
721デフォルトの名無しさん:2009/07/30(木) 22:31:55
f = lambda {|s| "hoge: #{s}" }
f.call("a")
722デフォルトの名無しさん:2009/07/30(木) 22:32:49
Rubyはどっからきたひと?
723デフォルトの名無しさん:2009/07/30(木) 22:47:27
SmalltalkとLispとPerlかな。
724708:2009/07/30(木) 23:50:59
少し、遅くなりましたが、
>> 709,713さん、ありがとうございます。
713さんの例も見ながら、考えてました。
で、
injectについて、質問したのですが、理解していなかったのは、Hashのところでした。(injectを覚え立てで、意識がそっちにいってしましました。)
hとkのつながりが見えてなかった。

h = {}
path.split(/\\/).inject(h){|k,v|
k[v] ||= {}
}

まず、k = hが行われ、 k, h が同じ場所を見るようになる。

k[v] ||= {}
k[v]を評価、nilなので、k["abc"] = {}が行われる(k = {"abc" => {}となる)。hも同じ所を見てるので、h = {"abc" => {}}となる。
また、この k[v] ||= {} という(条件+代入)式は、k[v]の値( {} )を返し、
injectなので、これが次回のiterationでの kになる。 さらに、その値 {}は hである、{"abc" => {} }の {}部分も kになる。

なので、イテレ−トの二回目は、
k = {}
h = {"abc" => k}
と、hのなかに、kへの参照?が残り、hにハッシュの要素が追加されていくようになる。

自分の中では、もう少しというところまで、理解が来たのですが、説明が、ぐちゃぐちゃになってしまいました。
変な文章で、スレの流れを止めて申し訳ありません。

725デフォルトの名無しさん:2009/07/31(金) 11:08:52
変数が特定の値(にマッチする等)かどうかをチェックしたいとき

 比較の固定値 == 変数

と書くのと

 変数 == 比較の固定値

と書くのとどっちが好ましいですか?
726デフォルトの名無しさん:2009/07/31(金) 11:19:22
>>725
ここでの == は「左辺」のオブジェクトのインスタンスメソッドです。

 ・ 既知のオブジェクトが == などの比較用メソッドを持っていることは確定
 ・ 比較の変数のオブジェクトの == メソッドなどが比較用に実装されてるとは必ずしも限らないと考える

ということで、

 既知のオブジェクト == 比較変数

と書くようにするとスマートです。
従来の言語の if 文の

 if 変数 == 値 then …

とは逆に見えるというかはっきり逆なので違和感バリバリですが、一応この順が正しいということになってます。
「代入と書き間違えないように if 0 == val と書くんだぜー」という姑息なバッドノウハウにも
予防線張る的な意味でよく似てる感じもしますが無関係です。

ただ、ぶっちゃけ、比較が動作しない場合はどっちに何を書いててもそもそも動作しないんで、
あんまり神経質になる必要はありません。
727デフォルトの名無しさん:2009/07/31(金) 11:52:08
俺はどうしても逆に書かないと通らないコードじゃ無い限り、意味的に通りが良いほうで書くかな
728デフォルトの名無しさん:2009/07/31(金) 12:00:43
正規表現のマッチも

/正規表現/ =~ 文字列

が正しいね

文字列 =~ /正規表現/

を動作させるためにわざわざ

def =~(re)
 re =~ self
end

というような動作をする String#=~ を作ったくらいだが
729デフォルトの名無しさん:2009/07/31(金) 12:00:56
==が通らないオブジェクトを無闇に想定するのもどうかと思う

ライブラリ等でそういうのも想定するなら細工が要るけど
想定外の変なオブジェクトは半端に通すよりはいっそ転けた方がよさそう
730デフォルトの名無しさん:2009/07/31(金) 12:04:23
obj == 1はobj#==(1)であるというRubyの原理を知る上では有意義な話
ただ==に対してそれを日頃から意識する必要はないんじゃないかということ

=~は==と違ってObjectのメソッドじゃないし
731デフォルトの名無しさん:2009/07/31(金) 12:05:25
ごめんObjectにも=~あったorz
732デフォルトの名無しさん:2009/07/31(金) 14:20:15
プログラミングの問題です
分からないので教えてくださいm(__)m
お願いします((+_+))

A
1.ユークリッドの互除法を用いて6696と3906の最大公約数を求めなさい。



2.自然数の配列に対して、全要素の最大公約数を返す関数array_gcd()を定義しなさい。

例)array_gcd([72,42,66,90])=>6,array_gcd([35])=>35

B
符号なしの自然数の3乗を要素に持つ配列の表示を受理するオートマトンを書きなさい。

受理例)[355,134,0,94],[12] 不受理例)[53,][04,32],[],[8,21]

733デフォルトの名無しさん:2009/07/31(金) 14:22:31
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/
734710:2009/07/31(金) 16:24:05
>>716
'wb' → 'w' でOKでした。
さんくす。
735デフォルトの名無しさん:2009/07/31(金) 18:38:25
webのRubyリファレンスマニュアルが使いにくすぎる。
知りたいことを探す方法がない。なにあれ。
736デフォルトの名無しさん:2009/07/31(金) 18:46:40
旧版使ったほうがいいぞ

作ってる最中に作ってる人が使わなくなってグダグダしてしまってる
737デフォルトの名無しさん:2009/07/31(金) 18:48:25
>>735
> webのRubyリファレンスマニュアルが使いにくすぎる。
> 知りたいことを探す方法がない。なにあれ。

Rubyリファレンスマニュアル刷新計画
http://doc.loveruby.net/wiki/FrontPage.html

まあ、泣いても自動的に改善されるわけではないから、手を動かすしか
ないんでね。
738デフォルトの名無しさん:2009/07/31(金) 18:50:04
>>737
そっちが使いにくいという話ではないのか
739デフォルトの名無しさん:2009/07/31(金) 19:17:41
なんでリファレンスを wiki でやろうとするかなあ
その時点で判断を誤ってると思う
740デフォルトの名無しさん:2009/07/31(金) 19:52:40
Wikiなのは正しい判断だと思うよ

>>735が何を使いにくいと言ってるのか知らんが
いずれにせよ、声を上げるか手を動かすかしないとどうにもならん
741デフォルトの名無しさん:2009/07/31(金) 20:05:46
Wikiだったのは昔のリファレンスで、
今の刷新計画は、マニュアル本体の管理にはWiki使ってないぞ。
742デフォルトの名無しさん:2009/07/31(金) 23:12:38
loopメソッドで
loop { |i| ... }
のように記述すると,エラーになってしまうのですが,
loopメソッドでは,timesメソッドのように,繰り返し回数を
変数に代入できないのでしょうか。
743デフォルトの名無しさん:2009/07/31(金) 23:49:01
timesは「何回でループを止める」という処理の都合でカウンタを持ってるけど
loopにはそれがないからカウンタを省いているんじゃないかな
ユーザーが必要とするかもわからないし、必要なら自分で i = i + 1 すれば済むわけだから
744デフォルトの名無しさん:2009/07/31(金) 23:51:31
>>742
出来ません。

無限ループでカウントを数えるには
0.upto(0/0.0) {|i| }
とかどうだろう?
745デフォルトの名無しさん:2009/07/31(金) 23:54:39
>>744
素直に i += 1 した方が可読性が高いと思う。
まさにRubyの悪い使い方に見える。
746デフォルトの名無しさん:2009/08/01(土) 00:01:30
>>744
きもすぎw
というか、処理系依存にならないのそれ?
将来動かなくなりそうで怖いんだけどそういうコード
747デフォルトの名無しさん:2009/08/01(土) 00:09:33
Infならまだわからんでもないが、0/0.0 でできるのがNaNだから意味がわからん。
1/0.0ならマシかというとそうでもないけど。
これも処理系依存?
748デフォルトの名無しさん:2009/08/01(土) 00:25:23
>>743
ユーザーがいらないと判断したなら、ブロック引数を省略すればいいだけの話では?
初期値どうすんだって問題が残るけど、まあ引数で与えることにして
こんなのじゃダメなんだろうか

def loop(n = 0)
 i = n
 while true
  yield i
  i += 1
 end
end
749デフォルトの名無しさん:2009/08/01(土) 00:37:43
NaNとの大小比較は常に偽だからループしつづけるということだろうか。
きめえ。

750デフォルトの名無しさん:2009/08/01(土) 00:43:01
1.upto(Inf)とか書けたらかっちぇえんだけどな
751デフォルトの名無しさん:2009/08/01(土) 02:29:52
>>748
引数が省略されたらカウントもしないぐらいやってくれるなら反対はないんじゃないかなぁ
たぶん意見を言う人のなかに、loopがカウントまでしてくれたほうが嬉しいと
考える人がいなかっただけじゃないかと想像
def loop(n = 0, &block)
 if block.arity == 1
  i = n
  while true
   yield i
   i += 1
  end
 else
  while true
   yield
  end
 end
end

でも初期値を引数にするのはどこか直観的とは言い難いし
timesとの対称性を考えて、カウンタを備えるのはIntegerのメソッドとするほうがよさそう
1.loop{|i| print i} #=> 1, 2, 3, ・・・

今度は名前が微妙かw
752デフォルトの名無しさん:2009/08/01(土) 02:32:40
Integer#stepのlimitを省略かnilを渡すとloopになるとかでもいい気がしてきた
753デフォルトの名無しさん:2009/08/01(土) 03:24:26
たのしいRuby 第1版を古本で見つけたんですが、
1.8に対応して無くても、本に掲載されているプログラムや文法は機能しますよね?
754デフォルトの名無しさん:2009/08/01(土) 03:58:18
おおむね問題ない
何箇所かメソッド変わって動かなくて、それをどっかにメモしたんだが、どこだったか
755デフォルトの名無しさん:2009/08/01(土) 05:01:54
0/0.0 ねえ
別にいいけど、それ激烈に処理遅いよ

      user     system  total    real
loop   5.450000  0.340000  5.790000 ( 5.786291)
int    4.980000  0.700000  5.680000 ( 5.680568)
0/0.0 14.300000  1.530000  15.830000 (15.829079)

require 'benchmark'
max = 10000000

Benchmark.bmbm{|x|
x.report("loop") do
n1 = 0
loop{ break if n1 == max; n1+=1}
end
x.report("int") do
0.upto(max){|n2| break if n2 == max}
end
x.report("0/0.0") do
n = 0
0.upto(0/0.0){|n3| break if n3 == max}
end
}
756デフォルトの名無しさん:2009/08/01(土) 05:06:05
ちなみに1.9.1での結果はこちら
さすがフィボナッチ数列最適化された1.9さん汚いサンプルスクリプト全力実行汚い

       user    system   total    real
loop   1.040000  0.000000  1.040000 ( 1.035370)
int    0.930000  0.010000  0.940000 ( 0.939556)
0/0.0  2.330000  0.000000  2.330000 ( 2.326159)
757デフォルトの名無しさん:2009/08/01(土) 06:08:11
$.
758デフォルトの名無しさん:2009/08/01(土) 09:19:12
Ruby1.8 か 1.9 で、

 arr.find{|e| e.mes === val}
 arr.find_all{|e| e.mes === val}

の結果を返す hoge(:mes, val) や hoge_all のような hoge メソッドって無い?
759デフォルトの名無しさん:2009/08/01(土) 09:53:27
>>754
それじゃあまだあったら購入します。
最悪、CD-ROMのRubyでも勉強できますし。
760742:2009/08/01(土) 11:34:12
ありがとうございます。

ループにカウンタがいるのかいらないのかという議論もあるのかもしれませんが,
それ以前に,文法的に,loopがブロック付きメソッド(イテレータ)にもかかわらず,
loop { |i| ... }
という記法ができないのは少し気持ちが悪いというか,
loopが組み込みのブロック付きメソッドなら,文法の一貫性を保つためにも,
上記の表現は可能にすべきじゃないかと思ったのですが,どうなのでしょう。
loopは例外といえばそれまでなのですが…。

ブロック付きメソッド呼び出し
http://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html#a.a5.d6.a5.ed.a5.c3.a5.af.c9.d5.a4.ad.a5.e1.a5.bd.a5.c3.a5.c9.b8.c6.a4.d3.bd.d0.a4.b7
761デフォルトの名無しさん:2009/08/01(土) 11:49:49
なんでただの無限ループに回数を数える機能がついてなきゃならない
必然性があるわけ?

i = 0
loop{
...
i += 1
...
}
これじゃどうしてもダメという理由がある?
762デフォルトの名無しさん:2009/08/01(土) 11:49:54
>>760
def foo(i); end
foo # ArgumentError: wrong number of arguments (0 for 1)
これがエラーになることと一貫してる
763デフォルトの名無しさん:2009/08/01(土) 12:00:10
まあ、そりゃ、あってもいいが、使わないことのほうが多いからな
loop を仮引数なしのブロックつきメソッドにしたのはそのへんが理由だろう
明示的無限ループの制御部なんて速いに越したことはない

gem のどっかで loop_with_index とか作ってそうだが無さそうだ
764デフォルトの名無しさん:2009/08/01(土) 12:08:25
「真に無限回、ループカウンタを参照する」という処理は
存在するべきではないのでデフォルトでは非対応にした
カウンタ欲しけりゃ自前で実装しとけ

がたぶん答だ
765デフォルトの名無しさん:2009/08/01(土) 12:10:06
特に機能が似ているInteger#timesが回数を返すのに、
loopが返さないのは一貫性に欠けると思う
ループカウンタ付きの無限ループは、ただの無限ループとしての機能を含むし
かといって、代わりに何かを犠牲するわけでもない

あと、2行増えるのが気に食わないw
766デフォルトの名無しさん:2009/08/01(土) 12:13:46
終わりの保証があるものはともかく、loopは終わりの保証が無いものだからなんか特殊な気がする
767デフォルトの名無しさん:2009/08/01(土) 12:14:06
>>765
timesとの一貫性ならIntergerにカウンタ付きのメソッドを用意すればいい
>>751で言った
768デフォルトの名無しさん:2009/08/01(土) 12:17:24
>>762
その指摘は的外れだ
Rubyではメソッドの引数は勝手に省略できないが、イテレータに渡すブロックの仮引数は省略できる

def test_iterator
 yield(1, 2, 3)
end

test_iterator do
end

test iterator do |a, b, c|
end
769デフォルトの名無しさん:2009/08/01(土) 12:25:35
>>760
>それ以前に,文法的に,loopがブロック付きメソッド(イテレータ)にもかかわらず,
>loop { |i| ... }
>という記法ができないのは少し気持ちが悪いというか,

エスパーしてみると、ブロックには必ず引数をつけなきゃいけないと勘違いしてるっぽいな。


loop { ... } は単に while true do ... end と同じようななもんだから、
while で自動的にカウンタがつかないのと同じだよ。
770デフォルトの名無しさん:2009/08/01(土) 12:37:57
>>768
それで、増やしていいの?
771デフォルトの名無しさん:2009/08/01(土) 12:41:58
>>765
> 機能が似ているInteger#times
似てねえよ!
どこが似てるんだよ!
772デフォルトの名無しさん:2009/08/01(土) 12:45:16
>>770
増やしてもエラーにはならないし、本題はそこではない
773742:2009/08/01(土) 13:23:26
>>769
> エスパーしてみると、ブロックには必ず引数をつけなきゃいけないと勘違いしてるっぽいな。
loopに仮引数を付けた表現を可能にしてもよいのではないかと思っただけです。
仮引数を省略した表現が可能であることはもちろん前提です。

> loop { ... } は単に while true do ... end と同じようななもんだから、
> while で自動的にカウンタがつかないのと同じだよ。
whileはイテレータではないですよね。

組み込みのイテレータであるなら,どのイテレータでも仮引数をとれるようにした方が
表現上,一貫性があるのではないかと思ったのです。
ましてや,times(有限回のループ)で仮引数をとれるのなら,
loop(無限回のループ)でも仮引数をとれるようにした方が自然なように思います。

>>767
timesとの一貫性を保つのなら,カウンタの初期値は 0 になるので,
int.loop とする必要はないのではないかと思います。
774デフォルトの名無しさん:2009/08/01(土) 13:31:42
無限まで数えさせる気かよ
775デフォルトの名無しさん:2009/08/01(土) 13:31:55
>>773
だから仮引数はレシーバから取られるだろ
Kernel なんかもらっても嬉しくねえよ
776デフォルトの名無しさん:2009/08/01(土) 13:43:21
回数を気にしないからloopを使うんであって
回数が必要ならtimesでいいじゃないか
777デフォルトの名無しさん:2009/08/01(土) 13:46:13
771も言ってるが、そもそもloopとtimesが似てるとは思わない
loopにはむしろwhileやuntilのような、制御構造に近いものを感じるから
loopがブロック引数を持つと猛烈な違和感がある
きっとMatzも同じ判断をして、loopを今の仕様にしたのではないか

あれ、ここ何のスレだっけ
778デフォルトの名無しさん:2009/08/01(土) 14:15:48
>>765
よくわかってないが速度は犠牲にならんの?
779742:2009/08/01(土) 14:34:11
>>774
有限の時間内にプログラムは終了しないといけないので,
つまり,loopはいつかは終わるので,
実際に無限まで数えることはないと思います。

>>775
すみません,もう少し分かりやすく説明していただけないでしょうか。

>>776
数値計算なんかで,20カウントごとに解を出力して,
ある範囲に解が収まったらループを抜ける,なんてことは,
timesよりもloopの方が適していると思います。
(もちろん普通はwhileを使うのでしょうが,ここでは別の話です。)

機能的にloopに仮引数が必要か否かもありますが,
イテレータの表現上の一貫性からも,
loopに仮引数をとれた方が良いのではないかと思った次第です。
780デフォルトの名無しさん:2009/08/01(土) 14:38:39
>779
有限の時間内にプログラムは終了しないといけないので…と言うのは計算機上の話じゃないのか
loop{}自体が意味するのは無限ループだよ

一貫性って何だよ
timesとloopはそもそも出自が全く違うものであって、全く別のものに一貫性も何もないと思うぞ
781デフォルトの名無しさん:2009/08/01(土) 15:02:18
イテレータは仮引数を使えなきゃいけない
って思うのがそもそもよくわからん
782デフォルトの名無しさん:2009/08/01(土) 15:25:34
はい、そろそろみんな本スレに移動してくださーい
783デフォルトの名無しさん:2009/08/01(土) 15:51:09
>>750じゃないが組み込みの無限大オブジェクトを作ればいいんじゃないか?
1.upto(Inf)でもInf.timesでも。javascriptは確かあったよな。
784デフォルトの名無しさん:2009/08/01(土) 15:58:21
>>783
Float を Integer の 0 で割ると無限大を返すようになってる
irb> p 100.0 / 0
Infinity
785デフォルトの名無しさん:2009/08/01(土) 16:09:09
あ、「0.0 以外の」な
0.0/0 は NaN(Not a Number)を返す
Ruby では 1.0/0 という計算を無限大を得る通例として使う
ttp://www.google.com/search?hl=ja&safe=off&num=50&q=%221.0%2F0%22+Ruby+Infinity&lr=lang_ja

大昔は Float("INF") が Infinity だったんだが、この機能はなくなった
負の方向の無限大は -1.0/0 とでもしてくれ
786デフォルトの名無しさん:2009/08/01(土) 16:15:12
>>784-785
うほ、知らなかった。
それをわざわざ計算しなくても使えるように定数にしてほしいな。
でもtimesは使えないのね。Floatの仲間だからか。
787デフォルトの名無しさん:2009/08/01(土) 16:59:08
>>784
こういうのRuby処理系依存じゃないの?
ゼロ除算例外が発生してほしいって人もいるだろうし。
ちゃんとリテラルで±Infが欲しい
788デフォルトの名無しさん:2009/08/01(土) 17:37:42
>>787
> こういうのRuby処理系依存じゃないの?
現在はいいえ
というか Float("INF") を取り除くときに意図的にそうしたはず

1.0/0.0 も Infinity 返すぞ
0.0 は例によって「世界で一番 0 に近い正の浮動小数」だから、
これで素直に割ると正の極限に吹っ飛ぶという理解でひとつ
789デフォルトの名無しさん:2009/08/01(土) 17:38:43
それならtimesメソッドにも仮引数はいらんちゅう話になるわな
というか実際いらんだろ
790デフォルトの名無しさん:2009/08/01(土) 17:55:35
>>789
何かどうなればそういう結論に辿り着くの
791デフォルトの名無しさん:2009/08/01(土) 17:55:44
仮引数はメソッド定義の def hoge(x) の x のことなんで、ブロックパラメータ foo{|e| の e のことだとする

ブロックパラメータはブロックつきメソッドのレシーバから何らかの条件で取るのが普通
loop は Kernel というか Object というかそのへんのメソッドなので、
関数的メソッド loop においては「ブロックパラメータは取りたくても取れない」とするのが、整合性上いちばん自然

Integer#times は レシーバの基底値つまり 0 を初期値として succ して レシーバの値まで繰り返すというメソッド
ブロックパラメータは普通にレシーバから 0 が使われて、これが増える

問題なくね
実際問題としてブロックパラメータは省略しても動作する
irb> 3.times{ puts "Rubyはうんこ"}
Rubyはうんこ
Rubyはうんこ
Rubyはうんこ
792デフォルトの名無しさん:2009/08/01(土) 18:48:56
初心者の俺は>>791に納得
793デフォルトの名無しさん:2009/08/01(土) 20:48:09
というより、timesは回数を指定するというところから
何回目というのが一応取れるようになってるが、実際は省略することのほうが多い気がする
カウンタが欲しいなら俺は素直にRange.each使うほうが多い
794742:2009/08/02(日) 03:09:30
>>791
詳しく説明していただいてありがとうございます。
loopにブロックパラメータがない理由が納得できました。
メソッド1つとってもなかなか奥が深いですね。
795デフォルトの名無しさん:2009/08/02(日) 05:47:14
えーこんなんでよかったの
よくわかんねー
796デフォルトの名無しさん:2009/08/02(日) 07:37:25
>>794
貴方のお陰で、なんで職場で私が疎んじられるかがわかった気がする。些細なところまで自分が納得しないと気が済まないっていう人を説得するのは、疲れる。
797デフォルトの名無しさん:2009/08/02(日) 08:36:10
議論では、必要、必要ない、なんとなくそうなった、なら〜すればいい、
とかの理由にならない水掛け論しかされてないようにみえたな

で、ちゃんと理由付きの791に納得
普通の反応だろうよ
798デフォルトの名無しさん:2009/08/02(日) 08:56:06
>>773
>組み込みのイテレータであるなら,どのイテレータでも仮引数をとれるようにした方が
>表現上,一貫性があるのではないかと思ったのです。

それが思い込み・勘違いだっつーの。

>ましてや,times(有限回のループ)で仮引数をとれるのなら,
>loop(無限回のループ)でも仮引数をとれるようにした方が自然なように思います。

なんでそれが自然なんだよ!

>whileはイテレータではないですよね。

だからどうした? イテレータであるかどうかは今の話に関係ないだろ。
799デフォルトの名無しさん:2009/08/02(日) 09:25:08
うお 水掛け論て言われた直後に
典型的な水掛け論レス!
しかもレス先が古すぎて・・・
800デフォルトの名無しさん:2009/08/02(日) 10:41:57
負けたと思ってから2倍頑張り出す人って、たまにいるから。
まぁ2倍といっても、言い掛かり度と語気が2倍になるだけでレベルは逆にもっと下がるんだけど。
801デフォルトの名無しさん:2009/08/02(日) 10:54:47
>>773
>それ以前に,文法的に,loopがブロック付きメソッド(イテレータ)にもかかわらず,
>loop { |i| ... }
>という記法ができないのは少し気持ちが悪いというか,
>loopが組み込みのブロック付きメソッドなら,文法の一貫性を保つためにも,
>上記の表現は可能にすべきじゃないかと思ったのですが,どうなのでしょう。

loop {|i| p i } って今でも普通に動くぞ。

>>791
>ブロックパラメータはブロックつきメソッドのレシーバから何らかの条件で取るのが普通

そんな「普通」はない。
Kernel#open とか Array#each_index とかいくらでも例外がある
802デフォルトの名無しさん:2009/08/02(日) 10:57:34
いるよね、普通という言葉を完全と取り違えてる人
803デフォルトの名無しさん:2009/08/02(日) 11:03:02
>>802
すまん、「例外がある」という言い方で誤解されたか。
こんな慣習は存在しない。
完全な誤解 or デマだから初心者はだまされないように。
804デフォルトの名無しさん:2009/08/02(日) 11:03:12
「例外がある。だから普通はない」
ワラタ
805デフォルトの名無しさん:2009/08/02(日) 11:10:25
obj.mes{|e|

という表記があったら、普通 e は obj の何かだと思うんだが
そりゃメソッド作成時にどう作っても構わないが、そう動作するのが期待されてはいるだろ
806デフォルトの名無しさん:2009/08/02(日) 11:12:26
1.9 から入った人は obj.mes が渡されると思うかも
まあこれだって規定があるわけじゃないから>>803は「そんな慣習はない」と言うだろうけどな
807デフォルトの名無しさん:2009/08/02(日) 11:18:27
IO#each_*
IO.open
IO.popen
IO.pipe
IO.foreach
Dir.open
Dir#each
Dir.chdir
Regexp#match
String#unpack
ObjectSpace.each_object
Kernel#open
Kernel#callcc

まだ続ける?
808802:2009/08/02(日) 11:24:51
loop がカウンタを yield しないのは「Kernel#loop のレシーバと
関係ないから」なんて理由じゃないということだけわかってもらえれば。

実際の理由は今までそういう提案がなかっただけだろう。
走らせっぱなしにするプログラムで loop をとても長く実行する場合、
2**30 回を越えると Bignum が大量に生成されてしまうのは嫌だな。
809デフォルトの名無しさん:2009/08/02(日) 11:25:22
続けて続けて!
810デフォルトの名無しさん:2009/08/02(日) 11:31:38
811デフォルトの名無しさん:2009/08/02(日) 11:32:08
お前らそろそろ本スレでやれ
812デフォルトの名無しさん:2009/08/02(日) 11:39:50
だが断る
813デフォルトの名無しさん:2009/08/02(日) 11:41:42
>>742 は何で loop { |i| ... } を文法的に記述できないと勘違いしたんだろう
814デフォルトの名無しさん:2009/08/02(日) 11:58:48
>>813
それは>>801が1.9.1ユーザーだからだよ
1.8.7では警告が出る
a.rb:2: warning: multiple values for a block parameter (0 for 1)
   from a.rb:2
815デフォルトの名無しさん:2009/08/02(日) 12:06:18
なるほど、警告を文法エラーと勘違いしたのか
じゃあ >>742 に必要だったのは $VERBOSE = nil かな
816デフォルトの名無しさん:2009/08/02(日) 13:05:27
>>808
>走らせっぱなしにするプログラムで loop をとても長く実行する場合、
>2**30 回を越えると Bignum が大量に生成されてしまうのは嫌だな。

{hoge} のときはカウントせずに
{|i| hoge} のときだけカウントすればいい
817デフォルトの名無しさん:2009/08/02(日) 13:35:33
ruby1.8.6で $VERBOSE = nil をセットして、
loop {|i| p i }
を走らせると、nilが延々と出力されるけど、
1.9.1だと何が出力されるの?
818デフォルトの名無しさん:2009/08/02(日) 13:38:33
nilが延々と出力される
819デフォルトの名無しさん:2009/08/02(日) 13:42:40
>>801にとっては普通に動いてることになるわけか
820デフォルトの名無しさん:2009/08/02(日) 13:47:18
>>815
警告を切ればいい、というものでもないと思う
821デフォルトの名無しさん:2009/08/02(日) 14:25:18
>>816
> {hoge} のときはカウントせずに
> {|i| hoge} のときだけカウントすればいい

まず、arity の数によって挙動を変える API というのは前例がない。
ML で提案してみるといいけど、i = 0; loop { ...; i += 1 } で済む
程度のことなのでおそらく通らないだろうね。

あと、C レベルでは block と Proc は別なんだよね。
arity を見るには Proc にしないといけないが、block を Proc に
変換するのは結構遅い処理なんだ。
つーわけで、それをやろうとすると従来の loop が遅くなる。
822デフォルトの名無しさん:2009/08/02(日) 14:30:00
>>820
文法エラーは一切関係ないといいたいだけなんだが。
def foo; yield; end; foo {|x| p x } ってやってみろ、と言えばいい?
823デフォルトの名無しさん:2009/08/02(日) 16:01:09
puts "aaa .rb".gsub(/(.*?)\s*(\..*?)$/, '\1\2')
で拡張子前のスペースを取り除けたんだけど
puts "aaa .rb".gsub(/(\s*)\..*?$/, '')
といった感じで取り除きたいものを括弧でくくって除去する書き方ってないですか。
この書き方だと/〜/が置換対象になる為か"aaa"になってしまいます。
824デフォルトの名無しさん:2009/08/02(日) 16:24:16
先読みを使うといい

puts "aaa .rb".sub(/\s+(?=\..*$)/, "")

aaa .bbb .rb が aaa.bbb .rb になるのが嫌なら

puts "aaa .rb".sub(/\s+(?=\.[\.]*$)/, "")
825デフォルトの名無しさん:2009/08/02(日) 16:25:26
とりあえず gsub はブロック使え
単語末は $ よりも \Z 推奨(\Z で用が済む場合のみ)

> 取り除きたいものを括弧でくくって除去
puts "aaa .rb".gsub(/(\s*)(?=\..*?$)/){''}
826742:2009/08/02(日) 21:37:08
何度も失礼します。
みなさん,いろいろありがとうございました。

>>801
どのブロック付きメソッドでも obj.method { |i| ... } を実行できるが,
i に何が入るか定義されていないときには nil が入る。
で,loopの場合には i に何が入るか定義されていないので,nil が入る。
結局,loop { |i| ... } は文法的には誤りではないと。

>>807-808
> loop がカウンタを yield しないのは「Kernel#loop のレシーバと
> 関係ないから」なんて理由じゃないということだけわかってもらえれば。
そういう縛りはないということなのですかね。

当初,loopにカウンタがあれば嬉しいなと思ったのですが,それも難しいということで,
少し残念な気もしますが,そんなもんだと思っておきます。

お騒がせしました。
827デフォルトの名無しさん:2009/08/03(月) 03:04:18
ゲーム(RGSS)でネットランキング機能を実装したいと思っているのですが、
Webサーバーにあるテキストファイル読み込み、追加編集ってできますか?
828デフォルトの名無しさん:2009/08/03(月) 04:19:20
本家と挙動の違う改造済みRubyの話は専用のところでやっとくれ

物凄く一般的には、

「得点ファイルを受け取って全体ランキングを返すCGIをサーバに置く」
「URLは一発でバレて原理的に隠せないので、不正防止のために
それを送れるのはハッシュの作り方を知ってるゲーム本人だと確信できるような
複雑でランダムなハッシュをゲームに作成させる」
「ゲームからのファイル送受信はとりあえずopen-uriあたりを使う」

あたりになると思う
829デフォルトの名無しさん:2009/08/03(月) 05:50:46
>>827
サーバ側にCGIプログラムとかを用意して、サーバ側でテキストファイルを読み書きしたほうがいい。
サーバにあるテキストファイルをとってきて、クライアント側で書き換えてサーバ側に送信するようにすると、いくらでも不正行為ができるからね。

だから、まずCGIプログラムの作り方(やRailsの使い方)を勉強したらいいんじゃないかな。
830デフォルトの名無しさん:2009/08/03(月) 05:58:26
>>828-829みたいな事するならHTTP使う必要無いなと思う
別に間違った事を言ってる訳じゃないけどさ(Rails以外は)
831デフォルトの名無しさん:2009/08/03(月) 06:03:38
Rubyでゲーム作ろうと思うような人なら簡便なHTTP+CGIでいいと思う
そりゃUDPと特定デーモンで用は足りるが、プロトコルデータ総量とセッション負荷を問題にすべき場所ではない
832デフォルトの名無しさん:2009/08/03(月) 10:30:29
そんな糞CGIをレン鯖で動かすと、ruby禁止に成りそうだwww
作るなら、php辺りで作ったほうが良いよwww
833デフォルトの名無しさん:2009/08/03(月) 14:02:13
1分につき何回のアクセスを想定してるかにもよるな
素直に読むなら多くても通常のサイトのカウンタCGI程度だと思えるが
834デフォルトの名無しさん:2009/08/03(月) 14:57:15
ネトゲ作るという話にすり替わってるんじゃね
835デフォルトの名無しさん:2009/08/03(月) 17:01:01
>>833
>1分につき何回のアクセスを想定してるかにもよるな
ネットランキングを作りたいって言っているんだから、大した負荷にはならんだろ。
836デフォルトの名無しさん:2009/08/03(月) 17:04:19
毎秒のリアルタイムスコアを全アクティブユーザーから収集した
超リアルタイムランキングを作りたいとかいう奴のいる世界を舐めたらいかん
837デフォルトの名無しさん:2009/08/03(月) 19:44:24
ランキングなんて10分ごとに更新で十分だろ
838デフォルトの名無しさん:2009/08/03(月) 19:45:26
それは我々の妥協した常識でしかない
839デフォルトの名無しさん:2009/08/04(火) 00:09:59
リアルタイムで見たいとか逝って連打する香具師も居るだろう。
840デフォルトの名無しさん:2009/08/04(火) 00:40:44
何を連打するんだろう
841デフォルトの名無しさん:2009/08/04(火) 01:52:04
後付けしたHDDをマウントしてその中でrubyを実行したら、OSが入っているHDDの時と実行時間が8倍くらい遅い。
プロセスみたら割り込み不可やら停止中とかになるんだけど、原因わかるひといます?
842デフォルトの名無しさん:2009/08/04(火) 02:22:56

・ そもそも外付けは原理的に内蔵よりずっと遅い(我慢)
・ USB1.1に繋いでいる(買い替え)
・ USBコネクタがHDD転送向きでないへぼい安物(別なコネクタに繋ぐと直る)
・ 細かいファイルの読み書きは基本遅いのでスクリプトのライブラリを置くのは自殺行為

好きなの選べ
843デフォルトの名無しさん:2009/08/04(火) 02:48:19
USB外付けではなくて、内蔵です。

/dev/sda1:
Timing cached reads: 13724 MB in 1.99 seconds = 6879.94 MB/sec
Timing buffered disk reads: 256 MB in 3.00 seconds = 85.24 MB/sec

/dev/sdb1:
Timing cached reads: 13840 MB in 1.99 seconds = 6938.85 MB/sec
Timing buffered disk reads: 362 MB in 3.01 seconds = 120.08 MB/sec

sdaにOS入れているんですが、sdbにデータ保存用としているのですが・・・。
844デフォルトの名無しさん:2009/08/04(火) 06:00:40
すいません、質問です。
イテレータ(古い呼び方ですが)の中で値の代入はできないのでしょうか。

例えば 配列 t があって for 文を使えば
t=["aaa","bbb","b"]

len = array.length-1
for i in 0..len
array[i]="ok"
end
で全ての配列の要素にokを代入できますが
イテレータでこれをやろうとしてもできませんでした。
array.each{|seg|
seg="ok"
}
array

仕様的にイテレータ内では代入ができないのでしょうか。
それとも何か方法があるのでしょうか。教えてください
845デフォルトの名無しさん:2009/08/04(火) 06:21:58
array = ["one", "two", "three"]

seg = arr[0]
seg = "ok"
seg = arr[1]
seg = "ok"
seg = arr[2]
seg = "ok"

これで array が ["ok", "ok", "ok"] になるかと言えば、やっぱならねーだろ
それと同程度の理屈

配列要素を書き換えたいときは map (と map!)を使うことが多い

array = ["one", "two", "three"]
array.map!{|e| "ok"}
p array

["ok", "ok", "ok"]

ブロック内部で代入された変数から array を書き換えることはしない
何らかの手段で配列に直接アクセスするのが無難

array = ["one", "two", "three"]
[0, 1, 2].each{|n| array[n] == "ok"}
p array

["ok", "ok", "ok"]
846デフォルトの名無しさん:2009/08/04(火) 06:29:29
最後間違ってるな

array = ["one", "two", "three"]
[0, 1, 2].each{|n| array[n] = "ok"}
p array


arr.each{|e| e = "ok"} は「ぱっと見は動作しそうなんだけどよく考えたら動作しないもの」のひとつ
847デフォルトの名無しさん:2009/08/04(火) 06:31:47
map
848デフォルトの名無しさん:2009/08/04(火) 08:39:33

array の長さが変わったらどうするつもりなんだろうこのひとは
849デフォルトの名無しさん:2009/08/04(火) 08:49:27
each_index 使えよ
850デフォルトの名無しさん:2009/08/04(火) 10:02:50
ちょっと違うが、
オレも内蔵のHDDつなげてソフトRAID1を導入してみたらめちゃくちゃ遅かった思い出がある。
851デフォルトの名無しさん:2009/08/04(火) 13:02:39
もはや呪術レベル
852デフォルトの名無しさん:2009/08/04(火) 15:20:33
def getstr(s)
  s
end

a = "Aaa"
b = getstr(a)
b.gsub!(/aa/, "bb")
p a

上の様なパターンで文字列の参照書き換えちゃってたびたびバグを出すんだけど
メソッドの文字列は s.dup して返すみたいなルールを決めるべきなのかな。

def getstr(s)
 if /A/ =~ s
  s
 else
  'A' + s
 end
end

になるとますます状況が混沌としてくる。
このあたりのRubyのお作法はどうなってるんだろう。
853デフォルトの名無しさん:2009/08/04(火) 15:24:38
>>843
わるいこといわんから早い方で動かしとき。
でも、データ保存(?)の方が読み書き早いのに実行が遅いのは気持ちが悪いな
854デフォルトの名無しさん:2009/08/04(火) 15:26:54
Rubyの文字列は原則immutableだと思ってプログラムすればいいと思う。
StringBuilderのように使うときだけは別扱いで。
855デフォルトの名無しさん:2009/08/04(火) 15:27:05
>>852
def getstr(s)
  s
end

a = "Aaa"
b = getstr(a).gsub(/aa/, "bb")
p a
856デフォルトの名無しさん:2009/08/04(火) 15:29:41
>>854
逆じゃないか
857デフォルトの名無しさん:2009/08/04(火) 15:41:59
「gsub! ではなく gsub を使う」の一言で用が済むのに
858デフォルトの名無しさん:2009/08/04(火) 15:46:16
Rubyにおいては

a = 超でっかい文字列
a.gsub!

としたときの超でっかい文字列がメモリから消えるタイミングと

a = 超でっかい文字列
b = a.gsub
# 以後のスクリプトに a は出てこない

としたときの超でっかい文字列がメモリから消えるタイミングの予測値ってたいして変わらないよな
859デフォルトの名無しさん:2009/08/04(火) 15:58:53
>>852
標準ライブラリからdupやfreezeしてるのを探したけどあんまり無かった
他の言語だとこの辺り煩いけどRubyだとどうするんだろうね

class Foo
def initialize(s); @s = s; end
attr_accessor :s
end

s = 'hoge'
f = Foo.new(s)
s[1] = 'a'
f.s #=> "hage"
860デフォルトの名無しさん:2009/08/04(火) 16:06:11
たとえば引数が String の場合、一度でも sub や gsub をすれば引数文字列は結果的に保護される
String だって「selfを変更してselfを返す」というメソッドより「新しい文字列を作成して返す」というメソッドのほうが多い
861デフォルトの名無しさん:2009/08/04(火) 16:10:36
「引数オブジェクトをそのまま使うようにメソッドを作る」ということのほうが稀なんじゃないかな
これが意図的に行われるのは引数がデータハッシュとかデータ配列とか
そういうのな時だと思う
862デフォルトの名無しさん:2009/08/04(火) 16:22:16
引数sがそのまま戻り値になりそうなシーケンスでは s.dup するのが無難そうですね。
面倒なら頭で s=s.dup しちゃうとか。
メソッドの仕様だと言い張って呼び出し側でdup的な事をさせるのはさすがに論外な気がしてきた。

参考になる意見ありがとうございました。
863859:2009/08/04(火) 16:37:17
>>860-861
d
受け取った引数をそのままインスタンス変数にしまうコードを
いままで普通に書いてきたので頭痛がしてきますた
864デフォルトの名無しさん:2009/08/04(火) 16:38:16
rubyスクリプトをcron起動させた場合に、共有ライブラリの環境変数は
どうやって設定してますか?
865デフォルトの名無しさん:2009/08/04(火) 16:44:20
>>864
うむ
「環境変数を設定してrubyスクリプトを起動するというシェルスクリプトをcronで動かす」
「crontab で環境変数が設定できるので RUBYLIB とか適当に設定する」

のどっちかを主に使う
あとあとめんどくさくないので、cron用起動シェルスクリプトを作るのお勧め
866デフォルトの名無しさん:2009/08/04(火) 17:02:09
ありがとうございます。

ということは、ruby起動用のテンプレートを作った方が良いのでしょうか。
コマンドライン引数を渡して、シェルスクリプトのような形でも利用したいので。

例えば以下のようなコードで。

#!/bin/sh

RUBYOPT='-Ke -rkconv'
export RUBYOPT

RUBYLIB=$HOME/ruby/lib:/opt/ruby/lib
export RUBYLIB

ruby test.rb $*

867デフォルトの名無しさん:2009/08/04(火) 17:08:07
あるいは、

<test>
#!/bin/sh
rubyset
ruby test.rb $*

<rubyset>
#!/bin/sh
RUBYOPT='-Ke -rkconv'
export RUBYOPT

RUBYLIB=$HOME/ruby/lib:/opt/ruby/lib
export RUBYLIB

の様な形にした方が良いでしょうか。
野暮ったい感じなので、もっと良い方法があれば教えてください。
868デフォルトの名無しさん:2009/08/04(火) 17:09:31
>>852
gsub! を使わないようにするのがいいと思う。
Ruby では gsub! は本当に必要なとき以外は使わない方がいい。
869デフォルトの名無しさん:2009/08/04(火) 17:13:27
自分で好きなようにやったらええがな・・・

crontab にはファイル名しか書かないというのが一応俺ポリシーなので
俺の場合は対象cronごとにシェルスクリプトを作る
複雑な起動オプションとか全部シェルスクリプトに(意図解説つきで)押し込める
マシンが変わっても crontab -r してしまってもなんとかなるようにしておく
そんだけ
870デフォルトの名無しさん:2009/08/04(火) 17:22:58
ruby 1.8.5 [i386-linux] です。

=============================
$ ruby hoge.rb
hoge.rb:3: unknown type of %string
s = "これは、テストメールです。\n\n届いているかな?\n"
^
hoge.rb:3: syntax error
s = "これは、テストメールです。\n\n届いているかな?\n"
^
$ cat !$
cat hoge.rb
#!/usr/bin/ruby -Ke

s = "これは、テストメールです。\n\n届いているかな?\n"

=============================

"unknown type of %string" で調べてもいい情報が見付かりません。
すみませんが原因をご教授いただけると助かりますm(_ _)m
871デフォルトの名無しさん:2009/08/04(火) 17:27:22
まぁ、そうなんですけどねw

異なるユーザーでスクリプトやライブラリを共有したいので、
なるべく簡単で不具合の少ない方法があれば良いと思ったので。
クラスを共有したり、コマンドラインを共通化したりしたら便利ですから。

この方法だと、ユーザー毎のPATHの違いで止まるのが難点です。
上手く回避できる方法があれば良いなと。
872デフォルトの名無しさん:2009/08/04(火) 17:45:47
>>870
まず「¥n」をとりのぞいてみる。それでokなら「¥n」があやしい。
そうでなければ日本語関連の問題かな。

873デフォルトの名無しさん:2009/08/04(火) 17:52:44
>>862
>メソッドの仕様だと言い張って呼び出し側でdup的な事をさせるのはさすがに論外
どっちもどっちな気がするけどね

例えばクラス側でdupするのが当然ならattr_readerが破綻する
class C
 attr_reader :name
 def initialize(name); @name = name.dup; end
end
obj = C.new("Hoge")
obj.name[1] = "a"
p obj.name #=> "Hage"

引数として渡したことのある値も、余所から得た返値も(Stringのメソッドのように保証されてる場合を除いて)
共有物だと見なして破壊的な操作は避けるのが作法だと思う

はっきりと私物だって分かってるなら破壊的に操作していいんだけどね
874デフォルトの名無しさん:2009/08/04(火) 17:55:12
>>872
s = "、"

"Invalid char `\033' in expression"
となりました。
ダブルクォートでなくシングルクォートで囲めばいけるんですが、、、

"ruby -Ke" とやっていても日本語関連の解決にはならないのでしょうか。
875デフォルトの名無しさん:2009/08/04(火) 17:55:57
そもそも、破壊操作を伴うメソッドを使う理由がさっぱりわからないし、
とりあえずdupする理由もさっぱりわからない
876870:2009/08/04(火) 18:01:41
nkf で確認するとスクリプトファイルが ISO-2022 でした(´Д`;)
LANG=ja_JP.eucJP なので油断してました。
スレ汚し失礼しましたm(_ _)m
877デフォルトの名無しさん:2009/08/04(火) 20:21:34
gemでkizapiっていうおもしろそうなのを入れたんだけど

usr@host:~/$ kizapi-kwic 春
/usr/lib/ruby/1.8/rss/rss.rb:803:in `install_ns': RSS::OverlappedPrefixError (RSS::OverlappedPrefixError)
from /usr/lib/ruby/gems/1.8/gems/kizapi-0.3.0/lib/kizapi.rb:9
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from /usr/lib/ruby/gems/1.8/gems/kizapi-0.3.0/bin/kizapi-kwic:5
from /usr/bin/kizapi-kwic:19:in `load'
from /usr/bin/kizapi-kwic:19

となるんだけども誰か使っている人います?wrapperとして古くなったのかね
878デフォルトの名無しさん:2009/08/05(水) 01:40:52
>>845-849
map のサンプルを調べて無事できるようになりました。
ありがとうございます。
879デフォルトの名無しさん:2009/08/05(水) 04:31:49
削除系
nilだけを削除する Edit

a = [nil, nil, 123].compact
p a #=> [123]

破壊的なやつもある

a = [nil, nil, 123]
a.compact!
p a #=> [123]



破壊的って意味がよくわかりません。
mergeしたときは強制的に一緒になるみたいなイメージだったのですが、
ここでの破壊的とは何でしょうか?
880デフォルトの名無しさん:2009/08/05(水) 04:45:28
レシーバ自体を書き換えてしまうということ
比較してみて

a1 = [nil, nil, 123]
a1.compact #=> [123]
a1 #=> [nil, nil, 123]

a2 = [nil, nil, 123]
a2.compact! #=> [123]
a2 #=> [123]
881デフォルトの名無しさん:2009/08/05(水) 11:51:04
破壊的っていうことばが良くないよね。わかりにくい。
882デフォルトの名無しさん:2009/08/05(水) 13:13:54
破壊的動作、とか破壊的代入、とかそういうのの省略なんだよね
破壊的という言葉だけ取り出すと不自然
883デフォルトの名無しさん:2009/08/05(水) 13:30:17
破壊神メソッドとか
884デフォルトの名無しさん:2009/08/05(水) 13:34:30
警告: 「破壊神」と聞いて何を出すかで世代がバレておっさん認定されます
885デフォルトの名無しさん:2009/08/05(水) 13:47:03
破壊神シヴァは何歳?
886デフォルトの名無しさん:2009/08/05(水) 16:01:21
rubyでバイナリを扱う場合、どんな型で扱ったら良いんですか?
数値の配列にした方が良いんでしょうか?
887デフォルトの名無しさん:2009/08/05(水) 16:14:21
>>886
String
1.9は知らん
888デフォルトの名無しさん:2009/08/05(水) 16:25:38
1.9だと"ASCII-8BIT"(="BINARY")エンコーディングのStringかな。
889デフォルトの名無しさん:2009/08/05(水) 16:27:35
ニンジンクラスをカレーとして使うようなもんだな
890デフォルトの名無しさん:2009/08/05(水) 18:28:07
Ruby1.8のStringはごく一般的な見地で言うと文字列クラスではなくバイト列クラス
1.9でやっとマトモな文字列クラスになった
891272:2009/08/05(水) 19:01:30
超初心者です。
クラスのメンバー変数に@をつけるのが気持ち悪いのですが何とかならないでしょうか?
892デフォルトの名無しさん:2009/08/05(水) 19:03:22
>>891
selfやthisを付けたりm_みたいな接頭辞をつけたりで
あれこれ揉める言語を学んでくると気持ち悪くなくなるぞ
893デフォルトの名無しさん:2009/08/05(水) 19:17:10
>>891
attr_accessor(:hoge) して
h = self.hoge
self.hoge = h
すれば書かなくて済むけど、こんなマネするならrubyを止めた方がいい
894デフォルトの名無しさん:2009/08/05(水) 19:20:58
>>892
自分で手突っ込んで吐きまくれば気持ち悪くなくなるのと一緒ですね、わかります
895デフォルトの名無しさん:2009/08/05(水) 19:45:56
>>893
privateにしてやるならそれもありだと思う
896デフォルトの名無しさん:2009/08/05(水) 19:52:16
>>891
Rubyスクリプトを着色してくれる適当なエディタ使え
インスタンス変数が見やすいと感じるようになるから

>>893
それは常にアクセサメソッドを経由するようにするという別な意味を持つので濫用禁止
897デフォルトの名無しさん:2009/08/05(水) 19:53:23
privateだと読み込みはできても代入ができねえや
>>895は忘れてください
898デフォルトの名無しさん:2009/08/05(水) 19:54:38
>>891
何十何百といった変数を扱うようになった時に
見た目、形状だけで変数がどこに属しているのかが
すぐに分かる事のありがたさに気付くだろう。
899デフォルトの名無しさん:2009/08/05(水) 20:09:28
まー初回は「@かよ…」と思ったことが全くないわけでもないような気がしないわけでもない

でもまあ慣れるよ、うん
@がつかなかったらメソッド返り値かローカル変数で、
@がついたらメソッド間を渡り歩くインスタンス変数で、
大文字(多くの場合、慣習的に全部大文字)だったらなにかの定数

着色のエディタに強く依存するけどな
俺の普段の頭の中では「インスタンス変数はなんか黄色のグローバルな変数」というイメージしかないぞ
900デフォルトの名無しさん:2009/08/05(水) 20:24:41
@の使用はIDE
901デフォルトの名無しさん:2009/08/05(水) 20:31:37
まつもとさんの講演を聴いたことがあって@について話してた。
実は本人も記号が好きでないらしい。

不必要にインスタンス変数やクラス変数を使いまくるのは良くないのだが、
そういう良くないプログラムを書くと「@」だらけになってすぐにわかるようにした、
ということだった。本当かどうか知らんがオレは納得して割と基準にしてる。
最初は「@」が嫌いだったが、意味がわかるとこのルールが好きになった。
902デフォルトの名無しさん:2009/08/05(水) 20:39:54
>>899の言うように、ちょっとスコープが狭いだけのグローバル変数だからな
903デフォルトの名無しさん:2009/08/05(水) 21:03:14
>>901
似たような話をどっかで読んだなあ……見つかった。『Beautiful Code』のエッセイ
メリットがある一方で、濫用は戒める効果を狙っているということだろうか

>このような命名法はプログラムが簡潔になるばかりでなく、
ひとめで変数の種別が分かるのでプログラムが読みやすくなる、
グローバル変数を多用するとプログラムで「$」ばかりで醜くなる
(ので、グローバル変数を使いたくなくなる)などの、すぐれた「副作用」もあります
904デフォルトの名無しさん:2009/08/05(水) 23:39:19
905デフォルトの名無しさん:2009/08/05(水) 23:57:18
さっしてやれ
学生が就職してrubyへの愛情を失ってしまったんだよ
906デフォルトの名無しさん:2009/08/06(木) 01:51:03
rubyつかってrails使わないのってありだよな。
ruby使ってるって言ったら、あぁ、RubyOnRailsってRailsひとくくりにされてしまう。
rails使わない分野もあるんだよ。
907デフォルトの名無しさん:2009/08/06(木) 01:52:48
独り言なら星につぶやけよw
908デフォルトの名無しさん:2009/08/06(木) 02:39:06
そんな寂しいこというなよ
909デフォルトの名無しさん:2009/08/06(木) 03:31:12
仕事でRails使って趣味でRuby1.9いじってる
910デフォルトの名無しさん:2009/08/06(木) 04:17:05
テスト環境(1.8.6)にてdbmを使うプログラムを書いたのですが、
サーバ(1.8.5が入ったcentos)に持っていくと、
dbmをrequireしようとした行で、dbmがないというエラーが出ます。
どうすれば使えるようになるのでしょうか?
rpmには以下が入っています。
ruby-rdoc-1.8.5-5.el5_3.7
ruby-libs-1.8.5-5.el5_3.7
ruby-irb-1.8.5-5.el5_3.7
eruby-libs-1.0.5-6.1
ruby-devel-1.8.5-5.el5_3.7
ruby-1.8.5-5.el5_3.7
eruby-1.0.5-6.1
911デフォルトの名無しさん:2009/08/06(木) 04:30:27
比較したところ、
/usr/lib/ruby/1.8/i386-linux/
配下に、dbm.soが入っていないようです・・何故?
912デフォルトの名無しさん:2009/08/06(木) 06:28:55
そりゃもちろん、コンパイル時にdbmが有効になってないんだろ
よく知られてるパス以外に置かれてるdbm関連を読まないというバグは1.8.6で直ったような気がする
913デフォルトの名無しさん:2009/08/06(木) 06:39:11
rpmパッケージをそのようにリビルドして再インストールすれば問題ないな
この環境で許可されてるかどうかかなり微妙だけど…
914デフォルトの名無しさん:2009/08/06(木) 10:16:40
if ARGV[0] == nil
end



if ARGV[0] == ""
end

で挙動が異なる場合があるのですが、nilと""って意味が違うんですか?
上のnilの書き方だと想定通りに動かないことがあります。
915デフォルトの名無しさん:2009/08/06(木) 10:39:13
普通は nil
ARGV に空文字列が入ることは基本的にないはず
916デフォルトの名無しさん:2009/08/06(木) 10:43:39
とはいえあることも想定して
nil と "" をチェックするのであった
917デフォルトの名無しさん:2009/08/06(木) 10:56:54
前者は引数が渡されなかった
後者は引数が渡されたがその内容が "" だった

だから意味的にも違うしそもそも nil != "" でしょ
918デフォルトの名無しさん:2009/08/06(木) 10:59:04
ありがとうございます。
p ARGV[0]
をスクリプトに入れてみたら
""
が表示されました。
相手のプログラムが""をARGV[0]に代入しているらしいことがわかりました。
これは特殊なケースだと思います。
自分でスクリプトを引数なしで起動するとnilが表示されるので、
やはり""とnilは違うんですね。
919デフォルトの名無しさん:2009/08/06(木) 11:00:21
俺ならnilか否かの判定には nil? を使うなあ。
それ以前に、 ARGV[0] をnilかどうかチェックするぐらいなら ARGV.empty? を使うわ
920デフォルトの名無しさん:2009/08/06(木) 11:02:59
irb で試すとすぐわかることだけど

% irb
irb(main):001:0> nil == false
=> false
irb(main):002:0> nil == 0
=> false
irb(main):003:0> nil == ""
=> false
irb(main):004:0> nil == []
=> false
irb(main):005:0> nil == {}
=> false
921デフォルトの名無しさん:2009/08/06(木) 11:03:22
>>917
引数のひと連なりの文字列を空白等で siplit & parse した結果の配列だぞ
空文字列ってなんだよ
922デフォルトの名無しさん:2009/08/06(木) 11:04:21
「ARGVにおける」という文脈を全く無視したレスがあるな
923デフォルトの名無しさん:2009/08/06(木) 11:13:51
>>921
myscript.rb aaa bbb ''

この場合 ARGV[2] の中身は何になりますか?
924デフォルトの名無しさん:2009/08/06(木) 11:22:19
>923
command not found
925デフォルトの名無しさん:2009/08/06(木) 11:22:44
>>921 の世界にはクォートが存在しないらしいw
926デフォルトの名無しさん:2009/08/06(木) 11:27:06
ARGVって空文字が入る場合があるのか……ややこしいな

>>914
細かいけど、わざわざ==で比較するよりは

if ARGV[0]
end

と書くのをお勧めする
927デフォルトの名無しさん:2009/08/06(木) 11:30:35
直感的で美しい言語ですね
928デフォルトの名無しさん:2009/08/06(木) 11:32:26
なんというか、みんなもうちょっとシェルの勉強しようよ
929デフォルトの名無しさん:2009/08/06(木) 12:33:46
おっシェル通り。
930デフォルトの名無しさん:2009/08/06(木) 12:50:16
シェル ウィー ラーニング?
931デフォルトの名無しさん:2009/08/06(木) 13:12:25
いっシェルけんめい頑張ります
932デフォルトの名無しさん:2009/08/06(木) 13:30:03
夏の駄シェル大会
933デフォルトの名無しさん:2009/08/06(木) 14:06:03
なんだもうスレ埋めか
934デフォルトの名無しさん:2009/08/06(木) 18:15:18
""とnilを同一視したいのなら require "php" をおすすめする。
935デフォルトの名無しさん:2009/08/06(木) 18:45:30
PHP ユーザは !== と === を知らないのが多いのかな
936デフォルトの名無しさん:2009/08/06(木) 18:50:42
>>934
いや、したくないのだが
937デフォルトの名無しさん:2009/08/06(木) 18:53:10
とにかく数値に変換してから比較するという便利機能の == があって、
それでは用が済まない厳密用途のために「あとから」 === が導入された
最初から == と === が定義されて使い分けられていたわけではない
938デフォルトの名無しさん:2009/08/06(木) 18:59:45
php の文字列比較は strcmp があるよね
文字列を == や === で比較してるのを見るともやもやする
そりゃたまたま動作することのほうが多いけどさあ
939デフォルトの名無しさん:2009/08/06(木) 19:22:55

  ┏┳┳┓     ハイ.     ┏┳┳┓
┏┫┃┃┃多言語の話題わ┃┃┃┣┓
┃┃┃┃┣┓   ここまで ┏┫┃┃┃┃
┃      ┃┃┏━━━┓┃┃      ┃
┃多言語  ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━━┫  ┗━┓
.             ┗━━━┛
940デフォルトの名無しさん:2009/08/06(木) 19:49:32
他の多言語。
941デフォルトの名無しさん:2009/08/06(木) 19:55:14
nil.to_sが""を返すのかnilを返すのかで過去に血みどろの壮絶な戦いが繰り広げられたらしいです・・・。
942デフォルトの名無しさん:2009/08/06(木) 20:03:08
ああいう「どっちもアリっちゃアリ」というのが一番面倒
943941:2009/08/06(木) 20:12:59
数学好きで最近Rubyに触り始めた私にとっては、nil.to_sやnil.to_iがnil以外の値を返すのはとても不思議に思います。
が、数学が嫌いな大部分の ぷろぐらま にとってはそれなりの値が返ってくるのが自然と感じるのは仕方ないとも思います。
944デフォルトの名無しさん:2009/08/06(木) 20:24:48
>>943
だ(600行くらい削除)
945デフォルトの名無しさん:2009/08/06(木) 20:40:56
to_sはともかく、to_iが返すのは整数であって欲しい
946デフォルトの名無しさん:2009/08/06(木) 20:59:11
>>945
to_sが返すものが文字列で無くてもいいのは何故?
947デフォルトの名無しさん:2009/08/06(木) 21:06:13
>946
ああ、そういう意味に取られたか…
to_sが返すものは文字列であるべき。ただ、過去に議論になったのは
nil.to_s => "nil" か => "" かって話だろ?だからそのどっちかというのは俺は結論付け難いって言いたかった
948デフォルトの名無しさん:2009/08/06(木) 21:17:40
>>943
数学がそんなにえらいのか!クソ野郎!!
949デフォルトの名無しさん:2009/08/06(木) 21:21:00
不自然だよなあ

C#から来たが挫折しそう
950デフォルトの名無しさん:2009/08/06(木) 21:33:23
>>948
数学は偉いよ
951デフォルトの名無しさん:2009/08/06(木) 21:37:07
うん、数学は偉い

ただ、数学が偉いということとはなんの関係もないが
952デフォルトの名無しさん:2009/08/06(木) 21:41:30
どの分野でも一番偉いって訳にはいかないからな。
まあ、適当にお茶濁しておいてくれ。
953デフォルトの名無しさん:2009/08/07(金) 00:50:49
数学より物理学の方が偉いよ。
もっと言うと、押尾学の方が偉いよ。
954デフォルトの名無しさん:2009/08/07(金) 04:51:57
GMT→日本時間(or NY時間)の計算機を作りたいのですが、どのように作ったものでしょうか?

to_jst("2009/08/06 7:33:36") → 日本時間がほしい

GMT周りの扱い等何か参考になる、メソッドはないでしょうか?
955954:2009/08/07(金) 05:05:26
Time.parseと時差?や時間の指定をつけたらほぼ一発でいけました

irb(main):016:0> require 'time'
=> true

irb(main):019:0> Time.parse "2009/08/06 7:33:36 +0000"
=> Thu Aug 06 16:33:36 +0900 2009

irb(main):021:0> Time.parse("2009/08/06 7:33:36 UTC").getlocal
=> Thu Aug 06 16:33:36 +0900 2009

おさわがせしました。

ありがとうございました。
956デフォルトの名無しさん:2009/08/07(金) 14:49:27
導入ガイドのページなどを参考にRuby1.9.1を導入しました。
某sixamo.rbを実行すると

*****@*****-laptop:~/sixamo$ ruby sixamo.rb -im data_directory
簡易対話モード [exit,quit,空行で終了]
> てすてす
sixamo.rb:740:in `split_into_terms': undefined method `[]' for nil:NilClass (NoMethodError)
from sixamo.rb:522:in `split_into_terms'
from sixamo.rb:512:in `split_into_keywords'
from sixamo.rb:235:in `talk'
from sixamo.rb:233:in `each'
from sixamo.rb:233:in `talk'
from sixamo.rb:819

とエラーを吐き終了します。

どうしてあげればいいんでしょうか?><
957デフォルトの名無しさん:2009/08/07(金) 15:04:04
>>956
それがしししゃも?

冗談はさておいて、1.8系にしてからまたおいで
958デフォルトの名無しさん:2009/08/07(金) 15:04:44
def recursive_dir(path)
Dir.foreach(path) do |v|
next if v == "." or v == ".."
if path =~ /\/$/
v = path + v
else
v = path + "/" + v
end
p v
if FileTest.directory?(v)
recursive_dir(v) #再帰呼び出し Recursive Call
end
end
end

というメソッドがあり、その出力内容に対して while などで処理を行いたいのですが

while file = recursive_dir(dir)

などではうまく動きません。
こういう場合はどんな方法が考えられますでしょうか?
959デフォルトの名無しさん:2009/08/07(金) 15:05:40
検索結果が出るまで「シックス・アモってなんだろう」とか思ってた俺

>>956
1.9には対応してないので諦めるのが一番早い
960デフォルトの名無しさん:2009/08/07(金) 15:07:19
タブが抜け落ちてしまった。。すみません

def recursive_dir(path)
Dir.foreach(path) do |v|
next if v == "." or v == ".."
if path =~ /\/$/
v = path + v
else
v = path + "/" + v
end
p v
if FileTest.directory?(v)
recursive_dir(v) #再帰呼び出し Recursive Call
end
end
end
961デフォルトの名無しさん:2009/08/07(金) 15:07:42
>>959
やっぱりそこですか。。
ありがとうございました;;
962デフォルトの名無しさん:2009/08/07(金) 15:08:22
orz

def recursive_dir(path)
  Dir.foreach(path) do |v|
    next if v == "." or v == ".."
    if path =~ /\/$/
      v = path + v
    else
      v = path + "/" + v
    end
    p v
    if FileTest.directory?(v)
      recursive_dir(v) #再帰呼び出し Recursive Call
    end
  end
end
963デフォルトの名無しさん:2009/08/07(金) 15:10:11
>>958
p はデバッグ用の画面表示
メソッド間で値を渡すのに使うことはできない
964デフォルトの名無しさん:2009/08/07(金) 15:32:21
>>958
Dir.glob(path + '/**/*').each do |v|
 whileで実行したい処理
end

再帰を使いたいなら v を配列に保存それをメソッドの返り値にする、
recursive_dir にブロックを渡して yield v する等々
965956:2009/08/07(金) 15:33:15
Ruby1.8xにしたうえでシシャモさんを実行したところ

sixamo.rb:809:in `require': no such file to load -- readline (LoadError)
from sixamo.rb:809
とでます。

文字入力も受け付けてくれません。
Rubyインスコに問題ありなんでしょうか・・?
966デフォルトの名無しさん:2009/08/07(金) 15:42:05
1.9系にして出直してこい
967デフォルトの名無しさん:2009/08/07(金) 15:51:11
>>963
>>964

ありがとうございます!勉強になりました。。。
もっと勉強します。
968デフォルトの名無しさん:2009/08/07(金) 15:53:55
>>965
エラーメッセージ読めよ……
969デフォルトの名無しさん:2009/08/07(金) 15:58:31
読んでもわからん可能性もゼロではなく…
readline と言われて何が悪かったのかわかるような人はこんなスレにいちいち来ねえよ

>>965
パッケージで 1.8 をインストールしたなら libreadline-ruby1.8 とかなんかそんなような感じの入れろ
自力でコンパイルしたなら libreadline-dev とか libreadline5-dev とか libreadline-devel とかなんかそんなやつ入れてからコンパイルしれ
970デフォルトの名無しさん:2009/08/07(金) 16:03:13
>>969
ありがとうございます。。
やってみます><

Ruby触ったのは今日が初めてでちんぷんかんぷんなのです。。
971デフォルトの名無しさん:2009/08/07(金) 16:47:15
>>969様仰せのとおりパッケージをインスコしましたがエラー内容変わらずです


elsif opt[:i]
require 'readline'                  ←809行目

sixamo = Sixamo.new(ARGV[0])
puts "簡易対話モード [exit,quit,空行で終了]"


諦めたほうがいいですかね・・?
972デフォルトの名無しさん:2009/08/07(金) 16:53:14
>>971 諦めるのはまだ早い
973デフォルトの名無しさん:2009/08/07(金) 16:56:13
>>972

お昼前からずっといじってますが、お手上げです。。
こっちがシシャモになりそうです><
974デフォルトの名無しさん:2009/08/07(金) 16:56:33
知識不足はいいんだけど、まず環境を書こうぜ
Linuxなのかmswin32なのか、Linuxにしても自分でコンパイルしたのかAPTで入れたのか
その辺が分からないことにはアドバイスする方も困る
975デフォルトの名無しさん:2009/08/07(金) 17:02:30
OSはUbuntu9.0.4です
Rubyはapt-get installでインスコしますた。
他パッケージはdebをおとしますた。

ttp://d.hatena.ne.jp/lagos_on/20090705/1246751141
↑このページを見ながら作業しました。

最初のapt-get後アンインストールして1.8xを自分でコンパイルしてインスコしました。
976デフォルトの名無しさん:2009/08/07(金) 17:15:41
「ruby no such file to load -- readline (LoadError)」でぐぐったら最初のページに答えが書いてないか。

ttp://dirk.net/2009/04/05/no-such-file-to-load-readline-loaderror-when-running-scriptconsole/

まず libreadline をインストール
sudo apt-get install libncurses5-dev
sudo apt-get install libreadline5-dev

そのあと ruby のソースで、readline 拡張ライブラリをコンパイル&インストール
cd /usr/src/ruby-1.8.7-p72/ext/readline
ruby extconf.rb
make
sudo make install

これを試してみて。


977デフォルトの名無しさん:2009/08/07(金) 17:15:49
>>975
自分でコンパイルした方を削除して、apt-getでインストールした方が良い
readlineの問題だけならたぶんapt側で何とかなる
978デフォルトの名無しさん:2009/08/07(金) 18:13:18
>>976氏の方法で進展いたしました

簡易対話モード [exit,quit,空行で終了]
> test
sixamo.rb:112:in `gsub!': premature end of regular expression: /『 \200(RegexpError)
from sixamo.rb:112:in `message_normalize'
from sixamo.rb:301:in `message_markov'
from sixamo.rb:249:in `talk'
from sixamo.rb:819
一応少し動きました・・。
まだエラーでますがグーグル先生に聞いたりして頑張ってみます><
ありがとうございました
979デフォルトの名無しさん:2009/08/07(金) 18:16:18
978はグーグルのつかいかたをおぼえた。
かしこさが3あがった。
980デフォルトの名無しさん:2009/08/07(金) 21:34:10
def time_to_sec(time) #time: "hh:mm:ss"
 @array_time = time.split( ":" )
 return @array_time[0].to_i * 24 + @array_time[1].to_i * 60 + @array_time[2].to_i
end

もっとかっこいいやり方(あるいは既にある関数)があれば教えてくださいm(_ _)m
981デフォルトの名無しさん:2009/08/07(金) 21:38:49
@@@
982デフォルトの名無しさん:2009/08/07(金) 21:45:39
@ の使い方(てか変数とかスコープとか)勘違いしてました(´・ω・`)
要らないですね。。。

他に直せる場所はありませんか?
983デフォルトの名無しさん:2009/08/07(金) 22:05:58
def str2sec(str)
if /(\d+):(\d+):(\d+)/ =~ str
return $1.to_i*3600+$2.to_i*60+$3.to_i
else
raise "unknown format: #{str.inspect}"
end
end
984デフォルトの名無しさん:2009/08/07(金) 22:08:42
日時関係はTimeで何とかするのが一番美しい

けど、どうしても"hh:mm:ss"の形式を扱わなければならないなら
俺なら983と同じで、正規表現使うかな

def time_to_sec(time) #time: "hh:mm:ss"
 if time =~ /(\d\d?)\:(\d\d?)\:(\d\d)/ then
  return $1.to_i * 60 * 60 + $2.to_i * 60 + $3.to_i
 else
  (エラー処理)
 end
end
985デフォルトの名無しさん:2009/08/07(金) 22:11:37
\d\d?

これはないだろ{}を使えよ
986デフォルトの名無しさん:2009/08/07(金) 22:15:04
根本的な算数が間違ってました(´Д`;)
ほんとすみません出直してきます
987デフォルトの名無しさん:2009/08/07(金) 22:17:49
>>983
>>984
そんな形で後方参照できるんですね!
ありがとうございます!
988デフォルトの名無しさん:2009/08/07(金) 22:22:36
>>985
いやそうでもない。
989デフォルトの名無しさん:2009/08/07(金) 22:43:31

/([01]?[0-9]|2[0-3])\:([0-5]?[0-9])\:([0-5]?[0-9]|60)/
990デフォルトの名無しさん:2009/08/07(金) 22:53:00
閏秒ミス
/([01]?[0-9]|2[0-3])\:([0-5]?[0-9])\:(60|[0-5]?[0-9])/
991デフォルトの名無しさん:2009/08/07(金) 22:54:02
rubyにはC++で言うところの std に当たる名前空間は無いんですか。
992デフォルトの名無しさん:2009/08/07(金) 23:09:23
ない。
993デフォルトの名無しさん:2009/08/07(金) 23:10:53
オープンクラスにそんなもんはない
どっかで誰かが読み込んだファイルが組み込みクラスの動作を改変していても気づく方法はないし
標準クラスと同じ名前のクラスを作っても下手したら永遠に気づかない可能性もある
994デフォルトの名無しさん:2009/08/07(金) 23:19:07
なるほど。まさに標準クラスと同じ名前のクラス作って5分ぐらい悩んだもん
で。
ありがとうございました。
995デフォルトの名無しさん:2009/08/08(土) 00:14:39
>980
def time_to_sec(time)
 time.split(":").inject(0){|r,e| r=r*60+e.to_i}
end
996デフォルトの名無しさん:2009/08/08(土) 01:38:50
>>995
injectを使うのか。面白いな。

こんなのはどうか。入力のチェックは省略。
def time_to_sec(time_str) #time: "hh:mm:ss"
 hh, mm, ss = time_str.split(/:/)
 return hh.to_i*60*60 + mm.to_i*60 + ss.to_i
end
997デフォルトの名無しさん:2009/08/08(土) 02:54:08
>>996
なんだかお手本的だw

せっかくだからライブラリに頼ってみる
Time.parseが使えそうだったけど厳密すぎた
require 'parsedate'
def time_to_sec(time_str) #time: "hh:mm:ss"
 ary = ParseDate.parsedate time_str
 return ary[3] * 60 * 60 + ary[4] * 60 + ary[5]
end
998デフォルトの名無しさん:2009/08/08(土) 02:55:54
しまったこうする流れだった
hh, mm, ss = ParseDate.parsedate(time_str)[3..5]
999デフォルトの名無しさん:2009/08/08(土) 05:29:52
>>991
あっても便利かな、と思うことは時々ある
1000デフォルトの名無しさん:2009/08/08(土) 05:39:26
軽傷治癒の杖とか拾った杖を後生大事に倉庫に貯めてたら、
なんでも屋に安価に売ってることに気づきました

 ・ 投資を続ければ安い杖から高い杖までずらっと並ぶ
 ・ 投資を続けるとミドルクラスから高価な杖がメインに並ぶ

どっちになるんでしょう
後者の場合は、安い杖が欲しい場合は「あえて投資しない店」を作る必要がありますよね
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。