Ruby 初心者スレッド Part 23
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/11/20(木) 04:30:21【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
【最新安定版の Ruby1.8.7 の使用をお勧めします】
※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。
1.9 の新機能の一部が利用可能なので初学者にお勧めです。
※ただし十分安定しているとは言えないので
プロダクション環境での利用にはお勧めしません。
関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0478デフォルトの名無しさん
2008/12/13(土) 22:25:44outfile = 'testwrite.txt' #問答無用で上書きされるぞ
と、すると
pathファイルを開いて、全体を一気に読み込んだものを表示する
open(path, 'r'){|f| puts f.read}
pathファイルを開いて、一行読み込んで表示するのを最後まで繰り返す
open(path, 'r'){|f| f.each{|line| puts line}}
pathファイルを開いて、一行読み込んで、行番号表示して、行の内容を表示するのを最後まで繰り返す
open(path, 'r'){|f| f.each_with_index{|line,ind| printf '%3d ',ind+1;puts line}}
pathファイルを開いて、書き込み用のoutfileファイルも開いて、一行読み込んで、ファイルに行番号書き込んでから行の内容も書き込むのを最後まで繰り返す
open(path, 'r'){|f| open(outfile,'w'){|out| f.each_with_index{|line,ind| out.printf '%3d ',ind+1;out.puts line}}}
0479デフォルトの名無しさん
2008/12/13(土) 22:30:000480デフォルトの名無しさん
2008/12/13(土) 22:32:30そんなこと言ったら行番号付加ツールインストールすれば一発だぞ
0481デフォルトの名無しさん
2008/12/13(土) 23:42:380482デフォルトの名無しさん
2008/12/14(日) 01:44:40お恥ずかしながら io.readlines のことかと思って悪戦苦闘していました。
例文通りに打ち込んでも上手く行かないので、何かプログラムの根本的な
ところが判ってないのだと思って再び悩んでいました。
>>477
>>478
ありがとうございます。おかげさまで希望通りの動作が実現しました。
教えて君のような私にここまでして頂いて何と感謝すれば良いのか判りません。
私に何ができるわけでもありませんが、似たようなことがあったら、
私もこのスレの皆さんのような態度で困った人に接したいと思います。
このスレの皆様に心から感謝します。本当にありがとうございました。
0483デフォルトの名無しさん
2008/12/14(日) 03:03:55死ぬの?
0484デフォルトの名無しさん
2008/12/14(日) 05:12:40たかが2chでそこまでバカ丁寧になる必要はない
教えてやりたい人間が教えたいように教えただけ
>>483
バカ丁寧だから、バカなんじゃない?
0485デフォルトの名無しさん
2008/12/14(日) 05:13:180486デフォルトの名無しさん
2008/12/14(日) 05:40:39たかが2chで「必要がない」ことをそんな大きく見てもしょうがない。
他の多くのレスの不必要な表現と同じように、>>482も書きたいように書いただけ。
0487デフォルトの名無しさん
2008/12/14(日) 12:37:57ないみたいね
そもそもPlaggerのスレさえも立ってない
(理由は不明だけど、俺は人気がないんだと思っている)
話したいなら、ここや本スレでも良いと思うよ
0488デフォルトの名無しさん
2008/12/14(日) 12:47:00OSはcentos5.2を使用して
ruby本体は、 ruby-1.8.6-p287をcheckinstallにてRPM化しインストールしています。
ruby-ldap-0.9.7-1.i386.rpmを入手して、インストールを試みたところ下記のような
エラーメッセージが出力されて、二日ほど止まりっぱなしです。
どなたかアドバイスをお願いします。
# rpm -ivh ./ruby-ldap-0.9.7-1.i386.rpm
警告: ./ruby-ldap-0.9.7-1.i386.rpm: ヘッダ V3 DSA signature: NOKEY, key ID bfbaf0e8
エラー: 依存性の欠如:
libcrypto.so.5 は ruby-ldap-0.9.7-1.i386 に必要とされています
libruby.so.1.8 は ruby-ldap-0.9.7-1.i386 に必要とされています
libssl.so.5 は ruby-ldap-0.9.7-1.i386 に必要とされています
#
0489デフォルトの名無しさん
2008/12/14(日) 13:03:15ruby-dev のようなもの、libopenssl-ruby のようなもの、openssl のようなもの、のインストールが足りない
Ruby関係ないな
0490デフォルトの名無しさん
2008/12/14(日) 13:13:04必要なファイルを含むパッケージを表示する方法があるはずだから、それでインストールするパッケージを調べるといい
0491デフォルトの名無しさん
2008/12/14(日) 13:49:11ruby-devとlibopenssl-rubyについては入っていません。。
ruby-dev`については、自ら作成したrubyのRPMファイルを入れるときに
アンインストールしちゃいました。
含んでいそうなファイルを探してみます。
ありがとうございました。
0492デフォルトの名無しさん
2008/12/14(日) 13:53:010493デフォルトの名無しさん
2008/12/14(日) 14:51:23# rpm -qa | grep ruby
ruby-irb-1.8.6.287-1.el5.kb.1
ruby-libs-1.8.6.287-1.el5.kb.1
ruby-1.8.6.287-1.el5.kb.1
ruby-devel-1.8.6.287-1.el5.kb.1
こんな感じに拾ってきたrpmを入れてから、
#rpmbuild -ta ruby-ldap-0.9.7.tar.gz
を実行して、自分でrpmファイルを作ったら、インストールできました。
この状態だとgemが入れられなかったので、rubyのrpmファイルを自前で作成して
インストール後、上記の状態にしたのでgemがどっかで不具合を起こさないか不安ですけど。
ちなみに、gemがインストールできないのはrdocがロードできないとか怒られた。
rdocのrpmファイルってどこかに落ちてるんでしょうか?
0494デフォルトの名無しさん
2008/12/14(日) 14:56:390495デフォルトの名無しさん
2008/12/14(日) 20:54:03どうすればいいでしょうか。
path ="test.txt"
system("start path")
これだとコマンドプロンプトが立ち上がるだけで
関連付けでファイルを開いてくれません。
0496デフォルトの名無しさん
2008/12/14(日) 21:01:50それと同じことが起きてるだけ
0497デフォルトの名無しさん
2008/12/14(日) 21:03:030498デフォルトの名無しさん
2008/12/14(日) 21:43:35出来ました! ありがとうございます。 m(_ _)m
0499デフォルトの名無しさん
2008/12/14(日) 22:13:541.9向けにライブラリ作っていい?
0500デフォルトの名無しさん
2008/12/14(日) 22:26:51応
で
き
る
も
ん
が
作
れ
るなら作ってみな
という感じだ
特にEncode関連
0501デフォルトの名無しさん
2008/12/14(日) 22:29:24いちユーザーとしてもいきなり挫折しなくて済んでいいかも
ruby1.9 ./hoge.rb
しただけで普段見たことも無いファイルのやたら多い行数のとこでSyntaxErroroとか挫けるし
0502デフォルトの名無しさん
2008/12/14(日) 22:30:511月に延期されたとかなんとか
0503デフォルトの名無しさん
2008/12/14(日) 22:32:381.9.0 features を読んで逐一チェックするしかない?
0504デフォルトの名無しさん
2008/12/14(日) 22:51:1012月25日に予定されてるのは、1.9.1のRC(リリース候補)で正式版じゃない
といっても、現時点でもう1.9.1の仕様は固まってるはずなので、今から作り始めても良いと思うが
0505デフォルトの名無しさん
2008/12/14(日) 22:51:59たぶんrubikitichがホッテントリ狙って書くよ。
0506デフォルトの名無しさん
2008/12/14(日) 22:58:220507デフォルトの名無しさん
2008/12/14(日) 23:10:00$KCODE="s"
tut = "12月28日 夢見師(プリンセスソフト、7,140円) "
p tut
0508デフォルトの名無しさん
2008/12/14(日) 23:13:460509デフォルトの名無しさん
2008/12/14(日) 23:14:57#!/usr/local/bin/ruby -Ks
の1行入れてなかったことによるものでした。お騒がせしてすいません。
>>508
sjisのことです。
0510デフォルトの名無しさん
2008/12/14(日) 23:49:31以下a1の文字列の内()とその中身を消したいのですが、
なぜか ) だけ残して全て消えてしまいます。
#!/usr/local/bin/ruby -Ks
$KCODE="s"
a1="最強 東大将棋6(毎日コミュニケーションズ、2,940円) "
a1 = a1.gsub(/.*?月.*?日 /,"")
a1 = a1.gsub(/(.*?円)/,"")
p a1
0511デフォルトの名無しさん
2008/12/14(日) 23:53:36正規表現中でカッコそのものを表すなら \( や \) のようにエスケープしなきゃだめ
0512デフォルトの名無しさん
2008/12/15(月) 01:03:05え゛っ、そうなんですか!!
/に\/しなきゃならないのは知っていたですが、()もでしたか。
他でもポカしてそうだな。
ご解答ありがとうございます。
0513デフォルトの名無しさん
2008/12/15(月) 01:04:30英数はそのまま書くとその文字、\を付けると特別な意味になることが多い。
逆に記号はそのまま書くと特別な意味があることが多く、\を付けるとその文字ってことが多い。
0514デフォルトの名無しさん
2008/12/15(月) 01:41:29記号の意味そのものは必要なときに調べればいいから覚えなくてよし
エスケープが必要な文字かどうかだけを記憶すればおk
0515デフォルトの名無しさん
2008/12/15(月) 09:11:03間違ってエスケープせずにピリオド使ってても
そのまま動いてしまって気付かないことが多い
あとで忘れた頃に問題が表面化するから初心者は注意な
0516デフォルトの名無しさん
2008/12/15(月) 09:54:50で99.99%くらいは普通に動作するんだよな
0517デフォルトの名無しさん
2008/12/15(月) 10:02:26わかってない人が「メールアドレスにヒットする正規表現を書け」とか課題出したりするんだが
0518デフォルトの名無しさん
2008/12/15(月) 10:27:14から
/\s*\(a\)\s*/
を生成するのってどうやるんですか?
a = "(a)"
/\s*#{a.escape}\s*/
みたいに書ければいいんだけど
0519デフォルトの名無しさん
2008/12/15(月) 10:41:09マニュアル読んどけ
Rubyの正規表現はただのオブジェクトだからRegexpクラスのメソッドで生成できる
/〜/ で書くのはただのわかりやすいエイリアスに過ぎない
あと、半角スペースと \s には直接の関係はないから、あらかじめ \s で書いておくしかないよ
個人的には半角スペースを \s で表現するようにするのは後々罠に落ちるから全くお勧めしない
半角スペースがあるのなら、どんなに正規表現の見かけがマヌケになっても半角スペースで書くべき
0520デフォルトの名無しさん
2008/12/15(月) 11:10:37/\s*#{Regexp.escape(a)}\s*/
Regexp.quoteという別名も。
0522デフォルトの名無しさん
2008/12/15(月) 21:57:53プラガブルであることのメリットがイマイチ生かされてないんだな
0523デフォルトの名無しさん
2008/12/16(火) 05:42:09逆転しそう
0524デフォルトの名無しさん
2008/12/16(火) 05:46:15逆転もなにも、世界的には10位以下に後退したダメダメ言語だけどね
(ただ、Pythonが下がってたりLogoが爆上げしてるところから見ても
かなり変な順位づけであることは間違いない)
0525デフォルトの名無しさん
2008/12/16(火) 19:07:50001test.txt
002test.txt
003test.txt
という複数のファイルを、
数字の部分に正規表現を使ったパスで一度に開きたいのですが、
どうすれば良いでしょうか?
次のように書いているのですが上手く行きません。
files = /D:/desktop/[0-9]+test.txt/
system("start #{files}")
0526デフォルトの名無しさん
2008/12/16(火) 19:21:31あと %r の使い方も調べとけ
0527デフォルトの名無しさん
2008/12/16(火) 19:24:19Dir.glob
0528デフォルトの名無しさん
2008/12/16(火) 21:05:12御返事ありがとうございます。
それで調べたら Dir.glob は正規表現ではなくワイルドカード対応と書いてあるのですが、
これは正規表現には対応していないということではないでしょうか。
>>525の書き込みはあくまで勉強中の実験のものなので、
実際に使う時にはパスを正規表現で指定したいのです。
また、>>525では省略しましたが、
開きたいファイルは似たような名前が多いので、最終的には、
name = ●●
files = %r("D:/desktop/[-9]+●●.txt")
system("start #{files}")
というような形にして、●●の部分を書き換えるだけで
任意のの複数のファイルを開けるようにしたいのです。
0529デフォルトの名無しさん
2008/12/16(火) 21:28:50そういうのだと全ファイル名から正規表現でselectせざるをえないかな。
0530デフォルトの名無しさん
2008/12/16(火) 21:50:09find_all と呼ぶ
0531デフォルトの名無しさん
2008/12/16(火) 21:59:18まったく同じことを繰り返すことになるが、Rubyのオブジェクトについての考え方学んでくれ
返り値がただの文字列なら、それはただの文字列(String クラスのオブジェクト)で、何か特別なものがあるわけじゃない
Stringクラスのメソッドが完全に全て動作するし、文字列オブジェクトを引数にとるメソッドは全て完全に動作する
メソッドの返り値がどのクラスのオブジェクトなのかということは絶対に意識しないと駄目よ
正規表現を使いたいなら、引数…、まあ、引数の見かけしてないことが多いけど、マッチ試行対象は文字列だ
いちばん単純な状態で必要なのは、ディレクトリ中のファイルを文字列で返すメソッド
その文字列の一群の中から、正規表現にマッチする文字列を探して、その文字列をどうにかすればいい
0532デフォルトの名無しさん
2008/12/16(火) 21:59:19ソースは?
0533デフォルトの名無しさん
2008/12/16(火) 22:43:20filter = /\d+test.txt/
system(Dir.glob(target).select{|i| i =~ filter}.unshift('start').join(' '))
0534デフォルトの名無しさん
2008/12/17(水) 00:24:48なあ、初心者スレなんだから、もっと分かりやすく書こうぜ
filenames = Dir.glob('D:/desktop/*')
filenames = filenames.grep(/^¥d+test¥.txt$/)
system "start #{filenames.join(' ')}"
0535デフォルトの名無しさん
2008/12/17(水) 00:34:21改行が存在しない文字列に対して ^ と $ は不適
代わりに \A と \Z を使おう
0536デフォルトの名無しさん
2008/12/17(水) 00:43:57require 'tk' がうまく いきません。以下のようなメッセージが表示されます。
in `require' : no such file to load --tk (LoadError)
どうすればいいでしょうか?
0537デフォルトの名無しさん
2008/12/17(水) 00:46:52Tcl/Tkが入ってないんじゃね?
0538デフォルトの名無しさん
2008/12/17(水) 00:48:23tkライブラリを見つけられなかった。
tkがインストールされない環境(ってなんだろ?)か
$LOAD_PATHがおかしいんじゃない?
0539536
2008/12/17(水) 01:02:12/usr/local/lib/ruby/1.8/test/unit/ui/tk
/usr/lib/ruby/1.8/test/unit/ui/tk
が見つかったんですけどこれとは違うんでしょうか?
ちなみに echo $LOAD_PATHでは何も表示されませんでした。
0540デフォルトの名無しさん
2008/12/17(水) 01:13:10質問者の求める「正規表現の使えるglob」が提供されて無いから別解を提示しただけ
分かりにくいってのはわざとそうしてるんだから許してよ
>>539
それ違う
OS何?tcl/tk入ってる?wishコマンド使える?
0541デフォルトの名無しさん
2008/12/17(水) 08:10:32>改行が存在しない文字列に対して ^ と $ は不適
逆だろ。改行が存在しない文字列だからこそ ^ や $ を使っても構わない。
0542デフォルトの名無しさん
2008/12/17(水) 08:13:15>分かりにくいってのはわざとそうしてるんだから許してよ
なんでそんなことをするの
分かりやすく書けないのをごまかしてるだけじゃねーのかよ
0543デフォルトの名無しさん
2008/12/17(水) 08:22:36あまりRubyの正規表現に詳しくない人間が見たら
「ああ^と$は文字列先頭と末尾なんだな。Perlと同じなんだな」とか
勘違いしちゃうよ
0544デフォルトの名無しさん
2008/12/17(水) 08:44:02>system "start #{filenames.join(' ')}"
system 'start', *filenames
でよくね?
0545デフォルトの名無しさん
2008/12/17(水) 10:21:20そんなこと言ったら2行目はメソッドチェーンで消えるし、
対象ディレクトリが専用ディレクトリならそもそも Dir.glob のワイルドカードつき文字列でも充分だ
君が *引数 をオボエタテだからだからといってわざわざ難しくする必要はない
0546デフォルトの名無しさん
2008/12/17(水) 10:28:48目に見えない文字や場所にマッチする正規表現は慎重に使ったほうがええぞ
半角空白にマッチさせるために \s を使ったりしないだろ
それと同じこと
0547デフォルトの名無しさん
2008/12/17(水) 10:30:19544じゃないけど、一般にsystemの引数は ' ' でjoinするより * で渡すほうが空白を含むファイル名等の問題をより安全に回避できるので、* のほうがお勧めだけどね
0548デフォルトの名無しさん
2008/12/17(水) 10:37:16使うなら堂々と初心者向け解説の3ページ目から使いまくるくらいの感じにして欲しいとは思う
0549デフォルトの名無しさん
2008/12/17(水) 10:45:05mkdir foo
mkdir bar
`
みたいに途中でシェルスクリプトだらだら書けるようなやり方ってない?
上の書き方だとmkdir fooだけ実行されるっぽい
0550デフォルトの名無しさん
2008/12/17(水) 10:49:19返り値が必要なときに使うもんだ
system 使え
0551デフォルトの名無しさん
2008/12/17(水) 10:57:56やってみた?
0552デフォルトの名無しさん
2008/12/17(水) 11:17:32>>547
たいへん参考になりました。
ただ初心者スレで使うには説明が必要ですね。
0553デフォルトの名無しさん
2008/12/17(水) 11:21:00system "
mkdir foo
mkdir bar
"
でも変わらなかった
0554デフォルトの名無しさん
2008/12/17(水) 11:31:24シェルスクリプトとみなせる環境であるなら全部実行できるはず
動作しないとしたらWindowsかCygwinだな
0555デフォルトの名無しさん
2008/12/17(水) 11:33:20mkdir foo; mkdir bar だろう。
つーかそんなことしなくても、
mkdir foo bar でいいだろう。
0556デフォルトの名無しさん
2008/12/17(水) 11:35:50最新5レスしか読めない携帯からのご参加ですか?
0557デフォルトの名無しさん
2008/12/17(水) 11:38:56mkdir したいって話じゃねーだろ
>>553
Windowsではでっかいひとつのスクリプトとして実行するしかなさそうだな
0558デフォルトの名無しさん
2008/12/17(水) 11:39:43system "foo.sh"
したらいいやん
0559540
2008/12/17(水) 12:15:12初心者にはメソッドチェーンが読みにくいかもしれない、とは思ったけど
読み解くのも勉強になるだろうと思ってそのまま書いた
grep と system(*args) は知らなかったから書き直すよ
target = 'D:/desktop/*'
filter = /\d+test.txt/
command = 'start'
system(*Dir.glob(target).grep(filter).unshift(command))
0560デフォルトの名無しさん
2008/12/17(水) 14:15:15>system(*Dir.glob(target).grep(filter).unshift(command))
なぜわざわざunshiftを使うのか分からん。>>544の通りに
system command, *Dir.glob(target).grep(filter)
でええやん。
0561デフォルトの名無しさん
2008/12/17(水) 14:34:26キューじゃないものに pop とか使ったらダメよ混乱するから
0562デフォルトの名無しさん
2008/12/17(水) 15:00:35RubyのselectはSQLのselectじゃなくて
Smallltalkのselectに由来するって知ってるか?
0563デフォルトの名無しさん
2008/12/17(水) 15:09:54普通に使ってるし、混乱するって話もあまり聞かないぞ
そもそもpopやshiftを使わないとすると、代わりにどんな風に書くんだ?
0564デフォルトの名無しさん
2008/12/17(水) 15:14:58「外来語」の detect と select で悩むくらいなら find と find_all を使うなあ、俺は
というかなんでそこで SQL が出てくるんだ?
0565デフォルトの名無しさん
2008/12/17(水) 15:21:17配列から取り除くことが作用ではなく副作用になる場合以外、
「配列から取り除く(ついでに値を得る)」ではなく
「値を得る(ついでに取り除く)」だと思ってるとミスするという話かと。
def get_first(ary)
ary.shift
end
ary = [1,2,3]
put get_first(ary) # aryが破壊される
0566デフォルトの名無しさん
2008/12/17(水) 15:35:31同意
queue じゃなくても、popもshiftも使うよな
0567デフォルトの名無しさん
2008/12/17(水) 15:38:04イテレータ拒絶派か何かか?
0568デフォルトの名無しさん
2008/12/17(水) 15:42:26split結果の先端や終端にゴミついてるのが確実なときに切り落とすためとか。
0569デフォルトの名無しさん
2008/12/17(水) 15:55:45delete_at(0)
配列先頭のデータが欲しいときに
data = arr.delete(0)
と書くのが奇妙なのと同程度には
# 先頭は不要
arr.shift
と書くのは奇妙だと思う
shift に関してはコマンドライン引数を順に扱うときに shift コマンドを使った経験が後を引いてるのかもしれないが、
ここは Ruby だし shift は変
0570デフォルトの名無しさん
2008/12/17(水) 15:57:550571デフォルトの名無しさん
2008/12/17(水) 15:58:580572デフォルトの名無しさん
2008/12/17(水) 16:19:460573デフォルトの名無しさん
2008/12/17(水) 16:19:54>質問・要望・雑談などどうぞ。
>>569
奇妙なのはそのコメント文だろうw
代入操作がないことから不要なことは自明。
返値があるものは代入しないといけないなんてルールはないし。
>>565のように先頭や末尾の要素を配列から取り除くのが主の操作で、
popやshiftにそれ以上の意味(=キュー専用)はないと考えてる。
だからdelete_at使えというのは、firstやlastもat(0)やat(-1)にしろと
言っているように聞こえる。
キューでない配列に対してpopやshiftがよろしくないなら
Array#pop #shift #push #unshiftは廃止してQueueクラスを用意するべき。
運用で制限しようとするほうがおかしい。
(threadのものと名前がかぶるけどそれはさておき)
0574デフォルトの名無しさん
2008/12/17(水) 19:49:45ところでその考え方だとpopはキューに使っちゃダメだろ
あれはスタックに使うものでは?
0575デフォルトの名無しさん
2008/12/17(水) 21:13:20切り捨てるより、shiftで切り出された結果を使う方が多い
param = ARGV.shift
line = lines.shift
とか
0576デフォルトの名無しさん
2008/12/17(水) 21:39:050577デフォルトの名無しさん
2008/12/17(水) 21:54:01push⇔shift
unshift⇔pop
これでキューが出来上がる。ただし左がエンキュー、右がデキュー
■ このスレッドは過去ログ倉庫に格納されています