08/11/20 04:30:21
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
【最新安定版の Ruby1.8.7 の使用をお勧めします】
※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。
1.9 の新機能の一部が利用可能なので初学者にお勧めです。
※ただし十分安定しているとは言えないので
プロダクション環境での利用にはお勧めしません。
関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す URLリンク(www.ruby-lang.org)
・FAQを一応読む URLリンク(www.ruby-lang.org)
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
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)
161:デフォルトの名無しさん
08/12/03 22:56:25
>>160
うおおありがとう!まさに求めていた物だ!
162:デフォルトの名無しさん
08/12/04 07:14:05
Rubyで書かれたblog用のCGIってないですか?
163:デフォルトの名無しさん
08/12/04 07:21:24
>>162
その質問には、熟慮の末に「ない」と答えるのが妥当な気がする
164:デフォルトの名無しさん
08/12/04 07:25:21
>>163
ということは、あるにはあるけど使えないとか、そんな感じですか?
165:デフォルトの名無しさん
08/12/04 07:25:57
「ぶろぐようのしーじーあいありますか?」という質問に応えられるレベルのものはないな
素直にPHPかPerlの使っとけ
166:デフォルトの名無しさん
08/12/04 08:37:00
>>165
一応名前だけでも教えてください。
167:デフォルトの名無しさん
08/12/04 09:48:40
>>162
tDiary、Pinky:blog、lily
もしかして普通に名前挙げた俺、空気読めてない?
168:デフォルトの名無しさん
08/12/04 10:00:59
「ぶろぐようのCGI」というものを求めてる人には結構アレなシロモノだと思う
Rubyをやりたいんじゃなくてブログシステムが欲しいんだろうし
169:デフォルトの名無しさん
08/12/04 10:16:04
tDiaryより設置しやすく使いやすい軽快なものを作ろうとしてるのかもしれないじゃないか
日本における Perl の隆盛は Perl でカウンタと掲示板が作られたことだからな
「なんかごっつい Rails だけじゃない Ruby」を推進するなら今しかない
170:デフォルトの名無しさん
08/12/04 10:52:08
>>158
はい。
['hello', 'goodbye'].each do |greeting|
eval(EOS)
def #{greeting}(person)
eval "#{greeting.capitalize}, #{person}!"
end
EOS
end
実際はこんな感じです。展開抑制されると思わなかったので…
171:デフォルトの名無しさん
08/12/04 18:56:49
2重にしてでもevalを使いたいのは、リフレクションで
トップレベルにメソッドを定義するため?
172:デフォルトの名無しさん
08/12/04 21:28:23
>>170
ふつーはこう書く
['hello', 'goodbye'].each do |greeting|
eval(<<-EOS)
def #{greeting}(person)
'#{greeting.capitalize} %s!'%person
end
EOS
end
173:デフォルトの名無しさん
08/12/05 12:24:58
採点用プログラムを書いてるんですが、得点ごとの振り分けでちゃんと動きません。
【ちゃんと動くプログラム】
if 90<=tokuten ; foo[9] += 1 ; end
if 80<=tokuten && tokuten<90 ; foo[8] += 1 ; end
if 70<=tokuten && tokuten<80 ; foo[7] += 1 ; end
if 60<=tokuten && tokuten<70 ; foo[6] += 1 ; end
if 50<=tokuten && tokuten<60 ; foo[5] += 1 ; end
if 40<=tokuten && tokuten<50 ; foo[4] += 1 ; end
if 30<=tokuten && tokuten<40 ; foo[3] += 1 ; end
if 20<=tokuten && tokuten<30 ; foo[2] += 1 ; end
if 10<=tokuten && tokuten<20 ; foo[1] += 1 ; end
if 0<=tokuten && tokuten<10 ; foo[0] += 1 ; end
【上記では長いのでイテレータで短くしたプログラム(正しく動かない)】
(1..8).each do |i|
if (90<=tokuten && tokuten<=100) ; foo[9] += 1 ; end
if (i*10)<=tokuten && tokuten<(i+1)*10 ; foo[i] += 1 ; end
if 0<=tokuten && tokuten<10 ; foo[0] += 1 ; end
end
配列はちゃんと0で初期化してあります。
短くしたプログラムはfoo[9]以外はちゃんと動いてるみたいです。
foo[9]だけが明らかにおかしい人数になるので不思議です・・・
なんとなくかっこで囲んでみたけどダメでした。もちろん上記と同じように「90<=tokuten」も試しましたがダメでした。
助言お願いします。
174:デフォルトの名無しさん
08/12/05 12:42:43
foo[9] += 1の行とfoo[0] += 1の行が8回も実行されてるからイテレータの外に出す
それか1..8を0..9にして、10点未満も90点以上もiの一般式に組み込むかのどっちか
175:デフォルトの名無しさん
08/12/05 12:44:23
うおー、初心者スレっぽいぞ
頭が痛くならない解決法のひとつは、case文を使うこと
case tokuten
when 90..100 then foo[9] += 1
when 80..89 then foo[8] += 1
when 70..79 then foo[7] += 1
# 中略
when 10..19 then foo[1] += 1
when 0..9 then foo[0] += 1
end
もうひとつは、得点とカウンターの関係を冷静に見て条件を抽出すること。
「得点の 1 の位に等しい配列要素を +1 する」
「ただし、100 点の場合は 9 要素目を +1 する」
「なお、9 を 10で割ると 9 /10 = 0 である」
if tokuten == 100 then
foo[9] += 1
else
n = tokuten / 10
foo[n] +=1
end
176:デフォルトの名無しさん
08/12/05 12:55:13
>>175
>うおー、初心者スレっぽいぞ
たしかにな
>「得点の 1 の位に等しい配列要素を +1 する」
10の位の間違いか?
>「ただし、100 点の場合は 9 要素目を +1 する」
これはひっかかりそうだなー
コードはもうちょっと簡潔になるな。
n = tokuten == 100 ? 9 : tokuten / 10
foo[n] += 1
または
if tokuten == 100
n = 9
else
n = tokuten / 10 # ex. 85 -> 8, 31 -> 3
end
foo[n] += 1
177:デフォルトの名無しさん
08/12/05 13:27:46
>「ただし、100 点の場合は 9 要素目を +1 する」
こういう条件にするとそう処理する理由がそれほど明らかでない。
条件は上界により与えられるとして考える方がよくないか。
いつぞやRubyスレで話題になった Range#bound があれば
idx = (0..9).bound(tokuten / 10)
foo[idx] += 1
178:デフォルトの名無しさん
08/12/05 13:38:10
まあ落ち着いてスレタイ100回読め
179:デフォルトの名無しさん
08/12/05 13:40:50
ンなこと言ったらデータとしては foo[10] を作るのが自然
100 点に関しては集計なり統計なりするときの処理に扱いを委ねるべきで、
データの時点で組み込んでしまうべきではない
180:デフォルトの名無しさん
08/12/05 13:55:20
>>173
>>174 も書いてるがその「正しくないコード」の意味するところは、
i を 1 から 8 に変更しつつ do ~ end の中のコードを実行するという事だ。
foo[9] 以外は動いているって言ってるけど foo[0] にも同じ問題がある。
「do ~ end 中の文は tokuten の値が何であろうと 8回実行されてる」
という事を頭に入れてもう一度コードをよくみて考えてみて。
多分上手く動いていると思っている部分も、あまりよくないと気付くだろう。
181:デフォルトの名無しさん
08/12/05 13:58:12
eachは「振り分け」じゃないからな
時々混乱したことはあった
182:173
08/12/05 14:17:41
>>174,180
その通りですね。脳内で考えたときは一度条件に当てはまったら勝手にeach文から抜けてました・・・
>>175
case文だと元のfor文と対して長さが変わらないですねw
もう一つの案、とても参考になりました。ありがとうございます。
>>176
条件演算子、思いもつかなかった方法です。
短くて使いやすそうです。ありがとうございます。
>>177
む・・難しい・・・
コピペしても動かなかったので何か読み込ませるものなんですね。
レスくれたみなさま、ありがとうございました。
得点を割ってそのままインデックスとして使う方法は私にとっては斬新で勉強になりました。
重ね重ね、ありがとうございました。
183:デフォルトの名無しさん
08/12/05 18:26:56
>>173
なあ、初心者にちょっと聞いてみたいんだけど、条件演算子って難しい?
n = tokuten == 100 ? 9 : tokuten / 10
とか理解できる?
世の中には条件演算子を禁止するようなプロジェクトがあって、頭おかしいと思ってるんだけど、
初心者にとっては条件演算子がほんとうに難しいのかどうか気になる。
184:デフォルトの名無しさん
08/12/05 18:30:16
条件演算子が禁止されるのは、難しいからと言うよりも
乱用されてソースコードが酷いことになるのを防ぐためじゃない?
185:rubyの初心者
08/12/05 18:34:24
n = 9 if tokuten == 100 else tokuten / 10 のほうがわかりやすい。
186:デフォルトの名無しさん
08/12/05 18:44:57
>>185
おまえ、rubyの初心者じゃなくてPython上級者だろ。
187:デフォルトの名無しさん
08/12/05 18:50:36
条件演算子の禁止は「難しいから」じゃない
難しいという理由からなら、こんなに一般的に禁止が広まるわけがない
188:デフォルトの名無しさん
08/12/05 18:55:02
rubyには?で終わる述語が覆いから
sym = n.zero? ? :hoge : :fuga
とかやられるとわけがわからない。
sym = if n.zero? then :hoge else :fuga end
ほらわかりやすい。
189:デフォルトの名無しさん
08/12/05 18:56:29
ネストすると読みづらいからじゃないかな
190:デフォルトの名無しさん
08/12/05 18:57:55
三項演算子(条件演算子、注釈逆か)は、下手に許可すると
変なとこで改行してカッコつけてネストする奴が出てくるのが嫌われてる理由の一つだと思う
そんなに複雑なら if 文で書くかリファクタリングしろ
191:デフォルトの名無しさん
08/12/05 19:02:21
記号が小さくて読み落とししやすいんだよな
もっと2~3文字のキーワードで区分けされていると読み落としがないんだが
192:デフォルトの名無しさん
08/12/05 19:05:21
Ruby は if 文が値を返すから、三項演算子の必要性は他の言語よりも薄いと思う
193:デフォルトの名無しさん
08/12/05 19:18:32
書く分には良いんだが、読みにくい印象が強いな <<三項演算子
194:デフォルトの名無しさん
08/12/05 19:28:41
>>188
>sym = n.zero? ? :hoge : :fuga
>とかやられるとわけがわからない。
そうか、初心者はこの程度でもわけがわからなくなるのか。
>sym = if n.zero? then :hoge else :fuga end
>ほらわかりやすい。
どこがだよ。
195:デフォルトの名無しさん
08/12/05 19:45:21
>>193
条件演算子で短くまとめた条件分岐はほぼ100パーセントの確率で
のちのち長い if 文に書き換える羽目になるというのがどうにも
嫌われる人はここで条件演算子使用を強行する
196:デフォルトの名無しさん
08/12/05 20:00:26
最初から then 書くのがけっこう普通になるよね
197:デフォルトの名無しさん
08/12/05 20:22:43
1行で書けて式の値を使うときだけ三項演算子
ifの返す値を使うプログラムは読みにくい
198:デフォルトの名無しさん
08/12/05 21:21:19
配列の添え字アクセスを send で行うことはできますか?
[1, 2, 3].send("[](1)") が 2 を返すような
199:デフォルトの名無しさん
08/12/05 21:23:20
[1,2,3].send('[]', 1)
200:173
08/12/05 21:26:57
>>183
条件演算子が難しいなんて書いてませんよ・・・私・・・
n = tokuten == 100 ? 9 : tokuten / 10
「tokuten」が100ならば「9」を「n」に代入、elseなら「tokuten/10」を「n」に代入ですよね
201:デフォルトの名無しさん
08/12/05 21:32:06
>>199
うおー引数2個ーめんどー
ありがとうございます
202:デフォルトの名無しさん
08/12/05 22:12:43
>>200
アー、悪い、
>条件演算子、思いもつかなかった方法です。
って書いてあるから、初心者には理解するのが難しいのかと思った。
わかってるならすまんかった。気を悪くせんでくれ。
203:デフォルトの名無しさん
08/12/06 01:23:58
RubyってJavascriptの代わりになりますか?
204:デフォルトの名無しさん
08/12/06 01:29:54
なりません。
205:デフォルトの名無しさん
08/12/06 01:40:02
すんません、
メソッド呼び出しているだけの行で
[BUG] Segmentation faultってバグ落ちしたメッセージが表示されるですけど、
これってどこでバグっているのか原因わかりますか?
後、ルビーのバグ回避のプログラミングの仕方ってあるでしょうか?
ルビーの落とし穴というページ見ても今一バグが発生する原因や回避の方法が分からないもので。
206:デフォルトの名無しさん
08/12/06 01:42:36
追記です。
ルビーのバージョンは1.8.6で無料サーバでつかうため、パッチやバージョンアップ以外の方法でバグ回避方法をおしえてください。
207:デフォルトの名無しさん
08/12/06 01:44:16
実際のスクリプトの部分を見せることができないのは村の掟とかそういうのなんですよね
208:デフォルトの名無しさん
08/12/06 01:44:39
>>205
ruby本体のbugだから、まずは最新版で試してみて。
それでも再発するなら、出来る限り余分な部分を削った再現コードを作って
ここか本スレかruby-listに晒せばおk。そのときruby -vの提示を忘れずに。
あとは偉い人がよろしくやってくれるはず。
209:デフォルトの名無しさん
08/12/06 01:47:13
>>206
・・・まあ再現コード見せて。
そのコードを作ること自体が「回避の方法」だったりするし。
210:デフォルトの名無しさん
08/12/06 01:58:16
コードは晒せないですが、
openでファイル作成やREXML::Documentとグローバル配列とメソッドだけでね。
今やったらなぜメソッド中の注釈「# DATAURL 」の行を指して
[BUG] Segmentation fault
ruby 1.8.6 (2008-08-11) [i386-mswin32]
って出ました。わけわからん。
211:デフォルトの名無しさん
08/12/06 02:00:28
無料サーバであいさんはちろくえむえすうぃんさんじゅうに?
212:デフォルトの名無しさん
08/12/06 02:05:23
>>211
RDEでデバッグしながらですがけど...
鯖だとデバッグできないですから..
213:デフォルトの名無しさん
08/12/06 02:18:57
>>210
再現コードがないと、なんともコメントできない。
214:デフォルトの名無しさん
08/12/06 02:19:25
うむ
215:デフォルトの名無しさん
08/12/06 02:19:34
村の掟ワロタ
216:デフォルトの名無しさん
08/12/06 02:52:30
コード晒せないのなら諦めろ、あるいは自力で解決しろ
Segmentation faultだけでは、アドバイスする側にもわけわからん
217:デフォルトの名無しさん
08/12/06 02:53:36
gdb coreして、whereだ。
何かが分かる気はしないけどね。
218:デフォルトの名無しさん
08/12/06 08:57:37
未知か既知かわからないRuby本体のバグを誰かがわからないけどどっかで踏んでる、ということだな
それ以上のことはなんもならん
219:デフォルトの名無しさん
08/12/06 10:53:07
セグフォはRubyのバグだから投稿すれば本来治してくれるんだけど
再現コード無いのは無理だなあ
220:デフォルトの名無しさん
08/12/06 14:02:12
リファレンスマニュアルの終了処理に、「exit(3) で終了」って書いてあるけど、なぜ 3 なんですか?ただの例?
221:デフォルトの名無しさん
08/12/06 14:11:45
>>220
0は成功、1かそれ以上は失敗
ということで、ただの例ですな
222:デフォルトの名無しさん
08/12/06 14:18:02
>>220
exit(3)の3はmanのセクション番号でライブラリコールだってこと。
詳しくはman man
他にもwrite(2)とかがある
223:デフォルトの名無しさん
08/12/06 14:19:29
>221
多分それ違う
>220
exit(3) のリンク先を見れば判ると思うけど、この exit はC言語の関数の exit() のこと。
要はRubyが内部でやってる処理を説明している。
Linuxのマニュアルのセクション3にあるexit()の通りの処理をしてるよ、という意味。
224:デフォルトの名無しさん
08/12/06 15:51:10
マニュアルにある exit(3) の (3) は引数を表してるわけじゃないんですね。
>>221-223
ありがとうございました。
225:デフォルトの名無しさん
08/12/06 16:25:24
>>204
なんでだよ
Rubyってなんでもできる万能言語って聞いたんだが
226:デフォルトの名無しさん
08/12/06 16:30:20
>>225
ではその人を責めてください
サンタクロースが実在しなかったからといってサンタ役のお父さんをバシバシ叩くのはやめてください
227:デフォルトの名無しさん
08/12/06 22:22:34
>>225-226
ワロタw
228:デフォルトの名無しさん
08/12/06 23:51:21
エクセルをRubyで動かしたいんだけど、OLEが分からないからエクセルのマクロスクリプトを
Rubyのプログラム上からエクセルに渡して動かす、みたいなことはできますか?
229:デフォルトの名無しさん
08/12/07 00:35:40
エクセルオブジェクトにそういう機能があれば、
呼び出す側の言語が何であろうと出来るんじゃない?
230:デフォルトの名無しさん
08/12/07 00:37:45
てかエクセルオブジェクトを使うにはOLEの知識がいるじゃないか。
231:デフォルトの名無しさん
08/12/07 06:28:28
メソッドの勉強してるんですが
puts とか getsがメソッドですよといわれたのは良いんですが
self.puts
とか、
100.to__s
とかはわかるのですが
gets.chompはなぜgetsの後ろにchompが付くんですか?
メソッドの前に付くのが普通だと思ってたので・・・
232:デフォルトの名無しさん
08/12/07 07:14:23
>231
self.gets.chomp
getsの結果に対してchompするということ
つーかgetsはレシーバ書かないほうが普通だと思うが…
233:デフォルトの名無しさん
08/12/07 07:36:31
>>232
ありがとうございます
selfは書かないんですけど
rubyの練習に読んでる
URLリンク(www1.tf.chiba-u.jp)
でselfが出てきたので聞いてみました。
234:デフォルトの名無しさん
08/12/07 07:50:48
そこ「説明の切り捨て方」がイマイチだな
メソッドチェーンという概念がある(あくまで概念で、文法のようなものではない)
あるメソッドの返り値のオブジェクトのクラスのメソッドを
返り値を返すメソッド.返り値のクラスのメソッド
で動作させるものだ
関数的メソッドgetsの返り値は文字列であるStringクラスのオブジェクト(=インスタンス)だから、
Stringクラスのメソッドであるchompをメソッドチェーンで記述できる
あくまでメソッドの返り値(またはオブジェクトそのもの)のクラスが重要
返り値のクラスは常に意識しておくといい
235:デフォルトの名無しさん
08/12/07 08:31:30
>>231
>gets.chompはなぜgetsの後ろにchompが付くんですか?
s = gets
s.chomp
を一行でかいたら
gets.chomp
になった、というだけのこと。
236:デフォルトの名無しさん
08/12/07 08:38:01
>>234
難しい・・・(>_<)
>>235
なるほど
237:デフォルトの名無しさん
08/12/07 08:53:23
Rubyはかなり豪快なメソッドチェーンが出来るのが魅力だよな
何だかんだでチェーンが切れるOOPLは多い気がする
238:デフォルトの名無しさん
08/12/07 09:01:12
end の後ろにメソッドが平気で繋がるのはやりすぎだとも思える
が、ブロックとして {} を使うことにすると、クラスとメソッド用途によっては異常に便利
self や目的のオブジェクトが意図的に返るように作られてるブロックつきメソッドが多いのが効いてるな
def …
ナントカ
カントカ
yield s if s
s
end
という定義が多い
239:205
08/12/07 17:03:10
すいません、あれから色々と調べて最初配列の作りすぎてメモリ使用しすぎて落ちているのかと思ったのですが、それともちがったようです。
それで現在も分からないですが、エラーメッセージの一番大事な所を表示し忘れました。
これで何が原因かおおよそわかりますか?
C:/Ruby/lib/ruby/1.8/rexml/text.rb:312: [BUG] Segmentation fault
ruby 1.8.6 (2008-08-11) [i386-mswin32]
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Complete(3)
最初自分の命令の312行かと思い込んで読んでいたのですが、よくみるとREXMLの中の312行で死亡したぽいですが。
240:デフォルトの名無しさん
08/12/07 17:28:44
>>239
>>213-219
だれも「詳細なエラー文を」とは言ってないんだ。
241:205
08/12/07 18:03:35
それでは質問を変えます。
C:/Ruby/lib/ruby/1.8/rexml/text.rb:312
このエラーメッセージが意味するのは私のかいたプログラムの312行でエラー発生したのではなくて、
ルビー側が用意している
C:/Ruby/lib/ruby/1.8/rexml/text.rb
の312行目でエラーが発生したと解釈して間違いないですよね?
242:デフォルトの名無しさん
08/12/07 18:38:00
>241
それも完全な間違いでは無いが、限りなく間違いに近い。
本来Ruby側はどんな間違ったコードでも
「Rubyの」エラーを出して、コードとしては異常な終了でありながら
Rubyとしては正常に終了しなければならない。
ところが今回RubyはSegmentationFault…つまりRuby自体が異常な終了をしている。
だからRuby制作側としてはRubyを修正すべきなんだが
そのためにはSegmentationFaultが起こる状態を再現しないと
根本的な修正が難しい。
だから、その同じ状態を再現するコードがあったほうが良いのだよ。
…で、ライブラリ由来だとしてもライブラリをどう使うと起こるのか判らない。
SegmentationFaultである限り、貴方に責任はほぼ無いが
修正するには再現コードがないとキツいだろうなあという話。
243:デフォルトの名無しさん
08/12/07 18:42:43
ああ、C製の外部ライブラリなんかもセグフォで落ちるか?
どちらにしろセグフォ起こす時点で
貴方自身では勘ぐらいしか対抗手段は無いよ。
で、実際のコードも再現コードも出せないなら
作者も多分修正不能で「原因不明のバグ」としか言えない。
244:デフォルトの名無しさん
08/12/07 18:44:40
「[BUG]」を吐いて落ちてるような場合は、インタプリタが具体的に
「ここの行が悪いんでエラーにしますよ」と言ってるわけじゃないから、
その「C:/Ruby/lib/ruby/1.8/rexml/text.rb:312:」はたいした情報にならない。
問題を起こすプログラムから、そこを削っても問題が同じように起こる場所は
全部削っていって、問題を起こす最小のセットを作るしか、Rubyを作ってる
側としても対処のしようがない(普通は)。
(たまに、実は把握済みの問題で「このパッチだよ」というのが出てくることも
あるがそれは宝くじのようなものなので)
245:デフォルトの名無しさん
08/12/07 18:45:26
>>241
情報が少なすぎて判断出来ないし、ここでやる内容とも思えない
問題のソースとエラーメッセージの全てを出して作者に聞け
246:デフォルトの名無しさん
08/12/07 18:45:35
最新版が使えるなら最新版にしたら直ってるかも知れない。
最新版が使えないなら原因がネット上に落ちてるかも知れない。
…で、ネット上探すのは再現コードを見れないと厳しい。
247:デフォルトの名無しさん
08/12/07 20:10:06
>>239
とりあえずコードが公開可能なものならどこかのアップローダーに公開すれば
いいわけで…。公開不可能ならMatzにそのソースを送りつければいいや。
ちなみに現在の最新安定版は1.8.7-p72だからそれを導入してみて
もう一度やってみれば?もしそれでもSegmentation Faultが出るなら
もう一度ここに来て。
Rubyの公式サイト
URLリンク(www.ruby-lang.org)
248:デフォルトの名無しさん
08/12/07 20:53:45
>>242
おまえはキモイな。rubyなんかやるよりも死んだ方がいいんじゃないか?どうせ友達なんかいないんだろw
249:デフォルトの名無しさん
08/12/07 20:58:18
ルビー使い自称ルビリスト(笑)なんて所詮は囚人程度の脳味噌しかないからあまり関わんないほうがいい
250:デフォルトの名無しさん
08/12/07 21:14:00
>>248
ロジックで敗れたのでヒステリーで対抗ですね、わかります。
251:デフォルトの名無しさん
08/12/07 21:20:15
>>249
そのようだなw
252:デフォルトの名無しさん
08/12/07 21:49:47
>>248
そんなカキコミしてる暇あったら、再現コードを用意しようぜ。
SegmentationFaultのバグは、再現コードがないとエスパーしようがない。
253:デフォルトの名無しさん
08/12/07 22:03:56
おまえらけんかすんなよ
254:デフォルトの名無しさん
08/12/07 23:37:37
1.8.5ででかいのをREXMLに食わせたらSEGVったって話が
結構前にruby-devにあったような。
255:デフォルトの名無しさん
08/12/08 03:09:02
度々すいません。
open命令でXMLファイルをサイト経由で取得した場合、
result = open(a2)
resultには#<File:0x2c07f2c>という内容しか入っていないようなのですが、
帰ってきたサイトのHTMLデータといいますか、そのようなものを見るにはどうしたらいいのでしょうか。
色々とテストしてみたら、どうも帰ってくるXMLデータが相手サーバの都合か何かで変な状態で返されものを
REXML::Document.newで開くとコケるみたいです。
どんなファイルのときにこけているか分かれば対策の打てるような気もします。
256:デフォルトの名無しさん
08/12/08 03:20:24
テンプレ。
>質問には以下を書くこと。へたくそな質問は再提出を要求される。
> ・エラーメッセージ(自力で訳さずなるべくそのままで)
エスパーしてみると、エラーを突っ返されても構わずREXML::Document.newに渡しているせいで
XMLとしては当然解釈できずパースエラーとか。
257:デフォルトの名無しさん
08/12/08 03:32:51
>>255
>result = open(a2)
a2 が何かしらんけど、open() が返すのはFileオブジェクトじゃないかな。
だから
result = open(a2) {|file| file.read }
とか
file = open(a2)
result = file.read()
file.close()
とかすればいいんじゃないかな。
258:デフォルトの名無しさん
08/12/08 06:22:33
>>257
そんなどのマニュアルにもどんな解説にも書いてあるようなことで>>255さんが詰まるはずないだろ馬鹿か?
[BUG] って書いてあるんだからこっちに落ち度はなくてRubyが一方的に悪いに決まってるだろ
259:デフォルトの名無しさん
08/12/08 06:35:54
そんな煽りいらないお
260:デフォルトの名無しさん
08/12/08 06:56:35
俺らは質問やその後の遣り取りから質問者の知識を当て推量して回答したりしなかったりするわけだが、
>>258と言いたくなるのは今回は仕方があるまい
openを一度でも自分で使ったことがあるならわかることだからな
書き込みの際に省略してるだけだと思うしかないわ
261:デフォルトの名無しさん
08/12/08 08:46:03
> open命令でXMLファイルをサイト経由で取得した場合、
openつーか、require 'open-uri'した上でのopenだよな?
262:デフォルトの名無しさん
08/12/08 08:58:18
>>260
君はキモイからもうこのスレに来なくていい
263:デフォルトの名無しさん
08/12/08 09:46:33
>>262
お前キモいな
264:デフォルトの名無しさん
08/12/08 10:03:51
262はもうこのスレに来られなくなりました。
265:デフォルトの名無しさん
08/12/08 10:21:05
この刃はさすがに鋭いぬ
ひとりでスレ参加仕切るのはキモいわな
266:デフォルトの名無しさん
08/12/08 10:55:44
>>255
用語がちょい怪しいからHTTPについてあんま知らんのかも知れんけど、
open-uriで返ってきたオブジェクトに返してはFileとかの他にOpenURI::Metaについても
調べてみてくれ。
向こうのサーバがOKなレスポンスを返したかとかの調べ方がわからんのだったらまさにそれ。
267:デフォルトの名無しさん
08/12/08 11:35:17
中身を見るには require 'pp' して pp で見るといいお
268:デフォルトの名無しさん
08/12/08 11:40:13
(pretty_)inspectでフォローされてるとは限らないけどな
269:デフォルトの名無しさん
08/12/08 11:50:24
pretty_inspectの書式のめんどくささは異常
270:デフォルトの名無しさん
08/12/08 14:33:22
このプログラムでなぜかこけるのですが、原因って分かりますか?
#!/usr/local/bin/ruby -Ks
# REXML宣言 XMLデータを処理するための
require 'rexml/document'
require 'open-uri'
require 'uri'
result = open("スレリンク(tech板)l50")
# xmlデータ化してこの場合変数docに入れる。変数名は何でも可。
toto = result.read
doc = REXML::Document.new(result)
エラーメッセージ
------------------------------
C:/Ruby/lib/ruby/1.8/rexml/source.rb:149:in `initialize': undefined method `[]' for nil:NilClass (NoMethodError)
from C:/Ruby/lib/ruby/1.8/rexml/source.rb:16:in `new'
from C:/Ruby/lib/ruby/1.8/rexml/source.rb:16:in `create_from'
from C:/Ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:133:in `stream='
from C:/Ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:110:in `initialize'
from C:/Ruby/lib/ruby/1.8/rexml/parsers/treeparser.rb:9:in `new'
from C:/Ruby/lib/ruby/1.8/rexml/parsers/treeparser.rb:9:in `initialize'
from C:/Ruby/lib/ruby/1.8/rexml/document.rb:205:in `new'
from C:/Ruby/lib/ruby/1.8/rexml/document.rb:205:in `build'
from C:/Ruby/lib/ruby/1.8/rexml/document.rb:42:in `initialize'
from C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/rbC.tmp:15:in `new'
from C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/rbC.tmp:15
Complete(1)
------------------------------
どうもresult.readした後REXML::Document.newするとエラーするぽいですけど。
271:デフォルトの名無しさん
08/12/08 14:55:36
訂正します
#!/usr/local/bin/ruby -Ks
require 'rexml/document'
require 'open-uri'
require 'uri'
result = open("URLリンク(10plate.blog44.fc2.com)")
toto = result.read
doc = REXML::Document.new(result)
272:デフォルトの名無しさん
08/12/08 15:09:22
そりゃ読み終わってりゃ中身は空だからなあ。当然だろう
273:デフォルトの名無しさん
08/12/08 15:16:28
引数はXML文字列でもいいのに…
てかREXMLでパースしたなら元のファイル別にいらないじゃんね
274:デフォルトの名無しさん
08/12/08 15:56:10
Rubyでエクセルのグラフを描きたいんですが、エラーでうまくいきません。
OLE詳しい人Help!
require 'win32ole'
module Excel
end
excel = WIN32OLE.new('Excel.Application')
excel.visible = false
excel.displayAlerts = false
file = "適当なフォルダパス"
book1 = excel.Workbooks.open(file)
sheet1 = book1.sheets(1)
sheet1.Range('A8').Select
chart1 = excel.Charts.Add()
chart1.Type=ExcelConst::XlLine
chart1.ChartType=ExcelConst::XlLineMarkers
chart1.SetSourceData Source=sh7.Range("B96:C106")
#続く
275:デフォルトの名無しさん
08/12/08 15:57:08
#続き
#chart specifications
chart1.PlotBy=ExcelConst::XlColumns
chart1.Location Where=ExcelConst::XlLocationAsNewsheet
chart1.HasTitle ="True"
chart1.ChartTitle.Characters.Text = "hoge"
chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).HasTitle = "True"
chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).AxisTitle.Characters.Text = "fuga"
chart1.Axes(ExcelConst::XlValue, ExcelConst::XlPrimary).HasTitle = "True"
chart1.Axes(ExcelConst::XlValue, ExcelConst::XlPrimary).AxisTitle.Characters.Text = "hogehoge"
book1.save
excel.quit
#コード終了 エラーメッセージが続きます
276:デフォルトの名無しさん
08/12/08 15:57:40
C:/ruby/mysrc/rb3C.tmp:112: syntax error, unexpected tCONSTANT, expecting kEND
chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).HasTitle = "True"
^
C:/ruby/mysrc/rb3C.tmp:113: Invalid char `\223' in expression
C:/ruby/mysrc/rb3C.tmp:113: Invalid char `\276' in expression
C:/ruby/mysrc/rb3C.tmp:113: Invalid char `\223' in expression
C:/ruby/mysrc/rb3C.tmp:113: syntax error, unexpected tIDENTIFIER, expecting kEND
chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).AxisTitle.Characters.Text = "fuga"
^
C:/ruby/mysrc/rb3C.tmp:114: syntax error, unexpected tCONSTANT, expecting kEND
chart1.Axes(ExcelConst::XlValue, ExcelConst::XlPrimary).HasTitle = "True"
^
C:/ruby/mysrc/rb3C.tmp:115: Invalid char `\220' in expression
C:/ruby/mysrc/rb3C.tmp:115: syntax error, unexpected tIDENTIFIER, expecting kEND
chart1.Axes(ExcelConst::XlValue, ExcelConst::XlPrimary).AxisTitle.Characters.Text = "hogehoge"
^
C:/ruby/mysrc/rb3C.tmp:115: Invalid char `\220' in expression
C:/ruby/mysrc/rb3C.tmp:115: Invalid char `\224' in expression
C:/ruby/mysrc/rb3C.tmp:115: unterminated string meets end of file
C:/ruby/mysrc/rb3C.tmp:115: syntax error, unexpected $end, expecting kEND
Complete(1)
以上です。よろしくお願いします。
277:デフォルトの名無しさん
08/12/08 16:00:03
ちょっと聞くけど、VBA使ったり他の言語からOLE経由する方法では自分でグラフ描けるんだよね?
まさかRubyの知識しかないのにWin32OLE使ってるわけじゃないよね?
278:デフォルトの名無しさん
08/12/08 16:50:49
>>277
いや、そのまさかです。
マクロの記録→編集でVBAのコードを作ってそれをRubyに書き換えたつもりだったんですが・・・
279:デフォルトの名無しさん
08/12/08 18:44:44
>>276
> C:/ruby/mysrc/rb3C.tmp:112: syntax error, unexpected tCONSTANT, expecting kEND
これがエラーの理由、「syntax error」は文法エラー
> chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).HasTitle = "True"
これがエラーの出た行の内容
> ^
(ブラウザだとずれてるだろうけど)これが上の行のエラーの発生してる位置を示してる
rb3C.tmpの112行目より前のどこかに閉じ忘れた " がある
エラーメッセージぐらい読めるようにならないと、いつまでたっても素人のままだぜ
280:デフォルトの名無しさん
08/12/08 20:32:41
endの閉じ忘れ文法エラーが初心者の頃は面倒だったね
どこで閉じ忘れたのかを探しにくいからね
1.9.1だとendのインデントのずれを指摘するパッチが取り込まれたので
-wオプションつければずれてるendを警告してくれて
抜けてるendの位置をちょっと絞り込める
ところで、エラーメッセージの
tCONSTANT とか kENDってなに?
YACCのトークンとかいうやつ?
構文解釈中のエラー?
そんな内部の情報を直に見せられても、初心者にはわけわからんよ
ま、わからんなりに
「endじゃなくて定数が来ちゃってる文法エラー」だなということは理解できるんだけど
281:デフォルトの名無しさん
08/12/08 20:46:15
文字列リテラルの閉じ忘れはエラーがどかどかでるので割と判りやすいけど
閉じ忘れた文字列から、はるか後ろのほうでエラーが出る場合があるので
やっぱり最初の頃は修正が面倒だったな
エラーが出た個所で文字列を閉じてるのが ' か " を確認して、
それより前のクォート文字を検索する
閉じ忘れたのが %記法だったら面倒だが
たまに、Windowsのディレクトリパスを書くときに 'C:\test\' とかやって閉じ忘れたりする
282:デフォルトの名無しさん
08/12/08 20:47:57
tCONSTANT は定数トークンだろね
でも kEND の k ってなんじゃろ
283:デフォルトの名無しさん
08/12/08 20:56:28
keyword
284:282
08/12/08 21:03:46
>>283
なるほどサンクス
いい機会だから parse.y 眺めてるお
285:274
08/12/08 22:04:13
>>279
レスありがとうございます。
よく見直してみたんですが、「"」の閉じ忘れはありませんでした。
グラフの部分のコードを消して試しに他の操作をさせるとちゃんと動いたので
やはりグラフのコードのどこかが悪いようです。
286:デフォルトの名無しさん
08/12/08 22:47:39
すごいバカきたな。
>>258
>そんなどのマニュアルにもどんな解説にも書いてあるようなことで>>255さんが詰まるはずないだろ馬鹿か?
実際に詰まってるじゃん。
どのマニュアルにもどんな解説にも書いてあるようなことで詰まっているから初心者なんじゃねーの?
もう一度>>255をみてみろ。
>result = open(a2)
>resultには#<File:0x2c07f2c>という内容しか入っていないようなのですが、
そりゃ open() の戻り値を代入しているだけなんだから、result.inspect したら #<File:> が入ってるわな。
HTMLの文字列が欲しいのに、Fileオブジェクトがきたので困ってる255さん。あーら困った。
>[BUG] って書いてあるんだからこっちに落ち度はなくてRubyが一方的に悪いに決まってるだろ
え、どこ? >>255のどこに[BUG]って書いているの?
もしかして>>255は>>205と関係しているの?
なんで>>258は>>255の書き込みだけでなんでそんなことがわかるの?
もしかして205=255=258なの?
もしかしてどんな解説にも書いてあるようなことで詰まってしまったの?
287:デフォルトの名無しさん
08/12/08 22:50:02
すごいバカが来たな。
288:デフォルトの名無しさん
08/12/08 22:58:26
こういうバカはたいては女
それも女の出来そこないって相場が決まってるw
289:274
08/12/09 00:49:17
WIN32OLEに詳しい方、引き続き>>274救助待ちなのでお願いします。
290:デフォルトの名無しさん
08/12/09 01:05:07
>>285
やっぱり文字列リテラルの閉じ忘れじゃないのかなぁ
\223\276 って SJISの「得」なんで
そんなのをスクリプトとして解釈しようとするなんて
文字列の閉じ忘れくらいしかない気がする
単純な文字列だけじゃなくて
'~' とか "~"だけじゃなくて 正規表現リテラルとか /~/ とか
%記法の %w(~) とか %Q(~) %r!~! みたいなのも有るんで
%記法だと任意の記号を使えるので注意
しかも%記法の %q!! %Q!! %r!! %x!!だと、区切り文字に空白やタブや改行も使えてしまうぞ
%q a だと'a' と同じ意味
そんなの使ったスクリプトなんて、もはや嫌がらせだが
291:デフォルトの名無しさん
08/12/09 01:40:27
>>274-275にsyntax errorはないもんなぁ。
なんかダメもとでスクリプトの先頭に
#!ruby -Ks
と書き足してみるとか。
292:274
08/12/09 02:15:06
>>290
「得」は「得点」ですね・・・
ここに載せる際にエラーコードはそのままにhogeにしたのが原因です。すみません。
ちなみにhogeにして実行しても同じでした。
>>291
なんですか!?そのおまじない!w
書き足しただけでエラーコードに変化がありました。
C:/ruby/mysrc/rb81.tmp:61:in `method_missing': save (WIN32OLERuntimeError)
OLE error code:800A03EC in Microsoft Office Excel
Workbook クラスの Save プロパティを取得できません。
HRESULT error code:0x80020009
例外が発生しました。 from C:/ruby/mysrc/rb81.tmp:61
Complete(1)
Saveがおかしい訳じゃないはずなので他に何かあるんでしょうね・・・
それと直接の関係はなさそう(上では表面化しなかっただけかも)ですが、
excel = WIN32OLE.new('Excel.Application')の下に
WIN32OLE.const_load(excel, ExcelConst)を追加しました。
これがないと「ExcelConst::」の位置でエラーになるようです。
293:274
08/12/09 02:20:35
連レススミマセン。
あとモジュール定義の所
module Excel
end
から
module ExcelConst
end
に変更しています。
294:291
08/12/09 02:32:05
SJISの「ソ」みたいにSJISだと思わずに扱うと面倒が起きる文字があって、
rubyに-Ksオプションを付ける(shebangっぽく>>291でもOK)と
rubyもSJISで書かれたスクリプトだと承知して字句解析する。
リファレンスを引くなら$KCODEあたりがとっかかりだろうか。
295:デフォルトの名無しさん
08/12/09 02:48:40
>それと直接の関係はなさそう(上では表面化しなかっただけかも)ですが、
>excel = WIN32OLE.new('Excel.Application')の下に
>WIN32OLE.const_load(excel, ExcelConst)を追加しました。
>これがないと「ExcelConst::」の位置でエラーになるようです。
それは当たり前です。ただ空のモジュールを作ったってExcelの定数を扱えるわけがありません。
なんかサンプルのスクリプトをもとに頑張ってる感じがしますが、もしそうだとしたら
もうちょっとちゃんと真似したようがよいと思います。
296:デフォルトの名無しさん
08/12/09 02:49:44
そのファイルがあるディレクトリ以外だと実行できて、そのファイルがあるディレクトリだと実行できないのですが・・・。
./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError)
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from hpri.rb:5
gem environmentでGEM PATHSの部分が
- /usr/lib/ruby/gems/1.8
- /home/XXXXX/.gem/ruby/1.8
となっていてユーザディレクトリが含まれているのが怪しいと思うのですがここの設定を変えることはできるのですか?
297:274
08/12/09 03:03:27
>>291
なるほど。説明ありがとうございます。
「"#!ruby -Ks"」とググったらリファレンスのFAQがヒットしたので読んでました。
それと自己解決しました!
>>292のエラーコードの通りsaveプロパティの問題でした。
グラフを新しいシートに書き出したのが問題だったのかもしれません(勝手な予想)
saveAsで上書きしたらうまく行きました。
>>295
スミマセン。仰る通りネット上に落ちてるコードを参考にいじって書いてます。
レス、指摘くれた方々ありがとうございました。
おかげさまで無事動かせました。
298:デフォルトの名無しさん
08/12/09 03:12:30
>>296
カレントディレクトリにhpricot.rbというファイルがあって
それがrequireされているのではないでしょうか。
299:デフォルトの名無しさん
08/12/09 03:30:35
>>298
BINGOです!お恥ずかしい・・・・。
ファイル名で中身がわかるようにしていたらモジュール名を使っていました。
本当に初心者的なミスですいません。
300:デフォルトの名無しさん
08/12/09 03:38:05
ここは初心者スレだからOKだよ
そのためのスレだよ
>>298
ナイスエスパー
きみにはエスパー初段を与える
301:デフォルトの名無しさん
08/12/09 03:43:02
>>298->>299の流れを見ていたら和んでしまった
>>299をフォローする>>300にも和んでしまった
302:298
08/12/09 03:50:28
なんかどっかのブログで>>296みたいなミスと質問はFAQにして良くね?
っていうエントリを見たばっかりだったもんで。あと
./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError)
^^^^^^^^^^^
ここ。
わかりやすいファイル名にしたいという趣旨は理解できる。
例えばtry_とかいうプレフィクスがいいかも。
test_だとまんまテストみたいだし、experiment_とかattempt_とか長いし。
303:デフォルトの名無しさん
08/12/09 04:01:37
シェルスクリプトでRuby回してパイプして出力って一般的?
304:デフォルトの名無しさん
08/12/09 07:00:38
>>302
前スレでも同じ質問あったしな
305:デフォルトの名無しさん
08/12/09 08:38:19
>>303
日本語でおk
306:デフォルトの名無しさん
08/12/09 10:25:21
>>35
日本語でおkって言ってみたかっただけだろ。
307:デフォルトの名無しさん
08/12/09 11:09:26
おーっと>>306くんロングパスだーッ
308:デフォルトの名無しさん
08/12/09 13:33:21
>>303
一般的
309:デフォルトの名無しさん
08/12/09 13:37:28
Ruby の each と File.open{|f| f.print} を使うかシェルスクリプトの for と > を使うかというのはけっこう大変な問題
STDIN から読み取って STDOUT に吐き出すべきなのはわかるがそれだと逆に面倒だったり
310:デフォルトの名無しさん
08/12/09 13:48:17
rubyでシェル作ればいいのに
zshなんてゴミもう捨てたい
311:デフォルトの名無しさん
08/12/09 14:04:56
Rubyスクリプトを作ったらそれを起動するシェルスクリプトも作らなければならないのは鬱陶しい
312:デフォルトの名無しさん
08/12/09 14:11:46
?
313:デフォルトの名無しさん
08/12/09 14:38:31
オプション指定とかに拘るからだろ
全部Rubyスクリプト内に入れろ
ディレクトリパスとかも直書きだ
不安ならスクリプト内1行目くらいでDir.cdしろ
314:デフォルトの名無しさん
08/12/09 16:17:01
行き詰ったので再現コード晒します。
どこがまずいのか宜しく
apiの使用はアカウント制なのでurl精製工程部分は抜けていますが、アカウントをとって作成してみてください。
たいして掛からずバグエラー吐きます。コロン抜きなどもしてみましたが、だめでした。
#!/usr/local/bin/ruby -Ks
# REXML宣言 XMLデータを処理するための
require 'rexml/document'
# UR.scapeの宣言 サイトにアクセスするための
require 'open-uri'
# 文字コードを変換するための
require 'nkf'
# 文字コードをURL用にエンコード
require 'uri'
$doc
counter = 1
while counter != 0
# このキーワードでは1ページ30商品、12ページあるはずなので変数pegenoをpegeno.to_sしてurlに組み込む
result = open(楽天商品検索API (version:2008-09-01)でメタルギアをキーワードにしたurl)
$doc = REXML::Document.new(result)
pegeno = pegeno+1
sleep 1
pegeno = 1 if pegeno == 13
end
315:デフォルトの名無しさん
08/12/09 16:29:34
どれか特定のページのXMLのパーズでトラブってるんじゃないかと思うが...
一旦、各ページをファイルにセーブして、それを1個ずつ REXML::Document.new
して、それだと再現しないわけ?
316:デフォルトの名無しさん
08/12/09 16:37:25
>>315
REXML::Document.newする前に内容を保存するようにテストプログラムもしてみたんですけど、
エラーはいた後、そのファイルの内容を改めて食わすと普通に食っちゃうですよね。
特定のページでもなくて、ファィルが保存されているので、サーバーエラーでコケているわけでもない。
初心者なので食わすプログラムにヘマてる可能性もありますけど。
317:デフォルトの名無しさん
08/12/09 16:37:52
>>314
>>315も言ってるけど一度ファイルに落としてみて
それでも再現するなら、そのxmlをどっかにうpしてほしい。
ぶっちゃけて言うと、楽天商品検索APIとやらを調べるのがめんどい。
318:デフォルトの名無しさん
08/12/09 16:47:56
>>316
> 特定のページでもなくて
というのは、Document.new の前に p pegeno を入れてみると、
毎回結果が違う、ということ?