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