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

618:デフォルトの名無しさん
09/04/25 19:23:48
>>617
で、どうやってプログラム書くんですか><

って質問だったりするんだなこれが。
解決済みだし、もういいじゃんw

619:デフォルトの名無しさん
09/04/25 19:25:24
>>618
初心者スレにはちょっとヤな感じ。自重しよう。

620:デフォルトの名無しさん
09/04/25 19:26:02
とりあえず、大体皆が同じ認識を持ってることは分かったから
なんか嬉しい。

621:デフォルトの名無しさん
09/04/25 21:38:18
>>618
1.まず適当なテキストエディタ(Windowsなら極論すればメモ帳でもいいが
あとあとつらくなる)を準備しましょう
2.次にこのようなプログラムを書きましょう
puts "Hello, world"
3.これを拡張子rbにして保存しましょう(メモ帳の場合はすべてのファイルにしてから
適当な名前.rbと名前欄に入力)
4.次にこのようにコマンドを入力しましょう(カレントディレクトリはさっきの
プログラムの場所で、rubyへのパスはすでに通っていると仮定する)
ruby さっきのプログラム名
5.すると次のように表示されるでしょう
Hello, world
これでプログラムが実行できていることがわかります

622:デフォルトの名無しさん
09/04/26 03:58:24
IDE無しのほうが分かり易いというか、IDEの使い方覚えるのが面倒。

汎用IDEといえばこのあたり?

スレリンク(tech板)
【Java】NetBeans Part4【Sun】
スレリンク(tech板)
Eclipse統合M27【Java/C/PHP/Ruby/Python/Perl】
スレリンク(tech板)
プログラマーがよく使うソフト
スレリンク(tech板)
Emacs Lisp 3
スレリンク(tech板)
統合開発環境Eclipseプラグイン開発QA


623:デフォルトの名無しさん
09/04/26 07:44:04
「IDEが面倒」と思ってる人に聞きたいんだけど
Ruby開発において、それでもやっぱりIDEが役に立つ場面ってある?

何度か手を出そうとはしたんだけど、その度にやる気が出ず挫折している
「IDEのこんな部分が便利」という点があれば教えてほしい

624:デフォルトの名無しさん
09/04/26 08:41:18
RadRails使っているよ。補完重すぎるし、候補で過ぎて意味ねえ
そんなにすごいいいかって言われると、ないよりマシって感じ。てか重い

625:デフォルトの名無しさん
09/04/26 08:51:16
RadRailsのいいところ

・GUIでデバッグできる。
・メソッドにカーソル合わせるとドキュメント表示(今は日本語化ける)
・インテリセンスみたいな構文考慮した補完が効く(重い、候補多すぎ)
・ファイル構造をツリー表示
・rake タスクをGUIで選択実行

他なにかあるかなー。文脈非依存の単語補完とかスニペットはテキストエディタでもあるしな。
基本的には、他のIDEと一緒だと思うけど、
全体的にはまだまだ。とりあえず、IDEほしいという人向け。
Visual StudioとかCodeGear(Borland)みたいなIDE想像したら駄目。

あと、>>624も言っているけど、静的型言語のIDEみたいな補完じゃない。
インテリセンスとかで高速で補完しまくってガリガリ書いていくのを経験してきた人が使ったら、
たぶんガッカリすると思うよ。


NetBeansはプロジェクトルートに.rb置けないww ので即アンインストールした
あと、クリップボード処理がうんこ。まともにコピー、ペーストもできないIDEワロタ
めちゃくちゃ軽くて初見はすばらしかったんだけどね

626:デフォルトの名無しさん
09/04/26 08:54:36
RadRails追加。というか、ほとんどEclipseの機能だと思うけど

・インクリメンタルでメソッド選択してジャンプ
・インクリメンタルにファイル検索して開く
・指定ファイルの指定行に飛ぶブックマーク機能

Aptanaの機能も入れるなら、Aptana Cloudと連携してIDEから一発デプロイとかまあ、あるけどさ
(でもどうせデプロイはCapistranoとかで書いてるでしょみなさんは)

627:デフォルトの名無しさん
09/04/26 08:56:54
NetBeansは、autotest対応はよかったな。
autotest/screenみたいに、エディタの下に色つきで表示出る

628:デフォルトの名無しさん
09/04/26 22:43:18
1.8.7とVistaHPという環境でコマンドラインからRubyファイルを実行すると
pメソッドもprintメソッドも日本語が文字化けします。
起動オプションで -Ks を指定しても文字化けします。
ファイルのエンコーディングはUTF-8ですがSHIFT-JISで保存し直しても文字化けします。
NetBeansでデバッグすると、printでは文字化けしませんがpだと文字化けします。
何が原因でしょうか?

629:ごすけ
09/04/26 22:59:17
こんばんは。質問させてください。
/*引数(自然数)n(<=1000)の入力に対して1~nの間の素数をすべて求めて、
コンソールに表示するプログラムを作成せよ。(ちなみに1は素数ではない)*/
のC言語でのプログラムの作り方を教えてください。ルートは使わず、なるべくfor文で
お願いします。

630:デフォルトの名無しさん
09/04/27 00:56:22
スレリンク(tech板)
C/C++の宿題片付けます 125代目

631:デフォルトの名無しさん
09/04/27 09:54:55
>>628
Vistaのことはわかんけど、

>NetBeansでデバッグすると、printでは文字化けしませんがpだと文字化けします。

これはしょうがないんじゃないかな。他の環境でも同じだと思う。

-- hoge.rb --
puts 'ほげ'
p 'ほげ'

-----------

$ ruby hoge.rb
ほげ
"¥343¥201¥273¥343¥201¥222"

正確に言うと、これは文字化けではなくて、文字列をバイナリ表記したもの。
p は引数をinspectした結果を表示するけど、日本語を含む文字列だとinspectするとバイナリ表記になってしまう。



632:デフォルトの名無しさん
09/04/27 13:32:05
array への追加についての質問です。
DBのいくつかのテーブル数分検索し、検索結果を配列に追加したいです。

my_array = []
for table_name in table_names
 my_array.push = my_func(table_name)
end

上記のコードだと、my_func が返す array を、my_array の要素とするので2重の配列になってしまいます。

result = my_array + my_func とすると、
配列の後ろにどんどん要素を追加することができ、これが自分のやりたいことなのですが、
Rubyのリファレンスをみると、array の + は my_array は変更せず、左辺に新しい配列を作成します。

上記の for table_name in table_names は結構なループ量になり、
かつ my_func が返すレコード件数(配列のサイズ)も大きいため、毎回
新しい配列を作って返すのは、コストが高いのではと懸念しています。

そこで下記のようなコードを書きましたが、+ でつなげるのと下記のコードと、
どちらがいいでしょうか?

my_array = []
for table_name in table_names
 result = my_func(table_name)
 result.each do |val|
  my_array.push val
 end
end

633:デフォルトの名無しさん
09/04/27 13:58:34
my_array.concat(my_func(table_name))


634:632
09/04/27 14:09:10
>>633
ドンピシャです!! どうもありがとうございました。
おなじ Array のマニュアルページに書いてあるのに見逃してしまった。

635:デフォルトの名無しさん
09/04/27 15:54:07
Singletonをインクルードしたクラスのinstanceメソッドに引数渡せないのって不便くね?

636:デフォルトの名無しさん
09/04/27 16:43:27
生成時に渡す引数によってオブジェクトの振る舞いが変化するようなものは
そもそも Singleton に向かないってことなんじゃまいか?

色々必要ならそんだけクラス作れよと

637:デフォルトの名無しさん
09/04/27 17:01:35
instanceに引数が渡せるほうが不安だ。

638:デフォルトの名無しさん
09/04/28 04:54:52
>>635
Singletonをインクルードしたクラスを生成するメソッドを書けばおk

639:デフォルトの名無しさん
09/04/28 13:05:27
どこで聞いたらいいのかわからんのですが、ここで聞きます。

Ubuntu 8.0 LTSだと apt-getで入るのが Rubyが1.8.6なのですが、1.8.7が使いたいです。
1.8.7使うには自分でコンパイルするしかないのでしょうか?

Rubyスレの方がよかったら誘導してください

640:デフォルトの名無しさん
09/04/28 13:09:08
すいません、Ubuntu 8.0 LTS → Ubuntu 8.04 LTS です

641:635
09/04/28 13:17:57
ごちゃごちゃやってたら、頭の中がこんがらがってきた。

結局コンストラクタに引数を渡せるようにしたままsingleton化したい場合は、Singletonモジュールは
使わずに、該当クラスのnewメソッドを複数のインスタンスを生成できないように書いてしまえばいい
だけ? とか思ったが、何か根本的に間違ってるような気もするw

クラスメソッドとしてのnewは明示的に書けてしまうみたいだけど、その場合自分(クラス)のインス
タンスを生成するコードはどうやって書けばいいのかな? newメソッドはインスタンスを返すのが
普通だから、それを生成するコードがどうしても必要だよね?

642:デフォルトの名無しさん
09/04/28 13:22:57
>>640
自前ビルドでRubyを入れると、他のRubyに依存してるパッケージも全て
自前ビルドするか、パッケージの依存関係をごまかすかしなきゃならない。

どちらにしてもすごく簡単ではないけど大丈夫?

643:デフォルトの名無しさん
09/04/28 15:58:25
>>641
自己レス。

特定のクラスが(自分の定義中で)自分のインスタンスを生成するには、クラスメソッド(たとえばnew)
の中で<自分の名前>.allocateを実行すればいいらしい。(allocate自体はどこからでも呼べる)

ただしそのインスタンスをinitializeするには、(自分の定義中にある)他のインスタンスメソッドを
介さなければならない。

なぜなら、<自分の名前>.allocateの戻り値をinstで受け取ったとするとinst.initializeとしたくなるが、
initializeはprivateメソッドなのでレシーバ省略形式でしか呼び出せず、レシーバ省略形式で呼び出す
には、(クラスメソッドから呼び出せる)publicなインスタンスメソッドの中で呼び出すしかないから。

644:デフォルトの名無しさん
09/04/28 18:20:00
>>639
>1.8.7使うには自分でコンパイルするしかないのでしょうか?
うんそう。
UbuntsuってDebian系だよね。DebianだとRubyが複数のパッケージに分散していてインストールするのがめんどくさいから、
おれが試した時は自前でインストールするほうが簡単だった。

以下おれの方法。rubyのバージョンごとにディレクトリを分けているので、configureするときに--prefixをつけてる(つけなければ/usr/localになる)。

wget fURLリンク(ftp.ruby-lang.org)
tar xjf ruby-1.8.7-p160.tar.bz2
cd ruby-1.8.7-p160/
sudo mkdir -p /usr/local/ruby/1.8.7-p160
./configure --prefix=/usr/local/ruby/1.8.7-p160
make
sudo make install


645:デフォルトの名無しさん
09/04/28 19:24:22
パッチレベルすらディレクトリを分離してるのか。
まあその方が、トラブル時には切り分けやすいか…。

646:デフォルトの名無しさん
09/04/28 19:27:09
ディスクがたくさんあっていい感じだ

647:デフォルトの名無しさん
09/04/28 19:29:02
文字列、配列、ハッシュの初期化の書き方についての質問です。
以下のそれぞれのペアは、等価?(どっちで書いても良い?)

my_string = ""
my_string = String.new

my_array = []
my_array = Array.new

my_hash = {}
my_hash = Hash.new

648:デフォルトの名無しさん
09/04/28 19:35:46
>>647
Yes

649:647
09/04/28 19:37:17
>>648
どうもありがとうございます!

650:デフォルトの名無しさん
09/04/28 22:30:36
>>643
inst.instance_eval{initialize} じゃダメ?

651:デフォルトの名無しさん
09/04/28 22:35:42
さすが マーチンファウラーお気に入りのベストパートナー
世界に羽ばたく
Ruby on Railsオフショアアジャイル開発
URLリンク(www.tech-arts.co.jp)


652:デフォルトの名無しさん
09/04/28 23:17:58
てか self.class.new でダメなことって少ないよな

653:デフォルトの名無しさん
09/04/29 00:17:47
今まで数年間、テキストエディタのみでプログラミングしていたのですが
そろそろIDEにも、試しに手を出してみようかと考えています

Rubyに対応したIDEを探してみると、RDEの他には
Aptana Rails、NetBeans、Eclipse DLTKが見つかったのですが
これらの中で「これがオススメ」というものはありますか?
シンプルで理解が難しくないものを求めているのですが……

654:デフォルトの名無しさん
09/04/29 00:44:01
特にありません

655:デフォルトの名無しさん
09/04/29 01:02:37
テキストエディタのみとかおれには考えられん
環境がなかった昔はもちろんやってたけどな

656:デフォルトの名無しさん
09/04/29 01:23:39
俺は今のところ IDE なしでもそんな不便はしてないかな
Cygwin + bash + vim + rake + 自作ツールっていう構成だけど

ただ、やってるうちに Rakefile がでっかくなっていくけどw

657:デフォルトの名無しさん
09/04/29 02:02:23
テキストエディタのみって言っても
UNIX環境の支援のもとに emacs やら vim 使ってるのと
Windowsでメモ帳とか使ってるのとでは全然違うよな

658:デフォルトの名無しさん
09/04/29 04:01:50
emacs + αで十分IDEチック

659:デフォルトの名無しさん
09/04/29 06:02:34
メモ帳はまさにメモ帳であって。

emacsはフルカスタマイズ可能!ってか。
変態的な操作方法をもちょっと控えて、GUIベースのタブでバッファを切り替えるような
ものなら、もうちょっとご新規さんにもアピールするかと思うんだが。

660:639
09/04/29 09:15:30
>>642
そうなのかー。

>>644
バージョンごとにやってるんですか。うおすごいですね。
コンパイル自体は大変ではないみたいですね。
問題はバージョンアップかあ。
aptとかで入れれたらうpでとも自動化できるのになあ

っと思って検索していたら、8.10のパッケージを使って1.8.7を入れる方法を見つけました。
最近のUbuntu では Ruby 1.8.7が標準みたいですね
簡単そうなので、まずは、これから試してみたいと思います。

Installing ruby 1.8.7 (and guessnet) on Hardy ? vanutsteen.nl => nerds only
URLリンク(www.vanutsteen.nl)


スレ違いそうな話題にレスしていただきありがとうございました。
とういか、Ubuntuスレに投下してたつもりでしたw

661:デフォルトの名無しさん
09/04/29 09:26:19
>>659
(EmacsをEmacsとして理解できないものには)Emacsを使うのは難しい。

Aquamacsだとタブが出るけどな。

662:デフォルトの名無しさん
09/04/29 11:35:56
>>643
たぶん普通は

require 'singleton'
class C
include Singleton
def initialize
@i = nil
end
attr_accessor :i
def self.init(i)
c = self.instance
c.i = 1
c
end
end

p C.instance #=> #<C:0xb7d853e4 @i=nil>
p C.init(1) #=> #<C:0xb7d853e4 @i=1>
p C.instance #=> #<C:0xb7d853e4 @i=1>


663:デフォルトの名無しさん
09/04/29 12:08:41
>>662
それを許すんならもはや定数に代入した普通のオブジェクトと変わらない気が

664:デフォルトの名無しさん
09/04/29 12:24:00
ていうか、読みにくい

665:635
09/04/29 15:10:47
みなさんレスありがとうございます。

>>650
> >>643
> inst.instance_eval{initialize} じゃダメ?

それでよさそうですね。初めて知りました。


もともと>>635と書いたのは、「引数を渡したいのは初期化の時だけだが、一度instanceしてから
値を渡すのが面倒」というのがあったからなので、>>662のやり方が簡単で良さそうです。

>>662の中の
> c.i = 1

> c.i = i
ですよね。

結局自分もsingletonにする意味あんまりないなと思い始めてしまってますが、最初の動機がたいした
ことじゃなかったということですね。

666:デフォルトの名無しさん
09/04/29 15:44:41
ruby-pg-0.8.0ってPGresultのresultって使えますか?
num_tuplesとかは正常なのにresultとかstatusだとNoMethodErrorになります。
今までずっと古いやつを使っていたんですがメソッド名が変わったりとかしたんですかね?

667:デフォルトの名無しさん
09/04/29 18:01:56
>>666
おお!俺も数日前にそれで困ってましたw

俺がしたこと
1) requireの置き換え
require "pg" # require "postgres"

2) resultメソッドの置き換え
res.map {|rowmap| res.fields.map {|f| rowmap[f]}} # return res.result

resultが無くなったのか、名前が変わったのかは知りません。
statusのほうは使ったことがありませんのであしからず。

668:666
09/04/29 18:39:50
>>667
ありがとうございます!取得できるようになりました!

根本的な原因は気になりますが、
とりあえず動くようになったのでよしとします。

669:653
09/04/29 18:58:20
いろいろなご意見ありがとうございます!
基本的にエディタ派の方が多いようですね
ただ、655さんの環境も気になります

>>657
Windows環境で、主にNotepad++を使ってスクリプトを書いております
コマンドライン環境はNYAOS+GnuWin32の構成です

670:デフォルトの名無しさん
09/04/30 12:34:03
>>669
>>625-627から上の流れも参照してくれ

671:デフォルトの名無しさん
09/04/30 18:29:51
VRFormってどこにあるの?rubyのフォルダを検索しても見つからない。
ほとんどのコントロールはvrcontrol.rbにあるのに。

672:デフォルトの名無しさん
09/05/01 09:25:00
Array同士を簡単に同じでない行を調べることってできませんでしょうか?
a - a2みたいだと、差分という感じではない気がします。
通常のdiffツールだと、出力結果が上から調べるので順番に依存してしまいます(´・ω・`)

673:デフォルトの名無しさん
09/05/01 09:26:40
>>672
あああああ、
pp (a2 - a)
pp (a - a2)
とお互い引けば、いいのかw

書いて気づいた
同じでない行ではあるか

674:デフォルトの名無しさん
09/05/01 09:44:33
メソッド呼び出しにおいて、メソッド名と引数を囲む括弧の間には、
スペースを入れないことをおすすめする。

675:デフォルトの名無しさん
09/05/01 17:16:25
排他的論理和は (a|a2) - (a&a2) でも

676:デフォルトの名無しさん
09/05/02 17:32:42
エクスクルゥーシブー・オアッ!!

677:デフォルトの名無しさん
09/05/02 19:53:16
勉強始めたらいきなりこんなもん見つけたんですけど。
バグでしょ?
#ruby 1.8.7p72 mswin32
module A
def f()
print "test ok!\n"
end
end
#include A
A::f()

test.rb:7: undefined method `f' for A:Module (NoMethodError)
ちゃうか~

678:デフォルトの名無しさん
09/05/02 19:57:48
>>677
URLリンク(www.ruby-lang.org)
素のままだと「Aというオブジェクト」がもってるメソッドじゃないし。

679:デフォルトの名無しさん
09/05/02 19:58:24
Rubyに限らないけど、まず自分のプログラムに問題がないか考えた方がいいよ。
2~3回くらい恥をかけば直るんだけどね。最初からかかないことにこしたことはない。

680:デフォルトの名無しさん
09/05/02 19:59:58
Rubyのめんどくさいところにいきなりぶつかるセンスは賞賛に値すると思う

681:デフォルトの名無しさん
09/05/02 20:17:12
そっか、バグじゃないかぁ
コメントアウトしてあるinclue Aを生かすと、動作しちゃうんですけど。
変じゃね?

682:デフォルトの名無しさん
09/05/02 20:19:44
>>681
どうしてコメントをはずすの?
なんのためにコメントをはずすの?

683:677
09/05/02 20:32:47
なんのためにといわれても...
テストプログラムだからいろんなケースを比較して、
変じゃないかなと

684:デフォルトの名無しさん
09/05/02 20:39:47
つまり、意味もわからずincludeしたりしなかったりを試していると。


685:677
09/05/02 20:56:15
print Math::PIは動くね。
もっとも、Mathはrubyインタープリターによって
特別待遇を受けているだろうから、あまり比較にはならんだろうけど。


686:デフォルトの名無しさん
09/05/02 21:18:41
>>685
>>681は目の付け所いいなと思ったけど・・・
Module#module_functionは読んだ?

687:677
09/05/02 21:37:08
なるほど、すくなくとも仕様であることは、理解しました。
どうもありがとうございます。
しかし、なんとも不可解に見える仕様。でも、理由があるんでしょう。
勉強します。

688:デフォルトの名無しさん
09/05/02 21:37:55
>>683
ちゃんと理由を考えながらテストしないと、あまり意味がないぞ

結論から言うと理解を間違えている
A::f() の形でメソッドを呼びたいなら、次のような方法を使うべき
(他にも特異クラスを使った方法とかあるけど、ここでは省略)

1.
def A.f()
end

2.
module A
 module_function

 def f()
 end
end

689:デフォルトの名無しさん
09/05/02 22:54:31
module_functionというのは知らなかったので試してみた。
折角なので張っておく。 これで>>677の疑問も解けるとよいけど。
irb(main):001:0> module M
irb(main):002:1> def self.f() [:module, self] end
irb(main):003:1> def f() [:instance, self] end
irb(main):004:1> module_function
irb(main):005:1> def mf; [:module_function, self] end
irb(main):006:1> end
irb(main):007:0> class C
irb(main):008:1> include M
irb(main):009:1> def cmf() mf end
irb(main):010:1> end
irb(main):011:0> c = C.new
=> #<C:0x28de620>
irb(main):013:0* M.f
=> [:module, M]
irb(main):014:0> C.f
NoMethodError: undefined method `f' for C:Class
irb(main):015:0> c.f
=> [:instance, #<C:0x28de620>]
irb(main):016:0> M.mf
=> [:module_function, M]
irb(main):017:0> C.mf
NoMethodError: undefined method `mf' for C:Class
irb(main):018:0> c.mf
NoMethodError: private method `mf' called for #<C:0x28de620>
irb(main):019:0> c.cmf
=> [:module_function, #<C:0x28de620>]
irb(main):020:0> include M
=> Object
irb(main):021:0> mf
=> [:module_function, main]

690:デフォルトの名無しさん
09/05/02 23:12:33
さっきのを書いている間に生じた疑問がひとつ。
親クラスのクラスメソッドは継承されるけど、
インクルードしたモジュールのクラスメソッド(?)は継承されない。
module_functionのクラスメソッド側もやはり同じ。

いったいどういう理由でこうなっているの?

irb(main):001:0> module M
irb(main):002:1> def self.f() [:module, self] end
irb(main):003:1> module_function
irb(main):004:1> def mf() [:module_function, self] end
irb(main):005:1> end
irb(main):006:0> class C0
irb(main):007:1> def self.cf() [:class, self] end
irb(main):008:1> end
irb(main):009:0> class C < C0; include M end

irb(main):010:0> C.f
NoMethodError: undefined method `f' for C:Class
irb(main):011:0> C.cf
=> [:class, C]
irb(main):012:0> C.mf
NoMethodError: undefined method `mf' for C:Class
irb(main):013:0> C.new.mf
NoMethodError: private method `mf' called for #<C:0x28d636c>


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