1 :
デフォルトの名無しさん :
2007/01/23(火) 17:59:23
これがRuby内部イテレータ。 def f 10.times do |i| yield i * 10 end end f do |i| p i end これがPython外部イテレータ+構文糖。 def f(): for i in xrange(10): yield i * 10 for i in f(): print i ほとんど変わらない希ガス。
g = f() for i in range(3): print i, ": ", g.next() 切り出せないって話だろう 俺は困ったことないけど
>切り出せないって話だろう 切り出せれば、また別のジェネレータで yield g.next() とか合わせ技ができるじゃん。
今まではRubyの内部イテレータにこんなアドバンテージがあった。 def f begin 10.times do |i| yield i * 10 end ensure p "final" # イテレータが中断しても「必ず」実行される end end f do |i| p i break # 中断♪ end Python2.4までは上みたいなのはSyntax Errorだったんだけど、2.5からはできるようになった。 def f(): try: for i in xrange(10): yield i * 10 finally: print "finally" for i in f(): print i break いよいよ、内部イテレータの「切り出せない」という弱点が残った感じ。(何か見落としてる?)
>require "generator.rb" call/ccは癌。重いしメモリリークするらしい。
Matzが内部イテレータがいいと言ったら絶対内部イテレータがいいんだ!
>>8 イテレータとして捉える分には、そういう結論でいいんじゃね?
つまり、じゅうぶんなsyntax sugarを用意すれば外部イテレータはそのメリットを生かしたまま内部イテレータ的に定義・利用できる、ということをPythonは証明したわけだな。
ただ、Rubyのイテレータ呼び出しは、それがブロック引数構文として文法に組み込まれてイテレータ以外にも使われてるから、そこをどう評価するか、という話はあるかもしれない。
>>9 前スレの993は、だから組み込みにしろ、って話なんじゃね?
外部イテレータかあ・・・。 外部イテレータって、自分で実装するのが面倒なんだよな。 Ruby が内部イテレータを採用してるのも、そこら辺を優先したからなんだろうな。 めっちゃ無駄は多いけど、スレッドうまく使えば 内部イテレータから外部イテレータを作れるね。 単方向のみだけど。
>外部イテレータかあ・・・。 >外部イテレータって、自分で実装するのが面倒なんだよな。 >Ruby が内部イテレータを採用してるのも、そこら辺を優先したからなんだろうな。 だからジェネレータを使えばRubyとほとんど同じ面倒さで組めると(ry >めっちゃ無駄は多いけど、スレッドうまく使えば >内部イテレータから外部イテレータを作れるね。 >単方向のみだけど。 それが1.9のgenerator.rbの実装。それでも重い。
ああ、数年前まではみんなが Rubyのイテレータはすごいぞ! Rubyのイテレータはすごいぞ! ってお題目のように唱えていたのに...
>>14 前半は
>>9 を踏まえての事。
後半は重いのは当たり前やね。
>>11 > つまり、じゅうぶんなsyntax sugarを用意すれば外部イテレータはそのメリットを生かしたまま
> 内部イテレータ的に定義・利用できる、ということをPythonは証明したわけだな。
外部イテレータ使って内部イテレータを実装するのも無駄が多いし、
自分で新しい外部イテレータ作るのも面倒い。
基本的に内部イテレータを提供して、
必要に応じて外部イテレータを内部イテレータとは別個に提供可能にし、
そしてやっつけの時用に相互変換可能な仕組みを用意する、
という流れがベストな気がする。
17 :
デフォルトの名無しさん :2007/01/23(火) 21:31:16
ルビーの在家信者と出家信者はどう違いますか?
>前半は
>>9 を踏まえての事。
call/ccはPythonのコルーチンより野心的っつうか、前の時点に「逆戻り」できる。
重かったりリークしたりがそのせいかわからないが、いずれにしても利用者からは
内部実装は見えないので「面倒」なのはインタプリタ実装者だけのはず。
>>16 >外部イテレータ使って内部イテレータを実装するのも無駄が多いし、
本当に無駄が多いかどうか実証してみないとわかんないよ。
書くときの労力に関しては構文糖でどうにでもなりそうなのはPythonの例の通りだし。
実行効率については、意外と大差ない可能性もある。
処理系側の実装に関しては、元ネタのO氏の日記参照。そんな単純とも思わんが。
>必要に応じて外部イテレータを内部イテレータとは別個に提供可能にし、
>そしてやっつけの時用に相互変換可能な仕組みを用意する、
>という流れがベストな気がする。
これは同意。
というわけで、組み込みgeneratorと相互変換の仕組み希望。
>「面倒」なのはインタプリタ実装者だけのはず というわけでMatz乙☆
>本当に無駄が多いかどうか実証してみないとわかんないよ。 Python2.5(0.83秒) import time def f(): for i in xrange(1000000): yield i t1 = time.time() for i in f(): pass t2 = time.time() print t2 - t1 Ruby(3.34秒) def f 1000000.times do |i| yield i end end t1 = Time.now f{|i|} t2 = Time.now p t2 - t1 現状ではPythonのほうが早いね。YARVだとどうなのかな?
>>21 rubyとpythonを比べてもしゃーないだろ。
で、手元だと、python 2.4.3が0.70秒、ruby 1.9.0が0.38秒。
YARVはええ。
23 :
22 :2007/01/23(火) 22:05:00
あ、ruby 1.8.5 p12は1.23秒ね。
Python2.5 VS YARVキボン。
25 :
22 :2007/01/23(火) 22:19:29
2.5は入れてないんだよ。めんどくせえなあ・・・ 同一環境で、python 2.5は0.36秒。 はええ。
乙。漏れも後で試してみよう。 #外部イテレータが無駄ってことはどうやらなさそうだね。
誰だよ、YARV 使えばすぐに Python に追いつけるって言った奴。 Python がこれ以上早くならないって前提じゃないのか? だいたい YARV ベースの Ruby が正式リリースされ 安定するのは一体いつになるやら。
JASRACから音楽を守れ!JASRACの悪行の数々
JASRACが73歳おじいちゃんに音楽を演奏したんだから840万払えと告訴
判決懲役10月、執行猶予3年(求刑・懲役10月)
日本音楽著作権協会(JASRAC)が、名古屋の飲食店経営のおばちゃんに、
音楽を演奏したんだから1,600万円払え、と告訴し、おばちゃんは逮捕。
プログラマ板などみんなの協力plz
http://ex17.2ch.net/test/read.cgi/news4vip/1169551677/ 1.新型山田つくっる
2.ジャスラック登録曲のカバーした映像を見せるサイトを作る
3.サイトには1の山田を張り付ける
4.じゃすらっくがサイトに来る
5.感染
6.流出確認
7.ネトラン等に通報
8.マスコミ反応
9.内部文書が放送され一般に悪行がばれる
一般人に被害が出ないようにjasrac.or.jpのみを振り分けるPerlCGI
#!/usr/bin/perl
print "Content-type: text/html\n";
if ($ENV{'REMOTE_HOST'}=~/jasrac\.or\.jp/){
print "Location:download.html\n\n"
}else{
print "Location:index.html\n\n"
}
ここではlocationで別のページに飛ばしてるだけだが、やろうと思えば不正なcookieをいrうわなにをするやめあせdrftgyふじこlp
30 :
26 :2007/01/23(火) 22:39:03
試してみた。Python2.5(0.89秒)に対してYARV(1.262秒)。 Python2.5はコンパイラに手が入ったって聞いてたけど、なかなか良いね。
>>29 それ暇つぶしにいいけどキの人が書いたとしか思えんw
訳すの大変だったろうなぁ
キツネは可愛かった
32 :
22 :2007/01/23(火) 22:48:45
繰り返し回数を一桁増やして試してみた。 それぞれ5回ずつやった平均値。 ただし極端に外れた値が出た場合は外部要因とみなして捨てている。 Python 2.4.3 5.01秒 Python 2.5 3.56秒 Ruby 1.8.5 p12 12.12秒 Ruby 1.9.0 3.70秒 matzruby 31.55秒 なんかmatzrubyだけ冗談かと思うくらい遅いな。なんだこりゃ?
33 :
22 :2007/01/23(火) 22:50:58
結論: Python 2.5はえー。YARVもけっこうはえー。 外部イテレータが遅いかどうかはPythonに内部イテレータを組み込むか、 Rubyに外部イテレータを組み込むかして、Python同士、Ruby同士で見ないと意味ない。
>>30 Pythonはインタプリタの起動がRubyより遅いけど、どうやって計測してる?
time.time()やTime.nowで計ってるから「起動時間は計測してない」が答えかな。
それ反則じゃね? shell?かしらんが、time で計ろうよ
時間計測関数の実行時間も計測して差し引く必要がある、ということか?
何で反則なんだ?イテレータの比較という話だったと思うが。
>>36 反則も何も、イテレータの速度を計るのが目的なわけで。
>>37 厳密にはそうだね。
しかし、そこまで厳密である必要もないだろ。
40 :
21 :2007/01/23(火) 23:53:13
インタプリタ起動時間も含めて計測しました。念のため、内部・外部イテレータを 使っていることを明確にするためコードを変えて。 Ruby1.8.5(0:03.418) YARV (0:01.363) Python2.5(0:01.014) 若干YARVとPython2.5の差が縮まったが、順位は変わらず。 def f(): a = range(1000) for i in iter(a): for j in iter(a): yield 0 for i in f(): pass def f a = Array.new(1000) a.each do |i| a.each do |j| yield 0 end end end f{|i|}
で、おまいら、外部イテレータが欲しいと思った事ってあるのか?
ある。
たまにある。例えばGUIでキャンバスに図形を書く場合、OneStepずつ確認したい とする。 def draw(): for x in xrange(100): for y in xrange(100): # draw with x,y こういう場合、draw with x,y の行の後ろにyieldを入れればdraw()はジェネレータに なるので it = draw() Tk.Button(command=it.next) のようにすればボタンを押すごとに描画する機能が安直に実現できる。
44 :
43 :2007/01/24(水) 00:13:41
他にも巨大なテキストファイルがふたつあったとする。内容を比較したい場合、 内部イテレータでは、どちらかを全部読み込まないと比較できないが、 外部イテレータでは並列に読み込みながら比較できる。
45 :
43 :2007/01/24(水) 00:19:13
まあ、RubyにもIO#readlineはあるから、全部読み込まなくても比較できるか。 でもこれも外部イテレータみたいなものだね。
http://icpc.baylor.edu/Past/icpc91/finals/Problems.html の問題Fに0,00,01,10,000,001,010,011,100のような無限に続く数列を
必要とする部分があるんだけど、こういうのもジェネレータを使うとすっきり
書ける。
import itertools
def keys():
for length in itertools.count(1):
for i in xrange((1 << length) - 1):
s = ""
while len(s) < length:
s = str(i & 1) + s
i >>= 1
yield s
もちろん配列を使っても書けなくはないが、外部イテレータがあると便利というのは
得てしてこういう場面。(たくさんあるものから、ひとつずつ小出しにしたい)
47 :
デフォルトの名無しさん :2007/01/24(水) 01:14:26
えっと、assertしたいときはruby的にはどうすればいいんでしょ。 raise "assert" unless moge == "moge" こんな感じ?
>>47 そんな感じ。
標準ライブラリのrunitも、本来はテストプログラム用のフレームワークだが
require 'runit'
include RUNIT::Assert
して
assert_equal("moge", moge)
みたく普通のプログラムで使うこともできるっちゃできる。
51 :
50 :2007/01/24(水) 11:53:49
あ、goldbach.{rb,py]がクラスありで、goldbach-notoop.{rb,py}がクラスなしね。
というか、クラス定義した時のPythonのオーバーヘッドでかすぎねえ?
YARV 1.177 0.909 殆ど変わんないんだ。凄いな。
メソッドの呼び出しはメモリ効率犠牲にしてそうな気がする。
YARV版RubyとPython 3000はどちらが先に正式リリースされるんですか?
Python3000の正式リリース予定は3000年。 YARV版Rubyである1.9.1のリリース予定は今年のクリスマス。
YARVはええ!
というか、外部イテレータって結構コスト高いよね? 処理の実行状態を保存したまま処理を返す必要があるんだから。
そうでもないという結論に達したはずだが。現に外部イテレータを採用している Pythonの方が速いしね。
>>60 いや、「そうでもないかもしれない」だけだって。
同じ処理系内で内部イテレータと外部イテレータをそれぞれ真面目に実装した上で比較しないと、実際の差はわからん、としか言いようがないってば。
Python 2.5の速度から言えることは、「外部イテレータもそれほど遅くはないのではないだろうか」という示唆が得られたというくらい。
>>61 嘘じゃないよ。聞かれたのは「Python 3000の正式リリース」なんだから。
Python 3.0に関しては、来年リリースの予定だね。
メモリ容量的にはどうなんだ?
64 :
デフォルトの名無しさん :2007/01/24(水) 20:42:04
メモリ容量より、実行速度
外部イテレータは状態を保存するから遅いという言質はRubyの内部イテレータが フレームを保存したり色々重い処理を行っているという事実を無視しているな。
Pythonでスマソ。 import time n = 1000000 def f(): for i in xrange(n): yield i def g(f): for i in xrange(n): f(i) t1 = time.time() for i in f(): pass t2 = time.time() print t2 - t1 # 0.861999988556 t1 = time.time() g(lambda i: None) t2 = time.time() print t2 - t1 # 1.04099988937
67 :
デフォルトの名無しさん :2007/01/24(水) 21:08:56
ひそかに、Python使える人も多いんですかね。
まあ、たしなむ程度だけどな。
PerlやPythonもろくに使えないでRuby最強とか言ってるのは一部のおかしい人だけだよ。 普通は、あの言語のああいうところはRubyにも欲しいとか、Rubyのこういうところはイケてないな、とか思いながらも、それでもRubyのどこかに魅力を感じてRubyを使ってるわけだ。
Matzの魅力、オトコの魅力。
もるもんハァハァ
もるもんに萌えるのはマ板のスレでやってくれ
73 :
デフォルトの名無しさん :2007/01/25(木) 17:02:54
クラスに定義されているインスタンス変数名のリストを、インスタンスからではなくクラス名から取得する方法はありますか? Hoge.new.instance_variables ではなく Hoge::instance_variables みたいに
>>73 無理。
インスタンス変数は文字通りインスタンスに定義されるから。
クラスを定義しただけでは、どんなインスタンス変数が出来るか知りようがない。
@hogeとかがそうなのでは?
Hogeクラスのインスタンスが皆同じインスタンス変数を持ってるわけじゃないから
同じ不二家の工場で作られた同じ製品でもモノによって細菌数が違うだろ。
class Hoge def initialize @foo = nil end def piyo @bar = nil end end hoge = Hoge.new p hoge.instance_variables =>["@foo"] hoge.piyo p hoge.instance_variables =>["@foo", "@bar"]
79 :
デフォルトの名無しさん :2007/01/25(木) 23:13:40
暗号化をするには、どのモジュール。どのメソッドを使えばいいんですか? md5ですか?
>>79 したいことによる、としか言いようがない。
「md5ですか?」とか言ってるようでは、たぶん自分がしたいことがわかってないっぽいので、暗号化について勉強してくること。
81 :
デフォルトの名無しさん :2007/01/26(金) 00:15:54
ユーザ認証なんです。。
パスワードをハッシュ化して保存したいのか、 ハッシュ化されたパスワードと入力を比較したいのか、 認証の通信経路を暗号化したいのか、 それ以外か?
>81 まずユーザ認証そのものを学んだ方が良いな
84 :
デフォルトの名無しさん :2007/01/26(金) 11:59:56
ここは初心者スレじゃないんですか?
85 :
デフォルトの名無しさん :2007/01/26(金) 12:00:38
hello='hello' world='world' hw="#{hello} #{world}"←ダブルクォート print hw #hello world @ を実行すると@のような結果になりますが hello='hello' world='world' hw='#{hello} #{world}'←シングルクォート ※ print hw #hello world A 上のコードで※でhwに何らかの処理をしてAの結果にする方法ってありますか?
$ ruby -ve 'eval "str=\"a\"";p str' ruby 1.8.4 (2005-12-24) [i386-linux] -e:1: undefined local variable or method `str' for main:Object (NameError) evalで定義した後は直ぐ使えないんでしょうか?
str=をevalの前に出してみ。
>>84 初心者スレとしては「認証を学べ」
本スレであの質問なら俺はスルーかな
>>87 うーんどういう意味ですか?
$ ruby -e 'rb="str=\"a\"";eval rb;p str'
でも変わらずです
$ ruby -e '"str=\"a\"" eval;p str'
-e:1: warning: useless use of a literal in void context
-e:1: syntax error, unexpected tIDENTIFIER, expecting $end
evalの中で初めて宣言された変数は evalで実行されてるブロックスコープの ローカル変数になってるってことじゃないかね
91 :
デフォルトの名無しさん :2007/01/26(金) 14:34:40
>>84 質問自体が、rubyに限ったことじゃないし
ここで一から説明するには長すぎる。
>>84 ここはRubyの初心者のスレであって、認証の初心者のスレじゃない。
どうしても答えがほしけりゃ、コテハン付けたうえでとりあえず
>>82 の確認事項に答えてみ?
>>89 「str=」*だけ*をevalの前に出してみ。
$ ruby -e 'str = eval "\"a\"";p str'
94 :
デフォルトの名無しさん :2007/01/26(金) 17:04:12
初心者は血祭り
知識の劣るものを見つけたら罵倒せよ、それがRuby道なり
Rubyの赤は血の赤だからな。
何が得意げに「どうしても答えがほしけりゃ」だよw んなレスいちいち書くなよ反吐が出るわ
お前のレスにも反吐が出るがなー
ていうか97だけ反吐が出る
100 :
デフォルトの名無しさん :2007/01/26(金) 20:26:12
さすがRubyユーザ満ち足りた生活を送っているだけあって、気持に余裕がある。
>>93 おおお、なるほど。出来ました。
ありがとうございました。
>>90 irb(main):001:0> eval "str1 = \"a\"" ;p str1
NameError: undefined local variable or method `str1' for main:Object
from (irb):1
from :0
irb(main):002:0> eval "str2 = \"a\""
=> "a"
irb(main):003:0> p str2
"a"
=> nil
となるんで、不思議なんですよ。
>>101 確かにそうなった
これはどうしてだろう俺も知りたい
eval 'foo = 1' p foo # => NameError eval 'bar = 2' eval 'p bar' # => 2 baz = nil eval 'baz = 3' p baz # => 3 ローカル変数が定義されるのはコンパイル時だからだと。
irbのバグ?
webアプリを作るのにrubyって有用ですか?
Perlへの醜い敵愾心がRubyの原動力なので その辺は勿論おさえてあります。
rorとかいうやつみたいですね。 ありがとうございました。
109 :
デフォルトの名無しさん :2007/01/27(土) 01:57:52
>>106 Railsが使える環境なら、有用。
そうでないなら、まともな軽量フレームワークがないので、ちょっと残念な状態。
110 :
デフォルトの名無しさん :2007/01/27(土) 02:45:30
>>110 どれ使ったらいいかわからんJavaと同じ状況とも言える。
その点ほらRubyならRails以外は世間的になかったことになってるので安心。
112 :
デフォルトの名無しさん :2007/01/27(土) 23:37:03
以下のようなスクリプトで入力待ちの状態で Ctrl-C を押しても何も起こらず、 エンターで確定したあと Interrupt が発生します。 これを Ctrl-C を押したらすぐに終了するようにはどうすればいいでしょうか? require "curses" begin Curses::init_screen Curses::stdscr.addstr("% ") Curses::stdscr.refresh() s = Curses::stdscr.getstr() Curses::stdscr.addstr(">>> %s \n" % s) Curses::stdscr.refresh() rescue Curses::close_screen end
>>78 見て、思ったのですが
class X
attr_accessor :v
end
x = X.new
p x.instance_variables
y = x.v
p x.instance_variables
x.v = 1
p x.instance_variables
というスクリプトを実行すると結果は
[]
[]
["@v"]
となるのですが(ruby 1.8.5)、インスタンス変数は読み出しただけではまだ存在しないの?
そのクラスには、初めはv()、v=()というメソッドしかない。だからv=()を呼ぶまで@vはない。 attr系のメソッドのことをよく調べてみれ。
115 :
デフォルトの名無しさん :2007/01/28(日) 10:28:59
116 :
デフォルトの名無しさん :2007/01/28(日) 10:46:50
ソートするキーの配列 keys=['key1', 'key3', ・・・] ソート対象の配列 array=[{'key1'=>3, 'key2'=>1, 'key3'=>2, ・・・}, \ {'key1'=>10, 'key2'=>2, 'key3'=>8, ・・・}, \ {'key1'=>3, 'key2'=>5, 'key3'=>1, ・・・}] があって、 array.sort{|x,y| key=keys.shift if((x[key]<=>y[key])==0) then key=keys.shift if((x[key]<=>y[key])==0) then key=keys.shift ・・・ else x[key]<=>y[key] end else x[key]<=>y[key] end } 結果 [{'key1'=>3, 'key2'=>5, 'key3'=>1, ・・・}, {'key1'=>3, 'key2'=>1, 'key3'=>2, ・・・}, {'key1'=>10, 'key2'=>2, 'key3'=>8, ・・・}, みたいなことをしたいんですけど、うまく書く方法はありますか?
keysの要素にあるキーで順番に比較していって、 違いがあったらそこで確定。 等しければ次のキーで比較、なのかな。 array.sort_by {|e| keys.map {|key| e[key]} } だろうか。
keys.map {|key| e[key]} は e.values_at(*keys) と書ける。
>>112 即座にInterruptで終了したがな。linuxだと。
>>119 環境を書いてなくてすません。
普段は Cygwin/ck/screen/zsh で使っているのですが
ck でなく cmd 上の bash でやっても同じでした。
ruby は 1.8.5 (2006-08-25) [i386-cygwin] です。
生の Linux 環境はもってないのですが、
Cygwin/ssh や putty で coLinux に ssh しても、
やはり Ctrl-C で終了しませんでした。
Windows の問題なんでしょうか?
121 :
113 :2007/01/28(日) 18:25:56
>>114 さん、レスありがとう。attr_accessor使わないで
class X
def v()
@v
end
def v=(val)
@v = val
end
end
x = X.new
p x.instance_variables => []
z = x.v
p x.instance_variables => []
x.v = 1
p x.instance_variables => ["@v"]
と書くのと同義だということだというのはわかるのですが、メソッドv()を実
行してインスタンス変数@vを参照している(このときに変数が存在しないとい
うエラーは発生しない)のに、その後でも@vはまだ存在しないのかなあ?とい
うのがちょっと疑問だったのです。
プログラミングRuby第2版言語編p288に、「初期化されていないインスタンス
変数を参照するとnilが返されます」とあるので、未定義なインスタンス変数
を参照してもエラーは発生しない「仕様」だけれども、なにかの値が代入され
るまではインスタンス変数は存在しない、という「仕様」だという理解でよい
のかな?
Rubyに仕様なし!
それはしようがないな
>>121 初期化 ∈ 代入。
まあ動的言語だし。
はじめっから持ってなきゃダメなら、initializeで
適当に初期化しる。
ruby-lang.org繋がりにくいんですけど なんかあるんスカ?
動的言語の名のもと、すべてを正当化します!!
>>121 そういうこと。
それをruby -vで実行すれば警告が出る。
すみませんが、質問です。 Rubyのトップレベルは、いったいどういう仕組みなのでしょうか? selfが"main"という名のObjectクラスのインスタンスだが、どうもklassポイ ンタはObjectクラスそのものを指しているらしいところまでは分かりました。 だから関数宣言すると、Objectクラスにメソッドが追加されますし、トップレ ベルでpublicを実行すると、トップレベルで定義した関数をメソッド風にも呼 べます。 public def hoge; "hoge"; end Object.new.hoge => "hoge" 分からないのは、インスタンス変数の振る舞いです。 まず、トップレベルでインスタンス変数が使えます。 しかも、クラス定義内での挙動と違い、関数の中からも参照できてしまう。 @hoge = 1 def get_hoge; @hoge; end get_hoge() => 1 しかも、インスタンス変数を宣言すると、selfが代わってしまうのです。 self ==> main @hoge = 1 self => #<Object:0x402ae9c0 @hoge=1> これはいったい何が起こっているのでしょうか?よろしければ参考になるペー ジ等もお教えいただけたらと思います。
1 == (0 || 1 || 2) こういう式でtrueを得たいのですが (1 == 0) || (1 == 1) || (1== 2) としないと期待した評価が来ないのです。 こういうもんなんですかね。
p (0 || 1 || 2) => 0 だもの。
Rubyでは偽はfalseとnilのみ。 Rubyの0は真。ついでながら、""も[]も真。
133 :
130 :2007/01/29(月) 20:19:48
>>131 そういう事ですよね。ありがとうございました。
こんな関数を作ればいいのかな。もっと簡潔に書けそうな気もするが。 irb(main):001:0> def multi_equal(x, list0) irb(main):002:1> list0.each {|i| return true if x == i} irb(main):003:1> false irb(main):004:1> end => nil irb(main):005:0> multi_equal(1, [0, 1, 2]) => true irb(main):006:0> multi_equal(3, [0, 1, 2]) => false
スレ違いだが、Pythonだとこんな書き方があるなあ。 >>> 1 in [0, 1, 2] True >>> 3 in [0, 1, 2] False
ならこれでいいじゃん。nilとfalse以外はtrueなんだから。 irb(main):001:0> [0, 1, 2].index(1) => 1 irb(main):002:0> [0, 1, 2].index(3) => nil
137 :
デフォルトの名無しさん :2007/01/29(月) 20:54:30
>>136 >>135 が言いたいのは、「Pythonの方が美しい。自然だ。」ということなんじゃねえ?
いや、これでいいだろ。 irb(main):001:0> [0, 1, 2].include?(1) => true irb(main):002:0> [0, 1, 2].include?(3) => false
>135と>138に同意。
140 :
135 :2007/01/29(月) 21:25:52
>>137 いや、比較する意図はなかった。自分はRuby初心者なんで、Rubyでの書き方を
知りたかっただけ。しかし、実際に見ると、比較したくなるなあ。
>>138 これはきれいだ。専用の構文を必要としない点では、Rubyに軍配が上がると思う。
しかしPythonの x in y だと、y にイテレータを取ることができる。
だから例えば、ファイル上やネットワーク越しの巨大集合との逐次比較もできる。
メモリ上に巨大なリストを置く必要がない。
そういうのはRubyだとどうなるのかな?
include?はeachを持つオブジェクトに対してなら呼べる。 たとえばIOクラスのインスタンス(File.openの返値とか)なら open('hoge').include?("#¥n") とか。(#のみの行があれば真を返す) include?は同値比較なのでこの例だと普通は open('hoge').find {|line| /^#$/ =~ line } みたく正規表現でfindするけどね。
なんかデジャブを見ているよな気が。。。 錯覚か
part7の219以降の流れだな。
144 :
135 :2007/01/29(月) 21:45:36
>>141 なるほど、EnumerableモジュールのMix-inか。
Rubyも上手くできているなあ。
勉強になりました。ありがとう。
>>142-143 既出だったようですまん。その該当箇所も読んでみる。
145 :
113 :2007/01/29(月) 22:59:37
ありがとう
>>128 さん
なるほど ruby -v で warning が表示されますね(1.8.5 使用)。
同義なはずの attr_accessor 使ったコードだと warning が出ないのは意図的なのかな?
146 :
129 :2007/01/30(火) 01:34:56
すみません、どなたか心当たりのある方はおられませんか? もしかして、これは高度で難解な答えしかない問いなのでしょうか?
$ cat test.rb p [ self, self.object_id, self.class ] @x = 100 p [ self, self.object_id, self.class ] $ ruby test.rb [main, 107770, Object] [#<Object:0x349f4 @x=100>, 107770, Object] とりあえず、同じオブジェクトのままではあるようだ。 あとはちとソース見てみるわ。
これかな。 object.cの static VALUE rb_obj_inspect(VALUE obj) ROBJECT(obj)->iv_tbl->num_entries > 0 ってことは つまり1つでもインスタンス変数があったら、 <%s:%p, インスタンス変数を再帰的に> という出力に、そうでなければ、to_sの結果となる。 ただし、トップレベルのselfである main には特異メソッドとして to_sが"main"を返すように定義されているので、最初は "main" と出る。
>>148 乙。
mainにもinspectを定義してあった方が親切かもねえ。
150 :
129 :2007/01/30(火) 02:50:15
ありがとうございます。mainと同じものだったのですね。
もっとよく調べるべきでした。すみません。
もう一つの疑問
「トップレベルで定義したインスタンス変数は、なぜトップレベルの関数から
アクセスできるのか?」
についてはいかがでしょうか?
クラス定義内のインスタンス変数の場合、特異クラスからのアクセスしかできないの
ですが、(
http://www.amazon.co.jp/dp/4274066428 のP336)
トップレベルに限って、そうではないのです。
これは、selfとklassが別のオブジェクトを指しているのが原因なのでしょうか?
また、トップレベルのインスタンス変数は、どのようなスコープを持つと考えら
れるでしょうか?
>>129 >まず、トップレベルでインスタンス変数が使ゑます。
これって、要は、
class Object
def xxx
@zzz = "ここと同じ挙動なんじゃないの?"
def yyy
p @zzz
end
end
end
xxx; yyy
クラス定義中と同じってのは、何処に書いてあるン?
152 :
129 :2007/01/30(火) 04:02:52
>>151 申し訳ありません。ちょっと取り込み中で、ご返事が遅れました。
なるほど、クラスではなく、メソッドの内部ですか!
考えてみたら、メソッドの中でもメソッドは定義できますね。盲点でした。
153 :
129 :2007/01/30(火) 12:18:09
すみません、また疑問が出てきました。 知人から言われたのですが、 「トップレベルがもしメソッド定義の内部だとしたら、そこではクラスを定義 できないじゃないか」 ということなのです。 def hoge; class Hoge; end; end 確かにこれはエラーになります。 またしてもトップレベルの正体が分からなくなりました。
MacOS XのTerminal.appでscreenを使っているときにirbを起動して終了すると、C-aではじまるscreenのホットキーが使えなくなります。 同様の症状になった人いませんか。
Terminal.appとscreenとirb使ってるけど問題起きたことないな ホットキーは^tにしてる
156 :
129 :2007/01/31(水) 01:06:18
>>150 > 「トップレベルで定義したインスタンス変数は、なぜトップレベルの関数から
> アクセスできるのか?」
selfがmainのままだからmainのインスタンス変数はアクセスできる。というだけ。
>>149 Object#inspectが#to_sを元にするようにしてみた。
けど、適当なuploaderってどっかある?
159 :
129 :2007/01/31(水) 02:43:39
______ここまで読んだ_______
161 :
デフォルトの名無しさん :2007/01/31(水) 12:49:08
PHPで言うところの header("Location: 〜"); をrubyでやるには、どのようにすればいいんでしょうか?
個人的にはruby-gettextによるString#%の拡張がおすすめ。 "Name: %{name}, Age=%{age}" % { :name => 'AAA', :age => 25 }
164 :
162 :2007/01/31(水) 13:22:02
>>163 ありがとうございます。標準には存在しないということでしょうか。
意外でした。
165 :
154 :2007/01/31(水) 13:31:24
>>155 そうですか。ほかに同様の症状になった人いませんか。
>>161 require 'cgi'
cgi = CGI.new
print cgi.header('type'=>'text/html',
'charset'=>'utf-8',
'Location'=>'
http://www.example.com ')
166 :
161 :2007/01/31(水) 13:36:16
標準だとerbで Hello, <%= name %>! とか書くというのもあるけど、この程度じゃ#{}と大差ないな。
>>164 eRubyではだめでしょうか。
s = "name: #{name}, age: #{age}"
require 'erb'
erb = ERB.new(s)
name = 'foo'; age = 20
print eval.result(binding())
string.Templateと違って、式だけでなくfor文やif文を埋め込むことができます。
>>168 うそ、間違えた。
s = "name: <%=name%>, age:<%=age%>"
name = 'foo'; age = 20
require 'erb'
print ERB.new(s).result(binding())
170 :
162 :2007/01/31(水) 15:00:26
>>167-169 ありがとうございます。
eRubyは埋め込み用の変数に値を代入する必要があるので、即値を与えられる
Ruby-GetText の方が、自分の用途には使いやすそうな気がします。
継承元のnewをオーバーロードすることは可能でしょうか? 引数の数を変えても駄目だったのです。
newじゃなくinitializeのほうだと思うのだけど? でもって、オーバーロード(多重定義)じゃなくてオーバーライド(上書き・再定義)。
もし本当にnewを再定義したいのなら、うっかりインスタンスメソッドとして 定義しないでね。
初心者ばりばりな質問ですいません^^; そうです。new ではなく intialize を定義したいんです。 継承元クラスの intialize に色々プラスしたものを返したいんです。 具体的にコードを書きますのでよければご教授宜しくお願いします。 引数の文字列で指定されたブラウザを立ち上げたいのです。 class Ole < WIN32OLE def initialize(browser = 'ie',visible = true) case browser when 'ie' oie = super('InternetExplorer.Application') oie.Visible = visible when 'Sleipnir' sleipnir = super('Sleipnir.API') nIndex = sleipnir.NewWindow('',visible) oie = sleipnir.GetWebBrowserObject(nIndex) end @oie = oie return oie end end オーバーライドの方法や、「こうすればもっとスマートに書ける」 等の意見も貰えたらうれしいです。
>>174 することだけ考えると関数のほうが適当かも
def open_browser(browser = 'ie', visible = true) とか
これから色々機能つけるのなら、継承よりは内部に持った方が安全
177 :
174 :2007/02/01(木) 18:57:32
>>176 なるほど。ついつい判り始めた継承を使ってしまうのが、
すでに間違いだったんですね。;
また色々組み立てなおしてみます。
ご意見ありがとうございます。
Ruby だとほとんど継承を使わないオレがいる
判り始めた my revolution
GUIプログラミングだと継承いっぱい使う
10個の任意の数字を昇順(小さい数から大きい数)に並び替えるプログラムを作成しなさい 注意事項及びヒント: sortメソッドは使用しないこと 配列を使用した方が並び替え易いと思います
>>181 来年度は単位が取れるように講義を受けなさいね。
>>181 array = array.sort_by {|i| i}
>>181 class Array
alias :narabi_soroeru :sort
end
p array.narabi_soroeru
>185 ちゃんとsortメソッドは使ってないじゃん。
188 :
デフォルトの名無しさん :2007/02/04(日) 22:18:49
189 :
184 :2007/02/04(日) 22:20:01
漏れだって:sortはシンボルだから、 sortメソッドは使ってないぜ。
ruby_1_8 ブランチの最新版を VC8 でビルドすると以下のエラーメッセージが出て失敗しますが どうしたらエラーを回避できるでしょうか? VC7.1 ではエラーが出ませんでした。 C:/tmp/ruby/win32/mkexports.rb:8: [BUG] Segmentation fault ruby 1.8.5 (2007-01-31) [i386-mswin32_80]
今試したけど、再現できんなぁ。
木構造を描画したいのですが、Rubyではどんな方法が簡単でしょうか。 下のようなイメージで描画したいです。 C /\ A B ・・・・・・
何に書く/描くの? テキスト(AA)として? 何かのGUI部品に? 画像に直接?
194 :
192 :2007/02/05(月) 19:05:10
>>193 GUI部品に描画できればベストですが、
難易度によってはAAでやりたいです。
レシピブックを見たけど、 Rubyを使えばあまりに簡単すぎる題が多すぎないか? たま〜にしかコード書いてない俺でさえ、 「おっ」と思うようなのがチラホラとしか無くて ふざけてんのかと思った。
>>192 cairo とかどうよ?
linux 向けかもしれないけどさ。
>196 たしかに私もレシピブック(旧版)は買ったけど一回も参照したことがない。 でもレシピブックってそもそもそういうものじゃないかなぁ。小さな部品単位 で示す。あんまり特定的・具体的になりすぎず、いろんな局面で使えるコード 例を示す、っていう。 perl cookbook とかもそうじゃない? で、やり方が微妙に違う場合にそれがどう違うのか、どう使いわけるか、って いうのがどれだけうまく書いてあるか、ってのがあのテの本のポイントな気が する。
じゃあ、Ruby tricky code 集なんてあるといいかもね。
ruby 1.6.8でtouch使えないので、cvsweb見て、 File.open("/home/hoge/test", 'a') { ; } をヲレスクリプトにパクって来たが、空ファイルが作られないのはなぜ?
201 :
デフォルトの名無しさん :2007/02/06(火) 00:39:59
touchが動かないってことは? そもそも権限がないんじゃないのか?
>>200 system("touch /home/hoge/test")
じゃ駄目なん?
おいおい、1.6.8にはFileUtilがないってことじゃないの? rubyって自前で空ファイル作れない仕様だっけ?
>>198 perl cookbook もあんな程度なんかな
そーいえば実際のコードでは do〜endとかのブロック使う人が大半な中、 レシピブックでは {〜} が使われてるんだな。 紙の上だから対応関係がパッと分かるようにだろうけど。 自分自身そっちのスタイルなのに何故か違和感覚えてしまった。
レシピブックはレシピというよりサンプル程度 あんな本絶対に買っちゃだめだよ
見直してみた。 File.open(filename, 'a') { の前のif文の条件(filenameが無ければ真)が間違ってた。orz
ズコー
なんか聞くからにレースコンディションなコードだな。
いやー、Ruby や Perl みたいに There's More Than One Way to Do It. な言語にこそ、 定石集であるレシピブックの価値があると思うがなぁ。 実際、忘れっぽい俺はすごく助かってるし。 (レシピブックを参照してばっかだから、いつまで立っても定石を覚えないのか?)
212 :
192 :2007/02/06(火) 18:41:37
RMgickで困っています。どうやらインストールには成功したようなのですが、
>C:\workshp>gem install rmagick-1.13.0-win32.gem
>Successfully installed rmagick, version 1.13.0
require RMgickすると
>`require': no such file to load -- RMagick (LoadError)
このエラーメッセージが出てきます。
http://mpl.s59.xrea.com/comp/rmagick.html このサイトでは、postinstall.rbを実行すれば良いと書いてあるのですが、
postinstall.rbを探してもありません。
また、適当にPathを通してみたのですがどうにも上手くいきません。
どうすればいいでしょうか。
ruby 1.8.5 (2006-08-25) [i386-mswin32]です。
gemで入れたのならrequire 'rubygems'が必要じゃない?
214 :
192 :2007/02/06(火) 22:41:24
>>213 貴方はエスパーですか・・・。
本当にありがとうございました。
215 :
デフォルトの名無しさん :2007/02/07(水) 11:50:29
aaaa 53 353525252 aaa aaaa at3352352 例えばこのような各行があるとき splitで、aaaaと53と35...をそれぞれ別の変数に格納したいと思います。次の行も同様にaaaとaaaaとat33...と別々に格納したいです。 最初から、タブで区切られてるようではありません。 ff, gg, hh = gyou.split(/\t/).values_at(0,1,2) ですと、ffに全て格納されてしまいます。ggとhhの中は何もないです。 タブで区切られてないのでできないと思い、(/\s\)でスペースで区切ったのをそれぞれに格納するようにしたところ ffに最初の列しか格納されていませんでした。 ffにaaaa ggに53 hhに3535.. を格納するにはどうすればよいのでしょうか? よろしくお願いします。
まずやらなければならないのは p gyou
ff, gg, hh = gyou.split いらんことすんな、としか言いようがない。
218 :
デフォルトの名無しさん :2007/02/07(水) 16:48:11
ちょっと質問であります。 PHPをずっと使ってるんですが、PHPが使えない案件がありましてかわりにRubyどうだろうって話になったんですが。 HTMLの自動生成や動的コンテンツなんかにRubyってどうなんでしょう? Javaみたいに高度な知識が必要だったりすると手に負えないんですが、本職デザなもので…。
phpが使えなくて、rubyが使える案件って??? 普通はperlとかのほうが使えないか? デザは無理せずに、ウェブプログラマに外注したら? ウェブプログラマもデザインは外注するし、相互補完したほうが良い。お互いに餌場漁ったら絶滅するよ(w
RUBYで動画ファイルを扱うクラスなんてないでしょうか? sフレからeフレまでの切り出しや、cフレ目のキャプチャを作成。 みたいなことをしたいのですが。 宜しくお願いします。
最近Javaを始めたらメソッドのアクセス制御が ずいぶんRubyと違ってて困惑気味。 どちらの方式が実用的 or 使い易いもんでしょうか。
>>222 どちらか片方しか使えないようなプログラマは実用的でない、とは言える。
>>215 split(/¥s/)だと区切り文字が空白1文字になるので、spaceが連続しているときに困る。
split(/¥s+/)とするか、
>>217 のようにする。
>>218 PHPがつかえなくてRubyが使えるというのも珍しいけど、Rubyで大丈夫。
>>222 どっちがいいかは慣れまたは好みの問題。どっちにも利点と欠点があるので一概にはいえない。
Rubyのは仕様がないので欠点だらけ
226 :
デフォルトの名無しさん :2007/02/08(木) 12:35:14
>>222 この辺りまとめたのは、ないかね?
rubyのprivateが、javaのprotected相当というのは、知ってるが
>>221 ありがとうございます!
かなり目的に合ったライブラリーのようですね。
しかし、gemインストールの時点で躓いてしまいました。
gem install rmovie --remote
を実行するとエラーが出ます。
gemファイルを落として --local でも失敗してしまいます。
rubyにパスは通しており、バージョンは1.8.5です。
どなたか宜しくお願いします。
C:\>gem install rmovie --remote
Building native extensions. This could take a while...
can't find header files for ruby.
ERROR: While executing gem ... (RuntimeError)
ERROR: Failed to build gem native extension.
Gem files will remain installed in C:/ruby-1.8/lib/ruby/gems/1.8/gems/rmovie-0.5
.1 for inspection.
>>227 gemの失敗した記録が最後のディレクトリの下のどっかに
あるはずなので見てみては?
Windowsだと、cygwinとかないと作れないのかもしれんね。
コンパイラがないだけだろ。
Ruby/DBIでMySQLに接続しているのですが、フィールドタイプが日付型(DATETIME等)だと SELECTした時にsyntax errorと怒られます。対処の仕方ってあるのでしょうか?('A') MySQL、Ruby、DBIともにUbuntuのパッケージでインスコしました。 MYSQL:mysql Ver 14.7 Distrib 4.1.15, for pc-linux-gnu (i486) using readline 5.1 Ruby:ruby 1.8.4 (2005-12-24) [i486-linux]
231 :
230 :2007/02/08(木) 19:19:33
自己レス SELECT last_mod, hoge, hoge FROM (ry から SELECT * FROM (ry にしたら読み込めた。直接フィールド名指定すると駄目なんだっけorz
hpricotとscrapiってなんて発音するのが普通なん? 今はハプリコットとスクラッピって読んでるんだが。
スクラッピ スクラパ スクラピ プーーウーー
>>231 そんなはずはないのでもっと調べてみて。
236 :
デフォルトの名無しさん :2007/02/09(金) 11:51:37
みんなはRuby書くときエディタは何使ってんの?
vim, EmEditor, TextMate, Muleなど。
xyzzy
メモ帳
edlin
サクラエディタ
more > test.rb
cat >> test.rb
ruby -e'print while gets' >> test.rb
秀丸
zed
ちなみにzshで書かれたエディタだ > zed
JmEditor2もいい
>>244 それを言うならこれだろ
ruby -pe'' >> test.rb
ruby -pe'' だとうまくいかなくて ruby -pe '' ruby -pe0 だとうまくいった。
Class.new.is_a?( Module ) は true を返すのに include( Module.new ) ができて include( Class.new ) ができないのはなぜですか?
Classだから
include(m) m.class == Module じゃなきゃダメだろ。
>251 マニュアルに書いてある通り、そういう仕様。 > ・inclule による Mix-in ができない それ許すとクラスとモジュールを分けた意味が無くないか? だったら始めから多重継承にすればええやん。 仕組みとしては、単に include 内で Class のインスタンスを弾いているだけだと思われる。
>>253 実はこんな変態コードが通ったり。
class Moduleson < Module
end
include Moduleson.new
難しいアルね
Class のスーパークラスは Module なのに Class のインスタンスは Module のインスタンスように振舞わないの?
継承してるからといっていつでもis-a関係になるわけではないよ。
One-Click Ruby InstallerでRubyをインストールしたのですが、 riが英語なので日本語にしたいです。 どのような方法があるでしょうか?
260 :
227 :2007/02/10(土) 21:20:14
>>221 の方が紹介してくれた rmovie を
ウィンドウズ環境から利用できる方法はないでしょうか?
cygwin辺りから調べてますがいまだに解決できません。
どなたかヒントだけでもお願いします!
なんかtimeとwhileとeachだけ使えばいいって「たのしいRuby」に書いてあるけどみんなそう? 新しくRubyはじめました。こんばんわ
んなこたぁない
263 :
デフォルトの名無しさん :2007/02/11(日) 15:17:35
なぜエラー? @h=Array.new(9){Array.new(9) {Array.new(2) {0}}} #p @h def jouyo() for i in 1..9 for j in 1..9 @h[i*j%10][j][0]=i*j%10; @h[i*j%10][j][1]=(i*j-i*j%10)/10; end end end
0..8 %9
a << cout のようなことをするにはどうすればいい?
266 :
電電厨 ◆DdcQHNOL5U :2007/02/11(日) 22:10:50
しまwwwwwwww C++しばらくやってないからボケた。 a << cin の間違いでwwwwwwwwwwww
a = gets.chomp
268 :
ちんこ ◆HEfxsk5e3k :2007/02/11(日) 22:15:25
getsがあればいいことわかった、神様ありがとう
270 :
ちんこ ◆HEfxsk5e3k :2007/02/11(日) 23:29:50
あれ、なんか間違ったか。 まぁいいやおれはRuby Newbieだ! erubyについて簡単に教えてくだしあ^^
RAAにあるものはgemで取得できないんですか?
gemを作成・配布しているのはあくまでそのライブラリの作者など なので、当人次第。
273 :
デフォルトの名無しさん :2007/02/13(火) 00:16:15
Rjbをインストールしたいのですが以下のようなエラーが出ます.助けてください. 1.0.3のgemパッケージでうまくいかなかったので zip晩の1.0.2を上書きしてsetup.rbを動かしてもうまくいきません. 環境はWinXP SP2 ruby 1.8.4 rjbは1.0.2?です ruby setup.rb config ---> bin <--- bin ---> lib <--- lib ---> ext D:/ruby/bin/ruby "D:/ruby/lib/ruby/gems/1.8/gems/rjb-1.0.3-mswin32/ext/extconf.r b" checking for jni.h... no *** D:/ruby/lib/ruby/gems/1.8/gems/rjb-1.0.3-mswin32/ext/extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options.
274 :
273 :2007/02/13(火) 00:16:51
Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --srcdir=D:/ruby/lib/ruby/gems/1.8/gems/rjb-1.0.3-mswin32/ext --curdir --ruby=D:/ruby/bin/ruby setup.rb:535:in `command': 'system D:/ruby/bin/ruby "D:/ruby/lib/ruby/gems/1.8/g ems/rjb-1.0.3-mswin32/ext/extconf.rb" ' failed (RuntimeError) from setup.rb:1112:in `extconf' from setup.rb:1107:in `config_dir_ext' from setup.rb:1321:in `traverse' from setup.rb:1338:in `dive_into' from setup.rb:1319:in `traverse' from setup.rb:1313:in `exec_task_traverse' from setup.rb:1308:in `exec_task_traverse' from setup.rb:1097:in `exec_config' from setup.rb:878:in `exec_config' from setup.rb:710:in `invoke' from setup.rb:674:in `invoke' from setup.rb:1352
276 :
273 :2007/02/13(火) 01:23:52
>>273 エラー自体は、Cのヘッダの検索パス上に%JAVA_HOME%\include(だっけ?)がないからjni.hが見付からないというもの。
最近のRjbではJDKのツールの関係上JDK1.5以降しかソースからのコンパイルはサポートされてない(手動で作ればいけるはずだけど)。
Cコンパイラが無いとrjb.soが作れないけどそれはOK?
環境変数JAVA_HOMEは設定してある?
Windowsならgemでリモートインストールしようとした時点でmswin32が選択できて
それにバイナリが入っている(なのでJDK1.4でも動作はするかも)んだけど、それでインストールできなかったってこと?
278 :
273 :2007/02/13(火) 12:39:25
>>277 JDKを1.6にUPDATEしてgemでもう一度やってみてmswin32版を選択しましたら無事インストールできたような感じだったんですけど
同梱のtest.rbを試した結果以下のように表示されました
これってインストールできてないですよね
start RJB(1.0.3) test
Loaded suite test
Started
EEEEEEEEEEEEEEEEEEEEEEEEEEE
Finished in 0.156 seconds.
1) Error:
test_CallByNullForArraies(TestRjb):
RuntimeError: unknown error
test.rb:11:in `initialize'
test.rb:11:in `setup'
2) Error:
test_CastObjectArray(TestRjb):
RuntimeError: unknown error
test.rb:11:in `initialize'
test.rb:11:in `setup'
中略
27) Error:
test_underscored_constant(TestRjb):
RuntimeError: unknown error
test.rb:11:in `initialize'
test.rb:11:in `setup'
27 tests, 0 assertions, 0 failures, 27 errors
「無事インストールできたような感じ」のあたりを詳しく。
>>278 テストが実行できるんだからファイル自体は展開されたと思う。
で「test.rb:5:in `require': no such file to load -- rjb (LoadError)」と言われてないので-rubygemsでもないとすると
Javaのランタイムライブラリが見付からないので実行できていないのではないかと。
Windowsの場合「%JAVA_HOME%/jre/bin/i386/{classic,hotspot,server}/jvm.dll」を見に行くらしいのでJAVA_HOMEは常に設定されていないといけない。
281 :
ちんこ ◆HEfxsk5e3k :2007/02/13(火) 13:47:52
ary = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] prime = [2] while (ary) do prime.each do |p| ary.delete_if do|i| i%p == 0 end prime << ary.first end end p prime 何が違うんでしょうか・・・処理が止まりません。
282 :
デフォルトの名無しさん :2007/02/13(火) 13:50:49
ファイルの書き換えについて教えて下さい。 ファイルをオープンして文字列を置換したあと, 元のファイルより小さくなった場合、後ろの方にゴミが残ってしまいます。 flushの事をよく理解していないためだと思いますが宜しくお願いします。 File.open(document,'r+'){|txt| data = txt.read txt.rewind txt.puts data.gsub('nil', '') }
283 :
ちんこ ◆HEfxsk5e3k :2007/02/13(火) 13:58:49
さっきのはおかしかった ary.delete_if do |i| i%prime.last == 0 end prime << ary.first p prime ary.delete_if do |i| i%prime.last == 0 end prime << ary.first p prime これなら成功します。aryが尽きるまで繰り返させたいのですがどうすれば?
284 :
273 :2007/02/13(火) 14:00:42
>>279 gemがエラーをはきませんでした
>>280 JAVA_HOMEは設定してるんですけど
「%JAVA_HOME%/jre/bin/i386/{classic,hotspot,server}/jvm.dll」にjvm.dllが
ないのが問題ですかね?
これって変更できないのですか?
285 :
ちんこ ◆HEfxsk5e3k :2007/02/13(火) 14:02:44
while (ary) do ary.delete_if do |i| i%prime.last == 0 end prime << ary.first p prime end なんでだろう。 エラトステネスのふるいってやつをやりたいんだぜ?
Rubyの偽はfalseとnilのみ。 0、0.0、""、[]、{}は真。
>>282 方法1: 別のファイルに書いてリネームする
方法2: 縮んだ分をtruncateする。
288 :
ちんこ ◆HEfxsk5e3k :2007/02/13(火) 14:10:02
(ary.length!=0) にしたらなんとかなったぜ\(^o^)/
289 :
ちんこ ◆HEfxsk5e3k :2007/02/13(火) 14:15:04
while (ary.length!=0) do ary.delete_if do |i| i%prime.last == 0 end prime << ary.first p prime end [2, 3] [2, 3, 5] [2, 3, 5, 7] [2, 3, 5, 7, 11] [2, 3, 5, 7, 11, 13] [2, 3, 5, 7, 11, 13, 17] [2, 3, 5, 7, 11, 13, 17, 19] [2, 3, 5, 7, 11, 13, 17, 19, nil] 最後のいらないんだけど、なんでだぜ?
class A def initialize @@last = self end def A.inspect p @@last end end class B < A end とした時、B.new をすると A の @@last まで変更されてしまうのですが、 A, B それぞれのクラス変数を独立した内容にするために 別の変数名にする以外の解法としてはどのようなものがあるでしょうか。
ary.empty? というのもある。 あと、while ! に相当するuntil というのもあるぜ。
>>289 最後にループを回るときは、
delete_ifで空になったaryからfirstを取り出してきてるね。
repeat
until 式
のループにしてみたら?
>>284 あれ、ごめん間違い。Windowsならi386なんか入らないわ。
DLLの場所を変えたければ、いまのところソース変更してコンパイルし直すしかないなあ。
ttp://java.sun.com/javase/ja/6/webnotes/install/jdk/install-windows.html を見る限りはRjbはJava Hotspot VM(clientのほう)を見に行ってて、ディレクトリ構造も問題ないと思うんだけど。
まとめて聞くけど
1. Rubyはどこからダウンロードなんていうファイル?
2. JDKはどこにインストールした?
3. JAVA_HOMEには何と書いてある?
4. cmd.exeとかアプリケーションを起動し直さないと環境変数が反映されないけどそれはおk?
5. 実際んとこjvm.dllというファイルはどこにある様子?複数あると思うけど見付かる限り書いてほしい。
294 :
ちんこ ◆HEfxsk5e3k :2007/02/13(火) 15:20:26
ary.firstをary.shiftにしたら直りました。 食堂でカレー食いながら考えたらfirstだと最後にaryに残ってしまって重複してしまうことが分かった。 あとはメモリをどうするかです。 一気にary = [2...............2**10000]のはたぶんメモリが足りないので小分けにしたいのですが 素数は数が進むほど少なくなるのでどういう感覚でやっていけばいいか迷っています。 無駄な悩みなのかな?
Narrayの入れ方が分かりません。 requireとincludeの違いはなんですか? あとMathとか標準ライブラリはどこに入ってるんですか?
>>294 >無駄な悩みなのかな?
まずは
自然数nが√nを越えない最大の整数以下の全ての素数で割り切れなければ,nは素数である。
を考慮に入れろ。
>295 まず、Rubyにおいては モジュールとは外部ファイルを指すのではなく module文で宣言したものであることをお忘れなく。 Rubyの include は外部ファイルの取り込みではなく モジュールの取り込みだから全然別物。 Math は組み込みモジュールなので 実行された時点で読み込まれている。 モジュールなので include しても良いし 各関数は Math.メソッド名() でも呼べるよう 設計されているので、そう呼んでも良い。
298 :
ちんこ ◆HEfxsk5e3k :2007/02/13(火) 19:57:47
2*3*5*7*11*13+1 = 30031 = 59*509
300 :
ちんこ ◆HEfxsk5e3k :2007/02/13(火) 20:24:51
おおwwww計算してないけど鮮やかな回答wwwww あれ、素数かけてって+1は素数じゃなかったか?
>>300 「素数が無限にあることの証明」にも出てくる、最大と仮定した素数Pn
までの素数の積に+1した数は、P1..Pnまでのいずれで割っても1余るが、
Pnより大きい数で割る場合については何も語ってないと思う。
どなたか
>>290 にヒントを。。。
スーパークラスとサブクラスで同名で同様の役割だけど
データは独立した変数ってのは無理なのでしょうか。
304 :
デフォルトの名無しさん :2007/02/13(火) 21:27:30
ファイルを送信するにはどうすればいいですか? net/httpのpostメソッドは,文字列しか送れない? HTMLでいうと <form enctype="multipart/form-data" action="upload.php" method="post"> <input name="upFile" type="file"> <input type="submit" value="送る"> </form> のpostをrubyでできる?
>>303 class A
def initialize
an_a = self
self.class.module_eval do
@last = an_a
end
end
def A.inspect
@last
end
end
B.new
p A
A.new
p A
>>304 multipart/form-dataのボディを自力で組み立てる必要があったと思う。
>>305 ありがとうございます。
しかしクラス変数でなくインスタンス変数ってのが
ビミョーにひっかかるような。
ちょっと勉強してきます。
>>307 ClassクラスのインスタンスであるAやBのインスタンス変数だけど、
不満?
>>306 としたら,サンプルを知ってますか?
ruby の webクライアント用の情報少なくって
>>307 1.9 ではクラス変数はサブクラスで共有されず、クラスごとに独立になったよ。
311 :
ちんこ ◆HEfxsk5e3k :2007/02/14(水) 00:50:23
>>310 それはまた大胆な変更を…。
使う機会はほとんどないけど、ここぞと言うときに使っているんだよなおれ。
困ったな。
>>315 thanks
参考にNet::HTTPクラスを拡張してみたけど`syswrite': Broken pipe (Errno::EPIPE)のエラーが出てしまって,お手上げ。
upload( path, query, files, header = nil)メソッドを追加したつもり。通常のFORMエレメントをHashでqueryに与えて,アップロードするファイルをname => ファイルパスのHashで与えてみました。以下スクリプト。
class Multipart < Net::HTTP require 'uri' def upload path, query, files, header = nil boundary = "-" * 30 + "RUBYMULTIPARTPOST#{Time.now.to_i.to_s}" data = Array.new query.each{|key, val| data << "--#{boundary}" data << %Q!Content-Disposition: form-data; name="#{URI.encode(key)}"! data << '' << "#{URI.encode(val)}" << '' } files.each{|key, file| data << "--#{boundary}" data << %!Content-Disposition: form-data; name="#{key}"; filename="#{File.basename(file)}"! data << 'Content-Type: application/octet-stream' data << '' << open(file, 'rb').read << '' } data << "--#{boundary}-- << "\r\n" header['Content-Type'] = "multipart/form-data; boundary=#{boundary}" post(path, data.join("\r\n"), header) end end
できた。 昨日はダメだったが今日はできた。理由わからず。
括弧よくない人だ
<hoge> <id>1</id> <name>ほげたろう</name> </hoge> というXMLをパースしてオブジェクトに入れようとしてます。 案1)配列に入れる hoge[:id] hoge[:name] 案2)Hogeクラスを定義してattr_accessorでid,hogeを定義 hoge.id hoge.name 案1のがクラス定義する手間が省けて良さげなんですが パフォーマンスは案2の方が上ですかね? スクリプト言語なんでメンバへ入れてアクセスしても大差ないのかな??
この後どんな処理をしたいかによる
322 :
320 :2007/02/16(金) 11:38:30
参照だけですね。代入はなし。
単なる値のホルダーならStructもあるな。 Hoge = Struct.new(:id, :name) hoge = Hoge.new hoge.id = 1 hoge[:name] = 'ほげたろう'
$ time ruby1.8.5 -e 'class C;attr_accessor :a;end;h=C.new;h.a=1; 10_000_000.times{h.a}' 6.59s user 0.11s system 6.71s total $ time ruby1.8.5 -e 'h={:a=>1}; 10_000_000.times{h[:a]}' 7.73s user 0.11s system 7.83s total
>>324 なるほど、参考になるよ。
つまり Python を使えということだね。
>324 Structの方が速い。 % time ruby -e 'class C; attr_accessor :a; end; h=C.new;h.a=1; 10_000_000.times{h.a}' 6.12s user 0.00s system 66% cpu 9.217 total % time ruby -e 'h={:a=>1}; 10_000_000.times{h[:a]}' 7.02s user 0.01s system 80% cpu 8.763 total % time ruby -e 'C=Struct.new("C",:a); h=C.new; h.a=1; 10_000_000.times{h.a}' 5.48s user 0.00s system 95% cpu 5.739 total ちなみに、 % ruby -v ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-freebsd6]
ちなみに、なぜ Struct の方が速いかというと、 Struct ではアクセサは自分 が何番目の要素か、というのを知っているから。 Structは内部的にはデータは配列として蓄えられていて、たとえば326の定義 ならaメソッドは1番目の要素を参照するだけでよく、実際そのような内容のメ ソッドが定義される。ハッシュ値を考えない分、速い。 もっとも、ふつうのクラス定義より速い理由はよくわからん。
328 :
320 :2007/02/16(金) 23:13:39
うお、実行時間計測しようと思ってた矢先に・・・ Structはえーし、クラス定義の手間も省けるし文句なしっすね。 Structでいきます。ありがとう!
329 :
ちんこ ◆HEfxsk5e3k :2007/02/16(金) 23:30:27
XMLっていいんですか? HTMLとCSSでホームページは作れますが、XMLにすると何が有利ですか?
ここで聞くことじゃないと思うが?
>329 とりあえず構造付きのデータを記述できる 出来合いのパーサがあれこれあるので自力でファイル読んでトークンにぶっかいて……という手間が省ける どっちかっつーと設定ファイル向けだなあ >XML # ちなみにYAMLってのもあるでよ、と混乱の種をまいてみるテストw
標準ライブラリについてるto_yamlなんであんなに遅いんだろう
Object#idって1.8でobsoleteになったけど、 自分でidという名前のメンバ変数を定義するのはよいのかな。 てかrailsのActiveRecordはidメンバ必須だから大丈夫だと思うんだけど・・・
将来的には遠慮なく使え。 現状は注意しながら使え。 ActiveRecordなら問答無用。 というところで。
>>320 パフォーマンスはあまり違わない。
案2は拡張しやすいけど手間がかかるので、最初は案1でやって、行き詰まったら案2に乗り換えればいいと思う。
>>335 OpenStruct
倍くらい遅いけどな。
しかし、yarv使うとHashのアクセス速いな。
Structに迫るというか微妙に抜いてるかも。
全体に5〜6倍くらい速くなる。
338 :
デフォルトの名無しさん :2007/02/19(月) 15:19:32
質問はRuby/TkのTkListboxのフォント指定についてです。 Osaka等幅フォントを指定したいのですが,下記三通り試しましたがうまくいきません。 listbox.configure('font' => 'Osakaレギュラー-等幅') listbox.configure('font' => 'Osaka等幅') listbox.configure('font' => 'Osaka-等幅') 日本語の等幅フォントの指定はどのようにしたらよいでしょうか? 環境はMac OS X 10.4 ruby 1.8.2。デフォルトでインストールされたままのrubyです。 よろしく
p TkFont.families.select{|fn| /Osaka/ =~ fn} とやると出てくるうちの等幅のほうをコピペで指定してやると出来た。 マイナスなのか全角ダッシュなのかよくわからんがそこらの違いぽい。 ダンプしたら e2 88 92 e7 ad 89 e5 b9 85 というコードの文字列のようだ。
うわ、何てキッタナイ言語なんだ
>>340 確かに、お前の使っているチョウセンニホンゴモドキは汚い言語だな。
342 :
デフォルトの名無しさん :2007/02/19(月) 20:01:46
>> 339 Thanks. ちょっとしたTIPS参考になりました。 ところで,Osaka等幅の半角スペース(コード\20)なんだけど,TkListbox上ではビミョーに等幅にならないです。空白が連続すると1ピクセルづつぐらいずれていきます。 Aqua/Tkに問題があるのかな? (TkEntryではことえりで入力できない欠陥があるのでこれが限界かな?)
ruby + sqlite3 で create table test する時に tableが既にある場合に例外でちゃうんですが これを回避する際の定型コード教えてください
require 'rubygems' require 'sqlite3' require 'pp' db = SQLite3::Database.new( 'db/test.db' ) begin db.execute( 'select * from test' ) rescue db.execute( 'create table test( id integer primary key, name text, job text );' ) end pp db.execute( 'select * from test' ) db.close これか?これでいいのか?
問答無用で事前にdrop table発行するのはカコワルイ?
>>344 > begin
> db.execute( 'select * from test' )
> rescue
> db.execute( 'create table test( id integer primary key, name text, job text );' )
> end
存在チェックのためだけに全件検索するのもあまりにもアレだが、
そもそもチェックしてから作成ってのは典型的なrace conditionだろ。
rescueするなら、普通は作成してみてすでにあった場合はエラーを無視。
>>347 参考になるサイト情報ありがとうございます。
勉強してみます。
どこで質問するか迷いましたが、Rubyのソースを出すので、ここで質問させてください。 RubyとMySQLでデータベースアプリを作っています。 下のように、CGI(1)でレコードをUPDATE後、CGI(2)でレコードを 表示しようとするとUPDATE前のレコードが表示されてしまいます。 ここでブラウザの更新ボタンを押して更新すると、UPDATE後のレコードが 表示されるようになります。 どうすれば最新のレコードを表示できるでしょうか? CGI(1)------------------------------------------ require 'mysql' my = Mysql.new('localhost',user,pass,database) my.set_server_option(Mysql::OPTION_MULTI_STATEMENTS_ON) my.query( <<-EOD start transaction; update hoge_table set hoge=hoge where hoge=hoge; commit; EOD ) my.close cgi(2)へリダイレクト CGI(2)------------------------------------------ require 'mysql' my = Mysql.new('localhost',user,pass,database) my.query("select * from hoge") do |res| 結果をリスト表示 end my.close
>>351 Cacheじゃないの?
Cacheしないようにするtipsはググればわんさか見付かるから試してみなよ。
evalについて質問です。 混乱ループしてしまいどつぼにはまっています。 このようなIF文を書きたいんです。 1|mc = MyClass.new 2|value = 'value' 3| 4|if a.value = /{#value}/ 5| puts 'true' 6|end 4行目のどこをエスケープして、どこをevalで囲めば良いのかで困っています。 どうぞよろしくお願いします。
ワラタ
357 :
354 :2007/02/20(火) 13:09:45
補足なんですが、要するにIF部分をevalで動的にしたいのですが、 メソッド名と変数名がかぶって混乱したという話です。 変数名は変えたくないんです。これだけは譲れなくて。 ちなみに '=' は '=~' です。
だから何を動的にしたいんだよ
359 :
354 :2007/02/20(火) 14:23:37
ほんと例文になってませんでした。すいません。 また例文を書き直そうと思ったら、またしてもわからなくなってきたので 質問を替えます。 a = MyClass.new value = 'loop' if a.value =~ /{#value}/ puts 'true' end があったとして、IFの行だけを後に動的にしたいんです。 上の例文の場合ではどのようにIF行をevalで表現すればいのでしょうか? グダグダですいません。
#{value}だろ 何をしたいのかわかんねーよ
361 :
354 :2007/02/20(火) 14:50:12
if行をevalで表現したいんです。
eval %Q! if a.value =~ /{#value}/ puts 'true' end !
「ifの行だけ」はif文(endまで)全体なのか、正規表現マッチングのことなのか。
a.value == 'loop'だったらput trueしたいんでしょ? で、'loop'は固定でなくいろいろな文字列にしたいと。
おしえてください 任意長の全角の数字の文字列を半角にする方法はありますか? a = "0123" b = a.hoge #=> "0123"
366 :
354 :2007/02/20(火) 17:19:53
色々と中途半端な質問失礼しました。 あらゆるパターンをひたすら試して解決しました。 if eval("a.#{value} =~ /#{value}/") puts 'loop' end マッチング部のみをevalで生成すると通ることがわかりました。
valueの値(文字列)が意味するaのメソッドの返値なら、evalしなくても a.__send__(value.to_sym) で取れるぞ。
文字列も解釈するから.to_symなしでもいけるな。
>>351 CGI(1)のcommitのあとで、select文を発行してデータを確かめてみてはどうだろう。
あるいはCGI(2)へリダイレクトせずにselect文を実行。
371 :
ちんこ ◆HEfxsk5e3k :2007/02/20(火) 20:16:46
あの、質問です。 よく偶数か奇数かを調べるには%2を使って0か1で判断しますね。 でも計算機工学で習ったんですけど割り算って超大変 なんで整数型で浮動小数点で表されていなければ最下位ビットが0か1かで判断出来ると思うんです。 そういうメソッドってないですかね?w
def even?(number) (number & 1) == 0 end def odd?(number) (number & 1) == 1 end
ひどいtypoをしてしまった(汗
ActiveSupportにもあるけど、 class Integer def even? self & 1 == 0 end : end とかのほうがRubyぽいな。
376 :
ちんこ ◆HEfxsk5e3k :2007/02/20(火) 20:38:54
結果発表 if (i&1)==0 >= if i%2==0 >>>> defでeven?を使った場合 速度が大事ならC++でやれとでもいいたそうな顔ですね。 どういうコードが早いか研究するのは悪いことですか?
誰もそんなこと言ってませんけど。
378 :
365 :2007/02/20(火) 20:51:46
どなたか教えてください それとも不可能ですか?
380 :
365 :2007/02/20(火) 21:03:37
381 :
デフォルトの名無しさん :2007/02/20(火) 21:06:27
ファイルに「ヘブン.txt」「ヘブン.html]「ヘル.txt」「ヘル.txt」があるとき, 次のスクリプトだと「ヘブン〜」を適切にリストアップできません。 環境はMac OS X Tiger ruby 1.8です。 Mac 特有の問題らしいですが,きちんと「ヘブン〜」をリストアップする方法はありますか。スクリプト自体はShift-JISでもUTF8でも同じでした。 #!/usr/bin/ruby -Ks require 'iconv' d = "ヘル" doc = Iconv.iconv('utf8','sjis', d) Dir.glob("#{doc}*"){|fh| puts fh } d = "ヘブン" doc = Iconv.iconv('utf8','sjis', d) Dir.glob("#{doc}*"){|fh| puts fh }
>>380 NKF.nkf("-Z","01234") # => "01234"
383 :
365 :2007/02/20(火) 21:14:24
>>382 ありがとうございました!
できました。
>>381 MacOSXのファイルシステムはかなの濁点をUnicode的に分離して保存して
いるので未対応の変換ライブラリで使うためには正規化する必要がある。
Rails(というかActiveSupport)のMultibyteを使って
handler = ActiveSupport::Multibyte::Handlers::UTF8Handler
file_name = handler.normalize(file_name)
とかするといいと思う。
ああ、濁点を分離した状態にする場合はnormalizeに第二引数がいるわ。 分解のほうだから、:dか:kdかな。
>>371 >でも計算機工学で習ったんですけど割り算って超大変
計算機工学でならったんですけど2の割り算って超簡単
それはいいんだけど、スクリプトを起動したときのrubyのパスって調べることできますか。
$ cat hoge.rb
p RUBY_PATH
$ ruby hoge.rb
"/usr/local/bin"
みたいな感じで。
>>370 UPDATEは成功していると思います。
CGI(1)はアップデート専用で、CGI(2)は表示専用なので、
ブラウザの更新ボタンでUPDATE後のレコードが表示されるし、
リダイレクト時にはcgi2.cgiだけでリダイレクトしています。?hoge=xxxはありません。
今、何度も繰り返し再現実験?をしていたら、
UPDATE後のレコードが表示される時と、されない時がありました。
なんだかブラウザのキャッシュのような気がします。
もう少し踏ん張ってみることにします。
>>387 OSにもよると思ったけど大抵の環境では$0でとれるよ。
>>389 CGI(2)で、ヘッダに
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
とか出して、ブラウザにキャッシュさせないようにしてみるといいかもよ。
>>387 2の割り算は簡単なのか。なんか掛け算と割り算はやべえって習ったから。
ブースの乗算アルゴとか習った。うぇwwwうぇwwwってカンジ
おれはRDEでF5ノシなので、パスとかは全く分からない。
そんなの気にしなーい、windowsだから気にしなくてもおk
>>385 サンクス
Tiger標準はRubyのみだから,ってことはRailsをインストールしなきゃダメってことか。
それか,自分でテーブルを作って変換するか?
ひらかな,カタカナだけの正規化だけなら50パターンだから,インストールより楽かも。
>390 $0で出てくるのはスクリプトの名前なのでは。 やりたいのは処理系のパスでしょ。 こんな感じかなー p `cat /proc/#{$$}/cmdline`.split("\0")[0] ただ、コマンド行がフルパスでないときにはだめだな。 そういうときはサーチパス(ENV['PATH'])から探索しないといけないのかも。
>>393 そういえば、LeopardにはRailsも載るらしいな。
>>394 >$0で出てくるのはスクリプトの名前なのでは。
>やりたいのは処理系のパスでしょ。
その通りです。
ENV['PATH'] を検索する方法だと、絶対パスで指定されたときにアウトだし。
>>387 "/usr/local/bin"じゃなくて "/usr/local/bin/ruby" だったorz
$ cat hoge.rb
p RUBY_PATH
$ ruby hoge.rb
"/usr/local/bin/ruby"
$ ruby1.9 hoge.rb
"/usr/local/bin/ruby1.9"
$ /usr/local/ruby1.9/bin/ruby hoge.rb
"/usr/local/ruby1.9/bin/ruby"
みたいなことがしたいです。
よろしくお願いします。
OSにもよるが、procfsがサポートされてるなら File.readlink('/proc/self/exe') Win32ならWin32APIかdl使ってGetModuleFileNameでごにょごにょ。
>>387 Cプログラム中では rb_argv0 で保持されている。が、それをRubyスクリプトから取り出す手段がない。
大昔に [ruby-list:15843] あたりで話題になったが結局実装されていない。
400 :
399 :2007/02/21(水) 03:54:26
拡張ライブラリ使ってもいいんなら、 === hoge.c === #include <ruby.h> void Init_hoge() { rb_define_global_const("HOGE", rb_argv0); } === extconf.rb === require 'mkmf' create_makefile("hoge") …の2つのファイルを作っておいて、 ruby ./extconf.rb make ruby -r./hoge -e 'p HOGE'
>>391 そういうことか!
「ブラウザ キャッシュ」で検索したらIEの設定とかがたくさんあったから、
一生懸命ブラウザの設定項目を確認してました。
でもブラウザの設定じゃいけない気がして、悩ましく思っていました。
今日はもう出動する時間なので、今夜試してみます。
ありがとうございます。
>>399 そもそもargv[0]に正しいパスを渡されているという保証はない。
>>393 こんなんでどう?一度作っちゃえばコピペで何とかなる。
ひらがなだけ
def nfd(str)
require 'jcode'
result = String.new
table = {"が" => "か" + "\xe3\x82\x99","ぎ" => "き" + "\xe3\x82\x99","ぐ" => "く" + "\xe3\x82\x99",...
...中略...
"ば" => "は" + "\xe3\x82\x99","び" => "ひ" + "\xe3\x82\x99","ぶ" => "ふ" + "\xe3\x82\x99"...
...,"ぷ" => "ふ" + "\xe3\x82\x9a","ぺ" => "へ" + "\xe3\x82\x9a","ぽ" => "ほ" + "\xe3\x82\x9a"}
str.each_char{|char|
result.concat(table[char] ? table[char] : char)
}
return result
end
d = "へぶん"
doc = nfd(d)
Dir.glob("#{doc}*"){|fh|
puts fh
}
Pragger 使ってみたくて
http://pragger.ikejisoft.com/wiki/GetPragger http://pragger.ikejisoft.com/wiki/UsingPragger これ通りやってみた所、こんなエラーが出ました
pragger.rb:26:in `inject': no block given (LocalJumpError)
nil from pragger.rb:12:in `load_plugins'
pragger.from pragger.rb:43 no block given (LocalJumpError)
それで pragger.rb の中を見てみたんですが
Dir.glob(File.join(folder, "**/*.rb")).sort.inject({}).each do |plugins,file|
plugins[ file[b.size..-1].to_s.gsub("/","::")[0..-4] ] = Plugin.new(file)
end
この部分がわかりません。
inject(0) {|r,i| r+i} がなんとかわかるレベルなんですが
indjecct({}).each do が何をしてるのか
b.size の b はどこから来たのか の2点が 理解不能で困っています
誰か解説お願いできませんか?
ソース見てないけど、そのDir.glob〜injectがやってることは # プラグインとして使うファイルの一覧を得る plugin_files = Dir.glob(File.joinFile.join(folder, "**/*.rb")).sort # 名前→プラグインの実体のハッシュを生成 plugins = {} plugin_files.each do |file| key = fileをいじって生成 plugins[key] = Plugin.new(file) end だな。 この部分だけじゃbの出所わからんね。
底がnの対数をとりたいのですが、どうすればいいのですか? 自然対数と常用対数しか組み込みモジュールにないのですが
408 :
ちんこ ◆HEfxsk5e3k :2007/02/22(木) 00:27:26
分かった
409 :
399 :2007/02/22(木) 00:40:01
>>407 えーと、学校で対数を習うときに一緒に習うはずなんだが、
任意の1でない実数a,bに対して、
log a (x) = log b (x) / log b (a)
が成り立つ。
ので、log(x)/log(n) か log10(x)/log10(n) でOK。
log_a(x) = log_b(x) / log_b(a)
412 :
デフォルトの名無しさん :2007/02/22(木) 02:52:08
フォルダ以下のテキストファイルを読み込み、 「何行目:単語」という形のプログラムを 作ろうとしたのですが、巧く動きません。 hoge.txtに保存してある aaaa bbbb cccc . . . afff を読み込んで 001: aaaa 002: bbbb 003: cccc としたいです。 ですが行数の表示を整えることができないようで 1: aaaa 2: bbbb 3: cccc となってしまいます。
413 :
デフォルトの名無しさん :2007/02/22(木) 02:52:52
class ShowLine def initialize(line, number) @line = line @number = number end def show @line.chomp! case @number when /^\d$/ #1桁のときは"00"を加える print "00#{@number}: #{@line}\n\n" when /^\d{2}$/ #2桁のときは"0"を加える print "0#{@number}: #{@line}\n\n" else #3桁以上のときはそのまま print "#{@number}: #{@line}\n" end end end textfile = Dir.glob("**/*.txt") #フォルダ以下のテキストファイルを探し出す num = 1 #通し番号 textfile.each { |txt| print "<#{txt}>\n" infile = open("#{txt}").each { |line| number = num line = ShowLine.new(line, number) line.show num += 1 } } ご教示御願いします。
なんかツッコミどころ満載だが、 printf "%03d: %s\n", @number, @line でいいかい?
puts '%03d: %s' % [ 行番号, 内容 ] とか printf "%03d: %s¥n", 行番号, 内容 とか 何行あるかわからないなら何桁必要になるか分からないからもう 一工夫必要になるのだけど、大丈夫?
動詞から始まるクラスを作るのはクラスを理解していないときにありがち。
417 :
デフォルトの名無しさん :2007/02/22(木) 03:02:45
>>414 ありがとうございました。
printfを使えばすんなり行くことを忘れていました。
よろしければ、ツッコミを御願いします。
>>415 想定していたのは100,000行が上限ぐらいの
テキストデータでした。
行数って結局最後まで一度は読まないとわからんというのが問題よな。 一度読んで行数を知り、rewindして改めて出力するか、最初に読んだとき に全部配列に入れておく。行数が0でないなら、桁数は Math.log10(行数).to_i + 1 で求められる。(0だとlog10の定義域エラーになる)
というか、何回10で割れるかで求められるし、 上限わかってるんだからifで分岐処理してもいいわな。
420 :
デフォルトの名無しさん :2007/02/22(木) 03:12:46
>>418 なるほど、勉強になりました。
ありがとうございます。
行長がほぼ固定なら楽なんだけどね
>>405 > Dir.glob(File.join(folder, "**/*.rb")).sort.inject({}).each do |plugins,file|
inject({}) と each の間の . を消せ。
>>409 argv[0]は呼び出し側のプログラムで好きなように指定できる。
たとえば、loginは先頭に"-"をつけて渡す。
多くのshではそれを見てログインシェルとして動作する。
また、コマンド名を渡してくる場合でもフルパスかどうかはわからない。
>>422 .だけじゃなく、.eachをけすんじゃね?
425 :
351 :2007/02/22(木) 06:22:22
>>391 ブラウザにキャッシュさせないようにしてもダメでした。
>>369 >>370 レコードUPDATE後、すぐにSELECTして表示するスクリプトを作成して、
本当にUPDATEに成功しているのか確認したところ、失敗しているときがありました。
でも1分くらい?待っていれば、アップデート後のレコードが表示されるようになります。
とても奇妙。
で結果的に、一行毎にクエリを実行すると、古いレコードは表示されなくなりました。
my.query( <<-EOD
start transaction;
update hoge_table set hoge=hoge where hoge=hoge;
commit;
EOD
)
↑これではダメで
my.query("start transaction;")
my.query("update hoge_table set hoge=hoge where hoge=hoge;")
my.query("commit;")
↑こうすると問題なく表示されるようになりました。
ちょっと納得できないのですが、こういうモンと自分に言い聞かせることにします。
ありがとうございました。
>>425 こうなるともうMySQLの問題だね。そっちのスレで聞いてみれば詳しいこと分かるかも。
RubyのMySQLドライバの問題だろ
正規表現ムズイ プログラム自体初心者のおれにはデラキツイ
>>428 メタ文字は.[](|){}*だけ覚えればいい。他はこれらで実現できることを短く表記するためのものだ(例外あり、ただし使う機会はかなり少ない)。
それに加えて最左最長マッチの原則さえ覚えていれば大体事足りるはずだ。
正規表現はもう一つの別の言語だととらえておいた方がいいよ。
比喩ではなく実際にその通りなんだし。
正規表現は、場数を踏めば誰でも使いこなせるようになると思う。
今作りたいものは ラグナロクオンラインのBOT メールソフト(outlook expressがゴミなので) 2ちゃんビューア ですがよく考えたらwindowsプログラミングって超むずいんじゃないかっていう
Windows環境でのRubyは不遇なので要らぬ苦労をするぞ。
そうなんですか;; じゃあみなさんは何の為にRubyしてるんですか? 計算速度は遅いし・・・もしやLINUXユーザですか!?
WindowsはゲームとMS Officeにしか使ってないな。
>>406 おおっ、わかりやすい!
ありがとうございます。
でもPraggerは動きませんでした…。 orz
injectの直前まではちゃんとディレクトリの一覧が
配列で渡されてますが、injectでやっぱりエラーになってしまいます
bの出所もやっぱりさっぱりわかりません。
ひょっとして1.8.4では動かないんでしょうかこれ
>>435 今見たらすでに直っている。
とりあえずsvn upしろ。
正規表現は .+? の動きを覚えたらたいていのことはできると思う… 小難しいのはRuby自体の制御構造だの一時的変数だのでフォローだ data=text.scan(/超複雑な正規表現/) #=> data=[ ['a','b,','c'],['d','e','f'] ...] は tmp = text.scan(/大雑把なでかい塊に区切る正規表現/) tmp.each do |part| data.push part.scan(/塊を配列に崩す正規表現/).flatten end で対応だ メモリはたくさん積んでくれ
俺はエディタのキーワード登録で正規表現覚えたなー あとはgrepとsedか 覚えちゃえば便利だよー …今はpack/unpackに苦戦中
pack/unpackは俺も苦戦したけど Cのunionみたいなもんって気づいたらあとは楽だった。
> pack/unpack 概念自体は超簡単だな。 任意の大きさにカステラ切り分けたり、切ったカステラ並べるとこでも想像すればいいのでは。
>>432 趣味で使うんなら大したことないんじゃない?
Windows専用のHSPの方がよっぽど苦労すると思う。
>433
自分はWindowsユーザだけど、よっぽどOS依存の機能
使いたい場合でなければ、お気楽に使えるオブジェクト
指向のスクリプト言語ってかなり楽しい。
perl++
少しだけ正規表現分かってきた。 しかしどうすれば四角いウィンドウが出てきてボタンを押すと動いたりするアプリが作れるのかわからない。
ここ10年くらいはプログラムっつーとウィンドウが出て云々が 当たり前になっちゃってるから、そこに至るためには助走が必 要だってのを知らずに始めるとゴールの遠さが堪えそうだな。
emacs の fill-paragraph のように、日本語と英語が混ざっているような文章
でも指定したカラム幅に抑えるよう整形してくれるようなライブラリありませ
んか?
# $KCODE='UTF8' require 'nkf' folded = NKF.nkf("-f#{columns} -W -m0", original) columnsは桁数。 -Wのとこは出力コードをUTF8に。 -m0はMIMEデコードを抑止。 Unicodeでない場合は$KCODEの値を変え、-Wを他のフラグに。
448 :
446 :2007/02/23(金) 18:25:51
大変ありがとうございます!! ちょっと感動しました。 死んだばあちゃんも天国で喜んでいると思います。
>>437 一般的には
前者はメモリ使用量少ないが遅い
後者は遅くないがメモリたくさん使う
という認識でいいか
450 :
デフォルトの名無しさん :2007/02/23(金) 21:28:24
>>444 Tk無いなら Tcl/tk 環境入れて
RubyTk 使えば良いんじゃね?
>>451 tkとかよく分からない。
tkで思いつくのは小室哲哉くらい
453 :
デフォルトの名無しさん :2007/02/23(金) 21:51:29
>>450 1.本質的にナニをナニに変換する処理をしてるスクリプトなのかよく考える
2.wordsには何が入ってるのかよく考える
3.ここでのソートが何をしてるのかを考える
wordsをファイルに書き出してみるとなんとなくわかるかも
素直にsort_by使えって書けよw
456 :
デフォルトの名無しさん :2007/02/23(金) 22:30:41
>>453 よくわからないんですけど、rubyでプログラム書いて人に配布する時は
どうやって配布するんですか?C++ならコンパイルして渡すんでしょうけど
インタプリタの場合どうすればいいのか・・・
試しにどなたか自作のテキストエディタを配布してくれませんか?
超単純なのでいいので。
あ、テキストエディタは難しいので時計でいいです。 時間を取得して表示する時計をwindowsのアプリ的なカンジで作ってください。 あ、windowsAPIってなんだ?w
お前にRubyは向いてない
exerb辺り使えばそこそこ行けるんじゃね
>>458 配布してやるよ
ruby -e "p Time.now"
え? ようするにソースのまま配布するのがインタプリタ型の配布の仕方と考えてよろしいんですね?
だからexerbってヒントが出てるんだからぐぐってみればいいじゃんよ
466 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 09:21:01
>>464 おおおおおおおおおおおおおおおおおおおおおおおおおおおおおお
これぞプログラミングwwwwwwwwwwwwwwwww
めっちゃ感動しました
ようするにRuby入ってる人なら.rbで起動出来るってことでつか?
467 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 09:22:25
でも理解出来ないw
468 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 09:27:12
やべええ感動が止まらないwwwwwww これがプログラミングwwwwwwww 感動したよ、おっさん!!!!!!!
469 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 09:32:28
いろいろいじったらなんとなく理解出来た。 VRすっげwww
>>466 .exe単体で起動するよ。
.rbはFormDesignerの吐いたソースほぼそのままを付けておいただけ。
471 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 10:19:26
FormDesigner!!!!!!!!!! 何それwwwwwwwwwwwww すげえかこよすwwwwwww ぐぐろw
うざい
コテつきは馬鹿ばかりだからな
475 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 10:30:07
京大生だぞおおおおおおおおおおおおおおおおおwwwwwwwwwwwwww rubyやべえwwwwwwwwwwwwwwwwwwwwwww
ちんこ自重しろ
あぼーん指定しる
他の人もいる場でこのスレ開けないorz
include Math def max return 100000 end t1 = Time.new prime = [2] array = Array.new(max) {|i| i+1} array.shift sqt = sqrt(max).floor while prime.last<=sqt array.delete_if {|i| i%prime.last == 0 } prime << array.shift end prime << array prime.flatten! #p prime t2 = Time.new p t2-t1 これをNarrayを使ってさらに高速にしたいのですが、出来ますか? 1秒の壁を超えたいw
t1 = Time.new MAX=100000 primes = [] table = Array.new(MAX+1).fill(true, 2) mid = Math.sqrt(MAX).floor 2.upto(mid) do |i| if table[i] primes << i (i+i).step(MAX, i) { |j| table[j] = false if table[j] } end end (mid+1).upto(MAX) do |i| primes << i if table[i] end #p primes.length t2 = Time.new p t2-t1
482 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 18:16:58
悔しいけど認めざるを得ないw でも理解出来ないから説明おねw 10^6で5秒切ることが夢だったのにふつうに5秒切られて焦るw
483 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 18:18:30
おれのも結構早いと思うのにおれより6倍近くはええ まさか・・・ね、しかも配列見てもあってる、インチキじゃない エラトステネスよええwwwwwwww
484 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 18:21:17
しかも数が多くなるほど差が開く。 エラトステネスこそ、数が増えるほど早くなるんじゃないのか なんでだ・・・情報学科じゃないから分からないw
485 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 18:24:44
分からないじゃなくてちょっと考えてみようかな。 考えればおれに分からんことなどないのだからw しかしふつうのrubyでアルゴリズムだけで抜かれたとなると、ますます情報系に対する憧れが強くなってしまう。 情報系にいったら就職はないと分かっているのに、何をいまさら迷っているんだおれ・・・ あぁ彼女欲しい
理解した。割るよりtrueとfalseを判定した方が早いってことか。 なかなかやるな・・・その発想はなかった。
488 :
ちんこ ◆HEfxsk5e3k :2007/02/24(土) 18:35:58
な、なにーーーーーーーーーーー!!!!!!!!!!!!!!!!!111111111 \(^o^)/ あとで全部読むか、こいつは面白いことになってきたぜ。 めざせ10^7で5秒
489 :
デフォルトの名無しさん :2007/02/24(土) 20:17:31
gem updateしたら2日とか応答帰ってこないって普通? たしかにCeleron 600Mhzで64MBの非力マシンなんだけど・・・ なんかまちがってんのかな。 debianで、apt-get updateとかはそれなりに我慢できるスピードなんだけど。
DBとか使わないで何も考えずにオンメモリで処理しようとすると メモリ不足で結構きついんじゃないか?
mkexyでexerbのレシピファイルを作るとき、gemをrequireしていると 当座の目的には必要でないライブラリまで取り込まれるようなんですが、 不要なファイルを簡単に判別する方法ってありますか?
>>491 rubygemsをrequireするだけのスクリプトをmkexyしてやれば
不要なファイルがレシピに書き出されるんじゃない?
教えてください。 モジュールを二つインクルードするとして、それぞれのモジュールでインスタンスを 初期化する必要があるためinitializeを定義しているのですが、インクルードした 側のクラスのinitializeで両方のモジュールのinitializeを呼び出すことはできるの でしょうか。 ふつうにsuperを呼ぶと、後からインクルードした方しか呼べないのですが。 irb(main):001:0> module A irb(main):002:1> def initialize irb(main):003:2> puts "A" irb(main):004:2> end irb(main):005:1> end => nil irb(main):006:0> module B irb(main):007:1> def initialize irb(main):008:2> puts "B" irb(main):009:2> end irb(main):010:1> end => nil irb(main):011:0> class C irb(main):012:1> def initialize irb(main):013:2> super irb(main):014:2> puts "C" irb(main):015:2> end irb(main):016:1> end => nil irb(main):017:0> c = C.new B C => #<C:0x29c9828>
>>493 AとBで、initialize()の名前を変えるのはどうだろう。
module A
def init_A
puts "A"
end
alias initialize init_A
end
module B
def init_B
puts "B"
end
alias initialize init_B
end
class C
include A
include B
def initialize
init_A
init_B
puts "C"
end
end
495 :
493 :2007/02/25(日) 22:35:50
>>494 そのモジュール専用の初期化メソッドを名前を変えて定義するということですね。
C++だとA::initialize、B::initialize、みたいに同名のメソッドでもクラス指定で
呼び分けることができたのですが、Rubyではできないのですね。
ありがとうございました。
Rubyのモジュール・クラスは開いているから、 module A,Bが直接手が出せないファイルでも、 自分のclass Cのソースの中で module A...;end module B...;end すればいいね。
AもBもinitializeでsuper呼べばいいんじゃないの? そうすればCで両方インクルードして、両方とも呼ばれるでしょ。
これ多重継承じゃね?
>498 mix-in 。 簡単に言えば多重継承の代わりにある機能だわな 多重継承ほどの自由度はないよ。
>>447 $KCODE の値は何のために変える必要があるの?
>>501 変換対象の文字列が生でソースコードに出てくるなら必要だけど、
そうでなければいらないんじゃない?
なるほど。そういう話ね。
先生!throw〜catchとraise〜rescueの使い分けがわかりません。
>>505 なるほど。
しかし末尾のendが増えるな。
結局、どっちが大域脱出で、どっちが例外処理なん?
ややこしい仕様だのう。 他の言語はthrow、catchは大域脱出の手段で使うことは推奨してないのでは?
キーワードが違うだけですから。まずは入門書でも読んでみなされ
>>509 そもそも他の言語のthrow&catchとは違って、投げるのは例外ではないし、
例外処理ではない。単なるラベル付きbreaak。
ラベル付きbreakでなく、throw、catchにした利点は何?
しらんけど、いまのcatch〜throwの構文だとラベル付きbreakと違って 文法追加しないで済むのかも。 call/ccでライブラリレベルの実装も出来そうな気がする。
rubyのブロックとイテレータ、配列、制御構造、正規表現、クラスあたりまで勉強してます 研究室の輪講で、上記を使った問題を披露する必要があるのですが、何か面白い問題あるでしょうか? 無難に、文字カウントとか考えていたのですが、あまりにもひねりが無いと怖い先輩に馬鹿にされそうです よろしくおねがいいたします ついでに、質問ですが、イテレータが役に立つ場面って具体的にどんなところですかね Java C verilogプログラマの自分にはいまいち、応用例がでてこないです 役に立ちそうだとは思うのですが、パッと出てこないでふ
例えば順列を生成して1つずつ処理したい時に使うとか。
516 :
514 :2007/02/26(月) 22:30:26
>>515 関数じゃだめなのでしょうか?
それとも、1個1個に対して異なるブロックを指定して処理内容を変えるってことですか?
なんか、トンチンカンなこと言っていたらすみません
Cで関数ポインタを使うようなケースはブロック付きメソッド(イテレータ)の出番。 それだけじゃないけど。
518 :
514 :2007/02/26(月) 22:37:23
>>517 関数ポインタか
ほとんど使ったことないです
コマンドラインから文字読み取って処理を切り替えるときに使った記憶がわずかに
でも、確かにそれをコードブロックでかければ、関数ポインタで処理するよりずっとわかりやすそうですね
if $stdin.getc == "\n" p "tinko" end どうしてだろ?
Javaのイベントリスナでメソッドが1つしかないようなのもRubyだと ブロックとして渡したりする。 あとは、「リソースを得て、それを使って、リソースを解放する」という パターンの場合、 def syori resourceを得る。 begin yield(resource) ensure resourceを解放 end end でsyori { |resource| ... } のように使ったり。IO::openなんかがそうだな。
>>519 getcはStringではなくFixnum(文字コード)を返すから、?¥n と比較。
522 :
ちんこ ◆HEfxsk5e3k :2007/02/26(月) 22:57:15
>>521 そうしてもpが発動しないのですが・・・
523 :
514 :2007/02/26(月) 22:59:16
>>520 ふむふむ、少し理解できてきました
仮にイテレータの無い言語で記述すると、処理の数だけ別な関数を生成する必要が発生しますね
それに大して、イテレータを使えば、そのつど必要な処理をかけるという解釈でOKですかね
分かったwwwwwwwwwww 数字を出すっていってるのにまだ""つけてたwwwwww そりゃ比較できねーってwwwwwwwおれバカスwwwwwwwww
sryoriの中身は begin resourceを得る。 yield(resource) ensure resourceを解放 if resource end だた。
526 :
514 :2007/02/26(月) 23:45:25
>>525 >resourceを解放 if resource
rubyっぽくていいですね
つい
if resource != nil
resourceを開放
end
とか書いちゃいそうです
ところで、
>>514 に書いた問題で適切なもの思い浮かぶかたいませんかね
できれば、イテレータとハッシュか配列は絡ませたいものです
nilとfalseはきちんと使い分けとかないと、値としてのfalseが扱えないみたいな あほなプログラムが出来る。
すみません test = Test.new("test") class Test def initialize(name) @name = name end end と記述したところuninitialized constant Test (NameError)とか出るのですが、なんなんでしょこれ? 意味が良くわかりません 最初のclassでつまずくとは、先が思いやられる、、、
class Test def initialize(name) @name = name end end test = Test.new("test")
class〜endも実行文。頭から実行される。
文つーか、式な。
classは複数回定義可能ね。 class Test def foo end end class Test def bar end end 別ファイルにわけてrequireしてもいい。 ただし、継承でハマると思うので最初の定義だけは厳密に最初に実行するように。
レスさんくす 納得しました 基本的に上から順番に実行されていくわけですね
>>526 既存のやつの使い道じゃなくて、
ブロック付きメソッドの定義例が欲しいってことかねぇ。
words = Array.new io = File.open("1.txt", "r") io.each{|line| line.scan(/^(.+)\s(.+)$/){|eng, jap| words << [eng, jap] } } io.close # print words[1][1] # p count a = rand(words.length) print words[a][0] if $stdin.getc == ?v print words[a][1] end 英検1級の為に単語帳を製作しています。 最初に$stdin,getcが発動してしまうのはなぜでしょうか?
536 :
514 :2007/02/27(火) 08:54:55
>>534 えっと、最初に書いたのですが、研究室での輪講用の問題を作成しなくてはならないのです で、ブロックとイテレータ、配列、制御構造、正規表現、クラスあたりまでが私の担当なので、それらを使用した面白い問題を作っていかなければならないのです そこで、皆さんのお知恵を拝借させていただきたく思い、書き込みさせていただきました
それについてはレスがそもそもないからな 後者の疑問に対してのレスが今までだらだら続いてる感じだ 面白くない問題なら作れるだろうしそれでお茶濁せ 仮に面白い問題思いついたって2chには書かん(w
簡単なゲーム作るのが王道ではあるんだけどね あるいは研究室の研究を絡めた身近な処理を書くとか 輪講で話すってことはRubyを普段使いして欲しいんだろ?
539 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 10:20:56
あの、おりの質問に答えてもらえないでしょうか。 PCの前でハルヒ見ながら待ってるのですが;;
>>539 朝っぱらからハルヒなんぞ見てないで改行してから出直せ。
>>538 > 研究室の研究を絡めた身近な処理を書く
に一票
「で、だから何なんだ?」という感想を抱かれるより100倍マシ
542 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 13:29:26
>>540 助けてくだしあ
みくるちゃん(;゚∀゚)=3ハァハァ
543 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 13:32:01
a = rand(words.length) print words[a][0] if $stdin.getc == "?\n" print words[a][1] end でも無理です。 おかしい・・・何かがおかしい
544 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 13:37:31
ここは初心者を助けるスレじゃないのかよ。 助けてくれよ、全然分からないんだ・・・どうすりゃいいんだよおれ・・・
まず、 A:本来どう動くべきものなのか B:実際にはどうなるのか を書け。
546 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:04:39
Arrayクラスwordsに単語(英語、日本語)を突っ込みます A まず英語を出します 次に$stdinからとりあえず改行でもなんでも押すと 日本語をだします B 最初に$stdin.getcが発動します 改行を押すと 英語が出ます、日本語はでません Bの方は作動してもらえれば分かると思います。 words = Array.new io = File.open("1.txt", "r") io.each{|line| line.scan(/^(.+)\s(.+)$/){|eng, jap| words << [eng, jap] } } io.close #print words[1][1] a = rand(words.length) print words[a][0] if STDIN.getc == "?\n" print words[a][1] end
面白い例題といわれてもなあ。こんなのはどう?Hashのような感じでインスタンス変数にアクセスできるようにする。 module Hashable def [](key) self.instance_variable_get("@#{key}") end def []=(key, val) self.instance_variable_set("@#{key}", val) end def each self.instance_variables.each do |varname| key = varname[1..-1] # '@foo' => 'foo' val = self[key] yield(key, val) end end end
使い方 class Foo include Hashable def initialize(x, y) @x = x @y = y end end foo = Foo.new(10, 20) foo[:x] #=> 10 foo[:y] #=> 20 foo[:x] = 30 foo[:x] #=> 30 foo.each { |k, v| puts "#{k}=#{v}" } #=> "y=30", "x=20"
549 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:06:57
本当は 英語出る →やべわかんね→「→」押す→右に日本語でる→改行押す→次の英語でる →知ってるw→改行押す→次の単語へ がいいんだけど、とりあえずテストしてるので
英語のほうが改行ないのに表示されるのは、 STDIN.getcを使ったタイミングでflushされてるのかな。
552 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:19:51
>>550 え?何言ってるんですか?
putsにしたところで変わるわけないじゃないですか・・・
1)入力後に英語がでてくる
2)日本語が出てこない
んだから・・・
態度悪いから相手するの止めるわ。
554 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:22:38
あの、実際に実行してもらえますか? 改行とか何が関係あるのか分からない。 文字が出ないと言ってるのにどう改行が関係するのか。 それか、正しく動くプログラムを示しから話してください。 あなたには分かるかも知れないが、おれに分からない。 だから聞いてるんだ、なのにさらに惑わすようなことを言って愉快犯も甚だしいっすよ タメ口サーセンwwwwwwwwwwwwwwwwwww
555 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:24:27
a = rand(words.length) print words[a][0]+"\n" if STDIN.getc == "?\n" print words[a][1] end あなた方がいうようにこうしたところで何も変わらない。 妄想で話すのはやめて欲しい。
うちでは最初に英単語が出てきて、キーを押すとプロンプトだけが出る。 これは使ってるzshが最後の改行なし出力をくってしまうためなので、 改行をつければちゃんと出る。 あなたの環境は何なのか? というか p wordsするとちゃんと出るのか。 うちじゃ読み込み部分自体がまともに動かなかったので、 words = [ [ 'hello', 'こんにちは'] ] とわざわざ作って試してるんだが。
む、また "?¥n" にしてるのかよお前。
558 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:33:45
p words => [["apple", "\202\350\202\361\202\262"], ["elephant", "\202\274\202\244"], ["touch", "\220G\202\351"], ["love", "\210\244"], ["lip", "\220O"]] 日本語なのでpではうまく表示されないけど。 ちゃんと print words[1][1]とかやると表示されます。 環境はruby1.8.5 a = rand(words.length) print words[a][0]+"\n" if STDIN.getc == "?\n" print words[a][1] + "\n" end こうしても入力要求の前に英語が出ることはありません。
559 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:35:02
>>557 なる。""は外してみたが
やはりしょっぱなにgetcが発動するのは変わりない
560 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:36:07
が、改行を押したらきちんと日本語が表示されるようにはなった。 しかしやはり英語が先に出ない。 順番がこんがらがってるとプログラムが書けない。 ここさえパスすれば英検1級がとれるんだ
561 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:37:33
あれ!!!!!!!!!!!!!! ちょwwwwwwww 今までRDEのコンソール使ってたけど プロンプトで起動させたらちゃんと出来たwwwwwwwww WHY???????????????????????WWWWWWWWWWWWWWWWWWWWWWWW
バッファリングのOSによる挙動差かね。 getcする前にSTDOUT.flushしてみてはどうか。
563 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:39:59
a = rand(words.length) print words[a][0] if STDIN.getc == ?\n print "=>" + words[a][1] end しかし lip→改行押す lip =>唇 になってしまう。無駄に改行w おれの望みは「lip => 唇」 what a hell is going on?
564 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:42:43
>>562 ブラボー!!!!!!!!!!
そしたらRDEでも出来たw
なぜ?
教えてガリレオ
文字出力は、効率化のために、ある程度ため込んでからまとめて行う ようになっている(=出力バッファリング) 環境によっては、ため込んだ量にかかわらず、改行文字の出力を指示されたら 問答無用で出力するようなのもあるが、そうでない環境もある。 flushは、ため込んだ量にかかわらず強制的に出力を行わせる。
566 :
ちんこ ◆HEfxsk5e3k :2007/02/27(火) 14:58:57
>>565 おれはめんどうな環境なのかな。
そうそう、これにこりてコマンドプロンプトで使えるようにパス通しておきましたよ。
あとデフォの作業フォルダも変えてF1で呼び出せるように
快適ーwRDEとかカス?w
馬鹿に構うからスレが荒れる
ここは初心者が質問したりわかる人がそれに答えたりするスレです。 基地外を飼って遊ぶところではありません。
Vista で Ruby の動作は問題ないでしょうか? 検証したHPなどを紹介して頂けると有り難いです
はじめてバカって呼ばれた。 女の子に「バカ・・・・」って言われたことはあるけどwwwwwwwwwww
571 :
514 :2007/02/27(火) 21:02:23
>>all
レスありがとうございます
>>537 つか、何にも問題が思いつきません
>>538 輪講1~2時間の間に説明と問題演習をやるので、ゲームを作るのは時間がないかと
それとも、rubyで簡単に作られるゲームなにかありますか?
>>541 研究と絡めたいのですが、研究を理解できているのは、博士と教授のみなのです
それ以外の人間はコード1万行書いたら学部卒業、5万行書いたら院卒業ってノリの研究室です
>>547-548 ありがとうございます
しかし、ruby勉強中なのでいまいち理解できません
勉強させていただきます
あれー、難しかった?どこらへん?
どうして 英語 => 日本語 にならないか教えて欲しいです。 おれが学ぶ為に多大な額の税金が使われていることを知り、何か社会の為に出来ないかと考えたのです。 日本人は英語が出来ません、自身が英検1級をとる為に、そして学生が単語を学ぶ為に 役立つソフトを作りたいのです。 お願いです、教えてください。 とりあえずコンソール版を作り終えたら、次はふつうのGUIアプリで作るつもりです。
>573 日本語プログラミングスレへどうぞ。
>>573 タイプした改行文字がローカルエコー(画面にも表示)されちゃうから。
英語 =>
日本語
になってしまう。
押したキーをプログラムに通知するだけで表示しないというモードがあれば
いいのだが(実際ある)、そう設定するのはピュアRubyコードだけでは難しい。
readlineライブラリやtermios拡張モジュールにそういう機能があるかもしれ
ないが、いずれにせよ環境依存。
UNIX系(linuxやmacosx)だと組み込みの IO#ioctl で制御できるかもしれな いけど、Windowsで使えるかは知らない。
なるほど。 では違う仕様を考えます。 ソフトを作る事を考えるといろいろ勉強になりますね。 知ってたようで知らないことが多すぎます。 作ってるうちにいろいろ機能を実装したくなりますし。 ところでソフトはクラスを使って作るのがデフォですか? ファイルはどうやって分けるのがいいですかね? ひとつのファイルに書くと長くなっちゃう場合とか。 あとでいろいろ追加実装するにはクラスを使った方が便利ですか? っていってもクラスを使ったらどう便利になるのかサパーリなわけですが。
578 :
ちんこ ◆HEfxsk5e3k :2007/02/28(水) 10:06:50
Visual Ruby Form Designer Ruby on Rails これらの違いはなんですか?
Visual RubyじゃなくてVisualuRuby RubyでVisual Basicっぽく楽にGUIを書けることをめざすもの。 Form Designer Visualu Rubyで使うフォームを作成するツールらしい。 Ruby on Rails RubyでWebアプリケーションを書くための枠組みの一つ。
580 :
ちんこ ◆HEfxsk5e3k :2007/02/28(水) 13:20:21
Ruby on Railってwebアプリ専用なのか。 じゃあおれが使うべきはForm DesignerとVisualuRubyだな。 この"u"は何のこだわり? Visual Studioとの違いを見せようと思って? というかVisual Studioってなんだっけ。なんかC++用のソフトだっけか。 Ruby>>>>>>>>>C++ だよねw ところでみなさんどんなエディタを使っていますか? 秀丸?terapad? それとも統合環境? terapad&コマンドプロンプトか RDE かで迷ってます。プロンプトをF1で呼べるようにしてそのままでROすると バッシュやろうとした瞬間にプロンプトが開いてうけるwwwww 道のりはなげえなぁ、なんかパソコン調子悪くて死にそうだし。
581 :
ちんこ ◆HEfxsk5e3k :2007/02/28(水) 13:21:12
うはwwww Visual Basicだった、これをVisual Studioの違いもわからねえwwww DQNですよね、すまそ
582 :
514 :2007/02/28(水) 22:22:59
ぐふ、何も問題が思いつきません とりあえず、1問は正規表現でなにかやって、強引にお茶を濁すつもりです それ以外に、クラスとかコードブロックとか使用した問題を作りたいが、わけわかめ
583 :
デフォルトの名無しさん :2007/02/28(水) 23:29:36
class Test def value(value) @value = value end end test = Test.new() test.value(10)#ここが、ダメらしい これ、何がおかしいのでしょうか?
584 :
デフォルトの名無しさん :2007/02/28(水) 23:33:06
すみません、自己解決しました 正確にはソースは class Test def value(value) @value = value end attr_reader :value end でした、関数名がかぶっているのが良くなかったとの解釈でOKでつか?
実行するとエラーが出るでしょ。 in `value': wrong number of arguments (1 for 0) (ArgumentError) 「引数の数の誤り、0個のはずなのに1個渡されている」という意味。 つまり、valueというメソッドは引数がないものであるとRubyには認識され ている。def value(value)〜endで定義したほうのメソッドが、 attr_readerで定義される引数なしのvalueメソッドによって上書きされている わけだな。 def valueの定義は取り除いて、 attr_accessor :value したほうがいいと思う。
>>585 レスさんくす
実行時エラーの画面もその通りです
もともとは、attr_readerとattr_writerを定義していました
これは、うまくいきました
しかし、
def value(value)
@value = value
end
にすると関数名が重なるためか、うまくいきません
javaだと大丈夫なのに、、、
値を入れるときにエラーチェックなりなんだかの処理を入れたりすることが可能か確認するため上記の関数を作りました。
けっか、うまくいかなかったのですが、それだと、attr_writerとattr_readerも関数名が被っている気がするのですが、気のせいでしょうか
Javaは言語仕様でメソッドのオーバーライドが認められている。 Rubyにはメソッドオーバーライドはない。 defもattr_xxxも実行時に上から順に評価される式だから、 後から書いたやつで定義されるものが勝って残るだけ。
attr_readerはvalue、attr_writerはvalue=を定義する。
pstoreとかnet/httpとかのブロックの書き方を覚えてない オンラインマニュアルからのコピペだ ↓この部分が覚えにくい なんとかかんとか { |db| 〜 }
590 :
デフォルトの名無しさん :2007/03/01(木) 14:19:33
web上から画像(jpgとかgifとか)とってきてローカルにキャッシュするのってどうすればいいの? Net::HTTPでresponse bodyをそのままprintでファイルに書き込んでみたけど 画像のサイズだけあってて画像はぐちゃぐちゃな感じになった
>>590 サイズは 1バイトの差も無くぴったり合ってる?
gzip 圧縮がかかってるとか、
Windows で print するときにバイナリモードになってなかったとかはありそうだけど、
サイズが合ってるとしたら違うよなあ。
592 :
590 :2007/03/01(木) 15:08:57
>>591 それでした。
バイナリモードにしわすれてて、3バイトぐらいずれてました。
(画像のサイズが合ってると言ったのは、ピクセルサイズのことです。)
無事に保存できました。
ありがとうございました。
>>589 そーゆークラスがあるな、ということはともかく、
APIの細かいとこは覚えてない。
必要なときに
ri PStore
ri Net::HTTP
のようにしている。
>>589 { と } で囲むとブロックになるお
かんたんだお
コマンドラインでパスワードを入力させるときにエコーバックさせないようにしたいんですが、どうしたらいいですか。
また端末制御か…
だから Kernel::getpass() を標準にしるとあれほど。
io/consoleてのにそんなのがあったはず。
>>595 短い答え
ぐぐれ
長い答え
highline でも使っとけ。
irb(main):001:0> require "rubygems"
=> true
irb(main):002:0> require "highline"
=> true
irb(main):003:0> hl = HighLine.new
=> #<HighLine:0x30a5ea8 @answer=nil, @gather=nil, @wrap_at=nil, @question=nil, @
input=#<IO:0x2946bd0>, @header=nil, @key=nil, @prompt=nil, @menu=nil, @answers=n
il, @page_at=nil, @output=#<IO:0x2946bbc>>
irb(main):004:0> hl.ask("Password: "){|q| q.echo = "*" }
Password: *******
=> "himitsu"
または自分で実装しろ。
http://wiki.ruby-portal.de/CodeShellPasswortEingabe
すみませんクラスについて教えてください class Suuji def initialize(n) @i = n end def kake(n) @i = @i * n end def to_s "#{@i}" end end というクラスを作った時に, s = Suuji.new(2) s.kake(3) s.kake(3) puts s.to_s とすると2*3*3の18という出力が出るのですが, puts Suuji.new(2).kake(3).kake(3).to_s とした場合は「undefined method `kake' for 6:Fixnum (NoMethodError)」とエラーが出てしまいます. 後者の様に一行で扱うようにするにはどうしたらいいのでしょうか?
def kake(n) @i = @i * n self end
>>600 メソッドにreturnがない場合、最後に評価した式の値を持つ。
ので
>>601 のように自身を返すことでメソッドをチェーン出来る。
>>601-602 さんありがとうございました.
お恥ずかしながらこれのやり方で朝から悩んでました.
メソッドチェーンって言うんですね
def *(n) @i=@i*n self end という定義も出来たりする。
>>604 a*b と b*a みたく左右入れ替えると不自然な結果に。。。
irb(main):001:0> "a"*2 => "aa" irb(main):002:0> 2*"a" TypeError: String can't be coerced into Fixnum from (irb):2:in `*' from (irb):2 標準組み込みクラスでもうまくいってない気がする。
2*"a"はどうなっているとうまくいっていることになるの?
coerceで何でも解決できるんですか?
CGIを作ったんですが重いです。 どこの処理に時間がかかるかとかを知りたいんですが、 簡単にチェックする方法ってあります?
-rpofile
-rprofile だよ。 そういうシンプルな回答で誤字脱字があると哀しいものがあるね。
613 :
デフォルトの名無しさん :2007/03/03(土) 14:15:23
URI.encodeができません。 irb(main):001:0> require 'uri' => true irb(main):002:0> p URI::UNSAFE /[^-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/n => nil irb(main):007:0> s = "('1','2','3')" => "('1','2','3')" irb(main):008:0> p s "('1','2','3')" => nil irb(main):009:0> p URI.encode(s) "('1','2','3')" => nil こんなかんじです。 結果は%28%271%27%2C%272%27%2C%273%27%29を期待しているのですが。 rubyはruby 1.8.2 (2004-12-25) [powerpc-darwin8.0]です。
(も)も'も,も1も2も3もUNSAFEの正規表現で除外されている([^....]) エスケープする必要のない文字のようだが。 問答無用で%表記にしたいなら URI.escape(s, /./)
615 :
デフォルトの名無しさん :2007/03/03(土) 14:31:14
>>641 thanks
UNSAFEとあったのでよく見もしないで,エンコードされると思ってました。
デフォルトのままだとブラウザと違って除外されるのね。
class Unko @@ary = Array.new def Unko.ary return @@ary end def length return @@ary.length end def Unko.add(value) if length < 3 @@ary << value elsif length >= 3 @@ary.shift @@ary << value end end end u = Unko.new Unko.add(1) Unko.add(2) Unko.add(3) Unko.add(4) Unko.add(5) Unko.add(6) p Unko.ary なぜエラー?
・def length を def Unko.length にすれば解決 ・エラーメッセージをよく読め ・u = Unko.new は不要 ・length メソッドを設ける意味がわからん ・態度が気に入らない
プログラミング未経験向けのRubyプログラミング解説サイトってありますか? ざっと検索したけど、どうも無いような気がします。 無い場合は、自分でつくろうと思っています。
確かに他の言語でよくあるリファレンスに掲示板がついたようなページってないな。
621 :
ちんこ ◆HEfxsk5e3k :2007/03/03(土) 18:19:21
def Unko.add(value) if @@ary.length < 3 @@ary << value elsif Unko.ary.length >= 3 @@ary.shift @@ary << value end end これでもいけるからして、@@aryを出すためだけのクラスメソッドを作る意味が良く分からない。 外部参照用ってだけ?
622 :
ちんこ ◆HEfxsk5e3k :2007/03/03(土) 18:27:55
ようするに何がしたいかっていうと コマンドプロンプトみたいに、前の入力をいくつか覚えててくれて↑↓で呼び出せる クラスを作りたいな って話なわけで。 今、Form Designerがなんとなく分かったので GUIの勉強をするのと同時に、オブジェクト指向というものを きちんと理解しようかと なぜオブジェクト指向が優れているのか こういうクラスって作る意味ある?オブジェクト指向をするに当たって、どこからどこまでをクラスにすればよいやら分からないw
>>ち○こ class << unko = [] def add(value) return push(value) if size < 3 shift push value end end
624 :
ちんこ ◆HEfxsk5e3k :2007/03/03(土) 19:50:35
class << unko = [] の意味が分からない。 さっきシャワー浴びながら考えたけどインスタントメソッド作る意味ないかも。 全部 Unko.xxxxにした方がやりやすい。 こんなクラスのインスタンス作っても作るだけ無駄な気がしてきた。 テキストエディタ→英単語勉強ツール→某掲示板(2ちゃんではなく)ビューア の予定 FormDesignerのセーブマークやファイル開くマークの使い方がよう分からないんだけど?
マニュアル嫁
627 :
ちんこ ◆HEfxsk5e3k :2007/03/03(土) 21:49:37
>>626 d
テキストはまつもと氏の「楽しいRubyプログラミング」を読んでいます。
ホワイの方はヒマな時読んでみます
楽しいRubyはまつもと氏が書いたんじゃないよ。監修しただけ。 でも、それでおk。一番最初のまつもと本を買わなくて正解、あれは初心者向きじゃないよ(でも面白いけどね)。 class << unko = [] def add; ... ; end end ってのは特異メソッドな。 unko = [] def unko.add; ... ; end と等しい。インスタンスっての自分でデータ型を作りたいときに役立つよ。
classはどこいきました・・・?
一つしか保持しないならクラス変数とクラスメソッド使う理由もないんじゃねーのって話
631 :
ちんこ ◆HEfxsk5e3k :2007/03/04(日) 00:31:44
どうやってVisualuRuby勉強すればよいでしょう? イイ本ありますか?ネットのマニュアルは英語でよく分からないw 早急に勉強する必要があるのですが、クラスやモジュール大杉で・・・
WEBrickのBASIC認証で質問します。 /himituディレクトリにBASIC認証を設定して、 認証が成立したら/himitu/index.cgiを開こうとしています。 server.mount_proc('/himitu') {|req, res| WEBrick::HTTPAuth.basic_auth(req, res, "WEBrick's realm") {|user, pass| user == 'aaa' && pass == 'aaa' } res.set_redirect(WEBrick::HTTPStatus::MovedPermanently, req.request_uri) } 上のように書いたら、認証→リダイレクト→認証→リダイレクト(以下繰り返し) になってしまい、/himitu/index.cgiを表示できません。 良く考えたら当り前ですが、/himituディレクトリにはindex.cgi以外にもcgiを 置きたいので、リダイレクト先をreq.request_uriで指定するしかありません。 こういう場合、どういう風に書くと良いのでしょうか?
>>619 これは丁寧で良いですね。
でも、完全に初心者って人にはちょっと躓くところがあるかも。
これを参照しつつ、さらに丁寧な解説を付け加えれば、初心者向けのものができますね。
どうもありがとうございました。
635 :
610 :2007/03/04(日) 22:00:15
>>611 えーっとですね、CGIなので、コマンドラインから呼んでも
通常の動作をしないです。だから、ブラウザから呼んだ時の
動作を調査したいのですが、何か簡単な方法ないでしょうか?
えーとですね、CGIでも、コマンドラインから呼んでも通常の動作をするのです。 だからブラウザから呼んだ時の動作を調査できるのです。 echo VALUE1=hoge&VALUE2=123|ruby hoge.cgi
WEBページからスクレイプした情報を配列に入れて Amritaを使ってHTMLを生成したいのですが 配列の展開がうまくいっていません。 pp $origin_title_Array #=>["ショー☆バン 32", "天の神話 地の永遠", "こいこい7 9(完)"] pp $author_Array #=>["松島 幸太朗", "赤石 路代", "もりしげ"] boo = File.open("template_test10Beta.html",'w') tmpl = TemplateFile.new ("MyTemplate_testSimple.html") data = { :table1=>[ { :newTitle=>$origin_title_Array, :Author=>$author_Array}, ] } tmpl.prettyprint = true tmpl.expand(boo, data)
639 :
638 :2007/03/05(月) 01:38:55
テンプレート <table border="1"> <tr><th>name</th><th>author</th></tr> <tr id=table1> <td id="newTitle"><td id="Author"> </tr> </table> 実行結果HTMLのソース <table border="1"> <tr> <th>name</th> <th>author</th> </tr> <tr> <td>ショー☆バン 32</td> <td>天の神話 地の永遠</td> <td>こいこい7 9(完)</td> <td>松島 幸太朗</td> <td>赤石 路代</td> <td>もりしげ</td> </tr> </table> 横一列に展開されてしまいます。 これをAmritaのサンプルソースみたいな感じに出力するにはどうすればいいでしょうか?
>>638 列ごとにもつのではなく行単位でデータを持つようにしてみよう。
rows = {
:table1=> [
{ :title=>"apple", :author=>"foo" }.
{ :title=>"banana", :author=>"bar" }.
]
641 :
638 :2007/03/05(月) 03:12:19
>>640 何となくわかったような気がします。
試してみます。
Hpricotについて分かり易く書かれた 日本語サイトありますか?
>>642 ググレ。ぐぐったあとで聞いているなら、「ない」が答えだ。
preview を試してみたいのですが、 1.8 系の複数バージョンの共存ってどうするのがスマートでしょうか? 1.8 と 1.9 なら --program-suffix=19 とかで共存できると思いますが、 1.8 同士だとこれでは /usr/local/lib/ruby/1.8 のディレクトリが競合しそうです。
/usr/localでない所にインストールすれば良いのでは? --prefix=hoge
>644 WindowsならcoLinux入れて……というのもありかも
昔Cygwinに入っているstowで複数のバージョンを切替えたりしてたことはあったが シンボリックリンクが偽物なので変な時があった気がする。 Linuxなり*BSDなら別に問題ないかも知れぬ。 yastとかaptとかで入れちゃうから最近考えたことないな。
649 :
644 :2007/03/06(火) 09:48:19
申し送れましたが *BSD を使っております。
>>645 さんのは --prefix=/usr/local/ruby_1_8_6 とかにしておけば
飽きたら rm -rf /usr/local/ruby_1_8_6 するだけで済むので良さそうですね。
というわけでこれでいってみます。みなさん回答ありがとうございました。
650 :
ちんこ ◆HEfxsk5e3k :2007/03/06(火) 14:52:16
VisualuRuby さいこう
651 :
ちんこ ◆HEfxsk5e3k :2007/03/07(水) 11:21:37
すいません、テキストエディタのように プリントアウトの画面を出すにはどうすればいいですか? SWin::CommonDialog::setPrinter(self) はprinterを選択してくれるみたいですが、 実際に印刷はどうすればいいのか分かりません。 また、メインの印刷ボタンを押した時にまた新しいウインドウが出てくるやり方がわかりません。 教えてくだしあ^^
652 :
デフォルトの名無しさん :2007/03/07(水) 15:40:49
653 :
ちんこ ◆HEfxsk5e3k :2007/03/07(水) 15:59:55
メインウインドウからもうひとつ新しいウインドウをだすのに なぜ VRLocalScreen.start From2 じゃダメなんですか? messageloopのせいですか? frm=VRLocalScreen.newform frm.extend Form2 frm.create.show こう書いたらいけたんですけど、3行も書かないといけないのは理不尽 なのでもっと短いコマンドがあるはずなんですけど・・・・?
>>653 >>こう書いたらいけたんですけど、3行も書かないといけないのは理不尽
>>なのでもっと短いコマンドがあるはずなんですけど・・・・?
あるはずって何で分かるの?
655 :
ちんこ ◆HEfxsk5e3k :2007/03/07(水) 16:26:28
ないと理不尽だから
重い古味・・・・( ^∀^)
>>657 だって、他にはメソッドとかやたら発達してるのにこんなところで
3行もかかないと新しいウインドウ作れないようじゃ理不尽
>>658 の文章は理解できる
>>653 の文章は理解しがたい
つまり「理不尽」の意味は「ゆとり」ということである。
660 :
ちんこ ◆HEfxsk5e3k :2007/03/07(水) 19:31:38
とにかくなんでか教えろよ、分からないのかカスが
オープンソースなんだからおまえが一行で書けるようにしろよ、できないのかカスが
(frm=VRLocalScreen.newform).extend(Form2);frm.create.show
663 :
ちんこ ◆HEfxsk5e3k :2007/03/07(水) 20:50:00
VRLocalScreenってどこのクラス? メソッドで定義すりゃいいんだよな、例えば VRLocalScreen.newWindow(Form2) とかで出したいんだけどねーw
664 :
ちんこ ◆HEfxsk5e3k :2007/03/07(水) 21:26:38
ちょwwwwwwwwwwwwwwwwwwwwww やっぱりshowFormってメソッドが存在するじゃねーかwwwwww Rubyにしては理不尽だと思ったんだよな、3行も書いてちゃちっともEnjoy出来ないwwwwwwwwwwwww 結局お前ら分からなかったんだろ、カスどもめwwwwwwwwwwwwwww
自分でちょっと作ったのはForm.openで済むように改造した
666 :
デフォルトの名無しさん :2007/03/07(水) 23:41:12
Math.sqrt(3) => 1.73205080756888 となりますが、自分の好きな桁数だけsqrt(3)を得たい場合、 どうすればよいですか? お教えください。
RubyのFloatの実装はdoubleで、Math.sqrtは単なるsqrt(3m)のラッパなので、 IEEE754の倍精度以上のものにはならない。 望むだけの桁数を求めたければ自分で開平法を実装するか、 標準のBigDecimalライブラリを使用する。 require 'bigdecimal' require 'bigdecimal/math' sqrt3_100 = BigDecimal.new('3').sqrt(100) 開平にはニュートン法を使っているもよう。
669 :
ちんこ ◆HEfxsk5e3k :2007/03/08(木) 00:41:03
いい加減消えていただきたい
windowsでruby使う意味ってあるの?って実際に使っている人っているの?
いるいる。 net/http使って一定時間置きにルーターの設定変えたりとか ファイルの一括リネームとか HTMLの一括加工とか。 RUBY-MSWIN32はインストール不要でPATH通すだけで良いから USBメモリーに入れて持ち歩いてる。
>>671 ダウンローダの代わりに使ってる。
スクリプトでヘッダから何からいじり放題、HTML解析もし放題なので、
IRIAもまっつぁお。
俺は論文書くのにTeXの機能を覚えきれないので、補助的にERBで生成してる。 あと、winのエロゲからスクリプトとか画像とか抜き出したり加工するのにもRubyは大活躍でした。
Cygwin 通して Ruby 使ってる。 研究用のプログラムの計算結果を整理するのに使ってる。
676 :
ちんこ ◆HEfxsk5e3k :2007/03/08(木) 09:05:16
Ruby大活躍ですね
677 :
デフォルトの名無しさん :2007/03/08(木) 09:05:40
> Windowsで 主に小さいスクリプト物だな。 ファイルのリネームとか あとは、プロジェクトで、Makefileの代わりに、Rakefile使ってる
perl++の話はもういいから
>>677 makeに対するrakeのメリットって何ですか?
1行ごとに別シェルになるとか、TABとかの狂った仕様に悩まされなくなるかもね。
681 :
デフォルトの名無しさん :2007/03/08(木) 11:13:19
>>679 使い慣れたrubyを使える点
makeは、不自由すぎる
関数もまともに使えないし(できるけど、すげー使いにくい)
682 :
ちんこ ◆HEfxsk5e3k :2007/03/09(金) 16:40:08
メインがForm1でそこにあるtext1 そこからひらくForm2でtext1.text を操作することは出来ますか? "tinko".f @text1.textでやったらエラーが出ました。
rubyでお勧めのXMLパーサーを教えてください。 理由もお願いします。
>>683 rexml
べつに勧めたくはないが、とりあえず標準添付。
>>682 他のインスタンスの持つインスタンス変数へのアクセスはできない。
Form1で
attr_rader :text1 と書いておくと、text1というメソッドで参照できる。
attr_writer :text1 と書くと text1 = ... 書くことで代入が出来る。
あるいは、
f.instance_eval { @text1 } という技もあるが、常用するものではない。
686 :
ちんこ ◆HEfxsk5e3k :2007/03/09(金) 21:01:23
>>685 なるw
しかしVisualuRubyともお別れっぽいです。
Linuxに移行するかも知れないのでtkかgtk+というのに乗り換えねばです。
VisualuRubyで得た知識は使えると思うけど
gtk+の方がオブジェクト指向っぽいって書いてあって、やっぱそっちかなと思っています。
どうしたいいですか?
>>686 FXRubyかWXRubyを試してみるといいよ。
Windows、Linuxどちらでも動くプログラムが作れる。
688 :
ちんこ ◆HEfxsk5e3k :2007/03/09(金) 22:30:43
tkはメンテナさんが頑張ってるんだけど、どうしてもOSのUIと見た目が違いすぎるというか。 Gtk+はWindowsで使うときにどうも不安定。 wxRubyはRubygems使えば一発で入るし、おすすめ。
690 :
ちんこ ◆HEfxsk5e3k :2007/03/09(金) 22:59:03
日本で使ってる人口が少ないからかなぁ。 日本語のドキュメントは皆無だし。 ただ、安定度については「るびま」で紹介されてから大分改善されてきているね。
692 :
デフォルトの名無しさん :2007/03/09(金) 23:26:57
ふむ。 Ruby Wayとかいう、うさんくさい本を買って来た。 たのしいRubyよりはレベルが高いだろう
693 :
デフォルトの名無しさん :2007/03/10(土) 03:06:42
『Ruby Way』 p161 のハッシュから配列への抽出の頁で, ハッシュに to_a メソッドを使うと,キーと値が交互に並んだ配列が戻る って書いてあるんだけど,これはRubyのバージョンの違い?それとも間違い? 自分の環境だと配列の配列が戻るし,リファレンスマニュアルでも配列の配列になってる. 環境 ruby 1.8.4 (2005-12-24) [i386-mswin32] ruby 1.8.2 (2004-12-25) [universal-darwin8.0] こんな風に書いてある > h = {"a"=>1, "b"=>2} > p h.to_a # ["a",1,"b",2]←コレ
694 :
デフォルトの名無しさん :2007/03/10(土) 03:41:35
ふむ、wxRubyか。 覚えておこう。
697 :
ちんこ ◆HEfxsk5e3k :2007/03/10(土) 10:52:51
>>696 2002年と書いてあるから古いんだろうとは思ったがなんとなく攻略本的なその大きさと
ちょっとした専門書なみの4500円というプライスに惹かれてついつい
でもなかなか面白い。本はやはり外人が書いたものがいいですね。
日本人の書いたものは言葉の無駄が多すぎる、日本語がそういう言語だからなんですけど。
ちょうど学校のパソコンが1.67だったかなんだったかなんで、学校のパソコン室で勉強出来るっ!
家にいるとどしてもちんこをいじってしまう傾向がありまして^^;
タイトルも"Ruby Way"ですからね。
アルティメットなカンジがしました。
698 :
デフォルトの名無しさん :2007/03/10(土) 11:44:01
女性は働きたければ働いて、働きたくなきゃ働かない、辛くなったらやめていい。 そもそも女性に辛い仕事を押し付けないこと。かといって雑用やらせるのもダメ。 それで給与も昇進も平等にね。ただし残業、転勤、深夜当直させたら女性差別だよ。 間接差別禁止規定って知ってるでしょ。なんでも平等にね。髪形と服装は女性の自由だけど。 それからアファーマティブアクションと管理職30%目標もね。産休育休もね。当然給与40%保障で。 主婦と言っても、家事を強制される言われはないし、出産するかどうかは女が決めること。 でも産まれたら育児を女性に押し付けないでね。二人の子供なんだから当然でしょ。 ただし離婚したら親権は母親のものだよ。育児は女性のほうが向いてるんだし。 それから働く夫を妻が支えるなんて時代遅れの女性差別。 これからは働く妻を夫が支えなきゃ。 あ、もちろん収入は夫の方が多くて当然だけどね。妻には扶養請求権だってあるんだから。 それと夫は妻に優しくね。妻が望まないセックスは家庭内レイプだよ。 夫が妻のセックスの求めに応じないと離婚事由になるけどね。 離婚したら慰謝料とか財産分与とかまあ当然だけど。 女性はか弱いから母子手当ても生活保護も税金控除も当然だよね。足りないぐらい。 それと女性に女らしさを押し付けないでよ。 そんなの窮屈で面倒だし、いまさら男尊女卑ですかって感じ。 でも男はやっぱ男らしくないとね。 いつになったらレディーファースト覚えるの?ワリカンなんてありえないし。 少子化だって男のせいでしょ。男がだらしないから女性が結婚できないんだよ。 え?レディースデー?あれはいいの。 別に私たちが頼んだ訳じゃないし。店が勝手にやってるんでしょ。
rexmlでxmlファイルをweb上から読む場合、 どのように記述すればよいのでしょうか? どこを見ても file = File.new(...) で困っています。
open-uri
spreadsheet-excel の使用方法をご存知の方いらっしゃいますか? Excel形式でファイルを出力させたいのですが、Windows以外での動作を期待しているので Win32OLEを使いたくありません。 なにか適当なサンプルが掲載されているサイト等等、あるのかな。。。。たすけて。。
The Ruby Wayは2006年10月に2版が出てて、そのまえがきで 著者が「ver1.6.4でも十分coolだと思ったけど、(今使ってる) ver1.8.5は超coolだぜ!」みたいなこと書いてるので、2版書いた 時に使ってたのは少なくとも1.8以上なのではと推測。 で2版のHash#to_aのところがどうなってるかというと、初版日本 語版と同じだった。やはり著者の勘違い?
>>701 spreadsheet-excel の examples ディレクトリにサンプルコードが
少しあるけどこれは見た?
以下のコードの最初のp.callで、ローカル変数の場合と比較して、何故クラス変数を問題なく 参照できているのか分からないのですが、どなたか解説してください。 class A def initialize p = proc { @a[1] = 0 } @a = [1, 2, 3] p.call end end A.new p = proc { puts a[1] = 0 } a = [1, 2, 3] p.call
705 :
ちんこ ◆HEfxsk5e3k :2007/03/10(土) 18:57:01
Ruby Way難易度高すぎワロタwwwwwwwwwww
>>704 暮らす変数じゃなくてインスタンス変数のことかな。
最初のprocはインスタンスメソッドの中で定義されているから、インスタンス変数を参照できる、ぐらいしか説明できん。
2番目のほうは実行すると
undefined local variable or method `a' for main:Object (NameError)
というエラー。これは、procが定義された時点ではaというローカル変数が定義されていないから。
procの中で参照できるローカル変数は、procが定義されるまでに定義されたローカル変数のみ。
あとからaを定義しても、それはprocの動作に何の影響も与えない。
ローカル変数とインスタンス変数はスコープが違う、といえばいいのかな。
707 :
704 :2007/03/10(土) 19:58:54
>>706 > 暮らす変数じゃなくてインスタンス変数のことかな。
そうですね。間違えました。
あと、2つ目のproc{}の中のputsは消し忘れです。
Procオブジェクトは生成された時点で定義されている変数を記録していると理解して
います。initializeの中でProcオブジェクトが生成された時点では@aは定義されていないはず
なのに、どうしてローカル変数と同じようなエラーが出ないのかと言う事が疑問です。
そりゃスコープが違うからじゃないの。 インスタンス変数はそのインスタンス内でグローバル変数になるわけだから。 p = Proc.new do $a[1] = 0 end $a = [1, 2, 3] p.call puts $a
>>707 インスタンス変数とローカル変数は違うから、としか答えられないなあ。
『Procオブジェクトは生成された時点で定義されている変数を記録している』はちょっと違って、
『Procオブジェクトは生成された時点で定義されているローカル変数だけを記録している』といえばいいのかな。
あと、Procオブジェクトが生成された時点でselfも記録されるから、それ経由で@aは問題なく参照できる。
そうか、@aを直接参照しているのではなく、self経由で参照している、そしてselfはProc生成時にローカル変数と同様に保存される、と説明すればいいのか。
どう?
710 :
704 :2007/03/10(土) 22:22:09
>>709 そうか、ローカル変数とselfが記録されるんですね。その説明で納得できました。
711 :
デフォルトの名無しさん :2007/03/10(土) 22:44:49
すみません。2chのID付きのスレから指定したIDの人が書き込んだレスを抽出したいのですが プログラムを実行したところ最後のte.close行が文法エラーとして出力されます。openしてcloseしているので合ってると思ったのですがエラーが出てるので間違ってるようなのですが どの部分がおかしいのかわかりません。 # ruby program name.txt file = open(ARGV[0], "r") rescue Errno::ENOENT, Errno::EACCES print("エラー\n") exit 1 end print("出力ファイル名:") output = $stdin.gets.chomp print("ID名を入力:") id = $stdin.gets.chomp te = File.open(output,"w") chke = "0" while line = file.gets if chke == 1 if /ID:#.+\Z/ =~ line && if /\d+/ =~ line chke = "0" else te.print "#{line}\n" chke = "1" end elsif /ID:#{id}\Z/ =~ line && if /\d+/ =~ line line.chomp! te.print "#{line}\n" chke = "1" end end file.close te.close
712 :
デフォルトの名無しさん :2007/03/10(土) 22:46:48
1レスにつめたところわかりにくくなってしまったのですが、どうかよろしくお願いします。
rescueの使い方を再確認 それとブロック使ったほうがファイルの閉じ忘れが無くていい file = open(...) ... end → open(...) {|file| ... }
714 :
デフォルトの名無しさん :2007/03/10(土) 23:37:34
>>713 rescue文は、前につくって成功した別のプログラムからコピペしたやつだから
うまくいってるのかと思ってましたが、後で確認してみます。
ブロック使う方法についての確認ですが、
open(output,"w") {|file|output,"w"} になるのでしょうか?
何かoutput,"w"を2度指定するのは違和感があるのですが・・・
いや、やっぱり確認しましたがrescue文は間違いではないと思うのですが・ たびたび申し訳ない。
>>714 begin
(例外投げそうな処理)
rescue (例外の種類)
(例外が投げられたときの処理)
end
こうね。
ブロックの方は、単に
file = open(...)
(処理)
file.close
を
open(...) {|file|
(処理)
}
とするだけ。ブロックの中ではfileという変数が使えて、}が後始末をしてくれる。
717 :
716 :2007/03/10(土) 23:49:51
すまん。具体的に言うとbeginが抜けてる。
>>716 大変勉強になりました。ありがとうございます。
>>717 すみません。こちらのミスでした。申し訳ありません。
コピペして貼る際に入りきらなかったのでいろいろと改行削除してたら
beginまで削除していました。実際のプログラムでは削除してありませんが文法エラーであります。
>>714 && if => && で書ける
このロジックなら elsif => if で書ける
レスの中に他からのレスをコピペしたものがあったら、このロジックはバグル
=> dat_file を入力しないとうまくレスは抽出できない
>>719 他人のIDをコピペすると
718 :デフォルトの名無しさん :2007/03/10(土) 23:52:13
719 :デフォルトの名無しさん :2007/03/10(土) 23:55:57
>>714 のようにスペースかタブで区切られると思い
先頭がスペースかタブではなく数字ならいけると思ったのですが無理でしたか・・・
プログラムのエラーがなおれば試してみようかと思います。
>>719 すみません、今考えてたのですが
&& if => && で書ける
このロジックなら elsif => if で書ける
見慣れない文だったので手持ちの本で調べてみたのですが。
これは rescue => のことでしょうか?
>>721 if /ID:#.+\Z/ =~ line && if /\d+/ =~ line は
if /ID:#.+\Z/ =~ line && /\d+/ =~ line になるという意味。
もう少し書くと
if (/ID:#.+\Z/ =~ line && /\d+/ =~ line) と同じという意味。
自分は if のネストが嫌いなので、こういう書き方になる
rubyのifは式だから && if と書けてしまうが、ちと気持ち悪いな。
/ID:#.+\Z/ てなんだよ そもそも何を入力するのかよくわからん
725 :
デフォルトの名無しさん :2007/03/11(日) 04:47:59
あるサイトでRubyはPerl,Pythonより若干スピードが劣ると かいてあったけど実際はどうなの?同じスクリプトなんだから 体感できるほどスピード違うとですか?
726 :
デフォルトの名無しさん :2007/03/11(日) 08:24:05
2ちゃんのdatファイルなら dat_file.each do |line| name, mail, date, text, title = line.split(/<>/) day, time, id = date.split(/ /) end これで全部取れるんじゃね? 正規表現なんていらぬわガハハ
>>726 指定したIDの人のレスを抽出だから正規表現いるんじゃね?
728 :
ちんこ ◆HEfxsk5e3k :2007/03/11(日) 10:25:41
さようwwwwwwwwwwww
requireに相対パスを与えた場合、$LOADED_FEATURESには相対パスが追加 されるけど、なぜ絶対パスを追加しないのか、その背景となる理由はありますか? 青木峰郎氏のRHGにもその理由が見られませんでした。
Rails と eclipse についての質問です。 コマンドライン上からrailsプロジェクトを作成したのですが、 そのプロジェクトをeclipse上から編集したいのですがインポートすることができません。 既存プロジェクトのインポートというものはあるのですが、Railsフォルダを指定しても プロジェクト一覧に表示されないのです。 どうぞ宜しくお願い致します。
質問 「PStore(1万個くらい登録)にIDが登録されてなかったら新規にデータを登録」ということを頻繁にやります パターンその1 00001 -> { キー1=>値1, キー2=>値2, キー3=>値3, ID => 00001 } 00002 -> { キー1=>値1, キー2=>値2, キー3=>値3, ID => 00002 } 00003 -> { キー1=>値1, キー2=>値2, キー3=>値3, ID => 00003 } 00004 -> { キー1=>値1, キー2=>値2, キー3=>値3, ID => 00004 } : def has_id?(id) PStore.new(path).transaction do |db| return true if db.roots.has_key(id) } end パターンその2 IDs -> [00001, 00002, 00003, 00004, …] 00001 -> { キー1=>値1, キー2=>値2, キー3=>値3, ID => 00001 } 00002 -> { キー1=>値1, キー2=>値2, キー3=>値3, ID => 00002 } 00003 -> { キー1=>値1, キー2=>値2, キー3=>値3, ID => 00003 } 00004 -> { キー1=>値1, キー2=>値2, キー3=>値3, ID => 00004 } : def has_id?(id) PStore.new(path).transaction do |db| return true if db[IDs].include?(id) } end 後者のほうが好ましい?
rails って何で読むんですか?
裸居留守
永留守
>>734 /usr/lib/ruby/1.8/pstore.rb:
content = file.read()
@table = load(content)
def []=(name, value)
@table[name] = value
end
def roots
@table.keys
end
def root?(name)
@table.key? name
end
ということで
「pstoreファイルを全部readし巨大ハッシュを作った上で動くのでどっちもたいして変わらない」
が答かと思われ
自宅鯖以外では嫌がられそうな仕様だな 代替案とかないの
dbmとかお好きなのをどうぞ
>>711 #!ruby -Ks
raise "引数が足りん" if ARGV.size < 1
open( ARGV.shift ) do |file|
print "出力ファイル名:"
output = $stdin.gets.chomp
print "ID名を入力:"
id = Regexp.escape $stdin.gets.chomp
open(output,"w") do |te|
file.each_line do |line|
if /^.*?<>.*?<>.+ID:#{id}<>/o =~ line
te.print line
end
end
end
end
こんなんでどう?
もし自分で同じことするならワンライナーで済ますけど ruby -ne "BEGIN{ID=Regexp.escape ARGV.shift};print if /^.*?<>.*?<>.+ID:#{ID}<>/o" ID名 ログファイル名 > 出力ファイル名
おはようございます。
Ruby ではじめるプログラミング 【第 1 回】を見て、
RubyForge: Project Info- One-Click Ruby Installer のページにある
最新版をインストールしました。
しかし、こちらのページを見たところ、
Ruby の歩き方
http://jp.rubyist.net/magazine/?FirstStepRuby ActiveScriptRubyをインストールして下さいと書かれていました。
こちらもインストールしておいたほうがいいのでしょうか?
745 :
744 :2007/03/12(月) 10:00:48
すみません。公式のチュートリアルを見たら、 どちらでも良いと書かれていました。失礼しました。
>>742 それでは、
742 :デフォルトの名無しさん :2007/03/12(月) 05:53:31 の行しか抽出できないのでは?
本文行が抽出できてない?
仕様を固めないからそういう変なことになる 対象となるインプットと期待されるアウトプットは何よ
748 :
デフォルトの名無しさん :2007/03/12(月) 12:26:43
FlexでXMLファイルを渡すプログラムを書いたのですが どうやって受け取っていいのかわかりません。 ENV["QUERY_STRING"]等をつかって受け取るのでしょうか? openuriも使えそうにないしどなたかご教授いただけませんでしょうか?
flexってlexerのflexかと思ったら他にもあるのね。
750 :
デフォルトの名無しさん :2007/03/12(月) 13:20:52
すいません。 FLASHのflexです。 rubyで作成したCGIにたとえばtest.rb?lmage=test1.jpg&image=test2.jpg みたいすれば値を受け取ることはできるのですが rubyに直接XMLを渡した場合の受け取りかたをご存知ないでしょうか?
FLEXか否かを問わず、CGIで受けとるという話なら、GETならQUERY_STRING、POSTなら標準入力に入ってくるし、cgi.rb使えばその辺の際は吸収してくれる んじゃないの?
752 :
デフォルトの名無しさん :2007/03/12(月) 16:56:56
ruby でユーザからの入力を受け付けるには gets を使いますが、 改行を入れなくても、1 文字入力しただけで入力決定されるようにするには どうすればいいでしょうか? 例えば、何かの処理中に A キーを押下したらなにがしの処理をする という具合のことをやりたいと思ってます。
端末制御は環境に依存する。 curses…はやめたほうがいいか。 他には、ioctl(2)システムコール、やまださんのtermios拡張などがある。
>>741 素直にコンバートしたらネストしてたハッシュが全部文字列になったぞ責任取れバカもう嫌い
755 :
732 :2007/03/12(月) 19:00:12
757 :
デフォルトの名無しさん :2007/03/12(月) 21:41:07
750のものです。 コメントありがとうございます。 >756さん 呼んだのですが c = CGI.new; if c.multipart? print "malti"; else print "no malti"; end を実行した結果no maltiが帰ってきました。 Formで送ってるわけではないのでnameがわかりません。 post でデータを送っているので、ENV['CONTENT_LENGTH'] でのデータの取得法がわかればなんとかなると思います。
758 :
514 :2007/03/12(月) 23:11:22
お久しぶりです。 ruby輪講やってきました。 グローバル変数のスコープは?とか、rubyに本当に関数あるの?とか、本当にクラスやメソッドは事前に全部宣言しなきゃダメなの? など、突っ込まれまくりでした 練習問題として、Cやjavaにコメント抜きを出題したら、rubyの良さわかってる?と突っ込まれました 来週までに改めて問題作成を命じられました。 rubyって難しいですね
まじめにCやJavaのコメント抜き(抜き出しか削除かわからんけど)プログラム を作ると字句解析機を作らなきゃならないから、1文字ごとにみていく必要が あって、あんまりRubyぽいものにはならないかもしれないな。
>>746 >>726 > 2ちゃんのdatファイルなら
と、ごっちゃにして
勝手にdatファイルが入力されると勘違いしてた
>>711 をよく見れば、入力してるのはプレーンテキストっぽいな
ブラウザの表示をコピーしたテキストなのかな?
>>757 Etherealや横取り丸でパケットの中身を表示した方がいい。
もしXMLファイルがHTTPボディに指定されて送信されているだけ、かつPOSTメソッドなら $stdin から読み込めるはず。
cgi.rb を使わずに $stdin を読み込んでみたらどうだろう。
#/usr/bin/env ruby
data = $stdin.read() # or $stdin.read(ENV['CONTENT_LENGTH'].to_i)
print data
そもそもRubyの話題じゃないな。Flexスレで聞いてみてくれ。
はじめまして。元々Perl使いですが、最近Rubyを触りはじめました。 Perlでは、 @example = (1, 2) ($foo, $bar) = @example のように、変数のリストに対して値を代入できましたが、Rubyで同じ事をやろうとして hoge = [1, 2] [foo, bar] = hoge と書くとエラーになってしまいます。このように、複数の変数に配列の一つ一つの要素を 一気に代入したい場合、Rubyではどのように書けばよいのでしょうか。
hoge = [1, 2] foo, bar = hoge
764 :
762 :2007/03/13(火) 02:08:56
代入先にリストを作る必要はないのですね。ありがとうございました。
>>758 > rubyに本当に関数あるの?
なんだ、お前よりそいつの方が Ruby を解ってるんじゃん。
>>765 輪講なんてそんなもん。
* Rubyに関数はなく、すべてメソッド。あるのは関数のように見えるメソッド。See Kernel Module.
* クラスやメソッドは使われるまでに定義されればよい。
クラス宣言の中でインスタンスメソッドの中からクラスメソッドを使いたい場合のふつーの書き方って self.class.class_method でいいのかな?
クラス名を直に書く方法もあるけど、 そのへんは、継承されたときにどうしたいかによる。 class Hoge def add_child1 (@children ||= []) << self.class.new end def add_child2 (@children ||= []) << Hoge.new end end class Fuga < Hoge; end @fuga = Fuga.new @fuga.add_child1 と @fuga.add_child2の挙動は異なる。
class MySuperClass def self.class_method p 'hogehoge' end def instance_method self.class.class_method end end class MyClass1 < MySuperClass end class MyClass2 < MySuperClass def self.class_method p 'fgyafgya' end end MyClass1.new.instance_method #=> "hogehoge" MyClass2.new.instance_method #=> "fgyafgya" なるなる、普通はオーバーライドしたほうを呼んで欲しいような気がするなぁ
>>759
つーか、perlやawkでも似たようなものを似たような方法で実現できるからでは?
>>769 オーバーライドされてるのはMySuperClassの方なんじゃないの?
>>770 "Ruby的"な解法ができる課題ではないな
>>754 DBMとかあのへんは
"キー1" => "文字列1"
"キー2" => "文字列2"
"キー3" => "文字列3"
の素直な形をしていてなおかつ検索はキーの完全一致でしかやらない
というデータ構造以外を格納するのはお勧めしない
valueに配列が入ってるとか
ハッシュが入ってるとか
Timeオブジェクトが入ってるとか
正規表現が入ってるとか
そういう場合はPStoreで冷凍しろ
正規表現はオブジェクトに戻すときにえらい負荷かからないか?
Windows環境でスクリプトから他のアプリを起動したいと思ってます。 system()はアプリが終了するまで返って来ないので目的に合いません。 起動したアプリの終了を一切待たない起動方法はあるでしょうか?
fork
>>774 自分が使っている方法 WSHを利用する
その1 子プロセスを発生させる
ws= WIN32OLE.new('Wscript.Shell')
wwThred = ws.exec("hoge.exe")
その2 RUNメソッドの bWaitOnReturn を FALSE で
ws= WIN32OLE.new('Wscript.Shell')
ws.run("hoge.exe",1,FALSE)
>>775 fork は Windows では使えないはずだが…
あら、forkないのか。
Process.spawn と言いたいところだが、1.9にしかないな。 一番単純なのは、 Thread.new{system(nanika)} だと思うが、 IO.popen(nanika) とかもありかな。
779 :
774 :2007/03/13(火) 20:29:53
色々な方法があるようですね。試して考えてみます。 皆さんありがとうございます。
780 :
774 :2007/03/13(火) 20:40:36
CreateProcessってAPIを添付ライブラリのWin32APIクラス経由で 呼び出しても良さそうですね
>772 value がいろいろあるだけだったら、 value を Marshal した文字列を使って dbm にする方がいいよ。 もちろん、 value で値を共有する2つの hash が2つのキーに結びつけられて いるような複雑な構造は保持できないけど。 Marshal は、ファイルをぜんぶ読んでメモリに格納するので、巨大すぎるデータだと読込も書き出しも大変。
>>754 Marshalするとか工夫しなよ…。
マニュアル読んだんだろ?
そのまま格納しようとするバカがどこにいる(そこにいる)。
783 :
514 :2007/03/13(火) 21:54:09
>>759 自分もかなりそう思いました
なんか、題材によい問題はないものか…
>>765 輪講はいつも私のサンドバック状態です
>>766 ですよね
元気が出ました
>* Rubyに関数はなく、すべてメソッド。あるのは関数のように見えるメソッド。See Kernel Module.
>* クラスやメソッドは使われるまでに定義されればよい。
なるほど
Rubyはメソッドやクラスを再定義した場合、最後のものが採用されるんですよね
だから、C見たいに二重定義にならないよう気をつける必要はないんですよね
>>783 勉強しに行ってるんだから、今現在何かを知らなかったり間違ったりするのは問題ない。
周囲に叩かれつつでも学んでいけばよろし。
Rubyのいいところを生かした問題というと、比較的シンプルなテキスト処理で、かつ、他の類似した言語にない機能を生かしたあたりか。
じゃあ、Array#uniqを使ってテキストファイルから重複行を削除する、とかどう?
785 :
デフォルトの名無しさん :2007/03/13(火) 23:05:43
rubyで文字列を扱おうと最近rubyをはじめました。 文字列を主に扱うときに、処理速度が遅くなるような要因はどんなことがありますか? またfileの読み出しはreadlinesを使うのはどうなんですか?
>>785 > 文字列を主に扱うときに、処理速度が遅くなるような要因はどんなことがありますか?
非破壊メソッドを使ったとき。てかそういうのを意識するのは後回しでいい。
> またfileの読み出しはreadlinesを使うのはどうなんですか?
どうって…。ダウンタウンの昔の持ちネタみたいな曖昧な質問だなw
使いたいときには使うよ、くらいしか答えられないよこの質問だと。
readlinesつかうと配列になるんだぜ としか言えんな ファイルから1行ずつ読み込んでいるわけではないので注意 ファイル末までreadしてsplit("\n")するのと似たような負荷 本当に1行ずつ読み込みたいならIO.getsを使うこと
>>774 system('start calc')
などとやったりWin32APIのCreateProcess使ったりてのもある。
CreateProcessはガイシュツだったね。
790 :
デフォルトの名無しさん :2007/03/14(水) 21:29:52
RubyのLoggerってグローバル変数に入れて使っていいの?クラス変数にするべき? $logger = Logger.new(STDOUT) @@logger = Logger.new(STDOUT)
Railsだとnewの時に渡すみたいだね def initialize(..., logger, ...) @logger = logger
792 :
デフォルトの名無しさん :2007/03/15(木) 10:41:44
Rubyでグラフ書きたいのですが、何かよいライブラリはないですか? クールなのが一発でかけるとらくなんだけど
Ruby でデータ加工して GNUPlot で出力
gnuplotのgnuはGNUとは関係ないから全部大文字にするこたない。
RMagickも結構楽
797 :
デフォルトの名無しさん :2007/03/15(木) 11:43:22
つうか別にRuby関係ないような ライブラリあるったって中身はsystem発行してるだけだろ?
gnuplotはともかくGDはライブラリだからsystemでは呼べないだろ。
class K;end def K.init def foo p :foo self end end K.init k=K.new k.foo #=> :foo キモイです!なんとかしてください
ふつーじゃん。
HTMLからRSSのリンクを取り出そうとHpricotを使ってみました。 (以下docはHpricot(...)で取ってきたHpricot::Docインスタンス) # type="application/rss+xml" なlink要素を取り出す。 doc / '//link[@type="application/rss+xml"]' => #<Hpricot::Elements[{emptyelem <link href="..." title="RSS" rel="alternate" type="application/rss+xml">}]> # rel="alternate"なlink要素を取り出す。 doc / '//link[@rel="alternate"]' => #<Hpricot::Elements[{emptyelem <link href="..." title="RSS" rel="alternate" type="application/rss+xml">}]> と同じものが返ってくるのですが、両方の条件をandで結ぶと # doc / '//link[@type="application/rss+xml" and @rel="alternate"]' => #<Hpricot::Elements[ {emptyelem <link href="..." title="RSS" rel="alternate" type="application/rss+xml">}, {emptyelem <link href="..." rel="stylesheet" type="text/css" media="all">}, {emptyelem <link href="..." rel="shortcut icon">}, {emptyelem <link href="..." rel="stylesheet" type="text/css" media="screen,print">}]> と全部のlink要素が返ってきてしまいます。 XPathの書き方が間違っているのでしょうか。
803 :
デフォルトの名無しさん :2007/03/16(金) 03:42:41
オプション解析の optparse について質問させてください。 opt.on で、オプションを指定しておくと、--help で自動的にオプションがでますが、 デフォルトでは、 Usage: moge [options] (以下オプション) と表示されます。 これを Usage: moge [options] source_file dest_file などと表示したいのですが、よい方法はないでしょうか?
804 :
デフォルトの名無しさん :2007/03/16(金) 03:56:01
banner使うのですね。 opts.banner = "Usage: #{$0} [options] source_file dest_file" で行けました。
>>802 Hpricotはand に対応してないみたい (hpricot/elements.rb の ATTR_RE とか参照)。
今回のケースなら以下のように書き換えればいいと思うよ。
doc / '//link[@type="application/rss+xml"][@rel="alternate"]'
先生、クラス変数とクラスのインスタンス変数の違いがよくわかりません。 誰か優しく教えてください(はーと)
>>805 なるほど。ソース読んでみるべきでしたね。ありがとうございました。
PerlEzはあるのにRubyEzがないのは何でだぜ?
str.split(/〜/) {|s| 〜} みたいに、正規表現で分割するごとに何とかしてくれるみたいなのってないですか? strの文字列が巨大なときに、splitの配列を作らずに処理できたらいいなぁっていう発想なんですが・・・。
>>809 str.scan(pattern) {|match,...| block }
>>802 のおかげで、RubyのXML対応を調べる機会を得られたのだが、どうも他に例がないほど特殊だな。さすがにこの独走ぶりは非道過ぎるだろ。
str.split(/〜/).each {|s| 〜} じゃ駄目なの?
814 :
809 :2007/03/16(金) 15:09:40
>>810 すいません、scanでやった場合、matchにはマッチした部分が入るみたいなんですが、splitで取り出したいのはマッチした部分以外の部分なんですが、どう取得したらいいでしょうか?
メソッドの働きにあわせて正規表現を書き直すのが真っ当だと思われ scanで使う正規表現は平均して長ったらしいので頑張って書け
816 :
809 :2007/03/16(金) 16:15:51
"abcde,fghijk,lmno,pq".scan(/([^,]*)/) {|x| next if ""==x[0] p x } ,で区切る程度の簡単なやつではないんだろうけども
>>813 これって配列つくるの?
パイプみたいな感じで動くのかと思ってた。
どんな遅延評価だよ…。かっこ良すぎだろ。
scanでもsplitでもパフォーマンスに差はないと思うのは俺だけ?
821 :
デフォルトの名無しさん :2007/03/16(金) 22:58:30
windowsであるフォルダに100個のファイルが入っていて、 さらにサブフォルダが入っていてそこにもファイルがいくつか存在する。 それらサブフォルダの中にあるファイル全て含めて適当に文字列を追加したいと 思っています。 ファイル名がわかっているんだったら、そのファイルを開いて文字を付け加えて 閉じるでいいと思いますが、名前のわからない、このフォルダの下にある 全てのファイルに同じ処理をするという処理はどのように書けばいいんでしょうか?
名前がわからないなら調べればいいじゃない
ライブラリを使うならfind.rbかな。
Dir[File.join(root, '**/*')].select {|path| FileTest.file? path }.each do |path| #... end ↑物凄く深い階層だとメモリやパフォーマンスの問題が発生するかも。 find.rbを使うなら require 'find' Find.find(root) do |path| if FileTest.file?(path) # 処理 end end
>>821 Dir::foreach("./") do |item|
puts item
end
とかやると「,/」下の枚挙を叩ける
>>823-825 様
それだけのプログラム量で実現できてしまうのですか!
勉強になります、ありがとうございます!
827 :
デフォルトの名無しさん :2007/03/16(金) 23:53:22
globで、**すればいいんじゃね?
828 :
デフォルトの名無しさん :2007/03/17(土) 13:32:19
["7", "24", "-1", "26", "17"] この配列を ["-1","7","17", "24", "26"] このように並び替えるにはどうしたらいいですか?
p ["7", "24", "-1", "26", "17"].sort {|a, b| a.to_i <=> b.to_i}
p ["7", "24", "-1", "26", "17"].sort_by {|a| a.to_i}
["7", "24", "-1", "26", "17"].sort_by{|x| ["-1","7","17", "24", "26"].index(x)}
処理が一番速いのは 830 でOK?
string = "(6)[(5)[(4)[(3)[(2)[(1)[[h,5],[h,6]],[h,7]],[h,8]],[h,9]],[h,10]],[h,11]]" "[h,5]"の"5"と"[h,11]"の"11"をマッチする正規表現を教えてください。
>>833 なんか意図が全然わからんが、/\[h,(5|11)\]/で$1とりゃいいんじゃないかい?
>>833 /\(6\)\[\(5\)\[\(4\)\[\(3\)\[\(2\)\[\(1\)\[\[h,(5)\],\[h,6\]\],\[h,7\]\],\[h,8\]\],\[h,9\]\],\[h,10\]\],\[h,(11)\]\]/
でもおそらく「一番正しい」ぞ
>>831 も
>>835 もな
適切な質問にのみ適切な答が返る
まずは頭にあることを言葉にする練習からだな
初心者スレでオナニーしてんじゃねーんだよ
一番正しいって(笑)いやいや笑っちゃいけないか。でも正しくはないよ。
ということにしたい初心者でしたとさ。
ワロス
>>829-830 は昇順に並べるだけだからな
特定の配列をリファレンスにして同じように並べるには
>>831 みたいなのが妥当
質問者が昇順に並べるなんて言ってない以上、機械的に同じように並べるしかないわけで…
そうですね。君が正しいですね。って言われないと頑張って理屈をこねちゃう年頃なんですね。
休みだからか粘着がいるな 何の得があるんだか
「自己満足」という得が
ム板全体がオカシイ方向に向かってる気がする。
wwwwちょwwwwもともと過疎ってたんかいっwwwww
いらねーな
852 :
デフォルトの名無しさん :2007/03/18(日) 13:37:27
>>849 > なんか流れが読めない
それ、もしかしてジサクジエンに慣れちゃってて、
誰かに話しかけられてもちゃんと会話できない人が居る
って件じゃない?
>>833 =~ /(((\(\d+\)\[)+)((\[h,(\d+)\],)|(\[h,(\d+)\]\]\Z))+)/
$6で5だけど、11ができん。
>>853 /((\(\d+\)\[)+(\[h,(\d+)\])(,\[h,(\d+)\]\])+)/
p $4,$6
わからないならわかるまで勉強しよう。 プログラマの大切な資質。
作ったソフト公開したいけど「しょぼいコードだな( ´,_ゝ`)プッ」 とか思われそうでなかなか踏み切れない
>>857 つまらないこと気にするな。
指摘されて自分の悪いところを治せるんなら、むしろいい事じゃないか!
…と割り切ってしまえ。
>>857 コードに関して言えば、淡々とバグを指摘されるくらいだよ。
>>857 GoogleとYahooのクローラーしか来ないから安心しろ
Win32でGPLで無いならExerb+UPX等のパッカーでいいんじゃね? いちいちRubyインストールしろとかREADMEに書くのが面倒だから 最近はexe配布だな。
863 :
デフォルトの名無しさん :2007/03/19(月) 14:51:00
Rubyで画像掲示板CGIを作っていて 画像ファイルをアップロードするところまではできたのですが、 サムネイルを作成する方法で行き詰りました。 どなたか方法を教えてください、後生です。
>>863 A: ruby/gdやrmagickあたりの拡張を入れる。
B: サーバ上でnetpbmやImageMagickのコマンドを駆使する。
お好きな方で。
865 :
デフォルトの名無しさん :2007/03/19(月) 23:48:17
質問スレがないようなのでここでいいのかな? $: << File.expand_path("./") require "./../Lib.rb" $:はloadやrequireのPATHだとわかりましたが、 この<<って何ですか? ruby-lang.orgのリファレンスに<<演算子の解説がないです。 p 1 << 2 を試したら4が表示されたのでビットシフト演算子なんでしょう。 で、この場合の<<はオーバーライドされてるんでしょうけど その解説はどこにありますか? ってか、なんで<<ですか?+=とかpush,addあたりなら直感的にわかるんですけど。。。
>>865 C++のstream辺りをリスペクトしてみたんじゃないかなぁ
Array#<<
flock(File::LOCK_EX)の代わりにfcntlで排他ロックかける方法教えてちょ。 open(LOCKFILE, 'w').fcntl(Fcntl::F_SETLKW)だと「Bad address」とか言われる。
870 :
デフォルトの名無しさん :2007/03/20(火) 01:11:53
>>866 あれは失敗作ですよね。
Cで、a=0x00004321; printf("%08x\n", a); をC++のcoutで書こうと思うと気を失います。
>>867 thx!
「Array#push と同じ効果です」って書いてあった。
file:///D:/work/ruby/ruby-man-ja-html-20051029/Array.html
$:の説明に「loadや require がファイルをロードする時に検索するディレクトリのリストを含む配列です。」
って書いてあるんですけど、そこから配列=Arrayに飛ぼうという発想に至りませんでした。
$LOAD_PATH.push(File.expand_path("./")) って書けよ。
Perlの二の舞じゃん・・・読めん
871 :
デフォルトの名無しさん :2007/03/20(火) 01:15:37
>>870 そういうときはObject#classを使って、まず何のオブジェクトなのか特定しましょう。
あとはリファレンスマニュアルにgo
>>868 F_SETLKWにはstruct flockが必要。
それをpackしたStringを渡せばいい…んだが、
構造体の中身はシステム依存なんだよな。
dl/ptrあたりを使えばできるかもだが、素直に拡張ライブラリを使った方が楽かも。
ext/fcntlを拡張してほしいって話はruby-devかruby-listへ。
874 :
デフォルトの名無しさん :2007/03/20(火) 02:46:40
>>872 なるほど。そういう方法もあるのですね。
irbで>$:.classやってみました。
$:.class
Array
これは継承元がArrayって意味ですかね?
でもそんな調べ方はリファレンスに書いてなかったと思います。
JAVAのJavaDocもそうなんですけどマニュアル不親切すぎます。
難解な言葉(翻訳してるからかな?)で使い方がわからない。
その点、皆さんが嫌ってるであろう、MSのVisualCとかは素敵過ぎますよ。
ほぼSampleが書いてある。STLでさえ。
Rubyコミュニティのみなさん、がんばってくださいね!
>>874 というかそのオブジェクトが何どのクラスに属しているか知らないで
メソッドの機能を調べようがないでしょう。
> $:.class
> Array
>これは継承元がArrayって意味ですかね?
違います。オブジェクト指向をかじっているようですけど、
そういうのは継承といいません。Arrayのインスタンスです。
> でもそんな調べ方はリファレンスに書いてなかったと思います。
書いてありますよ。Object#classのところにばっちりと。
それと$:のところにも
> loadや require がファイルをロードする時に検索するディレクトリのリストを含む 配 列 。
と「配列」と書いてあります。別にこれだとObject#classを使わずとも調べがつきます。
>>870 a=0x00004321; std::cout<<std::setfill('0')<<std::setw(8)<<std::hex<<a<<std::endl;
気を失うほどではないぞ
コーディングはむしろ気を失ってからが勝負
メソッドがどこかで再定義されているらしいんだけど、
正直スパゲッティでどれが正解かわからない。
ランタイムで、メソッドが再定義された時にイベントを拾うか、
あるいは、使われた所でメソッドの定義をずばり表示させるかしたいんだけど
なんかいい方法ありますか?
全部の候補に print 突っ込んだ方がもしかしたら早いのか…
オリジナルのライブラリはあんまり触りたくないんだけどなぁ。
>>875 >> でもそんな調べ方はリファレンスに書いてなかったと思います。
>
>書いてありますよ。Object#classのところにばっちりと。
>それと$:のところにも
「どんな素敵なことが書いてあっても、書いてある場所が見つからない」
という問題だと思う。
逆引き作らないと多分無理。
879 :
878 :2007/03/20(火) 07:33:24
あ、RadRuby 使ってデバッガでトレースできないか試したんだけど、 到達タイミングがわからなくて、いまだに捕まえられない。 つか、デバッガがスタックオーバーフローで死ぬ。困った。
Railsのみたいに class メソッドを偽るようなコードはかなり難解だが、 大抵のことはリフレクションで追っていけると思う。 メソッド定義はmethod_addedで拾えるんじゃないでしょうかね。
881 :
デフォルトの名無しさん :2007/03/20(火) 08:57:10
Ruby でのドキュメントのヘルプについて御教授ください。 python 使いですが、Ruby も使い始めようとしています。python では pydoc モジュールがヘルプ目的で便利に使えます。下のようにコンソールか ら打ち込むだけで、組み込みオブジェクト list についての機能を表示して くれます。 python -m pydoc list Help on class list in module __builtin__: class list(object) | list() -> new list | list(sequence) -> new list initialized from sequence's items ・ numarray モジュールの zeros 関数については下のようにします。 python -m pydoc numarray.zeros Help on function zeros in numarray: numarray.zeros = zeros(shape, type=None, typecode=None, dtype=None) Constructs a zero filled array of the specified shape and type. 同様なことを Ruby で 出来るとありがたいのですが、何か方法があるでしょ うか。RDoc がありますが、大げさすぎると感じています。コンソールの一行 で済ますのは無理だと思っています。
riじゃだめ?
しつもん。 何か色々やって結果としてHTMLを吐き出すCGIを作ってます。 HTMLの一部を作るメソッドを書きました。 その1: def table html = String.new html << <<EOB <table> 〜いろいろ〜 </table> EOB return html end その2: def table return <<EOB <table> 〜いろいろ〜 </table> EOB end どっちの癖をつけたほうが好ましいですか?
前者を選ぶメリットはあまりないと思う CGIならhtmlに割り当てられるメモリももったいないし
よく見るのは後者。もっと言うとreturnもないことが多い。
後者(のreturnなし)はソース中に出てきてもイディオム的に理解できるよね 「あーこれは文字列作って返すだけなのね」みたいな 値を返すときにしか使われないオブジェクトを明示的に作ることはしなくていいと思う 他人が見てもすんなり理解できる書き方の範疇、かつ、動作上大きな無駄も起きない書き方だと思うよ
おー。ありがとうです。後者メインでいきます。 もういっこ。 「値というかデータを返すのに使えるもの」ってありますよね。 ・ めんどいのでローカル変数に直に書く ・ initializeのときにインスタンス変数を定義しておいて入れる ・ よく考えたらクラス変数でもいい気がする ・ そういう値を返すメソッドを作って随時呼ぶ お勧めの使い分けの考えかたってありますか?
どちらであろうが「大きな」無駄なんか生じねえよ。しかもどちらであろうがすんなり読める。違いは無いに等しい。
>>881 残念ながらRubyには同等の機能はありません。
組み込みライプラリや標準添付ライブラリならriやrefeといった外部コマンドで参照できますが、
それ以外ならRDocに頼るしかないでしょう。
>>883 def table
html = "<table>"
〜いろいろ〜
html << "</table>"
html
end # table
トリップキーがじじむさい
894 :
デフォルトの名無しさん :2007/03/20(火) 18:14:06
a=Array.newはできるけど、 a=IO.newやFile.newとやると エラーになります。なぜですか?
>>894 エラーが出たときにメッセージがあるでしょ?
>>894 IO の場合は a ではなく io
File の場合は a ではなく fp
FILE pointerじゃないのにfpだなんてとんでもない!
変数は参照なのだからポイントしていると言えなくもない。 結論: でもpointerじゃない
ary = Arrai.new h = Hash.new str = "" io = IO.new(0) db = DBI.connect(... doc = REXML.Document トリップ探すのめんどくせー
ここで再びハンガリアンの登場です。
>>899 なぜ
> str = ""
なんてやってるのに
ary = []
h = {}
とやらんのだ?
string = String.new array = Array.new hash = Hash.new string = "" array = [] hash = {} どっちが良い? 俺は前者の方が好きなんだけども…
後者だなあ。前者はコードに埋もれる。
そういや名前しか気にしてなかったな。 ary = [] でもハッシュは空だと見た目がブロックと紛らわしいから h = Hash.new 空じゃなければ h = {:key => value}
ttp://www.taiyosha.co.jp/comic/comic0704_han1.html ここから「発売予定一覧」のテーブルの
各セルをハッシュに、各行を配列にいれたものをつくろうとして
hpricotを使って
index_page = Hpricot.parse(
NKF.nkf('-w',
open("
http://www.taiyosha.co.jp/comic/comic0704_han1.html ").read
)
); nil
ta = index_page.search("//table")
table = ta[2]
$row = table.search(:tr).map {|e|
{"Pub" => e.search('td[1]').inner_text,
"Date" => e.search('td[2]').inner_text,
"Title" => e.search('td[3]').inner_text,
"Author" => e.search('td[4]').inner_text,
"Price" => e.search('td[5]').inner_text,
"Book" => e.search('td[6]').inner_text}
}
としてうまくいった気になっていたんですが"秋田書店”のセルを
除いて以降の出版社名のある行が取得できていませんでした。
ソースを見てみると該当行に<tr>タグが抜けているために取得できないようです。
これを回避するにはどうすればよいでしょうか?
ご教授お願いします。
うーん、TRがなくてもそれっぽく表示してしまうWebブラウザが優秀と いうべきなんだろうか。 tdの数は列ごとに幸い一定(出版社のカラムでROWSPANしてないし)のよう なので、数えていくとか、あるいは、¥d{2}/¥d{2} というパターンに合致 するカラムを日付であると仮定してみるとか。
907 :
デフォルトの名無しさん :2007/03/20(火) 22:26:39
>>882 riじゃだめ?
ありがとうございました。ri で help が出るようになりました。
ActiveRuby パッケージをインストールし、コンソール上で
>rdoc --ri-site
の後
>ri --help
が動くようになりました。
908 :
デフォルトの名無しさん :2007/03/20(火) 22:31:37
http://www.uploda.org/uporg739930.txt.html wxrubyでソフトを作っています。
本番の為のテストのソフトを製作していて
行き詰まりました。
get_valueや
set_valueがundefined methodだと言われ
メモ帳のサンプルプログラムを見ながら
「ここに書いてあるやんけ!」
と格闘すること小一時間
もうなにがなんやら分からなくなったので助けを求めます。
rbがうpできないのでtxtに変えてあります。
loadするファイルのpathはテスト的に直行させてありますが、本来なら@fliePathと書きたいです。
添削して欲しい場所にコメントをつけておきました、どこがエラーに繋がっているのか添削お願いします。
wxRubyがないから確認できないけど、 initializeでengTxtやjapTxtというローカル変数には代入しているが、 on_startで参照している@engTxtや@japTxtといったインスタンス変数 はどこにもないような?
なんでinitialize中では@が付いてないわけ?
>>908 initializeで作っているButtonとかTextCtrlをインスタンス変数に
代入しておかないと駄目。
「get_valueがundefinedだから使えない」だけでなく、同時に エラーメッセージは「@pathTxtがnil」であることも示していたはずだと思うのだが。
914 :
デフォルトの名無しさん :2007/03/20(火) 22:59:44
915 :
デフォルトの名無しさん :2007/03/20(火) 23:04:11
rubyではじめてプログラミングぽいことした・・・しかも憧れのGUI あとはexerbでexe化してインプット作業役の友達に送らないと
そのサンプルでは、ローカル変数をブロックで束縛してるから、 インスタンス変数にしなくても動く。チミのはブロック内にメソッド呼び出ししか ないから、インスタンス変数に格納しないと触れない。
>>906 ありがとうございます。
私もTDの数が一定だったので
$td = table.search(:td).map{|e|
e.inner_text
}
TDをいったん配列にいれてそれから
>>905 の$rowのようにしたいのですが、
どのようにすればできますでしょうか?
919 :
デフォルトの名無しさん :2007/03/20(火) 23:19:12
exerb proto.rb としても動かないプログラムが生まれました。 何かコマンドが必要のようですがわかりません
exerbのサイトに全部書いてある
921 :
デフォルトの名無しさん :2007/03/20(火) 23:35:36
exerb -c gui proto.rb でもダメでした
>>917 require 'hpricot'
require 'open-uri'
require 'kconv'
require 'tidy'
Tidy.path = "c:/WINDOWS/system32/tidy.dll"
html = open('comic_list.html').read.toutf8
clean_html = Tidy.open do |tidy|
tidy.options.char_encoding = 'utf8'
tidy.options.newline = 'LF'
tidy.clean(html)
end
index_page = Hpricot.parse(clean_html)
ta = index_page.search("//table")
table = ta[2]
Record = Struct.new(:pub, :date, :title, :author, :price, :book)
records = table.search(:tr).map {|e|
Record.new(
e.search('td[1]').inner_text.strip,
e.search('td[2]').inner_text.strip,
e.search('td[3]').inner_text.strip,
e.search('td[4]').inner_text.strip,
e.search('td[5]').inner_text.strip,
e.search('td[6]').inner_text.strip
)
}
923 :
デフォルトの名無しさん :2007/03/20(火) 23:55:09
きたこれえええええええええええええええええええええええ!!!!!!!!!!
>>919 mkexy proto.rb
とやってレシピファイル(.exy)というのを作ってやる。
あとは
exerb -c gui proto.exy
requireとかは実行されないとレシピに反映されないので
必要なライブラリが全部ロードされるようにしておかないと駄目。
open-uriとかrequireしてもnet/httpが無いとか言われたよ^^;
hpricotとか流行ってるみたいなんでちょっといじってみたんだけど
tidyでXHTMLにしてからREXMLで処理した方が確実ぽい気が。
XPathじゃなくてCSSセレクタが使いたい場合は駄目かもしれんが。
>>925 win32/registryのパッチ書いたら寝るよ
>>922 私の環境(mac osx 10.4.9 powerPC)で動きませんでした。
どうすればいいのかわかりません。
HTMLからの抽出は正規表現でsplitしてscanしたほうが確実高速 ツリー構造をメモリ内に再構成することは目的のために本当に必要なのか?
でっかい正規表現考えるのめんどくさい人がライブラリ使うんじゃないの もし定型処理たりえるならそのように処理してもらったほうが間違いもないだろう
> 正規表現 ぷ
931 :
878 :2007/03/21(水) 08:04:54
特異メソッドの追加は method_added ではわからないのか。 よく考えたら、スコープが違うもんな。 とりあえず何とか見つけ出せたけど。 普通のメソッドと特異メソッドに同じ名前付けるのは ややこしいからやめてほしいわ。完全に勘違いしてた。 Python が1ファイル1名前空間がいいという気持ちも良くわかったわ。 まぁ、ふつうに作ったらそうなるよね。 後付けで外から色々くっつけるのはスパゲッティになりやすいのは確か。
ruby/tkのサンプルは色々と見つかるんだけど 実際にruby/tkで書かれたツールとかあります? ちょっとどんなソースを書いてるのかリスペクトしたいんです Ruby/gtkは時々みかけるんですけど…
>>931 >普通のメソッドと特異メソッドに同じ名前付けるのは
>ややこしいからやめてほしいわ。完全に勘違いしてた。
なんで?普通のメソッドと同じように使えるのは特異メソッドの利点じゃん。
>特異メソッドの追加は method_added ではわからないのか。
grep -n メソッド名 file.rb | grep def
で見つからないか?
>後付けで外から色々くっつけるのはスパゲッティになりやすいのは確か。
うそ〜ん。
それはコーディングやファイル命名方法がアホなだけで、Open Classのせいにするのは筋違いでは?
Ruby on Railsでは既存クラスをアホみたいに拡張しているけど、ファイルもコードもきちんと整理されているよ。
RoRが整理されていると世の中のあと付けで付け足すコードは混沌としえないのか?
>>934 スパデッティになるのはコーディングやファイル命名方法がアホなだけであり、後付けで外から色々くっつけられることを理由にするのはおかしいといっている。
Ruby on Railsはその証拠として持ち出しただけ。
それをねじまげて
>RoRが整理されていると世の中のあと付けで付け足すコードは混沌としえないのか?
なんてアホか。誰もそんなこと言ってないだろ。へ理屈もいい加減にしろ。
拡張したライブラリを使うのと、拡張して使うタイプのライブラリの違い
>>933 いや、俺が勘違いしてたのが悪いとは思うんだが
そもそものスコープが違ってたから、APIが違うので
違うところを追っかけてたてたんだ。
で、同じ名前だけど、まったく違うAPIだったんだよ。
かたやただのアクセッサのはずのもの。
かたやアクセッサっぽいが、微妙に処理を行う奴。
grep して似た名前の def method もいっぱいあったので、
どれが呼ばれるのか見当つかんかった。
ちなみにその RoR を俺は追いかけてたんだがな…
>>938 話が具体的じゃないから、おまえが何になやんでなぜこまったのかがさっぱりわからん。
>ちなみにその RoR を俺は追いかけてたんだがな…
公開できないコードなら大事なところをぼかすのは仕方ないけど、open sourceならもっと具体的にきけばいいんじゃない?
で、どの特異メソッドを探してたの?同じようなことで悩む初心者は他にもいるだろうから、もっと具体的に書いてくれ。もう解決したからいいよなんてのは無しな。
(10 .. 2).each do |n| 〜 end はこちらの意図を汲んで動作してくれてもいいと思うんだ…
Rangeは降順だとまったく無言で動かないよな 例外出すとかしてくれれば気づくんだが
こんなかんじでしょうか class Range alias _original_each each def each if first > last && first.kind_of?(Integer) && last.kind_of?(Integer) first.downto(last) {|n| yield n } self else _original_each {|n| yield n } end end end
>>944 エスパーだな。
respect: 敬意を払う・尊重する
inspect: 検査する
語源的にspect(見る)という部分は共通してるがなー。
先人のチョーすごいソースを参考にしてみたい、という意味でリスペクトなのかもしれん
947 :
デフォルトの名無しさん :2007/03/21(水) 17:04:55
超低レベルな質問。 ruby-1.8.5-p12-i386-mswin32 Windows Xp File.foreach(filename){|line| p line } #=> "一行目\n" "\n" "二行目" File.foreach(filename){|line| p line.chomp } #=> "一行目" "" "二行目" 1行目と2行目の間を出さないためにはどうすれば良いですか? 改行コードの問題?
p obj == puts obj.inspect == print obj.inspect, $/ ループに next unless line.size > 0 などと入れて出力したくないものは除外する。
>>932 「敬意を持ってパクらせていただきます」の意。
>>947 同じことやってみたけど空行なんて出力されないけど、何故?
バージョン同じでOSはWIN2k
>>951 空行が混じってないファイルだったのでは?
なら
>>947 のは2行目じゃなくて3行目だろうに
紛らわしいなぁ。
sample/tk/demos-jp にピタゴラスイッチみたいなかわいいサンプルがあってワロタ
955 :
デフォルトの名無しさん :2007/03/21(水) 18:43:05
windowsだとexerbを使えばexe配布出来るわけですが linuxだとそうもいかず ということはソースごと配布せざるを得ない?完全なるオープンソース状態? いやだいやだ! どうすりゃいいんだ?
linux版exerbを開発すればええやん。 というか、UNIX界隈はバイナリの互換性が低くてやってられんだけでは(w
つかソレは本当に公開に足るスクリプトなのかという話が Windowsは細かい動作するスクリプトはニッチでも需要があるが Linux界隈では自力でやってしまうことのほうが多いはず 使いでのあるライブラリとかならまだしも単一のバイナリではなんとも
apt-get一発で処理系が入る世界だからなあ
>>948 unless line.size > 0
より
if line.empty?
のが早い…とかどっかで聞いたような
ソース忘れたけど
まぁ別解のお節介。
961 :
デフォルトの名無しさん :2007/03/21(水) 20:29:24
vineかfedoraに移住予定なのです
すみません、質問させてください アクセサを記述したときふと気が付いたのですが、 classを記述するときに、 def hoge=(x) @hoge=x end と記述したのですが、 これを呼び出すときは hoge = x とか、書いていました つまり、=とメソッド名の間にスペースが入ってしまっています。 なのになぜ、正常に動作するのでしょうか?
Cygwin 1.5.19 で ruby 1.8.6 を ./configure --enable-shared ; make ; make install のようにビルドしてインストールしましたが ruby -rnkf -e '' を実行すると ruby: no such file to load -- nkf (LoadError) というエラーがでました。 インストール方法に問題があるでしょうか?
>962 代入の = はいくつかの解釈がされる。 var = val # 変数への代入 obj[idx] = val # obj.[]=(idx,val) obj.hoge = val # obj.hoge=(val) なので、より正確に書くなら obj.hoge = x だな。レシーバなしの hoge = x だと ローカル変数 hoge への代入になってしまう。
>>955 yarvには難読化機能があるらしいけど、それじゃだめなのか?
>>964 サンクス そういう勉強はどこですればいいの? 単純にRubyかけるだけではなく、もう少し深く学びたくなってきたので
マッツと愛を育む
使用法の勉強には全く役に立たないくせにデカくて厚くて高くて細かいこと書いてある例の本にお布施
>966 そういう細かい仕様はリファレンスマニュアルを隅から隅まで読んだり MLを読んだりしてると覚えてくる。 ちなみにさっきのはリファレンスマニュアルの 「演算子式」→「代入」に書かれてる内容。
以下のようなtidyのサンプルを実行すると require 'rubygems' require 'tidy' Tidy.path = "/usr/local/bin/tidy" html = '<html><title>title</title>Body</html>' xml = Tidy.open(:show_warnings=>true) do |tidy| tidy.options.output_xml = true puts tidy.options.show_warnings xml = tidy.clean(html) puts tidy.errors puts tidy.diagnostics xml end puts xml 以下のようなエラーがでます。 RuntimeError: can't find the symbol 'tidyCreate' method symbol in import.rb at line 126 method import in import.rb at line 145 method extern in import.rb at line 61 method load in tidylib.rb at line 17 method path= in tidy.rb at line 46 at top level in tidy_test_sample.rb at line 7 ご教授お願いします。 当方mac10.4.9 ruby1.8.5
で、
>>938 はRuby on Railsの何を追いかけてたの?
RoRが諦めかけていた夢を追いかけてたの
974 :
デフォルトの名無しさん :2007/03/22(木) 21:53:51
def on_start(event) rd = rand(@words.length) @engTxt.set_value(@words[rd][0]) sleep 1 @japTxt.set_value(@words[rd][1]) end sleepの入る位置がおかしいです。 英語を表示してから日本語を表示したいのですが、1秒待ってから英語と日本語を同時に表示します。 解決策はありますか?
976 :
971 :2007/03/22(木) 22:17:43
Tidy.path =
の行でエラーがでます。
自分なりにいろいろpathを変えてみた中ででた
エラーのパターンは
RuntimeError: can't find the symbol 'tidyCreate' もしくは
Unable to load ほにゃほにゃ
です。
ttp://tidy.sourceforge.net/trt/tidy_mosx.tgz HTML tidyは上記をダウンロードし解凍した”tidy”を
/usr/local/bin/ に放り込みました。
ターミナルで
tidy -h
とするとヘルプが表示されているのでインストールはできていると思います。
tidyは
gem install tidy でインストールし1.1.2がインストールできていると思います。
お助けください。
977 :
デフォルトの名無しさん :2007/03/22(木) 22:24:22
>>975 そのサイトは知りませんでした!!!
ありがとうございます!!!
超感動しました。sizerの使い方もよくわからなかったので;;
>>976 Tidyのコマンドじゃなくて、TidyLibライブラリを指定しないと駄目。
980 :
971 :2007/03/23(金) 02:28:40
>>980 Structだとアクセサが便利なのと
newするときに配列渡すだけで初期化できるとこがいい。
Arrayへの変換もできるし。
985 :
971 :2007/03/23(金) 13:44:47
>>981 なるほど。ありがとうございます。
StructはRubyの入門書の類にはあまり出てこなかったので
ほとんど知りませんでした。
便利そうなので勉強して使ってみたいと思います。
>>984 初心者スレだから必要
おまえのようなやつは本スレだけみとけ
Tk::BWidget::NoteBook について質問なのですが, raise(page=nil) メソッドで特定のページをアクティブにする(表示する)事はできたのですが, 逆に,現在アクティブな(表示されている)ページの情報を取得するにはどうしたらよろしいのでしょうか? タブを右クリック→そのタブを削除 みたいな動作が欲しいのですが…
988 :
デフォルトの名無しさん :2007/03/23(金) 17:23:55
wxRubyを使え
if A > B then と if A - B > 0 then ってどっち使うほうがいい?
>>989 そりゃアルゴリズムにおけるAとBの意味による
例えば自動車Aと自動車Bの速度だとすると
前者は「Aの方がBよりも速い」
後者は「AのBに対する相対速度が正」
Rubyは人間の思考中心の言語だからNE
>>989 A-B>0は、Cのintのような整数の範囲が限られている場合に意図しない(が正しい)
動作をすることがあるが、Rubyは自動的にFixnum<->Bignum変換されるから、
文脈に応じて分かりやすいほうでいいんじゃないかな。
みんなreturnは必ず書くよな!
最悪nilでも返さないとデータ漏洩につながるからな。
returnは書く でも if hoge return foo else return bar end な書き方ってあっちこっち飛び回って実際問題gotoと一緒だよなぁ returnってメソッド内で1つだけにしたほうがいいのかなぁ
>>995 の自己レス
例えば
if hoge
piyo = foo
else
piyo = bar
end
return piyo
こんな風にね
>>996 メイン分岐の処理自体に前処理を書くのが楽だったとしても無理矢理まとめる?
return nothing unless hoge.has_key?('momomo')
のような
出口は1個であるべきなんだけど難しいね
if文が値返すから return (if condition hoge else bar end) とか書けるな。返す文を短く書けるなら return (condition ? hoge :bar) か
でっかい if 文で括ったほうが素直かと 容易にネストしまくると思われるが
>>992 def hoge
@hoge
end
で、いちいち return @hogeとは書かない
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。