Ruby 初心者スレッド Part 27at TECH
Ruby 初心者スレッド Part 27 - 暇つぶし2ch262:デフォルトの名無しさん
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 にアクセスできんな

472:デフォルトの名無しさん
09/04/17 00:13:56
setter の返り値について質問
a.hoge = b.hoge = value みたいな書き方ができるようにしようと思うのですが、

def hoge=(value)
@hoge = validate(value)
@hoge
end



def hoge=(value)
@hoge = validate(value)
value
end

ではどちらがいいでしょうか?
場合によって value != validate(value) となります。

473:デフォルトの名無しさん
09/04/17 00:22:53
> a.hoge = b.hoge = value みたいな書き方ができるようにしようと思う
そういうのやめとけ
めんどくさいから

ちなみに、 = つきメソッドは引数を返すように作られていることが期待されてる
つまり、

def hoge=(val)
 @hoge=val
end



474:デフォルトの名無しさん
09/04/17 00:28:15
前者をよしとする人はいないんでないの
a=b=c が a==b==c にならないのはバグの元だし
オペレータオーバーライドの悪い点をわざわざ利用する必要はないよ

475:デフォルトの名無しさん
09/04/17 00:31:08
今調べたら、セッターとして使うと引数が問答無用で返って、
sendで呼ぶと返した値が返る

476:デフォルトの名無しさん
09/04/17 00:37:49
>>475
うわあこれ知らんかった
今まで引数の値をわざわざ返してたのにー

477:デフォルトの名無しさん
09/04/17 00:44:12
…。

いや、なんつーか、 hoge = 1 の返り値は 1 だというのは知ってるよな
def set_hoge
 @hoge = 1
end

これの返り値は 1 だし、attr_* 系で作られる hoge= みたいなメソッドも引数を返す


478:472
09/04/17 00:48:14
皆さんレスありがとうございます。

>>475
>今調べたら、セッターとして使うと引数が問答無用で返って、

ほんとだw
そもそも返り値を選択できなかったとは……

def hoge=(value)
return
end

でも引数が返ってきました。
setter の呼び出しは処理系が特別扱いしてるんですね。

479:デフォルトの名無しさん
09/04/17 01:25:51
[ruby-core:00637]より。

|If an assignment method which doesn't return an argument is not
|intuitive, why don't ruby force it?

Agreed. Last time I thought that, I was too lazy to modify compiler
itself, and then forgot. I will fix it someday.

だって。

480:472
09/04/17 02:25:15
>>479
なるほど。
その結果として 1.8 では setter の戻り値を破棄して
引数を返すように変更されたと

確認してみたらピッケル本にもそのことがちゃんと書いてありました(言語編 p76)

481:デフォルトの名無しさん
09/04/17 08:42:59
>>477
バーカ

というかお前322と似てるな。バカ具合が

482:デフォルトの名無しさん
09/04/17 09:00:50
わざわざ終わった話題に安全圏から罵倒、というのはつい最近どこかで

483:デフォルトの名無しさん
09/04/17 09:45:27
クラスメソッドのエイリアスはどうやって定義しますか。

484:デフォルトの名無しさん
09/04/17 09:52:51
class Hoge
 def self.hoge ; end
 class << self
  alias hage hoge
 end
end
これ以外の方法知らん。他のやり方があったら教えて。

485:デフォルトの名無しさん
09/04/17 10:23:07
>>484
alias メソッドを使うとしたらそれくらいしかなさそうだな
あとは普通に self.hoge の中で self.hage を呼ぶしかあんめえ

486:デフォルトの名無しさん
09/04/17 10:43:50
alias_methodを使うというひねりもできるが、メタクラスを使う以外の方法はない。

487:デフォルトの名無しさん
09/04/17 10:48:13
rubyでcgiを作ろうと思います
postを受け取るにはどうすればいいですか

488:デフォルトの名無しさん
09/04/17 10:52:20
>>487
他の言語でpostを受け取るのと同じ方法でできます。

489:デフォルトの名無しさん
09/04/17 11:05:40
>>487
単純には、標準入力に環境変数CONTENT_LENGTH長だけ入ってる、はず。
マルチパートやらデコードやらいろいろあるので、ライブラリを使うのが吉。
どのライブラリをどんな風に使うのがいいのかは、詳しい人を待って(オイ)。

490:デフォルトの名無しさん
09/04/17 13:46:48
>>488
うん、変わらんな
というか一度は自力でPOSTとか全部やってみたほうがいいと思うんだ

>>487
標準で cgi というライブラリがあるからそれ使え
自力で外部ライブラリをインストールしてもいい環境なのなら、
rubyforge から cgialt をインストールしてそれを cgi 互換ライブラリとして使え
他にもいくつかあるが、cgi ライブラリの使用経験とかを前提にしてたりするんで、最初は素直に cgi ライブラリ使え

491:デフォルトの名無しさん
09/04/17 14:36:38
rubyのcgiはかなりアレ。

492:デフォルトの名無しさん
09/04/17 16:14:01
>>468
メジャーな UNIX (Linux, *BSD, Solaris あたり) で動けば十分なんですが、
Google ソースコード検索や Koders でも Ruby の fcntl の用例が少ないみたいなんで
Ruby Inline か拡張ライブラリで fcntl(2) を直接使うことにします。

493:デフォルトの名無しさん
09/04/17 16:51:33
>>491
アレって何?


494:デフォルトの名無しさん
09/04/17 17:07:46
>>492
IOクラスにfcntlメソッドがあるので、わざわざそんな難しい方向に行かんでもええよ

495:デフォルトの名無しさん
09/04/17 17:07:54
指示代名詞も知らないゆとり乙

496:デフォルトの名無しさん
09/04/17 17:09:43
>>493
491じゃないが、仕様と実装が残念だった。
1.9系で後者は改善されたけど。

497:デフォルトの名無しさん
09/04/17 17:38:58
>>494
その IO#fcntl ですが、例えば file.fcntl(Fcntl::F_GETLK, arg) するとき、
arg には struct flock に pack したものを指定する必要があるのですが、
struct flock にどんなメンバがあるかは Ruby レベルからは知り得ないので、
やっぱり C で書く必要があると思うのです。

498:デフォルトの名無しさん
09/04/17 18:01:32
>>497
なんだ、そんなレベルのポータビリティでいいのか。

499:デフォルトの名無しさん
09/04/17 19:35:12
>>487
今ならRack使う方がいいと思う

500:デフォルトの名無しさん
09/04/17 19:44:30
初心者に標準添付以外をいきなり勧める人って何なの

501:デフォルトの名無しさん
09/04/17 20:49:03
今ならgem install rackするだけだろ?

rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて
茨の道を歩くのは覚悟してもらわなきゃ


502:デフォルトの名無しさん
09/04/17 21:01:04
> rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて

海外の開発系カンファレンスに何度か出席しているが、
どうみても日本より海外の方が、Ruby の関心が高い。

むしろ日本人は「Ruby 出来ない子」が多い、と感じる。

503:デフォルトの名無しさん
09/04/17 21:07:40
> 海外の開発系カンファレンス

そういうやつらは「寿司、天ぷら、藤山、芸者」の日本好きの変わり者geekだろ。
狭いコミュニティに閉じこもって「関心が高い」じゃないだろ。

目を覚ませ。もう戦争は終わったんだ。
今は蛇言語でgwtの時代なんだよ。

504:デフォルトの名無しさん
09/04/17 21:12:12
せめてこのスレでは、Ruby初心者に有益な情報を書くように心がけられないもんかね
Pythonがいいよってのも、Rubyのことを聞きに来た人間を迷わせる効果しかないと思うんだがね

アンチは本スレでもアンチスレでも行けばいいんだ。
初心者スレにまで顔出すことはなかろうに。本格的に人間性を疑うわ。

505:デフォルトの名無しさん
09/04/17 21:12:23
カンファレンスは知らないがおれもそれは感じる。
新しいバージョンとかでつまづいたときググると、
役に立つのは大抵海外のサイト。向こうの方が精力的にやって気がする。
2ちゃんなんてRubyスレ全般で「1.9は使うな」だもんな。
2ちゃん見てる時点でアレだろと言われたらそれまでなのだが。

506:デフォルトの名無しさん
09/04/17 21:16:56
裸で冬山に特攻する初心者がいれば「行くな」とも言いたくなるわな

507:デフォルトの名無しさん
09/04/17 21:21:08
>>505
お前英語苦手だろ
英語で書いてあるというだけで凄いって思ってるだろ
海外の人だって「初心者」は Ruby 1.9 を使ってない

508:デフォルトの名無しさん
09/04/17 21:22:39
Vimで入門始めたけど、アホらしくてNetBeans入れてみた

信じられないくらい快適になった

509:デフォルトの名無しさん
09/04/17 21:27:00
>>507
別に得意じゃないけど英語だけですごいなんて思わないだろ。小学生かよ。
新しいことに関して日本のサイトはほとんど引っかからないし、
読んで実際に解決することが多いからそう思う。

あと「Rubyスレ全般」ってわざわざ書いてるんだからちゃんと読んでな。
たった5行なんだからさ。初心者スレに限定してないだろ。

510:デフォルトの名無しさん
09/04/17 21:34:10
日本人はRuby初心者が多い印象がある
外国人の人にとってのRubyは日本人にとってのPythonくらいの「詳しい人向け言語」な感じ

511:デフォルトの名無しさん
09/04/17 21:48:53
ruby-talk読んでるが、初心者らしいというかほほえましい質問が半分くらい(たいかん)

512:デフォルトの名無しさん
09/04/17 22:42:31
詳しい人はこんなところこないと思うよ
前にmswinの人がキレてたじゃん
わざわざ顔出して見ず知らずのしかも自分の足下にも及ばないようなやつに、
口汚くレスされたりしてストレスためる必要ないだろ
あと日本のRuby好きはRubyで何か作るというよりも、メンテナとかをやるのが好きなのかもね

513:デフォルトの名無しさん
09/04/18 01:24:40
ゴルフやってるんじゃねーの


514:デフォルトの名無しさん
09/04/18 11:16:09
month = 4
などの数字が入ってるとき、これを to_sなどで
"04"という風に変換したいんですが、どうすればいいですか?
month = 11
のときは、"11"です。
どうかお願いします。


515:デフォルトの名無しさん
09/04/18 11:23:44
'%02d' % 2 => "02"
'%02d' % 11 => "11"

516:デフォルトの名無しさん
09/04/18 12:06:19
もしくは

$ irb
irb(main):001:0> sprintf("%02d", 4)
=> "04"
irb(main):002:0> sprintf("%02d", 11)
=> "11"

517:デフォルトの名無しさん
09/04/18 12:53:26
MySQLをDBIを介して使おうとしているのですが、
テーブル名一覧を取得する方法をお教えいただけないでしょうか?

dbh = DBI..connect("dbi:Mysql:test:localhost","user","password")
table_names = dbh.execute("SHOW TABLES")
p table_names

とやると全然違うものが出力されてしまいます。
すいませんが、お教えいただけますでしょうか?

518:デフォルトの名無しさん
09/04/18 13:32:41
聞くときだけは丁寧だな。がんばれよw

519:517
09/04/18 16:44:37
自己レスです。

結局DBIを介して行う方法はわからなかったので、Ruby/MySQLで接続して行いました。
require "mysql"

dbh = Mysql::new("localhost","username","password")
dbh.query("use database")
p dbh.list_tables

これで取得できそうです。

520:デフォルトの名無しさん
09/04/18 19:34:20
FreeBSD 7.1-RELEASE-p4 で irb 使ってます
Delete キーを押すと ~ が表示されるんですが、同じような症状をさくっと治したという方はいませんでしょか
csh 上では普通に後ろの文字が消えます

521:デフォルトの名無しさん
09/04/18 20:26:40
端末は何を使っとるん?

522:デフォルトの名無しさん
09/04/18 20:37:48
ええと、アプリケーションは Windows 上の PuTTY で、端末文字列は xterm-color 、
csh から bash を起動して C-v したあとに Delete キーを押すと ^[[3~ が表示されてます(csh 上ではどうやるんだろう?)
screen 等は(まだ)使ってません
接続先は具体的にはさくらインターネットのレンタルサーバです
なんか Ruby あんま関係ないような気がひしひしとしてます

523:デフォルトの名無しさん
09/04/18 20:43:38
irb を起動するとキー操作の動作が違う、という場合はいちおう Ruby スレの範疇だと思う
まあ、irb 自体が独自に何かやってるわけじゃないけどさ

524:デフォルトの名無しさん
09/04/18 21:22:16
>>522
自分もさくらのレン鯖契約しているのでやってみた。
ログインシェルが csh なので、bash にしたあとで irb 起動してみたけど、
C-v したあとだったら delete キーを押すと再現したけど、
C^v しなければ、irb のプロンプト中に delete キーを押したら、ちゃんとカーソル位置の文字が消えたよ

C-v って何のためにやっているの?

525:デフォルトの名無しさん
09/04/18 21:57:44
C-vは、つぎの入力文字を視覚的に表示する機能では?


526:521
09/04/19 00:31:07
>>525
C-v って vi のと同じように、次の入力をキーコードそのまま入力する機能だと思う。
PuTTY が Delete で吐くキーコードが 1b 5b 33 7e ってことだよね。

FreeBSD 7.1-RELEASE-p4 & PuTTY 0.60 ごった煮版 2007年8月6日版だけど、
カーソル位置の文字が消えた。

もし Readline を入れてなければ入れて、
それでダメなら ~/.inputrc に↓コレ書いてみて。

"\e[3~": delete-char

527:デフォルトの名無しさん
09/04/19 02:37:16
RubyのDBIを使おうとしているのですが、
$ irb
irb(main):001:0> require 'dbi'
=> true
irb(main):002:0> DBI.connect('dbi:mysql:test','root','root00')
DBI::InterfaceError: Could not load driver (undefined local variable or method `e' for DBI:Module)
from /usr/local/lib/site_ruby/1.8/dbi.rb:312:in `load_driver'
from /usr/local/lib/site_ruby/1.8/dbi.rb:154:in `_get_full_driver'
from /usr/local/lib/site_ruby/1.8/dbi.rb:139:in `connect'
from (irb):2
となってしまい、うまくコネクトできません。ドライバはインストールしたつもりなのですが、
何か間違ってるでしょうか?

528:527
09/04/19 02:50:31
mysql-ruby-2.8.1.tar.gz
をインストールしたらできました。
DBIだけじゃなくて、Ruby/Mysqlのドライバもインストールしないとだめなんですね。
失礼しやした。


529:464
09/04/19 08:50:34
連投規制で書き込めなかった

>>464
> autotestも標準で spec/以下 と lib/を関連付けて見てくれる。
は、厳密には間違いで、rspecに含まれる autotest用のプラグイン?が spec/とlib/を関連付けてみてくれる

>>469-471
spec_helper.rb(か、もしくはそこからrequrieする.rb)内でshare_asで定義して、includeするとか

530:デフォルトの名無しさん
09/04/20 11:08:49
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]を使用しています
open("|")(I/Oパイプ付)で起動した外部プロセスを強制終了する事ってできますか?
外部コマンドの結果でその後の動作を変えるようなことをしていますが
大体の場合全ての結果を受け取らずとも判定が出来るので
判定が出来た時点で外部コマンドを強制終了して判定にかかる時間を短縮したいです

531:デフォルトの名無しさん
09/04/20 11:09:51
>>530
適当にシグナル送ればいいんじゃね

532:デフォルトの名無しさん
09/04/20 13:28:18
>>530
IO#pid で外部コマンドの pid が取れるみたいね。あとは >>531 の通りで。

533:デフォルトの名無しさん
09/04/20 17:25:24
UTF8のBOMを含むStringからBOMを取り除く方法は?

534:デフォルトの名無しさん
09/04/20 17:38:35
>>533
toutf8

535:デフォルトの名無しさん
09/04/20 17:41:57
iirb> require 'kconv'
irb> text = File.open('test.txt'){|f| f.read}
=> "\357\273\277test\ntest\ntest\n"
irb> text.toutf8
=> "test\ntest\ntest\n"

まあ、ある意味盲点ではあるな

536:デフォルトの名無しさん
09/04/20 18:05:57
盲点ってかただの副作用では
そういうのこそ、メソッドを用意すればいいのに

537:デフォルトの名無しさん
09/04/20 18:11:30
>>536
nkf -w8 はBOM を除去する

538:デフォルトの名無しさん
09/04/20 18:18:58
というよりは、 BOM 無し UTF-8 を出力する、だね

539:デフォルトの名無しさん
09/04/20 18:21:47
BOMについては特につけることも取ることもしない、というスタンスなんだっけか

540:デフォルトの名無しさん
09/04/20 18:35:22
.toutf8もNKFも、余計な変換をしそうで怖いです。
やりたいのはBOMを除くことだけで、変換とかいっさい必要ないんですが。

あと、BOMを含むかどうかの判定方法もお願いします。
今は str.unpack('H6').first == "efbbbf" としてるんですけど、どう考えても頭悪い方法です。


541:デフォルトの名無しさん
09/04/20 18:54:51
BOM = "\357\273\277"
str[0,3] = "" if str[0,3] == BOM
str.sub(/\A#{BOM}/, "")

こういうのでいいんじゃない?

542:デフォルトの名無しさん
09/04/20 18:58:20
str.sub!(/\A\xEF\xBB\xBF/, '')
あたりで

543:デフォルトの名無しさん
09/04/20 19:00:35
Ruby 1.8.7以降だとString#start_with?ってのがあるからそれで判定しても

544:デフォルトの名無しさん
09/04/20 22:53:34
自分でString#bom?とか適当なメソッドを定義すればいい
表面上スマートに見えても内部は泥臭いなんて当たり前

545:530
09/04/21 00:17:20
>>531-532
レスありがとうございます
やってみました…が、外部プロセスの実行が終了したあとにI/Oパイプが開いている気が…
io.each_lineで読み出し中にProcess.kill(9, io.pid)しても実行時間が変わりません
仕様かな…

546:デフォルトの名無しさん
09/04/21 01:13:24
>>545
io.closeするだけで良いんじゃね?

547:デフォルトの名無しさん
09/04/21 10:33:13
require したファイルの一覧って取得できますか

548:デフォルトの名無しさん
09/04/21 10:42:06
自己レスですが
>>547
$LOADED_FEATURES というのがあるらしい。
マニュアルは読んでみるものですね。

549:464
09/04/21 12:39:37
riに失敗してしまうのですが、これはどのようなエラーでしょうか?
回避する方法はありませんでしょうか?

> ri String#lines
(ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:532:in `lookup_ancestor': undefined method `+' for nil:NilClass (NoMethodError)
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:610:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `loop'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `each'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:311:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/bin/ri:5
from (ruby installed directory)/bin/ri:19:in `load'
from (ruby installed directory)/bin/ri:19
> ri --version
ri 2.2.0
>ruby --version
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]

550:549
09/04/21 12:46:51
名前の464はミスです。キニシナイでくだしあ

551:デフォルトの名無しさん
09/04/21 13:06:36
gemで自分でriを入れたのか。
それを消せばいいんじゃね?

552:デフォルトの名無しさん
09/04/21 21:28:24
1年前のスクリプトを眺める

…ライブラリそのものをナチュラルに継承すんな、っていうか重要メソッド上書きすんな
ライブラリのオブジェクトをインスタンス変数に保持してメソッドを依頼するラッパー操作クラス作るだけで十分じゃねーか

来年には「この改造無駄だったなー」と思えるようになるのだろうか

553:デフォルトの名無しさん
09/04/21 22:58:43
家庭用プログラムのテスト駆動開発とかなんかそのへんでしつもん

a というメソッドを作ってる最中に、その中の特定の処理を a' というメソッドに分けたとして、

def a
 aaaaa
 bbbbb
 ccccc
 ...

 ↓

def a'
 bbbbb
 ccccc
end
def a
 aaaaa
 a'
 .....

その a' についてのテスト項目は作るほうがいい?
それとも、 a についてのテストをちょこっと詳しくする程度で、a が完動したことをもって「隠して」おくのが普通?

554:デフォルトの名無しさん
09/04/21 23:35:11
「普通」がまだ決まってない。
テストしろ、とかpublicなメソッドのテストがパスしてるんだからおkとか、
モックとかスタブとか使えば、とか。

555:デフォルトの名無しさん
09/04/22 01:07:07
privateなメソッドはそもそもテストできないようなテストフレームワークもあるような?

556:デフォルトの名無しさん
09/04/22 01:11:35
テストしまくり中はメソッドのアクセス制御は敢えてしないと思うんだが
ユーザーからの隠蔽だけが目的の場合(つまり大多数の場合)はふつうにめんどくさいじゃん?

557:デフォルトの名無しさん
09/04/22 01:18:51
>>553
基本的には作らないが、他のメソッドからも使う(ような気がする)場合は仕様書的にspecファイルに書く
return するものがたくさんあるようなメソッドにうっかり育ててしまった場合もやっぱ書く

最初は全部書いてたんだけど、describe がメソッド 1個に対応するような使い方をしてると引数とかで正直非常にめんどい

558:549
09/04/22 07:43:36
>>550
うは。確かにgemのrdocに入っているんですね。
gem update rdocしたらエラーでなくなった!!

でも…

> ri String#lines
Updating ri class cache with 5126 classes...
Nothing known about String#lines

うーん。こういうことって普通にあるの?

gemのrdocのriが駄目かと思ってrdoc消してみたら、

>ri String#lines
(ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:805:in `report_
activate_error': Could not find RubyGem rdoc (>= 0) (Gem::LoadError)
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:24
3:in `activate'
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:50
:in `gem'
from (ruby directory)/bin/ri:18

orz

559:デフォルトの名無しさん
09/04/22 10:22:13
インスタンス変数へのアクセスと、クラス変数へのアクセスと、ローカル変数へのアクセスを
速い順にならべるとどうなりますか。
クラス変数へのアクセスはだいぶ遅そうだとは思いますが、インスタンス変数とローカル変数へのアクセスにどのくらい違いがあるのか知りたいです。

560:デフォルトの名無しさん
09/04/22 10:27:08
>>559
これが速度に影響するような用途のプログラムであるなら、Rubyで作らないほうがよい
ブロックつきメソッドとか使われてたら奇声上げてキーボード投げつけるレベル

ちなみに

     アクセス遅い                               アクセス速い
 クラス変数 > インスタンス変数 > ブロック外のローカル変数 > ブロック内のローカル変数

こんな順番だったと思うが、どっかに言及があったはず

561:デフォルトの名無しさん
09/04/22 10:38:03
tips: Hash[:symbol] > Struct > Hash["string"] >>>>>(越えられない壁) >>>> OpenStruct

562:デフォルトの名無しさん
09/04/22 12:57:25
PHPのuniqid() に相当する関数やライブラリはありますか。
uniqid()とはこんなやつです。
URLリンク(php.benscom.com)

563:デフォルトの名無しさん
09/04/22 13:05:03
>>562
例えば、これでどう?

require "securerandom"
p SecureRandom.uuid

564:デフォルトの名無しさん
09/04/22 13:09:46
テンプレに入れてもよさそうなRuby関連Googleブック検索
ruby - Google ブック検索
URLリンク(books.google.co.jp)

565:デフォルトの名無しさん
09/04/22 13:14:49
def uniqid(prefix = "", more_entropy = false)
id = "%s%x" % [prefix, Time.now.to_f*1_000_000]
id << ".%.8d" % rand(100_000_000) if more_entropy
id
end


566:デフォルトの名無しさん
09/04/22 18:23:16
>>563
SecureRandom.uuidは1.8.7じゃ使えないからなぁ。


require "rubygems"
require "uuidtools"
p UUID.timestamp_create


567:デフォルトの名無しさん
09/04/22 20:21:26
>>564
「赤毛のアン」が検出されるんだが・・・?

568:デフォルトの名無しさん
09/04/22 22:18:55
Rubyも赤いからいいんじゃない?

569:デフォルトの名無しさん
09/04/23 08:38:48
どこでいいからまからんでここで聞きます

下記のようなプレゼンの外見のテンプレートがRuby界隈では最近流行っているのですが、
このプレゼンはどのようなツールもしくは、テンプレートで作られているのでしょうか?
Sinatraで鼻歌まじりのWeb開発
URLリンク(www.slideshare.net)

570:デフォルトの名無しさん
09/04/23 09:47:29
そんな「Ruby界隈」は知らない。

571:デフォルトの名無しさん
09/04/23 09:55:18
>>570
気を悪くしたらすいません。
なかなか見やすいと感じたので気になっているのです。

572:デフォルトの名無しさん
09/04/23 09:59:30
>>571
気を悪くしたんじゃなくて、それが流行ってるのは「Ruby界隈」と言えるほど広い世界でもないし中心に近くもないだろ、と。

で、その辺の人たちはKeynote使ってるんじゃないの。

573:デフォルトの名無しさん
09/04/23 10:17:56
もしかして、「高橋メソッド」のことを言ってるとか?

574:デフォルトの名無しさん
09/04/23 11:58:51
>>569
このプレゼンはおもしろかった。

このなかで Rails は「ちょっとしたことをやるには大げさ」とあるが、
自分は Java → Ruby ときたけど、Java の web フレームワークに比べれば
Rails はずっと軽くて楽だと感じる。

この sinatra というのは、流行っているんですか?

575:デフォルトの名無しさん
09/04/23 12:08:02
最近名前聞くねぇ。
使ったことないというか、そっち方面は全然手がけないんだが。

576:デフォルトの名無しさん
09/04/23 12:23:36
Winでファイルのアーカイブフラグが立っているかを判定したり
フラグをセットしたりするのってどうやるの?

577:デフォルトの名無しさん
09/04/23 12:49:38
>>576
File::Stat に見当たらないということはサポートされてないのかなあ
自分には Win32API の GetFileAttribute/SetFileAttribute を呼ぶくらいしか思いつかない


578:デフォルトの名無しさん
09/04/23 13:25:25
標準では無いよ
gemのWindowsファイルシステム操作ライブラリで見た覚えがあるので適当なの使え

579:デフォルトの名無しさん
09/04/23 14:43:45
win32-fileにあったと思う


580:デフォルトの名無しさん
09/04/23 16:05:39
opensslライブラリのマニュアルを読んでいるんですけど
URLリンク(www.ruby-lang.org)
pkcs5_keyivgen('str') で生成したキーを取り出すことってできないんでしょうか。

581:デフォルトの名無しさん
09/04/23 17:29:42
rubyscript2exeが動かなくなってしまいました。非常に困っています。
何か解決策はありませんでしょうか?

> rubyscript2exe test.rb
Tracing test ...
Gathering files...
c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:60:in `gatherlibs':
undefined method `list' for Gem::Specification:Class (NoMethodError)
from c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:30
from test.rb:1
hellow
Couldn't execute this command (rc=256):
d:\software\ruby\bin\ruby -r 'enumerator.so' -r 'rubygems/rubygems_version.rb' -r 'rubygems/defaults.rb'
-r 'thread.so' -r 'thread.rb' -r 'etc.so' -r 'rbconfig.rb' -r 'rubygems/exceptions.rb' -r 'rubygems/requirement.rb'
-r 'rubygems/version.rb' -r 'rubygems/dependency.rb' -r 'rubygems/gem_path_searcher.rb' -r 'rubygems/user_interaction.rb'
-r 'rubygems/platform.rb' -r 'rubygems/specification.rb' -r 'rubygems/source_index.rb' -r 'rubygems/builder.rb'
-r 'stringio.so' -r 'yaml/error.rb' -r 'syck.so' -r 'yaml/ypath.rb' -r 'yaml/basenode.rb' -r 'yaml/syck.rb' -r 'yaml/tag.rb'
-r 'yaml/stream.rb' -r 'yaml/constants.rb' -r 'rational.rb' -r 'date/format.rb' -r 'date.rb' -r 'yaml/rubytypes.rb'
-r 'yaml/types.rb' -r 'yaml.rb' -r 'Win32API.so' -r 'rubygems/config_file.rb' -r 'rubygems/custom_require.rb' -r 'fileutils.rb'
-r 'rubygems.rb' -r 'ubygems.rb' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe'
-I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1'
-I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/bin'
-I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/lib'

582:デフォルトの名無しさん
09/04/23 17:30:30
-I 'd:/software/ruby/lib/ruby/site_ruby/1.8' -I 'd:/software/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt'
-I 'd:/software/ruby/lib/ruby/site_ruby' -I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8'
-I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8/i386-msvcrt' -I 'd:/software/ruby/lib/ruby/vendor_ruby'
-I 'd:/software/ruby/lib/ruby/1.8' -I 'd:/software/ruby/lib/ruby/1.8/i386-mswin32'
-I '.' -I 'd:/home/test/ruby/' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe'
-I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe'
-I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -r 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb' 'test.rb'
Stopped.

> ruby --version
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]
> gem --version
1.3.2

583:デフォルトの名無しさん
09/04/23 18:55:38
undefined method `list' for Gem::Specification:Class (NoMethodError)

Gem::Specification.listメソッドはgem 1.3.1になら存在する。
1.3.2では削除されたようだ。
gatherlibsを修正するか、gemコマンドをダウングレードする。
そしてrubyscript2exeの開発元に連絡をする。


584:デフォルトの名無しさん
09/04/23 19:26:02
>>583
ありがとう。
どうやらそのようですね。RubyGems1.3.2のスレッドでも話題になってたみたいです。

RubyGems 1.3.2 - ruby-talk-google | Google グループ
URLリンク(groups.google.com)

そこで紹介されていた、Ocraというrubyscript2exeみたいなパッカーがあったので試してみています(windowsのみですが)
larsch's ocra at master - GitHub
URLリンク(github.com)

Ocraそこそこコンパクトな上に、起動が早くてよさげです。
rubyscript2exeは今まで何でもうごいてたので、同じようにスクリプトが動くか検証してみます。

585:デフォルトの名無しさん
09/04/23 19:28:40
x Ocraそこそこコンパクトな上に、起動が早くてよさげです。
o Ocraそこそこコンパクトな上に、exe化したプログラムの起動が早くてよさげです

586:デフォルトの名無しさん
09/04/24 23:45:20
どうして、ruby -pの後のgsubはレシーバが省略できるのですか?
いつも使ってて便利だなあと思ってるけど不思議に思ってます。

ruby -p -i.bak -e'gsub(/hoge/, "fuga")' data.out



587:デフォルトの名無しさん
09/04/25 00:17:28
>>586
関数的メソッド gsub が呼ばれているだけだ(こいつは $_ をレシーバとして扱う)
String#gsub が直接ワンライナー用にいじられて呼ばれているとかそういうわけではない

588:デフォルトの名無しさん
09/04/25 08:35:56
class SomeClass
 @@message = "call myself Mr.#{@name}!"
 def initialize(name)
  @name = name
 end
end

このまま@@messageを参照すると、@nameが未定義の段階で定義しているため出力は"call myself Mr.!"となります。
このように後で@nameに値が入ったとき(あるいは変更されたとき)
@@messageを参照する段階で@nameを再度当てはめるとしたら、どのように書けばよいでしょうか。

589:デフォルトの名無しさん
09/04/25 08:46:15
クラス変数を使わない

いやわりとマジで
特定のインスタンスの状態に左右されるクラス変数というのは奇妙
特定のインスタンスの変数を参照する大域変数というのはそれは普通インスタンス変数にする
というか、@@name を initialize の中で毎回変更してそれを @@message で参照するという形ではダメなん?

590:588
09/04/25 09:24:21
>>589
ありがとうございます。た、たしかに言われてみたら使い方もちょっとおかしいし、
そもそもクラス変数でやってたのがよくなかったんですね・・・
試しに@@messageをメッセージを返すインスタンス"メソッド"にしてみたら問題なく置き換えられました。
なお試してみますm(_ _)m

591:デフォルトの名無しさん
09/04/25 17:51:40
はじめまして。困ってます;至急お願いします。
Rubyをはじめようと思うのですがどうすればいいかわかりません。
まず公式HPに行ってもどれをダウンロードすればいいかわかりません。
ソースコード以外に実行ファイルが見当たりません。
何かをインストール等する必要はないのですか?
僕はパソコンは上級者と言ってもいいほどなんでもできるのですが
ここまでわけのわからないことは初めてで焦っています。
まずルビーのプログラムを書く段階までのやり方を教えてください。


592:デフォルトの名無しさん
09/04/25 17:54:17
またそんな玄人的なネタを投下してw

593:デフォルトの名無しさん
09/04/25 17:57:30
初心者だから教えてくれ、という意味?

それは唯の対処療法で根本的原因の解決ではない。
頭痛がするから薬を使って誤魔化すのと同じこと。
また困った時に同じように薬使ってごまかすのかな。

使い方はそこらへんに結構転がっているよ。
自分の環境構築するのも技術の一つだよ。

594:デフォルトの名無しさん
09/04/25 18:00:46
いや、上級者だといってるだろ

595:デフォルトの名無しさん
09/04/25 18:09:52
もしかしてメモ帳で書く、ということですか?
エディターみたいなものは公式サイトで配布していないのですか?
他の候補で見ていたC#なら公式サイトでMicrosoft Visual Basic 2008 Express Editionというのが配布されていました。
簡単に作りたかったのでRubyを選んだのですが本当に困っています。
小さいころにHSP(Hot Soup Processor)をやったことがあるのですがそこの公式サイトでもエディターやテストするためのものが公式サイトで配布されていました。
僕は今そのようなものを探しているのですが見当たりません。
そのようなものは存在しないのですか?

596:デフォルトの名無しさん
09/04/25 18:11:17
>>591
> ルビーのプログラムを書く段階までのやり方

1.エディタを用意します。なんでもいいです。目的はテキストファイルを作成することです。
  例えばMS-DOSに馴染んでいれば、最悪
    copy con hello.rb
  なんてのでも大丈夫です。

2.思う通りのるびーのプログラムを書いたら、その内容をテキストファイルとして保存して下さい。

※ 上記の2は、書くまでの段階では必要ではありませんので、飛ばしても結構です。

以上です。

597:デフォルトの名無しさん
09/04/25 18:13:16
>>596
俺は君が好きだな

598:デフォルトの名無しさん
09/04/25 18:17:09
>>593さんの書き込みをヒントに「ruby 開発環境」と検索したところ
RDEというエディターを見つけました。とりあえず解決しましたので
回答していただいたみなさまありがとうございました。

599:デフォルトの名無しさん
09/04/25 18:21:05
IDEがないというのは上級者にとっては最初に焦る事態なのか
なるほど

600:デフォルトの名無しさん
09/04/25 18:27:39
>>599
俺は20代だけど、周りみてると統合環境から入るやつが大半だった
学生の時分とかね


601:デフォルトの名無しさん
09/04/25 18:28:02
つメモ帳 でよかったのか
PC上級者は、プログラムは専用アプリで書くものと思いがちってことなのかな
勉強になった

602:デフォルトの名無しさん
09/04/25 18:29:33
時代は巡るねぇ。

603:デフォルトの名無しさん
09/04/25 18:31:58
どっちかというと
下地が分からないからIDEなんだと思う。


604:デフォルトの名無しさん
09/04/25 18:41:18
紙に書いてパンチカードで打ってた時代があったとか、知識や想像の範囲外なんだろうな
デバッグは全部プリントアウトとか
そんなの実際には知らんから、もしかして俺騙されてる?

605:デフォルトの名無しさん
09/04/25 18:45:09
プログラム全体が一望できた時代は、デバッグは全部プリントアウトでも良かったし
それの方が効率が良かったんだよ
今はテストケース無しでは不可能だろう、そうするとIDEの力を借りる必要が出てくる。
今ではIDEが使えないのでは上級とは言えないだろう。

606:デフォルトの名無しさん
09/04/25 18:49:51
用は
IDEしか使えないと
IDEを使ってる
ではぜんぜん違うということでしょ?

607:デフォルトの名無しさん
09/04/25 18:50:12
「IDEが使えない」と
「IDEがないと何も出来ない」はぜんぜん違うよ。


608:デフォルトの名無しさん
09/04/25 18:50:27
>>605
だが待って欲しい
それは本当に、まずルビーのプログラムを書く段階まで、に必要な事だろうか
ってあんまりこれ引っ張るのもなw

609:デフォルトの名無しさん
09/04/25 18:50:52
全部を知る必要も無いって事でもある

610:デフォルトの名無しさん
09/04/25 18:56:08
パンチカードの思いでをちょっと
あれは一瞬で行が入れ替えられる、それを活用したデバッグやトラインアドエラー作業はいろいろと面白い効率の高さがあった。
でもね、あれはCOBOLやFORTRANの時代のプログラムが行単位で記述されているから効率がいいんだ。
今の自由文法でそれは可能だろうか?、否ですね。
今の時代には今のやり方があるって事だ。

611:デフォルトの名無しさん
09/04/25 18:56:46
先生! make や rake は IDE に入りますか?
あるいは、IDE 足り得ますか?

612:デフォルトの名無しさん
09/04/25 19:00:29
>>610
ていうかプログラミングの形態ではなくて、backgroundはどうなっているか
を理解しているかどうかの話だと思ってた。

613:デフォルトの名無しさん
09/04/25 19:03:08
背景を追うと、ではどこまで追う気だって話になる、どこかで打ち止めしておかないと、話が進まない。
まあ、中にはC++のように背景無しでは思わぬ罠にはまる、しかもはまっている事に気づいていないなどという恐ろしい言語もあるのですべてとは言わない。

614:デフォルトの名無しさん
09/04/25 19:04:00
>>611
IntegratedなEnvironmentでないとIDEとは呼べないと思う。


615:デフォルトの名無しさん
09/04/25 19:05:03
>>603
>>606-607
>>612

もちろん、言うまでもなく、そうだろ。
ネタ~マジの間のどのへんでつきあってるのかわかりにくい流れだな、これ。

616:デフォルトの名無しさん
09/04/25 19:05:48
ネタと信じたいと思いつつマジレス、あたりで。


617:デフォルトの名無しさん
09/04/25 19:06:30
>>591
URLリンク(www.ruby-lang.org)
1.Windows版(mswin32、mingw)の場合
どこかでバイナリを配ってる
2.cygwinの場合
同じくバイナリ配られてる
3.Mac OS Xの場合
MacPortで入れればOK
4.Ubuntuの場合
sudo apt-get install ruby
5.Debianの場合
su -
apt-get install ruby
exit
6.Fedoraなどの場合
su -
yum install ruby
exit
7.その他Unix系の場合
まずgccやmakeがあることを確認
ソースコードを持ってきて解凍する(やり方はさすがに知ってるだろJK)
configureのあるディレクトリにcd
./configure
make
su
make install
exit


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