Ruby初學者スレッド Part 9
■ このスレッドは過去ログ倉庫に格納されています
0001紅寶石
2006/11/21(火) 08:33:42マニュアル
http://www.ruby-lang.org/ja/man/
Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
逆引きRuby
http://www.namaraii.com/rubytips/
Ruby リファレンスマニュアルの Windows HTML Help版
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
Rubyリファレンスマニュアル刷新計画
http://doc.loveruby.net/
前スレ
Ruby初心者スレッドPart8
http://pc8.2ch.net/test/read.cgi/tech/1159424939/
>>2-10
0284デフォルトの名無しさん
2006/12/06(水) 11:59:01はいはいLotusLotus
0285デフォルトの名無しさん
2006/12/06(水) 14:12:190286デフォルトの名無しさん
2006/12/06(水) 19:37:58プログラミングRuby第二版言語編
初めてのプログラミング
この二冊は読んでおいて損はないはず
0287デフォルトの名無しさん
2006/12/06(水) 23:12:05cronからwindowを開かせるには、例えば
xterm -display :0.0
のようにXサーバを指定しなければならないようですが、
その方法が分かりません。
0288デフォルトの名無しさん
2006/12/06(水) 23:52:29RubyよりもXの質問になるね。
DISPLAY環境変数exportしておけば?
あと xhostとかで使用許可を出しておかないとたぶん表示させてくれない。
0289デフォルトの名無しさん
2006/12/07(木) 00:18:48そもそもあるのかどうかすらわからんだろう。
~/.xsessionとか~/.xinitrcあたりで、時間がくるまで眠ってるプロセスでも
バックグラウンドで走らすとか。
0290デフォルトの名無しさん
2006/12/07(木) 00:43:510291デフォルトの名無しさん
2006/12/07(木) 18:08:09こんなんもあった
http://www.ruby-lang.org/ja/man/?cmd=view;name=trap%3A%3A%A5%B9%A5%B3%A1%BC%A5%D7%A1%A2%C0%A9%B8%E6%B9%BD%C2%A4
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=%A5%B9%A5%B3%A1%BC%A5%D7
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=Ruby%A4%CE%B7%E7%C5%C0
http://shugo.net/jit/20050328.html
http://homepage1.nifty.com/~tetsu/ruby/tips/#var_scope
http://www.swlab.it.okayama-u.ac.jp/man/ruby/uguide/uguide22.html
http://wota.jp/ac/?date=20060309
http://idm.s9.xrea.com/ratio/2006/11/08/000535.html
このあたり読むと、わかるんじゃない??
0292デフォルトの名無しさん
2006/12/08(金) 02:01:33CSVのファイルを開いて
1,2,3,4
5,,3,6
2,,,3
↑このように保存されている
split使って
1
2
3
4
5
3
6
2
3
のように新しくCSVファイルを作りたいんですけど
どうやってやればいいですか?
すみません。。。
0293デフォルトの名無しさん
2006/12/08(金) 02:40:25まず、p を使ってスクリプト途中のデータの構造や状態を把握。把握したら適当に処理。
0294デフォルトの名無しさん
2006/12/08(金) 02:55:300295デフォルトの名無しさん
2006/12/08(金) 03:00:22puts File.read('csv').split(/,|\n/)
0296デフォルトの名無しさん
2006/12/08(金) 03:30:260297デフォルトの名無しさん
2006/12/08(金) 03:45:11ケチやな。
まぁおれにはできないけど(爆
0298デフォルトの名無しさん
2006/12/08(金) 04:48:300299デフォルトの名無しさん
2006/12/08(金) 07:19:270300デフォルトの名無しさん
2006/12/08(金) 10:03:29結果を新たに作った csv ファイルに書き込むんじゃないのか?
0301デフォルトの名無しさん
2006/12/08(金) 13:04:200302デフォルトの名無しさん
2006/12/08(金) 13:26:020303デフォルトの名無しさん
2006/12/08(金) 23:25:10Permission denied で書き換えられなくてちょっと困ってます。
どうすればいいでしょう。
環境は ruby 1.8.5 (2006-08-25) [i386-mswin32] の win2000 です。
0304デフォルトの名無しさん
2006/12/08(金) 23:30:49特異メソッドの定義方法を用いると
どうなります?
なんか、どこかで見かけた気がするんですが。。
0305デフォルトの名無しさん
2006/12/08(金) 23:43:00class << self; endの中に定義するのとの違いは? ってこと?
0306デフォルトの名無しさん
2006/12/08(金) 23:46:20obj.class.define_method(new_method_name, defined_method)
0307デフォルトの名無しさん
2006/12/08(金) 23:52:59「Classクラスのインスタンスである何らかのクラス定数」
に対する特異メソッドである。なので、通常の特異メソッドと同様、
def String.new_with_upcase(src)
new(src.upcase)
end
と出来て、
greeting = String.new_with_upcase("hello, world")
puts greeting #=> HELLO, WORLD
こういう、「書き方」を質問しているのかしらん。
0308デフォルトの名無しさん
2006/12/08(金) 23:53:55この記事、理解できないんですけど、
どういうことなんでしょう??
0309303
2006/12/08(金) 23:56:51explorerでフォルダ開いてたせいでPermission deniedが出てたようでした。
0310デフォルトの名無しさん
2006/12/09(土) 00:01:46こんな感じじゃない??
class Example
class << self
def show
puts "SHOW"
end
end
end
Example.show
0311デフォルトの名無しさん
2006/12/09(土) 03:30:44forを使った場合、midはforの外も含むスコープに含まれる。
ということは、define_methodに渡しているブロック内のmidもそれになる。
で、for終了時点でmidの中身は:getcなので、せっかく定義した
readもgetsもgetcも、全部getcを呼び出してしまう。
eachを使ってブロックの引数としてmidを使った場合は、
midのスコープはeachのブロック内で閉じる。
だから、define_methodに渡しているブロック内のmidは、
ちゃんとそれぞれ別々の物になる。
言葉で説明するとどうもうまく書けないけど、これで通じるかな?
0312デフォルトの名無しさん
2006/12/09(土) 15:10:16検索結果のページを取得したいのですが、rubyではどうすればよいのか
ヒントをお願いします。
************************************************
function postApmtData( actNamS, actMthdS , aptIdS ){
var formC = eval( "document." + frmNamS ) ;
var tempAction = formC.action ;
formC.actNamS.value = actNamS ;
formC.actMthdS.value = actMthdS ;
formC.aptIdS.value = aptIdS ;
formC.action = 'http://xxx.jp/yyy/Servlet/zzz' ;
formC.submit( ) ;
return false ;
}
************************************************
onClick="JavaScript:postApmtData('ArrNormalSearch'
,'topFromApLst'
,'588');return false;"
0313デフォルトの名無しさん
2006/12/09(土) 18:29:52require 'net/http'
Net::HTTP.version_1_2
File.open( 'result.html', 'w' ) {|f|
Net::HTTP.start('xxx.jp', 80) { |http|
response = http.post('/yyy/Servlet/zzz', \
"actNamS=ArrNormalSearch&" + \
"actMthdS=topFromApLst&" + \
"aptIdS=588")
f.write(response.body)
}
}
0314デフォルトの名無しさん
2006/12/09(土) 19:04:470315デフォルトの名無しさん
2006/12/09(土) 19:42:330316デフォルトの名無しさん
2006/12/09(土) 20:03:040317308
2006/12/09(土) 21:44:32ありがとうございます。
スコープの問題なんですね。
forを使った場合は
readメソッドの定義内では、@input.send(mid,*args)
getsメソッドの定義内では、@input.send(mid,*args)
getcメソッドの定義内では、@input.send(mid,*args)
で、結局 mid は:getc だということでしょうか。
blockを使った場合は
readメソッドの定義内では、@input.send(:read,*args)
getsメソッドの定義内では、@input.send(:getc,*args)
getcメソッドの定義内では、@input.send(:gets,*args)
という風になってるようなんですが、
スコープというより、定義するタイミングの問題でもあるんでしょうか。
ちょっと、理解できなかったですorz
0318デフォルトの名無しさん
2006/12/10(日) 00:43:170319デフォルトの名無しさん
2006/12/10(日) 00:50:21同じなんじゃないの?
0320デフォルトの名無しさん
2006/12/10(日) 04:30:550321311
2006/12/10(日) 05:19:57いや、スコープのせいで、forの場合のmidは全部同じ変数、
eachの場合のmidは3回繰り返すそれぞれで別の変数、になってる。
だから、forの場合は最後にmidに代入された:getcがmidの値になるし、
eachの場合はそうでない。
0322デフォルトの名無しさん
2006/12/10(日) 15:58:46クラスの特異メソッドは継承されるとかそういう話?
0323デフォルトの名無しさん
2006/12/10(日) 18:13:15HTMLコメントの<!-- -->を無視するんですが
どうすれば検索できるんでしょうか?
0324デフォルトの名無しさん
2006/12/10(日) 18:44:04まずコードをコピペしなさい。
0325デフォルトの名無しさん
2006/12/10(日) 18:46:00了解
0326323
2006/12/10(日) 18:58:45f = open("index.html","r")
d = f.read
f.close
p d.index("<!--link_file-->")
p d.index("<--link_file-->")
gets
検索するファイル"index.html"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Ruby</TITLE></HEAD>
<BODY>
<CENTER>
<TABLE border="1" cellspacing="0" cellpadding="0">
<TBODY>
<TR>
<TD width="200" colspan="2"><--link_file--></TD>
<TD width="590"><!--file_data--></TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
</BODY>
</HTML>
結果
nil
225
0327323
2006/12/10(日) 19:00:250328323
2006/12/10(日) 19:02:38別の問題かも・・・ごめんなさい・・・あぁ
0329323
2006/12/10(日) 19:18:08検索する前に置換しちゃってました・・・
0330デフォルトの名無しさん
2006/12/10(日) 21:25:100331デフォルトの名無しさん
2006/12/10(日) 23:13:54このような文字列があったとして
string[num - 10,10]
このようにして配列を抽出するとき、numが10だと10から10個手前の文字10文字を抽出しますが
numが1だと-9,10 numが7だと-3,10となり後ろから数えた文字を抽出してしまいます。
そうではなくて、numが7だとすると 7から10個手前の文字といきたいところですが
10文字もないのである分の7文字を抽出するにはどうしたらよいのでしょうか?
普通に、[num - 10 ,10] のようにやるとnumが10より小さいと[-3,10]のようにマイナス指定になってしまいます。
マイナス指定するのではなく、10より小さいとnumから10までの文字を抽出するようにしたいのです。
0332デフォルトの名無しさん
2006/12/10(日) 23:22:22場合分けするしかないのでは?
0333デフォルトの名無しさん
2006/12/10(日) 23:31:45でいいのかな?
0334デフォルトの名無しさん
2006/12/10(日) 23:32:45string[ num < 10 ? num : num - 10, 10]とか。
0335デフォルトの名無しさん
2006/12/10(日) 23:42:28渡された引数が
true か false ならそれをインスタンス変数に保存し
それ以外(nilも)なら例外を出す
って処理を書きたいのですが
def test(b)
if b == true || b == false then
@b = b
else
raise TypeError
end
end
って冗長な気がします。
TrueClass と FalseClass を纏めるクラスもなさそうなので
クラスでの判別にすると更に冗長になりそうですし。
短い書き方無いでしょうか?
0336デフォルトの名無しさん
2006/12/10(日) 23:43:240337デフォルトの名無しさん
2006/12/10(日) 23:46:010338デフォルトの名無しさん
2006/12/10(日) 23:48:48[true, false].include?(b) くらいかな。
しかしたぶん、そのような処理を書かなきゃならんという考えが
何かの間違いだと思う。
0339デフォルトの名無しさん
2006/12/10(日) 23:56:010 or 1にする話だったからちょっと違うな。
ttp://wota.jp/ac/?date=20061121#p01
0340デフォルトの名無しさん
2006/12/10(日) 23:58:59うむ
いっそ全体を書き直したほうが今後のためにもいいかもしれん
習作的なものや作り始めたばかりなのなら思い直せ
0341デフォルトの名無しさん
2006/12/11(月) 00:19:17--- [nth, len]
nth バイト番目から長さ len バイトの部分文字列を返しま
す。nth が負の場合は文字列の末尾から数えます。
nth が範囲外を指す場合は nil を返します。
ということなので、何か根本的な勘違いしてないかい?
irb(main):004:0> 'abcdefghijklmnopqrstuvwxyz'[0,10]
=> "abcdefghij"
irb(main):005:0> 'abcdefghijklmnopqrstuvwxyz'[10,10]
=> "klmnopqrst"
# 文章で説明するよりもテストコードなり何なりで期待する結果を書いた方が
# いいような気がする。
0342デフォルトの名無しさん
2006/12/11(月) 00:33:42$stderr.puts "引数なし"
exit 1
end
これを設定したのですが、
ruby プログラム 引数1 引数2 でプログラムが正常に動作するプログラムを付くっ単おですが
引数2 を指定せずに実行すると
引数なし と設定したエラーが出ずに 引数2がないため開けないので別のエラーがでます。
if ARGV.empty? どうやらこれでは第1引数だけしか判断しないようなので
ARGV[0]
ARGV[1] をそれぞれif文で指定したのですが、できませんでした。
一括で、引数のempty? の判定をする方法はないのでしょうか?
よろしくお願いします。
0343デフォルトの名無しさん
2006/12/11(月) 00:37:09module BoolClass; end
class TrueClass; include BoolClass; end
class FalseClass; include BoolClass; end
def test(b)
@b = b if b.kind_of?(BoolClass) or raise TypeError
end
0344デフォルトの名無しさん
2006/12/11(月) 00:50:22まず、一括で引数のempty?ってのはなんか誤解してる気がする。
ARGVってのは配列で、ARGV.empty?ってのはその配列の中に
何かが入っているかどうかを判別しているんだよ。
だから、引数がまったく与えられなかったときにtrueになる。
よくわからんけど、引数の数が丁度2のときに処理をするの?
だったら、
raise 'usage: ruby プログラム 引数1 引数2' if ARGV.size != 2
とかやった方がいいんじゃない?
0345デフォルトの名無しさん
2006/12/11(月) 00:51:39len = [num, 10].min
string[0..num-1][-len,len]
0346デフォルトの名無しさん
2006/12/11(月) 00:51:55最初に
p ARGV
としたらどうなるか?
0347デフォルトの名無しさん
2006/12/11(月) 00:52:54引数の数(ARGV.size == 2)で調べるところだね、これは。
0348デフォルトの名無しさん
2006/12/11(月) 00:54:50連投スマソ
0349デフォルトの名無しさん
2006/12/11(月) 02:45:25obj.new(:foo => "hoge", :bar => "hage")
とかの先頭にコロンついた変数名をよく見るのだがこれって何?
単なる習慣?
0350デフォルトの名無しさん
2006/12/11(月) 04:06:06obj.new(:foo => "hoge", :bar => "hage")
は
obj.new({:foo => "hoge", :bar => "hage"})
と書いたのと同じ意味だ。つまり、obj#newにHashを渡している。
で、なぜSymbolオブジェクトをHashのキーにしているかというと、
・タイプしやすい。文字列に比べて1文字少なくて済む
obj.new("foo" => "hoge", "bar" => "hage")
とタイプするよりは楽だということ。
・Symbolの方がStringよりも生成時に性能的に有利。
Symbolは内部的には整数で表されてるんで。
ということかな。まあ慣習で強制されているものではないので、
SymbolではなくStringをHashのキーに取る実装もあり得るし存在している。
0351デフォルトの名無しさん
2006/12/11(月) 06:15:300352デフォルトの名無しさん
2006/12/11(月) 07:57:18Symbolのリテラルは見慣れないとぎょっとする表記だけど、
慣れたらなかなかいいもんですよ。ここは慣れですw
0353335
2006/12/11(月) 09:49:33うーん。コードが長くなってきて
クラスの海をどう渡ろうかなと。
それでちょっとだけ型判定を。
その後true/falseでなく専用のクラスを作り
そのインスタンスを2つ作り定数にしました。
いっそこうなったらトコトンやろうかと。
クラスを以てクラスを制すつもりで。
中途半端に組み込みクラスを使うより
むしろ判りやすい気がしました。
0354デフォルトの名無しさん
2006/12/11(月) 10:33:260355デフォルトの名無しさん
2006/12/11(月) 10:33:28なにかとシンボルを使いたくなる。
0356デフォルトの名無しさん
2006/12/11(月) 11:56:46例えば、ネットワークから読み込んできた文字列 sを、
s.read(2)
などのように、先頭から順番に読み込みたいのですが。
今は、
value = s[index]
index += 1
などのようにしていて、面倒です。
0357デフォルトの名無しさん
2006/12/11(月) 11:59:46StringIOを使いましょう。
http://www.ruby-lang.org/ja/man/?cmd=view;name=StringIO
0358デフォルトの名無しさん
2006/12/11(月) 12:11:50おお。ちゃんと用意されているのですね。
ありがとうございました。
0359デフォルトの名無しさん
2006/12/11(月) 12:35:05a, b = s.split(//)
print(a, b)
a,bにnilが代入された時は「空文字列」を設定したいのですが
何かエレガントな書き方はありますか?
とりあえず今は、1つずつ
a = a || ''; b = b || ''
みたいにやってるのですが、変数の数が増えると大変なので
もっと簡潔に書ける方法があると良いのですが。
0360デフォルトの名無しさん
2006/12/11(月) 12:47:550361デフォルトの名無しさん
2006/12/11(月) 13:17:32でいけるのかな。
あと
a = a || ''
は
a ||= ''
とも書ける。
0362デフォルトの名無しさん
2006/12/11(月) 13:24:58こんな場合にエラーなく処理させたいんです。
今は分割した物を、その都度 a = a || '' みたいにしてるんですが…
s = File.read('file') #空の場合もあれば 'w x|y z' みたいな場合もあり
a, b = s.split('|')
c, d = a.split(' ')
e, f = b.split(' ')
print(a, b, "\n", c, d, "\n", e, f, "\n")
0363デフォルトの名無しさん
2006/12/11(月) 13:27:58おおっ、エレガントだ!
ありがとうございました。
0364デフォルトの名無しさん
2006/12/11(月) 13:30:570365デフォルトの名無しさん
2006/12/11(月) 13:35:31そういう方法もありますね。
一つ勉強になりました。
0366356
2006/12/11(月) 13:39:44文字列、といっても中身はバイナリデータなのですが、
6A 0D 0A 00 00 51
のようなデータの場合、
seekや、readなどで、0Dが飛ばされて処理されてしまいます。
たぶん、0D0Aが改行コードと認識されているのですが、
飛ばされないようにするというか、バイナリとして扱うことはできないのでしょうか?
0367356
2006/12/11(月) 13:46:06もしかしたら、根本的な問題なのですが、
バイナリファイルを扱うのに、StringIO(IOストリーム)は向いていなかったりしますか?
今は、seekとreadなどで、読もうとしています。
0368デフォルトの名無しさん
2006/12/11(月) 13:58:39ファイルから読み込むときに既に\rが落ちてしまってるとか言うことはない?
0369デフォルトの名無しさん
2006/12/11(月) 14:01:180370デフォルトの名無しさん
2006/12/11(月) 14:01:590371デフォルトの名無しさん
2006/12/11(月) 14:04:41教えてもらった事を参考に↓みたいにしたのですが
エラーなく処理させるには、これがベストでしょうか?
s = File.read('file') #空の場合もあれば 'w,x|y,z' みたいな場合もあり
a = s.split('|')
c, d = (a[0] ? a[0] : '').split(',') + ['', '']
print c, d
0372356
2006/12/11(月) 14:05:53ファイルに出力すると、ちゃんと
6A 0D 0A 00 00 51
になっていました。
ですが、StringIO経由だと、
6A 0A 00 00 51
になってしまいます。
うむむ
0373371
2006/12/11(月) 14:10:29'a,b|c,d|e,f|g,h|..' みたいにずっと続くので
最初の分割は
a = s.split('|') みたいに配列にしないとマズイです。
x, y = a.split('|') みたいにするとマズイ。
0374356
2006/12/11(月) 14:13:47io = open(OUT_FILE + ".bin", "rb")
# StringIOで、Openした場合
# io = StringIO.open(s, "rb")
value = io.read(4)
puts sprintf('%x %x %x %x', value[0], value[1], value[2], value[3])
io.close
やはり、ファイルからバイナリモードで読み込んだときと、StringIOでOpenしたときと
挙動が違いますね。
これって仕様でしょうか?
一旦ファイルに落として、再度読み込むのを許容するしかないですかね?
0375デフォルトの名無しさん
2006/12/11(月) 14:24:49Windowsだと、binmodeで書き出ししない場合
勝手に\nが\r\nに直されてしまうから p sでチェックしてみて。
0376356
2006/12/11(月) 15:25:45あ、ファイルに書き出した時点で、\nが\r\nになっているというお話ですか?
か、確認しました!
バイナリモードで書き出したら、\nが\r\nになっているだけでした。
つ、つまり・・・
6A 0A 00 00 51
で、正しいです。StringIOは悪くないです。
俺が悪かったです orz
0377356
2006/12/11(月) 15:26:18バイナリモードで書き出したら、\nのままでした。
0378デフォルトの名無しさん
2006/12/11(月) 16:38:13p obj で、objのRubyの内部表現が見られるよ。
0379342
2006/12/11(月) 19:25:04引数がないままプログラムを実行するとエラーがでますよね
引数が1つしか指定しない場合だと、
if ARGV.empty? で引数が入力されない場合に
putsしてエラー文を出力します。
でもこれだと、コマンドラインから入力する引数(ファイル名など)が2つある場合だと
この文では、putsのエラー文ではなく、デフォルトのエラーが出てしまいます。
この2つや3つ目の引数をコマンドラインから入力するとなると、
引数が入力されなかった場合や、引数の入力が足りない場合
どのようして、指定のエラー文を出力すればよいのでしょうか?
0380デフォルトの名無しさん
2006/12/11(月) 19:30:57引数の数は丁度2個欲しいのか、丁度3個欲しいのか、
最低2個は欲しいが3個目も受け付けるのか、
それ以外なのかはっきりしろ。
それと>>344は試してみたのか?
0381342
2006/12/11(月) 19:35:29必要な引数は2つです。でも、3つや4つも一度にできるのであれば知りたいです。
引数はいずれもファイル名です。
>>344についですが、
raise 'usage: ruby プログラム 引数1 引数2' if ARGV.size != 2
引数は入力毎に異なるのでプログラム中に記述できないような気がするのですが・・・
0382デフォルトの名無しさん
2006/12/11(月) 19:37:00配列そのものに要素が「1つでも」あるのか、全くないかを判定するためのもの。
それぞれの要素が存在するかを知るためのものではない。
0383デフォルトの名無しさん
2006/12/11(月) 19:40:34optparse使え。
または、 p ARGV しながらプログラム書け。
0384デフォルトの名無しさん
2006/12/11(月) 19:44:36わかった。親切にメッセージを出した方がいいと考えたおれがバカだった。
raise if ARGV.size !=2
これでどうだ? 引数の数が丁度2でなかったときは
例外を上げてプログラムを終了する。
■ このスレッドは過去ログ倉庫に格納されています