[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/16 09:04 / Filesize : 244 KB / Number-of Response : 847
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 23



1 名前:デフォルトの名無しさん mailto:sage [2008/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つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

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

75 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 20:51:14 ]
aptくらいさくさくいけないのか

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

77 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 20:54:16 ]
一晩経っても終わらなかったってのは、そもそも動いてたのか?

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

79 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 21:08:21 ]
>>76
ほんとだ。

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

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

合ってるかどうかはほっといて
0xcc.net/ruby-progressbar/
これとかでプログレスバーでも出してくれればいいかもかも。

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

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

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

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

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



83 名前:66 mailto:sage [2008/11/28(金) 06:51:49 ]
>>67〜71
遅くなりましたが
レスありがとうございます

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

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


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

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

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

87 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 16:07:30 ]
…何に使うん?

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

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

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

91 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 18:29:50 ]
jruby -v

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

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

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



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

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

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

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

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

96 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 09:01:33 ]
意外とこれで間に合ったりして
ttp://tryruby.hobix.com/

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

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

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


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

101 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:32:10 ]
>>99
> puts "path/file".gsub("/", "\\")
path\file

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

"j:\\test\\obj"

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



103 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:36:59 ]
>>102
ダブルクォーテーションもついてるぞ

104 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:37:10 ]
pだから。


105 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:37:19 ]
>"j:\\test\\obj"

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

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


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

def hoge
 p 自分のメソッド
end

hoge #=> "hoge"

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

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

109 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 19:30:46 ]
ttp://d.hatena.ne.jp/secondlife/20051013/1129210792
class Object
def current_method
begin
raise StandardError
rescue StandardError => e
e.backtrace[1].scan(/`(.*)'/).to_s
end
end
end

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

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


111 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:45:32 ]
RUBY_VERSION >= '1.8.7' だと
__method__というのが。

112 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:39:57 ]
__METHOD__はRubuniusだっけ?



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

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

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

環境:MacOSX10.4
ruby 1.8.7

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

115 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 19:57:18 ]
カレントディレクトリにextractcontent.rbってテストで作っててその中でモジュール定義してるとか

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


119 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 11:14:40 ]
>>119
何がどうおかしいと思うの?

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


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

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



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

124 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 12:28:03 ]
>>121
なるほどそう読むのか。
Rational で返ってくるということはどこかで Rarional を require してるんだよな?
そうすると、こんな具合↓に演算子が再定義されるとのこと。
doc.loveruby.net/refm/api/view/library/rational

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

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

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

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

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

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

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

129 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 15:38:30 ]
Matzが例外について熱く語ってる記事とかない?
C#の中の人だとこういうのがあるんだけど
ttp://www.artima.com/intv/handcuffs2.html

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

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

132 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 21:50:27 ]
>>125
>1行目は捕捉しても意味がないエラー(エラーが出たこと自体がまずいとき)

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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



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

どういう意味?

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

145 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 15:54:47 ]
>>143
Cではassertマクロを使うような場所というか…

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

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

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

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

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

148 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/12/02(火) 20:11:30 ]
>>147
無料のレンサバってインストールできるでしょうか?

150 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 20:22:07 ]
最近のレンタルサーバってインストールするものなのか?

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

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

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



153 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 22:41:36 ]
そこで2重にする意味が分からんけどこういうこと?

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


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

156 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 23:03:12 ]
それはさすがに見たままなんじゃね

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

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

157 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 23:08:58 ]
それは展開されないと困るんじゃないかなあ
変数展開がないならメソッド定義をevalで書く必要なくね?

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

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

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

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

160 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 20:05:45 ]
>>159
net-ssh.rubyforge.org/ssh/v1/chapter-5.html
rubyforge.org/forum/message.php?msg_id=32802

161 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 22:56:25 ]
>>160
うおおありがとう!まさに求めていた物だ!

162 名前:デフォルトの名無しさん [2008/12/04(木) 07:14:05 ]
Rubyで書かれたblog用のCGIってないですか?



163 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 07:21:24 ]
>>162
その質問には、熟慮の末に「ない」と答えるのが妥当な気がする

164 名前:デフォルトの名無しさん [2008/12/04(木) 07:25:21 ]
>>163
ということは、あるにはあるけど使えないとか、そんな感じですか?


165 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 07:25:57 ]
「ぶろぐようのしーじーあいありますか?」という質問に応えられるレベルのものはないな
素直にPHPかPerlの使っとけ

166 名前:デフォルトの名無しさん [2008/12/04(木) 08:37:00 ]
>>165
一応名前だけでも教えてください。


167 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 09:48:40 ]
>>162
tDiary、Pinky:blog、lily

もしかして普通に名前挙げた俺、空気読めてない?

168 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 10:00:59 ]
「ぶろぐようのCGI」というものを求めてる人には結構アレなシロモノだと思う
Rubyをやりたいんじゃなくてブログシステムが欲しいんだろうし

169 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 10:16:04 ]
tDiaryより設置しやすく使いやすい軽快なものを作ろうとしてるのかもしれないじゃないか
日本における Perl の隆盛は Perl でカウンタと掲示板が作られたことだからな
「なんかごっつい Rails だけじゃない Ruby」を推進するなら今しかない

170 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 10:52:08 ]
>>158
はい。

['hello', 'goodbye'].each do |greeting|
eval(EOS)
def #{greeting}(person)
eval "#{greeting.capitalize}, #{person}!"
end
EOS
end

実際はこんな感じです。展開抑制されると思わなかったので…

171 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 18:56:49 ]
2重にしてでもevalを使いたいのは、リフレクションで
トップレベルにメソッドを定義するため?

172 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 21:28:23 ]
>>170
ふつーはこう書く
['hello', 'goodbye'].each do |greeting|
 eval(<<-EOS)
  def #{greeting}(person)
   '#{greeting.capitalize} %s!'%person
  end
 EOS
end



173 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 12:42:43 ]
foo[9] += 1の行とfoo[0] += 1の行が8回も実行されてるからイテレータの外に出す
それか1..8を0..9にして、10点未満も90点以上もiの一般式に組み込むかのどっちか






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<244KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef