[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 23:56 / Filesize : 233 KB / Number-of Response : 880
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 33



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

830 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 14:34:48 ]
>>801

831 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 17:50:52 ]
riっていらないよね

832 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 17:58:09 ]
rubygem パッケージマニュアルとしての ri に関しては、「とりあえず入れておく」というようなもんでもないな既に
現時点で ri を利用してないのなら、 --no-ri で飛ばしてOK
基本的にロクなこと書いてないしソースを grep したほうがおおむね速いので、rdoc もなくてもいい
rdoc がきっちりしているライブラリのみ、マニュアル読む機会があるときだけ rdoc コマンドで構成するか、
あるいはネットで公開されてる rdoc を読めばいい

833 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:04:47 ]
refeはいるけど、riはいらない

834 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:13:46 ]
デフォで--no-ri -no-rdocしても特にデメリットはないね
インストール速いしディスクアクセスも少なくて済むしいいことだらけ

835 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:37:04 ]
俺は.gemrcに書いたが、デフォルトでそうであれ、とまでは思わない。


836 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:41:39 ]
自分の作るライブラリにはRDocをていねいに書く
自分がインストールするライブラリではrdocは使わない

837 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:46:04 ]
日本語でいいならコメント書くんですがー

838 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:54:48 ]
>>837
あちらさんの使ってるフォント自体に日本語文字がないから、本気で表示が崩れるぞ
外国語の文字も適当に表示できるフォントの認知度が高いのは日本くらいだ



839 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:59:50 ]
とりあえず日本語でコメントを書きまくり、英語の得意な人がプロジェクトに参加してくれることを祈るというのはどう
英語でコメント書くの大変だって言うような人が作るライブラリなんて、どうせ最初に使うのは日本人が主だろうしさ

840 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 20:14:17 ]
そうだな、とりあえず日本人向けオンリーででもまず本体クオリティ上げるのが第一かもしらん
英語ドキュメント書けないからと言って諦めるのはもしかしたら勿体無さ過ぎるかもしれない

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 ]
はいさよなら






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<233KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef