Ruby 初心者スレッド Part 49at TECH
Ruby 初心者スレッド Part 49 - 暇つぶし2ch1:デフォルトの名無しさん
12/05/09 05:04:47.69
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ

前スレ
Ruby 初心者スレッド Part 48
スレリンク(tech板)


るりまサーチ (リファレンス検索)
URLリンク(rurema.clear-code.com)

Rubyist Magazine - るびま
URLリンク(jp.rubyist.net)

逆引きRuby
URLリンク(www.namaraii.com)

2:デフォルトの名無しさん
12/05/09 05:17:50.97
【RoR】Ruby on Rails Part14
スレリンク(php板)
【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)

書籍:ほぼ公式
「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」 (プログラミング自体が初めてでない人向け)
URLリンク(www.amazon.co.jp)
「初めてのRuby」 (同上)
URLリンク(www.amazon.co.jp)
書籍:紙のマニュアルに相当
「Rubyレシピブック 第3版 303の技」(脱初心者向け基礎テクニック集、1.9対応)
URLリンク(www.amazon.co.jp)
「プログラミングRuby 第2版 言語編」(初心者向け参考書)
URLリンク(www.amazon.co.jp)

現在、1.8 系列の最新である Ruby 1.8.7 と 1.9 系列の最新である Ruby 1.9.3 の2系統が存在。
肝心な部分がわりと違い、プログラムはそのままでは動作せず、予備知識も別個。
1.8 用のスクリプトやライブラリは 1.9.3 では動作しないので注意。
1.9.3 用の教科書があるなら 1.9.3 から始めても構わない。

Windows用Rubyは、Ruby以外のものもあらかた入っているActiveScriptRubyと
URLリンク(www.artonx.org)
RubyだけインストールされるRubyInstallerの2種類存在。
URLリンク(rubyinstaller.org)
Rubyリファレンスマニュアル chm版リミックス
URLリンク(ruby.morphball.net)

3:デフォルトの名無しさん
12/05/09 05:19:24.03
Ruby 1.9.3-p194 リリース
URLリンク(www.ruby-lang.org)

4:デフォルトの名無しさん
12/05/09 06:14:32.82
・ いつものエディタとターミナルという普段着でお越し下さい
・ エディタ初めてならRubyスクリプトをを着色してくれる(できればオートインデントの)エディタ好きなの選べ
・ いわゆるIDEはRubyの学習に際しては恐ろしくコスパが悪いのでRubyのためだけに新規導入するのはお勧めしない

Q. XXX を使ってるんですが Ruby も覚えたほうがいいんでしょうか?
A. 好きにしろ

5:デフォルトの名無しさん
12/05/09 10:20:59.60
※RubyやRuby使いに対する不満や愚痴などは本スレやバトロワスレなどをご利用下さい

6:uy
12/05/09 11:06:06.87
Cで作ったDLLライブラリで
double型を返す関数や、double型の引数を取る関数を
Rubyから呼び出すにはどうすればいいんでしょうか?><
INTしか受け取れません
p Win32API.new("Lib.dll", "_RadToDeg", "i", "i").call 30


7:デフォルトの名無しさん
12/05/09 11:42:48.25
Ruby/DLを使えばいいんでは。

8:uy
12/05/09 11:54:38.08
ありがとうございます 読めました

9:デフォルトの名無しさん
12/05/09 21:58:15.29
クラスでインスタンスした時のものなんだが
#<Hoge:0x0000000c9c12e0>
0x0000000c9c12e0ってアドレスの値ですか?

10:デフォルトの名無しさん
12/05/09 22:24:20.75
Object#to_s のデフォルトは
sprintf("#<%s:%p>", cname, (void*)obj)
みたいな感じなので、ポインタ値。
大抵のポインタの実装はアドレス丸出しなのでアドレスと思ってよいでしょう。


11:デフォルトの名無しさん
12/05/10 10:55:36.60
数値を'hoge'に変換(例:2=>'hoge')するんだけど、ただし<>内に含まれている数値は
対象外にする。
変換対象の文字列は13<aa12><444>1なかんじで
正規表現でhogehoge<aa12>hogeにしたい。

そのような正規表現はどう作ればいいのですか?
うまくいかない

12:デフォルトの名無しさん
12/05/10 10:58:54.38
すいません上の例は
13<aa12><444>1 の文字列を hogehoge<aa12><444>hoge
に変換です。
宜しくお願いします。

13:デフォルトの名無しさん
12/05/10 11:22:23.09
'13<aa12><444>1'.gsub(/<.*?>|(\d)/){$1 ? 'hoge' : $&}
=> "hogehoge<aa12><444>hoge"

<>のネストが無いならこうかな?


14:デフォルトの名無しさん
12/05/10 13:30:15.01
File::statで質問です。
File::stat#modeでファイルモードが返ってきますが,
6桁の数字のうち上位3桁の意味が分かりません。
「040755」となっている場合,多分下3桁はいわゆるrwxのことだと思うのですが,
040についてどうやって調べればいいのか。
おこたえいただけるとうれしいです。


15:デフォルトの名無しさん
12/05/10 13:45:17.74
>>14
man stat(2)
って言ったらわかる?

16:14
12/05/10 14:02:03.49
>>15
ありがとうございました。わかりました。
6桁ではなく7桁でしたね。040はディレクトリということがわかるようになりました。

17:デフォルトの名無しさん
12/05/12 03:05:20.98
Googleで「ぬるぽ」と検索するスクリプトを書いてみたのですがうまくいきません
ここからどうすればいいのでしょうか?



# encoding: utf-8

require "net/http"
require "uri"
require 'nkf'

uri = URI.parse('URLリンク(www.google.co.jp)')

res = Net::HTTP.post_form(uri, 'q' => 'ぬるぽ')

puts NKF.nkf("-sm0W8x", res.body)

18:デフォルトの名無しさん
12/05/12 03:13:48.21
>>17
ガッ

19:デフォルトの名無しさん
12/05/12 07:29:23.22
メッセージがわかりにくいとはよく言われるが、Rubyはそこまで意地悪ではない
こちらから聞きさえすれば、いちおうのヒントは教えてくれる

p res #=> #<Net::HTTPMethodNotAllowed 405 Method Not Allowed readbody=true>

ということで、URLリンク(www.google.co.jp) は POST を受け付けていない(というかURL間違ってる)。/search に対して GET 送れ
あと、net/http は uri ライブラリを既に呼んでいるので require 'uri' は不要
Ruby1.9.x 専用なら NKF もたぶんいらない

# encoding: utf-8
require "net/http"
uri = URI.parse(URI.encode('URLリンク(www.google.co.jp)ぬるぽ&ie=utf-8&oe=shift_jis'))
res = Net::HTTP.get(uri)
res.force_encoding('CP932')
puts res.scan(/<title>(.+?)<\/title>/).flatten[0]

Hash で書くだけで適当に GET 用の URL エンコード(www-form-urlencodedではない)してくれる方法は誰か偉い人が教えてくれるはず

20:17
12/05/12 11:52:25.48
ありがとうございました。

「ぬるぽ」だとinvalid multibyte charが出たので「nullpo」にしてみたら

nullpo - Google 検索 と出てきました

21:デフォルトの名無しさん
12/05/12 11:56:57.91
>>20
なぜShift_JISで保存した

22:デフォルトの名無しさん
12/05/12 12:01:35.44
# encoding: utf-8
は、このファイル「が」 UTF-8 で書かれているという意味の指示記述
UTF-8 「を」読み込むとか UTF-8 「で」表示するという意味ではない

このファイル「が」 UTF-8 で書かれていないのなら、UTF-8 以外を指定するべきだな
Windwos のようだから、 CP932 が妥当なのか

23:デフォルトの名無しさん
12/05/12 12:57:12.99
Windows-31Jディスってんの?

24:uy
12/05/12 12:58:12.30
マジレスするとわざわざrequire "net/http" でやりたいとかじゃなければ
Mechanizeでやったほうが999999999倍マシ

25:デフォルトの名無しさん
12/05/12 16:11:33.32
将来iconvを使う羽目になったときに、CP932という名前ならほぼ確実にどこででも使えるけどWindows-31Jは使えないことがある
さらにWindows-31Jは若干名前の筋が悪くて、Encoding::CP932 はそのまま書けるんだけど Encoding::Windows-31J は定数としてそのままアクセスできない

irb> Encoding::CP932
=> #<Encoding:Windows-31J>
irb> Encoding::Windows-31J
SyntaxError: (irb):2: syntax error, unexpected tCONSTANT, expecting $end
irb> Encoding::Windows31J
NameError: uninitialized constant Encoding::Windows31J
irb> Encoding::Windows_31J
=> #<Encoding:Windows-31J>

だから少なくとも初心者スレでは一貫してCP932という言葉を使う
本来のShift_JISとCP932とWindows-31Jの差異については、歴史的経緯を紐解かなければならなくなったら自分で調べるだろう

26:デフォルトの名無しさん
12/05/12 18:16:14.52
URLリンク(takobouzu.la.coocan.jp)競馬時計分析のアプローチ(3)/

この解説のスクリプトを起動したいのですが
下部のソースコードを起動しても

:2: syntax error, unexpected '<'
<p> </p>
^
:3: unknown regexp option - p
:4: syntax error, unexpected '<'
<p> log.info("調教時計抽出開始")</p>

:5: unknown regexp option - p
:6: syntax error, unexpected '<'
<p>outfile1 = open(outdirectory + "\\" + "調教時計.txt", "w")</p>
^
:7: syntax error, unexpected $undefined, expecting $end
...[0-9][0-9][0-1][0-9][0-3][0-9]\.lzh$/ =~ |hafi|ename then ...

と出てうまく起動しません
エラー文を調べたところ構文エラーらしいのですが
どう直せばよいのでしょうか?

27:デフォルトの名無しさん
12/05/12 18:30:22.85
つまりRubyの知識ゼロの状態ってことか
なんかlzhのデータファイルが別途必要なんだけどそれはあるのね
lzhコマンドも必要だけどインストールしてあるのね

HTMLの<p>タグを取り除いてRubyスクリプトとして適切に改行を揃えればいいんだけど、たぶんそれを自力でできるほどの知識がないのよね
レスとして貼るには長いな

28:デフォルトの名無しさん
12/05/12 18:31:20.03
とりあえず <p> </p> を全部消せ。話はそれからだ。


29:デフォルトの名無しさん
12/05/12 18:35:17.44
>>27
大学でCなんかはかじったレベルなんですが
Rubyは触った事無いです・・・これを機に少し勉強しようかなとも思ってます。

lzhはデータファイルはinフォルダに格納してあります。
解凍にLHAが必要ということでLHA32をダウンロードしています。
コマンドプロンプトで実行したところ解説ページと同バージョンでした。

>>28
ありがとうございます。
とりあえずTerapadで<p>タグを消して改行して揃えてみます。

30:デフォルトの名無しさん
12/05/12 18:38:14.20
>>28
やってみるとわかるけど、それだけでは動かない
コメント避けて改行つけないといけない

31:デフォルトの名無しさん
12/05/12 18:47:22.59
<p>タグを消して改行したところ
エラーは消えました。
今度は3行目でsyntax error, unexpected tIDENTIFIER, expecting $endと出ました。
改行コードがダメらしいんですね。 難しいです

32:デフォルトの名無しさん
12/05/12 18:51:25.19
# -*- coding: cp932 -*-
require 'logger'
log = Logger.new(STDOUT)
log.level = Logger::DEBUG
log.info("調教時計抽出開始")
indirectory = "C:\\調教時計分析\\in"
workdirectory = "C:\\調教時計分析\\work"
outdirectory = "C:\\調教時計分析\\out"
outfile1 = open(outdirectory + "\\" + "調教時計.txt", "w")
Dir::foreach(indirectory) {|lhafilename|
next if lhafilename == "." or lhafilename == ".."
if /^kd3_hb[0-9][0-9][0-1][0-9][0-3][0-9]\.lzh$/ =~ lhafilename then
#KOLデータパックファイルをLHA解凍
cmd = "lha32 x -nc " + indirectory + "\\" + lhafilename + " " + workdirectory + "\\"
system(cmd)
open(workdirectory + "\\" + "kol_den2.kd3") {|file|
while line = file.gets
record = line.force_encoding('ASCII-8BIT')
#レースID組み立て
case record[0,2]
when "00" then raceid = record[12,8] + "08" + record[6,6] + record[23,2] #京都
when "01" then raceid = record[12,8] + "09" + record[6,6] + record[23,2] #阪神
when "02" then raceid = record[12,8] + "07" + record[6,6] + record[23,2] #中京
when "03" then raceid = record[12,8] + "10" + record[6,6] + record[23,2] #小倉
when "04" then raceid = record[12,8] + "05" + record[6,6] + record[23,2] #東京
when "05" then raceid = record[12,8] + "06" + record[6,6] + record[23,2] #中山
when "06" then raceid = record[12,8] + "03" + record[6,6] + record[23,2] #福島
when "07" then raceid = record[12,8] + "04" + record[6,6] + record[23,2] #新潟
when "08" then raceid = record[12,8] + "01" + record[6,6] + record[23,2] #札幌
when "09" then raceid = record[12,8] + "02" + record[6,6] + record[23,2] #函館
end

33:デフォルトの名無しさん
12/05/12 18:52:06.45
#追切調教情報格納位置の確定
tp = 256
if record[490,1] == "1" then
tp = 490
else
if record[373,1] == "1" then
tp = 373
else
if record[256,1] == "1" then
tp = 256
end
end
end
#追切調教情報の取得
baba = record[tp + 25, 2] #馬場
basho = record[tp + 17, 6] #場所
course = record[tp + 23, 2] #コース
ashiiro = record[tp + 70, 6] #脚色
time_5f = record[tp + 45, 6] #5F
#調教時計レコードの組み立て
outrec1 = " " + basho #場所
outrec1 = outrec1 + " " + course #コース
outrec1 = outrec1 + " " + ashiiro #脚色
outrec1 = outrec1 + " " + baba #馬場
outrec1 = outrec1 + " " + time_5f #5F
#調教時計レコードをファイル出力
outfile1.puts(raceid + "," + outrec1)
end
}
end
}


34:デフォルトの名無しさん
12/05/12 18:53:13.72
#終了処理
outfile1.close
log.info("調教時計抽出終了")

# この上の空行まで

>>32-34
のスクリプト部分をてきとうにエディタにコピペ

35:デフォルトの名無しさん
12/05/12 19:11:21.03
>>32-34
ありがとうございます!
早速実行しましたが
:16: in `initialize' : No such file or directory - C:\調教時計分析\work\kol_den2.kd3 (Errno::ENOENT)

と出ました。自分なりに色々しらべてみようと思います。

36:デフォルトの名無しさん
12/05/12 19:52:56.34
調べたら

inフォルダにあるlzhファイルを解凍
解答したファイルをworkフォルダに格納

これが出来てないんですね・・・
この場合どこを見ればいいんでしょうか?

37:デフォルトの名無しさん
12/05/12 20:05:41.55
全部がみっちり結合してるからテストできないんだな
こんなスクリプト作ったらいかんよ

system(cmd) を
p cmd; system(cmd)
に書き換えて、文字列 cmd が lha32 のコマンドラインとして妥当かどうか確かめるのが妥当かなあ

38:デフォルトの名無しさん
12/05/12 20:24:14.44
>>37
同じエラー文が返って来ました。
コマンドラインとして妥当ではないということなのでしょうか?

39:デフォルトの名無しさん
12/05/12 20:32:20.05
関数的メソッド p は引数のオブジェクトを適当に表示する
p cmd で変数 cmd の内容が標準出力に表示されたはずだ
system() は引数の文字列をそのままシェルに渡す
シェルに渡されるはずだった cmd はコマンドラインとして妥当なものだったか? ディレクトリ指定などは誤ってないか?

ということを聞きたかったのだと思われる

40:デフォルトの名無しさん
12/05/12 20:58:26.89
lzhファイルが置けてないとか?これ実行して出力貼ってみ

# -*- coding: cp932 -*-
require 'pathname'
indirectory = "C:\\調教時計分析\\in"
workdirectory = "C:\\調教時計分析\\work"
outdirectory = "C:\\調教時計分析\\out"
abort "エラー [#{indirectory}]がない" unless Pathname(indirectory).directory?
abort "エラー [#{workdirectory}]がない" unless Pathname(workdirectory).directory?
abort "エラー [#{outdirectory}]がない" unless Pathname(outdirectory).directory?
lzhfound = false
Dir.foreach(indirectory) do |file|
if file =~ /.*\.lzh$/
lzhfound = true
if file =~ /^kd3_hb[0-9][0-9][0-1][0-9][0-3][0-9]\.lzh$/
p "lha32 x -nc " + indirectory + "\\" + file + " " + workdirectory + "\\"
else
puts "エラー [#{file}] は名前がおかしいかも"
end
end
end
puts "エラー lzhファイルが[#{indirectory}]に入ってない " unless lzhfound
puts `lha32` rescue abort "エラー lha32がちゃんとインストールされてない"

41:デフォルトの名無しさん
12/05/12 21:01:08.39
>>39
"lha32 x -nc C:\\調教時計分析\\in\\kd3_hb110105.lzh C:\\調教時計分析\\work\\"

というコマンドラインが出力されました。
解凍する対象のlzhファイルと
解凍後のフォルダの格納位置を指定していると思うのですが
このフォルダ指定は合ってます。
ということはうまく解凍されていないということなんでしょうか・・・?

42:デフォルトの名無しさん
12/05/12 21:02:45.58
>>40
エラー lha32がちゃんとインストールされてない
と出ました。インストールミスのようですね・・・もういっかい確認してきます

43:デフォルトの名無しさん
12/05/12 21:09:52.99
解説ページに
コマンドプロンプトから「LHA32」を実行してバージョンが2.67.00であることを確認する。

という一文があって
実際にLHA32を入力するとLHA32 version 2.67.00 for test と出ます。
もしかしてこれだけではインストールされていないんでしょうか?

44:デフォルトの名無しさん
12/05/12 21:18:18.52
コマンドプロンプトからだけパスが通ってることってあるのかな?
OS再起動したら直るかもしれない
手元のマシンにはlha32インストールできないから俺はこれ以上ワカンネ

45:デフォルトの名無しさん
12/05/12 21:24:57.95
実際にはパス通ってないんだろ
lha32.exe のあるディレクトリで lha32 と入力すればそりゃ動く

インストール後はコマンドプロンプト流用せずに一旦全部閉じろ

46:デフォルトの名無しさん
12/05/12 21:32:55.41
>>44
再起動してみました上手くいきませんでした・・・

>>45
すいませんやり方を詳しくお願い出来ますか?

47:デフォルトの名無しさん
12/05/12 23:37:29.57
lha32って普通に落としてEXEクリックでインスコされなかったっけ?

48:uy
12/05/13 04:16:39.17
Lhaz使わない奴なんていんの

49:デフォルトの名無しさん
12/05/13 07:09:02.38
CENTOSのruby 1.9.3p194で、gem install rvm をやると

/usr/lib/ruby/1.9.1/yaml.rb:56:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
ERROR: Could not find a valid gem 'rvm ' (>= 0) in any repository
ERROR: Possible alternatives: rvm, rVM
ってなる。

yaml-0.1.4はインストールしてるんだけど・・
なんで?

50:デフォルトの名無しさん
12/05/13 08:58:44.48
Rubyが糞だから
答えは簡単

51:デフォルトの名無しさん
12/05/13 09:13:48.12
>>49
libyaml-devel 相当が必要
CentOS 標準では提供されてないので、epel を有効にしないといけない
openssl-devel と zlib-devel と readline-devel と gdbm-devel あたりも入れとけ

52:デフォルトの名無しさん
12/05/13 09:30:01.19
>>47
lha32はいろいろバージョンがあるからなあ
自動でパス設定しないものもあるかもしれん
どのディレクトリでもlha32が使えるのなら、Rubyからでもlha32は使えるはず
最悪な場合はlha32.exeを直接ダブルクリックしてるのかもしれんし

53:デフォルトの名無しさん
12/05/13 09:36:23.98
>>46です。
環境変数でpathをちゃんと指定しなかったのがどうやら原因だったみたいです。
設定後は無事スクリプトが起動しました。
お手数をかけて申し訳ありませんでした。
スクリプトを見て頂いたり原因を探ってくれた方々本当にありがとうございました!

54:uy
12/05/14 06:48:13.19
ハッシュに複数ハッシュを追加したいんですけど
storeだと1個ずつしか追加できません
何かいい方法あればおしえてください
(ちなみにaのハッシュをbで上書きしたいです)

a={ x:2 , y:8 }
b={ x:3 , y:4 , z:6}




55:デフォルトの名無しさん
12/05/14 07:49:31.27
uy君ほどの人がupdateやmergeを知らないってどういう事なの

56:uy
12/05/14 08:01:20.33
>>55
すみません
ボケていました
marge使った事ありました
知らないわけではなかったです
ありがとうございました

57:uy
12/05/14 08:19:07.28
mergeな

58:デフォルトの名無しさん
12/05/14 08:53:05.45
uyは変態だからしょうがない

59:デフォルトの名無しさん
12/05/14 08:55:23.80
>>51
最新のlibyamlを自前コンパイルしてしまうというパターンも多いみたいね

60:デフォルトの名無しさん
12/05/14 11:38:02.02
>>51
有難う、でけた

61:デフォルトの名無しさん
12/05/14 15:13:31.79
お前ら初心者スレなのに高度すぎ。


62:デフォルトの名無しさん
12/05/14 20:53:27.72
nokogiriとかanemoneとか便利だけど、
これってRubyの開発者が用意したプラグインみたいなもんなの?


63:デフォルトの名無しさん
12/05/14 20:57:36.92
第三者が勝手に作って公開しているライブラリ
個々にやると使うのめんどくさいのでgemという系統立てたシステムに乗っけるのが主流

"信用できない"のなら使うべきではない、特にバイナリ

64:デフォルトの名無しさん
12/05/15 01:34:25.64
なるほど、公式じゃないのに簡単に取り込めるとは便利ですな。
WordPressのプラグインみたいにネットにアクセスしてダウンロードする機能があったら、
ソフト自体も軽くなって更に便利だろうに。バージョンアップも対応できるし。

65:デフォルトの名無しさん
12/05/15 09:17:23.11
何を言ってるの?

66:デフォルトの名無しさん
12/05/15 11:02:22.19
Array#indexメソッドで * などの正規表現を使うことはできないようなのですが、

配列から正規表現を使って一致する要素を抽出したい時は
each などを使って1つずつチェックしていく方法が普通なのでしょうか?

67:デフォルトの名無しさん
12/05/15 11:21:52.95
なんか毎回書いてる気がするが、とりあえずArrayとHashとStringとEnumerableのメソッドは1行の動作説明だけでも読んでおくといい
「そういえばどっかにそんな処理のできるメソッドがあった気がする」とわかるだけでかなり違う

というわけで Array#grep か Array#find_all あたりを使え

68:デフォルトの名無しさん
12/05/15 11:55:57.90
>>67
Array#grepなんて便利なのがあったのですね。
ありがとうございます。

69:デフォルトの名無しさん
12/05/15 12:13:24.78
rubyをフルパス指定した時と、ただrubyとした時で動作が違うって事ある?

同じコンソール(同一ユーザ、同一環境)で、ruby -vと/usr/bin/ruby -vだと
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]で同じ結果。

Hello worldのtest.rbを動かすと、「ruby test.rb」では正常にHello world出力。
フルパスで「/usr/bin/ruby test.rb」だとLoadErrorになるけど、
何回かやるとメッセージを変化させながら最後は正常に動く。
/usr/bin/ruby: No such file or directory -- Dg (LoadError)
/usr/bin/ruby: No such file or directory -- -ggdb (LoadError)
/usr/bin (LoadError)ch file or directory -- DW

一回動くとまたLoadErrorになって何回かやるとメッセージが少しづつ変化しながら最後は動くの繰り返し。
フルパスでなく、「ruby test.rb」なら何の問題もない(ように見える)

こんな事ってあるの?

70:デフォルトの名無しさん
12/05/15 12:14:42.83
Rubyのマジックコメントについて質問なんですが
open("file.rb","w"){|f|
f.print "test".toutf8
}
こんな感じにファイルを保存した時って、文字コードはUTF-8Nになっていますが
ここで保存したfile.rbをそのまま実行しようとすると
invalid multibyte char (US-ASCII)
などとでてしまいます
なので後からエディタで開いて文字コードをUTF-8NからUTF-8にすると、動きます

それか、または書かれてる文字コードはUTF-8N
だとしても、以下のようなマジックコメントを入れるだけでも動くんですけどこれでも平気ですか?
# -*- encoding: UTF-8 -*-


あとRubyは結局、UTF-8NじゃなくてUTF-8でソースコードを書くんですよね?
.toutf8メソッドがUTF-8Nに変換してしまうのは何故ですか?

71:デフォルトの名無しさん
12/05/15 12:33:30.27
ある
平気

72:デフォルトの名無しさん
12/05/15 12:40:50.12
少し自分で調べなおしてみました
>>70で言ってたのは逆でした、RubyはUTF-8Nで書くんですね
Rubyの
# -*- encoding: UTF-8 -*-
は、暗黙的にutf-8nをさしていて、
UTF-8Nで保存したソースファイルでマルチバイト文字を使う為には
絶対に # -*- encoding: UTF-8 -*- を入れないとエラーになるって事でいいのでしょうか?

ここでまた1個疑問が出てきてしまったんですけど、
UTF-8で保存した時に、マジックコメントなしでもマルチバイト文字が使えちゃうのは、
何か意味があるんでしょうか?

73:デフォルトの名無しさん
12/05/15 12:43:46.20
UTF-8Nという表現自体が不適切だ
UTF-8にはもともとBOMは存在しない
UTF-8とBOMつきUTF-8という列挙が妥当
BOMつきUTF-8をUTF-8と呼ぶのは意思疎通上たいへん危険

74:デフォルトの名無しさん
12/05/15 12:52:35.34
了解です
それじゃBOMつきのUTF-8は気にしない事にします

75:デフォルトの名無しさん
12/05/15 12:53:28.90
dgってなんだろうと思ったらグラフィックのGDのライブラリか
なんかの関係で直接rubyを呼ぶとGEMPATHかなにかの環境変数がセットされないんだろう

76:デフォルトの名無しさん
12/05/15 15:04:07.49
Haskellと比較用にRubyでlength関数作ろうとしたら配列はeachメソッドで各要素にアクセスできるが、文字列はeachは行単位で、文字単位にはeach_charを使わないといけないのが分かったんだが、それだと配列と文字列で別々にlength関数作らんといかんの?
ダックタイピング出来るのがLLの利点じゃなかったのかと言いたい
(しかも、1.9からは文字列のeachも廃止になるのでeachの構文糖衣であるfor文が文字列で使えない)

以下のコードは配列だと正しい結果を返すが、文字列だと1.8系だと正しくない結果を返し、1.9系だとエラーになる(eachメソッドが無いぞゴラァ!と怒られる)

def mylength (str)
sum = 0
for i in str
sum += 1
end
return sum
end

Ruby詳しくないとは言え、この動作がおかしいのだけは理解できる

77:デフォルトの名無しさん
12/05/15 15:15:43.43
>>76
・Rubyは基本的にforを使わない
・Rubyにおいて文字列と配列には全く関連性がない
・そもそもRubyの文字列は文字の集合ではない

なので、ダックタイプとかの問題ではなくて文字列を文字の集合と扱うか否かの問題

78:デフォルトの名無しさん
12/05/15 16:00:46.88
>>76
Haskellでマルチバイト文字列のlengthやってみて

79:デフォルトの名無しさん
12/05/15 16:07:05.75
mylength([0, 1, 2]) #=> 3
mylength('あいう'.chars) #=> 3
mylength('あいう'.bytes) #=> 6
mylength('あいう'.lines) #=> 1

文字列・バイト列・行の集合等複数の見方が有るからちゃんと指定しましょうってことよね


80:デフォルトの名無しさん
12/05/15 16:09:03.31
UTF8のバイト数じゃないんだ

81:デフォルトの名無しさん
12/05/15 16:10:12.83
集合は順序がないぞ

82:デフォルトの名無しさん
12/05/15 16:16:17.74
そうだった
でも行列とか言うと別の物に聞こえるからなあw
行の列?これもあんまり言わない気がする



83:デフォルトの名無しさん
12/05/15 17:34:26.98
>>74
Ruby1.9はBOM付きUTF-8に対応していて、マジックコメントを付けたのと同じ効果がある
BOM付きUTF-8はトラブルの元なのであまりお勧めはしないけど

84:デフォルトの名無しさん
12/05/15 18:24:50.32
gem install hogehoge
の、インストール先ディレクトリを指定することはできますか。
できれば環境変数で export GEM_HOME=... とか指定できるとうれしい。

85:デフォルトの名無しさん
12/05/15 19:24:24.25
nokogiriすごすぎワロタw
なにこの超絶機能。

…ところでみんなRubyで何やってんの?w

86:デフォルトの名無しさん
12/05/15 22:46:09.29
初歩過ぎて申し訳ないんですが、

<table>
<tbody>
<tr>
<td class="hoge">いらない</td>
<td>ここが欲しい01</td>
</tr>
<tr>
<td class="hoge">いらない</td>
<td>ここが欲しい02</td>
</tr>
<tr>
<td class="hoge">いらない</td>
<td>ここが欲しい03</td>
</tr>
</tbody>
</table>

こんな感じで並んでるものを、
text = doc.xpath("//descendant::table[@class='hoge']//td[2]").first.text
print (text)

このように書くと「ここが欲しい01」が取れるのはいいんですが、
「ここが欲しい02」が欲しい時はどうすればいいですか?
lastだと最後になっちゃうし、secondなんてのはないし・・・?

よろしくお願いします

87:デフォルトの名無しさん
12/05/15 22:47:28.68
あ、クラスの付け方間違えたorz

<table class="hoge">
<tbody>
<tr>
<td>いらない</td>
<td>ここが欲しい01</td>
</tr>
<tr>
<td>いらない</td>
<td>ここが欲しい02</td>
</tr>
<tr>
<td>いらない</td>
<td>ここが欲しい03</td>
</tr>
</tbody>
</table>

この場合です。すいません

88:デフォルトの名無しさん
12/05/15 22:48:20.21
>>85
趣味で構文解析器(GLR)を作ってたらハッシュ値のバグ(仕様?)でハマった
異なるオブジェクトのハッシュ値が同じ値になる…
p [-610054458, 111138, 1, 7].hash #=> -976846141
p [-610054458, 111138, 3, 3].hash #=> -976846141

ハッシュ値が偶然ぶつかるほど大量のオブジェクトを扱ったつもりはないのに…

89:デフォルトの名無しさん
12/05/15 22:53:10.45
>>88
バグだとしても、扱うときには基本的に衝突する可能性を考慮しなきゃいけないのがハッシュなんだから
ハマったのはある意味幸いじゃね?

90:デフォルトの名無しさん
12/05/15 23:05:18.55
RPGツクールのスクリプトで以下のコードについて質問があるのですが

#--------------------------------------------------------------------------
# ● セーブ内容の作成
#--------------------------------------------------------------------------
def self.make_save_contents
contents = {}
contents[:system] = $game_system
-----略--------------
contents[:map] = $game_map
contents[:player] = $game_player
contents
end

「end」の上の「contents」はどういった意味があるのでしょうか?

初歩的な質問ですみません。
よろしければ御教授下さい。

91:デフォルトの名無しさん
12/05/15 23:09:30.30
>>87
doc.xpath("//tr/td[2]")

>>90
そのメソッドを呼びだした側に値(contents)を返してる
Rubyでは関数の最後の式(の値)を呼びだした側に返す

92:デフォルトの名無しさん
12/05/15 23:10:58.98
>>90
Rubyのメソッドは、とにかく最後の処理の値がメソッドの戻り値として利用される
最後の行に唐突に変数が1個だけ書いてあったとしたら、それは他の言語で言うところの return var だ
Ruby では「さいごの return」は通常書かない(もちろん、処理構造から途中で抜ける場合は書く)

てことで、「特異メソッドmake_save_contentsの戻り値はcontents」という意味

93:デフォルトの名無しさん
12/05/15 23:11:09.67
>>87
ごめんぼけた。doc.xpath("//tr/td[2]")[1].text

94:デフォルトの名無しさん
12/05/15 23:15:02.43
>>91

ご回答ありがとうございます。
C言語のreturnなのですね。
凄く省略されててビックリです。



95:デフォルトの名無しさん
12/05/15 23:24:26.67
>>93
ありがとうございます。できました。
ググっても初歩すぎるのか方法がわからずに困ってました。
ありがとうございました!

96:デフォルトの名無しさん
12/05/15 23:25:40.46
>>92

丁寧な説明ありがとうございます。
凄く難しい言語ですね。
Cのポインタより難しいです。

97:デフォルトの名無しさん
12/05/15 23:44:00.47
[2, 8, 3].hash #=> 41
[2, 8, 1, 1].hash #=> 41

これは配列をキーとしたハッシュは使うなということだろうか

98:デフォルトの名無しさん
12/05/15 23:45:59.77
使ってもいいけどfreezeはしておくべきよ

99:デフォルトの名無しさん
12/05/16 12:00:34.84
質問させてください。

hoge huga piko peta 改行

という、半角スペースが1つの場合も2つの場合もある文字列を
カンマ区切りにする方法は無いでしょうか?

「hoge,huga,piko,peta」
最終のイメージはこんな感じです。

100:デフォルトの名無しさん
12/05/16 12:34:50.17
>>99
a="hoge huga piko peta ¥n"
a.sub(/ +¥n/, "¥n").gsub(/ +/, ',') #=> "hoge,huga,piko,peta¥n"

で桶?

101:デフォルトの名無しさん
12/05/16 13:48:03.17
>>100

教えていただいたコードから、私が当初やっていたことが完全に誤りで無いことがわかりました。
それでもさっぱりできないので、元のエンコードを変えてみたら、
スペース1つと2つではなく、スペースとノーブレークスペースが混在していました。

無事[\u00A0]を使って変換できました。
ヒントがなければ、書き方の問題だと思って、ずっと解けないままでした。
ありがとうございました

102:デフォルトの名無しさん
12/05/16 13:57:37.63
ちょっと日本語がおかしいですねorz

ヒントのお陰で、コードの書き方が問題だったのではなく、
元の文字列がおかしかった(把握できていなかった)ということがわかりました。
ありがとうございます。

が、正しいですねw

103:デフォルトの名無しさん
12/05/16 14:04:12.79
>>70
-Ku

104:デフォルトの名無しさん
12/05/16 15:38:47.13
>>99
"hoge huga piko peta 改行".split


105:uy
12/05/16 15:47:46.77
>>99
puts "
hoge huga piko peta

".split*","

だrぉ

106:デフォルトの名無しさん
12/05/16 23:50:21.49
しっかし、簡単に記述できるのはうれしいが、
ネットに情報が少ないな。
公式の解説は何考えて作ったんだか分からんくらい、わかりにくいし。
あれって、読んで分かる人いるの?w
最低でもサンプルくらいほしいわ

107:デフォルトの名無しさん
12/05/16 23:59:12.88
検索の仕方が悪いんじゃないか
試しにどこで詰まったか書いてみれ

108:デフォルトの名無しさん
12/05/17 00:44:21.03
いやごめん、詰まってないんだ。
しっかりと希望通りに動いてるw

でもサンプルが少ないから、海外のサイトをGoogle翻訳の世話になりながら頑張ってるw

109:69
12/05/17 08:50:30.59
>>75 ありがとう
#!/usr/bin/env rubyでコンソールからは安定的に動くみたい
今度は、cgiで試してるけど、2回に1回ぐらいエラーになるw

ruby: No such file or directory -- CONFIG["STATIC"] = "" (LoadError)

環境変数を出すスクリプトをコピペして、うまく表示された時のRUBY関係の変数
PATH /sbin:/usr/sbin:/bin:/usr/bin
RUBYLIB /usr/lib:/usr/lib/ruby:/usr/lib/ruby/site_ruby/1.9.1
LD_LIBRARY_PATH .:/usr/lib:/usr/lib/ruby:/usr/lib/ruby/site_ruby/1.9.1
1.9からカレントがなんちゃらかんちゃらだそうだから、試しにcgiの中で、
ENV['LD_LIBRARY_PATH']=".:/usr/lib:/usr/lib/ruby:/usr/lib/ruby/site_ruby/1.9.1"をやってる。

コンソールからenvをやると、
GEM_HOME,MY_RUBY_HOME,GEM_PATH,RUBY_VERSIONも出てくるけど関係あるのかな?
RUBYLIBはcgi表示と同じ。

同じ事例か、原因か、直し方、教えて

110:デフォルトの名無しさん
12/05/17 09:27:04.38
>>109
which ruby

111:デフォルトの名無しさん
12/05/17 12:05:24.68
sample_array = [["a,b,c"]]
こんな配列があって

sample_array.each do |var|

new_var = #varに対していろんな処理
print new_var

end

こうすると1つずつ書きだしてくれるのはいいんだけど、
書きだすんじゃなくて「new_var」を新しい配列にする方法ってどうするんですか??
整形した値を持つ変数をループの外で使いたいんです。

112:デフォルトの名無しさん
12/05/17 12:21:26.44
なんか毎回書いてる気がするが、とりあえずArrayとHashとStringとEnumerableのメソッドは1行の動作説明だけでも読んでおくといい
「そういえばどっかにそんな処理のできるメソッドがあった気がする」とわかるだけでかなり違う

というわけで Array#map あたりを使え

p [1,2,3].map{|x| x*2} #=> [2, 4, 6]

ネストした配列になってる場合は一発でできずに若干面倒な場合があり、
ローカル変数で結果用の配列とかを用意たほうが簡便なことが多々あるがこれは仕方ないんで飲んでくれ

result = []
arr.each do |a|
a.each do |x|
result << xの内容をめっちゃ複雑に処理した結果
end
end
p result

「○○した新しい配列を返す」というメソッドで適当なの探してみ

113:デフォルトの名無しさん
12/05/17 12:27:41.90
Windowsでredmineが使いたいのでgemのバンドルでrails2.xがインストールされてます
最新のrailsを単品で入れて動かしたいのですが
rubyではアプリというのはgemから入れないと動かせないような仕組みでしょうか?
gemでrailsを複数いれたりしたらおかしくなりますよね?
どうにかrailsの最新版をためすほうほうはありませんか?

114:デフォルトの名無しさん
12/05/17 12:32:47.07
なるほどーこんな風に書くんですね。

「ArrayとHashとStringとEnumerableのメソッドは1行の動作説明」
一応ざっと目を通したんですが、ちゃんと覚えるまで見返しますw

115:デフォルトの名無しさん
12/05/17 12:41:35.00
>>113
gemはそれを実行したrubyの位置と環境変数で区別できる
つまり、「別のruby」を別な環境変数ごと別途インストールするのがいちばん簡単
pikでどうだろう

というかRailsはRailsスレのほうが日常的に使い倒してる人がいて質問にも便利かと思う
【RoR】Ruby on Rails Part14
スレリンク(php板)

116:デフォルトの名無しさん
12/05/17 13:01:04.19
>>115
pikを使ってみます
あと分からないことがあったらそちらで聞いて見ます

117:デフォルトの名無しさん
12/05/17 13:10:08.63
>>114
Enumerableは便利メソッドの宝庫なんで慣れても良く見に行くよ

118:うy
12/05/17 13:55:55.29
yu=[
  [1,2,3] ,
  [33,44,55] ,
]
.inject [] do | u , y |
  u << y.map do | uy |
    uy*10
  end
end
p yu


119:デフォルトの名無しさん
12/05/17 15:50:55.44
Shift_JISで保存して
puts "予定"
を実行してもエラーも文字化けも起きません
RubyはShift_JISの5C問題に対応しているからでしょうか?

120:デフォルトの名無しさん
12/05/17 16:29:10.81
サイトの画像と、テキストの情報を抜き出して
整形してから保存するってのを作ったんだけど、
コマンドプロントで動かしてるけど、意外に時間かかるね。

他に早く処理できる実行方法とかあるの?

121:デフォルトの名無しさん
12/05/17 17:24:52.00
>>119
環境変数に RUBYOPT=-Ks とか書いてあるんじゃない?
無効にすれば普通に化けたりするはず


122:uy
12/05/17 18:48:55.54
>>120
うp

123:デフォルトの名無しさん
12/05/17 19:39:10.84
>>120
あらかじめ保存してある画像とテキストを読み込んで処理しても遅かったならまたおいで

124:デフォルトの名無しさん
12/05/17 21:17:29.91
以下のようなネットのサンプルソースに def[](id)という書き方があったのですが
どのような使い方をするのでしょうか?

def [](id)
@list[id] = aaaa.new(id) if @list[id].nil?
return @list[id]
end

125:デフォルトの名無しさん
12/05/17 21:27:41.90
この質問時々来るNE!

c = C.new
c[arg]

というようにHashのキーやArrayの添字のようにアクセスさせたい場合、特別に

class C
def [](arg)
...
end
end

というようにメソッドを定義する

126:デフォルトの名無しさん
12/05/17 22:07:33.09
また以下のソースについてですが、return []は何を返すのでしょうか?


Class B
def keys
return [] if AAA[@id].nil?
if AAA[@id].is_a?(Hash)
return AAA[@id].keys.sort
end
return []
end
end


>>125
ご回答ありがとうございます。
検索にも引っかからないので助かりました。

127:デフォルトの名無しさん
12/05/17 22:16:45.37
>>126
何をって、字面通り空の配列だが…

128:uy
12/05/17 22:28:20.29
p nil == []
p [] == Array.new
p [].empty?
p [].class
p "".class
p nil.class
p nil.class.class.class.class.class.class.class.class.class.class.class.class

129:デフォルトの名無しさん
12/05/17 22:29:03.07
>>126
たのしいRubyでも買っちゃったほうがいいと思うよ。Webで済ませたいならこれか
URLリンク(www.ie.u-ryukyu.ac.jp)

130:120
12/05/17 22:38:19.05
>>123
ローカル環境で試したらさっくさく動きましたw
しかしRubyはすごいね。こんな簡単で多様性を持った言語って他にないな。
って何個かしか言語しらんけどw

あとこの掲示板のサポート体制が神w

131:デフォルトの名無しさん
12/05/17 22:57:35.70
>>127
ありがとうございます。
空の配列を返す意味がよく分からないですが
0でもいいような気もします。

>>130
表記が簡単ですが、検索に引っかかりにくいので
Webでの学習は難しいかな。


132:デフォルトの名無しさん
12/05/17 23:04:37.98
>>131
場合によって数値を返したり配列を返したりと変わると面倒だろ?
もちろん場合によって返す型が変わるメソッドも書けるのはRubyの利点でもあるが
どの場合でも配列を返す、と統一されてるほうが基本的には利用し易いと思うよ経験上

133:デフォルトの名無しさん
12/05/18 00:32:44.66
>>122
全然upするようなものじゃないですw
でも、「こう来たらこう」「さらにこの時はこう」「残念、そのイレギュラーも想定済みだ」

みたいな感じで意図した通りに動くプログラムを眺めるのって快感だw

134:デフォルトの名無しさん
12/05/18 01:30:06.58
>>131
別になにを返してもいいよ
そのメソッドの戻り値をどうやって使うかという設計にのみ依存する
中身の入った配列か空の配列を返す、という構造の場合、アテにしてる動作の根拠はこれだ

arr1 = [1,2]
arr1.each{|x| puts "#{x}です"}

arr2 = []
arr2.each{|x| puts "#{x}です"}

「1です」「2です」の次に何が表示されるか
…もちろん、なにもしないし、例外も起きない

[] は Array クラスのオブジェクトだから each メソッドを使ってもエラーにならず、
なおかつ each メソッドは self が空の配列の場合ブロック内部の処理を単に飛ばして self を返す
しかも Array クラスの大部分のメソッドは each メソッドを使って書かれているので
arr2.map{|x| x*10} はエラーではなく [] を返すし、 arr2.find{|x| x.odd?} もエラーではなく nil を返す

もちろん件のメソッドが0を返しても構わない(Rubyでは非該当のシグナルはnilのほうがいいとは思うが)
ただし、その場合は b.keys.each{...} と書いて順調に動いてた部分が、ある日突然 NoMethodError で止まる
スクリプト書いた人は首を傾げ、B クラスのマニュアルを見て、ソースを読んで、
「もし該当がなければ0を返す」というトンデモ記述を目の当たりにして呪詛を吐きつつ、
return_keys = b.keys
if return_keys.zero?
# なにもしない
else
return_keys.each{...}
end
というめんどくさい記述に書き換える

135:デフォルトの名無しさん
12/05/18 02:10:28.06
あるメソッドの内部処理が「ダメだった」場合に空のオブジェクトを返すかnilを返すか自作例外を発生させるかの定まった回答はない
そのメソッドやクラスがどういう場面で使用されるか、をよく考えた上で自分で決めるしかない

B#keysが[]を返すのは、空のHashに対するHash#keysが[]を返すことからの類推と、
そのB#[]の作者が[]メソッドに照会の機能を持たせてるからだと思う
メソッドの戻り値の内容はこっちで吟味するからとりあえず配列を返しといて下さい、という

136:デフォルトの名無しさん
12/05/18 10:50:05.63
すみませんpikを使うと複数のRuby+gemの環境を構築できるようですが
Rubyは1つだけインストールしてgemだけ複数の環境を用意する方法ってございませんか?
HDDの容量の都合でRubyを環境ごとにインストールするのが厳しいです

137:デフォルトの名無しさん
12/05/18 10:58:50.42
GEM_HOMEで切り替えるとか、アプリ毎に環境を分けるのであれば
bundle使えば良さそうな気がする


138:デフォルトの名無しさん
12/05/18 11:01:37.23
間違えたbundlerだった。。。


139:デフォルトの名無しさん
12/05/18 11:04:12.10
rubyと添付ライブラリ本体ではなく、gem(とRails)を複数インストールすること自体がHDDを圧迫してるんじゃないか説が…
あ、pikってrubyのソース玉も保持するんだっけ?

環境変数 GEM_HOME を環境ごとに設定してインストールし、環境変数 GEM_PATH を欲しい環境ごとに設定して利用すれば理屈上はいける
WebサーバでRailsを起動するのに環境変数を任意に設定する方法があるのかどうかまでは知らない
>>137の言うようにbundlerでもなんとかなったと聞いた記憶があるけどWindowsで動作するのかとかはよく知らない

140:デフォルトの名無しさん
12/05/18 11:04:23.32
ググって見たところ僕にもなんとかできそうなのでGEM_HOMEかbundlerで試してみたいと思います
ありがとうございます

141:デフォルトの名無しさん
12/05/18 11:26:55.37
>>137さん
>>138さん
>>139さん
>>140さん
レスを読んでたらちょっと気になることがあるので質問させてください
RubyInstallerのzip版をC:\Ruby193に手動で入れてるんですが
環境変数のpathにC:\Ruby193を入れてからdevkitをインストールしました
GEM_HOMEというのは今まで入れないで使ってきたのですが登録しないとダメでしょうか?

142:デフォルトの名無しさん
12/05/18 11:43:17.54
何もまだファイルにかかれていない状態のRubyファイルを実行した時に
何らかの処理をさせる事ってできませんか?

143:デフォルトの名無しさん
12/05/18 11:46:20.85
>>141
デフォルトでgemのインストール先とかは設定されているからダメじゃないよ。
(インストール先を変更する必要があれば設定する)
現在のgem環境は、
gem environment(gem e でもOK)
で確認できるから見るといいよ。


144:デフォルトの名無しさん
12/05/18 11:49:24.70
>>141
日本語文献が少ないんだよな

GEM_HOME と GEM_PATH は gem のデフォルト動作を変更するのに使う
なにも設定しなかった場合、gem ライブラリは実行に使った ruby.exe から見て ../../lib/ruby/gems (つまり{RUBYDIR}/lib/ruby/gems)にインストールされる
これを変更したい場合は GEM_HOME を設定することで変更することができる
GEM_HOME 以外にも指定方法があったはずで、確か GEM_HOME は使わないでというのがあった記憶がうっすらあるが、
GEM_HOME 派は根強い

145:デフォルトの名無しさん
12/05/18 11:49:52.72
>>142
勉強になりました

146:デフォルトの名無しさん
12/05/18 11:50:26.64
安価ミス
>>143
>>144
勉強になりました

147:デフォルトの名無しさん
12/05/18 11:50:33.21
>>142
それは「してはいけない」

使い方が間違っている
なんのためにそれやりたいのか言ってみ

148:デフォルトの名無しさん
12/05/18 11:57:29.78
>>147
Rubyでゲームを作っていて
main.rb というファイルに
require "./game/player"
require "./game/naiyou/enemy"
...
など、いろいろrequireしているのですが、

player.rb のほうをRDEで編集している時に、
RDEからプログラムを実行するには
main.rbのほうにタブを移動してF5を押さないと出来なくて、

それが面倒なので現在
player.rbなどには
行頭に
URLリンク(codepad.org)
こういう記述をしています
(main.rbをディレクトリから探してrequireする)

これをなくせないかなぁと思いました

149:デフォルトの名無しさん
12/05/18 12:03:13.40
テスト書けテスト

150:デフォルトの名無しさん
12/05/18 12:11:54.40
なんでRuby初心者がRDEなんて修羅の道を…

一般論としては、やっぱテスト書けってことになるのかね
スクリプトファイルを慎重に直接実行して目を皿のようにして様子を見るのではなく、
「このクラスのこのメソッドはこの値を渡すとこんな値を返すはず、正解と比較してエラーなら止まる」
ということを羅列した特別なRubyスクリプトのほうを実行する
全てのチェックが正しければなにも起こらないので編集を継続すればいい

autotestみたいなのってWindowsでも動いたっけ?

151:デフォルトの名無しさん
12/05/18 12:19:18.34
(´;ω;`)ウッ…ありがとうございました

152:デフォルトの名無しさん
12/05/18 12:21:25.80
どんなゲームかにもよると思う(どんな段階なのかも)
ウィンドウあげてキャラチップ動かしてる段階だと、その部分のテストは大変

自動で実行をして欲しいってことだけなんだし、テストファイルで直接ウィンドウ立ち上げて目視してもらえばいいだけか

153:デフォルトの名無しさん
12/05/18 12:46:38.71
ゲームシーンがあって、シーンごとにファイルが違う感じです
Rubyでゲーム開発が無理してることは承知しているのでこのまま頑張る事にします

154:デフォルトの名無しさん
12/05/18 13:04:38.16
>>148 main.rbをショートカット付きでマクロとして登録しとくのが楽。つかなんでこの文脈でテスト書けなんて出てくるんだ

155:デフォルトの名無しさん
12/05/18 13:09:48.60
Windows + Ruby1.9.3にpassenger+apacheでRubyでwebサイト(Hello Worldを表示するところから)を作りたいと思います
apache2.4をインストール済みです。
URLリンク(redmine.jp)を見ながら作業しています。
コマンドプロンプトを立ち上げてgem install passengerでpassengerをインストールしました。
passenger-install-apache2-moduleと入力を打つ
----------------------------------------------------------------------------
Welcome to the Phusion Passenger Apache 2 module installer, v3.0.12.

This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.

Here's what you can expect from the installation process:

The Apache 2 module will be installed for you.
You'll learn how to configure Apache.
You'll learn how to deploy a Ruby on Rails application.

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.
--------------------------------------------------------------------------------
と表示されたので、Enterを押したらURLリンク(codepad.org) (長いのでURLに記入)が表示されてしまい設定できません
検索してもほとんどLinuxでインストールする方法しか見つからず解決方法がわかりません
どなたかアドバイスお願いします

156:デフォルトの名無しさん
12/05/18 14:57:11.96
PassengerはWindowsをサポートする気がなかったと思ったが。

157:デフォルトの名無しさん
12/05/18 16:55:40.88
そうだったんですが・・・
Passengerをアンインストールしました
あとMongrelも試してみたんですが起動できずこれもアンインストールしました
webrickで頑張ります

158:デフォルトの名無しさん
12/05/18 23:59:56.41
つうかRuby使うならWindows使うのを止めるべき。
無駄な労力が必要になる。

159:デフォルトの名無しさん
12/05/19 00:28:29.24
激しく同意
RubyはWindows上で使うもんじゃない

160:デフォルトの名無しさん
12/05/19 00:49:09.89
だって秀丸が無いと厳しいですし・・・

161:デフォルトの名無しさん
12/05/19 09:02:29.94
秀丸の何が良いのか未だに分からん

162:デフォルトの名無しさん
12/05/19 09:03:46.42
windows で jruby 使ってみたけど意外に良かったよ
rails も動かせたし

163:デフォルトの名無しさん
12/05/19 09:39:14.51
jrubyってまだ1.9.2しか対応してないのか…

164:デフォルトの名無しさん
12/05/19 09:47:03.72
まあかなり無茶やってruby処理系やってるんで、ひとつひとつ対応していかないと

165:デフォルトの名無しさん
12/05/19 09:53:49.28
むしろ1.9.2まで対応してることが凄いくらいだよw

166:デフォルトの名無しさん
12/05/19 10:00:46.31
そら理屈上は動作するけどそんなことやる奴おらへんやろ、をなぜか実現してるプロジェクトだからな

167:デフォルトの名無しさん
12/05/19 10:02:13.20
>>160
編集作業をするOSとプログラムを実行するOSが同一でなければならない理屈はない

168:デフォルトの名無しさん
12/05/19 10:17:32.54
stack level too deep (SystemStackError)

大規模な再帰呼び出しができないとかrubyって言語として大丈夫なの?
これじゃ木構造とか扱い辛い
スタック使って書き直すのはやりたくない

169:デフォルトの名無しさん
12/05/19 10:27:33.10
それ構造が循環しちゃってるだけだから…

170:デフォルトの名無しさん
12/05/19 10:36:27.25
してない
構造の大きさを徐々に大きくしてテストしたから
これは確か

171:デフォルトの名無しさん
12/05/19 10:38:09.22
よほど深い木構造を操作してるとか?

172:デフォルトの名無しさん
12/05/19 10:39:12.55
>>169
無限再帰でなくても落ちるよ

# recur.rb
def get_last_elem(ary)
# 空の配列を渡すと死にます
return ary[0] if ary.size == 1
ary.shift
get_last_elem(ary)
end
p get_last_elem((1..10000).to_a)

% ruby recur.rb
recur.rb:2: stack level too deep (SystemStackError)

173:デフォルトの名無しさん
12/05/19 10:45:37.25
落ちるパターンにぶつかることが稀にあるね

$ ruby -e 'def mes(i) print i;mes(i+1) end;mes 0'
01234567891011121314151617181920212223
...
1787188719872087218722872387248725872687278728872987308731-e:1: stack level too deep (SystemStackError)


174:デフォルトの名無しさん
12/05/19 10:48:43.02
>>173
それはどこで再帰が終了するんだ?

175:デフォルトの名無しさん
12/05/19 10:57:12.96
ちょっと気になって調べたら
URLリンク(d.hatena.ne.jp)
を見つけたので、自分とこで確認してみたら

x86_64-linux 1.9.3 (2011-10-30)
#<SystemStackError: stack level too deep>
recursive size: 8734
となった。


176:デフォルトの名無しさん
12/05/19 13:17:43.42
ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]
では、9356段までだった
URLリンク(ideone.com)

177:デフォルトの名無しさん
12/05/19 13:59:39.60
ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32]

i386-mingw32 1.9.3 (2012-04-20)
#<SystemStackError: stack level too deep>
recursive size: 8734


178:デフォルトの名無しさん
12/05/19 15:01:50.17
なんかLLバトルスレ向きのレスなんだけど

ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32] だと
def mes(i)
puts i
mes i+1
end
mes 0
が、8731まで表示して stack level too deep (SystemStackError) で落ちた

Python 2.7.1だと
def mes(i):
print(i)
mes(i+1)
mes(0)
998まで表示してRuntimeError: maximum recursion depth exceeded で落ちた

Perl 5.12.1だと
sub mes{
my $i = shift;
print $i,"\n";
mes($i+1);
};
mes(0);
3722238まで表示してOut of memory!で止まった
どんどんとメモリを消費していって最終的に1.2Gほど使ってた


179:デフォルトの名無しさん
12/05/19 15:04:04.80
Lua 5.1.3だと
function mes(i)
print(i)
mes(i+1)
end
mes(0)
16378まで表示してstack overflowで落ちた


Gauche 0.9.2だと
Schemeはあいかわらずよくわからんので、Webをみながらてきとうに書いてみるのですが
(define (mes i)
(print i)
(mes (+ i 1)))
(mes 0)
止まる気配がなかった
末尾最適化が利いているのでしょう


180:デフォルトの名無しさん
12/05/19 15:07:18.10
おまけで
ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32] で

RubyVM::InstructionSequence.compile_option = {tailcall_optimization: true, trace_instruction: false}
eval <<'EOS'
def mes(i) puts i;mes(i+1) end
mes 0
EOS

止まる気配がない
たぶん末尾最適化が利いて無限ループしてるはず

デフォルトで末尾再帰最適化が有効になってないのは何がまずいのだろう?


181:デフォルトの名無しさん
12/05/19 16:42:16.40
理論上はすべての再帰は末尾再帰に変換できるんだっけ?


182:デフォルトの名無しさん
12/05/19 17:21:35.07
そりゃプログラムを丸ごとCPSに変換すりゃ、全部末尾ジャンプになるけど、
「ifとgotoさえあればなんでも書ける」ってのと同じで、意味のない言明だよ。

183:uy
12/05/19 17:30:34.59
理論上は~って話をしたらプログラムの世界では全てが可能だろね
今のPCスペックと人間スペックでかけるかどうかが問題

184:デフォルトの名無しさん
12/05/19 17:39:27.23
>>180
こんなことが出来たのか
勉強になるなぁ。
ありがとう!


185:デフォルトの名無しさん
12/05/19 18:22:00.98
schemeは全部末尾再帰に変換することを仕様で義務づけてなかった?


186:デフォルトの名無しさん
12/05/19 18:30:54.54
要求としては、末尾コンテキストにある呼び出しなら、それを繰り返しても、
スタックが溢れたりしないこと。

187:デフォルトの名無しさん
12/05/19 18:33:11.01
>>185
それは末尾再帰最適化が仕様に含まれているので
末尾再帰がループと同等に扱えるって話じゃ


(Pythonは使ってないもので)
再帰の回数に制限がかかってたのを思い出した

Python 2.7.1にて
import sys
sys.setrecursionlimit(100000)
def mes(i):
print(i)
mes(i+1)
mes(0)

9663まで表示してMemoryError: stack overflow で落ちた
負けた……


188:デフォルトの名無しさん
12/05/19 18:33:44.33
末尾再帰の最適化(ループへ変換とか)は要求されているが
再帰を末尾再帰に変換する義務はない、ということか。


189:デフォルトの名無しさん
12/05/20 00:44:44.64
そもそも任意の再帰を末尾再帰に変換するのは
勝手に環境フレーム相当のものをヒープに用意したりしない限りは
無理じゃないのと思うんだが

190:デフォルトの名無しさん
12/05/20 09:07:27.53
OSがアプリケーションごとに使っていいスタックサイズ変更とか出来るようになればいいだけ
動的に生成された再帰コードを末尾再帰に変換しようぜとか今の人間の技術じゃない

191:デフォルトの名無しさん
12/05/20 09:41:23.21
もしLinuxでRuby 1.8の人いたらulimit -s <stacksize>してから
上のスクリプト試すとどうなるかやってみて
(うちのLinux/Ruby1.9では効果なし)

192:デフォルトの名無しさん
12/05/20 09:48:12.89
>>190 まずは Proper Tail Recursion and Space Efficiency を読め。
話はそれからだ。

193:デフォルトの名無しさん
12/05/20 09:54:39.24
>>191
うちでも1.9.3では効果なかった。
でも1.8.7では、
スタックサイズ 8192 で 4101
スタックサイズ 16384 で 8794
スタックサイズ 32768 で 18152
と効果が見られた。


194:デフォルトの名無しさん
12/05/20 10:06:02.95
ありがと。やっぱり1.8では効果あるのね

195:デフォルトの名無しさん
12/05/20 10:24:25.61
TKでプログラムを実行したときにウィンドウを出さずコンテキストメニューを表示させるサンプルが載ってるサイトはありませんか?
どれも右クリックでメニューを出すものは見つかるのですが自動的にメニューを表示させるサンプルが見つかりませんでした

196:デフォルトの名無しさん
12/05/20 12:57:00.58
>>195
元のTkでそのようにする方法を調べて、それをRuby/Tk上で書く

197:デフォルトの名無しさん
12/05/20 14:05:27.20
passenger, mongrel, unicorn, webrick以外でwindowsで動かせる奴ってありませんか?

198:デフォルトの名無しさん
12/05/20 14:44:06.84
thin


199:デフォルトの名無しさん
12/05/20 18:14:01.72
python

200:デフォルトの名無しさん
12/05/20 20:13:13.87
やっぱりここの先輩方は何かプログラムを書くときにプロジェクト管理を使ったりテストをしたりするものですか?

201:デフォルトの名無しさん
12/05/20 22:52:03.08
RubyInstallerでWindowsに1.9.3を入れたんですが
コマンドプロンプトから
ruby -v
ってやるとパスが通っているのかバージョンがちゃんと表示されます
ただし、batファイルに
ruby -v
と書いて実行すると
>'ruby' は、内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ってエラーになります

これはなぜですか?

202:デフォルトの名無しさん
12/05/20 22:58:17.17
>>201
そのコマンドプロンプトは偽物だ
ruby consoleはあらかじめパスを通したコマンドプロンプトのウィンドウを出す
普通のバッチファイルでruby.exeを使いたいなら、そのruby.exeを実行したい人の環境変数でパス通せ

203:デフォルトの名無しさん
12/05/20 23:01:47.25
つまりどういうことですか?
システムにrubyのbinフォルダを登録しなくちゃいけないってことでしょうか?

204:デフォルトの名無しさん
12/05/20 23:19:27.62
>>203
だいたいそんなところ
詳しくは「パスを通す」でググれ

Vista以降でシステム環境変数でなくユーザ環境変数に登録したいなら
コントロールパネル開いて右上の検索ボックスに「環境変数」と入力

205:デフォルトの名無しさん
12/05/20 23:20:02.98
そのruby.exeを実行したい人の環境変数でパス通せ

これしか言いようが無い
わからんかったらお前向いてない

206:デフォルトの名無しさん
12/05/20 23:22:00.01
RubyInstallerではexeとzipがありますが
exeでインストールすると勝手に環境変数も入れてくれると思ってたんですが
exeでインストールするメリットってzipと比較してないと考えていいんでしょうか

207:デフォルトの名無しさん
12/05/20 23:29:29.00
普通に入れたらパス通らなかったっけ?
環境が変なんじゃね

208:デフォルトの名無しさん
12/05/20 23:39:39.35
>>200
ふつうRedmine RSpec Jenkinsな感じ。

209:デフォルトの名無しさん
12/05/20 23:40:54.39
ぐぐったらexeだとインスコ時にAdd Ruby executables to your PATHみたいに聞かれるらしいね

210:デフォルトの名無しさん
12/05/21 00:26:44.53
>>195
メニューだけ表示してなんかして終了するの?

require 'tk'
menu1 = Tk::Menu.new tearoff:false do
add :command, {label:'Ok',command:->{puts 'menu Ok';exit}}
end

Tk::Wm.withdraw Tk.root
Tk.after 100,->{menu1.popup TkWinfo.pointerx(Tk.root), TkWinfo.pointery(Tk.root);exit}
Tk.mainloop

こんなのだろうか?
正しいのかわからんけど


211:デフォルトの名無しさん
12/05/21 10:00:41.76
文系なので、解らないのですが、なぜ、Rubyは、JavaやC言語で、記述されていて
Rubyそのもので、記述されていないのでしょうか?

212:デフォルトの名無しさん
12/05/21 10:16:10.82
>>211
コンパイラじゃないから

213:uy
12/05/21 10:23:16.94
実行速度は アセンブラ>C言語>JAVA>>>>Ruby
開発効率は Ruby>>JAVA>>>>C言語>>>>>>>>>>>>>アセンブラ
です。

なるべく実行速度の速い言語で、言語処理系をつくりたいんです
あと、Rubyは動的言語っていうものなのでRubyそのもので記述しようとするなら
eval ""
で終わり

214:デフォルトの名無しさん
12/05/21 10:35:09.80
>>212

ありがとうございます。
インタプリタ言語では、プログラミング言語は、記述

215:デフォルトの名無しさん
12/05/21 10:38:26.77
214ミスりましたすみません。

つづき、記述ができても、処理系に向いていないということで、将来、処理速度
が向上したら、できる可能性もあるのでしょうか。

216:デフォルトの名無しさん
12/05/21 10:44:34.70
>>215
Cプログラムで動作しているOSと遣り取りする部分のプログラムをCで書かない理由ってなに?

217:デフォルトの名無しさん
12/05/21 10:47:01.95
学んでて、文系としては、全部Rubyなら、いいのにと面倒くさがりました。

その後、宗教論争などを見て、反省もしましたが、疑問はつきませんでした。

218:デフォルトの名無しさん
12/05/21 10:49:40.45
>>216

ですから、
インラインアセンブラの話が、C言語では、この話に近いと思われます。

正直、わかりません。言い訳になりますが、説明をあまり見かけないのです。

219:デフォルトの名無しさん
12/05/21 11:12:11.61
>>218
もしRubyインタプリタをRubyでコーディングするとしたら
そのRubyコードを実行するRubyインタプリタは何で書くの?Rubyで書きたい?

220:デフォルトの名無しさん
12/05/21 11:28:12.75
マシン語で記述されてるレベルのRubyのハードやOSがあれば、いいのでしょうか

221:デフォルトの名無しさん
12/05/21 11:30:44.42
>>219

理想からすると、
Rubyの方が、コードを読みやすいはずです。

文系では、他の分野で、読まなければならない本が、やたら多いので、
入り方が、重要なのです。

222:デフォルトの名無しさん
12/05/21 11:31:32.96
coffeescriptなんかもあるよ。

223:デフォルトの名無しさん
12/05/21 11:33:21.47
文系なら読点くらいまともにしたらどうだろう。息上がってんのか?

224:デフォルトの名無しさん
12/05/21 11:37:28.69
>>221
私も文系です。釣りならお帰りください
そうでないならブートストラップ問題でぐぐって熟読したうえで他で聞いてください
それかPythonにはPythonで実装されたPyPyって処理系があるのでそっちに行ってくれてもいいです

225:デフォルトの名無しさん
12/05/21 11:38:57.26
挑発をしたわけでなくて、理解度の問題でした。

つまり、アセンブラを学ぶのと、Rubyを学ぶのでは、どの道、C言語拡張まで
想定してRubyを学び、開発者を目指すなら、アセンブラ回帰が必須になり、
技術の修得スピードと翻訳、文献の量の問題が、大きいですね。

開発スピードの矛盾を発見したわけです。これは、おかしい。


226:デフォルトの名無しさん
12/05/21 11:40:31.87
>>224

Pythonびいきではないし、アンチではないですよ。

227:デフォルトの名無しさん
12/05/21 11:42:06.13
Rubyは早く書けることを主体にした言語なのに
if~endの「end」を入力するのが苦痛です
何故endを書かないといけない仕様なんですか
if~eでいいじゃないですか

228:デフォルトの名無しさん
12/05/21 11:43:02.24
WindowsでまともにRubyを動かせるWebサーバがありません
クロスプラットフォームで動く動的言語なのにこれは致命的です

229:デフォルトの名無しさん
12/05/21 11:53:12.58
つまり、ダダこねてるのでなくて、

実際問題、おそらくは、Rubyから入門するというケースが、外されてしまうのは
損失ですね。将来的には、Ruby ですべて、こなせるという目的は、ないと思われ
てしまう。


230:デフォルトの名無しさん
12/05/21 12:10:13.15
春休みって随分長いんだな

231:デフォルトの名無しさん
12/05/21 12:13:12.15
脅かすつもりもなかったし、過去の論争の苛立ちからするとギリギリの

ラインの質問ですまなかった。

掲載しろとは言わないが、Rubyの入門書に期待したい。

RHGを読むときの理解度にも関わるので、ちょっと聞いてみたんだ。

すまない。

232:デフォルトの名無しさん
12/05/21 12:17:07.52
反論できない話になるとすぐ春休みとかに逃げるよね

233:デフォルトの名無しさん
12/05/21 12:31:35.79
初心者からすると、

Ruby開発者は、開発時間の比率からするとRubyでなくて、

C言語、JAVA言語をやってるんですね。

これを、言わせない説明方法を、教えてください。

234:デフォルトの名無しさん
12/05/21 12:34:14.99
Rubinius とか Mirah とかを覗いてみると楽しいかもね
初心者向けではないかもしれないけど

235:デフォルトの名無しさん
12/05/21 12:44:26.74
>>234

がてんがいったので、

しばし、勉強して、後日きます。





236:デフォルトの名無しさん
12/05/21 12:47:00.30
>>233
>Ruby開発者は、開発時間の比率からするとRubyでなくて、
>C言語、JAVA言語をやってるんですね。

これ自体は別に不思議なことでも、悪いことでもない
CRuby開発陣はCプログラマばっかりだと言われることがあるのと同様
JVMを書いている開発者だって恐らくC系言語を使っているだろう

もちろん、言語処理系上のライブラリ開発者であれば
Pure Rubyで記述している場合もあるだろう

237:デフォルトの名無しさん
12/05/21 12:49:44.84
>>236

重ねて感謝、ありがとうございました。助かります。

238:デフォルトの名無しさん
12/05/21 14:52:40.66
読み込んだwebページのテキストをメモ帳に出力するのってできますか?

239:デフォルトの名無しさん
12/05/21 15:03:02.70
取得した内容をテキストファイルにに書き出すのか
取得した内容をメモ帳に貼り付けるのかどっちだい?
両方できるが

240:デフォルトの名無しさん
12/05/21 15:04:17.89
やっぱり国産言語だからPythonよりRubyを選んでこれから勉強しようと思ってます。
Rubyをやる場合に基礎が身につく入門書ってありませんか?
10日で覚える系のは論外です

241:デフォルトの名無しさん
12/05/21 15:04:30.20
>>239
前者です!

242:デフォルトの名無しさん
12/05/21 15:06:29.97
require "open-uri"
open("URLリンク(www.defense.gov)"){|f| $s = f.read}
open("test.html", "w"){|f| f.write($s)}
`start notepad.exe test.html`

243:デフォルトの名無しさん
12/05/21 15:11:05.71
>>242のようなのは真似しないように

244:デフォルトの名無しさん
12/05/21 16:12:10.79
open(require("open-uri").to_s,"wb").print open("URLリンク(google.co.jp)").read


245:デフォルトの名無しさん
12/05/21 17:15:56.52
>>244
うまくいきません\(^o^)/
URLリンク(www.ruby-lang.org)
にアクセスしてメモ帳に
ここでは、マニュアルなどのドキュメントを紹介します。…
を出力したいのです
1.8.7です

246:238
12/05/21 17:38:00.86
これで出力できました
ここから<p>とか<div>をとる方法を模索中です

require 'rubygems'
require 'mechanize'
require 'kconv'
require 'open-uri'

agent = Mechanize.new
agent.get('URLリンク(www.ruby-lang.org)')
p = agent.page.at('p')
`start notepad.exe p`

247:デフォルトの名無しさん
12/05/22 06:24:09.67
rubyでos作ると思って速攻で挫折したの思い出した。
シェルスクリプトなんてルビーで置き換えられるじゃないと思って¥、シェルの代わりにルビーを指定したらログイン不能になったわw

過去のトラウマ。
あうあうあー。

ウィンドウズでサーバ自体とんでもなく手間が掛かる。
教祖様と同様にatt unixがいいね。デビアンは使いにくいけど。

248:デフォルトの名無しさん
12/05/22 07:10:52.57
>>211
>文系なので、解らないのですが、なぜ、Rubyは、JavaやC言語で、記述されていて
>Rubyそのもので、記述されていないのでしょうか?

いい質問です。独力でそこに気づいたのなら、文系とはいえかなりのセンスの持ち主です。
すでに234が書いてますが、Rubiniusという処理系が、まさにRubyそのもので記述されたRuby処理系です。
本家RubyはCで書かれた処理系、JRubyはJavaで書かれた処理系、RubiniusはRubyで書かれた処理系、といえます。
とはいえRubiniusが100%Rubyで書かれているかというと、そういうわけではなく、RubyのサブセットをC++とLLVMで作り、
そのサブセットでフル仕様のRubyを記述しています。つまり2段構え。
このような仕組みだと遅いように思うでしょうが、RubiniusはJITを搭載しているので、最初の読み込みこそ遅いものの、そのあとは本家Rubyよりも速いです。
このような仕組みはSmalltalkが確立した方法で、昔から有名です。PythonだとPyPyという処理系が同じ仕組みです。

なお初心者相手だと>>213>>219みたいなゴミが湧き出ますが気にしないでください。ごめんねあんなやつらを相手にさせて。

249:デフォルトの名無しさん
12/05/22 08:23:49.17
その辺を考えるとosを作れるcは偉大だな。
まだjavaもrubyもpyもsmalltalkもosを作り出せてない。

250:デフォルトの名無しさん
12/05/22 09:00:17.00
Cの偉大さはけっして揺るぐものではないので、
たまにはAPLマシン、LISPマシン、Smalltalkマシン、Prologマシンのことも
思い出してあげてください。

251:デフォルトの名無しさん
12/05/22 09:13:05.99
>>228
URLリンク(github.com)


252:デフォルトの名無しさん
12/05/22 13:00:29.09
初心者すぎて昨日からスマソ
以下を実行した時に取得できるテキストをメモ帳に書きだすのはどうすれば良いでしょうか?
コマンドプロンプトに表示させる必要はないのでputはなくて良いのですが…

require 'rubygems'
require 'mechanize'
require 'kconv'

agent = Mechanize.new
agent.get('URLリンク(www.ruby-lang.org)')

agent.page.search('p').each do |p|
puts p.inner_text.tosjis
puts '---'
end

253:デフォルトの名無しさん
12/05/22 13:06:57.13
>>210
これ見て勉強します

254:デフォルトの名無しさん
12/05/22 14:00:13.09
>>252
まとめてやろうとすんな
一気にやろうとせずに段階踏んで別々にやって、その成果を最後に組み合わせろ

「自作の” ”で囲った文字列を画面に表示する」
「自作の” ”で囲った文字列を変数に代入し、変数の内容を文字列として画面に表示する」
「ファイルにアクセスしてその内容文字列を画面に表示する」
「変数の内容を画面に表示するかわりにファイルにアクセスしてそこに書き込む」
「実際にやりたいメソッドの戻り値を変数に代入し、ファイルにアクセスしてそこに書き込む」

前の4つができていないと、最後のひとつはできない

255:デフォルトの名無しさん
12/05/22 14:19:32.28
>>252がスクリプト実行するたびにRuby公式のサーバにアクセスしまくってるんだと思うと目頭が熱くなるな

256:デフォルトの名無しさん
12/05/22 14:24:06.14
`start notepad #{!!open((!require("open-uri")).to_s,"wb").print(open("URLリンク(google.co.jp)").read)}`

257:デフォルトの名無しさん
12/05/22 14:29:40.49

require 'rubygems'
require 'mechanize'
require 'kconv'

agent = Mechanize.new
agent.get('URLリンク(www.ruby-lang.org)')

a = ""
agent.page.search('p').each do |p|
  a << p.inner_text.tosjis
  a << '---'
end
file = "file_testest123456789.txt"
open(file,"wb") do |f|
  f.print a
end

system"start notepad #{file}"



258:デフォルトの名無しさん
12/05/22 14:34:33.58

require 'rubygems'
require 'mechanize'
require 'kconv'
require 'win32ole'
# gem install win32-clipboard'
require 'win32/clipboard'

agent = Mechanize.new
agent.get('URLリンク(www.ruby-lang.org)')

a = ""
agent.page.search('p').each do |p|
  a << p.inner_text.tosjis
  a << '---'
end

Win32::Clipboard.set_data a

wsh = WIN32OLE.new('Wscript.Shell')
wsh.run("notepad")
sleep 0.4
wsh.SendKeys"^v"


259:デフォルトの名無しさん
12/05/22 17:48:03.78
centos4.6に、ruby1.9.3-p194をインストールしたいのですが、
makeで、「rdoc」エラーで失敗して進めません。
調べたら、yumのレポジトリに、「dev.centos.org/centos/4/CentOS-Testing.repo」を
追加とあったのですが、今現在ファイルが存在しません。

centos4系でrdocとインストールするにはどうすればいいのでしょうか?

260:デフォルトの名無しさん
12/05/22 20:37:57.03
コマンドプロンプト以外を使ってみたく、
RDEを使ったところ、ものすごく使いづらいんですが、
他にrubyの実行ができるソフトってないんでしょうか?

261:デフォルトの名無しさん
12/05/22 21:04:05.10
>>257
トン!
notepadだと改行うまくいかないみたいなのでwordpadで開くようにしてみますた
あとはpとかdivで囲まれたところではなく欲しいところを書きだすように書き換えに挑戦
これは明日やります…

262:デフォルトの名無しさん
12/05/23 04:00:53.18
でも全世界のruby使いの学習の為に公式サイトは存在してる所は有るので。
perlやpyやphpのサイトとかで練習しないだけでも。

263:デフォルトの名無しさん
12/05/23 09:05:50.76
>>255
こう? get メソッドが動作することがわかったら実行行をコメントにして、
あらかじめ保存しておいた arakajime.html を読み込む動作にしばらく切り替えておく

require 'open-uri'
require 'kconv'
require 'rubygems'
require 'nokogiri'
def winsave_as(path, data)
open(path,'wb'){|f| f.print data.to_s.tosjis.gsub(/\n$/){"\r\n"}}
end
def get(url)
URI.parse(url).read
end
def search(html)
Nokogiri::HTML.parse(html).search('p').map{|e| e.text}
end
def notepad(path)
system "start notepad #{path}"
end

url = "URLリンク(www.ruby-lang.org)"
path = 'tekitou54.txt'
# html = get(url)
html = File.open('arakajime.html',rb'){|f| f.read}
data = search(html).join("\n---\n")
winsave_as(path, data)
notepad(path)


264:デフォルトの名無しさん
12/05/23 09:25:25.00
>>263
そんな感じっすな
実際問題としても、ネットアクセスとかデータベースアクセスとかはいちばん遅いはずなので、
スクリプト作成中にこの部分をローカルファイルの読み込みにしておくことの意義は大きい
マシンスペックにもよるけど、実行した直後に終わるはずだ

265:デフォルトの名無しさん
12/05/23 10:14:15.89
>>259
そろそろできた?

266:デフォルトの名無しさん
12/05/23 10:26:58.31
>>251
これしか選択しないですか?
gemでインストールできるものってないですかね?

267:デフォルトの名無しさん
12/05/23 19:18:47.13
なぜwindowsに拘ってるの?
もしくはなぜRubyに拘ってるの?

268:デフォルトの名無しさん
12/05/23 19:32:03.22
というか既存のはどこがダメなのか言ってもらわないとどうにも

269:デフォルトの名無しさん
12/05/23 20:49:17.57
やっぱり今流行のRedmineでプロジェクト管理したいですしRuby on Railsとかも勉強したいです
Windowsしか使ったことないのとPCが1台しかなくて、仮想マシン入れて動かせるほど良いスペックでもないです
ennouはWindowsによくあるインストーラ形式っていうのが引っかかるのでキツイです

270:デフォルトの名無しさん
12/05/23 20:52:40.93
わけがわからないよ。


271:デフォルトの名無しさん
12/05/23 20:58:05.38
VPS使ったら幸せになれるかもよ?

272:デフォルトの名無しさん
12/05/23 21:06:06.96
Apacheでmod_rubyだのFastCGIだの使って普通にRuby動作させるのじゃ何が不満なんだ

273:デフォルトの名無しさん
12/05/23 22:07:29.33
HTMLで<div>に囲まれた文字列を取得するのってinner_textですが
<div id=Main>から<div>までなど場所を指定して取得するのってどう書けばよいでしょうか
またこういうのってどうやってググれば良いでしょうか
『たのしいRuby第3版』買ったけど内容がやりたいことに追いついてない気がします

274:デフォルトの名無しさん
12/05/23 22:14:01.38
馬鹿が自己満足のために一足飛びにモノだけ教えたせいで被害が拡大してるな
君は怒っていいと思うよ

一発で出てこないということは、とりあえず正規表現を学ぶことをおすすめする
あんまり深入りすると抜け出せないので、 . + * ? () あたりの記号の使い方と意味だけわかれば充分
複雑な正規表現はとりあえずパスして、そのぶん ruby の if とか String#scan とか String#gsub とか String#split とかの機能を駆使する

正規表現で対処し切れなくなってからはじめて、HTML のパースライブラリの使用を検討するのが正当

275:デフォルトの名無しさん
12/05/23 22:24:49.99
>>274
ありがとうございます
基礎中の基礎みたいですねw
RubyがおすすめだからRubyでやれと言われた身ですが
自分には急に応用から学べと言われているようなものだったみたいです
かなり混乱してますが頑張ります

276:デフォルトの名無しさん
12/05/23 22:37:20.02
すいませんirbなんですがなんでこうなりますか?

irb(main):001:0> print("hello\n")
hello
=> nil

昔々使ったときは => nil とかって付かなかった
ような気がするんですが…。
ファイルに同じステートメントを書き込んで実行すると
hello
と表示されます。

どういうことなのでしょうか?
宜しくお願いします。

環境
CentOS6.2
インストールしたパッケージ
compat-readline5-5.2-17.1.el6.x86_64
ruby-libs-1.8.7.352-7.el6_2.x86_64
ruby-1.8.7.352-7.el6_2.x86_64
ruby-irb-1.8.7.352-7.el6_2.x86_64

277:デフォルトの名無しさん
12/05/23 22:56:08.29
説明めんどくさいんで、irbrcで検索しろ
irbがどういう表示をするのかは、ホームディレクトリとかの .irbrc とかで制御される
どっかのバージョンが変わったかなにかirb関係のgemが入ったかだと思われる

$ irb --prompt classic
irb(main):001:0> puts "hello"
hello
nil
irb(main):002:0>

$ cat ~/.irbrc
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 1000
IRB.conf[:PROMPT_MODE] = :CLASSIC

あと、Ruby では print "~\n" を使用することはまず無く、 puts "~" を使用する
それと、puts と p と print は引数のカッコをつけない

278:デフォルトの名無しさん
12/05/23 23:07:29.13
p { 1 => 10, 2 => 20 }

とかやって構文エラーに目が点になった思い出。
いまは理由分かるけど。


279:デフォルトの名無しさん
12/05/23 23:32:42.49
>>277
>irbがどういう表示をするのかは、ホームディレクトリとかの .irbrc とかで制御される
これが答えですね、ありがとうございます。
知りませんでした。

$ ls -a | grep irb
$
ないみたいですね。理由がわかって安心しました。
今は酔いが回ってきたので具体的な対処は後日します。

ありがとうございました。

>>278
irb(main):001:0> p ({ 1 => 10, 2 => 20 })
{1=>10, 2=>20}
=> nil
こうですかわかりません><

280:デフォルトの名無しさん
12/05/23 23:40:50.45
1.8.6の頃は:CLASSICの挙動だったはず
=> がデフォルトになったのは1.8.7だったかな

281:デフォルトの名無しさん
12/05/23 23:41:29.69
頭が痛い

282:デフォルトの名無しさん
12/05/23 23:50:25.61
最近なんとなく見てたけど、wordpadって単語が出てきて目をこすりまくった

283:デフォルトの名無しさん
12/05/24 09:14:15.18
p { } だとハッシュのinspectじゃなくてブロック付きメソッド呼び出しが
期待されちゃうのね。


284:デフォルトの名無しさん
12/05/24 10:03:18.60
>>282
いわゆるページャとして使ってるんだろうな、と思う
複数行や長い行のある文字列をコマンドプロンプト上で標準出力に表示しても確認しづらいということは否定はできん

285:デフォルトの名無しさん
12/05/24 10:41:47.92
うまいコンソールがないからね
msys版のminttyでbash使うのいいんだけどirbが動かねえ

286:デフォルトの名無しさん
12/05/24 12:07:34.37
Rubyやるならこれは入れとけって定番のgemはありますか?

287:デフォルトの名無しさん
12/05/24 12:17:42.07
>>286
あなたがrubyでやりたいことに必要なgem

288:デフォルトの名無しさん
12/05/24 12:34:45.15
ruby全体が超強力に強化されて超便利!!というようなgemはあんまし見ないな
配布しようにも相手が持ってないと意味ないわけで

なにしたいのかで聞けば、おすすめ定番くらいは誰か教えてくれるかもよ

289:デフォルトの名無しさん
12/05/24 12:46:54.56
該当部分の推定されるメソッドや引数のマニュアル内容をポップアップかミニバッファ表示してくれる機能の提供ってないの

arr = []
arr.push( ←ここでArray#pushのマニュアルが(半自動で)引ける

290:デフォルトの名無しさん
12/05/24 12:51:29.81
>>289
昔、riとEmacsでそういう連携があったことがあった気がした
カーソル部分の単語をメソッド名とみなして全検索して候補引っぱるんだったかな

Array#push([ obj1 [, obj2 ...]]) obj1 , obj2 ... を順番に配列の末尾に追加します

と1行表示してくれるだけでもありがたいんだけど

291:デフォルトの名無しさん
12/05/24 12:58:06.19
$ ri Array#push
Array#push

(from ruby core)
------------------------------------------------------------------------------
  ary.push(obj, ... ) -> ary

------------------------------------------------------------------------------

Append---Pushes the given object(s) on to the end of this array. This
expression returns the array itself, so several appends may be chained
together.

 a = [ "a", "b", "c" ]
 a.push("d", "e", "f")
    #=> ["a", "b", "c", "d", "e", "f"]

英語かよ

292:デフォルトの名無しさん
12/05/24 13:04:21.80
GETで送られてきたクエリ(○○の部分)を取得して、それをファイルを読み込むときのパスに利用します
URLリンク(localhost)○○
このときそのまま利用するのはセキュリティ上危険だと思うのですが
どのような対策を行えばよいでしょうか?

293:デフォルトの名無しさん
12/05/24 13:11:01.01
>>292
どうにもなんない
対象となるファイルシステムとシェルをすべて網羅して、危険となるアスキーまたはマルチバイトの文字列の並びをなんらかの安全な文字列に変換する

ライブラリがあると楽なんだけど、聞いたことないな

294:デフォルトの名無しさん
12/05/24 13:13:51.92
「読み込む」のなら、対象となるディレクトリのファイル一覧を持っておいて、クエリと完全一致するかどうかを調べて、
合致するならファイル一覧のほうの文字列を使ってFile.openすればいいんじゃないかな

書き込みファイル名をクエリから生成するのはめんどくさい

295:デフォルトの名無しさん
12/05/24 13:34:51.36
単純なアスキー文字シェル展開攻撃が「使えない」とわかった場合、攻撃者は必ずUnicode関連を試すと思われるので、
実のところはちょっと置換したくらいじゃちっとも安全じゃないんだよね

296:デフォルトの名無しさん
12/05/24 15:02:06.63
例えばgemで入れられる定番のwiki構文木ってありませんか?

297:デフォルトの名無しさん
12/05/24 17:38:04.79
C言語も冪乗をpower(,)なんて複雑にしないで、Rubyみたいに記号でシンプルに表記できれば良かったのに。

298:297
12/05/24 17:53:01.50
powerでなくpowでした。訂正します。

299:デフォルトの名無しさん
12/05/24 18:00:04.10
C言語は、コンパイラがインラインで生成するコードに対応するものは直接、式で書けるが
関数呼び出ししなきゃならんものは関数として提供する、というのが基本だから、それはない。

300:デフォルトの名無しさん
12/05/24 19:59:32.36
乗算の算術演算子とか記号*だけじゃないですか。指数もその気になれば**とかに出来たんじゃないですか。

301:デフォルトの名無しさん
12/05/24 20:08:11.88
シンタックスの話じゃない、というのが >>299 を読んでも理解できないわけ?

302:デフォルトの名無しさん
12/05/24 20:11:02.39
>>289
自分で作っちゃいなよ
おれもそんな感じのエディタをおっちらおっちら作ってる(いつ完成するのやら…)

303:デフォルトの名無しさん
12/05/25 00:11:35.56
Tkが動きません。
Ruby 1.9.2 Ubuntu11.10(VirtualBox)でやっています。

#!/usr/bin/ruby
require "tk"

root = TkRoot.new do
title "Ruby/Tk Test"
end

Tk.mainloop

と書いて実行すると、

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- tk (LoadError)
from <internal:lib/rubygems/custom_require>:29:in `require'
from hellotk1.rb:2:in `<main>'

と怒られます。
Tkは sudo apt-get install libtcltk-ruby でインストールしました。

ググってみると、tk-winとやったら動いたと書いてあるサイトがあったので、
gem install tk-win を試しましたが、
ERROR: Could not find a valid gem 'tk-win' (>= 0), here is why:
Found tk-win (0.2.2), but was for platform x86-mingw32
と、インストールできませんでした。

何が足りないのか、どうやって調べればいいのかわかりません。
お知恵を拝借いただけないでしょうか?

304:デフォルトの名無しさん
12/05/25 00:27:38.35
>>303
> Ruby 1.9.2
libtcltk-ruby1.9

305:uy
12/05/25 00:36:20.34
>>289-291
URLリンク(s1.gazo.cc)
URLリンク(s1.gazo.cc)
Ruby in Steel

これは?

306:デフォルトの名無しさん
12/05/25 01:54:53.84
テキストからTab

307:デフォルトの名無しさん
12/05/25 02:46:01.68
>301
理解できません。シンタックスって何ですか?

308:uy
12/05/25 02:52:35.36
ソースコードの見た目。

古い言語に文句いったって今更だから
もうC言語の事は忘れよ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch