プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】
【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です
関連スレやURLは
>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
instance_variable_get() instance_variable_get() instance_variable_defined?() はありますが instance_variable_delete() はないでしょうか。 あるオブジェクトからインスタンス変数を完全に取り除く方法があれば教えてください。
現状ではない
というかそのへんに依存したコードは書くべきではないと思う
>>6 remove_instance_variable
ちなみに俺は
>>8 の意見には反対、使っても全然OK派
リフレクション機能を使うべき場面で使うのは全然問題ないのだが、今が使うべき場面なのかどうかは真剣に考慮しよう。
98パーセントくらいは使う必要ないよね
プログラミング言語ruby読んでクラス定義とかのフックの柔軟さを知ったときは キモッって思った一方これ使ったら綺麗に書けそうなプログラムがあるなあとも思った
多くは「○○という機能を使ってみた」程度であるのは否定はしない ふつーに書いたほうがわかりやすいし、多くの場合動作も速い
普通に書けるなら普通に書くのがいい さらに特殊なケースへの対応として、 プログラマがその気になればRubyは大抵の無茶を許してくれる
仕事でRubyを使う場合は、どんな業務になりますか? やはりWeb系ですか?
16 :
デフォルトの名無しさん :2009/07/03(金) 17:58:27
>>15 仕事でRubyを使うことはないです
強いて言うなら趣味グラマーの用途しかありません
>>15 サーバは自前で用意するから、という案件が2年でやっと2個
Java, PHP > 量産の壁 >> Perl >> なんかシャレにならない壁 >> Ruby on Rails > Python (激レア)
こんな感じ
「こんなソフト作ってという仕事取ってきたからじゃあRubyで作ろうぜ」というのはまずありえない
言語は伏せるけどシステム作るから買ってーという営業込みでないとお金にならない
Rubyが社内ツールとしての地位を確立してて、
とっても便利に業務進めてる会社に心当たりがこれまた2つあるが、
じゃあこの便利なRubyでシステム作って売ろうぜという話には間違ってもなってないようだ
まあ適材適所って奴だな
Rubyを使えるということを評価する会社はいい会社だと思うが、Rubyしか使えない人を雇う会社は駄目会社
>>16 なるほど、そうですか。残念ですね。
>>17 やっぱり、Java、PHPなんですね。
まだまだ普及というか認められていないんですね。
趣味でしこしこ勉強します。
19 :
デフォルトの名無しさん :2009/07/03(金) 18:28:17
>>18 認めるというか、Rubyにする必要性がないといった感じ
Webサービスを作って、ベンチャー起業で金稼ぐのならRubyでも行けるかもしれないが そもそも日本でベンチャーを興すのは難しいらしいしな
>>19 それだと今後も期待薄ですね。
>>20 限られた人らのツールになりそう。
>>9 >remove_instance_variable
ありがとうございます。これってprivateメソッドだったんですね。
Object.new.methods.grep(/instance/) で探してたので、見つけられませんでした。
精進します。
とりあえず、rubyの遅さとメモリ量の食い方で、自分のサーバーで適当に 遊んでるくらいしか使ってないなー。 あっ、後初期設定だるいかなー apacheにfast cgi入れてうんたらかんたらは面倒〜
下にある 0.0.20060523.tar.gz のリンクはruby-lang.orgに 置かれている実tar玉で、生きているようだ。 とりあえずそれで凌げるかどうか試してみては?
26 :
24 :2009/07/04(土) 01:06:42
>>25 そっちもブラウザでやってみたんですけどFirefoxでは
内容符号化 (Content-Encoding) に問題があります
IEとChromeではつながらず。
UnixからwgetではDLできたけど展開できませんでした
リンクは...tar.gzになってるけど中身はHTMLみたい
質問があります $stdoutでファイルを指定し、そこに結果を入れるようにしたのですが、 できたファイルを開くと、結果の頭部分しか入っておらず、困っています エラーはでていませんし、標準出力の場合や、リダイレクトをした場合は結果の全てがきちんと出力されています プログラムは以下です sv = STDOUT.dup $stdout = File.open("ファイル名", "w") 結果を出力 $stdout = sv わかる方いましたら教えていただけないでしょうか OSはLinuxでRubyのバージョンは1.8.5です
flushしてみたら?
・ ファイルに出力するよモードになったときはファイルに出力
・ ファイルに出力するよモードじゃないときは標準出力に出力
・ これを $stdout への代入だけで切り替えたい
という処理をしたいと推測
いちいち
>>29 するのはコードが面倒になると思うので、
sync=true したファイルIOオブジェクトを $stdout に指定しろ
>>28 本筋とは関係ないけど、たぶんそれSTDOUTをdupする必要はないな
$stdout = STDOUT
でおk
元に戻すならsv = $stdoutのほうがいいような まあどちらにしてもdupは要らんね
>>29 やってみましたが、結果は同じでした・・
>>30 下手な質問で申し訳ありません;
>・ ファイルに出力するよモードになったときはファイルに出力
>・ ファイルに出力するよモードじゃないときは標準出力に出力
>・ これを $stdout への代入だけで切り替えたい
で合っています
が、やはりできませんでした
すいません・・
>>31 >>32 わかりました
やり直してみます
みなさんありがとうございます
f = File.open("ファイル名", "w") f.sync = true $stdout = f これでなんとかなんね?
>>34 できませんね…
自分がLinux初心者のため、出来たファイルを開く際、文字コードに関する不具合(文字化けとか)によって
中身がおかしいのかもしれないです
別の方法でやってみますね
助けてくださってありがとうございました
36 :
デフォルトの名無しさん :2009/07/04(土) 13:49:26
よくわからんけど、グローバルな$stdoutに代入していいのかにょ?
代入できるように定数とグローバルの両方が存在してる
38 :
デフォルトの名無しさん :2009/07/04(土) 13:53:38
39 :
デフォルトの名無しさん :2009/07/04(土) 15:54:40
たのしいRubyを読んでいます。 クラスとモジュールの違いがよく理解きないです。 解りやすく教えてほしいです。
違う本よめ
クラス 普段使うもの 処理を分類したもの(メソッド)を起動するオブジェクトの生成器 基本的にはこれだけで生きていける モジュール 普段使わない ガチ初心者のうちは自分から作らなくてもいいというかむしろ忘れろ initialize できない(そもそも作れない) クラスAとクラスBに共通メソッド群Mを持たせたいという場合、Mをモジュールにすると楽 クラスMを作って継承しても用が済むことがほとんどだが、モジュールにしたほうが本当はいい
クラスはモジュールの一種 つまりクラスはモジュールとしての機能を全て持っていて その上で、特別にインスタンス化することができる 具体的には、あのnewってのができる
必ず親があるのがクラス(親を指定しなければObject)、親のないのがモジュール。 継承して使うのがクラス、includeして使うのがモジュール。 Classクラスのインスタンスなのがクラス、Moduleクラスのインスタンスなのがモジュール。 ModuleはClassのスーパークラス。
初心者スレ的には
>>41 に一票
まーあれだ、半年くらいダラダラ使ってればある日突然わかるからあんま心配すんな
日常的には「よくわからんけど○○らしい」程度の理解で充分
>>28 同じようなことしてるけど、
#最初
$stdout=File.open("filename""w")
出力
#最後
$stdout=STDOUT
ってなってた。
ある日突然オブジェクト脳が閃く感じか。
すべてはClassクラスのインスタンスということで良いのでしょうか? Ruby1.9.1では、BasicObject、Object、Class、Moduleもすべて。
…あんまそんなこと気にしないほうがええぞ
>>48 に同意しつつも答えとく
>>47 >すべてはClassクラスのインスタンス
とりあえず
class Foo; end
は暗黙的にObjectを継承するし
obj = Foo.new
のobjはObjectインスタンスの性質も多く含むけど(というかこの場合そのまんま)
あくまでもobjはFooのインスタンスであってObjectのインスタンスとは呼ばない
という前置きをした上で
全てのクラスそのものがClassインスタンスっていうのは正しい
Object.new.class #=> Object
Object.class #=> Class
「インスタンスを生成する役割を持つもの」がClassクラスのインスタンスであり
Rubyではそれを「クラス」と呼ぶ
でもそれによって生成されたインスタンスは「クラス」ではない
もちろんClassのインスタンスという特例は除く
>>49 Rubyではすべてがオブジェクトであるという文言が
気になった次第です。
>>48 Classクラスのインスタンスはクラスオブジェクト(Object、Fooなど)
ということになるんですね。
クラス(Class)のインスタンスがクラスオブジェクト(Foo)で、
クラスオブジェクトFooもまたインスタンスを生成してと。。
やはり必要時以外は考えないようにします。
51 :
39 :2009/07/04(土) 22:06:38
みなさん、ありがとうございました。 けっこう、すっきりしました。
その辺のぼやーんとした認識に直視せざるを得なくなる本が プログラミング言語Ruby 凄い濃い本だが確かに初心者にはお勧め出来ない
まああれは どの言語にも一冊はあるような「しっかりした本」だから・・・・・・ 細かい挙動を確かめたくなった時に、手にとればいい
class Widget def initialize(x, y) @x = x @y = y end end インスタンス変数に @x = x と書くのと self.x = x は同じ意味ですか?
この場合のメソッド定義内で書く self.x = は インスタンスメソッド Widget#x= を起動する インスタンスメソッド Widget#x= の内部でインスタンス変数 @x にアクセスしてるかどうかは x= の定義による
おそらく、自メソッドの引数 x と被るインスタンスメソッド x を起動したいんだが、 そのまま x とだけ書くと引数の変数 x にアクセスしてしまうので それを避けるために明示的にメソッド x を指示したいのだろう
class C def initialize(x) puts "x は #{x} です" puts "self.x は #{self.x} です" end def x return "メソッド" end end C.new('引数') 結果 x は 引数 です self.x は メソッド です
>>55 >>56 レスありがとうございます。
セッター(x=、attr_writer、attr_accessor) を明示的に定義しなければ、self.x は
def x=(x)
@x = x
end
が実行されたのと等価なので、結果は同じということですよね。
>>57 レスありがとうございます。
僕はゲッター、セッター
hoge = self.x
self.x = poge
がメソッドだというのを忘れがちです。
60 :
58 :2009/07/05(日) 12:51:43
>>58 セッター(x=、attr_writer、attr_accessor) を明示的に定義しなければ
これはウソでした。
セッターattr_writer、attr_accessor は必要です。
他の言語にあるセッターやゲッターというものはRubyには存在しない あれはただの値を返すメソッドで、attr* はメソッド定義を肩代わりする略記に過ぎない module AttrReader def attr_reader(arr) arr.each do |method_name| eval("def #{method_name} return @#{method_name} end") end end end class C include AttrReader attr_reader([:x]) end と class C attr_reader :x end はリクツ上おおむね同じ動作をする attr* を使う動作上のメリットというのは何もない メソッド定義書くのがちょっと短縮されるというだけだったりする
>>61 なるほど。
だからreader、writerと呼ばれるんですかね。
63 :
デフォルトの名無しさん :2009/07/05(日) 14:36:28
Ruby作者ってしゃべりかたが変わっていないか? なにか障害をもっているの?
64 :
デフォルトの名無しさん :2009/07/05(日) 14:38:34
早口なだけじゃね? 俺もリアル世界では早口って言われる。 相手が聞き取りやすいようにゆっくり話すように心がけているが ...orz
>>63 matzのことなら、最低限一般水準程度には普通に、また俺的にはとても知性的にかつ
フレンドリーに喋ったり発信しているように見受けられる
まあコミュニケーションには受け手の問題もあるのは知ってるので、
>>63 の見解も
頭から否定する気はないが
誰だったかが言うには 「頭の回転が速すぎて口が追いついてない」
67 :
デフォルトの名無しさん :2009/07/05(日) 14:48:42
どうしてIBMとか大企業に就職しなかったの?
隔離スレでやれ
70 :
デフォルトの名無しさん :2009/07/05(日) 14:53:20
>>67 飼い慣らされると痛い目に遭うから、だと思う。
>>67 在学中に有名になってしまって、就職する必要がなくなった。
単に入社試験で落とされたとかだろ。
クリエイターとして生きることができた人に「どうして就職しなかったんですか」というのは単なる愚問だ 就職しなくても生きられたから就職しなかったというだけに過ぎない
なんか特定の条件のときに特定の TestCase クラスのユニットテストを実行しないという芸当は可能ですか
test_ で始まるメソッドを undef すればいいんじゃね
既存のクラスのメソッド定義を、include のようなものであとから書き換えることはできますか? 対象となるクラスは既に他のクラスを継承してるので、追加メソッド群をクラスにして継承してもらうことはできません。
該当クラスのオブジェクトが生成されるより前に、 「該当クラス定義を再オープンしてメソッド定義を書き換える」というeval系の何かを適当に実行
>>77 普通にdefするだけじゃだめなの?
class A < S
end
class A
def extra_method
end
end
もしくは、単にincludeするとか
>>79 includeでクラスのメソッド定義を上書きできるとは初耳だな
>>80 superclassよりは優先されるから一応は出来る
自身のメソッド定義は覆せないけどね
「既存のクラス」の名前を決め打ちで利用されてるのではなければ
もう一度継承して(「既存のクラス」をsuperclassにして)からincludeすればいい
決め打ちされてるなら・・・
>>79 の方法になるんじゃないかなぁ
とてもお勧めできない方法
class Foo; end
class Bar < Foo; end
Foo = Bar
Foo.new.class #=> Bar
>>77 の質問の意味がいまいち良くわからないんだよねえ
具体的なコード片とかが無いとどう困ってるのかわからなくて答えにくい
まあ全くお勧めしないが module Hoge def included(c) c.class_eval do alias fuga_original fuga def fuga; (処理) end end end end とかやったのをincludeすればいけるかもしれない
open-uriに関する質問です。
特定のurlで下記のスクリプトがエラーを出力します。
エラー文: `close': closed stream (IOError)
============= ここから ============
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}
url = '
http://gimpo.2ch.net/bakery/subject.txt ' # errorが起きる
url2 = '
http://anchorage.2ch.net/live/subject.txt ' # errorが起きない
url3 = '
http://gimpo.2ch.net/salt/subject.txt ' # errorが起きる
open(url, header) do |io|
Zlib::GzipReader.wrap(io) do |gz|
puts gz.read # urlの中身が出力されたあとにerrorが起きる
end
end
============= ここまで ============
open-uri, zlib, 2chの鯖のどこに問題があるのでしょうか?
openのブロック付き呼び出しの中でさらに別のIOオブジェクトをブロック付きで呼び出していることが原因なのかと考えたのですが、
特定のurlでのみ起きる理由が分かりません・・・。
>>84 Zlib::GzipReader.wrapが自動的にioをcloseし
さらにopenのブロック実行後にioをcloseしようとするから
IOErrorが出るのは正しい動作
url2でエラーが出ない方がおかしいんだけど何故かはわからん
要するにcloseが二回実行されないようにすればいいんだが
それはリファレンスマニュアルでZlib::GzipReader.wrapの所を嫁
>86 レスありがとうございます。 解決策のほうも分かりました。 ところで>85の例でエラーが出なかった理由は Zlib::GzipReader.wrapがcloseされていなかったからioもcloseされず、ioがopenによって正しくcloseされたからという理解でよろしいでしょうか? IOオブジェクトを用いる場合には file = IO.open(foo) begin <処理> ensure file.close end IO.open(foo) do |io| <処理> end のどちらかで記述するというのが常識ですが、 IO.open(foo).read のような使い方をするとそのIOオブジェクトはcloseすることができなくなってしまうのでしょうか? 重ね重ねの質問ですが、長らくの疑問で調べても分からなかったのでご回答いただけるとありがたいです。
> ところで>85の例でエラーが出なかった理由は ... あってる > IO.open(foo).read ... これではIOインスタンスへの参照がないからcloseしようがない、開きっぱなし data = (io = IO.open(foo)).read とすればio.close出来るけど普通はIO.read(foo)とするな ほっとけばGCが何とかしてくれると聞いたような違ったような?
UTF-8 文字列に対する NKF.guess がだいたいいい感じに動作する文字数って何文字くらい? irb> NKF.guess("ねこだいす") 5 irb> NKF.guess("ねこだいすき") 6 irb> NKF.guess("ねこだいすきっ") 5 とかいう結果でちょっとぐんにょりしてるので
これは非常に有名な話だが、読点を入れると NKF.guess の誤認識の確率が素晴らしく減る irb> NKF.guess("ねこ、だ") 6 irb> NKF.guess("ねこ、だい") 6 irb> NKF.guess("ねこ、だいす") 6 irb> NKF.guess("ねこ、だいすき") 6 irb> NKF.guess("ねこ、だいすきっ") 6 irb> NKF.guess("、") 6 ということで、読点入れた文章使え
nkfにバグのあるバージョンのrubyを使ってないか? 最近ruby-talkでそんな話題があった気がするが。
93 :
92 :2009/07/06(月) 09:39:16
1.8.7 patchlevel 160 ではこんな感じ irb(main):002:0> NKF.guess("ねこだいす") => 6 irb(main):003:0> NKF.guess("ねこだいすき") => 6 irb(main):004:0> NKF.guess("ねこだいすきっ") => 6
文字列を自由に設定できるのなら読点入れるのが間違いないとは思う
それならそもそもguessする必要ないだろ
字句解析には、まともに使えないってことだな。
文字コード推定と字句解析の関連をkwsk
Mule や Emacs が、読み込んだファイルの文字コードを自動判定するのは ご存じだと思うが、Meadow 2 や Meadow 3は、 UTF-8 のファイルの文字コードを、けっこう間違える。 一方、秀丸はほぼ絶対間違えない。 これらの違いは何だろうかということと、同じような実装をNKF でもできないのかな?と思った。
ほうほう、つまり CP932 と UTF-8 以外の優先度を下げろと
100 :
98 :2009/07/06(月) 11:05:55
いや、そういうつもりはない、というか秀丸とかは、内部でそういう実装になっていたのか。 知らなかったよ
結果的に正しく判断される確率が高い方がいい
そのためには文脈情報が要るんだよ HTML だったら charset 読んでみるとか 句読点が改行文字の直前にあったら日本語だと思ってみるとか 東欧辞書にマッチするバイト列が頻出したら Latin-2 だと思ってみるとか Iconv が guess に該当する機能を一切提供してないのは手抜きじゃなくて必然 多エンコーディングに対応すればするほど指数関数的に推測のコストは上がる 日本語だけ取っても Shift_JIS と CP932 と EUC-JP と EUC-JP-MS の4つを区別するのは至難 っていうか規格をちょっとずつ混ぜるなめんどくさいから あとケータイ絵文字入り文字列をキャリア情報なし端末情報なしの素で送ってくる奴は即死刑で
次の質問の人どうぞ
/usr/local/lib/ruby1.9/1.9.1/minitest/unit.rb:359:in `puke': incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError) イライラ
rrseをUTF8で使うにはどうすればいいですか?
>>104 Ruby1.9向けテストで「なんかどっか書き間違ってる」時に出るやつだな
具体的にどのへんの行で詰まってるとかヒントぜんぜんなし
かろうじて -v でテストのメソッド名が出るくらい
>>105 rdoc のファイルと同じエンコーディングを -K とかで指定すればいいんじゃね
>89 詳細な解説ありがとうございます。 ためになりました。 >88 >普通はIO.read(foo)とするな IOオブジェクトを簡単に読み取るにはこの方法を使えばいいんですね。 しかしopen-uriで拡張されたopenには同等のメソッドがありませんね。 URI.parse(foo)がIO.read(foo)と同等のことができますが、 URI.parseはHTTPリクエストのオプションをつけて動かすことができないんですよね。 URI.parse(uri, 'hogehoge' => 'foobar')のように。 アドバイスをいただき>84での問題は解決したのですが次の問題が発生してしまいました。。
下記のスクリプトがエラーを吐きます。
エラー文: `initialize': buffer error (Zlib::BufError)
困ったことに、通ったり通らなかったりします。
原因はたぶんですが2chのサーバが出力しているgzip圧縮したsubject.txtのほうだと思います。
板内のスレいずれかにカキコミがあればsubject.txtは書き換わるため、通る場合と通らない場合があるのだと予想しています。
しかしエラー文の意味がよく分からず、どのように回避すればよいのかが分かりません。
ちなみに拾ってきたgzip化subject.txtファイルをHDDに書き込んでアーカイバで開くと正しく読み取れています。
============= ここから ============
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}
url = '
http://gimpo.2ch.net/bakery/subject.txt ' # errorが一度も起きていない
url2 = '
http://gimpo.2ch.net/kagu/subject.txt ' # errorが起きたり起こらなかったりする
open(url, header) do |io|
Zlib::GzipReader.wrap(io) do |gz|
puts gz.read # urlの中身が出力されたあとにerrorが起きる
end
end
============= ここまで ============
>>109 原因は一発でわかったが、そろそろあんま話したくない
HTTPの知識のない状態でなに作る気なん?
別にいいじゃん。初心者スレなんだし。 答えるのいやなら他行けば?
libwww-perlの轍踏む気にはならんね
まあサイトや回線にどんだけ負荷かけて裁判起こされようが知ったこっちゃないが、 このへんがわかんないのはそもそも辛いと思うんだがどう open-uri で open してテキストを read する以外の事をしようと思うなら、別途勉強がいると思う
2chにアクセスするアプリケーションは自力で調べて作ってもらうというのが一応不文律だったりする
>>109 open-uriは便利に見えるけどハマると厄介、net/httpの使い方をおぼえろ
res = Net::HTTP.get_response(URI(url))
txt = res.body
if res['content-encoding'] =~ /gzip/
txt = Zlib::GzipReader.wrap(StringIO.new(txt)) {|gz| gz.read }
end
puts txt
>>110 原因を教えてもらえないだろうか?
うちの環境では例外が発生しないので問題がわからない
content-encoding見てないのはマズいと思うけど
>>109 はHTTPレベルの問題じゃないような
付け加えておくとgzじゃないものを食わせた時は Zlib::GzipFile::Error: not in gzip format
もなじら名乗ってない時点で問題外
>109のスクリプトを書き間違えていました。
============= ここから ============
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}
url = '
http://gimpo.2ch.net/bakery/subject.txt ' # errorが一度も起きていない
url2 = '
http://gimpo.2ch.net/kagu/subject.txt ' # errorが起きたり起こらなかったりする
open(url, header) do |io|
Zlib::GzipReader.wrap(io) do |gz|
puts gz.read # urlの中身が出力されたあとにerrorが起きる
gz.finish #<= 書き忘れ
end
end
============= ここまで ============
>110
2chのスレのdatを収集するプログラムです。
たまに気がつくとスレが1001になってdat落ちしてしまって、最後に開いた地点までしか読めなくなるのが悲しいので、
過去に開いたことがあるスレを定期的に拾いなおしてくれるプログラムを作りたいと思いまして。
プログラム自体は完成していて意図した通りに動くのですが、
転送量を少しでも削減したくてdatだけではなくsubject.txtを拾うときにgzip化しようと欲を出したらうまくいかなくなりました。
スレ更新をせず書き込んでしまいました。 >113 一応、DLする度にsleep 1.0 を入れています。 これでは不十分でしょうか? >114 それは大変失礼しました。 今後は自力解決したいと思います。 >115 datの取得ではnet/httpを使っています。 一つのdomainから複数のファイルを拾うときにはnet/http, 1つのファイルを拾うだけならopen-uriというふうに使い分けていました。
121 :
115 :2009/07/06(月) 17:17:01
header渡してなかった txt = URI(url).read(header) if txt.content_encoding.include?('gzip') :
122 :
デフォルトの名無しさん :2009/07/07(火) 10:40:42
すいません。 Ruby 1.9.1を使用しているのですが、クラスを生成する時にinitializeメソッドで初期化を行うと思うのですが、ファイルの内容で初期化をしたい時に、そのファイルが存在しない場合、クラスの生成をしないようにするにはどうすればいいのでしょうか? やはり、newメソッドをオーバーライドするしかないのでしょうか?
class Hoge def initialize YAML.load_file('config.yaml').each do |k, v| eval("@#{k} = #{v}") end p "Hoge initialized." end def self.make File.exist?('config.yaml') ? self.new : nil end end で、Hoge.make を Hoge.new の代わりに使うようにする
125 :
デフォルトの名無しさん :2009/07/07(火) 11:01:38
>>124 エスパー乙
エスパー内容から逆に元の質問を読解すると、こうかな。
インスタンスを生成する際、initializeメソッドが実行されるが、
特定の条件によってインスタンスを生成せず、かつ、例外を
送出せずにnilを返したい場合、どのようにすればよいか?
もちろん、一般的には例外発生でいいと思うんだが、それじゃ
なんかまずい?
>>122
127 :
デフォルトの名無しさん :2009/07/07(火) 11:12:49
>>126 分かりづらい質問の書き方ですいませんでした。
例外発生でも問題ないと思いますが、124さんの回答がしっくりくるので、124さんの回答を参考にさせていただきたいと思います。
Rubyが他言語に比べて最も優れている機能は何?
極力オブジェクト指向なスクリプト言語であることそのもの なにかRuby固有の機能というのは存在しない スクリプト言語としてさまざまな現代的機能がまとまった形になっていることが、強いてあげれば最大の機能
意識せずに使えるクロージャ 他は似たりよったり
if が値返すとこ
残念
133 :
デフォルトの名無しさん :2009/07/07(火) 16:47:51
128じゃないけど、Smalltalkと比べた時の強み・弱みってあるかな。 この比較にけっこう興味ある。
なにその「カレーとスパゲティどっちがおいしい?」みたいな質問
Smalltalkと比べると、強みは普通の言語であること、弱みも普通の言語であること、ということになりそうだ。
てゆーか Smalltalk との比較行為が妥当な言語ってそれだけで価値があると思うんだが
Perlと比較してどうなのかね
139 :
デフォルトの名無しさん :2009/07/07(火) 17:18:43
>>138 強み:日本語環境の充実
弱み:ライブラリの少なさ
Rubyにするメリットがない
>>134 弱い強いは立ち位置で真逆になるから、あくまで「違い」としてなら、
UNIX的であるか、そうでないか(あえて言えばSmalltalk的か)というのは中でも目立つ違いかもね。
卑近なところでは、OS としての機能を持つか(Smalltalk)、持たないか(Ruby)とか、
IDEや開発ツールを含むか(Smalltalk)、あくまで言語処理系の枠内にとどまるか(Ruby)とか。
あと、ちょっとその Smalltalk 的(ダイナブック的。アラン・ケイ的思想)なこととも関連するけれど、
Ruby処理系は一般的に TATWD = Turtles all the way down ではないこと。加えて、
処理系を含めたプロダクトが「動かしながら変えてゆくこと」を想定してないこと(UNIX的。C言語的)は
Smalltalkを選ぶかRubyを選ぶかの判断基準になるかも。端的には言語使用を利用者が自由にいじれるか的なところ。
これらと遅いことを除けば、RubyにあってSmalltalkに(Smalltalk的視点から)劣るところはほとんどないのでは?
逆にそういうふう(つまり、UNIX的な立ち位置ではSmalltalkに負けないよう)に意識してRubyは作られているはず。
日常で特段困らんレベルだとは思うが、 日本語関連で Perl よりなにか抜きん出てる面があるとはあんま思えんな
やっぱ仕事のことを考えると、Perl覚えたほうがお得ということか?
>>143 お前は英語しゃべれたほうがお得だろうかとかわざわざ考えるのか?
普通はどっちかしか出来ない奴よりは両方出来る奴をとるな
一つ身につけるだけでイッパイイッパイとかどんだけー。
どっかでも書いたけど、Rubyだけしかできない奴は業務上はゴミ以下のクズ ただし、何か他の言語が使えてなおかつRubyもできるという場合は、 Ruby以外の言語を使えると申告した場合よりもいい会社に目をかけてもらえる確率が結構上がると思われる
148 :
デフォルトの名無しさん :2009/07/07(火) 18:27:06
Rubyしかできないって、プログラマですらないじゃん。 一つのメソッドに縛られない、より一般的な方法を知らない人は世界が狭いのぅ。
JavaやPHPはどうせ業務べったりだろうし就職してからその会社の様式で習えばいいやと思って RubyとPythonとSchemeをそれなりに勉強してたら そのままプログラマとして一度も就職できなかったという選択の要領の悪い俺様が通りますよ まあ派遣で倉庫仕分けじゃどっちみち意味ねーなwwwww
緑の人のレスは面白いなあ
日本語環境が充実してると実感した事は無いな。 javaみたいに環境で出力合わせてくれる訳でもないし。
就職を有利にしたいのに日本でRubyとかPythonはないだろ・・・ おとなしくjavaかC#でもやっときゃいいのに
このスレ、あんまり社会人プログラマいないのか?
学生です ><
COBOLプログラマです><
>>154 社会人プログラマやってるなら初心者スレなんか要領よく速攻で通過して欲しいもんだが
いっこだけ
>>153 業務の役には全く立たないんで、趣味でCだのJavaだのC#だのPHPだのやり込んでも無駄
趣味で2年やって学んだことは、会社では1ヶ月で学べてお釣りがくる
ただ、プログラミングに挫折しない性質を持っているという事前証明にはなるが、そんなの上記言語でなくても充分だ
>>158 無駄ではないだろ。
会社にも糞グラマはいるからな。
派遣屋が売り込みやすい言語のスキル磨いてもなあ。
仕事で Java, PHP やって 家で Ruby, Python など好きなのやればいいんじゃないの。
就職する前の話だろ
C Java C# PHP が業務に役立たないとか一体どんな仕事なんだろ 金融系?
>>163 「趣味で」という最重要な句をわざわざ外すのはなんで
趣味でやってたときのことって50パーセントくらいは単に役に立たなくて 49パーセントくらいの割合で逆に邪魔になるよね 趣味でやってた頃の知識経験が役立ったなんて思ったことねーぞ
趣味が何かによる問題
>>164 どこが重要なの?
「趣味」を「義務」とか他の語に置き換えても
「業務の役には全く立たないんで、(略)無駄」としか読めない
趣味で色々やってたおかげで どこの職場で何を作っても即戦力になれるよ。 やる内容によるのかもしれない。
知ってるだけで、すぐに手を動かせるだけで全然違うよな。 趣味でも楽しんでせっせと色々作ってる人は有利だと思う。
言語限定してるし知識としての問題じゃね Cを趣味で使ってる人はCでの業務に強いかどうかとか あまり関係ない気がするが
趣味が何かによる問題
実際にモノを作るやつは役に立つ傾向があるんじゃないだろうか いじるのが好きなだけというやつは・・・な気がする
仕事でプログラムを組むという点に絞れば、趣味でやってる時に覚えたことが7割、その仕事のために新規に覚えたことが3割、って感じだけどなあ。 設計段階で必要な業務知識とかは、そりゃその仕事やらん限り知ることはないわけだけど、設計手法とかはほとんど趣味で学んだことだし。
174 :
デフォルトの名無しさん :2009/07/08(水) 19:52:22
すいません質問させてください。 Floatのインスタンスが1.0のようにFixnumの1と同じだったら1に、1.2のようにFixnumで表せない数値だったら1.2のままにする、みたいなメソッドってありませんでしょうか? 教えていただけると幸いです。
>>174 def f(x)
y = x.to_i
x == y ? y : x
end
名前思いつかなかった
compact/simplifyとか? ruby facetsあたりに同じ役割のメソッドがあるかもな
>>175 その例、Fixnumの範囲なら問題ないが、
むちゃくちゃ桁数が大きくなると誤判定が起きるね。
実用上問題ないだろうからどうでもいいか。
>>174 Float または Integer を返す、というメソッドは公式メソッドとしてはあんまありえない動作なんで、
ふつーに if で書けふつーに
>>178 もちろん誤差で。
誤差があるにも拘らず同一とみなされてInteger化されること自体が問題だよね。
ん、まあ、なんだ、 割り算が割り切れたら整数で、割り切れなかったら小数で返して欲しいというようなマルチな要望は時々見る 10 / 2 => 5 10 / 4 => 2.5 これ、標準ではできないんだよね 10 / 2 => 5 10 / 4 => 2 10.quo 2 => 5.0 10.quo 4 => 2.5 どっちか
>>180 それはFloatへの理解不足という根本的な問題だと思う
>>182 そもそも、型が違うものを比較して「同じだったら」とかいう発言が
出てくる時点で理解が根本的に不足してるのは明らかだけどね。
型を変換したいというよりは、表示の都合で出力の際にそういう文字列で出したい、 というのなら要望としてわかる気がする。 文字列処理的な解決方法でも良いのかも。
質問、Windows で UTF-8 文字列を標準出力にいきなり出力したとして、簡単に読む方法はある?
require 'open-uri'
puts open("
http://www.ruby-lang.org/ja/ ").read.scan(/<title>(.+?)<\/title>/)
というコードをコピペで実行したとして、
「あっ UTF-8 かじゃあやり直し」という簡便な手段でやり直しはできる?
>>185 irb> require 'open-uri'
=> true
irb> puts open("
http://www.ruby-lang.org/ja/ ").read.scan(/<title>(.+?)<\/title>/)
繧ェ繝悶ず繧ァ繧ッ繝域欠蜷代せ繧ッ繝ェ繝励ヨ險隱・Ruby
=> nil
irb> puts open("
http://www.ruby-lang.org/ja/ ").read.scan(/<title>(.+?)<\/title>/).tosjis
NoMethodError: undefined method `tosjis' for #<Array:0x35a0f84>
from (irb):3
irb> puts open("
http://www.ruby-lang.org/ja/ ").read.scan(/<title>(.+?)<\/title>/).to_s.tosjis
NoMethodError: undefined method `tosjis' for #<String:0x35987e4>
from (irb):4
irb> require 'kconv'
=> true
irb> puts open("
http://www.ruby-lang.org/ja/ ").read.scan(/<title>(.+?)<\/title>/).to_s.tosjis
オブジェクト指向スクリプト言語 Ruby
=> nil
irb>
188 :
174 :2009/07/10(金) 00:05:36
いろいろレスありがとうございます。 うーんやっぱり公式のメソッドはないんですね。 勉強になりました。
そもそも別だしね。 実数と虚数を比べるようなものだし。
「別」ではない 真に別であるなら変換などできない 一応何らかの規則で変換できてしまう以上、別だと表現するほどのもんでもない
Windows環境なのですが、 ruby -Ku script/server して文字コード指定しても立ち上がる mongrel 1.1.5のエラーメッセージがSJISになってしまうのですが、 これ何故なんでしょうか?
ごめん、Railsスレと間違えた・・・誤爆
なんでRubyには固定小数点数が組み込みで無いの?馬鹿なの?死ぬの?
まー、そりゃ、浮動小数点をメインに据えたからだろ 浮動小数点がメインだから組み込み、固定小数点はサブだから BigDecimal で擬似的になんとかする 固定小数点数が組み込みで選べる言語ってそう多くないと思うんだけど
Cobolくらいじゃない?
そんな基本的なこともわからんやつを本スレに誘導するな 情報処理試験の本でも紹介しとけ
>>195 Common Lispに有理数型があったような
固定小数点数というとおよそ10進前提で話すような気もする。
逆引きハンドブック買ったですよ 細か〜いとこでハマってたんですが 華麗にスルーできましたよ これで1.9系をメインで使っていけそうです いやぁいい本に出合えました
202 :
デフォルトの名無しさん :2009/07/11(土) 23:29:59
>>200 信号処理屋が二進数の固定小数点数で演算するのは良く見るが。
非力なプロセッサでリアルタイム処理するのに。
つーか浮動小数点数なんぞ無かった……
本をほめたら宣伝かよw
まあ今どき業務でもなければ1.8系なんて使ってたのは
>>201 だけだったかもな
206 :
203 :2009/07/12(日) 01:42:26
そういえば python スレには やたら特定の本を勧める香具師がいるな 著者か出版社の自演としか思えん
それは断定できないだろうが、 何にせよ粘着されてるのは不幸なことだ
201で〜す 2chっぽい素敵なレスに大満足です ま、本は店頭で手にとって選べるんで 某大作RPG9のような悲劇は起きないから いいじゃないですか 1.9で文字コード周りでハマってたのが 解決したのですよ ちょいとコツつかむと一気に先に進める感じ ほんとRubyは楽しいですわ あ、ちなみに思いっきり業務で〜す 量が多いだけのシンプルな仕事ですけどね
Rubyでデータベース使うときってなに使ってます?postgresql?mysql?sqlite? 多分、何に使うかっていう問題になると思うんですけども。 文字数カウントする位だったらどれ選びます?sqliteが手軽そうかなと思ったんですけど
文字数じゃねぇや、単語数だ。
hash
うむ あと、複数のスクリプトが「同時」にアクセスする可能性があるのでない限り、永続化は pstore でいい
今ならPStoreよりは、YAML(YAML::Store)とかJSONとかの方がオススメ
YAMLとかは無駄度がさらに一段階上乗せされてるから苦手だ テキストファイルとして読む機会がないのにYAMLやJSONベースで保存する意味なんてなくね 割り切ってるPSTOREのほうがまだマシと思う
JSONって型指定できたっけ
>テキストファイルとして読む機会がないのにYAMLやJSONベースで保存する意味なんてなくね だってPStoreだとバージョンが古くなったときに読めないし
それはRubyが(ry
219 :
217 :2009/07/12(日) 08:22:07
付け加えると デバッグ中にデータファイルの中身を見たくなることが往々にしてあるため そうした場合に見るのが面倒だという点でも、PStoreはあまりおすすめできない
>>217 これは何度でも言うが、Marshal の仕様が変わったのだとしたらそもそも大改修が必要だ
そんなときのために普段便利な PStore を諦めるより、
そのときになって旧 Marchal から新 Marshal へのコンバータ書いたほうがきっと早い
ruby/GTKの1.9版はありますか? レポジトリや公式を見ても見つからないのです
PStoreのYAML実装であるYAML::Storeまじおすすめ yaml/store.rb見て単純さにびっくりしたw
223 :
217 :2009/07/12(日) 13:50:16
>>220 >普段便利な PStore
便利も何もYAMLと比べたときに特に便利な点がないよね、って話だよ
それまでにPStoreで蓄積したデータがあるのならともかく、今から新しく使い始める人に
PStoreを勧めるべき理由はほとんどない
(ファイルの小ささやdumpの早さはあるけど、それを気にするぐらいなら別のDBを使うべき)
それと何度でも言うが、Marshal.dumpで出力したデータは
Marshalのバージョンが古いと読み書きできなくなる
http://www.ruby-lang.org/ja/man/html/Marshal.html
>>223 >それと何度でも言うが、Marshal.dumpで出力したデータは
>Marshalのバージョンが古いと読み書きできなくなる
これはその通りだけど、それが実際に発生する可能性がどれだけあるのやら。
これを心配するなら、YAMLライブラリの互換性のほうがよっぽど心配。
PStoreのデータが読めなくなったことは過去数年ないけど、YAMLは1.8.3前後で
dumpの仕様が変わって困ったことになった。
まあ、あまり起こりもしないことを大げさに宣伝することはないんじゃない?
頭の片隅に入れておくべき事ではあると思う
普通にDB使えよ。さすが学生スレ その考え方じゃ仕事にありつけんぞ
だって、標準添付されていないから・・・
> それと何度でも言うが、Marshal.dumpで出力したデータは > Marshalのバージョンが古いと読み書きできなくなる これってYAMLだって同じじゃねーの > 普通にDB使えよ。 そうそう、DBMとかな
現状SQLite一択っしょ。 PHPが早々にエンジンごと標準添付にしたのはGJだったと思うんだ。
SQLite標準添付はうらやましいなぁ
入れればいいじゃん・・・
>>205 > まあ今どき業務でもなければ1.8系なんて使ってたのは
>>201 だけだったかもな
えー、そうなのか
今調べたら、1.8.5 だった。
上げるの面倒だな、おかしくなったらやだし。
db不要な場合も有るので、標準添付は抵抗有るな。 常に最新版/安定板追っかけてくれる保証も無いし。
SQLiteはSQL書かなきゃならんだろ
Marshal,YAMLはrubyのインスタンスをそのまま保存できる
open('my.db','w') {|f| f.write(Marshal.dump(hash)) }
hash = Marsha.load(File.read('my.db'))
一度でも使った事があれば
>>210 程度の用途にSQL系DBなんか勧めない
SQLiteは「サーバの向こう」でのみ使う人がよく使う 自分のマシンでやる機会があるならこんなん日常用途に絶対選ばんぞ
だから学生スレなんて言われるんだよ
>>236 「だから」って何?理由を書いてよ。10行くらいまでなら読んであげる。
あ、初心者スレだからわかりやすくお願いね(ハート)
>>236 あなたが何歳なのかは知りませんが、おっさんどもは
ゆとり君たちに負けないように、自分の技術にさらに磨きをかけるよう頑張ってください。
SQLiteってRuby1.9.2に入るんだっけ
>>226 適材適所という言葉がありまして
>>228 少なくともYAMLのバージョンはMarshalほど頻繁には変わらない
もちろん
>>224 のような例もあるから、どっちもどっちという印象ではあるが
平成21年7月12日(日) 今日から、勉強を始める。 「たのしいRuby」 43ページ 2.3 正規表現まで投了
ランダムに被らないように5個のデータの中から4個取り出す方法についての質問です 入れ替えで上手くいかなくて被ってしまいます、どうしたらいいのでしょうか? b=0 a=[1,2,3,4,5] while b <= 4 srand puts a[rand(a.length)] c=a[rand(a.length)] a[rand(a.length)]=a[rand(a.last)] a[rand(a.last)]=c J=a.pop b+=1 end
>>242 配列の中での入れ替えをやらない方が良い
delete_atで指定した位置の要素をとってこれるから、そっちを使うべき
あとwhileよりは、eachやtimesを使うのがオススメ
一例
list = [1,2,3,4,5]
poped = []
4.times do
sliced_index = list[rand(list.size)]
poped << list.delete_at(sliced_index)
end
a.sort_by{rand}[0..3] a.shuffle[0..3]
redMineのスレってないのかな?
Rubyって何で今になっても公式ドキュメントができないのでつか? みんな我が強いからでつか?
250 :
468 :2009/07/13(月) 02:52:52
たとえば 3481 という数字(4桁/0含む)が与えられたとき 0 = 3 + 4 - 8 + 1 1 = 3 + 4 - 8 * -1 2 = -(3 + 4 - 8 - 1) 3 = 3 * 4 - 8 - 1 4 = (3 / (4 + 8))^-1 ... のように加減乗除のみで整数を順に造っていってください
> 加減乗除のみ
了解
>>240 >少なくともYAMLのバージョンはMarshalほど頻繁には変わらない
いや、YAMLは変わる。すくなくとも1.8.4までは頻繁に変わってた。
Marshalって変わったか?具体的にどのバージョンでどう変わった?
>>248 redMine の何を聞きたいのかわからないけど、
webprog 板の Rails スレのほうが、いろいろ答えが得られると思う
英語勉強して、 英語のメーリングリストのぞいた方が早い
平成21年7月13日(月) 今日は、Arrayクラスを学んだ。 Array.new %w to_a split %wはとても便利だ。 indexに-1を指定すると最後の要素を指せる事を始めて知った。
262 :
240 :2009/07/13(月) 20:13:28
>>255 ruby 1.6.0 => 4.4
ruby 1.8.x => 4.8
ruby 1.9.x => 4.8
なるほど、確かにマイナーバージョンも1.8.0以降は変わってなかった
すまんかった
ところでYAMLの非互換ってのは、具体的にどんな変更があったんだ?
ruby -e "def hoge(n); p n; hoge(n + 1); end; hoge(0)" でどこまでいく?うちは3920
>>263 1148 で落ちた。
c:\> ruby -v
ruby 1.8.5 (2006-08-25) [i386-mswin32]
CoreDuo T2500(2Ghz)、MEM 3GB、Win XP Pro(32bit)
メモリが3GBもあるからもっと行くかと思ったんだけど・・・
Java でもそうだけど、スタックはヒープとは違う領域だから、
メモリがいくつあってもスタック領域も増やさないとダメなのかな?
Ruby でも、Java の VM オプションみたいにいろいろ指定できるのですか?
ちなみに
>>263 の環境を教えてほしい
14716 -e:1:in `hoge': stack level too deep (SystemStackError) from -e:1:in `hoge' from -e:1 スペック低いはずだが…
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9.7.0] 0 : 6295 -e:1:in `hoge': stack level too deep (SystemStackError) ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-darwin9.7.0] 0 : 8186 -e:1:in `hoge': stack level too deep (SystemStackError)
>>264 ruby 1.8.5 (2006-08-25) [i386-mswin32]
mswin32ってことなら、スタックサイズはヒープとは別個に決まってる。
たぶん、PEヘッダーをいじるツールで変更できるけど
rubyの起動時に指定とかはできないと思う。
268 :
263 :2009/07/13(月) 22:46:21
>>264 ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Core2Duo CPU E8500 3.16GHz
メモリは4GBで3GB認識
OSはUbuntu9.04
ちょっと,
ttp://doruby.kbmj.com/akio0911_on_rails/20081212/Mechanize__Hpricot__MeCab__ ここのいじって13KB位のテキストファイル開いて上のURLみたいに出現頻度調べて遊んでたら
main.rb:12:in `each': stack level too deep (SystemStackError)
from main.rb:13:in `each'
っていうエラーが.
def each(&b)
b[self]
self.next.each(&b) if self.next
end
の所なんだけど,どうすればいいかわかる?
1148 1GB 1.8.5 XP home 少ない
俺もはかってみようとレポジトリの奴ではかったら3900 あぁ、ホールふさがれた奴あったなと思ってtar.gz落としてきてそっちでやると6900 でも、require 'rubygems'が使えなくなった。 自分でmakeした時にgem周辺でPATH通さないといけない所ってどこ?
2173
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-freebsd7]
AthlonXP3000+(2.16GHz)
Mem1GB
>>268 mecabを使って無いから確かな事は言えないが元のソースが間違ってる気がする
def each(&b)
node = self
while node
b[node]
node = node.next
end
end
やっぱり動作がeachらしくなくて気にくわない class MeCab::Tagger def parseToNodes(*args) arr,node = [],self.parseToNode(*args) while node arr << node node = node.next end arr end end − nodes = m.parseToNode(text) + nodes = m.parseToNodes(text)
275 :
264 :2009/07/14(火) 10:52:29
>>268 どうもありがとう。
>>264 と
>>269 で、搭載メモリ量は違うのに
結果が同じということは、スタックサイズは Ruby のバージョンで決まってしまう
(搭載物理メモリ量は関係ない)ということですね。
>>267 Java だと -Xss などの VM オプションを与えることで、実行時に
メモリ割当量を変えることが出来ますが、Ruby の場合は、
以下のような理解であってますか?
・そういうオプションは用意されていない
・Ruby は C で書かれているが、C をコンパイルするときに、ヘッダファイル等で
スタックサイズ等はハードコーディングされている
・「PEヘッダーをいじるツール」(これがよくわかりませんが)をつかうことで、
その固定値を変えることが出来る
>>275 だいたい理解はあってる。
厳密に言うと、mswin32版のスタックサイズはwin32/Makefile.subで指定されていて、リンク時に確定される。
デフォルトではスタックサイズは2MBなので、Makefileに例えば
STACK=0x400000
とか書いてビルドすれば4MBにできる。
このリンク時に指定されたスタックサイズは実行ファイルのPEヘッダに格納されているので、それを何らかの手段で書き換えれば、いちいち自前でビルドしなくてもスタックサイズの変更は可能。
specファイルを書く時に、複数のファイルにまたがって共通するコードはどこにかけばいいですか。
>>275 >Java だと -Xss などの VM オプションを与えることで、実行時に
>メモリ割当量を変えることが出来ますが、
これいいよねー
メモリサイズだけじゃなくてGCまわりとか、上級者用オプションとして
Rubyでも用意してほしい
>>277 describeをネストするか、shared exampleを使う。
280 :
264 :2009/07/14(火) 13:43:57
>>276 どうもありがとう、理解できました。
ようするにコンパイル結果のバイナリをいじっちゃえってことか。
>>278 そこで JRuby ですよ(笑)
Java のいいところは、言語仕様の比較はここでは避けるが、VM としては
-Xmx でメモリサイズも変えられるし、GC の挙動、アルゴリズムも変えられる。GCログも出力できる。
Ruby もそうなっていくといいな。
Ruby Enterprise Edition だけでもそういうのを実装していくとか。
そうやって Ruby も Java みたいに Write Once, Run Anywhere じゃなくなるのか
このスレ自体が的外れ
結局、実行環境依存なほうが都合のいい事が多いしな。 実際、rubyもデビアン前提で、ウィンドウズはさっぱりだったりするし。
>>277 普通にrequireしたんじゃだめなの?
>>281 VMのオプションでメモリサイズやGCログを指定できることと、Write once Run Anywhere はまるで関係ない。
まさに的外れ。
>>263 ulimit -s unlimited
でやってみたらどこまでも伸びていってHDにスワップにいっちゃったから
切った。
単なる環境依存か。
Enumerableなインスタンスをeachで回してる途中でeachから抜けるにはどうしたらいいでしょうか? 例えばこんな動作を期待しています。 [0,1,2].each do |x| each_return x if x = 1 end #=> 1
break
break に戻り値はありますか?
[0,1,2].each {|x| break x.to_s * 5 if x == 1} # => "11111"
sunkuso
Rubyっていつも語順がおかしいよな。まともな感覚ならこうあるべき。 each([0,1,2]) {|x| if x == 1 then x.to_s * 5; break; end}
ものすごく視野が狭いな
一般的なオブジェクト指向の厳格さとPerl由来の便利さを程よくミックスさせた、使いやすいシステムだと思うよ eachをレシーバ依存の一般メソッドにするか予約語関数的メソッドにするかは作者の頭の中でひと悶着あったと思う
>>296 each だけなら別にそれでもいいが、each_with_index とか each_pair とかあのへんどうするんだよ
後置ifはperlのまね?
mix-inもダメダメになるなw
>>299 現在の print に引数渡すときと同じことだ
あれは自前で文字列にして渡すだろ
つまり、引数に渡す時点で自前で必要な配列にする
つまり、こうだ
arr = ['one', 'two', 'three']
each(arr.zip([1, 2, 3])){|e, i|
puts "#{i} 番目は #{e} です"
}
イエスジャスティス
puts が流行って #display が流行らなかった理由と併せて考えると面白いかもしれない
>>300 いえす。
Perlのは何由来だったかな。ラクダ本に載ってた気がしたんだが。
each_pair はあれだが each_with_index は $. でよかった
[1,2,3].find{|n| n.even? } #==> 2 みたいのないなそういや
one night
rubyファイルとしてコマンドラインから ruby test.rb
または、CGIファイルとして ./test.cgi
として実行した場合は、目的の出力が画面(GNOME端末上)に現れます。
また、print("hello,Ruby\n")のプログラムはサーバーを通して実行できます。
LAN内の別のパソコンから
http://192.168.x.x/test.cgiで実行すると 画面に何も表示されません。
・エラーメッセージ
/var/log/httpd/error.log を見ると
過去ログ(part12)の866と似たようなエラーがでています。
http://www.bookshelf.jp/2ch/tech/1178167650.html 過去ログの相違点としては、'initialize'の後ろが下のようになっています。
:
getaddrinfo: Temporary failure in name resolution
(
SocketError
)
・その他
ネットワーク・プロキシの設定 では インターネットに直接接続する になっています
セキュリティレベルの設定 では ファイアーウォールが有効になっていて
SSHとHTTPにチェックを入れています。
telnet www.ruby-lang.org 80 の結果は下のようになりました。
Trying 221.186.184.68...
Connected to www.ruby-lang.org (221.186.184.68).
Escape character is '^]'.
・最終的にやりたいこと
http:// ○○/test.cgi へのアクセスでhtmlコードが表示されるようにしたい
よろしくお願いします。
>>308 > プログラムの内容は、下記のアドレスの一番上のプログラムです。
嘘だ
それは「そのままでは動かない」
その4行のほかに書いてあることがあるはず
>>311 すみません。cgiはこのようになっています。
#!/usr/bin/ruby
require 'open-uri'
print("Content-Type: text/html; charset=utf-8 \n\n")
open("
http://www.ruby-lang.org/ ") {|f|
f.each_line {|line| p line}
}
>>311 横から見てコピペしてみたら、普通にそのまま動きましたが何か
getaddrinfoがエラー出してる時点でできれば関わりたくないんだが、 #!/bin/sh echo "Content-Type: text/plain\n\n" ping -c 1 www.ruby-lang.org たぶんこれでも似たようなエラーが出るはず ApacheがDNS関係の設定か何かを読んでないのだろう
>>313 ワロタw
SELinuxの機能をオンにしてる(よな?たぶん・・・)時点でおれはダメ
SELinux登場以前のノウハウが通用しなくてきつすぎる
とりあえずオフにしてくれなきゃ原因となりうるものが多すぎ
オフにしたら動いたりしてな
>>313 すみません。私の説明不足でした。
>>314 面倒なものに助言をくださりありがとうございます。
シェルスクリプトをcgiとして取り扱うのは初めてなので
方法が合っているか分かりませんが拡張子を.cgiとしてchmodで755を与えて
サーバーを通してみてみました。
error.logは
[error] ping: unknown host www.ruby-lang.org
[error] Premature end of script headers: test3.cgi
[error] File does not exist: /var/www/html/favicon.ico
となりました。 DNS関係の設定ですね 調べてみます。ありがとうございます。
>>315 SELinuxの設定を確認したら、Enforcingモードになっていました。
今、無効化して再起動をしたところ実行できましたorz
本当にありがとうございました!!
スレ汚しごめんなさい。
助言をいただいたほかのみなさんもありがとうございました!!
ようするにセキュリティを甘くすることによって解決したわけだから、 他にまっとうな方法があるならそちらを使うべきなんだよね。 俺もSE以前の知識で止まってるので皆目わからんが。
そう、本当は何も解決してないどころか事態はより悪くなっている
SELinuxってなんであんなに寄せ付けない感があるんだろ 勘どころがまったくわからない これは少数派ではないと勝手に思ってる
まっとうな方法をアドバイスできない時点で 自分も悪い事態の中で動かしてるんじゃないのか?
CentOS インストールするときに最初にやることは SELinux を無効にすることだろうが
CentOS使ってるいみなくね
SELinuxが必要でCentOSを使ってる人は少数 たいていの人にとっては「なぜかついてきた邪魔な機能」でしかない
ようするにセキュリティを甘くすることによって解決したわけだから、 他にまっとうな方法があるならそちらを使うべきなんだよね。 俺もSE以前の知識で止まってるので皆目わからんが。 そう、本当は何も解決してないどころか事態はより悪くなっている SELinuxってなんであんなに寄せ付けない感があるんだろ 勘どころがまったくわからない これは少数派ではないと勝手に思ってる まっとうな方法をアドバイスできない時点で 自分も悪い事態の中で動かしてるんじゃないのか? CentOS インストールするときに最初にやることは SELinux を無効にすることだろうが CentOS使ってるいみなくね SELinuxが必要でCentOSを使ってる人は少数 たいていの人にとっては「なぜかついてきた邪魔な機能」でしかない
Rubyの話をしようや
じゃあ、Rubyの話を、 セキュリティは、そこら辺にあるマニュアル通りでおk どこがの事業で大規模に人が集まってくるようなら考える。 専門家に任せたりd(^-^) ね!
Rubyって全然エコじゃないよね。 Cの何十倍くらい電力効率悪いんだろう。
またエコ厨か。
Cで開発する時にかかる余分な設備維持費とか人件費とかも考えないとね。
>>329 マシン、CPUはそうだが、
作る時間を大幅節約できるので、その分の食費、クーラー代、通勤費、残業代
コストを減らせる。
Cって全然エコじゃないよね。 アセンブラの何十倍くらい電力効率悪いんだろう。
アセンブラに夢見すぎ
長く使うにはある程度メンテが必要な気もする
完璧なプログラムにはメンテナンスなど必要ない
完璧なプログラムなどといったものは存在しない。 完璧な絶望が存在しないようにね。やれやれ。
stdio.hも後になってセキュリティホールが見つかったりしてるしな
長く使うプログラムはCで書けばいい なんでもかんでもRubyで書こうと思うのが間違ってるんだ 適材適所って言うじゃない 無論、エコを語るならどれだけ長く使えば元が取れるのかは正確に計算する必要があるけど。
> なんでもかんでもRubyで書こうと思うのが間違ってるんだ そんな奴はいない
> 長く使うプログラムはCで それはない
Cで書くとCPUがんばりすぎて発熱が多くなってエコに悪いんじゃないかな
コンパイルとか無駄だから、最初からバイトコードで記述すべきだよな。
>>346 rake使うときにshでコマンドを実行すると、パラメータが途中で切れてたのはそれか……ひどい仕様だ
WindowsでRubyを使う奴は情弱 繰り返す。 WindowsでRubyを使う奴は情弱 情報強者のプログラマはWindowsなんてゴミを使っちゃだめ あれはお年寄りと子供用のOSだ。
Linuxは嫌いなのでお断りします
っス
あらゆることに大人の修行を求める
>>348 さんパネェっす
妥協せず全て全力で学び全力で研究する修羅の世界を行くの流石っす
351 :
デフォルトの名無しさん :2009/07/19(日) 21:36:45
>>348 大学で初めてUnixさわった子が言いそうな発言だなぁ
>>350 OSなんて適当でいいんだよな
自動車がATで充分な場合が多いのと一緒
世の中のあらゆることにプロフェッショナルではいられない以上、
世の中のほとんどに対しては「年寄りか子供」程度のアプローチしかできん
まあお前らがそれならそれでいい。 ただ、努力をすることを忘れた瞬間から人は堕落する。 せいぜい適当な態度で適当な仕事を適当にやって適当な給料もらってりゃいい。 俺はそれじゃ我慢できない。給料もらってる以上、仕事は本気でやりたい。
どうして自分の仕事を他人に強制するの?
Windowsをお子様お年寄りのOSと見るなんてまるっきり利用者視点じゃない とてもじゃないがプログラマの視点とは思えないわw
ずいぶん狭い価値観だな。 OSなんて自分が使いやすい物を使えばいいだろ。 結果さえ出れば、道具は何を使っても構わないと思うがな。
道具Aが道具Bとうまく合わないからって文句を言うのは筋違いだよな。
if RUBY_PLATFORM =~ /mswin/ ( ´,_ゝ`)プッ
大工は100円ショップのトンカチで仕事しない
そりゃトンカチは普通、自分一人しか使わないからな
なんか前にも見たことあるような気がするな
デジャブじゃね?
マトリックスに修正が加えられたということよ
手荒れにはやっぱり
これだけ普及してるWindowsの評価はともかくとして、 RubyみたいなUNIXコマンドラインツールをWindowsで使うのが 価値半減というのはわかるけどね。正式なサポートもないし。
俺はコマンドプロンプトだとターミナル以上にRubyを使う場面が多いw コマンドプロンプトは機能が貧弱だからな… かと言ってPowerShellはシェルとしては微妙に使いにくい気がするし(慣れだろうけど)
むしろCUIの貧弱なWindowsだからこそ、Rubyのパワーが欲しくなるという場面もあるよね
Microsoft Windows Services for UNIX users (SFU)
>370 そのスレの内容を見たか?
趣味なら何を使っても自由だが、仕事ならお客さんが求めるものに対して プロフェッショナルである必要があるんじゃないかな。 仕事だからWindowsはダメとかそういう話ではなくて。 とりあえず仕事でRubyはアリエナイと言っておく。
PowerShell覚えるくらいなら不自由でもRubyを使いたい どうせそんなにシビアなバッチ書かないし
>>373 >とりあえず仕事でRubyはアリエナイと言っておく。
ここは同意できないというか、どうしてRubyはありえないのか根拠を詳しく聞かせてほしいな。
自分は、実際に仕事でWebサイトの構築をRuby(Rails)で3年くらいやっているけど、問題になったことはないので。
2日目のRubykaigiにも行って来たけど、楽天、リクルート、ニフティなどの大手サイトでの実績を聞くことができたよ。
月間6000万PVのサイトでもRailsで対応できているって事だったけど。
うん、実行環境のサーバごと提供できるのなら、Rubyはそれほど選択肢から外れるわけでもない 多くの場合は実行環境がすでに固定されてるし、リプレースにもあんまし向かんが メンテナンス人員が派遣屋で即購入できることが重要である案件も結構あるしな
377 :
375 :2009/07/20(月) 08:09:27
ちなみに自分が会社で使っているPCはWindowsだけど、開発サーバはCentOS。 (本番環境がRedHatだからなるべく近い環境にしている) PCのOSがWindowsなのは、会社の方針。 USBメモリを使えなくしたり、WindowsUpdate、ウイルスチェックの強制実行などを中央サーバから指示できるなど管理上の理由。 数百台以上あるPCを管理するには、Windowsのほうが便利だよね。 普通の会社だと、個人でOSを自由に選べるという事は少ないと思うんだけど、どうなんだろうか?
378 :
375 :2009/07/20(月) 08:20:58
>>376 そういう話なら、納得できます。
自分もRuby(Rails)で仕事をさせてもらう場合、常に実行環境のサーバごとの提供ができる時だけなので。
あるいは、root権限を一時的に使わせてもらえて、使用するミドルウェアの選定を任せてもらえる時とか。
実行環境がすでに固定されている場合、リプレースには向かないというのは同意。
Ruby って意外と使えないんですね
あなたも含め、Rubyコミュニティががんばる事で使える場面が増えていくでしょう
>>379 だから誰かが作ったレール利用したプログラミング人生送りたいならJava選べJava
めちゃくちゃ安定だから
何血迷ってるのよ
テキスト内にある改行を2個目以降は スペースに変換するにはどう書けばいいですか? "foo\nbar\nhoge" => "foo\nbar hoge" とやりたいです。 split("\n") で分割してから array[0] + "\n" + array[1, array.size-2].join(" ") でできるのですが 正規表現とgsub でもっと簡単にできないでしょうか?
>>383 ご要望とは違うが、文字数を減らして書いてみた。
(ar = str.split("\n")).shift + "\n" + ar.join(" ")
伝統的な方法は 1 while s.gsub!(/(¥n.+)¥n/m) { |m| "#{$1} " } # 破壊的なので必要ならdup 1.9だと s.gsub(/(?<=¥n)(.*?)¥n/) { "#{$1} " }
386 :
385 :2009/07/20(月) 14:00:01
量指定子(*?とか+とか)が適当だった……
387 :
385 :2009/07/20(月) 14:00:55
しかも消し忘れの /m。吊ってくる。
>>385 内容に全く関係ないが、なぜわざわざ \(バックスラッシュ) を ¥(¥) で記述するw
なんか2chで変換がかかるのかな?
見栄えの問題だろ 2chは特に何もしない
>>389 いやいやw それは少し変だろ
\って書いてあるんならわからんでもないが
391 :
385 :2009/07/20(月) 14:12:24
ターミナルのバックスラッシュ(左上から右下への斜線のグリフ)を ペーストしただけなのだが、0x5Cではなく0xA5になってる?
そういやMacは簡単に打ち分けられるんだよな、バクスラと円 うちのMacbookはデフォルトが円なせいでよく打ち間違えるのがやっかい
>>391 うん。というより、HTMLなので ¥ になってる。
単純に書き込みに使うブラウザのマッピングの問題なんだろうか。
>>384 はただのバックスラッシュ(U+005C)
>>385 は円記号になるもの(¥)
バックスラッシュをU+00A5に内部変換するコピペシステムはあって欲しくないんで、
たぶん2ch専用ブラウザがなにかお節介を焼いたのだろう
「Windowsでは円記号でクォートします」と書いてあるんで 素直に Yen Sign でクォートしたらエラーになったでござるの巻
スレチながら、気になったので実験してみた。Macのターミナルで作業。 $ echo <バックスラッシュ><バックスラッシュ> > x.txt $ cat x.txt <バックスラッシュ> $ open x.txt # 関連付けされたテキストエディット(Macの「メモ帳」)で開く。 名前を付けて保存→y.txtで保存。 $ cat y.txt <円記号> ちょwwwwwwwwww
>>396 テキストエディットはなにもしなければMacLatinかMacJapaneseで保存する
>>397 ご指摘のとおり。
早速UTF-8保存をデフォにしますた。
質問です。 自分のサイトのRubyで書かれたCGIページにリクエストが要求されると、自動的にtwitterに発言を投稿してくれるプログラムを書きたいと思っています。 twitter関係のRubyアプリを調べたところ、twitter4Rというものがあるらしく、使ってみたのですがうまくいきません。 ローカルで実験してみると、どうやらRubygemsというものがなければ動かない(?)ようだということがわかりました(dllをbin配下に追加したら、ローカルからはtwitterに投稿できました)。 ですが、自分のサイトが置いてあるレンタルサーバでは、権限がないためRubygemsがインストールできません(問い合わせたところ、導入予定もないとのことです)。 レンタルサーバのRubyバージョンは1.8.2です。 レンタルサーバ上でtwitterに投稿できるような、解決策はありませんでしょうか?
Perlでやれば
うん、Perlでやればいい 最悪、 system("perl post_to_twitter.pl #{message}") とでもしてRubyスクリプトの中でPerlスクリプト呼べば普通にできる
Net::HTTP で直に書くという選択肢は…なさそうだな コマンドライン twitter 投稿アプリケーションを別途起動する、というのが素直な解決策だと思う
zipで手に入れてきてlibをカレントか好きなところに展開 カレント以外なら$LOAD_PATHの配列ににパス追加してからrequire でもtwitter apiぐらいnet/httpで叩けばいいと思う
>>400-403 回答ありがとうございます。
Rubyはかなり初心者なので、Net:HTTPはちょっときつそうです。
WEB探してもNet:HTTPからtwitterAPI呼んでるものが見つからないので(ほとんどみんなgems使ってる例)・・・・。
もうcgi自体はRubyで作ってしまってるので、
>>401 さんのやり方でやってみようかな。
Perlの書き方調べつつがんばってみます。
net/httpsはいらない?それなら大分ハードルは低そう
messageなるものをそのままコマンドの引数に渡すのかよ
危なすぎるだろ
なぜ
>>403 のレスの内容をスルーしてるのか分からん
ちなみにおれは
>>403 じゃないぞ
407 :
399 :2009/07/20(月) 18:01:18
>>401 さんのやり方は危ないとのことなので、
>>403 さんのやり方でやってみます。
libを適当につくって、
$LOAD_PATH << "libのパス"
require "Rubygems"
でいいのかな?
>>407 libの中身を取り出すのなら、もうrubygemsは関係ないよ
だからrequire "rubygems"は必要ない
あと、Twitter4rはjsonに依存しているようなので
jsonのlibも必要になると思われる
親切にありがとうございます。よくわかっていなくてすいません。
とりあえずrubygemsのlibをカレントにぶちこんで、require 'twitter'してみたところ、また失敗してしまったようなので、
>>409 さんの言うjsonってやつを探してみます。
$LOAD_PATHを試しに出力してみな require "twitter"はtwitter.rbを$LOAD_PATHそれぞれのパスに探しに行くから ./twitter.rbは見つけられても./lib/twitter.rbは見つけられない だからパスを追加するか、カレントにtwitter.rbが来るように配置しなおす $LOAD_PATH << "./lib"
412 :
399 :2009/07/20(月) 19:03:16
twitter.rbはカレントに置いています。 フォルダ構成は、 twitterフォルダ(twitter.rbの依存) rubygemsフォルダ rbconfigフォルダ insert.cgi(twitter.rbをrequireしたいcgi) twitter.rb rubygems.rbなど(他にubygems.rbなど) json関連(object.rbなど) となっています。 これでもtwitter.rbをrequireすると失敗しているようです(コメントアウトすると正常終了するが、しないと真っ白の画面が表示される)。
413 :
399 :2009/07/20(月) 19:06:08
ちなみに、実行権限は、.rbファイル、.cgiファイルには755を設定しています。
まずは、実行したときの $LOAD_PATH だけを確認するCGI(BODYで返すなり /tmpに書き出すなり)を実行してみれ。
あと、Dir.pwd も。
>>406 > messageなるものをそのままコマンドの引数に渡すのかよ
> 危なすぎるだろ
なんで?
ただの文字列という情報しかないのにそんなに怯えるのはなぜ?
418 :
399 :2009/07/20(月) 19:13:27
作ってみました。test.cgi $LOAD_PATH.each {|a| print a print "<br>" } これが実行結果です。 /usr/local/lib/ruby/site_ruby/1.8 /usr/local/lib/ruby/site_ruby/1.8/i686-linux /usr/local/lib/ruby/site_ruby /usr/local/lib/ruby/vendor_ruby/1.8 /usr/local/lib/ruby/vendor_ruby/1.8/i686-linux /usr/local/lib/ruby/vendor_ruby /usr/local/lib/ruby/1.8 /usr/local/lib/ruby/1.8/i686-linux
419 :
399 :2009/07/20(月) 19:14:39
>>415 ,416
ありがとうございます。
やってみますが、飯に呼ばれたので10分ほどいってきますー。
すごい bad knowhow を見ている稀瓦斯
>>420 いちばん簡単な「自力でAPI経由でPOSTする」「外部プログラムに直接委託する」の2つを封じられたら
あとは汎用性のないグダグダしかないぞ
?
424 :
399 :2009/07/20(月) 19:25:52
>>418 .
が抜けていました。
Dir.pwdは以下です。
/home/sites/lolipop.jp/users/lolipop.jp-dp44048366/web/s
425 :
399 :2009/07/20(月) 19:33:46
お、CGI-Exceptionいれてみたら、エラーメッセージでました(これrequireだけでいいって楽でいいですね・・) Status: 500 Internal Error Content-Type: text/html X-CGI-Exception: 0.3.0 ./rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- json (LoadError) from ./rubygems/custom_require.rb:31:in `require' from ./twitter.rb:23 from insert.cgi:11:in `require' from insert.cgi:11 該当箇所: def require(path) # :doc: gem_original_require path #31行目 rescue LoadError => load_error
426 :
399 :2009/07/20(月) 19:35:59
jsonは、 array.rb lexer.rb object.rb util.rb をいれてたのですが足りないっぽいのでgem_original_requireってやつ探してみます。。
>>426 require "json"
なんだからjson.rbがないと
それにしてもライブラリがgemsをrequireしてるのは行儀わるいような
428 :
399 :2009/07/20(月) 19:55:09
ローカルでgem install jsonして増えたファイルぶち込め
431 :
399 :2009/07/20(月) 20:07:59
長時間ほんとすいませんorz
>>430 のjson.rbをいれてみたら新しいエラーが・・・・。
いれたのはjson-1.1.7のlib配下、json.rbとjsonフォルダです。
Status: 500 Internal Error Content-Type: text/html X-CGI-Exception: 0.3.0
./json/pure.rb:13: uninitialized constant JSON::Iconv (NameError)
from ./rubygems/custom_require.rb:31:in `gem_original_require'
from ./rubygems/custom_require.rb:31:in `require'
from ./json.rb:8
from ./rubygems/custom_require.rb:31:in `gem_original_require'
from ./rubygems/custom_require.rb:31:in `require'
from ./twitter.rb:23
from insert.cgi:11:in `require'
from insert.cgi:11
432 :
399 :2009/07/20(月) 20:13:06
json.rbの中身 require 'json/common' module JSON require 'json/version' begin require 'json/ext' rescue LoadError require 'json/pure' # 8行目 end end こうなってるんだけど、'json/ext'フォルダは存在してるけど空っぽ。 これは問題ありませんか?
iconvのrequireに失敗してるんだろうな
>>432 それは自分で考えてみて
別に難しい話じゃないから
435 :
399 :2009/07/20(月) 20:19:46
わかりました、ありがとうございました。 またどーーーーーしてもわからないエラーにぶち当たったら持ってきます。 長時間すみませぬ。
READMEを読めばわかると思う。 extなしですませる方法も載ってるよ。
437 :
436 :2009/07/20(月) 20:26:54
ごめん、私の想像していた理由ではないようだ。
そういえばJSONはIconv入ってないとだめなんだな……すまん、忘れてた もう素直にTwitter4rを諦めて、自力で(Net::HTTPで)何とかした方が早い気する
lib/json/pure.rb って 6行め:begin 7行め: require 'iconv' 13行め: rescue Errno::EINVAL, Iconv::InvalidEncoding 54行め: LoadError となってる。 iconvがロードできなければ54行めで捕捉することを期待してるんだろうけど、 それ以前の rescue をチェックするタイミングで定数 Iconv が必要になって こういうエラーになっているようだな。 該当 rescue 節の順序を逆にすれば作者の期待するエラーになる、はず。
440 :
399 :2009/07/20(月) 20:46:07
せっかくここまでやったので、帰ったらiconvいれてやってみますー。
>>435 いや難しくないと言ったのは
>>432 の部分だけで(
>>432 自身に問題ない理由まで記されている)
>>431 >>433 >>439 のiconvのほうは少々厄介
rubyのiconvバインディング自体は標準添付だけど
たぶんサーバに大元のiconv本体が存在しない
require 'iconv'
と書いただけのスクリプトでエラーでるなら諦め
jsonとiconvの関係については作者にバグレポを送っておいた。 が、元の質問の解決には結局関係なかったな。 既に言われているように、素直に Net::HTTP を使う方向で考えたほうがよさそう。
443 :
399 :2009/07/20(月) 20:54:42
いままでと同じようにiconv.rbをツッコムのじゃむりぽ?
聞いてばっかりいないでiconvがなにかを調べてごらん
しかし今時Iconv必須なJSONもひどいな
>>443 むり。レンタルサーバーで何とかするのは絶望的
twitter4rは諦めた方がいい
446 :
399 :2009/07/20(月) 21:10:29
わかりました。 長時間どうもでしたー。 自力でチャレンジしてみまする。
>>417 クロスサイトスクリプティングもSQLインジェクションも
攻撃の手段はただの文字列だよな。それと同じ。
コマンドインジェクションってかなり基本なのだが。
信頼できない入力だとは誰も言ってないという話だろ
うんにゃ。
>>417 の表現だけを取ってみると危険性が見える。
初心者スレで安全側に立ってレスすることは悪くないと思う。
"CGIで呼ばれました" というような固定文字列である可能性は低くない気はするな
そのへん言うとNet::HTTPなんて使うべきではないのだよな 素人が自力でHTTPやるなんて愚の骨頂
ENV['QUERY_STRING'] 触るのも禁止でひとつ
>>448 それは屁理屈にもなっていない
おまえは外部から入力された文字列をブラウザで表示させるとき、
内容によってサニタイジングしたりしなかったりするのか?
もしそうならそれはやめた方がいい。
そういや escapeshellarg みたいなのって Ruby にはないんだよな
>>453 横だが、わざわざしてないと考えるほうがおかしいとは思わないのか?
puts "日本語" と書いて文字化けするかどうか気にしないのと同じレベルだと思う… これに文句いわないだろ
>>456 そもそも大前提が、
>>399 の
> 自分のサイトのRubyで書かれたCGIページにリクエストが要求されると、
> 自動的にtwitterに発言を投稿してくれるプログラムを書きたいと思っています。
これじゃないのか?
それなら、
puts "ほげほげ"
ではなく、
cgi = new CGI
puts cgi['hogehoge']
などを想定するのもそれほどずれてはいないし、確認するのもお節介とはいえおかしくはない
あれ。なんかRubyではないコードを書いてしまったような気もするw
>>454 system('cmd', 'opt', 'args')
の配列形式を使えばややマシ
やや
セキュリティの話か このあたりはWeb開発目的で作られただけあって PHPをやってるエンジニアの方が強いだろうな
461 :
383 :2009/07/20(月) 23:28:12
escapeshellarg って Web に限らず、 コマンドラインなプログラムにも重宝するのに。
だから
>>459 のargに入れれば若干マシだってば
完全無敵な自動エスケープは存在しないんだからさ
セキュリティに「若干マシ」という概念ってあるんだね
そりゃ「完全」が無い以上当然のことだとは思わんのかな
「全く何もしてない」と「○○より若干マシ」の2態しかないような気がする
>>464 んじゃ書いてみ
>>464 は貯金とかしてるのかな。
たとえばそれを明日、手持ちのキャッシュカードで引き落とせることはまず期待するよな。
それも言ってしまえば確率論による期待にしか過ぎんわけだが、それは理解できるのかな。
また、世の中はそれで十分回るのよ。
根本的には、信用できない入力を自動で安全にする方法は存在しない プログラミング上は、信用できない入力を扱った時点で愚の骨頂
つまりlocalhostでやれということですね、わかりません。
しかしつまらんスレだな
sqlite3使って db =SQLite3::Database.new("data.db") sql =<<SQL create table the_table( name varchar(10), age interger, sex varchar(1) ); SQL db.execute(sql) supername = ["God",1000,"n"] db.execute("insert into the_table values("#{supername}")") p db.execute("select * from the_table") db.close ってやってもエラー 式展開使えないですかね?
"" で括られた文字列の中でさらに " を使いたい場合は、 覚えるの簡単な方法としては \ でエスケープする db.execute("insert into the_table values(\"#{supername}\")")
これはw
SQLインジェクション対策じゃまいか パラメタバインディング機能があるだろうからそっち使ったほうがいいかと
あんまRuby関係ないようなな…
476 :
471 :2009/07/21(火) 16:41:08
>>472-475 おぉ!ほんとですね。Rubyあんまり関係なかったですね。
SQLを使ったのがruby-sqlite3が始めてだったんでそんなもんかと思ってました。
ありがとうございます
ここはイテレーターを回して喜ぶスレです ネットワークプログラミングもXMLやJsonもファイルシステムもDBも Rubyとは一切関係ありません
unko
is_a? よりも kind_of? のほうが人気があるって本当?
それはガチ
なんで to_s, to_a なの? to(String), to(Array) じゃダメだったの?
それは String に自分の変換を依頼するということ?
class Hoge def to(klass) case klass when String then self.data.to(String) # 旧来の to_s when Array then self.data # 旧来の to_a end end end こんな処理をしてもいいんじゃね、という話だと思う
to_s to_i to_f to_a to_sym tojis tosjis toeuc toutf8 ... メソッドオーバーロードのある言語ならいざ知らず rubyではtoの変換候補が増える度にメソッドの上書きが酷い事になる こんな方法考えたけどto_*を定義するより無駄が多いと感じる def to(klass) ; send("to#{klass}") ; end
あとは>482みたいな方法もあるが それだとクラスを1つ作る度に組み込みクラスを拡張することになるね
変換方法をブロックで与えればおk ・・・・・Rubyには立派なオブジェクトシステムがあるのに 何でわざわざディスパッチテーブルを 自前で書かねばならんのかとは思うけど
rubyでhtmlパースして本文だけ抜き出そうとしてるんだけど、現在hpricot最強?
nokogirlじゃなかったnokogiriというのが追い上げる展開。
たぶん今はNokogiri最強 pure rubyでhtmlパースできるものがあればもっと最強なんだが
Nokogiriが無難 HpricotはUTF-8に変換したHTMLを渡さないとどうにもならん
>>490 >HpricotはUTF-8に変換したHTMLを渡さないとどうにもならん
まじ?普通にEUC-JP渡してたんだが。
>>491 Windows環境があるなら試せばいいじゃんそんなん
ちなみに gems\1.8\gems\nokogiri-1.3.1-x86-mswin32\ext\nokogiri\ ディレクトリに
iconv と libxml2 と libxslt と libexslt と zlib1 の dll が置かれて使用される
コミコミなのである意味バージョン差異問題とか一番めんどくさくないのがWindows
Linux とかのほうが実は面倒だったりする
>>492 require 'rubygems'
require 'hpricot'
require 'kconv'
html = '<html><title>にほんご タイトル</title></html>'.toeuc
doc = Hpricot.parse(html)
p doc.at('title').inner_text == 'にほんご タイトル'.toeuc
p doc.at('title').inner_text == 'にほんご タイトル'.toutf8
p doc.at('title').inner_text == "にほんご#{Hpricot.uxs(' ')}タイトル".toeuc
p doc.at('title').inner_text == 'にほんご'.toeuc+ Hpricot.uxs(' ') +'タイトル'.toeuc
最後だけ true
つまり、文字参照のとこだけが強制的に UTF-8 の文字で挿入される
これはリクツ上仕方ないんだけれども、日本語 HTML にはなかなか厳しい
Hpricot のいいところはバイトの並びが保存されて文字コードが不変とみなせるとこなんだが、
ここであっさり綻びてる
古いバージョンの ? で置換されてたころのほうがまだマシだったという悲しいオチが
Nokogiri は Ruby1.9 で #!ruby1.9 # -*- coding: utf-8 -*- require 'rubygems' require 'nokogiri' require 'kconv' html = '<html> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>日本語!</title></html>'.tosjis doc = Nokogiri::HTML.parse(html) p Marshal.dump(doc.at('title').inner_text) p Marshal.dump('日本語!'.toutf8) これが "\x04\bI\"\x11\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E\xEF\xBC\x81\x06:\rencoding\"\x0EShift_JIS" "\x04\bI\"\x11\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E\xEF\xBC\x81\x06:\rencoding\"\nUTF-8" となるのを直したバージョンを早く公開して欲しい
ああ、force_encoding してしまってるのか 1.9初期によくあったエンコーディング関連の勘違いのコードがまだ残ってるのかな
497 :
491 :2009/07/23(木) 10:36:46
>>493 レスどうもありがとうございました。
Windows 環境でやってみたところ、dll がダウンロードできました。
これは便利だ。
○本番環境は Linux で開発は Windows の場合、
本番の Linux のディストリビューションの libxml のバージョンはいくつか?
Windows 版で入るのはいくつか?
本番のアプリケーションではどのバージョンで使いたいか?
それを決めたら、それぞれの環境をそれに合わせる
といったことが必要そうですね。
JRuby ではこれからやってみます。
Windows以外では、ユーザーディレクトリとかに最新版libxml2をインストールして それを読むようにnokogiri.soを作るようにする以外の選択肢はないと思う システムのlibxml2を最新版にできるなら問題はないんだが libxmlは「何かバグがあったからバージョンを上げる」の典型なんで 古いバージョンは必ずバグ持ちだぞ
本番で採用したらメンテ地獄に成る典型だな。 もうちょっと精査してからリリースすれば良いのに。
よし、誰かElementTreeをHTML対応で移植してくれ
2.7.2 ってバージョン番号は、そろそろ安定してくるころなんだがw GCCを思い出してみると。 (?.x.y が x < y になるまで待てとか言われなくなったのがそのころ)
どうなんだろうね、github にあるのは直ってると期待したいところだが、 これで困るのは非 ASCII 文字圏ユーザーだけだから、 これまで誰も気にしなかったのと同様に案外誰も気づいてないかもしれないな
標準添付への道は遠いな
いや、有名だと言われてるライブラリでも専門外はこの程度ってことで 逆に自作公開モチベーションが上がるんじゃないかと思われるということにするのはどう
git で gem ライブラリをいじって遊んでます ある程度「できた」ライブラリを自分用に普段使いしたいんですが、 git 管理の lib ディレクトリをそのまま gem ライブラリのディレクトリの lib ディレクトリとして cp する方法しか思いつきません なんかもうちょっとうまい方法ありませんか?
>>507 自分でgemパッケージを再生成してインストールするというのはだめなん?
たぶんRakefileがあるはずだから、インストールも簡単だとおもうけど。
しつもん class A class B; end class C; end end というでっかいクラスがあって、これを継承したクラス K を作ります class K < A end もともとの A::B のメソッドの中で A::C.new と書いてあった場合、 K で同じメソッドを呼んだら空気を読んで K::C.new が呼ばれたりしますか? 呼ばれない場合、もともとの A のクラスを書く人が 「A が継承される可能性」を考慮してクラス関係を記述する必要があったりしますか? A::C.new と書く代わりに eval("#{self.class}::C").new と書く、みたいな
yes
>>509 > もともとの A::B のメソッドの中で A::C.new と書いてあった場合、
> K で同じメソッドを呼んだら空気を読んで K::C.new が呼ばれたりしますか?
Aと明示してるのにKが参照されたらバグだろ
> 呼ばれない場合、もともとの A のクラスを書く人が
> 「A が継承される可能性」を考慮してクラス関係を記述する必要があったりしますか?
ある
> A::C.new と書く代わりに eval("#{self.class}::C").new と書く、みたいな
が、evalはいらない
self.class::C.new
前から思ってるんだけど class A class B; end class C class D def initialize; B.new; end end end end A::C::D.new これがエラーにならないのはおかしいと思う D が知ってるのは A と C の2つと、D と同じ「深さ」に定義されてるクラスだけだと思うんだが D から B は A::B という経路でしかアクセスできないのが当たり前に見える
まあ、下手にパスっぽく表記されてるのでパス的構造を大事にしたい気持ちはわかる class A ConstA = "A" class B ConstB = 'B' class C ConstC = 'C' def initialize; p ConstA, ConstB, ConstC; end end end end A::B::C.new これが問題なく A,B,C を表示できるのに納得してもらえたなら話は早いんだけれど 知ってるクラスの定数はそのまま利用できるのがRubyの定数スコープ
A::C と A::B::C の C は同一だってことだけどな class A class C def msg; 'fine'; end end class B class C def msg; 'polluted'; end end p C.new.msg end end "polluted"
ファイルにeuc-jpで puts "日本語" と書かれたものを cygwinコンソール(Shift_Jis)で文字化けせずに表示ってできますか?
>>515 自動ではできません
puts するたびに tosjis などで変換するか、
ruby というシェルスクリプトを作ってそれを呼ぶかしてください
>>516 なるほど、わかりました
ありがとうございます
JRuby でやってみた。JRuby 初体験。
Windows Xp / jdk 1.6.0 u12 / JRuby 1.3.1
JRuby をインストールして c:\Ruby\jruby-1.3.1\bin にパスを通した後、
c:\> jruby -S gem install nokogiri
で入った。
c:> nokogiri
http://www.ruby-lang.org c:/Ruby/jruby-1.3.1/bin/../lib/ruby/1.8/ffi/library.rb:18:in `ffi_lib': Could not open any of [xml2, xslt, exslt] (LoadError)
from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/lib/nokogiri/ffi/libxml.rb:5
from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/lib/nokogiri/ffi/libxml.rb:31:in `require'
from c:/Ruby/jruby-1.3.1/bin/../lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/lib/nokogiri.rb:10
from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/lib/nokogiri.rb:31:in `require'
from c:/Ruby/jruby-1.3.1/bin/../lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/bin/nokogiri:7
from C:/Ruby/jruby-1.3.1/lib/ruby/gems/1.8/gems/nokogiri-1.3.2-java/bin/nokogiri:19:in `load'
from c:\Ruby\jruby-1.3.1\bin\nokogiri:19
ruby 本体の ffi でエラーになっている。
JRuby で gem で nokogiri をインストールすると、
>>493 さんのいうような libxml2 の dll などは
もちろんインストールされない。
でも ffi は JRuby でも有効だそうなので(ググってみたところ)、JRuby に Java で実装した
libxml2 のライブラリを自分で作って(作れないけど)含めれば、JRuby で nokogiri も動くかも、ということなのだろう。
>>494 たまに起こる文字化けそれかー。
じゃあ
html = '<html><title>にほんご タイトル</title></html>'.toutf8
doc = Hpricot.parse(html)
p doc.at('title').inner_text.toeuc
ってやればいいってことだよね。
toeucとtoutf8の2回やると精度落ちそうだな・・・
この問題の根っこは
「 に対応する文字が Unicode の No-Break Space(U+00A0、C2A0) にマッピングされてる」
「日本語文字コードには該当文字が存在しない」
の2つ
だいたいの用途においては
「 を通常のホワイトスペースと混用して利用されても構わない」
「ただし、 の存在が完全に取り除かれるのは困る」
だと思われるので、
ttp://d.hatena.ne.jp/kitamomonga/20090610/ruby_hpricot_enables_char_entity にあるように、
Hpricot::NamedCharacters['nbsp'] = 32
として の置換文字データをふつうのホワイトスペースに設定しなおすというのが次善
  とか   とか数値実体参照で書かれてる場合には無力だけど、
大部分はこれでなんとかなるだろう
下手に返り値を toeuc とかすると、 EUC-JP や Shift_JIS にない文字である C2A0 は取り除かれるぞ
irb>p "にほんご\302\240タイトル".toeuc == 'にほんごタイトル'.toeuc
true
doc.at('title').inner_text.gsub(/\302\240/n){' '} 解決
nokogiriもUTF8でかえってくるみたいだから、結局どっちでもおなじなんじゃないの?
Hpricot は元々の HTML の文字コードが「保存」されてる SHIFT_JIS の HTML をパースすれば、それの inner_text は(上記例外がなければ)必ず SHIFT_JIS 文字列 パースの時点で失われる文字はたぶん無い Nokogiri は libxml2 の仕様で、HTML の文字コードがなんであっても inner_text は UTF-8 で返ってくる 内部では iconv を使ってるので、引数指定した or meta で見つけた charset で存在し得ない文字が HTML に含まれてるとエラーを(無言で)出してその文字だけすっ飛ばしてパース処理される 「も」ではなく、UTF-8 で返ってくるのは Nokogiri だけ
>>514 じゃあ定数は旧来のグローバル変数の被りと同じような問題持ってるじゃん
>>514 > A::C と A::B::C の C は同一だってことだけどな
違うだろ。
> p C.new.msg
> end
C.new.msg #=> "fine"
> end
これは再オープンされる きちんとコピペしたか?
test/ ディレクトリの test_ で始まるファイルをテストしたいです ls test/test_*.rb | while read line do ruby $line done みたいにすれば動作はしますが、 毎回 ruby を起動しててなんか遅いし気持ち悪いです
>>526 $ /usr/bin/ruby -v -e 'class A; class C; end; class B; class C; p ancestors; end; end; end'
ruby 1.8.6 (2008-08-11 patchlevel 287) [universal-darwin9.0]
[A::B::C, Object, Kernel]
$ /usr/local/bin/ruby18 -v -e 'class A; class C; end; class B; class C; p ancestors; end; end; end'
ruby 1.8.8dev (2009-06-16 ruby_1_8 23704) [x86_64-darwin9.0]
[A::B::C, Object, Kernel]
$ /usr/local/bin/ruby19 -v -e 'class A; class C; end; class B; class C; p ancestors; end; end; end'
ruby 1.9.2dev (2009-07-24 trunk 24260) [universal.x86_64-darwin9.0]
[A::B::C, Object, Kernel, BasicObject]
あ、test/unit で、sleep できたかどうかをテストする方法ってないですか? setup で作れないような内部オブジェクトのメソッドで sleep されるので、 setup で作った @obj に特異メソッド sleep を追加して横取りという手は使えなさそうな気がします
>>527 $ ls test/test_*.rb | xargs -n1 ruby
でもいいし、Rubyインストールしたらtestrbというコマンドもついてくるはずなので
$ testrb test
でもいいかも
せっかくだからruby使えよ $ ruby -e 'Dir.glob("test/**/test_*.rb").each {|f| load(f)}'
>>530 「sleep できたかどうか」ってどう判断するわけ?
Kernel#sleepは例外で中断されない限りは失敗しないし、中断されれば例外はtest/unitで捕捉されるだろ。
sleep の待機時間の時間差でスレッドが連携するとかいう曲芸でない限り、 「sleep の前後のメソッドが動作した」 「sleep に渡す時間の値が妥当だった」 の2点調べれば用が済むような気もする
スクリプトの中から、現在のスクリプトを実行しているRubyの実行ファイルのパスを知ることはできますか。 たとえば /usr/bin/ruby foo.rb なら /usr/bin/ruby を起動し、 /usr/local/ruby1.9/bin/fuby foo.rb なら /usr/local/ruby1.9/bin/fuby を起動するようなスクリプトを考えています。
535 たぶん require 'rbconfig' File.join(RbConfig::CONFIG.values_at('bindir', 'ruby_install_name'))
インタプリタ名をRubyスクリプトから直接取得することはできません
プロセス一覧とカレントディレクトリを総合的に考えて引くしかなさそう
特殊な起動したときに外してもいいのなら、
>>536 のようにシステムにインストールされてる ruby を調べる方法がある
>>535 環境依存でよければ File.readlink("/proc/#{$$}/exe") とか。
>>536-539 ありがとうございます。
536の方法をベースに、RbConfigがあればそれを使い、なければ 'ruby' を使うことにします。
http://www.ruby-lang.org/ja/documentation/ を開くと
「もしあなたがプログラミングの初心者で、他の言語の経験がなければ、最初にチュートリアル を読むとよいでしょう。」
って書いてあったのでそのリンクをクリックすると
Not Found
The requested URL /~shin/tutorial/index.rb was not found on this server.
でした。本当にありがとうございました。
rubyかpythonかで迷っていたんですが、迷わずpythonを選ぶことができました。
pythonのチュートリアルページは大変面白くて分かりやすいです。
先週末までは存在した外部サイトだからな 追随できなくても仕方がない
┌─┐ │●│ └─┤ _ ∩ ( ゚∀゚)彡 ┌─┬⊂彡 │●│ おっぱい!おっぱい! └─┘ おっぱい!おっぱい!
ほんとだ、18日まではあったっぽいね
他人様の gem の Manifest.txt って手で変更するん?
生成方法が不明なら手書きしかないな 変な自動生成しても二度手間だし
vine linuxでrubyをやろうと思うんですが、エディタは何がイイですか? GUIではnetbeans入れてみたのですが、emacsかviどちらがいいでうか? どっちもまだ触ったばかりです。
>>549 emacsもviもクセのあるエディタだから、どちらが自分の好みかを先に決めた方がいい
>>550 のスレって読んでわかるか?
[[A,B,C] [a,b,c] [1,2,3] ] のA,a,1だけを取得する時はどうすればいい?
>>552 data = [[A,B,C], [a,b,c], [1,2,3]]
result = Array.new
data.each do |a|
result << a[0]
end
p result
または
data = [[A,B,C], [a,b,c], [1,2,3]]
p data.map{|a| a[0]}
>>549 そう聞くということは Emacs も vim も使えない状態だと思うのでひとまずは Emacs
理由は、Ruby スクリプト書くことにしか労力をつぎ込めないから
vim はキー操作が邪魔にならなくなるまでがとりあえず面倒だし、
NetBeans/Eclipse は「使わない」機能がてんこもりだ
Ruby の学習書レベルは、着色程度以外特に何の補助もないエディタで書くことを想定してる
>>553 新しく作ってそこに毎回プッシュするか、mapで毎回おいておくかですね。
ありがとうございます。
ねこび〜んやEclipseは他の言語、具体的にはJava、でIDEを使ってた人向け ちょうど、EmacsやVimで文章やスクリプトを書いてた人がruby-modeを求めて使うのに近い
>>552 富豪的でもよければ data.transpose[0]
map のほうがわかりやすそうな transpose のほうが本質的なような微妙な感じだな
559 :
デフォルトの名無しさん :2009/07/26(日) 18:51:02
オペレーティングシステムのバージョンを調べる方法ってありますか? Windows2000とXPを判別したいのですが。
Windowsならrequire 'Win32API'して GetVersionExとかGetProductInfoを呼べばいいんじゃない?
testrb1.8 がステキなんですが、ruby -w で試すとかそういうオプションはありませんか 最後に gem の Rakefile を rake したときに初めて大量の警告に気づくとかもう嫌です
>>559 お手軽にcmd.exe の内部コマンドのverを呼んでみるとか
puts `ver`.strip
で
Microsoft Windows 2000 [Version 5.00.2195]
とか
Microsoft Windows XP [Version 5.1.2600]
とか得られる
手元に 2000とXPしかないんで Vistaとか7はどうなるのかは知らない
563 :
デフォルトの名無しさん :2009/07/27(月) 00:13:39
Windows2008 x64環境でRailsをやりたいんですが Ruby本体はx64でビルドできたけど mongrelとかが色々エラー出て Rubyはx64、mongrelはx86とかって大丈夫なんでしょうか? 両方x86にしたほうがよい?
両方x86
565 :
デフォルトの名無しさん :2009/07/27(月) 03:19:46
>>562 なるほど。良い方法ですね。ありがとうございます。
567 :
デフォルトの名無しさん :2009/07/27(月) 08:28:53
えー。でもAPIの知識無いし、こっちの方が割と簡単だし。 ライブラリがあれば良いんだけどね>(制作希望)
RubyではWindowsは嫌われてるから無理
挨拶文に入れたいとかいう用途ならまだしも、Windowsのバージョンが必要になる処理って どうせWindows api使うんじゃないの
よく2chの情報はいい加減とか、正しくない情報が多いとか言われるけど、 僕にとっては大事な情報源です。 たまにはボロクソ言われることもあるけど、みんな親切に教えてくれる。 いつもありがたいと思ってる。
Windowsのバージョン表示してくれる、verというコマンドがあるらしいよ
windows-prでwindow/system_infoに定義はされてるから 数行ですぐできるんじゃないかなとやってみたけど OSVERSIONINFO構造体作るのがめんどくさかった APIコール用の構造体を作るのに便利な方法ってある?
あるが、残念ながら俺専用だ
>>570 どこを縦読みするんですか。2行目ですか。
「くにまつ」
国松さんですか。
逆です。「妻肉」です。
>>568 嫌われているつーか
Windows上でRuby使うのは色々と余計な苦労が多いし
むしろWindowsにRubyが嫌われている。
Windowsはいろいろと使いづらい。 ライブラリもWinに特別なロジック与えているし。 システムプログラミングもやってらんね、って感じだな。
MacもUNIXになっちまったから、非UNIXはいろいろ立場がつらいよね。
Windowsの場合は、C#の誘惑が強すぎて、rubyを捨てるか悩むことになる
そんなに競合する言語だとは思わないけどなあ
ぜんぜん競合してないよ。だからC#でやれば楽なんじゃん
IronRuby でいいじゃん
585 :
デフォルトの名無しさん :2009/07/28(火) 05:30:11
WindowsAPIを簡略化して利用できるようなラッパークラスがあれば良いんだけどな。 Windows標準の構造体や手続きを集約させて、ruby的に利用できる形にしたような物。 あとは、適当にそこから派生させて、ファンクションコールを書いていけば、割と簡単な気がする。
てかそれができるなら新たにWindows用プログラム言語がひとつ作れるな(w
Ruby on windows
592 :
デフォルトの名無しさん :2009/07/28(火) 10:03:19
593 :
デフォルトの名無しさん :2009/07/28(火) 10:05:39
いや、RubyFoundationClassか。
594 :
デフォルトの名無しさん :2009/07/28(火) 10:07:47
595 :
デフォルトの名無しさん :2009/07/28(火) 10:28:51
労多くして益少なしか。 エレガントじゃないコードを、豊富な財源と大量の人員投入という力業で成してるのがWindowsなのか・・・
質問です。 Linux上でbashシェルスクリプトをRubyに移植しているのですが、外部コマンド 実行後のコマンド終了ステータスを調べる方法がわかりません。具体的な外部 コマンドはzenityというコマンドですが、シェルスクリプトでは zenity --question echo $? とすると、ダイアログが出て[OK]を押すと$?に0が返ってきて[キャンセル]を押 すと1が返ってくるので、そのまま判定できるのですが、rubyだとirbで見たところ rb(main):001:0> msg=`zenity --question` => "" irb(main):002:0> p msg "" => nil irb(main):003:0> $? => #<Process::Status: pid=17975,exited(1)> $?には返ってきているみたいですが、どう判定に利用したらいいのかわかりません。 こういう時はどうすればいいのでしょうか?
system('ls hoge') puts "hogeはありません" unless $?.exitstatus.zero?
>>598 unless system('ls hoge')
puts "hogeはありません"
end
systemはコマンドが成功(EXIT_SUCCESSで終了)したときtrue、
それ以外でfalse
Ruby.NET
>>601 > シェルスクリプトでは
> zenity --question
> echo $?
と書いてるのでzenityの出力をとりたいんではないと思うんだが。
つまり
>>596 のやりたいことはこうではないかと。
if system("zenity", "--question")
puts "OK"
else
puts "Cancel"
end
説明しよう! zenity とは、 「OK / キャンセル等の各種コモンダイアログを表示し、どのボタン等がマウスで押されたかを整数で返す」 という、組み合わせで超便利になる Gnome コマンドだ! よって今回必要なのは終了コードだけだな
しっかしzenityって仰々しい名前だよなw XとかKDEみたいにGDialogとかじゃいけなかったんだろうか
つまり本当に書くべきコードは 0 か 1 で分岐するこれか case system('zenity', '--question', '--text 押してくだし') when 0 then puts 'OKが押されました' when 1 then puts 'キャンセルが押されました' else raise 'UnknownError' end
>>605 お前通信簿に「人の話を聞かない」ってよく書かれてたろ
>>606 終了ステータス 0 以外は任意なのよ
1 が異常終了と決まったわけでもない
zenity はあくまでメッセージとして 0 と 1 を送信してるんだろうから、case 分岐がたぶん妥当だと思われ
だから、ドキュメント読めよ。 systemの戻り値は終了ステータスか?
10個前のレスも読まないやつがドキュメント読むかよ
rubyのchasenモジュールで40,000文字(バイト)越えたあたりで セグメントエラーでるのって直しようない?
rubyでやるのが間違い。perlかphpで。
>>612 puts str.size
Chasen.sparse(str)
でセグメントフォルトでるまでやると40000までいって落ちる
‘chasen file_name‘だと落ちない
>>611 パール勉強するか・・・
「優秀なマネージャ」と思えない。 仕事での過去の駄目マネージャたちを思い出して参加する気が萎える。
ここは学生プログラマ対象でつ
"\\d+\\-\\d+" でいちいち\エスケープしないで済む表記ってないの?
>>617 ""のかわりに''で囲めば、'と"に付けたエスケープだけが解釈される。
'と"じゃない、'とばっくすらっしゅ
サンクス ''は\\を解釈するもんだと思ってたけどそれに加えて\単体でもいいのか。 文字列リテラル読み返したら確かにそう言ってるな。微妙に勘違いしてた。
だれか、Refe2の簡単な入れ方おせーて
ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-freebsd7] で、 xxx.rb ---- begin raise Exception, "xxx" rescue puts "exception!!!" puts $! end ---- というファイルをrequireすると、例外が補足出来ないですが、回避方法ありますか? ↓結果 C:\home\temp>irb irb(main):001:0> require 'xxx' ./xxx.rb:4: xxx (Exception) from C:/home/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require' from C:/home/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from (irb):1:in `irb_binding' from C:/home/ruby/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding' from C:/home/ruby/lib/ruby/1.8/irb/workspace.rb:52
↑バージョン間違えました。 ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] ちなみに、上記のバージョンでもエラーメッセージは多少違いますが、同様の挙動です。 ついでに言うと、JRuby 1.3.1でも同様です。 $ irb irb(main):001:0> require 'xxx' Exception: xxx from ./xxx.rb:2 from (irb):1:in `require' from (irb):1
rescueで例外を拾えばおk
てか、raise するだけの場合はメッセージだけ書いて RuntimeError 出すのでいいじゃん 引数で Exception クラス自体を指定する人は久しぶりに見た あと irb で自作スクリプト読ませて実行したいときは require じゃなく load 使うといいぞ
1年半振りぐらいにまたRubyでもしようかと思っています。 バージョンが1.9.1とすごく上がっているのですが、今PCに入っている1.8.6からバージョンアップした ほうがいいのでしょうか? スキルは初心者を少し抜けたぐらいだと思います。 1.9.1を入れたほうがいいとした場合、お薦めの書籍を教えてください。
>>629 dです。
1.8.7がいいとのことですね。
了解。
> 【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】 今年になって出てる書籍は1.9対応の方が多いと思うが、 このテンプレおかしくないか?
ここで言うサポートというのは「1.8 系列の解説を参考にしなくても単体でわかるもの」だろ 1.8 がメインで 1.9 がコラムとしてくっついてるという程度ではまだ駄目 今の俺らが 1.6 系列や 1.8.2 時代の情報を無いものとして扱ってるのと同程度になってるもの 「Rubyの文字列は文字列データ本体とエンコーディング情報がペアになっています」 というカンジの、1.8 を切り捨てた説明の書籍やサイトがどんどん出れば消してもいいと思うけど…
まつもと某などの開発者インタビューを見ると、 1.9のほうが便利だからもう移って欲しいって書いてあったぞ
Railsがruby 1.9を正式サポートするまではダメだろ 今は起動ぐらいはするんだけど、ちょっと突っ込んだことをやろうとすると やっぱりダメだし
PHPやPythonのバージョンいくつが主流かを考えると……
>>635 やってみ
本質的でない情報不足で詰まること請け合い
情報不足で詰まりかねない 1.9.1 を初学者に使わせるくらいなら、
俺は情報たっぷりで「誰もまだやってない」分野が上記よりはぐっと少ない 1.8.7 を強く推す
初心者にとって一般ユーザーから得る恩恵は大きいんだから 一般ユーザーに移行を促したこのタイミングはないだろ
Windows機を買うのにXPとVistaどっち選ぶ?って感じ MicroSoftなら当然Vistaを推すよね
つか「1.8.7を学んでRubyに慣れてから1.9.1に移行する」というプランの何がまずいのよ 寿命があと2ヶ月だとかそういうのならRubyなんて忘れて親孝行とかしろ
世の中には ・ エッジな人 ・ 活発な人 ・ 初学者・利用オンリーユーザー の3種類がいる エッジな人は1.9.0時代から使い倒してて、地雷とか踏み抜いて今は1.9.2preで遊んでる 活発な人は1.9.1を使うべきで、それなりに試行錯誤しつつ自作ライブラリやらを踏み固める 初学者や利用者は素直に1.8.7を使うべき 次(か、その次)のフェーズでは、初学者や利用者にも1.9.xが適するようになっていることだろう
とりあえずテンプレ維持だな 次の質問の方どうぞ
>>642 初学者は1.9.1じゃないの?
使い方が分かってきたころに覚えなおしとか、まぞい。
>>643 >>631 と言いたくなる気持ちはわかるし、語弊は減らしておかない?
【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだ不十分です】
lib/aaa/hoge111.rb lib/aaa/hoge222.rb lib/aaa/hoge333.rb という AAA::Hoge111 クラス等があります hoge 関係が多くなったので、 lib/aaa/hoge/hoge111.rb lib/aaa/hoge/hoge222.rb lib/aaa/hoge/hoge333.rb というようにディレクトリ掘って整理しました この場合、他からこんな経緯はわからないわけで、 やっぱり AAA::Hoge::Hoge111 というように、ディレクトリに対応してクラスもネストさせるべきでしょうか?
>>644 だからやってみろって
1.9.1オンリーで
「使い方がわかった」というところまで行かないから
>644 いや、それはそんなにマゾくないと思うぞ。 基本が解ってれば追加情報だけで良いんだから。 初心者にはその基本が解るまでの間が一番マゾいワケで そんな間に検索しても解らないような問題にブチ当たるのが一番マゾいかと。
>>646 はい
サブディレクトリ構造はクラスネスト構造に対応「しているべき」
hoge 関連だからって AAA::HogeLoader を hoge ディレクトリにまとめてはいけない
めんどくさいけどね
>>646 そもそも名付け方が迷走してる気がするw
AAA::Hoge::Fooとかにはできないの?
クラス構造がディレクトリ構造と同一だとうれしいけど 別にそうでなくても構わない。。 lib/aaa/hoge/111.rb lib/aaa/hoge/222.rb lib/aaa/hoge/333.rb あと、名前規則はこうであってほしい
1.8.7 使うくらいなら 1.9.1 でいいと思うけど
hoge に当たるものが実は Error とかだったりしたらどうしようとドキドキです
あー 11111Error を Error::11111 にしたら座り悪いことこの上ないな ユーザーがまず参照しないようなファイルであるなら、ちょっとくらい変な構造でも問題ないと思う
>>654-655 Errorごときでそんなにファイル作るなよw
それにHoge::Hoge111はイヤだけど
Hoge::111Hogeならそんなに悪くもない
ディレクトリを切る以上、(出来れば) require 'aaa/hoge/111' だけで、単独で使えるようなクラスにしてほしい
全世界の gem ライブラリ作者から
>>657 様宛に抗議のファクシミリがぞくぞく届いております
hoge/111.rbがrequire 'hoge'して結局全部ロードってことでよろしいか?
ライブラリ利用者がスクリプト書き換えないで済むならOK 利用者が自分だけならもう何やってもいいよ
>>646 しなくていいと思うよ
そもそもクラスとファイル構造を、完全に対応させる必要はない
(ライブラリなら話はまた変わってくるが)
>>632 が少なくともここ半年、
Ruby関連の本をろくに読んでないことは分かった
>>661 パスが lib で始まってるのはたいていライブラリだ
勉強になったな
>>646 >やっぱり AAA::Hoge::Hoge111 というように、ディレクトリに対応してクラスもネストさせるべきでしょうか?
クラス構造とディレクトリ構造が対応していたほうがわかりやすいけど、
絶対そうすべきだというほどでもない。
そのライブラリのユーザとしては、「使う人」と「(ソースを)読む人」が考えられると思うけど、
まずは「使う人」の都合を最大限に優先し、その邪魔をしない範囲で「読む人」のことを考えればいいんじゃないかなあ。
実際問題として多言語がらみで1.9で使えないライブラリとかアプリがまだまだある。 ほとんどなくなるまでは初心者には1.8推奨。
それおまえの個人的な推奨だろ スレの推奨ってわけじゃないから「おれ推奨」とかにしてくれよ スコープは明確にしてくれ
まあ何言ってもおまえの意見でスレは変わらないから 俺でも何かできたという夏の思い出作りは他所でやってくれ
??? まあ何か気持ち悪いしどうでもいいや・・・
おれ推奨(笑)
>>663 ダウト
たとえばaaaという名前のアプリケーションであれば
lib/aaa/ 以下にアプリケーションのコードを入れることがある
この場合、「ライブラリである」とは言えない
>>665 他言語が絡まなくても、動かない拡張ライブラリがあまりにも多いからなー
どう考えても初心者に1.9.xを推奨できる段階ではない
毎度ループしているな
山崎パンスレがここにあると聞いてやってまいりました
動かないとかどうせ試してもないで言ってるんだろうけどな。 まあどこのスレもたぶんそんなもんだw
>>674 現時点でnokogiriが動かないんですが何か
おれが使ってるのはNokogiriじゃなかったのか
nukogirlだったとかいうオチ
とりあえず1.9.1p0(mswin32)で色々入れて、requireで検証してみた ちなみにgithub(のgemレポジトリ)はデフォルト設定じゃないので除外 Nokogiri 1.2.3:Segmentation Fault Mechanize 0.9.3:Nokogiri使ってるので無理 Hpricot 0.6.164:Segmentation Fault WxRuby 2.0.0:Segmentation Fault SQLite3-ruby 1.2.5:動く 予想以上にひどい状況だった
hpricotは0.7以降で調べてみて。
あああ、githubは除外したのね。
p0ってw話に出たNokogiriも1.2系とか 昔のバージョン引っ張り出して文句言うのはおかしいと思わないのか?
よく使われるライブラリほぼ全部が、無設定でgemから入れて問題なく 動くようになるまで、「初心者」に1.9系を勧める必要はないだろう。 @ITの記事でも、既にrubyアプリケーション資産を持っている人に対して、 1.9が当たり前になってから移行したんじゃ遅いから、そろそろ移行を 開始しろ、と言ってるだけなので、逆に言えばまだ1.9は当たり前じゃない ことを認めている。 イノベーターは既に移行済み、アーリーアダプターは移行を始めている。 今から動き始めないとアーリーマジョリティーにもなれないよ、という それだけの話。 今現在初心者な奴はそんな前の連中に倣う必要も意味もない。
しつこいよ
そろそろgithubレポジトリを、RubyGemsが標準で見に行くようにしてもいいんじゃね 実際、初心者が最新版(Hpricot0.7以降とか)を見つけられないのは不便だ
1.9.1p0(mswin32)は…マズい… RubyGems1.3.5が動かない。
mswin32での導入部分をなぞってみたけど、1.9.1バイナリ入手の時点で厳しいな・・・ まあ1.8.7もそう変わらないけど one-click ruby installerが1.9対応してからが本番かもしれない
mswin32はどっかのバカが管理人を怒らせて
更新が止まってるんじゃなかったか?実は
>>684 だったりしてな
1.9.2もプレビューが出てるし、ワンクリックなんて待ってられん
何言ってるんだ? Ruby初心者だからってコンピュータ初心者だと限ったものでもないだろ 最新版ソースダウンロードして自分のVCでコンパイルするだけだ 簡単じゃん
最新版の追っかけなんて問題解決の障害にしかならん そーゆーのは開発者やテスト部隊のする事だ 初心者には安定版を提供しておけば良い
Ruby初心者ってどういう意味だ? a. いくつかの言語を習得していて、Rubyをさわり始めたばかりの人 b. プログラミング言語自体が初めての人 これらによってだいぶ話が変わってくると思うが。
おおむね b 他言語も制御構造触った程度の人を脳内想定 組み込みCとJava案件抱えてるけどRubyにも興味あったからマニュアル読んで始めて半月とか そういうような人はあんま想定してないと思う
炙り出された やっぱり初心者スレにもいるんだ
はやく初心者スレでも、おおっぴらに1.9.xが語れるぐらいの段階になってほしいなー 「初心者はまず1.9.xから使い始めるべき」と言えるようになると嬉しい
非・完全初心者以外の人が大挙して 1.9.1 を使い倒して 外部ライブラリを対応させまくるしかないねえ これは「初心者向け 1.9.1 解説が足りない」というレベルの話ではない それ以前 新人さんを迎えるためにおおわらわで大掃除とか椅子並べとかしてる状態
ん、二重に否定して初心者になってるか 「非・完全初心者」か「完全初心者以外」のどっちかでよろしこ 自分の利用してるライブラリで testrb1.9 test/ してエラーが出たらちょっと頑張ってみるとか や、Debian 系列以外で testrb1.9 が用意されてるの見たことないが
クラス変数 @@hoge を参照してるインスタンスメソッドがあります @@hoge の値による挙動の違いを Test::Unit でテストしたいです もしかして、テスト中にクラス変数を変更したら「リセット」できなかったりしますか?
>>701 「リセット」というのがどういった動作を指すのか良く分からん
@@hoge を初期化した時の値に戻って欲しいのであれば
Test::Unit::TestCase#setup 等でその値を再代入するしかない
class Hoge
def hoge=(h) ; @@hoge = h ; end
end
class TestHoge < Test::Unit::TestCase
def setup
@hage = Hoge.new
@hage.hoge = :Hoge
end
:
すごい低レベルな質問で申し訳ないんだが、 テキストファイルの特定の行の次の行を読み込むにはどうすればいい?
「特定の行」まで読み捨ててから次の行を読む。
行ごとに配列にして、特定の行の入ってる要素の次の要素を使う
IO は Enumerable なので Enumerable#findと組み合わせるとか。 if f.find{|line| line が 「特定の行」 かどうか } target_line = f.gets end
707 :
703 :2009/07/30(木) 14:51:35
injectについて質問なのですが、
以下のサイトのrubyの回答で、injectを使って、ディレクトリ表記の文字列からなる配列を、木構造を模したHashにしています。
http://ja.doukaku.org/102/nested/ 関係有る部分だけ、コピペします。
path_list = %w(
abc\\def
abc\\def\\gh
abc\\def\\ij
abc\\jk\\lm
de
)
h = {}
path_list.each{|path|
path.split(/\\/).inject(h){|k,v|
k[v] ||= {}
}
}
その結果が、(これは、僕のところで動かした結果)
h # => {"de"=>{}, "abc"=>{"jk"=>{"lm"=>{}}, "def"=>{"ij"=>{}, "gh"=>{}}}}
injectへの初期値に指定した変数(この場合 h) #その前に宣言されていてinjectの取るブロックの外にスコ−プがある。
は、どのように変更されているのでしょうか?
injectでのブロック変数(この場合、k,v)は、
kの方は最初に初期値が入り、その後、ブロックで最終的に評価された値が入る。
vはレシ−バの各要素が順次、代入されるということは理解しているつもりです。
今まで、初期値(h)は、その値が、最初にブロック変数(k)に代入されて、それ以降に、なにかの影響を受けてるのでしょうか?
いやごく普通に、inject(x) の x を初期値として使ってるだけだと思うんだが ブロック内で初期値として与えられたオブジェクトがどう使われるかなんじゃね 破壊的に使われるなら破壊されるだけだし、今回のように破壊されてないなら(アクセス方法があるなら)ずっと残る
710 :
デフォルトの名無しさん :2009/07/30(木) 16:06:15
Ruby1.8.6をWinXP-Proで使っています。 Socket通信で、受け取った情報をテキストファイル化できず困っています。 tcpSocket = TCPserver.open("localhost",60001) tcpSocket_ac = tcpSocket.accept # 接続を受け付ける として puts(tcpSocket_ac.read) # これは表示される File.open('ReplyaData.txt', 'w') {|f| f.write tcpSocket_ac.read # ファイルに書き込む } としてReplyaData.txtが生成されましたが、中身が空っぽです。 受け取った情報自体は puts(tcpSocket_ac.read) で表示されるのですが・・・ アドバイス願います。
>>710 putsの行でreadしてしまってるのが原因
試しに
File.open("example.txt"){|f|
p f.read
p f.read
}
ってやってみ
IOクラスやその派生っていうのはただの文字列とは違って
「どこまで読んだ」という情報も持ってる
バイナリは'wb'でopen
>>708 ひとつ前の結果に v が登録されていなければ空のハッシュを v 名義で登録し、
登録したその新規ハッシュを次の処理に使う
v が登録されていれば登録されているハッシュを使う
という処理を繰り返す
と
abc の場合
{ }
{ 'a' => {} }
{ 'a' => { 'b' => {} } }
{ 'a' => { 'b' => { 'c' => {} } } }
abccd の場合
{ }
{ 'a' => {} }
{ 'a' => { 'b' => {} } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => { 'd' => {} } } } }
abc abd の場合
{ }
{ 'a' => {} }
{ 'a' => { 'b' => {} } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => {} } } }
{ 'a' => { 'b' => { 'c' => {}, 'd' => {} } } }
714 :
710 :2009/07/30(木) 17:30:51
>>711-712 さんきゅうです。712さんの'wb'を使って
replyData= tcpSocket_ac.read と一旦格納し、
puts replyData
File.open('ReplyData.txt', 'wb') {|f|
f.write replyData
}
とすれば、Txtファイルの中身が出来ました。
(711さんの記述を実行するとsyntaxエラーになります)
しかし受け取ったデータには本来改行3箇所があり、DOSでは
その改行が反映されていたのですが、ReplyData.txtでは改行が
無視され1行になってしまっています。
どうしたら良いでしょうか?(バイナリの性ですか?)
まともなエディタで開けば
>>714 2chにコードを書き込むときはインデントに全角スペース使われることあるから
コピペするときには注意
テキストにbフラグはいらない
def f1(s); return "f1: #{s}"; end f = f1 f("a") という感じで関数(メソッド?)を変数に入れておいてあとで呼びだしたいのですが、 f = f1 は wrong number of arguments になってしまいます ruby ではどうすればいいのでしょうか?
>>717 f = method(:f1) # または 'f1'
f.call("a")
# スコープに注意
まあ、99.5パーセントくらいの割合で必要のない処理だけどな 文法の一覧テストみたいなの作ってるのでない限りたいていはもっといい方法がある
まぁ、CやJavaScriptやPython辺りから来た人だとそんな書き方したくなるかもね
f = lambda {|s| "hoge: #{s}" } f.call("a")
Rubyはどっからきたひと?
SmalltalkとLispとPerlかな。
724 :
708 :2009/07/30(木) 23:50:59
少し、遅くなりましたが、 >> 709,713さん、ありがとうございます。 713さんの例も見ながら、考えてました。 で、 injectについて、質問したのですが、理解していなかったのは、Hashのところでした。(injectを覚え立てで、意識がそっちにいってしましました。) hとkのつながりが見えてなかった。 h = {} path.split(/\\/).inject(h){|k,v| k[v] ||= {} } まず、k = hが行われ、 k, h が同じ場所を見るようになる。 k[v] ||= {} k[v]を評価、nilなので、k["abc"] = {}が行われる(k = {"abc" => {}となる)。hも同じ所を見てるので、h = {"abc" => {}}となる。 また、この k[v] ||= {} という(条件+代入)式は、k[v]の値( {} )を返し、 injectなので、これが次回のiterationでの kになる。 さらに、その値 {}は hである、{"abc" => {} }の {}部分も kになる。 なので、イテレ−トの二回目は、 k = {} h = {"abc" => k} と、hのなかに、kへの参照?が残り、hにハッシュの要素が追加されていくようになる。 自分の中では、もう少しというところまで、理解が来たのですが、説明が、ぐちゃぐちゃになってしまいました。 変な文章で、スレの流れを止めて申し訳ありません。
変数が特定の値(にマッチする等)かどうかをチェックしたいとき 比較の固定値 == 変数 と書くのと 変数 == 比較の固定値 と書くのとどっちが好ましいですか?
>>725 ここでの == は「左辺」のオブジェクトのインスタンスメソッドです。
・ 既知のオブジェクトが == などの比較用メソッドを持っていることは確定
・ 比較の変数のオブジェクトの == メソッドなどが比較用に実装されてるとは必ずしも限らないと考える
ということで、
既知のオブジェクト == 比較変数
と書くようにするとスマートです。
従来の言語の if 文の
if 変数 == 値 then …
とは逆に見えるというかはっきり逆なので違和感バリバリですが、一応この順が正しいということになってます。
「代入と書き間違えないように if 0 == val と書くんだぜー」という姑息なバッドノウハウにも
予防線張る的な意味でよく似てる感じもしますが無関係です。
ただ、ぶっちゃけ、比較が動作しない場合はどっちに何を書いててもそもそも動作しないんで、
あんまり神経質になる必要はありません。
俺はどうしても逆に書かないと通らないコードじゃ無い限り、意味的に通りが良いほうで書くかな
正規表現のマッチも /正規表現/ =~ 文字列 が正しいね 文字列 =~ /正規表現/ を動作させるためにわざわざ def =~(re) re =~ self end というような動作をする String#=~ を作ったくらいだが
==が通らないオブジェクトを無闇に想定するのもどうかと思う ライブラリ等でそういうのも想定するなら細工が要るけど 想定外の変なオブジェクトは半端に通すよりはいっそ転けた方がよさそう
obj == 1はobj#==(1)であるというRubyの原理を知る上では有意義な話 ただ==に対してそれを日頃から意識する必要はないんじゃないかということ =~は==と違ってObjectのメソッドじゃないし
ごめんObjectにも=~あったorz
732 :
デフォルトの名無しさん :2009/07/31(金) 14:20:15
プログラミングの問題です 分からないので教えてくださいm(__)m お願いします((+_+)) A 1.ユークリッドの互除法を用いて6696と3906の最大公約数を求めなさい。 2.自然数の配列に対して、全要素の最大公約数を返す関数array_gcd()を定義しなさい。 例)array_gcd([72,42,66,90])=>6,array_gcd([35])=>35 B 符号なしの自然数の3乗を要素に持つ配列の表示を受理するオートマトンを書きなさい。 受理例)[355,134,0,94],[12] 不受理例)[53,][04,32],[],[8,21]
734 :
710 :2009/07/31(金) 16:24:05
>>716 'wb' → 'w' でOKでした。
さんくす。
webのRubyリファレンスマニュアルが使いにくすぎる。 知りたいことを探す方法がない。なにあれ。
旧版使ったほうがいいぞ 作ってる最中に作ってる人が使わなくなってグダグダしてしまってる
>>737 そっちが使いにくいという話ではないのか
なんでリファレンスを wiki でやろうとするかなあ その時点で判断を誤ってると思う
Wikiなのは正しい判断だと思うよ
>>735 が何を使いにくいと言ってるのか知らんが
いずれにせよ、声を上げるか手を動かすかしないとどうにもならん
Wikiだったのは昔のリファレンスで、 今の刷新計画は、マニュアル本体の管理にはWiki使ってないぞ。
loopメソッドで loop { |i| ... } のように記述すると,エラーになってしまうのですが, loopメソッドでは,timesメソッドのように,繰り返し回数を 変数に代入できないのでしょうか。
timesは「何回でループを止める」という処理の都合でカウンタを持ってるけど loopにはそれがないからカウンタを省いているんじゃないかな ユーザーが必要とするかもわからないし、必要なら自分で i = i + 1 すれば済むわけだから
>>742 出来ません。
無限ループでカウントを数えるには
0.upto(0/0.0) {|i| }
とかどうだろう?
>>744 素直に i += 1 した方が可読性が高いと思う。
まさにRubyの悪い使い方に見える。
>>744 きもすぎw
というか、処理系依存にならないのそれ?
将来動かなくなりそうで怖いんだけどそういうコード
Infならまだわからんでもないが、0/0.0 でできるのがNaNだから意味がわからん。 1/0.0ならマシかというとそうでもないけど。 これも処理系依存?
>>743 ユーザーがいらないと判断したなら、ブロック引数を省略すればいいだけの話では?
初期値どうすんだって問題が残るけど、まあ引数で与えることにして
こんなのじゃダメなんだろうか
def loop(n = 0)
i = n
while true
yield i
i += 1
end
end
NaNとの大小比較は常に偽だからループしつづけるということだろうか。 きめえ。
1.upto(Inf)とか書けたらかっちぇえんだけどな
>>748 引数が省略されたらカウントもしないぐらいやってくれるなら反対はないんじゃないかなぁ
たぶん意見を言う人のなかに、loopがカウントまでしてくれたほうが嬉しいと
考える人がいなかっただけじゃないかと想像
def loop(n = 0, &block)
if block.arity == 1
i = n
while true
yield i
i += 1
end
else
while true
yield
end
end
end
でも初期値を引数にするのはどこか直観的とは言い難いし
timesとの対称性を考えて、カウンタを備えるのはIntegerのメソッドとするほうがよさそう
1.loop{|i| print i} #=> 1, 2, 3, ・・・
今度は名前が微妙かw
Integer#stepのlimitを省略かnilを渡すとloopになるとかでもいい気がしてきた
753 :
デフォルトの名無しさん :2009/08/01(土) 03:24:26
たのしいRuby 第1版を古本で見つけたんですが、 1.8に対応して無くても、本に掲載されているプログラムや文法は機能しますよね?
おおむね問題ない 何箇所かメソッド変わって動かなくて、それをどっかにメモしたんだが、どこだったか
0/0.0 ねえ 別にいいけど、それ激烈に処理遅いよ user system total real loop 5.450000 0.340000 5.790000 ( 5.786291) int 4.980000 0.700000 5.680000 ( 5.680568) 0/0.0 14.300000 1.530000 15.830000 (15.829079) require 'benchmark' max = 10000000 Benchmark.bmbm{|x| x.report("loop") do n1 = 0 loop{ break if n1 == max; n1+=1} end x.report("int") do 0.upto(max){|n2| break if n2 == max} end x.report("0/0.0") do n = 0 0.upto(0/0.0){|n3| break if n3 == max} end }
ちなみに1.9.1での結果はこちら さすがフィボナッチ数列最適化された1.9さん汚いサンプルスクリプト全力実行汚い user system total real loop 1.040000 0.000000 1.040000 ( 1.035370) int 0.930000 0.010000 0.940000 ( 0.939556) 0/0.0 2.330000 0.000000 2.330000 ( 2.326159)
$.
Ruby1.8 か 1.9 で、 arr.find{|e| e.mes === val} arr.find_all{|e| e.mes === val} の結果を返す hoge(:mes, val) や hoge_all のような hoge メソッドって無い?
>>754 それじゃあまだあったら購入します。
最悪、CD-ROMのRubyでも勉強できますし。
760 :
742 :2009/08/01(土) 11:34:12
なんでただの無限ループに回数を数える機能がついてなきゃならない 必然性があるわけ? i = 0 loop{ ... i += 1 ... } これじゃどうしてもダメという理由がある?
>>760 def foo(i); end
foo # ArgumentError: wrong number of arguments (0 for 1)
これがエラーになることと一貫してる
まあ、そりゃ、あってもいいが、使わないことのほうが多いからな loop を仮引数なしのブロックつきメソッドにしたのはそのへんが理由だろう 明示的無限ループの制御部なんて速いに越したことはない gem のどっかで loop_with_index とか作ってそうだが無さそうだ
「真に無限回、ループカウンタを参照する」という処理は 存在するべきではないのでデフォルトでは非対応にした カウンタ欲しけりゃ自前で実装しとけ がたぶん答だ
特に機能が似ているInteger#timesが回数を返すのに、 loopが返さないのは一貫性に欠けると思う ループカウンタ付きの無限ループは、ただの無限ループとしての機能を含むし かといって、代わりに何かを犠牲するわけでもない あと、2行増えるのが気に食わないw
終わりの保証があるものはともかく、loopは終わりの保証が無いものだからなんか特殊な気がする
>>765 timesとの一貫性ならIntergerにカウンタ付きのメソッドを用意すればいい
と
>>751 で言った
>>762 その指摘は的外れだ
Rubyではメソッドの引数は勝手に省略できないが、イテレータに渡すブロックの仮引数は省略できる
def test_iterator
yield(1, 2, 3)
end
test_iterator do
end
test iterator do |a, b, c|
end
>>760 >それ以前に,文法的に,loopがブロック付きメソッド(イテレータ)にもかかわらず,
>loop { |i| ... }
>という記法ができないのは少し気持ちが悪いというか,
エスパーしてみると、ブロックには必ず引数をつけなきゃいけないと勘違いしてるっぽいな。
loop { ... } は単に while true do ... end と同じようななもんだから、
while で自動的にカウンタがつかないのと同じだよ。
>>765 > 機能が似ているInteger#times
似てねえよ!
どこが似てるんだよ!
>>770 増やしてもエラーにはならないし、本題はそこではない
773 :
742 :2009/08/01(土) 13:23:26
>>769 > エスパーしてみると、ブロックには必ず引数をつけなきゃいけないと勘違いしてるっぽいな。
loopに仮引数を付けた表現を可能にしてもよいのではないかと思っただけです。
仮引数を省略した表現が可能であることはもちろん前提です。
> loop { ... } は単に while true do ... end と同じようななもんだから、
> while で自動的にカウンタがつかないのと同じだよ。
whileはイテレータではないですよね。
組み込みのイテレータであるなら,どのイテレータでも仮引数をとれるようにした方が
表現上,一貫性があるのではないかと思ったのです。
ましてや,times(有限回のループ)で仮引数をとれるのなら,
loop(無限回のループ)でも仮引数をとれるようにした方が自然なように思います。
>>767 timesとの一貫性を保つのなら,カウンタの初期値は 0 になるので,
int.loop とする必要はないのではないかと思います。
無限まで数えさせる気かよ
>>773 だから仮引数はレシーバから取られるだろ
Kernel なんかもらっても嬉しくねえよ
回数を気にしないからloopを使うんであって 回数が必要ならtimesでいいじゃないか
771も言ってるが、そもそもloopとtimesが似てるとは思わない loopにはむしろwhileやuntilのような、制御構造に近いものを感じるから loopがブロック引数を持つと猛烈な違和感がある きっとMatzも同じ判断をして、loopを今の仕様にしたのではないか あれ、ここ何のスレだっけ
>>765 よくわかってないが速度は犠牲にならんの?
779 :
742 :2009/08/01(土) 14:34:11
>>774 有限の時間内にプログラムは終了しないといけないので,
つまり,loopはいつかは終わるので,
実際に無限まで数えることはないと思います。
>>775 すみません,もう少し分かりやすく説明していただけないでしょうか。
>>776 数値計算なんかで,20カウントごとに解を出力して,
ある範囲に解が収まったらループを抜ける,なんてことは,
timesよりもloopの方が適していると思います。
(もちろん普通はwhileを使うのでしょうが,ここでは別の話です。)
機能的にloopに仮引数が必要か否かもありますが,
イテレータの表現上の一貫性からも,
loopに仮引数をとれた方が良いのではないかと思った次第です。
>779 有限の時間内にプログラムは終了しないといけないので…と言うのは計算機上の話じゃないのか loop{}自体が意味するのは無限ループだよ 一貫性って何だよ timesとloopはそもそも出自が全く違うものであって、全く別のものに一貫性も何もないと思うぞ
イテレータは仮引数を使えなきゃいけない って思うのがそもそもよくわからん
はい、そろそろみんな本スレに移動してくださーい
>>750 じゃないが組み込みの無限大オブジェクトを作ればいいんじゃないか?
1.upto(Inf)でもInf.timesでも。javascriptは確かあったよな。
>>783 Float を Integer の 0 で割ると無限大を返すようになってる
irb> p 100.0 / 0
Infinity
>>784-785 うほ、知らなかった。
それをわざわざ計算しなくても使えるように定数にしてほしいな。
でもtimesは使えないのね。Floatの仲間だからか。
>>784 こういうのRuby処理系依存じゃないの?
ゼロ除算例外が発生してほしいって人もいるだろうし。
ちゃんとリテラルで±Infが欲しい
>>787 > こういうのRuby処理系依存じゃないの?
現在はいいえ
というか Float("INF") を取り除くときに意図的にそうしたはず
1.0/0.0 も Infinity 返すぞ
0.0 は例によって「世界で一番 0 に近い正の浮動小数」だから、
これで素直に割ると正の極限に吹っ飛ぶという理解でひとつ
それならtimesメソッドにも仮引数はいらんちゅう話になるわな というか実際いらんだろ
>>789 何かどうなればそういう結論に辿り着くの
仮引数はメソッド定義の def hoge(x) の x のことなんで、ブロックパラメータ foo{|e| の e のことだとする ブロックパラメータはブロックつきメソッドのレシーバから何らかの条件で取るのが普通 loop は Kernel というか Object というかそのへんのメソッドなので、 関数的メソッド loop においては「ブロックパラメータは取りたくても取れない」とするのが、整合性上いちばん自然 Integer#times は レシーバの基底値つまり 0 を初期値として succ して レシーバの値まで繰り返すというメソッド ブロックパラメータは普通にレシーバから 0 が使われて、これが増える 問題なくね 実際問題としてブロックパラメータは省略しても動作する irb> 3.times{ puts "Rubyはうんこ"} Rubyはうんこ Rubyはうんこ Rubyはうんこ
というより、timesは回数を指定するというところから 何回目というのが一応取れるようになってるが、実際は省略することのほうが多い気がする カウンタが欲しいなら俺は素直にRange.each使うほうが多い
794 :
742 :2009/08/02(日) 03:09:30
>>791 詳しく説明していただいてありがとうございます。
loopにブロックパラメータがない理由が納得できました。
メソッド1つとってもなかなか奥が深いですね。
えーこんなんでよかったの よくわかんねー
>>794 貴方のお陰で、なんで職場で私が疎んじられるかがわかった気がする。些細なところまで自分が納得しないと気が済まないっていう人を説得するのは、疲れる。
議論では、必要、必要ない、なんとなくそうなった、なら〜すればいい、 とかの理由にならない水掛け論しかされてないようにみえたな で、ちゃんと理由付きの791に納得 普通の反応だろうよ
>>773 >組み込みのイテレータであるなら,どのイテレータでも仮引数をとれるようにした方が
>表現上,一貫性があるのではないかと思ったのです。
それが思い込み・勘違いだっつーの。
>ましてや,times(有限回のループ)で仮引数をとれるのなら,
>loop(無限回のループ)でも仮引数をとれるようにした方が自然なように思います。
なんでそれが自然なんだよ!
>whileはイテレータではないですよね。
だからどうした? イテレータであるかどうかは今の話に関係ないだろ。
うお 水掛け論て言われた直後に 典型的な水掛け論レス! しかもレス先が古すぎて・・・
負けたと思ってから2倍頑張り出す人って、たまにいるから。 まぁ2倍といっても、言い掛かり度と語気が2倍になるだけでレベルは逆にもっと下がるんだけど。
>>773 >それ以前に,文法的に,loopがブロック付きメソッド(イテレータ)にもかかわらず,
>loop { |i| ... }
>という記法ができないのは少し気持ちが悪いというか,
>loopが組み込みのブロック付きメソッドなら,文法の一貫性を保つためにも,
>上記の表現は可能にすべきじゃないかと思ったのですが,どうなのでしょう。
loop {|i| p i } って今でも普通に動くぞ。
>>791 >ブロックパラメータはブロックつきメソッドのレシーバから何らかの条件で取るのが普通
そんな「普通」はない。
Kernel#open とか Array#each_index とかいくらでも例外がある
いるよね、普通という言葉を完全と取り違えてる人
>>802 すまん、「例外がある」という言い方で誤解されたか。
こんな慣習は存在しない。
完全な誤解 or デマだから初心者はだまされないように。
「例外がある。だから普通はない」 ワラタ
obj.mes{|e| という表記があったら、普通 e は obj の何かだと思うんだが そりゃメソッド作成時にどう作っても構わないが、そう動作するのが期待されてはいるだろ
1.9 から入った人は obj.mes が渡されると思うかも
まあこれだって規定があるわけじゃないから
>>803 は「そんな慣習はない」と言うだろうけどな
IO#each_* IO.open IO.popen IO.pipe IO.foreach Dir.open Dir#each Dir.chdir Regexp#match String#unpack ObjectSpace.each_object Kernel#open Kernel#callcc まだ続ける?
808 :
802 :2009/08/02(日) 11:24:51
loop がカウンタを yield しないのは「Kernel#loop のレシーバと 関係ないから」なんて理由じゃないということだけわかってもらえれば。 実際の理由は今までそういう提案がなかっただけだろう。 走らせっぱなしにするプログラムで loop をとても長く実行する場合、 2**30 回を越えると Bignum が大量に生成されてしまうのは嫌だな。
続けて続けて!
お前らそろそろ本スレでやれ
だが断る
>>742 は何で loop { |i| ... } を文法的に記述できないと勘違いしたんだろう
>>813 それは
>>801 が1.9.1ユーザーだからだよ
1.8.7では警告が出る
a.rb:2: warning: multiple values for a block parameter (0 for 1)
from a.rb:2
なるほど、警告を文法エラーと勘違いしたのか
じゃあ
>>742 に必要だったのは $VERBOSE = nil かな
>>808 >走らせっぱなしにするプログラムで loop をとても長く実行する場合、
>2**30 回を越えると Bignum が大量に生成されてしまうのは嫌だな。
{hoge} のときはカウントせずに
{|i| hoge} のときだけカウントすればいい
ruby1.8.6で $VERBOSE = nil をセットして、 loop {|i| p i } を走らせると、nilが延々と出力されるけど、 1.9.1だと何が出力されるの?
nilが延々と出力される
>>801 にとっては普通に動いてることになるわけか
>>815 警告を切ればいい、というものでもないと思う
>>816 > {hoge} のときはカウントせずに
> {|i| hoge} のときだけカウントすればいい
まず、arity の数によって挙動を変える API というのは前例がない。
ML で提案してみるといいけど、i = 0; loop { ...; i += 1 } で済む
程度のことなのでおそらく通らないだろうね。
あと、C レベルでは block と Proc は別なんだよね。
arity を見るには Proc にしないといけないが、block を Proc に
変換するのは結構遅い処理なんだ。
つーわけで、それをやろうとすると従来の loop が遅くなる。
>>820 文法エラーは一切関係ないといいたいだけなんだが。
def foo; yield; end; foo {|x| p x } ってやってみろ、と言えばいい?
puts "aaa .rb".gsub(/(.*?)\s*(\..*?)$/, '\1\2') で拡張子前のスペースを取り除けたんだけど puts "aaa .rb".gsub(/(\s*)\..*?$/, '') といった感じで取り除きたいものを括弧でくくって除去する書き方ってないですか。 この書き方だと/〜/が置換対象になる為か"aaa"になってしまいます。
先読みを使うといい puts "aaa .rb".sub(/\s+(?=\..*$)/, "") aaa .bbb .rb が aaa.bbb .rb になるのが嫌なら puts "aaa .rb".sub(/\s+(?=\.[\.]*$)/, "")
とりあえず gsub はブロック使え 単語末は $ よりも \Z 推奨(\Z で用が済む場合のみ) > 取り除きたいものを括弧でくくって除去 puts "aaa .rb".gsub(/(\s*)(?=\..*?$)/){''}
826 :
742 :2009/08/02(日) 21:37:08
何度も失礼します。
みなさん,いろいろありがとうございました。
>>801 どのブロック付きメソッドでも obj.method { |i| ... } を実行できるが,
i に何が入るか定義されていないときには nil が入る。
で,loopの場合には i に何が入るか定義されていないので,nil が入る。
結局,loop { |i| ... } は文法的には誤りではないと。
>>807-808 > loop がカウンタを yield しないのは「Kernel#loop のレシーバと
> 関係ないから」なんて理由じゃないということだけわかってもらえれば。
そういう縛りはないということなのですかね。
当初,loopにカウンタがあれば嬉しいなと思ったのですが,それも難しいということで,
少し残念な気もしますが,そんなもんだと思っておきます。
お騒がせしました。
ゲーム(RGSS)でネットランキング機能を実装したいと思っているのですが、 Webサーバーにあるテキストファイル読み込み、追加編集ってできますか?
本家と挙動の違う改造済みRubyの話は専用のところでやっとくれ 物凄く一般的には、 「得点ファイルを受け取って全体ランキングを返すCGIをサーバに置く」 「URLは一発でバレて原理的に隠せないので、不正防止のために それを送れるのはハッシュの作り方を知ってるゲーム本人だと確信できるような 複雑でランダムなハッシュをゲームに作成させる」 「ゲームからのファイル送受信はとりあえずopen-uriあたりを使う」 あたりになると思う
>>827 サーバ側にCGIプログラムとかを用意して、サーバ側でテキストファイルを読み書きしたほうがいい。
サーバにあるテキストファイルをとってきて、クライアント側で書き換えてサーバ側に送信するようにすると、いくらでも不正行為ができるからね。
だから、まずCGIプログラムの作り方(やRailsの使い方)を勉強したらいいんじゃないかな。
>>828-829 みたいな事するならHTTP使う必要無いなと思う
別に間違った事を言ってる訳じゃないけどさ(Rails以外は)
Rubyでゲーム作ろうと思うような人なら簡便なHTTP+CGIでいいと思う そりゃUDPと特定デーモンで用は足りるが、プロトコルデータ総量とセッション負荷を問題にすべき場所ではない
そんな糞CGIをレン鯖で動かすと、ruby禁止に成りそうだwww 作るなら、php辺りで作ったほうが良いよwww
1分につき何回のアクセスを想定してるかにもよるな 素直に読むなら多くても通常のサイトのカウンタCGI程度だと思えるが
ネトゲ作るという話にすり替わってるんじゃね
>>833 >1分につき何回のアクセスを想定してるかにもよるな
ネットランキングを作りたいって言っているんだから、大した負荷にはならんだろ。
毎秒のリアルタイムスコアを全アクティブユーザーから収集した 超リアルタイムランキングを作りたいとかいう奴のいる世界を舐めたらいかん
ランキングなんて10分ごとに更新で十分だろ
それは我々の妥協した常識でしかない
リアルタイムで見たいとか逝って連打する香具師も居るだろう。
何を連打するんだろう
後付けしたHDDをマウントしてその中でrubyを実行したら、OSが入っているHDDの時と実行時間が8倍くらい遅い。 プロセスみたら割り込み不可やら停止中とかになるんだけど、原因わかるひといます?
・ そもそも外付けは原理的に内蔵よりずっと遅い(我慢) ・ USB1.1に繋いでいる(買い替え) ・ USBコネクタがHDD転送向きでないへぼい安物(別なコネクタに繋ぐと直る) ・ 細かいファイルの読み書きは基本遅いのでスクリプトのライブラリを置くのは自殺行為 好きなの選べ
USB外付けではなくて、内蔵です。 /dev/sda1: Timing cached reads: 13724 MB in 1.99 seconds = 6879.94 MB/sec Timing buffered disk reads: 256 MB in 3.00 seconds = 85.24 MB/sec /dev/sdb1: Timing cached reads: 13840 MB in 1.99 seconds = 6938.85 MB/sec Timing buffered disk reads: 362 MB in 3.01 seconds = 120.08 MB/sec sdaにOS入れているんですが、sdbにデータ保存用としているのですが・・・。
すいません、質問です。 イテレータ(古い呼び方ですが)の中で値の代入はできないのでしょうか。 例えば 配列 t があって for 文を使えば t=["aaa","bbb","b"] len = array.length-1 for i in 0..len array[i]="ok" end で全ての配列の要素にokを代入できますが イテレータでこれをやろうとしてもできませんでした。 array.each{|seg| seg="ok" } array 仕様的にイテレータ内では代入ができないのでしょうか。 それとも何か方法があるのでしょうか。教えてください
array = ["one", "two", "three"] seg = arr[0] seg = "ok" seg = arr[1] seg = "ok" seg = arr[2] seg = "ok" これで array が ["ok", "ok", "ok"] になるかと言えば、やっぱならねーだろ それと同程度の理屈 配列要素を書き換えたいときは map (と map!)を使うことが多い array = ["one", "two", "three"] array.map!{|e| "ok"} p array ["ok", "ok", "ok"] ブロック内部で代入された変数から array を書き換えることはしない 何らかの手段で配列に直接アクセスするのが無難 array = ["one", "two", "three"] [0, 1, 2].each{|n| array[n] == "ok"} p array ["ok", "ok", "ok"]
最後間違ってるな array = ["one", "two", "three"] [0, 1, 2].each{|n| array[n] = "ok"} p array arr.each{|e| e = "ok"} は「ぱっと見は動作しそうなんだけどよく考えたら動作しないもの」のひとつ
map
array の長さが変わったらどうするつもりなんだろうこのひとは
each_index 使えよ
ちょっと違うが、 オレも内蔵のHDDつなげてソフトRAID1を導入してみたらめちゃくちゃ遅かった思い出がある。
もはや呪術レベル
def getstr(s) s end a = "Aaa" b = getstr(a) b.gsub!(/aa/, "bb") p a 上の様なパターンで文字列の参照書き換えちゃってたびたびバグを出すんだけど メソッドの文字列は s.dup して返すみたいなルールを決めるべきなのかな。 def getstr(s) if /A/ =~ s s else 'A' + s end end になるとますます状況が混沌としてくる。 このあたりのRubyのお作法はどうなってるんだろう。
>>843 わるいこといわんから早い方で動かしとき。
でも、データ保存(?)の方が読み書き早いのに実行が遅いのは気持ちが悪いな
Rubyの文字列は原則immutableだと思ってプログラムすればいいと思う。 StringBuilderのように使うときだけは別扱いで。
>>852 def getstr(s)
s
end
a = "Aaa"
b = getstr(a).gsub(/aa/, "bb")
p a
「gsub! ではなく gsub を使う」の一言で用が済むのに
Rubyにおいては a = 超でっかい文字列 a.gsub! としたときの超でっかい文字列がメモリから消えるタイミングと a = 超でっかい文字列 b = a.gsub # 以後のスクリプトに a は出てこない としたときの超でっかい文字列がメモリから消えるタイミングの予測値ってたいして変わらないよな
>>852 標準ライブラリからdupやfreezeしてるのを探したけどあんまり無かった
他の言語だとこの辺り煩いけどRubyだとどうするんだろうね
class Foo
def initialize(s); @s = s; end
attr_accessor :s
end
s = 'hoge'
f = Foo.new(s)
s[1] = 'a'
f.s #=> "hage"
たとえば引数が String の場合、一度でも sub や gsub をすれば引数文字列は結果的に保護される String だって「selfを変更してselfを返す」というメソッドより「新しい文字列を作成して返す」というメソッドのほうが多い
「引数オブジェクトをそのまま使うようにメソッドを作る」ということのほうが稀なんじゃないかな これが意図的に行われるのは引数がデータハッシュとかデータ配列とか そういうのな時だと思う
引数sがそのまま戻り値になりそうなシーケンスでは s.dup するのが無難そうですね。 面倒なら頭で s=s.dup しちゃうとか。 メソッドの仕様だと言い張って呼び出し側でdup的な事をさせるのはさすがに論外な気がしてきた。 参考になる意見ありがとうございました。
863 :
859 :2009/08/04(火) 16:37:17
>>860-861 d
受け取った引数をそのままインスタンス変数にしまうコードを
いままで普通に書いてきたので頭痛がしてきますた
864 :
デフォルトの名無しさん :2009/08/04(火) 16:38:16
rubyスクリプトをcron起動させた場合に、共有ライブラリの環境変数は どうやって設定してますか?
>>864 うむ
「環境変数を設定してrubyスクリプトを起動するというシェルスクリプトをcronで動かす」
「crontab で環境変数が設定できるので RUBYLIB とか適当に設定する」
のどっちかを主に使う
あとあとめんどくさくないので、cron用起動シェルスクリプトを作るのお勧め
866 :
デフォルトの名無しさん :2009/08/04(火) 17:02:09
ありがとうございます。 ということは、ruby起動用のテンプレートを作った方が良いのでしょうか。 コマンドライン引数を渡して、シェルスクリプトのような形でも利用したいので。 例えば以下のようなコードで。 #!/bin/sh RUBYOPT='-Ke -rkconv' export RUBYOPT RUBYLIB=$HOME/ruby/lib:/opt/ruby/lib export RUBYLIB ruby test.rb $*
867 :
デフォルトの名無しさん :2009/08/04(火) 17:08:07
あるいは、 <test> #!/bin/sh rubyset ruby test.rb $* <rubyset> #!/bin/sh RUBYOPT='-Ke -rkconv' export RUBYOPT RUBYLIB=$HOME/ruby/lib:/opt/ruby/lib export RUBYLIB の様な形にした方が良いでしょうか。 野暮ったい感じなので、もっと良い方法があれば教えてください。
>>852 gsub! を使わないようにするのがいいと思う。
Ruby では gsub! は本当に必要なとき以外は使わない方がいい。
自分で好きなようにやったらええがな・・・ crontab にはファイル名しか書かないというのが一応俺ポリシーなので 俺の場合は対象cronごとにシェルスクリプトを作る 複雑な起動オプションとか全部シェルスクリプトに(意図解説つきで)押し込める マシンが変わっても crontab -r してしまってもなんとかなるようにしておく そんだけ
870 :
デフォルトの名無しさん :2009/08/04(火) 17:22:58
ruby 1.8.5 [i386-linux] です。 ============================= $ ruby hoge.rb hoge.rb:3: unknown type of %string s = "これは、テストメールです。\n\n届いているかな?\n" ^ hoge.rb:3: syntax error s = "これは、テストメールです。\n\n届いているかな?\n" ^ $ cat !$ cat hoge.rb #!/usr/bin/ruby -Ke s = "これは、テストメールです。\n\n届いているかな?\n" ============================= "unknown type of %string" で調べてもいい情報が見付かりません。 すみませんが原因をご教授いただけると助かりますm(_ _)m
871 :
デフォルトの名無しさん :2009/08/04(火) 17:27:22
まぁ、そうなんですけどねw 異なるユーザーでスクリプトやライブラリを共有したいので、 なるべく簡単で不具合の少ない方法があれば良いと思ったので。 クラスを共有したり、コマンドラインを共通化したりしたら便利ですから。 この方法だと、ユーザー毎のPATHの違いで止まるのが難点です。 上手く回避できる方法があれば良いなと。
>>870 まず「¥n」をとりのぞいてみる。それでokなら「¥n」があやしい。
そうでなければ日本語関連の問題かな。
>>862 >メソッドの仕様だと言い張って呼び出し側でdup的な事をさせるのはさすがに論外
どっちもどっちな気がするけどね
例えばクラス側でdupするのが当然ならattr_readerが破綻する
class C
attr_reader :name
def initialize(name); @name = name.dup; end
end
obj = C.new("Hoge")
obj.name[1] = "a"
p obj.name #=> "Hage"
引数として渡したことのある値も、余所から得た返値も(Stringのメソッドのように保証されてる場合を除いて)
共有物だと見なして破壊的な操作は避けるのが作法だと思う
はっきりと私物だって分かってるなら破壊的に操作していいんだけどね
874 :
デフォルトの名無しさん :2009/08/04(火) 17:55:12
>>872 s = "、"
で
"Invalid char `\033' in expression"
となりました。
ダブルクォートでなくシングルクォートで囲めばいけるんですが、、、
"ruby -Ke" とやっていても日本語関連の解決にはならないのでしょうか。
そもそも、破壊操作を伴うメソッドを使う理由がさっぱりわからないし、 とりあえずdupする理由もさっぱりわからない
876 :
870 :2009/08/04(火) 18:01:41
nkf で確認するとスクリプトファイルが ISO-2022 でした(´Д`;) LANG=ja_JP.eucJP なので油断してました。 スレ汚し失礼しましたm(_ _)m
gemでkizapiっていうおもしろそうなのを入れたんだけど usr@host:~/$ kizapi-kwic 春 /usr/lib/ruby/1.8/rss/rss.rb:803:in `install_ns': RSS::OverlappedPrefixError (RSS::OverlappedPrefixError) from /usr/lib/ruby/gems/1.8/gems/kizapi-0.3.0/lib/kizapi.rb:9 from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from /usr/lib/ruby/gems/1.8/gems/kizapi-0.3.0/bin/kizapi-kwic:5 from /usr/bin/kizapi-kwic:19:in `load' from /usr/bin/kizapi-kwic:19 となるんだけども誰か使っている人います?wrapperとして古くなったのかね
>>845-849 map のサンプルを調べて無事できるようになりました。
ありがとうございます。
削除系 nilだけを削除する Edit a = [nil, nil, 123].compact p a #=> [123] 破壊的なやつもある a = [nil, nil, 123] a.compact! p a #=> [123] 破壊的って意味がよくわかりません。 mergeしたときは強制的に一緒になるみたいなイメージだったのですが、 ここでの破壊的とは何でしょうか?
レシーバ自体を書き換えてしまうということ 比較してみて a1 = [nil, nil, 123] a1.compact #=> [123] a1 #=> [nil, nil, 123] a2 = [nil, nil, 123] a2.compact! #=> [123] a2 #=> [123]
破壊的っていうことばが良くないよね。わかりにくい。
破壊的動作、とか破壊的代入、とかそういうのの省略なんだよね 破壊的という言葉だけ取り出すと不自然
破壊神メソッドとか
警告: 「破壊神」と聞いて何を出すかで世代がバレておっさん認定されます
破壊神シヴァは何歳?
886 :
デフォルトの名無しさん :2009/08/05(水) 16:01:21
rubyでバイナリを扱う場合、どんな型で扱ったら良いんですか? 数値の配列にした方が良いんでしょうか?
1.9だと"ASCII-8BIT"(="BINARY")エンコーディングのStringかな。
ニンジンクラスをカレーとして使うようなもんだな
Ruby1.8のStringはごく一般的な見地で言うと文字列クラスではなくバイト列クラス 1.9でやっとマトモな文字列クラスになった
891 :
272 :2009/08/05(水) 19:01:30
超初心者です。 クラスのメンバー変数に@をつけるのが気持ち悪いのですが何とかならないでしょうか?
>>891 selfやthisを付けたりm_みたいな接頭辞をつけたりで
あれこれ揉める言語を学んでくると気持ち悪くなくなるぞ
>>891 attr_accessor(:hoge) して
h = self.hoge
self.hoge = h
すれば書かなくて済むけど、こんなマネするならrubyを止めた方がいい
>>892 自分で手突っ込んで吐きまくれば気持ち悪くなくなるのと一緒ですね、わかります
>>893 privateにしてやるならそれもありだと思う
>>891 Rubyスクリプトを着色してくれる適当なエディタ使え
インスタンス変数が見やすいと感じるようになるから
>>893 それは常にアクセサメソッドを経由するようにするという別な意味を持つので濫用禁止
privateだと読み込みはできても代入ができねえや
>>895 は忘れてください
>>891 何十何百といった変数を扱うようになった時に
見た目、形状だけで変数がどこに属しているのかが
すぐに分かる事のありがたさに気付くだろう。
まー初回は「@かよ…」と思ったことが全くないわけでもないような気がしないわけでもない でもまあ慣れるよ、うん @がつかなかったらメソッド返り値かローカル変数で、 @がついたらメソッド間を渡り歩くインスタンス変数で、 大文字(多くの場合、慣習的に全部大文字)だったらなにかの定数 着色のエディタに強く依存するけどな 俺の普段の頭の中では「インスタンス変数はなんか黄色のグローバルな変数」というイメージしかないぞ
@の使用はIDE
まつもとさんの講演を聴いたことがあって@について話してた。 実は本人も記号が好きでないらしい。 不必要にインスタンス変数やクラス変数を使いまくるのは良くないのだが、 そういう良くないプログラムを書くと「@」だらけになってすぐにわかるようにした、 ということだった。本当かどうか知らんがオレは納得して割と基準にしてる。 最初は「@」が嫌いだったが、意味がわかるとこのルールが好きになった。
>>899 の言うように、ちょっとスコープが狭いだけのグローバル変数だからな
>>901 似たような話をどっかで読んだなあ……見つかった。『Beautiful Code』のエッセイ
メリットがある一方で、濫用は戒める効果を狙っているということだろうか
>このような命名法はプログラムが簡潔になるばかりでなく、
ひとめで変数の種別が分かるのでプログラムが読みやすくなる、
グローバル変数を多用するとプログラムで「$」ばかりで醜くなる
(ので、グローバル変数を使いたくなくなる)などの、すぐれた「副作用」もあります
904 :
デフォルトの名無しさん :2009/08/05(水) 23:39:19
さっしてやれ 学生が就職してrubyへの愛情を失ってしまったんだよ
rubyつかってrails使わないのってありだよな。 ruby使ってるって言ったら、あぁ、RubyOnRailsってRailsひとくくりにされてしまう。 rails使わない分野もあるんだよ。
独り言なら星につぶやけよw
そんな寂しいこというなよ
仕事でRails使って趣味でRuby1.9いじってる
910 :
デフォルトの名無しさん :2009/08/06(木) 04:17:05
テスト環境(1.8.6)にてdbmを使うプログラムを書いたのですが、 サーバ(1.8.5が入ったcentos)に持っていくと、 dbmをrequireしようとした行で、dbmがないというエラーが出ます。 どうすれば使えるようになるのでしょうか? rpmには以下が入っています。 ruby-rdoc-1.8.5-5.el5_3.7 ruby-libs-1.8.5-5.el5_3.7 ruby-irb-1.8.5-5.el5_3.7 eruby-libs-1.0.5-6.1 ruby-devel-1.8.5-5.el5_3.7 ruby-1.8.5-5.el5_3.7 eruby-1.0.5-6.1
911 :
デフォルトの名無しさん :2009/08/06(木) 04:30:27
比較したところ、 /usr/lib/ruby/1.8/i386-linux/ 配下に、dbm.soが入っていないようです・・何故?
そりゃもちろん、コンパイル時にdbmが有効になってないんだろ よく知られてるパス以外に置かれてるdbm関連を読まないというバグは1.8.6で直ったような気がする
rpmパッケージをそのようにリビルドして再インストールすれば問題ないな この環境で許可されてるかどうかかなり微妙だけど…
if ARGV[0] == nil end と if ARGV[0] == "" end で挙動が異なる場合があるのですが、nilと""って意味が違うんですか? 上のnilの書き方だと想定通りに動かないことがあります。
普通は nil ARGV に空文字列が入ることは基本的にないはず
とはいえあることも想定して nil と "" をチェックするのであった
前者は引数が渡されなかった 後者は引数が渡されたがその内容が "" だった だから意味的にも違うしそもそも nil != "" でしょ
ありがとうございます。 p ARGV[0] をスクリプトに入れてみたら "" が表示されました。 相手のプログラムが""をARGV[0]に代入しているらしいことがわかりました。 これは特殊なケースだと思います。 自分でスクリプトを引数なしで起動するとnilが表示されるので、 やはり""とnilは違うんですね。
俺ならnilか否かの判定には nil? を使うなあ。 それ以前に、 ARGV[0] をnilかどうかチェックするぐらいなら ARGV.empty? を使うわ
irb で試すとすぐわかることだけど % irb irb(main):001:0> nil == false => false irb(main):002:0> nil == 0 => false irb(main):003:0> nil == "" => false irb(main):004:0> nil == [] => false irb(main):005:0> nil == {} => false
>>917 引数のひと連なりの文字列を空白等で siplit & parse した結果の配列だぞ
空文字列ってなんだよ
「ARGVにおける」という文脈を全く無視したレスがあるな
>>921 myscript.rb aaa bbb ''
この場合 ARGV[2] の中身は何になりますか?
>923 command not found
>>921 の世界にはクォートが存在しないらしいw
ARGVって空文字が入る場合があるのか……ややこしいな
>>914 細かいけど、わざわざ==で比較するよりは
if ARGV[0]
end
と書くのをお勧めする
直感的で美しい言語ですね
なんというか、みんなもうちょっとシェルの勉強しようよ
おっシェル通り。
シェル ウィー ラーニング?
いっシェルけんめい頑張ります
夏の駄シェル大会
なんだもうスレ埋めか
""とnilを同一視したいのなら require "php" をおすすめする。
PHP ユーザは !== と === を知らないのが多いのかな
とにかく数値に変換してから比較するという便利機能の == があって、 それでは用が済まない厳密用途のために「あとから」 === が導入された 最初から == と === が定義されて使い分けられていたわけではない
php の文字列比較は strcmp があるよね 文字列を == や === で比較してるのを見るともやもやする そりゃたまたま動作することのほうが多いけどさあ
┏┳┳┓ ハイ. ┏┳┳┓ ┏┫┃┃┃多言語の話題わ┃┃┃┣┓ ┃┃┃┃┣┓ ここまで ┏┫┃┃┃┃ ┃ ┃┃┏━━━┓┃┃ ┃ ┃多言語 ┣┫ . ・∀・ ┣┫. STOP!┃ ┗━━━━┛┗┳━┳┛┗━━━━┛ ┏┻┓┃ ┏━┛ ┣┻┓ ┗━━━┫ ┗━┓ . ┗━━━┛
他の多言語。
nil.to_sが""を返すのかnilを返すのかで過去に血みどろの壮絶な戦いが繰り広げられたらしいです・・・。
ああいう「どっちもアリっちゃアリ」というのが一番面倒
943 :
941 :2009/08/06(木) 20:12:59
数学好きで最近Rubyに触り始めた私にとっては、nil.to_sやnil.to_iがnil以外の値を返すのはとても不思議に思います。 が、数学が嫌いな大部分の ぷろぐらま にとってはそれなりの値が返ってくるのが自然と感じるのは仕方ないとも思います。
to_sはともかく、to_iが返すのは整数であって欲しい
>>945 to_sが返すものが文字列で無くてもいいのは何故?
>946 ああ、そういう意味に取られたか… to_sが返すものは文字列であるべき。ただ、過去に議論になったのは nil.to_s => "nil" か => "" かって話だろ?だからそのどっちかというのは俺は結論付け難いって言いたかった
948 :
デフォルトの名無しさん :2009/08/06(木) 21:17:40
>>943 数学がそんなにえらいのか!クソ野郎!!
不自然だよなあ C#から来たが挫折しそう
うん、数学は偉い ただ、数学が偉いということとはなんの関係もないが
どの分野でも一番偉いって訳にはいかないからな。 まあ、適当にお茶濁しておいてくれ。
数学より物理学の方が偉いよ。 もっと言うと、押尾学の方が偉いよ。
GMT→日本時間(or NY時間)の計算機を作りたいのですが、どのように作ったものでしょうか? to_jst("2009/08/06 7:33:36") → 日本時間がほしい GMT周りの扱い等何か参考になる、メソッドはないでしょうか?
955 :
954 :2009/08/07(金) 05:05:26
Time.parseと時差?や時間の指定をつけたらほぼ一発でいけました irb(main):016:0> require 'time' => true irb(main):019:0> Time.parse "2009/08/06 7:33:36 +0000" => Thu Aug 06 16:33:36 +0900 2009 irb(main):021:0> Time.parse("2009/08/06 7:33:36 UTC").getlocal => Thu Aug 06 16:33:36 +0900 2009 おさわがせしました。 ありがとうございました。
導入ガイドのページなどを参考にRuby1.9.1を導入しました。 某sixamo.rbを実行すると *****@*****-laptop:~/sixamo$ ruby sixamo.rb -im data_directory 簡易対話モード [exit,quit,空行で終了] > てすてす sixamo.rb:740:in `split_into_terms': undefined method `[]' for nil:NilClass (NoMethodError) from sixamo.rb:522:in `split_into_terms' from sixamo.rb:512:in `split_into_keywords' from sixamo.rb:235:in `talk' from sixamo.rb:233:in `each' from sixamo.rb:233:in `talk' from sixamo.rb:819 とエラーを吐き終了します。 どうしてあげればいいんでしょうか?><
>>956 それがしししゃも?
冗談はさておいて、1.8系にしてからまたおいで
958 :
デフォルトの名無しさん :2009/08/07(金) 15:04:44
def recursive_dir(path) Dir.foreach(path) do |v| next if v == "." or v == ".." if path =~ /\/$/ v = path + v else v = path + "/" + v end p v if FileTest.directory?(v) recursive_dir(v) #再帰呼び出し Recursive Call end end end というメソッドがあり、その出力内容に対して while などで処理を行いたいのですが while file = recursive_dir(dir) などではうまく動きません。 こういう場合はどんな方法が考えられますでしょうか?
検索結果が出るまで「シックス・アモってなんだろう」とか思ってた俺
>>956 1.9には対応してないので諦めるのが一番早い
タブが抜け落ちてしまった。。すみません def recursive_dir(path) Dir.foreach(path) do |v| next if v == "." or v == ".." if path =~ /\/$/ v = path + v else v = path + "/" + v end p v if FileTest.directory?(v) recursive_dir(v) #再帰呼び出し Recursive Call end end end
>>959 やっぱりそこですか。。
ありがとうございました;;
orz def recursive_dir(path) Dir.foreach(path) do |v| next if v == "." or v == ".." if path =~ /\/$/ v = path + v else v = path + "/" + v end p v if FileTest.directory?(v) recursive_dir(v) #再帰呼び出し Recursive Call end end end
>>958 p はデバッグ用の画面表示
メソッド間で値を渡すのに使うことはできない
>>958 Dir.glob(path + '/**/*').each do |v|
whileで実行したい処理
end
再帰を使いたいなら v を配列に保存それをメソッドの返り値にする、
recursive_dir にブロックを渡して yield v する等々
965 :
956 :2009/08/07(金) 15:33:15
Ruby1.8xにしたうえでシシャモさんを実行したところ sixamo.rb:809:in `require': no such file to load -- readline (LoadError) from sixamo.rb:809 とでます。 文字入力も受け付けてくれません。 Rubyインスコに問題ありなんでしょうか・・?
1.9系にして出直してこい
読んでもわからん可能性もゼロではなく…
readline と言われて何が悪かったのかわかるような人はこんなスレにいちいち来ねえよ
>>965 パッケージで 1.8 をインストールしたなら libreadline-ruby1.8 とかなんかそんなような感じの入れろ
自力でコンパイルしたなら libreadline-dev とか libreadline5-dev とか libreadline-devel とかなんかそんなやつ入れてからコンパイルしれ
>>969 ありがとうございます。。
やってみます><
Ruby触ったのは今日が初めてでちんぷんかんぷんなのです。。
>>969 様仰せのとおりパッケージをインスコしましたがエラー内容変わらずです
elsif opt[:i]
require 'readline' ←809行目
sixamo = Sixamo.new(ARGV[0])
puts "簡易対話モード [exit,quit,空行で終了]"
諦めたほうがいいですかね・・?
>>972 お昼前からずっといじってますが、お手上げです。。
こっちがシシャモになりそうです><
知識不足はいいんだけど、まず環境を書こうぜ Linuxなのかmswin32なのか、Linuxにしても自分でコンパイルしたのかAPTで入れたのか その辺が分からないことにはアドバイスする方も困る
>>975 自分でコンパイルした方を削除して、apt-getでインストールした方が良い
readlineの問題だけならたぶんapt側で何とかなる
>>976 氏の方法で進展いたしました
簡易対話モード [exit,quit,空行で終了]
> test
sixamo.rb:112:in `gsub!': premature end of regular expression: /『 \200(RegexpError)
from sixamo.rb:112:in `message_normalize'
from sixamo.rb:301:in `message_markov'
from sixamo.rb:249:in `talk'
from sixamo.rb:819
一応少し動きました・・。
まだエラーでますがグーグル先生に聞いたりして頑張ってみます><
ありがとうございました
978はグーグルのつかいかたをおぼえた。 かしこさが3あがった。
def time_to_sec(time) #time: "hh:mm:ss" @array_time = time.split( ":" ) return @array_time[0].to_i * 24 + @array_time[1].to_i * 60 + @array_time[2].to_i end もっとかっこいいやり方(あるいは既にある関数)があれば教えてくださいm(_ _)m
981 :
デフォルトの名無しさん :2009/08/07(金) 21:38:49
@@@
@ の使い方(てか変数とかスコープとか)勘違いしてました(´・ω・`) 要らないですね。。。 他に直せる場所はありませんか?
def str2sec(str) if /(\d+):(\d+):(\d+)/ =~ str return $1.to_i*3600+$2.to_i*60+$3.to_i else raise "unknown format: #{str.inspect}" end end
日時関係はTimeで何とかするのが一番美しい けど、どうしても"hh:mm:ss"の形式を扱わなければならないなら 俺なら983と同じで、正規表現使うかな def time_to_sec(time) #time: "hh:mm:ss" if time =~ /(\d\d?)\:(\d\d?)\:(\d\d)/ then return $1.to_i * 60 * 60 + $2.to_i * 60 + $3.to_i else (エラー処理) end end
\d\d? これはないだろ{}を使えよ
根本的な算数が間違ってました(´Д`;) ほんとすみません出直してきます
988 :
デフォルトの名無しさん :2009/08/07(金) 22:22:36
989 :
デフォルトの名無しさん :2009/08/07(金) 22:43:31
/([01]?[0-9]|2[0-3])\:([0-5]?[0-9])\:([0-5]?[0-9]|60)/
990 :
デフォルトの名無しさん :2009/08/07(金) 22:53:00
閏秒ミス /([01]?[0-9]|2[0-3])\:([0-5]?[0-9])\:(60|[0-5]?[0-9])/
rubyにはC++で言うところの std に当たる名前空間は無いんですか。
ない。
オープンクラスにそんなもんはない どっかで誰かが読み込んだファイルが組み込みクラスの動作を改変していても気づく方法はないし 標準クラスと同じ名前のクラスを作っても下手したら永遠に気づかない可能性もある
なるほど。まさに標準クラスと同じ名前のクラス作って5分ぐらい悩んだもん で。 ありがとうございました。
>980 def time_to_sec(time) time.split(":").inject(0){|r,e| r=r*60+e.to_i} end
>>995 injectを使うのか。面白いな。
こんなのはどうか。入力のチェックは省略。
def time_to_sec(time_str) #time: "hh:mm:ss"
hh, mm, ss = time_str.split(/:/)
return hh.to_i*60*60 + mm.to_i*60 + ss.to_i
end
>>996 なんだかお手本的だw
せっかくだからライブラリに頼ってみる
Time.parseが使えそうだったけど厳密すぎた
require 'parsedate'
def time_to_sec(time_str) #time: "hh:mm:ss"
ary = ParseDate.parsedate time_str
return ary[3] * 60 * 60 + ary[4] * 60 + ary[5]
end
しまったこうする流れだった hh, mm, ss = ParseDate.parsedate(time_str)[3..5]
>>991 あっても便利かな、と思うことは時々ある
軽傷治癒の杖とか拾った杖を後生大事に倉庫に貯めてたら、 なんでも屋に安価に売ってることに気づきました ・ 投資を続ければ安い杖から高い杖までずらっと並ぶ ・ 投資を続けるとミドルクラスから高価な杖がメインに並ぶ どっちになるんでしょう 後者の場合は、安い杖が欲しい場合は「あえて投資しない店」を作る必要がありますよね
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。