08/01/20 18:18:51
>>113
Poderosa 3 なら、.NET 1.0で動くよ
117:デフォルトの名無しさん
08/01/20 18:19:45
113は.Net2.0が入らない環境しか利用できないんだよ。
118:デフォルトの名無しさん
08/01/20 19:05:36
>>108
余計なお世話だけど
それらの値はStructに代入する前に数値型に直しておく方がいいと思う
119:108
08/01/20 19:13:48
>>109-110
ありがとうございます。勉強になりました。
120:デフォルトの名無しさん
08/01/20 19:44:50
Rubyist Magazine出張版 Ruby on Windows
URLリンク(www.amazon.co.jp)
ちょっと気になる
121:デフォルトの名無しさん
08/01/20 19:49:20
この人のるびま記事はすごく良かった
どの程度加筆されるかにもよるけど期待大
122:デフォルトの名無しさん
08/01/20 19:51:36
ちょっとまて、もう発売されてるみたいじゃないか・・・
漏れのバカバカバカ
123:デフォルトの名無しさん
08/01/20 20:01:01
立ち読みした限りでは「WindowsでRubyを使って楽をしたい」と考える人の最初の本として申し分ないように見える
載ってる例以外の事をしたいと考えたときに頼りになるかどうかはわからん
あとこれはどうでもいいんだが
def method_hoge arg
…
end
ってdefで引数カッコ省略の書き方をしてるのがどーにも性に合わん
124:デフォルトの名無しさん
08/01/20 20:02:43
>>120
> Javaや.NET CLRなどの膨大なソフトウエア資産を活用する方法まで
mjsk
125:デフォルトの名無しさん
08/01/20 20:03:28
JRubyとRuby.netか
126:デフォルトの名無しさん
08/01/20 20:15:59
>>124
URLリンク(book.mycom.co.jp)
> 第1回 Win32OLEことはじめ
> 第2回 Excel
> 第3回 ADODB
> 第4回 Outlook
> 弟5回 Web自動巡回
> 弟6回 Windowsアプリケーションの自動操作
> 弟7回 他の言語でのCOM
> 弟8回 WMI
> 弟9回 iTunes
> 弟10回 Exerb
> 弟11回 RubyCLR
> 弟12回 RjbとApache POI
> 弟13回 JRuby
5回目から弟になってるのはコピペ検知用の罠か何かか
127:デフォルトの名無しさん
08/01/20 20:31:21
弟に吹いた
Win32APIはあんまり書いてなさそうなのが残念だけど買っちゃおうかな
OLEとか情報集めるの大変だしね
128:デフォルトの名無しさん
08/01/20 21:06:13
目次見て俺でも書けるような気がしてきた
129:デフォルトの名無しさん
08/01/20 21:24:29
目次よりもサンプルスクリプト見たほうがいいな
130:デフォルトの名無しさん
08/01/20 22:06:51
インスタンス変数が設定されているかどうかを調べるために
class Object
def instance_variable_exist?(name)
self.instance_variables.include?(name)
end
end
としているんですけど、効率が悪いので、なんかもっといい方法あったら教えてください。
131:デフォルトの名無しさん
08/01/20 22:13:38
instance_variable_defined? 使えばいいんじゃない?
132:デフォルトの名無しさん
08/01/20 23:10:07
>129
そう思う奴のうち実際に書ける奴は半分以下
さらにそのうち本当に書く奴は1割以下
俺? もちろん最初の書ける奴、の上限で除外orz
133:デフォルトの名無しさん
08/01/20 23:10:33
上限てなんやorz
条件な
134:デフォルトの名無しさん
08/01/20 23:15:48
>>127
発売日に買って斜め読みした俺がコメント.
ExcelやOutlook,IEについては筆者セレクションによるメソッドやプロパティが
ちょろっと紹介されてる.ちょっと便利.
ただ,基本は限られた紙面に広範囲な情報を詰め込んでいて
個々のトピックについてはビックリするほどに紹介レベル.
ExerbRuntimeモジュールなんてメソッドすら載ってないよ.
でも,いつもexe化するのにしか使って無くて,そんなモジュールの存在を知らず
普通にdl/win32使ってexeのパス取得してた俺ショック.
WMIもPowershellの紹介とかで名前は聞いたことがあったし
デフォルトで実行パスにwbemが含まれているので気にはなっていたけど,使えるねこれ!
NICのIPアドレス取得するのにipconfig使ってて,一瞬,DOS窓が表示されるのがウザかったんだけど
WMIで解決しました.
上級者は必要ないかもしれないけど,初心者は買って損のない本.
135:88
08/01/20 23:40:34
>>99
おとなしく同一サーバにcgiを置く事にしました。
お騒がせしてすんまそん。
136:デフォルトの名無しさん
08/01/20 23:46:14
>>131
1.9からじゃないか?
137:デフォルトの名無しさん
08/01/20 23:59:07
>>136
1.8.6 から追加されてる
138:127
08/01/21 00:02:51
>>134
何という親切なコメント。ありがとね
そのあたりの知識も不足してる気がするし買うことにするよ
139:デフォルトの名無しさん
08/01/21 00:10:10
>>134
何という親切なコメント。ありがとね
そのあたりの知識も不足してる気がするし買うことにするよ
140:デフォルトの名無しさん
08/01/21 00:12:50
>>137
安定版という意味では変わらないか
141:デフォルトの名無しさん
08/01/21 00:41:00
>>137
ホントだすまん。
Refeでしか確認してなかったよ。
142:デフォルトの名無しさん
08/01/21 04:30:38
は!
143:デフォルトの名無しさん
08/01/21 04:40:53
503 対応してくれたみたいでありがとうございます><
144:デフォルトの名無しさん
08/01/21 09:10:19
>>131
そんなのあるんだ。それってどのバージョンから定義されているかわかりますか。
わしがもってるマニュアルには載ってなかったので。
145:デフォルトの名無しさん
08/01/21 16:14:08
1.8.6でこっそり追加だと思った
マニュアルには反映されてない可能性が
Emacs上でRubyスクリプト書いてる人はいる?
・rbファイルをruby-modeで読み込む
・普通に全部手書きする
・普通に別窓のコンソールでスクリプトを実行しエラーを目測
・普通に方向キー連打で該当行に到達
・普通に別起動のHTMLヘルプを見ながら修正
という、よく考えたらかなり無駄っぽい動きをしてる気がする俺をたしなめてくれ
146:デフォルトの名無しさん
08/01/21 16:43:12
>>145
めっ
147:デフォルトの名無しさん
08/01/21 17:10:38
> 普通に全部手書きする
Emacs自体に動的略語展開があるから、
一度読み込んだファイルに書いてある単語は2回書く必要はないかと
> 方向キー連打で該当行に到達
M-x goto-line
148:デフォルトの名無しさん
08/01/21 19:33:42
Rubyを使って大量のファイルに置換作業を加えたいんだけどどんなことを勉強すればいいですか?
149:デフォルトの名無しさん
08/01/21 19:46:23
>>148
それの期限を限りなく引き延ばすための技術や話術
普通に学んでる限りはそんなことをとりたてて聞いたりしないもんだ
聞かなきゃならないってことはRubyの基本やコンピュータの知識がなってないってことだから
150:デフォルトの名無しさん
08/01/21 19:51:43
>>148
すばらしいアイディアがあるよ
URLリンク(itpro.nikkeibp.co.jp)
151:デフォルトの名無しさん
08/01/21 20:03:08
>>148
入門書何冊かチェックして
テキストフィルタの話してるのを買って読めばいいよ
152:デフォルトの名無しさん
08/01/21 20:13:18
>>149
テキストエディタの正規表現を使って置換することはできるんですが、プログラミングに関してはパーです
>>150
ああ・・・でも変更を加えたいファイルはテキストベースなんです。
人間が簡単に読めるってのが売りのデータ形式なんで、データそのものを、62進数の文字列に変換 とかっていうのはいただけないです
>>151
わかりました
153:デフォルトの名無しさん
08/01/21 21:05:30
>>150
インデックスを使うっていうだけだよねこれ
154:デフォルトの名無しさん
08/01/21 21:25:14
>>153
もう一度読み返してみたら”それらをファイル名の集合体として別途管理する”って書いてあることに気付きました
155:デフォルトの名無しさん
08/01/21 21:32:54
FS(BTree系)+OSのディレクトリキャッシュで管理するか、
DBMSのテーブル(典型的にはBTree系)+DBMSのキャッシュで
管理するかの違いだけのような気がする
156:デフォルトの名無しさん
08/01/21 21:44:16
>>150
スラドで袋だたきされてる奴だろw
157:デフォルトの名無しさん
08/01/21 21:46:22
技術的には奇特人間大賞みたいなもんで別段問題ないっす
プレスリリースがアホっぽいので話題になってるだけ
158:デフォルトの名無しさん
08/01/21 21:52:33
まぁでも、初心者に勧めるようなもんじゃないな。
159:デフォルトの名無しさん
08/01/21 22:18:02
今ならPythonだな
160:デフォルトの名無しさん
08/01/21 22:21:27
スラドの関連ストーリーがLyee関係になってて
可哀想だった・・・・そこまでひどくはないと思うし・・・・・
161:デフォルトの名無しさん
08/01/21 22:48:06
Ruby検定がコンピュータベースで全国200個所で受験可能に - @IT
URLリンク(www.atmarkit.co.jp)
やったね!
162:デフォルトの名無しさん
08/01/21 22:50:03
松江詣でをする理由が無くなったな
163:デフォルトの名無しさん
08/01/21 22:58:17
Ruby検定なんてあったのか
そんなもん取ってなんの役に立つんだ?
164:デフォルトの名無しさん
08/01/21 23:02:39
そりゃー、おめー、あれだー、現行の幾つか前のバージョンの仕様ならちゃんと理解してた、つーことをだな
165:デフォルトの名無しさん
08/01/21 23:12:17
>>163
面接のときの話のネタになる、ということが言われております
166:デフォルトの名無しさん
08/01/21 23:26:29
とりあえずここは初心者スレだ
167:デフォルトの名無しさん
08/01/22 11:25:47
>>145
ruby-mode って組み込みクラスのメソッド補完とかできないの?
他のモードにはある C-c C-c での実行とか マニュアル表示とかも無理?
168:デフォルトの名無しさん
08/01/22 15:48:50
すみません教えてください。
自分のIPアドレスを知るためのhttpクライアントを作ろうとしています。
普通のページは .get できるのですが、CGIの返してくるものを取れません。
以下のコードです(URLは架空)。
require 'net/http'
Net::HTTP.version_1_2
Net::HTTP.start('URLリンク(YourIP.com)', 80) { |http|
response = http.get('/ip.cgi')
puts response.body
}
169:デフォルトの名無しさん
08/01/22 16:07:10
>>168
require 'open-uri'
html = open('URLリンク(YourIP.com)').read
puts html
open-uriで逆に面倒になることが事前にわかってる場合以外はopen-uri使い続けれ
上記でhtmlが空になる、あるいはopenでエラーが出る場合はCGIが悪い
170:デフォルトの名無しさん
08/01/22 18:14:32
>>156
URLキボンヌ
171:デフォルトの名無しさん
08/01/22 21:08:40
# 最近rubyの質問がすくねえな
>>168
まず、以下の点について答えよ
・そのCGIはお前が書いたモノかどうか
・http.post での結果
172:デフォルトの名無しさん
08/01/22 22:12:18
質問です。
Ruby 1.9以降で正規表現関係はどう変わりますか?
鬼車がどうこうというのは、あちこちで目にするのですが、
具体的な変更点が詳しく分かるサイトとかあれば教えてください。
173:デフォルトの名無しさん
08/01/22 22:50:45
質問です
あるディレクトリにある全てのファイルの中身を見て処理を行いたい場合の定石などありますでしょうか?
自分は
Dir.entries("ディレクトリ名") do |file|
File.open("ディレクトリ名" + file)
なんだかの処理
end
end
とかやっているのですが、いまいちです
Dirでディレクトリ内部のファイル一覧を取得するとどうもStringにしてくれるみたいですが、Fileをうまいこと取得できたりしないのでしょうか?
ついでにCやJavaでインクリメントする場合
value++
とか書きますよね
Rubyだと++はないようですが、どうするのがいいのでしょうか?
よろしくお願いいたします
174:デフォルトの名無しさん
08/01/22 22:52:23
value += 1 とするしかない
175:デフォルトの名無しさん
08/01/22 22:58:41
>>173
Dir.glob("./hoge/*").each do |path|
File.open(path){|f|
…
}
end
おそらくこれが一番人気
他のDirもPathnameの各メソッドもビミョーに使い勝手が悪い
インクリメントは作者がやだって言ってるので>>174以外の方法はないよ
176:デフォルトの名無しさん
08/01/22 23:08:39
>>174-175
さんくすです
助かりました
参考にさせてもらいます
value+=1はあったのですね
てっきり、+=も無いと思っていたのでvalue = value + 1と書いてましたw
177:デフォルトの名無しさん
08/01/23 00:58:08
>>170
>>150
スラッシュドット ジャパン | データをすべてファイル名扱いにして高速検索を実現?
URLリンク(slashdot.jp)
178:デフォルトの名無しさん
08/01/23 01:01:16
>>177
関連エントリー。アルファブロガーの反応
404 Blog Not Found:ニセ情報科学? - ISSEI
URLリンク(blog.livedoor.jp)
179:デフォルトの名無しさん
08/01/23 09:38:29
>>169
うまくいきました。
ありがとうございます。
>>171
cgiは、とりあえず既存のものです。
読むのがうまくいったので、送る方のcgiも自作するつもり。
.startでSocketErrorになっていました。
http.post は行っていません。
180:デフォルトの名無しさん
08/01/23 09:59:37
>>179
>.startでSocketErrorになっていました。
×Net::HTTP.start('URLリンク(YourIP.com)', 80) { |http|
○Net::HTTP.start('YourIP.com', 80) { |http|
181:デフォルトの名無しさん
08/01/23 10:18:36
そのアルファブロガー(笑)はどうでもいい
182:デフォルトの名無しさん
08/01/23 10:40:38
>>180
御指摘感謝
183:デフォルトの名無しさん
08/01/23 15:45:18
重複順列の中で各要素を必ず最低一つは含むものを生成するコードって効率よく書けます?
下のように書いてみたけど、全重複順列を生成して後でチェックするのはいまいちな感じ。
class Array
def each_perm(k)
if k == 1
each{|x| yield [x]}
else
each do |x|
each_perm(k-1) do |y|
yield [x]+y
end
end
end
end
end
k = 5; ary = [1,2,3]
ary.each_perm(k) do |x|
p x if x.uniq.size == ary.size
end
184:デフォルトの名無しさん
08/01/23 16:15:20
URLリンク(blade.nagaokaut.ac.jp)
irb> a = Array.new
irb> power(3, 5){|x| a.push([1,2,3].values_at(*x))}
irb> p a.size
243
3 個の異なった要素から重複を許して 5 個取り出す重複順列の総数は 3Π5 つまり 3^5 で 243
185:デフォルトの名無しさん
08/01/23 16:54:13
>>184
レスどうも。values_atって初めて見たかも。
やりたかったのは、各要素を最低一つを含むっていうので
[1,2,3]つから5つ取り出した順列だと
[1,1,1,2,3],[1,1,1,3,2],[1,1,2,1,3],,,
という感じのものでした。うーん、閃きそうで閃かない。
186:デフォルトの名無しさん
08/01/23 17:03:57
重複順列を全て生成してから不適なの弾くのがやっぱ素直なんじゃね?
187:デフォルトの名無しさん
08/01/23 17:51:04
>>177-178
そういえばファイルの保護ってファイル名に対してはかからないんだよね。
つまり、データをファイル名に使うことで・・壊れやすくなる。
ファイルサイズを0にするやつは、データを盗まれないようにする方法としては使えるね。
一旦デコードしないとコピーができないから。
企業のページでは
>次世代Web基盤技術
とか言ってるけど、なんでWebなんだろ。
データを取り扱うときに通常のファイル形式にしないといけないはずだが。
>独自のプログラムとデータ構造により、圧倒的なコストパフォーマンスを実現
・・・
ああ、コストパフォーマンスについてはそうかも。
DBMSを使うとそれにライセンス料を払う必要があるが、OS標準の機能なら追加料金がかからない。
・・・
フリーのDB使えばいいけど、遅いって話もなくもないし。
188:デフォルトの名無しさん
08/01/23 18:56:40
スレ違いを理解できない低脳は去ね
189:デフォルトの名無しさん
08/01/23 21:07:53
おい
リファレンスマニュアル検索できなくなってるんだけど
URLリンク(www.ruby-lang.org)
190:デフォルトの名無しさん
08/01/23 21:18:24
マニュアル本体をCGIやめて静的HTMLにしたって聞いたからその関係なんだろう
191:デフォルトの名無しさん
08/01/23 21:31:23
Ruby、かっこわるい
192:デフォルトの名無しさん
08/01/23 21:32:38
検索できないって終わってるなw
つかプログラミング言語の公式サイトが検索アプリもまともに作れないとか
193:デフォルトの名無しさん
08/01/23 21:34:22
e?
オヒサルで検索してる奴なんてこの世に存在するの?
194:デフォルトの名無しさん
08/01/23 21:40:20
ローカルで検索すればいいのにね。
195:デフォルトの名無しさん
08/01/23 21:40:58
Namazuとか使えば簡単にインデックス作れそうだけどな。
俺が暇になったときにまだ検索できないようなら作ってみよ
196:デフォルトの名無しさん
08/01/23 21:45:15
トップページには検索機能があるが、Radiantで管理してる部分だけの
対応みたいだな。
リファレンスはやっつけで静的HTML化したからカバーしてない(つーか
忘れてるだろ、おそらく)んだろうな。
197:デフォルトの名無しさん
08/01/23 22:35:23
VisualuRubyって今だに開発続いてるの?
RADっぽいお手軽開発環境探してるんだけどやっぱしないかなぁ?
198:デフォルトの名無しさん
08/01/23 23:11:49
Ruby使いって低脳多いんだな
いちいち全PCにマニュアルインスコしてられっかよwwwwww
199:デフォルトの名無しさん
08/01/23 23:21:11
ActiveRubyのアイコンが気に入らないので
XP風の普通のRubyファイル用のアイコンを探しています。
Perl用とかC用とかも有ればベストなのですが、
オーソドックスな普通のアイコンはありませんか?
200:デフォルトの名無しさん
08/01/23 23:22:42
何がどうオーソドックスなんだ…
201:デフォルトの名無しさん
08/01/23 23:29:42
site:ruby-lang.org
オプションをつけてGoogle検索すればいいだけじゃね?
202:デフォルトの名無しさん
08/01/23 23:46:33
Ruby Iconで検索するとそこそこのが見つかる
203:デフォルトの名無しさん
08/01/24 10:48:55
ftpを試みていますが、うまくいきません。
require 'net/ftp'
ftp = Net::FTP::open("qwerty.com",'user','****')
puts ftp.status # OK
puts ftp.nlst # NG
ftp.close
以上のコードで status は実行するのですが nlst でエラーになります。
御意見いただけませんでしょうか。
204:デフォルトの名無しさん
08/01/24 11:05:00
ただエラーって言われてもねえ
205:デフォルトの名無しさん
08/01/24 11:27:56
>>204
オーソドックスなFTPで ls と手入力するとファイルリストを見られるのですが、Rubyでは以下のエラーになります。
c:/ruby/lib/ruby/1.8/net/ftp.rb:241:in `getresp': 425 Failed to establish connec
tion. (Net::FTPTempError)
from c:/ruby/lib/ruby/1.8/net/ftp.rb:264:in `sendcmd'
from c:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:262:in `sendcmd'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:336:in `transfercmd'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:421:in `retrlines'
from c:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:419:in `retrlines'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:609:in `nlst'
from ftp_up$.rb:5
dir も同様です。
206:デフォルトの名無しさん
08/01/24 11:30:29
NATの内側にいてパッシブモードでないとか?
207:デフォルトの名無しさん
08/01/24 11:39:57
FTPのエラーコードがわかれば瞬殺だな
Rubyの出す例外はきちんと書こうぜ
>>206
んだなす
ftp.passive=trueしたあとにコマンド実行させれば動くはず
208:デフォルトの名無しさん
08/01/24 13:36:59
>>206,207
passive=true にしてみましたがダメでした。
以下はstatus表示後のエラー表示です。
c:/ruby/lib/ruby/1.8/net/ftp.rb:159:in `initialize': 接続済みの呼び出し先が一定
の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みの
ホストが応答しなかったため、確立された接続は失敗しました。 - connect(2) (Errno::
ETIMEDOUT)
from c:/ruby/lib/ruby/1.8/net/ftp.rb:159:in `open'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:159:in `open_socket'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:317:in `transfercmd'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:421:in `retrlines'
from c:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:419:in `retrlines'
from c:/ruby/lib/ruby/1.8/net/ftp.rb:609:in `nlst'
from ftp_up$.rb:9
exec で ftp 呼んで実行手順をファイルで渡すことにします。
御指導ありがとうございました。
209:デフォルトの名無しさん
08/01/24 20:58:18
ASCII-8BIT ってなんですか?
210:デフォルトの名無しさん
08/01/24 21:10:30
>>209
このスレではまだしばらくは縁のない言葉です。
211:デフォルトの名無しさん
08/01/24 23:24:09
これから正規表現を書き溜めていく気マソマソ
どうせなら鬼車に乗りたいので
早く1.9系安定してくだされぇ~!
を言い訳に作業をサボる自分・・・ヨワッ
212:デフォルトの名無しさん
08/01/25 01:49:10
すみませんが、質問です。
open パス名 do |file|
例外発生
end
となった場合、オープンされたファイルは自動的にクローズされるのでしょうか?
213:デフォルトの名無しさん
08/01/25 02:14:22
ブロック付きopenは、
begin
open
付いてきたブロックであれこれ作業
ensure
close
end
という意味。ensureは例外になろうがなるまいが実行されるよ。
214:デフォルトの名無しさん
08/01/25 02:19:42
>>213
ありがとうございます。これで安心して作業ができます。
215:デフォルトの名無しさん
08/01/25 04:28:52
すみません。
C++で書かれたプログラムをrubyに移植しているのですが、参照で困りました。
RubyにはC++でいう参照はありますか。
それもクラスインスタンスではなくint等の組み込み型を参照として渡すことはできますか。
216:デフォルトの名無しさん
08/01/25 05:48:31
Rubyでは、数値とSymbol以外はすべて参照
217:デフォルトの名無しさん
08/01/25 05:53:26
引数の参照渡しのことかも。
それは確かできなかったはず
218:デフォルトの名無しさん
08/01/25 06:12:03
>>215
>int等の組み込み型を参照として渡すことはできますか。
integerやfloatはできない。それ以外はすべて参照。
引数の参照渡しのことなら、できない。
まず具体的にどんなことがしたいかをプログラムで書いてみて。
219:デフォルトの名無しさん
08/01/25 06:29:21
>>218
簡単に説明しますと、オブジェクト内部で条件が真のときに引数の参照に値を代入し、boolで関数の結果を返す関数です。
bool Hoge::GetData(int condition,float &buffer)
{
if(condition == this->condition)
{
buffer = this->my_float_value;
return true;
}
return false;
}
220:デフォルトの名無しさん
08/01/25 07:05:58
>219
・関数が失敗の場合は、例外を返せば良い
・Rubyのメソッドは複数の値を返せる(return a, b とすれば a, b = get_data() で受け取れる)
・bufferがオブジェクトの一部分なら、オブジェクト自体を渡す選択肢も
・配列として受け渡しすれば、擬似的な参照渡しになる
お好きなのをどうぞ。
221:デフォルトの名無しさん
08/01/25 07:13:09
Ruby的には条件が真なら数値を、偽ならnilを返すようにするとかっこいいよね
戻り値がnilか否かをチェックすれば真偽をチェックしたことになるから
222:デフォルトの名無しさん
08/01/25 07:19:09
>>220-221
なるほど。
ありがとうございました。
223:デフォルトの名無しさん
08/01/25 07:26:32
すみません
同じ値のはずの2つのstringオブジェクトを==で比べると、なぜかfalseが返ってきます。
デバッグで見ても、2つのオブジェクトは全く同じ値でした。
どこか処理がまずくてスタックが壊れてるのでしょうか?
224:デフォルトの名無しさん
08/01/25 07:32:44
>223
JavaじゃなくてRubyの話なんだよな?
p 変数
で見ても全く同じ?
225:デフォルトの名無しさん
08/01/25 07:39:37
はい。同じでした。
if str1 == str2
return;
end
p str1 + " " + str2
このようなコードなのですが、if文でリターンせずにpによって 「同じ文字 半角スペース 同じ文字」 が表示されました。
226:デフォルトの名無しさん
08/01/25 07:55:25
+で結合せずに、どういう出力が出るか試してみ
p str1
p str2
p str1.class
p str2.class
あとRubyのバージョンを書いて
227:デフォルトの名無しさん
08/01/25 08:00:09
どうもすみません。
結果です。
あ
あ
String
String
と表示されました。
バージョンは1.8.1です。
228:デフォルトの名無しさん
08/01/25 08:20:26
1.8.1で文字列もクラスも同じ……となると、原因が全く分からないな
あとはコード全体を見ないことには
229:デフォルトの名無しさん
08/01/25 09:02:14
>>227
"あ"
ではなく
あ
と表示されたのなら問題ないんじゃね
230:デフォルトの名無しさん
08/01/25 09:14:01
>>228
URLリンク(gonzo.dip.jp)
アップしました。
見辛くて申し訳ありません。
なにかトンチンカンなことをやってバグを誘発しているのでしょうか(><)
231:230
08/01/25 09:14:26
DLkeyはrubycsvです。
232:デフォルトの名無しさん
08/01/25 09:15:08
>>221
0が真になるのは良いとして
falseも真という意味ですよね
nilだけが偽と
233:230
08/01/25 09:27:04
ソースに誤植がありました
× check( i , GetElementString( i , "通常" , n ) );
○ check( i , GetElementString( i , "通常ポーズ" , n ) );
234:デフォルトの名無しさん
08/01/25 09:35:34
…。全角空白混じってるしトップレベルのmainを実行してる場所がないぞ。
で、41行目の
> if( elem_name.to_s == @definition_names[i].to_s )
で、同じデータのはずなのにfalseが返ることがあるという質問でいい?
235:デフォルトの名無しさん
08/01/25 09:37:50
>>234
すみません全角混じっていましたか。
質問は全くその通りです。
236:デフォルトの名無しさん
08/01/25 09:54:58
ifにelseを追加してみる。つまりfalseのときにelem_nameと@definition_names[i]を表示させてみる
else
print "[ #{elem_name} <=> #{@definition_names[i]}] "
結果を整形してみる
[ 攻撃 <=> 通常ポーズ] [ 死亡 <=> 通常ポーズ] [ 死亡 <=> 攻撃] [ ダメージ <=> 通常ポーズ] [ ダメージ <=> 攻撃] [ ダメージ <=> 死亡]
[ 勝利 <=> 通常ポーズ] [ 勝利 <=> 攻撃] [ 勝利 <=> 死亡] [ 勝利 <=> ダメージ] [ 瀕死 <=> 通常ポーズ] [ 瀕死 <=> 攻撃]
[ 瀕死 <=> 死亡] [ 瀕死 <=> ダメージ] [ 瀕死 <=> 勝利] [ 攻撃 <=> 通常ポーズ] [ 死亡 <=> 通常ポーズ] [ 死亡 <=> 攻撃]
[ ダメージ <=> 通常ポーズ] [ ダメージ <=> 攻撃] [ ダメージ <=> 死亡] [ 勝利 <=> 通常ポーズ] [ 勝利 <=> 攻撃] [ 勝利 <=> 死亡]
[ 勝利 <=> ダメージ] [ 瀕死 <=> 通常ポーズ] [ 瀕死 <=> 攻撃] [ 瀕死 <=> 死亡] [ 瀕死 <=> ダメージ] [ 瀕死 <=> 勝利]
[ 攻撃 <=> 通常ポーズ] [ 死亡 <=> 通常ポーズ] [ 死亡 <=> 攻撃] [ ダメージ <=> 通常ポーズ] [ ダメージ <=> 攻撃] [ ダメージ <=> 死亡]
[ 勝利 <=> 通常ポーズ] [ 勝利 <=> 攻撃] [ 勝利 <=> 死亡] [ 勝利 <=> ダメージ] [ 瀕死 <=> 通常ポーズ] [ 瀕死 <=> 攻撃]
[ 瀕死 <=> 死亡] [ 瀕死 <=> ダメージ] [ 瀕死 <=> 勝利] [ 攻撃 <=> 通常ポーズ] [ 死亡 <=> 通常ポーズ] [ 死亡 <=> 攻撃]
[ ダメージ <=> 通常ポーズ] [ ダメージ <=> 攻撃] [ ダメージ <=> 死亡] [ 勝利 <=> 通常ポーズ] [ 勝利 <=> 攻撃] [ 勝利 <=> 死亡]
[ 勝利 <=> ダメージ] [ 瀕死 <=> 通常ポーズ] [ 瀕死 <=> 攻撃] [ 瀕死 <=> 死亡] [ 瀕死 <=> ダメージ] [ 瀕死 <=> 勝利]
ということで同じ文字はないよ。csvデータはUTF-8なんだけどスクリプト本体のほうはUTF-8なの?
アップロードのときにミスったんだと思ってたけど、もしこのままならスクリプトはShiftJISになってるよ
237:デフォルトの名無しさん
08/01/25 10:38:17
>>236
お手数おかけしました。
ということは、コードの問題ではなくて、環境固有の問題なのでしょうか。
実は実行環境はRPGツクールVXなのです。
こちらの環境ではelseで付け加えて値を見ると、同じ文字の組み合わせがありました。
ツクール内部で呼び出しているので、通常の環境とは異なっているのかもしれませんね。
238:デフォルトの名無しさん
08/01/25 12:33:45
すみませんが、Cygwin上でRubyをお使いの方に質問です。
ディレクトリからファイル名のリストを取得し、WIN32OLE 経由で MS-Word の
COMコンポーネントに一つずつ渡そうとしています。
Wordに与えるファイル名は絶対パスである必要があるようなので、個々のファ
イル名にFile.expand_path を適用してから渡しています。
ところが、File.expand_path の戻り値が /cygdrive/c/... や、/home/ユーザ
名 になってしまうのです。もちろん Word が必要としているのは C:\ で始ま
るパスなので、Wordがファイルを開くことができません。
File.expand_path(ファイル名).gsub(%r!^/cygdrive/c/!, "C:/").gsub(%r!/home/!, "/C:/cygwin")
とやれば何とかなりますが、どうも不恰好です。もっと良い方法はないでしょ
うか?
239:デフォルトの名無しさん
08/01/25 12:43:09
cygpath -d /cygdrive/c
240:デフォルトの名無しさん
08/01/25 12:44:27
$ cygpath -w '/cygdrive/c/program files'
c:\program files
$ cygpath -d '/cygdrive/c/program files'
c:\PROGRA~1
241:デフォルトの名無しさん
08/01/25 12:50:17
>>238
まあcygwinのシステムに乗っかってる以上根本的にはどうしようもない
WindowsアプリケーションとしてのRuby使え
C:\Documents and Settings\俺\デスクトップ\新しいフォルダ>ruby -e 'puts File.expand_path("csvloader.txt")'
C:/Documents and Settings/俺/デスクトップ/新しいフォルダ/csvloader.txt
242:デフォルトの名無しさん
08/01/25 12:54:58
>>232
>0が真になるのは良いとして
>falseも真という意味ですよね
>nilだけが偽と
うんにゃ。nilとfalseが偽と見なされる。
成功したときは数値を返し、失敗したときはnilを返す。falseは返さない。
これでいいじゃん?
243:デフォルトの名無しさん
08/01/25 12:57:12
正規表現目当てでRubyに挑戦中
str1=str2
でなく
str1=str2.dup
と書かなきゃコピーにならんとこは
わたしのような初心者にはドエライ罠だったんですけど・・・
244:デフォルトの名無しさん
08/01/25 13:09:18
>>243
「明示的な複製」が自力で必要な場面は意外と少ないんだ
データを返す組み込みクラスのメソッドの多くは結果を複製して返す
知らないとどこかで絶対に一度は嵌るが、知ってしまうと意外とそうでもない
>>242
falseは(Rubyには型としては無いけど)booleanで使うといいよね
nilはそれ以外の「空」とか「無し」とか
「失敗」をfalseにするかnilにするかは若干迷うけど、「成功」がtrueという値になると思えるならfalseだな
if文ではfalseもnilもelseに行くから深く考えなくてもいいし
245:238
08/01/25 13:13:23
皆さん、ありがとうございます。
>>239->>240
wdoc = wordOLEObject.Documents.open `cygpath -w #{File.expand_path 'Readme'}`
こんな感じでしょうか?
これだと、今度は逆にCygwin以外のWindows環境では動きません。環境の判別法
ははないものでしょうか?
欲を言えば、分岐なしでどちらの環境でも動くならありがたいのですが。
>>241
Cygwin版のRubyと共存させるわけですか...。それも一つの手だなあ。
ActiveScriptRuby 使いたいし。
ただ、環境が安定するかどうかが不安です。
246:デフォルトの名無しさん
08/01/25 14:03:12
>>245
環境の判別はRUBY_PLATFORMで。
分岐なしで動くようにするのは無理。
強いて言えば238で自分で書いてるのが分岐なしで動くようにする方法になるのかもしれんが。
247:デフォルトの名無しさん
08/01/25 14:05:07
> 分岐なしで
どこをどう作っても内部的には分岐使ってる
気にすんな
248:デフォルトの名無しさん
08/01/25 14:16:30
最初は抵抗あるけど、サブルーチンだと割り切ってメソッドに切り分ければ
あ~ら不思議あら不思議
249:デフォルトの名無しさん
08/01/25 14:19:51
あえてCygwin版を使うメリットって何?
Cygwin環境で閉じた使い方をする分にはパス周りのトラブルが少ないのから?
250:デフォルトの名無しさん
08/01/25 14:22:48
昔は全部Cygwinでないとどうにもならなかったんだよ
5年くらい前の話
251:デフォルトの名無しさん
08/01/25 15:09:02
>>250
つまり、今はそうでもないってこと?
252:238
08/01/25 15:09:49
みなさん、再度ありがとうございます。
結局、通常のWindows版のRubyを入れて、絶対パスで呼び出すようにしました。
"/cygdrive/c/program Files/ruby-1.8/bin/ruby.exe" ...
これで問題なく、Cygwinからでも呼び出せました。
ただ厳密には、CygwinのコンソールでEmacs22を起動し、その中のeshellでで
す。Emacsの通常のshellモードでは、表示が少しおかしいようです。
>>246
> 分岐なしで動くようにするのは無理。
そうですか...。それは仕方ありませんね。
>>249
> あえてCygwin版を使うメリットって何?
単純に、Cygwin環境でデフォルトで呼び出されるのがそれだからです。
またPythonが、通常のWindows版はCygwin環境と相性が良くなかったのです。
(対話コンソールをCygwin環境で呼び出すと、画面に何も出ない)
だからRubyもWindows版を使うのは避けていました。
ちなみにこのやり取りも Cygwin Emacs22のNavi2chでやっております。
Linux機もあるのですが、Cygwinにはいろいろ便利なことがあるので。
253:デフォルトの名無しさん
08/01/25 17:01:18
ソースさらすなら、バグが発生する最小限のソースをうpしようよ・・・
254:デフォルトの名無しさん
08/01/25 18:35:50
>>253
一部をアップした結果「その部分だけでは分からない」と言われたんだろ?
そういうときはファイルそのものをアップしてもらった方が手っ取り早い
特に初心者には、どこがどこに影響を及ぼしてるのか、簡単には分からないんだから
255:デフォルトの名無しさん
08/01/25 21:41:18
>>252
こーゆーので我慢する、もしくは(cygwin|windows)を捨てる
def cygpath(opt,path) ; return `cygpath #{opt} #{File.expand_path(path)}` ; end
def winpath(path)
path = File.expand_path(path)
if RUBY_PLATFORM =~ /cygwin/ # ? cygwin 環境と一致する奴
# return `cygpath -w #{path}`
return path.sub(%r!^/cygdrive/(.)/!, '\1:/').sub(%r!^/home/!, 'c:/cygwin/')
end
return path
end
256:デフォルトの名無しさん
08/01/26 10:14:26
arr.each{|i|
puts i
i-=2 if gets == "prev" # 逆方向に進ませたい!
}
みたいな事やろうと思ったらwhileと自前の変数でやるしかないんですかね。
257:デフォルトの名無しさん
08/01/26 10:18:40
>>256
残念ながら、自前で書かないと出来ないですね。
# 外部イテレータが欲しい。
258:デフォルトの名無しさん
08/01/26 10:27:29
continue -2
とかできたらいいのに。
259:デフォルトの名無しさん
08/01/26 10:27:50
ああ、Ruby だと next だ。
260:デフォルトの名無しさん
08/01/26 12:38:23
>>145
遅レスだが、なんでrubydb使ってないの?
エラー行へのジャンプも普通にあるよ?
んでもって、refe.elとか使えばEmacs上でヘルプも見れる
もし、*nix環境ならfastRI入れてri-ruby.el入れるといいんじゃない?
↑はSoftware Design2月号のEmacs特集の受け売りで
俺はWin環境でMeadowだから使ってないけど
261:デフォルトの名無しさん
08/01/26 12:42:42
>>252
WSHのFileSystemObjectを使うのが常套手段
URLリンク(jp.rubyist.net)
262:デフォルトの名無しさん
08/01/26 13:28:37
Emacsの有名どころではruby-electric.elがあるがこれがまた動作が微妙
導入時は喜ばれるが1週間くらいして無言で外されることで有名
263:デフォルトの名無しさん
08/01/26 14:52:22
中括弧とdo~endぐらいならいいんじゃない?
それぐらいなら手で打てってことかもしれんが
Meadowでxmpfilter使っている人います?
cmdproxy.exeで試したんだけど、スクリプト評価後にプロンプトや
ロゴ表示が残ってしまってションボリな感じ
264:デフォルトの名無しさん
08/01/26 18:57:37
Net::SSH.startで:password => 'mypassword'としパスフレーズを指定してるのですが
実行時に"Enter password for /home/localuser/.ssh/id_rsa:"とでて入力を要求されます
#!/usr/bin/env ruby
require 'rubygems'
require 'net/ssh'
Net::SSH.start(
'192.168.11.3',
:username => 'remoteuser',
:password => 'mypassword' ) do | session |
session.process.popen3('echo "Hello"') do |i, o, e|
STDOUT << o.read << "\n"
end
end
実行時にパスフレーズを要求されないようにするにはどうのようにすればよいですか?
265:デフォルトの名無しさん
08/01/26 20:12:24
passphraseではなくpasswordなので、これはパスワード認証
のためのログインパスワードであって、秘密鍵ファイルを読むための
パスフレーズではないのでは?
でもって、
Public/private keys are always tried before the explicit password authentication, even if you provide a password.
(URLリンク(net-ssh.rubyforge.org))
なので、公開鍵認証が行われている、と。
パスフレーズのほうは、空にするか、ssh-agentとかにお任せすることになるのではないでしょうか。
266:264
08/01/26 21:59:13
>>265 ありがとうございます
ssh-agent初めて知りました
267:デフォルトの名無しさん
08/01/26 22:27:33
unicodeを表すのに、Javaとかでよく使われている ¥uXXXX という表現方法がありますが
これをRubyでデコードするにはどうしたらいいですか。
つまり '¥uXXXX' からunicode文字を得たいです。
268:デフォルトの名無しさん
08/01/26 22:34:21
str.gsub(/¥¥u((?:[¥da-f]{2}){1,6})/) { [ $1.hex ].pack('U') }
269:デフォルトの名無しさん
08/01/26 22:38:37
>>267
>>268 でいいと思うけど、後ならnkfを使うかな
270:デフォルトの名無しさん
08/01/26 22:42:46
>>268
仕組みがさっぱりわからないので、参考になるページがあれば教えてください。
271:デフォルトの名無しさん
08/01/26 22:57:30
普通に定義そのまんまだな
Unicodeの解説とか読めばいいんじゃね
272:デフォルトの名無しさん
08/01/26 23:00:34
>>270
Rubyコード的には、
¥uXXXXのXXXX部分(文字列)を16進数に変換してpack('U')でUnicode文字にしてる。
273:デフォルトの名無しさん
08/01/26 23:10:01
正規表現が極力正確なマッチになるように書かれてるから難しく見えるんだと思う
274:デフォルトの名無しさん
08/01/26 23:15:14
ぶっちゃけ /¥¥u([0-9a-f]+)/ あたりのほうがみやすくて実用的かもな。
275:デフォルトの名無しさん
08/01/26 23:19:22
>>272
逐語的に訳すとこんな感じ?
"\u"より後に続く数字またはa, b, c, d, e, fの2文字の組を
1個から6個ずつまとめてから16進数に変換する
Rubyリファレンスマニュアルの正規表現のページと見比べてみりゃ
なんとなくわかるんじゃない?
276:デフォルトの名無しさん
08/01/26 23:29:49
UTF-8の変換式は6オクテットまで規定されてるけど、
Unicode文字がそこまで定義されてないから実質的には
4オクテットまで考慮すればいいみたいね。
277:デフォルトの名無しさん
08/01/26 23:32:20
この安易な判断が20年後大問題を引き起こすとは
神ならぬ>>276には思い至ることすらできなかったのであった
278:デフォルトの名無しさん
08/01/27 00:09:27
もしそうなっても、その前にUTF16連中がさらに大問題をひきおこすから大丈夫。
279:デフォルトの名無しさん
08/01/27 00:50:46
>>267
小飼が自分で作ったツールを自慢するためにBlogでRuby用のサンプルを書いてたきがする。
280:デフォルトの名無しさん
08/01/27 10:53:26
検索用の文字列をユーザーに入力させたいんですが
1. りんご なら単純な部分一致
2. *.jpg ならワイルドカード
3. /\d+/ なら正規表現
としたいんですが一番下は1.の/home/のようなパス指定と区別がつきません。
正規表現を表す文字列で他に一般的な表記はないんでしょうか?
281:デフォルトの名無しさん
08/01/27 11:20:41
俺なら、 '\' によるエスケープを仕様に導入して、パス指定は \/home\/ と書かせる。
282:デフォルトの名無しさん
08/01/27 13:04:12
/hoge#{`mail badguy@example.com < /etc/password`}huga/
なんてのをそのままevalしないようにね。
283:デフォルトの名無しさん
08/01/27 13:10:01
>>262
ruby-electric.el はどこがダメ?
284:デフォルトの名無しさん
08/01/27 13:21:31
>>280
「正規表現で入力する」という専用入力プロンプトあるいはオプションスイッチを作る
ユーザーが一番欲しい、一番頻繁に使うと推測される機能は1と2だろ
3は見つからないあるいは見つけにくいときに使う機能であるべき
285:デフォルトの名無しさん
08/01/27 13:42:06
俺も284に一票
guiならチェックボックスとか
>>283
デフォルトだとクォーテーションや"|"も閉じちゃうので
正規表現を書くときにウザいからじゃね?
286:デフォルトの名無しさん
08/01/27 14:08:19
>>280
エスケープ文字があるときに
正規表現オブジェクトを作るのはどう?
もちろん最初と最後の"/"は取り除いて
if inputString.include?('\\') && inputString =~ /^\/.*\/$/
re = Regexp.new(inputString[1..-2])
Dir.glob("*").{|fileName| print fileName if fileName =~ re}
else
Dir.glob(inputString).{|fileName| print fileName}
end
287:デフォルトの名無しさん
08/01/27 14:15:41
>>286
エスケープ文字のない正規表現書けなくない?
288:デフォルトの名無しさん
08/01/27 14:29:16
>>286はこれを導入したことで大量な例外の処理を書かなければならなくなると思う
289:286
08/01/27 14:46:08
自分でちょっと使ってみたけど、スゲー使いにくいw
文字列先頭の'/'、文字列最後の'/'、文字列中の'\'と暗黙なスイッチを
無駄に3つ追加してて、直感的に使えず全然ダメですわ
やっぱ、素直に284の言うとおりにした方がよいと思う
290:デフォルトの名無しさん
08/01/27 19:41:23
フィルタ系のコマンド(sortとか)に
Rubyで生成したテキストを流し込み
フィルタが処理した結果を受け取りたいでし。
どう書けば良いのでしょうか?
一旦ファイルに出力して、`sort` とかで受け取るしかないですか?
291:デフォルトの名無しさん
08/01/27 19:53:17
open('| sort', 'w'){|io| io.write("d\nc\na\nb\n") }
一度きっちりIPCとかパイプとか標準入出力とかフィルタとか調べとくと吉
その点Rubyアプリケーションプログラミングとかいいと思うんだが
まるで話題にならないのは中身が硬派すぎるからなんだろうか
292:デフォルトの名無しさん
08/01/27 19:58:38
>290
読み書き両方ならIO.popenかな。
293:デフォルトの名無しさん
08/01/27 20:18:09
>>291
あの本は読んでると眠くなる
100パーセント日本語の本なのに眠くなる理由は正直よくわからん
294:デフォルトの名無しさん
08/01/27 20:26:59
>291-292
ありがとうございました。
>291 ではフィルタの結果を出力することは出来ましたが
結果が受け取れませんでした。
そこで >292 に紹介された IO.popen を
リファレンスマニュアルの例文を元に使ってみたのですが
反応が返ってこなくなってしまい、^C しました。
コマンドプロンプトや、バッチファイル上での
パイプの使い方は知っていたのですが…
>291 さんの言う通り、もう少しパイプについて調べてみます…。
295:291
08/01/27 20:36:19
ああ、見当違いなレスしてた。ごめん
フィルタの中身にもよるけどこれでいけると思う
open("| sort", "w+"){|io|
io.write("c\nb\na")
io.close_write()
res = io.read()
}
296:デフォルトの名無しさん
08/01/27 20:51:10
>295
ありがとうございました!
close_write() がポイントっぽいですね。
297:デフォルトの名無しさん
08/01/27 22:57:47
>>296
sort は入力を全部受け付けてからでないと処理できないっしょ
close_write で入力は終わったって知らせてやらなきゃ。
298:デフォルトの名無しさん
08/01/27 23:12:15
Array#sortじゃダメな理由は何?
299:デフォルトの名無しさん
08/01/27 23:14:21
sortは例で、実際は別のプログラムなんじゃねーの。
300:デフォルトの名無しさん
08/01/27 23:17:25
> フィルタ系のコマンド(sortとか)
に対して「Array#sort使え」というのはかなりマト外してるな
まあ、よっぽど特殊なコマンドでない限り、テキストいじりならRuby内部でなんとかなるのも事実ではあるが…
301:デフォルトの名無しさん
08/01/28 02:13:27
#!/usr/bin/env ruby
def main()
eval(ARGV.join(";"))
STDOUT << hoge << "\n"
end
if __FILE__ == $0
main
end
みたいなshowhoge.rbを作ってshowhoge.rb "hoge=\"Hello\""を実行したのですが
Helloと表示されません。 引数をevalしてオプションを解析する手間を省きたいのですが失敗していますorz
302:デフォルトの名無しさん
08/01/28 02:31:27
~$ cat syukudai.rb
require 'shellwords'
def main()
pairs = Shellwords.shellwords(ARGV.join(' '))
pairs.each do |pair|
(k,v) = pair.split(/=/)
puts "#{k}は#{v}です"
end
end
if __FILE__ == $0
main
end
~$ ruby syukudai.rb hoge="Hello" huga='World' hage=\!
hogeはHelloです
hugaはWorldです
hageは!です
ただしこれだと"や'を変数に入れることができない
303:デフォルトの名無しさん
08/01/28 02:55:17
STDOUT << hoge << "\n"
C++出身?
304:デフォルトの名無しさん
08/01/28 03:03:32
evalの前に hoge = nil
もしくは@hogeに
305:デフォルトの名無しさん
08/01/28 03:16:11
>>301
宿題は宿題スレへ
Rubyの宿題教えてください。2限目
スレリンク(tech板)
306:デフォルトの名無しさん
08/01/28 04:02:28
素直にoptparse使ったほうがいいのでは…
307:デフォルトの名無しさん
08/01/28 04:44:13
>>301
エラーになる理由は↓参照
リファレンスマニュアル>Ruby 言語仕様>実行>変数と定数>ローカル変数
要するに定義されてない変数(メソッド)を使おうとしてエラーになってる
だから eval('STDOUT << hoge << "\n"') なら実行出来る
オプション解析なら >>306 の言う通り optparse 使うべき
eval にこだわるなら >>304 の様にあらかじめ変数を定義しておく
308:デフォルトの名無しさん
08/01/28 05:18:32
>>301 とりあえず、
def main()
hoge =""
eval(ARGV.join(';'))
STDOUT << hoge << "\n"
end
if __FILE__ == $0
main
end
と
foo.rb "hoge='Hello'"
で
Hello は表示されるが。
def main()
eval(ARGV.join(';') + ";" + %Q(STDOUT << hoge << "\n"))
end
if __FILE__ == $0
main
end
これもいけた。
309:デフォルトの名無しさん
08/01/28 08:37:42
optparseがめんどくさくて死ぬという話なのでは…
310:デフォルトの名無しさん
08/01/28 08:46:36
Rakeで、実行するコマンドを表示させることはできますか。
例えば rm_f 'filename' とあれば、実行時にどのファイルを削除しようとしているかが表示されてほしいです。
311:デフォルトの名無しさん
08/01/28 09:47:45
-v
312:デフォルトの名無しさん
08/01/28 11:07:09
>>311
-vつけても表示されませんけど?
313:デフォルトの名無しさん
08/01/28 17:42:26
myhash = {}
myhash[:aaa] = "aaa" #これと
myhash["aaa"] = "aaa" #これがどう違うのか分かりません><
314:デフォルトの名無しさん
08/01/28 18:14:06
>>313
キーが違う。
315:デフォルトの名無しさん
08/01/28 19:13:53
RubyのHashのキーは文字列(Stringオブジェクト)でなくても構わない。
irb> h = Hash.new
irb> arr = ['レ','イ','ク']
irb> h[arr] = '配列だよ'
irb> puts h[arr]
配列だよ
前者はたまたま文字列ではないシンボルを使ってるだけの話
シンボルで設定されてるハッシュならシンボルでアクセスしないと動作しないけどな
316:デフォルトの名無しさん
08/01/28 21:28:19
>>310
rm_f 'hoge', :verbose => true
全般にわたって制御する方法はねーのかな。
>>313
混乱させてしまうが、ActiveSupportというRailsの一部でもあるライブラリを
導入すると、HashWithIndifferentAccessというクラスが定義される。
myhash = {}.with_indifferent_access
のようにして作成すると、
myhash[:aaa] と myhash['aaa'] が同じモノを参照するようになる。
(実際には文字列側に正規化されている)
317:デフォルトの名無しさん
08/01/28 21:37:26
Rake内部のファイル操作がFileUtilsだけを使ってるなら、
どっかでmodule FileUtils::DryRunとかすればいいんだがどうだろね
318:デフォルトの名無しさん
08/01/28 21:46:19
すみません、Mac OS X上のEmacsのruby-modeを使っているのですが、
日本語を含むソースコードを保存しようとすると
「Symbol's function definition is void: coding-system-to-mime-charset」
と言われて保存できません。どなたか解決策ご存知の方いらっしゃいませんか。
319:デフォルトの名無しさん
08/01/28 21:51:15
>>317
DryRunって:noop=>trueだよな。
常時ONにしたら何も実行しなくなるんじゃない?
320:デフォルトの名無しさん
08/01/28 22:03:44
>>319
そりゃ、表示だけして実行はしないよ
そういうオプションだもの
表示後に実行もして欲しいかどうかはわからんのでその辺は適当に
どうせ教えてもらったのを文字通り組み込むわけじゃないだろ
該当するマニュアルとか見てから組み込むわけだし
321:デフォルトの名無しさん
08/01/28 22:07:25
>>318
> Symbol's function definition is void: coding-system-to-mime-charset
なんでこれが読めないの?
Ctrl x RET f
して候補を入力しろよ
322:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/28 22:25:43
xmlは10KB前後です
これまではパターン1でxmlを何度もscanしてきたんですが、
「10KBの文字列に何度もアクセスする」という現状にだんだん不安になってきて
「選択入りの長い正規表現で一度だけアクセスしたほうがリソース的にまだマシなんじゃ?」とか思った次第です。
324:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/28 22:27:53
>>324
> ruby 1.9をインスコした
お前にはまだ早い
即刻アンインストールして1.8.6にしろ
326:デフォルトの名無しさん
08/01/28 22:40:01
>>324
どこを直していいのかわからないような初心者が1.9使っちゃダメ
「おい、1.9でhogehogeが動かないから直してやったぜ。これがパッチな」
というのが正しい使いかた。
327:デフォルトの名無しさん
08/01/28 22:46:33
1.9使用者=デバッガか・・・ますます移行する気がおきんな
328:デフォルトの名無しさん
08/01/28 22:47:18
だから、移行するようなモノじゃないって。
329:318
08/01/28 22:49:27
>>321
それは試したのですが結果は変わりませんでした。
330:デフォルトの名無しさん
08/01/28 22:49:38
>>327
お前の周りでは「やっとβ版が出たのでシステムをこれに移行しました」とかいうことがあるのか?
しないだろ? 試しに遊んでみて納得する程度だろ?
331:デフォルトの名無しさん
08/01/28 22:51:55
次スレたてるときは、「初心者は1.9.0使うな」って書かないとあかんね。
332:デフォルトの名無しさん
08/01/28 22:52:34
>>331
>>7
333:デフォルトの名無しさん
08/01/28 22:53:17
いや、付け足し程度ではなく、>>1にでっかく書こう。
334:デフォルトの名無しさん
08/01/28 22:57:16
すいません。
1234567...とかの複数桁の数字を桁ごとに分割してそれぞれ扱いたいのですが、
どうやるのが一番解りやすいでしょうか?
335:デフォルトの名無しさん
08/01/28 23:03:38
>>324
作者に苦情のメールを送る。
336:デフォルトの名無しさん
08/01/28 23:03:52
>>324
1.9では文字列のアクセスの時RSTRING_PTRやRSTRING_LENを使わなくてはいけないのが原因っぽい
337:デフォルトの名無しさん
08/01/28 23:05:44
>>334
num = 1234567
num.to_s.split(//).each do |n|
ketagoto(n.to_i)
end
338:デフォルトの名無しさん
08/01/28 23:06:49
なんで1.9最先端のruby-mode.elなんて。
ともかくemacs --versionの結果を。
339:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/28 23:11:27
>>339
初心者という言葉の意味を履き違えたオナニーヲタは帰れ
自分のブログででもやってろ
341:デフォルトの名無しさん
08/01/28 23:12:55
Ruby/Tkって今後廃れていくの?
ruby1.9.xじゃ添付ライブラリに入らない雰囲気なんでそ?
RubyのGUIツールキットは何を使っていくのが正解なの?
342:334
08/01/28 23:14:36
なるほど、spliteを使って区切り文字に何も入れなければ1文字ごとに分割されるんですね。
ありがとうございます。
343:デフォルトの名無しさん
08/01/28 23:15:35
>>340
339の前半は338と同じわけだから後半につっこんでるんだよな。
どっちかというとループ組んでちまちまやってる後半のほうが
初心者向けだと思った俺は変?
344:デフォルトの名無しさん
08/01/28 23:17:22
divmodじゃ?
345:デフォルトの名無しさん
08/01/28 23:19:24
unshiftとか久しぶりに見た
とりあえずスレ的には配列に変換してeachで回せる状況にするのが素直かと…
346:デフォルトの名無しさん
08/01/28 23:25:17
>>322
パターン1で20回scanするのならおそらくはパターン2を基本にするのがまだマシかと…
俺なら正規表現が長くなりすぎないようにパターン1でおおまかに小分けにしたものにパターン2を適用するけどな
347:デフォルトの名無しさん
08/01/28 23:28:16
>>341
GUIを使わないのが正解じゃなかろうか。
保守性も考えたGUIのソフトは大概組み込みRubyな感じ。
348:デフォルトの名無しさん
08/01/28 23:33:50
Ruby的にはサーバとWebブラウザベースで作るのが正解かと思われる
無理してショボいGUIつけたスタンドアロンアプリケーションは斜陽っぽいぞ
349:デフォルトの名無しさん
08/01/28 23:42:20
>>325
オマェの方こそ、厨房なんじゃネェの?
324には--program-suffix=19とかgem19って
書いてあるんだから、どう見たって1.8系と併存してんだろ?
なのにアンインストールしろだなんて
本当はソースヨメネェから、対処できなくてごまかしてんじゃね?
350:デフォルトの名無しさん
08/01/28 23:43:14
さ あ 、 も り あ が っ
て
ま
い
り
ま
し
た
351:デフォルトの名無しさん
08/01/28 23:45:16
最新作 On Air Alien オン.エア.エイリアン
URLリンク(zoomtv.atspace.com)
352:デフォルトの名無しさん
08/01/28 23:49:11
並存してるかどうかに関わらず1.9系列はアンインストールして1.8.6使うべき
353:デフォルトの名無しさん
08/01/28 23:53:37
なんかwindowsしか触った事が無い人が言いそうな感じだなぁ・・・
354:デフォルトの名無しさん
08/01/28 23:53:52
どんなに煽られようが「1.9には触るな」はガチ
手を出したこと自体が誤り
映画で言うとスタンドバイミー
355:デフォルトの名無しさん
08/01/28 23:54:41
あーわかったわかった
2ちゃんはギャーギャー騒げば大勝利だからな
もう何も言わないおめでとさん
356:デフォルトの名無しさん
08/01/28 23:57:32
今更自分の勝利のために>>7を捻じ曲げられても困るわけだが…
357:デフォルトの名無しさん
08/01/28 23:59:18
つーか開発版にわざわざ手出すなよ。動かないことに文句言うな。
1.9関連は使用を正当化するアホ初心者が沸いて困る。
358:デフォルトの名無しさん
08/01/29 00:01:07
URLリンク(www.ruby-lang.org)
>curl -O fURLリンク(ftp.ruby-lang.org)
これはMac上がりのニワカBSDヤーを懲らしめようとする巧妙な釣りだなw
359:デフォルトの名無しさん
08/01/29 00:21:39
ふつうはportやfinkで入れるところを……
360:デフォルトの名無しさん
08/01/29 00:24:49
>>357
β版リリースを大々的に宣伝するからだろw
361:デフォルトの名無しさん
08/01/29 00:30:35
目に付いた1.9.0への言及を1.8.6にしてみた。
改良よろ。
つーか、無駄に記述がおおいな。このページ。
362:デフォルトの名無しさん
08/01/29 00:33:46
質問です.
ベクトル空間モデルの考え方から,コサイン尺度を用いてベクトル間の
類似度を求めることができるじゃないですか?
このコサイン尺度の計算式ってプログラムでどう書けば良いのでしょうか?
363:デフォルトの名無しさん
08/01/29 00:36:54
それなりに知識がないと答えられないような。
Ruby固有の話じゃなさそうだから、このへんがいいんじゃないの?
プログラミングの為の数学と算数 vol.3
スレリンク(tech板)
科学技術計算
スレリンク(tech板)
計算アルゴリズム【Ⅱ】
スレリンク(tech板)
364:デフォルトの名無しさん
08/01/29 00:49:29
Railsスレとマルチすんなボケェ
365:デフォルトの名無しさん
08/01/29 01:07:57
Railsスレ→Rubyスレ→計算スレ??
「どこのレイヤーで躓いてるのかが把握できない」というあたりが
初心者ゆえんだな。
366:デフォルトの名無しさん
08/01/29 01:09:09
なんでRailsスレがこの板にあるのかと
367:デフォルトの名無しさん
08/01/29 01:34:44
たかがMVCやってるだけなのに宣伝がうざすぎるんで
Webprog板を追い出されました
368:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/29 02:36:32
>>368
(p(i%1)).class と解釈されるからじゃなかろうか
370:デフォルトの名無しさん
08/01/29 02:39:59
なるほどこれならうまくいきました
irb(main):004:0> (0..1).each{|i| p((i%2).class) }
Fixnum
Fixnum
=> 0..1
371:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/29 15:51:38
もう死ぬしかないね
373:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/29 16:22:59
>>371
まず何がしたいのか分からん
375:デフォルトの名無しさん
08/01/29 16:31:41
長い正規表現を短くまとめたいのですが.
376:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/29 16:41:23
>>376
そうですか.ゴリゴリ書いてみます.
ありがとうございました.
378:デフォルトの名無しさん
08/01/29 16:42:58
???
そもそも正規表現ってなんだっけ?と考えてしまったろぉ
379:デフォルトの名無しさん
08/01/29 16:45:00
>>377
外部から正規表現を受け取って短く変換して返すというアプリケーションを作ってるなら、わりと無駄だと思うのでやめとけ
正規表現の記述が短くなったからといって正規表現としての効率が上がるとは限らない
冗長に記述したほうが速いぜということもままあるはず
で、もし、既に存在する正規表現を手作業でくっつけてるために変換を欲してるのなら、
Regexp.joinで正規表現をくっつけることも検討するといい
380:デフォルトの名無しさん
08/01/29 16:47:43
URLリンク(eroero.com)
を
URLリンク(eroero.com)
URLリンク(eroero.com)
URLリンク(eroero.com)
URLリンク(eroero.com)
URLリンク(eroero.com)
展開するのってどうやるの?
381:デフォルトの名無しさん
08/01/29 16:53:36
>>380
自動ではできないと思う
自分で都合のいいマッチ条件を書いて場合分けして置換するしかないんじゃね
与えられた文字列で{数字A-数字B}を検知したら数字Aから数字Bまでのeachを起動してその部分を数字に置換する、とか
zshなんかでは専用の処理が既に組み込まれてたりしたはず
382:デフォルトの名無しさん
08/01/29 16:56:30
正規表現の最適化とかそういうことをやるには、正規表現処理系の中身に
手を出すような処理が必要になる、つまり自分で正規表現処理系を新しく
実装して、とかいうことになる。
383:デフォルトの名無しさん
08/01/29 17:04:13
後に画期的なコンパイラコンパイラを生み出す371であった
384:デフォルトの名無しさん
08/01/29 17:06:03
URLリンク(eroero.com)
のほうがいいんじゃまいか、そんで
URLリンク(eroero.com)
がいいな
385:デフォルトの名無しさん
08/01/29 17:06:40
eroero.comが普通に存在している件
386:デフォルトの名無しさん
08/01/29 17:08:42
どうでもいいが例示はexample.comを使え
実在するドメインに迷惑かけないように
387:デフォルトの名無しさん
08/01/29 17:09:34
>>379
ええ.ありがとうございます.
ただし,私の場合,スピードを求めているのではなくて,
可読性の向上と255文字制限を回避するためなのです.
255文字制限は他のプログラムで存在するので対策が必要です.
他のプログラムで,あるデータベースから自動的に生成された
年月日などの規則性のある,連続した数字の羅列を,
正規表現で表現し,さらに簡潔な表記に変換した後,
テキストで出力し,そのファイルを別のプログラムで使用する
という形のプログラムを作成中です.
ちょっと組んでみたのですが,かなり面倒ですねw
2桁の数字で真面目にやったら1000行超えちゃいますね.
ああ面倒だ.頻出の物だけで済ませるか.
数字を纏める事一つでここまで手こずるとは予想外でした.
388:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/29 18:21:59
>>388
基本的には「元の正規表現と等価である」というのが要件です.
a)の場合は元の数値を含んでいますが,それ以外の
03や12なども含んでしまいますから等価ではないと思います.
そのあたりの厳密性が要求されるのでb)が望ましいと言えます.
思いついたアルゴリズムとしては,|で区切った数値を
全て配列に書き出して,ソートして,一つ一つ取り出して,
連続しているようなら[ - ]で繋ぐという様なアルゴリズムで
やろうかなと思います.
390:デフォルトの名無しさん
08/01/29 18:32:10
ふくろう本(みみずく本だっけ?)にないかなあ
とあてずっぽうを言ってみるテスト
391:238
08/01/29 19:45:54
大変な遅レスです。すみません。
>>255
うう、Cygwinは捨てたくないし、Winを捨てたら Win32OLEが使えませんし、ちょ
と困ります。その関数もさすがに煩雑ですし。
>>261
おお!この手があったか!ありがとうございます。さっそく読んでみます。
392:デフォルトの名無しさん
08/01/29 20:11:08
>>388
perlのRegexp::Assembleのソース読んでみれば。
393:デフォルトの名無しさん
08/01/29 20:20:28
>>389
単純なalternationだけでいいなら、
いったん全部をトライ木に突っ込むのが簡単。
394:デフォルトの名無しさん
08/01/29 21:29:58
>>392
perlですか.勉強してみます.
>>393
なるほど.トライ木ですか.
ありがとうございます.
395:デフォルトの名無しさん
08/01/29 21:39:06
というか、出力パターンが極めて限定されていて、
正規表現として解釈する必要が本質的に無いとかいうオチは無いだろうか
396:デフォルトの名無しさん
08/01/29 23:53:14
俺も正規表現使わないほうが早いんじゃないかとちょっとだけ思った
397:デフォルトの名無しさん
08/01/29 23:55:06
パイプで別のプログラムを呼ぶときのことで質問させてください。
Rubyはmswin32の1.8系です。
RubyからMeCab(形態素解析ツール)を呼ぼうと次のように書いたのですが、
関数内での結果受け取り部分をどう書くのがよいかわかりません。。
プロンプトでMeCabの動作は、上記のようにオプションなしに呼んだ場合、文字列の入力を促され、
入力すると複数行の結果とEOS(文字列)が返って、次の入力待ちになります。
私\t説明
の\t説明
名前\t説明
EOS
・・(入力待ち)
以下ではこの流れをそのまま書きました。(続く)
398:397続き
08/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:デフォルトの名無しさん
08/01/30 00:02:55
>>397
一般論として、相手側がまだ出力を続けているけど遅延か何かでたまたまデータが来ないのか、はたまた出力が終わって今度は入力待ちになったのか、を知る方法はない。
今回の例だったら、EOSが来て相手の出力が終わったことはわかるんだから、もう用がないならio.closeでOK。
400:デフォルトの名無しさん
08/01/30 00:04:03
io.close_writeかな?
あと、回答とは違うがmecab-rubyを使うという選択肢はなし?
401:397
08/01/30 00:22:58
>>399 >>400
ありがとうございます。入力待ちで信号が来るわけじゃないんですね。
mecab-rubyはcygwin版でないとインストールが面倒そうだったので
早々にあきらめてしまいました。
過去スレにはWin32APIを介して・・というのも出ていたのですが
自分のスキルでは未知の領域なので同様に^^;
402:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/30 03:05:51
>>402
それ単なる自分のスレッドだから。
アプリでdeadlockが起こってるってのはなんかロックとして使ってるファイルでも
消してないんじゃないか?tmpとか見てみれ
404:デフォルトの名無しさん
08/01/30 03:55:40
>>403
> それ単なる自分のスレッドだから。
そうみたいですね。 はやとちりでした。
どうやら自分が Thread の扱い方を理解していないだけみたいです。 orz
405:デフォルトの名無しさん
08/01/30 16:09:34
正規表現で前からずっと気になってたので質問。
「でっかいHTMLから<title>を抜き出す」という場合
html.scan(/<title>(.+?)<\/title>/)
みたいな書き方するんだけど、これよく考えたらhtml内で</title>が終わった後もえんえんサーチしてるよね。
「ひとつ見つけたらそこで終了させる」というような指定はできない?
406:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/30 16:18:55
ブロック内でbreakすればいいんじゃない?
408:デフォルトの名無しさん
08/01/30 16:23:14
そもそもscanを使わないというのは無しですか?
p $1 if /<title>(.*?)<\/title>/ =~ html
409:デフォルトの名無しさん
08/01/30 17:08:38
html.scan(/<title>(.+?)<\/title>/, 1)
410:デフォルトの名無しさん
08/01/30 18:07:49
>>409
これなんだろうと思ってリファレンスマニュアル見たけど無いよ
slice(regexp[, nth]) の間違いだな
411:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/31 15:20:33
Rubyから実行中のDirectXのfpsを取得するライブラリーとかない?
念を押すと、fpsのみでいいんだけども。
414:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/31 18:20:10
>>413
> 実行中のDirectXのfpsを取得するライブラリーとかない?
うーん。見たことないな・・・
DirectXの録画ソフトだと大抵ついている機能だから、
作者に頼んでみるとか、
オープンソースのソースを見て自分で作るとか
416:415
08/01/31 18:27:34
>>413
試してないが、この辺とか
Taksi: Video capture/Screen capture for 3D applications
URLリンク(taksi.sourceforge.net)
他にも sourceforge に似たソフトがあったと思う
あと、ムービー録画するソフトに関してはこちらの方が詳しい
【鑑賞】 ムービースレッド 【作成】 part2
スレリンク(gamef板)
417:デフォルトの名無しさん
08/01/31 19:22:03
>>414
OBJs = SRCs.sub(/\.cpp$/, '.o')
rule '.o' => '.cpp' do |t|
なら動くが、二重のsuffixには対応しないんじゃね?
418:デフォルトの名無しさん
08/01/31 19:50:08
ていうか勝手に自己解釈で縮めんなよ
419:デフォルトの名無しさん
08/01/31 19:51:22
>>418 ???
420:デフォルトの名無しさん
08/01/31 20:37:42
教えてください。
UTF8の文字列に対して、正規表現で何かする場合に、
「~」という文字が使えない気がするのですが、何故でしょうか?
Ruby1.8.6をWindowsで使ってます。
421:420
08/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:デフォルトの名無しさん
08/01/31 21:27:23
試さないで適当にレスするけど
正規表現の後ろにuってつけてみたらどうだ
/~/u みたいに
423:デフォルトの名無しさん
08/01/31 21:30:10
>>421
文字コード指定してないんだから、そりゃマッチしなくて当然だ
初期状態では、正規表現はマルチバイト文字列にマッチしないようにできてる
(少なくとも確実にマッチするという保証はない)
$KCODEを設定するか、あるいは正規表現に文字コード指定をつけるかしないとダメ
424:デフォルトの名無しさん
08/01/31 21:34:09
「~」であるべきコードの主力が
ウエーブダッシュ:〜
全角チルダ:~
のふたつあるのが問題かなーとおもったけど、ちがうのか
425:420
08/01/31 21:44:01
>>422
今、やってみましたが、変化無かったです。
>>423
頭に、$KODE指定も付けてみましたが、変化無かったです。
426:420
08/01/31 21:47:28
>>424
それは全く知りませんでした。
今、後半の「~」をウエーブダッシュというので、書き換えて
やったらうまくいきました!!
本当に有難うございます。
ちなみにこの話っていうのはよく知られた問題なのでしょうか?
427:デフォルトの名無しさん
08/01/31 21:49:29
>>425
1. どんな$KCODE指定をつけたのか書くこと
2. tosjis&toutfで、正しく文字コードを変換できているかどうかをチェックすること
428:デフォルトの名無しさん
08/01/31 21:52:10
あーubuntuで作った文書をWinに持ってきたら
~のつもりだった部分が全部ウェーブダッシュだったとかよくあるよな
429:420
08/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:デフォルトの名無しさん
08/01/31 22:06:40
~は Mac ←→ Windows でも変になることがある厄介者。
431:デフォルトの名無しさん
08/01/31 22:10:02
WAVE DASH 問題 でググるとあれこれ出てくるぐらい有名な問題です
432:420
08/01/31 22:16:09
>>430 >>431
まじすか。ウエーブダッシュというものの存在自体しりませんでしたorz
初心者スレで質問してよかった。。
433:デフォルトの名無しさん
08/01/31 22:42:26
MSが~を全角チルダで変換するのは1992年のWindows3.1登場から。
で、規格は~をウェーブダッシュにしろといってるが、これは1994年製。
だから、互換性重視するWindowsで~をUnicodeにするとみんな全角チルダになる。
規格通り変換テーブルを実装すると~の変換先はウェーブダッシュになるから大変な目に
Unicodeの絡みであと問題になりやすいのは、MACがファイル名をNFDして持ち出してくることかな
434:86
08/01/31 23:33:29
すいません。未だにできないので、どなたかご教授ください。
文字列の距離を求めることはできるのですが、
母音(aiueo)の挿入、置換、削除が行われたときのみ、重みを1じゃなくて2としてで距離を計算したいんです。
kasaとsasaの距離は1
kasaとkasuの距離は2
といった感じです。どなたかよろしくお願いします。
435:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/01 00:37:55
>>433
良く知らんけど、1992年にすでにCP932->Unicodeの変換表とかまであったの?
kernel32.dll に MultiByteToWideChar とかのユニコード変換系APIが
追加されたのは NT3.1以降、95以降らしい。
それ以前に互換性が問題になるほど外部に公開されてたAPIとか変換表ってあったん?
437:デフォルトの名無しさん
08/02/01 00:40:19
>>436
もちつけ。
438:デフォルトの名無しさん
08/02/01 01:19:06
WAVE DASH 問題の歴史は、安岡先生の
URLリンク(slashdot.jp)
とかかな
439:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/01 05:42:36
>>439
そのままの意味。
test.txtがないから開けない。
441:デフォルトの名無しさん
08/02/01 06:35:57
>>440
返答ありがとうございます。
test.txt があることは何度も確認しているのですが、
どうしても、エラー表示がでるので、他のファイルで試してみます。
442:デフォルトの名無しさん
08/02/01 06:46:11
おそらくファイルのせいではありません。
カレントディレクトリ、というものを意識してください。
443:デフォルトの名無しさん
08/02/01 07:34:53
またあれかな
'デスクトップ'
の文字コードが違うとか
444:デフォルトの名無しさん
08/02/01 08:43:40
>>442
>>443
ありがとうございます。
保存する前に実行していたので、エラーが出たようでした。
保存後実行で解決しました。
445:86
08/02/01 11:08:20
>>435
ありがとうございます。確かに距離はでましたが、
例えばyとyyyyの距離は挿入が3回行われるため距離3にしたいのです。
またuとyyyyなら距離4にしたいのです。
すいません、仕様不足でしたが、修正ソースお願いできないでしょうか?
446:86
08/02/01 11:13:37
追加ですが、比較に使用する文字列長は最低2でした。すいません。
なのでyuとyayaなら距離は5となります。
日本語からローマ字に変換したもの同士を比較してるのですが、もし母音が一文字なのが余計でしたら
例えば変換規則をxaなどとして必ず偶数番目に母音を入れることも可能です。
きゃとかしゃも何とかします。
447:デフォルトの名無しさん
08/02/01 11:31:53
Rubyを学ぶ気はなさそうだな
格好よく書かなければいけないという縛りを勝手に感じることがあるがそんなもん無視しろ
望む結果を出すプログラムであることが第一だ
448:デフォルトの名無しさん
08/02/01 11:35:21
どうがんばっても泥臭くしか書けないものも、無くはないからな
449:デフォルトの名無しさん
08/02/01 11:46:39
俺はよりよい(あるいはまともな)プログラムにするのは半年後の自分に任せてる
何かよくわからない素晴らしいメソッドを使って1行で書けるのかもしれないが、今自力で作ることのほうが重要
まあ、半年後にはRubyどころかプログラミング言語すら使ってないっていうパターンもあるだろうけどな
そういう場合は自己探求に任せるのは双方にとって馬鹿らしくはある
450:86
08/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:デフォルトの名無しさん
08/02/01 13:39:13
このスレにはタチの悪いオナニーワンライナーが生息してるからな
初心者に自分の技術(と信じてるもの)を見せびらかして悦に浸る人種
452:デフォルトの名無しさん
08/02/01 13:46:29
思考をifとeachとローカル変数にバラすのもめんどいっちゃめんどいけどな
意図的に書いてる奴は放置として、気づいた人が平易なほうに書き直すのがよいかと思われ
453:デフォルトの名無しさん
08/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 URLリンク(www.ruby-lang.org)
zip URLリンク(www.ruby-lang.org)
inject URLリンク(www.ruby-lang.org)
454:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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
08/02/01 14:41:23
挿入コストやら削除コストやらは面倒だったんで全部1にした
あとは自分で何とかしてくれ
もしコードの内容にミスがあったら、誰か突っ込んでほしい
457:86
08/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
08/02/01 19:05:37
>>454
今見てやってみたら一瞬で改造できました。笑
ほんとにこんな長いソースを実ソースも見ずにやっていただいてありがとうございます。
僕も、もうちょっと勉強して、僕みたいな香具師を助ける側になれるようがんばります。
459:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/02 00:54:44
rubyにはawkやperlみたいな「一行野郎」集ってないの?
テキスト処理にわざわざスクリプト書きたくないんだけど。
461:デフォルトの名無しさん
08/02/02 01:01:47
こういうことを言うとおまえらから総攻撃を受けるかもしれないが
一行で書きたいならawk使ったほうがいいような気がする
462:デフォルトの名無しさん
08/02/02 01:14:45
awkの$1、$2に相当する組み込み変数はないの?
463:デフォルトの名無しさん
08/02/02 01:26:22
>>460
ここにいますよー。
Rubyの宿題スレにもそこそこいる
464:デフォルトの名無しさん
08/02/02 01:27:19
>>462
正規表現使った時にそいつら使えるぜ
465:デフォルトの名無しさん
08/02/02 01:27:59
ネタにマジレスで申し訳ないけど、「一行野郎」って人じゃなくてコマンドね。
466:デフォルトの名無しさん
08/02/02 01:31:20
>462
-aオプション(とゆーことは、-nか-pオプションも)付けたときだけだが
$F[0]、$F[1]、……が$1、$2……相当。
$0は$_
リファレンスのコマンドラインオプションのとこ参照
ちなみにそこ読めば書いてあるが$_をフィールドセパレータで分割したのが$Fなんで$FはArray
467:デフォルトの名無しさん
08/02/02 01:32:30
ワンライナーで書くための努力は、はっきしいって無駄な努力だよ。
ワンライナーでかけたからといって、自己満足でしかない。
468:デフォルトの名無しさん
08/02/02 01:32:33
perlのawkサポートと同じオプションだな。
469:デフォルトの名無しさん
08/02/02 01:32:40
File.open('hoge.txt').each { |line| puts(line.split.join('-')) }
みたいに書こうと思えば書けるが、
Perl みたいな変態的な省略は㍉
470:デフォルトの名無しさん
08/02/02 01:37:02
>>466
それだ。ありがと。
フィールドセパレータはどうやって設定するんだろう。。
>>467
君ってあまりコマンドラインシェル使ったこと無いでしょ。
471:デフォルトの名無しさん
08/02/02 01:38:25
>>470
いや、トテモトテモ使ってるよ。