Ruby 初心者スレッド Part 14 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/08/25 13:05:43
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは>>2-10あたりを見てください。Ruby on Railsの質問はWebProg板のRailsスレで。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・ぐぐる
 ・マニュアルで探す URLリンク(www.ruby-lang.org)
 ・FAQを読む URLリンク(www.ruby-lang.org)
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(なるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

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


2:デフォルトの名無しさん
07/08/25 13:07:45
本スレ
Rubyについて Part 28
スレリンク(tech板)

RUBYの宿題教えてください。
スレリンク(tech板)

Railsスレ
【Ruby】Ruby on Rails Part3
スレリンク(php板)

3:デフォルトの名無しさん
07/08/25 13:11:06
#過去ログ
Ruby初心者スレッド Part 13
スレリンク(tech板)
Ruby初心者スレッド Part 12
スレリンク(tech板)
Ruby初心者スレッド Part 11
スレリンク(tech板)
Ruby初心者スレッド Part 10
スレリンク(tech板)
URLリンク(makimo.to)
Ruby初學者スレッド Part 9
スレリンク(tech板)
URLリンク(makimo.to)
Ruby初心者スレッドPart8
スレリンク(tech板)
URLリンク(makimo.to)
Ruby初心者スレッドPart7
スレリンク(tech板)
URLリンク(makimo.to)
Ruby初心者スレッドPart6
スレリンク(tech板)
URLリンク(makimo.to)

4:デフォルトの名無しさん
07/08/25 13:11:40
Ruby初心者スレッドPart5
スレリンク(tech板)
URLリンク(makimo.to)
Ruby初心者スレッドPart4
スレリンク(tech板)
URLリンク(makimo.to)
Ruby初心者質問スレPart3
スレリンク(tech板)
URLリンク(makimo.to)
Ruby初心者質問スレPart2
スレリンク(tech板)
URLリンク(makimo.to)
Ruby初心者質問スレPart1
スレリンク(tech板)


5:デフォルトの名無しさん
07/08/25 13:12:21
= 公式/非公式関連リンク

== Rubyを知る
Ruby Home Page
URLリンク(www.ruby-lang.org)

== Ruby使用時の調べもの
Rubyリファレンス
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-doc.org) (英語)
リファレンスのHTMLヘルプ版配布
URLリンク(elbereth-hp.hp.infoseek.co.jp)
# Windowsで便利
Ruby FAQ
URLリンク(ruby-lang.org)

Programming Ruby - The Pragmatic Programmer's Guide
URLリンク(www.ruby-doc.org)
# 好評書籍をWebで公開中、ただし英語
逆引きRuby
URLリンク(www.namaraii.com)


6:ここまでテンプレ
07/08/25 13:14:25
== Ruby使用時の探し物
RAA - Ruby Application Archive
URLリンク(raa.ruby-lang.org)
RubyForge
URLリンク(www.rubyforge.org)
# 共にRubyのアプリやライブラリが検索できる

== Ruby関連のニュースや読み物
日本Rubyの会 公式Wiki - 日本Rubyの会Wiki
URLリンク(jp.rubyist.net)

Rubyist Magazine - るびま
URLリンク(jp.rubyist.net)
# コードレビューが好評

== いろいろRubyサイト
Matzにっき … Ruby作者の日記
URLリンク(www.rubyist.net)〜matz/

Ruby hotlinks 五月雨版 … Ruby関連の日記やblog
URLリンク(www.rubyist.net)〜kazu/samidare/
Rubyの本一覧
URLリンク(www.ruby-lang.org)
<rubyXML/>
URLリンク(www.rubyxml.com)
Ruby Weekly News @ Ruby Garden
URLリンク(www.rubygarden.org)


7:デフォルトの名無しさん
07/08/25 14:52:09
死ね

8:デフォルトの名無しさん
07/08/25 15:51:57
>>7
ツンデレ?


9:デフォルトの名無しさん
07/08/25 17:33:35
厳密にはRubyあんま関係ない気がしますが、EUC-JPの「〜」(キーボードから入力できる普通のやつ)を
utf-8に変換すると化けます。

$ ruby -e "require 'nkf'; puts NKF.nkf('-Ew,-Lu,-m0x --cp932','うんにょろ〜うんにょろ〜')"> u.txt

u.txt の表示結果
うんにょろ縲怩、んにょろ縲

$ ruby -v
ruby 1.8.2 (2005-04-11) [i386-linux]
$ nkf --version
Network Kanji Filter Version 2.0 (4/0401/Shinji Kono)

半角カタカナに当たるものは極力維持したいです。
RSS出力に使うのでutf-8は避けきれません。うまい方法ありませんか?

10:デフォルトの名無しさん
07/08/25 18:12:38
Windowsなら化けない

11:デフォルトの名無しさん
07/08/26 09:59:29
wxRubyを使ってたんですが、ListCtrlにset_background_colourで背景色
を設定しようとしたら
`set_background_colour': stack level too deep (SystemStackError)
と出て落ちてしまいます。
ほかのコントロールは普通に背景色設定できるんですが、
ListCtrlは何か違うんでしょうか?

12:デフォルトの名無しさん
07/08/26 22:34:20
ちょっとした、スレッドとSocketの勉強をしています。
そこで
accept = TCPServer.open(8080)
while true
Thread.start(accept.accept) do |s
s.gets
print $_
end
end

のようなRubyの解説サイトにあったコードを書いたのですが…。
スレッド内からprintのような関数は使えないのでしょうか?
全く文字を表示してくれません。
また、print $_の部分に
File.open("log.txt","w") do |f|
f.write(f)
end
のようにファイル出力させても、ファイルが出力されません。
スレッド内で、ファイル出力や標準出力させるにはどうすれば良いのでしょうか?
念のため、排他的処理をしようとm=Mutex::newをやってから
print $_をm.synchronize{}で囲っても結果は同じでした。
環境は
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-cygwin]
です。
よろしくお願いします。

13:デフォルトの名無しさん
07/08/27 10:21:53
新スレなのに質問ばっかで回答Neeeeeeeeeeeeeeeeee

14:デフォルトの名無しさん
07/08/27 12:29:57
>>12
そもそもs.getsで何も受け取ってないとか

15:デフォルトの名無しさん
07/08/27 14:02:58
>>12
> Thread.start(accept.accept) do |s
最後にパイプが抜けてるのはコピペミス?

16:デフォルトの名無しさん
07/08/27 16:16:46
open-uriで追加ヘッダフィールドを渡す場合、マニュアルによれば

open(uri, 'Cookie'=>cookies,'Connection'=>'keep-alive','Keep-Alive'=>'30')

などいちいち直に書かなくてはなりません。なんだか面倒です。
「ハッシュに格納しておいたヘッダフィールドをちょっと加工して渡す」というような便利な方法はありませんか?

17:デフォルトの名無しさん
07/08/27 16:47:26
ハッシュそのまま uri のあとに渡してもダメ?

18:デフォルトの名無しさん
07/08/27 17:00:01
OpenURI.open_uriを読む限りでは…よくわからんな

19:デフォルトの名無しさん
07/08/27 17:07:32
>>12
別のアプリから何か送ってやらないと何も表示されないだろ
そのスクリプトを動かしておいて、別のコンソールから
ruby -rsocket -e "s=TCPSocket.open('localhost',8080);s.write('foobar');s.close"
とかやってみれ


20:デフォルトの名無しさん
07/08/27 18:23:13
>>16
メソッド引数のハッシュリテラルの{}は省略することが出来るので
open(uri, 'Cookie'=>cookies,'Connection'=>'keep-alive','Keep-Alive'=>'30')
は実際には
open(uri, {'Cookie'=>cookies,'Connection'=>'keep-alive','Keep-Alive'=>'30'})
と同じこと、ですから
extraheader = {'Cookie'=>cookies,'Connection'=>'keep-alive','Keep-Alive'=>'30'}
open(uri, extraheader)
としてもOKです

ところで、引数のハッシュリテラルの{}が省略可能ってマニュアルのどこかに記述してあるのかな?
私はわりと長い間知らなかったんだけど…


21:デフォルトの名無しさん
07/08/27 18:57:00
>20
URLリンク(www.ruby-lang.org)
> メソッドの引数の末尾に要素が1つ以上のハッシュを渡す場合は、{, }を省略することができます。
> ただし、obj[...] 形式のメソッド呼び出しと配列式では、要素全体がハッシュの場合に限り、 {, }を省略することができます。

ただ、ほとんどの人はこんなとこ読んでないしほとんどの解説では説明してないはず。

22:デフォルトの名無しさん
07/08/27 18:58:18
っていうか、むしろ、なんで省略なんかできるようにしたのかさっぱりわからん
これで誰が喜ぶんだよ

23:デフォルトの名無しさん
07/08/27 19:04:59
キーワード引数のエミュレートだから
ピカチュウ本(初版)には書いてあったよ
このあたりはるりまでいくらか改善されるのだろうか・・・

24:デフォルトの名無しさん
07/08/27 22:19:46
プログラミングRubyの第二版には書かれてた。わりと初めの方だったと思う。

25:デフォルトの名無しさん
07/08/28 01:58:17
>>22
メソッド呼び出し時の引数のHashの { } が省略できると、( ) も省略できるので個人的には多用している。
( ) なしで { } を書くとブロックとみなされちゃうのよねん。

26:デフォルトの名無しさん
07/08/28 03:36:55
なるほどというか、そのためなのかな

27:デフォルトの名無しさん
07/08/28 08:27:28
メソッド呼び出しの () は常につけようぜ

28:デフォルトの名無しさん
07/08/28 09:01:22
()は付けるなって規約に書いてたけど・・・

29:デフォルトの名無しさん
07/08/28 09:09:01
printとかputs以外は()付けてるなあ

30:デフォルトの名無しさん
07/08/28 09:11:44
引数がある場合のみ絶対つける

いや、foo hoge huga と並んでたとして、
これがメソッドfooに変数hogeとメソッド(の返り値)hugaを渡してるもんだってわかりにくいだろ

いくらRubyがうまく解釈してくれるから動くからって言ったって、書いてる人間がわかりにくかったら意味ねーよ、と思ってる
常につけないメリットってなんじゃらほい

31:デフォルトの名無しさん
07/08/28 09:39:27
漏れはプロシジャ的に呼ぶ時はつけなかったりする

>>30
カンマカンマ

32:デフォルトの名無しさん
07/08/28 11:12:58
>>9
'-Ewxm0 -Lu --no-best-fit-chars' でどうでっしゃろ?

33:デフォルトの名無しさん
07/08/28 12:00:01
arr = []
while gets
 arr << $_
end
を一発で書く方法ないですか?

34:デフォルトの名無しさん
07/08/28 12:03:12
readlines

35:デフォルトの名無しさん
07/08/28 12:18:35
関数的メソッドgetsとwhileのタッグを広めた奴の罪は根深いな

36:デフォルトの名無しさん
07/08/28 13:15:31
普及 (Perl からの移行) を促進するには仕方なかったのだろうか?

37:デフォルトの名無しさん
07/08/28 13:23:42
引数が長過ぎて途中で改行する時だけ()つける。
そうしないのruby-modeのインデントが変なんですもの

38:デフォルトの名無しさん
07/08/28 13:52:01
while line = gets
p line
end

という、whileと謎の語getsを用いたループは

ARGF.readlines.each do |line|
p line
end

という、IOオブジェクトから読んで配列にしたものをeachで回すのと動作同じ
# 細かいこと言うの禁止
理解的にはこっちのほうが素直だと思う(記述がwhileよりヨコに長くなるのが難か)

最初にgetsで習うとARGFの存在を認知しにくいんじゃないかなあ

>>33
ということで、上記の配列部分
arr = ARGF.readlines

39:デフォルトの名無しさん
07/08/28 15:13:11
そのループの例、readlinesいるか…?


40:デフォルトの名無しさん
07/08/28 15:26:05
IOクラスのインスタンスが生成されてるはずだからARGF.eachでそのまま動くはず
というかARGF.readlinesのreadlinesもクラスメソッドではなくインスタンスメソッドなんじゃね?

41:デフォルトの名無しさん
07/08/28 15:57:15
>>38
全然違うよ

while line = gets; p line; end

この場合の gets は $stdin.gets の略。ARGF は

% hoge.rb foo.txt bar.txt

みたいにしたときに foo.txt, bar.txt の内容が入ってる
仮想的なファイルオブジェクト(オープン済み)

42:41
07/08/28 16:07:33
すまん大嘘書いた(;´д`) Ruby マニュアルより
> ARGF
> スクリプトに指定した引数 (ARGV を参照) をファイル名とみなして、
> それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。
> ARGV が空なら標準入力を対象とします。

細かいことはさておき>>38のでよかったんだな。申し訳ない

43:デフォルトの名無しさん
07/08/28 16:21:40
readlines みたいに (ファイルがでかいと) メモリを湯水のように使いそうな
メソッドを使うのはいかにも富豪プログラミングっぽくってなんかイヤだなあ、
と思う俺は我ながらかなりしみったれてるな、と感じる今日このごろ。

44:デフォルトの名無しさん
07/08/28 16:44:08
本当にちょっとずつ読むようなメモリに優しいメソッドってそもそもRubyに少ないような…

最近は瞬間的なメモリ使用量増大はもうあきらめて、
なるべく不要になった直後にarr.clearとかstr=nilとかするようにしてる
これはこれでなんか空しい

45:デフォルトの名無しさん
07/08/28 22:13:36
1.9 で readlines も Enumerator を返すようには・・・ならんか。
ファイルを一揆読みしたいだけのときに勝手に遅延されたらかなわんしな。

46:デフォルトの名無しさん
07/08/28 22:36:26
メソッド呼び出しにカッコ付けるか付けないかは
俺の場合はブロック以外の引数を見て

引数なしならいつもカッコなし
引数が複数行に渡るならいつもカッコあり(
)
x = 引数がありメソッドの戻り値を得たいなら(カッコあり)
カッコ(あり) if 引数があり後に修飾子が付く
引数があっても 後に修飾子が付かず,戻り値も得ないなら,カッコなし

47:デフォルトの名無しさん
07/08/28 23:50:06
ARGFがIOオブジェクトだって言われてて、
ARGF.eachとかもよく使うんだが、
ふと気になってp ARGF.classしたらObjectだったような
記憶がある


48:デフォルトの名無しさん
07/08/28 23:57:07
IOオブジェクトのメソッドが使えるってだけで、厳密にはIOインスタンスを返してるのではないはず

注意深い人の説明は「ARGFはIOオブジェクトのメソッドが使えますよ」というような文言になってる

49:デフォルトの名無しさん
07/08/29 00:09:05
作者さんは
> IOクラスと互換性のあるStringIOクラスやARGFオブジェクト
という表現をしてるな
URLリンク(itpro.nikkeibp.co.jp)

ちなみにこの一連の連載はなかなか面白い読み物なのでどうしても暇なときとかに読むと良

50:デフォルトの名無しさん
07/08/29 00:17:10
is_a? よりrespond_to? で考えよう
というと広げすぎor的外れかな

51:デフォルトの名無しさん
07/08/29 00:56:10
相談させてください。
Ruby で派生する場合、
下記コード1のように書くと思うのですが、
それを下記コード2のように書くのは NG でしょうか?
スーパークラスのプライベートインスタンス変数が、
サブクラスのインスタンスからも見えてしまうことに
抵抗を感じ、コード2のように書こうかと考えています。

コード1:
class Base
end

class Derived < Base
end


コード2:
require 'delegate'

class Base
end

class Derived < SimpleDelegator
  def initialize
    super Base.new
  end
end


52:デフォルトの名無しさん
07/08/29 01:51:05
>51
細かく言うと「コード2」は派生でなく委譲やね(書いてあるとおりだが)
もちろん禁じ手でも何でもない。
自分の意図した動きをして、自分の意図がより率直に書けていると思う方を選べばよろし。
ただし、コード2では(書いてあるとおり) DerivedはBaseのサブクラスではないので注意。

53:デフォルトの名無しさん
07/08/29 02:21:11
>52
どもです。
すみません。自分の頭の中を言わずにすっとばしてましたね。
委譲であることは理解しています。
またご指摘頂いたとおりサブクラスではない、
すなわち kind_of が(派生ならば true となるのに)
false になるのも分かっています。

心配なのは次の点です。
SimpleDelegator は method_missing を利用している(…たぶんそう)ので、
委譲先のメソッドを多用する場合、速度面でどのくらい不利になるのか?

上記の該当する想定として
・あるクラスを少しだけ機能追加、機能拡張して使いたい。
・けれども、大抵は拡張前の機能(メソッド)が呼ばれる。
を考えています。

あぁそうか「method_missing ってコストが高いですか?」って
聞けばよかった気がしてきました。すみません。
というわけで method_missing は高くつくものでしょうか?


54:デフォルトの名無しさん
07/08/29 09:59:46
>53
ソース覗いたけど、method_missingは使ってない。
始めにmethodsでオブジェクトのメソッドを洗い出して、
同名のメソッドを委譲先にsendする特異メソッドを自分にevalしてる。
だからコストが高いのはnewの時だと思う。
sendはリフレクションの中では早いほうだったと思う。


55:デフォルトの名無しさん
07/08/29 10:07:16
高くつきます。
問題は、高いかどうかではなく、それが許容範囲かどうかです。スピードが必要であればお勧めしません。
また他にボトルネックがある場合(たとえばDBへの接続とかがボトルネックになっている場合)は、method_missing をなくしたところでアプリケーションは速くなりません。


56:デフォルトの名無しさん
07/08/29 10:27:51
method_missingが高くつくかどうかなんて、
中の処理しだいだと思うのは漏れだけか…?


57:デフォルトの名無しさん
07/08/29 13:09:41
>54
ソースまで見て頂いてしまって恐縮です。
こちらも今、見てみました。確かに new の時に色々やってますね。
今は目的としてインスタンス毎に委譲先を変えたい訳でもなく、
ただ継承と同じことをしたいだけなので。
ただし、 >51 のプライベートインスタンス変数の件を解決した形で。

>55
むむ…そうですか。
method_missing の呼び出しに掛かるコストは
(通常のメソッド呼び出しと)同等程度かと思っていました。
通常のメソッド呼ぶときにもインスタンス内にある
メソッド名のスロット(でいいのかな?)を探して、
あったら呼ぶと思っていたので、
どちらにしてもメソッド名の探索をする時点で似たような
ものかな〜と。
う〜ん…高いのかぁ。どの位違うか測ってみようかな。

>56
すみません。私の書き方が悪かったですよね。
何について高いか知りたかったか、というと
「method_missing の処理が始まって、終わるまで」ではなく、
「method_missing の処理が始まるまで」なのです。


delegate.rb を眺めていたら、
DelegateClass というのもありました。
DelegateClass は(module_eval しているトコの) initialize も短いし、
継承の代わりに使うなら、DelegateClass がいいかもですね。


58:デフォルトの名無しさん
07/08/29 18:36:21
質問です。スレの趣旨から少し外れてしまうかもしれませんが。

RMagickで、Image#thumbnail! を使い、画像を縮小しました。
このインスタンスを a とします。
これをImage#to_blob してActiveRecordに保存し、
そしてそれを Image#from_blob によって再び画像に戻しました。
この取り出したインスタンスを b とします。

この二つが同じものでないのです。
a ... PNG 87x112=>32x32 32x32+0+0 DirectClass 8-bit 16kb
b ... PNG 32x32 32x32+0+0 DirectClass 8-bit 2kb

どうやら a には元のファイルサイズのときの情報などが残っているようです。
a をActiveRecord に保存することなしに、to_blob, from_blob すると、b と
同じものになります。

a に何かメソッドを1つ適用して、元の情報を削除し b と同じものにすることは
できないでしょうか?

URLリンク(www.simplesystems.org)
アンドゥ情報を削除するメソッドがないか探してみたのですが、うまく見つか
りません。

59:デフォルトの名無しさん
07/08/29 19:24:05
irbで、たとえば何か文字列を返すようなメソッド、

irb> file = File.read('1MB.txt')

とかすると、読み込んだ1メガバイト分のファイル内容がずらーっともう延々と画面上を流れていくんですが、
とってもウザいので何とかしたいです。

 ・ 設定で何とかなる
 ・ 書くときにこういうメソッドを使うと表示はされなくなる

というアドバイスをお願いします。今もまだえんえん流れてます。勘弁して欲しいです。

60:デフォルトの名無しさん
07/08/29 19:50:43
>今もまだえんえん流れてます
ワロタw

61:デフォルトの名無しさん
07/08/29 22:16:23
file = File.read(file) and 1
って付けてみるとか

62:デフォルトの名無しさん
07/08/29 22:32:44
(file = File.read('1MB.txt')).type
とかやってみるとか

63:デフォルトの名無しさん
07/08/30 00:03:40
>>59
(おまけ)長すぎる出力を切り詰める
URLリンク(mono.kmc.gr.jp)

64:デフォルトの名無しさん
07/08/30 00:07:05
カンマの復文で消しゃいいんじゃんね?とおもったら

a = 1, b = 2, c = 3
ってやると期待したとおりにならないんだね。

65:デフォルトの名無しさん
07/08/30 00:31:28
file = File.read('1MB.txt'); nil

まぁ普通は ;nil だな。
mechanize とか使ってるときもコレは必須。
というかmezhanizeとirbの相性の悪さは異常

66:デフォルトの名無しさん
07/08/30 09:34:05
>>59

$ irb --noecho

で起動するか、

~/.irbrc に

IRB.conf[:ECHO] = false

を追記する。


67:デフォルトの名無しさん
07/08/30 11:32:33
使い捨てスクリプト言語のくせにgotoねーのかYO!・・・orz

68:デフォルトの名無しさん
07/08/30 12:14:25
gotoは実装するの面倒だったという話がある

どうしても何らかの理由でジャンプしたいなら catchとthrow か rescueとraise
あるいは ループとbreak/next/retry か メソッド定義とreturn の組み合わせで跳べ

Rubyでも複雑なgoto文プログラムに負けない複雑なプログラムを書くことは可能だ

69:デフォルトの名無しさん
07/08/30 12:21:44
>>67
gotoなんて長らく使っていなければ、gotoが欲しいなんて全く思わなくなるから、
gotoのないプログラミングに早く慣れたほうがいい

70:デフォルトの名無しさん
07/08/30 14:53:28
>>63
~/.irbrcでreturn_formatを指定。

IRB.conf[:PROMPT][:DEFAULT][:RETURN] = "%.100s\n"

100byteまでに切り詰められる。


71:59
07/08/30 15:13:23
昨日のirbが嫌いになりそうだった者です返答感謝です

何かあったときのために>>61>>65を覚えておくことにします
設定は>>70がよいとこ取りでいい感じなので1万バイトに制限してみました

72:デフォルトの名無しさん
07/08/30 16:51:48
1万バイトまではOKなのか。
つっても100x50なら二画面だけだな。


73:デフォルトの名無しさん
07/08/30 17:30:46
数えてみたら8000文字くらいまでは1画面に入りますね
ちょこっと戻るくらいでいいかな、みたいな

むしろこれの恩恵を受けるのはcmd.exe上で使うWindows版irbなのではないかと

74:デフォルトの名無しさん
07/08/30 17:46:35
p (3<=>5) #-1
p (5<=>3) # 1
p (3<=>3) # 0

左辺が大きければ-1
右辺 1
同じ 0

a <=> b
だとaが右辺で、bが左辺なの?
わかんね

75:デフォルトの名無しさん
07/08/30 17:49:38
>>74
何言っちゃってんの?

76:デフォルトの名無しさん
07/08/30 18:42:35
3<=>5は「Integerクラスに属する3のインスタンスメソッド<=>に引数5を渡してる」って読むんだぜ
Stringだとわかりやすい
irb> 'a'.<=>('b')
-1

ということで、selfが大きければ正だ
それ以外の何物でもない
右辺とか左辺とかそーゆーわかりにくい概念無し

77:デフォルトの名無しさん
07/08/30 19:28:29
>>61
自分は場合によっては;nilを付けてる。

78:デフォルトの名無しさん
07/08/30 22:30:31
>>77
何度も言わなくてもわかったって

79:デフォルトの名無しさん
07/08/30 23:26:02
urlを与えると、そこのhtmlソースから
 video/******* (←7桁の数字)
と書いてあるところを見つけて、 ******* を配列@numberに入れてくれるコードを書きたいのですが、
ソース中に出てくる最初の ******* だけしか格納してくれず、
うまくいきません。

かれこれ5時間ほど手詰まりです・・・
どうか助言をお願いいたします。

#! ruby -Ks
require 'open-uri'

class Download_url
def initialize(target_url)
@number = []
@target_url = target_url
html = open(@target_url) do |f|
f.each do |line|
if /video.([0-9]{7})/ =~ line
number.push($1)
end
end
end
end

attr_reader :number
end

urllist = Download_url.new('URLリンク(hika5.blog55.fc2.com)')
puts urllist.number

80:デフォルトの名無しさん
07/08/30 23:32:27
一般論として、「HTMLから正規表現reで○○な部分を抜き出して配列に格納」は

arr = html.scan(re).flatten
とか

html.scan(re){
arr.push("url: #{$1}")
}

とか書く

やってみ

81:デフォルトの名無しさん
07/08/31 00:28:28
>>76
あっざーす
レシピの本に右辺左辺って説明があってもやもやしてました

82:79
07/08/31 00:29:56
>>80
あああああ、
できました!!1!

html.scan(re){ ←
arr.push("url: #{$1}")
} ←

の括弧がなかったのが原因でした。
しかしなぜ必要なのかいまいち分からないまま・・・
勉強してきます。

これで今夜はぐっすり寝られそうです。
ありがとうございました!

83:デフォルトの名無しさん
07/08/31 02:12:48
Array#shuffleキボソス

84:デフォルトの名無しさん
07/08/31 04:34:17
>>83
つ 1.9


85:デフォルトの名無しさん
07/08/31 07:43:08
>>83
arr.sort{|x, y| rand(3) - 1 }

86:デフォルトの名無しさん
07/08/31 08:10:50
>>76
> selfが大きければ正
(selfさえわかってれば)めちゃくちゃわかりやすい説明ですな

87:デフォルトの名無しさん
07/08/31 09:43:47
Array#swapだかexchangeの要素の交換ってないの?

88:デフォルトの名無しさん
07/08/31 10:36:22
具体的にどんな動作なのか言ってくれ
○○言語の××、でもいい

89:デフォルトの名無しさん
07/08/31 10:37:08
rubyの言語仕様ってどこにあんの?
どっかにあるらしいのですが・・・

90:デフォルトの名無しさん
07/08/31 10:46:37
ガンダーラといい勝負だな・・・

91:デフォルトの名無しさん
07/08/31 11:04:20
その〜国の名は島根、どこかにあるユートピア。


92:デフォルトの名無しさん
07/08/31 11:05:45
鳥取とかもどこかにある感じだよな

93:デフォルトの名無しさん
07/08/31 11:19:21
取烏の帝都営団高速交通に乗って行けるところにあるらしい

94:デフォルトの名無しさん
07/08/31 13:10:27
>>79
HTMLをスキャンして配列にデータ格納、ってのはあんま initialize に詰め込む処理じゃねーな
作るのに慣れてきたらメソッドに分けることを考えるといいかも

95:デフォルトの名無しさん
07/08/31 23:25:31
標準出力に表示されている文字列を変数に入れるにはどうすればいいのでしょうか?

キーボードから文字を拾うのはあちこちに説明があるのですが、
コンソール画面に表示されている文字を取り込む方法が探しきれません

以前Cの質問スレできいてみたのですが、スルーされてしまったのでこちらで聞いてみました
マルチではないつもりですが気に障ったらスミマセン

96:デフォルトの名無しさん
07/08/31 23:43:10
Cスレで聞いたものをなんでこのRubyスレで聞けるん??

一般論としては既に表示してしまった文字を取り込む方法は無い
普通の表示とは違う表示領域自体を専用に作ってそこに表示しておくとかそういう芸が必要

97:95
07/08/31 23:57:11
>>96
自分にとっては「文字列を取得する」という目的が大事であって
「Cでやる」とか「Rubyでやる」といった手段は二の次だったので

そういった節操の無さがRubistの気に障ったらごめんなさい

そうしますと、shellでバックスペースを押したときに左側の文字が消えるというのは
ものすごく低レベルなところで実装されているということのでしょうか?

98:デフォルトの名無しさん
07/09/01 00:01:26
あれは制御文字\bを表示してるだけだろ
irb> puts "ABCD\bE"
ABCE


99:95
07/09/01 00:14:45
そうですよね。つまり「一度画面に出た文字列を操作した」ということなわけで

だからそういった動きを自分の小さなプログラムでやるのは、高級言語ではやはり無理なのですね…

shellがバックスペースで画面を操作できるのはバッファを管理しているから?

Cursesとかでも触れるのかなと思ったのですが

変な質問に付き合ってくださってありがとうございます

100:デフォルトの名無しさん
07/09/01 01:43:52
>>99
> shellがバックスペースで画面を操作できるのはバッファを管理しているから?
バッファを管理してるのはターミナルエミュレータ。


101:デフォルトの名無しさん
07/09/01 08:41:30
何をしたいのかが全然説明できてない気がするな

15 年前の「パソコン」だったらともかく、現代の環境で、アプリケーションが
「キーボード」を読むのはそれなりに難しいように思うわけだが

102:デフォルトの名無しさん
07/09/01 11:37:52
深い話したいのか浅い話したいのかよくわからんね

ターミナルが表示している文字を取り込むのは面倒だが、
プログラムの中でシェルを起動して目的のプログラムを動かしてその出力を奪うことなら普通にできる
他のプログラムの出力をパイプで最初に流し込むということもできるだろう

103:デフォルトの名無しさん
07/09/01 15:51:10
蛆久氏ね

104:デフォルトの名無しさん
07/09/01 20:03:22
すいません。.irbrcはWindowsの場合どちらにおけばよいでしょうか。
%HOME%に.irbrcをおいてみたのですが読まれないようです。

Windows XP、ActiveScriptRuby 1.8.5

105:デフォルトの名無しさん
07/09/01 20:25:02
ruby -e 'puts ENV["HOME"]'

これで表示されるフォルダに置け

106:デフォルトの名無しさん
07/09/01 20:33:23
.irbrc:
IRB.conf[:PROMPT][:DEFAULT][:RETURN] = "%.100s\n(省略されました・・全てを読むにはここを押してください)\n"

irb> file=File.read('largefile.html')
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n\"URLリンク(www.w3.org)
(省略されました・・全てを読むにはここを押してください)
irb>

けっこう柔軟だなこの設定

107:デフォルトの名無しさん
07/09/01 21:16:57
蛆久イラネーヨ

108:デフォルトの名無しさん
07/09/01 21:32:21
>>105
なるほど!できました。ありがとうございます。

109:デフォルトの名無しさん
07/09/02 00:30:16
>>106
ここを押したけど続きが読めないんだけど。

110:デフォルトの名無しさん
07/09/02 11:45:20
ruby -e 'puts readlines.reverse'
と似たような動作のUNIXのコマンドってありますか?

111:デフォルトの名無しさん
07/09/02 11:59:55
>>110 tac(1)
俺のFedoraCoreではcoreutilsで入ってる

112:デフォルトの名無しさん
07/09/02 12:16:12
tacだな

わりと昔からあるから、Linuxなら使えるはず
ちなみにFreeBSDには標準では入ってない

113:デフォルトの名無しさん
07/09/02 12:24:13
ありがとう。Cygwinには入ってるみたいだ。
しかしUNIXのコマンド名探しって推論機能が働いたためしがないな・・・w

114:デフォルトの名無しさん
07/09/02 12:47:02
もしかして、catの逆だからtacって名前なの?

115:デフォルトの名無しさん
07/09/02 12:49:25
それ以外に何があるというのか

116:デフォルトの名無しさん
07/09/02 13:03:31
Todai Automatic Computer

117:char
07/09/02 13:27:13
たたたtacん!オルフェノクだよ!

118:デフォルトの名無しさん
07/09/02 22:42:00
catの機能強化版でdogなんてのもあったな

119:デフォルトの名無しさん
07/09/02 23:57:38
>117
洗濯屋乙、てかえらい懐かしいネタを。

120:デフォルトの名無しさん
07/09/03 06:33:01
tacがあるのにdaehがないのはおかしい

121:デフォルトの名無しさん
07/09/03 10:11:11
>>120
かいせつきぼん

122:デフォルトの名無しさん
07/09/03 10:57:22
caseの終了がesacでないのもおかしい

123:デフォルトの名無しさん
07/09/03 11:10:36
>>119
洗濯屋と言われるとケンちゃんしか思いつかない

124:デフォルトの名無しさん
07/09/03 14:31:05
大昔から使ってるHTML収集&生成スクリプトを即っとRSS出力対応にしようとしたら
時間をDateで管理していたらしくTime.httpdateが使えないのでがっかり

これ、なんでTimeじゃなくDateを使ってたんだっけ…?

125:デフォルトの名無しさん
07/09/03 16:36:17
みなさん、CTCは好きですか?

126:デフォルトの名無しさん
07/09/03 16:41:21
初心者スレで聞くこっちゃないねえ
本スレでいじられてきたら

127:デフォルトの名無しさん
07/09/03 18:23:49
委託先がどこがやっても本質的な違いはないというかツッコミどころはそこじゃないんじゃねーのみたいなー

128:デフォルトの名無しさん
07/09/03 19:05:41
つしまね

129:デフォルトの名無しさん
07/09/03 19:49:04
CGIで、GETとPOSTで受け付けたデータを区別したいのですが
調べたらGETもPOSTも区別なく受け取れる…ってことぐらいしか
分かりませんでした。
どうすればいいんでしょうか?
POSTのみ受け付けたいって処理をやりたいのです。

130:デフォルトの名無しさん
07/09/03 20:00:17
>>129
CGI#request_method をチェック。

131:デフォルトの名無しさん
07/09/04 01:57:31
トヨタ、下請けに「中国メーカーと同じ値段で中国よりいい品質」を要求

部品メーカーは、人件費を減らすために工場の人員の半数以上を外国人労働
者に切り替えるよりほかなく、主な生産職は日系南米人や中国人産業研修生
が占めている。日本人の年間給与は400万円程度だが、日系南米人は250万円、
中国人研修生は150万円で採用できる。
URLリンク(www.chosunonline.com) ;



132:デフォルトの名無しさん
07/09/04 10:27:32
ファイルの最終行から20行程読み込むという作業をおこないたいのですが
ここの方ならどのように書きますか?

ぜひ、スマートな方法をお願いします。

133:デフォルトの名無しさん
07/09/04 10:28:33
tail -n 20

134:デフォルトの名無しさん
07/09/04 10:49:21
>>132
一番のオススメは >133 w
でも、Rubyでやりたいって言うなら

IO.readlines(path).last(20)

が簡単だし解りやすい
けど、やたらバカでかいファイルを読ませたいなら
FileTest.size() 等を元にして後ろから指定バイト読ませたりとか
色々と工夫した方が良いかも知れないな

135:132
07/09/04 10:57:56
>>133
>>134
レスありがとうございます。
Linuxコマンドでしょうか、、?

しょぼいファイルを扱うのでlast()メソッドで十二分に満足です。
ありがとうございました!

136:デフォルトの名無しさん
07/09/04 11:15:15
rubyにqueue, sized queueがないのはおかしい

137:デフォルトの名無しさん
07/09/04 13:03:00
sized queue はともかくとして、 queue は Array の機能でどこらへんが不足なの?

138:デフォルトの名無しさん
07/09/04 13:04:54
要素の追加と削除がO(1)で出来ないところ

139:デフォルトの名無しさん
07/09/04 13:33:08
Array#shiftもArray#pushもO(1)なようだが

140:デフォルトの名無しさん
07/09/04 13:42:06
というかshiftとpopはQueueの機能を再現するためだけに存在するメソッドだろ

require 'thread'

q = Queue.new
th1 = Thread.start do
while e = q.pop
puts e
end
end

['1st', '2nd', '3rd', nil].each{|e|
q.push(e)
}

th1.join


141:デフォルトの名無しさん
07/09/05 08:18:10
ちょっとしたコマンドラインツールの為のアプリケーションフレームワークってないの?

142:デフォルトの名無しさん
07/09/05 11:02:22
>>141
標準添付の OptionParser.rb が若干近いかも

hoge.rb:

require "optparse"
opp = OptionParser.new
opp.on('-a','全部を指定' ){|v| puts '-aオプションが指定されました。' }
opp.on("-i ANIMAL", '動物の名前を入力' ){|v| puts "-iオプションが指定されました。引数は#{v}。" }
opp.on_tail("-h", "--help", 'ヘルプを表示'){puts opp; exit}
opp.parse!(ARGV)

# ----------------

$ ruby ./hoge.rb -a
-aオプションが指定されました。
$ ruby ./hoge.rb -i ねこ -a
-iオプションが指定されました。引数はねこ。
-aオプションが指定されました。
$ ruby ./hoge.rb -help
Usage: hoge [options]
-a 全部を指定
-i ANIMAL 動物の名前を入力
-h, --help ヘルプを表示


143:デフォルトの名無しさん
07/09/05 14:29:48
optparseは中二病のの臭いというか、「Rubyってこんなこともできるんだぜスゲー」の時期に作ったモジュールって感じがする
もうちょっとみんなで落ち着いて考えればもうちょっとは「Rubyらしい」動作になったと思うんだけども

144:デフォルトの名無しさん
07/09/05 14:35:08
じゃあ中年の加齢臭漂うやつを一つお願いします

145:デフォルトの名無しさん
07/09/05 14:36:36
しつもん。

自作クラスやメソッドの使用方法ってみんなどうやって書いてる?
rd形式とかでメソッド定義の先頭に自分でわかる程度につらつら書くとか?
サポートするエディタのモードとかあったりしないのかな。

146:デフォルトの名無しさん
07/09/05 17:55:39
ソースがドキュメント

147:デフォルトの名無しさん
07/09/05 19:39:08
>>143
再設計よろ。

148:デフォルトの名無しさん
07/09/05 21:19:11
rd形式とかでメソッド定義の先頭に自分でわかる程度につらつら

149:デフォルトの名無しさん
07/09/06 00:18:46
Rake Command Completion
URLリンク(rake-completion.rubyforge.org)

これをwin32環境でうまく動かせた方はいらっしゃいませんか?

とりあえず、
  tasks = `rake --silent --tasks`.split("\n")[1..-1].map { |line| line.split[1] }

  tasks = `rake.bat --silent --tasks`.split("\n")[1..-1].map { |line| line.split[1] }
に直したのですが、

補完時に、変な^Mがついてしまいます↓
> rake <tab>
clobber^M default^M delete_unnecessary^Mrelease^M

chompとかしてみたんだけどうまくいかず・・・

tasks = File.read(rake_task_cache_filename)
tasks = tasks.map{|s| s.chomp }


環境
rake, version 0.7.3
ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-mswin32]
bash 3.2.15(13)-release
ターミナル Poderosa 3.0.0

150:デフォルトの名無しさん
07/09/06 00:39:59
>>149
まずPedorosaをやめてみる

151:デフォルトの名無しさん
07/09/06 00:40:26
>>149
あとbashも

152:デフォルトの名無しさん
07/09/06 01:03:18
>>141
SimpleConsole は?つかったことないけど。
rails っぽいフレームワークらしい

153:デフォルトの名無しさん
07/09/06 10:51:49
プログラミングRubyのライブラリ編は
rubyのマニュアルに書かれている以上のことは
どれくらい含まれているのでしょうか
基本的に不要ですか?


154:デフォルトの名無しさん
07/09/06 11:12:13
>>149
> bash 3.2.15(13)-release
これはcygwin?

なら\rも取り除かないと。

tasks = `rake.bat --silent --tasks`.split(/\r?\n/)[1..-1].map { |line| line.split[1] }

155:デフォルトの名無しさん
07/09/06 12:49:05
rubyでLispのprognのような一連の式を実行して最後の値を
返すような処理をさせたい場合、どうすればいいのでしょうか?

156:デフォルトの名無しさん
07/09/06 16:59:09
() とか begin end とか。


157:149
07/09/06 19:34:05
おお、レスサンクスー

>>150
orz

>>151
Rake Command Completion は bash用のツールなので、それはないw

>>154
情報足りなかた
bashは、cygwinです。

rubyはwin32だったり、
なんか、混在環境なんだよな・・・

> なら\rも取り除かないと。

試してみるす!!

158:デフォルトの名無しさん
07/09/06 20:37:31
URLリンク(www.ruby-lang.org)
>flags に関しては send(2) を参照してください。
このsend(2)ってどれの事なんでしょうか

159:デフォルトの名無しさん
07/09/06 20:44:13
>>158
URLリンク(www.linux.or.jp)

Linuxとか使ってるなら
$ man 2 send

160:デフォルトの名無しさん
07/09/06 20:45:46
昨今のゆとりはmanの読み方もしらんのか
man 2 send

URLリンク(www.linux.or.jp)
を見れ。

161:デフォルトの名無しさん
07/09/06 21:02:33
>manの読み方
マン

ちなみに、manコマンドは
マンコ マンド

162:デフォルトの名無しさん
07/09/06 21:09:21
unix 界隈での慣習として
"名前(セクション)" という形で Unix のマニュアルのセクションにある項目を
示す、ってのがある

man 2 send の 2 は、セクションを指示する引数

163:デフォルトの名無しさん
07/09/06 21:23:57
Windows環境でRuby使ってる人もいるだろうから、突然「send(2)を参照してくれ」
というのはちょっとやさしくないよね。

新しいリファレンスでは改善されてるのかな。
というか、新しいリファレンス大丈夫なのかな。。。


164:デフォルトの名無しさん
07/09/06 21:43:09
もうマニュアルのところにWindowsで使ってる人はまず、端末で format c:と打ってから
Linuxを入れましょうって書いておけばいいよ。

165:デフォルトの名無しさん
07/09/06 23:09:50
時間の計算について質問です。
22:10:56 から 03:01:34 までの時間を計算しようと思い

p Time.mktime(0,0,0,3,1,34) - Time.mktime(0,0,0,22,10,56)

と書いたのですが

in `mktime': argument out of range (ArgumentError)

と出てしまいます。
どこがおかしいのか判らないのですが
どう書けば良いのでしょうか?

また、この計算で日付は使わないのですが
日付は必ず指定しなければならないのでしょうか?

よろしくお願いします。

166:デフォルトの名無しさん
07/09/06 23:16:42
>>165
URLリンク(www.ruby-lang.org)

Time オブジェクトは時刻を起算時からの経過秒数で保持しています。
>起算時は協定世界時(UTC、もしくはその旧称から GMT とも表記されます) の 1970年1月1日午前0時です。

>Time オブジェクトを生成する各メソッドで、それぞれの環境での範囲外の時刻を格納しようとした場合は例外が発生します。

167:デフォルトの名無しさん
07/09/06 23:37:26
>>163
それは無理
Ruby ってどこかしら Unix セントリックなところが Ruby たるところだから

168:デフォルトの名無しさん
07/09/06 23:54:35
WIndowsで使ってる人の方が多いだろうになぁ

169:デフォルトの名無しさん
07/09/07 00:02:24
二分するなら別にそうでもないと思う

でも、Windows用のダウロード数って結構あるんだっけ?

170:デフォルトの名無しさん
07/09/07 09:50:41
>>166
う〜ん…時間の計算は簡単には出来ないのですね。
Timeって時刻を扱うクラスだと思ってたので
これ使えば時間計算もすぐ出来るという考えは甘かったようで。
というか、Timeだけで日付も扱えるならDateの立場って…?

ともかく、ありがとうです。
「どう書けば良いか」は宿題スレの方が適切でしょうか?

171:デフォルトの名無しさん
07/09/07 10:42:33
特定の日付を持たない時間量、7812と2時間10分12秒を相互に変換できるようなものを表すクラスはRubyには無いと思う
引数から分や時を読み取って60や3600をかけるメソッドと
引数の数字を60で割って24の剰余を取って返すようなメソッドを自作するしかないな
(今眠いから剰余だったかどうかはわからん)

あと、Dateは日付だけが必要なもの、たとえば「2007年9月7日」を表すのに使う
Timeだと「2007年9月7日x時x分x秒」という形でしか表せない(0時0分0秒とみなすことはできるが本質的には別)

172:デフォルトの名無しさん
07/09/07 11:56:14
>>163
以前は UNIX のシステムコールの類は全部リンクになってて
リンク先が >>159-162 みたいな説明ページになっていたような気がするんだけど?

173:デフォルトの名無しさん
07/09/07 11:57:43
もうテンプレに
・Windowsユーザーは環境依存の質問・話題を振るのは禁止
って書いとけよ。ウザくてしょうがない。
身の程をわきまえろ。

174:デフォルトの名無しさん
07/09/07 12:06:57
Windowsユーザーですが質問が環境依存であることを判断するにはどうしたらいいんですか(><)!

175:デフォルトの名無しさん
07/09/07 12:09:05
判断しなくても、質問するときに自分の環境として
Rubyのバージョンと使ってるOS書いとけばいいじゃない。
てか、>>1に書いてあるしね。

176:デフォルトの名無しさん
07/09/07 12:26:06
>>175
そうすると「質問を振る」こと自体は避けられないので、
>>173のような中二病が暴れるのは避けられません><

177:デフォルトの名無しさん
07/09/07 12:47:12
Windowsユーザーは>>173より下なんだから仕方がない

178:デフォルトの名無しさん
07/09/07 13:20:51
捨て身の展開にもっていく>>173が居た居たしいです><

179:デフォルトの名無しさん
07/09/07 16:46:19
mingw/msys(w2k)にて

tar zxvf ruby-1.8.6-p36.tar.gz
cd ruby-1.8.6-p36
configure --enable-shared --prefix=/c/msys/1.0/home/ook/app
make
make test
make install

で、/home/ook/appにインストールされてないんですが
.installed.listには
/c/msys/1.0/home/ook/app/bin/
/c/msys/1.0/home/ook/app/lib/
/c/msys/1.0/home/ook/app/lib/ruby/1.8/i386-mingw32/
/c/msys/1.0/home/ook/app/bin/ruby.exe
/c/msys/1.0/home/ook/app/bin/rubyw.exe
/c/msys/1.0/home/ook/app/bin/msvcrt-ruby18.dll
/c/msys/1.0/home/ook/app/lib/libmsvcrt-ruby18.dll.a
/c/msys/1.0/home/ook/app/lib/libmsvcrt-ruby18-static.a
・・・・

とズラズラとログ?が残ってるみたいなんですが、
実際のディレクトリは空のままです。インストールする方法を
教えてくれるとうれしいのですが・・・


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5390日前に更新/90 KB
担当:undef