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

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
となります。何か間違ってるところがあるのか、教えていただければ嬉しいです。







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

前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