Ruby 初心者スレッド ..
[2ch|▼Menu]
2:デフォルトの名無しさん
08/11/20 06:26:43
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?

A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
URLリンク(www.amazon.co.jp)

他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
URLリンク(www.amazon.co.jp)
「初めてのRuby」
URLリンク(www.amazon.co.jp)
「Ruby Way 第2版」
URLリンク(www.amazon.co.jp)

3:デフォルトの名無しさん
08/11/20 06:32:31
■前スレ
Ruby 初心者スレッド Part 22
スレリンク(tech板)

■関連スレ
Rubyについて Part 33
スレリンク(tech板)

Rubyの宿題教えてください。2限目
スレリンク(tech板)

RubyCocoa 初心者質問【Leopardバンドル記念】
スレリンク(mac板)

【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)

デザパタ + Python/Ruby/Smalltalk part2
スレリンク(tech板)

魁け! Ruby 1.9.X
スレリンク(tech板)

Rubyについて(アンチ専用) Part003
スレリンク(tech板)

【Ruby/SDL他】Rubyでゲーム制作・総合スレッド
スレリンク(gamedev板)

【Ruby】RubyonRailsPart6
スレリンク(php板)

4:デフォルトの名無しさん
08/11/20 06:33:07
【Rails】便利なRubyGemsを共有するスレ【Hpricot】
スレリンク(tech板)

5:デフォルトの名無しさん
08/11/20 06:33:54
■公式/非公式関連リンク
Ruby Home Page
URLリンク(www.ruby-lang.org)

Rubyリファレンス(よくサーバーエラーになります)
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-doc.org) (英語)

リファレンスのHTMLヘルプ版配布
URLリンク(elbereth-hp.hp.infoseek.co.jp)
# Windowsで便利

Ruby FAQ
URLリンク(ruby-lang.org)

Programming Ruby - The Pragmatic Programmer's Guide
URLリンク(www.ruby-doc.org)
# 好評書籍をWebで公開中、ただし英語

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

6:デフォルトの名無しさん
08/11/20 06:34:30
RAA - Ruby Application Archive
URLリンク(raa.ruby-lang.org)

RubyForge
URLリンク(www.rubyforge.org)
# Rubyのアプリやライブラリが検索できる

GitHub RubyGems
URLリンク(gems.github.com)
URLリンク(github.com)
# 最近は RubyForge より GitHub が人気

日本Rubyの会 公式Wiki
URLリンク(jp.rubyist.net)
# メニューに表示されていない埋もれた情報ページ多数

Rubyist Magazine - るびま
URLリンク(jp.rubyist.net)
# コードレビューが好評

Ruby hotlinks 五月雨版(日記やblogのアンテナ)
URLリンク(www.rubyist.net)

Rubyの本一覧
URLリンク(www.ruby-lang.org)

<rubyXML/>
URLリンク(www.rubyxml.com)

Matzにっき(Ruby作者の日記)
URLリンク(www.rubyist.net)

7:デフォルトの名無しさん
08/11/20 06:38:34
■最近できたWiki
Ruby 初心者スレッド Hiki
URLリンク(starlet.s145.xrea.com)

Ruby Portal
URLリンク(ruby.morphball.net)

■プレゼンテーション
Ruby会議2008
URLリンク(jp.rubyist.net)
URLリンク(www.nicovideo.jp)

Ruby会議2007
URLリンク(jp.rubyist.net)
URLリンク(www.nicovideo.jp)

8:2-7
08/11/20 06:40:23
テンプレ変更あり。Ruby入門書にRuby Wayを追加しています

9:デフォルトの名無しさん
08/11/20 08:38:13
luaみたいにCとrubyを連携するにはどうすればいいの?


10:デフォルトの名無しさん
08/11/20 08:52:17
>>9
RubyのソースやCで書かれた拡張ライブラリをさっくり読むとよいかも。
それ自身が、CとRubyの連携のサンプルになってます。

11:デフォルトの名無しさん
08/11/20 09:53:52
逆だろ、Cで書かれたアプリの組み込み言語としてRubyを使う方法なら
URLリンク(eto.com)
ここからリンクされてる先を見れ

12:デフォルトの名無しさん
08/11/20 11:00:07
RubyでXMLをYAMLのように簡単に扱う方法はないのでしょうか?
YAMLは読み込んだらツリーな連想配列になっていて簡単に使えますよね?
そのように、XMLを読み込んだら連想配列になっていて欲しいのですが・・・

もちろん、XMLは単純な構造を想定しています。

13:デフォルトの名無しさん
08/11/20 11:05:44
XmlSimpleってライブラリがあるよ
URLリンク(xml-simple.rubyforge.org)

14:デフォルトの名無しさん
08/11/20 11:48:47
>>13
おお!ありがとう。検索でもそのライブラリがひっかかりました。
使ってみたいと思います。

---以下チラシのウラ---
Ruby MagazineでYAMLの説明で、
「データを配列とハッシュとスカラーだけで表現する簡易性こそが YAML 」
なんていう名言?がありまして、YAMLはデータ記述(マークアップではなく)に
向いていて感激したのですが、プログラマさん以外には
(HTMLに似ている)XMLの方が馴染み深かったりするのですよ。
それでYAML感覚でXMLを使えたら置き換えできそうと思ったしだい

15:デフォルトの名無しさん
08/11/20 22:10:43
WIN32OLEを使ってエクセルを操作させようと思っているんですが、問題にぶつかったので質問させてください。
excel = WIN32OLE.new('Excel.Application')
excel.visible = false
excel.displayAlerts = false
などの定義の部分をクラス化し、使いまわそうと思っているんですが、
変数の"excel"や"sheet"辺りの変数について困っています。
というのも定義はクラスに任せ、実際の操作はメインソースでやろうと思っているのですが、
複数のインスタンスを作る際に変数をどうするかで悩んでいます。

何かうまい方法がありましたらご教授お願いします。

16:デフォルトの名無しさん
08/11/20 22:24:17
>>15
定型的な初期化処理をまとめるってことだよね?

def new_excel
 excel = WIN32OLE.new('Excel.Application')
 excel.visible = false
 excel.displayAlerts = false
 return excel
end
ex1 = new_excel
ex2 = new_excel


17:デフォルトの名無しさん
08/11/20 23:30:32
>>15
クラスじゃなくてモジュールだけど
module ExcelApplication
 def self.new
  app = WIN32OLE.new('Excel.Application')
  app.visible = false
  app.displayAlerts = false
  app.extend(self)
  return app
 end
 def hello ; p :hello ; end
end
excel = ExcelApplication.new
excel.hello
workbook = excel.workbooks.open(file)
sheet = workbook.sheets(1)

W32のapiは知らないんで前スレのを参考にした

18:15
08/11/21 00:43:35
>>16
ありがとうございます。とても参考になりました。
excel以外にもworkbookとsheetも定義する必要があり、教えていただいた方法のように個別にメソッドを定義しました。
一応WIN32OLEの定義部分のクラス化は出来たのですが、できればメインソースでインスタンスを生成するたびに
何度も(excel,workbook,sheet)を定義するのは避けたいのです。
現在↓
insname = NewExcel.new  #インスタンス生成
excel1 = insname.new_excel
workbook1 = insname.new_workbook
sheet1 = insname.new_sheet

まとめて定義する方法はありません・・・よね?
試しに・・・と思って以下のような物を書いてみましたがダメでした。
def new_excel(excel,workbook,sheet)
excel = WIN32OLE.new('Excel.Application')
excel.visible = false
excel.displayAlerts = false

excel.workbooks.open(file)
workbook = excel.workbooks(1)
sheet = workbook.sheets(1)

return excel,workbook,sheet
 end


>>17
ありがとうございます。モジュールですか。
メモリ節約などに役立ちそうですね。参考にさせていただきます。

19:デフォルトの名無しさん
08/11/21 04:46:10
そりゃダメだ。fileって変数がないぞう。
あと引数に代入しても、それはローカル変数だから意味がないよ。

def new_excel(file)
 excel = WIN32OLE.new('Excel.Application')
 excel.visible = false
 excel.displayAlerts = false
 excel.workbooks.open(file)
 workbook = excel.workbooks(1)
 sheet = workbook.sheets(1)
 return excel, workbook, sheet
end

excel, workbook, sheet = new_excel()

20:15
08/11/21 05:19:17
>>19
すみません、fileは上には書かなかったんですがちゃんと渡してます^^;
なるほど、メインソースの方で定義するときにnew_excelの引数として3つ定義するんじゃなく、
左辺に並べて定義するんですね!引数と変数ってのがちゃんと分かってなかったみたいです。
ありがとうございます。

21:デフォルトの名無しさん
08/11/21 14:18:55
Rubyにて、デスクトップで使うツールのインターフェスを作りたいと思っています。
webフレームワークを使おうとするとやっぱり、Railsとかになってしまうんでしょうか?
Railsはちょっと重そうだなーと思っていたのですが・・・

イメージとしてはベイジアンフィルタのPopFileのようなものです。
窓の杜 - POPFile
URLリンク(www.forest.impress.co.jp)

参考になるページはありませんでしょうか?
こういうのをやっている人っていないのかな・・・?

22:デフォルトの名無しさん
08/11/21 18:40:27
「重そう」というのが何のことなのかにもよるが、とりあえずRackを薦める

23:デフォルトの名無しさん
08/11/21 19:14:41
なんでRackなんだよ。
>>21
その程度なら、Railsとか使わず、素のCGIでいいと思う。
サーバはWEBrickを使えば、Apacheとかいらないし。
つうか、現状ではクライアントサイドアプリなら、Rails以外を考えたほうがいいんじゃないかな。

24:デフォルトの名無しさん
08/11/21 19:16:18
ごめん、「Rails以外」じゃなくて「Ruby以外」でした。

25:デフォルトの名無しさん
08/11/21 19:41:32
>>23
WEBrick使うのなら、それこそ素のCGIじゃなくてwebrick/cgiとか使えば良いと思うんだが・・・

Rackを薦めたのはミドルウェアが便利なのと、後からWEBrickやFastCGI等への対応が楽だから
逆に、なぜ今あえて素のCGI(cgi.rbだよね?)を薦めるのかが疑問

26:デフォルトの名無しさん
08/11/21 21:47:13
>>20
これ超オススメ。

Ruby による Win32OLE プログラミング
URLリンク(www.morijp.com)


石井さんありがとう・・・

27:デフォルトの名無しさん
08/11/21 22:05:56
>>25
もとの>>21を読もうよ。
>Rubyにて、デスクトップで使うツールのインターフェスを作りたいと思っています。
...
>イメージとしてはベイジアンフィルタのPopFileのようなものです。

RackとかFastCGIとかまったく関係ないよね?

28:15
08/11/21 23:24:16
>>26
お勧め紹介thxです。
ネットサーフィン中に偶然訪問してましたが、読みませんでした。
気合い入れて読んでみようと思います。
ありがとうございます。

29:デフォルトの名無しさん
08/11/22 00:44:54
>26
俺もそこを紹介しようとしてた。

>28
読め。

30:デフォルトの名無しさん
08/11/22 02:24:39
HTMLをopenuri等で取得してhead部分だけを抜き出そうとしました。

#!/usr/bin/ruby
#html => openuriで取れた値。値が入っていることは p html で確認済み
html = "<html><head>AA 2バイト文字とか改行とかいろいろ</head><body></body></html>"
/<head>(.+)<\/head>/ =~ html
p $1

::Console::
nil

まったくわかりません。
よろしくお願いします。

31:デフォルトの名無しさん
08/11/22 02:26:29
すいません、訂正です。
× /<head>(.+)<\/head>/ =~ html

以下どちらのパターンも同じ結果です。
○ /<head>(.+)<\/head>/imo =~ html
○ html  =~ /<head>(.+)<\/head>/imo

32:デフォルトの名無しさん
08/11/22 03:11:58
>>30
irbにコピペしたらちゃんと動いたよ?

irb(main):001:0> html = "<html><head>AA 2バイト文字とか改行とかいろいろ</head><body></body></html>"
=> "<html><head>AA 2バイト文字とか改行とかいろいろ</head><body></body></html>"
irb(main):002:0> /<head>(.+)<\/head>/ =~ html
=> 6
irb(main):003:0> p $1
"AA 2バイト文字とか改行とかいろいろ"
=> nil

33:デフォルトの名無しさん
08/11/22 06:15:54
>>27
そうか、FastCGIの必要性はあんまり無かったな
じゃあメリットはミドルウェアだけか

34:デフォルトの名無しさん
08/11/22 09:08:58
>>30
ん?>>31で動くパタンを自分で書いているけど、以下じゃ動かない理由を知りたいってこと?

/<head>(.+)<\/head>/ =~ html


答えは正規表現リテラルの m オプション。//imo の m ね。
m をつけるとピリオドが改行にマッチするようになる。
つけないと「AA 2バイト文字とか改行とかいろいろ」の「改行とか」にマッチしない。

URLリンク(www.ruby-lang.org)

Regexp.MULTILINE も参照。

35:30
08/11/22 12:51:43
色々試していただいてありがとうございます。

>>32
すいません、何故かnilなんです

>>34
>>30に書いたとき、実際に付けているimoオプションを書き込み付け加えるのを忘れていて、訂正として>>31に追加しました。

>>31のプログラムでもマッチしない状態です。

こんな感じで動かしても、htmlには取得したHTMLがちゃんと表示されていますが、$1はnilになります。
#!/usr/bin/ruby
response = (〜net/httpで取得したやつ〜)
html = response.body  #net/httpのbody部分を取得
p html   #取得したURL先のHTMLファイルが正常に表示される
html  =~ /<head>(.+)<\/head>/imo
header = $1
p header  #-> nil

なんです。改行とか文字コードの違いとかって落ちかなと思っているのですが
不特定多数な文字コードからUTF8に統一する、ってことできますか?

36:デフォルトの名無しさん
08/11/22 13:15:28
>>35
require 'net/http'
html = ""
Net::HTTP.start("www.yahoo.co.jp", 80){|http|
html = http.get("/").body
}
html =~ /<head>(.+)<\/head>/imo
header = $1

やっぱ動くって。
ruby -vと、変な省略をしない最小のコードを提示して。
ちなみにこっちは
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

37:30
08/11/22 14:07:35
#ruby -v
#ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

website ={
  "protocol" => "http",
  "hostname" => "e-words.jp",
  "parameter" => "",
  "pathname" => "/w/EZweb.html"
}

require 'net/http'
Net::HTTP.version_1_2
port = 80
resp = ""

Net::HTTP.start(website["hostname"], port) {|http|
resp = http.head(website["pathname"] + website["parameter"])
if resp['content-type'] =~ /text/i
  resp = http.get(website["pathname"] + website["parameter"])
end
}
p resp.body
resp.body =~ /<head>(.+)<\/head>/imo
head = "<html><head>#{$1}</head></html>"
p head #-> "<html><head></head></html>"


38:デフォルトの名無しさん
08/11/22 14:08:16
こんな感じです。
hostname => "www.yahoo.co.jp",
pathname => "/"
では正常に動きます。

39:デフォルトの名無しさん
08/11/22 14:10:57
あれ、そういえば正規表現に引っかからないときは p resp.body が取れてないことに気づきました。
どうも正規表現にとらわれすぎて視野が一直線になってしまっていたようです。
すいません。

40:デフォルトの名無しさん
08/11/25 01:03:09
sortメソッドより、sort_byメソッドを使った方が、効率が良いらしいですが、
じゃあ、sortメソッドは何の為に存在するのでしょうか?

41:デフォルトの名無しさん
08/11/25 01:21:31
数値や文字列などプリミティブなデータをソートする時

42:デフォルトの名無しさん
08/11/25 02:20:09
collection.sort{|x, y| x.foo <=> y.bar }
とか。

43:デフォルトの名無しさん
08/11/25 02:28:07
>42
x.foo==y.foo ? x.bar<=>y.bar : x.foo<=>y.foo
とかも書くね

44:デフォルトの名無しさん
08/11/25 03:19:53
def sort_by
map{|e| [e,yield(e)]}.sort{|a,b|a.last<=>b.last}.map(&:first)
end


45:デフォルトの名無しさん
08/11/25 12:07:52
質問です。
Rubyって1000分の1秒単位でsleepするにはどのように書くのでしょうか?


46:デフォルトの名無しさん
08/11/25 12:29:51
nanosleepってないんだっけ。
じゃあPOSIXな環境ではselectのようなタイムアウトを
ミリ秒などで指定できるシステムコールを使うのが
常套手段かな。
Windowsだとどうするのか知らないけど。

47:デフォルトの名無しさん
08/11/25 12:42:17
sleep(0.001)
とかじゃダメ?

48:デフォルトの名無しさん
08/11/25 17:27:58
質問します。
配列をCSVに書き込む際、配列の要素数がわかっていて例えば3個の場合は
 csv << [ array[0], array[1], array[2] ]
とすれば大丈夫だったのですが、
要素数がその時々で変わる場合はどうすればいいんでしょうか?

49:デフォルトの名無しさん
08/11/25 17:54:49
>>48
難しく考えちゃってるんだろうけど、Arrayクラスで渡せばいいんだから
csv << array

50:デフォルトの名無しさん
08/11/25 18:19:17
>>49
そのまま渡せばいいだけだったんですね
場所指定が必要なものだと思い込んでいました。
ご返答ありがとうございました。

51:デフォルトの名無しさん
08/11/25 22:53:39
>>47
100分の1の指定はできるですね。
1000分の1の指定は出来ないですね。

>>46
無料のレン鯖で動かす時に使うつもりです。

52:デフォルトの名無しさん
08/11/25 23:22:19
>>51
いや、普通に指定できるでしょ?
ただ、期待した長さで帰ってこないだけじゃないの?
1000分の1秒単位で正確にsleepさせたいときはOS選びから始めるしかないよ。

53:デフォルトの名無しさん
08/11/26 00:04:03
マザボ選びからだと思うよぅ

54:デフォルトの名無しさん
08/11/26 00:07:16
Rubyの文法上は可能だが、Rubyがsleepを依頼するOSのライブラリがサポートしてるかどうかまでは保証できない

55:デフォルトの名無しさん
08/11/26 06:53:36
OS選びっつーか、レンサバでは無理だ。
1000分の1秒単位でCPUのタイムスライスもらえるわけないでしょ。
ざらに1秒返ってこない。

56:デフォルトの名無しさん
08/11/26 10:12:58
ぶっちゃけ、ナニをさせるつもりなのかがちょっとだけ気になる

57:デフォルトの名無しさん
08/11/26 16:16:51
Windowsでsetpriorityやgetpriorityが使えない。
NotImplementedErrorで突っ返される。代替案はないの?

58:デフォルトの名無しさん
08/11/26 18:20:05
OpenProcessしてSetPriorityClass・GetPriorityClass

59:デフォルトの名無しさん
08/11/26 19:29:07
>>58
Win32APIの使い方がまったく分からんorz

MSDNを読むとOpenProcessのプロトタイプ宣言がこれだから
HANDLE OpenProcess(
DWORD dwDesiredAccess, // アクセスフラグ
BOOL bInheritHandle, // ハンドルの継承オプション
DWORD dwProcessId // プロセス識別子
);

どう指定しろと

60:デフォルトの名無しさん
08/11/26 19:45:54
URLリンク(msdn.microsoft.com)(en-us,VS.85).aspx

あとは根性で

61:デフォルトの名無しさん
08/11/26 20:04:12
>>60
定数の値が分からん\(^o^)/

62:デフォルトの名無しさん
08/11/26 20:23:46
>>61
Platform SDKを手に入れてヘッダの中を探すんだ

63:デフォルトの名無しさん
08/11/26 21:36:30
>>61
ぐぐれ

64:デフォルトの名無しさん
08/11/27 10:43:40
windows-prをgemで入れれば、↓こんな感じでいけるかな?
URLリンク(gist.github.com)

65:デフォルトの名無しさん
08/11/27 13:13:54
CSVってクラスでCSV読み込みが出来るけど
CSVのエンコーディングを明示的に指定したいときは、
一回KConvかまして$KCODEで指定したエンコードに変換後に
CSVクラスへ渡すしかないかな?

66:デフォルトの名無しさん
08/11/27 18:42:36
Rubyを勉強しようと思い(超初心者)
URLリンク(www.moongift.jp)
からダウンロードした RailsPortable っていうフォルダを
PCのハードディスクに展開すると170MB程度の大きさなのですが
そのフォルダをUSBメモリにコピーすると900MBを超える大きさになります

なぜでしょう?

ちなみにこのアプリでRubyの勉強をすることは可能ですよね?
自宅外(自分専用のPC持ってません)のPCを使って学習出来ればと思いまして

67:デフォルトの名無しさん
08/11/27 18:44:13
>>66
見てないけどクラスタギャップじゃないの?

68:デフォルトの名無しさん
08/11/27 18:56:22
RubyやRailsは小さいファイル多いからな
本体は1KBしかなくてもディスク上は4KB占有するとかそんなんだろ

あとRubyの勉強をしたいならRailsには触れたら駄目
RailsはRubyの機能を使っただけの全くの別物

69:デフォルトの名無しさん
08/11/27 19:02:37
Railsは「黒魔術の塊」と称されるほどに
強力だがRuby的には怖いフレームワーク
入門に勧められるかは微妙な所

70:デフォルトの名無しさん
08/11/27 20:31:46
いや、そもそも不可だろ
それがRubyなのかRailsなのか分けることができない

Rubyを知っている人間がRailsをやるからパワフルに使えるんだ
素直にRubyだけを使っておけ
Ruby + rubygems でたいていの用事は済む

71:デフォルトの名無しさん
08/11/27 20:35:55
超初心者というのがRubyの初心者なのかプログラムの初心者なのかによるんじゃないか?

72:デフォルトの名無しさん
08/11/27 20:37:16
>>64
ありがとうございます

73:デフォルトの名無しさん
08/11/27 20:45:32
gemsは重すぎて使えない

74:デフォルトの名無しさん
08/11/27 20:47:45
gemは動作が重い上に、進行状況を表示してくれないのが困る
今どの辺まで作業が進んでるのか分からないから
余計に待ちが長く感じてしまう

75:デフォルトの名無しさん
08/11/27 20:51:14
aptくらいさくさくいけないのか

76:デフォルトの名無しさん
08/11/27 20:51:19
gem のインストールは Rubygems のバージョンが古いと遅いよ
無理してでも最新版入れれ
一晩経っても終わらなかったインストールが1分で終わるぞ

77:デフォルトの名無しさん
08/11/27 20:54:16
一晩経っても終わらなかったってのは、そもそも動いてたのか?

78:デフォルトの名無しさん
08/11/27 21:04:34
その「動いているかどうか」を判りやすくするために >74 が「進行状況」と言ってるんだよね

79:デフォルトの名無しさん
08/11/27 21:08:21
>>76
ほんとだ。

Ubuntu Hardyのaptで入れられるrubygemsパッケージのは
0.9.4とかで糞重かった。

1.3.1だと軽かった。
けど、>>74の言う通りなーんも進行状況がでなかった。

合ってるかどうかはほっといて
URLリンク(0xcc.net)
これとかでプログレスバーでも出してくれればいいかもかも。

80:デフォルトの名無しさん
08/11/27 21:10:36
例の10MBくらいのYAMLの話だな
展開のために必要なメモリのないパソコンでは動作しない極悪仕様
しかもrubygem開発者たちのモンスターマシンではさくさく動いてるから誰も問題に気づけなかった

>>77
原理上は動いてはいたはず
メモリとスワップ全部使い切ってるから動いてるように見えないだけで

>>78
だから rubygems のバージョン 1.1 だか 1.2 だかで解消されたって
あの最初の YAML 展開時間を待てないパソコンはスペック的に重症だぞ

81:デフォルトの名無しさん
08/11/27 21:28:14
いいこときいた。サンクス。
メモリ200M台の古いノートでgemが実質上使い物にならなくて
パッケージインストールめんどくさいなと思ってたんだけど
oneclick installer 186-26も0.9.4で古いものだったんだなぁ。

82:デフォルトの名無しさん
08/11/27 21:35:10
>>80
俺のPCだと、今のrubygemsでもパッケージインストールまで20秒〜30秒くらい
デカい奴だと1分ぐらいかかることもある(RDocやriのインストール時間は除く)
その間、ほとんど進行表示がないのは辛い

83:66
08/11/28 06:51:49
>>67〜71
遅くなりましたが
レスありがとうございます

自分はプログラムの初心者なのでRails(フレームワーク?)のことは
よく解らないのですが、RailsPortableって言うのはPCにインストールせずに
Rubyが動くみたい?な事と、実際に起動してRubyのコマンドを入力すると
Rubyが返ってきてる気がするので、素直にRubyの構文の勉強に使う事も
可能なのかなと思いまして それにUSBメモリ安いですし

それにしても『黒魔術の塊』ってのはカッコ良いですね


84:デフォルトの名無しさん
08/11/28 11:03:56
>83
カッコイイ響きかも知れんが、その意味するところは
「あまり良くない方法を沢山使っちゃってる」
って話だと思う

85:デフォルトの名無しさん
08/11/28 11:41:04
RailsはWebアプリを作る道具としてはよくできてるが、
Rubyライブラリとしては最低の作りだろ。

86:デフォルトの名無しさん
08/11/28 15:28:58
あるメソッドがどのクラスやモジュールで定義されているかを調べる方法ってありますか。
たとえば Array#collect は Array ではなく Enumerable で定義されているということを、
Ruby の機能を使って検出したいです。
ここで、もし Array#collect が Array クラスで再定義されていたら、もちろん「Arrayで定義されている」ということを検出します。

87:デフォルトの名無しさん
08/11/28 16:07:30
…何に使うん?

88:デフォルトの名無しさん
08/11/28 16:31:11
そのものずばりの機能は知らんなあ
自分ならancestorsを一つ一つinstance_methods(false)で検査すると思う
もうオブジェクトがあるならObject#methodのinspect見るのも楽

89:デフォルトの名無しさん
08/11/28 16:33:25
どっちにしてもそもそもがあまりスジのいいものではないね
ほかの方法を検討するほうがうまくいくかもしんない

90:デフォルトの名無しさん
08/11/28 17:41:18
「あるメソッド」っていうのが何かによるかな。
ほんとにただ名前を知ってるだけっていうなら、それこそ同名のメソッドなんてあちこちにあるわけで。
MethodとかUnboundMethodオブジェクトしてもう既に手元にあるなら、
RUBY_VERSION >= '1.8.7' なら #owner っていうメソッドがある。

91:デフォルトの名無しさん
08/11/28 18:29:50
jruby -v

と入力すると、「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」

というエラーが出力されるのですが、原因は何でしょうか?jrubyは普通に使えて
コンパイルもできます。

92:デフォルトの名無しさん
08/11/28 19:43:07
>>88
instance_methods() にfalseを渡すと、親クラスをたどらないようになるんですね。
知らなかったです。
これで希望のことができそうです。
ありがとうございました。

93:83
08/11/29 07:41:48
少しばかしRails(フレームワーク)のことを調べてみたのですが
自分がやろうとしているのは、核ミサイルさえ搭載可能な
ジェット戦闘機を使って 自動車(AT)の運転を学ぼうとしている
ようなものなのかな?と思いました

けどRailsPortable以外に
RubyをPCにインストールせずに動かすアプリとか
環境とか無いですよね?

94:デフォルトの名無しさん
08/11/29 08:19:34
あまりないな
Railsガン無視でRuby部分だけ使うことは可能だから、意識してRubyだけ使うぶんには問題なかろう

95:デフォルトの名無しさん
08/11/29 08:59:07
>>93
ドライブ文字が決め打ちできるなら
USBメモリにruby本体を入れて、NYAOSなんかのコマンドラインシェルから
PATH環境変数を上書きするように設定すれば
RubyPortable的なこと(=インストールなしで動かすこと)ができる

俺はこの方法で実際にRubyPortableを作ろうとしたけど、ドライブ文字の検出方法が思いつかずに断念した

96:デフォルトの名無しさん
08/11/29 09:01:33
意外とこれで間に合ったりして
URLリンク(tryruby.hobix.com)

97:デフォルトの名無しさん
08/11/29 09:43:33
>>95
ディレクトリ構成は既知なんだからNYAOSを使わなくても、バッチで Ruby 自体を立ち上げて
system 'cd \\'
drive_name = `cd`
とかすればいいんでないの?

98:デフォルトの名無しさん
08/11/29 09:56:37
>>97
%~d0 でバッチファイルがあるドライブ文字が取れるよ。
ちなみに %~p0 でバッチファイルがあるディレクトリ
%~dp0 でドライブ文字+ディレクトリ

99:デフォルトの名無しさん
08/11/29 16:29:14
ファイルセパレーターの変換って一般的にどうやってます?
path.gsub!(/\//, "\\")
とやると、/が\\になってしまうのですが。
\になるようにするにはどうすれば良いんでしょうか?


100:デフォルトの名無しさん
08/11/29 16:31:09
>>97-98
ありがとう、おかげで念願のRubyPortableが完成した
(ファイルサイズを軽くするために、98のバッチファイル方式を採用させてもらいました)

101:デフォルトの名無しさん
08/11/29 16:32:10
>>99
> puts "path/file".gsub("/", "\\")
path\file

102:デフォルトの名無しさん
08/11/29 16:34:49
>>101
obj = 'j:/test/obj'
obj.gsub!("/", "\\")
p obj

"j:\\test\\obj"

となってしまいます。\\でも良いのかなぁ?コンソールの仕様?

103:デフォルトの名無しさん
08/11/29 16:36:59
>>102
ダブルクォーテーションもついてるぞ

104:デフォルトの名無しさん
08/11/29 16:37:10
pだから。


105:デフォルトの名無しさん
08/11/29 16:37:19
>"j:\\test\\obj"

"j:\test\obj"
なんてソースに書いたら問題あるのはわかるよね?
pの出力っていうのはそういう仕様、だから>>101ではputs使ってる。

106:デフォルトの名無しさん
08/11/29 16:38:53
なるほど。ありがとうございました。


107:デフォルトの名無しさん
08/11/29 19:18:03
自分のメソッド名を取得する方法ってないですかね?
具体的には

def hoge
 p 自分のメソッド
end

hoge #=> "hoge"

というのが欲しいんですが

108:デフォルトの名無しさん
08/11/29 19:25:10
caller(0)をチェックしてみるとか

109:デフォルトの名無しさん
08/11/29 19:30:46
URLリンク(d.hatena.ne.jp)
class Object
def current_method
begin
raise StandardError
rescue StandardError => e
e.backtrace[1].scan(/`(.*)'/).to_s
end
end
end

ぐぐってみたらこんなので可能ではあるけど
標準ではできないかなぁ

110:デフォルトの名無しさん
08/11/29 20:26:14
自分自身の名前を知ることなく再帰呼び出しをしたいとかいう話なら
Yコンビネータでぐぐるとよろし。


111:デフォルトの名無しさん
08/11/29 21:45:32
RUBY_VERSION >= '1.8.7' だと
__method__というのが。

112:デフォルトの名無しさん
08/11/30 00:39:57
__METHOD__はRubuniusだっけ?

113:デフォルトの名無しさん
08/11/30 07:17:47
extractcontentを使っている人いませんか?
ブログから本文のみを抜き取りたいのですが・・・・。
gemで入れたんですけど、作者のブログにあるサンプルが実行できません。
URLリンク(labs.cybozu.co.jp)

エラーは
extract.rb:7: uninitialized constant ExtractContent::Extractor (NameError)
なんですけども。

114:デフォルトの名無しさん
08/11/30 11:42:01
Hashについて教えていただきたいのですが
rubyのHashはどのぐらいの容量を保持できるのでしょうか?
メモリが許す限りの容量を代入していけるのでしょうか?

環境:MacOSX10.4
ruby 1.8.7

よろしくお願いいたします。

115:デフォルトの名無しさん
08/11/30 15:46:52
>>113
サンプルコード動いたけど。
$ ruby -v
ruby 1.8.6 (2008-08-11 patchlevel 287) [i686-linux]
$ gem -v
1.2.0
$ gem list | grep extractcontent
extractcontent (0.0.1)

>>114
メモリが許す限りだけど、どのくらいメモリがあるかは感知しないので、
物理メモリを超えて使おうとすればスラッシングして涙目に。

116:デフォルトの名無しさん
08/11/30 19:34:07
>>113
$ ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
$ gem --version
1.3.1

でも動作した。
エラーからして、ExtractContentは定義されてるけどExtractorまでは定義されてないってことになるが
妙だな。1ファイルに収まるライブラリなのに。

117:デフォルトの名無しさん
08/11/30 19:57:18
カレントディレクトリにextractcontent.rbってテストで作っててその中でモジュール定義してるとか

118:113
08/11/30 19:58:20
>>115>>116
自分も動きました。
一度間違ってrootでないアカウントでgemインストールしてしまい、
それを消して、再度rootで入れました。そのときに~/.gemができてそれ以下を読みに行こうとしてたっぽいです。
どこの設定に.gem以下を読みに行くかわからないのでユーザ作り直して、そこで実行するときちんと動作しました。


119:デフォルトの名無しさん
08/12/01 10:57:38
書籍「Ruby レシピブック第二版268の技」のP.289のスクリプトを動かしたんですが、
結果がちょっとおかしいです。

class Numeric
def round_n(nth)
num = self*(10**(-nth))
return num.round()*(10**nth)
end
end

num = 438.1728
p num.round_n(-3) #=> 438.173

結果は↓
Rational(438173, 1000)

何がいけないんでしょうか?よろしくお願いします。



120:デフォルトの名無しさん
08/12/01 11:14:40
>>119
何がどうおかしいと思うの?

121:119
08/12/01 11:26:11
>>120
本来"438.173"と表示されるはずが"Rational(438173, 1000)"と表示される辺りです。
Rational(438173, 1000)と表示されるのが正しいのでしょうか?


122:デフォルトの名無しさん
08/12/01 12:08:37
>>121
それは、実行前のどこか
(irbで前に実行したスクリプトか、あるいはrequireで読み込んだ野良ライブラリのどこか)で
require 'rational'
をしている

何もしてない状態ではFloatが返る

123:デフォルトの名無しさん
08/12/01 12:26:28
raise "message" と
raise XxxError.new("message") と
raise XxxError の
違いがわかりません。どう使い分けるべきでしょうか。

124:デフォルトの名無しさん
08/12/01 12:28:03
>>121
なるほどそう読むのか。
Rational で返ってくるということはどこかで Rarional を require してるんだよな?
そうすると、こんな具合↓に演算子が再定義されるとのこと。
URLリンク(doc.loveruby.net)

125:デフォルトの名無しさん
08/12/01 13:39:45
>>123
見たままそのまんまです
例外というシステムはユーザーに情報を伝えることだけが主目的じゃないわけで

ユーザーに情報を伝えるだけなら旧来の
「スクリプト○○行目の○○メソッドで引数○○がエラー起こしましたので終了します(・ε・)プップクプー」
と表示して即終了するだけでいいんだしさ

1行目は捕捉しても意味がないエラー(エラーが出たこと自体がまずいとき)
2行目は捕捉して回復処理を行えうる例外
3行目は捕捉可能でユーザーにも情報を与えたいとき

組み込みの例外のうちどんなものをどんなときに使うか、というのは特に定まってないので好きに悩め
引数が間違ってるからといって必ず組み込みの ArgumentError を使わなければならない
(オリジナル例外もこれを継承しなければならない)というわけではない

126:デフォルトの名無しさん
08/12/01 13:49:58
自分で例外クラス作るのは公開する気のあるモジュールだけだな
作ってる最中は全部 raise "message" になってる
中間的な一時的変数の名前考えるのめんどくさいという話に少し似ている

127:119
08/12/01 14:58:03
>>122,124
rubyを始めた頃にirbでやったみたいです。(単品で動かしてもRationalになるため)
戻し方が分からないので.to_fで対応しておきました。
ありがとうございました。

128:デフォルトの名無しさん
08/12/01 15:33:05
ここで出る例外をキャッチできればこっちでなんとかするのに、と思えるモジュールほどRuntimeErrorしか出さない
例外を使いこなすのははセンスが要るねえ

129:デフォルトの名無しさん
08/12/01 15:38:30
Matzが例外について熱く語ってる記事とかない?
C#の中の人だとこういうのがあるんだけど
URLリンク(www.artima.com)

130:デフォルトの名無しさん
08/12/01 16:23:28
最初の分厚い黄色い本に何か書いてあるかも
例外機構については適当に導入したんだと思う

131:デフォルトの名無しさん
08/12/01 16:54:01
アスキーから出てた奴だよね。チャンスがあれば読んでみる。ありがとう

132:デフォルトの名無しさん
08/12/01 19:08:35
>>123

raise "message"
-> raise RuntimeError, "message"
raise XxxError.new
-> raise XxxError
raise XxxError
-> raise XxxError

2番目は例外オブジェクトを渡す形式。
なんかどっかに取っておいてある例外を raise @ex みたいに挙げるとか。
例外を挙げる前にアクセサを呼んで情報をセットするときとか。

一番使われてるのは3番目じゃね?
raise XxxError, "message"
-> raise XxxError.new("message")
と同じ。

1番目の形式は3番目の形式の省略形と言えるけど、これに合わせて
rescueでも例外クラスを省略するとRuntimeError以下を捕捉する。

捕捉するな、ヤバいことになったぞ、ってときはExceptionとかRuntimeErrorよりスーパークラスな
もの挙げたほうがいいと思う。

133:デフォルトの名無しさん
08/12/01 21:50:27
>>125
>1行目は捕捉しても意味がないエラー(エラーが出たこと自体がまずいとき)

うそつけ。
raise "message" は単にエラークラスを省略しただけであり、「捕捉しても意味がない」なんてことはない。

>2行目は捕捉して回復処理を行えうる例外
>3行目は捕捉可能でユーザーにも情報を与えたいとき

逆だろ。
ユーザに情報を与えるなら raise XxxError じゃなくて raise XxxError.new("message") のほう。

初心者スレでこんなウソを垂れ流さんでくれ。初心者が間違って覚えてしまうだろうが。
それともなんかの工作員か?

134:デフォルトの名無しさん
08/12/01 21:59:28
>>132
>rescueでも例外クラスを省略するとRuntimeError以下を捕捉する。

ウソつけ。
rescue =< ex
で捕捉されるのはStandardErrorだ。

>捕捉するな、ヤバいことになったぞ、ってときはExceptionとかRuntimeErrorよりスーパークラスな
>もの挙げたほうがいいと思う。

ひどい日本語だな。「ExceptionやRuntimeErrorより...」と読み間違えてしまうじゃないか。

「捕捉するな、ヤバいことになったぞ、ってときは、Exceptionのような
StandardErrorよりスーパークラスなものをあげたほうがいいと思う。」
「捕捉するな、ヤバいことになったぞ、ってときは、StandardErrorより上位の例外クラスを使ったほうがいいと思う。」

自分の日本語力のなさを「2chだからどうこう」と言い訳すんなよ?



135:デフォルトの名無しさん
08/12/01 22:15:39
>>133-134が一体何にそんなに怒ってるのかが理解できない

136:デフォルトの名無しさん
08/12/01 22:55:54
Ruby使ってる人間であれば、普通に怒るべきところだと思う

137:132
08/12/02 01:54:41
>ウソつけ。
>rescue =< ex
>で捕捉されるのはStandardErrorだ。
フォローthx、ふつーに間違えた。
でもrescue => ex だと思う。肩の力抜けよ。

>ひどい日本語だな。「ExceptionやRuntimeErrorより...」と読み間違えてしまうじゃないか。
いいじゃん、Exceptionより上の例外クラスないし。

138:デフォルトの名無しさん
08/12/02 02:18:02
そもそも raise Exception とか書いたら
rescue Exception => ex とか書く奴が絶対出てくると思うんだが

139:デフォルトの名無しさん
08/12/02 02:27:28
けどライブラリのバグとかを教えるのにException挙げるぐらいしか手がないんだもんよん。
Rubyスクリプトからfatal触れないし。
JavaでError(だっけ?)系統の例外を捕捉するのがいい顔されないみたいに、やったら叱るしか
ないんじゃないのかなぁ…
irbみたいなのを書けるように、そう書けること自体は多分必要だし。

140:デフォルトの名無しさん
08/12/02 06:04:02
>>135
その人にとってRubyは神聖なものでRubyしか取り柄がないのですよ
だから普通の指摘ができない

141:デフォルトの名無しさん
08/12/02 11:16:08
2chだからといって出鱈目過ぎる奴はどうかと思うがな

142:デフォルトの名無しさん
08/12/02 11:22:58
>>140
間違ったことをしたり顔で書いてる人にいわれてもなあ・・・

143:デフォルトの名無しさん
08/12/02 11:24:47
>>139
>けどライブラリのバグとかを教えるのにException挙げるぐらいしか手がないんだもんよん。

どういう意味?

144:デフォルトの名無しさん
08/12/02 11:39:19
普通に指摘できないのは壊れてる証だとは思う
MLでも時々見る
記名でできるのはある意味凄いが真似したいとも思わん

145:デフォルトの名無しさん
08/12/02 15:54:47
>>143
Cではassertマクロを使うような場所というか…

case value
when :hoge
 ...
when :piyo
 ...
when :foo
 ...
else
 #絶対に来ないはずの分岐
 raise Exception, 'must not happen'
end

みたいな。るびまで読んで使い出した。

146:デフォルトの名無しさん
08/12/02 16:35:17
さいきんやっとREXML::Document関連の使い方をうっすら覚えた程度の初心者ですが、
get_elementsで要素ごとに引っ張り出すようにしたら
その数が20個くらいに膨れ上がりました。
その処理が終わるまでものすごく遅くなる(終了まで10秒程度)ですが、
何か高速に行なう方法とかないですか?
通常要素ね具体的には特定のタグ名ごとに特定の変数に入れる処理を一番高速にやるにはどのようにするのが一番いいでしょうか。

147:デフォルトの名無しさん
08/12/02 16:45:40
gem の Hpricot などの C で書かれた高速なパーサを利用してるライブラリを使う

REXML は「全部 Ruby で書かれてる! Ruby 最高!」という人が使うライブラリ
遅いなと思ったら(そしてプログラムのインストールが可能な環境なら)即っと乗り換えてよし

148:デフォルトの名無しさん
08/12/02 17:12:48
Speed Comparison libxml vs. rexml
in seconds libxml rexml
opening 0.003954 0.104750
attribute_add 0.001895 0.011114
subelems 0.000585 0.004729
xpath 0.013269 2.981499

149:デフォルトの名無しさん
08/12/02 20:11:30
>>147
無料のレンサバってインストールできるでしょうか?

150:デフォルトの名無しさん
08/12/02 20:22:07
最近のレンタルサーバってインストールするものなのか?

>>149
そのレンタルサーバサービスでrubygemsのユーザーインストール実績があればたぶん可能
まあ、つまり、無料レンタルサーバではきっと無理だろうな
俺はRubyスクリプトを外部使用するためだけにさくらインターネットの年5千円プラン使ってる

151:デフォルトの名無しさん
08/12/02 20:29:02
REXMLは遅くなってしまう処理はどう足掻いてもとことん遅い
Ruby以外の外部プログラムにぶん投げて結果を置換してevalしたほうが速いとかマジキチ

152:デフォルトの名無しさん
08/12/02 20:42:06
>>146
SAXライクなAPIがあったと思うので挑戦してみては
REXML SAX でぐぐったらそれなりに引っかかるようだ

153:デフォルトの名無しさん
08/12/02 22:21:20
evalの中で「evalをする」を記述することはできる?

eval(<<EOS)
def hello(person)
eval "Hello, #{person}!"
end
EOS

これはエラーになるよね
> NameError: undefined local variable or method `person' for main:Object


154:デフォルトの名無しさん
08/12/02 22:41:36
そこで2重にする意味が分からんけどこういうこと?

eval(<<EOS)
def hello(person)
"Hello, \#{person}!"
end
EOS


155:デフォルトの名無しさん
08/12/02 22:45:27
>>153
そもそも2重evalで何がやりたいのかを詳しく
そのサンプルコードでは、意図がよく分からない

156:デフォルトの名無しさん
08/12/02 23:03:12
それはさすがに見たままなんじゃね

def hello(person)
 return eval("Hello, #{person}")
end

という。eval文の入ったメソッド定義そのものをeval文で書きたいのだろ

157:デフォルトの名無しさん
08/12/02 23:05:29
EOSは何もくくらないと、"EOS"と同じ扱いになる
つまり文字列全体をダブルクオートでくくったのと同じ状態になるので、展開が起きる
外側のevalに渡された文字列を評価する時点で#{person}が展開されちゃって、変なことになってる

展開を抑制するのが楽な回避法。'EOS'とすべし

helloメソッドは文字列を返したいのかもしれないけど、
それだと内側のevalにも括弧が足りない

eval <<'EOS'
 def hello(person)
  eval %q[ "Hello, #{person}!" ]
 end
EOS

print hello("Ruby") # => Hello, Ruby!

158:デフォルトの名無しさん
08/12/02 23:08:58
それは展開されないと困るんじゃないかなあ
変数展開がないならメソッド定義をevalで書く必要なくね?

159:デフォルトの名無しさん
08/12/02 23:41:34
rubyでnet/sshを使おうとしてるのですが、標準入力の使い方がわかりません
それっぽいのがここしかないけど
URLリンク(webos-goodies.jp)
他にないですか?

やりたいのはsshで他サーバーに接続して、suでパスワードを入力し、
grep + パラメータを実行しその結果をブラウザに出力したいです

初めてrubyを使って無謀なことをしてる気もしますが、標準出力はどうにかなりましたが、
入力がどうもうまくいかず

net/sshのリファレンスページもみましたがいったいどこを探せばメソッド載ってるのかわからない
です

160:デフォルトの名無しさん
08/12/03 20:05:45
>>159
URLリンク(net-ssh.rubyforge.org)
URLリンク(rubyforge.org)


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4282日前に更新/244 KB
担当:undef