Ruby 初心者スレッド Part 27at TECH
Ruby 初心者スレッド Part 27 - 暇つぶし2ch112:デフォルトの名無しさん
09/04/07 00:51:25
ちゃんとするならWin32APIなんでしょうね
でも、お手軽じゃないなぁと
Thread.new{system 'hoge.exe'}
で、動いちゃってるので
まあいいかなとそのままです

>>109
すいません
私の場合は非同期に外部コマンドを起動したいだけなので
後々のコントロールできなくてもよいのです

でも、Windowsで >>77 みたいなことをRubyにさせようとすると
どうすればいいのでしょうね
Win32APIを駆使?
めんどくさそうだなぁ


113:デフォルトの名無しさん
09/04/07 01:17:57
>>112
CreateProcessするんじゃね?
使ったことないけど

114:デフォルトの名無しさん
09/04/07 09:31:01
1.8で、コマンドプロンプトを見せるな、という制限を課されるといろいろつらいな。
CreateProcessなりShellExecute(Ex)なりを直接叩くしかないと思う。

115:デフォルトの名無しさん
09/04/07 09:36:05
IO.popen(program, "w") とか

116:デフォルトの名無しさん
09/04/07 13:30:59
すみません。Cで拡張ライブラリを書くためにREADME.EXT.jaを
読んでいるのですが、次のような箇所があります。

> 既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を
> 使えば,Rubyの機能を実現している関数を直接呼び出すことが出来
> ます.
> # このような関数の一覧表はいまのところありません.ソースを見
> # るしかないですね.

これが書かれてから15年近く経った今でもそうなんでしょうか?
日本語・英語問わず、どこかに一覧表があれば欲しいのですが・・・。

117:デフォルトの名無しさん
09/04/07 18:07:07
rspec で BDD だとかなんかそんなのやってみようかなーと思ってるんだけど、
これってパブリックなメソッドの返り値しかチェックできないの?
いくつも小さなメソッドに分割された、ある程度フクザツなメソッド作ってる最中は役に立たない?

118:デフォルトの名無しさん
09/04/07 18:22:29
>>117

「作り始め」のメソッドの大きさはみんな一緒

119:デフォルトの名無しさん
09/04/07 18:34:39
tdiary 以外でテーマやスキンの充実した ruby アプリって何かありませんか。

120:デフォルトの名無しさん
09/04/07 19:31:53
Hiki

121:デフォルトの名無しさん
09/04/07 19:34:59
>>116
スレ違い

122:119
09/04/07 19:55:35
tdiary と同じテーマやスキン以外でお願いします><

MT や WP、Xoops みたいにド派手に変えられると嬉しいです。

Ruby ベースの CMS
URLリンク(diaspar.jp)
をみてもテーマ公開しているの少ないよね…。

123:デフォルトの名無しさん
09/04/07 20:01:41
>>117
RSpecでテストとか勉強しようと思ってずっと待ってるんだけど、そういう解説は見たことないね
なんかテストのなんたるかを知ってる人が自由に使ってる感じがして、ちょっと寂しい
個々のマッチャとかの動作はわかりやすいんだけど、実際にこれどう使うのよみたいな

124:デフォルトの名無しさん
09/04/07 22:08:10
モデル・ビュー・コントローラの知識がないとたぶんダメ

125:デフォルトの名無しさん
09/04/07 22:27:18
>>122
PinkyBlog

126:デフォルトの名無しさん
09/04/07 22:29:47
>>123
TDDは俺もよくわからんので勉強中。

書籍だと「10日でおぼえる Ruby on Rails入門教室」がTDDやりながら開発する解説があるらしい。
rspecかどうかはわかんないけど

Amazon.co.jp: 10日でおぼえる Ruby on Rails入門教室: arton: 本
URLリンク(www.amazon.co.jp)
URLリンク(images-jp.amazon.com)

127:デフォルトの名無しさん
09/04/07 22:43:56
RSpecでBDDやって遊んでるだけでも、17インチ液晶の左右分割では幅が足りないと強く思う

家でだらだらスクリプト書いてるだけだしこれくらいでいいじゃんとこれまでは思ってたけど、ちょうど足りない
少なくとも19が欲しい
大きめフォントをちょっと小さくしたけど、やっぱ足りん
うおー

128:デフォルトの名無しさん
09/04/08 01:22:05
>>116
URLリンク(doc.loveruby.net)
ずっと503
URLリンク(www.ruby-doc.org)
doxygenの自動生成だからヘッダ読むのとほとんど変わらない
URLリンク(www.nilab.info)
かなり古い、1.6.8

こちらの知る限り現状はこんなところ
loveruby.netが直れば一番いいんだろうけどずいぶん前から503のままなので期待薄

129:デフォルトの名無しさん
09/04/08 07:49:58
csvをMySQLに食わせるtsvにしたくてモゾモゾやってるんだけど
a = ["mesi", "kue", "", "unko"]
として
a.map do |x|
if x == ""
x = "\N"
end
end
の結果が
[nil, nil, "\N", nil]
となるのは何でなんでしょう。eachじゃダメだし。
つーか、["mesi", "kue", "\N", "unko"]にするステキな方法を
教えてくだしゃんせ。

130:デフォルトの名無しさん
09/04/08 08:12:54
ブロックつきの map{} は、ブロックの返り値で要素を置き換える
で、

irb> p (if 1 == 2 then "true!" end)
nil

else 節がない if 文で条件が偽だった場合の文そのものの返り値が nil だ
else を明示的に書くのがよい

a.map{|e| if e.empty? then "\n" else e end}

131:デフォルトの名無しさん
09/04/08 08:24:47
x = "\N" は x = "\N" の返り値がたまたま "\N" だったからたまたま動作しただけだな
ブロックつきメソッドは仮引数に代入することで動作するわけではない
[1,2,3].map{|x| x = x*2} というような書き方は誤りで、 単に返り値だけを [1,2,3].map{|x| x*2} のように書く

132:デフォルトの名無しさん
09/04/08 08:37:27
△ ブロックの返り値で要素を置き換える
○ ブロック内で最後に評価された値が要素と置き換わる

ブロックつきmapの「ブロックの返り値」は変換後の配列だ
ブロックで最後に評価された値のことをブロックの返り値と呼んではいけない

133:デフォルトの名無しさん
09/04/08 08:53:51
× if 文
○ if 式

公式でも if 文って書いてしまってるけどな
既存言語の影響は強い

134:デフォルトの名無しさん
09/04/08 09:30:31
Rubyでは文も式なだけであって、文を文と呼ぶのが誤りなわけではない。

135:デフォルトの名無しさん
09/04/08 09:59:47
最新のparse.yを見る限り、
symt→expr→arg→primary→if という流れになってるので、
ifは式です。

136:119
09/04/08 10:30:51
>>125
ありがと。
「CSS着せ替えテンプレートプロジェクト」の存在も知ることができて感謝。

137:デフォルトの名無しさん
09/04/08 10:49:01
少々お聞きします。
以下のソースにて、Ctrl+Cをトラップしようとして、

trap 'INT' do
 puts "TRAP!!"
 raise "ctrl+c"
end

loop do
 Kernel.sleep 1.5
end

実行してみたんですが、
Ruby win32 + コマンドプロンプト : OK
Ruby win32 + コマンドプロンプト + cygwin bash: OK
Ruby win32 + cygwin terminal + cygwin bash: x
Ruby cygwin + cygwin terminal + cygwin bash: OK

という結果になってしまいました。
Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか?

138:デフォルトの名無しさん
09/04/08 11:10:14
>>133-135
Rubyでの文は「カッコなしのメソッド呼び出しの引数よりも優先順位が低い式」のこと。


139:デフォルトの名無しさん
09/04/08 11:12:34
>>137
> Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか?

できてるだろ。
> Ruby win32 + コマンドプロンプト + cygwin bash: OK

非cygwinプログラムからはcygwin terminalはttyには見えないので、
Ruby win32 + cygwin terminal ではできない。


140:デフォルトの名無しさん
09/04/08 11:25:04
>>139
ごめん。コピペミス・・・

> Ruby win32 + コマンドプロンプト + cygwin bash: OK

Ruby win32 + コマンドプロンプト + cygwin bash: x

ていうか、調べてたら cygwin から nativeアプリに(non-cygwin app) Ctrl+Cは鬼門みたいですね…。

141:デフォルトの名無しさん
09/04/08 14:04:44
>>133
○if文
◎if式

こうでしょ?
例えば関数呼び出しは式であり文でもあり。

142:デフォルトの名無しさん
09/04/08 14:07:16
とりあえず一つだけ。
初心者スレに過度の原理主義はあんまりよくない。
やりたいなら、本スレにコピペでも持って行って存分にやればいいと思うんだ。

143:デフォルトの名無しさん
09/04/08 14:19:15
すまんかった。正直ifの扱いはどうでもいいんだけど
「文は返値を持たないものだけを指す」と言わんばかりなのが気になって。
初心者スレだけになおさらね。

144:デフォルトの名無しさん
09/04/08 14:20:23
文が値を返すのって感覚的にも不自然だと思う
if は if 式と意図的に呼ぶべき
初心者スレならなおさら、初期の用語の統一は非常に重要
URLリンク(www.google.com)
URLリンク(www.google.com)
うおー負けてるー

145:デフォルトの名無しさん
09/04/08 14:20:39
式の一部になれないのが文だっけ?

146:デフォルトの名無しさん
09/04/08 14:22:08
ifが式ってのが、Rubyの特徴のひとつだもんな。

147:デフォルトの名無しさん
09/04/08 14:27:06
「if 式」のほうが実態をよく表してるし勘違いの元にもならないし興味の取っ掛かりにもなる
つい口に出るもんなので仕方ないが、なるべく式と言うべきだと思った

ちなみに、 for なんかは式だったかどうかをよく覚えてないので
「制御構造 for」とかいう表現で逃げたりする
大人は汚いね!

148:デフォルトの名無しさん
09/04/08 14:30:52
>>145
あっちにレスした
スレリンク(tech板:50番)

149:デフォルトの名無しさん
09/04/08 14:31:38
>>145
スレリンク(tech板:50番)
> ( ) で囲めばなんでも式の一部 (primary) になる。

150:149
09/04/08 14:31:58
>>148
ごめん_| ̄|○

151:デフォルトの名無しさん
09/04/08 14:40:39
Cなどの既存言語の経験者が戸惑わないようにif文って呼んでるのに
その辺の事情を無視してif式って呼ぼうってのは、悪しき原理主義だよなあ

そういやこの前「関数って言うな」なんてのもあった
あれも根っこは一緒か

152:デフォルトの名無しさん
09/04/08 14:41:59
>>151
既存言語の経験者が同じだと勘違いするほうが問題とか、
少しも思わない?

153:デフォルトの名無しさん
09/04/08 14:44:53
初心者が引かない程度に抑えるのが肝要ってことでどうだろうか
スレの使い分け大事

154:デフォルトの名無しさん
09/04/08 14:55:49
>>151
なんで違うものをわざわざ同じ名前で呼んで混乱させようと思うわけ?

155:129
09/04/08 15:14:57
>>130-131

thx!

156:デフォルトの名無しさん
09/04/08 15:38:31
マニュアルの最初の説明でそう書いてある場合は、Rubyでは

            無理せずに

そう呼べばいいじゃんね
無理して別の名前で呼ぶ理由もなかんべ

157:デフォルトの名無しさん
09/04/08 15:48:45
>>117で話が出たので自分用スクリプトでちょっとやってみた
小さなメソッドひとつにつき正常と境界と例外で8つくらいずつテスト項目作る羽目になって非常にめんどくさい

別なとこ改造してもspecのテストさえ通ればとりあえず他への影響を忘れて次のことをしていいというのは気楽

158:デフォルトの名無しさん
09/04/08 16:45:49
a.map!{|s| s.sub(/var/, 'foo')} をもっと短く書く方法ってありますか?

なくてもいいのですが、なんか ruby ならありそうな気がして。

159:デフォルトの名無しさん
09/04/08 17:01:14
>>158
特にない
あと String#sub 系列はできれば sub(/var/){'foo'} と書いてくれ
これは Ruby の構造的欠陥だが

160:デフォルトの名無しさん
09/04/08 17:03:10
何十万回も置換を行うような場合は sub のブロック生成コストが気になるお年頃

161:デフォルトの名無しさん
09/04/08 17:04:58
{'foo'}あるいは{"foo#{1}bar"}程度のような単純なブロックは最適化してほしいもんだ

162:デフォルトの名無しさん
09/04/08 17:11:09
>>159
その構造的欠陥について詳細キボンヌ

163:デフォルトの名無しさん
09/04/08 17:51:27
後方参照するときに$1か\1か迷ったり
\をいくつ重ねればいいのか非常にわかりにくいという問題はある。

後方参照しないときまでブロックで書く理由は知らない。
転ばぬ先の杖じゃないかと思うけど、それなら理由書いたほうが。

164:デフォルトの名無しさん
09/04/08 18:01:30
単に構造的欠陥と言ってみたかっただけです。

165:デフォルトの名無しさん
09/04/08 18:09:02
ユーザーは何も悪くない以上、構造上の欠陥ではあるような気はする

166:デフォルトの名無しさん
09/04/08 18:31:02
そんなことよりもさー

require 'spec'
require 'logger'

class C
attr_accessor :log
def err
log.info('error!') if log
raise
end
end

describe "C" do
before :each do
@obj = C.new
end
describe "#err" do
it "ログにエラーの旨が記録されランタイムエラーが発生する" do
sio = StringIO.new ; @obj.log = Logger.new(sio)
lambda{lambda{@obj.err}.should change(sio, :to_s).from('').to('error!')}.should raise_error(RuntimeError)
end
end
end

これをかっちょよく書く方法教えておくれよ
最初は
lambda{@obj.err}.should change(sio, :to_s).from('').to('error!')
lambda{@obj.err}.should raise_error(RuntimeError)
って書いて上の行で例外が飛び出てうまくいかないって質問しようと思ってて、
書き込む寸前に lambda を2重にすることに思い至ったんだけど、なんかあんま普通っぽくないんだよねこれ

167:デフォルトの名無しさん
09/04/08 18:57:00
> これをかっちょよく書く方法教えておくれよ

高いスーツを買って、ポルシェで高級ホテルに乗り付け、
最上階のレストランでノートPCを開いて書く。

168:デフォルトの名無しさん
09/04/08 18:59:25
何という昭和w

169:デフォルトの名無しさん
09/04/08 19:02:56
> これをかっちょよく書く方法教えておくれよ

走ってくるトラックの前に飛び出して、
僕は死にません!Rubyが好きだから!僕は死にません!

で、泣き止んで家に帰ってから書く。

170:デフォルトの名無しさん
09/04/08 19:05:35
何という昭和からの平成w
っていうか平均年齢おかしいだろこのスレ

171:デフォルトの名無しさん
09/04/08 19:12:38
いま従事している ruby のプロジェクトで、
ソースファイルの改行コードがばらばらになっていることに気づきました。

開発は Windows、本番環境はLinuxです。
Linux の LF に合わせようと思いますが、質問です。

Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか?
たとえば、Windows 上で、改行コードが LF のソースを動かす、など。

もし問題ないのならば、そのままにしてしまおうかなとも考えています
(sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)

172:デフォルトの名無しさん
09/04/08 19:20:16
なんか精神的に嫌だな。

173:デフォルトの名無しさん
09/04/08 19:31:29
>>123
RSpecの書籍がでるらしい。今はpdf版が無料で読めるみたいだ。
RSpec 本 1 章のメモ - たかみやの日記
URLリンク(d.hatena.ne.jp)

174:デフォルトの名無しさん
09/04/08 20:58:07
質問させてください、Rubyで日本語を扱いたいと考えています

Rubyのバージョンは1.9.1です("ruby -v"を実行すると"ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]"とでます)
PCはWindowsXPHomeEditionSP3 を利用しています(Vistaでも使いたいです)、コードの実行はコマンドプロンプトで行っています

やりたいことは日本語と英語の文字列の含まれたファイルから特定の文字列を正規表現で指定し置換することです
しかし、最初からいきなりつまずいてます
まず、以下のコードが実行できません
puts "あ"

実行すると、"invalid multibyte char (US-ASCII)"と表示されます
rubyのソースコードはUTF-8で保存しています

また、日本語の含まれたファイルを読み込み中身を表示しようとして以下のコードを実行しました
filename = ARGV[0]
puts filename
File.open(filename, "r:utf-8") do |file_input|
file_input.each do |line|
puts line
end
end

しかし、日本語の部分が文字化けして表示されてしまいます(puts filenameの部分は日本語でも正常に表示されます)
ソースコード、読み込むファイルともUTF-8で保存しています、また、読み込むファイルはファイル名に日本語を使っています

基本的な部分かもしれませんが、ネットで検索しても対策が良くわかりません
アドバイスや情報をいただけると助かります、よろしくお願いいたします


175:デフォルトの名無しさん
09/04/08 20:59:49
>>166
あ、それ逆
「例外 E と変化 C が起きる」場合は
 lambda{ obj.should change(C) }.should raise_error(E)
ではなく
 lambda{ obj.should raise_error(E) }.should change(C)
の順番で書いてくれ
前者は raise_error が満たされた時点で終了してしまって change が検証されないよ

それが証拠に、StringIO#to_s は StringIO オブジェクトを返して change(sio, :to_s) は失敗するはずなのに
何も起こってない

176:デフォルトの名無しさん
09/04/08 21:00:39
>>174
Ruby1.9.1 をアンインストールして Ruby 1.8.7 を使え

177:デフォルトの名無しさん
09/04/08 21:00:44
>>174
URLリンク(jp.rubyist.net)
マジックコメントを書きましょう

178:デフォルトの名無しさん
09/04/08 21:11:56
サポートしてくれるものが無い場合は>>176が正解
1.9.1を解説してくれる何かを頼りに学習してる場合はここで躓く可能性はないわけで、
つまりは1.9.1を教えてくれる教科書に該当するものを持ってないってことで
そういう場合は無理せずに1.8.7を使ってRubyに慣れるのが吉

一生のうちに1種類の言語しか学習できない呪いがかかってるとかそういう場合は別途相談

179:174
09/04/08 21:14:45
レスありがとうございます
>>176
できれば最新版を使いたいのですが、1.8系は1.9系より日本語の使用が楽なのでしょうか?

>177
マジックコメントを記述した結果
puts "あ"
は実行できました!
しかし、残念なたら表示は文字化けしたままです
また、日本語を含むファイルの文字化けも直りません
表示するときに、文字コードを指定するような方法はないのでしょうか?
よろしくお願いいたします

180:デフォルトの名無しさん
09/04/08 21:21:43
最新版だって判断できるくらいRubyに習熟してるなら自力でやれ

181:デフォルトの名無しさん
09/04/08 21:24:37
>>179
Ruby1.9では文字列はそれ自身がエンコードを持っていて
入出力などで必要なら自動で文字コード変換が走る
しかし、コンソールへの標準出力では自動変換はなされないので
必要なら(Shift_JIS以外の文字列を出力するなら)自分で変換する(1)
あるいは、自動変換が走るようにIOの設定を変える(2)
のいずれかの対処が必要
らしい

(1)
puts line.encode("Windows-31J")
(2)
$stdout.set_encoding(Encoding.default_external)
$stderr.set_encoding(Encoding.default_external)


182:181
09/04/08 21:29:30
結果は同じだけど、(1)のほうも
puts line.encode(Encoding.default_external)
のほうがいいかな

183:デフォルトの名無しさん
09/04/08 21:33:02
>>181
初心者に後者勧めるとかマジキチ

184:デフォルトの名無しさん
09/04/08 21:40:31
初心者向け書籍は1.9.2になるまで出ないんじゃないかと最近は思う

185:174
09/04/08 21:59:21
レスありがとうございます
おかげさまで、無事できました

def my_puts str
puts str.encode(Encoding.default_external)
end
なる関数を作成し、putsの代わりに使用しています

これから、日本語を含んだ正規表現の利用を試します
また何かありましたら、よろしくお願いいたします

186:デフォルトの名無しさん
09/04/08 22:03:12
Windows版のコンソール(cmd.exe?)への出力を諦めれば、相当楽になるような気がする。
例えばファイルにそのまま出すとか。
敢えて茨の道を進む>>185(>>174)に祝福あれ。

187:デフォルトの名無しさん
09/04/08 22:06:30
1.8.7なら倍のスピードで学習できるけどな
悲惨だ

188:デフォルトの名無しさん
09/04/08 23:26:28
nkf で変換とかだめなの?
by 初心者

189:デフォルトの名無しさん
09/04/08 23:36:08
nkfじゃutfがだめじゃない?

190:デフォルトの名無しさん
09/04/08 23:36:51
UTFも扱えるけど標準出力に書き出すたびにNKF呼ぶんだぞ
死ぬほど面倒じゃないか

191:デフォルトの名無しさん
09/04/09 00:12:04
>>190
何その Ruby 1.8 以前を全て敵に回した発言

192:デフォルトの名無しさん
09/04/09 00:42:28
以前と未満を間違えるとプログラムは動かないぞ

193:デフォルトの名無しさん
09/04/09 01:34:11
<バージョン>Ruby 1.8</バージョン> <時間>以前</時間>
<バージョン>Ruby 1.8</バージョン> <バージョン>未満</バージョン>

194:デフォルトの名無しさん
09/04/09 03:04:54
本題とはズレるけど、
cygwin を入れ、cygwin 付属のターミナルを使わずに UTF-8 Teraterm の cygterm で
コンソールを開き、Teraterm のコンソールの出力の文字コード(Kanji (receive) を UTF-8 にすると、
プログラムが UTF-8 で標準出力に出力しても、読めるようになる。

cygwin 入れる場合は、環境変数 PATH で、
cygwin 付属の ruby より mswin32 の ruby の方が前に来るように気をつける。

というか Linux で ruby 勉強した方が余計なところに躓かない気がする。
Linux なら、OS の文字コードも UTF-8 だし。

195:デフォルトの名無しさん
09/04/09 08:30:52
a = [1, 2, 3, 4, 5]

# no1 p a.inject(0) do |sum, x| sum += x end
p a.inject(0) { |sum, x| sum += x }

なんでno1では以下のようなエラーが出るんでしょうか?
/tmp/r.rb:20:in `inject': no block given (LocalJumpError)
from /tmp/r.rb:3:in `each'
from /tmp/r.rb:3:in `inject'
from /tmp/r.rb:3


196:デフォルトの名無しさん
09/04/09 08:41:13
URLリンク(www.ruby-lang.org)


197:デフォルトの名無しさん
09/04/09 08:44:38
p するからだ
do~end ブロックを関数的メソッドに渡したい場合は引数全体を ( ) で括れ
理由は省くが、空白の有無でパースがコケている

198:デフォルトの名無しさん
09/04/09 09:28:12
do~endと{}では結合度が違う

do ~ end → おおもとのメソッドに結びつく
{ ~ } → 直前のメソッドに結びつく

no1ではブロックがpに結びついてるからだろう

199:デフォルトの名無しさん
09/04/09 10:27:52
つまり、最初のは

p(a.inject(0)) {|sum, x| sum += x }

と見なされとるわけよ

200:デフォルトの名無しさん
09/04/09 11:42:51
>>171
> Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか?
> たとえば、Windows 上で、改行コードが LF のソースを動かす、など。
これは問題ない。
というか標準添付のライブラリはすべてLFになってるはず。少なくとも最新版では。
逆の場合、ruby自身は行末のCRを捨てるという処理が入っているので問題にはならない。
行末以外のCRは単なる空白扱い。
ただし、shebangはruby自身ではなくカーネルで処理されるので、
#!/usr/bin/ruby^M
などとなっていると "/usr/bin/ruby\r" というコマンドを実行しようとするので動かない。

> もし問題ないのならば、そのままにしてしまおうかなとも考えています
> (sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)
つ dos2unix


201:デフォルトの名無しさん
09/04/09 11:57:14
>>194
いやーそれが、win32のプログラムをcygwin上で動かすと不具合あったりしますよね…。
Ctrl+C押すとcygwinアプリには届くけど、ネイティブアプリには届かずに落ちちゃったり。
(Railsスレにも書きましたけど)

まあ結局は、仮想環境か専用サーバーかのLinuxにターミナルでつなぐか、
coLinux、andLinuxでも入れろやってことになりそうですけども


202:デフォルトの名無しさん
09/04/09 12:08:53
ひとつ質問いいですか?
kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか?
けっこう特に後者に(俺が)未だにハマるんですよ。

MLのログみると、trap:kconvにあるような半分バグ的仕様だけど、変更点としては大きいからそのまま、
みたいな感じですが。

kconvで-m0とか-Xはずすような、
モンキーパッチみたいなのってないんでしょうか?

203:デフォルトの名無しさん
09/04/09 12:21:07
いまだにkconv使ってるやつのほうが博物館行きだからじゃないかな

204:デフォルトの名無しさん
09/04/09 12:32:04
> kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか?
x nkf の -m0(MIMEデコード)
o nkf の -m(MIMEデコード)

>>203
ええええ('A`)
なら、String.toutf8 みたいなユウワクに駆られるようなメソッド用意しとくんじゃねーよヽ(`Д´)ノ ウワァァン!!


205:デフォルトの名無しさん
09/04/09 14:24:57
>>200
レスどうもありがとうございます。参考になりました。
改行コードが混在したソースの状態でも、とりあえず問題なく動くということで安心しました。

shebangの問題は大丈夫です。
今回はRails + Rubyによるバッチで、Linux上で shebang で起動される
ソースは、ただしく LF になっていました。

206:デフォルトの名無しさん
09/04/09 15:15:05
すごい初歩的な質問です。

URLリンク(www.ruby-lang.org) を読むと、default を持たなければ nil を返すとのことなので、

h = {}

if h['a'].nil?
  p "ok"
else
  p "ng"
end

は ok が出て分かりますが、

if h['a']['b'].nil?
  p "ok"
else
  p "ng"
end

は  undefined method `[]' for nil:NilClass (NoMethodError) になります。
これを ok に出すにはどう書けばいいのでしょうか?


207:デフォルトの名無しさん
09/04/09 15:17:53
if h['a'] && h['a']['b'].nil?
  p "ok"
else
  p "ng"
end


208:デフォルトの名無しさん
09/04/09 15:28:12
もうこれは100回でも書こうと思う

Ruby に 2次元配列(そして多次元配列)は存在しない
a[0][1] は「2次元配列 a の 0, 1 番地」ではなく
配列 a の [] メソッドに引数 0 を渡した返り値のオブジェクトの [] メソッドに引数 1 を渡した返り値、
すなわち

  tmp = a[0]
  tmp[1]

という2段階のアクセスを縮めたもの、または単なる

  a.[](0).[](1)

というメソッドチェーンだ

209:デフォルトの名無しさん
09/04/09 15:31:50
しかし誰も配列の話はしていなかった

210:デフォルトの名無しさん
09/04/09 15:36:17
>>209
現象は一緒じゃん
要はメソッドチェーンが切れてるだけだし、メソッドチェーンのレシーバがnilになりうるときと対処が全く同じ

n次元配列のクラスを標準で添付しなかったのは悪意だと思う

211:206
09/04/09 15:53:32
>>207-210
ちょっと衝撃的な事実。大変勉強になりました。

多次元がなく、判定が if h['a'] && h['a']['b'].nil?  と煩雑としたら、
多次元を扱わない別の方法でデータを扱っているんですか?

212:デフォルトの名無しさん
09/04/09 15:54:00
けっこういろんな人が困ってるな、2次元構造のコレクションの nil 問題
「データに nil があるとエラーになります」とか苦しい説明をしてる人も…

213:デフォルトの名無しさん
09/04/09 15:57:02
デフォルトでおすすめできる多次元配列のライブラリもないしな。

214:デフォルトの名無しさん
09/04/09 16:04:49
>>211
概念的にも構造的にも多次元ではないので「配列のネスト」「ネストしたハッシュ」などとお呼びくださいまし

で、Ruby ではいわゆる番地でコレクション(配列、ハッシュ)にアクセスすることはそう多くない
コレクションの each メソッドを使って枚挙するか、そういうアクセスを基本としてデータ構造を考える

んが、配列のインデックスやハッシュのキー決め打ちでネスト先にアクセスすることも多くて、
「あ、そうか、最初のが nil になればこれってエラーか、めんどくさいなあ」と言って
h[key1][key2] が h[key1] && h[key1][key2] になるのは日常茶飯事

だから、もし、本当に、番地による多次元アクセスが大量でメインな仕事をするつもりなのなら、Ruby は使わないほうがよい

215:デフォルトの名無しさん
09/04/09 16:05:46
ここでサクッと2次元配列みたいに扱うハックがキボン

216:211
09/04/09 16:09:40
>>214
ひやー。パラダイムシフトが求められるのですね。
ありがとうございます。

217:211
09/04/09 16:15:20
僕もハッカー待ちます><

218:デフォルトの名無しさん
09/04/09 16:31:37
def nested_fetch(array, *indexes, &ifnone)
 ifnone = lambda{|idx| return } unless block_given?
 indexes.inject(array){|ary, idx| ary.fetch(idx, &ifnone) }
end

こんなん?

219:デフォルトの名無しさん
09/04/09 16:32:28
h = {}
h['a']['b'] = "hello"

をする定石はなんでしょうか?

220:デフォルトの名無しさん
09/04/09 16:37:57
誰でもわかる勘違いのない方法

h = {'a' => Hash.new}
h['a']['b'] = "Hello"

「ハッシュにあるキーでアクセスしてキーが存在しなかった場合、特定のオブジェクトを代わりに作ってそのキーに対する値とする」
という動作をさせることもできるが、読むのめんどい
どっかで書いたので誰かが書くと思う

221:デフォルトの名無しさん
09/04/09 16:42:26
自動でHashをネストしてもらう
 h = Hash.new{|t, k| t[k] = {} }

登録してないkeyだと確認して自分でHashを入れる
 h = {}
 (h['a'] ||= {})['b'] = "Hello"

あらかじめ一段目のkeyを知っている
 h = {}
 ['a', ...].each{|k| h[k] = {} }
 h['a']['b'] = "Hello"

だいたいこのどれか。
イメージするデータ構造によって好きなのを選んでくれい。

222:デフォルトの名無しさん
09/04/09 16:43:35
あーあった

h = Hash.new{|h,k| h[k] = Hash.new}
h['a']['b'] = "Hello"
p h
p ['undef']['unset']
p ['undef2']

結果
{"a"=>{"b"=>"Hello"}}
nil
{}

ただ、おそらく、多くの場合、Ruby でこれを使うのはそもそも間違いで、
データ構造を考え直したほうがよいとは思う

223:デフォルトの名無しさん
09/04/09 16:45:34
>>220
早速ありがとうございます。その「ハッ(略」にも興味があります。

それは

h = {'c'=>"aa"}
h['a']['b'] = 'hello'

の場合、h['c'] を消さない方法でしょうか?

224:218
09/04/09 16:45:58
連投すまん。こんなんとか。

def nested_fetcher(collection, n_dimension)
 lambda{|*keys, &ifnone|
  ifnone ||= lambda{|idx| next }
  keys.size == n_dimension or
   raise ArgumentError, "wrong number of arguments (#{keys.size} for #{n_dimension})"
  keys.inject(collection){|c, k| c.fetch(k, &ifnone) }
 }
end

ifnoneを渡さないならブラケットで見た目的にも。
f = nested_fetcher(array, 2)
f[0, 0]

225:223
09/04/09 16:47:52
>>220-222
ありがとうございます!

>>221 の方法で >>223 は実現できたので取り下げます。

うーん。確かにどれも直感的な方法ではないので、別のデータ構造を考えます。

226:デフォルトの名無しさん
09/04/09 16:48:29
ハッシュを構造体の代わりとして用いることは
是か否か、について教えてくさい。

227:デフォルトの名無しさん
09/04/09 16:50:52
メンバが有限ならStruct、そうでないならHashという私見です。

228:デフォルトの名無しさん
09/04/09 16:55:00
とりあえず否

構造体用のクラスがRubyには用意されているため。

これが満足できない回答なら、情報小出しにすんなといいたい

229:デフォルトの名無しさん
09/04/09 16:56:30
>>226
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /

他の言語の構造体に完全に該当するクラスはRubyにはない
>>227のように Struct が標準でついてくるが、
ぶっちゃけ「つけた名前のメソッドでもアクセスできるなにやら便利な配列」以上の使われ方はしないので好きにしれ
Struct を使って怒る人は特にいない

230:デフォルトの名無しさん
09/04/09 16:58:32
h = {'c'=>"aa"}
(h['a'] ||= {})['b'] = "Hello"

がうまくいったので、

h = {'c'=>"aa"}
ha(h, 'a', 'b', 'hello')

したら

{'a'=>{'b'=>'hello'}, 'c'=>'aa'}

が返ることを期待して

def ha(h, a, b, key)
  (h["#{a}"] ||= {})["#{b}"] = key
end

としたのですが結果が hello です。
なぜでしょうか。。。


231:デフォルトの名無しさん
09/04/09 16:59:09
[ 0, 0, [] ]

こういうのがあってイラっとした。
しかもコメントがない。死ね。

232:デフォルトの名無しさん
09/04/09 17:02:15
haの返り値は最後に評価された式つまりその代入式の値。
代入式の値は右辺の値。
早とちり乙。hはちゃんと変わってるはず。

233:デフォルトの名無しさん
09/04/09 17:03:33
>>230
よくわからないものを無理して使うからよ

234:デフォルトの名無しさん
09/04/09 17:05:48
>>233
自分で泥臭くでも作れば間違いないのにね
借り物を使うから、どう動作してるのかがわからなくなる…

235:デフォルトの名無しさん
09/04/09 17:07:42
イディオムを教えるっていうのは、それを分解して
どういう動作なのか調べて自分の肉として取り込んでもらうってことだと思ってた。

236:230
09/04/09 17:08:49
>>232-233
ほ、本当だー。ありがとうございます。

Perl/PHP と比べると不思議ですが、面白いですねー。
>>221-222, 224 などなど理解できてないので精進しますです。


237:デフォルトの名無しさん
09/04/09 18:45:05
>>202
お前は俺か、ってくらい、昨日同じことで悩んでた。

>>203
今は何使うのが常識なのか教えてー。 1.8.x で。

238:デフォルトの名無しさん
09/04/09 18:53:58
常にh['a']['b']などと二段階でしかアクセスしないなら、そもそもHashをネストさせる意味はない。
h[['a', 'b']] = "Hello"
とでもしとけ。

239:デフォルトの名無しさん
09/04/09 18:58:03
うわぁ・・・

240:デフォルトの名無しさん
09/04/09 19:10:01
ベンゾウさんの中・・・

241:デフォルトの名無しさん
09/04/09 19:21:44
>>238
rails の select ヘルパーが <select name="a[b]"> という名前になるんです。

なので params['a']['b'] が空の場合とかの処理に必要で。

rails はどうなっているんだろうなぁ。

242:デフォルトの名無しさん
09/04/09 19:47:30
param["a"]["b"]にアクセスするときって
["a"]が無い時点で処理続行不可能なパターンが大抵だから
returnなりraiseなりでさっさと脱出してるな。railsはしらね。

return unless param["a"]
if param["a"]["b"]

243:デフォルトの名無しさん
09/04/09 19:47:57
そもそも、別にkconvやNKFが時代遅れなんて事はないと思うが
今でも主流って位には使われてるはず

244:デフォルトの名無しさん
09/04/09 19:50:00
>>207の方式が一番素直だな。

245:デフォルトの名無しさん
09/04/09 23:16:04
params['a']['b'] rescue nil

246:デフォルトの名無しさん
09/04/10 12:36:18
eval ってなんて読むの?

247:デフォルトの名無しさん
09/04/10 12:41:50
>>246
イバル
evaluate のことなのだから、イバル

日本では evaluate を踏まえてもなお「えばる」と読まれてる気がするので
もうエバルでいいよという気がするが、本来はイバルと読むべき

ちなみにイーバルは「俺の昼飯シャキヴェントゥー」並に間違ってカッコわるい表現なので避ける

248:デフォルトの名無しさん
09/04/10 13:24:21
   _,,-ー----.、 
 <"      "l 
  '; ,、、__ソ^`7, i、 
  ';'___  _,,, リ 
   トーj 'ーー r 
   ヽノL ヽ ノ  < シャキヴェントゥー
    ヽ∀ /  
     ー'   

249:202
09/04/10 13:27:30
kconv直したのを作ろうと思うんだけど(gem化しとくと便利かね)
名前何がいい?

250:デフォルトの名無しさん
09/04/10 13:30:36
jconv

251:デフォルトの名無しさん
09/04/10 13:36:48
>>249
kconv2

252:デフォルトの名無しさん
09/04/10 13:42:26
ちょっと質問。
ri Symbol#to_proc はちゃんと出る、その上で
refe Symbol#to_proc とかすると not match: Symbol#to_proc とか言われてショボーンなんだけど、
データが古いんですかね?

あと、このrefeのデータベースを一発で更新するコマンドてないの?

refeはGemsで入れたものです。0.8.0.3の最新版



253:デフォルトの名無しさん
09/04/10 13:48:54
jconv: japanese character converter ?
kconv: kanji character converter ?
kconv2: kanji character converter 2?

2はともかく、japanese とか kanjiとかどうなんん?と思ったけど
そもそも外人は、UTF-8かASCIIかだろうし、使わんかw

254:デフォルトの名無しさん
09/04/10 13:57:35
EUC-JPとJISとShift JISとUTF-8の相互変換に、
Japanese以外のどんな需要があるというのか

255:デフォルトの名無しさん
09/04/10 14:07:07
>>254
一応、 Latin の文字と UTF-8 文字の変換の需要はある
日本人ジャナイヨモードにした場合はSJIS/EUCはLatinだとみなして変換してくれるとか

256:デフォルトの名無しさん
09/04/10 15:15:17
>>252
Gemのrefeはもう手付かず。
なんでかってーと るりま のDB引くコマンドになったから。

257:デフォルトの名無しさん
09/04/10 17:16:59
>>256
kwsk

258:デフォルトの名無しさん
09/04/10 17:26:38
URLリンク(doc.loveruby.net)

259:デフォルトの名無しさん
09/04/10 18:17:15
きばる

260:237
09/04/10 21:10:20
>>243
なるほど。とりあえず安心して使えそうです。

>>249
wktk

261:デフォルトの名無しさん
09/04/10 21:23:19
>>250には、iとkの間って意味もありそうなのは、実装的に無茶振りか

262:デフォルトの名無しさん
09/04/11 01:16:16
2画面になってて
一方がIRB, 他方がグローバル変数の内容一覧みたいなツールってない?
そういう環境で電卓みたいな感じで使いたいんだけど。

263:デフォルトの名無しさん
09/04/11 02:04:10
グローバル変数って内容が長大なもの(gem使用時の$LOAD_PATHとか)が
あるから、常に表示ってのはかえって使いづらくない?

代用として ~/.irbrc にこう書くのはどうか。
def g
puts global_variables.map { |v| %Q|#{v} = #{eval "#{v}"}| }
end


264:デフォルトの名無しさん
09/04/11 03:14:02
>>262
ためしに作ってみた
望みのものかどうかはわからないけど
URLリンク(www2.wbs.ne.jp)

まず、WindowsのActiveScriptRubyが前提です。環境が違ったらごめんなさい
既存のツールにウォッチ式もどきウィンドウをつけたものです
本物のirbではありません
グローバル変数をすべて表示するのはあまりにも見づらいため、
add_watch(変数名)、remove_watch(変数名)で監視する変数名を個別に追加する仕様にしました
すべてのグローバル変数が欲しければ、eval.rbの__getDbgInfo()内をコメントされてる行と
差し替えみてください


265:264
09/04/11 03:27:46
補足

readmeにも説明あるけど、
起動直後は JScript モードで動作します
ruby の入力を受け付けるためには
#cs ruby
としてモードを切り替えてください

266:デフォルトの名無しさん
09/04/11 05:22:31
フリーのレンタルサーバーで
最初からrailsがインストールされている
タイプって、スピードはどうなの?

267:デフォルトの名無しさん
09/04/11 09:38:44
>>266
どんなレンタルサーバーかによるな。

共有鯖はまずありえない。
VPSは小規模はあり、専用鯖ならあり。
(だけど、VPS、専用鯖でrailsがプリインスコって何か変な感じ。
大概、自分でOSまっさらからインスコするもんだろうから)

ただし、どちらにせよCGI駆動はありえない。
見なくちゃいけないところは、「railsプリインスコ」の他にどうやってそのRailsがその鯖で動くかってこと。
・apache + mod_rails(Passenger)
・apache + mod_proxy_balancer + mongrel

とかその辺

というか、railsインストールされているっていっても、必要なバージョンは自分で決めないといけないしな。
向こう側で指定されてても困ると言うか。
結局自分で入れるか、freezeして持ち込むハメになる。

詳しくはwebprog板のrailsスレか、レンサバ板で聞いたほうがいいと思う。

268:デフォルトの名無しさん
09/04/11 14:09:02
持ってるデータのなかにある、ある値を修飾して別の値にして返すというメソッドを作ります
データはとりあえずインスタンス変数として存在して、
ある値はたとえば「データがハッシュなのでキー指定して取得」とか「データが自作クラスなのでアクセサで取得」とかです

んで、修飾するメソッドに値を与える方法は、

 ・ メソッドに引数として明示的に渡す
 ・ メソッド内部でインスタンス変数を読ませる

のどっちが好ましいもんでしょうか
後者だとテスト作るのめんどくさいんですが

269:デフォルトの名無しさん
09/04/11 14:26:06
>>268
それについては他の言語で結論が出ている

 「事前にデータが読める程度にわかっている単純な場合、引数指定以外はおおむね糞であり、
  最初は楽でも最終的には引数を取らざるを得なくなるようになるので、素直に最初から引数で実装しとけ」


270:デフォルトの名無しさん
09/04/12 00:34:51
>>268の文章が読みにくいのでリファクタリングしてみた

インスタンス変数(ハッシュや自作クラス等)から値を取得、加工して返すというメソッドを作ります。
この時、値を取得するためのパラメータを渡す方法としてどちらが望ましいと思いますか?
・メソッドの引数として渡す。
 def func(key) ; "<h1>#{@data[key]}</h1>" ; end
・別のインスタンス変数にパラメータを代入し、メソッド内部からアクセスする。
 def func ; "<h1>#{@data[@key]}</h1>" ; end

271:デフォルトの名無しさん
09/04/12 01:10:10
↓現金1000万円が当たるチャンス!!

URLリンク(d39.decoo.jp)

272:デフォルトの名無しさん
09/04/12 13:58:11
>268
前者。
キーは引数として与えるか、メソッド名から与える(メソッド内で決め打ちとか動的生成とか)かの2択。
>270後者のような実装は、ゴミ。

URLリンク(pastie.org)

273:デフォルトの名無しさん
09/04/12 13:59:11
>>270
常識的にはこう。
def func(value) ; "<h1>#{value}</h1>" ; end
func(@data[key])


274:デフォルトの名無しさん
09/04/12 14:04:05
>>272
> class UpperCaseDecorator
> @map = nil
なんのつもりだ?


275:272
09/04/12 14:22:36
>274
ああ、そうか、Rubyはこれだとインスタンス変数じゃなくてクラスインスタンス変数になるんだったな。
コーヒーの飲みすぎで完璧に寝ぼけてた。

276:デフォルトの名無しさん
09/04/12 14:40:02
コーヒーと寝ぼけるの因果関係がわからん

277:デフォルトの名無しさん
09/04/12 16:13:31
>>276
自分のプライドのためにもRubyをよく知らずに口を出したことをなかったことにしたい、の意
ここでプライドが出てくるあたり致命的というか重症

278:デフォルトの名無しさん
09/04/12 16:16:52
ruby使いは割とプライド高いの多いよ。
信者である事が選民思想と一致するし。

279:デフォルトの名無しさん
09/04/12 16:27:52
Rubyが俺の脳にまったくフィットしない。汚染の概念とか部分的には好感が持てるが。
たぶん俺がPERLアレルギー持ちなのがいけないのかな。

280:デフォルトの名無しさん
09/04/12 16:36:30
単純に、昨晩コーヒー飲んで寝てなかったんじゃね?

281:デフォルトの名無しさん
09/04/12 16:39:42
>>279
そういうのは人それぞれだろうな。

おれはPHPをやってたとき
かなりモチベーションが下がってたなとRubyをやり出してわかった。

282:デフォルトの名無しさん
09/04/12 16:44:25
漏れもRubyやってたのがいつの間にかJavascriptにシフトしかけてた
またRubyに戻るべくリハビリ中

283:デフォルトの名無しさん
09/04/12 16:51:14
他を見下す奴が一番多いのはRubysit。他言語に限らず言語内でもな。
プライドが一番高いのはPerler。Rubyistと違って他にケンカ売ったりはしないが、俺最強と思ってる奴が多い。
PHPを使ってる「プログラマ」は特に言語に拘りのない奴だな。あと、そもそも心根がプログラマじゃない奴。

284:デフォルトの名無しさん
09/04/12 17:03:35
>>283
で、偉そうに印象批判してるお前は何者よ

285:デフォルトの名無しさん
09/04/12 17:05:28
matz

286:デフォルトの名無しさん
09/04/12 17:09:33
ていうかバトロワスレでやれ
スレリンク(tech板)l50

287:デフォルトの名無しさん
09/04/12 17:22:24
>>286
そこはいちおう言語を語るスレだから、
デタラメな理屈と幼稚な精神をフル回転させて
大勢の人間にレッテル貼っちゃう生き物は不要。

288:デフォルトの名無しさん
09/04/12 17:36:09
>>276-280
コーヒー飲みすぎると、カフィイン中毒になるからそれじゃない?
1日10杯以上飲む人は頭痛とかうつとかに気をつけたほうがいい。詳しくはwikipediaいけ

289:デフォルトの名無しさん
09/04/12 18:26:20
俺はもっぱら日本茶だ

290:デフォルトの名無しさん
09/04/12 18:26:40
>>287
隔離スレの分際で存在意義に文句言うな

291:デフォルトの名無しさん
09/04/12 18:27:19
リプトンのティーパック100個入り300円ぐらいの
あれで紅茶中毒になりますた

292:デフォルトの名無しさん
09/04/12 18:59:37
>>290
隔離しているものの種類が違う。

293:デフォルトの名無しさん
09/04/12 19:32:34
100個入り300円ってどこで買ったんだよ

294:デフォルトの名無しさん
09/04/12 19:42:11
ここで Java 厨のおれが登場
(C、VB、PHP、Perl はいちおう書ける)

オライリーの「初めてのRuby」を読み終わったところだが、
Ruby おもしろい
Python より頭に入りやすい

295:デフォルトの名無しさん
09/04/12 19:48:43
>>290
いや、あれ掃きだめだろ
なんでも入れちゃっていいんじゃないかな

ということにして
>>294
Rubyが本題じゃなけりゃ言語比較ネタは>>286でどぞ

296:デフォルトの名無しさん
09/04/12 19:51:45
>>293
わたくし嘘をついておりました
100バッグで600円ちょいだね

リプトン ブリスク ティーバッグ
URLリンク(www.askul.co.jp)

297:デフォルトの名無しさん
09/04/12 20:08:40
インスタンスメソッドとクラスメソッドの使い分けがわからなくなった
クラスのオブジェクト関係なく、引数を受け取って適当に加工して返すメソッドはクラスメソッドでいいかな

でもそうするといわゆる「メソッドから処理を切り出したメソッド」は一律でクラスメソッドであるほうがいいよね

298:デフォルトの名無しさん
09/04/12 20:13:35
そのクラスのインスタンスを生成しなくても実行できるメソッドがクラスメソッド。
インスタンスごとに振る舞いが異なる必要がない場合、クラスメソッドにする場合が多いかな。

299:デフォルトの名無しさん
09/04/12 20:15:52
>>268の考えを推し進めるとそうなりがちだ
Rubyのクラスは他の言語のクラスと違って「処理のなんとなくのカタマリ」である場合が少なくないからな
モジュールで十分なのにクラスにしてしまう例が散見されるというかあんま深く考えてねえ
引数でのやり取りだけで十分で、クラスのインスタンスの役目が薄い場合は困りもん

300:デフォルトの名無しさん
09/04/12 20:20:33
as-a関係をmixinを使わずに実現するときとか。hasじゃなくてasね。

301:デフォルトの名無しさん
09/04/12 20:26:33
こんな話? puts Html.new(:title => 'タイトル', :body => '本文だよ!').html で使う
class Html
def initialize(param)
 @title, @body = [param[:title], param[:body]]
end
def title; "<title>#{@title}</title>"; end
def body; "<h1>#{@title}</h1>\n<p>#{@body}</p>"; end
def html
 return <<EOF
<html>
<head>#{title}</head>
<body>#{body}</body>
</html>
EOF
end
end

class Html
def initialize(param)
 @title, @body = [param[:title], param[:body]]
end
def html
 return <<EOF
<html>
<head>#{Html.title(@title)}</head>
<body>#{Html.body(@title, @body)}</body>
</html>
EOF
end
def self.title(str); "<title>#{str}</title>"; end
def self.body(tit, str); "<h1>#{tit}</h1>\n<p>#{str}</p>"; end
end

302:デフォルトの名無しさん
09/04/12 20:36:02
class Html
def initialize(param)
 @title, @body = [param[:title], param[:body]]
end
def title(str); "<title>#{str}</title>"; end
def body(tit, str); "<h1>#{tit}</h1>\n<p>#{str}</p>"; end
def html
 return <<EOF
<html>
<head>#{title(@title)}</head>
<body>#{body(@title, @body)}</body>
</html>
EOF
end
end

一番普通一般無難だと思われるコレが出ないのはなんでなんだぜ
いや、まあ、インスタンスに全く依存しないからインスタンスメソッドである強い必然性はないというのは正しいが

インスタンスメソッドから呼ばれるだけの、インスタンスメソッドから処理を括り出しただけのメソッドは、
あんまり深く考えずにインスタンスメソッドで作ってしまってもいいと思うなあ

クラスメソッドは
「インスタンス内部で使ってるけど、あんまりにも便利だから外部にも単体で公開しちゃうよ!」
という意図があるべきだと、漠然と思ってる

303:デフォルトの名無しさん
09/04/12 20:43:13


              ?




304:デフォルトの名無しさん
09/04/12 20:53:37
>>302
URI.escape とか?
クラスに属するユーティリティとしてのクラスメソッドは立ち位置が曖昧過ぎ
parse みたいにインスタンスを返すクラスメソッド以外は Util モジュールとかに吐き出すのが素直

305:デフォルトの名無しさん
09/04/12 20:54:43
>>296
やすっ!

紅茶も飲みすぎたらカフェイン中毒になるから気をつけてなw
ウーロン茶とかも注意

306:デフォルトの名無しさん
09/04/13 00:27:28
CPU使用率とメモリの使用率を取得できますか?
ゲームの簡易的なベンチマークを作ろうとしているのですが…

307:デフォルトの名無しさん
09/04/13 00:30:04
>>306
Rubyとしては特にできません
OSに直接聞いてください

308:デフォルトの名無しさん
09/04/13 00:37:01
Ruby 本体では無理だな
rubygem の sys-cpu とか使えないかね
あれは使用率とか検知しないんだっけ?

309:デフォルトの名無しさん
09/04/13 11:38:09
配列 arr に入った文字列を元にメソッドを呼び出したいのですが、
下記では `method': wrong number of arguments (0 for 1) になります。
どのように書けばいいのでしょうか。

class C
def self.m1
"1"
end

def self.m2
"2"
end

def self.m3
"3"
end
end

arr = %w[m1 m2 m3]
arr.each{|method| p C.method} #=> 1, 2, 3 と出ることを期待

310:デフォルトの名無しさん
09/04/13 12:07:13
C.__send__ method

311:デフォルトの名無しさん
09/04/13 12:10:14
>C.method
これは
C.send :method
と同じ。といえばもう原因も解決方法もわかるよね?


312:デフォルトの名無しさん
09/04/13 12:11:06
なんでどいつもこいつもレシーバつきメソッドの引数にカッコつけないんだよ

313:デフォルトの名無しさん
09/04/13 12:15:46
>>310
あれ、自分のスクリプトでも__send__使った方がいいの?

>>312
省略できるから。できないときはしない。

314:デフォルトの名無しさん
09/04/13 12:35:27
>>313の2行のレスの関係性がなかなか味わい深い

315:デフォルトの名無しさん
09/04/13 12:37:26
Object#__send__ ではなく Object#send を使う人間がメソッドのカッコを極力省略するのはポリシーが一貫してる


と思う

316:デフォルトの名無しさん
09/04/13 12:45:01
>>313
send でなければならない強い理由がないのなら、日常的に __send__ を使う
他の誰かや未来の自分が send メソッドを C に定義しないとも限らないし

実質上 send が死にメソッドになるのが厄介といえば厄介
メール関連のライブラリくらいでしか再定義された send は見たことないけどな

317:デフォルトの名無しさん
09/04/13 13:03:10
括弧をつけるかつけないかの判断ってどんなのがいいんだろうな

候補

1.括弧必須以外は括弧をつけない
2.すべて括弧をつける
3.基本すべて括弧をつける。
ただし「p」など組み込まれたレシーバーを省略するメソッドは括弧をつけない。
当然、自分が書いたプライベートメソッドなどは省略しない。

4.仮引数は括弧を省略
5.仮引数は括弧をつける

6.IFなどはすべて括弧を省略できる場合、省略
7.IFなどはすべて括弧をつける

まだまだありそうだが。基本の基準を括弧つきかそうでないか、どちらにするかだな。

括弧をつけた方が思わぬ動作に遭遇する確率を低くできるのだが、
「p」とかにはつけたくない。
チームでやるときは、ごちゃごちゃになるからできるだけ標準化したい。うむむむ。

318:309
09/04/13 13:21:15
__send__ でできました。ありがとうございます。

319:デフォルトの名無しさん
09/04/13 13:25:27
>>316
$stdoutとSTDOUTの関係みたいな、sendに機能を加えたり
差し替えたりするための冗長性だと思ってた。
「再定義」がまったく別のメソッドにするという意味しかないなら
存在意義ないよなあw

>>317
規約が必要な状況だと3・5・6の前田流が無難。
URLリンク(shugo.net)
意図した返値ならreturnを省かないとか地味に大事。
論理演算子は少し腑に落ちないけど、優先順位でトラブりやすいんだろうな。

320:デフォルトの名無しさん
09/04/13 14:18:02
>>319
前田って人はこの人か?
URLリンク(jp.rubyist.net)

知らんかった。サンクス、参考にするわ。

321:デフォルトの名無しさん
09/04/13 15:06:39
__send__: とにかく絶対にリフレクションでメソッドを呼びたい
send: 基本的にただメソッドを呼ぶだけのつもりだけど、中でどうするかはレシーバに決めて欲しい
とかかな。

pとかrequireとかにカッコはつけたくない。
けどs2 = s1.sub(/hoge/, '') とかにはつけたい。
ってことで右辺値かどうかが一番でっかいと思う>カッコの省略

322:デフォルトの名無しさん
09/04/13 15:18:33
えーと…、

  __hoge__

とアンダースコア前後2個つきで書く意図自体は他の言語でも有名だし理解してもらえてるよね?
既存の hoge 、またはユーザー定義の hoge と被らないように「普通ありえない名前」にする、という意図

323:デフォルトの名無しさん
09/04/13 15:33:15
>>322
他人に理解してるか聞く前に、自分がスレの流れを理解できるてるか自分の心に聞け

324:デフォルトの名無しさん
09/04/13 16:23:31
gem でインストールした各種ライブラリのソース、ドキュメント(Rdoc?) は、ローカルPCのどこに格納されるのでしょうか?

たとえば Rails の rescue.rb というソースを見たい場合、
URLリンク(api.rubyonrails.org) の左のペインから ActionController::Resuce をクリックして
URLリンク(api.rubyonrails.org)
を見ると、HTML の上に In: vendor/rails/actionpack/lib/action_controller/rescue.rb と
表示されますが、これがどこかわからない。

自分は Ruby を c:\ruby\ruby-1.8.5-i386-mswin32 にインストールしていて、
以下のように rails をインストールした。
gem install rails -v 2.1.1 --include-dependencies

んで、c:\ruby\ruby-1.8.5-i386-mswin32 の下で、"rescue.rb" を検索したら、

c:/ruby/ruby-1.8.5-i386-mswin32/lib/ruby/gems/1.8/gems/actionpack-2.1.1/lib/action_controller/rescue.rb

が見つかったのですが、これがソースの実体ですか?

In: vendor/rails を、ローカルのどのように読み替えたらいいのかわからないです。

325:デフォルトの名無しさん
09/04/13 16:36:07
gem environment gemdir で出てくるディレクトリが vendor で、 その下の固定 gems ディレクトリが rails ディレクトリだな
rubygem ライブラリのソースを参照することが多くなると思うが、全ては gemdir 以下に入ってる

326:デフォルトの名無しさん
09/04/13 16:38:12
>>323
__send__ は send が被らないように作ったメソッド名だ、という指摘のどこが変?
__ つきメソッドが何か特別扱いの動作をする予約名メソッドだという勘違いは初心者によくあるぞ?

327:デフォルトの名無しさん
09/04/13 16:57:21
そんな指摘してねーだろカス

328:デフォルトの名無しさん
09/04/13 16:57:38
結局 >>322 はひとりごとってこと?
内容の是非は別にして

329:デフォルトの名無しさん
09/04/13 17:06:15
>>326
指摘の内容が変とかそれ以前の話で、
お前は誰に指摘したんだ?ってことでしょ。

330:デフォルトの名無しさん
09/04/13 19:25:15
配列の最初の要素だけ別処理をしたいです
どう書くのが普通?

331:デフォルトの名無しさん
09/04/13 19:30:48
>>330
result << first_only(arr[0])
arr[1,-1].each do |e|
result << usual_process(e)
end

こんな感じが普通だと思う
「あー最初の要素だけ別扱いしたいんだなー」と読み下せる

332:デフォルトの名無しさん
09/04/13 19:55:34
f = File.open(ファイル)
  # いろいろする!
f.close

closeメソッドを呼んだ時点で、データはフラッシュされていると考えてよいのでしょうか?
それとも明示的にflushメソッドを呼ばないとダメですか?

333:デフォルトの名無しさん
09/04/13 19:58:20
普通かどうかは知らないけど(dupしてから)shiftで最初の要素と残りの配列に分けてる。

334:デフォルトの名無しさん
09/04/13 20:00:09
>>332
IO#close は IO#flush を呼ぶ
IO.open のブロックは終了時に IO#close を呼ぶ

ということで、たとえば書き込んだファイルを別名でコピーしたいような場合は、
close またはブロック終了後にcp を行うべき
Ruby では close メソッドを使うことはあまりないので、ブロックを使う記法に慣れてくれ

335:デフォルトの名無しさん
09/04/13 20:02:04
arr[1,-1]

これ、おれはあんまり受け付けないなあ
each_with_index使って、
indexが0のときは別処理みたいな方が自然な気がするが

336:デフォルトの名無しさん
09/04/13 20:02:09
>>334
わかりました。ありがとうございます。

337:デフォルトの名無しさん
09/04/13 20:10:34
配列がアホみたいに大きい場合、

res << first(a[0])
a[1..-1].each do |e|
 res << rest(e)
end

は配列のほぼ丸ごと複製が行われるのであんまりよろしくない

a.each_with_index do |e, i|
 res << i.zero? first(e) : rest(e)
end

が無難な動作だが、1要素目から最後まで比較する余地なく偽が続くのが若干キモい

res << first(a[0])
1.upto(a.size+1).each do |n|
 res << rest(a[n])
end

というのを思いついて、これは配列 1個で比較も 0回でおそらく高速だが、偏狭的だなと思う

338:デフォルトの名無しさん
09/04/13 20:17:55
apt で ruby を入れたら /usr/bin/ruby や /usr/lib/ruby 以下に
入ったのだが、事情により
ln -s /usr/bin/ruby /usr/local/bin/ruby
して使っていたところ、 gem で入れたものが /usr/local の方に入ってしまって
地味に驚いたことがある。

339:デフォルトの名無しさん
09/04/13 20:24:42
def each_specialize_first(collection, at_first)
 iter = collection.each
 at_first.call(iter.next)
 loop{ yield(iter.next) }
end

each_specialize_first a, lambda{|e| ... } do |e|
 ...
end

とか。

340:デフォルトの名無しさん
09/04/13 20:29:59
普通はどうするもんか、という質問にメソッド定義しちゃう人って何なの

341:デフォルトの名無しさん
09/04/13 20:30:34
top = a.shift
a.each {|x| }
a.unshift top

今はコレが好み。整数を手繰ってどうのこうの、
毎回ゼロか調べてどうのこうのはお腹一杯。
shiftとunshiftってい対応がすき。

342:デフォルトの名無しさん
09/04/13 20:31:34
>>340
熱狂した痛い初心者
つまり、過去の自分

343:デフォルトの名無しさん
09/04/13 20:33:41
>>341
キューって知ってる?

344:デフォルトの名無しさん
09/04/13 20:36:18
一度shiftしたものは最後までshiftするべきだと思う
shiftした時点でそれは配列ではなくqueueなんじゃないかと

345:デフォルトの名無しさん
09/04/13 20:37:17
>>343
オハヨ

346:デフォルトの名無しさん
09/04/13 20:47:09
前にもこんな話あったな。queueだと言い張りたいならQueueクラス作れよw

347:デフォルトの名無しさん
09/04/13 20:52:37
配列の要素をshiftしてunshiftするってのは筋が悪いの?

348:デフォルトの名無しさん
09/04/13 20:58:04
>>346
arr[0] と arr[1..-1] で用が済むというか全く同じ動作のはずなのに、
わざわざ shift という名前のメソッドを使うのなら、その配列はキューであるという意図があるはずだろ

349:デフォルトの名無しさん
09/04/13 21:06:09
>>347
配列を pop や shift や push してたら、スタックやキューとして使われてるのかなあ、とは思う
そういう風に使ってないのに、たとえば 0要素目だけを取り出して s に代入するだけの目的で

  s = array.shift

と書いてあったら、ちょっと混乱するかも

350:デフォルトの名無しさん
09/04/13 21:07:48
>>348
ねーよw
同じ動作で別の名前を使うことに意味があるなら
Array#sizeと#lengthの違いを教えてくれよ

>>349
副作用があるからそれはない

351:デフォルトの名無しさん
09/04/13 21:11:15
>>146
キューとして使うという想定も有るとは思うがその言い方はおかしくね?
Array#firstというメソッドが存在する理由はArray#[]のある場所をランダムアクセス的に拾ってくるという意味じゃなく
先頭から要素をいくつか取り出すという意味をコードに持たせる為と解釈している。
それと同様に先頭から要素を切り出す、という意味をコードに与えたいならばshiftを使うのが適切じゃね?

ところでこれはどうかな?
isfirst = true
a.each do |e|
res << isfirst ? first(e) ; isfirst=false : rest(e)
end
数値による範囲指定と数値比較を無くしてみた。がキモさは消せないなあ

352:デフォルトの名無しさん
09/04/13 21:12:08
アンカミスorz
>>348ね。
なんでこんな訳わからんミスしたんだか

353:デフォルトの名無しさん
09/04/13 21:12:52
配列かどうか? 型に拘るのはRubyらしくない。
shiftできるのならそれはshiftできる何かだ!

354:デフォルトの名無しさん
09/04/13 21:14:38
>>350
array をそれ以降使わないのなら動作する

 heading = html.scan(/<h1>(.+?)<\/h1>/).flatten.shift

こんなのとか
1ヶ月くらいずっと、この手の使い捨て配列の最初と最後の要素アクセスを shift と pop でやってた俺が証人だ
試してみるとわかるが非常にめんどくさいので試してみなくてもいい

355:デフォルトの名無しさん
09/04/13 21:16:57
>>354
それこそまさに、なぜArray#firstとArray#lastを使わないっていう

356:デフォルトの名無しさん
09/04/13 21:17:17
>>349
> 0要素目だけを取り出して s に代入するだけの目的で
>  s = array.shift

なにかに代入すうるだけならさすがに
a.firstかa[0]でしょw

取り出すってのが、今の流れの上では大事な特徴。

357:デフォルトの名無しさん
09/04/13 21:20:47
a[0],a[1,-1]とかa.shiftとかしちゃうと、要素0個の配列で例外でるから、
>351とかが無難かね。


358:デフォルトの名無しさん
09/04/13 21:22:27
>>357
配列が 0個でない、とかのチェックはしてあるという前提でいいと思うなあ
配列が空なのにエラー出さずに処理が進むほうが嫌なことが多いと思う

359:デフォルトの名無しさん
09/04/13 21:31:50
配列が空じゃないか?を追加したらどんどんすっきりした記述からかけ離れていく。

配列が 0個でない、とかのチェックはしてなくてもうまく動く方がいいよ

360:デフォルトの名無しさん
09/04/13 21:33:28
> 配列が 0個でない、とかのチェックはしてあるという前提

each_with_indexで回せばそんなの必要ないじゃんw
なんでわざわざ手間のかかる上に間違えやすいやり方を選ぼうとするの?

361:デフォルトの名無しさん
09/04/13 21:33:55
キューとスタックの概念をどう学んでるかに結構依存しそうな感じだ
shift って「pop で上から積んだもの」を下から取るイメージだろ
Ruby の配列を利用する場合は先頭を取り出して詰めるように実装されてるだけであって、
先頭を取り出して詰める目的に shift を使うのはやっぱ不自然だ

ってか、 shift と pop または unshift、push と言われて動作がピンと来るよな?

362:デフォルトの名無しさん
09/04/13 21:36:16
このshiftだキューだうるさい御仁は
shiftメソッドはキューでしか使っちゃだめとか言ってるの?
まさかね。

363:デフォルトの名無しさん
09/04/13 21:40:42
ary[1..-1] だと,書き込まない限り配列そのもののコピーされないので速い
unshiftすると要素をずらすので遅い


364:デフォルトの名無しさん
09/04/13 21:40:56
キューとスタックの話をしようとして、
上とか下とか言われても微妙だなw
それこそ固有の実装を前提にしてないか?

365:デフォルトの名無しさん
09/04/13 21:48:44
もともとの質問は>>330
一応な

366:デフォルトの名無しさん
09/04/13 21:59:48
単にこれはPerlとかの文化だろ。

先頭に対するのがshift, unshift
末尾に対するのがpop, push

367:デフォルトの名無しさん
09/04/13 22:01:28
もうshiftとかキューの話はいいんじゃないか。関係ないだろ。

368:デフォルトの名無しさん
09/04/13 22:10:55
で、カッコイイという理由で shift を使ったのが>>341


369:デフォルトの名無しさん
09/04/13 22:12:10
>>363は大嘘なので初心者諸君は忘れましょう

370:デフォルトの名無しさん
09/04/13 22:17:06
>>368
shift したものと shift で残ったものを別々に使うのはなんかキモいな

371:デフォルトの名無しさん
09/04/13 22:25:13
>>370
まあ、そのへんなんだろうな
想定されてる使い方とズレてることを気にする人と、ズレてることを気にしない人

372:デフォルトの名無しさん
09/04/13 22:31:10
アセンブラ上がり的には、
shift/unshiftは横にserializeされてるイメージで、
push/popは縦にstackされてるイメージだな。

373:デフォルトの名無しさん
09/04/13 22:49:02
アセンブラどころかCすらやったことないがそんなイメージだぞ

おれのshift/unshiftのイメージ

□□□□■■■■■■■

おれのpush/popのイメージ

    |
    □
  □□□
□□□□□

374:デフォルトの名無しさん
09/04/13 22:55:40
スタックをピラミッドで組むのは大方のイメージとずれてると思う
というか、てっぺんのアンテナは何だ

375:デフォルトの名無しさん
09/04/13 23:00:35
スタックっていったら重ねたお皿だろう

と思ったがRubyとか高水準な言語では
要素の大きさがバラバラなスタックってのもありな気がしなくもない

376:デフォルトの名無しさん
09/04/13 23:00:59
>>824
マジレスすると初めての場合はちゃんとしたローション使わないと痛さで糞ができなくなるぞ。
お勧めのローションはテンプレをみてくれw

377:デフォルトの名無しさん
09/04/13 23:17:50
>>374
真ん中を貫いてる棒だよ。
棒がないと下からひょいっと取り出せるじゃん。
ちなみに「□□□□□」は真ん中に穴があいてる円盤を表現してみた。

378:デフォルトの名無しさん
09/04/13 23:21:19
Perlから入った人はpush/pop/shift/unshiftはリスト操作
というイメージが定着してるからな。
アセンブラの人とはかみ合わないさ。


379:デフォルトの名無しさん
09/04/13 23:24:58
アセンブラとか関係なく shift や pop はキューとかスタックとかあのへんの操作だと思う

が、そういや Perl は shift や pop を常用していたような記憶がある

380:デフォルトの名無しさん
09/04/13 23:25:05
>>369
巨大な配列にa2=a[1..-1]とかやってメモリ使用量見てみろよ

381:デフォルトの名無しさん
09/04/13 23:27:04
言いたかないが、Ruby 特有の事情だぜ、
リストをイテレータアクセスする機能が標準でついてて while と shift のコンビが必要ないのとか

382:デフォルトの名無しさん
09/04/13 23:29:47
RubyのはPerlを継承したとして、Perlの場合、

shiftはシェルスクリプトのshift
push/popはプログラマなら常識のスタック操作の名前から
とここまではわかる。

unshiftは思いつくものがないんだが、
lwallは単にshiftの打ち消しとしてunshiftと名付けたのだろうか。



383:デフォルトの名無しさん
09/04/13 23:31:01
Cにungetcってあるな。


384:デフォルトの名無しさん
09/04/14 06:57:55
>>381
shift が本来の意味に集中できる余地があるのはいいことだな

>>380
「速い」「遅い」と書いてあるのでメモリ使用量は参考にならない
というか、Rubyの配列はオブジェクトへの参照のヒモが各要素のセルにどばーっとくっついたスダレみたいな箱だろ
その箱とヒモ自体を作る速度を問題にしてるんじゃないの
莫大な配列だと参照をコピーするだけでも時間がかかると
範囲オブジェクトやInteger#uptoで添え字を増減させてアクセスするなら参照の複製すら行われないから少なくともその分速いと

385:デフォルトの名無しさん
09/04/14 07:07:07
Array#shift はオブジェクトそのものは維持する

386:デフォルトの名無しさん
09/04/14 08:38:39
>>373 はスタックとハノイの塔を脳内でマージしている。


387:デフォルトの名無しさん
09/04/14 08:52:27
URLリンク(jarp.does.notwork.org)
if (first=true)..false and first
...
end


388:デフォルトの名無しさん
09/04/14 09:08:09
うおきめえ
というか実際に動かさないとなにやってるかわからんな(w

389:デフォルトの名無しさん
09/04/14 11:15:16
>>384
だからメモリの使用量見れば巨大な参照の列のコピー自体が起きてないことが分かるだろうに


390:デフォルトの名無しさん
09/04/14 12:26:27
>>384
> その箱とヒモ自体を作る速度を問題にしてるんじゃないの

箱ごとシェアするんだよ。これ実行してみろ。

a = [1]*10000000
t = Time.now
10.times { b = a[1..-1] }
p Time.now - t
t = Time.now
10.times { b = a[1..-1]; b[0] = 0 }
p Time.now - t

391:デフォルトの名無しさん
09/04/14 12:29:15
ブログラムコードに対する形容詞の「きもい」の意味がわからない

392:デフォルトの名無しさん
09/04/14 12:36:13
グロいってのはよく言うけど、それよりは褒め言葉に近いニュアンスがあるような気がする

393:デフォルトの名無しさん
09/04/14 12:40:44
{ } begin endが混在するのがキモイ
OOPLなのに関数があるのがキモイ

394:デフォルトの名無しさん
09/04/14 13:12:38
良いプログラムの定義を仮に「単純で美しく、論理的に明確ですっきりしている」とすると、
キモイというのは「動くことは動くが良いプログラムとはほど遠い」ということだろう。
大抵「なんでこんなことやってるの?」とか感じると思う。
知ってる知識を使うことが目的になって、かえってごちゃごちゃにするやつは割と見かける。

395:デフォルトの名無しさん
09/04/14 17:44:57
PRaggerのTracとPRagger wikiがあらされまくってんだけど、なんとかしろよ。
どこ言えばいいんだこれ。
更新してないのかもしれんが放置せず管理しろ。
今時スパムフィルターくらいいれろ。あと、メールかなんかで通知されるように設定しろ

PRagger - Trac
URLリンク(pragger.ikejisoft.com)

FrontPage - PRaggerまとめサイト それPra
URLリンク(garyo.sakura.ne.jp)

396:デフォルトの名無しさん
09/04/14 18:21:02
おいおい落ち着けよ






・・・ってRubyでPlagger使えたのかよおぉぉおおぉおぉおおおお!!!

397:デフォルトの名無しさん
09/04/14 18:54:59
>>395 IKeJIだろJK

398:デフォルトの名無しさん
09/04/14 21:03:18
RubyでPostScriptファイルの情報を取得して表示しようとしているのですが
RMagicで印刷枚数、部数、プリントサイズ、モノクロかカラーかって取得できますか?
ImageMagicをコマンドラインで動かすのは面倒なんですが、
RMagicは画像の加工でしか使えないですかね?

399:デフォルトの名無しさん
09/04/14 21:16:35
取得できる情報はここにあるだけかも。
URLリンク(studio.imagemagick.org)


400:デフォルトの名無しさん
09/04/14 22:43:49
>>390
へえ、なるほど
部分配列のコストなんて考えたこと無かったけど
元の配列とシェアするんですね
で、代入された時点で初めて完全なコピーが行われる
もとの配列の要素が増減した時にもちゃんとコピーされる
上手いこと出来てるなあ
require 'benchmark'
def bm(mes,&b) print mes;puts Benchmark.measure(&b) end
a = [1]*10000000
b =nil
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}
bm('部分参照'){b=a[1..-1].size}
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}


401:デフォルトの名無しさん
09/04/14 22:49:48
あ、間違ってた
bm('部分参照'){b=a[1..-1].size}
じゃなくて
bm('部分参照'){b=a[1..-1]}
でした

でも、参照した影響っていつまで残るんでしょうか
部分配列を参照して使い捨てた後でもコピーが起こってるみたいなんですけど
require 'benchmark'
def bm(mes,&b) print mes;puts Benchmark.measure(&b) end
a = [1]*10000000
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}
bm('部分参照'){a[1..-1]} #使い捨て
GC.start
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}


402:デフォルトの名無しさん
09/04/14 22:53:45
結局動作上は即レスの>>331が無難なのか

403:デフォルトの名無しさん
09/04/14 22:55:16
>>402
誰でもすぐ思いつく泥臭いのがうまくいくことも多いってことだな

404:デフォルトの名無しさん
09/04/14 23:00:41
ベンチマーク取ってみるとRangeとか使って添字で回すより、
部分配列でeachした方が速かったり

405:デフォルトの名無しさん
09/04/14 23:06:27
>>402
配列の要素が2つ以上無いと例外になるってばさ。
「最初の要素だけ特別な処理」って時に要素一つだけの配列を
渡されるケースもそんなにまれではなさそうに思うんだけどな・・・

なんか揉めてたが、動作的に無難っていったら>>341かもよw

406:デフォルトの名無しさん
09/04/14 23:10:10
>>405
いやそれなら配列以外を渡されるチェックもすべきだろ
Enumerable だけ対応して shift メソッドが定義されてなかったらどうする

407:デフォルトの名無しさん
09/04/14 23:12:21
うむ、rescue ブロックが100行くらいついてない時点でどれも論外だ

408:デフォルトの名無しさん
09/04/14 23:21:37
真珠を継承しちゃったおかげで、悪い所も継承しちゃった感じだな。
そろそろ反省して次の言語来る?

409:デフォルトの名無しさん
09/04/14 23:24:34
>>405
irb(main):001:0> [1][1..-1]
=> []

要素1つでも問題ない

410:405
09/04/14 23:24:51
なんか勘違いしてた。要素が一つあれば例外にはならないのね。
あと、その後のレスでもみんなさりげなく翻訳してるが、
arr[1,-1] は arr[1..-1] なのな。

>>406
お題が配列だし、そこまで行くと何もシンプルには書けないような(´・ω・`)

411:デフォルトの名無しさん
09/04/14 23:24:57
>>405
snippetとか例文とかそういう概念はないんか

412:405
09/04/14 23:26:57
なんか言い訳が間に合わなかったZE!
しばらくROMってます(´・ω・`)

413:デフォルトの名無しさん
09/04/14 23:28:37
要素が0個のときうまくいかねーって

414:デフォルトの名無しさん
09/04/14 23:54:38
a = [1,2,3,4,5]
top = a.shift
a.each {|x| p 1}
1
1
1
1
a.unshift top => [1,2,3,4,5]


a = []
top = a.shift
a.each {|x| p 1}
a.unshift top => [nil]


こうしてくだらないバグがこの世に一つ増えるのだった

415:デフォルトの名無しさん
09/04/15 00:17:16
プログラム関係ないけど、Ruby使いの人はどんなエディタ使ってるの?
gvim使ってるけどVisualStudioしか使ったことなかったから
インテリセンスなっしんぐのエディタは結構きついです・・・

416:デフォルトの名無しさん
09/04/15 00:20:24
NetBeansが続々とスクリプト言語に対応していってる。
でも型情報が無いからインテリセンス並のコード補完は期待できないな。

417:デフォルトの名無しさん
09/04/15 00:24:26
Aptana Studio。RDTとRadRailsね。

Rubyは変数の型を動的に変えられるから、
インスタンスメソッドだとインテリセンスはほとんど役に立たないよ。
クラスメソッドならOKだけど。ステップ実行は便利。

418:デフォルトの名無しさん
09/04/15 00:25:19
いまんとこ、対応してるIDEはNetBeansとEclipsだけですか?

419:デフォルトの名無しさん
09/04/15 00:31:01
Rubyならばここだぜ
URLリンク(www.tech-arts.co.jp)

420:デフォルトの名無しさん
09/04/15 01:09:54
>>414
「配列の最初の要素だけ別処理する」という仕様に対して、
長さ0の配列が渡されたら何もしないのが正しいと言い切れるの?

421:デフォルトの名無しさん
09/04/15 01:22:26
>>401
>参照した影響っていつまで残るんでしょうか

sliceすると、sliceされた配列も新しく出来た配列もシェア状態になる。
シェア状態になった配列を破壊的に変更するとコピーが起きる。
コピーがされたらシェア状態じゃなくなる。

というわけで、破壊的変更がされるまで。

422:デフォルトの名無しさん
09/04/15 01:24:15
以前からArrayはcopy on writeに違いないと訳もなく信じていたのだけど、
今回の話でちょっと興味を持ったので少し実験してみた。
もしかして一部分でも書き換えたら、巨大な配列だろうと丸コピーしてる?

irb(main):001:0> a = Array.new(1<<24) { |i| i } # メモリ使用量70MB程度
irb(main):002:0> b = Array.new(1<<8) { a[1..-1] } # メモリ使用量そのまま
irb(main):003:0> b.each { |e| e[0] = 1 } # たった256要素も変更できない
NoMemoryError: failed to allocate memory
from (irb):3:in `[]='
from (irb):3
from (irb):3:in `each'
from (irb):3
from :0

ソースを読むだけの気力も能力もないので適当なことを言わせてもらうけど
配列をブロックに小分けするようなことはしていないようにみえる。

ガチガチの配列ならともかく、RubyのArrayってどこにでも追加削除可能な
万能コンテナみたいだから、内部的にはある程度の長さのブロック(配列)と
ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。
それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?

423:デフォルトの名無しさん
09/04/15 02:05:38
>配列をブロックに小分けするようなことはしていないようにみえる。
その通り。

>ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。
>それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?

たぶん、ちゃんと検討されたことはない。でも、

- この最適化で速くなるRubyプログラムは少なそう(多いというなら説得が必要)
- わずかだろうけど遅くなるプログラムは結構ありそう(添字アクセス)
- 配列がflatなメモリだと期待している拡張ライブラリ(非常に多い)が動かなくなる

というあたりから、標準のArrayに組み込むのは微妙かなあ。
SparseArrayみたいな別ライブラリがいいと思う。やるとしたら。

424:デフォルトの名無しさん
09/04/15 03:07:21
java で、
Vector → ArrayList
さらに LinkedList や CopyOnWriteList と、言語のバージョンが上がるごとに List の派生クラスが増えていったように
Ruby も Array の派生組み込みクラスが作られていくかな?

Ruby の文化からすると、あまりそういうことはしなさそうだけど。

425:デフォルトの名無しさん
09/04/15 05:18:29
>>422
URLリンク(i.loveruby.net)

426:デフォルトの名無しさん
09/04/15 05:48:59
>>425

422じゃないけど、Rubyの場合は
基本的に変数はすべて参照になっているって事でいいのかな。

irb --prompt simple
>> a = [1, 2]
=> [1, 2]
>> b = a
=> [1, 2]
>> a << 3
=> [1, 2, 3]
>> a << 4
=> [1, 2, 3, 4]
>> b.size
=> 4
>> b
=> [1, 2, 3, 4]

この場合、aとかbってのはただのラベルで配列の実体は別の場所にあるってことでいい?

427:デフォルトの名無しさん
09/04/15 06:53:21
> 基本的に変数はすべて参照になっているって事でいいのかな。
いいと思うけど、俺にアンカーつける必要なくない?
他にもいい人はたくさんいるよ

428:422
09/04/15 08:15:18
>>423
組み込みオブジェクトの内部表現が変わってもスクリプト側には
影響ないと思ってたんだけど、拡張ライブラリが駄目なのか。

>>424の言うように派生クラスにするか、Arrayを初期化するときに
内部実装を選択するヒントとかパラメータを指定できるようになれば
面白いかなって思ったんだけど。


>>425
これ、Ruby Hacking Guideってやつだよね?
Webで見れたとは、こりゃありがたい。
後でゆっくり読ませてもらうわ。

429:デフォルトの名無しさん
09/04/15 08:32:04
初心者スレだったんだっけ

>>426
オブジェクトを「捕まえる」「入れておく」ことはできない
名前で参照するしかない
変数に対する = は、"右辺" の指すオブジェクトに新たなラベルをつける行為で、本当は「代入」ではない
irb> a = [1, 2]
irb> b = a
irb> a << 3
irb> p (a.object_id == b.object_id)
true

で、スレ的にもこれだけでいいと思うんだが、こっからがめんどい
irb> a = [1, 2, 3, 4, 5]
irb> p (a[0..2].object_id == a.object_id)
false

a と a[0..2] は違うオブジェクトなので、
  [1, 2, 3, 4, 5]
  と
  [1, 2, 3] ← a[0..2] が返す、できたてほやほや配列
という2つの配列オブジェクトが(Rubyの「オブジェクト置き場」に)存在しているように感じるが、実は
  [1, 2, 3, 4, 5] <共有済>
  と
  <注: id:3324 の配列を共有、0要素目から2要素目までを返す、ただし、破壊的変更が来たら配列内容をコピーして保持する>
という、1つの「share された」配列と1つの「share した」配列になってる
これらは自分が share 関係にある配列と自分が share 状態であるということを覚えていて、破壊的変更が自分に来たら share 関係にある配列にそれを通知する
通知または破壊的変更がきた場合の動作は
 ・ 自分が共有元(a)である場合は share 状態を解除し普通の配列に戻る(破壊的変更を自分が受けていた場合は受け付ける)
 ・ 自分が共有先(a[0..2])である場合は共有元の要素の参照をきちんと複製して share 状態を解除し普通の配列に切り替える
ということである、というようなてきとーな理解でいいか>>421
array.c を読めばなんか書いてあるのかね

430:デフォルトの名無しさん
09/04/15 08:40:40
この最適化が入ることで、逆にそれ以外のところが遅くなるはずだが、
配列って部分参照することってそんなにあるっけ?


431:デフォルトの名無しさん
09/04/15 08:43:53
>>429
ん、単純に

[ <id:0011>, <id:0013>, <id:0015>, <id:0018>, <id:0411> ]

という普通の配列と

[ a[0], a[1], a[2] ] # a が変更されたらオブジェクトIDの参照に切り替えること

の関係になるという話なんじゃないの?
や、こんな 2段階やるくらいなら最初から [ <id:0011>, <id:0013>, <id:0015>] という配列作っとけよ、という感じではあるんだが

432:デフォルトの名無しさん
09/04/15 10:03:58
お、おまいらここは初心者スレだぜ( ´ー`)y─┛~~ コウドナワダイデビビラスナ

433:デフォルトの名無しさん
09/04/15 10:19:32
>>420の分かってないっぷりにワロタw

434:デフォルトの名無しさん
09/04/15 10:24:56
>>431
オブジェクトにラベルを新たに付けるという行為が、
配列をインデックスで参照するように指定するという行為よりずっとコストのかかる行為であった場合には、
[ a[0], a[1], a[2] ] のほうが有効だと思われ
ホントのとこはどうなのかは知らない

435:デフォルトの名無しさん
09/04/15 10:28:46
また仕様バグか

436:デフォルトの名無しさん
09/04/15 10:56:44
require 'benchmark'

a = (1..1000000).to_a
Benchmark.bmbm do |bm|
bm.report('a に追加'){a.delete_at(0); a.push("s")}
end
a = (1..1000000).to_a
Benchmark.bmbm do |bm|
bm.report('部分参照して追加'){a[1..-1].push("s")}
end

結果:
               user   system   total    real
a に追加        0.050000  0.000000  0.050000 ( 0.048458)
               user   system   total    real
部分参照して追加  0.050000  0.010000  0.060000 ( 0.053062)

破壊的変更した際に別に遅くなるとも思えんのでバグではないな
部分参照だけをした場合が笑えるほど速いので問題は無い

…まあ、push しただけなのにdeleteとpushの2段階と同レベルの処理速度に落ちるということ自体
コードの見かけと実際の関係上あまりよくないという観測もなくはない気もするが
(つまり、「共有の配列」から「本当の配列」に変換される、Rubyの裏側の動作がかなりごっつい)

437:デフォルトの名無しさん
09/04/15 11:21:01
>>436
残念
遅いのは delete_at の部分
share の部分配列を通常の配列に変換する、というのは、
配列から要素を削除して詰める、という行為と大して変わらない

ちなみに、これがわりと速いぞ

a2 = Array.new
a2.push(*a[1..-1])

配列の一部分を得たい場合は配列のスライス arr[s..e] を使うほうがいい、ってことだな

438:デフォルトの名無しさん
09/04/15 12:41:21
エラーが出ても処理を止めず、最後まで実行するようにしたいのですが、どうすればよいでしょうか??
PHPのようにブラウザで実行したとき、エラーメッセージをエラーが出た部分に出力するようにしたいのです。
begin とか rescue を使えばできるのかな?と思っているのですが・・
ご教示頂けると幸いです。

439:デフォルトの名無しさん
09/04/15 13:20:37
>>438
エラーが出たってことはそれ以上処理ができないということ

で、まあ、使ってるフレームワークのヘルプでも読め
処理中に起こって止まる原因となった例外をWebブラウザ上に表示させる方法がたいてい載ってる

440:デフォルトの名無しさん
09/04/15 13:24:30
レスどもです。
PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね??
rubyだとエラーが発生したあとの処理はどう頑張ってもやってくれないということでしょうか?

441:デフォルトの名無しさん
09/04/15 13:32:47
とりあえず、いきなりCGI作るのやめろ
RubyはCGIを特別扱いしない
普通のコンソールのスクリプトでどういうことができるか勉強してからCGIやれ
きっとそっちのほうが早い

442:デフォルトの名無しさん
09/04/15 13:37:33
PHPはWebブラウザから入力してWebブラウザに出力する特化型言語だからなあ…

> PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね??
いいえ

443:デフォルトの名無しさん
09/04/15 13:49:20
PHPのエラーってWarningのこと言ってるの?
それ以上処理できなかったらPHPだって止まるよ

444:440
09/04/15 14:50:12
あそうか、warningの時は続けて実行してくれるけれど、fatal error の時はPHPでも止まるのか・・勘違いしてました、すいません。
ありがとうございますm(_ _)m

445:デフォルトの名無しさん
09/04/15 18:26:19
klassってなんですか><

446:デフォルトの名無しさん
09/04/15 18:27:25
klassの部分をclassに修正してみれば分かるよ

447:426
09/04/15 19:57:26
遅レスだが

>>429
だいたいその理解でおk
細かいこというと、共有元を破壊的に変更する場合は、シェア状態を解除
するのではなく、複製してそっちを指すようになる。つまり共有先と同じ

>>431,434
ちがう

448:デフォルトの名無しさん
09/04/15 21:36:05
>>445-446
clazzを使う流儀もあるな。


449:デフォルトの名無しさん
09/04/15 23:01:12
このスレってmatz, yugui, yarv, shugoさんとかが名無しで答えてたりするのかなぁ

450:デフォルトの名無しさん
09/04/15 23:26:03
少なくともよく答えてることはまずないと思う。
1~2週間スレを見てればわかる。答えてたら失望するわ、おれ。

451:デフォルトの名無しさん
09/04/15 23:29:00
ここまでMatzの自演

452:デフォルトの名無しさん
09/04/15 23:29:53
こんな金にならないスレに顔出すより、
ブログに何か書く方が大事だろw

453:デフォルトの名無しさん
09/04/15 23:34:02
しかし、こういう立場のひとってブログに大きな態度で書けないよな。
リーナス君のようにならないことを祈る。。

454:デフォルトの名無しさん
09/04/15 23:36:39
どっちもどっちのような

455:デフォルトの名無しさん
09/04/16 05:58:10
内容見ずに態度見るような馬鹿を気にしてもしょうがないよ。
有名になると、何書いたって行為と悪意を両方増やす結果になるし。

456:デフォルトの名無しさん
09/04/16 05:59:32
×行為 ○好意

457:デフォルトの名無しさん
09/04/16 09:03:10
>>449
Ruby1.9には2ch bot yarvを新装備!


458:デフォルトの名無しさん
09/04/16 10:00:57
RSpec で、 hogehoge.rb に対して hogehoge_spec.rb を作ったら、シェルの補完で

  hog <Tab>

と打って hogehoge.rb が一発で出るとかそういうのが阻害されてしまうから不便だ、という話をしたら

 spec ファイルは spec/ ディレクトリにまとめて入れろバカ

というツッコミが来た
知らんかった
でもこれって spec ファイルのほうからどうやってオリジナルのスクリプト読むん?

459:デフォルトの名無しさん
09/04/16 10:11:22
>>458
> spec ファイルは spec/ ディレクトリにまとめて入れろバカ
Rails on Rails の流儀だな
spec ディレクトリは自動で追加される環境の人だ
自力でどうにかできるものではないので、Rails で作ってないなら無視してよし
一応 File.expand_path とか File.dirname(__FILE__) とか駆使したファイルパスを require するようにすればなんとかなるとは思うが

460:デフォルトの名無しさん
09/04/16 10:23:47
>>458
俺の場合は __FILE__ を基準にして、他の場所のオリジナルを読むようにしてる
たとえばlibディレクトリなら

Pathname.new(__FILE__).dirname.parent.parent + 'lib'

で探す

461:デフォルトの名無しさん
09/04/16 10:27:58
RSpec使ったことないけど
補完の問題だけを考えるとspec_hogehoge.rbにするのはどうか?

462:デフォルトの名無しさん
09/04/16 10:31:18
>>458
$LOAD_PATH << ".." << "../lib"
require 'spec'
require 'hoge'
...

オフィシャルなファイルと被るファイル名の自作ファイルがあると動作しないのが難点だが、
require はまあそもそもそんなもんだな
ただ、下手に lib/ と spec/ があると、Rails の auto_spec.rb とか
なんかあのへんが動作すると期待されてしまうかもしれない

463:デフォルトの名無しさん
09/04/16 10:37:27
>>461
一応、spec/*_spec.rb というファイルをまとめて実行して
一気に lib/ 内のファイルのテストを試すサポートプログラム(autospec)が存在するので、
いつか自動テスト実行を覚えた時用に hogehoge_spec.rb という名前であったほうが好ましい

が、一人で使うぶんには spec_hogehoge.rb にしておくのがいちばん無難だな、めんどくさくないし

464:デフォルトの名無しさん
09/04/16 11:37:51
>>458-459
別にRails流ってこともないだろ。
Gemsとかつくる前提のときも spec/ に入れるのが一般的だし、
autotestも標準で spec/以下 と lib/を関連付けて見てくれる。

といっても、慣例でしかない気がするけど

465:デフォルトの名無しさん
09/04/16 14:18:57
>>458
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')

とかかな。
いちいち書くのめんどくさけりゃ>>464のいうautotestや、
Rakeにspec/rake/spectaskのSpec::Rake::SpecTaskを使って
テスト実行を肩代わりしてもらう。

この二つはデフォでは spec/*_spec.rb を相手にするから
たかが慣習、されど慣習と。

466:デフォルトの名無しさん
09/04/16 16:28:48
ねーよw

467:デフォルトの名無しさん
09/04/16 19:04:41
ファイルのロックを File#flock でなく IO#fcntl で実装しようかと思ったんですが、
これシステムの struct flock に依存するから簡単には portble に書けないですかね?

468:デフォルトの名無しさん
09/04/16 20:55:51
どこまでのポータビリティを求めてるのかによる。
Windowsとか言い出すなら問題外。

469:デフォルトの名無しさん
09/04/16 21:14:34
あ、rspec の、エクスペクテーションの should をまとめたいと思ってメソッド定義するよね
あれってどこに書くべき?
before で作ったインスタンス変数が読めなかったり def で定義したメソッドが見えなかったりでどこがどう妥当なのかよくわからん

470:デフォルトの名無しさん
09/04/16 21:59:37
>>469
何を言いたいのかよく分からないが
it (specify) を、複数の ExampleGroup で共有したいって事なら
share_as メソッドを探すと幸せになれるかもしれない

471:デフォルトの名無しさん
09/04/16 22:09:06
…たぶん、

describe Hoge do

 before :all do
  @val1 = ... ; @val2 = ...
  # (1)
 end

 (2)

 describe "#foo" do
  matomete_val_tesuto
 end

end

としたいときに、 def matomete_val_tesuto を (1) に書くか (2) に書くかって話なんじゃね
(1) に書いたら describe "#foo" の中では使えないはず
(2) に書いたら @val1 にアクセスできんな


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch