トップページ⇒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
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使えるんじゃ?
0677デフォルトの名無しさん2006/12/28(木) 01:10:07
404、とは書いたがRAAのキャッシュには残ってるな

そこまでしてRuby-GDにこだわる理由はと言われると別にないのだが
0678デフォルトの名無しさん2006/12/28(木) 09:38:49
このプログラムの実行結果が毎回違うのですが、
これって正しいことですか?
毎回同じ結果になることを期待していたのですが…
Fedora Core 4/ruby-1.8.5-p12です。

thread_ary = []
n = 0
10000.times do |i|
thread_ary << Thread.new(i) { |i2| n += i2 }
end

thread_ary.each do |th|
th.join
end

p n
0679デフォルトの名無しさん2006/12/28(木) 09:56:06
>>678
n += i2 の部分を排他ロックしてないからだろ
0680デフォルトの名無しさん2006/12/28(木) 10:17:37
>>679
Mutexで排他ロックすると、うまくいきました。
Rubyの1行の文はアトミックだと勘違いしていました。
0681デフォルトの名無しさん2006/12/28(木) 12:47:22
>Rubyの1行の文はアトミックだと勘違いしていました

すげえ勘違いのしかた。一体何をどう考えたら1行の文が...
0682デフォルトの名無しさん2006/12/28(木) 16:44:57
>>681
調べてみると、同じような話が出ていました。
ttp://www.atdot.net/~ko1/w3ml/w3ml.cgi/yarv-dev/msg/651
0683デフォルトの名無しさん2006/12/28(木) 18:45:23
678はむしろ、単純にロックし忘れてたんだろ。
もしアトミックだと勝手に想定して、あえてロックしなかったのなら性格に問題ありそう。
0684デフォルトの名無しさん2006/12/28(木) 19:05:46
>>683
Rubyコミュニティーの気持ち悪さを表現した、素晴らしいレスですね
0685デフォルトの名無しさん2006/12/28(木) 19:32:48
net/httpを利用してhtmlを読む際に
body部にてsrcで呼ばれたjavascriptを実行することは可能でしょうか?

もしあればご教授のほど宜しくお願いします。
0686デフォルトの名無しさん2006/12/28(木) 19:50:55
>>685
誰がJavascriptを解釈するの?
0687デフォルトの名無しさん2006/12/28(木) 20:16:04
>685
JavaScriptは普通ブラウザが解釈し実行する
クライアントサイドのスクリプト。

だから単純にscriptタグを出力すればOK。

…JScriptインタプリタを使って
CGIとして実行するなら話は全く別だが。
0688デフォルトの名無しさん2006/12/28(木) 20:37:16
意味わかってないなら答えないほうがいい
0689デフォルトの名無しさん2006/12/28(木) 20:43:55
性格の悪いひとたちばかりですね
0690デフォルトの名無しさん2006/12/28(木) 22:38:43
頭の悪いひとたちにはそう見えるらしいですよ
0691デフォルトの名無しさん2006/12/28(木) 23:54:11
プログラム書いたら、
Segmentation fault
となりました。
これってどういう意味ですか。
0692デフォルトの名無しさん2006/12/29(金) 00:13:13
>691
Segmentationに関するfaultだよ。字の通り見たまんま。

解消する方法は当の「プログラム」と実行環境が分からんと誰も答えようがないと思われ
0693デフォルトの名無しさん2006/12/29(金) 00:20:10
>>691
Rubyのバグをたまたまそのプログラムが突いてしまったということ
あるいは外部ライブラリとつなげたものならそれが悪さしてる可能性もある
前者なら報告した方がいい希ガス
0694デフォルトの名無しさん2006/12/29(金) 00:22:17
>>692-693
レス、ありがとうございます。
windows2000の上で動かしている
VineLinuxの中でOpenGLと
一緒に使っています。
0695デフォルトの名無しさん2006/12/29(金) 05:04:53
バグをついたのが「たまたま」なら、
ちょっとプログラム変更すれば
動くようになるんじゃない?
0696デフォルトの名無しさん2006/12/29(金) 05:22:48
そうしてみます。
0697デフォルトの名無しさん2006/12/29(金) 15:32:30
1.8.5になってからワンライナーが書きづらくなったなぁ。

>ruby -ve "puts '%02X' % 10"
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32]
-e:1: warning: too many arguments for format string
X #=> 本当は 0A と表示されて欲しい

% + 数字 がまずいみたいだね。
0698デフォルトの名無しさん2006/12/29(金) 15:35:53
およ、うちではこうなるが。

% ruby -ve "puts '%02X' % 10"
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-darwin]
0A
0699デフォルトの名無しさん2006/12/29(金) 17:19:20
>>697
WindowsXP+CMD.EXE+ASR1.8.5.5
だと
0A
ですよ。
VMWare上なんでコピペできんが。
環境はどういう感じ?
07006972006/12/29(金) 20:07:30
>>698-699
ごめん。Rubyは悪くなかった。

cmd.exeで実行したら正しい結果が得られた。
nyacus上で実行してたんだけど、nyacusが%xxを展開してたみたいだ。
07016872006/12/30(土) 04:35:57
>688
ん、俺何か勘違いしてる?
真面目に何を間違えたのか判らん
0702デフォルトの名無しさん2006/12/30(土) 11:40:57
急に「なんかわかってるフリ」をしたくなっただけでしょwきにすんな
0703デフォルトの名無しさん2007/01/02(火) 02:05:47
しかし、PHPは言語として(ry
0704デフォルトの名無しさん2007/01/02(火) 02:55:33
洗練されている?
0705デフォルトの名無しさん2007/01/02(火) 06:29:32
PHPは言語として最悪だろヴォケ
0706デフォルトの名無しさん2007/01/02(火) 06:35:27
Perlよりはマシw
0707デフォルトの名無しさん2007/01/02(火) 08:37:25
Perlは無理やり色々機能追加せず
昔のままシンプルだったらよかったのにね。
0708デフォルトの名無しさん2007/01/02(火) 08:55:06
Perl も PHP も言語として最悪と分かっていつつも
使わざるを得ない現状が何ともね。
0709デフォルトの名無しさん2007/01/02(火) 10:11:00
Rubyに乗り換えずにPerl使い続けてる奴って、
ラリーのいう「無精」が悪い方に出たクズとしか言い様がないな。
0710デフォルトの名無しさん2007/01/02(火) 10:28:34
まあ、Rubyが下手にPascalに近い文法を採用したから、C/C++修得者の受けが悪いという気はする。
C/C++修得者にとっては、PHPの方が受け入れやすいよなやっぱり。
0711デフォルトの名無しさん2007/01/02(火) 10:57:07
Delphi使ってる俺から言わせると、RubyがPascalみたいだなんて、到底思えないが。
C文法しか使えない(というか、こだわってる)奴のたわごとにしか聞こえないよ
0712デフォルトの名無しさん2007/01/02(火) 10:59:25
すげえたわごと来た
0713デフォルトの名無しさん2007/01/02(火) 11:16:16
まぁ、「〜にしか」見えなかったり聞こえなかったりするときは
「仮説が一つしか浮かばない自分の思考はどこかで猪突猛進してる」と思ったほうがいいかな
0714デフォルトの名無しさん2007/01/02(火) 12:05:10
PHPはLightweight Lesser Language。
でも実際は言語なんかどうでもよくて
研鑽しないプログラマの存在のほうが
現実には悪な場合が多い。
0715デフォルトの名無しさん2007/01/02(火) 12:11:48
>>714
perlと一緒ジャン
やっぱ、Ruby使ってる人は、勉強する人ばかりだよね

>>715
はいはい、選民思想乙
07167102007/01/02(火) 14:21:36
>>711
いや、俺もデスクトップアプリはDelphiもBCBも使うからそう思うんよ。
例外処理の書き方とかさ
0717デフォルトの名無しさん2007/01/02(火) 14:44:41
>>716
711様がC文法しか使えない奴のたわごとにしか聞こえないって言ってるんだから
お前はC文法しか使えない奴なんだよ。ごまかすなクズ。
0718デフォルトの名無しさん2007/01/02(火) 14:46:02
Pascalみたいだってのはendがあるからでしょ。
そこからちょっとでも踏み込んで調べてみたら、
そんな印象なんか吹き飛ぶだろうに。
0719デフォルトの名無しさん2007/01/02(火) 16:04:02
なんでそんなにPascalの影響を否定するのに必死なんだこいつら
0720デフォルトの名無しさん2007/01/02(火) 16:07:12
C文法しか使えない奴のたわごとにしか聞こえないからだよ。
0721デフォルトの名無しさん2007/01/02(火) 18:32:49
PHP で何気なく
while(($c = fgetc($fp)) != EOF){
hogehoge;
}
って書いたら無限ループw
0722デフォルトの名無しさん2007/01/02(火) 18:36:06
Ruby で時々
if(fugafuga){
}
って書いて唖然とするときがある
0723デフォルトの名無しさん2007/01/02(火) 18:55:19
うっかりなら
if
  hogehoge
else
  fugafuga
endif
これやってしまう
0724デフォルトの名無しさん2007/01/02(火) 19:16:01
PascalがのブロックがCとRubyどっちに近いかっつーと
断然Cに近いんだがなぁ
0725デフォルトの名無しさん2007/01/02(火) 19:38:17
Pascalはencに.が付いたり付かなかったり
行末に;が付いたり付かなかったり
ソースを一回書いて終わりならいいんだけど
後からのメンテに面倒臭さを感じる
コンパイラに人間があわせてる感じがする
0726デフォルトの名無しさん2007/01/02(火) 19:40:57
個人的にはPascalの書きにくさを解消したのがCだと思ってるけど
0727デフォルトの名無しさん2007/01/02(火) 19:43:11
そのうち
if 〜 begin
end else begin
end
って書くようになったりするw
■ このスレッドは過去ログ倉庫に格納されています