1 :
1様 :
2009/04/02(木) 09:42:23 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
【Ruby1.9.1 は従来版とは別物であり、書籍や解説やライブラリのサポートがまだありません】
【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です
※ただし 1.8.6 より安定しているとはまだ言えないので、安定性を第一とする用途には 1.8.6 をどうぞ
関連スレや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 :
1様 :2009/04/02(木) 09:43:25
3 :
1様 :2009/04/02(木) 09:45:06
4 :
1様 :2009/04/02(木) 09:46:21
英語板に振ったアホがいるが、これは単なる技術英語なので、文法論は意味がない 命令文でもないのに Abort. と表示されるのはおかしいなんて指摘しても意味があるまい
>>5 (前スレ質問再掲)
> □ 996 デフォルトの名無しさん [] 2009/04/02(木) 12:43:26
>
> 英語のエラーメッセージで
> 「not found, ignored.」
> のような、かなりシンプルな構文で書かれることがありますが、これを英文法
> 上の用語でなんと言いますか?
>
> また、これについて勉強できる書籍(など)があれば教えてください。
どう見ても英文法の質問です。本当に(ry
真面目な話、このスレよりはスレ違いじゃなかろうと思ったんだが、まずかったらすまんかった。
そういやクラスやメソッド名を英語で付けようとして困ったということがよくあるなあ みなさんどうしてますか?
エスパーするなら 「こういうのどうやって書いたらいいかわからないので調べたいです、必要な用語を教えてください」 だと思うけどね 文法書レベルの用語を知るためだけに質問したとは思えねー どう書くかというのは、もう英語のソースや技術文書読むしかないな なるべく大きなプロジェクトのもの 技術文書に関しては企業プロダクトのものが好ましい 技術英語と略語掲示文を解説した本には実は心当たりがあるんだが、見つかんねえ 無理してでも買っておけばよかった
○○体とか言うんじゃなかった? まあ英文法書にはのってねーだろ普通。文系は帰れよ。
English板に振るほど板違いではないが、Ruby固有の問題でもないので掘り下げるのはスレ違いかなーという感じだな ネイティブを真似っこするしかあんめえ
13 :
11 :2009/04/02(木) 14:06:43
それ質問してるの俺だからw
>>11-12 が(実用度的に)ベストアンサーっぽい?
質問の答えとしてまとめてみると、
・エラーメッセージは文法を崩していることもある
・エラーメッセージとしての慣習や慣用的な言い回しがあり、それらには英文法上の呼び名があるときも無いときもあるだろう
・勉強するならむしろ技術書を当たった方がいい?(エラーメッセージのガイドライン等)
ってこと、かな?適当なので訂正よろ。
むしろ松本教祖の英語力に疑問があるけどな。
あんま関係ないかも知れんが、 俺他人にプログラミングを教えるときは、メソッド名とかを あえて日本語ローマ字で書いてる。 (def shokika とかね。) 初心者のうちは、どれが自分で作ってる部分でどれが言語仕様なのか 区別つかんだろうなーと思って。 (ダサさ満点だけど)
>>17 それ公開されているプログラムでも見たことがある。
p2とか見てみなよ面白いからw
FasterCSVでExcelで出力したcsvで以下のエラーが出る件ですが、解決いたしました。 " Unquoted fields do not allow \r or \n (line 1)." CSV自身の改行は\r\nで特に問題なく困っていたのですが、 どうやらFasterCSV自身は改行を \n(0A) として扱っているらしく、\r\n(0D 0A) が混じるとエラーが出る場合があるようです。 以下のように改行コードを明示的に指定(:row_sep => "\r\n")してやると無事に読みこむことができました。 FasterCSV.read(filename, :encoding => 'sjis', :row_sep => "\r\n") :row_sepはデフォルトでは :autoになっているみたいですが、場合によってはエラーになるみたいです。 というわけで、皆様ありがとうございました。 # しかし、出力時もFasterCSVで改行コード指定しなかったら \n だけになってて orz
引数としてもらったブロックを他のメソッドのブロックとして渡す、ということは可能なのでしょうか? ブロックを持つメソッドのラッパーなどを作った場合に、どうしたものかと。 今は、Procで受け取って、メソッド呼び出し時にわざわざブロックを作ってその中で Proc.callしています。 以下のような感じです。 def open_from_nantoka(filename, &block) open(filename) {|f| block.call(f) } end
def open_from_nantoka(filename, &block) open(filename, &block) end
>>20 普通に
open(filename, &block)
でいけると思うんだけど。
$ irb
irb(main):001:0> p = lambda { puts "hoge" }
=> #<Proc:0x7ff9c264@(irb):1>
irb(main):002:0> 3.times(&p)
hoge
hoge
hoge
=> 3
>>21-22 ありがとう。& つければよかったのか…
マニュアルでは "ブロック付きメソッド呼び出し"のところにありました。
まー単純なクラスとメソッドの説明に乗らないそのへんはマニュアル一通り読んでもらわないとわからんな
mapとかで便利以外のSymbol#to_proc の便利どころを探してます。 1.8.7から使える Symbol#to_procって Methodの代わりのようには使えないのでしょうか? irbで以下のようになって、 ?と首を傾げています。 > def a(method) method.call "hoge" end => nil > a(Kernel.method(:puts)) hoge => nil > a(:puts.to_proc) => nil
class Symbol def to_proc lambda{|receiver, *args| receiver.__send__(self, *args) } end end みたいなもんだから。 レシーバは既に知ってるMethodの代わりにはならないんじゃないかと。
a(:puts.to_proc) は、self.puts() という意味になっちゃうから、 でもってこれはinclude KernelしているObject#puts()だから、 改行して終了ということだな。
LAMPという言葉がキモくて仕方がありません。 いったい誰がこのような言葉を広めたのでしょうか。 流行? web2.0と同じくらい下らない。 そもそもこの言葉使いますか? 「おし、じゃあサクっとLAMP環境構築しておいてよ」 「これからはPHPだよな。LAMPさいこー」 なんて言いますか? こんなキモい言葉が港では当然のように使われているのが許せません。 早く死語になりますように ><
Rubyが先に死なないようにしないとね。
LAMP には別に正負どっちの感も持たないけど
>>28 はうっとおしいと思った。
31 :
28 :2009/04/03(金) 00:30:31
見ておくれ、このひどい有様を!!
http://ja.wikipedia.org/wiki/LAMP 構成要素に応じてAMP、LAPPのように言葉も変わっている類似用語があげられてる。
これこそまさにキモい!
なにコイツらって感じ。
「俺は面白い言葉遊びを考えたんだぜ〜」とか思ってるのか?
そして「は?LAMPも知らないの?」と、知っていて当然のように喧嘩売ってくる奴は、きっとこの言葉遊びの工作員だから、いっしょに死んで欲しい。
港でlampが使われるのは用途あってのことだろうしどうでもいいだろ
マカだと、MAMPとか逝ってるしな。リナックスでいいだろと思う。
/ニYニヽ (ヽ /( ゚ )( ゚ )ヽ /) (((i ) /::::⌒`´⌒::::\ ( i))) でっていうwwwwwwwwwwwwwww /∠_| ,-)___(-,|_ゝ \ ( ___、 |-┬-| ,__ ) | `ー'´ /´ | /
37 :
デフォルトの名無しさん :2009/04/03(金) 10:22:11
_, ._ ( ・ω・) ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)wwwwwww
class C attr_accessor :hoge end p C.new.instance_variables class C def initialize ; @hoge=nil; end attr_accessor :hoge end p C.new.instance_variables 結果 [] ["@hoge"] …まーそりゃ確かに hoge= が呼ばれない限り @hoge は存在すら感知できませんが、なんかちょっとヤだなあ instance_variables を使ってナニカの存在をチェックするという行為のほうが筋が悪いきちんとデータベース作っとけというのは いやもう全く以ってその通りではございますですが
明示的に初期化しましょう、で終了
初期化(笑)
attr_accessorが作るのはメソッドであって変数そのものではないのだが なにか勘違いしてるんじゃないだろうか
p @hoge と @hoge=nil p @hoge が状態が違うというのはあまり好きではない オブジェクトに関連付けられていないインスタンス変数はローカル変数同様にエラーを返すほうがよかった気がする
>>26-27 ありがとう。
なるほど、receiverはself固定なのね
やっぱ代わりにはならないか
Kernel.method(:puts)が書きずらいなーと思ったので、
:Kernel.puts.to_proc ってまあ、無理かw
>>28 じゃないけど、職場でLAMPって言葉使ったら、m9(^Д^)プギャー!!されてしまった。
そんな言葉、聞いたことないよ、と
用語説明しても、それは単にソフトウェアの構成のことであって、うんぬん
Wintelみたいなもんだろ?>LAMP 言葉は知ってても使わない、っていう人も多いだろうし、知らない人は知らないし。 言葉だけではとくに m9(^Д^)プギャー!! されるもんでもなかろう 使い方じゃね?
>>42 いきなり
if @name.nil? then
@name = '上戸彩'
end
とかできないのか
全部initializeで初期化するべきだな
>>46 こういうときって defined? と nil? 両方でみるべきなのかね
if defined?(@name) || @name.nil?
@name = "mage"
end
いや、やっぱinitializeでnil初期化がらくだ
attr_accessor に、全部nilで初期化ってくらいのオプションがついててもいいと思うんだ。 どうせsyntax sugarなんだから。
>>44 知らない奴が知ってる奴に「m9(^Д^)プギャー!!」するのは何かおかしいだろう。
まあ知ってるからどうだという言葉ではあるが。
>>46 @name ||= '上戸彩'
>>42 は = で代入が行われてないインスタンス変数は instance_variables に登録されないとかなんかその辺の話だろう
どちらも nil を返すが後者はインスタンス変数が存在していると
>>50 なんでだよw
@is_man = false
@is_man ||= true
p @is_man => true
「||=」と「if xxx.nil?」は違う
>>51 50じゃないけど慣用句的に使ってたよ('A`)
nilじゃないときは代入、みたいに
falseが入ってこないという仕様ならいいと思う ただ完全な置き換えではないということは知っておかないと、 リファクタリングのときとか微妙に挙動を変えることになるかもね。 微妙なのがわかりづらい。あからさまなのはわかりやすい。
FlaseClass のオブジェクトがどこからともなく入ることはそもそもありえないだろ
Flase 落ち着け つ旦~
>>54 みたいに間違いを指摘されると意固地になるやつって面倒なんだよな
指摘しないと仕事にならないときとか困る
やんわり言ってもやんわり意固地になるし・・・どーすりゃいいのよ
>>56 >>46 が @name == false をチェックしてないということ自体が答だろ
false はこの場合「入るはずがない」のが前提
nil? メソッドを defined? でチェックしてないのと同じ
もしfalseが入ってるなら上書きしちゃまずくないか? という流れじゃないのか?おれの勘違いだったらスマン
false の時は動作しないだろ、という突っ込みが文脈上無意味またはオタ臭い重箱隅つつき、というようなアリガチな話だと思った
>>46 できる。未定義のインスタンス変数を参照するとnilが返るから。
でもって
>>50 が
@ivar ||= val という書き方を提案した。
これは @var = val unless @ivar みたいなもんなので
>>51 が@varがfalseでも上書きしちゃうぞ、と突っ込んだ
DBのブール型を普通に使ってるおれは興味深かったが、 true/falseを変数に入れるって使わないやつは使わんのかね。
>>60 >>42 をよく嫁よ
オブジェクトに関連付けられていないインスタンス変数はローカル変数同様にエラーを返すほうがよかった気がする
>>46 からの流れだよ。
>>42 の意見はどーでもよかったから省いた。
そんな仕様だったら死ぬ。
普段pythonを使ってるのですが rubyとの対応表みたいなのがあるサイトはないでしょうか rubyを手間かけないで覚えたいのです
あ
Hikiって文書の中にRubyのスクリプト埋め込んだりできないの?
Wikiの文書にサーバーで動作可能なスクリプトを埋め込めるとか怖過ぎるだろ…
Hiki公開しちゃダメ
テンプレ作ってくれて助かるが、webサービスにする必要あるのか?ww
>>71-72 せっかくなのでテンプレコピペ(ちょい修正)
◆質問用テンプレ
【詳しい内容(「動きません」「うまくできません」だけでは回答しにくい)】
【エラーメッセージ(自力で訳さずなるべくそのままで)】
【実行環境(OS名、Rubyのバージョン(ruby -v しる)】
【最終的にやりたいこと(もっとよい方法がある場合が多いため)】
ランダムディレクトリ名でランダムファイルのCGIはアクセス解析とスパイウェア注入と相場が決まってる アクセスしたお前らオタワ\(^o^)/
Rubyスレに貼られるPHPのCGIなんざ俺が踏むわけねーだろ
外部コマンドを一定時間実行して実行を打ち切るのってどうすればいいですか? なんとかBSDでのTS抜き環境が出来てddコマンドでUSBデバイスからコピーすればデータが流れてくるようになりました。 停止しなければ延々放送波が流れてくるので、CTRL+Cで停止する必要があるのですが、 rubyでラッパーを書いて利用する際にどうすれば時間指定を出来るのかと思った次第です。
Rubyあんま関係ないな システムコールとか勉強するといいぞ 時間指定は cron とかの外部スケジューラに任せるのが一般には間違いない
さっぱり分からんがスレッド使って時間をみたりするのはダメなのか?
子供を1時間動かしておいて、30秒だけしか待ってやらない親 require 'timeout' pid = fork if pid begin timeout(30) do puts "waiting #{pid}" sleep end rescue Timeout::Error Process::kill('KILL', pid) ensure Process.wait end else exec("sh -c 'sleep 3600'") end
>>79 個々のスクリプトとしては sleep するしかないので、正直あんまりよくはない
自分の見てる前で30分だけ動かすとかそういうのならいいけどさ
82 :
デフォルトの名無しさん :2009/04/05(日) 21:04:00
OpenStructクラスで、[]、[]=、count(from Enumerable)などのメソッドを使いたいのに 定義されていない場合は、OpenStructを継承して派生クラスで定義してくれってことですか?
>>77 pid=fork
if pid==nil then
exec('やりたいコマンド')
else
sleep 動かしたい時間
# まずはSIGINTで止めてみる
Process.kill(pid,'INT')
stat=Process.waitpid(pid,Process::WNOHANG)
if stat==nil then
# ダメなのでSIGTERMで
Process.kill(pid,'TERM')
stat=Process.waitpid(pid,Process::WNOHANG)
if stat==nil then
# これもダメだったのでSIGKILLで。これなら確実に終了できる
Process.kill(pid,'KILL')
stat=Process.waitpid(pid)
end
end
end
確かforkは失敗すると例外を投げるはず
>>82 他にどーしろと…
st[0] でも st[:hoge] でも st.hoge でも st.each でもアクセス可能なコレクションというのは
デフォルトでは添付されてない
どれか諦めてくれ
85 :
77 :2009/04/05(日) 22:44:07
>>80 >>83 有り難うございます
別のプロセスをforkで作り、子供側にはnilを返し親にはpidを返すので
下に分岐を入れて子供には外部コマンド実行、親にはスリープしたのちkillさせる、ってことですね。
確かにrubyはあんまり関係ない処理だなあ・・・。unixの勉強がいるなあ。
>>83 pid = fork {exec('...')} とブロックのほうがいいんじゃまいか
1.9ならspawnがあるんだが。
それから、シグナル送ってからちょっとくらい待ってやれよ。 以下、Bourne Shell版。 #!/bin/sh やりたいコマンド & pid=$! sleep 動かしたい時間 kill -INT $pid 2>/dev/null && { sleep 1; kill -TERM $pid 2>/dev/null; } && { sleep 1; kill -KILL $pid 2>/dev/null; } wait
88 :
デフォルトの名無しさん :2009/04/06(月) 01:21:04
クラス名を文字列で受け取ってnewしたいとき、どのようなコードになりますか。 いろいろ試してみたけど最終的にはシンプルにevalしか思い当たらないんですが、漠然と他にありそうなような。 classname = "SomeClass" require classname #ファイル名とクラス名が同じと仮定した場合 obj = eval("#{classname}.new")
>>88 classnameが::を含まない前提?
> require classname #ファイル名とクラス名が同じと仮定した場合
普通は require classname.downcase
> obj = eval("#{classname}.new")
obj = Object.const_get(classname).new のほうが速い
active_supportあたりにそんな機能があるよ、確か。
90 :
88 :2009/04/06(月) 06:20:11
>>89 ありがとうございます!
>>88 の例では明示的にrequireしていますが、実際にはオートロードするように書いていたため
evalしかダメでした。(evalした時点で暗黙に読み込まれる)
const_getだと、すでに読み込まれている定数に対してですが、
そのことに気づかずにあれやこれやと・・・orz
現在は修正してうまくいっています。
active_supportは使えない環境なんですが、ファイル名のことなども参考になりましたm(_ _)m
>>90 >
>>88 の例では明示的にrequireしていますが、実際にはオートロードするように書いていたため
> evalしかダメでした。(evalした時点で暗黙に読み込まれる)
> const_getだと、すでに読み込まれている定数に対してですが、
> そのことに気づかずにあれやこれやと・・・orz
> 現在は修正してうまくいっています。
バージョンとエラーメッセージは?
$ echo 'class C; end' > c.rb
$ /usr/bin/ruby -ve 'autoload :C, "c"; p Object.const_get(:C); p $"'
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
C
["c.rb"]
Rubyの冒険とかめちゃくちゃ懐かしいんだが それとは関係ないんだな
94 :
90 :2009/04/06(月) 20:43:51
>>91 いただいたコードを見ると、const_getでautoloadしないわけではなかったのですね。
今一度自分のコードを見直してみたところ、const_getでautoloadできました。(解決!)
最初、Javaのように文字列からクラスを生成する書き方ばかり想像していて
>>88 で説明のための適当なコードを載せたばかりに、余計な手間をおかけしました。
いまさらですができているコードを書いておきます。
#testfactory.rb
module TestFactory #モジュール内のメソッドは公開済み
autoload :TestClass1, "testclass1.rb"
autoload :TestClass2, "testclass2.rb"
def get_instance(classname, *args) #インスタンスを返す
# eval("#{classname}.new(*args)) #
>>88 の時点のコード
# require classname.downcase #
>>90 の時点のコード(レシーバ違いでrequireが必要だった)
# Method.const_get(classname).new(*args) #requireしないと=> uninitialized constant Method::TestClass1
self.const_get(classname).new(*args) #現在のコード(問題なし)
end
#その他の同種のメソッド
def get_class(classname); self.const_get(classname); end #クラスを返す
def method_missing(classname, *args); self.const_get(classname).new(*args); end #同じくインスタンスを返す
end
#test.rb require "testfactory" #ファクトリモジュールを読み込み classname = get_classname #あるメソッドによりクラス名(文字列)を決定 obj = TestFactory::get_instance(classname, arg1) #OK! Rubyのバージョンは以下のとおりです ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] ありがとうございました!
ruby:1.8.7 rails:2.1.0 でやってるんだけどto_dateって使えないの? ググったら1.8.6だとprivateメソッドで定義されて〜 とか書いてたけどto_datetimeやto_timeとかもundefind methodになる…
98 :
96 :2009/04/06(月) 21:24:10
>>申し訳。 そっちで聞いてみます。
スレ的にはRailsをRuby初学者が使うのは全くお勧めしない
「Rubyレシピブック 第2版 268の技」を買いたいと思ってるんですが レシピブックって言うのはもっといたほうがいいんですかね? 言語挫折厨なもんで、、、便利なら買いたいと思っています。
>>100 対象がほんのり古いが、「Rubyは実際にどう書くのが一般的と考えられてるのか」がたくさん載っててとても便利
95%くらいは今でも使える、基本ライブラリを使うときはこう書いておけばとりあえずは恥ずかしくない、というコード片が満載
独学可能な領域なので無理してまで買わなくてもいいが、買うと勉強が早く済むよ
間違いなく買い 初版持ってるけど、よれよれになってるよ
ありがとうございます、買い、みたいですね。 参考にさせていただきます。
WindowsのRuby/TKで簡単なランチャを作って使ってるんですが Rubyから別コマンドを実行するのがsystemしかなく ふつうにsystem使うと、コマンド終了待ちでRubyが止まっちゃうので Thread.new{system 'ほげほげ.exe 引数'} としてます 外部コマンド一つ起動するごとにスレッドが増えるけど 外部コマンドが終了すればスレッドも終了するだろうし 同時に起動することなんて多くても数十程度だろうから 大丈夫かなと forkしてexecするのが普通の同期しない外部コマンド起動のさせかたなんですか? Windowsなんでforkできないのです 1.9だとspawnが使えるんですけど
>>104 win前提ならstartコマンド経由で呼べばすぐ戻ってくる
system "start ruby -e 'sleep 10'"
startはcmd.exeの内部コマンドなので GUIから呼ぶと一瞬cmd.exe起動の為に コマンドプロンプトウィンドウが出てしまうのです rubyw -e "system('start winver')" とかするとわかります
>>106 これはどうよ?
require 'win32ole'
wsh = WIN32OLE.new('Wscript.Shell')
wsh.Run('cmd /c echo', 0, false)
ああ、wsh 厨が来た ってか Windows の cmd.exe の肝心なときに使えない度は異常
>>106 忘れてたorz
Thread.new{system 'ほげほげ.exe 引数'}.kill
というのは?スレッド殺してもプロセスまで殺さないはず。
ちゃんとするならWin32APIなんでしょうね
でも、お手軽じゃないなぁと
Thread.new{system 'hoge.exe'}
で、動いちゃってるので
まあいいかなとそのままです
>>109 すいません
私の場合は非同期に外部コマンドを起動したいだけなので
後々のコントロールできなくてもよいのです
でも、Windowsで
>>77 みたいなことをRubyにさせようとすると
どうすればいいのでしょうね
Win32APIを駆使?
めんどくさそうだなぁ
>>112 CreateProcessするんじゃね?
使ったことないけど
1.8で、コマンドプロンプトを見せるな、という制限を課されるといろいろつらいな。 CreateProcessなりShellExecute(Ex)なりを直接叩くしかないと思う。
IO.popen(program, "w") とか
116 :
デフォルトの名無しさん :2009/04/07(火) 13:30:59
すみません。Cで拡張ライブラリを書くためにREADME.EXT.jaを 読んでいるのですが、次のような箇所があります。 > 既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を > 使えば,Rubyの機能を実現している関数を直接呼び出すことが出来 > ます. > # このような関数の一覧表はいまのところありません.ソースを見 > # るしかないですね. これが書かれてから15年近く経った今でもそうなんでしょうか? 日本語・英語問わず、どこかに一覧表があれば欲しいのですが・・・。
rspec で BDD だとかなんかそんなのやってみようかなーと思ってるんだけど、 これってパブリックなメソッドの返り値しかチェックできないの? いくつも小さなメソッドに分割された、ある程度フクザツなメソッド作ってる最中は役に立たない?
>>117 逆
「作り始め」のメソッドの大きさはみんな一緒
tdiary 以外でテーマやスキンの充実した ruby アプリって何かありませんか。
Hiki
122 :
119 :2009/04/07(火) 19:55:35
tdiary と同じテーマやスキン以外でお願いします><
MT や WP、Xoops みたいにド派手に変えられると嬉しいです。
Ruby ベースの CMS
ttp://diaspar.jp/node/79 をみてもテーマ公開しているの少ないよね…。
>>117 RSpecでテストとか勉強しようと思ってずっと待ってるんだけど、そういう解説は見たことないね
なんかテストのなんたるかを知ってる人が自由に使ってる感じがして、ちょっと寂しい
個々のマッチャとかの動作はわかりやすいんだけど、実際にこれどう使うのよみたいな
モデル・ビュー・コントローラの知識がないとたぶんダメ
RSpecでBDDやって遊んでるだけでも、17インチ液晶の左右分割では幅が足りないと強く思う 家でだらだらスクリプト書いてるだけだしこれくらいでいいじゃんとこれまでは思ってたけど、ちょうど足りない 少なくとも19が欲しい 大きめフォントをちょっと小さくしたけど、やっぱ足りん うおー
csvをMySQLに食わせるtsvにしたくてモゾモゾやってるんだけど a = ["mesi", "kue", "", "unko"] として a.map do |x| if x == "" x = "\N" end end の結果が [nil, nil, "\N", nil] となるのは何でなんでしょう。eachじゃダメだし。 つーか、["mesi", "kue", "\N", "unko"]にするステキな方法を 教えてくだしゃんせ。
ブロックつきの map{} は、ブロックの返り値で要素を置き換える で、 irb> p (if 1 == 2 then "true!" end) nil else 節がない if 文で条件が偽だった場合の文そのものの返り値が nil だ else を明示的に書くのがよい a.map{|e| if e.empty? then "\n" else e end}
x = "\N" は x = "\N" の返り値がたまたま "\N" だったからたまたま動作しただけだな ブロックつきメソッドは仮引数に代入することで動作するわけではない [1,2,3].map{|x| x = x*2} というような書き方は誤りで、 単に返り値だけを [1,2,3].map{|x| x*2} のように書く
△ ブロックの返り値で要素を置き換える ○ ブロック内で最後に評価された値が要素と置き換わる ブロックつきmapの「ブロックの返り値」は変換後の配列だ ブロックで最後に評価された値のことをブロックの返り値と呼んではいけない
× if 文 ○ if 式 公式でも if 文って書いてしまってるけどな 既存言語の影響は強い
Rubyでは文も式なだけであって、文を文と呼ぶのが誤りなわけではない。
最新のparse.yを見る限り、 symt→expr→arg→primary→if という流れになってるので、 ifは式です。
136 :
119 :2009/04/08(水) 10:30:51
>>125 ありがと。
「CSS着せ替えテンプレートプロジェクト」の存在も知ることができて感謝。
少々お聞きします。 以下のソースにて、Ctrl+Cをトラップしようとして、 trap 'INT' do puts "TRAP!!" raise "ctrl+c" end loop do Kernel.sleep 1.5 end 実行してみたんですが、 Ruby win32 + コマンドプロンプト : OK Ruby win32 + コマンドプロンプト + cygwin bash: OK Ruby win32 + cygwin terminal + cygwin bash: x Ruby cygwin + cygwin terminal + cygwin bash: OK という結果になってしまいました。 Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか?
>>133-135 Rubyでの文は「カッコなしのメソッド呼び出しの引数よりも優先順位が低い式」のこと。
>>137 > Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか?
できてるだろ。
> Ruby win32 + コマンドプロンプト + cygwin bash: OK
非cygwinプログラムからはcygwin terminalはttyには見えないので、
Ruby win32 + cygwin terminal ではできない。
>>139 ごめん。コピペミス・・・
> Ruby win32 + コマンドプロンプト + cygwin bash: OK
Ruby win32 + コマンドプロンプト + cygwin bash: x
ていうか、調べてたら cygwin から nativeアプリに(non-cygwin app) Ctrl+Cは鬼門みたいですね…。
>>133 ○if文
◎if式
こうでしょ?
例えば関数呼び出しは式であり文でもあり。
とりあえず一つだけ。 初心者スレに過度の原理主義はあんまりよくない。 やりたいなら、本スレにコピペでも持って行って存分にやればいいと思うんだ。
すまんかった。正直ifの扱いはどうでもいいんだけど 「文は返値を持たないものだけを指す」と言わんばかりなのが気になって。 初心者スレだけになおさらね。
式の一部になれないのが文だっけ?
ifが式ってのが、Rubyの特徴のひとつだもんな。
「if 式」のほうが実態をよく表してるし勘違いの元にもならないし興味の取っ掛かりにもなる つい口に出るもんなので仕方ないが、なるべく式と言うべきだと思った ちなみに、 for なんかは式だったかどうかをよく覚えてないので 「制御構造 for」とかいう表現で逃げたりする 大人は汚いね!
150 :
149 :2009/04/08(水) 14:31:58
Cなどの既存言語の経験者が戸惑わないようにif文って呼んでるのに その辺の事情を無視してif式って呼ぼうってのは、悪しき原理主義だよなあ そういやこの前「関数って言うな」なんてのもあった あれも根っこは一緒か
>>151 既存言語の経験者が同じだと勘違いするほうが問題とか、
少しも思わない?
初心者が引かない程度に抑えるのが肝要ってことでどうだろうか スレの使い分け大事
>>151 なんで違うものをわざわざ同じ名前で呼んで混乱させようと思うわけ?
155 :
129 :2009/04/08(水) 15:14:57
マニュアルの最初の説明でそう書いてある場合は、Rubyでは 無理せずに そう呼べばいいじゃんね 無理して別の名前で呼ぶ理由もなかんべ
>>117 で話が出たので自分用スクリプトでちょっとやってみた
小さなメソッドひとつにつき正常と境界と例外で8つくらいずつテスト項目作る羽目になって非常にめんどくさい
別なとこ改造してもspecのテストさえ通ればとりあえず他への影響を忘れて次のことをしていいというのは気楽
a.map!{|s| s.sub(/var/, 'foo')} をもっと短く書く方法ってありますか? なくてもいいのですが、なんか ruby ならありそうな気がして。
>>158 特にない
あと String#sub 系列はできれば sub(/var/){'foo'} と書いてくれ
これは Ruby の構造的欠陥だが
何十万回も置換を行うような場合は sub のブロック生成コストが気になるお年頃
{'foo'}あるいは{"foo#{1}bar"}程度のような単純なブロックは最適化してほしいもんだ
後方参照するときに$1か\1か迷ったり \をいくつ重ねればいいのか非常にわかりにくいという問題はある。 後方参照しないときまでブロックで書く理由は知らない。 転ばぬ先の杖じゃないかと思うけど、それなら理由書いたほうが。
単に構造的欠陥と言ってみたかっただけです。
ユーザーは何も悪くない以上、構造上の欠陥ではあるような気はする
そんなことよりもさー require 'spec' require 'logger' class C attr_accessor :log def err log.info('error!') if log raise end end describe "C" do before :each do @obj = C.new end describe "#err" do it "ログにエラーの旨が記録されランタイムエラーが発生する" do sio = StringIO.new ; @obj.log = Logger.new(sio) lambda{lambda{@obj.err}.should change(sio, :to_s).from('').to('error!')}.should raise_error(RuntimeError) end end end これをかっちょよく書く方法教えておくれよ 最初は lambda{@obj.err}.should change(sio, :to_s).from('').to('error!') lambda{@obj.err}.should raise_error(RuntimeError) って書いて上の行で例外が飛び出てうまくいかないって質問しようと思ってて、 書き込む寸前に lambda を2重にすることに思い至ったんだけど、なんかあんま普通っぽくないんだよねこれ
> これをかっちょよく書く方法教えておくれよ 高いスーツを買って、ポルシェで高級ホテルに乗り付け、 最上階のレストランでノートPCを開いて書く。
何という昭和w
> これをかっちょよく書く方法教えておくれよ 走ってくるトラックの前に飛び出して、 僕は死にません!Rubyが好きだから!僕は死にません! で、泣き止んで家に帰ってから書く。
何という昭和からの平成w っていうか平均年齢おかしいだろこのスレ
いま従事している ruby のプロジェクトで、 ソースファイルの改行コードがばらばらになっていることに気づきました。 開発は Windows、本番環境はLinuxです。 Linux の LF に合わせようと思いますが、質問です。 Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか? たとえば、Windows 上で、改行コードが LF のソースを動かす、など。 もし問題ないのならば、そのままにしてしまおうかなとも考えています (sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)
172 :
デフォルトの名無しさん :2009/04/08(水) 19:20:16
なんか精神的に嫌だな。
質問させてください、Rubyで日本語を扱いたいと考えています Rubyのバージョンは1.9.1です("ruby -v"を実行すると"ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]"とでます) PCはWindowsXPHomeEditionSP3 を利用しています(Vistaでも使いたいです)、コードの実行はコマンドプロンプトで行っています やりたいことは日本語と英語の文字列の含まれたファイルから特定の文字列を正規表現で指定し置換することです しかし、最初からいきなりつまずいてます まず、以下のコードが実行できません puts "あ" 実行すると、"invalid multibyte char (US-ASCII)"と表示されます rubyのソースコードはUTF-8で保存しています また、日本語の含まれたファイルを読み込み中身を表示しようとして以下のコードを実行しました filename = ARGV[0] puts filename File.open(filename, "r:utf-8") do |file_input| file_input.each do |line| puts line end end しかし、日本語の部分が文字化けして表示されてしまいます(puts filenameの部分は日本語でも正常に表示されます) ソースコード、読み込むファイルともUTF-8で保存しています、また、読み込むファイルはファイル名に日本語を使っています 基本的な部分かもしれませんが、ネットで検索しても対策が良くわかりません アドバイスや情報をいただけると助かります、よろしくお願いいたします
>>166 あ、それ逆
「例外 E と変化 C が起きる」場合は
lambda{ obj.should change(C) }.should raise_error(E)
ではなく
lambda{ obj.should raise_error(E) }.should change(C)
の順番で書いてくれ
前者は raise_error が満たされた時点で終了してしまって change が検証されないよ
それが証拠に、StringIO#to_s は StringIO オブジェクトを返して change(sio, :to_s) は失敗するはずなのに
何も起こってない
>>174 Ruby1.9.1 をアンインストールして Ruby 1.8.7 を使え
サポートしてくれるものが無い場合は
>>176 が正解
1.9.1を解説してくれる何かを頼りに学習してる場合はここで躓く可能性はないわけで、
つまりは1.9.1を教えてくれる教科書に該当するものを持ってないってことで
そういう場合は無理せずに1.8.7を使ってRubyに慣れるのが吉
一生のうちに1種類の言語しか学習できない呪いがかかってるとかそういう場合は別途相談
179 :
174 :2009/04/08(水) 21:14:45
レスありがとうございます
>>176 できれば最新版を使いたいのですが、1.8系は1.9系より日本語の使用が楽なのでしょうか?
>177
マジックコメントを記述した結果
puts "あ"
は実行できました!
しかし、残念なたら表示は文字化けしたままです
また、日本語を含むファイルの文字化けも直りません
表示するときに、文字コードを指定するような方法はないのでしょうか?
よろしくお願いいたします
最新版だって判断できるくらいRubyに習熟してるなら自力でやれ
>>179 Ruby1.9では文字列はそれ自身がエンコードを持っていて
入出力などで必要なら自動で文字コード変換が走る
しかし、コンソールへの標準出力では自動変換はなされないので
必要なら(Shift_JIS以外の文字列を出力するなら)自分で変換する(1)
あるいは、自動変換が走るようにIOの設定を変える(2)
のいずれかの対処が必要
らしい
(1)
puts line.encode("Windows-31J")
(2)
$stdout.set_encoding(Encoding.default_external)
$stderr.set_encoding(Encoding.default_external)
182 :
181 :2009/04/08(水) 21:29:30
結果は同じだけど、(1)のほうも puts line.encode(Encoding.default_external) のほうがいいかな
初心者向け書籍は1.9.2になるまで出ないんじゃないかと最近は思う
185 :
174 :2009/04/08(水) 21:59:21
レスありがとうございます おかげさまで、無事できました def my_puts str puts str.encode(Encoding.default_external) end なる関数を作成し、putsの代わりに使用しています これから、日本語を含んだ正規表現の利用を試します また何かありましたら、よろしくお願いいたします
Windows版のコンソール(cmd.exe?)への出力を諦めれば、相当楽になるような気がする。
例えばファイルにそのまま出すとか。
敢えて茨の道を進む
>>185 (
>>174 )に祝福あれ。
1.8.7なら倍のスピードで学習できるけどな 悲惨だ
nkf で変換とかだめなの? by 初心者
nkfじゃutfがだめじゃない?
UTFも扱えるけど標準出力に書き出すたびにNKF呼ぶんだぞ 死ぬほど面倒じゃないか
>>190 何その Ruby 1.8 以前を全て敵に回した発言
以前と未満を間違えるとプログラムは動かないぞ
<バージョン>Ruby 1.8</バージョン> <時間>以前</時間> <バージョン>Ruby 1.8</バージョン> <バージョン>未満</バージョン>
本題とはズレるけど、 cygwin を入れ、cygwin 付属のターミナルを使わずに UTF-8 Teraterm の cygterm で コンソールを開き、Teraterm のコンソールの出力の文字コード(Kanji (receive) を UTF-8 にすると、 プログラムが UTF-8 で標準出力に出力しても、読めるようになる。 cygwin 入れる場合は、環境変数 PATH で、 cygwin 付属の ruby より mswin32 の ruby の方が前に来るように気をつける。 というか Linux で ruby 勉強した方が余計なところに躓かない気がする。 Linux なら、OS の文字コードも UTF-8 だし。
195 :
デフォルトの名無しさん :2009/04/09(木) 08:30:52
a = [1, 2, 3, 4, 5] # no1 p a.inject(0) do |sum, x| sum += x end p a.inject(0) { |sum, x| sum += x } なんでno1では以下のようなエラーが出るんでしょうか? /tmp/r.rb:20:in `inject': no block given (LocalJumpError) from /tmp/r.rb:3:in `each' from /tmp/r.rb:3:in `inject' from /tmp/r.rb:3
p するからだ do〜end ブロックを関数的メソッドに渡したい場合は引数全体を ( ) で括れ 理由は省くが、空白の有無でパースがコケている
do〜endと{}では結合度が違う do 〜 end → おおもとのメソッドに結びつく { 〜 } → 直前のメソッドに結びつく no1ではブロックがpに結びついてるからだろう
つまり、最初のは p(a.inject(0)) {|sum, x| sum += x } と見なされとるわけよ
>>171 > Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか?
> たとえば、Windows 上で、改行コードが LF のソースを動かす、など。
これは問題ない。
というか標準添付のライブラリはすべてLFになってるはず。少なくとも最新版では。
逆の場合、ruby自身は行末のCRを捨てるという処理が入っているので問題にはならない。
行末以外のCRは単なる空白扱い。
ただし、shebangはruby自身ではなくカーネルで処理されるので、
#!/usr/bin/ruby^M
などとなっていると "/usr/bin/ruby\r" というコマンドを実行しようとするので動かない。
> もし問題ないのならば、そのままにしてしまおうかなとも考えています
> (sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)
つ dos2unix
>>194 いやーそれが、win32のプログラムをcygwin上で動かすと不具合あったりしますよね…。
Ctrl+C押すとcygwinアプリには届くけど、ネイティブアプリには届かずに落ちちゃったり。
(Railsスレにも書きましたけど)
まあ結局は、仮想環境か専用サーバーかのLinuxにターミナルでつなぐか、
coLinux、andLinuxでも入れろやってことになりそうですけども
ひとつ質問いいですか? kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか? けっこう特に後者に(俺が)未だにハマるんですよ。 MLのログみると、trap:kconvにあるような半分バグ的仕様だけど、変更点としては大きいからそのまま、 みたいな感じですが。 kconvで-m0とか-Xはずすような、 モンキーパッチみたいなのってないんでしょうか?
いまだにkconv使ってるやつのほうが博物館行きだからじゃないかな
> kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか?
x nkf の -m0(MIMEデコード)
o nkf の -m(MIMEデコード)
>>203 ええええ('A`)
なら、String.toutf8 みたいなユウワクに駆られるようなメソッド用意しとくんじゃねーよヽ(`Д´)ノ ウワァァン!!
>>200 レスどうもありがとうございます。参考になりました。
改行コードが混在したソースの状態でも、とりあえず問題なく動くということで安心しました。
shebangの問題は大丈夫です。
今回はRails + Rubyによるバッチで、Linux上で shebang で起動される
ソースは、ただしく LF になっていました。
すごい初歩的な質問です。
ttp://www.ruby-lang.org/ja/man/html/Hash.html を読むと、default を持たなければ nil を返すとのことなので、
h = {}
if h['a'].nil?
p "ok"
else
p "ng"
end
は ok が出て分かりますが、
if h['a']['b'].nil?
p "ok"
else
p "ng"
end
は undefined method `[]' for nil:NilClass (NoMethodError) になります。
これを ok に出すにはどう書けばいいのでしょうか?
207 :
デフォルトの名無しさん :2009/04/09(木) 15:17:53
if h['a'] && h['a']['b'].nil? p "ok" else p "ng" end
もうこれは100回でも書こうと思う Ruby に 2次元配列(そして多次元配列)は存在しない a[0][1] は「2次元配列 a の 0, 1 番地」ではなく 配列 a の [] メソッドに引数 0 を渡した返り値のオブジェクトの [] メソッドに引数 1 を渡した返り値、 すなわち tmp = a[0] tmp[1] という2段階のアクセスを縮めたもの、または単なる a.[](0).[](1) というメソッドチェーンだ
しかし誰も配列の話はしていなかった
>>209 現象は一緒じゃん
要はメソッドチェーンが切れてるだけだし、メソッドチェーンのレシーバがnilになりうるときと対処が全く同じ
n次元配列のクラスを標準で添付しなかったのは悪意だと思う
211 :
206 :2009/04/09(木) 15:53:32
>>207-210 ちょっと衝撃的な事実。大変勉強になりました。
多次元がなく、判定が if h['a'] && h['a']['b'].nil? と煩雑としたら、
多次元を扱わない別の方法でデータを扱っているんですか?
けっこういろんな人が困ってるな、2次元構造のコレクションの nil 問題 「データに nil があるとエラーになります」とか苦しい説明をしてる人も…
デフォルトでおすすめできる多次元配列のライブラリもないしな。
>>211 概念的にも構造的にも多次元ではないので「配列のネスト」「ネストしたハッシュ」などとお呼びくださいまし
で、Ruby ではいわゆる番地でコレクション(配列、ハッシュ)にアクセスすることはそう多くない
コレクションの each メソッドを使って枚挙するか、そういうアクセスを基本としてデータ構造を考える
んが、配列のインデックスやハッシュのキー決め打ちでネスト先にアクセスすることも多くて、
「あ、そうか、最初のが nil になればこれってエラーか、めんどくさいなあ」と言って
h[key1][key2] が h[key1] && h[key1][key2] になるのは日常茶飯事
だから、もし、本当に、番地による多次元アクセスが大量でメインな仕事をするつもりなのなら、Ruby は使わないほうがよい
ここでサクッと2次元配列みたいに扱うハックがキボン
216 :
211 :2009/04/09(木) 16:09:40
>>214 ひやー。パラダイムシフトが求められるのですね。
ありがとうございます。
217 :
211 :2009/04/09(木) 16:15:20
僕もハッカー待ちます><
def nested_fetch(array, *indexes, &ifnone) ifnone = lambda{|idx| return } unless block_given? indexes.inject(array){|ary, idx| ary.fetch(idx, &ifnone) } end こんなん?
h = {} h['a']['b'] = "hello" をする定石はなんでしょうか?
誰でもわかる勘違いのない方法 h = {'a' => Hash.new} h['a']['b'] = "Hello" 「ハッシュにあるキーでアクセスしてキーが存在しなかった場合、特定のオブジェクトを代わりに作ってそのキーに対する値とする」 という動作をさせることもできるが、読むのめんどい どっかで書いたので誰かが書くと思う
自動でHashをネストしてもらう h = Hash.new{|t, k| t[k] = {} } 登録してないkeyだと確認して自分でHashを入れる h = {} (h['a'] ||= {})['b'] = "Hello" あらかじめ一段目のkeyを知っている h = {} ['a', ...].each{|k| h[k] = {} } h['a']['b'] = "Hello" だいたいこのどれか。 イメージするデータ構造によって好きなのを選んでくれい。
あーあった h = Hash.new{|h,k| h[k] = Hash.new} h['a']['b'] = "Hello" p h p ['undef']['unset'] p ['undef2'] 結果 {"a"=>{"b"=>"Hello"}} nil {} ただ、おそらく、多くの場合、Ruby でこれを使うのはそもそも間違いで、 データ構造を考え直したほうがよいとは思う
>>220 早速ありがとうございます。その「ハッ(略」にも興味があります。
それは
h = {'c'=>"aa"}
h['a']['b'] = 'hello'
の場合、h['c'] を消さない方法でしょうか?
224 :
218 :2009/04/09(木) 16:45:58
連投すまん。こんなんとか。 def nested_fetcher(collection, n_dimension) lambda{|*keys, &ifnone| ifnone ||= lambda{|idx| next } keys.size == n_dimension or raise ArgumentError, "wrong number of arguments (#{keys.size} for #{n_dimension})" keys.inject(collection){|c, k| c.fetch(k, &ifnone) } } end ifnoneを渡さないならブラケットで見た目的にも。 f = nested_fetcher(array, 2) f[0, 0]
225 :
223 :2009/04/09(木) 16:47:52
226 :
デフォルトの名無しさん :2009/04/09(木) 16:48:29
ハッシュを構造体の代わりとして用いることは 是か否か、について教えてくさい。
メンバが有限ならStruct、そうでないならHashという私見です。
228 :
デフォルトの名無しさん :2009/04/09(木) 16:55:00
とりあえず否 構造体用のクラスがRubyには用意されているため。 これが満足できない回答なら、情報小出しにすんなといいたい
>>226 /)
///)
/,.=゙''"/
/ i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
他の言語の構造体に完全に該当するクラスはRubyにはない
>>227 のように Struct が標準でついてくるが、
ぶっちゃけ「つけた名前のメソッドでもアクセスできるなにやら便利な配列」以上の使われ方はしないので好きにしれ
Struct を使って怒る人は特にいない
h = {'c'=>"aa"} (h['a'] ||= {})['b'] = "Hello" がうまくいったので、 h = {'c'=>"aa"} ha(h, 'a', 'b', 'hello') したら {'a'=>{'b'=>'hello'}, 'c'=>'aa'} が返ることを期待して def ha(h, a, b, key) (h["#{a}"] ||= {})["#{b}"] = key end としたのですが結果が hello です。 なぜでしょうか。。。
231 :
デフォルトの名無しさん :2009/04/09(木) 16:59:09
[ 0, 0, [] ] こういうのがあってイラっとした。 しかもコメントがない。死ね。
haの返り値は最後に評価された式つまりその代入式の値。 代入式の値は右辺の値。 早とちり乙。hはちゃんと変わってるはず。
>>230 よくわからないものを無理して使うからよ
>>233 自分で泥臭くでも作れば間違いないのにね
借り物を使うから、どう動作してるのかがわからなくなる…
イディオムを教えるっていうのは、それを分解して どういう動作なのか調べて自分の肉として取り込んでもらうってことだと思ってた。
236 :
230 :2009/04/09(木) 17:08:49
>>232-233 ほ、本当だー。ありがとうございます。
Perl/PHP と比べると不思議ですが、面白いですねー。
>>221-222 , 224 などなど理解できてないので精進しますです。
>>202 お前は俺か、ってくらい、昨日同じことで悩んでた。
>>203 今は何使うのが常識なのか教えてー。 1.8.x で。
常にh['a']['b']などと二段階でしかアクセスしないなら、そもそもHashをネストさせる意味はない。 h[['a', 'b']] = "Hello" とでもしとけ。
うわぁ・・・
ベンゾウさんの中・・・
>>238 rails の select ヘルパーが <select name="a[b]"> という名前になるんです。
なので params['a']['b'] が空の場合とかの処理に必要で。
rails はどうなっているんだろうなぁ。
param["a"]["b"]にアクセスするときって ["a"]が無い時点で処理続行不可能なパターンが大抵だから returnなりraiseなりでさっさと脱出してるな。railsはしらね。 return unless param["a"] if param["a"]["b"]
そもそも、別にkconvやNKFが時代遅れなんて事はないと思うが 今でも主流って位には使われてるはず
params['a']['b'] rescue nil
eval ってなんて読むの?
>>246 イバル
evaluate のことなのだから、イバル
日本では evaluate を踏まえてもなお「えばる」と読まれてる気がするので
もうエバルでいいよという気がするが、本来はイバルと読むべき
ちなみにイーバルは「俺の昼飯シャキヴェントゥー」並に間違ってカッコわるい表現なので避ける
_,,-ー----.、 <" "l '; ,、、__ソ^`7, i、 ';'___ _,,, リ トーj 'ーー r ヽノL ヽ ノ < シャキヴェントゥー ヽ∀ / ー'
249 :
202 :2009/04/10(金) 13:27:30
kconv直したのを作ろうと思うんだけど(gem化しとくと便利かね) 名前何がいい?
jconv
ちょっと質問。 ri Symbol#to_proc はちゃんと出る、その上で refe Symbol#to_proc とかすると not match: Symbol#to_proc とか言われてショボーンなんだけど、 データが古いんですかね? あと、このrefeのデータベースを一発で更新するコマンドてないの? refeはGemsで入れたものです。0.8.0.3の最新版
jconv: japanese character converter ? kconv: kanji character converter ? kconv2: kanji character converter 2? 2はともかく、japanese とか kanjiとかどうなんん?と思ったけど そもそも外人は、UTF-8かASCIIかだろうし、使わんかw
EUC-JPとJISとShift JISとUTF-8の相互変換に、 Japanese以外のどんな需要があるというのか
>>254 一応、 Latin の文字と UTF-8 文字の変換の需要はある
日本人ジャナイヨモードにした場合はSJIS/EUCはLatinだとみなして変換してくれるとか
>>252 Gemのrefeはもう手付かず。
なんでかってーと るりま のDB引くコマンドになったから。
259 :
デフォルトの名無しさん :2009/04/10(金) 18:17:15
きばる
260 :
237 :2009/04/10(金) 21:10:20
>>250 には、iとkの間って意味もありそうなのは、実装的に無茶振りか
2画面になってて 一方がIRB, 他方がグローバル変数の内容一覧みたいなツールってない? そういう環境で電卓みたいな感じで使いたいんだけど。
グローバル変数って内容が長大なもの(gem使用時の$LOAD_PATHとか)が あるから、常に表示ってのはかえって使いづらくない? 代用として ~/.irbrc にこう書くのはどうか。 def g puts global_variables.map { |v| %Q|#{v} = #{eval "#{v}"}| } end
265 :
264 :2009/04/11(土) 03:27:46
補足 readmeにも説明あるけど、 起動直後は JScript モードで動作します ruby の入力を受け付けるためには #cs ruby としてモードを切り替えてください
フリーのレンタルサーバーで 最初からrailsがインストールされている タイプって、スピードはどうなの?
>>266 どんなレンタルサーバーかによるな。
共有鯖はまずありえない。
VPSは小規模はあり、専用鯖ならあり。
(だけど、VPS、専用鯖でrailsがプリインスコって何か変な感じ。
大概、自分でOSまっさらからインスコするもんだろうから)
ただし、どちらにせよCGI駆動はありえない。
見なくちゃいけないところは、「railsプリインスコ」の他にどうやってそのRailsがその鯖で動くかってこと。
・apache + mod_rails(Passenger)
・apache + mod_proxy_balancer + mongrel
・
とかその辺
というか、railsインストールされているっていっても、必要なバージョンは自分で決めないといけないしな。
向こう側で指定されてても困ると言うか。
結局自分で入れるか、freezeして持ち込むハメになる。
詳しくはwebprog板のrailsスレか、レンサバ板で聞いたほうがいいと思う。
持ってるデータのなかにある、ある値を修飾して別の値にして返すというメソッドを作ります データはとりあえずインスタンス変数として存在して、 ある値はたとえば「データがハッシュなのでキー指定して取得」とか「データが自作クラスなのでアクセサで取得」とかです んで、修飾するメソッドに値を与える方法は、 ・ メソッドに引数として明示的に渡す ・ メソッド内部でインスタンス変数を読ませる のどっちが好ましいもんでしょうか 後者だとテスト作るのめんどくさいんですが
>>268 それについては他の言語で結論が出ている
「事前にデータが読める程度にわかっている単純な場合、引数指定以外はおおむね糞であり、
最初は楽でも最終的には引数を取らざるを得なくなるようになるので、素直に最初から引数で実装しとけ」
>>268 の文章が読みにくいのでリファクタリングしてみた
インスタンス変数(ハッシュや自作クラス等)から値を取得、加工して返すというメソッドを作ります。
この時、値を取得するためのパラメータを渡す方法としてどちらが望ましいと思いますか?
・メソッドの引数として渡す。
def func(key) ; "<h1>#{@data[key]}</h1>" ; end
・別のインスタンス変数にパラメータを代入し、メソッド内部からアクセスする。
def func ; "<h1>#{@data[@key]}</h1>" ; end
271 :
デフォルトの名無しさん :2009/04/12(日) 01:10:10
>>270 常識的にはこう。
def func(value) ; "<h1>#{value}</h1>" ; end
func(@data[key])
>>272 > class UpperCaseDecorator
> @map = nil
なんのつもりだ?
275 :
272 :2009/04/12(日) 14:22:36
>274 ああ、そうか、Rubyはこれだとインスタンス変数じゃなくてクラスインスタンス変数になるんだったな。 コーヒーの飲みすぎで完璧に寝ぼけてた。
コーヒーと寝ぼけるの因果関係がわからん
>>276 自分のプライドのためにもRubyをよく知らずに口を出したことをなかったことにしたい、の意
ここでプライドが出てくるあたり致命的というか重症
ruby使いは割とプライド高いの多いよ。 信者である事が選民思想と一致するし。
Rubyが俺の脳にまったくフィットしない。汚染の概念とか部分的には好感が持てるが。 たぶん俺がPERLアレルギー持ちなのがいけないのかな。
単純に、昨晩コーヒー飲んで寝てなかったんじゃね?
>>279 そういうのは人それぞれだろうな。
おれはPHPをやってたとき
かなりモチベーションが下がってたなとRubyをやり出してわかった。
漏れもRubyやってたのがいつの間にかJavascriptにシフトしかけてた またRubyに戻るべくリハビリ中
他を見下す奴が一番多いのはRubysit。他言語に限らず言語内でもな。 プライドが一番高いのはPerler。Rubyistと違って他にケンカ売ったりはしないが、俺最強と思ってる奴が多い。 PHPを使ってる「プログラマ」は特に言語に拘りのない奴だな。あと、そもそも心根がプログラマじゃない奴。
>>283 で、偉そうに印象批判してるお前は何者よ
285 :
デフォルトの名無しさん :2009/04/12(日) 17:05:28
matz
>>286 そこはいちおう言語を語るスレだから、
デタラメな理屈と幼稚な精神をフル回転させて
大勢の人間にレッテル貼っちゃう生き物は不要。
>>276-280 コーヒー飲みすぎると、カフィイン中毒になるからそれじゃない?
1日10杯以上飲む人は頭痛とかうつとかに気をつけたほうがいい。詳しくはwikipediaいけ
俺はもっぱら日本茶だ
リプトンのティーパック100個入り300円ぐらいの あれで紅茶中毒になりますた
100個入り300円ってどこで買ったんだよ
ここで Java 厨のおれが登場 (C、VB、PHP、Perl はいちおう書ける) オライリーの「初めてのRuby」を読み終わったところだが、 Ruby おもしろい Python より頭に入りやすい
>>290 いや、あれ掃きだめだろ
なんでも入れちゃっていいんじゃないかな
ということにして
>>294 Rubyが本題じゃなけりゃ言語比較ネタは
>>286 でどぞ
インスタンスメソッドとクラスメソッドの使い分けがわからなくなった クラスのオブジェクト関係なく、引数を受け取って適当に加工して返すメソッドはクラスメソッドでいいかな でもそうするといわゆる「メソッドから処理を切り出したメソッド」は一律でクラスメソッドであるほうがいいよね
298 :
デフォルトの名無しさん :2009/04/12(日) 20:13:35
そのクラスのインスタンスを生成しなくても実行できるメソッドがクラスメソッド。 インスタンスごとに振る舞いが異なる必要がない場合、クラスメソッドにする場合が多いかな。
>>268 の考えを推し進めるとそうなりがちだ
Rubyのクラスは他の言語のクラスと違って「処理のなんとなくのカタマリ」である場合が少なくないからな
モジュールで十分なのにクラスにしてしまう例が散見されるというかあんま深く考えてねえ
引数でのやり取りだけで十分で、クラスのインスタンスの役目が薄い場合は困りもん
as-a関係をmixinを使わずに実現するときとか。hasじゃなくてasね。
こんな話? puts Html.new(:title => 'タイトル', :body => '本文だよ!').html で使う class Html def initialize(param) @title, @body = [param[:title], param[:body]] end def title; "<title>#{@title}</title>"; end def body; "<h1>#{@title}</h1>\n<p>#{@body}</p>"; end def html return <<EOF <html> <head>#{title}</head> <body>#{body}</body> </html> EOF end end class Html def initialize(param) @title, @body = [param[:title], param[:body]] end def html return <<EOF <html> <head>#{Html.title(@title)}</head> <body>#{Html.body(@title, @body)}</body> </html> EOF end def self.title(str); "<title>#{str}</title>"; end def self.body(tit, str); "<h1>#{tit}</h1>\n<p>#{str}</p>"; end end
class Html def initialize(param) @title, @body = [param[:title], param[:body]] end def title(str); "<title>#{str}</title>"; end def body(tit, str); "<h1>#{tit}</h1>\n<p>#{str}</p>"; end def html return <<EOF <html> <head>#{title(@title)}</head> <body>#{body(@title, @body)}</body> </html> EOF end end 一番普通一般無難だと思われるコレが出ないのはなんでなんだぜ いや、まあ、インスタンスに全く依存しないからインスタンスメソッドである強い必然性はないというのは正しいが インスタンスメソッドから呼ばれるだけの、インスタンスメソッドから処理を括り出しただけのメソッドは、 あんまり深く考えずにインスタンスメソッドで作ってしまってもいいと思うなあ クラスメソッドは 「インスタンス内部で使ってるけど、あんまりにも便利だから外部にも単体で公開しちゃうよ!」 という意図があるべきだと、漠然と思ってる
303 :
デフォルトの名無しさん :2009/04/12(日) 20:43:13
?
>>302 URI.escape とか?
クラスに属するユーティリティとしてのクラスメソッドは立ち位置が曖昧過ぎ
parse みたいにインスタンスを返すクラスメソッド以外は Util モジュールとかに吐き出すのが素直
>>296 やすっ!
紅茶も飲みすぎたらカフェイン中毒になるから気をつけてなw
ウーロン茶とかも注意
CPU使用率とメモリの使用率を取得できますか? ゲームの簡易的なベンチマークを作ろうとしているのですが…
>>306 Rubyとしては特にできません
OSに直接聞いてください
Ruby 本体では無理だな rubygem の sys-cpu とか使えないかね あれは使用率とか検知しないんだっけ?
配列 arr に入った文字列を元にメソッドを呼び出したいのですが、 下記では `method': wrong number of arguments (0 for 1) になります。 どのように書けばいいのでしょうか。 class C def self.m1 "1" end def self.m2 "2" end def self.m3 "3" end end arr = %w[m1 m2 m3] arr.each{|method| p C.method} #=> 1, 2, 3 と出ることを期待
C.__send__ method
>C.method これは C.send :method と同じ。といえばもう原因も解決方法もわかるよね?
なんでどいつもこいつもレシーバつきメソッドの引数にカッコつけないんだよ
>>310 あれ、自分のスクリプトでも__send__使った方がいいの?
>>312 省略できるから。できないときはしない。
>>313 の2行のレスの関係性がなかなか味わい深い
Object#__send__ ではなく Object#send を使う人間がメソッドのカッコを極力省略するのはポリシーが一貫してる と思う
>>313 send でなければならない強い理由がないのなら、日常的に __send__ を使う
他の誰かや未来の自分が send メソッドを C に定義しないとも限らないし
実質上 send が死にメソッドになるのが厄介といえば厄介
メール関連のライブラリくらいでしか再定義された send は見たことないけどな
括弧をつけるかつけないかの判断ってどんなのがいいんだろうな 候補 1.括弧必須以外は括弧をつけない 2.すべて括弧をつける 3.基本すべて括弧をつける。 ただし「p」など組み込まれたレシーバーを省略するメソッドは括弧をつけない。 当然、自分が書いたプライベートメソッドなどは省略しない。 4.仮引数は括弧を省略 5.仮引数は括弧をつける 6.IFなどはすべて括弧を省略できる場合、省略 7.IFなどはすべて括弧をつける まだまだありそうだが。基本の基準を括弧つきかそうでないか、どちらにするかだな。 括弧をつけた方が思わぬ動作に遭遇する確率を低くできるのだが、 「p」とかにはつけたくない。 チームでやるときは、ごちゃごちゃになるからできるだけ標準化したい。うむむむ。
318 :
309 :2009/04/13(月) 13:21:15
__send__ でできました。ありがとうございます。
__send__: とにかく絶対にリフレクションでメソッドを呼びたい send: 基本的にただメソッドを呼ぶだけのつもりだけど、中でどうするかはレシーバに決めて欲しい とかかな。 pとかrequireとかにカッコはつけたくない。 けどs2 = s1.sub(/hoge/, '') とかにはつけたい。 ってことで右辺値かどうかが一番でっかいと思う>カッコの省略
えーと…、 __hoge__ とアンダースコア前後2個つきで書く意図自体は他の言語でも有名だし理解してもらえてるよね? 既存の hoge 、またはユーザー定義の hoge と被らないように「普通ありえない名前」にする、という意図
>>322 他人に理解してるか聞く前に、自分がスレの流れを理解できるてるか自分の心に聞け
gem でインストールした各種ライブラリのソース、ドキュメント(Rdoc?) は、ローカルPCのどこに格納されるのでしょうか?
たとえば Rails の rescue.rb というソースを見たい場合、
http://api.rubyonrails.org/ の左のペインから ActionController::Resuce をクリックして
http://api.rubyonrails.org/classes/ActionController/Rescue.html を見ると、HTML の上に In: vendor/rails/actionpack/lib/action_controller/rescue.rb と
表示されますが、これがどこかわからない。
自分は Ruby を c:\ruby\ruby-1.8.5-i386-mswin32 にインストールしていて、
以下のように rails をインストールした。
gem install rails -v 2.1.1 --include-dependencies
んで、c:\ruby\ruby-1.8.5-i386-mswin32 の下で、"rescue.rb" を検索したら、
c:/ruby/ruby-1.8.5-i386-mswin32/lib/ruby/gems/1.8/gems/actionpack-2.1.1/lib/action_controller/rescue.rb
が見つかったのですが、これがソースの実体ですか?
In: vendor/rails を、ローカルのどのように読み替えたらいいのかわからないです。
gem environment gemdir で出てくるディレクトリが vendor で、 その下の固定 gems ディレクトリが rails ディレクトリだな rubygem ライブラリのソースを参照することが多くなると思うが、全ては gemdir 以下に入ってる
>>323 __send__ は send が被らないように作ったメソッド名だ、という指摘のどこが変?
__ つきメソッドが何か特別扱いの動作をする予約名メソッドだという勘違いは初心者によくあるぞ?
そんな指摘してねーだろカス
結局
>>322 はひとりごとってこと?
内容の是非は別にして
>>326 指摘の内容が変とかそれ以前の話で、
お前は誰に指摘したんだ?ってことでしょ。
配列の最初の要素だけ別処理をしたいです どう書くのが普通?
>>330 result << first_only(arr[0])
arr[1,-1].each do |e|
result << usual_process(e)
end
こんな感じが普通だと思う
「あー最初の要素だけ別扱いしたいんだなー」と読み下せる
332 :
デフォルトの名無しさん :2009/04/13(月) 19:55:34
f = File.open(ファイル) # いろいろする! f.close closeメソッドを呼んだ時点で、データはフラッシュされていると考えてよいのでしょうか? それとも明示的にflushメソッドを呼ばないとダメですか?
普通かどうかは知らないけど(dupしてから)shiftで最初の要素と残りの配列に分けてる。
>>332 IO#close は IO#flush を呼ぶ
IO.open のブロックは終了時に IO#close を呼ぶ
ということで、たとえば書き込んだファイルを別名でコピーしたいような場合は、
close またはブロック終了後にcp を行うべき
Ruby では close メソッドを使うことはあまりないので、ブロックを使う記法に慣れてくれ
arr[1,-1] これ、おれはあんまり受け付けないなあ each_with_index使って、 indexが0のときは別処理みたいな方が自然な気がするが
336 :
デフォルトの名無しさん :2009/04/13(月) 20:02:09
配列がアホみたいに大きい場合、 res << first(a[0]) a[1..-1].each do |e| res << rest(e) end は配列のほぼ丸ごと複製が行われるのであんまりよろしくない a.each_with_index do |e, i| res << i.zero? first(e) : rest(e) end が無難な動作だが、1要素目から最後まで比較する余地なく偽が続くのが若干キモい res << first(a[0]) 1.upto(a.size+1).each do |n| res << rest(a[n]) end というのを思いついて、これは配列 1個で比較も 0回でおそらく高速だが、偏狭的だなと思う
apt で ruby を入れたら /usr/bin/ruby や /usr/lib/ruby 以下に 入ったのだが、事情により ln -s /usr/bin/ruby /usr/local/bin/ruby して使っていたところ、 gem で入れたものが /usr/local の方に入ってしまって 地味に驚いたことがある。
def each_specialize_first(collection, at_first) iter = collection.each at_first.call(iter.next) loop{ yield(iter.next) } end each_specialize_first a, lambda{|e| ... } do |e| ... end とか。
普通はどうするもんか、という質問にメソッド定義しちゃう人って何なの
top = a.shift a.each {|x| } a.unshift top 今はコレが好み。整数を手繰ってどうのこうの、 毎回ゼロか調べてどうのこうのはお腹一杯。 shiftとunshiftってい対応がすき。
>>340 熱狂した痛い初心者
つまり、過去の自分
一度shiftしたものは最後までshiftするべきだと思う shiftした時点でそれは配列ではなくqueueなんじゃないかと
前にもこんな話あったな。queueだと言い張りたいならQueueクラス作れよw
配列の要素をshiftしてunshiftするってのは筋が悪いの?
>>346 arr[0] と arr[1..-1] で用が済むというか全く同じ動作のはずなのに、
わざわざ shift という名前のメソッドを使うのなら、その配列はキューであるという意図があるはずだろ
>>347 配列を pop や shift や push してたら、スタックやキューとして使われてるのかなあ、とは思う
そういう風に使ってないのに、たとえば 0要素目だけを取り出して s に代入するだけの目的で
s = array.shift
と書いてあったら、ちょっと混乱するかも
>>348 ねーよw
同じ動作で別の名前を使うことに意味があるなら
Array#sizeと#lengthの違いを教えてくれよ
>>349 副作用があるからそれはない
>>146 キューとして使うという想定も有るとは思うがその言い方はおかしくね?
Array#firstというメソッドが存在する理由はArray#[]のある場所をランダムアクセス的に拾ってくるという意味じゃなく
先頭から要素をいくつか取り出すという意味をコードに持たせる為と解釈している。
それと同様に先頭から要素を切り出す、という意味をコードに与えたいならばshiftを使うのが適切じゃね?
ところでこれはどうかな?
isfirst = true
a.each do |e|
res << isfirst ? first(e) ; isfirst=false : rest(e)
end
数値による範囲指定と数値比較を無くしてみた。がキモさは消せないなあ
アンカミスorz
>>348 ね。
なんでこんな訳わからんミスしたんだか
配列かどうか? 型に拘るのはRubyらしくない。 shiftできるのならそれはshiftできる何かだ!
>>350 array をそれ以降使わないのなら動作する
heading = html.scan(/<h1>(.+?)<\/h1>/).flatten.shift
こんなのとか
1ヶ月くらいずっと、この手の使い捨て配列の最初と最後の要素アクセスを shift と pop でやってた俺が証人だ
試してみるとわかるが非常にめんどくさいので試してみなくてもいい
>>354 それこそまさに、なぜArray#firstとArray#lastを使わないっていう
>>349 > 0要素目だけを取り出して s に代入するだけの目的で
> s = array.shift
なにかに代入すうるだけならさすがに
a.firstかa[0]でしょw
取り出すってのが、今の流れの上では大事な特徴。
a[0],a[1,-1]とかa.shiftとかしちゃうと、要素0個の配列で例外でるから、 >351とかが無難かね。
>>357 配列が 0個でない、とかのチェックはしてあるという前提でいいと思うなあ
配列が空なのにエラー出さずに処理が進むほうが嫌なことが多いと思う
配列が空じゃないか?を追加したらどんどんすっきりした記述からかけ離れていく。 配列が 0個でない、とかのチェックはしてなくてもうまく動く方がいいよ
> 配列が 0個でない、とかのチェックはしてあるという前提 each_with_indexで回せばそんなの必要ないじゃんw なんでわざわざ手間のかかる上に間違えやすいやり方を選ぼうとするの?
キューとスタックの概念をどう学んでるかに結構依存しそうな感じだ shift って「pop で上から積んだもの」を下から取るイメージだろ Ruby の配列を利用する場合は先頭を取り出して詰めるように実装されてるだけであって、 先頭を取り出して詰める目的に shift を使うのはやっぱ不自然だ ってか、 shift と pop または unshift、push と言われて動作がピンと来るよな?
このshiftだキューだうるさい御仁は shiftメソッドはキューでしか使っちゃだめとか言ってるの? まさかね。
ary[1..-1] だと,書き込まない限り配列そのもののコピーされないので速い unshiftすると要素をずらすので遅い
キューとスタックの話をしようとして、 上とか下とか言われても微妙だなw それこそ固有の実装を前提にしてないか?
単にこれはPerlとかの文化だろ。 先頭に対するのがshift, unshift 末尾に対するのがpop, push
もうshiftとかキューの話はいいんじゃないか。関係ないだろ。
で、カッコイイという理由で shift を使ったのが
>>341
>>368 shift したものと shift で残ったものを別々に使うのはなんかキモいな
>>370 まあ、そのへんなんだろうな
想定されてる使い方とズレてることを気にする人と、ズレてることを気にしない人
アセンブラ上がり的には、 shift/unshiftは横にserializeされてるイメージで、 push/popは縦にstackされてるイメージだな。
アセンブラどころかCすらやったことないがそんなイメージだぞ おれのshift/unshiftのイメージ □□□□■■■■■■■ おれのpush/popのイメージ | □ □□□ □□□□□
スタックをピラミッドで組むのは大方のイメージとずれてると思う というか、てっぺんのアンテナは何だ
スタックっていったら重ねたお皿だろう と思ったがRubyとか高水準な言語では 要素の大きさがバラバラなスタックってのもありな気がしなくもない
376 :
デフォルトの名無しさん :2009/04/13(月) 23:00:59
>>824 マジレスすると初めての場合はちゃんとしたローション使わないと痛さで糞ができなくなるぞ。
お勧めのローションはテンプレをみてくれw
>>374 真ん中を貫いてる棒だよ。
棒がないと下からひょいっと取り出せるじゃん。
ちなみに「□□□□□」は真ん中に穴があいてる円盤を表現してみた。
Perlから入った人はpush/pop/shift/unshiftはリスト操作 というイメージが定着してるからな。 アセンブラの人とはかみ合わないさ。
アセンブラとか関係なく shift や pop はキューとかスタックとかあのへんの操作だと思う が、そういや Perl は shift や pop を常用していたような記憶がある
>>369 巨大な配列にa2=a[1..-1]とかやってメモリ使用量見てみろよ
言いたかないが、Ruby 特有の事情だぜ、 リストをイテレータアクセスする機能が標準でついてて while と shift のコンビが必要ないのとか
RubyのはPerlを継承したとして、Perlの場合、 shiftはシェルスクリプトのshift push/popはプログラマなら常識のスタック操作の名前から とここまではわかる。 unshiftは思いつくものがないんだが、 lwallは単にshiftの打ち消しとしてunshiftと名付けたのだろうか。
Cにungetcってあるな。
>>381 shift が本来の意味に集中できる余地があるのはいいことだな
>>380 「速い」「遅い」と書いてあるのでメモリ使用量は参考にならない
というか、Rubyの配列はオブジェクトへの参照のヒモが各要素のセルにどばーっとくっついたスダレみたいな箱だろ
その箱とヒモ自体を作る速度を問題にしてるんじゃないの
莫大な配列だと参照をコピーするだけでも時間がかかると
範囲オブジェクトやInteger#uptoで添え字を増減させてアクセスするなら参照の複製すら行われないから少なくともその分速いと
Array#shift はオブジェクトそのものは維持する
>>373 はスタックとハノイの塔を脳内でマージしている。
うおきめえ というか実際に動かさないとなにやってるかわからんな(w
>>384 だからメモリの使用量見れば巨大な参照の列のコピー自体が起きてないことが分かるだろうに
>>384 > その箱とヒモ自体を作る速度を問題にしてるんじゃないの
箱ごとシェアするんだよ。これ実行してみろ。
a = [1]*10000000
t = Time.now
10.times { b = a[1..-1] }
p Time.now - t
t = Time.now
10.times { b = a[1..-1]; b[0] = 0 }
p Time.now - t
ブログラムコードに対する形容詞の「きもい」の意味がわからない
グロいってのはよく言うけど、それよりは褒め言葉に近いニュアンスがあるような気がする
{ } begin endが混在するのがキモイ OOPLなのに関数があるのがキモイ
良いプログラムの定義を仮に「単純で美しく、論理的に明確ですっきりしている」とすると、 キモイというのは「動くことは動くが良いプログラムとはほど遠い」ということだろう。 大抵「なんでこんなことやってるの?」とか感じると思う。 知ってる知識を使うことが目的になって、かえってごちゃごちゃにするやつは割と見かける。
おいおい落ち着けよ ・・・ってRubyでPlagger使えたのかよおぉぉおおぉおぉおおおお!!!
RubyでPostScriptファイルの情報を取得して表示しようとしているのですが RMagicで印刷枚数、部数、プリントサイズ、モノクロかカラーかって取得できますか? ImageMagicをコマンドラインで動かすのは面倒なんですが、 RMagicは画像の加工でしか使えないですかね?
>>390 へえ、なるほど
部分配列のコストなんて考えたこと無かったけど
元の配列とシェアするんですね
で、代入された時点で初めて完全なコピーが行われる
もとの配列の要素が増減した時にもちゃんとコピーされる
上手いこと出来てるなあ
require 'benchmark'
def bm(mes,&b) print mes;puts Benchmark.measure(&b) end
a = [1]*10000000
b =nil
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}
bm('部分参照'){b=a[1..-1].size}
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}
あ、間違ってた bm('部分参照'){b=a[1..-1].size} じゃなくて bm('部分参照'){b=a[1..-1]} でした でも、参照した影響っていつまで残るんでしょうか 部分配列を参照して使い捨てた後でもコピーが起こってるみたいなんですけど require 'benchmark' def bm(mes,&b) print mes;puts Benchmark.measure(&b) end a = [1]*10000000 bm('部分削除'){a.delete_at(5)} bm('挿入 '){a.insert(5,1)} bm('部分参照'){a[1..-1]} #使い捨て GC.start bm('部分削除'){a.delete_at(5)} bm('挿入 '){a.insert(5,1)}
>>402 誰でもすぐ思いつく泥臭いのがうまくいくことも多いってことだな
ベンチマーク取ってみるとRangeとか使って添字で回すより、 部分配列でeachした方が速かったり
>>402 配列の要素が2つ以上無いと例外になるってばさ。
「最初の要素だけ特別な処理」って時に要素一つだけの配列を
渡されるケースもそんなにまれではなさそうに思うんだけどな・・・
なんか揉めてたが、動作的に無難っていったら
>>341 かもよw
>>405 いやそれなら配列以外を渡されるチェックもすべきだろ
Enumerable だけ対応して shift メソッドが定義されてなかったらどうする
うむ、rescue ブロックが100行くらいついてない時点でどれも論外だ
真珠を継承しちゃったおかげで、悪い所も継承しちゃった感じだな。 そろそろ反省して次の言語来る?
>>405 irb(main):001:0> [1][1..-1]
=> []
要素1つでも問題ない
410 :
405 :2009/04/14(火) 23:24:51
なんか勘違いしてた。要素が一つあれば例外にはならないのね。
あと、その後のレスでもみんなさりげなく翻訳してるが、
arr[1,-1] は arr[1..-1] なのな。
>>406 お題が配列だし、そこまで行くと何もシンプルには書けないような(´・ω・`)
>>405 snippetとか例文とかそういう概念はないんか
412 :
405 :2009/04/14(火) 23:26:57
なんか言い訳が間に合わなかったZE! しばらくROMってます(´・ω・`)
要素が0個のときうまくいかねーって
a = [1,2,3,4,5] top = a.shift a.each {|x| p 1} 1 1 1 1 a.unshift top => [1,2,3,4,5] a = [] top = a.shift a.each {|x| p 1} a.unshift top => [nil] こうしてくだらないバグがこの世に一つ増えるのだった
415 :
デフォルトの名無しさん :2009/04/15(水) 00:17:16
プログラム関係ないけど、Ruby使いの人はどんなエディタ使ってるの? gvim使ってるけどVisualStudioしか使ったことなかったから インテリセンスなっしんぐのエディタは結構きついです・・・
NetBeansが続々とスクリプト言語に対応していってる。 でも型情報が無いからインテリセンス並のコード補完は期待できないな。
Aptana Studio。RDTとRadRailsね。 Rubyは変数の型を動的に変えられるから、 インスタンスメソッドだとインテリセンスはほとんど役に立たないよ。 クラスメソッドならOKだけど。ステップ実行は便利。
418 :
デフォルトの名無しさん :2009/04/15(水) 00:25:19
いまんとこ、対応してるIDEはNetBeansとEclipsだけですか?
419 :
デフォルトの名無しさん :2009/04/15(水) 00:31:01
>>414 「配列の最初の要素だけ別処理する」という仕様に対して、
長さ0の配列が渡されたら何もしないのが正しいと言い切れるの?
>>401 >参照した影響っていつまで残るんでしょうか
sliceすると、sliceされた配列も新しく出来た配列もシェア状態になる。
シェア状態になった配列を破壊的に変更するとコピーが起きる。
コピーがされたらシェア状態じゃなくなる。
というわけで、破壊的変更がされるまで。
以前からArrayはcopy on writeに違いないと訳もなく信じていたのだけど、 今回の話でちょっと興味を持ったので少し実験してみた。 もしかして一部分でも書き換えたら、巨大な配列だろうと丸コピーしてる? irb(main):001:0> a = Array.new(1<<24) { |i| i } # メモリ使用量70MB程度 irb(main):002:0> b = Array.new(1<<8) { a[1..-1] } # メモリ使用量そのまま irb(main):003:0> b.each { |e| e[0] = 1 } # たった256要素も変更できない NoMemoryError: failed to allocate memory from (irb):3:in `[]=' from (irb):3 from (irb):3:in `each' from (irb):3 from :0 ソースを読むだけの気力も能力もないので適当なことを言わせてもらうけど 配列をブロックに小分けするようなことはしていないようにみえる。 ガチガチの配列ならともかく、RubyのArrayってどこにでも追加削除可能な 万能コンテナみたいだから、内部的にはある程度の長さのブロック(配列)と ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。 それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?
>配列をブロックに小分けするようなことはしていないようにみえる。 その通り。 >ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。 >それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな? たぶん、ちゃんと検討されたことはない。でも、 - この最適化で速くなるRubyプログラムは少なそう(多いというなら説得が必要) - わずかだろうけど遅くなるプログラムは結構ありそう(添字アクセス) - 配列がflatなメモリだと期待している拡張ライブラリ(非常に多い)が動かなくなる というあたりから、標準のArrayに組み込むのは微妙かなあ。 SparseArrayみたいな別ライブラリがいいと思う。やるとしたら。
java で、 Vector → ArrayList さらに LinkedList や CopyOnWriteList と、言語のバージョンが上がるごとに List の派生クラスが増えていったように Ruby も Array の派生組み込みクラスが作られていくかな? Ruby の文化からすると、あまりそういうことはしなさそうだけど。
>>425 422じゃないけど、Rubyの場合は
基本的に変数はすべて参照になっているって事でいいのかな。
irb --prompt simple
>> a = [1, 2]
=> [1, 2]
>> b = a
=> [1, 2]
>> a << 3
=> [1, 2, 3]
>> a << 4
=> [1, 2, 3, 4]
>> b.size
=> 4
>> b
=> [1, 2, 3, 4]
この場合、aとかbってのはただのラベルで配列の実体は別の場所にあるってことでいい?
> 基本的に変数はすべて参照になっているって事でいいのかな。 いいと思うけど、俺にアンカーつける必要なくない? 他にもいい人はたくさんいるよ
428 :
422 :2009/04/15(水) 08:15:18
>>423 組み込みオブジェクトの内部表現が変わってもスクリプト側には
影響ないと思ってたんだけど、拡張ライブラリが駄目なのか。
>>424 の言うように派生クラスにするか、Arrayを初期化するときに
内部実装を選択するヒントとかパラメータを指定できるようになれば
面白いかなって思ったんだけど。
>>425 これ、Ruby Hacking Guideってやつだよね?
Webで見れたとは、こりゃありがたい。
後でゆっくり読ませてもらうわ。
初心者スレだったんだっけ
>>426 オブジェクトを「捕まえる」「入れておく」ことはできない
名前で参照するしかない
変数に対する = は、"右辺" の指すオブジェクトに新たなラベルをつける行為で、本当は「代入」ではない
irb> a = [1, 2]
irb> b = a
irb> a << 3
irb> p (a.object_id == b.object_id)
true
で、スレ的にもこれだけでいいと思うんだが、こっからがめんどい
irb> a = [1, 2, 3, 4, 5]
irb> p (a[0..2].object_id == a.object_id)
false
a と a[0..2] は違うオブジェクトなので、
[1, 2, 3, 4, 5]
と
[1, 2, 3] ← a[0..2] が返す、できたてほやほや配列
という2つの配列オブジェクトが(Rubyの「オブジェクト置き場」に)存在しているように感じるが、実は
[1, 2, 3, 4, 5] <共有済>
と
<注: id:3324 の配列を共有、0要素目から2要素目までを返す、ただし、破壊的変更が来たら配列内容をコピーして保持する>
という、1つの「share された」配列と1つの「share した」配列になってる
これらは自分が share 関係にある配列と自分が share 状態であるということを覚えていて、破壊的変更が自分に来たら share 関係にある配列にそれを通知する
通知または破壊的変更がきた場合の動作は
・ 自分が共有元(a)である場合は share 状態を解除し普通の配列に戻る(破壊的変更を自分が受けていた場合は受け付ける)
・ 自分が共有先(a[0..2])である場合は共有元の要素の参照をきちんと複製して share 状態を解除し普通の配列に切り替える
ということである、というようなてきとーな理解でいいか
>>421 array.c を読めばなんか書いてあるのかね
この最適化が入ることで、逆にそれ以外のところが遅くなるはずだが、 配列って部分参照することってそんなにあるっけ?
>>429 ん、単純に
[ <id:0011>, <id:0013>, <id:0015>, <id:0018>, <id:0411> ]
という普通の配列と
[ a[0], a[1], a[2] ] # a が変更されたらオブジェクトIDの参照に切り替えること
の関係になるという話なんじゃないの?
や、こんな 2段階やるくらいなら最初から [ <id:0011>, <id:0013>, <id:0015>] という配列作っとけよ、という感じではあるんだが
お、おまいらここは初心者スレだぜ( ´ー`)y─┛~~ コウドナワダイデビビラスナ
>>431 オブジェクトにラベルを新たに付けるという行為が、
配列をインデックスで参照するように指定するという行為よりずっとコストのかかる行為であった場合には、
[ a[0], a[1], a[2] ] のほうが有効だと思われ
ホントのとこはどうなのかは知らない
また仕様バグか
require 'benchmark' a = (1..1000000).to_a Benchmark.bmbm do |bm| bm.report('a に追加'){a.delete_at(0); a.push("s")} end a = (1..1000000).to_a Benchmark.bmbm do |bm| bm.report('部分参照して追加'){a[1..-1].push("s")} end 結果: user system total real a に追加 0.050000 0.000000 0.050000 ( 0.048458) user system total real 部分参照して追加 0.050000 0.010000 0.060000 ( 0.053062) 破壊的変更した際に別に遅くなるとも思えんのでバグではないな 部分参照だけをした場合が笑えるほど速いので問題は無い …まあ、push しただけなのにdeleteとpushの2段階と同レベルの処理速度に落ちるということ自体 コードの見かけと実際の関係上あまりよくないという観測もなくはない気もするが (つまり、「共有の配列」から「本当の配列」に変換される、Rubyの裏側の動作がかなりごっつい)
>>436 残念
遅いのは delete_at の部分
share の部分配列を通常の配列に変換する、というのは、
配列から要素を削除して詰める、という行為と大して変わらない
ちなみに、これがわりと速いぞ
a2 = Array.new
a2.push(*a[1..-1])
配列の一部分を得たい場合は配列のスライス arr[s..e] を使うほうがいい、ってことだな
438 :
デフォルトの名無しさん :2009/04/15(水) 12:41:21
エラーが出ても処理を止めず、最後まで実行するようにしたいのですが、どうすればよいでしょうか?? PHPのようにブラウザで実行したとき、エラーメッセージをエラーが出た部分に出力するようにしたいのです。 begin とか rescue を使えばできるのかな?と思っているのですが・・ ご教示頂けると幸いです。
>>438 エラーが出たってことはそれ以上処理ができないということ
で、まあ、使ってるフレームワークのヘルプでも読め
処理中に起こって止まる原因となった例外をWebブラウザ上に表示させる方法がたいてい載ってる
440 :
デフォルトの名無しさん :2009/04/15(水) 13:24:30
レスどもです。 PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね?? rubyだとエラーが発生したあとの処理はどう頑張ってもやってくれないということでしょうか?
とりあえず、いきなりCGI作るのやめろ RubyはCGIを特別扱いしない 普通のコンソールのスクリプトでどういうことができるか勉強してからCGIやれ きっとそっちのほうが早い
PHPはWebブラウザから入力してWebブラウザに出力する特化型言語だからなあ… > PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね?? いいえ
PHPのエラーってWarningのこと言ってるの? それ以上処理できなかったらPHPだって止まるよ
444 :
440 :2009/04/15(水) 14:50:12
あそうか、warningの時は続けて実行してくれるけれど、fatal error の時はPHPでも止まるのか・・勘違いしてました、すいません。 ありがとうございますm(_ _)m
klassってなんですか><
klassの部分をclassに修正してみれば分かるよ
447 :
426 :2009/04/15(水) 19:57:26
遅レスだが
>>429 だいたいその理解でおk
細かいこというと、共有元を破壊的に変更する場合は、シェア状態を解除
するのではなく、複製してそっちを指すようになる。つまり共有先と同じ
>>431 ,434
ちがう
449 :
デフォルトの名無しさん :2009/04/15(水) 23:01:12
このスレってmatz, yugui, yarv, shugoさんとかが名無しで答えてたりするのかなぁ
少なくともよく答えてることはまずないと思う。 1〜2週間スレを見てればわかる。答えてたら失望するわ、おれ。
ここまでMatzの自演
こんな金にならないスレに顔出すより、 ブログに何か書く方が大事だろw
453 :
デフォルトの名無しさん :2009/04/15(水) 23:34:02
しかし、こういう立場のひとってブログに大きな態度で書けないよな。 リーナス君のようにならないことを祈る。。
どっちもどっちのような
内容見ずに態度見るような馬鹿を気にしてもしょうがないよ。 有名になると、何書いたって行為と悪意を両方増やす結果になるし。
×行為 ○好意
>>449 Ruby1.9には2ch bot yarvを新装備!
RSpec で、 hogehoge.rb に対して hogehoge_spec.rb を作ったら、シェルの補完で hog <Tab> と打って hogehoge.rb が一発で出るとかそういうのが阻害されてしまうから不便だ、という話をしたら spec ファイルは spec/ ディレクトリにまとめて入れろバカ というツッコミが来た 知らんかった でもこれって spec ファイルのほうからどうやってオリジナルのスクリプト読むん?
>>458 > spec ファイルは spec/ ディレクトリにまとめて入れろバカ
Rails on Rails の流儀だな
spec ディレクトリは自動で追加される環境の人だ
自力でどうにかできるものではないので、Rails で作ってないなら無視してよし
一応 File.expand_path とか File.dirname(__FILE__) とか駆使したファイルパスを require するようにすればなんとかなるとは思うが
>>458 俺の場合は __FILE__ を基準にして、他の場所のオリジナルを読むようにしてる
たとえばlibディレクトリなら
Pathname.new(__FILE__).dirname.parent.parent + 'lib'
で探す
RSpec使ったことないけど 補完の問題だけを考えるとspec_hogehoge.rbにするのはどうか?
>>458 $LOAD_PATH << ".." << "../lib"
require 'spec'
require 'hoge'
...
オフィシャルなファイルと被るファイル名の自作ファイルがあると動作しないのが難点だが、
require はまあそもそもそんなもんだな
ただ、下手に lib/ と spec/ があると、Rails の auto_spec.rb とか
なんかあのへんが動作すると期待されてしまうかもしれない
>>461 一応、spec/*_spec.rb というファイルをまとめて実行して
一気に lib/ 内のファイルのテストを試すサポートプログラム(autospec)が存在するので、
いつか自動テスト実行を覚えた時用に hogehoge_spec.rb という名前であったほうが好ましい
が、一人で使うぶんには spec_hogehoge.rb にしておくのがいちばん無難だな、めんどくさくないし
>>458-459 別にRails流ってこともないだろ。
Gemsとかつくる前提のときも spec/ に入れるのが一般的だし、
autotestも標準で spec/以下 と lib/を関連付けて見てくれる。
といっても、慣例でしかない気がするけど
>>458 $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
とかかな。
いちいち書くのめんどくさけりゃ
>>464 のいうautotestや、
Rakeにspec/rake/spectaskのSpec::Rake::SpecTaskを使って
テスト実行を肩代わりしてもらう。
この二つはデフォでは spec/*_spec.rb を相手にするから
たかが慣習、されど慣習と。
ねーよw
ファイルのロックを File#flock でなく IO#fcntl で実装しようかと思ったんですが、 これシステムの struct flock に依存するから簡単には portble に書けないですかね?
どこまでのポータビリティを求めてるのかによる。 Windowsとか言い出すなら問題外。
あ、rspec の、エクスペクテーションの should をまとめたいと思ってメソッド定義するよね あれってどこに書くべき? before で作ったインスタンス変数が読めなかったり def で定義したメソッドが見えなかったりでどこがどう妥当なのかよくわからん
>>469 何を言いたいのかよく分からないが
it (specify) を、複数の ExampleGroup で共有したいって事なら
share_as メソッドを探すと幸せになれるかもしれない
…たぶん、 describe Hoge do before :all do @val1 = ... ; @val2 = ... # (1) end (2) describe "#foo" do matomete_val_tesuto end end としたいときに、 def matomete_val_tesuto を (1) に書くか (2) に書くかって話なんじゃね (1) に書いたら describe "#foo" の中では使えないはず (2) に書いたら @val1 にアクセスできんな
setter の返り値について質問 a.hoge = b.hoge = value みたいな書き方ができるようにしようと思うのですが、 def hoge=(value) @hoge = validate(value) @hoge end と def hoge=(value) @hoge = validate(value) value end ではどちらがいいでしょうか? 場合によって value != validate(value) となります。
> a.hoge = b.hoge = value みたいな書き方ができるようにしようと思う そういうのやめとけ めんどくさいから ちなみに、 = つきメソッドは引数を返すように作られていることが期待されてる つまり、 def hoge=(val) @hoge=val end だ
前者をよしとする人はいないんでないの a=b=c が a==b==c にならないのはバグの元だし オペレータオーバーライドの悪い点をわざわざ利用する必要はないよ
今調べたら、セッターとして使うと引数が問答無用で返って、 sendで呼ぶと返した値が返る
>>475 うわあこれ知らんかった
今まで引数の値をわざわざ返してたのにー
…。 いや、なんつーか、 hoge = 1 の返り値は 1 だというのは知ってるよな def set_hoge @hoge = 1 end これの返り値は 1 だし、attr_* 系で作られる hoge= みたいなメソッドも引数を返す
478 :
472 :2009/04/17(金) 00:48:14
皆さんレスありがとうございます。
>>475 >今調べたら、セッターとして使うと引数が問答無用で返って、
ほんとだw
そもそも返り値を選択できなかったとは……
def hoge=(value)
return
end
でも引数が返ってきました。
setter の呼び出しは処理系が特別扱いしてるんですね。
[ruby-core:00637]より。 |If an assignment method which doesn't return an argument is not |intuitive, why don't ruby force it? Agreed. Last time I thought that, I was too lazy to modify compiler itself, and then forgot. I will fix it someday. だって。
480 :
472 :2009/04/17(金) 02:25:15
>>479 なるほど。
その結果として 1.8 では setter の戻り値を破棄して
引数を返すように変更されたと
確認してみたらピッケル本にもそのことがちゃんと書いてありました(言語編 p76)
>>477 バーカ
というかお前322と似てるな。バカ具合が
わざわざ終わった話題に安全圏から罵倒、というのはつい最近どこかで
クラスメソッドのエイリアスはどうやって定義しますか。
class Hoge def self.hoge ; end class << self alias hage hoge end end これ以外の方法知らん。他のやり方があったら教えて。
>>484 alias メソッドを使うとしたらそれくらいしかなさそうだな
あとは普通に self.hoge の中で self.hage を呼ぶしかあんめえ
alias_methodを使うというひねりもできるが、メタクラスを使う以外の方法はない。
rubyでcgiを作ろうと思います postを受け取るにはどうすればいいですか
>>487 他の言語でpostを受け取るのと同じ方法でできます。
>>487 単純には、標準入力に環境変数CONTENT_LENGTH長だけ入ってる、はず。
マルチパートやらデコードやらいろいろあるので、ライブラリを使うのが吉。
どのライブラリをどんな風に使うのがいいのかは、詳しい人を待って(オイ)。
>>488 うん、変わらんな
というか一度は自力でPOSTとか全部やってみたほうがいいと思うんだ
>>487 標準で cgi というライブラリがあるからそれ使え
自力で外部ライブラリをインストールしてもいい環境なのなら、
rubyforge から cgialt をインストールしてそれを cgi 互換ライブラリとして使え
他にもいくつかあるが、cgi ライブラリの使用経験とかを前提にしてたりするんで、最初は素直に cgi ライブラリ使え
rubyのcgiはかなりアレ。
>>468 メジャーな UNIX (Linux, *BSD, Solaris あたり) で動けば十分なんですが、
Google ソースコード検索や Koders でも Ruby の fcntl の用例が少ないみたいなんで
Ruby Inline か拡張ライブラリで fcntl(2) を直接使うことにします。
>>492 IOクラスにfcntlメソッドがあるので、わざわざそんな難しい方向に行かんでもええよ
指示代名詞も知らないゆとり乙
>>493 491じゃないが、仕様と実装が残念だった。
1.9系で後者は改善されたけど。
>>494 その IO#fcntl ですが、例えば file.fcntl(Fcntl::F_GETLK, arg) するとき、
arg には struct flock に pack したものを指定する必要があるのですが、
struct flock にどんなメンバがあるかは Ruby レベルからは知り得ないので、
やっぱり C で書く必要があると思うのです。
>>497 なんだ、そんなレベルのポータビリティでいいのか。
初心者に標準添付以外をいきなり勧める人って何なの
今ならgem install rackするだけだろ? rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて 茨の道を歩くのは覚悟してもらわなきゃ
> rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて 海外の開発系カンファレンスに何度か出席しているが、 どうみても日本より海外の方が、Ruby の関心が高い。 むしろ日本人は「Ruby 出来ない子」が多い、と感じる。
> 海外の開発系カンファレンス そういうやつらは「寿司、天ぷら、藤山、芸者」の日本好きの変わり者geekだろ。 狭いコミュニティに閉じこもって「関心が高い」じゃないだろ。 目を覚ませ。もう戦争は終わったんだ。 今は蛇言語でgwtの時代なんだよ。
せめてこのスレでは、Ruby初心者に有益な情報を書くように心がけられないもんかね Pythonがいいよってのも、Rubyのことを聞きに来た人間を迷わせる効果しかないと思うんだがね アンチは本スレでもアンチスレでも行けばいいんだ。 初心者スレにまで顔出すことはなかろうに。本格的に人間性を疑うわ。
カンファレンスは知らないがおれもそれは感じる。 新しいバージョンとかでつまづいたときググると、 役に立つのは大抵海外のサイト。向こうの方が精力的にやって気がする。 2ちゃんなんてRubyスレ全般で「1.9は使うな」だもんな。 2ちゃん見てる時点でアレだろと言われたらそれまでなのだが。
裸で冬山に特攻する初心者がいれば「行くな」とも言いたくなるわな
>>505 お前英語苦手だろ
英語で書いてあるというだけで凄いって思ってるだろ
海外の人だって「初心者」は Ruby 1.9 を使ってない
Vimで入門始めたけど、アホらしくてNetBeans入れてみた 信じられないくらい快適になった
>>507 別に得意じゃないけど英語だけですごいなんて思わないだろ。小学生かよ。
新しいことに関して日本のサイトはほとんど引っかからないし、
読んで実際に解決することが多いからそう思う。
あと「Rubyスレ全般」ってわざわざ書いてるんだからちゃんと読んでな。
たった5行なんだからさ。初心者スレに限定してないだろ。
日本人はRuby初心者が多い印象がある 外国人の人にとってのRubyは日本人にとってのPythonくらいの「詳しい人向け言語」な感じ
ruby-talk読んでるが、初心者らしいというかほほえましい質問が半分くらい(たいかん)
詳しい人はこんなところこないと思うよ 前にmswinの人がキレてたじゃん わざわざ顔出して見ず知らずのしかも自分の足下にも及ばないようなやつに、 口汚くレスされたりしてストレスためる必要ないだろ あと日本のRuby好きはRubyで何か作るというよりも、メンテナとかをやるのが好きなのかもね
ゴルフやってるんじゃねーの
514 :
デフォルトの名無しさん :2009/04/18(土) 11:16:09
month = 4 などの数字が入ってるとき、これを to_sなどで "04"という風に変換したいんですが、どうすればいいですか? month = 11 のときは、"11"です。 どうかお願いします。
'%02d' % 2 => "02" '%02d' % 11 => "11"
もしくは $ irb irb(main):001:0> sprintf("%02d", 4) => "04" irb(main):002:0> sprintf("%02d", 11) => "11"
MySQLをDBIを介して使おうとしているのですが、 テーブル名一覧を取得する方法をお教えいただけないでしょうか? dbh = DBI..connect("dbi:Mysql:test:localhost","user","password") table_names = dbh.execute("SHOW TABLES") p table_names とやると全然違うものが出力されてしまいます。 すいませんが、お教えいただけますでしょうか?
聞くときだけは丁寧だな。がんばれよw
519 :
517 :2009/04/18(土) 16:44:37
自己レスです。 結局DBIを介して行う方法はわからなかったので、Ruby/MySQLで接続して行いました。 require "mysql" dbh = Mysql::new("localhost","username","password") dbh.query("use database") p dbh.list_tables これで取得できそうです。
FreeBSD 7.1-RELEASE-p4 で irb 使ってます Delete キーを押すと ~ が表示されるんですが、同じような症状をさくっと治したという方はいませんでしょか csh 上では普通に後ろの文字が消えます
端末は何を使っとるん?
ええと、アプリケーションは Windows 上の PuTTY で、端末文字列は xterm-color 、 csh から bash を起動して C-v したあとに Delete キーを押すと ^[[3~ が表示されてます(csh 上ではどうやるんだろう?) screen 等は(まだ)使ってません 接続先は具体的にはさくらインターネットのレンタルサーバです なんか Ruby あんま関係ないような気がひしひしとしてます
irb を起動するとキー操作の動作が違う、という場合はいちおう Ruby スレの範疇だと思う まあ、irb 自体が独自に何かやってるわけじゃないけどさ
>>522 自分もさくらのレン鯖契約しているのでやってみた。
ログインシェルが csh なので、bash にしたあとで irb 起動してみたけど、
C-v したあとだったら delete キーを押すと再現したけど、
C^v しなければ、irb のプロンプト中に delete キーを押したら、ちゃんとカーソル位置の文字が消えたよ
C-v って何のためにやっているの?
C-vは、つぎの入力文字を視覚的に表示する機能では?
526 :
521 :2009/04/19(日) 00:31:07
>>525 C-v って vi のと同じように、次の入力をキーコードそのまま入力する機能だと思う。
PuTTY が Delete で吐くキーコードが 1b 5b 33 7e ってことだよね。
FreeBSD 7.1-RELEASE-p4 & PuTTY 0.60 ごった煮版 2007年8月6日版だけど、
カーソル位置の文字が消えた。
もし Readline を入れてなければ入れて、
それでダメなら ~/.inputrc に↓コレ書いてみて。
"\e[3~": delete-char
527 :
デフォルトの名無しさん :2009/04/19(日) 02:37:16
RubyのDBIを使おうとしているのですが、 $ irb irb(main):001:0> require 'dbi' => true irb(main):002:0> DBI.connect('dbi:mysql:test','root','root00') DBI::InterfaceError: Could not load driver (undefined local variable or method `e' for DBI:Module) from /usr/local/lib/site_ruby/1.8/dbi.rb:312:in `load_driver' from /usr/local/lib/site_ruby/1.8/dbi.rb:154:in `_get_full_driver' from /usr/local/lib/site_ruby/1.8/dbi.rb:139:in `connect' from (irb):2 となってしまい、うまくコネクトできません。ドライバはインストールしたつもりなのですが、 何か間違ってるでしょうか?
528 :
527 :2009/04/19(日) 02:50:31
mysql-ruby-2.8.1.tar.gz をインストールしたらできました。 DBIだけじゃなくて、Ruby/Mysqlのドライバもインストールしないとだめなんですね。 失礼しやした。
529 :
464 :2009/04/19(日) 08:50:34
連投規制で書き込めなかった
>>464 の
> autotestも標準で spec/以下 と lib/を関連付けて見てくれる。
は、厳密には間違いで、rspecに含まれる autotest用のプラグイン?が spec/とlib/を関連付けてみてくれる
>>469-471 spec_helper.rb(か、もしくはそこからrequrieする.rb)内でshare_asで定義して、includeするとか
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]を使用しています open("|")(I/Oパイプ付)で起動した外部プロセスを強制終了する事ってできますか? 外部コマンドの結果でその後の動作を変えるようなことをしていますが 大体の場合全ての結果を受け取らずとも判定が出来るので 判定が出来た時点で外部コマンドを強制終了して判定にかかる時間を短縮したいです
>>530 IO#pid で外部コマンドの pid が取れるみたいね。あとは
>>531 の通りで。
UTF8のBOMを含むStringからBOMを取り除く方法は?
iirb> require 'kconv' irb> text = File.open('test.txt'){|f| f.read} => "\357\273\277test\ntest\ntest\n" irb> text.toutf8 => "test\ntest\ntest\n" まあ、ある意味盲点ではあるな
盲点ってかただの副作用では そういうのこそ、メソッドを用意すればいいのに
というよりは、 BOM 無し UTF-8 を出力する、だね
BOMについては特につけることも取ることもしない、というスタンスなんだっけか
.toutf8もNKFも、余計な変換をしそうで怖いです。 やりたいのはBOMを除くことだけで、変換とかいっさい必要ないんですが。 あと、BOMを含むかどうかの判定方法もお願いします。 今は str.unpack('H6').first == "efbbbf" としてるんですけど、どう考えても頭悪い方法です。
BOM = "\357\273\277" str[0,3] = "" if str[0,3] == BOM str.sub(/\A#{BOM}/, "") こういうのでいいんじゃない?
str.sub!(/\A\xEF\xBB\xBF/, '') あたりで
Ruby 1.8.7以降だとString#start_with?ってのがあるからそれで判定しても
自分でString#bom?とか適当なメソッドを定義すればいい 表面上スマートに見えても内部は泥臭いなんて当たり前
545 :
530 :2009/04/21(火) 00:17:20
>>531-532 レスありがとうございます
やってみました…が、外部プロセスの実行が終了したあとにI/Oパイプが開いている気が…
io.each_lineで読み出し中にProcess.kill(9, io.pid)しても実行時間が変わりません
仕様かな…
>>545 io.closeするだけで良いんじゃね?
require したファイルの一覧って取得できますか
自己レスですが
>>547 $LOADED_FEATURES というのがあるらしい。
マニュアルは読んでみるものですね。
549 :
464 :2009/04/21(火) 12:39:37
riに失敗してしまうのですが、これはどのようなエラーでしょうか? 回避する方法はありませんでしょうか? > ri String#lines (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:532:in `lookup_ancestor': undefined method `+' for nil:NilClass (NoMethodError) from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:610:in `run' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `loop' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `run' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `each' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `run' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:311:in `run' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/bin/ri:5 from (ruby installed directory)/bin/ri:19:in `load' from (ruby installed directory)/bin/ri:19 > ri --version ri 2.2.0 >ruby --version ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]
550 :
549 :2009/04/21(火) 12:46:51
名前の464はミスです。キニシナイでくだしあ
gemで自分でriを入れたのか。 それを消せばいいんじゃね?
1年前のスクリプトを眺める …ライブラリそのものをナチュラルに継承すんな、っていうか重要メソッド上書きすんな ライブラリのオブジェクトをインスタンス変数に保持してメソッドを依頼するラッパー操作クラス作るだけで十分じゃねーか 来年には「この改造無駄だったなー」と思えるようになるのだろうか
家庭用プログラムのテスト駆動開発とかなんかそのへんでしつもん a というメソッドを作ってる最中に、その中の特定の処理を a' というメソッドに分けたとして、 def a aaaaa bbbbb ccccc ... ↓ def a' bbbbb ccccc end def a aaaaa a' ..... その a' についてのテスト項目は作るほうがいい? それとも、 a についてのテストをちょこっと詳しくする程度で、a が完動したことをもって「隠して」おくのが普通?
「普通」がまだ決まってない。 テストしろ、とかpublicなメソッドのテストがパスしてるんだからおkとか、 モックとかスタブとか使えば、とか。
privateなメソッドはそもそもテストできないようなテストフレームワークもあるような?
テストしまくり中はメソッドのアクセス制御は敢えてしないと思うんだが ユーザーからの隠蔽だけが目的の場合(つまり大多数の場合)はふつうにめんどくさいじゃん?
>>553 基本的には作らないが、他のメソッドからも使う(ような気がする)場合は仕様書的にspecファイルに書く
return するものがたくさんあるようなメソッドにうっかり育ててしまった場合もやっぱ書く
最初は全部書いてたんだけど、describe がメソッド 1個に対応するような使い方をしてると引数とかで正直非常にめんどい
558 :
549 :2009/04/22(水) 07:43:36
>>550 うは。確かにgemのrdocに入っているんですね。
gem update rdocしたらエラーでなくなった!!
でも…
> ri String#lines
Updating ri class cache with 5126 classes...
Nothing known about String#lines
うーん。こういうことって普通にあるの?
gemのrdocのriが駄目かと思ってrdoc消してみたら、
>ri String#lines
(ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:805:in `report_
activate_error': Could not find RubyGem rdoc (>= 0) (Gem::LoadError)
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:24
3:in `activate'
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:50
:in `gem'
from (ruby directory)/bin/ri:18
orz
インスタンス変数へのアクセスと、クラス変数へのアクセスと、ローカル変数へのアクセスを 速い順にならべるとどうなりますか。 クラス変数へのアクセスはだいぶ遅そうだとは思いますが、インスタンス変数とローカル変数へのアクセスにどのくらい違いがあるのか知りたいです。
>>559 これが速度に影響するような用途のプログラムであるなら、Rubyで作らないほうがよい
ブロックつきメソッドとか使われてたら奇声上げてキーボード投げつけるレベル
ちなみに
アクセス遅い アクセス速い
クラス変数 > インスタンス変数 > ブロック外のローカル変数 > ブロック内のローカル変数
こんな順番だったと思うが、どっかに言及があったはず
tips: Hash[:symbol] > Struct > Hash["string"] >>>>>(越えられない壁) >>>> OpenStruct
>>562 例えば、これでどう?
require "securerandom"
p SecureRandom.uuid
def uniqid(prefix = "", more_entropy = false) id = "%s%x" % [prefix, Time.now.to_f*1_000_000] id << ".%.8d" % rand(100_000_000) if more_entropy id end
>>563 SecureRandom.uuidは1.8.7じゃ使えないからなぁ。
require "rubygems"
require "uuidtools"
p UUID.timestamp_create
>>564 「赤毛のアン」が検出されるんだが・・・?
Rubyも赤いからいいんじゃない?
そんな「Ruby界隈」は知らない。
>>570 気を悪くしたらすいません。
なかなか見やすいと感じたので気になっているのです。
>>571 気を悪くしたんじゃなくて、それが流行ってるのは「Ruby界隈」と言えるほど広い世界でもないし中心に近くもないだろ、と。
で、その辺の人たちはKeynote使ってるんじゃないの。
もしかして、「高橋メソッド」のことを言ってるとか?
>>569 このプレゼンはおもしろかった。
このなかで Rails は「ちょっとしたことをやるには大げさ」とあるが、
自分は Java → Ruby ときたけど、Java の web フレームワークに比べれば
Rails はずっと軽くて楽だと感じる。
この sinatra というのは、流行っているんですか?
最近名前聞くねぇ。 使ったことないというか、そっち方面は全然手がけないんだが。
Winでファイルのアーカイブフラグが立っているかを判定したり フラグをセットしたりするのってどうやるの?
>>576 File::Stat に見当たらないということはサポートされてないのかなあ
自分には Win32API の GetFileAttribute/SetFileAttribute を呼ぶくらいしか思いつかない
標準では無いよ gemのWindowsファイルシステム操作ライブラリで見た覚えがあるので適当なの使え
win32-fileにあったと思う
rubyscript2exeが動かなくなってしまいました。非常に困っています。 何か解決策はありませんでしょうか? > rubyscript2exe test.rb Tracing test ... Gathering files... c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:60:in `gatherlibs': undefined method `list' for Gem::Specification:Class (NoMethodError) from c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:30 from test.rb:1 hellow Couldn't execute this command (rc=256): d:\software\ruby\bin\ruby -r 'enumerator.so' -r 'rubygems/rubygems_version.rb' -r 'rubygems/defaults.rb' -r 'thread.so' -r 'thread.rb' -r 'etc.so' -r 'rbconfig.rb' -r 'rubygems/exceptions.rb' -r 'rubygems/requirement.rb' -r 'rubygems/version.rb' -r 'rubygems/dependency.rb' -r 'rubygems/gem_path_searcher.rb' -r 'rubygems/user_interaction.rb' -r 'rubygems/platform.rb' -r 'rubygems/specification.rb' -r 'rubygems/source_index.rb' -r 'rubygems/builder.rb' -r 'stringio.so' -r 'yaml/error.rb' -r 'syck.so' -r 'yaml/ypath.rb' -r 'yaml/basenode.rb' -r 'yaml/syck.rb' -r 'yaml/tag.rb' -r 'yaml/stream.rb' -r 'yaml/constants.rb' -r 'rational.rb' -r 'date/format.rb' -r 'date.rb' -r 'yaml/rubytypes.rb' -r 'yaml/types.rb' -r 'yaml.rb' -r 'Win32API.so' -r 'rubygems/config_file.rb' -r 'rubygems/custom_require.rb' -r 'fileutils.rb' -r 'rubygems.rb' -r 'ubygems.rb' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1' -I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/bin' -I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/lib'
-I 'd:/software/ruby/lib/ruby/site_ruby/1.8' -I 'd:/software/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt' -I 'd:/software/ruby/lib/ruby/site_ruby' -I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8' -I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8/i386-msvcrt' -I 'd:/software/ruby/lib/ruby/vendor_ruby' -I 'd:/software/ruby/lib/ruby/1.8' -I 'd:/software/ruby/lib/ruby/1.8/i386-mswin32' -I '.' -I 'd:/home/test/ruby/' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -r 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb' 'test.rb' Stopped. > ruby --version ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] > gem --version 1.3.2
undefined method `list' for Gem::Specification:Class (NoMethodError) Gem::Specification.listメソッドはgem 1.3.1になら存在する。 1.3.2では削除されたようだ。 gatherlibsを修正するか、gemコマンドをダウングレードする。 そしてrubyscript2exeの開発元に連絡をする。
x Ocraそこそこコンパクトな上に、起動が早くてよさげです。 o Ocraそこそこコンパクトな上に、exe化したプログラムの起動が早くてよさげです
どうして、ruby -pの後のgsubはレシーバが省略できるのですか? いつも使ってて便利だなあと思ってるけど不思議に思ってます。 ruby -p -i.bak -e'gsub(/hoge/, "fuga")' data.out
>>586 関数的メソッド gsub が呼ばれているだけだ(こいつは $_ をレシーバとして扱う)
String#gsub が直接ワンライナー用にいじられて呼ばれているとかそういうわけではない
588 :
デフォルトの名無しさん :2009/04/25(土) 08:35:56
class SomeClass @@message = "call myself Mr.#{@name}!" def initialize(name) @name = name end end このまま@@messageを参照すると、@nameが未定義の段階で定義しているため出力は"call myself Mr.!"となります。 このように後で@nameに値が入ったとき(あるいは変更されたとき) @@messageを参照する段階で@nameを再度当てはめるとしたら、どのように書けばよいでしょうか。
クラス変数を使わない いやわりとマジで 特定のインスタンスの状態に左右されるクラス変数というのは奇妙 特定のインスタンスの変数を参照する大域変数というのはそれは普通インスタンス変数にする というか、@@name を initialize の中で毎回変更してそれを @@message で参照するという形ではダメなん?
590 :
588 :2009/04/25(土) 09:24:21
>>589 ありがとうございます。た、たしかに言われてみたら使い方もちょっとおかしいし、
そもそもクラス変数でやってたのがよくなかったんですね・・・
試しに@@messageをメッセージを返すインスタンス"メソッド"にしてみたら問題なく置き換えられました。
なお試してみますm(_ _)m
591 :
デフォルトの名無しさん :2009/04/25(土) 17:51:40
はじめまして。困ってます;至急お願いします。 Rubyをはじめようと思うのですがどうすればいいかわかりません。 まず公式HPに行ってもどれをダウンロードすればいいかわかりません。 ソースコード以外に実行ファイルが見当たりません。 何かをインストール等する必要はないのですか? 僕はパソコンは上級者と言ってもいいほどなんでもできるのですが ここまでわけのわからないことは初めてで焦っています。 まずルビーのプログラムを書く段階までのやり方を教えてください。
またそんな玄人的なネタを投下してw
初心者だから教えてくれ、という意味? それは唯の対処療法で根本的原因の解決ではない。 頭痛がするから薬を使って誤魔化すのと同じこと。 また困った時に同じように薬使ってごまかすのかな。 使い方はそこらへんに結構転がっているよ。 自分の環境構築するのも技術の一つだよ。
いや、上級者だといってるだろ
595 :
デフォルトの名無しさん :2009/04/25(土) 18:09:52
もしかしてメモ帳で書く、ということですか? エディターみたいなものは公式サイトで配布していないのですか? 他の候補で見ていたC#なら公式サイトでMicrosoft Visual Basic 2008 Express Editionというのが配布されていました。 簡単に作りたかったのでRubyを選んだのですが本当に困っています。 小さいころにHSP(Hot Soup Processor)をやったことがあるのですがそこの公式サイトでもエディターやテストするためのものが公式サイトで配布されていました。 僕は今そのようなものを探しているのですが見当たりません。 そのようなものは存在しないのですか?
>>591 > ルビーのプログラムを書く段階までのやり方
1.エディタを用意します。なんでもいいです。目的はテキストファイルを作成することです。
例えばMS-DOSに馴染んでいれば、最悪
copy con hello.rb
なんてのでも大丈夫です。
2.思う通りのるびーのプログラムを書いたら、その内容をテキストファイルとして保存して下さい。
※ 上記の2は、書くまでの段階では必要ではありませんので、飛ばしても結構です。
以上です。
598 :
デフォルトの名無しさん :2009/04/25(土) 18:17:09
>>593 さんの書き込みをヒントに「ruby 開発環境」と検索したところ
RDEというエディターを見つけました。とりあえず解決しましたので
回答していただいたみなさまありがとうございました。
IDEがないというのは上級者にとっては最初に焦る事態なのか なるほど
>>599 俺は20代だけど、周りみてると統合環境から入るやつが大半だった
学生の時分とかね
つメモ帳 でよかったのか PC上級者は、プログラムは専用アプリで書くものと思いがちってことなのかな 勉強になった
時代は巡るねぇ。
どっちかというと 下地が分からないからIDEなんだと思う。
紙に書いてパンチカードで打ってた時代があったとか、知識や想像の範囲外なんだろうな デバッグは全部プリントアウトとか そんなの実際には知らんから、もしかして俺騙されてる?
プログラム全体が一望できた時代は、デバッグは全部プリントアウトでも良かったし それの方が効率が良かったんだよ 今はテストケース無しでは不可能だろう、そうするとIDEの力を借りる必要が出てくる。 今ではIDEが使えないのでは上級とは言えないだろう。
用は IDEしか使えないと IDEを使ってる ではぜんぜん違うということでしょ?
「IDEが使えない」と 「IDEがないと何も出来ない」はぜんぜん違うよ。
>>605 だが待って欲しい
それは本当に、まずルビーのプログラムを書く段階まで、に必要な事だろうか
ってあんまりこれ引っ張るのもなw
全部を知る必要も無いって事でもある
パンチカードの思いでをちょっと あれは一瞬で行が入れ替えられる、それを活用したデバッグやトラインアドエラー作業はいろいろと面白い効率の高さがあった。 でもね、あれはCOBOLやFORTRANの時代のプログラムが行単位で記述されているから効率がいいんだ。 今の自由文法でそれは可能だろうか?、否ですね。 今の時代には今のやり方があるって事だ。
先生! make や rake は IDE に入りますか? あるいは、IDE 足り得ますか?
>>610 ていうかプログラミングの形態ではなくて、backgroundはどうなっているか
を理解しているかどうかの話だと思ってた。
背景を追うと、ではどこまで追う気だって話になる、どこかで打ち止めしておかないと、話が進まない。 まあ、中にはC++のように背景無しでは思わぬ罠にはまる、しかもはまっている事に気づいていないなどという恐ろしい言語もあるのですべてとは言わない。
>>611 IntegratedなEnvironmentでないとIDEとは呼べないと思う。
ネタと信じたいと思いつつマジレス、あたりで。
>>591 つ
http://www.ruby-lang.org/ja/downloads/ 1.Windows版(mswin32、mingw)の場合
どこかでバイナリを配ってる
2.cygwinの場合
同じくバイナリ配られてる
3.Mac OS Xの場合
MacPortで入れればOK
4.Ubuntuの場合
sudo apt-get install ruby
5.Debianの場合
su -
apt-get install ruby
exit
6.Fedoraなどの場合
su -
yum install ruby
exit
7.その他Unix系の場合
まずgccやmakeがあることを確認
ソースコードを持ってきて解凍する(やり方はさすがに知ってるだろJK)
configureのあるディレクトリにcd
./configure
make
su
make install
exit
>>617 で、どうやってプログラム書くんですか><
って質問だったりするんだなこれが。
解決済みだし、もういいじゃんw
>>618 初心者スレにはちょっとヤな感じ。自重しよう。
とりあえず、大体皆が同じ認識を持ってることは分かったから なんか嬉しい。
>>618 1.まず適当なテキストエディタ(Windowsなら極論すればメモ帳でもいいが
あとあとつらくなる)を準備しましょう
2.次にこのようなプログラムを書きましょう
puts "Hello, world"
3.これを拡張子rbにして保存しましょう(メモ帳の場合はすべてのファイルにしてから
適当な名前.rbと名前欄に入力)
4.次にこのようにコマンドを入力しましょう(カレントディレクトリはさっきの
プログラムの場所で、rubyへのパスはすでに通っていると仮定する)
ruby さっきのプログラム名
5.すると次のように表示されるでしょう
Hello, world
これでプログラムが実行できていることがわかります
「IDEが面倒」と思ってる人に聞きたいんだけど Ruby開発において、それでもやっぱりIDEが役に立つ場面ってある? 何度か手を出そうとはしたんだけど、その度にやる気が出ず挫折している 「IDEのこんな部分が便利」という点があれば教えてほしい
RadRails使っているよ。補完重すぎるし、候補で過ぎて意味ねえ そんなにすごいいいかって言われると、ないよりマシって感じ。てか重い
RadRailsのいいところ
・GUIでデバッグできる。
・メソッドにカーソル合わせるとドキュメント表示(今は日本語化ける)
・インテリセンスみたいな構文考慮した補完が効く(重い、候補多すぎ)
・ファイル構造をツリー表示
・rake タスクをGUIで選択実行
他なにかあるかなー。文脈非依存の単語補完とかスニペットはテキストエディタでもあるしな。
基本的には、他のIDEと一緒だと思うけど、
全体的にはまだまだ。とりあえず、IDEほしいという人向け。
Visual StudioとかCodeGear(Borland)みたいなIDE想像したら駄目。
あと、
>>624 も言っているけど、静的型言語のIDEみたいな補完じゃない。
インテリセンスとかで高速で補完しまくってガリガリ書いていくのを経験してきた人が使ったら、
たぶんガッカリすると思うよ。
NetBeansはプロジェクトルートに.rb置けないww ので即アンインストールした
あと、クリップボード処理がうんこ。まともにコピー、ペーストもできないIDEワロタ
めちゃくちゃ軽くて初見はすばらしかったんだけどね
RadRails追加。というか、ほとんどEclipseの機能だと思うけど ・インクリメンタルでメソッド選択してジャンプ ・インクリメンタルにファイル検索して開く ・指定ファイルの指定行に飛ぶブックマーク機能 Aptanaの機能も入れるなら、Aptana Cloudと連携してIDEから一発デプロイとかまあ、あるけどさ (でもどうせデプロイはCapistranoとかで書いてるでしょみなさんは)
NetBeansは、autotest対応はよかったな。 autotest/screenみたいに、エディタの下に色つきで表示出る
628 :
デフォルトの名無しさん :2009/04/26(日) 22:43:18
1.8.7とVistaHPという環境でコマンドラインからRubyファイルを実行すると pメソッドもprintメソッドも日本語が文字化けします。 起動オプションで -Ks を指定しても文字化けします。 ファイルのエンコーディングはUTF-8ですがSHIFT-JISで保存し直しても文字化けします。 NetBeansでデバッグすると、printでは文字化けしませんがpだと文字化けします。 何が原因でしょうか?
629 :
ごすけ :2009/04/26(日) 22:59:17
こんばんは。質問させてください。 /*引数(自然数)n(<=1000)の入力に対して1~nの間の素数をすべて求めて、 コンソールに表示するプログラムを作成せよ。(ちなみに1は素数ではない)*/ のC言語でのプログラムの作り方を教えてください。ルートは使わず、なるべくfor文で お願いします。
>>628 Vistaのことはわかんけど、
>NetBeansでデバッグすると、printでは文字化けしませんがpだと文字化けします。
これはしょうがないんじゃないかな。他の環境でも同じだと思う。
-- hoge.rb --
puts 'ほげ'
p 'ほげ'
-----------
$ ruby hoge.rb
ほげ
"¥343¥201¥273¥343¥201¥222"
正確に言うと、これは文字化けではなくて、文字列をバイナリ表記したもの。
p は引数をinspectした結果を表示するけど、日本語を含む文字列だとinspectするとバイナリ表記になってしまう。
array への追加についての質問です。 DBのいくつかのテーブル数分検索し、検索結果を配列に追加したいです。 my_array = [] for table_name in table_names my_array.push = my_func(table_name) end 上記のコードだと、my_func が返す array を、my_array の要素とするので2重の配列になってしまいます。 result = my_array + my_func とすると、 配列の後ろにどんどん要素を追加することができ、これが自分のやりたいことなのですが、 Rubyのリファレンスをみると、array の + は my_array は変更せず、左辺に新しい配列を作成します。 上記の for table_name in table_names は結構なループ量になり、 かつ my_func が返すレコード件数(配列のサイズ)も大きいため、毎回 新しい配列を作って返すのは、コストが高いのではと懸念しています。 そこで下記のようなコードを書きましたが、+ でつなげるのと下記のコードと、 どちらがいいでしょうか? my_array = [] for table_name in table_names result = my_func(table_name) result.each do |val| my_array.push val end end
my_array.concat(my_func(table_name))
634 :
632 :2009/04/27(月) 14:09:10
>>633 ドンピシャです!! どうもありがとうございました。
おなじ Array のマニュアルページに書いてあるのに見逃してしまった。
Singletonをインクルードしたクラスのinstanceメソッドに引数渡せないのって不便くね?
生成時に渡す引数によってオブジェクトの振る舞いが変化するようなものは そもそも Singleton に向かないってことなんじゃまいか? 色々必要ならそんだけクラス作れよと
instanceに引数が渡せるほうが不安だ。
>>635 Singletonをインクルードしたクラスを生成するメソッドを書けばおk
どこで聞いたらいいのかわからんのですが、ここで聞きます。 Ubuntu 8.0 LTSだと apt-getで入るのが Rubyが1.8.6なのですが、1.8.7が使いたいです。 1.8.7使うには自分でコンパイルするしかないのでしょうか? Rubyスレの方がよかったら誘導してください
すいません、Ubuntu 8.0 LTS → Ubuntu 8.04 LTS です
641 :
635 :2009/04/28(火) 13:17:57
ごちゃごちゃやってたら、頭の中がこんがらがってきた。 結局コンストラクタに引数を渡せるようにしたままsingleton化したい場合は、Singletonモジュールは 使わずに、該当クラスのnewメソッドを複数のインスタンスを生成できないように書いてしまえばいい だけ? とか思ったが、何か根本的に間違ってるような気もするw クラスメソッドとしてのnewは明示的に書けてしまうみたいだけど、その場合自分(クラス)のインス タンスを生成するコードはどうやって書けばいいのかな? newメソッドはインスタンスを返すのが 普通だから、それを生成するコードがどうしても必要だよね?
>>640 自前ビルドでRubyを入れると、他のRubyに依存してるパッケージも全て
自前ビルドするか、パッケージの依存関係をごまかすかしなきゃならない。
どちらにしてもすごく簡単ではないけど大丈夫?
>>641 自己レス。
特定のクラスが(自分の定義中で)自分のインスタンスを生成するには、クラスメソッド(たとえばnew)
の中で<自分の名前>.allocateを実行すればいいらしい。(allocate自体はどこからでも呼べる)
ただしそのインスタンスをinitializeするには、(自分の定義中にある)他のインスタンスメソッドを
介さなければならない。
なぜなら、<自分の名前>.allocateの戻り値をinstで受け取ったとするとinst.initializeとしたくなるが、
initializeはprivateメソッドなのでレシーバ省略形式でしか呼び出せず、レシーバ省略形式で呼び出す
には、(クラスメソッドから呼び出せる)publicなインスタンスメソッドの中で呼び出すしかないから。
>>639 >1.8.7使うには自分でコンパイルするしかないのでしょうか?
うんそう。
UbuntsuってDebian系だよね。DebianだとRubyが複数のパッケージに分散していてインストールするのがめんどくさいから、
おれが試した時は自前でインストールするほうが簡単だった。
以下おれの方法。rubyのバージョンごとにディレクトリを分けているので、configureするときに--prefixをつけてる(つけなければ/usr/localになる)。
wget
ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p160.tar.bz2 tar xjf ruby-1.8.7-p160.tar.bz2
cd ruby-1.8.7-p160/
sudo mkdir -p /usr/local/ruby/1.8.7-p160
./configure --prefix=/usr/local/ruby/1.8.7-p160
make
sudo make install
パッチレベルすらディレクトリを分離してるのか。 まあその方が、トラブル時には切り分けやすいか…。
ディスクがたくさんあっていい感じだ
文字列、配列、ハッシュの初期化の書き方についての質問です。 以下のそれぞれのペアは、等価?(どっちで書いても良い?) my_string = "" my_string = String.new my_array = [] my_array = Array.new my_hash = {} my_hash = Hash.new
649 :
647 :2009/04/28(火) 19:37:17
>>643 inst.instance_eval{initialize} じゃダメ?
651 :
デフォルトの名無しさん :2009/04/28(火) 22:35:42
てか self.class.new でダメなことって少ないよな
今まで数年間、テキストエディタのみでプログラミングしていたのですが そろそろIDEにも、試しに手を出してみようかと考えています Rubyに対応したIDEを探してみると、RDEの他には Aptana Rails、NetBeans、Eclipse DLTKが見つかったのですが これらの中で「これがオススメ」というものはありますか? シンプルで理解が難しくないものを求めているのですが……
特にありません
テキストエディタのみとかおれには考えられん 環境がなかった昔はもちろんやってたけどな
俺は今のところ IDE なしでもそんな不便はしてないかな Cygwin + bash + vim + rake + 自作ツールっていう構成だけど ただ、やってるうちに Rakefile がでっかくなっていくけどw
テキストエディタのみって言っても UNIX環境の支援のもとに emacs やら vim 使ってるのと Windowsでメモ帳とか使ってるのとでは全然違うよな
emacs + αで十分IDEチック
メモ帳はまさにメモ帳であって。 emacsはフルカスタマイズ可能!ってか。 変態的な操作方法をもちょっと控えて、GUIベースのタブでバッファを切り替えるような ものなら、もうちょっとご新規さんにもアピールするかと思うんだが。
660 :
639 :2009/04/29(水) 09:15:30
>>659 (EmacsをEmacsとして理解できないものには)Emacsを使うのは難しい。
Aquamacsだとタブが出るけどな。
>>643 たぶん普通は
require 'singleton'
class C
include Singleton
def initialize
@i = nil
end
attr_accessor :i
def self.init(i)
c = self.instance
c.i = 1
c
end
end
p C.instance #=> #<C:0xb7d853e4 @i=nil>
p C.init(1) #=> #<C:0xb7d853e4 @i=1>
p C.instance #=> #<C:0xb7d853e4 @i=1>
>>662 それを許すんならもはや定数に代入した普通のオブジェクトと変わらない気が
ていうか、読みにくい
665 :
635 :2009/04/29(水) 15:10:47
みなさんレスありがとうございます。
>>650 >
>>643 > inst.instance_eval{initialize} じゃダメ?
それでよさそうですね。初めて知りました。
もともと
>>635 と書いたのは、「引数を渡したいのは初期化の時だけだが、一度instanceしてから
値を渡すのが面倒」というのがあったからなので、
>>662 のやり方が簡単で良さそうです。
>>662 の中の
> c.i = 1
は
> c.i = i
ですよね。
結局自分もsingletonにする意味あんまりないなと思い始めてしまってますが、最初の動機がたいした
ことじゃなかったということですね。
ruby-pg-0.8.0ってPGresultのresultって使えますか? num_tuplesとかは正常なのにresultとかstatusだとNoMethodErrorになります。 今までずっと古いやつを使っていたんですがメソッド名が変わったりとかしたんですかね?
>>666 おお!俺も数日前にそれで困ってましたw
俺がしたこと
1) requireの置き換え
require "pg" # require "postgres"
2) resultメソッドの置き換え
res.map {|rowmap| res.fields.map {|f| rowmap[f]}} # return res.result
resultが無くなったのか、名前が変わったのかは知りません。
statusのほうは使ったことがありませんのであしからず。
668 :
666 :2009/04/29(水) 18:39:50
>>667 ありがとうございます!取得できるようになりました!
根本的な原因は気になりますが、
とりあえず動くようになったのでよしとします。
669 :
653 :2009/04/29(水) 18:58:20
いろいろなご意見ありがとうございます!
基本的にエディタ派の方が多いようですね
ただ、655さんの環境も気になります
>>657 Windows環境で、主にNotepad++を使ってスクリプトを書いております
コマンドライン環境はNYAOS+GnuWin32の構成です
VRFormってどこにあるの?rubyのフォルダを検索しても見つからない。 ほとんどのコントロールはvrcontrol.rbにあるのに。
Array同士を簡単に同じでない行を調べることってできませんでしょうか? a - a2みたいだと、差分という感じではない気がします。 通常のdiffツールだと、出力結果が上から調べるので順番に依存してしまいます(´・ω・`)
>>672 あああああ、
pp (a2 - a)
pp (a - a2)
とお互い引けば、いいのかw
書いて気づいた
同じでない行ではあるか
メソッド呼び出しにおいて、メソッド名と引数を囲む括弧の間には、 スペースを入れないことをおすすめする。
排他的論理和は (a|a2) - (a&a2) でも
エクスクルゥーシブー・オアッ!!
677 :
デフォルトの名無しさん :2009/05/02(土) 19:53:16
勉強始めたらいきなりこんなもん見つけたんですけど。 バグでしょ? #ruby 1.8.7p72 mswin32 module A def f() print "test ok!\n" end end #include A A::f() test.rb:7: undefined method `f' for A:Module (NoMethodError) ちゃうか〜
Rubyに限らないけど、まず自分のプログラムに問題がないか考えた方がいいよ。 2〜3回くらい恥をかけば直るんだけどね。最初からかかないことにこしたことはない。
Rubyのめんどくさいところにいきなりぶつかるセンスは賞賛に値すると思う
681 :
デフォルトの名無しさん :2009/05/02(土) 20:17:12
そっか、バグじゃないかぁ コメントアウトしてあるinclue Aを生かすと、動作しちゃうんですけど。 変じゃね?
>>681 どうしてコメントをはずすの?
なんのためにコメントをはずすの?
683 :
677 :2009/05/02(土) 20:32:47
なんのためにといわれても... テストプログラムだからいろんなケースを比較して、 変じゃないかなと
つまり、意味もわからずincludeしたりしなかったりを試していると。
685 :
677 :2009/05/02(土) 20:56:15
print Math::PIは動くね。 もっとも、Mathはrubyインタープリターによって 特別待遇を受けているだろうから、あまり比較にはならんだろうけど。
>>685 >>681 は目の付け所いいなと思ったけど・・・
Module#module_functionは読んだ?
687 :
677 :2009/05/02(土) 21:37:08
なるほど、すくなくとも仕様であることは、理解しました。 どうもありがとうございます。 しかし、なんとも不可解に見える仕様。でも、理由があるんでしょう。 勉強します。
>>683 ちゃんと理由を考えながらテストしないと、あまり意味がないぞ
結論から言うと理解を間違えている
A::f() の形でメソッドを呼びたいなら、次のような方法を使うべき
(他にも特異クラスを使った方法とかあるけど、ここでは省略)
1.
def A.f()
end
2.
module A
module_function
def f()
end
end
module_functionというのは知らなかったので試してみた。
折角なので張っておく。 これで
>>677 の疑問も解けるとよいけど。
irb(main):001:0> module M
irb(main):002:1> def self.f() [:module, self] end
irb(main):003:1> def f() [:instance, self] end
irb(main):004:1> module_function
irb(main):005:1> def mf; [:module_function, self] end
irb(main):006:1> end
irb(main):007:0> class C
irb(main):008:1> include M
irb(main):009:1> def cmf() mf end
irb(main):010:1> end
irb(main):011:0> c = C.new
=> #<C:0x28de620>
irb(main):013:0* M.f
=> [:module, M]
irb(main):014:0> C.f
NoMethodError: undefined method `f' for C:Class
irb(main):015:0> c.f
=> [:instance, #<C:0x28de620>]
irb(main):016:0> M.mf
=> [:module_function, M]
irb(main):017:0> C.mf
NoMethodError: undefined method `mf' for C:Class
irb(main):018:0> c.mf
NoMethodError: private method `mf' called for #<C:0x28de620>
irb(main):019:0> c.cmf
=> [:module_function, #<C:0x28de620>]
irb(main):020:0> include M
=> Object
irb(main):021:0> mf
=> [:module_function, main]
さっきのを書いている間に生じた疑問がひとつ。 親クラスのクラスメソッドは継承されるけど、 インクルードしたモジュールのクラスメソッド(?)は継承されない。 module_functionのクラスメソッド側もやはり同じ。 いったいどういう理由でこうなっているの? irb(main):001:0> module M irb(main):002:1> def self.f() [:module, self] end irb(main):003:1> module_function irb(main):004:1> def mf() [:module_function, self] end irb(main):005:1> end irb(main):006:0> class C0 irb(main):007:1> def self.cf() [:class, self] end irb(main):008:1> end irb(main):009:0> class C < C0; include M end irb(main):010:0> C.f NoMethodError: undefined method `f' for C:Class irb(main):011:0> C.cf => [:class, C] irb(main):012:0> C.mf NoMethodError: undefined method `mf' for C:Class irb(main):013:0> C.new.mf NoMethodError: private method `mf' called for #<C:0x28d636c>
実はrubyにはクラス(モジュール)メソッドという仕組みはなくて、クラスに定義された 特異メソッドが他の言語のクラスメソッドと同じように使えるだけ(と思ってる) クラスの継承で特異メソッドが継承され、includeでは無視されるのは仕様としか 大体「クラスメソッド」として使うんだから「クラス名.メソッド名(引数)」の クラス名にはメソッドが定義されているクラスを使うべきだろう
継承してないから継承されない じゃ駄目かね
Mix-inてのは親子関係が木構造になるように制限をした多重継承だと 理解していたんだけど、Rubyのモジュールはちょっと違うということかな。 上のコードでいうと、c is_a M だけど C is_a M ではなかったから、一瞬 そういうものかと思ったものの、 C is_a C0 というわけでもなかったぜ。 うーん、いまいち腑に落ちないな。
694 :
デフォルトの名無しさん :2009/05/03(日) 20:27:14
>>690 メソッドを継承すると遮蔽定義によって、メソッドの動作を変更できてしまう
からじゃね?
モジュールは多重にインクルードできるから、継承経路によって、
振る舞いが変わる可能性があるので、そういう仕様になってるんじゃねえかなぁ
よくわからんけど
>>690 >親クラスのクラスメソッドは継承されるけど、
>インクルードしたモジュールのクラスメソッド(?)は継承されない。
>module_functionのクラスメソッド側もやはり同じ。
>いったいどういう理由でこうなっているの?
そういう仕様だから。
もちょっというと、includeはメタクラスには影響を与えないから。
自分で調べるなら「Ruby クラス階層図」でぐぐるといいかも。
あの辺の理論はこんがらがる Class.class => Classって辺りで混乱が最高潮
>>697 の気持ちは残念ながらわかってやれないが
整形されてないとここまで読む気が失せるものだと再認識させられた
Linux 版のデフォルト設定の irb は死ぬほど見づらい デフォルトで行番号表示つけるならもっと履歴を使いやすくしろ っていうか irb で出る例外の 99 パーセントは直前行だろ需要考えろよ
そういや、irb使ってるとき、ついシェル感覚で !10 とかタイプ してしまう。そして => false という出力をみてはじめて気付く。 !p => true とやってしまったときは、何がおきたか一瞬わからなかった。
wirbleかutility_belt使ったらどうだろう。 utility_beltはWindowsだとダメポだったけど
~/.irbrcに最低これくらいは書いとくよね # vim:ft=ruby require 'irb/completion' __history__ = File.expand_path('~/.irb_history') File.foreach(__history__) {|line| Readline::HISTORY.push(line.chomp) } END { File.open(__history__, 'w') {|f| f.puts Readline::HISTORY.to_a.join("\n") } } IRB.conf[:PROMPT_MODE] = :SIMPLE
あーいるよな、デフォルト設定の話してるときに「カスタマイズすればいい」とか脳のとろけた話する奴
もんだいはどちらがコストが低いかと言う話になる。
この場合、カスタマイズの例を実際に
>>702 が出してくれたので、
irb本体に手を入れるよりよほど簡単である。
許されてもよいのではないか。
RubyGemsで一発で解決することに対して、数行のモンキーパッチで解決するならまだしも、
長々とスクリプトを書くのであれば、どちらがコストが低いかは自明
自演乙
まあそのへんは果てしなくどうでもいい
自分用のスクリプトで引数にキーワードハッシュでも文字列ハッシュでも通常引数でも動作するようにしたり クラスメソッドでparseみたいな総合一連動作メソッドを作りまくったりしてると YAGNIということばを思い出す オチはとくにない
708 :
デフォルトの名無しさん :2009/05/04(月) 17:18:06
標準入力から読み込んだ画像を表示するビューアを探しているのですが、探す暇もない(面倒)なので 自分で簡単なビューアを作ろうとruby-gtk2のリファレンス読んでいたのですが... (まあこんな感じ cat image.jpg | imageviewer) Gtk::Imageをざっと目を通したところ、画像ファイルの名前を指定するようですが $stdin.read とか指定できませんかね?
あのへんはRuby関係ないからなー
710 :
デフォルトの名無しさん :2009/05/04(月) 17:55:29
708だけど、imagemagickで実現できたわ(^^ $ cat image.jpg | display でおk。 まあimagemagickも/tmp/magick-Xxxxのような一時ファイルを作成しているから 同じようにすればいいのかな。。
>>709 2ch は、7割が脱線で出来ています。
>>708 前に画像ビューア作ってたとき、漏れはこんな感じで
PixbufLoaderとcairo使ってごにょごにょやってた
require "gtk2"
ploader = Gdk::PixbufLoader.new
ploader.write($stdin.read)
ploader.close
drawing_area = Gtk::DrawingArea.new
window = Gtk::Window.new
window.signal_connect("destroy") do
Gtk.main_quit
false
end
drawing_area.signal_connect("expose-event") do |w, e|
context = w.window.create_cairo_context
context.save do
context.set_source_pixbuf(ploader.pixbuf)
context.paint
end
true
end
window.add(drawing_area)
window.show_all
Gtk.main
なんでRubyでそういうの作ろうと思うのかね もしかしてRubyしか使えないとか?
Rubyからアクセスすれば簡単手軽に作れるからだろ 実際問題として簡単でも手軽でもないような気もするがまあそれはそれで
楽だから
716 :
デフォルトの名無しさん :2009/05/04(月) 20:44:45
Rubyで書くと おちんちんきもちいいお(´;ω;`) だから
708でも712でも無いけど、どうしても速度が欲しければjavaかCで書く
でも普段はそんなん必要ないから楽ちんなrubyで書く
>>713 なら何で書くのさ?アセンブラ?まさかマシン語とか?
vistaのローカルにいれているRubyの1.86を 1.9xにアップグレードしたいのですが インスト方法どこかに書いてありますか?
それはアップグレードではなくアンインストール後の新規インストールになるな
>>718 あなたは、1.9x を使う要件を満たしません。
1.8x を使い続けてください。
まだヘソ曲げてんのかよw
722 :
718 :2009/05/05(火) 01:57:45
できました。 1.86アンインスト ↓ 1.9x解凍、C:\に置く ↓ windowsのシステム環境変数書き換え でしたね、できました。 複数バージョン置けたんですかね。 記法が変わりすぎで1.9xの中心にしか 覚えませんが。。
RDEを使いたいと考えて、インストールして、実行してるんだけど 以下のコードを書いたらエラーっぽいメッセージがRDEから出でる。 ---------------------- a = [] a.each do |x| x. ---------------------- メッセージ Access violation ta address 004B0137 in module 'rde.exe'.Read of address 00000015. x.の"."を打ったところで出るので、オブジェクトのメソッドを取得しようとして失敗しでもしてるのだろうか? エラーメッセージをとりあえず無視してるのだけど、気味が悪いので、対策知ってる人がいたら教えてください。
|| 時刻1 | 時刻2 | 時刻3 | … ------------------------------ 分類1 || d_1_1 | d_1_2 | d_1_3 | 分類2 || d_2_1 | d_2_2 | d_2_3 | 分類3 : というスプレッドシートっぽい概念がしっくり来るデータがあります (実際は2系統が直接関連付けられてないバラバラなハッシュです) データ.category("分類1") とすると [d1_1, d1_2, d1_3, ...] というようにす
…悩んでたら途中で送っちゃった こんなごっつい構造のデータでなくてもいいような気がさっきからずっとしてるので とりあえずキャンセルしますごめんね
キャンセル吹いたw
727 :
受付嬢 :2009/05/05(火) 21:45:30
また、いらしてください
以前から不思議だったんだが RDEはなぜこれほどまでにバグだらけなのだろう 何か理由があるのだろうか
マジレスすると玄人が使わないからバグ報告が少ないとかじゃないか
どこからかだったか忘れたけど require 'irb/completion' require 'irb/ext/save-history' IRB.conf[:SAVE_HISTORY] = 99999 IRB.conf[:PROMPT_MODE] = :XMP require 'pathname' require 'fileutils' require 'uri' require 'pp'
使われない→バグが取れない→使われない・・・・の 負のスパイラルに陥ってる可能性が
>>732 スレタイのRuby初心者となんの関係もない話題だが、
Division and Modulus for Computer Scientists でも読んでみたら?
>>732 おいおいスクリプト言語ぜいが全然周りと違ってて吹いた。
下手するとハマるね、これは。
こういうのって何かで規定されてないのかね…。
AA化してみた
負の剰余
C Java PHP Emacs Ruby Python Perl
(GCC (Sun JDK 4.3.10 22.0.50.2 1.8.2 2.3.5 5.8.4
3.3.5) 1.5.0_05) -16
-3 % 5 -3 -3 -3 -3 2 2 2
. 3 % -5 3 3 3 3 -2 -2 -2
-3 % -5 -3 -3 -3 -3 -3 -3 -3
こんなプログラムはいやだ: 負の剰余 - bkブログ
http://0xcc.net/blog/archives/000083.html
個人的にはスクリプト言語勢の振る舞いがしっくり来るなあ。 しかし数学的な定義はないのか?ありそうだが。
定義されてるよ。 「 A mod B は "AをBで割った余り"」だから「B と商 x をかけて剰余を足すと A に戻る」でいいよな? -3 mod 5 = -3 だとする場合 (C言語) 5 と 商 0 をかけて剰余 -3 を足すと 5 * 0 + (-3) = -3 に戻る…正解 -3 mod 5 = 2 だとする場合 (スクリプト言語) 5 と 商 -1 をかけて剰余 2 を足すと 5 * (-1) + 2 = -3 に戻る…正解 ということで、そもそも2通りあるから、「どっちでもいい」。 手計算の世界では「剰余は商より小さい正の整数」という条件がついてたりするんだけど (「10割る3」は「商3余り1」であるべきで、「商4余り-2」ではないと習ったはず) C言語は「割られる数が負なら絶対値で計算して結果を負に変換する」という流儀に従ってる。 まあ、剰余に関しては言語のマニュアル必ず読めって感じだな。
CやC++なんかの仕様では 「割る数と割られる数の両方が正である場合は商と剰余は必ず正であるが、 少なくともどちらかが負である場合は定義しないので処理系が得意なように作れ」 とかヤな感じに丸投げなことが書いてあったはず
>>738 CやC++の場合は、コンパイラが、「俺は知ったこっちゃねぇ。CPUに任せる」という
コード生成ができるという利点がある。
ってことは正確を期したいならどんな言語使うにせよ 正負の確認処理を挟むべきってことか
負の除算は意図をもって行われるべきだってことだね まあ、コンピュータにおける除算自体がそもそも日常視点では怪しさのカタマリだから慎重になるべきなんだけどさ
>>740 確認したってどうせ一つしか結果は出てこないんだから、
それなら最初から自分で関数組んだ方がw
一般的用途においては割る数と割られる数の両方を事前に絶対値とって使うべきかね 剰余を使う機会で負になるのはたいてい割られる数だし
>>744 ありがと!
足りないファイルを1.0.1からコピーしたらエラーでなくなったよ
rspec 使って遊んでます 「大量のファイルやら外部参照やらがあり、きちんと動作することが現状 おおむねわかりきってるひとまとまりの部分のテスト」 が 「今テストしたい部分を繰り返しテストして試す」 という行為にちょっとジャマ(処理に時間かかるし、ファイルアクセスがなんとなく無駄)です if false # 終わったので一旦スルー … end で囲うというのも考えたんですが、なんかこうスマートな考え方はないもんでしょうか?
>>747 つ pending
外部と接続する部分は、mockがうまく利用できる形に持っていくのもよい。
>>747 スペックファイルを分割すればいいのでは?
ネットからファイルを取得する処理のあるスクリプトなんかは困るよね specコマンド連打するたびにGETが大量に起こったり
そんなの、specファイルの中でメソッド再定義すればいいじゃん サーバへアクセスしてる部分を事前に保存しておいたローカルのファイルを読むように書き換えればいい
specファイルの中でオリジナル書き換えたらオリジナルのテストになんねえよ
なんという正論
>>752 そのメソッドをテストするときだけオリジナルの動作になれば問題ないだろ
html = $TEST_HOGE ? File.read("local.html") : open(uri).read
「実際にネットワークからモノを取ってくるオブジェクトX」自体 のテストではネットワークを使わざるをえないが、それのテストが 十分出来ているなら、Xの利用者をテストする際には、Xはmockで 代用できる。
>>754 実質的な動作は同じだしな
テストできないで終わるよりずっとマシ
>>754 だからこうするんだってば
def get(uri)
return uri.read
end
↓
def get(uri)
return File.read('local.html')
end
コストのかかる部分を全部メソッドとして吐き出せるようにクラスを作る そうすればその部分のメソッド定義を書き換えるだけでテストが書きやすい
インスタンス変数をメソッド内で利用するとテストで条件変えたときに書き換えられないから、 全部引数で渡すようにするのがポイント
RSpecのテストに対応させてスクリプトを作ると諸記述が2ランクくらい退化するというのはよくある 巷のRSpecの解説は一番大事なことをあえてすっ飛ばしてると思うんだ
>>759 なるほど
>>760 こっちは・・・どうなんだろう。
いずれにせよ、テストしやすい書き方も大事ってことか。
>>761 describe と before と it と should と eql しか使わせる気がなさそうな説明はいくつか…
これしか使わなくてもテストは書けるのでタチが悪い
これ以上のことを説明する気がないのならむしろRSpecを使わせないほうが効率も能率も高い
rspec といえば、あれって「○○と表示されること」をテストするのってどうするん?
>>764 素晴らしい先駆者であるがゆえに失速の影響が…
えー、「内部の○○メソッドを今は動作したことにしたい」というカジュアルな用途には、stub! が使えると思われ
require 'spec'; require 'open-uri'
class Hoge
def get(uri); open(uri).read; end
def pick_title(uri); get(uri).scan(/<title>(.+?)<\/title>/).to_s; end
def main
pick_title('
http://www.example.com/ ')
end
end
# -----------------------
describe Hoge do
before :all do
@hoge = Hoge.new
end
describe "#main: サーバからHTMLを取得してタイトルを表示する" do
it "たいとる!" do
@hoge.stub!(:get).and_return('<html><title>たいとる!</title></html>')
@hoge.main.should eql('たいとる!')
end
end
end
「@hoge の get メソッドが呼ばれたときは処理を横取りして and_return の引数を代わりに返すようにする」という記述
あんま小難しいこと考えなくていいのでとっても便利
…これはこれで stub! ばかりになりそうw
rspecにはTest::Unitの-nオプションみたいにテストを限定する方法はないの?
str = String.new p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65 #ふー。。。
require 'pstore' h = Hash.new{|h, k| h[k] = Array.new} h[0] << 'a' << 'b' << 'c' PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h} これを実行すると /usr/lib/ruby/1.8/pstore.rb:349:in `dump': can't dump hash with default proc (TypeError) と言われます。 既存のハッシュを「無難な」ハッシュに変換してそれをまた戻す方法とかないもんでしょうか
うわー それじゃデフォルト値つきの配列やハッシュって駄目じゃん 普通の配列やハッシュのつもりで誰がMarshalするかわからないんだし怖くて使えん
hh = Hash[h] ではどう?
>>772 Proc つきのまま外に出すなってことなんだと思う
デフォルト値つきのハッシュはデータ製作用の仮形態のみにしておく
require 'pstore'
def makedata
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'a' << 'b' << 'c'
return Hash.new.merge(h)
end
h = makedata
PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}
これなら動作する
開発者側が気を遣えってことなんだろうな
既存の誰かが作った(そしてどこに初期値つきハッシュが使われてるのかよくわからん)データを
マーシャル可能な形態に変換する方法は知らん
>>771 いっそのことYAMLにしてしまうとか
require 'pp'
require 'yaml'
#h = {0 => Array.new}
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'A' << 'B' << 'C'
h["mage"] << '100' << 1234.56 << :hage
pp h
puts
y = h.to_yaml
puts y
puts
new_h = YAML.load(y)
pp new_h
pp h == new_h
わざわざ PStore するってことはオブジェクトとして一時保管したいのだろう YAML ではどうにもならん気もする
では、yaml/storeで #!ruby -Ku $KCODE='u' require 'pp' require 'yaml/store' #require 'pstore' h = Hash.new{|h, k| h[k] = Array.new} h[0] << 'a' << 'b' << 'c' YAML::Store.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}
あああ、てか、procごと保存して復元したいってことなのか?PStoreってそこまで対応しとるノン?
Rubyist Magazine - 標準添付ライブラリ紹介 【第 9 回】 PStore
http://jp.rubyist.net/magazine/?0016-BundledLibraries > IO や Proc などの Marshal.dump が出来ないオブジェクトは保存することが出来ませんが、
> Marshal.dump 出来るオブジェクトなら何でも保存できて、Marshal.load 出来るものは何でも読み込めます。
駄目なんすね・・・まあ普通考えたらそうか
procで詰まるってことは、後でevalれるコードを格納できるように、
って難しく考えないで、1個1個個別対処しかないんじゃないのかなあ。
復元時にprocを戻すようにというか、Hash.new{|h, k| h[k] = Array.new} 生成して再代入と言うか
一応
>>774 が答ではあるのだろう
出しっぱなしにならないようにクラス製作者に気をつけてもらうしかなさそうだ
デフォルト値の動作が重要な代入可能な配列なんかを提供する場合は
Procつき配列をそのまま出すのではなくそういうデフォルト動作をするメソッドを自力で作れと
めんどいな
class MyHash < Hash def initialize(*args) super {|h, k| h[k] = []} end def marshal_dump Hash.new.update(self) end def marshal_load(data) update(data) end end
マニュアルのとこにちょろっと書いておいてくれるとよかったのにね 「ただし、ブロックは Proc なのでこのままではオブジェクトを Marshal することができません。Hash#merge して下さい」とか
784 :
753 :2009/05/08(金) 17:49:20
>>728 同じ事を考えたんだけどmarshal_loadしたオブジェクトは
initializeされてないからdefault_procが再設定されてないのよ
h = MyHash.new
h[0] << 'a' << 'b' << 'c'
h = Marshal.load(Marshal.dump(h))
h[1] << 'a' << 'b' << 'c'
#=> undefined method `<<' for nil:NilClass (NoMethodError)
initialize以外でdefault_procは設定出来ないしどうしたもんかね
785 :
784 :2009/05/08(金) 17:51:39
名前欄は無視してくだしあ
>>770 >p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65
これって fusiあな、、?
787 :
デフォルトの名無しさん :2009/05/08(金) 20:39:17
TSUKARETA
788 :
デフォルトの名無しさん :2009/05/08(金) 20:39:48
$ irb1.8 irb(main):001:0> str = String.new => "" irb(main):002:0> p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65 "TUKARETA" => nil irb(main):003:0>
String.new << e は、e.to_s した結果を末尾に追加するべきだと思う
まあ ASCII コードの取り扱いのへんはいろいろシガラミがあってだな
Rubyユーザとは思えない
>>772 のレスのせいで初心者が混乱しかねないので、
一応言っとく。
○デフォルト値はあってもMarshalできる(もちろんpstoreも)
h = Hash.new(1)
h = Marshal.load(Marshal.dump(h))
p h[:foo] #=> 1
○ダメなのはdefault_proc
h = Hash.new {}
Marshal.dump(h) #=> can't dump hash with default proc (TypeError)
○default_procはHash#default=で消せる
h = Hash.new {}
h.default = nil
h = Marshal.load(Marshal.dump(h))
p h #=> {}
○配列にデフォルト値などない
a = []
a.default = 1 #=> undefined method `default=' for []:Array (NoMethodError)
>>792 このスレでは1.9をデフォと思わないほうがいい。
794 :
784 :2009/05/09(土) 01:46:48
>>792 1.8.7だと undefined method になっちゃう(1.8.8とかで取り込んで欲しいな)
てかinitialize呼んじゃってもいいのね
def marshal_load(data)
update(data)
initialize {|h,k| h[k] = Array.new }
end
# あとアンカも間違えてた ×
>>728 ○
>>782
てか、自分でクラス作ってるならこんな面倒なことしなくても 「該当部分の見当つくんだから空のハッシュとマージさせとけ今からやれ」で終了なわけで ソース読むのめんどいくらいの他人様のライブラリを仮定してると思われる以上 そこで「1.9ならできる」というのはいささか的外れな気もする
>>791 こういうのまとめたwikiが欲しいな…
RubyのFAQ用のwikiみたいなのってなかったけ?
質問です オブジェクトが、あるモジュールに含まれるクラス群のインスタンスであるかどうかを 調べる簡単な方法はありますか? 現在、 obj.class.to_s =~ /MyModule/ みたいな判定の仕方をしているのですが、こういうことに正規表現マッチを 使うのも大げさな気がします。もっと簡潔なやり方はないでしょうか。
obj.is_a?(MyModule) で用が済まなくなったらまた来てくれ
>>802 済まないと思う
obj = MyModule::KlassA::Sub.new
obj = MyModule::KlassB::Sub.new
という可能性があるときにたとえば
if class_include_klassA(obj) then
# obj が MyModule::KlassA::Sub だと期待した処理
elsif class_include_klassB(obj) then
# obj が MyModule::KlassB::Sub だと期待した処理
...
というようにしたいのだろう
そうすること自体がなんか方向性間違ってるような気もするが
804 :
801 :2009/05/09(土) 10:52:24
>>802 すいません。言葉足らずでした。
MyModule はトップレベルに include されているため、コアクラスもみな
is_a? に対し true を返すという状況です。
ん?
>>801 あるモジュールに含まれるクラスのサブクラスのインスタンスの時はどうするの?
module Mymod
class A
# あるモジュールに含まれるクラスのインスタンスか調べるメソッド(仮)
def nesting?(mod) ; self.class.name =~ /#{mod}/ ; end # その一
def nesting?(mod) ; Class.nesting.include?(mod) ; end # その二
end
end
class B < Mymod::A ; end
Mymod::A.new.nesting?(Mymod) #=> 0(true)/true
B.new.nesting?(Mymod) #=> false/true
807 :
801 :2009/05/09(土) 11:36:19
皆さんレスありがとうございます。
インターフェースを揃えてそもそも処理を分けないで済む方法で自己解決しました。
お騒がせしました。
>>806 モジュールの外で継承されることが完全に抜け落ちてました(汗)
自分がやりたかったのは Class.nesting を使ってる方です。
勉強になりました。ありがとうございます。
質問 my/main.rb my/mod.rb というディレクトリ構成で、main.rb に require 'mod' と書いてあるとします これ、カレントディレクトリがたとえば HOME だったりすると $LOAD_PATH の "." が HOME になって HOME/mod.rb を探してしまって希望通りに動作しませんよね 「自分が存在するディレクトリにある自分用ファイルを require する」ということをさせたい場合の 決まった書き方はありますか?
809 :
デフォルトの名無しさん :2009/05/09(土) 15:28:32
require fine.join(__FILE__, $0)
>>808 どうするのが定石が知らんが、gemsとかのspecファイルとか見てると、
$:.unshift(File.dirname(__FILE__))
してから、require するか、
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
という感じだな。
>>808 わかりやすいとこで
#!/usr/local/bin/ruby -Ku
$LOAD_PATH.unshift(File.dirname(File.expand_path(__FILE__)))
require 'mod'
...
require は引数をフルパスにしても動作保証がなかったはずだし Ruby のめんどくさいとこだな
そうそう、ファイルを2つに分けただけなのに $LOAD_PATH とかいじらないと動作しないというのはどうにも カレントディレクトリをデフォで追加しようとか考えた奴はお花畑だと思う
…そこまで言わんでも 1.9 でこっそり追加されてるとかそういうことはないかしら
まあ、めんどっちいな 何が面倒かっていうと cron とかそういう絶対パスで動作させるような環境にたまたま持っていったときに その cron の内部でだけよくわからんエラーになって露見するのが嫌 「っかしーなー動くよなー mod.rb もあるしなー」と(当該ディレクトリ内で相対パスで)スクリプト動かして首捻るわけだ
rubyに限ったことじゃないような。
Windowsのソフトでも作業ディレクトリ(カレントディレクトリ)をexeと同じにしないと、
まともに動かないのはザラだからな。
何がいいたいかというと、カレントディレクトリ依存とかはプログラマの仕事でもあり、
そうじゃなかったらユーザーが気を配る話でもある。
(Windowsはショートカットだとカレントディレクトリは最初自動で設定してくれるが、
バッチ処理とか、コマンドラインから起動したりするととたんに
>>814 みたいなことになるんだよな)
まあ、自動的に解決してくれる言語仕様ならそれにこしたことはないけど。
どんな仕様だったらいいものなのかね?
Rubyとずれるが、Windowsでゲーム作って公開したときに、 エクスプローラーから実行すると動かないという意味不明な問い合わせがきてだな、 アドレスバーに直接exeのフルパス打ち込むと、カレントディレクトリがアプリのディレクトリと異なるのでうごかない という現象に遭遇して、 結局、アドホックに"起動直後にexeのディレクトリをカレントディレクトリに設定"などという処理を入れて、 回避したんだよ。 Rubyだったら、最初に起動するスクリプトで Dir.chdir(File.dirname(__FILE__)) なんかだせえw
>>811 > require は引数をフルパスにしても動作保証がなかったはずだし
してるよ。
作者がウィンドウズ使ってない弊害だろう。リナックス使ってるのだっけか。
>require_relative いつのまにこんな便利メソッドが! Ruby 1.9.x で追加されたけど、あまり表舞台にあがってないメソッドっていろいろあるよね CHANGELOGとか見返せば分かるのかな
rubyにスパイウェア仕込んでメソッドの呼び出し状況を収集して ruby-lang.orgに送信して使われてないメソッドのプロモーションとかすればいいのに
822 :
デフォルトの名無しさん :2009/05/09(土) 22:30:06
推奨プラットフォームがLinuxだっけか。
*Supported* なのは唯一Debianのみ。 Supportedの意味はサイト参照。
デビアン使ってない信者は負け組だな。
825 :
デフォルトの名無しさん :2009/05/10(日) 08:41:33
l = text("0") メソッド text に引数 "0" を渡してるだけ スニペットってことはモジュール使用例の一部分だけを抜き出してるからこんな見かけなのだろう
("0") < オハヨウ!
Rubyの場合、コーディングでの改行は必須なのでしょうか? (言語によっては、改行は実質無視されるものもあります) 例えば、対話環境 irb で $ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0> を $ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0> と書くのは不可でしょうか?
>>828 区切りに改行か ; が必要。
>$ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0>
・・・書かなくていいところまで書くなよw
>>828 irbに対するprint1つじゃ改行もへったくれもないぞ 。
>>828 ___ ━┓ ___ ━┓
/ ― \ ┏┛/ ―\ ┏┛
/ (●) \ヽ ・. /ノ (●)\ ・
/ (⌒ (●) /. | (●) ⌒)\
/  ̄ヽ__) / | (__ノ ̄ |
/´ ___/ \ /
| \ \ _ノ
| | /´ `\
ファイルの個数を拡張子ごとに数えるもっとシンプルな書き方ないですか? exts = v.inject(Hash.new(0)){|r,x| r[x['Path'][/[^\.]+?$/]] += 1; r } ちなみに、File.extname() を使っていないのはバグがあったからです。
>>833 なんかイラっとくる。いや俺も初心者だけど。vって何?
counts = Hash.new{|h, k| h[k] = 0} Dir.glob('*').each do |path| next if File.directory?(path) counts[File.extname(path)] += 1 end counts = Hash.new.update(counts)
extnameとしてくくり出す以外やること無いと思う
バグなら報告すればいいだろ
1.8.7以降だとこうも書けるかな Hash[Dir.entries('.').group_by{|n|File.extname(n)}.map{|k,v|[k,v.size]}]
97パーセントくらいまで「ディレクトリを除外しないバグ」だと思う
結局
>>835 が一番シンプルで一番正確な動きをするというRubyらしい結果に
まあ人に想像させるというか、空気を読ませる時点で「シンプル」ではないわな。
そういう意味では
>>835
俺は838の方がいいけどなぁ ま、人それぞれだな
>exts = v.inject(Hash.new(0)){|r,x| r[x['Path'][/[^\.]+?$/]] += 1; r } Ruby初心者で疑問なんですが、 injectブロックの|r,x|が何であるかとか、どこでどうやって決めているんですか? 例えばCだと、ヘッダに関数の宣言があってそれを見ればいい訳ですが。
というか、each 系ブロックに渡すファイル一覧として Dir.entries を使う時点でけっこうアレだ
>>844 ただのブロック用の仮引数(ローカル変数)に過ぎない
each do |引数| で x を使うか e を使うかどうするか程度
> injectブロックの|r,x|が何であるかとか、どこでどうやって決めているんですか? ソースコード的には、yieldに渡す値で決まる。 > 例えばCだと、ヘッダに関数の宣言があってそれを見ればいい訳ですが。 プログラミング時にどうしたらいいか、ということなら、リファレンスマニュアルを見る。
foreachの方がいいのかと思ったけどDir.foreachだと別に変数用意してやらなかったりしてショボーン
>>844 に挑戦しようとして挫折w
a.inject(Hash.new(0)){|r,x| 〜 += 1; r }
のinjectで+=1; rってね。これね。
今まで俺もひたすらこういう書き方してきたけど、
injectにおける; r部分はいつももやもやする。
最近のruby-1.9.2 headはsolarisでビルドすると Dir.glob("/**/")で死ぬから困る
852 :
デフォルトの名無しさん :2009/05/12(火) 05:48:28
(敢えて聞きます) Rubyの弱点て何ですか? Webで調べても長所しかないので。
> Webで調べても長所しかないので そんなあなたには使えそうもないところです
てか「Ruby 短所|デメリット」あたりで検索すればウンコみたく出てくると思うんだが
今のRuby自体はそれほど問題ないよね 用途に合わない使い方をすると果てしなく糞だというだけで
Windowsでは使いづらいことが多い。 ユニコードファイル名でファイルアクセスさせてくれ。
用途に合わない使い方をするから…
Windows使う奴は情弱
Windows上でRuby使う奴はアホ というかrequireが激遅な環境があるのをとっとと改善しろ
860 :
デフォルトの名無しさん :2009/05/12(火) 07:33:40
プログラマにとっても、posix環境を対象とする方が精神的にいいのかもな。 ライブラリなんかを見てもwinのための特別なコードを目にするし。
異なるOSを跨ぐソフトはどこもそんなもんだと思う Linux <=> FreeBSD <=> Solaris もそれなりに汚い
>>852 858や859のように、Windowsをバカにする人間が一定の割合いることが悪い点
あとは……プリコンパイルができないことぐらいかな
windowsをバカにされてムキムキする奴は情報処理から手を引いた方がいいよ
CUIからアプローチしたWindowsはヘボいという事実を認められない人はいないほうが平和だったりする
WindowsでRuby使う人は言語のためにOS選んでるわけじゃない 逆に特定の言語使うためにプラットフォームを選択しろとか理解しがたい
Windows使いたかったらPython行け
そのへん Java は使いやすいと思う c:\\ とか c:/ とか書いても動くし、/usr/local/hoge みたいなファイルを開くと、 勝手が c: だったら、c:\usr\local\hoge を開いてくれるし。
>>867 同じ事できたよ ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mswin32]
puts File.read('/cygwin/home/myname/test.txt')
#=> テキストの内容が出力される
>>851 > 最近のruby-1.9.2 headはsolarisでビルドすると Dir.glob("/**/")で死ぬから困る
kwsk
870 :
852 :2009/05/12(火) 12:59:47
なんかRubyって、Winsowsと相性が悪いみたいですね。 というか、Win7が出るのでさらに混沌とするのかな。
でも個人的には、Windows XPでRuby使ってて
>>862 以外に困ったことはないなー
今はパスの問題だってそうそう起きないし
(Vistaではまた違うのかもしれないが)
>>868 知らなかった……いつから絶対パス指定ができるようになってたんだ
>>871 > 知らなかった……いつから絶対パス指定ができるようになってたんだ
大昔からできるよ。
そもそもruby内部で/と\を変換したりしてるわけじゃなくて、元々APIレベルでは
どちらでもアクセスできる。
WindowsはPowerShellがあるからな。 Rubyの出番はもうない。
kogaidan 「ご愁傷さまです。UNIXなどを知ってしまうと、あまりにムカつくことが多いよ。 タダならともかく、Windowsを使うくらいなら、Mac OS XやUbuntuでもいいんじゃないのかな。」
PHP を使えば大丈夫
LinuxのGUIはWindowsのCUIと同じくらいむかつくのは事実
めんどくさかったので spec から書かずに従来どおりにスクリプト作ったら、 ある時期からスクリプトがどんな構造してるのかさっぱしわからなくなった
>>876 LinuxのGUIはWindowsのCUIと同じくらいオマケ機能と思えばどうということはない
Fusion楽しめればそれでいい
880 :
デフォルトの名無しさん :2009/05/12(火) 21:25:46
今日もキューブをまわすお( ^ω^)
>>871 > 今はパスの問題だってそうそう起きないし
ファイル名に♥とか特殊な文字が入ってなきゃおきないけど、問題に直面したら現状回避不可能なのは問題だ。
結局このためだけにPython使ったりとか、悲しいじゃないか。
というか、なんで Windows で無理して Ruby 使うんだろ。 適材適所という言葉を知らんのじゃないか?
かといってPowerShellをわざわざ憶えるのはまんどくせ Pythonだって別にベストフィットってわけでもなかろうし
884 :
デフォルトの名無しさん :2009/05/12(火) 21:51:39
だが現役シェルの中でPowerShovelが一番最強!(たぶん・・・)
そこでIronPythonですよ
Linux なり何なりをメインに使っていて、たまに Windows を使うというのなら、 他の言語を覚えるのは「まんどくせ」なのだろうが、Windows を使う機会の方 が多いんだったら、Ruby 以外を覚えて使ったほうがいいと思うけどね。
どのOSでも使えるのがスクリプトのメリットだろ
> どのOSでも使えるのがスクリプトのメリットだろ > どのOSでも使えるのがスクリプトのメリットだろ > どのOSでも使えるのがスクリプトのメリットだろ > どのOSでも使えるのがスクリプトのメリットだろ
889 :
デフォルトの名無しさん :2009/05/12(火) 21:59:15
・・・w
そんなメリットは聞いたことがないわ
俺、北千住で聞いたことあるよ
Windowsしか使わないならVisualBasicがおすすめ VisualStudio,MS-Office,WSH,etcetc VBが役に立たない場所は無い 逆にプラットホーム非依存なら日本語の扱いが楽な言語がいい 個人的にはjava,rubyがおすすめ
なんでいまさらVB・・・C#でいいじゃん
必要があってならともかく無理してまでプラットホーム非依存なんてことを 考える必要なんてないじゃん、という話の流れだと思うけどね。
コンパイルやらポリシーやらXMLやらでいきなりやる気90%減
なんかくだらない RubyやPythonやってるのにプラットフォーム気にすること自体ナンセンスだと思う
897 :
デフォルトの名無しさん :2009/05/12(火) 22:25:16
しかし全くプラットフォームを意識せずにプログラミングできるかというと、そうでもない。
どうせ依存しなけらばならないのなら, より適したものを使おうというのは自然な発想
>>882 そりゃLinux文化から生まれた言語だし、Windowsが二の次なのは分かってるよ。でも
> なんで Windows で無理して Ruby 使うんだろ
とか本気で言ってるのか?
WindowsユーザーがRubyを好きで、できるだけ楽しくプログラミングしたいと思うのは
そんなに奇妙なことなのか?
本人が好きで楽しいと思ってるんだったら使えばいいんじゃないの? 滝に打たれる苦行を楽しいと思い、喜んでやる人もいるわけで。 そんなのその人の勝手。 その姿を見て、変なやつ、と思い感想を述べるのは見てる人の勝手。
compizこそおまけ機能。OSインストールしたら速攻オフだろ、jk
>>899 禿堂
何故にこの流れの中で compiz? 素でわからん。
WindowsでRuby使っているが、ファイル名以外はそんなに困らんような…。
(webアプリはテストだけで、デプロイは動かすLinux鯖だったりするし…)
>>899 不用意に煽ってるだけだから、つられなさんな
Linux板とかmac板とか見ればわかるけど、不用意にWindowsユーザーを煽るというか、
何故か選民意識みたいなものがあるみたいなのでスルー推奨
>>835 いまさらだけどHash#defaultを使って欲しかったので…
path = './'
counts = {}
counts.default = 0
Dir.foreach(path) do |filename|
counts[$1] += 1 if filename =~ /\.([^.]+?)$/
end
p counts
教祖がデビアン使いの時点で選民思想だしなあ。 大多数が使ってるウィンドウズは非サポート。 マクは論外。あそこの教祖は癌らしいから余命わずかでしょ。 javaも漢字コードとか環境依存だからなんとも。おらに買収されちゃったし。
おらって書かれるとオライリーに思える
907 :
デフォルトの名無しさん :2009/05/13(水) 09:31:48
rubyなんて所詮は新興宗教の公用語。 教祖の気まぐれで仕様が変わる。 付き合ってらんねー。
>>909 公開されてから仕様が追加、修正、廃止されなかった言語ってのを挙げてくれよ
今日中で頼む、知名度の低い言語はカンベンな
909 じゃないけど、 Java の JCP や Python の PEP みたいなのあってもいいかもなーと思うときがある。 個人的に Ruby は不要だけど Rails にはほしいかも。
RCRというのもあったぞ。 今ならredmine.ruby-lang.org経由で[Feature]かな。
rspecで「この describe を一時的にテストから外す」ってできない? 重いテストや遅いテストがあって、そこは一旦外しておきたいんだけれども
914 :
デフォルトの名無しさん :2009/05/13(水) 19:54:45
916 :
デフォルトの名無しさん :2009/05/14(木) 01:08:13
WinXPでruby1.8.6を使っています。 ファイルを開くときの File.open('out.txt', 'w') {|f| の |f| はどういう意味なのでしょうか? 調べましたが分かりませんでした。
>>916 ブロックの仮引数。
def callback(f)
のみたいなもん。
918 :
デフォルトの名無しさん :2009/05/14(木) 02:19:22
いかん・・・Ageてしまった。
920 :
デフォルトの名無しさん :2009/05/14(木) 03:43:12
Time オブジェクトを to_f すればとりあえず用は済むと思われる irb> Time.now.to_f 1242241404.3147 irb> t = Time.now; puts t.strftime("%Y年%m月%d日 %H時%M分%S秒#{t.usec}") 2009年05月14日 04時03分25秒893515 ただ、ごく一般論としては、スクリプトでミリ秒を計るのはあまり意義のあることではないんじゃないかな 1000.times {|n| print "\r残り時間:%3i/1000"%n; $stdout.flush; sleep 0.01 }
処理系依存だしなあ。厳密じゃないし。
かなりどうでもいいんだけども、個々のデータ data の内容を適切にまとめてあるハッシュ results があって、 それに新規の key => value を1ペア追加するてきとーなメソッドを作りたいんよ def new(data) … return {key => value} end results.update(new(data)) と def add_to(h, data) … h[key] = value end add_to(result, data) ってどっちがフツーっぽいかな
そもそも change_obj(obj, data) はあまり好きじゃない obj = obj + scan_new(data) の返り値再代入(に準ずるように見える処理)が好みだ ということで前者おすすめ キーを指定する形式に比べたら明らかに処理が遅いはずだが気にしたら駄目だ
resultsをハッシュじゃなくResultsとか新しいクラスにしちゃって Results#[]=でペア追加するのがRubyっぽい気がする 使うときにはto_hash
多少のことではそういうことをしなくて済むように組み込みコレクションが機能的なのがRubyのいいとこなんじゃないのか や、もしかしたらあちこちで使い倒されまくるハッシュでクラスにするのが妥当なのかもしれないが、 普通はハッシュで済むならハッシュのままだろ
ini.path = "c:/test" p ini.path を内部的に ini.write("settings", "path", "c:/test") p ini.read("settings", "path") に置き換えるようなのって出来ますかね。 メソッド名がなかったらコールバック的に呼ばれる機能があったようななかったような。
そう動作するように書けばいいじゃん def path=(s) write('settings', 'path', s) end def path read('settings', 'path') end
> メソッド名がなかったらコールバック的に呼ばれる機能があったようななかったような。 method_missing
930 :
デフォルトの名無しさん :2009/05/14(木) 13:35:23
WinXPでruby1.8.6を使っています。
文字列中の『:』(コロン)の扱いで質問です。
tag0 = "<parm xmlns="
http://ruby_xyz ">\n" を実行したときコロンの箇所で
syntax error, unexpected tIDENTIFIER, expecting $end
というエラーが出ます。どうしたらよいでしょうか?
目的はtag0と他の文字列Aを組み合わせてできる文字列Bの生成です。
>>921-922 どうも。一応は出来るみたいですね。
ただ、Javaでも他の言語でも、ミリ秒計測は普通にできるものかと思っていましたので。
> 文字列中の『:』(コロン)の扱いで質問です。
違います
どの解説にもこれのやり方は載ってるはずなんだが、載ってない解説とかがあったら即晒せ
ダブルクォート「"」を含む文字列を表現するには " の直前に \ を置く
tag0 = "<parm xmlns=\"
http://ruby_xyz\ ">\n"
>>930 初心者らしい質問でなぜか安心した
エスケープしない限り「"」が次に出た所で文字列の終わりとみなされるので
tag0 = "<parm xmlns="
http://ruby_xyz ">\n"
と書くと,
tag0 = "<parm xmlns="
http://ruby_xyz ">\n"
と書いてるのと大差無い
エスケープして書くならこうすればいい
tag0 = "<parm xmlns=\"
http://ruby_xyz\ ">\n"
「"」をエスケープするのが面倒なら %Q を使って
tag0 = %Q!<parm xmlns="
http://ruby_xyz ">\n!
とかも書ける 詳しくはマニュアルなど参照のこと
> 目的はtag0と他の文字列Aを組み合わせてできる文字列Bの生成です。
の意味がよくわからないけど,これで解決しただろうか
>>931 言語に関係なくミリ秒の計測はソフトウェア上では正確にはできません
ハードウェアによる直接のサポートがどうしても必要
>>932 ,933
有難うございます。エスケープ文字列の問題だったのですね。
エラーの指摘箇所がコロンのところだったので、てっきりこの文字が原因だと思っていました。
>>935 エラーメッセージが教えてくれるのは転んだ場所でしかなくて
躓いたりぶつかったりの転ぶ原因は大抵別の場所にある。
遠く離れた場所で怪我してたから転んだなんてこともあるぐらい。
ありがちなのは想定外のオブジェクトに化けているパターン。
obj = ["hello,", "world"]
obj = "!" # 本当は obj << "!"
puts obj.join # ここでNoMethodError
文字列処理で質問です(ruby1.8.6) 日付と時刻を文字列化し、その末尾を2桁づつ抽出したいのですが、 片方で4桁になってしまいます。 nowTime = Time.now.strftime("%Y%m%d_%H%M%S") # 現在の日付と時刻 timeLen = nowTime.split(//).size # 上の長さ value01 = nowTime[timeLen-4, timeLen-3] # nowTimeの末尾4文字目と3文字目 ← ※4桁になる value02 = nowTime[timeLen-2, timeLen-1] # 同様に1文字目と2文字目 p value01+", "+value02 # 2桁づつで表示 ← 実行すると4桁と2桁 どうすべきでしょうか?
『まつもとゆきひろ コードの世界~スーパー・プログラマになる14の掟』 スーパー・プログラマってのが厨臭いなあ。書き下ろしだそうだから買っちゃうかもしれないけど。
>>937 そんなんTimeオブジェクトのメソッドで時間とか分とか出せばいいじゃん、というのはとりあえず置いておく
nowTime = Time.now.strftime("%Y%m%d_%H%M%S")
mm = nowTime[-4, 2]
ss = nowTime[-2,2]
puts "#{mm}, #{ss}"
>>937 最終的に欲しいのは YYYYMMDD_HHMMSS の中の DDSS なんだよな?
リファレンスマニュアルで Time#strftime とついでに String#size,String#[] を調べてこい
942 :
デフォルトの名無しさん :2009/05/14(木) 18:24:50
open-uri で each_line のように一行ずつではなく、 取得した内容全部を一気にごそっと変数に入れるにはどうしたらいいでしょうか
readで全部読む
っていうかread以外用途ないよね
サーバ側がchunkedでだらだら送ってくるのをeach_lineでだらだら処理、とか できるようになって...るんだろうか?
>>946 そのマニュアル、もう凍結されてるよ
今はるりまに移行してる
950 :
デフォルトの名無しさん :2009/05/14(木) 22:25:28
>>914 > ドキュメント
> Document
>
> matzの苦手なもの。彼は普段から「ソースがドキュメントだ。
> バグも完全に記述されている」と主張しているが、誰も受け入れない。当り前だ。
・・・w
952 :
デフォルトの名無しさん :2009/05/15(金) 08:02:23
>>949 Google の検索では凍結されたページが上位に来るのは問題だね。
るりまに転送とかできないのかな。
Googleさんに菓子折でも持って行けばやってくれるんじゃね?
単純にリダイレクトしたら。
ここにいる全員のドキュメント嫌いも相当なものですな
ソースがドキュメントでテストが仕様書
>>953 そういうこと言うとRubyユーザーはHTTPも知らないとか思われそうなのでやめてくれ
sinatra で require 'rubygems' require 'sinatra' get '/' do "hello" end とだけの場合、/test や /xxx みたいに定義されていない URL を叩かれるとエラーになるけど、 その場合は「ページが存在しないよ」と出すにはどうしたらいいでしょうか。
>>959 Not Found
When a Sinatra::NotFound exception is raised, or the response’s status code is 404, the not_found handler is invoked:
not_found do
'This is nowhere to be found'
end
とあるね。
962 :
デフォルトの名無しさん :2009/05/15(金) 16:29:18
>>962 そのリンク先の
>○シンプルタイマー(ソースコード)
がほぼそのまんま答えなんだけどな。
というか「作りたいと思っています」なら、動かないものでいいからコード書いてみ。
添削はするし、わからない部分は具体的に聞いてくれれば答えるから。
ちなみに4行で書ける。
965 :
962 :2009/05/15(金) 17:08:54
>>963 レス有難うございます。
直後に時刻のエポック秒変換の記述を手元の本で見つけましたので
なんとか動作するコードは書けました(下記)。
# OSC01.rb
count = 0
time0 = Time.now.to_i
while true
if time0 +3 == Time.now.to_i
puts "3sec"
time0 = Time.now.to_i
count+=1
end
#
if count>10
break # 11回以上でwhileループをBreak
end
end
・・・明らかに4行は超えてますw
>>965 何回で止めるっていう条件が出てなかったしね。
while
sleep 3
puts "3sec"
end
ちなみに分岐が一文だけならこういう書き方もできることを覚えておいて。
break if count > 10
>>966 有難うございます。
sleepってメソッドだったのですね。
969 :
デフォルトの名無しさん :2009/05/15(金) 19:58:36
CRubyがMRIだから松本さんが開発されたのかと思ったのですが、 検索でトップにくるのはGCを作成している方です。 Rubyの開発とはGCを開発することなのでしょうか?
最近の言語全般で強ち間違ってないような気もするが、多分そういう話でもないんだろうな
971 :
デフォルトの名無しさん :2009/05/15(金) 20:09:51
loop {break if count > 10} 上にあるこういう書き方ってRuby的にどうなの? Integer#timesを使わない理由って何?
countが不規則に増えるとか
初心者の書いたコードになに嫌味つけてんのw
>>969 マジレスすると、一般的にCRubyとは言わず、単にrubyと呼ぶことの方が多いからそうなる
モノ教えるのに幾許かでも慣れてないとこういう時困るよな
まあ少子化だしな 関係ねえか
978 :
デフォルトの名無しさん :2009/05/15(金) 20:38:50
979 :
デフォルトの名無しさん :2009/05/15(金) 20:59:28
すみませんでした。
次スレ立てろよカス
982 :
デフォルトの名無しさん :2009/05/16(土) 04:43:41
ruby1.8.6です。 ファイルアクセスが他のソフトとぶつかる場合で質問です。 Rubyで周期的にXMLファイルを上書きしていますが、この上書きのタイミングと 他のソフトによるXML読み込みが衝突した場合(と思われる時)、 in 'initialize': Permission denied - new XML.xml (Errno::EACCES) というエラーメッセージが出ます。 そこでRubyの振る舞いとして、他のソフトがファイルアクセス中は上書きを延期するか、 あるいは別の方法で衝突を回避したく思います。 何か良い方法はありますでしょうか? なお別のソフト側で衝突回避を試みましたが、上手くいかないためRubyに望みを 託すことにしました。
Rubyあんま関係ないな ファイルロック(またはロックファイル)でぐぐれ たいていの場合両方のソフトが対応してないといけないが、 たいていの場合相手のソフトはそんなもん作ってない なお、直接 File.open(path,'w'){|f| f.write(data)} するのではなく File.open(path_v,'w'){|f| f.write(data)} File.rename(path_v, path) と、ファイル移動をOS任せにしたほうがファイル書き込みアクセス衝突の可能性自体は減る ただし、これだと rename でファイルを掴むまでに起こったディスク上の変更を検知できない このへんの衝突可能性に気を遣ってるソフトはあらゆる永続的データ保存に「別名保存→名前変更」のプロセスを使ってるので そのソフトの使ってる別名保存名がわかればもしかしたらロックファイルのように使えるかもしれない
>>984 Rubyに関するまとまった初心者向けの解説サイトまたは書籍を通読しろ
単に基礎知識が足りない
わかりました。ありがとうございます。
Rubyだけに関する知識じゃなくて、 もっと一般的にプログラミングで使用される基礎的な概念に関する知識だな。
990 :
デフォルトの名無しさん :2009/05/16(土) 10:13:56
999
991 :
デフォルトの名無しさん :2009/05/16(土) 10:15:22
1000!
いやそこまでギリギリじゃないから
あれw 1000!にだまされた
1000なら今年Ruby2.0
こんなスローなスレでそんなことしてもw
1000ならRubyは俺のもの
エッチでリッチなかーちゃん、Rubyをせしめてフランスへ。
とうきょう ルビルビ リズム ルビルビ 心ズキズキわくわくー
1000 :
デフォルトの名無しさん :2009/05/16(土) 16:02:22
10^3
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。