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


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

Ruby 初心者スレッド Part 17



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






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

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

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