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つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2 :
one :2009/05/16(土) 10:08:33
3 :
one :2009/05/16(土) 10:09:14
4 :
one :2009/05/16(土) 10:09:55
5 :
デフォルトの名無しさん :2009/05/16(土) 10:16:28
いちおつ
ポーニテールなんだからね!
前スレより: >982 名前: デフォルトの名無しさん Mail: 投稿日: 2009/05/16(土) 04:43:41 >ruby1.8.6です。 >ファイルアクセスが他のソフトとぶつかる場合で質問です。 > >Rubyで周期的にXMLファイルを上書きしていますが、この上書きのタイミングと >他のソフトによるXML読み込みが衝突した場合(と思われる時)、 > in 'initialize': Permission denied - new XML.xml (Errno::EACCES) > >というエラーメッセージが出ます。 >そこでRubyの振る舞いとして、他のソフトがファイルアクセス中は上書きを延期するか、 >あるいは別の方法で衝突を回避したく思います。 >何か良い方法はありますでしょうか? > >なお別のソフト側で衝突回避を試みましたが、上手くいかないためRubyに望みを >託すことにしました。
>>7 File#flock を使ってロックすればいいんじゃないでしょうか。
File.open('file.xml', 'w') do |f|
f.flock(File::LOCK_EX)
f.write('<?xml version="1.0" ?>')
end
でどうよ?
>>8 Perlなんかでやってたときは、そのロックだと
ファイルの書き込みオープンでファイル空っぽ
→(他のプロセスからの読み出しの可能性)
→ファイルロック
になるから駄目、だったような。
Rubyのブロックでその辺どうなるんだろ
すまん、前スレにもなかったもんで。書いとくもんかな?
>>9 マルチプロセスだからブロックだろうとなんだろうと関係ない。
・非破壊的にopen
・ロック
・上書き
とやらないとダメだろう
File.open('file.xml', 'r+') do |f|
f.flock(File::LOCK_EX)
f.truncate(0)
f.rewind
f.write('<?xml version="1.0" ?>')
end
でもinitializeでEACCESってことは、その「他のソフト」側はロックじゃなくて 書き込み禁止にしてるような気がするんだが。 そうなるとロック以前にエラーになるわけで、ポーリングしかないんじゃないかな。
flockはNFS越しだと通らなかったりするから 使わない方がいいと思う
前スレ1000はRuby的には10**3だな。
1_000とか
どうも。前スレの982です(ファイルアクセスが他のソフトとぶつかる場合で質問)。
前スレ
>>983 さん,本スレ
>>7-9 ,
>>12-14 さん、有難うぎざいます。
細かい点ですが、
前スレ
>>983 直接
File.open(path,'w'){|f| f.write(data)}
するのではなく
File.open(path_v,'w'){|f| f.write(data)}
File.rename(path_v, path)
ここで、path でなく path_v としているのは、
何か意味があるのでしょうか?
ファイルのロックとはあんまり関連しないが、別名ならなんてもいいんじゃね というかその質問をするってことは動作の意図わかってないんか
>>14 最近の Linux だと NFS でもちゃんと flock できたりするから驚きだ。
>>17 詳しくないけど、
・排他ロックしてないけど、書き込み途中(=壊れた状態)のファイルを読まれる心配がない。
(そんなことできるのかどうか知らないけど。)
・万一書き込み中にこけてもデータが壊れない。
って感じではないかと。
21 :
17 :2009/05/16(土) 21:54:36
>>18 , 20
色々有難うございます。
試しに例外処理を
begin
File.open('newXML.xml', 'w') {|f|
f.write new_xml
}
rescue
puts "XML, unable!"
end
の形で使ったところ、衝突中は上書きがスキップされますが
強制終了は無くなりました。
22 :
デフォルトの名無しさん :2009/05/17(日) 02:33:30
Rubyの実行で質問です。 現在、勉強用に買った書籍付録の実行環境+DOSプロンプトで例えばABC.rbを C:\>ABC.rb などどして実行していますが、アイコンクリックなどの方法で実行する ことは出来ますか?
できるけど、標準出力の特性上、意図したとおりの動作にはならないと思われ ダブルクリックで実行したいのなら自前でウィンドウ作る言語やったほうがいいぞ
>>22 Exerbを使えば実行ファイルにできる
ただ、普通の(標準入力や標準出力を使う)スクリプトだと
実行してすぐにウインドウが閉じるので、あまり意味をなさない
RubyでGUIアプリケーションを作るのなら役に立つ
>>22 可能
ただし、設定方法はOSによって異なる
「拡張子 関連付け」で検索
27 :
26 :2009/05/17(日) 03:48:15
×Windous2000 ○Windows2000 これは恥ずかしい;; 見なかったことにして・・・。
>>23-24 thx
Exerbは確かに直ぐに終了しますが、puts "Hello, World" も
puts "Hello, World"
sleep 2
と小細工すれば動作確認出来ました。
>>28 pts "Hello, World"
sleep 2
って書いてみ
大変失礼しました。動作環境を書いていませんでした。
OS) WinXP-Pro(SP2)
Mem) 4GB(実質3.24GBですがw)
Ruby) 1.8.6
>>25-26 有難うございます。
ruby %* | pause 確か、こんな感じのdo_ruby.batファイルとか作って.rbに関連付けておけばよかった気がした。 失敗した時だけ待つ 常に待つなら、 ruby %* pause
まー実際問題としてはいちいちダブルクリックとかフォーカス当ててEnterとかやってられんのだがね
まあ、世の中には少しだけ便利なバッチファイルとしてrubyを使う人も
いるわけで、定形の作業用スクリプトをたまに起動するだけなら
>>32 なんて問題にならないし、
人に説明する場合でも、コマンドプロンプトを開いてコマンドを入力させるより
アイコンをダブルクリックの方が楽だったりする
場合もある
35 :
34 :2009/05/17(日) 09:04:59
正確には、ruby %* || pause だね
>>35 一見パイプの拡張かと思ったらexitコードの論理和かよ
cmdで使えたなんて知らなかった
「うろ覚え」な。 今覚えとこうな。
得意げに typo に突っ込んでいるかも知れないという危惧を 少しは抱くべきではないだろうか
「うる覚え」は少なくとも誤記ではないな 「う・る・お・ぼ・え」と書くつもりで正しく書いてるだけだ その人にとっては「うる覚え」が完全に正しい もちろん「うろ覚え」が辞書上も多数派的にも"正しい"が、 だからといって今更「うる覚え」がなくなるわけでもなく
42 :
デフォルトの名無しさん :2009/05/17(日) 15:30:24
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
今日1日かけて自作スクリプトのクラス名やメソッド名を書き換えてそれに伴う構造再構成をした 見通しがちょっとよくなったような気がする Rubyあんまり関係ないな
def hoge h = Hash.new … return h end というメソッドを勢いで作ってしまうことはある 適切な名前を付けるべきだとは思うんだけどね
CRubyでは通るけどJRubyではまだ通らないようなテストがあります。 で、とりあえずこのテストをJRubyで通るようにするのはあとまわしにすることに決定しました。 このとき、そのテストに『今はテストが失敗するけどあとまわしにするよ』というような目印をつける方法が Test::UnitかRSpecにあったと思うんですけど、どなたかご存じないですか。 ぐぐろうにもキーワードが思いつきません。
>>44 「スコープが広いものにほど明瞭な(長い)名前を付けよ」って一般原則からすれば
メソッドが十分短いならhは許されるだろう。hogeは不味いだろうけど
というか、極端に長すぎるのも考え物
記述密度が上がって逆に可読性を落としてしまう
Linusに言わせれば
>Modula-2 や Pascal のプログラマとは違って、C言語プログラマは 「こ
>の変数は一時的に使われるカウンターである(ThisVariableIsATemporaryCounter)」
>などというような気のきいた名前は使いません。C言語プログラマは、"tmp" な
>どの十分に書きやすく、それでいて少なくとも分かりにくくはならない変数名を
>選ぶものです。
Rubyも立場的には近いと思う
to_sとか、意味が通る限りにおいて短い名前を希求する
>>45 RSpecのpendingのことかな
詳しくはるびまの連載記事に載ってる
>>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' にしてるんだけど、なにか問題あるでしょうか。
詳しい人のコメント求む。
'a' はファイルの最後から書き込む 'r+' はファイルの先頭から書き込む 対象のファイルが全くの空である場合は動作が「たまたま」同一
なら IO::CREAT|IO::WRONLY で
>>49 「あるはずのファイルが無い」とか「書けるはずなのに(権限などで)書けない」なんてのは
似たようなもんで、どのみちきっちりやるならチェックなり例外処理なりしなきゃいけない。
つまり、こまけぇこた(ry
>>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
自分の過去を掘り返してきたらこんなんが出てきた。
正しいかどうかは…。
>>48 > あいしてる
これは、
あいしてる ( ^з^)-☆Chu!!
までやるべき
55 :
17 :2009/05/18(月) 17:02:45
前スレの982です(ファイルアクセスが他のソフトとぶつかる場合で質問)。 皆さんのレスを一通り見ましたが、File.openの箇所で工夫するというのが定石 なのでしょうか? 本を読んでいたら、 File.readable?(path) と File.writable?(path) なるものが ありましたが、(これらが未だ登場しないといいうことは)使うと何か弊害が 生じるのでしょうか?
>>50 >'a' はファイルの最後から書き込む
>'r+' はファイルの先頭から書き込む
そうなんだけど、今の場合は f.truncate(0) して f.rewind(0) してから書き込んでいるから、
最初のファイルポインタの位置は関係ないよね。
>>51 これって何?初めて見るんだけど。マニュアルに書いてある?
>>52 そういえば昔、CGIだけどレンサバの容量の制限(quota?)でファイルが書けず、
1日分のデータが無くなったってトラブルがあったな・・・(遠い目
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
マジックコメントをとりあえず強制的に utf-8 あたりで自動挿入する機能とかないかな Emacsでいいんだけど
1.9に添付されてるruby-mode.elを使え
63 :
デフォルトの名無しさん :2009/05/19(火) 01:53:42
crackup-1.0.1$ rak "at_exit|END" lib/crackup.rb 288| at_exit do まったく読み込んでないが、これじゃないか。
単純にmodule直下で色々やってるだけっぽいけど
66 :
63 :2009/05/19(火) 02:36:16
>>60 検索すると、マジックコメントが Ruby(と Ruby が参考にした Python)独自のものだと思ってる人がちょくちょくいる模様
これ Emacs 自身が解釈する文字列で、読み込むファイル全般で効くから
-*- coding: utf-8 -*-
の行があったら Emacs はその文字エンコーディングだとみなして読み込むから
嘘だと思ったら
-*- ruby -*-
とだけ書いた hoge ファイルを Emacs で読み込んでみるといい
いわゆる拡張子がなくて判断情報がないはずなのに ruby-mode になるからさ
-*- perl -*- と書いたら perl-mode に、 -*- html -*- と書いたら html-mode になる
>>67 ほー知らなかった。emacsはそういう機能があるんだな。vimも似たようなのなのなかったっけ?
Rubyの、文字列中に任意の式を埋め込む機能は式展開という名前らしいですが、 これを英語でいうと何といいますか。
まんまだけどembedded expressionとか?
ruby-doc.org の Programming Ruby だと、その他のエスケープと一緒に substitution となってるな。
74 :
73 :2009/05/19(火) 20:36:41
すいません。
>>73 ですが、既存のgemsとかのユーティリティ的なものがあればそれキボンという感じです。
わがままですいません…。
Activeなんたらとかにないのかなーと探しているのですが、見つからず
((o = obj.hoge()) && (o = o.page()) && (o = o.moge()) && o.done()) || (puts "nil!!!") ・・・ごめん、忘れてw
演算子として使いたいなら、言語機能として組み込まれないとどうにもならないように思える あえて小手先の拡張でなんとかするなら・・・こんな感じか? obj.send_if_defined(:method1).send_if_defined(:method2)
>>73 眺めた程度ではリンク先の意味を理解できず申し訳ないのだけど
良きに計らうっていうのは具体的にどういう挙動を期待してる?
ふとこんなのを思いついた
class Nil; def method_missing; return nil; end
>>73 メソッドチェーンを使わないか、
期待した返り値にならない場合は例外出して抜けるメソッドだけをチェーンに使うか、
NoMethodError を rescue する
>>70 variable interpolation
いや、
expression interpolationだな。
>>73 ActiveSupportのObject#tryおよびそれの同等品でどうか。
実態はsendだが、nilにだけはnilを返すように定義されている。
tryを1.9に取り込むって話はどうなったんだっけ?
haskellのめいびーがうんたらかんたら
>>82 名前がよければ採用してもいいという話になっていたと思うが、
誰かが思い出させないとそれきりかな?
いちおうRedmineには入っていたハズ。
86 :
73 :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
88 :
87 :2009/05/20(水) 06:35:46
(補足) 目標は、厳密にはXMLSocketサーバーです。
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' というようになるようになってしまったんだが、 似たような現象にぶち当たった経験があるとかで原因の心当たりある人いる?
flockってことはファイルロックしっぱなしなんじゃないのか? 他のスクリプトやエディタ(てことはないか・・・)が開いててロックしているとか
>>90 あ、ほんとだ、超でっかいpstoreのトランザクションの奥で同じファイルをPStore.newしてる
何がどうなっていつのまにこうなったんだ、これ
まあいいや、ありがとう
>>79 >interpolation
さんくすです
存在してないファイルからpstoreで読み込んだときに何が返るかの記憶法あるかな nil だったか空のハッシュだったかぜんぜん覚えられないんだが
irbでさくっと試せ
わざわざターミナル開いて irb require 'pstore' PStore.new('1').transaction{|p| p[p.roots.first]} これを打つのがしんどいから聞いてるんだよ逆切れ
PStoreでハッシュを保存してるとわけわかめになることが全くないでもない というかなんであれは ENOENT とか発生しないのは何故?
>>93-95 言うのをめんどくさがるから却ってめんどくさくなる好例だなw
まあそのコードが一発で出てきたところから推測できるように
rootsの初期値は空のArray
nilもHashもfirstが通らん
pstore は、ファイルが存在しているかどうかを全く関知しない ファイルがそもそも存在しない場合も、 ファイルはあるけど登録が空である場合も、 ファイルがあって何らかのデータが登録されてる場合も、 transaction の返り値オブジェクトの [] メソッドはハッシュのように振舞うし、 fetch メソッドはキーの有無をチェックして例外を出す ということで、 ファイル自体が無い場合もそのキーでの登録が無い場合も一律 nil だな nil をキーとして何かデータが登録されていると誤動作するであろう pstore 利用スクリプトは時々見る
>>99 UTF-8で、
puts "日本語".scan(/./u)[1]
とかではいかんのでしょうか?
101 :
99 :2009/05/20(水) 18:32:30
>>100 できました。ステキ。
/./u の u がないともっとステキなのですが、
これはどうしようもないのでしょうか。
じゃあメソッド作って隠せ
それで
>>99 と同じになる
104 :
デフォルトの名無しさん :2009/05/21(木) 00:14:09
ファイルからUTF8のテキストデータを読んだのですが、 p line[0,2] としても期待どおりに文字を切り出せません。 どう書けばよいのでしょうか?
>>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系
エンコーディングが正しければ、それで期待どおりになる。
>>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個を選ぶとか) 何か良い方法はありますか?
>100万個の中から1000個を選ぶ 大きな量でも扱える方法が少量の際でもスマートとは限らないから 別個に考えた方がいいと思う とりあえず一例 ary = [] (1..10).each{|i| ary << i } 5.times{ puts ary.delete_at(rand(ary.length)) } もちろん数が大きい時には向かない
なんで書き込んだ直後に(1..10).to_aを思い出すかなorz
numbers=[] while numbers.size<5 numbers|=[rand(10)] end こんな感じかな 乱数の出てきた順番がどうでもいいならSet使ったほうが良いと思うが
>>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の一様乱数を発生させて確率以下ならその数を選択することを続ける
それと選ぶ総数が全体数の半分以上なら選ばない数の方を選択して それを全体から除外するようにしたほうが特に全体数が多い場合は現実的な効率はいいと思う 起こりうる最悪ケースではどちらでも変わらないし全体数の半分程度を選ぶとかではあまり関係ないけど それから全体数が多いときは一様乱数の有効数字の桁数が問題になるかもしれないので 0から1の浮動小数でなく選択確率の分母以下の整数値をランダムに生成して分子と比較するとかの方がいいかも でもそれでよくなるかどうかは乱数の生成方法次第だしそもそも100万個くらいならこれは問題ないのかな?
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
spec_helper.rb って spec コマンドが勝手に探して自動で読んでくれる便利なファイル名とかそういうのじゃないのね require '../../../spec_helper' とか spec ファイルの最初に書くのカッコ悪いんだけどもこれは構造上仕方ないのかな
それだとカレントディレクトリ以外で spec コマンド使ったときに動作しないぞ require "#{File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..', '..', '..', 'spec_helper'))}" こうだな 長大なファイルパスを記述するのが面倒だから spec_helper を使おうと思ってる人には逆に憂鬱かもしれん しかしこれ1行で済むとも言えるが
>>107 [*1..10].sample(5)
[*1..1_000_000].sample(1000)
>>115 なんでわざわざ同じことを何回も繰り返す?
require File.expand_path('../../../../spec_helper', __FILE__)
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')) というか、このへんは実験終了と称して次のバージョンくらいでぽっと無くなりそうで嫌だ
第二引数なし・pathnameなしで一番短いのはこれかな require File.join(File.dirname(__FILE__), '../../../spec_helper') でも確かに、spec_helper.rbを自動or独自メソッドで読んでくれれば一番早いとは思う
120 :
デフォルトの名無しさん :2009/05/21(木) 12:08:01
メモリ上で文字列の圧縮・展開を行いたいです。 そういったライブラリはありますか?
よーわからんが 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 こういう話ではなく?
>>121 ありがとうございます。zlibを調べてみますね。
>>123 socket_server.rb はライブラリではなく単なるアプリケーションで、同じページの
server_client.rb の次に説明されてる
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
=~ というマッチャは見たことないな
>>124 さんきゅう。
同時に、「SocketServerというクラスがリファレンスにないぞ・・・」と思って
いましたが、これも下の socket_server.rb で定義していたんですね。
納得。
>>125 推測だが、コマンドプロンプトとNetBeansが
それぞれ違う場所にインストールされたrubyを使っていて、それで何かの問題が起こっているのでは?
実際にsource_index.rbの138行目見れば何か分かるかもよ
>>126 あるよ
129 :
125 :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パスの処理のところでした。
おかげさまで、無事に解決いたしました。
ありがとうございました。
>>116 [*1..10]も1_000_000も知らなかった
前者のはRange#to_aと優劣あるんだろうか
>>118 > File.expand_path の第2引数の扱いは undocumented だからな
Converts a pathname to an absolute pathname. Relative paths are
referenced from the current working directory of the process unless
<i>dir_string</i> is given, in which case it will be used as the
starting point.
「dir_stringを始点として絶対パスに展開する」とちゃんと書いてあるだろ。
> 現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら
勝手にdirnameしてるわけではなくて、
>>117 は
>>114 より'..'が一つ多い。
>>130 [*1..10]のほうが(1..10).to_aより短い。
遅いけどな。
134 :
デフォルトの名無しさん :2009/05/22(金) 05:39:26
スレ違いな質問で申し訳ないが、GnomeVFSのSSH接続で、鍵を指定することはできないの? 普通に ssh://user@host と指定しただけでは ~/.ssh 下しか探さないみたい。 Net::SSH は鍵を指定できたんだけど。。
eRubyについて教えてほしい eRubyで書かれたファイルの中に eRubyで書かれたファイルを埋め込みたい なんか出来そうな気がするのだけど イメージがまとまらないので、できるのなら教えてほしい。 具体的な運用としては Apacheで*.rhtmlのファイルをeRubyを通すように設定したサーバで 運用したいと思っている。 で、ページを構成する細かい部品をeRubyで書いて そのレイアウトをeRubyで定義できないかな〜って感じです。
<% require 'erb' %> <%= ERB.new(File.open(filename).read).result %> じゃダメなんだっけ?
>>132 日本語マニュアル不備だよね
基本の添付ライブラリのマニュアルが英語とかなにそれ
>>136 それでいけました
ただ、単にERBオブジェクト作ってあげるだけでよかたんか。
これで、ヒャッホ〜イ!できそうです。ありがとう。
>>133 サンクス
数文字程度長いぐらいならわかりやすいほうが好みだから
[*1..10]を選ぶ理由はなさそうだ
>>137 ri File.expand_path
141 :
140 :2009/05/22(金) 17:44:48
いや、これも英語か。 ソースから抜き出してるから、日本語版を作るとなると ソースに日本語でドキュメントを書くか、 自動生成を諦めるかになるのかな。
ja.po 形式はどうだろう
そういえば、rubyをgettext対応させた人っていないのかな。
>>143 スクリプトの話?本体の話?
前者はライブラリがある
>>132 第2引数は /path/to/file を渡しても /path/to/ とみなして処理される
相対パスを渡しても、絶対パスに変換したあとで基点とみなされる
startint point という語にそれだけの処理の意味を任せるのは初耳だ
>>141 日本語版のリファレンスにはReFeというツールが付属していてだな
>>145 > 第2引数は /path/to/file を渡しても /path/to/ とみなして処理される
違う。あやふやな知識で書くより、ちゃんと試してみることをすすめる。
File.expand_path("foo", "/path/to/file") #=> "/path/to/file/foo"
File.expand_path("foo", "/path/to/") #=> "/path/to/foo"
File.expand_path("../foo", "/path/to/file") #=> "/path/to/foo"
File.expand_path("../foo", "/path/to/") #=> "/path/foo"
> 相対パスを渡しても、絶対パスに変換したあとで基点とみなされる
> startint point という語にそれだけの処理の意味を任せるのは初耳だ
これも違う。重要なのは戻り値は絶対パスだということ。
File.expand_path("foo", "path") が "path/foo" だったら絶対パ
スじゃないだろ? 絶対パスを返すという仕様が前提なんだから、相
対パスは他にどう扱いようがあるというんだ。
>>144 ruby-gettext-packageは知ってる。
本体の出力メッセージとかの話。
GNU gettextはLの付かないGPLだから、使うとRubyを Ruby's ライセンスではなくGPLで配布する必要が生じるかも。
「読まない人は日本語でも読まない」wwww
インタプリタの出すメッセージは用語みたいなもんだから 翻訳するとかえってめんどくさいことになりそうな
入ります
154 :
デフォルトの名無しさん :2009/05/22(金) 19:28:51
みんな なでしこ やったことある?
このスレでその質問をするココロは?
156 :
デフォルトの名無しさん :2009/05/23(土) 02:19:17
@port = port if( !port.nil? ) の解釈で質問です。 最初の@はインスタンス変数で、右辺のifは修飾子だと思うのですが、 ()内の「?」の意味が分かりません。 これがは文字コードリテラルとは思えませんし・・・ どういう意味(役割り)なのでしょうか?
nil? というメソッドです
いちおう補足、リファレンスでObjectクラスのインスタンスメソッドを眺めてみて しかしなんというか、不慣れな時期にそのコードというのは運が悪いな せめて @port = port unless port.nil? と書いてほしい
>>157-159 さんきゅうです。
つまり if( !port.nil? ) というのは、「portが無効でないなら(不活性でないなら)〜」
ということでOKですか?
うんにゃ。 if( !port.ni? ) → if()
あら。途中で書き込んだ。 if( !port.ni? ) → if( !port.nil? == true ) → if( port.nil? == false ) で理解してくらはい。 port.nil? は boolean を返すことが期待されてるメソッドです(たぶん)。
Ruby に Boolean などというものはありませんが何か
あーでも結構使ってるなー
>>156 A if COND という構造だということはわかってるんだよね
if はメソッドではなく制御構造だから、このカッコは引数のカッコではなく式を作る「まとめカッコ」だ
中身1つだけだから、本当はこのカッコは必要ない
で、最初の ! は否定の NOT だ
ttp://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html#not 直後にあるものの真偽の概念を逆転する
つぎの port はなんらかのローカル変数またはメソッド呼び出しで、
ドットで繋がってる nil? は port の返り値のクラスの nil? というメソッド
port のクラスで再定義されていないのなら、それは Object#nil? で、オブジェクトが nil である場合に true を返す
まとめると、
「port の返り値が nli でない場合に、@port に port の返り値を代入する」
となる
Rubyではよっぽどでない限り @port = port unless port と書くけどな ・ port に false が入る可能性があって、それは nil とは違う処理が必要 ・ port が nil であるというのが何か重要なサインであってソース読み下し上目立たせたい というのでない限り、今回でいうところの 「port に何か入ってたら @port に入れとく」 というフツーの意図である限り、 Ruby では unless を使う
>>164 .gsub("unless", "if")
「nil でない」なら if だと思う
# データからHTMLを作って返す def html html = String.new … return html end というように、メソッド内のローカル変数名とそのメソッドの名称が全く同じなのって、ある程度は紛らわしいですよね できれば避けるべきなんでしょうか?
再帰のような処理と混同する可能性があるってこと? メソッド内1行目でローカル変数として定義されてれば読んでて混乱はしないと思う if (html = init_data) then みたいにどっかの文の途中でこっそり変数定義を使ってることがあるとか、 変数とメソッドを混ぜて使い倒してる処理があるとか、そういうのが1ヶ所でもあれば注意深く読む
169 :
デフォルトの名無しさん :2009/05/23(土) 11:28:11
IOのexpertな方、教えてください >< # afio - manipulate archives and files COMMAND = "afio -oZ -" IO.popen(COMMAND, "r+") do |src| Find.find("/etc") do |f| src.puts(f.chomp) end src.close_write File.open("myArchive.afz", "w") {|dst| dst.write(src.read)} end afioコマンドが pipe_wait になって終了しません。 何が悪いのでしょうか?
170 :
169 :2009/05/23(土) 11:49:24
ちなみに、コマンドライン上から $ find /etc | afio -oZ - 1>./myArchive.afz とやれば、何も問題なく動作するんです。 ワケワカメで頭が破裂しそうです ><
afioコマンドが、入力を読み切らずに何か書き出そうとして固まってるとか?
172 :
169 :2009/05/23(土) 13:22:11
afioで作成されたアーカイブをバイナリエディタで読んでいてふと思ったのですが、 なにやらヘッダらしきものが書かれていて、その後ろにgzipで圧縮されたバイナリがずらーと並んでいる感じです。 このバイナリファイルをハッキングして、自分でライブラリを書いてしまえばいいと思いました。 外部のコマンドに投げるよりはよりキレイに書けるとおもいまつ。 ありがとうございました。
>>169 原因は
>>171 の通りだろう。
アーカイブデータをなんか加工したいというんでなければ、直接書き出させた方がよい。
あとFind.findからyieldされるパス名はchompする必要はない、というかしてはいけない。
COMMAND = "afio -oZ myArchive.afz"
IO.popen(COMMAND, "w") do |src|
Find.find("/etc") {|f| src.puts(f)}
end
>>172 manpageによるとcpioフォーマットだな
Except in special cases discussed below, afio will create archives
with the same format as ASCII cpio(1) archives.
以下に述べる特殊なケースをのぞいて、afioはASCII cpio(1)アーカイブと同じ
フォーマットでアーカイブを作成する。
When creating an archive, the `large ASCII' header is used by afio to
cover the following situations:
アーカイブを作成する際、以下の場合は「large ASCII」ヘッダが使用される。
o A file has a size larger than 2 GB
・ 2GBよりも大きいファイル
o The archive contains more than 64K files which have hard links
・アーカイブ中のハードリンクが64Kを越えるファイル
o A file, directory, or special file has a UID or GID value larger
than 65535.
・65535より大きいUIDやGIDを持つファイル、ディレクトリ、特殊ファイル
175 :
169 :2009/05/23(土) 21:41:37
すみません、最後に勉強のためにも教えてください。
納得したらもう寝ます。
>>171 にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。
全て入力した後に IO#close_write も呼びましたし、他に意識することって何でしょうか。
Pythonの os.popen2 で同様の事をやってみたのですが、あっさりうまくいって
クソワロタ状態です (;_;)
>>173 ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで
何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。
> あとFind.findからyieldされるパス名はchompする必要はない、
> というかしてはいけない。
すみません、確かにchompする必要はありませんでしたね。
でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。
以上、よろしくお願いします。
176 :
デフォルトの名無しさん :2009/05/23(土) 23:24:38
whileの条件による終了(ループ脱出?)が分かりません。 下記は受信サーバー側のSocket通信の記述で、クライアントからの 信号s(オブジェクト)を受信したらRubyを終了したいのですが・・・ while true Thread.start(gs.accept) do |s| print(s, " is accepted\n") puts(s.gets) s.close break # ここでは無効 end end どう変更すべきでしょうか?
177 :
169 :2009/05/24(日) 00:19:36
あああ、pythonでうまくいったというのは勘違いでした。(test caseのミス) でも IO.popen("cat | afio -oZ -") のように、catコマンドをクッションにしてみたらうまくいきました。 なんでだろうね。 バッファの関係?? 朝起きたらlinux板でも行って聞いてみます。。もう疲れた。
>>175 >
>>171 にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。
もちろんあり得る。それはプログラムの構造次第。afioの場合ファイル名を受
け取れば処理できるんだから、一つ分出力してもなにも不思議じゃない。
>>177 は、catでバッファリングされてclose_writeされるまでafioに何も渡されて
ないんだろ。
>
>>173 > ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで
> 何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。
書き込みと読み込みでThreadをわける。
IO.popen(COMMAND, "r+") do |src|
Thread.start do
Find.find("/etc") do |f|
src.puts(f.chomp)
end
src.close_write
end
File.open("myArchive.afz", "w") {|dst| dst.write(src.read)}
end
> でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。
"\n"で終わるファイル名を正しく扱えない。
>>176 mth = Thread.current
while true
Thread.start(gs.accept) do |s|
print(s, " is accepted\n")
puts(s.gets)
s.close
mth.raise(SystemExit)
end
end
>>176 gsってTCPServer?
サンプルをコピーしたとするとwhileで囲う必要もスレッドを生成する必要も無いと思う
s = gs.accept
print(s, " is accepted\n")
puts(s.gets)
exit
181 :
176 :2009/05/24(日) 02:49:36
>>179-180 Thx 確かにwhile文無しでもOKでした。
今回は
ttp://www.ftnk.jp/~fumi/cl/2007-11-24-1.html を参考にしました。
すいません。もう一つ質問です。
上記HPのクライアント側を改変して2行のテキスト「memo.txt」を読み込み
サーバーに渡すように
data = File.read("memo.txt")
puts data # チェック用
s.puts(data)
を書きました。
クライアント側では2行で表示されるのですが、サーバーの表示 puts(s.gets)
では最初の1行目のみが表示されます。
これは何故でしょうか?
文字列がcopy on writeじゃないのが他の言語と違って結構ハマることが多いのですが、 何か気をつける方法ってないのでしょうか? Rubyでは全部オブジェクトってのはわかっているつもりなのですが…。 #!ruby -Ku a = "hage" b = a b << "UNKO==!!" def change_string(s) s << "(((^^)))))" end change_string(b) puts a, b 結果: hageUNKO==!!(((^^))))) hageUNKO==!!(((^^)))))
>>181 IO#gets が何をするメソッドなのかマニュアルで調べてみ
>>182 それって別に文字列に限った話じゃないよね
配列、ハッシュ、その他のオブジェクト、なんでも当てはまる
オリジナルでは無くてコピーが必要なら必ずdup,clone、を徹底するしかないかな
184 :
176 :2009/05/24(日) 05:02:30
>>183 どうも。
readに変えたらOKでした。
>>182 Rubyのあらゆる変数(や定数)はただの参照タグだ
a = HogeObject.new は HogeObject.new の処理の最後を辿って(return してた)そのオブジェクトに存在を許して
それに a という参照タグを1個つけるという行為
b = a は a の処理の最後を辿って、つまりは a の返り値のオブジェクト、に b という参照タグを追加する行為
Ruby スクリプトは変数の名前を後生大事に覚えてるわけじゃない
Rubyはスクリプトのそれが変数名だとわかったら、その変数が参照している先にあるオブジェクト
(の保管場所を表す数値「オブジェクトID」)だけを記憶する
だから、
a = なにか
b = a
と書いた時点で、変数 a も変数 b も全く同一のオブジェクトを指す(つまり、一般的にはあまり意味がない)
a = "なにか"
p a.object_id
b = a
p b.object_id
p a.object_id == b.object_id
186 :
182 :2009/05/24(日) 05:51:03
>>183 >>185 せっかく説明してくださって申し訳ないのですが
原理をわかってて言ってるのです…(´・ω・`)
他の言語のつもりで書いちゃうと、ついバグを埋め込んでしまう
まあ、ユニットテストしっかりしろってことになるのだと思いますが…。
で、既存のオブジェクトを破壊せずに、その内容を利用した新たなオブジェクトを作りたい場合は、
その既存のオブジェクトを破壊しないような方法を意図的に使う
a = "hage"
b = a + "ADD"
def change_string(s)
s + "CHINGE!"
end
c = change_string(a)
p a, b, c
結果:
"hage"
"hageADD"
"hageCHINGE!"
オブジェクトを「足して」新たなオブジェクトを作るようなメソッドが提供されていなかったらどうするか、というのなら
そりゃ
>>183 の言うようにオブジェクト内容自体を複製して新たなオブジェクトを作る dup や clone を使うしかあんめえ
>>186 「わかってない」と思う
わかってるのなら“絶対に間違えない”から
逆にいうと、オブジェクトと変数の関係を理解するまではよーわからんバグで悩まされて
変数は安全のためにと称して全部 initialize やメソッド定義の 1行目で dup することになるんだけどな
189 :
182 :2009/05/24(日) 05:57:44
>>188 「わかってる」のと「間違えない」というのは等しくないですよ。
わかってて、正しいことができるなら、俺は今頃、億万長者になってる
190 :
182 :2009/05/24(日) 06:00:14
変なところだけレスして煽りっぽくなってしもうた orz 流してくださいwww
>>187 ああ、なるほど、確かに既存のオブジェクトを破壊しないでコピーされる場合は、OKですね。
>>188 メソッドなどで渡された引数とかなるべくdupするわけですか。なるほど。
>>189 いいえ、理解してないんです
「他言語を使いこなす俺がこれごときを理解できていないはずがない」というようにプライドが邪魔をしてるだけです
本当は理解してないのを見なかったことにして「他の言語と違って結構ハマる」と問題を差し替えているのです
これは特に目新しい概念というわけでもありません
きちんと理解しましょう
むしろ Ruby に慣れると、ほかのスクリプト言語で「同じデータ」を使う必要性が出てきたときに メモリでどういう状態になってるのかがとっても気になる Ruby なら同じものを使い倒してるということが感覚的にわかって安心できるんだけれど
>>190 よく読め
dup なんてまずしない
しなければならないときはもちろんするが、普通はしないで済む方法を考える
「とりあえず dup」をしないとわけがわからなくなる初心者は dup する、と言ってるだけ
いい解説に出会えない独学系初心者の多くが通る無駄道ではあるが、
こんな期間は短いほどいいし、これに嵌る前に回避できれば最高だ
>>182 「copy on write」とかいってる時点でまるでわかってない
>>167 >というように、メソッド内のローカル変数名とそのメソッドの名称が全く同じなのって、ある程度は紛らわしいですよね
>できれば避けるべきなんでしょうか?
心配なら変数名を _html とかに変えればオK
>>194 ワハハ、その通りだ
俺は「わかってれば絶対に間違えない」とは思わないな 他言語の経験が短い俺でも、たまにdupし忘れることがある 結局は慣れだろう ただ、時々ではなくて頻繁に間違えるというのであれば、ちゃんと理解できていないのかもしれない 実際に間違えたコード例を晒してもらえれば、もう少し具体的なアドバイスができるかも
197 :
182 :2009/05/24(日) 08:35:40
>>194 うーん?頼む!
2chでよくあるのだけど、「コイツはアホ」とか「わかってない」とか言う時は「何故か」を明らかにしてほしいです。
言っている本人は本当にそうなのか判断できず、煽りかと思ってしまうので。
"copy on write"は書き換えたら、コピーされるという意味の用語です。
この言い方は一般的じゃないのかな?
Delphiの組み込みのstringの機能がそう呼ばれているわけなんですが。
(ただ、この辺はけっこうマジック的な扱いで、
Delphiでも文字列と似たような振る舞いをする動的配列では、
copy on writeはしなかったりとDelphiの中でもけっこう戸惑う扱いです)
>193
慣れたら、dupしないように書く、ということでしょうか?
198 :
182 :2009/05/24(日) 08:40:25
ああ、でも書いていて思ったけど、 オブジェクトのメソッド呼び出しで copy on write がどうのって確かに変だよなー。 そもそも、組み込み型じゃないん(というよりコンパイラが特別扱いしてない)だし とはいえ、それよりも、 俺が聞きたいのは、どうすれば気をつけられるんでしょうか?ってことなんですが、 その答えは「理解しろ」ってことなんでしょうから、「お前はわかってない」なんていわれるんですよね…。
> どうすれば気をつけられるんでしょうか? 無駄に破壊的メソッドを使わないってだけでいいんではないかと思った。
>>185 が普段使いで必要十分な一般的な理解
これができない場合は無理
オブジェクトと参照の問題ってだけだからな
202 :
196 :2009/05/24(日) 09:14:13
>>197-198 >どうすれば気をつけられるんでしょうか?
実際に間違えてるコードを見ないと、何とも言えないが
とりあえず破壊的メソッドと非破壊的メソッドの違いを意識することは大事
あと copy on write に関しては、「Rubyにその概念はない」としか言えない
なぜなら
破壊的メソッド → オブジェクトの内容を直接書き換える(オブジェクトのコピーはしない)
非破壊的メソッド → 元のオブジェクトのデータを読んで、それを元に新しいオブジェクトを生成して返す
であって、どちらの場合も「書き換えたときにコピーする」という動作はしてないから
"abc\n".chomp! # 文字列 "abc\n" の内容を変更する(新しい文字列は生成しない)
"abc\n".chomp # 文字列 "abc\n" を元に、新しい文字列 "abc" を生成して返す
・代入したり引数で渡すだけじゃコピーされないよ ・破壊的なメソッドには大概 ! とか = とか付いてるから目安にして気をつけてね としか
mutableと言いたいんだろcowじゃなくて てかcowは実装の詳細であってプログラマからは掩蔽されるものだ
>>197 きみはもしかしたらcopy on writeについては理解しているのかもしれないけど
それがRubyとはまったく関係ないことが理解できてない
インスタンス変数の配列の要素への代入とか、ちゃんと最初にdupなりしておかないと わけわからんようにはなりそうだけどね。
>>206 どっかでの変更がリアルタイムに反映されるなにやら便利な配列として扱うような気もする
ともあれ、目的を確定させた上で処理すべきだな
とりあえず○○するとかそういうのはありえん
208 :
169 :2009/05/24(日) 13:03:40
>>178 |
\ __ /
_ (m) _ピコーン
|ミ|
/ `´ \
('A`)
ノヽノヽ
くく
そうか、子プロセスが終了するまで親プロセスはwait状態になるのか!
IO.popen("ruby -e 'sleep(30)'", "w") do |io|
p io.puts("my message") #=> nil
puts "ok, all finished !"
# After a few seconds...
p io.close_write #=> nil
puts "closed?"
end
うわー、完全に失念していましたよ。
wait状態だから、実際には IO#.close_write がコールされずに止まっていたわけか。
Threadを生成してやってみたらうまくいきました!
本当にありがとうございましたです。
ちゃうねん。 system(3) とかだと子が終わるのを待つけど、popenは同時に実行するためのAPI。 その例だと、何も読み込まない ruby -e 'sleep(30)' に io.puts("my message") で 書き込もうとして固まってるわけ。
169の環境はMS-DOSなのかも知れない
211 :
169 :2009/05/24(日) 16:23:30
ピコーン!今度こそわかりました。 IO.popenでafioコマンドにパイプを確立し、IO#.writeで標準入力に読み込ませる。 afio君は標準入力から来たファイル名を開いて、適切なフォーマットで標準出力に吐き出そうとする。 afio「さあバイナリができましたわよ。もらってちょうだい!随時出力するから。」 しかしreadされないため、 afio「なにやってんの!早くreadしてよ。わたしのバッファサイズはそんなに大きくないのよ。 メモリだって有限なんだから。あなたがreadしない限りいつまでもwaitするわ!」 ということなんですね。
少しお聞きしたいのですが、
railsでrake db:migrateを行うと mysqlが以下のエラーを吐くのですが、
>rake db:migrate
(in d:/web/redmine/redmine)
== 1 Setup: migrating =========================================================
-- create_table("attachments", {:force=>true})
rake aborted!
undefined method `each' for #<Mysql:0x803e550>
(See full trace by running task with --trace)
これって、MySQL 5.1はWindowsだとダメヨという既知な問題なのでしょうか?
xamppごとMySQL 5.1を入れてしまっているもので、MySQL 5.0で上書きしてよいものかどうか・・・
Nabble - RubyOnRails Users - rake aborted! undefined method `each' for #<Mysql:
http://www.nabble.com/rake-aborted!-undefined-method-%60each%27-for--%3CMysql:-td20760472.html
213 :
212 :2009/05/24(日) 19:08:38
文字列を spl iして、文字種類の境界で分ける方法はありますか。 たとえば x=("abc123+456def").split(/??書き方不明/) とすると x[0]="abc" x[1]="123" x[2]="+" x[3]="456" x[4]="def" みたいにしたいのですが。
>>215 たとえば、シンプルでいいなら下記のようなことはできる(splitじゃないけど)
"abc123+456def".scan(/[a-zA-Z]+|\d+|\W+/) #=> ["abc", "123", "+", "456", "def"]
んだから、
>>216 の言うとおり「文字種」を定義すれば可能。
で、それを定義してるUnicodeブロックなるものもあるらしい
ttp://module.jp/blog/regex_unicode_prop.html Rubyでは鬼車採用の1.9以降、になるのかな?
詳しくないけど、参考になれば
218 :
デフォルトの名無しさん :2009/05/25(月) 03:58:48
Rubyの使用メモリ量を調べるにはどう書けば良いのですか?
Ruby自体から知る方法は確かにないが、環境依存で外部ツールを読んで取得するライブラリがrubygemにあったと思う
undefined method `inner_text' for nil:NilClass (NoMethodError) …う、うぜえ
どうでもいいけど、委譲関係ってマニュアルもるびまも要領得ないよね
メモリ使用量、ヒープの個数くらい Cのメモリマネージャから取れるようにしておけばいいのに 無理な環境は0にしておいて
>>222 あんま多用して欲しくないんだよ
たぶん
これ廃止予定じゃない?
>>225 File.statじゃあかんの?
gtkとかgnomeとかってAPIコロコロ変えるから嫌い
>>227 VFSごしにウンタラカンタラしたいのだろう
Gnomeの開発者も、VFSはもうやる気がないみたいだがw
>>221 asin = doc.at('ASIN').inner_text
こんなのだろ
doc.at('ASIN') が nil になる可能性があるから
tag_asin = doc.at('ASIN')
asin = if tag_asin then tag_asin.inner_text else nil end
みたいに場合分けで書かなければいけない
こういうのってなんかイイ書き方ないもんかね
>>217 >scan(/[a-zA-Z]+|\d+|\W+/)
ありがとうございます。
scan にこんな使い方があったんですね。
こんな正規表現の記法は知りませんでした。
あまり難しいことはまだ無理なので、これでいきます。
>>222 疲れてるときは全然読めないな
何言ってるかさっぱりわからん
用途別にまとめてくれてると頭に入ると思う
>>233 一応補足しておくと、 \W とかの文字クラス表現は中身を確認しておいた方がいいよ
例示だから適当でいいんだけど、
>>217 のは "_" とかスルーするね。
また、改行やスペースの扱いとか、意図通りに動かすためにはちょっと気をつけて。
本格的なものが必要なら、 StringScannerとかを使って自力で解析器を書くべきかもしれない
質問 トップレベルにて定義されたメソッドの一覧を取得する方法はありますか? toplevel_methods = Object.private_instance_methods toplevel_methods -= Kernel.private_instance_methods で、大体は絞り込めるのですが、トップレベルに未知のモジュールが include される 場合などを考えるとこのやり方では心もとないです。 トップレベルで定義されたメソッドだけをきれいに抽出する方法はないものでしょうか。
Object.private_instance_methods(false) * 1.8 系だと initialize も含まれる * ふつうに、 class Object def bar end private :bar end とした場合との区別がつかない
239 :
237 :2009/05/27(水) 15:25:23
自己レス あれこれ考えた結果、無理にトップレベルでやろうとするのが間違いと気付きました。 モジュールでラップして MyModule.instance_methods(false) で済みますね お騒がせしました。
240 :
デフォルトの名無しさん :2009/05/27(水) 20:50:38
初心者です。Webrickでキャッシュプロキシを作ろうと思ったのですが、 実装例を見つけられませんでした。とりあえず書いてみたのですが問題があります。 1.ヒットした場合にWebサーバにアクセスしないでブラウザに戻す方法がわからない。 2.WEBrick::HTTPResponseのインスタンスを単純に復元しただけでは上手く表示できない。 #/usr/bin/ruby 1.8.7p72 webrick 1.3.1 winXP require 'webrick' require 'webrick/httpproxy' db = Hash.new() rcHandler = Proc.new() do |req, res| if db.key?(req.unparsed_uri) res = db[req.unparsed_uri] end end handler = Proc.new() do |req, res| db[req.unparsed_uri] = res end config = { :BindAddress => '127.0.0.1', :Port => 8080, :ProxyContentHandler => handler, :RequestCallback => rcHandler } s = WEBrick::HTTPProxyServer.new(config) [:INT, :TERM].each{|sig| Signal.trap(sig){s.shutdown}} s.start 実装例とかヒントをいただけたらありがたく思います。
NicoProxy2とか
かなり前の知識しかないけど、webrickってresponseしかいじれないんじゃなかったっけ。 requestは無理だったきがす
>>240 俺がやってるのはこんな感じ
class MyProxyServer < WEBrick::HTTPProxyServer
def proxy_service(req,res)
if req.request_uri がキャッシュされてるなら
# キャッシュを読み込んでresにセット
else
super
# resをキャッシュファイルに保存
end
end
end
244 :
240 :2009/05/27(水) 22:51:04
>>243 なるほど、マイリマシタ。
RequestCallbackハンドラなんて要らなかったよう。
方向を間違えると収拾つかなくなるいい例ですね。
ありがとうございました。
245 :
240 :2009/05/27(水) 22:56:46
>>242 リクエストはRequestCallbackハンドラで変更可能だと思います。
一応、240のプログラムは完動品ですので、よかったら試してみてください。
どうもありがとう
RubyGemsのアップデートに失敗してしまいます。
ねーよって言われるんですが、どうしたものでしょうか?
Windowsでのアップデートは失敗した覚えがないのですが…
> sudo gem update --system
Updating RubyGems...
Bulk updating Gem source index for:
http://gems.rubyforge.org Attempting remote update of rubygems-update
ERROR: While executing gem ... (Gem::GemNotFoundException)
Could not find rubygems-update (> 0) in any repository
環境:
・Ubuntu 8.04 LTS
・Ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux] (aptitudeで入れた)
・RubyGems 0.9.4 (aptitudeで入れた)
247 :
246 :2009/05/28(木) 14:24:30
すいません。5回くらい試していたら、無事に入りました 恐れ入ります。
バージョン1.1以前のrubygemsは粗大ゴミなのでとっとと入れ替えましょう Debianパッケージでrubygemをインストールするとrubygemのアップデートが実質不可能になるのでアンインストールすることをお勧め まあ、そうするとDebianパッケージシステムで管理できない野良パッケージシステムができてしまうんだけど、 まあ、背に腹は変えられん
249 :
デフォルトの名無しさん :2009/05/28(木) 16:52:12
array[0][:value] == 'dog' || array[0][:value] == 'cat' みたいなのをもっと短くできんもんでしょうか? array[0][:value].equal?('dog', 'cat') みたいな感じに。rubyならできるような気がするのですが・・どなたか教えていただけるとうれしいです。
['dog', 'cat'].include?(array[0][:value])
['dog', 'cat'].include? array[0][:value]
%w[dog cat].include?(array[0][:value])
case array[0][:value] when 'dog', 'cat' end じゃだめなの?
用途による
>>249 みたいなのは後置の if みたいなので1行で条件が書けることが望まれてるんだろう
>>253 短くなってないじゃん。
>>254 case str when "dog","cat"; true; else; false; end
Windowsで、RubyとC言語で書かれた2つのプログラムでテキストファイルを使って情報をやりとりしたいんだけど Rubyからテキストファイル開くときにC言語のプログラムから読み書き禁止させたいんだけど、そういうことできるの? C言語だと_fsopenてのがあるけど、RubyのFile.open にはそういう機能ないっぽいんだけど・・・
>>255 1行にまとめることができるというのと、1行で書けるというのには天と地ほどの差があるのだよ
>>257 そうか?
少なくともこの場合、戻り値のある式であればいいんじゃね?
ちょうどいま Object#in? (定義はinclude?の主客転倒)という メソッドの導入の是非についてのスレッドがML(えーごの)で出てますな。 # 何度めやら。
>>256 _fsopen は C言語の機能ではない。
_fsopen はなんか「読み書き禁止」なんてしなくてむしろ共有読み書きをするっぽい。
Rubyでファイルの共有とか排他とかはFile#flock
include? を持つ引数を取って、みたいな感じかな あってもいいんじゃないとか思うが、あんまり賛同されてなさそうな雰囲気
262 :
デフォルトの名無しさん :2009/05/28(木) 22:20:05
(∀`*) (●´Д`) { {
>>259 なんかそれ実際に使えるようにしたライブラリなかったっけ
どこかで見た記憶はあるんだけど、思い出せない
facetあたりじゃね?
266 :
249 :2009/05/29(金) 00:47:11
おー色々ありがとうございます。 結局 ['dog', 'cat'].include?(array[0][:value]) これがいいかな、と・・後置のif文なので。 in?みたいなメソッド、今のところは無いんですねぇ。 今MLで話になってるみたいですが、in?みたいなの導入のネガティブな点って何があるんでしょう?
Kernel#in? (Objectじゃなかた)への反対意見は * どこかの集合に含ま「れる」というのはメンバーの特性と言えるのか * 実装は簡単だから自分の環境でやっとけばいいじゃん * すべてのオブジェクトの名前空間を汚染してまで導入すべきもの? などがあるようだ。
>>264-265 SUGEEEEE! こんなライブラリがあったのか
今まで全然知らなかったんだけど、実はけっこう有名なライブラリ?
アプリケーションサーバに興味のある人にとってはそこそこ有名 わざわざそんなことやろうという人そのものが稀なので、それ以外の人にとってはさっぱり
-talkだと結構名前を見かけるが、実は日本じゃあまり知られてない?
日本のRubyユーザーってRubyを何に使ってるのか正直よくわからん
>>272 同感。
最近別言語から Ruby をはじめたんだけど、
有名アプリも少ないし、日本語の扱いや
Rails 以外だと Web が面倒だったり。開発環境も貧弱。
1.9 の非互換で騒がれていないものな。
PHP なら 4 → 5 で騒がれたけど。
1 日でできる blog くらいしか作ってないのか?という感じ。
1日で作れるような100行単位の日常スクリプトを作り倒しまくってるというのは確かだと思う かつてのUnixユーザーがシェルスクリプト作りまくるのが日常だったように、 Rubyユーザーは自分用スクリプトを作りまくって日常を便利に過ごす んが、まあ、これはこれで一部の人だろうな 最近作った・手直ししたもの挙げていけばアクティブユーザーの傾向が少しでも掴める?
>>275 Rubyに関係ないスレのURL張られても困る
> 島根
> 島根
> 鳥取
> 島根
> 鳥取
> 島根
ゲーム
と言いたいところだが、今のところRubyベースで有名なゲームは皆無に等しいな
RPGツクールのスクリプトで使われてはいるが
274の言うように日常のツールとして使うと超便利で、あと他には
* 大小問わずWebアプリケーション(CGIアプリケーション)を作りたいとき
* RADを使わずにGUIアプリを作りたいとき(WxRubyなどを使う)
* 簡単な数値・確率計算がしたいとき
なんかに使う
特にRakeの便利さは異常
俺はもうRakeなしでは快適なPCライフを送れない
>>273 Webアプリならそこそこ有名なのはあるよ。tDiaryとか
あとWeb周りが面倒だったのは昔の話で、今はWEBrickやRackがあるからむしろ楽なはず
処理が少しくらい遅くても重くても作りやすくてメンテしやすいほうがいいこともある、という裏方用途にガッチリはまったので、 Rubyが表舞台に出てくるのは、Rubyが普及すれば普及するほど減るような気がしてならない 「シェルスクリプトって使ってる人いるんですか? シェルスクリプトのメジャーなアプリケーションってなんですか?」 という問いに答えにくいのとおそらく一緒になる という空想 ある程度使えるようになれば普段で使えるじゃん、と気づく日が来る(ただしコンピュータ利用環境依存)んで、 初心者の人は肩肘張らずにダラダラやるといいと思う 質問ある方どうぞん
時間があったら絶対に Java | C | PHP で書き換えるから、と言われつつ ずっと Ruby スクリプトのまま時々呼ばれて便利に動いてる、みたいなのが個人的理想 UNIX文化に傾倒して夢見すぎかもしれないが、理想くらい楽しく行きたいと思う
便利スクリプトに使ってますよ。ベターPerlみたいな感じ。 ゲームのスクリプトを生成したりとか、 他の言語のサポート用スクリプトにベターmakeなrakeもつかってる
281 :
デフォルトの名無しさん :2009/05/29(金) 21:20:18
日本人作った言語なら日本語のドキュメント豊富なはず。 PerlやPHPの方が日本語の資料多いじゃん。 他に移行。
ドキュメントが豊富でも言語自体に魅力が無ければ意味が無い perlやphpが魅力的だと思うなら、お前にrubyは向いてないよ
幼女から熟女まで余裕でいける俺にはなんの苦も無いぜ。
>>281 には KENT の Perl入門がお似合い
るりまってあんま読まれてないのかな?
大小問わずウェブは辞めといたほうが吉。 基本は使い捨てだよ。メンテ必要なのは向いてない。
君の見てるウェブはメンテナンスフリーなんだな うらやましいよ
いやいや、PerlやPHPの方がよいと思ったら、すでにそっちへ行ってるw PHPはドキュメントは豊富。これはPHP案件の時マジ助かった。 しかし、ちょっと踏み込むと全然ドキュメントなかったりする… DateTimeクラス?とかドキュメントなくて、なきそうになった 2chでDateTimeについて質問したら、PHPがオブジェクト指向言語だと思うなよ、とか あげくに、オブジェクト指向言語氏ねとか煽られるし。所詮その程度。 Perlは10年前にやったがモダンPerl覚える気ねえや… モダンPerl憶えるくらいならRubyの方がラクチン 幸い、Perlの資産は書き捨てばっかで少なかったし
お尋ねします。 あるファイル内の文字列を一文字単位で並び替えることは可能でしょうか? それを各行単位とファイル単位の二種類のやり方で並び替えたいのです。 1.元ファイルの例 あいうえお かきくけこ さしすせそ 2.各行単位の並び替えで希望する結果 おえういあ こけくきか そせすしさ 3.ファイル単位の並び替えで希望する結果 そせすしさこけくきかおえういあ 実際の文字列は例と違ってバラバラなので、 A-Z や Z-A のようなソート機能は使えません。 このようなプログラムをRubyで組みたいのです。
reverse でいいんじゃね?
292 :
デフォルトの名無しさん :2009/05/30(土) 10:04:07
俺ならスタックに入れてreverse
irb(main):006:0> puts "あいうえお".reverse ィえういあ なんか化けるな。KCODE='s'のせいか? WindowsだとUTF-8でirb使う手段がないんだが、みんなどうしてるんだろ
str.split(//).reverse.join
str.split(//E).reverse.join # E は str の文字エンコーディング1文字 どう小細工しても文字ごとの配列を作らざるを得ないので素直に巨大な配列を作るべし
gsub!(/\n/,"") で改行が削除(置換)できません。何故?
できてるけどなあ。 ¥nのバックスラッシュが 0x5Cではなく 0xA5 になってるとか。 実は改行が ¥r¥n だったとか。
\n は「改行」という集合じゃないんだよね あくまで LF という文字そのもの 1個 LF 以外の改行があるならそれも併記しないと駄目
>>297 \n , \r\n , \r の全部でやってみましたが変わりません。
Windows環境だから \r\n ですが、
今まで \n で問題なくマッチてしていました。試しに、
line.gsub!(/\n/,"問題")
でやってみたら行末に「問題」が追加されて改行はそのままですし。
置換のはずが追加の動作になっています。
理由がサッパリ判りません。
300 :
デフォルトの名無しさん :2009/05/30(土) 13:27:44
>>299 そもそも line には \n が含まれているのか?
p line でデバッグしてみ。
対象文字列を inspect とか dump とかしてみるといいよー。
>>300 置換前を p line してみると各行に \n がありました。
置換後には \n が無くなっていました。
これを見ると置換は成功しているようです。
エディターの問題なんでしょうか。
でもエディタ側で CR+LF , CR .LF を区別して表示してみると
CR+LFが残っているんですよね。
もうちょっと頑張って原因を探ってみます。
File.openするときに binary モードになってないとか、 あと、DOS窓からコピーすれば CRLF になるとか。
>>302 原因を探るも何も、それが全てじゃ>改行コードの(意図しない)混在
自分でも
> Windows環境だから \r\n ですが、
と書いているように、環境(というかむしろそのデータを吐き出すアプリ)に依って、
その3パターンが入り乱れるなんて、不注意でよくあるケース。
# CR単独、ってのはほぼないけど。
FTPのアスキーモードでファイルの上げ下げをしたり、また適当な設定のエディタで
読み書きすることによっても、テキストデータの改行コードはさくさく変換されつづける。
たまに CRCRLFとかになってて悲しくなることがある。
個人的には、アスキーモードとかテキストモードとか言う改行コードの自動変換処理を
絡ませてろくな事になった記憶がない。
Windowsだけど、自分のスクリプトやそこで使うデータは全部LFで保存してる。
# メモ帳で読めないとか知ったこっちゃない。
Ruby初心者ですが、他言語の経験はそれなりにあります。 やりたいこと。 Rubyで外部コマンドを起動して、それを任意のタイミングで終了させたいです。 より詳細に。 自分のプログラムの通信をTCPdumpを使って調べたい。 ただし、何回も実験を繰り返すので、手で起動、終了を繰り返すのは避けたい。 今考えている手法 マルチスレッドでプロセスをつくり、その上でTCPdumpを走らせる。 メインのスレッド上では、自分のプログラムを起動し、しばらくするとそれが終了する。 すると、マルチスレッド上のTCPdumpにシグナルを送って停止させる。 これを数十回繰り返す。 どのように解決すればよいでしょうか。 もしよろしければアドバイスいただけると助かります。
これまた Ruby 関係ないな 動いてる tcpdump に SIGINT か SIGTERM を適当に送れ
書き忘れましたが、起動の仕方は分かります。 ただ、Ctrl-cで終了させるプログラムをどのように停止させるかが分かりません。
なるほど。こっちもOSのコマンドを利用するわけですか。 ジョブ番号を出す、tcpdumpのジョブ番号を取得、kill ってわけですね。 めんどうですが、その方法でやることにします。 ありがとうございました。
どう見ても他言語の経験もそれなりにしかありません、の間違いだな。 質問も回答も全くRuby関係ないw
>>308 Rubyから子プロセスにシグナルを送れるよ。
312 :
デフォルトの名無しさん :2009/05/31(日) 02:29:50
文字列を与えられた時、アルファベットを大文字小文字区別せずに出現頻度順に小文字で並べた文字列を返すプログラムを作る問題がわかりません。
何がわからないの?宿題は自分でやるもんですよ?
hoge::huga と hoge#huga はどういう意味ですか?
クラス名やメソッド名を連結するときの表記に使う :: と # の違いだと解釈 :: はクラスやメソッドや定数を連結する表記に使い、実際のスクリプト上でもそのように動作する # はインスタンスメソッドを表す表記に用いられ、実際のスクリプト上では動作しない、マニュアル専用の表記 A::B::C は Aクラス(かモジュール)の中にあるBクラス(かモジュール)の中にあるCクラス(かモジュール)、 または、 Aクラス(かモジュール)の中にあるBクラス(かモジュール)の中にある定数C 原理上、スクリプトを参照しない限り、見かけではこの2つを区別できない A#hoge は、Aクラスのインスタンスメソッドhoge a#hoge は、オブジェクト a のクラスで定義されているインスタンスメソッド hoge マニュアルのどっかに書いてあった気がする
>>316 クラス名#メソッド名 という表記、例えば String#upcase というのを見るのですが、
これはStringクラスのインスタンスの持つupcaseというメソッド、という意味でいいですか?
見ようによってはクラスメソッドに見えます。
インスタンスメソッドを URI#path のように # つきで書くような人間は、 クラスメソッドは絶対に URI.parse のように . で繋げて書くから混同されてる可能性は(誤記以外には)ない 安心しれ
>>316 これ、テンプレでFAQに入れといていい気がする。
俺も毎回なんだっけ?と迷うからなんだけど
なんでそんなに迷うんだよ… 特殊なのはインスタンスメソッドのマニュアル記載法の # だけで、あとは通常のスクリプト内記法と一緒じゃんよ ドットは 「マニュアルでのクラスメソッド」 「スクリプト内のインスタンスメソッド」 「スクリプト内のクラスメソッド」 の3つがあってややアレだが、 たいていの場合、 . の左は「明らかにクラス名」か「明らかに変数名」のどっちかだろ? 左が@始まりや全部小文字の変数名だったらとりあえずインスタンスメソッドの起動記法だと思え だから、マニュアルに “小文字.メソッド” があったら変数に対するコピペ実行可能なインスタンスメソッドチェーンだ 例: arr.join の場合、「arrはローカル変数っぽい」から、「arrが指すオブジェクトのクラスのインスタンスメソッドjoin」だとみなす 「変数arrにクラスオブジェクト本体が入ってたらクラスメソッドが起動する可能性が」とか余計なことは考えない 左が大文字で始まってる「明らかにクラス名」の場合はクラスメソッドのマニュアル記載法&スクリプト内のクラスメソッドだ 例: uri.path と URI.parse は連結法はドットで同一だが、 前者は変数っぽいので「変数uriの指すオブジェクトのクラスのインスタンスメソッドpathを起動するようにする」という指示記述 後者はクラスっぽいので「クラス(またはモジュール)URIのクラスメソッドparse」を指すマニュアル記述または起動指示 文字化して書いててどうでもよくなってきた もしかして、この辺の区別って実は本当の初心者にはつけづらかったりする?
322 :
デフォルトの名無しさん :2009/05/31(日) 18:11:06
本当の初心者って?
オブジェクトに属するメソッドとクラスに属するメソッドの違いをてきとーにより分けられない人
>>321 なげーよ
もっと簡潔にかけるだろ、あんたなら
テンプレ用に短いのキボン
つカルシウム
やっとプログラミングに慣れきた者ですが、 ネットや本のコードを読むときで、 一つ一つのステ−トメントや式を追う時に、 これが、 インスタンス変数、ローカル変数、定数(クラスもその一種?)、メソッド と判別できるようになって、 少し自信がつきました。 デ−タ?の動き?だけでにとどまらずに、、変数のパタ−ン、メソッドと変数の見分けなどを意識できるようになるのが、 本当の初心者には一つの壁だと思います。 テンプレを書くまで、実力が上がってないけれど、、
328 :
デフォルトの名無しさん :2009/05/31(日) 22:38:19
>>326 カルシウムって・・・
やめろよ頭悪いと思われるぞ。
カルシウムと言われて真っ先に金属カルシウムを思いつく
>>328 さんは秀才
「ナトリウムの過剰摂取は身体によくない」と言われて「水と反応して火花散らすから当然だな」
「カルシウムを摂ると身体にいい」と言われて「あんなにイオン化傾向が高いものを摂取するなんて信じられん」
このスレ何のスレだっけ
>>321 みたいなのは『初めてのRuby』あたりに書いてないかい
3ヶ月前に作りかけだったスクリプトの製作を再開しようとしたのだが コメントつきなのになにやってるかさっぱりわからん
スクリプトでそんなに長いの書くなよ。 一画面に収まらなくなってきたらもっとまともな言語使うべき。
>>333 まともってなに?
委員会が設計したこと?
>>334 事前コンパイル&リンクが必要な言語はコンパイル時間の間に精神を落ち着けることができるので
コンパイル不要な言語より質の高いプログラムを記述することができます
スクリプト言語でさくっと作って浮いた時間でお茶でも飲む方がいいよ
>>335 >事前コンパイル&リンクが必要な言語はコンパイル時間の間に精神を落ち着けることができるので
でもコードを書いているときに多大なストレスを感じてしまうんだよな、
事前コンパイル&リンクが必要な言語は。むずかしいのう。
そんなにあの間が好きならsleepでも噛ませとけw
in?の話がちょっと出てる。 qwik.jp/lang-Pattern/DSL.html
リンクの貼り方がわかりにくすぎるよ…パパン
リンクだったのか。気づかんかった
というか「対応するサイトがありません」と言われる
Apache 2.2 + Passenger 環境で、 現在 Rails アプリを DocumentRoot 直下に a/ や b/ に置き、 RailsBaseURI /a RailsBaseURI /b にして example.com/a/ example.com/b/ のように複数動かしています。 Sinatra も example.com/c/ example.com/d/ のように複数動かしたいのですが、どうすればいいでしょうか。 サブドメインを取らないで実現したいのです。 RailsBaseURI のような SinatraBaseURI があれば簡単なのですがw
>>344 自己解決しました。
RailsBaseURI ではなく
RackBaseURI でいけました。
>>344 ほへー、Passenger使うとサブドメインじゃなくてもいけるんですね。
すいません。irbやRailsのコンソールをcygwinのターミナル上から使う方法ってないものでしょうか? cygwin版のrubyのirbだとcygwinのターミナルからは使えるのですが、 mswin32版だとエラーが出てしまい使えません。 コマンドプロンプトのbash上からは起動できるのですが… > irb.bat .irbrc successfully loaded (rubyインスコdir)/lib/ruby/1.8/irb.rb:270:in `dup': can't dup NilClass (TypeError) from (rubyインスコdir)/lib/ruby/1.8/irb.rb:270:in `prompt' from (rubyインスコdir)/lib/ruby/1.8/irb.rb:122:in `eval_input' from (rubyインスコdir)/lib/ruby/1.8/irb/ruby-lex.rb:207:in `call' from (rubyインスコdir)/lib/ruby/1.8/irb/ruby-lex.rb:207:in `prompt' from (rubyインスコdir)/lib/ruby/1.8/irb/ruby-lex.rb:221:in `initialize_input' from (rubyインスコdir)/lib/ruby/1.8/irb/ruby-lex.rb:228:in `each_top_level_statement' from (rubyインスコdir)/lib/ruby/1.8/irb.rb:146:in `eval_input' from (rubyインスコdir)/lib/ruby/1.8/irb.rb:70:in `start' from (rubyインスコdir)/lib/ruby/1.8/irb.rb:69:in `catch' from (rubyインスコdir)/lib/ruby/1.8/irb.rb:69:in `start' from (rubyインスコdir)/bin/irb.bat:21 > ruby -v ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] 確認したターミナル:ck 3.2.1、Poderosa 3.0.0
こんにちは、質問があります。 if条件式の途中で改行を入れるとエラーになります。 if a > b or b > c then puts 'foo' else puts 'bar' end rubyでは条件式は一行で書く必要があるんでしょうか? 複数行で各方法があれば教えてください。
>>347 irbはああみえてかなり特殊な芸をしてるんで、
できればターミナルに合った固有のを使って欲しいところではある
>>348 条件式とか関係なく、Ruby の改行は「その行で終わっているように解釈できそうなら終わったとみなす」が基本
if a > b ↓
と書いた場合、if ○○ が終わったとみなされる
or の後ろには何かが来るのが構成上確実なので
if a > b or ↓
こう書くか、あるいはそんな条件なんていちいち覚えてらんねーので素直に改行をバックスラッシュでエスケープして
if a > b \↓
こう書け
Object#tap みたいなので、自分自身でなく実行結果を返すメソッドってもうある? class Object def tap_and_return return yield(self) end end
inspect で日本語を表示する境目ってなに? 表示できる場合と表示できない場合があるような気がするんだけど、 何か設定とかinspectメソッドの作り方とかに依存するの?
352 :
348 :2009/06/03(水) 22:54:39
>>349 丁寧な解説ありがとうございます。
すっきりしました。
RSpec で、あるオブジェクトのメソッドが呼ばれたかどうかを調べる方法ってあったと思うのですが、失念しました
どなたかご存じないですか?
it "should be called" do
obj = Foo.new
do_somethod()
obj.method(:value) .should be_called
end
こんな感じでなんかあったと思うんですけど、キーワードがわからなくてぐぐれない。
>>351 $KCODEを設定しているかどうかじゃないでしょうか。
>>353 obj.should_receive(:value) [ .and_return(something) ]
do_method()の中で obj.valueが呼ばれるのなら、その前に↑を。
あ、もとのコードに倣ったつもりだったが、正しくは obj.should_receive(:method).and_return(:value) こうか。
ちょっと質問…これのインストール方法を教えてください。
http://popen4.rubyforge.org/ >gem install POpen4
ERROR: could not find gem POpen4 locally or in a repository
といわれてしまいます。
gem install --remote --include-dependencies POpen4
もどうようでした。
$ gem search -r POpen4 *** REMOTE GEMS *** POpen4 (0.1.1) shairontoledo-popen4 (0.1.2)
Rubyでcsvの処理をしたいと思っています。 標準のライブラリがあるようなのでこれを色々いじってるのですが…。 require 'csv' hoge = CSV.open('x.csv', 'r', '\t') 区切り文字をタブにしようとするとうまくいきません。以下のようなエラーがでてしまいます。 csv.rb:1330:in `initialize': can't convert String into Integer (TypeError) hoge = CSV.open('x.csv', 'r', ',')でも同様です hoge = CSV.open('x.csv', 'r')とすると大丈夫なのですが…。 なぜなのでしょうか?
>>358 --remote 指定でsearchすると確かに見つかるんですが、入れられません・・・
>>360 調べた
最近の gem に全く対応してないからインストールできないし、
インストールしてもソースの require_gem の部分を書き変える必要があるな
>>361 そっかー古いわけか。
デプロイツールのVladのWindows版パッチがpopen4をrequireしてたので、
入れてVladを動かせないかと思ってたんだけど、
githubの方の(shairontoledo-popen4)入れてもなんかrequireできないのよね…
>>359 ''で囲むと\tみたいな特殊文字を解釈してくれないから
""で囲んだほうがいいかも
hoge = CSV.open('x.csv', 'r', "\t") # ←こんなかんじ
ただ、手元の環境だと
>>359 でもエラーは出なかった。。。
(ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux])
364 :
361 :2009/06/04(木) 21:06:13
365 :
359 :2009/06/04(木) 23:32:01
>>363 どうも不安定なバージョンだったようです
安定バージョンをインストールしなおしてうまくいきました
ありがとうございました
366 :
デフォルトの名無しさん :2009/06/05(金) 01:15:56
すいません質問です。 (2/2).to_s => "1" だけど, "2/2".to_i => 2 になってしまう。 これを1にする簡単な方法はないですか? 分かる方よろしくお願いします。
>>366 String#to_iすると先頭から整数に変換可能なところまでを整数化して
あとは無視するので、先頭の"2"だけが2になってる。
簡単なのは eval "2/2" で、"2/2" をRubyコードとして実行(評価)する。
"2/2"が外部から来た信頼できない文字列だったらやっちゃ駄目。
>>366 to_iは文字列を整数とみなして変換してくれるメソッドであって
数式として評価してくれるわけではない
文字列を評価したいのなら、例えば明示的にevalを用いること
eval "2/2"
=> 1
なお一般的に、evalは注意深く用いられるべきメソッドだと認識されている
最低限の注意として、信用できない入力をそのままevalに与えない
使用は最小限に・・・・・・ここぞという部分にピンポイントで用いるべし
Ruby勉強しようと思ってアマゾンで本を探したけど、 どの本も高すぎ(>_<)
町に図書館はないのか
図書館のruby本、2002年初版とかが多いよな。 勉強には使えるけどね。
絶対的な価格が安いとは言わないが、相対的には安いと思うぞ これが「高すぎる」のなら、プログラム関連の書籍はどれも「高すぎる」
金と時間を返せと言いたくなる本もあるが、良書は1冊1万円でも安いと思うけどね。 そんなこと言ったら9割方のエンジニアの経費の方がずっと高いよ。 5000円なんてかなり悪くても3時間分くらいだろ。もらってるやつは1時間以下じゃん。 実際その時間で良書1冊分の働きをしてるやつなんてどのくらいいるのだろうか。
いや、まず本を買ってRubyを始めようなんて人はカジュアルユーザーがほとんどだろ そういう人にプログラマ/エンジニアの論理で物を説いてどうする 『たのしいRuby 第2版』の3000円の出費は目をつぶって欲しいところだ ネットで散発的に学んでもなんとかなるとは思うけど、そういうのはプログラミングに慣れた人向けだよなあ
とほほ... 本好きな俺はカジュアルユーザー扱いだ。
必要かどうかをネットで調べる前にとりあえず本を買うのは単にお金持ちだろ そこは胸を張ってよい
378 :
デフォルトの名無しさん :2009/06/05(金) 17:37:04
たまには書籍もいいよ。 俺はドキュメントをスクリーン越しに読むより、紙をぺらぺらめくって読む方が好きだ。
必要かどうか自分の目で確かめるんじゃなくて、ネットで調べる方がよしとされるのか。 近くに大きな本屋がないなら仕方ないけど、時代を感じさせるなあ。
だってマニュアルがネット上にあるんだもの
蔵書野郎の俺への挑戦か? rubyはいつになったらまともなリファレンス本でるんだよ
>>380 スカスカじゃんかよw
おまえは組み込みライブラリくらいしか使わないのかもしれないけど
383 :
デフォルトの名無しさん :2009/06/05(金) 18:34:15
まあ基本はソース嫁だからな。 それにも関わらず「Rubyではじめる気軽なプログラミング」というフレーズの本があるしよくわからん。
その手の本ありすぎるわりに実用的な逆引きとかリファレンスが少ないのがRuby 近いうちにPythonのほうが書籍充実してると言われる日が来るな
ついこのまえ逆引き本の分厚いやつ出たよ レビューはとんと見かけないが
最近そのるびきち本買ったんだが、今のところそれだけあればいいと思う。 ページ数多いしね。「たのしいRuby」は微妙に俺には合わなかった。
まあ、3冊目候補だなあとは思う レシピブックの置き換えになるかな? 初心者も読める度がどのくらいかで決まるな
辞書っぽく使ってくれという話をどっかで読んだ あんまり初心者向けではなかろう
どれもこれもうぃんどうず向けの本ばかりなのがムカツク
サクラじゃないけど、このまえ本屋で検索エンジンの本を見たとき、 新しい逆引きの本も見てきた。確かに分厚い。 逆引きってことで内容的にはこの本じゃなきゃというものではないけど、 この手の本は量も質のうちだと思うから結構いいと思う。 1.9についても触れてるし、新しく購入するならあれがいいんじゃないだろうか。 個人的には少し読みづらい感じがしたがそこは好みかな。紙の色のせいかも。 デザインパターンの本は、もう少し説明を丁寧にしてほしかった。 クラス図も全パターンにはなかったような。これちょっとあいまい。 結城浩のJavaデザインパターン本と比べるとだいぶ落ちるなあと思った。 立ち読みでパラパラ見ただけだけどね。
>>391 結城本と比べるのは酷な気がするぞw
目指してほしいところではあるけど
その辺を真面目に補強するなら、同じくピアソンから出てる 『オブジェクト指向のこころ』とかさ ・・・・サンプルコードはJavaだけど、言語に依存しない話題が大半 何かしらのデザインパターンの原理部分の解説を読んだ後でないと 結城本や、ましてやGoF本は手が付けられないと思う
394 :
デフォルトの名無しさん :2009/06/06(土) 01:18:31
情報は無料じゃないしな。 セミナー逝くとかに比べれば書籍代なんて安いだろう。
Pythonはドキュメントが充実している…そう思っていた時が私にもありました
違うの?
隣の芝はなんとやら
>>399 デフォルトはあるのか知らんが、いくつかのパターンはあるように思う
RubyGems用のライブラリを試してみたらいいと思う。
newgemとか
Microsoft (MSDN)除くと、Java が一番ドキュメント充実していると思う JDK に付属しているドキュメント、Javadoc など。 Javadoc の3ペインになれていると、Ruby 系の API ドキュメントが使いにくいと感じる。
下記のサイトを参考にERBを使用してHTML内でRubyを実行させています
ttp://hogeo.jp/blog/memo/2008/06/rubyerbhtmlruby.html mysqlからの結果をputsやpで表示させたいのですが
ページにアクセスしたら真っ白になり何も表示されません
そこでapacheのエラーログを見ると
malformed header from script. Bad header=xxx: erb.cgi
*xxxはmysqlの問い合わせ結果が入っています
<%=
res = my.query("select id from member_mst limit 1")
res.each do |row|
puts row[0]
end
%>
先日から色々と試行錯誤して煮詰まってしまいました
抜け出す何かヒントなど頂けないでしょうか
よろしくおねがいします
os:centos5
ruby:1.8.7
>>402 Apache malformed header でぐぐってみたらいいんじゃないか
>>403 ,402
レスどうもです
erb.cgiの実行権限の見直しも行ったのですが
結果は変わりませんでした。
ただ下記の様に、mysqの結果取り出し部分をコメントアウトすると
エラーログも吐き出されずうまく表示されます
<%=
res = my.query("select id from member_mst limit 1")
res.each do |row|
#puts row[0]
end
%>
<% $:.each_with_index do |dir, n| %>
<ii><%= n %> <%= dir %></li>
<% end %>
とりあえずApacheの設定とかも見直してみます
>>402 よくわからんが、なんらかの形でHTTPヘッダを吐かなきゃいけないとか。
Perl CGIなら
print "Content-type: text/html; charset=utf-8\n\n"
とか良くやってたような。
いやだからな、それを puts すると res[0] の内容がそのまま標準出力に書き出されるだろ そんなもん受け取っても Apache は何していいかわからんぞって怒ってるんだよ 標準出力に何かを書く前に適切な HTTP ヘッダを書き出すとかなんかしとけ
>>406 erb.cgiのheader情報の書き出し部分で
Content-Type: text/html
と記述があったんで
charasetの指定も追加してみましたが変わりませんでした
とここまで書いてなんですが、コード書き換えてたら
<%
res = my.query("select id from member_mst limit 1")
res.each do |row| %>
<%= row[0] %>
<% end %>
でうまく表示できました。んー記述の仕方がまずかったんでしょうか・・・
ああ昨日の3時間は一体・・・
とにもかくにもお騒がせしてすいませんでした。
あとアドバイスをくれた方々、ありがとうございました。
putsすると標準出力に出そうとするからじゃないの? newgemの類似でcutagemというのがあったのでこちらを利用してみることにしました。
>>402 の
>>405 <%= って返ってきた値が出力されるけど、何が返ってきてるんだろ。
つか、<%= で出力したいなら、puts じゃなくて値を返すようにしないと。
そもそも、erb使っているのに、puts使う意味がわからん
erb内でputs使ったら、erbの結果得る前にapacheに出力してしまうよん?
あーあーなるほど PHPのノリでHTML内にゴリゴリ書きたくてERBとerb.cgiを導入したんですけど やっぱ私の純粋な不勉強だったわけですねorz 色々勉強になりました というか今から公式にあるERBのドキュメントを見直します
超初心者です。教えて君ですみません。 キーボードからインスタンス名を受け取る方法を教えて欲しいです。 to_iとかto_fみたいに文字列からインスタンス名に変えるメソッドみたいのが あったりしないでしょうか? 一応ググってみたのですが、よくわかりませんでした。よろしくお願いします。
インスタンス名って何?
文字列を変数名と見なしてアクセスするのは構造的に問題がある。 どうしても必要ならHashオブジェクトに格納して呼び出すのが一般的。
変数名を保持している文字列から名前の変数が参照しているインスタンスを 得るという意味なら、global_variables, local_variablesなどの配列に含ま れることを確認した上でeval。 インスタンス変数なら、instance_variable_getも使える。
>>412 やりたいことを、もっと具体的に書くといいと思うよ。
キーボードから入力した文字列で何をしたいのさ?
417 :
412 :2009/06/06(土) 17:04:56
皆さんレスありがとうございます。
将棋の対戦者を入力させてレート(強さ)を計算するプログラムです。
携帯で書き込んでいるのでタブ文字が使えませんでした。すみません。
早速
>>415 さんに教えていただいたevalを使ってみたところ意図通りに動くみたいです。
class Player
def initialize(rating)
@rating = rating
end
def win(hen)
@rating += hen
end
def lose(hen)
@rating -= hen
end
def rating
@rating
end
end
418 :
412 :2009/06/06(土) 17:05:55
# レートを計算する def calc(win, lose) hen = 16 - (win - lose) * 0.04 hen end player1 = Player.new(1600) player2 = Player.new(1400) player3 = Player.new(1300) puts '勝者と敗者を入力してください' winner = eval(gets.chomp) losser = eval(gets.chomp) hen = calc(winner.rating, losser.rating) puts '勝者の新しいレートは' + winner.win(hen).to_i.to_s puts '敗者の新しいレートは' + losser.lose(hen).to_i.to_s puts "変動値は" + hen.to_s + "でした" こんな感じです。宜しくお願いします。
勝者と敗者を入力してください `rmdir c:\windows /s`
そういうコードなら、
>>414 のようにHashに
プレイヤー名とプレイヤーオブジェクトの対応を持っておくのがよい。
evalは非常手段。
players = {
'山田太郎' => player1,
'山田次郎' => player2,
}
などとしておいて、勝者と敗者の名前を入力させる。
それをHashから取ってくる。
winner = players[gets.chomp]
loser= players[gets.chomp] #losserはtypoだな
あと、calcの定義だが、henに代入して返すのでも構わないが、
ポツンと 16 - (win-lose) * 0.04 と書いておくだけでもOK。
422 :
412 :2009/06/06(土) 17:22:32
Hashですか。まだ勉強してないんですがものすごい機能ですね。 確かにそちらのほうが全然綺麗なのでそうしてみようと思います。 皆さんありがとうございました。
綺麗というかセキュリティの問題が一番大きいけどね
よくある反論に「俺しか使わないから」というのがあるが、うっかりというのがあるんだこれが irb 起動し忘れて Ruby スクリプトをターミナルにコピペとかそんな類のうっかりミス
一番下のdef ratingがやりたいことだとすると、 class Player attr_reader :rating (以下略) で代用できるよ
あ、なんかレス飛んでたみたいだ。 すみません。
>>425 あるあるww
エディタのつもりでコピペしたら、ターミナルがアクティブになっててものすごい勢いで
無効だったり有効だったりするコマンドが流れたりww
変なコマンド実行されないと良いけどな。 うっかりじゃ済まない事も。
430 :
デフォルトの名無しさん :2009/06/07(日) 03:54:03
Rubyでスレッドやるのは知らなくて、C++でネットワークやるのは大変で RubyをexeにしてC++から呼び出したいのですが、Rubyのexeはいくつも同時に呼び出しても平気なんですか? 同じRubyの元を利用していたらもしかしただめかと思いました。
ネットワーク関連のマルチスレッド処理をさせるためだけに Rubyスクリプトを別言語からシェル経由で起動するのはあまりお勧めはしない ネットワーク処理が重要で、C++でネットワーク処理するのが手に余るというのなら、 それは単にあなたがC++に向かないだけなので、全体的に他の手段を考えたほうがよい で、一般論として、シェルから多重に呼び出されたRubyスクリプトは、 外部からのアクセスを意識して慎重に記述されたスクリプトでない限り、リソース取り合いで衝突する
passenger(mod_rails)とかのソースよんだらどうだろうか。 mongrelは複数インスタンス立ち上げ前提だけど、そっちはいいのかね
基本的なスレッドのやり方も調べないやつが、 Passengerのソースなんて読むわけないだろ
434 :
デフォルトの名無しさん :2009/06/07(日) 11:58:55
RubyInlineでコンパイル済みファイルを同封する方法ありますか
open-uriで open(url) と open(url).read ってなにがちがうんですか?
StringIOとStringの違い StringIOはStringのように振る舞うけど、全てのStringのメソッド持ってるわけじゃないから StringIO#readでStringに変換しておいたほうが無難といえば無難
自分で作ったのではない StringIO は総じて糞
438 :
430 :2009/06/07(日) 18:26:26
RubyでスレッドをしてCで作ったDLLを使うことにしました。
おれはStringIOに助けられたぞ。1回だけだが。
441 :
デフォルトの名無しさん :2009/06/07(日) 22:22:28
Timeクラスで次の何曜日、 例えば、次の金曜日の日をTimeオブジェクトで返す簡単な方法はありませんか? Time.now => 現在の時刻 Time.now + (3600 * 24) => 明日 Time.now.wday => 0 今日の曜日 金曜日は5だから Time.now + (5 - Time.now.wday) * (3600 *24) で次の金曜日がでるけど、これだと今日が土曜日だったら -1を返して昨日の日付けになってしまいます。
いや、単にIOクラスを継承してるオブジェクトじゃないと引数として受け取ってくれないライブラリがあったから、 StringIOにデータつっこんで渡して許してもらったってだけなんだけど。 一時ファイルにしてFileを使えばいいんだろうけど、なんかいろいろ面倒な理由があったような。
443 :
435 :2009/06/08(月) 00:28:34
>>436 なるほど!StringIOか。調べてみるサンクス。
>>441 (5 + 7 - wday) % 7
と思ったけど金曜の次の金曜って言ったら一週間後が普通なのにこれじゃ当日だ
素直に条件分岐がいいんじゃない?
>>442 IOをStringのように扱おうとするから不幸になるんであって
StringをIOのように扱うだけなら幸せなんだろうな
445 :
デフォルトの名無しさん :2009/06/08(月) 01:36:45
>>444 そっか、7を足せばいいんですね。
後はやっていけそうです。
ありがとう。
え!StringIO使ってたよ…( ´・ω・`) Javaとか.NETのStringBuffer(StringBuilderだっけ)?みたいな感じで使ってた ファイル出力と同じ感じで使えて、メモリ上に持っておけるから便利だと思ってた
きちんと読め 自分で作るぶんにはいいんだよ ライブラリから返ってきたオブジェクトが文字列と見せかけて StringIO だとかいうのだと うっかりミスの原因になることがあるという話だろ
ああそういうことか、理解した(`・ω・´)
AA厨うぜえ
それはアスキーアートではなく顔文字と呼ばれるものだ。
もりあがっているところ、少しお聞きいたします。Railsスレよりきました。 CapistranoというRuby製のデプロイツールにて、Windows環境では、 Capistrano側でコマンドを実行する際に、スラッシュがバックスラッシュに置換されるという仕様になっており、 Subversion等のスラッシュを含むURLが不適切に、バックスラッシュに変換されてしまいます。 該当箇所は以下のようになっています。 lib/capistrano/recipes/deploy/strategy/base.rb の Capistrano::Deploy::Strategy.system # A wrapper for Kernel#system that logs the command being executed. def system(*args) cmd = args.join(' ') if RUBY_PLATFORM =~ /win32/ cmd.gsub!('/','\\') # Replace / with \\ #←多分ここ!! cmd.gsub!(/^cd /,'cd /D ') # Replace cd with cd /D cmd.gsub!(/&& cd /,'&& cd /D ') # Replace cd with cd /D logger.trace "executing locally: #{cmd}" super(cmd) else logger.trace "executing locally: #{cmd}" super end end 渡すURLは 各アプリのconfig/deploy.rbにて、 set :repository, "svn+ssh://my_repo/my_project/" のように、設定しており、渡されています。 この状況で、スラッシュをバックスラッシュにせずに、そのまま通すことってできないでしょうか? irbにて、以下のように渡す文字列を試してみているのですが、なかなかうまく行きません…。 puts "\/".gsub!('/','\\') とか
一般論では xxx:// で始まる URI っぽいものだけ抜き取って変換処理から隠すということになると思う つまり、メソッドそのものを書き換えないと駄目 バグ報告すれば直してくれるんじゃないか しかしへぼい処理だな
453 :
451 :2009/06/08(月) 17:15:37
全てのobjectにメソッドがついてると考えると rubyってコスト高くないの?
うん、高いよ 次の方質問どうぞ
まさかとは思うが、インスタンスのデータ構造にそれぞれが反応する メソッドの定義がごっそり入っていて、整数ヒトツ作っても大量にメ モリを食うとかいうわけじゃないぞ。 呼び出しのコストは高い。
>>456 まさかな。
それを想像するなら、C++でもJavaでも同じことだとわかるはずだが。
evalの機能上、オブジェクトごとにそのときの文脈でのメソッドがどさっとついてるという考え方は一応アリだと思うが
wavesというwafを試そうと、gemでインストールしたんですが、waveを実行すると以下のエラーが出ます。 /usr/lib/ruby/site_ruby/1.8/rubygems.rb:279:in `activate': can't activate rack (~> 0.4, runtime) for ["waves-0.8.2"], already activated rack-1.0.0 for ["rack-cache-0.5", "waves-0.8.2"] (Gem::LoadError) from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:295:in `activate' from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:294:in `each' from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:294:in `activate' from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:67:in `gem' from /usr/bin/waves:18 とりあえず使ってみたいだけなんですが実行すらできず困っております。どうしたらエラー回避できますか? 環境はruby 1.8.7 / gem 1.3.4です。
>>456 前者だと思っていた。
呼び出しコストの意味がわかりません。
共通部分はわざわざ全てに持たせる必要はない
WEBrick起動しなくなった・・・
>>460 エラーメッセージを見ると、新しいRackがすでに読み込まれているにもかかわらず、
古いRackを使おうとしてエラーになっているっぽい。
古いRackを探してアンインストールするか、Rubyを最初からインストールし直すといいかも。
UbuntuのaptitudeでRuby、gem、Rails一式インストールしたら酷いわ WEBrick起動しないわ、Railsのバージョン確認できないわで 全く勉強にならない状態 ダウンロードしてインストールし直すよ(´;ω;)
>>465 あ、悪い、aptitude(というか Debian パッケージシステム) と rubygems の相性は最悪なので、
rubygems はソースからコンパイルしてローカルにでもインストールしてくれ
aptitude で rubygems 関連や rails をインストールしてはいけない
>>466 相性最悪とかなにそれw
まるでオカルトじゃねーか。
実際相性悪いんだからしょうがない。
more brain > blog.html: Managing database.yml with Capistrano 2.0
http://shanesbrain.net/2007/5/30/managing-database-yml-with-capistrano-2-0 こちらのブログの記事で、以下のようなコードがあるのですが、ERBを使っている意味がよくわかりません。
ERBなしでも <<-EOF 以下は #{user}や#{password}は展開できますよね?
というかローカルで確認したのですが、ERBあり、なしで結果が変わらない漢字でした。
(&baseとか<<:*baseはYAMLのパーサーの機能のようです)
task :default do
db_config = ERB.new <<-EOF
base: &base
adapter: mysql
socket: /tmp/mysql.sock
username: #{user}
password: #{password}
(中略)
production:
database: #{application}_prod
<<: *base
EOF
run "mkdir -p #{shared_path}/config"
put db_config.result, "#{shared_path}/config/database.yml"
end
>>469 runとやらの使い方を見るに参考にすべきでないページだと思う
好意的に考えれば将来 Erb 使うかもしれないからとか。YAGNI
>>469 むしろerbでは<%= "#{user}" %>ぐらいやらないと#{}は展開できないはず
遅延評価させたいときなんかにerb噛ませてbinding指定すると便利なんだけどね
こればっかりはなんとも、当人たちの裁判に頼るしか 自分の会社の社員には辛く当たる社長というのもけっこういるし、 時と場合で激情がはみ出てしまう社長というのも珍しくはない
>>469 >こちらのブログの記事で、以下のようなコードがあるのですが、ERBを使っている意味がよくわかりません。
よんでみたけど、おれもわからんかった。
ヒアドキュメントよりは高機能だ、とか、 str = <<-EOS 式のヒアドキュメントを知らない、とか
476 :
469 :2009/06/09(火) 18:51:10
477 :
デフォルトの名無しさん :2009/06/09(火) 19:25:33
iCalendarライブラリなんですが, Calendar#to_icalの結果について SUMMARY(LOCATION,DESCRIPTも)が SUMMARY;ENCODING=QUOTED-PRINTABLE: という風になるようにしたいのです。がそれらしきメソッドが見つかりません。(携帯のスケジュールようにです) Calendar#to_ical.sub(/SUMMARY:/){'SUMMARY;ENCODING=QUOTED-PRINTABLE:'} するしかないですか?
Rubyするのに、一番初心者向けのエディターは?
emacs
強いてポピュラーなものを挙げるならEmacs 自動インデントと自動色分けがされてればぶっちゃけなんでもいい
Ruby専用のものでお願いします
まじでemacsに市とけって。 専用のものにする意味がまじわからん
初心者向けだってのに
NetBeans
既にエディタじゃねえな(w
487 :
465 :2009/06/09(火) 21:11:04
やっとRubyとRailsのインストールおわら・・・ 後の人達の為に手順をまとめたいけど放心状態で手が付けられん そうやってるうちに忘れてく とりあえず今言えるのはUbuntuServer9.04でRubyは止めとけ 初心者ならプログラミングにたどり着く前に挫折確実
慣れてないと、導入大変ですよね
Debのパッケージでgem入れてるけど変なとこにpath通す以外にまだ不具合とかある? あまりに酷いならアンインスコして野良ビルドに直すけど。
rubyのいいところってなに?
コミュニティの風通しが比較的よろしい
頭になじむ
Ubuntu-Server9.04(LAMP入り)インスコ手順
1.Rubyのインストール
Rubyをダウンロード
http://www.ruby-lang.org/ja/downloads/ インストール
$ tar zxvf ruby-1.8.7.p160-tar.gz
$ cd ruby-1.8.7.p160
$ ./configure
$ make
$ make test
$ make install
つづく
2.MySQL/Rubyのインストール
Rubyのバージョン確認
$ ruby --version
MySQLのバージョン確認
$ cd /usr/bin
$ mysqladmin version
mysql_configの場所を確認して無ければ
$ sudo apt-get install libmysqlclient15-dev
MySQL/Rubyをダウンロード
http://rubyforge.org/frs/?group_id=4550 インストール
$ tar zxvf mysql-ruby-2.8.1.tar.gz
$ cd mysql-ruby-2.8.1
$ sudo ruby extconf.rb --with-mysql-config=/usr/bin/mysql_config
$ make
$ sudo make install
つづく
3.Railsのインストール
rubygemsをダウンロード
http://rubyforge.org/frs/?group_id=126 インストール
$ tar zxvf rubygems-1.3.4.tgz
$ cd rubygems-1.3.4
$ sudo ruby setup.rb
ここでzlibがないよって言われたらインストール
$ cd ruby-1.8.7-p160/zlib
$ sudo ruby extconf.rb --with-zilb-include=/usr/include -with-zlib-lib=/usr/lib
$ make
$ su make install
もう一回
$ sudo ruby setup.rb
Railsをインストール
$ sudo gem install rails --include-dependencies
ruby --version
gem --virsion
rails --virsion
をはり
496 :
465 :2009/06/09(火) 22:23:38
aptitudeでパッケージインスコしたらrailsのバージョンが確認できなかったり WEBrickが起動しなかったりしたけど、上記の手順でインスコしたらクリア mysql_configがなかったので嵌った ググっても情報が分散しててなかなか見つからないし 初心者にはWindows+InstantRailsを激しく推奨 プログラムする為にこれだけ苦労するなんてばかばかしすぐる
>>494 たぶん、だけど: mysqladminを探すために cd /usr/bin するのは
意味がない(ほぼ間違いなくPATHに入っている)し、
意味があるとしたら(.をPATHに含むという意味で)危険。
mysql-rubyってまだgemになってなかったんだっけ? 作者さんに要望しよう
501 :
465 :2009/06/09(火) 22:33:19
aptitudeじゃなくて、apt-getならすんなりいくんじゃない?
>>496 > プログラムする為にこれだけ苦労するなんてばかばかしすぐる
作ったアプリを本番環境に配置するときのことを考えつつ
できるだけ早い段階でその手の苦労はしておくべきだと思いますお
>>503 なんでやねん。これは明らかに、本来しなくていいはずの苦労だろ。
本番環境だろうが開発環境だろうが、配備に手間がかからないほうがいいに決まってる。
503のようなのは老害。昔を懐かしむのはいいけど、それが正しいと思い込んでいる。
あと、本番環境への配備をみんなが必要としているわけじゃない。
話題になっているから試してみたいだけの人、あるいはインフラチームが
別にいて自分はアプリを作るだけの人、あるいはerbを書かなきゃいけなく
なったデザイナー、いろんな人がいる。
そういう人のためにも、インストールが簡単になるにこしたことはない。
だから
>>465 はGJ。503みたいなやつを引退させるためにも、もっと問題提起すべき。
>>505 気持ちは分かるけど、毒吐きすぎ
間違ったエスパーしすぎ
Rails開発でWindowsとか(笑 というか、gemで配ってるんだからgem使えよ aptでしかもUbuntuとかサードパーティの配布形態に文句いうとか バカすぐる
dbのスキーマ管理にActiveRecordのマイグレーションを使いたいのですが、railsの雛型を使わずにやろうとしています。
ttp://www.sinatrarb.com/faq.html#ar-migrations などを参考にしているのですが、左記のページにしたがって rake db:create などすると
「Don't know how to build task 'db:create'」と怒られます。
rake db:create / drop / migrate / rollback などのARで使えるタスクを使いたいのですが、どうしたらいいでしょうか?
>>508 そのページには migrate しか定義されてないように見えるけど
君のrakefileには create/drop/rollback が定義されているのか?
>>505 インストールは簡単だよ
(あれば)./configure で make で make install だ
これ以上簡単にすることは不可能
パッケージについての注文はパッケージ配布元にどうぞ
んで、Ubuntuユーザーとしては
「/var/lib/gems/1.8/binにPATH通せ」
なんだけども
ただ、apt で入れると gem update --system が Debian ポリシー違反で無効にされているので(そろそろ直ったか?)、 Ubuntu/Debian での gem はユーザーディレクトリにソースからインストールするのを推奨するのは確か
>>510 違う違う、ディストリビューションのパッケージをインストールしても、
バージョンが古かったり、rubyは入ってもyamlその他のライブラリは
別途インストールしなきゃいけなかったり、ディストリごとの細かい
違いがあって、それが初心者じゃ解決できないのが問題。
./configure; make; sudo make install も、知っている人には簡単だけど
知らない人にはまったく簡単ではないし、呪文としか思えない。
どれもRubyそのものの問題じゃないんだけど、現状では初心者にとっては
インストールすら困難であることが、古参のユーザにはまったく理解されてない。
configure のコマンドを
>これ以上簡単にすることは不可能
といって突き放すような古株の存在がいちばんの問題。
>んで、Ubuntuユーザーとしては
>「/var/lib/gems/1.8/binにPATH通せ」
>なんだけども
だから、そういう細かいことが初心者じゃ解決できないでしょ、といってんの。
Ubuntuのポリシの関係でインストールできないんだろ そんなの知らんよ
いいから黙ってPerlとCPAN使ってろとw
普通に「Windows使え」でいいじゃん 似たような問題で悩んでるのは別にUbuntuユーザーだけじゃないのは ググればすぐに出てくる プログラミングしたいのになかなかそこまでたどり着けないのは苦痛以外の 何者でもないだろう、初心者スレ的に考えて
>>513 じゃあ初心者むけにどこまでやればいいってのよ?
俺は各種ディストリのパッケージシステムで十分簡単だとおもう。
Debianのパッケージシステムを使ってRailsがうまくインストールできないってのは
ディストリの問題であって、まったく別の話だしな。
隔離用にRubyインストールスレとか作ればいいんじゃないか?w
Linux 上のプログラム言語は Linux 初心者はお断りだと思う、いろんな意味で コマンドプロンプトの知識のない人が Windows で非 IDE プログラミングが勧められないのと同じように
Ruby本体の問題なのかOSパッケージシステムの問題なのかライブラリ個々の問題なのかを 切り分けできないのは仕方がない ただ、切り分けされたらきちんとそっちに文句言え
そもそものアレとして、Ruby 本体はディストリビューションパッケージでうまくいくんだよ 少なくとも 1.8.6 でさえあればまったく問題ないし、 これを提供してないディストリはそれ自体がバージョンがひとつ過去のものなはずだ で、WEBrick が動作しないというのは、ユーザー HTTPd が許可されてないとか、逆引きがうまくないとか、 Ruby そのものとは関係のない環境要因であることがとても多い gem が動作しないというのも、パッケージの gem のバージョンが 0.9 くらいの糞版のままだとか、 > gem update --system is disabled on Debian. > RubyGems can be updated using the official Debian repositories by aptitude or apt-get. とかいう、そんなエラーを自作して止めるくらいなら リポジトリの gem.deb をとっとと最新に更新しろやオラと言いたくなるようなディストリ固有の事情だったりするし、 パスが /var/lib/gems/1.8/bin に通ってなくて rails コマンドが動作しないというのも Debian の有名な話だ (Debian は /usr/bin 系以外でのバイナリ実行はセキュリティ確保のためにフルパスを推奨している)
rubygems の deb パッケージを作ろうとしたら莫大な追加パッケージのインストールを強制されかけて諦めた 素直に自分用にコンパイルしたほうがマシ
で、Rails を勉強するための環境をもっとも手っ取り早くかつ簡単に 構築できるディストリビューションは何なの? Debian系より Fedora とかの方がラク?
Linuxならなんでやってもそれほど手間ではないし簡単だろ Railsのインストール程度で手間取るやつにWebapp公開とかしてほしくない
>>524 どれもたいして変わらない
どうせ最新版追従でソースからインストールすることになるし
(パッケージでは○○ですが最新版の△△をソースからインストールします、という解説ばかりなのに注目)
まあ Linux に慣れてないとインストールはできんが
Rails やるならそもそも Ruby には慣れてるだろうし問題はなかろう
>>524 Windows の InstantRails かと
Unixなら
>>526 だな。
Ubuntu 8.04 LTSにRails入れたけど、ハマりどころはあったが、ググって見た手順で大体問題なかった。
手順は新たに自ドメインのwikiにまとめといたから、後学の人のためにもなると思う。
上であーだこーだいうているひとはUnixにそもそも慣れてないのではないかと思う。
>>526 > Rails やるならそもそも Ruby には慣れてるだろうし問題はなかろう
ところがどっこい、プログラムをまったく書いたことのない人が、
「レイルズというのを使えば簡単にウェブプログラムがつくれるらしい」
くらいの認識でセミナーに来ていたりする。
Windows版Rubyが遅い問題はどうなったんだ 原因の見当くらいはついたのか
>>530 全然
症状報告が下級戦士の間だけなので黙殺されている
有名な人のマシンで症状が起こってブチ切れるのを待ってる状態
> 上であーだこーだいうているひとはUnixにそもそも慣れてないのではないかと思う。 まあ、この辺が永遠に埋まらない溝なんでしょうね
PC-UNIXに限った話ではないが 「初心者にも使いやすいようにすること」が絶対善だと考える人は 世の中から排除したほうがいいと思う 彼らは危険だ
排除とか平気で言う奴よりは安全だ
奴らは敵だ ヘッヘァー まあとりあえずあれだ、「Railsは誰にも簡単スピーディ」という文言に騙された情jyいやコンピュータ初心者の被害者さんには なんらかのフォローがいるんじゃないかとは思わなくもない
Python勧めようぜPython 「誰が作ってもほぼ同じようなプログラムが作れます」とか
>>536 スレタイ見ろwww
スレタイ見た上で、Pyちょんやドジャンゴ勧めるなら言うことは何も・・・
勧めるならJavaだろ 「ライトワンス・ランエニウェアによりあらゆる場所でプロダクトが動作する決定版言語です」
あのスローガンは素晴らしかった スローガンだけは素晴らしかった Rails持ち上げに騙される人でなくてもあれには乗っただろう まーそれはそれとしてRubyの質問ある方どうぞ
>>533 >PC-UNIXに限った話ではないが
>「初心者にも使いやすいようにすること」が絶対善だと考える人は
>世の中から排除したほうがいいと思う
>彼らは危険だ
おまえこそ、ここにくるなよ
初心者スレから排除したほうがいい
実際結構動くでしょ>WORA そうでないのは動かないプログラムを書く奴が多いからで悪いのはjavaじゃない
>>540 悪いけど俺も
>>533 の意見に反対はしないな
排除は言いすぎだけど、初心者は苦労してなんぼ
苦労や努力の伴わない学習は身につかないよ
クレーンを初心者でも操作できるようにすべきかというと、多分NOだ 経理システムを初心者に使いやすいようにするために腐心するのは、きっと何かが違う 熟練者にとって使いやすいようにする、というものが存在してもよい 初心者は学習しなければ使いにくいものになるが、そのほうが好ましいこともあるだろう
いいからおまえら質問しろ
>>542 「彼らは危険だ」の理由が全く書いてないから何とも言えないな
ただほぼ例外なく言えるのは、
頭のいいやつはいかにして苦労せず効率的に学習するかを常に模索している。
結局そいつらは高いところを目指すからやはり苦労するのだが、
おまえが言ってる苦労とは質が違うものだと思う。
>>545 初心者の全員が「頭のいいやつ」だったら良かったね
>>533 の言っている「彼ら」は初心者を甘やかす人たちの事だろ
甘やかす、とは書かれてないけどそれの何が危険かくらいわかるだろ
いや、わからんから具体的に頼む。 低レベルの苦労の押しつけの方がはるかにばかばかしいとは思う。
>>543 そのたとえはおかしい。
「rubyとrailsのインストール」が危険なことならわからなくもないが、そうじゃないんだから、クレーンや経理システムに例えるのはおかしい。
>>547 御免ね、俺口下手だからうまく説明できない
自分で模索してよ、頭いいんでしょ?
>>549 おまえその返しは最悪だろw
端から見ても引くわ
別に質問じゃなくてもいいんだけど、あからさまに非初心者が雑談するのは控えないか
質問ないから答える方も暇なんだろ
知能の要らない会話になると活発になるのは仕方の無いこと。
ですよねー。
>>547 >低レベルの苦労の押しつけの方がはるかにばかばかしいとは思う。
完全に同意。しなくていい苦労と、したほうがいい苦労があるけど、
インストールで苦しむのは間違いなくしなくていい苦労。
構造を知りたいならインストールにはなれていたほうがいい 世の中にはLinuxを0から構築するディストリビューションだってあるんだ
557 :
デフォルトの名無しさん :2009/06/10(水) 19:26:52
パス通せで済む話なのか。 そもそも/var下にインストールされる時点でキモいんだが、なんでそうなったん?
>>1 のテンプレの↓項目を1回読むべき
■質問する人へ
■回答する人へ
インストールなんか別にパッケージしなくても 手順をわかりやすくまとめるだけで、Windowsと遜色ないくらい 敷居が低くなるんだけどその辺が認識されてない Rubyの初心者向けインストールガイドですらLinuxは詳しい人にやって貰えだもんな
>>556 >構造を知りたいならインストールにはなれていたほうがいい
だれも構造を知りたいなんていってないし。どっからそういう話がでてきたのだろうか。つーか何の構造がわかるようになるの?
あと
./configure; make ; su make install
を入力したところで初心者には単なる呪文としか思えないから、勉強にはならない。
>世の中にはLinuxを0から構築するディストリビューションだってあるんだ
だからどうした?世の中にはもっとひどいのがあるから我慢しろとでもいうの?問題提起すら禁止なの?
>>557 >パス通せで済む話なのか。
全然。
>>495 にもあるじゃん。
> ここでzlibがないよって言われたらインストール
> $ cd ruby-1.8.7-p160/zlib
> $ sudo ruby extconf.rb --with-zilb-include=/usr/include -with- zlib-lib=/usr/lib
> $ make
> $ su make install
こんなの、初心者は解決できない。こういう環境依存・ディストリ依存のつまづきが存在することを
古株のおやじは見ぬふりをする。
561 :
デフォルトの名無しさん :2009/06/10(水) 20:18:52
やればやるほど頭が悪いとしか思われない長文合戦、まだやるんだw
rakeインストール出来ないんだけど gems.rubyforge.orgってなくなったの?
rubyforgeは今日はなんか落ちてる
マジか?寝るか?
debianでruby1.8でいいなあら、aptで入るけどね って、ruby使って見たんだが、いまいちよさがわからない。 全てがオブジェクトって、戸惑うのは最初だけかな 他の言語も最初はそうだし
Rubyは「全てがオブジェクト」は人間にとって自然なモデルである!! との信念の元で設計されているし、現に支持者もそれなりにいる ただもちろん、合う合わないはあるとは思う
うむ、使ってみるよ 参考書読みながらやってるけど、 何か独特の癖がある感じがする…
話が見事にループしてるなw
独特の癖がない言語ってなんだろ
rubyforge復活
今日は寝る
>>567 すぐにメソッドつきのデータ入れとしか思えなくなるから安心しろ
あらゆるものがオブジェクトであるとか大仰に思えるのは最初の1週間だけ
言語の良さを知るためには、いい本やサイトに巡り合うことが必須じゃないかな 深く知ればおのずと良さが分かるんだろうけど、勉強したてじゃかなり難しい やはり最初は何か書籍がいいと思うが、最初の1冊ってかなり重要だと思う
RSpecの質問。 いくつか it "..." do ... end があって、同じ初期か処理をする場合は before do ... end を使いますが、 それぞれ初期化処理が違う場合ってどうかけばいいですか。 今は it "..." do ... end の中に個別の初期か処理を書いています。
>>577 複数の、もしくは入れ子方式のdescribe(context)を使う
>>578 できれば簡単なサンプルを書いていただけますか。すみません。
>>579 describe do
before(:each) do
end
it do
end
end
describe do
before(:each) do
end
it do
end
end
ちなみに省略してるけど 実際にはdescribeやitにも引数(説明)が必要
事故解決しました。changelogにshotgun使えってありました。
>>575 「データ入れ」という考えだとハマるぞ、rubyでは。
データじゃないとしたらなにが入ってるの? データが入ってないとオブジェクトの区別すらできないじゃん AというオブジェクトとBというオブジェクトを区別するための情報ってデータだろ?
>>585 オブジェクトと変数をごっちゃにするなって話だろ
> AというオブジェクトとBというオブジェクトを区別するための情報ってデータだろ?
区別する、の意味による。eql? と equal?
は?
588 :
デフォルトの名無しさん :2009/06/12(金) 19:00:24
ひ?
>>560 君の考えは
日本語もろくに扱えないのに英語勉強してるようなもんだ
英語を学んでから日本語を学ぶのはマズい事らしい
>>590 アンカーつけることを知らないのか、
自分の発言に自信がないのか
わからんが、
基礎の話なのに
日本語もしゃべれずにあちこち手を広げたところで身につかねぇよm9(^Д^)プギャー!!
>>589 お前は「英語を勉強するより前に、まずラテン語の基礎を学べ」と言われてそれを学ぶのか?
プログラミング言語はその環境に生まれれば自然に身に着く語学とは違うだろ、同じ言語でも。
すぐに比喩使う奴ってオライリー読み過ぎじゃないの?
これって行末にセミコロンいらないんだね。
んで、変数は何なの? データのいれものなの? オブジェクトのいれものなの?
「最終回」って文字列を取得して、 文字が何文字あるのか、 カウントするプログラムはどう書くの?
def hoge return 3 end
>>592 m(__)m ゴメン日本人に話しかけて他と思い込んでいたよ。
>>596 変数の話なんて別にしてないじゃん
何かデータというもやもやしたものが形になったのがオブジェクトだろ
データが入れ物に入ったと言っても、まあ別にそう間違いでもない
ちなみにRubyの変数はラベルというメタファが一番近い
オブジェクト自体はRubyが管理してるオブジェクト置き場から一歩も動かない
ラベルをオブジェクトにぺたぺた貼ってそのラベルの名前で呼ぶ
ラベルが1枚も貼られてないオブジェクトは誰も使わないゴミとしてメモリから定期的に取り除かれる
なるほどなるほど
Windows版のRubyのirbを立ち上げておくと、 CPU占有率が偉く高くなる問題って報告されて無いでしょうか? いつまでたっても直らないので気になってます。 うちの環境でcsrss.exeとruby.exeで計18%くらい、ワンコア計算で72%くらい消費します。 プロンプト待機で、何もしていなくてもです! 環境:Windows Vista SP2(32bit) >ruby --version ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]
604 :
603 :2009/06/13(土) 07:39:55
>>603 マシンスペック書き忘れたorz
環境追記
CPU: Core2Quad Q6600 2.2GHz
Memory: 2GB
>>601 猫がいろんな軒先でえさをもらう時に
それぞれの家で
「タマ」とか
「ショコラ」とか
「プリン」とか
それぞれ別名で呼ばれるのと一緒か
猫は猫なのに
そして誰からもエサをもらえなくなった猫は死んでしまうのですね シュールだ
rubygems の各パッケージの ri と rdoc のドキュメントのインストール処理がとっても遅いんですが、 これは一応既知の仕様でいいですか?
その場で作ってるから遅い
見る予定がないなら gem: --no-ri --no-rdoc と ~/.gemrc に書いておく。
代入についての質問です。初歩的な質問だとは思いますが、宜しくお願いします。 例えば str = "abc" str2 = str str2.chop! とするとstrとstr2は同じオブジェクトを指しているので strも"ab"となるのは理解できました。ですが、 str = "abc" str2 = str + "d" str2.chop! str2.chop! としても、strは"abc"のままです。 ということはstr2 = str + "d"というのは、新しく"abcd"というオブジェクトが 作られて、それをstr2が指したということになるのでしょうか?
>>607 ドキュメントを事前に生成してから配布ってやるとやたら容量でかくなるんだよね
サーバ資源の温存に協力してると思ってください
>>610 yes
同様にString#chopなら新しくオブジェクトが作られるし
String#+の代わりにStrng#<<を使えば破壊的(オブジェクト書換)になる
str2 = str
str << "d" # str2 == "abcd"
str3 = str2.chop
# str2 = str << "d"
ちなみに代入と破壊的メソッドを同時に使うのは
返値の関係でできないことがあるから、避けておいた方が無難
612 :
デフォルトの名無しさん :2009/06/13(土) 15:02:00
object_id(または__id__)で確かめてみたら?
614 :
デフォルトの名無しさん :2009/06/13(土) 15:07:47
つ 『耳を澄ませば』
生まれて初めてriを使ったので記念カキコ >C:\Documents and Settings\hoge>ri String#+ > --------------------------------------------------------------- String#+ > str + other_str => new_str > ------------------------------------------------------------------------ > Concatenation---Returns a new +String+ containing _other_str_ > concatenated to _str_. > > "Hello from " + self.to_s #=> "Hello from main"
だれからも構われなくなった猫は保健所が連れていくんだろう そして保健所の仕事が悪いと野良猫が溜まって不衛生に・・・
ガーベジコレクション発動?
>>607 つまりは、rdoc や ri は
「実際の規模のライブラリのマニュアルを生成させると、気になるくらいに処理が遅い」
ということだ
速くなる予定は今のところ特にないので、新しいマシン買うか寝てる間にインストール済ませろ
>>610 ありがとうございます。よくわかりました。
620 :
デフォルトの名無しさん :2009/06/14(日) 00:04:28
Rubyのキーコード認識法が分かりません。 目標としては、(勝手な記述ですが) puts "キーコードは #{ruby_key}" とか書いて Bキーが押される → キーコードは 66 1キーが押される → キーコードは 97 Ctrl+F → キーコードは 17と70 という感じで表示したく思います。 環境は、WinXPのRuby1.8.6です。
621 :
620 :2009/06/14(日) 01:01:31
(補足) Rubyの動作をアプリケーションのショートカットキー操作のように制御したく 思っています。 そのために、キーコードの把握をしたいです。 動作制御の例としては、Ctrl+Shift+T → 指定した外部txtの読み込み
>>620 最初に間違いを指摘しておくと文字コードはキーコードではない
文字 B の値が 66(0x42) の場合は文字コード(アスキーコード)
押されたキーを判別する方法はプログラムの動作環境によって異なる
文字端末ならgetc,gets,curses、GUIライブラリなら個別に専用のメソッドを使う事になる
# 通常は文字コードで取得出来る、キーコードを取得出来る場合もある
だから、どんな環境でどのライブラリを使ってプログラムを作りたいのか
を教えてもらわないと答えられない
ちなみに文字の文字コードはこうすればわかる
s = "Bye"
puts s[0] #=> 66
623 :
デフォルトの名無しさん :2009/06/14(日) 06:28:57
(コーディング以前の問題なのですが)別の言語でオリジナルのRubyエディタを 作ったのですが、これでrbファイルを生成しても(それが正しく動作するものであっ ても)DOSプロンプトでEnterを押すと何も起こらず(無視されて)、次のコマンド 入力の『>』が出ます。 ※ 普段はWinXP-ProのWordPadを使用 この「スルーされた」rbファイルもWordPadで再度保存すると正常に動作します。 しかしオリジナルのRubyエディタではUTF-8とShift-JISの両方でrbファイルを生成 していますが、両方共スルーされます。 考えられる原因は何でしょうか? 必要であれば、オリジナルのRubyエディタで生成させたrbファイルをUpできます。 (普通にRubyのアイコンになりますが・・・)
うpした方がいいんじゃないだろうか 状況は分かってもそのファイルがどうなってるのか分からないから
C:> ruby origedit.rb としても何も出ない C:> ruby wpedit.rb と実行すれば期待通りに実行するってこと? 文字コードや改行コードを確認してみちゃどうかな
626 :
623 :2009/06/14(日) 13:51:35
>>624-625 レス有難うございます。
http://uproda11.2ch-library.com/182353GSO/11182353.zip でUpしました。
構成は、2個のRubyファイル(hello.rb,OSC04b.rb)とUpローダー下限サイズ
調整用のJPG1枚です。
hello.rbは単純に puts "Hello, World" だけで、OSC04b.rbは周期的にランダムな
値が画面で表示されるものです。共にこのままでは前述の通りスルーされますが、
WordPadで同名で同じ場所に保存(つまり上書き)すると正常に動作します。
当方の開発環境は、WinXP-Pro(SP2),メモリ3.24GB,実行ソフトは書籍「初めての
Rubyプログラミング」秀和システム(著:山本 団)に付録していたActiveRubyを
使っています。
(実際の実行操作はDOS上です)
vim で見ると # hello.rb^Mputs "Hello, World"^M となっている。 改行コードが ^M だな。 全部先頭のコメント行として扱われているのでは?
>>626 >>627 の言う^M ってのは、文字コードで言うと 0x0D(CR)だねえ
これを標準の改行コードと見なすのはMacだけでは
0x0A もしくは 0x0D 0x0A で保存できるように、その自作エディタとやらを
修正するのがいいとおも
>aragaki4.jpg 何ぞこれ
630 :
デフォルトの名無しさん :2009/06/14(日) 14:39:05
おまけだろ。 しかし正直に言うとだな、、おっと誰か来たようだ。
問題は無事解決したようだが、aragaki4.jpgだけは保存させてもらった。
>>628 OS9までな。
OSXはUNIX改行コード。
634 :
デフォルトの名無しさん :2009/06/15(月) 14:08:08
>>622 レス有難うございます。
プログラムの目的はSocket通信で、ライブラリはsocketとthreadを使っており、
実行は通常のDOSでやっています。
とりあえず文字コードを先に把握しようと思い、下のkeyIn_02.rbを書きました。
# keyIn_02.rb
chars = "abcdefghijklmnopqrstuvwxyz 0123456789"
#
i = 0
for i in chars
puts "#{chars[i]}\n"
i+=1
end
しかし、自己代入のところで
keyIn_02.rb:7:in `+': can't convert Fixnum into String (TypeError)
と出ます。どうすべきでしょうか?
>>634 DOSってmsdjppか?
> i = 0
> for i in chars
> i+=1
iが被ってる
>>634 Ruby では for 構造をまず使わない
どのくらい使わないかというと、それのどこが間違ってるかマニュアルを確かめないと指摘できないくらい使わない
str = "abcdefghijklmnopqrstuvwxyz 0123456789"
0.upto(str.size) do |i|
puts str[i]
end
for i in chars で、i には chars から 1 文字ぶん切り出した文字列が入ってるから。 てか ruby らしいスクリプトという観点からは、for はあまり使わない。
>>634 ループの部分を下に置き換えて実行してみ
for i in chars
puts i
exit
end
>>634 >>621 に書いてある「Ctrl+Shift+T → 指定した外部txtの読み込み」と
Socket通信の繋がりがいまいちわかんない
デスクトップアプリとかユーティリティとか作りたいんじゃないの?
>>636 てか、 for ってわかりにくいよな
あれを使いこなせる人は素直に尊敬する
BASICからきた俺はつい「for」からプログラムを書き始めてしまう。
>>634 1.8.7以降ならeach_char使うのがベストかと
エラーメッセージから7行目のiがStringになってると把握できるからそこから解決策を導けるようになって欲しい。
MOONGIFTは話半分に読んどけ これを頼りに自分から何かするサイトじゃない 他のサイトで紹介解説されてから手を出すのが吉
>>645 その、「他のサイトで紹介解説」しようとしているのが643なんじゃないかな。
で、webhookはHTTPを理解してないとつらいような気がする。
643はHTTPの理解はOK? 理解してたら公式サイトの絵で十分分かると思うよ。
648 :
634 :2009/06/15(月) 21:17:42
>>635-642 レス有難う。
636さんの記述を下記のように改変して上手くいきました。
# KeyIn_03.rb
chars = "abcdefghijklmnopqrstuvwxyz 0123456789"
0.upto(chars.size) do |id| # 1.upto()だと98から始まる
if id < chars.size then
puts chars[id]
end
end
>>639 具合的には(621に書いている通り)キーによるRubyの動作制御です。
今回は [a〜z]:97〜122,[0〜9]:48〜57 は分かったのですが、やはり
CtrlキーやPauseキーのコードが分かりません。DOSプロンプトのバージョンは
Microsoft Windows XP [Version 5.1.2600]
です。
Rubyではキー定数というのはないのでしょうか?
(ググりましたが公式のページには見つかりませんでした)
>>648 リアルタイムキー入力てーと、OSがハードウェアをどう抽象化してるか、
っていうわりと低いレベルのものだから、ネイティブなAPI(ioctlとかWin32APIとか)を使う必要がありそう。
>>648 windows-prにそのへんの定義が・・・キーコードはないのか
gccあたりからwin32apiのヘッダファイルもらってきて確認するのが王道だと思うけど
その程度なら受け取ったキーコードをそのまま吐き出すコード書いて
実際にコンソールでキー入力してみたほうが早い
でもどうやってキー入力を監視してる?
getsじゃキーから文字入力を受け付けることはできても
キー自体を監視してるわけじゃないからpauseとか無理なはず
aが97っていうのもキーコードではなく文字コードだろうし
Ruby/SDLを使うという裏技もある
>>648 どんな言語でも普通は標準入力を扱うから、
それで入力できないものは標準のやりかたでは取得できないんじゃないかな。
例えばCtrlキー単独とか。
DOSプロンプト用のプログラムも標準入出力が基本で、
リアルタイムのキー入力は昔ならBIOSやハード直接、今ならOSのAPIで取得するものかと。
653 :
デフォルトの名無しさん :2009/06/15(月) 21:53:58
Windowsへコールバック関数を登録して、イベント受けとるん?
>>648 こんなものを投下してみる。
require 'Win32API'
getkey = Win32API.new("user32", "GetAsyncKeyState", "I", "I")
loop do
puts "ctrl\n" if getkey.call(0x11) != 0 then
end
Win32APIでgetAsyncKeyStateを呼び出して現在のキー状態をチェックする。
なんとなく!=0ではマズい気がするが。
ってゆーか仮想キーコードってどうやって調べればいいんだろね。
winuser.h参照って言ってもみんなが持ってるわけでもなし。
655 :
654 :2009/06/15(月) 22:10:51
後置法に書き換えたときにthen消し忘れた>< 最後に確認してから書き込めと。
rubyで、正規表現とscanでファイルから特定の情報を抜き出すプログラムを作っているのですが 抜き出した情報 A B Cを 配列に"#{A} #{B} #{C}" といった形で入れる際に、Cが空でも空として代入してしまいます。 変数が空かどうかを調べる条件式はどのようにすればいいでしょうか
変数はコンテナではないので、「空」と言われてもピンときません。
>>657 そういうのは言葉で説明するよりサンプルコード用意したほうがいいよ
たぶんこんな感じじゃないかと思う
m = /(\S)(\S)(\S)?/.match("ab")
a, b, c = m[1], m[2], m[3]
array << "#{a} #{b} #{c}"
このとき正規表現にマッチはしても3番目のキャプチャはないからcはnilになる
そのため配列に加わるのは"a b "になるけど
質問はこれを"a b"にしたいってこと・・・と予想はしてみたけどなんか違う気がする
悪いけど実例交えてもう一度質問をお願い
>>659 たぶん正しい
マッチの取得に scan のブロックと $1 や $2 を使っているのだろう
これだと「増減」に一発対応できなくて非常にめんどくさい
まあ、現実的な解は
・ scanでマッチを行う
・ $1 や scan の返り値などを使って結果を取得、一時的な変数に全部入れる
・ 個々の変数が空かどうかを .empty? などで調べて、配列に入れるためのデータを整形する
・ 配列に入れる
という手順を踏むことだと思う
ブロックを再帰的に呼び出す事は可能ですか。 arr.each do |e| if e.is_a?(Array) e.each(&block) # ここでブロックを再帰的に呼び出したい else puts e end end 実際のコードはちょっと違うんですけど、ブロックを再帰的に呼び出したいというのが目的です。
いったんblock = proc do〜endでProcオブジェクト作ってからarr.each(&block)
Ruby はブロックを内部から認識することができない
[1,2,3].each do |e|
end
というブロックがあったとして、each を認識することも [1,2,3] を認識することもできない
>>663 のようにしたほうがわかりやすいし速い、というのが作者の弁
こうかなあ? f = proc do|e| if e.is_a? Array e.each do |e| f.call e end else puts e end end arr.each do|e| f.call e end
松本教祖がデビアン使いである以上、リナックスが前提だしな。 教祖が信者の環境の世話までする訳が無い。修行して教祖と同じ高みまで上ってこいとか言われるだけ。
667 :
デフォルトの名無しさん :2009/06/16(火) 12:09:40
それって、rubyの方言を作るって事になるな
>>659 > m = /(\S)(\S)(\S)?/.match("ab")
array << m[1..3].compact.join(" ")
>>668 &で書ける?
直感的には&で書けるような気がしたんだけど、
それはイテレータ(ブロック引数をとるメソッド)を自分で書く場合であって、
この場合みたいに、イテレータに渡すブロックの中でどうにかしたい場合は
&じゃどうにもならないと思ったんだけど。
fに代入してそれ使っちゃってるんだから&fでも同じことじゃん f = proc do|e| if e.is_a? Array e.each(&f) else puts e end end arr.each(&f)
あー、渡すときにも&で渡せたんだ。 忘れてた。受ける側しか使いこんでなかったw
さすが初心者スレ
674 :
デフォルトの名無しさん :2009/06/16(火) 13:16:28
いいんだよ
>>669 回答側が提示したてきとーな具体例を最適化して誰が得するのかw
なんか C 入りの gem パッケージのソースがあるとき、トップで rake すると C 部分のコンパイルとかが終わるよね rake の途中で Makefile が作られてるんだけど、その Makefile を編集した上でコンパイルしたいです ruby extconf.rb で Makefile を作ることはできたんだけど、これを組み込んで rake する方法がわかりません rake tmp/中略/Makefile で tmp ディレクトリで使う Makefile だけを作ることもできたんだけど、 これから「再開」させる方法がわかりません Makefile は extconf.rb を反映してるということがわかったんだけど、ま
ん
じゅうこわい
ちょいと質問があります。
既存のPDFを弄れるRubyのライブラリはありませんでしょうか?
JavaのiTextみたいなのです。
1から生成するタイプのPDFライブラリだと、↓Prawnのようにいろいろ見つかるのですが…。
http://prawn.majesticseacreature.com/ 既存のPDFを読み込んで要素を追加するようなものと、となるとなかなか見つかりません。
既存のものに外部ツールで上にのっけるみたいなのでもいいので、何かRubyでできる方法があればなーと思います。
681 :
デフォルトの名無しさん :2009/06/17(水) 16:53:07
Ruby1.8.6でdRubyの勉強を始めました。 本に記載してあったサンプルを試したところ、データの送受信は成功しましたが、 分からない点が2つ出ましたので質問させて頂きます。 ※コードは全文記載すると著作権上問題がありますので、若干改変しています。 # サーバー側 require 'drb' obj = ["drb", "server"] DRb.start_service("druby://localhost:54321", obj) DRb.thread.join # (本より)必ずスレッドが終わるのを待つこと! # クライアント側 require 'drb' DRb.start_service obj = DRbObject.new_with_uri("druby://localhost:54321") obj.each{|i| p i } Q1) 「必ずスレッドが終わるのを待つこと!」とは、具体的にどういう作業が 要求されるのでしょうか? Q2) クライアントに "drb" "server" と出た後もサーバーは稼動状態になっています。 サーバーの処理を終了するにはどうしたら良いでしょうか?
>>681 A1
そのまんまThread#join
メインスレッド(普段意識せずに処理を行なわせてる部分)が処理を全て終えると
子スレッドがどんな状況だろうとruby全体を終了させるから
子スレッドの終了を待つにはメインスレッドを待機させる必要がある
そしてThread#joinはその子スレッドが終わる(合流する)まで待機するメソッド
A2
Signal.trap(:INT) { DRb.stop_service }
と書いておいてInterrupt起こせばよかったと思う
やってから書け
rubyは遅いという話を聞いたので、素数を求めるの書いてみた 偶数は省く、元となる値の1/2まで総当りで割り切れるか という条件の下でやってみたら、2..10000で10秒… エラトステネス使えば全然早いんだろうけど
>>685 おなじことをpythonやjava、perlでやったらどうなの?
>>685 結果だけでなくソースも晒してくれると参考になる。
実行環境およびRubyのバージョンもあるといいな。
とりえあず、自分でやってみるやつはいないんだなw
まあこんな感じか N = 1000000 prime_cand = Array.new(N + 1) 2.upto(Math.sqrt(N)) do |i| unless prime_cand[i] (i * 2).step(N, i) {|k| prime_cand[k] = 1 } end end (2 .. N).each {|i| puts "#{i}" unless prime_cand[i] }
#include <stdio.h> #include <math.h> #define N (1000000) int main() { int prime_cand[N + 1] = {0}; prime_cand[1] = 1; //1は素数でない for (int i = 2; i < sqrt(N); i++) if (0 == prime_cand[i]) for (int k = i * 2; k <= N; k += i) prime_cand[k] = 1; for (int i = 1; i < N + 1; i++) if (0 == prime_cand[i]) printf("%d\n", i); return 0; }
public class Eratos { public static void main(String[] args) { final int n = 1000000; final boolean prime_candidate[] = new boolean[n + 1]; prime_candidate[1] = true; //1は素数でない for (int i = 2; i < Math.sqrt(n); i++) if (!prime_candidate[i]) for (int k = i * 2; k <= n; k += i) prime_candidate[k] = true; for (int i = 1; i < prime_candidate.length; i++) if (!prime_candidate[i]) System.out.println(i); } }
>>689 2chなめんなよ、クズm9(^Д^)プギャー!!
後は、計測結果だけか。
>>685 の言ってる通りでやってみた
割と可読性無視な方法
2が素数とみなされないのは仕様
N=10000 >> 1
result = Array.new
i=nil; i2=nil; j=nil
1.upto N do |i|
i2 = i << 1 | 1
result << i2 if 2.upto(i){|j| break nil if i2 % j == 0}
end
puts result
>>695 >N=10000 >> 1
と
>i2 = i << 1 | 1
ってどういう意味?
697 :
681 :2009/06/18(木) 04:57:57
>>682 さんのA2をやってみましたが、変化はありませんでした。
また、trap(:INT) → trap(:EXIT) も試しましたが駄目でした。
どうすべきでしょうか?
>>680 え、いや、もちろん検索はしたのですが、
1から生成するライブラリばかりで、既存のものを読み込んで追記できるライブラリが見つからないのです・・・
>>698 既存のPDFを読み込んで追記するには、既存のPDFをパースできるライブラリが必要。
たぶんそういうのがまだないんじゃないかな。しらんけど。
>>698 ruby-listとかのメーリングリスト生きてるからそこで聞いてみたら?
検索ですぐ引っかかるHaruってのはどうなのよ フォントのサブセット埋め込みにも対応してるっぽくてよさげに見えるが
こんな糞アルゴリズム検証して、なんか人類の進歩の役立つの?
立つよ 人のやることを糞呼ばわりして何もしないよりはね
>>702 立たないよ。結果だけが曲解されながら独り歩きして風評が広まるので、むしろ害悪。
曲解されたなら、正せばいい。 風評が広まるのは、正しい情報を知っている人が正しい情報を広める努力をろくにしていないから。
>>705 悪貨は良貨を駆逐する。
はっきり言って10倍努力しないと、まともな情報を広めることなんてできない。
そんなことするぐらいならコード書きますわ。
ケンカすんなw
単純なループでもrubyは遅いだろ。 アルゴリズムがどーたらいわれてもな、全て同じアルゴリズムで書けばいいだけだ。 つーか、rubyに最適化されたアルゴリズムがあるなら、それを教えてほしいくらいだな rubyの場合、こうかけば早い!ってな
>>706 する前から言い訳ばかりだな。
まずはしてから言おうぜ。
>>702 君は相当優秀か、相当馬鹿なのかどちらかだろうな
人類の進歩に役立つの?に吹いた。
マジレスすんなよw
どっちかというと
>>706 みたいな自分では何もしないのに人の邪魔するやつこそが悪貨。
黙ってコード書いとき。
Ruby ユーザは PHP 並みにひどいですね
>>697 手元の1.8.6 mswin32で試してみたらInterrupt自体が押した時には起きないね
たしかsocketの仕様がそんなだったかも
次にアクセスしたとき(socketのブロックが終わった時)に遅れて発生する
おまじないみたいな話だけど、これを足すと反応するようになった
Thread.start{ loop{ sleep 5 } }
>>713 今頃になってから言うのもなんだけどsignalにこだわる必要なくない?
DRb.thread.join の替わりに gets 書いとけばいいと思うんだけど
目からウ○コ
目からウタコ・京
目からウンベルト・エーコ
rubyでmanみたいなマニュアルを探したところ、riとrefeが見つかりました。 この2つのコマンドを、それぞれ引数にクラス名やメソッド名を取って使っているのですが、他に使い方はありますか?
>>713-716 WinXP-Pro(SP2)です。
Rubyは1.8.6です。
timeoutは使えませんね。
Jrubyってrubyとjava同時に使えるの? だったらruby勉強しておけば Jrubyは特に勉強することってない?
>>721 ・Javaアプリのデプロイの方法
他詳しい人頼む
詳しくはないけど、JavaのAPIを知らなければJRubyの価値は8割減だと思う
エラトステネスを使って書いてみた prime_arr = Array.new max = 10000 2.upto max do |x| if(prime_arr[x] == nil) 2.upto max do |y| if(y*x) < max prime_arr[x*y} = 1 end end end end これで、一千万なら65sec 10億までやったらメモリ4G食い尽くした上に スワップを数G単位で消費して未だにおわん…
あっ書き写すときに最後のネストにbreak忘れた if (y*x) < max prime_arr[x*y] else break end ね
「Cでしこしこ慎重に作った外部モジュール」の代わりに既存のJavaの全てが使えるRubyがJRuby Java使えない人は素直にCRubyやっとれ
外部モジュール書くときに、JavaとかScala使えるってことかな? 結構面白そうではあるが
JRubyはcallccが使えない。
String.new("こんにちは") これで、なんも出ないんだけど、なんで? エラーも出ない。
な め て る の か
>>729 irbは入力された式を評価した値を表示するけど、
rubyはprintとかで表示しなければ、実行するだけだから。
a = String.new("こんにちは") puts a; これで出た。
if文って、thenはいらないの?
1行にまとめて書く時には必要
改行 or セミコロン or then
javaのAPIをrubyからごにょごにょするためのものだしな。 英語もラテン語も知らないと、英語でラテン語について記述するのは無理じゃないか?ってノリ。 rubyとjavaの基本を抑えてから、マニアックな地雷原を歩き始めるべき。
あともうひとつのメリット(?)は、 Java VM と JRuby インストールしておけば、MRI などの Ruby の実装をインストールしなくても、 Ruby プログラムが動かせるということだね。 メリットと言えるかどうかわからないけど。
Eric4はRuby1.9に対応していますか? LinuxにRuby1.8と1.9をインストールしてるのですが、 Eric4で1.9を使うとエラーが出てスクリプトが実行できません。
RDEで、 ([" などの括弧を青から違う色に変える設定場所を教えてください。
Rubyはクラスベースの言語ですか?それともプロトタイプベースでしょうか?
クラスベースだがプロトタイプベースでやろうと思えばそれっぽくもできる。
>>741 ありがとうございます。
ネットで調べると、クラスベースと言ってる人とプロトタイプベースと言ってる人がいてモヤモヤしてたのですが
なるほどそういうことでしたか。
これで変数エラーがでるのが理解できない for i in 1..10 p i end p i
出なかった。 ruby 1.8.7 (2009-06-08 patchlevel 173) [i686-darwin9.7.0] ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-darwin9.7.0]
あっ、家かえって来てやったら出ないな。 debina lenny ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux] 会社のCentOSでやったら出たんだが…versionみてないや
>>728 具体的にはどんな不都合があるんでしょ。でも、ブロックは使えるよね。
>>740 どっちもできる、だろうけど、基本クラスベースを思って置けばよいかと思うけど
Hashをpとかppするときに、順序考慮してくれないのがイヤんなのですが、 eachするときに、自動でキーでソートされてるHashライブラリか、モンキパッチみたいなのはないでしょうか?
Windosのコマンドプロンプトすごいつかいずらいんだけど。 みんなはコマンドプロンプトから入力するときって何使ってる?
750 :
デフォルトの名無しさん :2009/06/20(土) 17:50:04
ハッシュに順序?
それは代入の手法をちゃんと把握してないからじゃないのか?
752 :
デフォルトの名無しさん :2009/06/20(土) 17:51:04
>>749 そう思ったら、Unixのプラットフォームでやれと言われるお^^
順序が<=>での比較結果という意味なら知らないけど、 挿入した順を保存という意味なら1.9を使うか、あとは ActiveSupportなどあちこちにあるOrderedHashが使える。
>>748 てきとーにデバッグプリントしたときにキー探すのがめんどくさいんだよなw
p h.sort
配列化されるのには目をつむってほしい
each云々は、Hashはそういう使い方するものじゃないからパス
ってなんかエラーでるな
NoMethodError: undefined method `<=>' for :c:Symbol
・・・Symbol#<=>は1.9からなのか、ぜんぜん気づかなかった
require 'pp' pp h したら、キーでソートされないか? それより最近Vimを使うようになったんですけど VimでRubyのコメントを入力するにはどうしたらいいですか 0 i # ESC j 0 i # ESC j ... とかめんどくさい
756 :
748 :2009/06/20(土) 18:33:43
サンクスー
>>753 なにそれ1.9だと、順序保存なんだ!
> ActiveSupportなどあちこちにあるOrderedHashが使える。
ま た R a i l s かwww
ActiveSupportなんでもあるなww
>>754 h.sortだと配列になるんですね…。配列になってもいいときはそれでもよいですね。
>>755 pp hash だとソートされない感じ…。
とりあえず、OrderedHash使ってみよ…
と思ったけど、HashからOrderedHashへ変換できねえよヽ(`Д´)ノ ウワァァン!!
ActiveSupportのソースみたけど、変換ルーチンねえよ!
挿入順序の情報を持たないものから持つものへの単純変換とかできないだろw hash.sort.each {|v| ohash[v[0]] = v[1] } OrderedHash知らないけどソートそのままでぶち込むならこんな感じでいいんじゃない?
758 :
748 :2009/06/20(土) 18:43:05
>>757 まあ、確かに単純変換はできんか・・・。
しこしこ変換してみます。
というか、初期化したいだけなので、地道に
hash["hage"] = "unko"
で入れていけば問題はないみたいです。
759 :
748 :2009/06/20(土) 18:44:18
OrderedHash、ppで出力したら中身がArrayで泣いた orz 結局、sortとかしたのと、変わらないか…。 とりあえず、ありがとうございました。
>>756 >pp hash だとソートされない感じ…。
すまん勘違いだった
>>755 commentout.vim でググるといいことがあるかも知れない
762 :
761 :2009/06/20(土) 21:25:41
と思ったら新規にコメントを挿入する話だった orz
>>755 I # ESC j
でいいだろうに、後ESCの場所はホームポジションの
すぐそばに変更な。
vimはコマンドと移動方法とか色々組み合わせて、
ソースも操りやすいように書いて、脳汁出すためのも
のだ。
>>749 NYACUSとかckwtとかMinGW+Msysとか
765 :
764 :2009/06/20(土) 22:28:03
訂正、ckwtではなくckwでした
Rubyには文字型は無いのですか? Javaであれば、'a'のようにシングルクォーテーションで括ると文字型になりますが、Rubyだと文字列になってしまいます。
無い。「文字は長さ1の文字列である」と解釈する
768 :
766 :2009/06/20(土) 23:28:04
>>767 なるほどjavascriptとかと同じですね。
ありがとうございます。
1.9だと、文字という意図を示したい場合のリテラルは ?あ のように書く。 値はつまるところ長さ1のStringインスタンス(="あ")だが。 1.8では、この表記はそのとき使っている文字コードでの整数値になる。
例がまずかった。1.8だと ?マルチバイト1文字 は書けないね。
所詮スクリプト言語
文字列と文字を使い分けたい時ってどんなとき?
>>755 スレチだけど、The NERD Commenterがすっげー便利でずっと使ってる。
Sinatraのソース見てて気がついたんだけど def foo(opt1 = {}, opt2 = {}) end foo(:a => 10, :b => 20) こう書くと、opt2じゃなくてopt1にオプションが入るんだな 今まで末尾のHash引数に入るものだとばかり思ってた どういう仕組みになってるんだろう
こうなるよう期待したのに opt1[0] =10 opt2[0] =20 このように動作してるって事だろ? opt1[0] =10 opt1[1] =20 opt2[0] =nil
開発陣もよい仕様だと思わなかったのか、trunkではopt2に入るな 「どういう仕組み」って不満ではなく文字通りの意味ならeval.cとparse.y読んだらよくね
ごめん大嘘 1.9でもopt1に入る
あくまで糖衣構文であって、評価器にとっては foo({:a => 10, :b => 20}) となると、もっともな挙動かとも思う
一般論として、Rubyでは def mes(keywordhash1, keywordhash2) という定義のメソッドはよくない いわゆるキーワードハッシュは、多少無理してネストさせてでも1つにまとめるべき
Railsは、そんなメソッドがてんこもりだけどね。
>>780 ってことは、もし Ruby のバージョンが変わり、
>>776 のように opt2 に入るようになったら、
それまでの Rails は急に動かなくなるってこと?
>>774 は
foo(:a => 10, :b => 20, :c=30)
と書いたときにはどういう風に引数を解釈して欲しいんだろう
>>782 typo
foo(:a => 10, :b => 20, :c=>30) ね
784 :
774 :2009/06/21(日) 19:17:42
俺が想定してたのはこういう動作
foo({}, {:a => 10, :b => 20})
ただまぁ、
>>778 を見ると納得はできる
>>784 俺はそう思ってて、ちょっとビックリしてた。
定義側の最後のハッシュになるんじゃなくて、
呼び出し側の最後の引数がハッシュにまとまるんだなーと。
初心者スレなのにレベル高い
どこがレベルが高いんだ
ブロックの「ふつう」の返り値ってレシーバ? ブロックの最終の値? tick.tack.toe というメソッドチェーン可能なメソッドがあったとして tick{|e| e.tack.toe } tick{|e| e.tack }.toe tick{|e| e.foo }.tack.toe どれが tick.tack.toe と同じ値になってることが期待されるように見える?
>>789 「どれもアリ」だ
そのへんは tick のマニュアル読むしかあんめえ
each と map の動作の違いみたいなもんだからな
ただ、tick.tack.toe のようにメソッドチェーンが繋がることがごく当たり前の当然な規定事項である場合、
一番目と二番目をサポートし、一番最後の「ブロックの中の返り値は捨てる」という動作はサポートせずに
tick{|e|
e.foo
e
}.tack.toe
とユーザーに明示的に書かせるべきだと思う
つまり inject 状態
rubyのガーベッジコレクッションはJavaやjavascriptみたいに参照されなくなったオブジェクトを自動で廃棄してくれると考えていいのですか?
なんか中国産のパチモノみたいな名前だなw Rubyも同じ、というかそれ以外のGCを俺は知らない
要は、何を以って参照されなくなったと看做すか、の違いだからな。 それを元にやることはいっしょだ。 とりあえず、リファレンスカウント方式ではない、とだけ。
>>791 自動的に回収されるけど、運が悪いと回収されないことがある。
興味があれば「保守的ガーベージコレクション」でぐぐってみよう。
そういう微細なことを指摘する理由はなんだろうと最近思う
ガーベッジコレクッション
微細なことを質問してるんじゃないかと解したんだろう。 わざわざRubyの、とか断るからには。
そもそもの "Javaやjavascriptみたいに" という表現がなんかアレだ
あれ?レスが消えた?
each を使わず map とかで ruby らしく実装した コードを集めたサイトはないですか?
気取らずに普段からふつーに map 使えばいいじゃん? arr.each do |str| puts "<#{str}>" end と書かずに puts arr.map{|str| "<#{str}>"} と書くだけでえすぷりの香りがほら
>>801 ありがとうございます。
巨大な配列だとメモリを使わない方法とか、
なんかそういうのも知りたくて。
map は写像だから配列は常に2倍2倍だ 写像後のメモリを気にしなければならないのなら map は「使ってはいけない」し 配列として存在するときのメモリがそもそも気になるなら 加工済み配列を作らずに初期データででっかい each を回せ
もしかしてmap!と言いたかったんじゃないかと推察する
map に困るくらいでけぇ配列を map! したら置き換えコストだけでおなかおっぱおだと思う 素直に each で1個ずつ使い捨てしたほうがまだマシかと
mapってなんだ??? マッピングとなんか関係ある?
写像のこと。 bump mappingなんかのmappingのことなら同じ意味。
map するということとは関係あるが、地図を作るという意味のマッピングとは特に関係しない (現実と一対一で対応する紙の上の点という意味では合ってるが省略) っていうか写像っていう言葉が出てるんだしそっちから調べてくれ 大量のA → <AからBへの変換装置> → 同数のB この説明は間違ってるが、おーむねこれが写像だ 数学の関数も写像の概念が通る f = 2x+1 という関数を表す Ruby コードは arr.map{|x| x*2+1} とかいう高尚なものは一切忘れて「配列Aを配列Bにする機能」だと思ってくれてオケェ
スタンドアロンでHTAでRubyを走らせる方法があったら教えてください ActiveRubyなら可能ですが動作にはActiveRubyのインストールが必須で 作ったものを配布する用途にはあまり向きません JSRubyならそのままは知らせることが可能ですが付属ライブラリがしょぼすぎます・・・orz
812じゃないが HTML Application。HTML + ActiveScript
多分単純に.htaファイルを他のものなしで動くようにしたいんだろう。 ムチャな話だけど。
arr.map{|x| x*2+1} だけ見ると、lambda式みたいだな
>>812 試してないが、スクリプト側を子プロセスとして走らせるのはどうだろうか
Vbsでできるのか知らんけどCreateProcess + CreatePipeとか
ファイルでやり取りする程度ならShellExecute("cmd.exe /C 〜")とか
>>817 irb> f = lambda{|x| x*2+1}
irb> p [1, 2, 3].map(&f)
[3, 5, 7]
irb> f = lambda{|x| x+"様"} irb> p [山田,スズキ, 田中].map(&f) [山田様,スズキ様, 田中様]
mapはRubyらしいというよりはPerlらしいにおいがほのかに。 map{..}.grep{...}とかやるともう。
あれは map という名前の由来がいちおう Lisp なので云々 map は Perl5 からだよね Ruby より早いのか
Perl ははやく Ruby みたいな見やすくてわかりやすいイテレータを導入して欲しい 書いててどこがコレクションでどこか変換関数でどこが変換用変数なのかよくわからん
ならRubyでいいじゃん
ていうかRubyは 「ブロック処理とイテレーションが文法レベルでサポートされててかっちょええ」 というただ1点だけでここまで生き延びたんで、そう簡単に真似っこされても困る 次の質問の方どうぞ
「普通にオブジェクトを返すが、条件次第で nil を返す」という hoge というメソッドがあって、 hoge の返り値が真かどうかを調べる hoge? というメソッドを作ったときに def hoge? ! hoge.nil? end というのがびみょーになんかアレなんだけど、こー、もうちょっとイイ感じに書けないもんすかね nil かどうか調べて、その真偽を反転するというのがなんかちょっと
>>812 RubyからWin32OLEでIE呼んでもHTAと似たようなことはできなかったっけ?
HTAってハイパースレッドアーキテクチャーとかかと思った
def hoge? hoge ? true : false end hoge が false を返しても偽になるけど。
俺ならこれかな
def hoge?
not hoge.nil?
end
! はあんまり好きじゃないってだけだけど・・・って見た目の話じゃないのか
hogeの返値がたとえばStringかnilだっていうなら
hoge.class == String
とか
>>829 hoge.nil? ? false : true
・・・うーんw
(A)何かしらのオブジェクト、あるいは、(B)存在しないという意味でnil
を返すってときに、true とか false とかを (A) に含めて欲しくない。
なので見やすさから
>>829 を支持する。
それかいっそ alias hoge? hoge でもいいじゃん。
> それかいっそ alias hoge? hoge でもいいじゃん。 え・・・
def hoge? hoge end という意味でしょ ふつうhoge?といえば@hogeに対して行うからaliasが使えないけど >true とか false とかを (A) に含めて欲しくない それはhogeがtrueを返すなら含めるしかないわけで、外野にはなんとも でも言われてみれば?付きメソッドの返値がboolである必要はないんだよな もはやhoge?の存在意義が怪しいw もしhogeがfalseとnilを区別するなら考えなきゃならんけど そうなると今度はnil?を避けられなくなる
? つきのメソッドは true か false のどちらかを返すべきだろう = つきのメソッドが内部変数代入を伴うと期待されるのと同じように、 [] というメソッドがキーつきフェッチを行うことが期待されるのと同じように
ふつーは、 hoge の返り値が nil か false 、または hoge の存在探知の結果が偽である → hoge? は false hoge の返り値が nil でも false でもなく、 hoge の存在検知の結果も真である → hoge? は true だろ たとえば hoge の返り値が配列だったとして、 空の [] が返ってきたとき、 「[] は nil でも false でもないから hoge? は true を返すべき」とはならんだろ 通常は配列に詰まって返ってくるべきところ、配列が空になる事態が起こればそれは 偽 でいいじゃん?
>>834 >? つきのメソッドは true か false のどちらかを返すべきだろう
? つきのメソッドは 真 か 偽 のどちらかを返すべきだろう
だったら賛成できる。
>>836 だからRubyのオブジェクトは偽でなければすべて真であって、どっちかの状態しかねえんだよ
それと全く同じ状態を返すメソッドなんて hoge? として存在させる意義ねえだろ
そういうのは素直に hoge とその運用に任せるべき
if hoge then puts 'hogeあるよー' end みたいな
>>834 昔はそう思ってたんだんだけどね
でも演算子defined?の時点で真ならString、偽ならnilを返す仕様と知ってどうでもよくなった
>>837 その理屈はaliasの存在理由すら否定されるw
true が true 以外に全くマッチしやがらねえというのが問題の根っこな気がする "33" == true "33" === true このへんが真を返すなら puts '真だ' if hoge === true とか書けるのに
>>840 何を言っているのか分からない
どの辺にマッチしてどの辺にマッチしなければ理想なんだ
>>840 そんなPHPみたいな言語になったら躊躇なくRubyを捨てる
質問なんですけど、RSpec で複数の before() に似たような処理があるときって、
なにかまとめる方法はありますか。
今はアドホックに def xxx() を定義して複数のbefore() から呼び出しているんですが
これでいいのか疑問が湧いてきたので。
RSpec の流儀みたいなのがあれば教えてください
rubyからchasenを使いたいんですが、ruby-chasenがダウンロードできなくて困っています。 どなたか持ってたらいただけないでしょうか?
trueは真を意味する代表的な値であるだけで、普段は使う機会少ないよな。
え・・・
849 :
デフォルトの名無しさん :2009/06/24(水) 18:54:35
モーツァルト効果(笑)とかばっかじゃねーの? 精神病院に行った方がいいよpwwww
850 :
デフォルトの名無しさん :2009/06/24(水) 18:55:38
誤爆
それは統計的な結果なのか? それとも医師や助産婦の経験的な記憶によるものなのか? おれはいつが満月かなんて全く意識してないから分からないのだが、 医師や助産婦はそれを意識してるということだろうか。
windows上で、指定された画像ファイル(とりあえずjpeg,bmp)の色深度と画素数だけ調べたいと思っています。 何か追加ライブラリがないと出来ないと思うのですが、 最終的にはexerbで実行ファイルを配布可能な形にしたいので、ImageMagickは使いづらいと思っています。 image_sizeでは画素数は分かるけど色深度はしらべられないみたいです。 適当なライブラリないでしょうか。
Rubyのクロージャ(Procオブジェクトとブロック)について教えてください。 javascriptの関数もクロージャですが、実装は全く異なるのでしょうか? 同じクロージャでも言語によって全然実装が異なるのか、あるいはだいたい同じ実装の仕方をするものなのかを知りたいのです。 例えばjavascriptの場合、関数が呼ばれるごとにActivationオブジェクトというスコープが作られて、関数定義時のスコープチェインに追加されますが RubyのProc#callでも同じような動作をしますか?
また exerb 厨か
Activationオブジェクトに関してはその通りだと思うけど、それはクロージャに限らずメソッド呼び出しでも同じこと。 (いちおうRubyではメソッド≠クロージャね。) 「クロージャの実装」とわざわざ断り書きをいれるからには、通常は変数スコープの共有方法についての話だと思ってしまった。
いやrubyにactivationなんて無いから
>>855 まったく試してないが適当なことを言うと
Ruby/SDLで色深度の取得とかできないかな。Surfaceとして読み込んでから深度を調べる感じで
>>859 activationレコードのことだろ?
関数呼び出しを行う言語ならどれも内部に持っていると思うけど。
それがRubyスクリプトからは見ることも触ることもできないというだけで。
>>857 まあそう言わず
スクリプト言語に無理なことはそもそもやらせない、という原則を
Rubyにおいて良くも悪くも壊したのが Exerb だしさ
863 :
856 :2009/06/25(木) 14:30:20
>>858 ありがとうございます。
Activationオブジェクトが通常のメソッド呼び出しでも作られるとは知りませんでした。
でもそうなるとクロージャと、クロージャでない関数(またはメソッド)の実装上の違いって何なのでしょうか?
例えば入れ子の関数(クロージャ)があるときに、内側の関数が外側関数のActivationを保持するためにこのスコープを持ち歩く
という理解だったため、Activationがクロージャの機能を実現してると思ってました。
ここら辺はオライリーのJavaScript第5版という本で勉強しました。
言語に拠らないもっと根本的な知識が無いと実装を理解するのは難しいでしょうか?
JavaScriptでは関数=クロージャだけど、Rubyではメソッド≠クロージャ。 クロージャってのは本来変数のスコープに関しての概念だから、関数と切り離して考えた方がいいと思うよ。 Activation Record(駆動レコード)は関数呼び出しのある言語ならどれでも備えているもの。 コンパイラの本を読むとたいてい書いてある。
activation recordは生成されるが、RubyではActivationオブジェクトのような オブジェクトとして見えたりはしない。
867 :
856 :2009/06/25(木) 15:21:20
ありがとうございます。
なるほど…クロージャは関数とは同列では無いわけですね。少しすっきりしました。
考えてみればrubyのクロージャのブロックも単純な処理のまとまりでした。
>>864 さんのリンク詳しいですね。理解が深まりました。
自分なりに考えをまとめてみると、
関数がクロージャになるのは、関数自体の機能とは無関係で、入れ子に関数を定義したときにクロージャが発生するというイメージでしょうか。
つまり、「ある処理のまとまり」をデータとして扱える言語なら確実にクロージャを実現できそうです。
Rubyのメソッドはクラスの中に定義しなければならないためメソッド単位でデータとしてretunすることが出来ないのでクロージャを実現できないと。
このように考えると、Javaの無名クラスでクロージャっぽいことが出来るけど不便だ、という評価もなんとなく分かりました。
ファーストクラスオブジェクト関数とクロージャがごっちゃになってる気もする それらが切り離されてる具体例は知らないけど、概念としては別物
869 :
856 :2009/06/25(木) 17:03:38
また新しい言葉が…やっぱり中身を知ろうとすると難しいですね。 コンパイラの本を探して勉強してみることにします。
Java 7 でクロージャの導入が検討されていたり、 関数型言語が少しブームになってきたことを考えると、 クロージャの概念そのものについて勉強するのも良さそうですね
無名関数があればクロージャ作れると思ってたけど違うの?
クロージャっていうのは、関数をオブジェクトとして扱えるかどうかでしょ? Java の話だけど、無名関数は、あくまでも文法上、関数名をつけずに宣言しているだけで、内部では オブジェクト扱いされていないからちょっと違うのでは
>クロージャっていうのは、関数をオブジェクトとして扱えるかどうかでしょ? ぜんぜん違う。 実行時コンテキストを持っているからクロージャー(Closure)でしょ。
CSVがうまく読み込めない。 ソースは CSV.open("./test.csv", 'w') do |writer| writer << ["ruby", "perl", "python"] writer << ["java", "C", "C++"] end CSV.open("./test.csv", 'r') do |row| puts row puts row end でなぜか実行結果が #<CSV:0xc7c158> #<CSV:0xc7c158> となる。 環境は、 ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mswin32] WindowsXP もしかしてインストールがうまくいってないのかな?
一般的にクロージャ=レキシカルスコープ+ファーストクラスオブジェクト
レキシカルスコープの時点でクロージャと呼べる気もするけど役には立たなさそうw
>>874 puts row.join(", ")
色深度という言葉を聞くとアルシンドを思い出す。
877 :
874 :2009/06/25(木) 17:49:30
>>875 ごめん、それはもうやったんだ。
file.rb:12:in `block in <main>': undefined method `join' for #<CSV:0xec3344> (NoMethodError)
とかいうエラーでる。
書き込みは出来てるんだけど、なぜか読み込めないんだ。
>>877 1.8.7だと
>>874 がちゃんと動くよ(openのブロック引数にArrayが入る)
仕様が変わったか別のライブラリを読み込んじゃってるんじゃない?
puts row.join(", ") だとデータ中に , を含むデータがある場合に困るね。
>>874 require 'csv'
CSV.open("./test.csv", 'wb') do |writer|
writer << ["ruby", "perl", "python"]
writer << ["java", "C", "C++"]
end
CSV.open("./test.csv", 'rb') do |csv|
csv.each do |row|
puts row
end
end
882 :
874 :2009/06/25(木) 18:33:31
>>880 動いた。ありがとう。
CSVライブラリの仕様が1.9.1で変わってるのかな?
>>882 Ruby1.9.1 の csv.rb は fastercsv 寄り
通常の open または IO なんかと同じようにメソッドを使う
CSV.open("./test.csv", 'rb').each do |row|
p row
end
このへんが適解
出力は
["ruby", "perl", "python"]
["java", "C", "C++"]
884 :
855 :2009/06/25(木) 20:35:24
結局ファイルをバイナリで開いて必要な情報を読み取るという力技にしてしまいました。
>>860 ありがとうございました。次の機会に試してみます
>>862 すみません、無理なことさせてますよね……
>>884 それを勧めようとして、その前に自分で試したところで挫折したから黙ってたんだけど
JPEGの色深度のところはどうやった?
クロージャを理解するのは苦労じゃ
実装がめんどい クロージャーを実装するのは苦労じゃ〜
>>885 すべてのJPEGに対応する必要は無く、
JFIF形式の8bitグレースケールの画像か、それ以外かを確認すればよい
という目的だったので、
JFIFであることを確認して、
それ以降をeach_byteでスキャンしてFFC0の並びになるところを探して、
そこから数バイト取得して、って流れでやりました。
cp file1.txt file2.txt ln file1.txt file3.txt としたときに、file1.txt と file3.txt とがハードリンクされたものであることを Rubyで調べようとしたら、どうしたらいいでしょうか。
stat = File.stat(path) stat.nlink #=> ハードリンク数 stat.ino #=> iノード番号
ありがとうございます。
俺と Matz がハードにリンク!
1.up_o 10 |x| p x end p x で、なぜエラーになるのだ
ぐあ、1.uptoですたい
エスパーしてみるけど君がやりたいのはもしかするとこういうことか? 1.upto 10 do |x| p x end
いや、何がいいたいかと言うと ループないで使用された、xが ループ抜けた後で使うとエラー になるという…
x は仮変数だから
アホ過ぎだろ
いや、初心者スレだから・・・。 なんでエラーになるかというと、ブロック内で定義された変数は、 ブロックの外では使えないからです。
でもブロックの外にあった変数とたまたま名前が同じだった場合は ブロックの外にあった変数がブロックの中で最後に使われてた値が残っちゃうけどね! x = "x!" [1,2,3].each{|x| puts "hoo"} p x #=> 3 上記は "x!" じゃなくて 3 だよ! s = "very important string" puts "s is #{s} before block" ['one', 'two', 'three'].each do |count| s = count.upcase puts s end puts "after block, s is #{s}" 適当すぎる変数名をあちこちで使い回す癖のある人は気をつけたほうがいいよ! あと見かけが似てるけど if はブロックつきメソッドじゃないから ブロックの中で定義した新変数はブロックの外に持ち越されるよ! [1,2,3].each{|x| y=x} p y rescue puts "each では y ないです" if true then y = 4 end p y rescue puts "if では y ないです"
ブロック仮変数として1文字の e や x に人気があるんだが、 1 2 3 [1, 2, 3] done! 4 5 6 [4, 5, 6] done! とかいう表示を期待して [[1,2,3], [4,5,6,], [7,8,9]].each do |x| x.each{|x| p x} puts "#{x.inspect} done!" end と素直に書くと非常にがっかりさんモードになる ちなみに Ruby1.9 では期待通りに動作するのでスクリプト頒布には注意 この動作に依存したスクリプト作る人なんて滅多にいないとは思うけどね たいていはこの動作を避けるように仮変数はそもそも別名にしてるはずだから むしろ 1.9 の人が 1.8 用に作ってハマる可能性のほうが高そうだ
変数にはスコープというのがあるから
>>897 >>896 の例ではxはイテレータブロック内のみで参照できる限定されたスコープで、
>>901 の例では、イテレータブロック外であらかじめ参照されているので、
イテレータブロックよりもひとつ外のスコープになる。
マトリョーシカのような入れ子構造を創造するとわかりやすい。
0,1,2〜を与えると、 a,b,c〜を返すお手軽メソッドはありませんでしょうか? 例: (0..10).each {|x| puts get_alphabet(x) } 出力例: a b c d e f g h i j
def get_alphabet(x); (?a + x).chr; end
1.9.1でも動作するように def get_alphabet(n) ; ('a'[0].ord + n).chr ; end
>>905-906 ありがとうございます!
%w(a b c d ....)[i] || i
みたいにやろうとしてたww
Rubyは文字型ないからやりぬくいーと思ってました
似たようなことできるんですね
ちょう手軽でちょうわかりやすい ('a'..'z').to_a[x] p ('a'..'z').to_a[0] "a" p ('a'..'z').to_a[1] "b"
>>906 1.8.6で動かなかった…(´・ω;:..
鯖で動かないハメくらった。Ubuntuめー。
>>908 サンクス
>>905-906 だと30.timesとかみたいに、アルファベット範囲超えた時に変なので、
超えたときも考慮して、こんな感じでやってみます。to_aがまあ富豪的ですが…
def get_alphabet(n) ; ('a'..'z').to_a[n] || n.to_s ; end
911 :
デフォルトの名無しさん :2009/06/27(土) 20:15:00
(n+10).to_s(36)
>>890 File.identical?("file1.txt", "file3.txt")
独習Ruby
ttp://www.amazon.co.jp/dp/4798117854/ 踏み込みが浅いなと思ったらやたら広範囲だったでござるを地で行く本
良くも悪くも「普通」のRubyの本がやっと出たという感じ
「本はやっぱ極力新しいほうが新しい情報も載ってていいんじゃね」
「ネット上で調べればわかるったって本で纏まってるのに意味があんだよこれだから素人は」
「Rubyなんてひとまず使えるのが一番で思想とかこまけぇこたぁいいんだよ!!」
と考える書籍大好きさん向け
プログラミング自体の初学者さんにはお勧め度が正直わりと下がるが、
いちおうまとまってはいるので if then else くらいはなんとかなる程度のRuby初心者さんの補強、
または一通り舐めてみたい他言語者さんのサブ言語習得時サポートにどうぞ
以下目次
ttp://www.seshop.com/detail.asp?pid=10586&mode=spec Rubyの基礎知識・文法・数値・文字列(普段使う程度の1.9対応)・日時・配列・ハッシュ・
メソッドとクラス・クロージャ・例外処理・出入力・ネットワーク・スレッド
第13章 簡単なアプリケーション開発の例(単純なHTTPソケット通信サーバ)
第14章 オブジェクト指向の設計・開発(紹介)
第15章 テスト駆動開発(Test::Unitをてきとーに)
第16章 デザインパターン(さらっと)
第17章 開発に役立つツール
17.1 RDoc(文法程度)
17.2 Ruby Gems(日常利用)
17.3 Rake (日常利用できる程度の文法)
イラネ
独習からLLってことでムトゥ神が書いてるのかと思ったけど 独習Ruby (大型本) 株式会社テクノロジックアート (著) 漏れもイラネ
>>913 の目次見る限り惹かれるけど、
> 株式会社テクノロジックアート (著)
これって地雷会社?
目次を見るとなかなか惹かれるな とりあえず本屋で探してみよう
うお不評
>>916 うん、まあ、なんだ、翻訳モノではなんというか、こう、そう、しいて言うなら英語に強くなれるというか
翻訳+テクノロジックアート+長瀬嘉秀+アジャイルで満貫(アジャイルはUMLでも可)
今回は2つしか当てはまってないからなんとかなるよ、たぶん
919 :
デフォルトの名無しさん :2009/06/28(日) 08:21:54
本の宣伝というよりはSEshopの宣伝だろうなぁ そのサイトの管理人、いたるところにURL貼り付けてる。 Amazonで買った方がいいよ
921 :
デフォルトの名無しさん :2009/06/28(日) 08:50:26
>>920 SEShopって翔泳社のサイトだぞw
それでも中の人が工作してると思うのなら別に止めないが
ちなみに推薦書スレなんかでも貼られる頻度は高くない
貼られるのは長瀬がらみの(ry
スレ的Ruby書籍としては正当な部類だと思うがね 少なくとも検索エンジン云々よりはこのスレ向きだ 技術書スレ的にもまあ話題満載というか
翻訳が酷いといえばクイープの方が凄いぞ ruby wayとかの。
クイープ翻訳の好きな俺もいるんだがな
>>924 オライリーの翻訳やりだした頃は印象よかったんだけど・・・
PowerShell in ActionやWindowsプログラミングの極意なんかは
途中で読むのをやめてしまった
翻訳のせいなのかは知らないが
>>913 やっぱ例の黄色本か。
オライリーの動物本よりはとっつきやすいがな。
この手の本はPHPでたくさん出てるけど、あまり深い物がないような。 インプレスの基礎シリーズでもRailsが出てるが、 メジャーなシリーズで取り上げられるというのは、 需要が出てきてるってことかもしれんのでその点は歓迎する。
一応独習シリーズは定評がなくもないので、せっかくならもうちょいイイのを作って欲しかったとは思う
Rubyからメールを送るには今のところどのライブラリ使えばいい? 配布の予定はないけれど、エラーのときメール送るだけだからあまり大きくないのがいいなあ
あ、バージョンは1.8.7 1.9で使う予定は今のところない
actionmailer
TMailでいいじゃん?
tmailは受けるほう
TMailが便利なのは送る寸前までだな 送信自体はnet/smtpのはず
sendmail入れてruby simplemailを使うのも簡単だぜ
エラー通知みたいな用途ならシェルから mail コマンド使うのが一番楽だと最近気づいた
質問お願いいたします。 ログ出力にLoggerを使っておうとしております。 log = Logger.new(STDOUT) すると、標準出力にログがでます。 log = Logger.new("hoge.log") とすると、ファイルにログが出ます。 現在困っていることには、STDOUTと"hoge.log"、両方に同時に出力したいのです。 どうしたものでしょうか? 今は、 log = Logger.new("hoge.log") log.info("hage!!") puts "hage!!" みたいに両方書いているのですが、なんだかなーという感じです。
940 :
939 :2009/06/28(日) 15:30:37
Logger::LogDevice.writeを上書きしようとか思ってたのですが、 なんだか、 log = Logger.new(STDOUT) にしといて、 ruby hoge.rb | tee hoge.log としておけばいい気がしてきました…。
> Logger.new(logdev, shift_age = 0, shift_size = 1048576) > Logger オブジェクトを生成する。 > logdev には記録するファイル名か、write と close が定義されたオブジェクト(IO オブジェクトなど)を与えます。 ということで class Tee def initialize(file) @stdout, @file = $stdout, File.open(file, 'a+b') end def write(s); @file.write(s); @stdout.write(s); end def close; @stdout.close; @file.close; end end require 'logger' tee = Tee.new('teetest.txt') log = Logger.new(tee) log.info('1!') log.info('2!') log.info('3!')
Duck Typeのかつやく
速いriで現在でも動作するものって何がありますか?
fastRIはRDocのバージョンアップに追随できなくて死んだんだっけか 他の探さんといかんな
rdoc の記述で質問です HTML に書き出したとき、HTML のタグをそのまま表示させるようにすることはできますか?
>>947 <pre> で囲む記述内でならできるけど、いわゆるインラインで行う方法はない
・ 文字装飾のタグのうち先頭に\がついたものはそのまま表示する
・ HTML はそのまま表示される
・ & は & に変換される
という処理になってる
2番目と3番目が同時に行われてるのが極悪というかむしろバカ
ああ、つまんないことに 「&は&に変換される」が正解 普通、2番目やったら3番目はやらないもんだ
Ruby1.8用の Rubygems と Ruby1.9 用の Rubygems の両方をインストールしたシステム上で 両方を使い分ける方法はありますか?
質問です。 yumで入れた拡張ライブラリをビルドし直したい場合って どうすればいいんでしょう? OSをアップグレードしたせいで、ライブラリのバージョンがビルド時と 違うよって警告を出すモジュールがあります。特定のモジュール だけの話なら一度削除して入れ直せばいいと思うのですが、 気持ち悪いので全部ビルドし直したいです。 yum rebuild-all みたいな意味の操作って出来ませんか?
>>951 ごめんなさい、yumじゃなくてgemです。
gemで入れた拡張ライブラリを全部ビルドし直したいです。
それに必要なのは「ビルドし直す」ではないと思うんだがどうか ってか誤爆か
gem には -v オプションがある 要求されてるバージョンを指定してインストールすればいい
955 :
951 :2009/06/30(火) 11:54:33
説明下手でごめん rubyには関係ないlibABC-1.0.soがあって、 それにリンクしているrubyの拡張ライブラリXYZをgemで入れてあった libABCを1.1に上げたので、XYZも念のためビルドし直した方が いいと思うんだけど、どうすれば?という質問です。 XYZを一度削除してまたインストールすれば問題ないと思うんだけど、 それを全てのインストール済みgemについて一度に出来ませんか?
>>955 通常は必要ない
/usr/lib ディレクトリあたりから適当に最新のを読み込んで利用する
gem ライブラリ側で警告があるとすれば、それは gem ライブラリ側でその lib に未対応だというだけだ
外部 lib の特定のバージョン限定で動作保証しているんだろう
gem ライブラリがその外部 lib のバージョンに対応するのを待つしかないな
957 :
951 :2009/06/30(火) 13:06:51
最初からちゃんと具体例を出すべきだった、ごめん
nokogiriを使ってるスクリプトがあって、これが
WARNING: Nokogiri was built against LibXML version 2.7.2, but has dynamically loaded 2.7.3
というメッセージを出すようになった。
それで、nokogiriをgemでuninstall, installし直したら出なくなって動作もしてる、
だったら他のパッケージも再インストール必要?、という事でした
>>956 基本的には気にしなくていいと言うことですね
ありがとう
Ruby1.9.1 の Rubygems ってどうなってるの? ライブラリひとつも読み込まないんだが
gem19 environment の結果の GEM PATHS に無ければ無い たまにディレクトリに載っててもそこから読まない環境があるらしいが、その場合は Ruby 1.8.7 使え
- GEM PATHS: - /usr/local/lib/ruby1.9/gems/1.9.1 - $HOME/.gem/ruby/1.9.1/gems - $HOME/.gem/ruby/1.9.1 - $HOME/.gem/ruby $ ls -R $HOME/.gem/ruby/1.9.1/ $HOME/.gem/ruby/1.9.1/: bin cache doc gems specifications
form_tag :action => "update", :id => @item do : みたいなメソッドの引数のHashの括弧が省略できる仕様について、どこかに 公式のドキュメントはないでしょうか? Railsでけっこうhash引数がメソッド呼び出しに多様されていて、けっこうハマることがあったので、 どんな感じに動くようになっとるんかと、気になりました。
「ハッシュの場合はカッコを省略できます」以上のものではないよ もし「ハッシュでなくても動作する」とかいうのであるなら、それはメソッド定義側でそのように作ってるだけだ
結論は962のとおりだけど、
>>961 >けっこうハマることがあったので、
初心者がどうハマるのか興味あるので詳しく。
Ruby1.9上のNokogiriでlibxml2.7.3を使えてる人いる? WARNING: Nokogiri was built against LibXML version 2.6.32, but has dynamically loaded 2.7.3 こんな警告が出るんだけれど コピペで /usr/lib/libxml2.so を 2.6.32 に戻して nokogiri.so を再コンパイルした場合は何も言われない 2.7.3 の libxml.so を /usr/lib に置いて nokogiri.so を再コンパイル(nokogiri 再インストール)したら上記警告 Ruby1.9 のときだけバージョン固定でもしてあるのかな
libXMLのヘッダはどうした dynamically loadedっつってんだから コンパイル時にsoファイルがどうだろうと関係なかろうさ
966 :
965 :2009/06/30(火) 17:20:27
ごめん、関係ないってことはないな 2行目以降は無視してくれ
あ、うっかりしてた $ cat /usr/include/libxml2/libxml/xmlversion.h | grep "define LIBXML_DOTTED_VERSION" #define LIBXML_DOTTED_VERSION "2.6.32" おー (中略) p Nokogiri::VERSION #=> "1.3.2" p Nokogiri::LIBXML_VERSION #=> "2.7.3" p Nokogiri::LIBXML_PARSER_VERSION #=> "20703" お、直った うん、どうもありがとう
>>961 見つけた
リファレンスマニュアル>Rubyの文法>リテラル>ハッシュ式
のところ
>>963 > 初心者がどうハマるのか興味あるので詳しく。
例えば、Railsのform_tagはこんな風な宣言になってて、
form_tag(url_for_options = {}, options = {}, *parameters_for_url, &block)
普段、
form_tag(:controller=>'items',:action=>'update')
みたいに書いていて、:method => 'get'を指定したくなった時に、
form_tag(:controller=>'items',:action=>'update', :method=>'get')
みたいに書いてうごかねーとか行ってしまったことがあります。
:controllerと:actionは url_for_options に渡すべきもので、:methodは2番目の options に渡すもので、
そもそも全然違うので、一度わかってしまえば全然悩むことではないんですが…。
まあ、本来は下記のように書くわけです。
form_tag({:controller=>'items',:action=>'update'}, :method=>'get')
>>968 ありがとう、見つけられました。
RSpec は Ruby1.9 で一部動かないのか っていうか spec1.9 みたいなコマンドないの
>>970 それは単に gem で format-executable オプションを使う、という話ではないよな?
まあ Ruby 1.8 と Ruby 1.9 を併用してるとめんどくさいのは確かではある
>>970 gem/ruby/1.9.1/bin/spec のファイル名を spec1.9 とかそういうのに変えておけ(w
まだ1.9は早いよ。1.8で十分。
1.9 は 2, 3 年後という感じ?
まあ誰かが使わないとよくならんし、 使って文句いうぶんには問題なかろう
バージョン1.8.6です 配列の全ての要素が同じかどうか調べるにはどう書くのがスマートでしょうか 今のところ素直にeach回して調べてますが、もう少しスマートな書き方ありそうだなぁと思ってます
細かい仕様を追記です。 要素が空の場合、もしくは仲間はずれが居る場合は、falseを返します 全ての要素が同じ内容である場合のみ、trueを返します。
>977 あああ、最強です、ありがとうございmす
>>977 irbでやってみた。
おおーっと思った。
1.9.1でvendor_rubyというディレクトリが導入されてるようですが、 これってsite_rubyとどう使い分けるんですか?
site ディレクトリは /usr/local とどう違うんだ、とか考えると頭が痛くなるな /usr/local 以下に site_programname を作るのは勘弁して欲しい
漢数字から算用数字に変換するのってなんかいい方法無い?
>>982 わかりやすい説明ありがとうございました
文字コード別に辞書作るのが面倒だ。
>>984 2005年のLLDN「キミならどう書く」のあたりのウェブ日記とかをあされば
そこにあるプログラムにそういうルーチンが含まれてると思う。
>>986 >>987 サンクス。今自分で作ってたら、
"十"
っていう表記を入れると別の部分でsyntax errorが出るんだけど、
これってどうにか回避できない?
環境は
activescriptruby
ruby1.8
RDEで開発と実行
windowsXP
989 :
988 :2009/07/02(木) 01:27:44
自己解決 option => デバッグコマンド にある Ruby's optionのnormal modeに”-Ks”を入れたら上手くいった。 一応require 'jcode'で$KCODE='s'ってやってるんだけど。 これが効くのって正規表現だけじゃないんだな。
shebangに書いてたら、ソース内にダメ文字みたいなの書いててもOKなんだっけ?
コマンドラインでオプション指定するのと全く同じ。
英文字一文字でかす shebang を利用する美しい仕様ですね
994 :
デフォルトの名無しさん :2009/07/03(金) 01:26:40
最近仕事で「PHPの経験はないの?」と聞かれます。 Webサーバー上での動作でPHPと比較したとき、Ruby(on Rails)の長所・短所って何ですか?
それを聞いて相手に言って説得力があるのか?
長所 ・ PHPじゃないこと 短所 ・ PHPじゃないこと 仕事で使う程度のPHPくらいなんとかしろ 精密なプログラムが必要になることも精密なプログラマが必要になることも良くも悪くもまずない
997 :
デフォルトの名無しさん :2009/07/03(金) 01:47:22
Webサーバープログラムの標準がいまはphpだろ。
998 :
デフォルトの名無しさん :2009/07/03(金) 01:49:51
Ruby on Railsの利点は自分が知ってるだろ phpがだめな理由、使わない理由も自分で説明しろよ 納得できれば注文を変えてくれる可能性
999 :
デフォルトの名無しさん :2009/07/03(金) 01:53:01
Railsの弱点
Railsが万能であり,PHPやJavaなど既存の環境をすべて置き換えられるという訳ではない。
Railsの作者であるDavid Heinemeier Hansson氏は元々PHPユーザーであり,
いまでも37signalsのページではPHPが使われている。
Railsはしっかりしたモデルを持ったデータベースアプリケーションには向いているが,
メールフォームやアンケートなど,遷移の少ないものでは,その利点をあまり発揮しない。
またPHPなどに比べて,メモリーを消費すると言う問題もあり,
資源の少ないサーバーでの運用には注意が必要である。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060424/236113/
1000 :
デフォルトの名無しさん :2009/07/03(金) 01:55:00
1000!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。