[表示 : 全て 最新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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

357 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:59:18 ]
つーか開発版にわざわざ手出すなよ。動かないことに文句言うな。
1.9関連は使用を正当化するアホ初心者が沸いて困る。

358 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:01:07 ]
www.ruby-lang.org/ja/install.cgi?cmd=view;name=MacOS+X
>curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.0-0.tar.gz
これはMac上がりのニワカBSDヤーを懲らしめようとする巧妙な釣りだなw

359 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:21:39 ]
ふつうはportやfinkで入れるところを……


360 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:24:49 ]
>>357
β版リリースを大々的に宣伝するからだろw

361 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:30:35 ]
目に付いた1.9.0への言及を1.8.6にしてみた。
改良よろ。
つーか、無駄に記述がおおいな。このページ。


362 名前:デフォルトの名無しさん [2008/01/29(火) 00:33:46 ]
質問です.
ベクトル空間モデルの考え方から,コサイン尺度を用いてベクトル間の
類似度を求めることができるじゃないですか?
このコサイン尺度の計算式ってプログラムでどう書けば良いのでしょうか?

363 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:36:54 ]
それなりに知識がないと答えられないような。
Ruby固有の話じゃなさそうだから、このへんがいいんじゃないの?

プログラミングの為の数学と算数 vol.3
pc11.2ch.net/test/read.cgi/tech/1197063023/

科学技術計算
pc11.2ch.net/test/read.cgi/tech/1104421606/

計算アルゴリズム【U】
pc11.2ch.net/test/read.cgi/tech/1129376543/


364 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:49:29 ]
Railsスレとマルチすんなボケェ


365 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:07:57 ]
Railsスレ→Rubyスレ→計算スレ??

「どこのレイヤーで躓いてるのかが把握できない」というあたりが
初心者ゆえんだな。




366 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:09:09 ]
なんでRailsスレがこの板にあるのかと

367 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:34:44 ]
たかがMVCやってるだけなのに宣伝がうざすぎるんで
Webprog板を追い出されました

368 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 02:21:05 ]
(0..3).each{|i| p (i%1).class}
これを実行すると
hoge.rb:1: warning: don't put space before argument parentheses
0
0
0
0
となります。
なぜ p (i%1).class は Fixnum と出力されないんでしょうか?
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32]

369 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 02:36:32 ]
>>368
(p(i%1)).class と解釈されるからじゃなかろうか

370 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 02:39:59 ]
なるほどこれならうまくいきました
irb(main):004:0> (0..1).each{|i| p((i%2).class) }
Fixnum
Fixnum
=> 0..1

371 名前:デフォルトの名無しさん [2008/01/29(火) 15:38:23 ]
正規表現を合理化するスクリプトを書いているのですが,
以下のようにつらつらと書くと,とても手間が掛かるので,
もっと簡単に行う方法はないのでしょうか?

$KCODE="SJIS"
str = '2007年(01|02|03|04|05|06|07|08|09|10|11|12))月'

str.gsub!('(01|02|03|04|05|06|07|08|09|10|11|12)','(0[1-9]|1[0-2])')
str.gsub!('01|02|03|04|05|06|07|08|09','0[1-9]')
str.gsub!('10|11|12|13|14|15|16|17|18|19','1\d')
str.gsub!('20|21|22|23|24|25|26|27|28|29','2\d')
str.gsub!('30|31|32|33|34|35|36|37|38|39','3\d')
str.gsub!('40|41|42|43|44|45|46|47|48|49','4\d')
str.gsub!('50|51|52|53|54|55|56|57|58|59','5\d')
str.gsub!('60|61|62|63|64|65|66|67|68|69','6\d')
str.gsub!('70|71|72|73|74|75|76|77|78|79','7\d')
str.gsub!('80|81|82|83|84|85|86|87|88|89','8\d')
str.gsub!('90|91|92|93|94|95|96|97|98|99','9\d')
str.gsub!('10|11|12','1[0-2]')

p str



372 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 15:51:38 ]
もう死ぬしかないね

373 名前:デフォルトの名無しさん [2008/01/29(火) 16:22:31 ]
ああ.一応4行目で変換は完了してるんですが,
strの中身が以下の様だったりする場合にも対応したいので.

str = '2007年(01|02|03|04|05|06|07|08|09|10|11)月' => 2007年(0[1-9]|1[01])月
str = '2007年(10|11|12)月'  => 2007年1[0-2]月
str = '(2007年(10|11|12)月|2008年(01|02|03|04|05|06|07|08|09|10|11|12)月)'  => (2007年1[0-2]月|2009年(0[1-9]|1[0-2])月)
str = '01|02|03|04|05|06|07|08'  => 0[1-8]
str = '11|12|13|14|25|26|27|28'   => 1[1-4]|2[5-8]

といった感じに変換されるようなモジュールなどはありませんか?




374 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:22:59 ]
>>371
まず何がしたいのか分からん

375 名前:デフォルトの名無しさん [2008/01/29(火) 16:31:41 ]
長い正規表現を短くまとめたいのですが.




376 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:37:29 ]
>>374
>>373だろ
要は、/1|2|3|4|5/ を /[1-5]/ に変換するようなうまい方法はないか、という質問
変換用のペアを自前で記述したものを作って総置換かける以外の方法はないような気がする

Rangeオブジェクトを使うと '11|12|13|14|15|16|17|18|19' を (11..19).to_a.join('|') にできるがその程度だろう

377 名前:デフォルトの名無しさん [2008/01/29(火) 16:41:23 ]
>>376
そうですか.ゴリゴリ書いてみます.
ありがとうございました.


378 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:42:58 ]
???
そもそも正規表現ってなんだっけ?と考えてしまったろぉ

379 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:45:00 ]
>>377
外部から正規表現を受け取って短く変換して返すというアプリケーションを作ってるなら、わりと無駄だと思うのでやめとけ
正規表現の記述が短くなったからといって正規表現としての効率が上がるとは限らない
冗長に記述したほうが速いぜということもままあるはず

で、もし、既に存在する正規表現を手作業でくっつけてるために変換を欲してるのなら、
Regexp.joinで正規表現をくっつけることも検討するといい

380 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:47:43 ]
eroero.com/eroero{1-5}.jpg

eroero.com/eroero1.jpg
eroero.com/eroero2.jpg
eroero.com/eroero3.jpg
eroero.com/eroero4.jpg
eroero.com/eroero5.jpg
展開するのってどうやるの?

381 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:53:36 ]
>>380
自動ではできないと思う
自分で都合のいいマッチ条件を書いて場合分けして置換するしかないんじゃね
与えられた文字列で{数字A-数字B}を検知したら数字Aから数字Bまでのeachを起動してその部分を数字に置換する、とか
zshなんかでは専用の処理が既に組み込まれてたりしたはず

382 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:56:30 ]
正規表現の最適化とかそういうことをやるには、正規表現処理系の中身に
手を出すような処理が必要になる、つまり自分で正規表現処理系を新しく
実装して、とかいうことになる。

383 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:04:13 ]
後に画期的なコンパイラコンパイラを生み出す371であった

384 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:06:03 ]
eroero.com/eroero[1-5].jpg
のほうがいいんじゃまいか、そんで
eroero.com/eroero{1,3,5}.jpg
がいいな

385 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:06:40 ]
eroero.comが普通に存在している件



386 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:08:42 ]
どうでもいいが例示はexample.comを使え
実在するドメインに迷惑かけないように

387 名前:デフォルトの名無しさん [2008/01/29(火) 17:09:34 ]
>>379
ええ.ありがとうございます.
ただし,私の場合,スピードを求めているのではなくて,
可読性の向上と255文字制限を回避するためなのです.
255文字制限は他のプログラムで存在するので対策が必要です.

他のプログラムで,あるデータベースから自動的に生成された
年月日などの規則性のある,連続した数字の羅列を,
正規表現で表現し,さらに簡潔な表記に変換した後,
テキストで出力し,そのファイルを別のプログラムで使用する
という形のプログラムを作成中です.


ちょっと組んでみたのですが,かなり面倒ですねw
2桁の数字で真面目にやったら1000行超えちゃいますね.
ああ面倒だ.頻出の物だけで済ませるか.
数字を纏める事一つでここまで手こずるとは予想外でした.


388 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:49:12 ]
>>387
要件が曖昧な気がするな。
例) 01, 02, 11, 13
これの要約表現として、
a) [0-1][1-3]
b) 0[1-2]|11|13
のどちらのようなものを求めるか、もわかりにくい。

数値としての範囲を記述させようという b)のようなら、正規表現は向かないだろう。
a)のように各桁独立で、0-9範囲の文字として処理させるなら、20行もいらないと思うが。

389 名前:デフォルトの名無しさん [2008/01/29(火) 18:21:59 ]
>>388
基本的には「元の正規表現と等価である」というのが要件です.
a)の場合は元の数値を含んでいますが,それ以外の
03や12なども含んでしまいますから等価ではないと思います.
そのあたりの厳密性が要求されるのでb)が望ましいと言えます.

思いついたアルゴリズムとしては,|で区切った数値を
全て配列に書き出して,ソートして,一つ一つ取り出して,
連続しているようなら[ - ]で繋ぐという様なアルゴリズムで
やろうかなと思います.


390 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:32:10 ]
ふくろう本(みみずく本だっけ?)にないかなあ
とあてずっぽうを言ってみるテスト

391 名前:238 mailto:sage [2008/01/29(火) 19:45:54 ]
大変な遅レスです。すみません。

>>255
うう、Cygwinは捨てたくないし、Winを捨てたら Win32OLEが使えませんし、ちょ
と困ります。その関数もさすがに煩雑ですし。

>>261
おお!この手があったか!ありがとうございます。さっそく読んでみます。


392 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 20:11:08 ]
>>388
perlのRegexp::Assembleのソース読んでみれば。

393 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 20:20:28 ]
>>389
単純なalternationだけでいいなら、
いったん全部をトライ木に突っ込むのが簡単。

394 名前:デフォルトの名無しさん [2008/01/29(火) 21:29:58 ]
>>392
perlですか.勉強してみます.

>>393
なるほど.トライ木ですか.
ありがとうございます.


395 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 21:39:06 ]
というか、出力パターンが極めて限定されていて、
正規表現として解釈する必要が本質的に無いとかいうオチは無いだろうか



396 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:53:14 ]
俺も正規表現使わないほうが早いんじゃないかとちょっとだけ思った

397 名前:デフォルトの名無しさん [2008/01/29(火) 23:55:06 ]
パイプで別のプログラムを呼ぶときのことで質問させてください。
Rubyはmswin32の1.8系です。
RubyからMeCab(形態素解析ツール)を呼ぼうと次のように書いたのですが、
関数内での結果受け取り部分をどう書くのがよいかわかりません。。

プロンプトでMeCabの動作は、上記のようにオプションなしに呼んだ場合、文字列の入力を促され、
入力すると複数行の結果とEOS(文字列)が返って、次の入力待ちになります。
私\t説明
の\t説明
名前\t説明
EOS
・・(入力待ち)
以下ではこの流れをそのまま書きました。(続く)

398 名前:397続き [2008/01/29(火) 23:55:58 ]
def parse(str)
result = []
io = open("|C:/MeCab/bin/mecab.exe", "r+")
io.puts str
#ここで解析結果受け取り(後述)
io.close; result
end
result_array = parse("私の名前") #結果を配列で受け取る

ここで、入力待ち状態になったところをRubyでどう受け取ってMeCabを終わらせたらいいのかわからないのです。
nilなどが返るわけじゃないみたいですし・・・
自分なりに書いたコードは以下で、一応動いています。(上記関数内のコメント部分に入る)

while 1
word = io.gets.chomp!
break if /\AEOS\z/ =~ word
result << word
end
io.puts "^C" #こんなわけないような・・・

EOSの行は不要なのでこうしたのですが、MeCab以外の場合のことを考えるとこれじゃダメですよね。
もっと一般的な書き方があったら、おしえてください。(入力待ちになったら終了、など)

399 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:02:55 ]
>>397
一般論として、相手側がまだ出力を続けているけど遅延か何かでたまたまデータが来ないのか、はたまた出力が終わって今度は入力待ちになったのか、を知る方法はない。

今回の例だったら、EOSが来て相手の出力が終わったことはわかるんだから、もう用がないならio.closeでOK。

400 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:04:03 ]
io.close_writeかな?

あと、回答とは違うがmecab-rubyを使うという選択肢はなし?


401 名前:397 [2008/01/30(水) 00:22:58 ]
>>399 >>400
ありがとうございます。入力待ちで信号が来るわけじゃないんですね。
mecab-rubyはcygwin版でないとインストールが面倒そうだったので
早々にあきらめてしまいました。
過去スレにはWin32APIを介して・・というのも出ていたのですが
自分のスキルでは未知の領域なので同様に^^;

402 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 02:41:18 ]
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-cygwin] です。

まちがって終わらない Thread を作ってしまい、Cygwin を走らせている
アプリごと止めたんですが、改めて実行したら deadlock エラーがでました。

しかたがないので再起動してみたんですが、それでも deadlock がおきます。
ためしに irb を起動してみたらこのようにゾンビ化した Thread が残っています。

$ irb
irb(main):001:0> Thread.current
=> #<Thread:0x1003c978 run>

これ、どうやって消すんでしょうか?

403 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 03:05:51 ]
>>402
それ単なる自分のスレッドだから。

アプリでdeadlockが起こってるってのはなんかロックとして使ってるファイルでも
消してないんじゃないか?tmpとか見てみれ

404 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 03:55:40 ]
>>403
> それ単なる自分のスレッドだから。
そうみたいですね。 はやとちりでした。

どうやら自分が Thread の扱い方を理解していないだけみたいです。 orz

405 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:09:34 ]
正規表現で前からずっと気になってたので質問。
「でっかいHTMLから<title>を抜き出す」という場合
html.scan(/<title>(.+?)<\/title>/)
みたいな書き方するんだけど、これよく考えたらhtml内で</title>が終わった後もえんえんサーチしてるよね。
「ひとつ見つけたらそこで終了させる」というような指定はできない?



406 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:17:57 ]
>>405
'123451'.scan(/(1)/){p Time.now.to_f}
1201677254.19416
1201677254.19554

ということで、マッチするものが見つかるたびにブロックを実行してるようなので

'123451'.scan(/(1)/){ p $1; break}
"1"

即breakすれば桶

407 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:18:55 ]
ブロック内でbreakすればいいんじゃない?

408 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:23:14 ]
そもそもscanを使わないというのは無しですか?
p $1 if /<title>(.*?)<\/title>/ =~ html


409 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:08:38 ]
html.scan(/<title>(.+?)<\/title>/, 1)

410 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 18:07:49 ]
>>409
これなんだろうと思ってリファレンスマニュアル見たけど無いよ
slice(regexp[, nth]) の間違いだな

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にいたるまで、皆さん本当にどうもありがとうございました。






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

前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