- 1 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:21:25 ]
- プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。 (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に完全対応していないためです。) 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。 関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の 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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
- 841 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 22:08:16 ]
- 質問です。ある1つのディレクトリ内にあるファイルを更新時間順にソートしてファイル名を連番(数字のみ)にしようと以下のコードを書きました。
def consecutivenum(path) i = 1 files = Dir.glob("#{path}/*").reject{|name| FileTest.directory?(name)} files.sort{|a, b| File.mtime(a) <=> File.mtime(b) }.each{|name| File.split(name)[1] =~ /.+(\..+)/ File.rename("#{name}", "#{File.split(name)[0]}/#{i}#{$1}") i += 1 } end 実行するとファイルが消去されたりコピーされたりしてしまいます。 試しにDir.glob(#{path}/*)だけを実行したところ、存在しないファイル名が混じっていました。 また、そのファイルをFileTest.exist?に送るとtrueが返ってきます。Windowsの隠しファイルでもありませんでした。 何がどうなっているのかさっぱりわかりません。OSはVistaでRubyのバージョンは1.8.7です。 ご助力よろしくお願いします。長々と失礼しました。
- 842 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 22:40:56 ]
- > 存在しないファイル名が混じっていました
存在します または、UNICODEファイル名です UNICODEファイル名だった場合、Rubyから扱うことはできません
- 843 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 23:30:17 ]
- てか存在しないファイル名とか教えてくれりゃ結構一発だったり
- 844 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 23:33:11 ]
- 察してください、まで読んだ
- 845 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 00:28:53 ]
- >>842
>>843 ファイル名ですが、エクスプローラーやコマンドプロンプトのdirで確認できずにrubyで検出されたのは 6.jpg 2.ini の二つです。
- 846 名前:841 mailto:sage [2010/01/23(土) 00:29:59 ]
- 失礼
>>845の書き込みは>>841の者です。念のため。
- 847 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 00:59:11 ]
- 本当に存在しないファイルなの?
そのディレクトリで system('start 6.jpg') ってやればjpegに関連付けられたアプリで 6.jpg が開くから確かめてみたら?
- 848 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:01:01 ]
- あとは
dir /x とか
- 849 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:08:43 ]
- >>847
6.jpgについてはエラーが出ましたが、2.iniは開かれました。 >>848 6.jpg、2.iniいずれも出ませんでした
- 850 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:16:26 ]
- 2.iniがでてきたってことは、ファイル自体はあるってことだよね?
でもdirでは出てこないのか・・・謎だ・・・ require 'win32ole' fso = WIN32OLE.new('Scripting.FileSystemObject') fso.GetAbsolutePathName('2.ini') とかしてみたら?
- 851 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:27:40 ]
- >>850
さきほどまでのフォルダではなくtempフォルダのパスが出ました。 今度はそのtempフォルダで start 2.ini を実行しましたが開かれず、dirでも見つかりませんでした
- 852 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:35:45 ]
- とりあえずスクリプトに
$KCODE = 'SJIS' を付けて実行してみるべき FileSystemObjectで見えているパスはWindowsで見えているパスなので fso経由で2.iniが見えているのにdirで見えないのは、ちょっと不思議
- 853 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:48:34 ]
- $KCODE = "SJIS"を付けてみましたが特に変わりないようです
(ただ、コンソールの作動場所のせいかスクリプトの保存場所のせいかまた別のパスが返ってきましたが) >>850のスクリプトはなにを意味するのですか?2.iniの代わりに適当な文字列を入れてもパスが返ってくるのですが・・・
- 854 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 02:49:29 ]
- まだいるかな?
attrib *.* はどう?
- 855 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 02:52:21 ]
- なんかの拍子にシステムファイルになったんじゃない?
フォルダオプション→表示→保護されたオペレーティング〜 のチェック外してみ
- 856 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 14:46:40 ]
- dir で出てこなくて dir /a で出てくるなら
存在はしてるけど何らかの属性がついてて、そのせいでエクスプローラーに表示されないだけだな
- 857 名前:デフォルトの名無しさん [2010/01/23(土) 15:10:59 ]
- ./hoge.rb を実行するときに例えば ./hoge.rb --debug のようにしてデバッグモードにして
そのときだけ状態メッセージを print するためにはどのようにするのは ruby 的にエレガントでしょうか?
- 858 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 15:12:05 ]
- もはやRubyとは関係ないな
- 859 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 15:43:41 ]
- >>857
読み手にとっていちばん妥当なもの require 'logger' @log = Logger.new(@logfile||$stdout) @log.debug "debug log message" if @log 書く人が楽だがメソッド名に独り善がり感またはどや顔が滲み出たもの def D(msg) return unless @debug_output @debug_output << msg @debug_output << "\n" end @debug_output = $stderr D "debug log message" 後者のタイプで def LOG(msg) を時々見る
- 860 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 17:54:08 ]
- >>859
ありがとうございます! 後者のDをDoyagaoとして使いたいと思います(違)^A^K二つの視点から例を出していただきとても参考になりました!
- 861 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 18:59:49 ]
- >>841です
>>854-856 2.iniがシステムファイルとして存在していました。相変わらず6.jpgは見つかりません。
- 862 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 19:46:16 ]
- どこにだよ
tempか? 最初のフォルダの中のファイルは全部連番に変わったのか? tempのファイルも全部か?
- 863 名前:デフォルトの名無しさん [2010/01/23(土) 21:43:18 ]
- ブロックスペシャルファイル(readするとバイト列が得られます)の長さを
調べたいのですが、実際にreadすることなしにこれを実現する方法はありますか? パッと思いついたのは、openしてからファイルの末尾にseekして 先頭からのpositionを得るという方法ですが、他にはありますか。
- 864 名前:863 [2010/01/23(土) 21:46:20 ]
- 例えばこんな感じです:
File.open("/dev/sda") do |io| io.seek 0, IO::SEEK_END io.pos # /dev/sda のバイト列の長さ end
- 865 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:49:18 ]
- 関数の外で@も@@も付けずに定義した変数はいったいどこに保存されるのでしょうか?
x = 10 def func x = 20 end func puts x #=>10 これがxが20にならないので、最初に定義したxはグローバルには見えないどこかに閉じ込められてるのかな。
- 866 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:50:04 ]
- >>863
完全にUNIX/Linuxプログラミングの話題じゃまいか
- 867 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:51:41 ]
- >>866
を、Rubyで実現するにはどうすればいいですかという話だろう
- 868 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:53:55 ]
- >>865
変数のスコープという概念を勉強してくれ ごく端的に説明すると消えるというか、スコープを抜けるとアクセス不可になって取り出す手段がなくなる def の「中」のローカル変数は def の「外」からはアクセスできない だからメソッドの引数で「中」に入れてメソッドの返り値で「外」に出す
- 869 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:57:27 ]
- File.statでサイズ読めないかね
- 870 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:02:55 ]
- 俺もそうおもた
- 871 名前:863 [2010/01/23(土) 22:03:17 ]
- >>869
やってみたのですが size = 0 になっています。 statコマンドで調べても0バイトになっています。 そもそも、ブロックスペシャルファイルのバイト列の長さって、デバイス依存な気がします。 つまり「ファイルサイズ=バイト列の長さ」は成り立たない、ということかも知れません。
- 872 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:03:31 ]
- $ sudo ruby -e "p File.stat('/dev/sda')"
#<File::Stat dev=0xe, ino=5003, mode=060660, nlink=1, uid=0, gid=6, rdev=0x800, size=0, blksize=4096, blocks=0, atime=Sat Jan 23 18:12:33 +0900 2010, mtime=Sat Jan 23 18:12:33 +0900 2010, ctime=Sat Jan 23 18:12:55 +0900 2010>
- 873 名前:863 [2010/01/23(土) 22:06:31 ]
- >>872
ふむ、、やっぱり size = 0 ですね。。 バイト列の長さがデバイス依存(つまり不定値)なのは、よく考えてみればわかります。 /dev/null は常に長さ0ですし、/dev/zero は無限大。 難しいです。。
- 874 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:11:19 ]
- そもそもなににつかうん
- 875 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:12:16 ]
- やっぱりUNIXスレで聞いたほうがいいと思うんだ
カーネルとファイルシステムの知識が必要だし Ruby初心者スレで聞くような話題じゃないよ
- 876 名前:865 mailto:sage [2010/01/23(土) 22:18:31 ]
- >>868
ありがとうございます。 ただ、自分が不思議に思ったのは、外から関数内の変数にアクセスできないことではなく、 関数の外の変数に内側からアクセスできてないことです。 一般的に内側から外側の変数にはアクセスできると思うので。 x=20の段階で、外側の変数に代入するのではなく、新しい変数を作ってしまっているのが不思議なんです。
- 877 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:18:59 ]
- >>876
変数のスコープという概念を勉強してくれ
- 878 名前:863 [2010/01/23(土) 22:19:06 ]
- >>874
LVM の論理ボリュームのスナップショットを自動で作成しようかと。 ただし、論理ボリュームの大きさが: ・Xバイト以下だったら、それと同じ大きさのスナップショットを作成 ・Xバイトより大きければ、Xバイトのスナップショットを作成 という処理をしたかったのですが、論理ボリュームの大きさを調べるために 外部のコマンドに投げるのは嫌だったので、どうせならデバイスファイルの中身の大きさを調べちゃえ、みたいな感じです。 >>875 すみません、そうします。 カーネルの知識はありませんが。。
- 879 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:22:19 ]
- はいさよなら
|

|