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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
321 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:07:25 ] >>318 > Symbol's function definition is void: coding-system-to-mime-charset なんでこれが読めないの? Ctrl x RET f して候補を入力しろよ
322 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:18:58 ] とあるxmlがあります。具体的に言うとAmazonのECSの蔵書検索のやつ。 で、<Author>著者名</Author>とか<Publisher>出版社</Publisher>とか<Title>書名</Title>とかを20種類くらい得たいです。 しかし、xmlの構造が一定ではなくて、「<Publisher>が無い」というような抜けが稀にあります。 なので、固定の巨大な正規表現でがばっと抜き出すということができません。 #パターン1 h['Author'] = xml.scan(/<Author>(.+?)<\/Author>/).flatten h['Publisher'] = xml.scan(/<Publisher>(.+?)<\/Publisher>/).flatten h['Title'] = xml.scan(/<Title>(.+?)<\/Title/).flatten #パターン2 RE = # 下の結果をあらかじめ直にコピペしたもの # Regexp.union(/<(Author)>(.+?)<\/Author>/,/<(Publisher)>(.+?)<\/Publisher>/,/<(Title)>(.+?)<\/Title/) xml.scan(RE).each do |a| a.compact! h[a[0]] = a[1] end どっちがメモリとかCUP時間とかの負荷少なくて済みそうですか? ちなみにrexmlとかごっついパーサは3秒くらい止まるので候補になりませんでした
323 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:25:43 ] xmlは10KB前後です これまではパターン1でxmlを何度もscanしてきたんですが、 「10KBの文字列に何度もアクセスする」という現状にだんだん不安になってきて 「選択入りの長い正規表現で一度だけアクセスしたほうがリソース的にまだマシなんじゃ?」とか思った次第です。
324 名前:デフォルトの名無しさん [2008/01/28(月) 22:26:03 ] ruby 1.9をインスコしたのですが,mechanizeでこけます。 対策教えて下さい。 ruby 1.9はMacOS 10.3 PPC G3です。 $ ./configure --prefix=/opt/local --program-suffix=19 checking build system type... powerpc-apple-darwin7.9.0 checking host system type... powerpc-apple-darwin7.9.0 checking target system type... powerpc-apple-darwin7.9.0 checking for gcc... gcc $ sudo gem19 install mechanize Password: Building native extensions. This could take a while... ERROR: Error installing mechanize: ERROR: Failed to build gem native extension. /opt/local/bin/ruby19 extconf.rb install mechanize checking for main() in -lc... yes creating Makefile make gcc -I. -I/opt/local/include/ruby-1.9.0/powerpc-darwin7.9.0 -I/opt/local/include/ruby-1.9.0 -I. -fno-common -g -O2 -pipe -fno-common -o hpricot_scan.o -c hpricot_scan.c ext/hpricot_scan/hpricot_scan.rl: In function `hpricot_scan': ext/hpricot_scan/hpricot_scan.rl:172: error: structure has no member named `ptr' ext/hpricot_scan/hpricot_scan.rl:185: error: structure has no member named `ptr' ext/hpricot_scan/hpricot_scan.rl:185: error: structure has no member named `len' ext/hpricot_scan/hpricot_scan.rl:186: error: structure has no member named `len' ext/hpricot_scan/hpricot_scan.rl:202: error: structure has no member named `ptr' make: *** [hpricot_scan.o] Error 1 Gem files will remain installed in /opt/local/lib/ruby/gems/1.9.0/gems/hpricot-0.6 for inspection. Results logged to /opt/local/lib/ruby/gems/1.9.0/gems/hpricot-0.6/ext/hpricot_scan/gem_make.out
325 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:27:53 ] >>324 > ruby 1.9をインスコした お前にはまだ早い 即刻アンインストールして1.8.6にしろ
326 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:40:01 ] >>324 どこを直していいのかわからないような初心者が1.9使っちゃダメ 「おい、1.9でhogehogeが動かないから直してやったぜ。これがパッチな」 というのが正しい使いかた。
327 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:46:33 ] 1.9使用者=デバッガか・・・ますます移行する気がおきんな
328 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:47:18 ] だから、移行するようなモノじゃないって。
329 名前:318 mailto:sage [2008/01/28(月) 22:49:27 ] >>321 それは試したのですが結果は変わりませんでした。
330 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:49:38 ] >>327 お前の周りでは「やっとβ版が出たのでシステムをこれに移行しました」とかいうことがあるのか? しないだろ? 試しに遊んでみて納得する程度だろ?
331 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:51:55 ] 次スレたてるときは、「初心者は1.9.0使うな」って書かないとあかんね。
332 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:52:34 ] >>331 >>7
333 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:53:17 ] いや、付け足し程度ではなく、>>1 にでっかく書こう。
334 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:57:16 ] すいません。 1234567...とかの複数桁の数字を桁ごとに分割してそれぞれ扱いたいのですが、 どうやるのが一番解りやすいでしょうか?
335 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:03:38 ] >>324 作者に苦情のメールを送る。
336 名前:デフォルトの名無しさん [2008/01/28(月) 23:03:52 ] >>324 1.9では文字列のアクセスの時RSTRING_PTRやRSTRING_LENを使わなくてはいけないのが原因っぽい
337 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:05:44 ] >>334 num = 1234567 num.to_s.split(//).each do |n| ketagoto(n.to_i) end
338 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:06:49 ] なんで1.9最先端のruby-mode.elなんて。 ともかくemacs --versionの結果を。
339 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:06:50 ] x = 123456789 digits = x.to_s.split(//).map {|digit| digit.to_i} とか。 x = 123456789 digits = [] while x > 0 x, y = x.divmod(10) digits.unshift(y) end という書き方もあるか。
340 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:11:27 ] >>339 初心者という言葉の意味を履き違えたオナニーヲタは帰れ 自分のブログででもやってろ
341 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:12:55 ] Ruby/Tkって今後廃れていくの? ruby1.9.xじゃ添付ライブラリに入らない雰囲気なんでそ? RubyのGUIツールキットは何を使っていくのが正解なの?
342 名前:334 mailto:sage [2008/01/28(月) 23:14:36 ] なるほど、spliteを使って区切り文字に何も入れなければ1文字ごとに分割されるんですね。 ありがとうございます。
343 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:15:35 ] >>340 339の前半は338と同じわけだから後半につっこんでるんだよな。 どっちかというとループ組んでちまちまやってる後半のほうが 初心者向けだと思った俺は変?
344 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:17:22 ] divmodじゃ?
345 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:19:24 ] unshiftとか久しぶりに見た とりあえずスレ的には配列に変換してeachで回せる状況にするのが素直かと…
346 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:25:17 ] >>322 パターン1で20回scanするのならおそらくはパターン2を基本にするのがまだマシかと… 俺なら正規表現が長くなりすぎないようにパターン1でおおまかに小分けにしたものにパターン2を適用するけどな
347 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:28:16 ] >>341 GUIを使わないのが正解じゃなかろうか。 保守性も考えたGUIのソフトは大概組み込みRubyな感じ。
348 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:33:50 ] Ruby的にはサーバとWebブラウザベースで作るのが正解かと思われる 無理してショボいGUIつけたスタンドアロンアプリケーションは斜陽っぽいぞ
349 名前:デフォルトの名無しさん [2008/01/28(月) 23:42:20 ] >>325 オマェの方こそ、厨房なんじゃネェの? 324には--program-suffix=19とかgem19って 書いてあるんだから、どう見たって1.8系と併存してんだろ? なのにアンインストールしろだなんて 本当はソースヨメネェから、対処できなくてごまかしてんじゃね?
350 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:43:14 ] さ あ 、 も り あ が っ て ま い り ま し た
351 名前:デフォルトの名無しさん [2008/01/28(月) 23:45:16 ] 最新作 On Air Alien オン.エア.エイリアン zoomtv.atspace.com/?G84Bds9WGIY377?qL_yJKe8kRI11+i_QH1mo46-A27?anB5SSsiolI36+8hj9PlJg0pA17@OnAirAlien
352 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:49:11 ] 並存してるかどうかに関わらず1.9系列はアンインストールして1.8.6使うべき
353 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:53:37 ] なんかwindowsしか触った事が無い人が言いそうな感じだなぁ・・・
354 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:53:52 ] どんなに煽られようが「1.9には触るな」はガチ 手を出したこと自体が誤り 映画で言うとスタンドバイミー
355 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:54:41 ] あーわかったわかった 2ちゃんはギャーギャー騒げば大勝利だからな もう何も言わないおめでとさん
356 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:57:32 ] 今更自分の勝利のために>>7 を捻じ曲げられても困るわけだが…
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 となります。何か間違ってるところがあるのか、教えていただければ嬉しいです。