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


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

Ruby 初心者スレッド Part 28



1 名前:one [2009/05/16(土) 10:06:50 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】
   【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
    ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。


29 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 04:02:10 ]
>>28
pts "Hello, World"
sleep 2

って書いてみ

30 名前:22&28 mailto:sage [2009/05/17(日) 04:03:04 ]
大変失礼しました。動作環境を書いていませんでした。

OS) WinXP-Pro(SP2)
Mem) 4GB(実質3.24GBですがw)
Ruby) 1.8.6


>>25-26
有難うございます。


31 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 04:55:44 ]
ruby %* | pause

確か、こんな感じのdo_ruby.batファイルとか作って.rbに関連付けておけばよかった気がした。
失敗した時だけ待つ

常に待つなら、

ruby %*
pause

32 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 05:04:21 ]
まー実際問題としてはいちいちダブルクリックとかフォーカス当ててEnterとかやってられんのだがね

33 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 05:16:27 ]
まあ、世の中には少しだけ便利なバッチファイルとしてrubyを使う人も
いるわけで、定形の作業用スクリプトをたまに起動するだけなら
>>32なんて問題にならないし、
人に説明する場合でも、コマンドプロンプトを開いてコマンドを入力させるより
アイコンをダブルクリックの方が楽だったりする
場合もある

34 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 08:14:42 ]
>>31
それ知らなかったよ。サンクス

35 名前:34 mailto:sage [2009/05/17(日) 09:04:59 ]
正確には、ruby %* || pause だね

36 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 14:26:56 ]
>>35
一見パイプの拡張かと思ったらexitコードの論理和かよ
cmdで使えたなんて知らなかった

37 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 14:47:10 ]
>>35
うる覚えだった。スマソw



38 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 14:52:47 ]
「うろ覚え」な。

今覚えとこうな。

39 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 15:16:47 ]
得意げに typo に突っ込んでいるかも知れないという危惧を
少しは抱くべきではないだろうか

40 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 15:21:33 ]
>>39
ttp://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=%E3%81%86%E3%82%8B%E8%A6%9A%E3%81%88&num=50

41 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 15:27:59 ]
「うる覚え」は少なくとも誤記ではないな
「う・る・お・ぼ・え」と書くつもりで正しく書いてるだけだ
その人にとっては「うる覚え」が完全に正しい

もちろん「うろ覚え」が辞書上も多数派的にも"正しい"が、
だからといって今更「うる覚え」がなくなるわけでもなく

42 名前:デフォルトの名無しさん [2009/05/17(日) 15:30:24 ]
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /

43 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 20:31:45 ]
今日1日かけて自作スクリプトのクラス名やメソッド名を書き換えてそれに伴う構造再構成をした
見通しがちょっとよくなったような気がする
Rubyあんまり関係ないな

44 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 20:35:40 ]
def hoge
 h = Hash.new
  …
 return h
end

というメソッドを勢いで作ってしまうことはある
適切な名前を付けるべきだとは思うんだけどね

45 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:12:55 ]
CRubyでは通るけどJRubyではまだ通らないようなテストがあります。
で、とりあえずこのテストをJRubyで通るようにするのはあとまわしにすることに決定しました。
このとき、そのテストに『今はテストが失敗するけどあとまわしにするよ』というような目印をつける方法が
Test::UnitかRSpecにあったと思うんですけど、どなたかご存じないですか。
ぐぐろうにもキーワードが思いつきません。

46 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:16:01 ]
>>44
「スコープが広いものにほど明瞭な(長い)名前を付けよ」って一般原則からすれば
メソッドが十分短いならhは許されるだろう。hogeは不味いだろうけど
というか、極端に長すぎるのも考え物
記述密度が上がって逆に可読性を落としてしまう

Linusに言わせれば
>Modula-2 や Pascal のプログラマとは違って、C言語プログラマは 「こ
>の変数は一時的に使われるカウンターである(ThisVariableIsATemporaryCounter)」
>などというような気のきいた名前は使いません。C言語プログラマは、"tmp" な
>どの十分に書きやすく、それでいて少なくとも分かりにくくはならない変数名を
>選ぶものです。

Rubyも立場的には近いと思う
to_sとか、意味が通る限りにおいて短い名前を希求する

47 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:19:50 ]
>>45
RSpecのpendingのことかな
詳しくはるびまの連載記事に載ってる



48 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:39:47 ]
>>47
それです。さんきゅー。あいしてる。

49 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 11:07:46 ]
>>12
>File.open('file.xml', 'r+') do |f|
> f.flock(File::LOCK_EX)
> f.truncate(0)
> f.rewind
> f.write('<?xml version="1.0" ?>')
>end

'r+' だとファイルが存在しなかったときにエラーになるよね。
それがいやで、自分は 'r+' じゃなくて 'a' にしてるんだけど、なにか問題あるでしょうか。
詳しい人のコメント求む。

50 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 11:18:10 ]
'a' はファイルの最後から書き込む
'r+' はファイルの先頭から書き込む

対象のファイルが全くの空である場合は動作が「たまたま」同一

51 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 11:20:57 ]
なら IO::CREAT|IO::WRONLY で

52 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 11:24:10 ]
>>49
「あるはずのファイルが無い」とか「書けるはずなのに(権限などで)書けない」なんてのは
似たようなもんで、どのみちきっちりやるならチェックなり例外処理なりしなきゃいけない。
つまり、こまけぇこた(ry

53 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 11:38:29 ]
>>49

def exclusive_write(path, content)
 body = lambda{|f|
  f.flock File::LOCK_EX
  f.write content
  f.truncate f.tell
 }
 File.open(path, 'r+', &body)
rescue Errno::ENOENT
 File.open(path, 'w', &body)
end

自分の過去を掘り返してきたらこんなんが出てきた。
正しいかどうかは…。

54 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 11:48:30 ]
>>48
> あいしてる
これは、

 あいしてる ( ^з^)-☆Chu!!

までやるべき

55 名前:17 mailto:sage [2009/05/18(月) 17:02:45 ]
前スレの982です(ファイルアクセスが他のソフトとぶつかる場合で質問)。

皆さんのレスを一通り見ましたが、File.openの箇所で工夫するというのが定石
なのでしょうか?
本を読んでいたら、 File.readable?(path) と File.writable?(path) なるものが
ありましたが、(これらが未だ登場しないといいうことは)使うと何か弊害が
生じるのでしょうか?


56 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 17:54:21 ]
>>50
>'a' はファイルの最後から書き込む
>'r+' はファイルの先頭から書き込む

そうなんだけど、今の場合は f.truncate(0) して f.rewind(0) してから書き込んでいるから、
最初のファイルポインタの位置は関係ないよね。

>>51
これって何?初めて見るんだけど。マニュアルに書いてある?

57 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 18:05:17 ]
>>56
ttp://www.ruby-lang.org/ja/man/html/File_Constants.html



58 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 18:07:42 ]
>>52
そういえば昔、CGIだけどレンサバの容量の制限(quota?)でファイルが書けず、
1日分のデータが無くなったってトラブルがあったな・・・(遠い目

59 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 18:11:38 ]
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /


60 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 18:46:21 ]
マジックコメントをとりあえず強制的に utf-8 あたりで自動挿入する機能とかないかな
Emacsでいいんだけど

61 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 19:00:04 ]
ttp://d.hatena.ne.jp/rubikitch/20080307/magiccomment

62 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 21:16:28 ]
1.9に添付されてるruby-mode.elを使え

63 名前:デフォルトの名無しさん [2009/05/19(火) 01:53:42 ]
wonko.com/files/crackup-1.0.1.tar.gz

こいつのソース見てくれ。殆どの処理が module として定義されて
普通に実行しただけでは何も起こらないよね?

これはどうなっているの?
よくわからないけど、rubygems がゴニョゴニョしていると考えていいのかい。

64 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 02:20:21 ]
crackup-1.0.1$ rak "at_exit|END"
lib/crackup.rb
288| at_exit do

まったく読み込んでないが、これじゃないか。

65 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 02:26:30 ]
単純にmodule直下で色々やってるだけっぽいけど

66 名前:63 [2009/05/19(火) 02:36:16 ]
>>65
すまん、勘違いしていた。さんくす。

67 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 08:09:15 ]
>>60
検索すると、マジックコメントが Ruby(と Ruby が参考にした Python)独自のものだと思ってる人がちょくちょくいる模様
これ Emacs 自身が解釈する文字列で、読み込むファイル全般で効くから
-*- coding: utf-8 -*-
の行があったら Emacs はその文字エンコーディングだとみなして読み込むから
嘘だと思ったら

-*- ruby -*-

とだけ書いた hoge ファイルを Emacs で読み込んでみるといい
いわゆる拡張子がなくて判断情報がないはずなのに ruby-mode になるからさ
-*- perl -*- と書いたら perl-mode に、 -*- html -*- と書いたら html-mode になる



68 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 09:50:33 ]
>>67
ほー知らなかった。emacsはそういう機能があるんだな。vimも似たようなのなのなかったっけ?

69 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 11:28:56 ]
>>68
67 じゃないけど
jp.rubyist.net/magazine/?0025-Ruby19_m17n#l18


70 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 16:27:04 ]
Rubyの、文字列中に任意の式を埋め込む機能は式展開という名前らしいですが、
これを英語でいうと何といいますか。

71 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 16:58:19 ]
まんまだけどembedded expressionとか?

72 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 17:20:32 ]
ruby-doc.org の Programming Ruby だと、その他のエスケープと一緒に
substitution となってるな。

73 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 20:31:20 ]
少しお聞きします。
メソッドチェーンの途中で nil があってもそれ以後予期に計らってくれる便利なハックや方法はありませんでしょうか?

Delphi Prismのコロン演算子みたいなのです(例がマイナーすぎてスマソ・・)
Colon Operator - Delphi Prism
prismwiki.codegear.com/en/Colon_Operator

74 名前:73 mailto:sage [2009/05/19(火) 20:36:41 ]
すいません。
>>73 ですが、既存のgemsとかのユーティリティ的なものがあればそれキボンという感じです。
わがままですいません…。
Activeなんたらとかにないのかなーと探しているのですが、見つからず

75 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 20:40:43 ]
((o = obj.hoge()) && (o = o.page()) && (o = o.moge()) && o.done()) || (puts "nil!!!")

・・・ごめん、忘れてw

76 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 20:59:01 ]
演算子として使いたいなら、言語機能として組み込まれないとどうにもならないように思える
あえて小手先の拡張でなんとかするなら・・・こんな感じか?

obj.send_if_defined(:method1).send_if_defined(:method2)

77 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 21:08:54 ]
>>73
眺めた程度ではリンク先の意味を理解できず申し訳ないのだけど
良きに計らうっていうのは具体的にどういう挙動を期待してる?

ふとこんなのを思いついた
class Nil; def method_missing; return nil; end



78 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 21:22:12 ]
>>73
メソッドチェーンを使わないか、
期待した返り値にならない場合は例外出して抜けるメソッドだけをチェーンに使うか、
NoMethodError を rescue する

79 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 21:59:40 ]
>>70
variable interpolation
いや、
expression interpolationだな。


80 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 22:00:42 ]
>>73
ActiveSupportのObject#tryおよびそれの同等品でどうか。
実態はsendだが、nilにだけはnilを返すように定義されている。


81 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 22:17:57 ]
ま た R a i l s か
でもこれ確かに便利だな

ttp://d.hatena.ne.jp/takihiro/20090204/1233745492

82 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 01:11:27 ]
tryを1.9に取り込むって話はどうなったんだっけ?

83 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 01:18:26 ]
>>82
catch〜tryのtry?
それとも


84 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 01:39:50 ]
haskellのめいびーがうんたらかんたら

85 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 02:18:00 ]
>>82
名前がよければ採用してもいいという話になっていたと思うが、
誰かが思い出させないとそれきりかな?
いちおうRedmineには入っていたハズ。



86 名前:73 mailto:sage [2009/05/20(水) 04:16:49 ]
ActiveSupportのtryですね。確かにそんな感じですw
ちょっと使ってみようと思います。

> require 'activesupport'; [4649, "HageUnko", nil].map{|i| i.try(:+, i) }
[9298, "HageUnkoHageUnko", nil]

ありがとうございました。

87 名前:デフォルトの名無しさん [2009/05/20(水) 04:51:55 ]
WinXP-ProでRubyは1.8.6です。
ttp://www.func09.com/wordpress/archives/154 
を参考にSocketサーバーを作りたいと思っています。

先ずは、server_client.rb中の require "socket_server" について調べましたが、
リファレンス ttp://www.ruby-lang.org/ja/man/html/socket.html には socket_server
というライブラリはありません。

もしかして、ある時期から単に socket になったのでしょうか?
参考サイトの日付は2007年10月です。




88 名前:87 mailto:sage [2009/05/20(水) 06:35:46 ]
(補足)
目標は、厳密にはXMLSocketサーバーです。


89 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 10:43:00 ]
obj = PStore.new(path)
pstore = obj.transaction
p pstore.roots
pstore.close

とすると、2行目で止まって、Ctrl+C すると

/usr/lib/ruby/1.8/pstore.rb:296:in `flock': Interrupt
from /usr/lib/ruby/1.8/pstore.rb:296:in `transaction'
from /home/俺/上記ファイル.rb:2:in `hoge_method'

というようになるようになってしまったんだが、
似たような現象にぶち当たった経験があるとかで原因の心当たりある人いる?

90 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 11:31:07 ]
flockってことはファイルロックしっぱなしなんじゃないのか?
他のスクリプトやエディタ(てことはないか・・・)が開いててロックしているとか

91 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 12:34:18 ]
>>90
あ、ほんとだ、超でっかいpstoreのトランザクションの奥で同じファイルをPStore.newしてる
何がどうなっていつのまにこうなったんだ、これ

まあいいや、ありがとう

92 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 15:02:35 ]
>>79
>interpolation

さんくすです

93 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 15:17:04 ]
存在してないファイルからpstoreで読み込んだときに何が返るかの記憶法あるかな
nil だったか空のハッシュだったかぜんぜん覚えられないんだが

94 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 15:17:49 ]
irbでさくっと試せ

95 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 15:21:43 ]
わざわざターミナル開いて

irb
require 'pstore'
PStore.new('1').transaction{|p| p[p.roots.first]}

これを打つのがしんどいから聞いてるんだよ逆切れ

96 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 15:25:05 ]
PStoreでハッシュを保存してるとわけわかめになることが全くないでもない

というかなんであれは ENOENT とか発生しないのは何故?

97 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 15:34:21 ]
>>93-95
言うのをめんどくさがるから却ってめんどくさくなる好例だなw
まあそのコードが一発で出てきたところから推測できるように
rootsの初期値は空のArray
nilもHashもfirstが通らん



98 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 15:49:54 ]
pstore は、ファイルが存在しているかどうかを全く関知しない

ファイルがそもそも存在しない場合も、
ファイルはあるけど登録が空である場合も、
ファイルがあって何らかのデータが登録されてる場合も、
transaction の返り値オブジェクトの [] メソッドはハッシュのように振舞うし、
fetch メソッドはキーの有無をチェックして例外を出す

ということで、 ファイル自体が無い場合もそのキーでの登録が無い場合も一律 nil だな
nil をキーとして何かデータが登録されていると誤動作するであろう pstore 利用スクリプトは時々見る

99 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 18:00:35 ]
ruby 1.8.6 で日本語を slice しようと思ってます。

ttp://taiyaki.org/ruby/jstring/

が定番でしょうか?
最終版が 2003-5-7 ですが、枯れているのか
放置されているのか分からなくて。

100 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 18:14:13 ]
>>99
UTF-8で、
puts "日本語".scan(/./u)[1]

とかではいかんのでしょうか?

101 名前:99 mailto:sage [2009/05/20(水) 18:32:30 ]
>>100
できました。ステキ。

/./u の u がないともっとステキなのですが、
これはどうしようもないのでしょうか。

102 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 18:41:55 ]
じゃあメソッド作って隠せ
それで>>99と同じになる

103 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 18:47:03 ]
>>101
$KCODE設定だけでいけるんじゃないかと。
詳しくは知らない

ttp://www.ruby-lang.org/ja/man/html/FAQ_C6FCCBDCB8ECA4CEBCE8A4EAB0B7A4A4.html

104 名前:デフォルトの名無しさん [2009/05/21(木) 00:14:09 ]
ファイルからUTF8のテキストデータを読んだのですが、

p line[0,2]

としても期待どおりに文字を切り出せません。
どう書けばよいのでしょうか?

105 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 01:01:58 ]
>>104
期待とは line = 'こんにちは' のとき line[0,2] #=> 'こん' ということ?

1.8系 $KCODE = 'u' 前提
1.8.6 までなら line.split(//)[0,2].join
1.8.7 なら line.chars.to_a[0,2].join でも。
おまけ line[0, 6] # 漢字(1文字3バイト)のみからなるのが確実な場合

1.9系
エンコーディングが正しければ、それで期待どおりになる。

106 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 01:25:29 ]
>>105
ありがとうございます。うまくいきました。

107 名前:デフォルトの名無しさん [2009/05/21(木) 02:02:56 ]
1〜10の数字のうち、ランダムに5個を選ぶ記述で悩んでいます。

単純に r=rand(10) r=r+1 を5回やるとしても、5,4,8,8,7と同じ数が並ぶ
可能性があり、条件式で判別するのは元の数が増えた場合を考えると
スマートではないような気がします。
(数が増えて100万個の中から1000個を選ぶとか)

何か良い方法はありますか?




108 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 02:37:07 ]
>100万個の中から1000個を選ぶ
大きな量でも扱える方法が少量の際でもスマートとは限らないから
別個に考えた方がいいと思う

とりあえず一例
ary = []
(1..10).each{|i| ary << i }
5.times{ puts ary.delete_at(rand(ary.length)) }
もちろん数が大きい時には向かない

109 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 02:38:04 ]
なんで書き込んだ直後に(1..10).to_aを思い出すかなorz

110 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 02:48:19 ]
numbers=[]
while numbers.size<5
  numbers|=[rand(10)]
end
こんな感じかな
乱数の出てきた順番がどうでもいいならSet使ったほうが良いと思うが

111 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 02:49:31 ]
>>107
step.0 選ばれた数の総数 n = 0
step.1 1を選ぶ確率 5/10
step.2 2を選ぶ確率 (5-n)/9
step.3 3を選ぶ確率 (5-n)/8
...
nが5になるまでstepごとに0から1の一様乱数を発生させて確率以下ならその数を選択することを続ける

112 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 03:54:58 ]
それと選ぶ総数が全体数の半分以上なら選ばない数の方を選択して
それを全体から除外するようにしたほうが特に全体数が多い場合は現実的な効率はいいと思う
起こりうる最悪ケースではどちらでも変わらないし全体数の半分程度を選ぶとかではあまり関係ないけど
それから全体数が多いときは一様乱数の有効数字の桁数が問題になるかもしれないので
0から1の浮動小数でなく選択確率の分母以下の整数値をランダムに生成して分子と比較するとかの方がいいかも
でもそれでよくなるかどうかは乱数の生成方法次第だしそもそも100万個くらいならこれは問題ないのかな?

113 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 04:19:05 ]
100まんこのランダム抽出程度なら手抜きで作っても普通に終わるだろ

result = Array.new
max = 1_000_000 ; period = max / 100
$stdout.sync = true
print 'prepareing...' ; base = (1..max).to_a ; puts "done"
while e = base.delete_at(rand(base.size)) do
result << e
print '.' if (result.size % period).zero?
end
puts
p result.size
p result[0],result[max]

ごめん嘘ついた
インジケータ1個も出ない(w

114 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 05:50:28 ]
spec_helper.rb って spec コマンドが勝手に探して自動で読んでくれる便利なファイル名とかそういうのじゃないのね

require '../../../spec_helper'

とか spec ファイルの最初に書くのカッコ悪いんだけどもこれは構造上仕方ないのかな

115 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 06:01:28 ]
それだとカレントディレクトリ以外で spec コマンド使ったときに動作しないぞ

require "#{File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..', '..', '..', 'spec_helper'))}"

こうだな
長大なファイルパスを記述するのが面倒だから spec_helper を使おうと思ってる人には逆に憂鬱かもしれん
しかしこれ1行で済むとも言えるが

116 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 08:04:42 ]
>>107
[*1..10].sample(5)
[*1..1_000_000].sample(1000)

117 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 08:09:23 ]
>>115
なんでわざわざ同じことを何回も繰り返す?

require File.expand_path('../../../../spec_helper', __FILE__)




118 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 09:32:24 ]
File.expand_path の第2引数の扱いは undocumented だからな
現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら
つまり、以下の4つは同じように /full/path/basedir/dir/file を返す

File.expand_path('dir/file', '/full/path/basedir')) # マニュアルを素直に読む場合、第2引数はフルパス
File.expand_path('dir/file', 'basedir'))
File.expand_path('dir/file', File.dirname(File.expand_path('file_in_basedir'))))
File.expand_path('dir/file', 'file_in_basedir'))

というか、このへんは実験終了と称して次のバージョンくらいでぽっと無くなりそうで嫌だ

119 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 11:40:41 ]
第二引数なし・pathnameなしで一番短いのはこれかな

require File.join(File.dirname(__FILE__), '../../../spec_helper')

でも確かに、spec_helper.rbを自動or独自メソッドで読んでくれれば一番早いとは思う

120 名前:デフォルトの名無しさん [2009/05/21(木) 12:08:01 ]
メモリ上で文字列の圧縮・展開を行いたいです。
そういったライブラリはありますか?

121 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 12:20:56 ]
よーわからんが

irb> require 'zlib'
irb> str = "プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】
   【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
    ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です"
irb> p str.size
560
irb> z = Zlib::Deflate.deflate(str)
irb> p z.size
375

こういう話ではなく?

122 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 12:53:49 ]
>>121
ありがとうございます。zlibを調べてみますね。

123 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 13:31:52 ]
すいません。
>>87をお願いします。


124 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 13:48:27 ]
>>123
socket_server.rb はライブラリではなく単なるアプリケーションで、同じページの
server_client.rb の次に説明されてる


125 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 16:16:25 ]
rspecにて、spec/hello_spec.rbから hello.rbを起動テストしようとしています。

しかし、NetBeansの "rspecテスト"からrspecを起動した場合だけテストに失敗してしまいます。
コマンドプロンプトから spec spec/hello_spec.rb では問題ないのですし、直接 ruby hello.rbでも問題ないです。

warningの文字列で、テストしているので起動時の "-w" をとれば成功するようになるのですが、
コマンドプロンプトからは -w をつけても問題ないのが気になります。

'my script should have no errors or warnings' FAILED
expected not: =~ /warning/n,
         got:    "(Rubyインストールディレクトリ)/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:138: warning: d:/my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8/specifications: Invalid argument\nHelloWorld\n"
./spec/hello_spec.rb:15:
./spec/hello_spec.rb:13:in `chdir'
./spec/hello_spec.rb:13:

hello_spec.rbのソース
require File.join(File.dirname(__FILE__), '/spec_helper.rb')
describe "my script" do
  before do
    @bin_path = File.join(File.dirname(__FILE__), "/../hello.rb")
  end
  
  it "should have no errors or warnings" do
    pending "Hangs on JRuby" if PLATFORM =~ /java/
        
    Dir.chdir(File.join(File.dirname(__FILE__), "/../")) do
      output = `ruby -w #{@bin_path} --help 2>&1`
      output.should_not =~ /warning/n
      output.should_not =~ /Error/n
    end
  end
end

126 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 16:23:38 ]
=~ というマッチャは見たことないな

127 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 16:35:42 ]
>>124
さんきゅう。
同時に、「SocketServerというクラスがリファレンスにないぞ・・・」と思って
いましたが、これも下の socket_server.rb で定義していたんですね。

納得。




128 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 17:06:27 ]
>>125
推測だが、コマンドプロンプトとNetBeansが
それぞれ違う場所にインストールされたrubyを使っていて、それで何かの問題が起こっているのでは?
実際にsource_index.rbの138行目見れば何か分かるかもよ

>>126
あるよ

129 名前:125 mailto:sage [2009/05/21(木) 18:40:11 ]
>>126
正規表現のマッチャみたいです。

>>128
ありがとうさんです。

source_index.rb見てても何故かよーわからんくて、
使われているのがNetBeans標準のjrubyでなくちゃんとMatzRubyにしたよなー、
と思って設定を見直していたころ、gemパスがバグっていたことになっていたことに気づきました。

1行1パスなのに、何故か、
/my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8
と : で区切って2つパスが記述してありました…(´・ω・`)

削除して、/my_home/.gem/ruby/1.8 だけにしたところ、
問題なく動きました!
今思うと、source_index.rbはの該当行はgemパスの処理のところでした。

おかげさまで、無事に解決いたしました。
ありがとうございました。






[ 続きを読む ] / [ 携帯版 ]

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

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