1 名前:デフォルトの名無しさん [2008/01/16(水) 17:41:27 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 関連スレやURLは>>2-7 あたりを見てください。Ruby on Railsの質問はWebProg板の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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
411 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 18:45:11 ] WinとLinux(LinuxZaurus)で動くシリアルポートを操作するツールを作りたいのですが 何か良い方法があったら教えてください シリアルポート操作クラスはあるようですがWin用だったりして WinとLinuxであまりコードを変えたくないのですが… Winでmodeコマンド&IO.openを使う方法を試しているのですが `MODE COM4 BAUD=115200 PARITY=N DATA=8 STOP=1` com = open("COM1", 'r+b') sleep(1) com.syswrite("AT@K20\r") sleep(0.1) while true $> << com.sysread(1) end com.close よろしくお願いします
412 名前:デフォルトの名無しさん [2008/01/31(木) 01:03:43 ] すみません、RDEで実行結果(コンソールウィンドウ)をUTF8Nで表示する方法教えて下さい。 いろいろ試したのですが文字化けが直りません。 (以前のPCでは表示された気がしたのですが設定方法忘れてしまいました) RDE v1.1.1 / Ruby-mswin32 v1.8.6 / WindowsXP SP2 RDE設定 ・フォント(設定&エディタ設定): MS Pゴシック、文字セット:日本語 ・Ruby通常オプション: 「-Ku」(無しでも試したがダメ) ・コードウィンドウ>文字コード変換: japanese.dll(Y SJIS)にunicode.dllを追加(Y SJIS) ・コードウィンドウ>文字コード・ 「UTF8N + 改行:LF」 コード先頭に#!○○/ruby -Kuや$KCODE = 'u'、2行目に日本語のコメントを付けてもダメでした 文字コード変換のDLLのSJISを変更しないとダメなのでしょうか?(方法が判らないです)
413 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 15:20:33 ] Rubyから実行中のDirectXのfpsを取得するライブラリーとかない? 念を押すと、fpsのみでいいんだけども。
414 名前:デフォルトの名無しさん [2008/01/31(木) 16:55:01 ] Rakefileで CXX = 'g++' CXXFLAGS = '-Wall -g' TARGET = 'hellorake.exe' SRCs = FileList['./*.cpp'] OBJs = SRCs.sub(/$/, '.o') task :default => TARGET class Rake::Task alias :preqs :prerequisites end require 'rake/clean' CLEAN.include(OBJs) CLEAN.include(TARGET) rule('.cpp.o' => [proc {|o| o.sub(/\.cpp\.o$/, '.cpp') }]) do |t| sh "#{CXX} #{CXXFLAGS} -o #{t.name} -c #{t.source}" end file TARGET => OBJs do |t| sh "#{CXX} -o #{t.name} #{t.preqs}" end だとうまくいくのですが 「rule('.cpp.o' => [proc {|o| o.sub(/\.cpp\.o$/, '.cpp') }]) do |t|」の部分をシンプルにしようと思い 「rule '.cpp.o' => '.cpp' do |t|」にしたらDon't know how to build task './hellorake.cpp.o'と言われてしまいます Matzの呪いかと思ったのですがC言語なソースにしても同じでした><
415 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 18:20:10 ] >>413 > 実行中のDirectXのfpsを取得するライブラリーとかない? うーん。見たことないな・・・ DirectXの録画ソフトだと大抵ついている機能だから、 作者に頼んでみるとか、 オープンソースのソースを見て自分で作るとか
416 名前:415 mailto:sage [2008/01/31(木) 18:27:34 ] >>413 試してないが、この辺とか Taksi: Video capture/Screen capture for 3D applications taksi.sourceforge.net/ 他にも sourceforge に似たソフトがあったと思う あと、ムービー録画するソフトに関してはこちらの方が詳しい 【鑑賞】 ムービースレッド 【作成】 part2 game14.2ch.net/test/read.cgi/gamef/1167265823/
417 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:22:03 ] >>414 OBJs = SRCs.sub(/\.cpp$/, '.o') rule '.o' => '.cpp' do |t| なら動くが、二重のsuffixには対応しないんじゃね?
418 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:50:08 ] ていうか勝手に自己解釈で縮めんなよ
419 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:51:22 ] >>418 ???
420 名前:デフォルトの名無しさん [2008/01/31(木) 20:37:42 ] 教えてください。 UTF8の文字列に対して、正規表現で何かする場合に、 「〜」という文字が使えない気がするのですが、何故でしょうか? Ruby1.8.6をWindowsで使ってます。
421 名前:420 [2008/01/31(木) 21:15:20 ] ごめんなさい。Kconvの問題のような感じなんですが。。 -------------------------- require 'kconv' s = "〜あはははは〜" if s =~ /〜.*〜/ then puts "Done" else puts "Failed" end if s =~ /あ.*は/ then puts "Done" else puts "Failed" end t = Kconv.tosjis(s) u = Kconv.toutf8(t) if u =~ /〜.*〜/ then puts "Done" else puts "Failed" end if u =~ /あ.*は/ then puts "Done" else puts "Failed" end ---------------------- ↑を実行すると Done Done Failed Done となります。何か間違ってるところがあるのか、教えていただければ嬉しいです。
422 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:27:23 ] 試さないで適当にレスするけど 正規表現の後ろにuってつけてみたらどうだ /〜/u みたいに
423 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:30:10 ] >>421 文字コード指定してないんだから、そりゃマッチしなくて当然だ 初期状態では、正規表現はマルチバイト文字列にマッチしないようにできてる (少なくとも確実にマッチするという保証はない) $KCODEを設定するか、あるいは正規表現に文字コード指定をつけるかしないとダメ
424 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:34:09 ] 「〜」であるべきコードの主力が ウエーブダッシュ:〜 全角チルダ:~ のふたつあるのが問題かなーとおもったけど、ちがうのか
425 名前:420 [2008/01/31(木) 21:44:01 ] >>422 今、やってみましたが、変化無かったです。 >>423 頭に、$KODE指定も付けてみましたが、変化無かったです。
426 名前:420 [2008/01/31(木) 21:47:28 ] >>424 それは全く知りませんでした。 今、後半の「〜」をウエーブダッシュというので、書き換えて やったらうまくいきました!! 本当に有難うございます。 ちなみにこの話っていうのはよく知られた問題なのでしょうか?
427 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:49:29 ] >>425 1. どんな$KCODE指定をつけたのか書くこと 2. tosjis&toutfで、正しく文字コードを変換できているかどうかをチェックすること
428 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:52:10 ] あーubuntuで作った文書をWinに持ってきたら 〜のつもりだった部分が全部ウェーブダッシュだったとかよくあるよな
429 名前:420 [2008/01/31(木) 22:03:02 ] >>427 1. $KCODE='UTF-8'としました。 コードのファイルはUTF-8で保存してます。 2. チェックの仕方が良く分からないので、ソースの文字コード指定で 以下のようにしましたが、変化無かったです。 t = Kconv.kconv(s, Kconv::SJIS, Kconv::UTF8) u = Kconv.kconv(t, Kconv::UTF8, Kconv::SJIS) >>428 そうなんですか!よくある問題なんですね。。勉強になります。 ホント有難うございました。こんな早くに解決するとは、、 422さん,423さんもありがとうございました。
430 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:06:40 ] 〜は Mac ←→ Windows でも変になることがある厄介者。
431 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:10:02 ] WAVE DASH 問題 でググるとあれこれ出てくるぐらい有名な問題です
432 名前:420 [2008/01/31(木) 22:16:09 ] >>430 >>431 まじすか。ウエーブダッシュというものの存在自体しりませんでしたorz 初心者スレで質問してよかった。。
433 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:42:26 ] MSが〜を全角チルダで変換するのは1992年のWindows3.1登場から。 で、規格は〜をウェーブダッシュにしろといってるが、これは1994年製。 だから、互換性重視するWindowsで〜をUnicodeにするとみんな全角チルダになる。 規格通り変換テーブルを実装すると〜の変換先はウェーブダッシュになるから大変な目に Unicodeの絡みであと問題になりやすいのは、MACがファイル名をNFDして持ち出してくることかな
434 名前:86 mailto:sage [2008/01/31(木) 23:33:29 ] すいません。未だにできないので、どなたかご教授ください。 文字列の距離を求めることはできるのですが、 母音(aiueo)の挿入、置換、削除が行われたときのみ、重みを1じゃなくて2としてで距離を計算したいんです。 kasaとsasaの距離は1 kasaとkasuの距離は2 といった感じです。どなたかよろしくお願いします。
435 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:08:29 ] def kyori(s, t) s.split('').zip(t.split('')).inject(0){|x,y| y[0] == y[1] ? x : x += (y[0] =~ /[aiueo]/ ? 2 : 1) } end kyori('kasa', 'sasa') => 1 kyori('kasa', 'kasu') => 2
436 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:37:55 ] >>433 良く知らんけど、1992年にすでにCP932->Unicodeの変換表とかまであったの? kernel32.dll に MultiByteToWideChar とかのユニコード変換系APIが 追加されたのは NT3.1以降、95以降らしい。 それ以前に互換性が問題になるほど外部に公開されてたAPIとか変換表ってあったん?
437 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:40:19 ] >>436 もちつけ。
438 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 01:19:06 ] WAVE DASH 問題の歴史は、安岡先生の ttp://slashdot.jp/~yasuoka/journal/357074 とかかな
439 名前:デフォルトの名無しさん [2008/02/01(金) 05:37:10 ] 本に載っているとおりに実行しているのですができません。 file = open("test.txt") print file.read :in `initialize': No such file or directory - test.txt (Errno::ENOENT) in `open' と表示されます。 どなたか教えてください。
440 名前:デフォルトの名無しさん [2008/02/01(金) 05:42:36 ] >>439 そのままの意味。 test.txtがないから開けない。
441 名前:デフォルトの名無しさん [2008/02/01(金) 06:35:57 ] >>440 返答ありがとうございます。 test.txt があることは何度も確認しているのですが、 どうしても、エラー表示がでるので、他のファイルで試してみます。
442 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 06:46:11 ] おそらくファイルのせいではありません。 カレントディレクトリ、というものを意識してください。
443 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 07:34:53 ] またあれかな 'デスクトップ' の文字コードが違うとか
444 名前:デフォルトの名無しさん [2008/02/01(金) 08:43:40 ] >>442 >>443 ありがとうございます。 保存する前に実行していたので、エラーが出たようでした。 保存後実行で解決しました。
445 名前:86 mailto:sage [2008/02/01(金) 11:08:20 ] >>435 ありがとうございます。確かに距離はでましたが、 例えばyとyyyyの距離は挿入が3回行われるため距離3にしたいのです。 またuとyyyyなら距離4にしたいのです。 すいません、仕様不足でしたが、修正ソースお願いできないでしょうか?
446 名前:86 mailto:sage [2008/02/01(金) 11:13:37 ] 追加ですが、比較に使用する文字列長は最低2でした。すいません。 なのでyuとyayaなら距離は5となります。 日本語からローマ字に変換したもの同士を比較してるのですが、もし母音が一文字なのが余計でしたら 例えば変換規則をxaなどとして必ず偶数番目に母音を入れることも可能です。 きゃとかしゃも何とかします。
447 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 11:31:53 ] Rubyを学ぶ気はなさそうだな 格好よく書かなければいけないという縛りを勝手に感じることがあるがそんなもん無視しろ 望む結果を出すプログラムであることが第一だ
448 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 11:35:21 ] どうがんばっても泥臭くしか書けないものも、無くはないからな
449 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 11:46:39 ] 俺はよりよい(あるいはまともな)プログラムにするのは半年後の自分に任せてる 何かよくわからない素晴らしいメソッドを使って1行で書けるのかもしれないが、今自力で作ることのほうが重要 まあ、半年後にはRubyどころかプログラミング言語すら使ってないっていうパターンもあるだろうけどな そういう場合は自己探求に任せるのは双方にとって馬鹿らしくはある
450 名前:86 mailto:sage [2008/02/01(金) 13:28:59 ] すいません。泥臭くてもやってみたいのですが、いかんせん>>435 の s.split('').zip(t.split('')).inject(0){|x,y| y[0] == y[1] ? x : x += (y[0] =~ /[aiueo]/ ? 2 : 1) } という一文が何をしているのかよくわからなくって・・・ 動作はするのに理解できてないのがわからず、修正しようにもできないのが現状です。 ですので、もしよかったらこの一文もご教授ください。。。ググッてみましたが.zipがうまく探せないです。
451 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 13:39:13 ] このスレにはタチの悪いオナニーワンライナーが生息してるからな 初心者に自分の技術(と信じてるもの)を見せびらかして悦に浸る人種
452 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 13:46:29 ] 思考をifとeachとローカル変数にバラすのもめんどいっちゃめんどいけどな 意図的に書いてる奴は放置として、気づいた人が平易なほうに書き直すのがよいかと思われ
453 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 13:59:12 ] s.split('').zip(t.split('')).inject(0){|x,y| y[0] == y[1] ? x : x += (y[0] =~ /[aiueo]/ ? 2 : 1) } とりあえず脊髄反射的にバラしてみる s_splitted = s.split('') t_splitted = t.split('') zipped = s_splitted.zip(t_splitted) zipped.inject(0){|x,y| y[0] == if y[1] then x else x += if y[0] =~ /[aiueo]/ then 2 else 1 end end } split ttp://www.ruby-lang.org/ja/man/html/String.html#split zip ttp://www.ruby-lang.org/ja/man/html/Enumerable.html#zip inject ttp://www.ruby-lang.org/ja/man/html/Enumerable.html#inject
454 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 14:36:46 ] 元のソース読むの面倒だったから、Wikipedia読んで一から書いた class String def levenstein(other) return nil if self.empty? return nil if other.empty? # 距離行列のサイズを確定 row_size = self.size + 1 col_size = other.size + 1 dm = [] row_size.times do dm << Array.new(col_size) end # 距離行列の値を初期化 for row in 0...row_size dm[row][0] = row end for col in 0...col_size dm[0][col] = col end (↓に続く)
455 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 14:37:36 ] (続き) # 距離の計算 for row in 1...row_size for col in 1...col_size c1 = self.slice(row - 1, 1) c2 = other.slice(col - 1, 1) if c1 == c2 then cost = 0 elsif c1 =~ /[aiueo]/ then cost = 2 else cost = 1 end dm[row][col] = [ dm[row - 1][col] + 1, # 挿入 dm[row][col - 1] + 1, # 削除 dm[row - 1][col - 1] + cost # 置換 ].min end end #行列の最後の値が文字列間のレーベンシュタイン距離となる return dm.last.last end end puts 'kasa'.levenstein('sasa') #=> 1 puts 'kasa'.levenstein('kasu') #=> 2 puts 'yu'.levenstein('yaya') #=> 4
456 名前:454 mailto:sage [2008/02/01(金) 14:41:23 ] 挿入コストやら削除コストやらは面倒だったんで全部1にした あとは自分で何とかしてくれ もしコードの内容にミスがあったら、誰か突っ込んでほしい
457 名前:86 mailto:sage [2008/02/01(金) 18:54:01 ] >>453 ありがとうございます。ソースまでのっけてくださって。 本来ならここで後は組み合わせろとなるところを >>454 おかげで助かりました。 ただ、例えばauとyauuの距離が2になってしまうのでちょこっと改造しておきます。 if c1 == c2 then cost = 0 elsif c1 =~ /[aiueo]/ then cost = 2 else cost = 1 end のへんをいじってやってみます。 >>451 から>>456 にいたるまで、皆さん本当にどうもありがとうございました。
458 名前:86 mailto:sage [2008/02/01(金) 19:05:37 ] >>454 今見てやってみたら一瞬で改造できました。笑 ほんとにこんな長いソースを実ソースも見ずにやっていただいてありがとうございます。 僕も、もうちょっと勉強して、僕みたいな香具師を助ける側になれるようがんばります。
459 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 20:00:08 ] >>450 すまんそれはネタというか冷やかしで書いたもので 挿入とか削除とかに対応してないから使えないだろうな、とは思ってた。 勿論、技術をひけらかすつもりもない。 というか俺も素人だからそんなに大したコードじゃないと思うんだが・・・ zipは二つの配列からペア配列を作るメソッド a=[:a,:b,:c] b=[1,2,3] c=a.zip(b) #=> [[:a,1],[:b,2],[:c,3]] ハッシュ作るときとかにたまに使う Hash[*c.flatten] #=> {:a=>1, :b=>2, :c=>3}
460 名前:デフォルトの名無しさん [2008/02/02(土) 00:54:44 ] rubyにはawkやperlみたいな「一行野郎」集ってないの? テキスト処理にわざわざスクリプト書きたくないんだけど。
461 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:01:47 ] こういうことを言うとおまえらから総攻撃を受けるかもしれないが 一行で書きたいならawk使ったほうがいいような気がする
462 名前:デフォルトの名無しさん [2008/02/02(土) 01:14:45 ] awkの$1、$2に相当する組み込み変数はないの?
463 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:26:22 ] >>460 ここにいますよー。 Rubyの宿題スレにもそこそこいる
464 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:27:19 ] >>462 正規表現使った時にそいつら使えるぜ
465 名前:デフォルトの名無しさん [2008/02/02(土) 01:27:59 ] ネタにマジレスで申し訳ないけど、「一行野郎」って人じゃなくてコマンドね。
466 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:31:20 ] >462 -aオプション(とゆーことは、-nか-pオプションも)付けたときだけだが $F[0]、$F[1]、……が$1、$2……相当。 $0は$_ リファレンスのコマンドラインオプションのとこ参照 ちなみにそこ読めば書いてあるが$_をフィールドセパレータで分割したのが$Fなんで$FはArray
467 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:32:30 ] ワンライナーで書くための努力は、はっきしいって無駄な努力だよ。 ワンライナーでかけたからといって、自己満足でしかない。
468 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:32:33 ] perlのawkサポートと同じオプションだな。
469 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:32:40 ] File.open('hoge.txt').each { |line| puts(line.split.join('-')) } みたいに書こうと思えば書けるが、 Perl みたいな変態的な省略は_
470 名前:デフォルトの名無しさん [2008/02/02(土) 01:37:02 ] >>466 それだ。ありがと。 フィールドセパレータはどうやって設定するんだろう。。 >>467 君ってあまりコマンドラインシェル使ったこと無いでしょ。
471 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:38:25 ] >>470 いや、トテモトテモ使ってるよ。
472 名前:デフォルトの名無しさん [2008/02/02(土) 01:41:12 ] FSは「$;」で、RSは「$/」だね。これなら使えそうだ。
473 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:45:30 ] BEGINとENDもあるな。
474 名前:デフォルトの名無しさん [2008/02/02(土) 01:47:35 ] awk互換モードが欲しいな。2.0くらいでつけてほしい。
475 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:53:22 ] それはawkでいいじゃんw
476 名前:デフォルトの名無しさん [2008/02/02(土) 02:08:31 ] awk的使い方でも、rubyの機能を使いたくならない?
477 名前:デフォルトの名無しさん [2008/02/02(土) 03:02:51 ] windowsのコマンドプロンプトのコマンドラインで「|」を使えないから、one linerでブロックで変数を受け取る構文が書けないよ。 どうすればいいの?
478 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 03:21:41 ] >>477 普通に書けるけど? > ruby -Ks -e "Dir.glob('*'){|x|p x}"
479 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 08:06:42 ] ^でエスケープ > ruby -Ks -e "Dir.glob('*'){^|x^|p x}"
480 名前:86 mailto:sage [2008/02/02(土) 10:00:40 ] >>459 ありがとうございます。zipに関してかなり理解できました。 けっこー使えそうなメソッドなのでばりばり使っていきます。
481 名前:デフォルトの名無しさん [2008/02/02(土) 10:04:11 ] >>478 >>479 せんくす
482 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:43:33 ] ネット上の、時々更新されるHTMLをパースしてハッシュにして返すメソッドを作りました。 しかし、「データがありません」という場合どうするかで悩んでます。 a) 空のハッシュ {} を返す b) 偽である nil を返す c) 自作の例外を発生させる どれが妥当でしょか。 このハッシュは別の大きなハッシュに {サイト名 => parsed_hash} のように格納される予定です。 データがありませんの大きな理由として 「過去のハッシュとの差分がゼロ」 「HTML中にパースすべき該当項目なし」 「そもそもサーバにアクセスできない」 等があります。
483 名前:デフォルトの名無しさん [2008/02/02(土) 14:05:59 ] erbについて質問があります。 下記のようなコードを書いてerbに変数ItemListの内容を出力しようと思います。 PHPのテンプレートエンジンのSmartyのようにassignメソッドがあればいいのですが どうも見当たりません。 変数のスコープの問題だと思うのですが、どうやって出力すればいいのでしょうか? def initialize @cgi=CGI.new end # 商品一覧 def doItemList @erb = ERB.new("item_list.tpl") im=ItemManager.new() itemList=im.getItemList(10) display() end # テンプレート出力 def display(contentType="text/html") print "Content-Type: #{contentType}\n\n" print @erb.result(binding) end
484 名前:デフォルトの名無しさん [2008/02/02(土) 14:49:15 ] Rubyが面白そうなので今日からRubyをはじめます(^-^) まずはダウンロードしてこなきゃ!!o(^-^)o
485 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 14:54:20 ] >>460 俺がよく書くのは > ruby -e "puts ENV['PATH'].split(';')"(sortを加えることも) だって、生のPATH記述って読み辛いんだもの…。
486 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:00:05 ] >>459 なんだかすごく助けられた気がする 深謝
487 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:09:33 ] >>483 erbを一度も使ったことのない俺がWeb上の解説を読んで適当に回答するよ! > in `display': undefined local variable or method `itemList' for #<MyCGI:0x4030ed9c> (NameError) こんなエラーが出るという質問だと推測。itemListをインスタンス変数あたりに書き変えると動いたよ! require 'erb' class MyCGI def doItemList im = ItemManager.new @itemList = im.getItemList(10) @erb = ERB.new(DATA.read) display end def display(contentType="text/html") @contentType = contentType @erb.run(binding) end end class ItemManager def getItemList(n); (1..n).to_a; end end MyCGI.new.doItemList __END__ Content-Type: <%= @contentType+"\n\n" %> <%= @itemList.join(',') %>
488 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:17:35 ] @erb.runあるいは@erb.resultをするメソッドから erbスクリプト内で使ってる名前の変数が読めないとダメっぽいという話。たぶん。 だからこれでも動く。displayに引数があるのは気持ち悪いのでoutputに変更(というかdisplayはto_sの以下略) require 'erb' class MyCGI def doItemList im=ItemManager.new itemList=im.getItemList(10) @erb = ERB.new(DATA.read) output(itemList) end def output(itemList, contentType='text/html') @erb.run(binding) end end class ItemManager def getItemList(n); (1..n).to_a; end end MyCGI.new.doItemList __END__ Content-Type: <%= contentType+"\n\n" %> <%= itemList.join(',') %>
489 名前:デフォルトの名無しさん [2008/02/02(土) 15:17:35 ] >>487 レスどうもです。 やっぱり、スコープの問題なんですね。 MyCGIのインスタンス変数にしてしまうってのが・・・ なんか書き方として気持ち悪いような。 itemListのまま使いたいとすれば、def doItemListの中でerbを使うしかないって事ですかね? やっぱり、assign欲しい・・・
490 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:54:52 ] assignだと何か便利なんですかね あとerb使うときはERB::Utilでエスケープするようにしてくれえ
491 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 16:42:55 ] bindingはただの関数的メソッドなので、変数に入れてdisplayに渡せばいい ただ、bindingしたあとにローカル変数を「追加」するのは面倒なので注意 この場合、display内でcontentTypeを設定してitem_list.tplで使用するのは面倒 # item_list.tpl <%=h itemList.map{|e| "<#{e}>"}.join(' ') %> # out.rb require 'erb' class MyCGI include ERB::Util def doItemList @erb = ERB.new(File.open("item_list.tpl").read) im=ItemManager.new() itemList=im.getItemList(10) binding_data = binding display(binding_data) end def display(binding_data,contentType='text/html') print "Content-Type: #{contentType}\n\n" print @erb.result(binding_data) end end class ItemManager def getItemList(n) ['あ','い','う','え','お']; end end MyCGI.new.doItemList
492 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:14:24 ] >>482 ハッシュを加工するなら空のハッシュを返すかも HTMLから抜き出すならnilでいいんじゃね
493 名前:デフォルトの名無しさん [2008/02/02(土) 17:30:02 ] >>490 assignあると明示的にこれ使いますよってできるから、わかりやすいんですよ。個人的には。 Railsだと、erbのスコープはどうなってるんでしょう?
494 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:48:35 ] 引数バージョンをことごとく無視してるのは何か理由があるのか いっそのことPHPで書けば?
495 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:35:17 ] 引数バージョンって何?
496 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:41:33 ] bindingをdisplayの引数にすれば? ということじゃないの?
497 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:43:30 ] >>482 >ネット上の、時々更新されるHTMLをパースしてハッシュにして返すメソッドを作りました。 >しかし、「データがありません」という場合どうするかで悩んでます。 > >a) 空のハッシュ {} を返す >b) 偽である nil を返す >c) 自作の例外を発生させる 「データがありません」を表すなら、b) がよい。 a) は、データがない場合とある場合とを同じように扱いたい場合に採用する設計。 c) はやりすぎ。 ただ、b)とa)はそう大差がない。
498 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:55:28 ] >>489 >やっぱり、assign欲しい・・・ あんま関係ないけど、Erubisだとできるみたい。assignじゃなくてHashつかうんだけど。 def doItemList @eruby = Erubis::Eruby.new(DATA.read) itemList = ItemManager.new.getItemList(10) output(:itemList=>itemList) end def output(hash) print @eruby.evaluate(hash) end >>490 >あとerb使うときはERB::Utilでエスケープするようにしてくれえ これもErubis::EscapedEruby使うとデフォルトでエスケープされる。
499 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:23:12 ] >>496 >>488 もじゃね? 表示したいデータをローカル変数にした状態でrunするので問題ないと思うんだけどなあ 変数の参照を全部持ってくbindingがイヤなんだろ、つまり
500 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:26:23 ] >>499 *.rhtmlでローカル変数を変更したら、それがもとのプログラムにも影響与えるじゃん。問題ありだろ。
501 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:48:21 ] require 'erb' def main include ERB::Util erb = ERB.new(DATA.read) str = 'strは文字列だよ!' puts str message = 'こんにちは' print erb.result(binding) puts str end main __END__ <%=h message %> <% str='strが変更されました' %> ============================= ~$ ruby erb.rb strは文字列だよ! こんにちは strが変更されました ~$ ぬう
502 名前:デフォルトの名無しさん [2008/02/02(土) 20:59:25 ] ページキャッシュ機能持ってるRubyのテンプレートエンジンってないの?
503 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:12:24 ] >>500-501 require 'erb' class MyCGI def main str = 'default' p str msg1 = 'Hello'; msg2 = 'World' output(msg1, msg2) p str end def output(msg1, msg2) erb = ERB.new(DATA.read) erb.run(binding) end end MyCGI.new.main __END__ <%= "#{msg1},#{msg2}!" %> <% str='**CHANGED**' %> - - - 8< - - - 8< - - - 8< - - - 8< - - - 8< - - - $ ./test.rb "default" Hello,World! "default"
504 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:33:11 ] そんなに気になるならErb.newしてrunするクラスを別途作れば? っていうのがきっとErubisなんだろうな…
505 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:38:29 ] >>502 出力結果のHTMLをキャッシュするという話なら、それはテンプレートエンジンとは別に用意する機能だよ。 テンプレートエンジンに持たせる機能じゃない。
506 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:56:08 ] >>505 つSmarty
507 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:17:06 ] 素のERBには無理だろうね そこまでは気を遣ってないというかそれは自力でやれというか …Erubisにはあるようなことが書いてあるなあ ttp://www.kuwata-lab.com/erubis/users-guide.06.html#topics-caching
508 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 23:35:37 ] Erubisは高速なERBとして、開発されてて、 その高速化の手段の一つとして、キャッシュすることも挙げてたからな。 Preprocessing 何つー機能もあるくらいだし
509 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 23:38:54 ] 別にERBは遅くないけどね
510 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:08:48 ] プログラムの中から、コンソール出力に行くはずのテキストオブジェクトを奪ってファイルに出力したいんだけど。。 より具体的にはTest::Unitを使いたいんだが、そのログをファイルにしたい。 ぱっとリファレンスを読んだ限りじゃそういう類の見つからないし、なんかいい方法ないですか。 もし複数いい方法があれば、それぞれの違いについて簡単な解説つきだととても助かる。
511 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:10:55 ] ruby unko.rb > benki.txt