トップページ⇒tech
1001コメント311KB

Ruby初學者スレッド Part 9

■ このスレッドは過去ログ倉庫に格納されています
0001紅寶石2006/11/21(火) 08:33:42
まずはマニュアル

マニュアル
http://www.ruby-lang.org/ja/man/
Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
逆引きRuby
http://www.namaraii.com/rubytips/
Ruby リファレンスマニュアルの Windows HTML Help版
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
Rubyリファレンスマニュアル刷新計画
http://doc.loveruby.net/


前スレ
Ruby初心者スレッドPart8
http://pc8.2ch.net/test/read.cgi/tech/1159424939/

>>2-10
0577デフォルトの名無しさん2006/12/25(月) 13:46:15
>>576
OSを書くとか、どうよ。
0578デフォルトの名無しさん2006/12/25(月) 14:23:11
>>576
処理速度を要求されるのは苦手だろう
0579デフォルトの名無しさん2006/12/25(月) 14:26:13
civilization4のMOD作成
0580デフォルトの名無しさん2006/12/25(月) 15:05:21
>>579
Civ4はPythonインタプリタ内蔵だったな。
0581デフォルトの名無しさん2006/12/25(月) 15:07:52
>>576
今後リリースされるバージョンでも確実に動くアプリケーション書いてみろ。
0582デフォルトの名無しさん2006/12/25(月) 15:17:33
なに急にいきりたって
あさっての方向に「指令」出してんだろ、この子
05835762006/12/25(月) 15:46:12
>>577
OSって、そもそもアセンブラじゃないと書けないんじゃなかったっけ?
それともC言語やJavaでOS作るのも可能なのだろうか
0584デフォルトの名無しさん2006/12/25(月) 15:49:20
>>583
誰に教わったのそれ
まあランタイム必須なものには無理だ
0585デフォルトの名無しさん2006/12/25(月) 15:49:28
>>583
「OS作る」の定義によるんじゃね?
0586デフォルトの名無しさん2006/12/25(月) 16:44:09
>>583
確かJavaで使ったOSがあったよね。
0587デフォルトの名無しさん2006/12/25(月) 17:32:31
その前にRubyでRubyが書けるようにならないと
0588デフォルトの名無しさん2006/12/25(月) 18:15:07
evalだけでいいすか?
0589デフォルトの名無しさん2006/12/25(月) 18:27:14
rubyでruby実装するのは無理。Lispマンセ
0590デフォルトの名無しさん2006/12/25(月) 18:34:44
ripperはどういう位置づけだっけ?
0591デフォルトの名無しさん2006/12/25(月) 21:52:23
f=File.open("ntl-5.4.tar.gz",'rb')
ff=File.open("an.cyp",'w')
while(f.eof?!=TRUE)
b= f.read(89)
b= key*b;
srand
print "b=",b,"\n"

こうやると89バイトの文字列として読んでしまうので掛け算ができません。
89バイト整数としてファイルから読ませるにはどうすればいいのでしょう?
よろしくお願いします。
0592デフォルトの名無しさん2006/12/25(月) 22:46:50
to_i
0593デフォルトの名無しさん2006/12/25(月) 22:47:57
>>591
力ずくでやるしか知らないが「b = f.read(89)」のあとに

c = 0
b.size.times do |i|
  c = (c << 8) | b[i]
end

とすれば、変数 c に望みの整数値が出来上がる。
バイトオーダはビッグエンディアン。

リトルエンディアンの値が欲しけりゃ times の中を下ので書き換えてくれ。
  c = (c) | (b[i] << (8 * i))
0594デフォルトの名無しさん2006/12/25(月) 22:52:50
rubyって、そんなに桁数多くても計算できるんすか・・・
0595デフォルトの名無しさん2006/12/25(月) 23:13:36
メモリが続く限り
0596デフォルトの名無しさん2006/12/25(月) 23:30:56
ただしfloatは鬼門。
0597デフォルトの名無しさん2006/12/25(月) 23:34:07
89バイトつーと、
irb> 89 * 8 * Math.log10(2)
=> 214.333356912755 桁か。
0598デフォルトの名無しさん2006/12/25(月) 23:37:13
ちょっっぴり長いね
0599デフォルトの名無しさん2006/12/26(火) 00:36:23
>>596
そんなあなたにBigDecimalを
0600デフォルトの名無しさん2006/12/26(火) 03:55:56

7^7^7
つまり7の(7の(7の階乗)乗)乗
の1の位の数字をrubyで計算してみてください
p 7**7**7 でも結果が分かるので
やってみて頂いてもいいのですが
時間がかかるのでもう少し早い方法で
プログラムしてみてください

0601デフォルトの名無しさん2006/12/26(火) 04:31:29
階乗?
累乗じゃなくて?
0602デフォルトの名無しさん2006/12/26(火) 04:38:05
でと、7のn乗の1の位は、
n = 1 -> 7
n = 2 -> 9
n = 3 -> 3
n = 4 -> 1
となるので、以降は7、9、3、1を繰り返す。
ということは、乗数を4で割った余りがわかれば1の位はわかる。
つまり、7の7乗の1の位は3になり、7の(7の7乗)乗の1の位も3。

しまった、プログラム組む前に答えがわかっちゃった。
0603デフォルトの名無しさん2006/12/26(火) 05:48:50
>>593
うまくいきました。ありがとうございます。
逆に復号したいとき、整数から文字列にして表示させるにはどうすれば
いいでしょう?よろしくお願いします。
0604デフォルトの名無しさん2006/12/26(火) 06:03:15
while(f.eof?!=TRUE)
b= f.read(15)
bb=0
b.size.times do |i|
bb=(bb<<8)|b[i]
end
b= key*bb;

print "b=",b,"\n"

while(1)
if(a=rand(key))
#print a,"\n"
break
end
end
while(1)
if(d=rand(k2))
break
end
end

c=(b+a)^d;

ff.write(c)
こんなことやってますが、書き出されたファイルの大きさが計算と違います。
何か間違いがあるのでしょうか?2370バイトのファイルを15バイトづつ
読み込んで256ビットにして書き込みしてます。
11698バイトになってしまいます。どうしてかわかりません。
0605デフォルトの名無しさん2006/12/26(火) 06:34:49
ff.write(c)をバイナリデータとして書き込みたいのですが、
テキストになってしまいます。
0606デフォルトの名無しさん2006/12/26(火) 07:49:13
>>605
つ array.pack
0607デフォルトの名無しさん2006/12/26(火) 08:09:37
undefined method array ?
0608デフォルトの名無しさん2006/12/26(火) 08:20:17
pack': can't convert Bignum into String
0609デフォルトの名無しさん2006/12/26(火) 08:24:13
`main': undefined method `pack' for #<Bignum:0x100ef758>
0610デフォルトの名無しさん2006/12/26(火) 08:37:44
ff.write(array.pack(c))でバイナリデータになるんですか?
わかりません。
0611デフォルトの名無しさん2006/12/26(火) 09:19:32
わからないならわかるやりかたでやればいいのに、無理矢理小難しくする理由がわからん。
0612デフォルトの名無しさん2006/12/26(火) 09:26:59
使い方が分からないなら
ri pack
して。
0613デフォルトの名無しさん2006/12/26(火) 11:37:26
WebAgent または Http-Access2を使用して
クッキー情報を送信してHTMLボディを取得したいのですが
どなたかおおまかなサンプルを見せていただけませんか?

googleで検索したのですが、いい資料がなく困っています。
0614デフォルトの名無しさん2006/12/26(火) 11:50:54
WebAgentみてみたけど、受け取ったことのあるクッキーなら
見つけ出して送ってくれるものの、任意にセットするメソッドは
ないみたいですな。

逆に言うと、クッキーDBファイルにこっそり該当URLのクッキーを
書いておくとそれを使ってくれるぽい。
0615デフォルトの名無しさん2006/12/26(火) 12:01:52
メソッドないので instance_eval で無理矢理。
web_agent.instance_eval do
@cookie_manager.parse(str, url)
end
とやるのかな。

あるいは parse の代わりに WebAgent::Cookie.new していろいろセットして add。
0616デフォルトの名無しさん2006/12/26(火) 12:20:11
>>605

バイトストリーム = ""
16回繰り返す { |i|
  バイトストリーム << ((整数値を i バイト右シフト) と 0xff を論理積)
}
0617デフォルトの名無しさん2006/12/26(火) 12:32:43
>>611
みんな知ってるのに俺だけ知らないのはくやしいから。
使い方ちゃんと教えろ。
0618デフォルトの名無しさん2006/12/26(火) 12:36:07
>>617
そんなこと言っていると何も出来なくなる。
自分の手元にあるものだけで どうにかできるように心がけろ。
0619デフォルトの名無しさん2006/12/26(火) 12:42:05
Cだったらバイナリモードで開いたファイルにはバイナリデータが入るんです
けどね。何でルビーは違うんでしょうね。
Cはうまくいきました。でも謎の^@が大量に入って、圧縮ファイルを復元しよう
賭したら間違いなくエラーになるので原因を探しています。
0620デフォルトの名無しさん2006/12/26(火) 12:49:26
^@ って0x00 だが
0621デフォルトの名無しさん2006/12/26(火) 13:04:40
>>619
バイナリモード云々ではなく、writeの挙動を理解していない君の落ち度だ。
writeは文字列で無ければ内部で対象を文字列に変換する。
整数12345ならば文字列"12345"に変換してしまうわけだ。

以下の部分に目を通しておきなさい。
http://www.ruby-lang.org/ja/man/?cmd=view;name=IO#write
0622デフォルトの名無しさん2006/12/26(火) 13:11:06
>>619
せめてRubyもCと同じくらい勉強してから比較してやれよ。
0623デフォルトの名無しさん2006/12/26(火) 13:19:34
>整数12345ならば文字列"12345"に変換してしまうわけだ。
センセー、rubyはなぜ全角と半角の変換を自動でおこなうのですか?
0624デフォルトの名無しさん2006/12/26(火) 13:27:57
バイナリで書き込む関数は無いのですか?
初学者には例が少ないので。
0x00が変換中に混じっているので除去しないといけないということでしょうか?
0625デフォルトの名無しさん2006/12/26(火) 13:30:06
>>623
それくらいぐぐれ
0626デフォルトの名無しさん2006/12/26(火) 13:50:18
packに
>”w”、BER圧縮整数:1バイトあたり7ビットを使用して必要最小限のバイト数で「任意サイズの 0以上の整数」を表す数値表現。
ってのがあるので、これ使えば自分で計算する必要はない。
irb(main):001:0> File.open("testfile","wb"){|f|f.write([100**100].pack("w"))}
=> 95
irb(main):002:0> File.open("testfile","rb"){|f|f.read.unpack("w")}
=> [100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
0627デフォルトの名無しさん2006/12/26(火) 13:59:26
>>624
バイナリは何で保持してる?
Stringにバイナリを保持させればwriteはそのまま書いてくれる
0628デフォルトの名無しさん2006/12/26(火) 14:08:49
gz圧縮ファイルのデータが文字列に変換されると困ります。
暗号化関数なので保存される形式はバイナリデータです。
0629デフォルトの名無しさん2006/12/26(火) 14:25:03
>>バイナリデータです。
バイナリデータでなければならないです。
0630デフォルトの名無しさん2006/12/26(火) 14:26:05
だからバイナリデータは何に入れてるの?Array?
0631デフォルトの名無しさん2006/12/26(火) 14:28:14
>>628
16バイト長整数ならば >>616 で16バイト長のバイナリに変換できる。
変換したものはStringクラスのインスタンスだから、あとは >>627 のとおり。

>>626 の方法ならば一発で出来るが、7ビットにつき1ビット付加されて18バイト長になる。
0632デフォルトの名無しさん2006/12/26(火) 14:36:06
readでは配列になってますが、シフト演算で無理やり整数表現に
なおしています。数値演算では普通にBigintになってます。
それが書き込むときに文字列に変換されてしまうのが納得いきません。
数値をバイナリデータとして書き込みたいのです。
配列のデータにまた分解して格納しないといけないのでしょうか?
0633デフォルトの名無しさん2006/12/26(火) 14:37:45
だからまた分解してArrayにしてpackしろと上の方に書いてるじゃねーか。
wだと7ビットだからダメだけど。
0634デフォルトの名無しさん2006/12/26(火) 14:41:20
>>631
その方法を使っても(3)_10=(11)_2になって文字列で格納されるだけ
じゃないでしょうか?
writeが内部で文字列変換をしている以上バイナリデータを書き込む
のはwriteでは無理なんでしょうか?
0635デフォルトの名無しさん2006/12/26(火) 14:43:47
配列に分解してからパックしてみます。
0636デフォルトの名無しさん2006/12/26(火) 15:08:17
Rubyの文字列って、現在の実装では君の言うバイナリデータだぞ。
あと、readは配列を返すのではなく、バイナリデータを含む文字列を返す。


つーか、Stringから文字列とバイト列の概念を分離して、
OctetStreamクラスを新設してくれないかなあ。
その上でStringをUnicode化してくれると嬉々累々。
0637デフォルトの名無しさん2006/12/26(火) 16:05:47
>>636
今さらPythonの後を追えというのか?Matzのプライドはどうなるんだ?
0638デフォルトの名無しさん2006/12/26(火) 16:17:37
ff.write(array.pack("llllllll"))
こんなことしたら書けました。w
0639デフォルトの名無しさん2006/12/26(火) 16:20:36
>>637
pythonからパクるの得意じゃん
0640デフォルトの名無しさん2006/12/26(火) 16:28:01
どうせなら親Windowsな姿勢を真似てもらいたい
0641デフォルトの名無しさん2006/12/26(火) 16:35:59
だれかVistaでテストしてるのかねぇ。
0642デフォルトの名無しさん2006/12/26(火) 16:53:38
どうせならWindowsエロゲ組み込み言語シェアNo1とか目指してくれ
0643デフォルトの名無しさん2006/12/26(火) 16:57:30
言語のほうから目指す必要はないけど、
エロゲ開発者はトライしてみてもいいんじゃねーかな。
0644デフォルトの名無しさん2006/12/26(火) 17:13:58
rubyもマイクロスレッドをサポートしてくれる?
0645デフォルトの名無しさん2006/12/26(火) 18:12:38
638で解決したのは634であってるのか?
正直Cのことは一端全部忘れてからRubyの勉強をした方がいいよ。
まるっきり違うから。

>>644
マイクロスレッドでググったら弾幕系がトップだな。
普通のスレッドでもProcでも継続でもなんでも好きに使えばいいと思われ。
0646デフォルトの名無しさん2006/12/26(火) 18:30:47
>>645
知らないなら黙っていたほうが恥かかないぞ。
0647デフォルトの名無しさん2006/12/26(火) 18:36:05
>>646
それを自分に適用すると人生が少しは良くなるぞ。
0648デフォルトの名無しさん2006/12/26(火) 18:40:03
ファイルAのカラム1とカラム2(たとえば100行にそれぞれ違ったカラムの値があります)
ファイルBに行にあるカラム1とカラム2(たとえば100行にそれぞれ違ったカラムの値があります)


ファイルAの1行目のカラム1が、ファイルBのカラム1(全行)中に
ファイルAの1行目のカラム2が、ファイルBのカラム2(全行)中にあれば、
ファイルAの1行目の終わりに○という文字を付加します。ないなら空白のままです。

次にファイルAの2行目、3行目と次々にファイルB中にあるか確かめていきます。


このようなプログラムですと
まずファイルAの1行目をよみ、次にファイルBの行をつぎつぎと読み込んでいきますよね。

while filea=gets
.
.
while fileb=gets
.
.
end
.
.
end 

のようなプログラムになると思うのですが、内にあるwhile文のfileb=getsの中で
ファイルAのカラムA,B = ファイルBのカラムA,B
という条件判定をするのですが、これで一致した場合、内にあるwhile文を抜けたいのですが
この場合、どうやってwhile文を抜ければよいのでしょうか?
0649デフォルトの名無しさん2006/12/26(火) 18:44:10
内側のループ(bのループ)を抜けるなら素直にbreakすればいいんじゃないの?
外側だとひと工夫必要だが。
0650デフォルトの名無しさん2006/12/26(火) 19:02:50
645みたいなのは放っておいて、俺たちだけで遊ぼうな。
ttp://kumiki.c.u-tokyo.ac.jp/~ichiyama/mt/archives/000034.html
0651デフォルトの名無しさん2006/12/26(火) 21:51:39
勝手に遊んでろ
0652デフォルトの名無しさん2006/12/26(火) 21:54:52
WindowsXP上のEclipse3.2をLangegePackで日本語化して
RDT0.8.0(org.rubypeople.rdt-0.8.0.604272100PRD.zip)を導入しましたが、
Rubyスクリプトの動作はするものの、デバッグでブレークポイントで止めても、
変数が何も表示されません。
Rubyのバージョンはmswin版の1.8.2です。

似たような症状に悩んだ人はいませんか?
アドバイスをよろしくお願いします。
0653デフォルトの名無しさん2006/12/26(火) 22:54:04
>>650
callcc なんとなく分かった。
06546482006/12/26(火) 23:21:50
上は省略
up = File.open(output,"w")

while aline = file.gets
aline.chomp!
names, afirst, asecond, = aline.split(/\t/).values_at(0,1,2)
# afirstもasecondも数字が入る
moji = ""

while bline = file2.gets
bline.chomp!
bfirst, bsecond, = bline.split(/\t/)[0..1]
# bfirstもbsecondも数字が入る
if afirst = bfirst && asecond = bsecond
moji = "○"
break
end
end
up.print "#{names}\t#{afirst}\t#{asecond}\t#{moji}\n"
end

up.close


このようにしてプログラムを実行したところ
全ての行にmojiとして○がついています。
if文で一致する行だけ○をつけたつもりなのですが、どこがおかしいのでしょうか?
p afirst や p bsecond で確認したところ、ちゃんとsplitで分割されていました。
0655デフォルトの名無しさん2006/12/26(火) 23:49:03
>>654
if文の中、代入式になっておらんかね? しかも両方。

あと、while bline = file2.gets へ入る前に
file2.pos = 0 を加えたほうが無難そうだな。
0656デフォルトの名無しさん2006/12/26(火) 23:53:57
>>648
方法1. catchを使う
catch(:break) {
 while filea=.....
  while fileb=...
   throw if なんか抜けたい条件
  end
 end
}
http://www.ruby-lang.org/ja/man/?cmd=view;name=%C1%C8%A4%DF%B9%FE%A4%DF%B4%D8%BF%F4
のcatchの項を参照。

方法2.こうする
while filea=fa.gets && fileb=f.gets
 #なんかやる
end
06576482006/12/26(火) 23:54:50
>>655
posと== にして試してみたところ、今度はチェックの○が全てつかなくなってしまいました。

if afirst == bfirst && asecond == bsecond

これではおかしいのでしょうか??
0658デフォルトの名無しさん2006/12/26(火) 23:55:44
あ、ごめん、

throw if なんか抜けたい条件 (×)
throw :break if なんか抜けたい条件 (○)
0659デフォルトの名無しさん2006/12/27(水) 00:23:28
cgiでアップロードされた画像ファイルのサイズを変えたいと思い探してみました。
GCのライブラリは見つかりませんでした。
ImageMagickはRMagickというのが見つかりました。
とりあえず、RMagickを使うつもりですが、
他にどういう選択肢がありますか?
また、どういう方法が一般的な方法といえますか?
0660デフォルトの名無しさん2006/12/27(水) 00:42:22
GCじゃなくてGDだが・・・404だな。

それ以外だとたぶんRMagick、次点でRuby-GNOME2のGdk::Pixbufか。

拡張ライブラリは入れたくないけどImageMagickやnetpbmが入っている
のなら、コマンドを駆使して画像のサイズ変更は可能。
06616592006/12/27(水) 05:43:42
うわまちがった。GDですね。

>>660
次点でGDKですか・・・
このあたりのニーズはないんでしょうかね。
それとも、RMagickで事足りてるのか。
だとしたら、なんで標準ライブラリに含まれないのかなぁ。
RMagickインストールすんのめんどいので、コマンド駆使でがんばることにします。
ありがとうございました。
0662デフォルトの名無しさん2006/12/27(水) 09:34:29
俺も適当にコマンド呼ぶだけだな、そういう処理だと。
0663デフォルトの名無しさん2006/12/27(水) 09:34:57
漏れもサムネール作るためだけにRMagick入れるのはばかばかしいと
思うけど、今のところしかたねーなー。

Pure Rubyの画像処理ライブラリ↓
http://cappuccino.jp/keisuken/ruby/pureimage/
対応ファイルフォーマットがPNGのみだが、
Affine変換があるから拡大縮小に使えるかも。
0664デフォルトの名無しさん2006/12/27(水) 13:38:35
鬼門追加。画像処理。
0665デフォルトの名無しさん2006/12/27(水) 13:41:34
標準で画像処理できるスクリプト言語って何だろう。
Pythonにはあったよね、たしか。あれ、SGI依存だったかな???


0666デフォルトの名無しさん2006/12/27(水) 13:44:54
>>664
誰にとっても鬼門というわけではなかろう。
ライブラリをインストールできる権限があれば別に。
0667デフォルトの名無しさん2006/12/27(水) 13:47:47
Pythonには、SGI(Irix)固有のglモジュール以外に、jpegのモジュールも
あるようだが、圧縮/伸張のみだから、画像処理とは言い難いか。
0668デフォルトの名無しさん2006/12/27(水) 14:16:03
Python ユーザなら普通PIL使うだろ。
ttp://www.pythonware.com/products/pil/
0669デフォルトの名無しさん2006/12/27(水) 14:33:19
いや、Rubyの鬼門とか言ってるから標準付属品の話をしてるわけだが。
0670デフォルトの名無しさん2006/12/27(水) 14:52:59
ImageMagickしか選択肢がないってのが問題じゃないの?
0671デフォルトの名無しさん2006/12/27(水) 15:07:44
RMagickが多機能すぎて困ってるというなら分かるかも。
0672デフォルトの名無しさん2006/12/27(水) 15:24:23
GDでいいじゃん
0673デフォルトの名無しさん2006/12/27(水) 15:25:09
ImageMagickってメモリリークしたりクラッシュしたりってのが、
いつまで経ってもおさまらないじゃん。もっとマシなのが欲しい。
0674デフォルトの名無しさん2006/12/27(水) 20:05:53
>>673
どうせ大半の人はサムネールの作成ぐらいしか使わないから。
0675デフォルトの名無しさん2006/12/27(水) 23:14:46
>672
だから404なんだぜ?
0676デフォルトの名無しさん2006/12/28(木) 00:13:53
簡単な拡大縮小くらいならsdl使えるんじゃ?
■ このスレッドは過去ログ倉庫に格納されています