1 :
デフォルトの名無しさん :
2009/02/27(金) 18:38:24 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
【Ruby1.9.1 は従来版とは別物であり、書籍や解説やライブラリのサポートがまだありません】
【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です
※ただし 1.8.6 より安定しているとはまだ言えないので、安定性を第一とする用途には 1.8.6 をどうぞ
関連スレやURLは
>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
6 :
デフォルトの名無しさん :2009/02/27(金) 18:57:27
厂刀、 , ヘ _
_, -‐…‐- 、___//: : : \____/: : : : >r
_>'´: : : :_,.- " : :/弌》__: : : : : : : : : : : : : : : : : : , : : }
, イ ̄`: : : : : : : : : :¨ ‐-、 : :\⌒>、: : : : : : : _: :-: :¨: : /
. /: : : : : : : : /: :.,': : : : :: : : : : \ ∧  ̄ ̄フ : : : : : :/
/:/: : : /: : :.ハ : :ト、 \: : : : \ : :Y i| / : : : : : /
| l: : :./: : :./ハ: :{ \j\j : : ∧, j: :|. /: : : : :/ 、
| |: : :| : : ,`匕 `‐z匕 \ : : }K: j. /: : : : :/ }\
j,ハ: : |: :∧fて! イfて)'y Y: :jF'},ノ ,': : : : :/ |.: :.\
\ト、{ ハ ヒリ ヒ::リ ' j /rソ イ: : : : :.{ ト、: : ハ
. j,从 " 、 "" ム/ ,{|: : : : : ト、_______ イ: :): : :.}
ゝ、 rっ , イ,|_⌒ ハ: : : : : : : : : : : : : : : : : : : : : : : : /
>-r<_/ iト、 \ \、: : : : : : : : : : : : : : : : : : 彡イ
x<7イx公、 // \ _〉\_  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
rく // 〉::::fゝ_イ / |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ .!
∧, // /⌒i| / / i| こ、これは
>>1 乙じゃなくて |
{ j { { /:::::::::| ,/ / | ポニーテールなんだから. j
| | ∧∨:::::::::::レ' / ヘ, | 変な勘違いしないでよね! |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
スレ立て乙
ループ内でredoをするともう一度処理を行うと思います。 begin〜endで例外が発生したら同じ処理を行いたいのでredoを入れてみたらダメでした。 この場合はcatchを使うほかないのでしょうか。 具体的にはnet/httpを使ってるのですが、たまにタイムアウトします。 タイムアウトしたとき、例えば「3回はリトライ」するみたいにしたいです。
そういう時は retry を使う... と思ったけど、 1.9 ではなくなったんだっけ?
>>10 ちょー感謝です!
オライリーのプログラミング言語Ruby(出たばっかのやつ)によると、
1.8まではretryで「繰り返しを最初から行う」ことが認められていたがダメになったということです。
例外の処理に使うぶんには1.9でもいいみたいです。
この本、まだ30ページしか読んでないのでちゃんと読まなきゃですね。
ありがとうございました!
attr_accessorって何て発音するんだい? アターアクセサー? そもそもattrって何の略だろう
あとりびゅーとじゃないか?
matz日記なんで更新されないの?
アトリビュートアクセッサーだな
propertyにしとけばよかったのにMatzもひねくれだなア
概念上、プロパティでは絶対にないな attr_accessor は冗長で書きにくいが齟齬の少ない表現だと思う
> attr_accessor この辺はCommon LispのCLOSが元ネタって解釈でいいのかな。
ある程度はびっくりでがっかりだが、プロパティだと思われるよりはマシ プロパティのように使うこともできるだけでプロパティと呼ばれたのではたまらん
attributeって一般的にもコンピュータ用語的にもかなりメジャーだと思うが
propertyは広く汎用的に、要素って意味で使うけど、attributeは属性という意味だからオブジェクトなどの閉じた範囲の中のpropertyってイメージを持ってるんだが。 この解釈は間違ってるの?
要素はelementだろ
>>16 の頭の中ではattributeというのは相当にマイナーな選択である、
ということか。
使ってきた言語によっては全く触れた機会がない可能性のある言葉ではある
日本人は用語を曖昧に使いすぎなんだよ attributeだって本来はちゃんとした定義がある オブジェクト指向言語以外では使われない言葉
XMLは?
DOSのファイルのリードオンリーとかの属性がアトリビュートだったなそういえば
普通に使われる単語だし当たり前だけどな 高校生向けの単語集には大抵載ってるように思うが
29 :
デフォルトの名無しさん :2009/03/01(日) 22:43:21
tar + gzip を使いたいのですが、外部コマンドに丸投げするしか 方法がないのでしょうか?
zlibという標準添付ライブラリがあってだな tarに関してもRubyで圧縮できるライブラリがある。ググれ
31 :
デフォルトの名無しさん :2009/03/01(日) 23:17:24
>>28 むしろPCやってるから時々単語が分かって助かるリア高の俺
attributeも単語テストに出たかもしれない
誰も聞いてねーよ
andと&&の使い分けってちゃんとしてますか? 他言語の癖で&&ばかり使ってるけど特に問題にならないんだよね。
>>34 結合度の違いを考えなければならないコードはだめなコード
『プログラミング言語Ruby』、今まで買うつもりなかったんだけど、トークイベントの 動画見たら、買いたくなってきちゃったよ。 でもMatzはまったくといっていいほどタッチしてないんだなw
>>34 俺の場合、&&とandは使い分けないな。常にand
でも||とorは使い分ける
なぜなら||は以下の書き方でよく使うから
var ||= 10
タイミング的には初めてのPython第3版を買いたい気分なんだが ああいう厚い本は好きだ
>>36 >でもMatzはまったくといっていいほどタッチしてないんだなw
いや、だから買いなんだw
その本どうして評価高いのか分からん 言語編だけ読んだが構成が滅茶苦茶で読みづらかった 相変わらずのつまらないアメリカンジョーク連発はまだ許せるにしても 所々で出る参照ページとやらの参照先が別本のライブラリ偏だったりするのでもう1冊買わないと参照できない。
プログラミング言語Rubyが出そうなときは話題になったが、出たらほとんど話題にならん。 感想の一つでもあってよさそうなもんだが、結局おまえら読んでないだろ。
アスキーから出てる「Ruby本」は 『オブジェクト指向スクリプト言語 Ruby』
Ruby自体がもう下火になりつつあるしな・・
みんな王道になりたいからありきたりの名前付けるのかねw
魔道編とかよりははるかにまし
>>47-48 謝れ!「オウドウとも読めるよね」とかちょっと邪なこと考えたっぽい黄道編にあやm
・プログラミング言語Ruby ・プログラミングRuby ・オブジェクト指向スクリプト言語Ruby 似たような名前の本が多すぎるのを何とかしてください 洋書と和書で別々に出てるというのは分かるけど、それにしてもややこしすぎる Ruby WayとかたのしいRubyとか、もっとひねった名前を付けて欲しい
オライリーのやつはハチドリが表紙だから「ハチドリ本」と名付ければわかりやすいんじゃ 「オブジェクト指向スクリプト言語Ruby」は似てないだろ
rubyの特殊な文法でメソッドの中にメソッドを定義できるってのがありますよね。 これ実際に使う機会ってあるんですか?
>>52 普通はない
現象上はオブジェクトの着火メソッドを実行すると使用可能メソッドがぐーんと増えるというものだが、
そんなロボットアニメみたいなことをするくらいなら他の手段を使うことを考えるべき
>>53 進化コマンドかw
でもオブジェクトが拡張されるならまだしも、クラスが拡張されるのはキモイな。
>>53 ありがとうございます。やっぱり無いですか。
Rubyはやたら細かい機能が多いんだけどやりすぎな感のあるメソッドなんかも多いですよね。
情報過多は逆に利用者を混乱させるという
誰か1人が秘密のコマンドを使うと、それと同種の機体とそれの改造型全員が一気にパワーアップ …物語的には面白いが、おおむねキモいな シングルトンなクラスでinitializeで条件分岐するならあるいは
>>55 多くの人は半分くらいの機能を全く使ってない
安心しろ
>>55 一見無意味だと思われていたメソッドがとんでもない利便を生み出すこともある。
ごちゃごちゃと細かい道具がたくさんある言語はハカーにとっては発想が膨らんで楽しいのだよ。
>>55 慣れると逆にJavaScriptとかの比較的シンプルな言語でやってるときに
「なんでこんな配列・文字列操作も一発でできないんだよ」
と憤慨するようになる。
初心者にやさしいかどうかは目標にしてないようなことをMatzは公言してたはず。
つーか利用者って言ってもアプリなんかと違って仮にも情報技術を扱う人間なんだから
多少の過多ぐらいで混乱すんなw
まさに楽しさを追求する言語だね!
うぜえ
自分が使わない機能が存在することに文句を言っても仕方ない だまって使わなければいいだけ
if ってスコープ作らないんだっけ? 作らないとしたら、それはなんで?
難しい問題だな たまたま制御構造として定義することに決めたからスコープを作らない、という以上の回答はないんじゃないか ○○で××だから if はスコープを作らないように決めたのです、という説明はできなさそうだ
説明できるだろ if true x = 10 else x = 20 end のとき困るから。
ブロックが標準でローカルスコープを作ることと同じくらいに困るから
まぁ、
>>66 程度なら
x =
if true
10
else
20
end
だからな。例が微妙。
メソッドの再定義ってなにかコツとかあるんですか? requre したライブラリのメソッドの上書きが動作しません(追加は動きます)
定義してるモジュールが違うとか、 実は自分の定義よりあとで動的に再定義されてるとか、 単なるtypoとか。 もちっと具体的に。
> 定義してるモジュールが違うとか え〜、と思ったけど心当たりがあります # require するファイル class B def hoge; end end class C <B end # --------- # 自作 class C def mage; end # 動く def hage; end # 動いてない end こんな構造になって、C.new.mage は動くんですが、C.new.hage は 元の hoge が動いてるように見えます C クラスで使う hoge の動作を書き換えたい場合は B クラスに追加しないと駄目ですか?
# require するファイル class B def hoge; end end class C <B end # --------- # 自作 class C def mage; end # 動く def hoge; end # 動いてない end こんな構造になって、C.new.mage は動くんですが、C.new.hoge は 元の hoge が動いてるように見えます …が意図したい書き込みです、すいません
それだけ見ると問題なさそうだねー。
>>73 直接hoge呼んでそうなる?
class Bのメソッドから間接的に呼んでるとダメだった気はするけど。
> 元の hoge が動いてるように見えます そう判断した時の実行結果を貼って見れば何か判るかも。 ↓の様になると思うが。 class B def hoge;p 1; end end class C <B end class C def mage; p 2;end def hoge; p 3;end end C.new.mage # => 2 C.new.hoge # => 3
requireしてるのが公開されてるブツなら名前だしたほうが早いかもね。
>>46 > Ruby自体がもう下火になりつつあるしな・・
下火になってるって
他の言語が盛り上がってるのですかね。。
>>46 は、CやJavaが話題にならない程度にRubyも話題にならなくなった
というのが理解できていないのさ。
ホっ。勉強中なもので、僕の中では熱い言語です。
>>73 ># 自作
>class C
「class C」を「class ::C」にしてみたらどうだろう。
つまり「class C」しているつもりが知らないうちに「class Foo::C」になっている可能性があるんじゃないか。
>>46 >>78 Rubyやってる前からRubyやってると、今は下火には見えんなw
このスレの賑わいもあるしな。
1.4とかもう死にそうだった覚えがある
ruby -Ke の e の部分を取得することはできる? -K オプションが(N 以外で)指定されてることを検出したいんだけども
>>84 $ cat test.rb
p $-K
$ ruby test.rb
"NONE"
$ ruby -Ke test.rb
"EUC"
>>85 > Ruby インタプリタのコマンドライン情報を示す一連の変数があります。
> 形式は $-? で ? の部分にオプションの一文字が入ります。
うおー変態変数
せんきゅー
> Ruby インタプリタのコマンドライン情報を示す一連の変数があります。 > 形式は $-? で ? の部分にオプションの一文字が入ります。 5年Ruby触ってたのに知らなかった・・・
>>82 「Rubyやってる前からRubyやってる」って禅問答か?
89 :
デフォルトの名無しさん :2009/03/03(火) 23:25:12
sudoコマンドのように、指定されたユーザで操作できるライブラリが あったらいいのにと思ったことがあるのですが、この方法は邪道ですか? # このプログラムはroot権限で実行されます。 # 当然この操作もroot権限で実行されます。 FileUtils.mkdir("/home/foobar") # しかし、一部の操作はある特定のユーザで実行させたい場合があります。 # 例えば: OS.sudo("hogehoge") do # このブロックは一般ユーザ「hogehoge」で実行されます。 FileUtils.mkdir_p("/home/hogehoge/something") #=> '/home/hogehoge' does not exist, so that this operation may be denied. end
>>89 スクリプトの中で個別に操作できるべきではありません
該当ユーザーの権限でスクリプトを起動するか、または、せめて、setuid するべきです
少しお聞きしたいのですが、最近このスレか前スレかどこかで 初心者がリファレンスマニュアルの読む際に気をつけることに関するレスがあったと思うのですが 覚えていらっしゃる方はいらっしゃいませんでしょうか? 確か、:: とか # についての説明があったと思います。
>>91 マニュアルで # がついてればインスタンスメソッド
Array#map は Array クラスのインスタンスメソッド map
Array のインスタンスに対して . でアクセスできるっていうかぶっちゃけ arr = [1,2,3] に対して arr.map の形式で書ける
マニュアルで :: で区切るのはクラス名と定数
Ruby ではクラスも定数なので原理的に クラス::クラス::定数 と クラス::クラス::クラス を区別できないが、
慣れればどうということはない
実際のスクリプトでも :: で区切って書く
マニュアルで . で区切るのはクラスメソッド
URI.parse は URI クラスのクラスメソッド parse
Emacs で、カーソル位置のメソッド名と適当なクラス名を自動で ChangeLog に挿入してくれる elisp があったんですが、 誰か知りませんか? vc の ChangeLog を書くときに挿入してもらいたいなーと思うんですが
いちおうできたけどこれは酷いw backtrace = begin; raise; rescue; $@; end
97 :
94 :2009/03/05(木) 21:31:01
>>95-96 phper なのでいじめられると思ったけど
親切にあざーす><
98 :
デフォルトの名無しさん :2009/03/05(木) 23:45:52
MacOSX 10.5.6でMacPortsからruby 1.8.7をインストールして使っています。 ruby 1.8.5と1.8.7の間での変更点についての情報は何処で確認できるでしょうか? 1.8.5で動作確認しているプログラムが1.8.7になってから動かなくなったので おそらく何か変更がありそこがネックになっていると思うのでそこを修正したく思うので よろしくおねがいします。 エラーメッセージは特になく一見動作しているように見えて不意に突然フリーズしてしまい やむなくCtrl-Cで終了しています。再現性も特にないバグなので言語仕様の変化だと思います。
>>98 -W オプションつけて実行したらどうなるよ?
100 :
98 :2009/03/06(金) 09:01:30
ありがとうございます、そんなオプションが有ったんですね!! いくつかインスタンスされていない変数が見つかりました。これが原因かもしれません。 チェックしてみたいと思います
101 :
98 :2009/03/06(金) 09:04:11
s/インスタンスされていない/イニシャライズされていない/ すいません寝起きだったので用語を間違えてしまいました....orz
103 :
デフォルトの名無しさん :2009/03/06(金) 12:08:50
すいません、gemの1.3.1をruby setup.rb でソースからインストールしたんですが、gem自体をアンインストールするにはどうすればよいでしょうか??
てさぎょう
てか自動でアンインストールして欲しいならシステム標準のパッケージの使え
106 :
103 :2009/03/06(金) 12:25:05
どもです。 インストールしたディレクトリと/usr/bin/gem1.8 を消しましたけど、これで大丈夫でしょうか?
107 :
103 :2009/03/06(金) 12:25:44
>>105 そうですよね。apt-get install 使うべきでした。
gems のディレクトリ削除して bin/gem 消せば誤作動はしないと思う
109 :
109 :2009/03/06(金) 12:35:47
どもです!
すいません、昔rubyを使った事があって久しぶりに使ってみた所 いくつか忘れてしまっている所が有るのでよろしくおねがいします。 もともと引数の無いメソッド(ここではuniq)を使うとき()っているんでしたっけ? いま、Rubyのチュートリアルを読み返して見ているのですが uniq.mapと()はついていません、しかし検索してみるとときどきuniq().map(){hoge}という書き方を 見かけます、どちらが推奨されているのでしょうか? よろしくおねがいします。
>>110 推奨かどうかは知らないけど大抵、引数ないならつけない
ありがとうございます。とくに動作に影響は及ぼさないのは明らかだと思うので つけないほうこうで行きたいと思います、ところで皆さんはrubyのバージョンがあがって 動作しないコードが出てきたときはどのように調査していますか? 以前1.8.5で作っていたコードが1.8.7で動かなくなっていて少し困っています うえの方でも -w オプションをつけることで糸口をつかんだ方がいらっしゃるようですが どのような方法が一般的なのかとおもいまいして参考のためによろしくおねがいします。
同名の変数やアクセサがあったりすると動作に影響を及ぼすこともあるかもよ。
最初に言うと自動検知は無理 一般的には、1.8.5 から 1.8.7 にしただけで動作しなくなるスクリプトというのはそう多くない 1.8.6 feature と 1.8.7 feature を目で見てスクリプトで使われてるのをチェックするしかないな
わかりました。 非常に参考になりました、ありがとう御座います。
>同名の変数やアクセサ アクセサとの重複はあり得ないんじゃ? 変数とかぶるケースも変数名をselfのメソッドと同名にしたのが悪い。 これたしかwarning出るよね。
>>116 アクセサとの重複はありないよな。
変数とかぶるケースは、同名にするのが悪いに決まってるが、
「とくに動作に影響は及ぼさないのは明らか」という部分に対して
注意喚起してるんじゃないかね。
Ruby 2.0 はいつ頃でますか? 1.9.1 が出たし、1, 2 年は出ない感じ? それとも 3 年以上?
>>118 Ruby2.0は基本的に出ない
稀に2.0が出るのを待ってRubyを始めようという人がいるけど、あれ間違いだから
>>119 > Ruby2.0は基本的に出ない
どっかで表明していたっけ?
そもそもRuby 1.9.5あたりでまた開発版になりそうな勢いだしなぁ 本当にこの先10年くらい2.0は出ないかもしれない
Rubyでメソッドの引数にメソッドポインタを渡して、それを呼び出す的なことをやりたいのですが、 どのように記述したものでしょうか? 実現したい仮想的なコード: def hoge(method) method.call # methodを呼び出したいつもり end hoge(@mage.moge) evalで書くのもダサイし、遅い気がします・・・。 def hoge(method) eval(method) end hoge("@mage.moge")
Ruby2.0はいつかは出るのだろうけど まだまだ作り始めてもいないので いったいいつごろになるのやら さっぱりわからん 10年後くらい?
>>122 def hoge(method)
method.call
end
hoge(@mage.method(:moge))
>>124 サンクス!いけました。Methodオブジェクトがポインタ的に使えますね。
ありがとうございました。
2.0は開発者の前に吊されたニンジンということになっている。
ニンジンいらないよ
そんなこと言わずにどうぞ www.rubyist.net/~matz/slides/kobe07/mgp00007.html
129 :
118 :2009/03/06(金) 23:01:44
Ruby 2.0 の件、いろいろとありがとうございます。 人参、面白かったです。 これから Ruby をはじめようかなーと漠然と思っていたので、 互換性のない 2.0 を出るのを待とうかとも思っていましたが、 まだまだ先みたいなので 1.9 を試してみます。
1.9の時点で1.8とは互換性がないよ。
131 :
デフォルトの名無しさん :2009/03/07(土) 00:07:30
言語仕様ってもうちょっと安定しないの?
安定しているのが売りの言語を使ったら。
文句言うほど不安定だとは思わんがね
134 :
デフォルトの名無しさん :2009/03/07(土) 00:13:24
しかし最近のLinuxディストリを見ても、RubyではなくてPythonが 標準で入っているくらいだからな。
135 :
デフォルトの名無しさん :2009/03/07(土) 00:13:38
Cだったら安定してるんじゃない?
136 :
131 :2009/03/07(土) 00:15:20
すまん、昔書いたRubyスクリプトをいま実行してみたら たくさん文句言われてうんざりした。それだけ。
>>134 何勘違いしてるのか知らんけど、プログラミング言語は人気だからとか言う理由で採用したりしないから
その言語で作られたアプリケーションを動作させるためにインストールされるものばかりだから
1.9になると警告だけじゃなくて実際に動作しなくなるものも少なくないので 今から手直しするなら1.9での動作もついでに確認しておいた方が良い
139 :
デフォルトの名無しさん :2009/03/07(土) 00:20:10
>>137 知ってる。
だが実際にはほとんどがPythonで書かれていて、結果としてRubyに依存関係を
もっているパッケージがほとんどない、ってこと。
>>139 何勘違いしてるのか知らんけど、プログラミング言語は人気だからとか言う理由で採用したりしないから
その言語で作られたアプリケーションを動作させるためにインストールされるものばかりだから
>>119 それってTeXのバージョンπみたいなものか
まともな仕様もないものは使われません
>>142 何勘違いしてるのか知らんけど、プログラミング言語はまともな仕様があるからとか言う理由で採用したりしないから
perlの仕様ってどこかにある? pythonはあったような気がするんだが……
pyは人気が高い云々というか割と最近にPOSIX標準になったと思ったが つまりなくてはならないもの
ググってみたがそれっぽいのがでない 思い違いのようだ 正直すまない
>>89 亀レスだけど、Process::Sysで出来そう
WEBrick::Utils::su 参照 # webrick/utils.rb
あとスクリプトにsetuidしても所有者権限で実行してはくれないよ、アシカラズ
>>127 コウウラキ 乙
>>145 Pythonって最近のディストロのインストーラーの一部とかに使われている敬意があるんじゃなかったけ?
ではなぜRubyが採用されない・・・
単にRubyが日本発だからでわないかと。日本語って外人から見たら全然意味わからんし。 Pythonは外人発のOOp言語だから英語でのノウハウがたまりやすかったってだけだと思う。
>>149 FreeBSDだと、Pythonだからインストーラーに採用できないとかもあったりするねw
まあRubyよりライセンスが緩いから、だいぶいいんだけど・・・
そう言えば、Ruby on HSPはマダなの?
早くしないと日本でもPythonに負けそうな勢いだ
ライブラリとドキュメント早くなんとかしないとね
>>152 Pythonの方がコミュニティが優秀って事だろう
>>153 RubyとしてはHSPに乗っかる理由がない
Tk並にGUIが分離してるなら良かったんだが
>>153 >Ruby on HSP
HSPでRuby実装・・・?
>>155 HSPをGUIフロントエンドとして使うという意味だろう
そんなことやってる人いないけど…
RubyとHSP間のトランスレータなら、そんなん無駄だから他のことやったほうが有意義
>>155 >Ruby on HSP
HSP様の人気にのっかると言う意味です。
最低でも、あのくらいは頑張ってくれないと・・・
コアとしてるユーザが違う物を比べるのか Ruby十分人気だろ
うん、普通に人気だと思う 業務に使われる割合が PHP よりも Perl よりも少ないというだけで、人気は普通にある
File.mtime が Timeオブジェクトを返すのですが、これをDateオブジェクトに 変換する方法ってありますか?
使われる分野が違うだけで、HSPより人気だと思うがw 書籍発行数だけでも、さすがにHSPより上じゃないの?
HSPとかと比べても何の危機感ももたない。 もっと危機感煽るなら、AIRくらいにしとかないとw
>>160 Time#yearとTime#monthとTime#dayで年月日が得られるからそれをDate.newあたりに指定するのが先決
Time#strftimeの使い方を覚えるのでもいい
>>163 わかりました、やってみます。
さいしょ、Time#strftimeで文字列比較しようとしたのですが
ゲボゲボなのでやめました。
ありがとうございました。
そだな mtime = File.mtime('readme.txt') mdate = Date.new(mtime.year, mtime.month, mtime.mday) とするのがとりあえず初心者スレだと思う
>>165 何度もすみません、
p Date.new === Date.new(2009, 3, 8) #=> false
となってしまうのですが、これはなぜでしょうか?
ちなみに
t0 = Date.new
sleep 10
t1 = Date.new
p t0 === t1 #=> true
これは期待通りです(;_;)
>>166 マニュアルくらい読めよ
> Date
> 日付を扱うクラスです。
> クラスメソッド
> civil([year[, mon[, mday[, start]]]])
> new([year[, mon[, mday[, start]]]])
> 暦日付に相当する日付オブジェクトを生成します。
って引数省略時の動作書いてねええええ
Date.new とだけしたときは、Time.new が現在時刻を返すのと同様、現在の年月日の Date オブジェクトを返す
>>167 間違ってるぞ
Date.new は Date.new(0, 0, 0) だ
今日の日付が欲しいときは Date.today を使う
なんで Time.new と同じ動作にしなかったのかは若干謎
ありがとうございます。 納得しました。
質問です。 Rubyは標準でデータベースを持っていたり、推奨DBがあったりしますか?
松本教祖様がGUI否定だしなあ。インストーラ採用は絶望的でしょ。
>>171 別にGUIを否定はしてないでしょ。興味ないだけで。
同じだろ。
>>170 標準では付いてない。PHPやPythonとは違ってなんでも詰め込んだりしない。
本格指向ならMySQL、普通の人は軽めのSQLiteにしておけばいいと思う。
松本教祖達が興味ない分野が死んでしまうのは痛いな
広めようという気がないのだから
>>174 無関心は、否定よりも困る。
議論の対象にもならないのだから。
sqliteを添付しようという話は何度かあった気がするんだがね。
>>171 標準添付の Ruby/Tk のことも思い出してあげて下さい
require 'tk'
Tk.mainloop
で窓ができるんだぞ
179 :
デフォルトの名無しさん :2009/03/09(月) 16:40:30
>>179 HTTPとHTMLの勉強をしてください
Rubyはそれらをほとんど抽象化しません
>>180 ありがとうございます。
その辺勉強してきます。
attr_accessor で定義した属性にメタ的?にアクセスするには何が早いでしょうか? 文字列とかシンボルから属性をとりだしたいってことなんですけども。 method("属性名").callでよいのかな? ↓みたいなことをやりたいのだけど。 %w(hage, mage, moge).each do|x| iroiroyaru(method(x + "_items").call) end
まあ、見たまま素直だと思う
>>182 やろうとしてることがいまいちピンとこなくて何だけど、とりあえず
attr_accessor :foo
と
def foo
@foo
end
def foo=(x)
@foo = x
end
が等価。
だからObject#methodでもいいし、Object#sendでもいいし。
>>182 ちょっと的外れだけど instance_variable_get
%w{ foo bar baz }.each do |x| puts obj.send(x) end とか
ありがとうございます。
>>185 属性=変数の場合はそれでも十分いけますね。
>>186 >>184 実質的に、メソッドなんですね。
おお、sendで一発でいけるのか。
実質的にも何も、属性というものはRubyにはない def hoge; @hoge; end def hoge=(v); @hoge=v; end と書く代わりに attr_accessor :hoge と略記することができる、というだけに過ぎない hoge はただのインスタンスメソッドで、スクリプト上全く特別扱いされない これを特別扱いするのはマニュアルシステムのRDocくらいだ
あれよくないよね
>>187 attr_accessor の仕組みを知って、類似のメソッドを自分でも書くようになると
確実にスクリプトの変態度が増すぞw
面白いから module_eval とか調べてみれ
クラスからオブジェクトを生成する時のオブジェクトを配列にしたいです。 Array等の方法で先に配列を作り、必要となる都度そこに代入するしか方法は無いのでしょうか? 普通の配列を @a = [] の様な方法で要素数を気にせず宣言するような事をしたいです。
class MyData < Array def <<(e) self.push(e.to_s.downcase) end end data = MyData.new data << "ONE" data << "TWO" p data #=> ["one", "two"] こんなん? 委譲するべきだけど、最初は小難しいだけだから配列を継承するのが簡単
>>191 継承してselfに対して操作してもいいし
class Foo < Array
def puts
puts self
end
end
委譲してもいい。
class Foo
def initialize
@data = []
end
def <<(x)
@data << x
end
end
実装がArrayそのままなら要素数の宣言はいらない。
>>192 は配列を継承したクラスだけど、
>>191 が欲しいのは、自分の作ったクラスインスタンスの配列なのではなかろうか。
説明下手ですみません。例えば、 student[0]〜student[100] があってそれぞれに student[0].math student[0].english student[0].japanese という感じの事です。 Studentsクラスだったとすると student = [] student[0] = Students.new student[1] = Students.new ・ ・ ・ をfor文なりでやるしかないのでしょうか?
あーやっぱそっちか。 class Foo def initialize @@member ||= [] @@member << self end end
for 文でも別に構わないが、 for 文は普通は使わない students = [] 100.times.do students << Student.new end
・・・ごめんこっちかな? class Foo def Foo.create(num) ary = [] (0..num).each { ary << Foo.new } ary end end
>>195 作るのは
>>197 配列要素各々のオブジェクトにメソッドを実行してほしい場合は単にそのように書く
students.each do |student|
puts "数学の成績は #{student.math} です"
puts "英語の成績は #{student.english} です"
puts "国語の成績は #{student.japanese} です"
end
というか、Rubyについての基礎知識が全く無いように見受けられる
本か何かで体系的な学習をしてから動くことをお勧め
ありがとうございます。 まだわからない部分があってなるほど!とは思えませんが、自分で調べてみます。 最初に上手く説明できずすみませんでした。 ありがとうございました。
100のStudentインスタンスを作るだけなら students = Array.new(100) { Student.new }
あるディレクトリ以下を全部消そうとして FileUtils.rm("dist/*") としたら usr/lib/ruby/1.8/fileutils.rb:1297:in `unlink': No such file or directory - dist/*.png (Errno::ENOENT) と言われます。 本当はどうすればいいのでしょうか?
>>203 system("rm -R dist/*")
>>203 適当に Dir.chdir しろ
Dir.pwd の結果がたぶん意図しないディレクトリになってる
ありがとうございます。 そうじゃなくて FileUtils.rm("dist/*") で全部消せないでしょうか(distは消さない)? カレントディレクトリには間違えなくdistがあります。
じゃあ dist の中に * というファイルが無いんだろう
>>206 FileUtils.rm とかって単独でグロブを展開できないんじゃないの?
現にエラー見る限り * が展開されてないじゃん
Dir.glob("dist/*").each do |f|
FileUtils.rm(f)
end
とかでいけるんじゃないか。
>>207 は刺激的で意地悪な回答だと思う
マニュアル眺めれば見当つくが、引数は配列だ
>>208 ではなく、Dir.glob の結果をそのまま渡せばいい
calc_a、calc_bという二つのメソッドがありどちらも return Integer(n) で戻り値を整数にして返します。 n = (中略) * (calc_a / calc_b) という処理をした時に (calc_a / calc_b) の時点で小数点以下が切り捨てられてしまいます。 (calc_a / calc_b) は本来 1 より大きく 2 より小さい値にしようと思っていたのですが、どうすればよいでしょうか?
Integer(n) という時点で、何かがまずそうだと思うんだが、それはさておき。 n = (中略) * (calc_a.to_f / calc_b) でいいんじゃね。
少しはマニュアル読めよ …特に書いてねえええ 整数のメソッドの返り値は整数になってる 小数つきの値を返して欲しいなら小数つき数字のクラスの割り算メソッド使え irb> 10 / 3 3 irb> Float(10) / 3 3.33333333333333
Float(10) Integer(1.1) これって何?キャスト???Ruby使ってて始めてみたw to_fとかto_i使うもんだと思ってた
ごめん、壮絶にマニュアルに載ってた。組み込み関数なのね。 to_f, to_iとの違いはなんだろ。 レシーバーをもつメソッドの違いとかなし
>>216 ただの関数的メソッド
URI('
http://www.example.com '') なんかも有名だが、こんなふうに作る
module Kernel
def URI(uri_str)
URI.parse(uri_str)
end
module_function :URI
end
たいていは特定のクラスメソッドや new つきインスタンスメソッドの別記だけど、
Integer() や Float() のように、特定言語のアレっぽい便利な「ちょっと違う処理」を噛ませてある場合も多い
irb> "10".to_f
10.0
irb> "a".to_f
0.0
irb> Float("10")
10.0
irb> Float("a")
ArgumentError: invalid value for Float(): "a"
個人的には Integer() なんかの特殊処理は好きではない 素直に「そのクラスのオブジェクトへの変換メソッドのエイリアス」とだけ設定してほしかった
表記が違えば挙動が変わるのはおかしいことじゃない。 関数側で未定義なクラスならto_i等を呼ぶから結果的にエイリアスとしても 振る舞うだけで、関数自体はエイリアスという位置づけでもないし。
表記が違うなら振る舞いも変えておけば使い分けできて (゚д゚)ウマー ってことじゃないの
Integer が整ってなかったり Float が浮いてたりするように感じるのは、変換のクラスメソッドがないから Integer.convert があってそれを Integer() 内で呼んでる、とかそういうめんどっちい構造にすべきだった いきなり関数形式のメソッドだけ提供されても正直困る
関数的メソッド Integer は Integer クラスとは何の関係もないんだよね 名前がたまたま同じだけの、ただの Kernel クラスのメソッド URI() の定義を初めて見たときは激しくがっかりしたことを覚えている クラスそのもののオブジェクトに引数を渡す方法があるのかとかちょっと期待してた俺
割とがっかりする仕様をそのままにしとくのもなんだかなあ感はあるね。 まあ教祖が放置してるぐらいだから、信者の皆さんに不満は無いのだろうけど。
個人的には、微妙に挙動の違う記法を いくつか用意する方針には納得している do endとブレース、Procとlambdaみたいなのは、使ってて確かに両方必要だと感じるので ってかどうせ、変えたら変えたでまた批判されるでしょ?
&&, || と and, or だってそうだしな 優先順位が同じになったら困る人が大量発生するだろうなw
てかこれはそもそも "a".to_i みたいなのが 0 になるのがおかしい 数字じゃありませんってエラー出せよ
まあ、今のRubyで to_i や to_f のメソッドを作ったら例外ブロックとか例外処理引数とかつけると思う 文字列と数値の処理は変なの入れるとRubyスクリプト全体が遅くなるから嫌がられそうだが
人のソースを解読しながらの作業なんだけど 変数が宣言されてないのが凄く違和感ある 何かオブジェクトがあった時に中身が何なのかわからないんだよね 慣れればなんとかなるもの?
>>230 宣言は = で代入と同時に行われている
これ以外の方法で変数が宣言されることはない(配列の要素とかは別だけど)
で、変数の中身がわからなくて困るというのは、おおむね、変数名つけた人間のセンスがねえ
クラス名から類推されるオブジェクトの名前を変数に付けるのがセオリー
変数が何のオブジェクトか知りたければ、「右辺」の返り値を調べるといい
マニュアルでも、「○○を返します」というのだけは意識的に書かれてるはずだ
これまた稀にマニュアルなのに「××します」とだけ述べてて返り値のクラスについての情報がない奴がいるが、
アホ認定でよし
>>228 何を許容し、何をおかしいとするかは言語によるでしょ
少なくとも一様ではない
複数の判断があるからこそ、Rubyでは#to_iとInteger()の二つを用意してあるんでは?
Cのatoiは0を返す
JavaのInteger#parseIntは例外を投げる
Common Lispのparse-integerはデフォルトでエラーを通知するが、
:junk-allowedパラメータによっては多少の不正形式も許容し、それでもダメならnilを返す
>>232 いや to_i と Integer() には関連性はないから
234 :
デフォルトの名無しさん :2009/03/11(水) 18:05:44
testfile = "/tmp/testfile" FileUtils.chown(1000, 1000, testfile) #=> /usr/lib/ruby/1.8/fileutils.rb:987:in `fu_get_gid': can't convert Fixnum into String (TypeError) from /usr/lib/ruby/1.8/fileutils.rb:926:in `chown' from test.rb:6 あれ?と思って何度もドキュメントを読み直してみたんだけど、どうしても わからなくてFileUtilsのソース読んでみたんだが、 def fu_get_gid(group) #:nodoc: return nil unless group if /\A\d+\z/ =~ group ここでマッチするかを調べる前に、group = group.to_s するのを忘れていませんか? すぐ上にdefされているfu_get_uid()はStringに変換してあるのに・・・
>>231 右辺を見る、まず変数なのかメソッドなのかわからん
どちらにせよ何を返すのかが重要だからそれを調べるために
メソッドが定義されてる部分か変数に代入されている部分を探す
探した先でも代入されてたりして再び右辺を知る必要が生じる
しかも同じ変数を複数の用途に使ってたりするから
直前にアクセスしてるのはどこかを見つけ出して
直前を知る為に分岐で使われる変数の中身を知る必要があって
変数の中身を調べるために代入されている所から右辺を辿って
という状況が3重ぐらいにネストされてる
ってただの愚痴になっちった
俺が慣れてないせいもあるだろうし、スルーでおkです
>>235 副作用の少ないスクリプトなら、デバッガ使うか
デバッグプリント書き込んで実行しちゃうのが手っ取り早い。
あとはその変数(オブジェクト)をレシーバにしてるメソッドから類推するとか。
これはduck typingと呼ばれる概念の延長だけど
Stringのメソッド使ってるならStringかそれに似せたオブジェクトだろう、ということ。
237 :
234 :2009/03/11(水) 19:56:51
ちょっと無視しないでよー もしかして僕がバグなんですか?
数値で指定できるの初めて知った ずっと文字列だったから
239 :
234 :2009/03/11(水) 20:14:24
>>238 ええ、ただ僕の場合はユーザID、グループIDで指定する習慣となっているので
ちょっと困ります。
FileUtils#chown のユーザIDは大丈夫なのに、グループIDだとエラーが出るので
、それを手がかりにしてソースを読んでみたのです。
初心者なもので、バグかどうかはわかりませんが、fu_get_uid() と
fu_get_gid()を比較してみると、バグなのかな?という疑問もあります。
あん、"1000" で通るだろ
241 :
234 :2009/03/11(水) 20:24:29
>>240 やだよ。
つかEtcとかFile#Statで得たユーザID、グループIDを
いちいちto_sでStringに変換するくらいだったら、自分でfileutils.rbを修正しちゃうね。
(自分で修正したものを/usr/libに置くのはキモいけど)
そういうことをやると、環境構築のたびそこに修正が入るわけだが ひとりシステムで将来的にも引き継ぎなしとかならいいけど
require 'fileutil'
module FileUtils
alias org_fu_get_gid fu_get_gid
def fu_get_gid(group)
org_fu_get_gid group.to_s
end
end
>>234 も
>>237 もバグだと思うけど、
>>241 をやるぐらいなら
モンキーパッチのほうがマシ。動くかはシラネ。
244 :
234 :2009/03/11(水) 20:43:53
じゃあ /usr/lib/ruby/1.8/fileutils.rb を適当な場所にコピーして 自分で修正! def fu_get_gid(group) #:nodoc: return nil unless group group = group.to_s # fu_get_uid() にならって、この部分を追加! if /\A\d+\z/ =~ group then group.to_i else Etc.getgrnam(group).gid end end private_module_function :fu_get_gid これで解決だよw つーか、この程度のバグも報告されていないとは、実はRubyユーザって 少ないんじゃないの?ww
あーはいはいそうだねすごいね
少ないけど、何か?
>>244 そんなRuby使うのやめちゃったらいいよ
折れは使うけど
249 :
234 :2009/03/11(水) 21:15:23
>>248 そのパッチが公開されたの2007年じゃんワロタww
いつになったら適用されるんだろうね
redmineに移行して忘れ去られていると見た。
251 :
234 :2009/03/11(水) 21:35:44
じゃあ誰か報告してあげなよ。 俺はたいして英語が書けない読めない喋れない聞き取れない 現役高校生だし、当然職業プログラマでもないからやめておくが・・・
日本語でおk なんだが。
254 :
234 :2009/03/11(水) 22:03:30
なんだよー、日本語でいいのかよ。
だったら実名で報告しておけばよかったなー。
そんで俺が有名になって、クラスの女の子たちから告白されて
スーパーハカーになっちゃったりして、んでもって将来かわいいお嫁さんと結婚したら
君たちは嫉妬しちゃって鳴門大橋から飛び降りることだろうw
まあとにかく
>>253 さんありがとう!
255 :
234 :2009/03/11(水) 22:04:38
# FIXME
256 :
デフォルトの名無しさん :2009/03/11(水) 22:12:29
フィールドがタブ区切りで、行区切りがCrのデータを処理するときなんですが, csv = CSV::open('data.csv', 'r') csv.each{|r|レコード処理その1} としたあと csv.each{|r|レコード処理その2} をしたくてもデータがnilとなっていて,うまく処理できません。 今は,改めてcsv = CSV::open('data.csv', 'r')で再オープンしているのですが io.rewindみたいなもっといい方法はないですか? 処理の都合上csv.each{|r|レコード処理その1;レコード処理その2}はできません。 (ようするに最後のレコードまでいって,もう一度はじめからの処理が必要)
open_readerの定義を参考に CSV::Reader.parse(io, fs, rs) do end io.rewind CSV::Reader.parse(io, fs, rs) do end とでもやるしかなさそうな気がするが、 CSV再オープンと大して変わらないかな。
fastercsvのソースにはrewindがあったけどどう使うかは知らん
class C def initialize @n = 50 end def n return @n end def n=(n) @n += n - self.n end end c = C.new b = c b.n = 20 p c.n これを実行すると20と表示されます c = 50 b = c b = 20 p c これは50と表示されます ここの辺り、それぞれの結果に差が出る理由などが漠然としか理解できていないのですが 上手く解説してるサイト等ご存知でしたら教えてください
# C インスタンスを生成し c に代入 c = C.new # c のインスタンスに b からもアクセス出来るようにする b = c # b(==c) の内部変数に 20 を代入する b.n = 20 # b と c は同じオブジェクト(C インスタンス) # 変数 c に 50 を代入 : b=nil c=50 c = 50 # 変数 b に c の値を代入 : b=50 c=50 b = c # 変数 b に 20 を代入 : b=20 c=50 b = 20 # b と c は別のオブジェクト(20 : 50)
センスって都合のいい言葉だな。 でもそのセンス大事な言語仕様なら、もうちょっと厳密に固めた方がいいと思う。今の再利用の際に謎解きが必要な仕様では、オブジェクト指向のメリットである再利用が阻害されるだけ。
>>261 《厳密》に動作してるよ
お前のプライドを満たすために言語があるわけじゃない
Javaでスパゲティが作れてしまった時点で人類は認識を改めなければならなかった プログラミング言語側に責任を負わせるのは誤りなのだと
>>263 どんだけ、敷居を下げた言語つくってもスパゲッティコードは量産されるの法則
質問があります。 RubyでExcelのスプレッドシートを扱う簡単なライブラリでオススメはないでしょうか? 通常はOLE直で使うものなんでしょうか?
>>263 頭の中がスパゲッティなら出てくるものもスパゲッティw
これ真理
>>265 gem install spreadsheet-excel
>>259 どういう動作をするほうがいいと思った?
やっぱプログラマも免許制にした方がいいな。 質の悪いプログラマがいつまでも駆逐できない。
ソース公開したらパクって一儲けします。
273 :
デフォルトの名無しさん :2009/03/13(金) 03:07:30
gem の再インストールをしようと思ってるんですが、今までgemでインストールしたライブラリを全部一気に削除するにはどうすればいいでしょうか? やはり gem uninstall で一個ずつ手作業?それともgemのディレクトリ削除するだけでgemでインストールしたライブラリも全部削除したことになるのでしょうか?
274 :
デフォルトの名無しさん :2009/03/13(金) 04:23:04
>>274 参照ページの処理がYahooのページ構造に依存しているだけ
googleに対応させたければGoogleのページ構造に合わせて
スクリプトを修正する必要がある
276 :
デフォルトの名無しさん :2009/03/13(金) 04:40:55
>>275 具体的にはどこをどうすればいいのでしょうか。
取りあえず、いろいろ試しているんですが分かりません。
277 :
276 :2009/03/13(金) 05:43:48
すみません自己解決です、今のところ理由は不明ですが agent.user_agent_alias = 'Windows IE 7' を入れてたら動きました、これから理由を探っていきます ありがとうございました。
>>273 gem list | awk '{print $1}' | xargs sudo gem uninstall -a
とかどうだろう
gem のディレクトリを消しても /usr/local/bin とかにスクリプトファイルがインストールされているからね。rakeとか。
railsなどrubyで書かれたソースを読むのに便利なツールはないでしょうか? Cでいうところのgloboe,phpのphpxrefのようなツールがあると最高です。
ソース読んだほうが早いということになってる
Railsは「Rubyではない」ので、Rubyとは別に考えてください
282 :
276 :2009/03/13(金) 16:53:46
たびたびすみません
require 'rubygems'
require 'mechanize'
require 'nokogiri'
require 'kconv'
agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 7'
page=agent.get(URI.parse('
http://www.google.co.jp/ '))
puts page.forms[0]
だときちんとformが表示されるのですがアドレスを
http://be.2ch.net/test/login.php にするとnilといわれます、該当ページのbodyを表示しても
きちんとformは存在しているのでどこかがまずいはずなのですが
分かりません、よろしくお願いします。
>>282 あはは、libxml2 は来るなって HTML に書いてある
これは libxml2 がパースできないタイプの HTML の書き方だ
自前で POST するか、あるいは Hpricot を使う
require 'rubygems'
require 'mechanize'
require 'hpricot'
require 'kconv'
WWW::Mechanize.html_parser = Hpricot
agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 7'
uri = URI.parse('
http://be.2ch.net/test/login.php ')
agent.get(uri).form_with(:action =>'/test/login.php'){|f|
f.set_fields('m' => ['mail_address'], 'p' => ['password'])
}.click_button
284 :
276 :2009/03/13(金) 18:33:26
>>283 ありがとうございます。
まだ良く理解できていないと思いますが精進します。
わーい、Mechanize の質問だ
>>283 残念惜しいこれパースできます
>>282 で、はっきり言うと WWW::Mechanize 0.9.2 のバグです(Nokogiri は悪くないです)
Mechanize 内部で UTF-8 に強制変換している可能性をすっかり忘れて、
元の HTML の文字エンコーディングを Nokogiri に渡しています
日本語のサイトで Mechanize を使う場合は、しばらく
agent.get(uri){|p| p.encoding = "utf-8"}
というように、HTML のエンコーディングを UTF-8 に強制指定してください
(irb でも動作するので、この書き方がいちばん楽です)
UTF-8 に変換されない組み合わせというのも確かにあるんですが、
こんなのいちいち覚えるのは無駄なので、とりあえず UTF-8 で試して、失敗したら変更するようにしましょう
Nokogiri との組み合わせを見捨てて、
>>283 のように Hpricot を使うようにしてももろちん構いません
Emacsでruby-modeを使うと、if や do を入力すると勝手に end が入力されてうっとおしいのですが これをやめさせるにはどうしたらいいですか。 do のあとにスペースをいれるとendが入るのに、doの直後で改行するとendが入らないとか 中途半端な仕様なのでやめたいです。
>>286 それは ruby-electric の担当であって ruby-mode の仕事じゃないんじゃね
(add-hook 'ruby-mode-hook
'(lambda () (ruby-electric-mode nil)))
これでどう
ruby-electric 自体をやめてしまってもいい
288 :
276 :2009/03/13(金) 20:09:05
>>285 ありがとうございます。
>WWW::Mechanize 0.9.2 のバグです
最初に自分で調べていたらそれっぽいなと思いましたがよく分からなかったので放棄してました
有名なライブラリでもバグとかあるんですね、分からずに使ってる身としては早く直って欲しいです。
正直なとこ、これに関しては直る可能性はかなり薄いです 開発版で直る機会があったんですが、あっさりエンバグして 0.9.2 になりました 日本語サイトの一般的な利用法に関する知識を持った(そして英語で議論できる)人がいないんです
290 :
286 :2009/03/14(土) 00:37:13
>>287 やってみたんですけど変化なしでした。
デフォルトでruby-mode-hook に (ruby-electric-mode t) が設定されているようで、
自分の設定よりもデフォルトの設定のほうが優先されているようです。
(setq ruby-mode-hook
(append ruby-mode-hook '(lambda () (ruby-electric-mode)))
としたほうがいいでしょうか。
>>286 ruby-electric-mode の方にその手のことを制御する変数があったと思うけど
(add-hook 'ruby-mode-hook
(lambda()
(inf-ruby-keys)
(require 'ruby-electric)
(ruby-electric-mode t)
;; (setq ruby-electric-newline-before-closing-bracket t)
))
この設定例における変数 ruby-electric-newline-before-closing-bracket に
類するものが他にもあるはずなのでスクリプトを調べてみるべし
質問です。RubyにはSQLiteなどが、標準搭載されることはないのでしょうか? レンタルサーバーや、自分以外の管理の場合に不便です。
要望の説得力によってはありえるかもしれない。 過去にreadlineやopensslのラッパーが標準付属になったりしたわけだし。
松本尊師が拒否したら無理だろうな。GUIのように。
TMail でいいじゃん
質問 クラスファイルの中に、いい例が思いつかないんですがたとえば %w(hoge hage mage).each do |param| eval("def get_#{param}; @#{param}; end") eval("def set_#{param}=(v); @#{param}=v; end") end のように、全く動的でない固定の5個くらいの文字列から20個くらいメソッドを作る処理を書くのって無駄ですよね? メソッドを書くスクリプトの処理結果をベタ張りするべきですよね? RDocにも拾ってもらえないしいいとこなしですよね?
そいや、sqlite3-rubyは最近開発者が燃え尽きた(burned out)ような。 weblog.jamisbuck.org/2009/2/25/net-ssh-capistrano-and-saying-goodbye
>>298 それが規約や共通処理的なものであるならプロジェクトに
よっては意味があるかもしれない
元の処理が何故そう書かれたのかを確認すればいいだけの話じゃないの?
>>294 少しはPythonを見習って欲しいな
>>299 丁度いい機会だから、SQLiteくらいは組み込んで欲しいよな
誰がメンテしてくれるのかは、知らないが・・・
Railsとかどうなるんだろう?最悪引き取ってくれるのかな?
JRubyでJavaのオブジェクトを明示的にキャストするにはどうしたらいいんでしょうか? 具体的にはGraphics型をGraphics2D型にダウンキャストしたいです。
303 :
302 :2009/03/14(土) 16:13:30
すみません、自己解決しました。 JRubyでは内部的にSunGraphics2D型になっているようでした。 #僕自身は解決したんですが、JRubyの型指定ってどういう風にやってるんですかね。 #Javaは素人なんですが、明示的に型指定できなくても(Java側で)困る状況にならないってことなのかな。 それと、JRubyの質問ってここでしても良かったんでしょうか? スレ違いだったなら申し訳ないです。
Class ClassA def initialize b = ClassB.new c = ClassC.new end end Class ClassD def initialize e = ClassE.new c = ClassC.new end end a = ClassA.new d = ClassD.new if (何か) n = a.b else n = d.b end このような状態で、nを使ってcにアクセスするにはどうすればよいでしょうか?
ミスとインデントを修正しました。すみません Class ClassA def initialize b = ClassB.new c = ClassC.new end end Class ClassD def initialize e = ClassE.new c = ClassC.new end end a = ClassA.new d = ClassD.new if (何か) n = a.b else n = d.e end
>>305 一般的に、a や d を持って来るべき
hoge(v)
# v は n であり、n から c を呼び出して何かする
end
hoge(n)
ではなく
hoge(v, n)
…
end
hoge(a, n) または hoge(b, n)
または
hoge(v)
# n = v.b または n = v.e
…
end
hoge(a) または hoge(b)
という構造にすることを真っ先に考えるべき
私もそれがベストだとは思うのですが…
>>305 から
c = ClassC.new を行っている2行を除いたのが元の状態で
それに手を加えて c = ClassC.new の追加と、nからの参照をしたい、という状況です
他が色々出来上がってしまっているので
hoge(v)をhoge(v, n)に修正するのは1から作り直すのと同じような状態です
あまりスマートではないけど、 Class[B,C,E]にルートオブジェクトを示す変数を入れて、 ルート側のinitializeで初期化するようにしたらどう?
ありがとうございます。 ひとまずそれでやってみます。
相互参照にする b = a.b c = b.a.c クラス B E に C への参照を持たせる c = a.b.c 可変引数を使う def hoge(*args) case args.size when 1 ... when 2 ...
311 :
デフォルトの名無しさん :2009/03/14(土) 19:28:50
質問させてください。 以下のようなコードを書いたのですが、 File::open(ARGV[0], "r") { |f| f.each {|line| print line } } このコードに ・このプログラムの実行時に引数がなかった場合(ARGV[0]がnilだった場合)に適切なエラーメッセージを標準入力に表示させる処理 ・ファイルオープンに失敗した場合に適切なエラーメッセージを標準入力に表示させる処理 の二つを加えたいのですが、ruby的に一番スマートな書き方を教えていただきたいのです。 ifとかelseとかを多用するのはruby的には美しくないのかな?と・・・ ご教示頂けると嬉しいです。
勝手にしろ
> 標準入力に表示させる処理 かなり高難易度な気がする・・・
314 :
デフォルトの名無しさん :2009/03/14(土) 19:40:17
例外をキャッチキャッチキャッチして スタンダードエラーアウトプットにプットプットプット!!!!
315 :
311 :2009/03/14(土) 19:54:35
すいません間違えました。標準出力です。
>>312 がFAではある
raise "引数を指定してください" unless ARGV[0]
begin
File::open(ARGV[0], "r") { |f|
f.each {|line| print line }
}
rescue Errno::ENOENT => ex
raise "#{ARGV[0]} が存在しません"
end
基本はこんなんだと思う
あとは好きに改造なり省略なりしれ
あ、最初の例外は ArgumentError であるべきという話もあるが好きにしてくれ raise(ArgumentError, "引数を指定してください") unless ARGV[0] RuntimeError 以外の例外は「第三者がrescueするかどうか」でとりあえず決めていい 誰も rescue しない例外で自作例外クラスを作ったりするのは自己満足以外の何物でもない
>>311 程度の条件なら例外で振り分けることも出来る(おすすめはしない)
begin
open(ARGV.fetch(0),'r') {|f| ... }
rescue IndexError # ARGV[0]がnil
puts "引数を指定してください"
rescue # その他ファイル周辺の例外
puts $!
end
rubyに限らずオブジェクト指向言語なら多態性を利用する事で
制御構造部分の記述を削減できるけど、311に適用出来る所はないね
普通にif文使って事前チェックをするのが正しいと思う
折角だからWindowsXPに1.91を入れようと思っているんですが、 ワンクリックでインストールできるRubyとかないんでしょうか。 コンパイルとかできんし。
>>319 引数を受け取るだけの仕事にoptparseを持ち出すのはただの馬鹿
>>321 どうもです。早速試してみます。楽しみ楽しみ。
class G attr_accessor :a def initialize @a = [] @m = M.new(@a) @a = [5] end end class M def initialize(a) @b = a end def output p @b end end g = G.new g.m.output このプログラムの結果は 5 ですよね? その後 g.a を変えると output の結果も変わると思います ところが g = G.new から g.m.output の間に 何をしているのかよくわからないんですが色々な処理が挟まっていて g.a を変化させても(変化しているのに)結果が 5 のままになっています 間でどのような処理が行われている可能性があるんでしょうか?
>>324 > このプログラムの結果は 5 ですよね?
rubytest.rb:20: undefined method `m' for #<G:0xb7c4e638 @m=#<M:0xb7c4e598 @b=[]>, @a=[5]> (NoMethodError)
空気を読んで G の attr_accessor に :m を追加した結果
[]
簡略化したつもりが間違ってたみたいです すみませんでした どこがどうなってるんだろう…
前回書こうと思って面倒になって消したんだが、Rubyの変数は名札だ メソッドが普段直接参照してるのは、変数の名前ではなく、オブジェクトID 変数はオブジェクトIDをわかりやすく書き手とメソッドに伝える名札に過ぎない @a = [] @m = M.new(@a) @a = [5] は、 「@a が [] になって M.new の引数に渡されて、さらに [5] に変化した(ので M.newに渡したものも [5] になっている)」 と見るのではなく 「[] というオブジェクトを @a という名前で呼ぶ、 @a という名前のついたオブジェクトを M.new に渡す、 [5] という(先の [] とは別物の)オブジェクトを @a という名前で呼ぶ」 と見るのが正しい ということで、やりたいことは @a = [] @m = M.new(@a) @a.push(5) とすればいい これなら @a は最初から最後まで同じオブジェクトを指すことができる
class G def initialize @a = [] p @a.object_id @a.push(5) p @a.object_id @a = [5] p @a.object_id end end G.new 結果 -605095318 (最初) -605095318 (同じ) -605095348 (違う) @a = で2度目の代入が行われた時点で、 1回目で [] だったオブジェクトを@a という名前で使うことはできない
>>325 >>327 >>328 ありがとうございます
おかげで少し理解できてきました
>>324 の @a = [5] はこっちに書くときのミスで実際は @a[0] = 5 でした
これなら出力も 5 になると思います
そして
>>324 の質問の答えは『@aの参照先が変わる処理が行われた』ですね
再び質問なんですが、@aの参照先が変わろうとも、常に@aと同じものを参照する変数を用意する事はできますか?
変数とはデータを入れる箱である、というメタファーは Ruby では完全に誤りで誤解の元
箱ごと移動できそうに見えてしまうからね
オブジェクトが厳然と存在していて、それに補助的にぺたっとつくのが変数という名前のラベル
a = []
b = a
c = b
d = c
は、
「d の中に c があってその中に b が、 その中に a があってそれの中に [] という空の配列データが入ってる」
という状態ではなく
「配列オブジェクト [] に、変数名ラベルの a、b、c、d がぺたぺた貼られていてどの名前を使っても参照できる」
という状態
>>329 参照先が変わって困るような変数の場合はその名前を使い回してはいけない
オブジェクトには複数の変数名を持たせることができるから、適当な別名をつければどうとでもなるよ
@a = 初期値 b = @a @a = 別な値 p b #=> 初期値 > 参照先が変わって困るような変数の場合はその名前を使い回してはいけない が正しいな @a をあとで使うのなら、@c = 別な値 とでもすべき 本来のスクリプトでどういう構造になってるかにもよるから、別にいいんだが
>>322 うるせー馬鹿
引数にオプション渡されたらどうするんだよハゲ
適切なエラーメッセージを出したいって言ってるだろう?
あと、vやhオプションを実装しろっていう暗黙の命令
334 :
デフォルトの名無しさん :2009/03/15(日) 13:41:59
> このリファレンスマニュアルは、Ruby 1.9 に関して、言語仕様、組み込みライブラリ、 > 標準添付ライブラリのいずれにもまったく対応していません。信用してはいけません。 (´,_ゝ`)プッ
>>334 文句あるならオフィシャルのマニュアル使って下さい
336 :
デフォルトの名無しさん :2009/03/15(日) 13:48:58
> 執筆者募集中 (´,_ゝ`)プッ
337 :
デフォルトの名無しさん :2009/03/15(日) 15:06:30
∧_∧ (⌒⌒ヽ ( ・ω・) あ、ワリ、屁こいちゃった ( プッ!! ゝ∪ ) 丶〜 '´ (___)__)
1.9って思いきって名前変えれば良かったのにな。 ruby vista 1.0とか。
それは 2.0 の役目です 1.9 シリーズはただの橋頭堡
1.10は?
342 :
デフォルトの名無しさん :2009/03/15(日) 23:47:47
誰か教えて f(a,b) = a^b 但し a, b は実数 (実際は有限桁です) を100桁ぐらいの精度で出したいんだけどどうすればいいですか? bigdecimalとか使ってもうまくいかない
「うまくいかない」なら「しかたがない」だろ
まず自分がどうやって、 どううまくいかなかったか書かなきゃダメだろ
そもそもその精度に意味が有るのか検証したほうが。 つ有効桁数
346 :
デフォルトの名無しさん :2009/03/16(月) 07:14:52
ちょっと解釈がわからないところがあるので質問させてください。 以下のようなコードを実行した場合 $KCODE = 'n' print 'あいう'.match(/\W+/), "\n" #結果 => あいう $KCODE = 's' print 'あいう'.match(/\W+/), "\n" #結果 => nil 右のコメントにあるような結果になってしまうのですが これはどういう事なんでしょうか? マルチバイト文字を認識可能にすると 何故正規表現の「\W」が機能しなくなるのでしょうか? $KCODE='n'の時に「\W」が機能しないという逆の状態なら納得できるのですが…
>>346 \w の意味は? \W はその補集合だよな? な?
>>347 やっと意味がわかりました。
文字コードを指定する事でマルチバイト文字も
「\W」の認識形式に含まれるという事ですね。
文字コードを指定した場合の「\W」は
「英数文字+マルチバイト文字『以外』の文字」という事になるのですね。
つまりそこに引っ掛かる文字は主に「記号」になると。
この認識でいいですか?
349 :
訂正 :2009/03/16(月) 07:43:07
× 「\W」の認識形式に含まれるという事ですね。 ○ 「\w」の認識形式に含まれるという事ですね。
>>342 1.23**4.56 => 2.5702023016193 <----これでは足りないという事なら
123**456 => (ry
↑の結果をMath.logを使って元の値を求める。
>>348 \w は「単語構成文字」
何を単語を構成する文字とみなすかは文脈によって変わるってこと
>>348 「詳説 正規表現」っていう本を読んでみるといいお
irb> puts 'あいう'.tosjis.inspect "\202\240\202\242\202\244" irb> puts 'あいう'.tosjis.match(/\W/n).inspect #<MatchData "\202"> irb> puts 'あいう'.tosjis.match(/\W/s).inspect nil irb> puts 'あいう'.tosjis.match(/\w/s).inspect #<MatchData "\202\240">
正規表現は関係なくて、日本語マルチバイト文字とはなんぞやという話だな puts '表示'.tosjis.match(/\w/s).inspect #<MatchData "\225\\">
nitems って何の略ですか? nil items?
number of items だと思う。 ていうかどういう場所に現れたのかわからないと答えようがない。
Array#nitems なら Number of ITEMS で項目数 Ruby 1.9 では無くなったメソッドだ nitem という言葉自体はプログラミングでは一般的な略語で項目数を表す
358 :
355 :2009/03/16(月) 17:42:13
こんなとき、nitem いいですか。
好きなだけ nitem いいよ
ここは nitem 持っとかないと
362 :
311 :2009/03/16(月) 20:26:10
レスありがとうございます。参考にさせて頂きます。m(_ _)m
363 :
じゃなくて311 :2009/03/16(月) 20:27:51
レスありがとうございます。参考にさせて頂きます。m(_ _)m
少しお聞きします。 文字列が空文字列(nilではない)かどうか?を調べる一般的な方法(定石、慣例)というのはないのでしょうか? 例: s = "" do_hoge if s != "" こんなんでいいの?if s だと駄目みたいだし。(""はRubyではfalseにならない)
>>364 String#empty? ってのがある。
通常の処理 unless str.empty? if str.empty? then 何かエラー処理 end というのがイディオム的ではある
str が nil のときでも str.empty? は呼べますか?
$ ruby -e 'str = nil ; str.empty?' -e:1: undefined method `empty?' for nil:NilClass (NoMethodError)
>>367 あ、そうか
str が nil である可能性が幾ばくかでもある場合は
str && !str.empty?
とか書く
途端にめんどくさい感じになって、俺はあまり好きではない
>>369 「nil を empty と同一視したいとき」だな
nil は 0 や "" と違う扱いを受けるべき
というのが理想論
どうせ俺専用スクリプトだ!てことで class NilClass def empty? true end end とかって邪道?
RailsならObject#blank?
組み込みクラスの拡張は、既存の動作に影響を及ぼさない限りにおいてのみ是
str.empty? が NoMethodError で例外を出して終了することを前提にしているライブラリがうまく動作しなくなるから、
>>371 は「やってはならない」
というか、is_empty? とかそういう関数的メソッドを定義したほうがなんぼか素直だと思われる
>>369 なんかそれキモイw
str.nil? or str.empty?
376 :
371 :2009/03/17(火) 17:46:47
なるほど、ためになりました。
Object#tryは正式採用されるだろうか。
nil には nil? があって すべての object にも nil? があるのですね
NilClassを含む全ての基底クラスであるObjectのメソッドだしねぇ
と書いてふと思った。 「一切の例外なくObjectを継承してる」と断言していいんだっけ?
つ BasicObject (1.9)
BasicObjectが出来たので駄目
なんぞそれw 調べてみるサンクス
なんでそんなひどいことしたの
>>386 >通常のクラスは Object またはその他の適切なクラスから派生すべきです。
>真に必要な場合にだけ BasicObject から派生してください。
基本的に使うなってことだから大丈夫
でもあるから使っちゃえで、どうにも成らなくなる気がする。
ActiveSupportあたりがメソッドもりもり追加しそう
Objectに追加すべき
数年後にSuperBaseObjectが出来るんですねわかります
というか、わざわざBasicObjectを選んでメソッドを追加するメリットは特にない
BasicObjectは、Objectに定義されているメソッドがundefでも動作に邪魔だという場合に使う
BasicObject継承してなにかするのは面倒だから 気軽に使えるモノではない。 当たり前だが、インスタンス作るだけで irb> BasicObject.new NoMethodError: undefined method `inspect' for #<BasicObject 0x3e40cc> なんだぜ。
irbだと最後に評価した式をinspectするから、 irb> x = BasicObject.new; nil => nil とかすればいいな。 まあ、作っただけじゃHashのキーにすら出来ないんだが。
というかメソッドを追加せずに BasicObject.new するというシチュエーション自体が無茶設定
だから簡単には使えないよ、ていう話なんでしょ?
メソッド定義すれば普通に使える Railsにお墨付き与えたようでちょっとやーな感じだな
400 :
デフォルトの名無しさん :2009/03/18(水) 09:50:45
使わないものをなんで作っちゃったんだろう
delegateとかその手のやつのため
むしろRailsがBasicObjectを直接継承したオレクラスを使いまくってくれれば、 Objectを継承してるかどうかでRails由来かどうか判定できて嬉しいかも。
なんだ隔離Objectなのか
どうせならRailsObjectにしちゃえば良かったのにね。 他にも追従するアプリが出てくるかも。
406 :
364 :2009/03/18(水) 11:13:04
ありがとうございます。理解が深まります。
>>365-366 String#empty?ってあるんですね!
irbで試した時、ないよーって言われたからないものだと思ってた。多分スペルミスだ・・・
>>375-378 nil判定はいつも
hoge if nil_obj
と言う風にやってたよ。nil_obj.nil?使うようにするよ
いや、if の条件にオブジェクト1個どっかんと置くのは有効だし一般的だ 複合条件で「nil かどうか」を調べたいときには nil? を使うとわかりやすいことがあるというだけの話
>>374 >str.empty? が NoMethodError で例外を出して終了することを前提にしているライブラリがうまく動作しなくなるから、
こんな書き方しているライブラリのほうがまずいだろ
rdoc が Hash#method_missing を定義したせいで net/imap がうまく動かなくなったとか色々あるじゃん
rdocの分際でそんなもん定義したのかよ。 というか、なんでrdocのせいでnet/imapに影響が出るんだ?
>>409 method_missingのことなんか知らねーよ
empty?の例をだせよ
Rubyつながりじゃね?
method_missing を定義された場合にトラップできなくなる例外の第一番目は NoMethodError
ふと思ったんだが、オープンクラスを利用したクラス拡張って 厳密にはリスコフの置換原則に違反してる? method_missingその他の振る舞いを微妙に変えちゃうので
>>414 オープンクラス云々ではなく、method_missingを使ったクラスの
サブクラスが(定義時点だろうと)メソッドを増やす時点で
反してるんだと思う。
なんつーかmethod_missingって奥の手の一つでしょ?
言語べったりの特殊機能 OOPとかそういうのとは別の次元の存在
理想と現実の乖離始まったか。
どこのObjective-C
rubyもメモリリーク地獄に陥るのか。
420 :
デフォルトの名無しさん :2009/03/19(木) 03:26:48
シンボルの存在意義がイマイチわかりません。 ハッシュのキーにシンボル使うと速度出るんですか?
ハッシュ値の生成式の違いから、相対的には早くなるかもしれんが、 速度目的で使うことはないと思うよ。 lispとかやってりゃシンボルのほうが自然だと思えるケースも理解できる と思う。
例えば :hello というシンボルはプログラム内で唯一のインスタンスになる 同じ内容の文字列は複数生成されるけど、シンボルはされない def put_str_id ; puts 'hello'.__id__ ; end def put_sym_id ; puts :hello.__id__ ; end 3.times { put_str_id } #=> バラバラの数値が出力される == 呼ばれる度にインスタンス生成 3.times { put_sym_id } #=> 同じ値が出力される == 常に同一のインスタンス 記述される場所が違っても同一のインスタンスが使われるので メモリ消費が少ない、インスタンス生成コストが無い、という利点はある
× インスタンス生成コストが無い ◯ 初回以外インスタンス生成コストが無い
シンボルだとエディターの色分けで、文字列と別色になって便利だから使ってる
Symbol って Fixnum と同じで即値じゃなかったっけ? オブジェクトのための構造体をヒープに割り当てたりとかはしないはずなので 文字列より生成コストは低いと思うよ 評価される度に新しいインスタンスを生成する文字列リテラルより ほんちょっと精神衛生にもよい気がする
>>420 ・Fixnumと同じく即値なので、生成がきわめて軽い
・書くのが楽
ただし濫用すると「あれここStringだっけSymbolだっけ」という混乱が発生する諸刃の剣
で、とりあえずメソッドの頭で to_sym と
Symbolに数値を割り当てることは可能ですか?
irbでやってみれ
>>420 Yugui著『初めてのRuby』p.75より
「文字列同士は、内容が同じであっても一般には同一のオブジェクトとは限らない」
「シンボルは、内容が同値であれば必ず同一のオブジェクト」
「シンボル同士は文字列同士に比べて高速に同値生を判定できます」
432 :
431 :2009/03/19(木) 10:58:12
勉強になった
ただし、シンボルの元となった文字列はずっとメモリ中に残るので、 調子に乗って長大な文字列をばんばんシンボル化すると えらいことになる。
というか、文字列の代わりにシンボルを使うことはない シンボルは、シンボルとしての用途を外れることはない ハッシュ引数のキーとか、 {:title=>"タイトル1", :author=>"著者1", :isbn=>"ISBN1"} というデータがどっさり入ってる配列とか to_s や to_sym を使う必要がないような場所、というのが目安なんじゃないかと思う
p :hoge
個人的にはスクリプト内部で完結して、かつStringとしての性質が 不要な時に使ってる。 Cなんかで定数を列挙しておいて、コード上では名前だけど 実装的にはその数値で処理を行うような場面がSymbolの用途まんまだと思う。
個人的な判断の仕方ね。 同じような使い方をしてる人は多いっていうかそれ以外はまず見ない。
なぜシンボルなのかを聞かれてメモリー上の効率が云々言ってたらプギャーしていい
440 :
420 :2009/03/19(木) 14:07:41
皆様ありがとうございました。 とても勉強になりました。
ユーザーがシンボルと文字列、どちらを渡してもいいように 内部では to_sym が俺のジャスティス
>>441 Symbol が数値なのはわかりますが
:fuga という Symbol があったとして
それに 5 を割り当てることは出来ますか?
という意味ですよ
>>437 任意の数値を割り当てられる訳ではないから
>コード上では名前だけど実装的にはその数値で処理を行うような場面
ではあるけど列挙型やマクロと完全に同一視は出来ない
また違ったものでしょう
>>443 シンボルはただのオブジェクトだぞ
それは "str" が 5 になりますか、という質問と同じだ
10 / 3 10.div 3 の結果に絶望した
>>445 Integer のメソッドの返り値が Integer であることに何の不整合があろうか、いや、ない
直感的でないことには異論を待たないが
self と引数の両方を自動で Float にして計算するメソッドとかがあってもいいのにな〜とは思わなくもなくもない
>>444 10 に 5 を割り当てられますか? の方がニュアンス的には近いとオモ
>>443 > 列挙型やマクロと完全に同一視は出来ない
まあ、割り当てた値を使ってビット演算したりする場合はそうだろうけど、
単に他の値と区別できたらいいという局面ではシンボルがラクだろうな
>>443 だからスクリプト内部で完結する場合って言ってるじゃんw
>>445 その結果がIntegerじゃなかったら破綻するプログラムもいっぱいあるだろう
>>447 fdiv とか fmod とか?
何が割り当てられるか分からないのに 何かを割り当ててどうこうしようという発想が馬鹿ぽい
OOP自体、メモリの使用効率考えたら負け。
んなこたない
メモリの使用効率なんかどうでもいい ↓ スラッシング多発 ↓ クソプログラム
×OOP自体、メモリの使用効率考えたら負け。 ○Rubyでメモリ効率や実行効率を考えると空しくなる
正規表現を外の設定ファイルに出す、うまいソリューション(笑)はありませんか? 今はyamlで、 hage_check_pattern: /hogemage/i と書いて、 yaml = YAML.load("my_settings.yml") hage_check_pattern = eval(yaml["hage_check_pattern"]) としているのですが、evalるのがちょっと不安です。 外のファイルは外からいじられない前提なので問題ないっちゃーないんですが、もう少し安心な方法がないかと思いまして。
そうは言ってもシンボルはGCされないので, リテラル以外でシンボル作るのは怖いなあ
>>457 そもそも外部入力は一律で信用できない
外部ファイルを読み込むと決めた時点で、不安とか言っちゃ駄目
>>457 ためしに 正規表現リテラルをto_yamlしてみるといいよ。
お掃除必須なほどシンボル使うってどんなプログラムだよ
>>457 to_yamlはやってもらうとして、別解としてはMarshal(PStore)とか
>>457 Regexp.new(yaml["hage_check_pattern"]) かな
正規表現に限定できるだけ、evalよりは安全
>>462 エディタで編集できないと駄目なんだと思う
というか、そうでなければ正規表現を書き出す理由がない
>>464 すまん、設定ファイルかw
>外のファイルは外からいじられない前提なので
「スクリプトの外」・・・自分もいじらないんだと解釈してた
466 :
デフォルトの名無しさん :2009/03/19(木) 21:29:01
Python の re.compile() に相当するメソッドはありますか?
467 :
466 :2009/03/19(木) 21:31:26
自己解決しました。
Rubyでothelloをつくりたいのですが 何から始めればよいでしょう
469 :
デフォルトの名無しさん :2009/03/21(土) 00:18:07
>>468 コンピュータとの対戦なのか、対人戦なのか。
コンピュータ戦ならアルゴリズムの本。
対人戦ならネットワークの本。
言語は問わない。
画面をどう作るかみたいな話は後でいい。
人対人のネットワーク戦にしたらいい 思考する部分は作らなくて良い
>>468 作りたいものがオセロってはっきり決まってるんだから、画面から入るってのも一つの方法だとは思う。
例えば、
1.盤面の状態保持
2.出力
3.入力と、それによる盤面操作。
の順番で、「形だけ」つくってイメージをするとか。
ここまではそれがオセロでも将棋でも対して変わらないけどな。
また、vs人間でもvsコンピュータでも変わらない。
んでゲームフローとしての入力手番のループとか、ルールに従った入力チェックや盤面操作処理、勝利条件の判定などを後付け。
最後に入力方法や出力や、やりたければコンピュータの思考ルーチンに凝りまくって完成、でいいのでは。
とりあえず、できる所からステップを踏んでやっていくのがいいかと。
各ステップごとにいろんな手法があるだろうし、それを調べ考えるのが楽しいんじゃないかと思う。
そこまで行って初めて、Rubyに関する質問も出てくるだろうしなw
本人なのか本気なのかもよくわからんが、とりあえずゲーム部分は最初は文字で作れ ●と○と でなんとかなる
>>473 アプレットでGUIかよw どこまでがネタなのかわからんw
とりあえず、
A B C D E F G H
1++++++++
2++++++++
3++++++++
4+++○●+++
5+++●○+++
6++++++++
7++++++++
8++++++++
→ Black ? : C4_
こんなのから始めれwww
+の交点に石を置くイメージはなんか違和感がありますね
喧嘩売られてるよママン;o;
>>476 必要は発明のマザー、という格言があってだな
おまえらかかってこいや〜! A B C D E F G H 1++++++++ 2++++++++ 3++++++++ 4+++○●+++ 5+++●●+++ 6++++●+++ 7++++++++ 8++++++++
RubyはGUIと処理速度がネックだからオセロは向かないな。 というのはさておき、あっちのスレでも言われてるように475的にまずはテキスト使った簡単な表示で オセロを作ってからグラフィック使ったものに作りかえるという手順でやればいい。 具体的なサンプルコードを含めて手取り足取りというのを期待しているなら参考文献はないに等しい。
まともなGUIライブラリも作れないとか、そう言うことだから・・・ いや、何も言うまい。書き込みだけして寝よう。
僕が100万円で作ってあげよう
>>473 まず表示させる画像を用意する
次に画像を表示させるクラスを用意する
その後は
>>472 の方法で
どうせなら A B C D E F G H 1□□□□□□□□ 2□□□□□□□□ 3□□□□□□□□ 4□□□○●□□□ 5□□□●○□□□ 6□□□□●○□□ 7□□□□□□□□ 8□□□□□□□□ だろう。 センス無いとゲームは厳しいぞ。
[F-6]取られたので投了します
>>488 SDLとRails、SQLiteあたり詰め込んで(あと何が欲しい?)
解凍するだけで使えるようにzipでまとめて本家トップにに置くべきだな
簡単講座でも作れば、HSPなんて目じゃな・・・ああGUIライブラリが無いからダメかw
オセロにSQLite使うとしたら定石マップとか棋譜の記録とかかな Railsのインターフェースで対話的にブラウザでGUIってことか
>>489 RailsはRubyではないので、Rubyオフィシャルとしてプッシュすべきではない
あれはRubyで作ったもうひとつの別なプログラミング環境
>>473 ママパンダの石は花びらマークが付くんだ
文字で表現するなら星マークにするとか
4+++☆●+++
5+++●☆+++
>>486 □は○や●と色や形が似てるせいかおれには見づらいのだが
>>493 同意
やるならこんな感じ?
--A-B-C-D-E-F-G-H
-+-+-+-+-+-+-+-+-+
1|O|X|O|X|O|X|O|O|
-+-+-+-+-+-+-+-+-+
2|X|O|X|O|O|X|O|O|
-+-+-+-+-+-+-+-+-+
3|X|O|X|O|X|X|O|X|
-+-+-+-+-+-+-+-+-+
4|O|O|O|O|X|X|O|O|
-+-+-+-+-+-+-+-+-+
5|X|O|X|X|X|O|X|X|
-+-+-+-+-+-+-+-+-+
6|O|O|X|X|O|O|X|X|
-+-+-+-+-+-+-+-+-+
7|X|O|X|O|X|X|X|X|
-+-+-+-+-+-+-+-+-+
8|X|O|O|X|O|O|X|O|
-+-+-+-+-+-+-+-+-+
A B C D E F G H 1□□□□□□□□ 2□□□□□□□□ 3□□□□□□□□ 4□□□○●□□□ 5□□□●●●□□ 6□□□□●○□□ 7□□□□□□□□ 8□□□□□□□□
さりげなく続けんなw オセロ板行け
A B C D E F G H 1□□□□□□□□ 2□□□□□□□□ 3□□□□□□□□ 4□□□○●□□□ 5□□□●●●□□ 6□□□□●●□□ 7□□□□□□●□ 8□□□□□□□□
A B C D E F G H 1□□□□□□□□ 2□□□□□□□□ 3□□□□□□□□ 4□□□○●□□□ 5□□□●○●□□ 6□□□□●○□□ 7□□□□□□○□ 8□□□□□□□○
実際に文字でゲーム盤表示作ったことがあるとわかるんだが、□の汎用性の無さはガチ
A B C D E F G H 1□□□□□□□□ 2□□□□□□□□ 3□□○□□□□□ 4□□□○●□□□ 5□□□●○●□□ 6□□□□●○□□ 7□□□□□□○□ 8□□□□□□□○
なんだ春休み始まったのか その割には宿題スレ賑わってなかったな
504 :
デフォルトの名無しさん :2009/03/21(土) 19:17:23
スマン質問させてくれ。 rubyではじめるゲームプログラミングって本を買ったんだけど、この本についてる mygameってソフトはWindowsじゃインストールできない?
506 :
デフォルトの名無しさん :2009/03/21(土) 19:40:25
Vis太
sudoみたいにさくっと出来るといいのになあ てかC直下なら大丈夫っておいおい
508 :
デフォルトの名無しさん :2009/03/21(土) 19:54:43
>>507 以前から気になってはいたのだが、C:\直下の書き込み権限が
みんなに与えられているのは何故なんだろう??
システムファイル/フォルダが保護されてるって話でしょ。 C直下はいくつかのシステムファイルがあるとはいえ 決め打ち可能な限られたものしか存在しないし そのファイルの書き込み権限が絞られていれば十分かと。
510 :
デフォルトの名無しさん :2009/03/21(土) 20:04:49
>>509 じゃあ\直下にゴミファイル大量生産してきますね^^
昔、サービスパックは当てないのが常識 とか 今、UACは切るのが常識 とか わざとユーザーの思考を安全でない側に導くためにやってるんじゃないかと疑いたくなってくる。
>>510 それがC直下を特別視する理由にはならなくね?
C直下だからとシステムが壊れるわけでもパフォーマンス落ちるわけでもないし
人的にはむしろドキュメントフォルダにやられるほうが痛い。
消えろよ屑ども
514 :
デフォルトの名無しさん :2009/03/21(土) 20:16:56
>>511 Windowsはもともとシングルユーザ設計だったので、権限の管理が上手ではない。
おかげでウイルスの格好の標的とされてしまった。
管理者権限と一般ユーザ権限が用意されたが、管理者権限常用(管理者としてグラフィカルログイン)するヤツがいるのでUACを導入。
管理者権限も通常は一般ユーザ権限で動作するらしい。
しかしシステムにとって重要な操作はUACで一時的に権限昇格、と。
しかし一部のインストーラがUACに対応していなくて、UACを無効にしないと
何もできない状態らしいよ?
515 :
デフォルトの名無しさん :2009/03/21(土) 20:22:54
Rubyでゲームでも作ってみようかと思ったのですが、ゲーム用ライブラリはあるのですか? PygameのRuby版を探しているのですが・・・
SDLでも使うんじゃないの?
Pygameと言われても困るわけだが。 SDLならRubyバインディングあるけど。 検索してみたけどPygameもSDL使ったライブラリなのか。
>>515 ゲームを作りたいのなら、他の言語を選ぶべき
Rubyを身に付けたくて、それの題材としてゲームを作りたいというのならそれは間違いで、
書くコードの半分くらいはGUIに関するRubyと無関係なコードだ
Rubyをすでに知っていて、それでなおRubyでゲームを作りたいのいうのなら、ようこそ
はじめまして
はじめまして
はじめまして
> 書くコードの半分くらいはGUIに関するRubyと無関係なコードだ Webアプリでもフレームワークを使ったりすると、 結構な時間をフレームワークの規則を理解するという、 直接Ruby自体とは無関係なことに費やすのだが。 HTTPだのDBだのも勉強しないとろくなもの作れんしね。
526 :
デフォルトの名無しさん :2009/03/21(土) 22:41:09
>HTTPだのDBだのも勉強しないとろくなもの作れんしね。 それくらいは勉強しないとダメでしょ。
じゃあWebアプリも題材としては間違いってことだな。
>>520 の理屈で言うと。
Rubyを学びたくて題材を選ぶなら何がいいんだ?
>>529 HTMLを知っててCGIに関する素朴な基礎知識があるという前提で、
自分用の簡単なCGIまたはWebからの取得&加工スクリプト(gemライブラリ使用不可)
HTMLの知識がないという場合はまずHTMLを勉強してもらうのがいろんな意味で早道
データを加工するスクリプトを作るのが理解に役立つんだが、データがないことには
>>529 付属のライブラリを見て何も思いつかないのなら、Rubyのことはひとまず忘れて別なことしろ
今の君にはRubyは必要ないようだ
>>529 ファイル処理(Rake含む)とかかな
でも正直、最初の題材なんてWebアプリでもゲームでもWin32APIでも何でもいいと思う
いま一番作りたいものor必要としているものから取り組むべき
「OS作りたい」とか、そういったレベルになってくるとさすがに厳しいが
>>530 >>532 なるほど。なんにせよ、自分にとっておもしろくなきゃ、なかなか続かないよな。
続いても実にならないように思う。
そういうところまで考えて勧めるべきではないだろうか。
どんなものでも突っ込んでやれば、
Rubyについてもそれなりに調べなきゃいけないだろうから。
やる気がないと突っ込んでやろうとか思わん。
>>531 いや、じゃあ何がいいんだろうと思っただけでおれは割と楽しんでる
Rubyの初学者向け立ち位置はいまだに微妙だ それでもいいのかもしれないと、最近では思ってる 家にあるプログラミング言語がRuby
iseg = ARGF.read iseg = iseg. gsub(']', 'end;'). gsub('[', 'while dseg[dx] != 0;'). gsub('+', 'dseg[dx] += 1;'). gsub('-', 'dseg[dx] -= 1;'). gsub('.', 'print dseg[dx].chr;'). gsub(',', 'dseg[dx] = $stdin.getc;'). gsub('>', 'dx += 1;'). gsub('<', 'dx -= 1;') eval(<<INIT + iseg) dseg = Array.new(32768, 0) pc = 0 dx = 0 INIT puts ''
結局UNIX哲学的自動化処理に使うのが一番向いてるんだよな。 それ以外はよけいなものが一緒に来すぎる。
こういう話になると必ずワケワカラン結論にするやつがいるよな 同じやつなのか?それともRuby使ってるやつってこんなのばっか?
例えば教育目的では使えるんでないかなあ 確か昨年のRuby会議で、Rubyを教育に使ってみましたって事例が報告されていたと思う 記述の抽象度が高くて、「おまじない」がほとんど必要ないので、 アルゴリズムの学習とかには向いていたとか。対話環境もあるし
自分が欲しいものをつくるのが一番勉強になるんだけど、 それをつくるには、Ruby以外の知識がたくさん必要になる
CやJavaで欲しいものを作ってみるよりは、周辺知識が少なくて済むと言ってみる
まぁ正直いって今からRuby始めるくらいならPythonのほうがいいだろうなぁ。 昔のRubyブームに乗っかっちゃって、もう今さら違う言語覚える気力無ぇよ という人のための言語になりつつある今のRubyは。
お前方々で頑張り過ぎだ
そんなことばっか書いてるなら、 意義のあるプログラムの一つでも作れよ
>>460 > /hoge/i.to_yaml
=> "--- !ruby/regexp /hoge/i\n"
とか出てきました。
!ruby/regexp
とかものすごい実装依存な気がするwww まあいっかw
>>463 なのですが、
> Regexp.new(YAML.load("!ruby/regexp /hoge/i"))
=> /hoge/i
だとOKなのですが、
> Regexp.new("/hoge/i")
=> /\/hoge\/i/
だと駄目っぽいです。
上で「まあいっかw」っていいましたけど、
正規表現リテラルを表すStringから一発で正規表現へ変換ってできたらなあ・・・
!で型を指定する記法自体はYAMLの仕様に明記されていることだが、 Cプリプロセッサの#pragmaの解釈が処理系依存であるというのと 同様の意味で処理系依存ではある。
今みたいにGUI前提の環境だと、rubyは取っ付きにくいねえ。 まあ松本教祖がGUI否定だから信者は従うしか無いけど。 若い学生が興味を持ってくれる言語にしないと、将来寂れていくと思う。rubyユーザ高齢化問題。
俺はRubyでニコニコ動画プレイヤー作って使ってるよ
rs = "/hoge/i" re = Regexp.new(YAML.load("!ruby/regexp " + rs)) 何が不満?
GUIGUI言うけどrubyだってtkが標準添付してるだろ、tcl/tkが別途必要だけど OS非依存でGUIライブラリが完全に標準添付されてるスクリプト言語て何よ
>>548 GUI前提の環境で取っ付きやすい言語ってなんだ?
まさか VisualBasic?www
いや、もしかして HSP か?w
すくなくとも Ruby ではないな
ではなんなんだ?
どうでもいいけど「教祖」って言葉を使うやつには注意した方がいいと思う なんか色々と臭ってくる
>>552 普通に、Delphiとか.NET系じゃないのか?
そろそろWxRubyを標準添付してもいいんじゃないかと思うんだ
それ賛成 でも多分もめると思う
>>550 それだ!回りくどいけどそれで行きますw
サンクス
じゃあQtで
結局、数ある GUIツールキットの中からどれか一つを公式サポートってのは 難しいんじゃないの? なんつーか政治的に 個人的には、Ruby/Tk を置き換えるんなら wxRuby がいいと思ってる 多分一番環境依存度が低いと思うし
564 :
563 :2009/03/22(日) 10:58:55
いや、やっぱあんま自信ないやw ごめんw
565 :
デフォルトの名無しさん :2009/03/22(日) 13:00:40
>>556 松本教祖様を聞いて真っ先に長野の事件を思い出した。
コミット権を取り上げかけられる教祖?
567 :
デフォルトの名無しさん :2009/03/22(日) 13:10:00
GTKを忘れないで・・・
Pythonのtkinterは標準添付だっけ? と14年前の知識レベルで尋ねてみる。
569 :
563 :2009/03/22(日) 13:17:32
>>567 wxWidgets が GTK 自体をラップしているという事実
>>568 標準添付。Python入れたら間違いなく使えるってのはかなりデカイ
rubyのtkも標準添付だよね。
require 'tk' Tk.mainloop で大抵の環境ではウィンドウが開くはず
動くけどさぁ…
IronRubyは?
GUIとかGAMEとか言ってる香具師は、HSPでもPythonでもやってろよ Rubyはそんなことをするためにあるんじゃない! まあ冗談はさておき、一回取り入れると、外せなくなるからなぁ そろそろSQLiteくらいは入れても・・・とは思うんだが。 PHPやHSPに喧嘩売ったときには、本気出すのかと期待したんだけどw
その前に gem を標準添付にしてもらいたい
RPGツクールってソフトがRuby採用してる それでどこまでできるのか、速度はでるかわからんが 簡単なシューティングゲームぐらいなら作れるようだ
>>578 なぜにRPGツクールでシューティングゲームを作る必要があるんだ?
>>579 それは難しい質問だなw
どの程度できるのか軽くググったら
シューティングやアクションも作られてるようだったからさ
簡単なゲームが作りたいだけなら、Flashという選択肢もあるんだが誰も言及しないw Adobeのが有料だからか?
TortoiseHgで使われているあれいい感じなんだけど、PythonのなんていうGUIツールキット? Rubyでも相当するのあるのかな?
変数展開で質問です a = "#{pattern}" としたときに、 a を変数展開して pattern = "want_to_replace_this" の場合と pattern = "want_to_replace_that" の場合でそれぞれwant_to_...に置き換えたいのですが print "#{a}"としても #{pattern} と表示されるだけです。 目的のことをするにはどういうコードを書けばいいのでしょう? 変数展開時に展開される変数を動的に取りたいのですが・・・
>>585 自分ならString#%を使う。
str = "want_to_replace_%s"
puts str % "this"
puts str % "that"
>>585 書いてあるとおりに実行すると、
a = "#{pattern}"
の段階で展開されない?petternが未定義だとエラーだし。
変数の中身を動的に置き換えるのが素直だろうし、何のためにそれを
やりたいのか書くといいかも
>>586-587 さっそくに回答ありがとうございます。
patternを100個くらい配列化しておいて
ランダムに(順にでもいいのですが)1つを選びます。
選んだ時点で初めて置き換える内容を定めて
その内容で置き換える、という動作にしたいのです。
586さんの例で言うと
"this" "that"の部分はそのコードを書く時点では
未定なので、具体的には書けないのです。
>>587 すみません、
a = '#{pattern}'
でした。
589 :
デフォルトの名無しさん :2009/03/22(日) 18:02:21
>>588 シングルクオートじゃ展開されないんじゃ・・・?
>>588 > 586さんの例で言うと
> "this" "that"の部分はそのコードを書く時点では
> 未定なので、具体的には書けないのです。
それは展開する「データをどう持ってくるか」という話であって、
「どう展開するか」は
>>586 でできるだろ。
591 :
デフォルトの名無しさん :2009/03/22(日) 18:07:57
return が無いのって違和感ありませんか? Perlをやっているみたいです ><
>>591 Lispをやると違和感なくなるよ、これマジ
>>591 まぁ言語仕様で使えるんだから仕方ないんじゃないの。
自分はとりあえずreturn付ける事にしてるけど。
おれも最初は違和感あったけどすぐに慣れた。 別に書いちゃいけないわけじゃないし。 「わかりきってるものは書かなくてもいい」というのは割と居心地がいい。 それにRubyはなんでも戻り値を持つから、 強制されたら大変なことになってしまう。 if文の中にもreturn必須とかになるぞ。
>>588 data = ["this", "that"]
template = "want_to_replace_%s"
data.each {|v| puts template % v }
もしこれでもわからないなら、具体的な入力データと得たい出力を明記して。
>>590 それが・・・置き換える部分は一箇所ではなくて
かつ、その順序も選んでくる配列の要素により不定なので
str1 = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' ]
str2 = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' ]
a = "want_to_replace_%s_%s"
としたとして
puts a % [ str1[rand(str1.size)], str2[rand(str2.size)] ]
という結果を得たい場合もsれば
puts a % [ str2[rand(str2.size)], str1[rand(str1.size)] ]
という結果を得たい場合もあるのです。
case rand(N)
when 0
puts "#{str1} #{str2}"
when 1
puts "#{str2} #{str1}"
....
when N
puts "..."
end
みたいに網羅するしかないですか。
597 :
デフォルトの名無しさん :2009/03/22(日) 18:26:49
module Test def test2 puts "test2" end def test1 puts "test1" test2 end module_function:test1 end Test::test1 のように書くと undefined local variable or method `test2' となります。test2 が undefined なのはどうしてですか? (defしてるやん)
>>596 [str1, str2, ... strN] な配列を適当にシャッフルしたら?
>>596 あんまり深く考えていないけど、複雑な処理で文字列を作成するのなら
文字列展開一発でやろうとせずに関数化するかなあ
ERBみたいなテンプレートシステムを上手く使ったりできるかも知れない
>>597 うむ、ほぼ100パーセント引っかかるな、これ
とりあえず、Testというクラスは標準添付ライブラリに存在するので、例示でも使わないほうがよい
FooとかHogeとかCとかが一般的
で、クラスメソッドはインスタンスメソッドを特別扱いしない
Testクラスのインスタンスなんかどこにもないんだから、考えてみたら当たり前の話
クラスメソッドtest1の中で t = Test.new; t.test1 とかするか、そもそもインスタンスメソッドを使わない構造にする
t = Test.new t.test2 だった 内容にもよるけど、 俺なら、test2 もクラスメソッドにして、 クラス内で test2 を呼んでるとこを全部クラスメソッドに書き直す
603 :
デフォルトの名無しさん :2009/03/22(日) 18:43:58
>>600 なるほど! selfどこに付けるんだろうと私の感覚だとtest1から呼ぶときに
self.test2で呼ぶのかとおもいましたが def self.test2 と定義するのですね
んでもこれ inckude すると Test::test2 で呼べちゃう
明示的にprivateにできないのですか?
>>596 data1 = [1,2,3,4,5]
data2 = ["a","b","c","d","e"]
template = "%s and %s"
def pickup(ary)
ary[rand(ary.length)]
end
10.times do
a = [pickup(data1), pickup(data2)].sort_by { rand }
puts template % a
end
順序が変わる時はテンプレートも変わるなんていう後出しはやめてくれよ?
>>604 後出しも何も、もともとその可能性のある質問のような気もするが・・・
質問者を萎縮させてどうするw
>>585 で最終的に展開したい変数名が「pattern」なのが気になってエスパーしきれない俺。
>>603 def self.test2
puts "test2"
end
private_class_method :test2
かな
>>603 > んでもこれ inckude すると Test::test2 で呼べちゃう
include して呼べるようになるのはインスタンスメソッドの方
クラスメソッドと module_function したインスタンスメソッドは include しなくても
require した段階で呼べるようになってるよ
後、module_function はインスタンスメソッドを「複製」して同じ内容のクラスメソッドを
生成してるので、インスタンスメソッドの方も定義は残ってるから注意
rubyってフラッシュプレーヤも作れるのか。javaは越えたな。
609 :
596 :2009/03/22(日) 20:20:04
何度もすみません。
>>604 その例で言うと、下から3行目の
> a = [pickup(data1), pickup(data2)].sort_by { rand }
この部分で、
pickup(data1), pickup(data2), ... の個数&順番が可変なのです。
pickup(data1), pickup(data2) かもしれないし
pickup(data2), pickup(data1) かもしれなくて
pickup(data2), pickup(data1) pickup(data4), pickup(data3) かもしれないし
pickup(data3), pickup(data1) pickup(data1), pickup(data4) なのかもしれない。
その組み合わせはあらかじめ(たとえば100パターンくらい)決まっているのですが、
変数部分に埋め込むデータは実行時に決まるのでどう処理したらいいのか・・・。
610 :
デフォルトの名無しさん :2009/03/22(日) 20:23:39
>>608 ダウンロードだけして外部のプレイヤーに投げているんじゃないの?
>>585 を見ると単に eval をしたいんじゃないの?
a = '#{pattern}'
pattern = "want to replace this"
eval "a=\"#{a}\""
print "#{a}"
ファイル名、サイズ、タイムスタンプといった複合データをちょっと格納するとき 安易に f[0] = fname f[1] = fsize f[2] = ftime とかやって可読性を落としちゃうんだけど いちいちクラス定義することなく f.name f.size f.time みたいなプロパティでっちあげる方法ってないんですかね。JSのハッシュのキーみたいな感じで。
>>609 おそらく、もっと具体的に何をしたいのかを書いた方が良い
(テクニックに関する話ではなく、「コードで実現したいことは何なのか」を)
今の質問では抽象的すぎて回答者が答えにくいし、答えたとしても的外れになる恐れがある
>>609 >pickup(data1), pickup(data2) かもしれないし
>pickup(data2), pickup(data1) かもしれなくて
>pickup(data2), pickup(data1) pickup(data4), pickup(data3) かもしれないし
>pickup(data3), pickup(data1) pickup(data1), pickup(data4) なのかもしれない。
data1 = [1,2,3,4,5]
data2 = ["a","b","c","d","e"]
data3 = [11,22,33,44,55]
data4 = ["aa","bb","cc","dd","ee"]
pattern = [
["%s %s", data1, data2],
["%s %s", data2, data1],
["%s %s %s %s", data2, data1, data4, data3],
["%s %s %s %s", data3, data1, data1, data4]
]
10.times do
pat = pickup(pattern).dup
temp = pat.shift
list = pat.map {|a| pickup(a) }
puts temp % list
end
>>612 そんなあなたに Struct
FileStat = Struct.new(:name, :size, time)
FileStat.new(fname, fstat, ftime)
617 :
616 :2009/03/22(日) 21:04:12
ミスったorz new の引数はみんなシンボルね Struct.new で prototype みたいなものができるぞな
JSみたいにと言われて、奥義method_missingを使いそうになったw
619 :
612 :2009/03/22(日) 21:35:30
サンクス。だいぶ簡潔になったよ。 FileStat = Struct.new(:name, :size, :time) s = Time.now for i in 1..100000 do f = FileStat.new(1, 2, 3) end puts Time.now - s s = Time.now for i in 1..100000 do f = Struct.new(:name, :size, :time).new(1, 2, 3) end puts Time.now - s 0.282 15.672 さすがに後者は無茶すぎたか…
>>612 クラス作る場合でもそれほど面倒じゃないと思うよ。
class FileStat
attr_accessor :name, :size, :time
end
f = FileStat.new
f.name = fname
f.size = fsize
f.time = ftime
>>612 require 'ostruct'
f = OpenStruct.new
f.name = fname
f.size = fsize
f.time = ftime
622 :
618 :2009/03/22(日) 21:46:47
>>505 あ、Private Pocketsの人だ
| | J Strict OpenStrict
>>604 1.8.7や1.9.1だとArray#sampleというのがあるよ
>>625 use strict;
しとけば書き込む前に警告が出たかもなw
今更だけど、
>>585 ,588,596,609 を読んでみた。何度読み返しても意味不明だったけど、頑張ってエスパーしてみる。
>>585 これって、通常は #{var} が使われるまえには var は決まっている、つまり
name = "world"
str = "Hello #{name}"
とするのが普通だけど、585がやりたいのはさきに
str = 'Hello #{name}'
というのが決まってて、あとから name = "world" を与えたいということだとエスパーした。
もしそうだとしたら、eRuby を使うのが自然なように思う。
str = "Hello <%= name %>"
name= "world"
require "erb"
print ERB.new(str).result(binding())
あるいは #{name} を hash["name"] の値で置き換えるだけでいいなら、こんなのでいいかも。
str = "Hello #{name}"
hash = {"name"=>"world"}
print str.gsub(/¥#¥{(¥w+)¥}/) { hash[$1] }
そもそも本当にそんなことをする必要があるのだろうか?
という方向で考えてみた方がいいような気がするな
>>585 発想の転換が必要なところじゃないか
Cというクラスを作った後に c = C.new とすると C.new でオブジェクトが生成されて そのオブジェクトを参照するためのアドレスの様な物が戻り値で c に渡される ここまであってるでしょうか? その後 c = nil などとした場合でも C.new で生成されたオブジェクトはメモリに残るのでしょうか? そうだとしたら開放した方がいいのでしょうか?
>ここまであってるでしょうか? あってる >その後 c = nil などとした場合でも C.new で生成されたオブジェクトはメモリに残るのでしょうか? >そうだとしたら開放した方がいいのでしょうか? nil突っ込むと参照切られてガーベッジコレクションの対象になってそのうち破棄される。 ほっておいていいよ。
素早い回答ありがとうございました
便乗だけど、Rubyでメモリリークの起こりうる書き方ってありますか? 言語の不具合によらず。
class Hoge def initialize @h = Hoge.new p "hoge" end end p Hoge.new
微妙にリークとガベコレされないのとはニュアンスが違うような同じような
>>635 まだマーク&スイープだよね?
参照されてるかではなくルートから辿れるかだから循環参照は回収される。
>>634 ,635
回答ありがとうございます。
それだと無限ループで例外発生?
でも循環参照は危ないって事でいいんでしょうか。
>>635 MRIのGCはリファレンスカウントじゃなくてマーク&スイープだから、その心配は無い
有効期間が長い、例えばクラス変数とかグローバル変数に
オブジェクトを突っ込んだまま忘れた、とかだと、事実上のメモリリークになる恐れがある
640 :
デフォルトの名無しさん :2009/03/24(火) 15:16:11
Railsで運用中にメモリばんばん喰って落ちることがある (リークがあるのかどうか知らないけど) OS全体の挙動は全然問題なくて他のプロセスも平気で動いてる Railsだけ再起動するとちゃんと元に戻る これってメモリリーク?
>>634 はメモリリークではなくてスタックオーバーフローが起こると思う。
不具合は発生するだろうけど、メモリリークではない。
>>635 GCのアルゴリズムによる
Rubyではマーク&スイープを使ってるから循環参照が問題になることはない
>633
Rubyの文法上ではメモリリークするような書き方はできないと思う。
メモリリークするような拡張ライブラリはあるかもしれない
資源の解放忘れをするクラスを用意すれば、メモリリークは起きると思う
>640 Railaのアプリのメモリ使用量をログに書き出すようにしないとわからない DBのメモリ使用量が一時的に多くなったのかもしれないし とりあえず、WEBサーバ、SQLサーバ、その他gemで導入したライブラリのプロセス、 のメモリ使用量を一定時間ごとに調べなされ
侍ジャパン優勝で日本中が沸いてるのに Rubyとか言ってる奴なんなの?ほんとに愛国者なの?
【我 が 道 を 行 く】 サ ム ラ イ 言 語 R u b y 【妥 協 し ま せ ん】
>>641 サンクス
>>644 熱狂している時にも冷静な奴が居ないとダメだろうってマジレスしておく
WBC見終わった俺がきましたよ callccやThreadで保存されたスタックから参照されてるオブジェクトがなかな か解放されない、という話はあるな。
>>633 >便乗だけど、Rubyでメモリリークの起こりうる書き方ってありますか?
>言語の不具合によらず。
Rubyは保守的GCなので、運悪くポインタっぽい値がどっかにあるとメモリが回収されない。
649 :
633 :2009/03/24(火) 16:52:19
皆さんご回答ありがとうございました。
>>648 だけが少しわからないので気になりますが、とりあえず大丈夫そうなので安心?しました。
マーク&スイープ方式ってのは、ヒープ上にあるデータのうち、グローバル なデータ領域やスタックなど確実に使用中と分かるデータとして置かれてい るポインタを基点として、連鎖的にたどれるものに、到達可能の印を付けて (マーク)、次にヒープ上のデータで印がないものを未使用とみなして掃除(ス イープ)する。 基点にした領域にはただの数値データも置いてあったりするわけだが、そい つは意味のあるアドレスを指したポインタ値に見えてしまう(実際にはポイン タではないのに)こともある。本当のポインタと区別が付かないので、安全措 置(へたにデータを消してしまうのを回避)として、これらをポインタとみなす GCのを「保守的GC」という。 本来ポインタでないものが保守的にポインタとみなされ、それからたどれて しまったデータは、到達可能マークが付いてしまう。よってスイープ対象外 になる(=完全なGCにならない)。
>>648 >Rubyは保守的GCなので、運悪くポインタっぽい値がどっかにあるとメモリが回収されない。
もしかしてテキストデータを扱うスクリプトよりも
バイナリデータを扱うスクリプトの方が
そういう「勘違い」でリーク起き易いってことですか?
>>650 勉強のために質問
Ruby の実装では Fixnum とか Symbol みたいな即値はアドレスと区別できるように
ビットシフトして4の倍数にならないようにしてるよね確か
とすると、アドレスと区別できない数値データというのは具体的に何なの?
>>651 C言語とコンパイラの基本動作の知識はある?
>>652 >とすると、アドレスと区別できない数値データというのは具体的に何なの?
なんだろうね。拡張ライブラリとかだと存在するのかな?
655 :
652 :2009/03/24(火) 18:41:31
> ビットシフトして ビットシフト&適当なビット演算 ね
Rubyのインタプリタは生のスタックを処理系のスタックのひとつとしても使っていて、 それがGCのrootになるからじゃないかな?
657 :
652 :2009/03/24(火) 19:09:13
>>656 C の自動変数がたまたま有効なアドレス値になったらってことか
よくそんな仕組みで Segmentaton fault が起きないなあ
>>653 > C言語とコンパイラの基本動作の知識はある?
まあそれなりに
yacc 使って俺様言語のインタプリタを作ろうとした、ことならあるぞw
658 :
デフォルトの名無しさん :2009/03/24(火) 19:37:39
ゲームでRPGのMAP作る時って、RPGツクールみたいなマップチップ使うのか、一枚絵で通れる場所通れない場所を決めていくのどっち が普通?
ごめんちょっとスレ違いだったかも知れんな。
>>658 どっちも普通。都合のいい方で。
どっちのほうが多いかは知らないし完全にスレ違いだと思う。
>>657 積極的に捨てる方ならSegmentaton fault出そうだけど
残すんだから出ないってことでは?
>>661 いや、そこを起点に到達可能なものにマークを付けていくんなら
そのアドレスを dereference しないといけないはずだから、もしそこが領域外を指してたら
落ちるやんと思って
でもさすがにそうはならないようにチェックはしてるんだろう
まあ、ソース読め、という話だけど
Rubyのヒープが存在するアドレスの範囲は分かるのでそれと比較する
参照先を間違ってオブジェクトとみなすとこまではいいとして 全然関係ないものに >到達可能の印を付けて (マーク) をやっちゃうとやばいんじゃないの?
えらく内部実装にこだわってる人がいるみたいだが、そこまでいくと ソースを読むのがいいのでは。すくなくともスレ違いだと思う。
初心者が怖気づいたらカワイソスではある
>>662 領域外を指してるアドレスは、有効なアドレス値じゃないから問題ないだろ
まあSymbolは2度と使わないのも番号割り当てられることに 注意。たとえばこんなプログラムを動かせば確実に落ちる 100000000.times do |i| s=i.to_s.to_sym end 100000000っつーところを適当な数字に書き換えれば確実に落ちる。 やってること ひたすら無意味なシンボルを多数生成させる(数字文字列もシンボル化可能) うちの環境だと約200万個のシンボルを生成したところでRuntimeErrorが生成された。 その際の例外は以下の通り -:2:in `to_sym': symbol table overflow (symbol 2095695) (RuntimeError)
オブジェクトの参照の仕方と参照の取り消す方法がどうかが問題なんだな 全然関係ないものをオブジェクトが参照しているということは考えなくてもいいと思う これはGCのアルゴリズム云々の問題じゃなくて純粋にRubyのバグだからね。
なんでRubyのアイコンはショボイのか教えてくれ
アイコンなんかにこだわるのはマカぐらいだし。
cgi.rbがしょぼいのと同じ理由
cgi.rbは、もはやゴミ。
>>670 コマンドラインの世界には不要なものだから、でFAじゃないか
Ruby のアイコンが気になる人とそもそもそれを拝む機会のない人では Ruby の使用形態がかなり違うような気がするな 俺は Windows で Ruby っていうと Cygwin なので、そもそもアイコンなど 気にしたこともなかった アイコンが気になる、それを拝む機会があるってことは、Explorer から ダブルクリックしてスクリプト起動とか? そっちは未知の領域だなあ コマンドラインにない面白い使い方とかあるなら聞いてみたい
アホだなこいつはw
いかにもな信者コミュニティ的頑張り方
679 :
676 :2009/03/25(水) 07:13:41
いや、純粋にアイコンが気になる使い方ってどんなものか気になっただけなんだけど お前ら曲解し過ぎじゃね……
680 :
デフォルトの名無しさん :2009/03/25(水) 07:14:59
>それを拝む機会があるってことは、Explorer から >ダブルクリックしてスクリプト起動とか? そういう用途なら自前のアイコンで置き換えますね
>>680 確かに
いろんなスクリプトが全部同じアイコンだと意味ないし
結論 Rubyの外婚出材がん気になる奴は低スキルの馬鹿 はい、論破完了
684 :
676 :2009/03/25(水) 07:26:34
>>681 俺はなにも指摘などしていないのだが……
見てるこっちまで恥ずかしくなってくるレスだな
初心者ですからっ
相手がいないと論争できないというRubyユーザーの底辺っぷりには反吐が出る
へぇ、どうかなあ
VITのRuby Logoを縮小して、実行ファイルのアイコンにするといい感じになるよ
ttp://rubyidentity.org/ あと「ruby icon」や「ruby logo」で検索して、英語サイトを探すと
色々オシャレな画像が出てくるのでその辺を探してみるのもいいかも
>>676 一番気になるのはexerbで固めたときの実行ファイルかな
一般の人の目に付く機会が多いから
>>673 おお、いいねこれ。ruby consoleは変更できないの?
Ubuntuでもメニューに登録されてるPythonコンソールのアイコンはかっこいい。 Irbをインスコしてもアイコンは登録されない・・・
っていうか、公式でアイコンはすでに募集しただろうが 文句言うならかっちょええの送ればよかったのに
>>692 ショートカットのプロパティで設定できないか?
公式とか関係ない話だし
アイコン関係ないとか言うやつは、 少なくとも一般ユーザーにサービスを提供するセンスはない
Rubyにアイコンはないよ アイコンつけて配布してるのは公式じゃない
>>700 フイタ、それショートカットじゃねーよw
exeのアイコン変えるにはリソース書き換えないと。
>>701 え、リソース書き換えエディタみたいなソフトをとってくればいいの?PC探してもショートカットしか見つからない
あれリンク先の本体無いよね どうやって作ってあるのかよくわからん
すまんASRか。入れてないから調べられないけど たぶんゴミ箱とかと同じでレジストリ。
リンク先がクレーアウトして選択できないのはアドバタイズショートカットだな 素人さんや外部プログラムによって変更されてしまわないように Windows Installer によって作成された特別なショートカットだ
>>694 公式のあれはロゴ募集であってアイコン募集ではない
ついでに言うと、「かっちょええの送ればいい」と簡単に言うが
実際に公式ロゴとして選ばれたロゴはかなり不評だったぞ
自分で好きなアイコン仕込んだバイナリ作って配布すりゃいいんじゃね?
>>700 Ruby ConsoleはOffice同様特殊なショートカットになってるから実態がどうなってるのかよくわからないな。
あれって何を起動してるんだろうか。
とりあえずruby.exeのショートカット作ってアイコン変えてデスクトップに登録してみたら。
自分はあれ使ったことないんだけど
set path=C:\Program Files\asr\ruby.exe
ruby.exe
みたいな起動以外の事をやってたりするんだろうか。
exeのアイコンを直接書き換えるならリソースハッカー使えば出来るけどそれはちょっとイレギュラーだな。
関連づけしてないので多分アイコンはウィンドウズマークのままだorz
EclipseとAptana Studioを使っています。 Rubyエディターで1.9から導入された記法で hash = {key1: 'value1', key2: 'value2'} のように記述するとエラーマークがつきます。 実行すれば正しく実行されるのですが、 このエラーマークは回避できるでしょうか。
そのソフト側が対応するまで待て
やっぱりそうですかね。 警告はあるていどカスタマイズできるみたいなんですが。
カスタマイズも何も、その記法をそもそも知らんのだろ
>>714 そうですね。
それは仕方ないので、
ハッシュ系の文法チェックを切れたりしたらいいなと思ったんですが、
やっぱりそんなものありませんでした。
自分で書くぶんには回避すればいいだけだが、既存のスクリプトでエラー報告されるのはなかなか辛いな っていうか、これそんなに使うか?
author = s.scan(/<author>(.+?)<\/author>/i) の正規表現を名前付きで捕獲したくて author = s.scan(/<author>(?<author>.+?)<\/author>/i) とすると author = s.scan(/<author>(.+?)<\/author>/i) のエラーになります。なぜでしょうか?
718 :
717 :2009/03/25(水) 18:52:12
>>717 あ、エラーは下記です(^^;;;
undefined (?...) sequence:
>>717 そりゃおめえ、ruby 1.8を使ってるからだよ。
>>717 日本語でおk、と言いたいが、とりあえずタイポは無い?
正規表現の文法エラーだと思う。
(?:<author
なのか
(?<=author
なのか
(<author
なのか。
何がしたいのかよくわからないから、ちょっとわからない
721 :
720 :2009/03/25(水) 19:00:47
ごめん。"author"の「名前付き」で取りたかったのね。
ちゃんと書いてあるw
ってことは
>>719 か。
しっかし紛らわしいなこの辺の書式
普通にMatchDataとか$1とかで陽に名前付けろ
>>722 えーおれ普通に正規表現中にコメント書いてるけど
>>716 自分は「=>」が面倒なので気に入りました。
コロンの方がとても打ちやすいように思います。
はじめまして,Ruby on Railsについて質問をさせていただきます. 現在,Rails上で,ある画像サムネイルをクリックすれば,ポップアップ上に大きな画像を表示するというものを作ってみたいのですが,以下の点がわかりません. 1. Rails上から,PostgreSQLにアクセスするためにはどのようにすればよいのでしょうか? 具体的には,rubyでは,require "postgres"と書けばよかったのですが,これをどこに書けばよいのでしょうか? それとも,そもそもそのようなことはしなくても,PostgreSQLにアクセスをすることができ,queryを投げることが可能なのでしょうか? 2. 現在,データベースにアクセスした後の処理部分(データベースを検索し,その画像の元ファイルが存在する部分を探すクラス)については クラスをrubyで作成したのですが,それをRails上から利用するためにはどのようにすればよろしいのでしょうか? 環境は OS : [Fedora8] Ruby : [1.86] Rails : [2.11] となっております. よろしくお願い申し上げます.
Railsを使うなら、まずRailsのやり方を、画像のことは忘れて 勉強してください。
728 :
717 :2009/03/26(木) 09:30:19
バージョンを書かずにすみませんでした。1.8.6 です。 1.8 は名前付きキャプチャができないんですね。意外でした。 いろいろアドバイスありがとうございましたー。
>>728 名前付きキャプチャは1.9からの新機能。
正規表現エンジンそのものにも関わるので、1.8に降りてくることはないと思う。
731 :
730 :2009/03/26(木) 11:21:44
自己解決しました。 %r という「正規表現リテラル」があったのですね。
本屋で手にとって見てみたが、ちょっとイマイチだったような覚えがある 結城浩あたりがRuby本出してくれないだろうか
価格で合格点 そのへんのブログでやれば人気出そうな内容だが、書籍という形にしたことを大きく評価 ふと気づいたら最近はHTMLを正規表現でscanしかしてないという人向け
735 :
デフォルトの名無しさん :2009/03/27(金) 11:18:29
PythonでlxmlやBeautifulSoupに相当するものは Rubyだと何がありますか?
>>732 そんなの出てたんだ
arton先生にお布施だな
質問:
Hashで、指定したキーのペアだけを取り出すというメソッドありますか。
{:x=>10, :y=>20, :z=>30}.get_at(:y, :z) #=> {:y=>20, :z=>30}
みたいなの。
>>735 XMLパーサだよね? REXMLやNokogiriじゃないかな。
よし、某変態パーサの時代は終わったな
>>735 とりあえず動けばいいならRubyful Soupっていう移植版がある
メンテ終わってるからお勧めできないけど
>>738 あれがないとまともに動作しないライブラリがあるんですが
(次バージョンで直る予定)
ってかなんでもかんでも UTF-8 に内部変換して返すんじゃねえ
それはそうと、Nokogiri 使うのが最近の流行だと思う
>>737 ありません
…なぜか「ハッシュから指定のものをハッシュで返す」というメソッドが
標準装備されてないんだよね
>>740 ありがとうございます。ないということなので、自分で追加することにします。
パーサも中でスキャンしてるのには変わりないけどな。
>>738 Shift_JISをShift_JISのまま返せる高速XMLパーサはRubyではあれだけだぞ
ある文字列中に置いて、別の部分文字列や正規表現がマッチする数を数えようとしています。 今のところ str.scan("substr").length や str.scan(pattern/).length を使っているんですが、 もっとうまい方法があれば教えてください。
>>741 まあこうすりゃいいよな
class Hash
def get_at(*args)
ret=Hash.new
args.each do |opt|
ret[opt]=self[opt]
end
ret
end
end
>>744 マッチする数を数えるということにそれ以外の方法があるとして、たとえばどんなん?
少し質問があります。 Rspecのspecファイル内で、他のspecファイルと共有したいメソッドなどが出てきた場合は どう整理したものでしょうか?(リファクタリング?というのでしょうか?テストファイルの、ですが) 共有化するはshare_asとinclude ででできるみたいなのですが、他のファイルで使う場合どおしたものか?と思いまして share_as :HogeMage do end describe "When amgemoge" include HogeMage : end
748 :
747 :2009/03/27(金) 19:14:15
>>747 事故解決というか、こんな感じでできましたけど、こんなんでいいのだろうか?
rspec流だとどういう風にするんだろう……。
-----spec/spec_common.rb
unless defined?(SpecCommon) # warning: already initialized constant SpecCommon 防止
share_as :SpecCommon do
def example_method
puts "Babooo!!"
end
end
end
---------
spec_herlper.rbあたりに、
require File.dirname(__FILE__) + '/spec_common.rb'
と書いて、各specにて、
describe "When amgemoge"
include SpecCommon
:
end
という感じです。
>>744 もっとうまい方法、というからには今のやり方に不満があるようだけど
具体的に何が不満?
もっと短くできないかということなのか、
中間で配列が生成されるのがキモイってことなのか。
前者ならメソッド書けばいいし、
後者なら scan にブロック渡してそこでカウントするって方法があることにはある。
750 :
デフォルトの名無しさん :2009/03/27(金) 19:55:53
>>733 書籍はそのうちでるんじゃないかな?
書いてるような記事 見たことがある
FasterCSVを使っている人いますか? csv = FasterCSV.read(filename, :encoding => 'sjis') みたいに読み込んでいるのですが、ファイルによっては、 Unquoted fields do not allow \r or \n (line 1). といわれてしまいます。 これはどうやって解決したものでしょうか? header => true もreadのオプションで加えてみたのですが、同じでした roz
753 :
デフォルトの名無しさん :2009/03/28(土) 02:16:21
今、rubyでちょっとしたダウンローダースクリプトを書いているんですが、 wgetのように、進捗状況を表示させたいと思っています。 例えば100個のファイルをダウンロードするとしたら、 /home/hoge> ./downloader.rb ただいまダウンロード中。。。進捗(5/100) ↑こんな感じで、表示させたいです。画面スクロールしないで、5/100の部分 だけ書きかわるイメージです。うまい方法をご存知の方ご教示下さい。
curses を使うのが無難だが、ちと大仰 ものすごく簡単には、バックペースを表示すればいい print "残り時間:"; 1.upto(100){|n| print "%3i/100" % n; print 8.chr*7; sleep 0.1}
あ、sleep の場所がまずいな まあ、好きなとこでどうにかしてくれ ポイントは表示を戻したいバイト数のぶんだけ 8.chr を print で表示することだ "%3i/100" % は必ず7バイトだから、 7バイト表示後に7バイト戻して次のループで7バイト表示して7バイト消して…を繰り返すことで アニメーションさせている
>>754 便乗すんません
面白そうなのでやってみたけど、Windowsでは動いたがDebian(etch)では動かないです(´・ω・`)
これは、バックスペースの文字コードが違うとかsleepの仕様が違うとかそういうことでしょうか・・・
似てるけどちょっと違う 100.times {|n| print "\r残り時間:%3i/100"%n ; sleep 0.1 }
>>758 概念キモいな(w
>>757 >>758 なら^hがバックスペースでないコンソールでもたぶん動く
キャリッジリターンを表示してカーソルを行頭に持ってきて表示、を毎回行ってるパターン
どっちも制御文字がナチュラルに選択肢に入るオッサンだと推測
\r だと Macで意図通りに動かなそうな気がしなくもないが、偏見かもしれない まーだからこそ curses が環境差異を吸収してるんだろうけどな 他環境で実行する予定があるならカーソルいじらずに素直に curses 使え
>>759 むう。だめですた。
まあきっとこれは、puttyを経由してるからだと思うことにしますた。
>>754 753です。早速のレスありがとうございます。
なんとか望む物ができそうです!ありがとうございます!
windowsとmacの両方で動かしたいので、
cursesも使ってみましたが、init_screenすると
新しい画面になってしまうのが、ちょっといやんな感じでした。
元の画面のままcursesを使う事ってできないもんでしょうか。。。
>>761 だからそのPutty経由でうまくいってるん
…あーわかったすまん、flush してくれ
100.times {|n| print "\r残り時間:%3i/100"%n; $stdout.flush; sleep 0.1 }
または
$stdout.sync = true
100.times {|n| print "\r残り時間:%3i/100"%n ;sleep 0.1 }
これなら動作する
764 :
761 :2009/03/28(土) 03:29:20
>>763 動きました!便乗にもおつきあい頂きありがとうございました
つーか、wgetみたいにしたいなら、wgetのソース嫁って気がwww
俺のエロ動画ダウンローダ system("wget", url) wgetみたいに動く
いまどきのMacはUNIXなので改行コードも¥rじゃなくなってるよん。 $ echo "aaa¥rbbb" bbb
Ruby の公式 MLって Gmail だと弾かれたりするんですか?
Subscribe のメールを
[email protected] 宛てに送っても
確認のメールが送られてこないんですけど。
こういうのって数日かかったりするもんなんですか?
俺はgmailで購読してます。
なんか本文の書式間違ってるとかなんかあるんじゃないかぬ
772 :
769 :2009/03/28(土) 04:26:05
すいません 確認のメールが迷惑メールとしてフィルタリングされてましたorz
ある意味正しくフィルタが働いてくれたんだから笑ってほめてやれ
一時期RubyMLにSPAM大量発生してた気がするけど その影響でML自体がブラックリスト入りしたのか
>>752 ああ!そういうことか!確かにありそう…。
ちょっと改行コード確認してみます。
Excelでcsv出力すると改行コードがまざるのかも。
(FasterCSV自身で出力したのは大丈夫なんですよね)
CSVでなく、FasterCSVですが1.9のコードと同じ不具合(仕様?)があるのかもしれませんね
Excelって、セル内の改行はLF、レコード区切りの改行はCR+LFとか、意味のわからない使い分けをするよね。 知ってる限り2003までは。こんなところにもMicrosoft仕様とはw
> こんなところにもMicrosoft仕様とは プッ
意味のわからない kwsk
>>774 アルファベット率とかそういうのが原因かもしれない。
ウインドウズと戦ってるデビアン廚であった。
>>732 Rubyには関数はないし、2次元配列もない
ないからこそ、普通にクラス定義の中にいる&インスタンスメソッドの関係と配列クラスとメソッド返り値で説明ができるはず
他のプログラミング言語で関数と多次元配列構造を理解してる凝り固まった人間向けの橋渡し説明でならまだしも、
「普通の」Ruby初心者に対してわざわざ遠回りで不正確で禍根を残す説明をする必要はないと思う
Rubyの本と言うより、題名どおり一般的なアルゴリズムとデータ構造の本なのでは?w
>>784 どんな内容か確かめたの?たぶん勘違いしてると思うよ。
トップレベルのメソッド定義を関数定義として扱って ひどい目にあうケースや問題点ってあったっけ あるなら漏れも関数って呼ばないことにする
>>784 俺もレシーバなしのメソッドを「関数」といちいち言ってるのは気になった
>>786 の1のほうでレシーバがあるのがメソッド、みたいなことを言ってしまったので
関数的メソッドという表現が使えなくなって関数という説明しかできなくなったのだと推測
これ全部実はインスタンスメソッドなんですぅ、とひとこと言えば理解も深まると思うんだけれど
てか、 puts メソッド、という完全に正しく問題も起こらない表現をすることの何がそんなにまずいの?
>>788 動作指示用の名称が「関数」と「メソッド」の2種類存在することになって学習を阻害しそうなこと
かな
いやさ、たとえば、puts を関数と呼ぶじゃん
puts "hoge"
これは puts 関数だよね
def output
puts "hoge" # (1)
end
(1) に書かれてるのは puts 関数だよね
def disp(s)
puts s
end
def output
disp "hoge" # (2)
end
(2) に書かれてるのは disp 関数?
c = C.new としたあとに c.disp とした途端に disp メソッドになるの?
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
792 :
デフォルトの名無しさん :2009/03/29(日) 19:53:53
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\
最近流行ってるのの中ではマ板に一番貼られちゃいけない AA のような気がする
んで、推測だけど、
>>790 の最後は、
関数呼称派の人でもおそらく「output メソッドの定義中で disp メソッドを呼ぶ」と表現すると思うんだ
本
当
は
「(基本・添付・外部)ライブラリ中でObjectクラスに定義され提供されている、レシーバが書かれないインスタンスメソッド」
のことを関数って呼んでるんだと思うんだ、関数呼称派の人は
でも、そう説明されていることをまったく見ない
Object クラスの存在を言わなければならなくなるからだ
それは不親切で不義だろうと考える
お前と俺らは「わかってる」から、それこそこまけぇこたぁどうでもいいんだが、
初心者もいるとこでの説明解説としてはやっぱ、そういうのはダメだろ
どう?
794 :
デフォルトの名無しさん :2009/03/29(日) 20:14:52
えーと、つまり関数らしきものは、実はレシーバが省略されている?メソッド という解釈でいいんですか?
Rubyを教えるのかRubyを使ってプログラミング(or 計算機科学)一般を教えるのかで大分変わるよねえ
>>794 トップレベルにおいてドット無し形式で記述できるKernel(と、ObjectとModuleとBasicObjectと、他になんかあったっけ?)クラスの
インスタンスメソッドを、Rubyでは慣習的に「関数的メソッド」と呼ぶ。
ただし、じゃあ具体的に puts のことを説明上なんて呼ぶかというと、やっぱり「puts メソッド」と呼んだりする。
puts 関数、という呼び方を頑なにしている人は、
>>793 の言うようにちょっと根性がユガんでる。
いちいち指摘する人とどっちもどっちなくらいに。
>>795 プログラミングにおける関数というものが既知な環境かどうかで完全に違うと思われ。
たとえば大学の理系1年のプログラミング実習(教官は研究室教授)みたいな場合はマジで関数と呼ぶ。
「命令を小文字で書くことができます」とか初心者には何が特記事項なのかわからない嬉々とした注釈がついてたりする。
要するに、ドット無し形式で記述できるのが悪い。
$.puts こうですか。わかりません><
799 :
デフォルトの名無しさん :2009/03/29(日) 20:43:55
曖昧になるから、これからは Kernel.puts って書こうぜ。 面倒でも。
関数形式で書きたい場合は include Kernel を書くようにする、みたいなようにすればよかったんだよ これで全部解決
801 :
デフォルトの名無しさん :2009/03/29(日) 20:53:42
何でもかんでもオブジェクト指向にするからこう無理が出てくるんだよ。 ニシキヘビを見習えや!
irb(main): ってのは変化しうるなにか重要な情報を表示してるんですかね。 出来れば取っ払いたいんですが。
>>802 取っ払うだけなら
irb --simple-prompt
長門プロンプトの作り方誰か教えて
>>802 irb_cws(Klass) で self のクラスを main から Klass に切り替えることができる
irb(main):001:0> p self
main
irb(main):002:0> irb_cws(Integer)
irb(Integer):003:0> p self
Integer
irb(Integer):004:0>
Rubyは全てがオブジェクト。putsはメソッド。 「関数」という呼び方はただの簡便的な言い方。
違いが分かってて使うならいいが、分かってなくて使うのは問題だな
>Rubyは全てがオブジェクト。 だからー、全てをオブジェクトとして考えることに無理があるとは思わないの? 本来関数として扱われる Kernel.exit とかさ、無理やりメソッドにしたおかげで Kernel.を省略しちぇー、みたいなグダグダになったんだろ?
頑張り方がよくわからない
809 :
デフォルトの名無しさん :2009/03/29(日) 22:25:59
>>807 /)
///)
/,.=゙''"/
/ i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
by 言語設計者
こんなくだらないことで言い争うのってマジでていどひくい
Rubyにlambdaってあります?
特に区別しなければならないコンテキストでなけりゃ 関数と言おうがメソッドと言おうがどっちでもいい メンバ関数と言ってもいい
Rubyが持っている、「こだわり」と「崩し」のアンバランスさの 最もわかりやすい例だろうなぁ。
>>807 無理があると思うなら使わなきゃいい。オブジェクト指向言語なんだからむしろ当たり前だと思うが。
関数大好きならCでもなんでも山ほどあるんだから、そういうの使えばいいだけのこと。
Rubyから「全部オブジェクトでできたプログラミング言語」というアイデンティティを抜いたら何も残らないぞ
>>811 lambda のように動作する lambda ならありますが、本当に lambda かどうかまでは保証できません
> オブジェクト指向言語なんだからむしろ当たり前だと思うが。 だからさ、そういう価値観の言語なのに、オブジェクトのメソッドを関数的に呼び出せるのは (関数的に呼び出せるのにオブジェクトのメソッドですとやたら言い張るのは) 「当たり前」と呼ぶにはグダグダすぎる妥協で、混乱を招くね、という話でしょ、これは。 > 関数大好きなら〜 そんなにメソッドメソッドうるさいなら関数的に使えるようにするなよ醜いなぁ、 と言っているのに対して、「関数大好きなら〜」とか返すのはズレてるよ。 Ruby及びRuby信者が「オブジェクト大好きなら、関数的メソッドなんて使えなくすればいいだけのこと」 って言われてるんだよ。
どう見ても初心者スレ向けの話題でしょ。 Rubyの言ってることとやってることが違っていて初心者を混乱させる、という話は、 既に「そういうもの」として覚えちゃってる人には関係ない。
オブジェクト指向言語なのに if や for があるのはなんでですか、という議論に近い
>>818 には本当の本当に
眩暈がするほど高度な議論
に見えちゃったのかもね
てか、レシーバが self の場合は省略できる、という動作のナニがそんなに問題なのよ
Javaでだってthis(self)は省略できて当たり前だよね
>>817 Rubyではクラスに属するサブルーチンのことをメソッドと呼んでいます
すべてのメソッドはなんらかのクラスに属しているから、メソッドではないサブルーチンというのは存在しません
マニュアルでも、とりあえずは全部メソッドと呼んだうえで俗称の注釈があるはずです
それなのに、メソッドと呼ぶことを拒んでわざわざ関数と呼ぶのはなぜですか?
>>822 そんなに問題、とは誰も言ってないのでは。
Rubyに関数は無い、というのが最初わかりにくいだけ。
君の言葉でいうと、それが「レシーバが self の場合は省略できる、という動作」であると
初心者に伝わらないことがある。「関数なんちゃら」と呼ぶ慣習とのコラボでね。
>>825 なんちゃらと濁したのは何故
「メソッド」ということばを消したのは何故?
>>824 内容的に、レス先間違えてるよ。
俺は、Rubyでは「関数」という単語を含めた呼称を(いかなる場所でも)使わないほうが
紛らわしくなくていいのでは、という立場。
俺が、誰かに、最後の行の質問をしたい。
初心者が身の程をわきまえず茶々を入れますが Kernelはクラスですか? mainはどう理解すれば一番シンプルですか? Hogeクラスの中でputsを使った場合、メソッドとしてどう解釈すれば素直でしょうか。
>>826 >>827 の通り。
関数という単語の存在が初心者の勘違いを誘う、と考えているから。
後ろに「メソッド」を付けて「ほらちゃんとメソッドって言ってるし!」とか幾ら言ったところで、
ココ、この2文字、この「関数」の2文字せいなんだ、ということが言いたいから
関数のところを抜き出した。
>>826 関数的メソッドという表現を認めてしまうとメソッドだということになってしまうから、メソッドという部分は消した
以上
Rubyでメソッドのことを関数とだけ呼んでる人は、
その人の使ってるプログラミング言語でサブプログラムのことをRuby式にメソッドと呼ぶときっと火のように怒ると思う
>>824 モジュールに属してるやつはメソッドじゃないの?
インクルードするからクラスに属するってこと?
>>830 遅いよ。
他人になりすまして屑のような回答したかったら
もっと神速を心がけるように。
>>828 #/usr/bin/ruby -Ku
class Kernel # 書かれてるが見えない
ここがトップレベル
end # 書かれてるが見えない
Kernel.new # 書かれてるが見えない
こんなもんだと思え
>>832 成りすまし?
そんなことする必要性がどこに?
個人を認識してほしければMLで話せ
>>822 それをしてプライベートメソッドと呼ぶとこがキモい
>>834 > そんなことする必要性がどこに?
必要性ということでいうと、
>>825 が
>>825 個人の行為について受けた質問を、
>>825 ではない
>>830 が答える必要性は無かったからなぁ。
必要性が無い行為を目の当たりにした直後に「必要性がどこに?」とか質問してもなぁ。
必要性がなくても、色んなことを書くものでしょ。
というか2chのレスは大抵、別に書く必要性は無いんじゃないか。
言語仕様をうまく調整することで、一部の挙動については手続き型・関数型の観点からでも 解釈できるようにしてあるってだけでしょ さすがにOOP一本槍ってのは分野を狭めることになりかねない Ruby学習の上でも、マイナスにはならんと思う Rubyでのオブジェクトというと単純には「データ構造と、それを操作する手続きを固めたもの」 だから流れとしては基本構文・データ構造を学んだ上で、最後にクラスが来るのが自然 初めはpとかの関数的メソッドは、いわゆる手続き扱いにして クラスの学習段階になってから、メソッドなりselfの省略なりって理屈を説明すればいい
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
もう30回くらいみたなこの流れ
>>833 class MyKernel
def my_puts(s)
puts s
end
class Hoge
def initialize
my_puts "done."
end
end
def initialize
h = Hoge.new
end
end
MyKernel.new #=> undefined local variable or method `my_puts'
# by アイ
842 :
デフォルトの名無しさん :2009/03/29(日) 23:59:42
Rubyのことよく知らないのですがメンバ変数とかのメンバとはどういうものでしょうか?
843 :
デフォルトの名無しさん :2009/03/30(月) 00:00:44
メンバ関数=メソッド
>>838 初心者に対して初心者じゃない人の論理持ち出さないほうがいいと思う
こればっかりはなー 少なくとも、プログラミングの知識がない、という前提に立ったとき、 手続き型プログラミングを優先して教えることは必ずしも理解にプラスにならない ということはもうちょっと周知されてもいいと思うんだ 手続き型でプログラミングを知った人がまだ生き残ってるから、こんな歪んだプロセスがまかり通ってるが
BASICやFORTRANの呪縛 ってか、オブジェクト指向をベースに物事教えるのって手間も時間もかかってめんどいんだよね 「メソッドっていうのはこれまででいうところの関数です」という教え方はそりゃ下策ではあるんだが、 教えるコストと成功者発生の割合の兼ね合いとかさー
>>845 関数型プログラミング言語でプログラミングを初めて習った人ばかりになれば薔薇色の未来が
>>833 module Kernel;end
class Object
include Kernel
# ここにスクリプト
end
main = Object.new
じゃね?まったく自信ないのでだれか訂正よろ
>>849 とりあえず、スクリプト上で実際に再現することはできなかったはず
「だいたいこんな感じに書ける感じで」という感じ
main とかはどっかにあるだけで、スクリプトからは触れないし
ところでおまえら Rubyの前は何やってたん?
>>850 self で触れるよ(selfで触れるだけだけど)
でっかい Kernel クラスか何かのクラス定義中にスクリプトを書いている、という理解は当たってないけどそう遠くもない
>>845 確かに、手続き型からが良い選択なのかはイマイチ自信が無い
ただ手続き型は副作用を自然に取り扱えるという点で、初心者からすれば最も”普通”だと思う
加えて実用上もそれなりに強力ってのは十分なメリットかと
関数型は面白そうだが、SICPを参考にすると
先ずプリミティブなデータ型とオペレータ、関数定義による抽象化、抽象データ型と進んでいる
・・・・・とりあえず美しいw
手続き的プログラムからオブジェクト指向的プログラムに移行するとこがユガんでるといえばユガんでるな def だけでいいじゃん、ということになるわけで
855 :
デフォルトの名無しさん :2009/03/30(月) 01:49:02
皆さんテンプレートって何使ってますか? amrita、tenjinなど違いが良くわかりません
初心者スレにふさわしいかどうかわ知らんが、参考
第1章 Ruby言語ミニマム
http://i.loveruby.net/ja/rhg/book/minimum.html コンテキストとしてのself
トップレベルでもselfがある。トップレベルのselfは、mainという。
なんの変哲もない、Objectクラスのインスタンスだ。
mainはとりあえずselfを設定するために用意されているだけで、
それ自体にあまり深い意味があるわけではない。
そんなわけでトップレベルのself即ちmainはObjectのインスタンスなので、
トップレベルでもObjectのメソッドが呼べるということになる。
そして ObjectにはKernelというモジュールがインクルードされており、
そこで pやputsなどの「関数風メソッド」が定義されている(図10)。
だからこそトップレベルでもpやputsが呼べるのだ。
続き だから本当はpも関数ではなくメソッドなのである。 ただ、Kernelで定義されているため、どこにいようと、 つまりselfのクラスがなんだろうと、「自分の」メソッドとして関数のように呼べてしまうのだ。 だからRubyには本当の意味での「関数」は存在しない。 あるのはメソッドだけである。
関数のように呼べてしまうなら、従来通り関数でもいいじゃんって疑問が産まれると思うぞ。 あえて関数を採用せずに、メゾットを使うだけの理由を説明しないと。 早くも、rubyのオブジェクト指向実装にほころびがwww RDBとかとのマッピングもそうだけど、オブジェクト指向で扱うのは無理が多い事象も多いよね。
オブジェクトの考え方で一貫している言語を扱うときは、まず頭の中をオブジェクトオリエンテッドに 切り替えないと混乱する。CやPascalなどの次にsmalltalkを勉強したときがまさにそうだった。 1 + 2すらオブジェクトとメッセージで構成されてるという説明を読んだときは目からうろこだった。 構造化プログラミングの頭のままで無理矢理オブジェクト言語を理解しようとすることが そもそもの間違いだと気付くまでは、単にわかりにくい言語としか思わないだろうな。
おっさんしゃべり場
>>858 従来通り関数
あえて関数を採用せず
おいおい……
あんたもうちょっとプログラミング言語のパラダイムを相対化する
視点を身に付けた方がいいんでないの?
>>858 > あえて関数を採用せずに、メゾットを使うだけの理由を説明しないと。
オブジェクト指向言語だから、で終了だろw
あえて関数を採用してメソッドを使わない理由を説明できんの?
> 早くも、rubyのオブジェクト指向実装にほころびがwww
kwsk
メゾットまで読んで朝ごはん食べようと思った
このスレが盛り上がるパターンって決まってるな
>>859 多分それは話の切り口がズレてる。
オブジェクトオリエンテッドに切り替えた頭、あるいは切り替えようとしている頭に、
中途半端に関数を思い出させる記法と、
>>856-857 みたいな関数関数言いまくる説明の
コンビネーションは毒、って話では。
早くも、
>>858 の頭にほころびがwww
m9(^Д^)プギャー
最初に学んだ言語がオブジェクト指向言語だった人: あれ? ここの暗黙の self ってなんだろう? ← そもそも関数とか思わない 最初に学んだ言語が手続き型言語だった人: あれ? トップレベルには関数も書けるのかあ ← 早とちり と、ここまで書いたけどこんなきれいには分かれないよな 実際、クラスの外に関数書けるオブジェクト指向言語もあるし
>>861 というか、たぶん、プログラミングに向かない人なんだと思う
シンタックスシュガーとか存在を許さない人
レシーバが文脈上デフォルトであることが明確である場合省略する、という動作が不自然に思えるというのはむしろ病気だ
関数とは関数であることを意図している 関数的メソッドとはメソッドであることを意図している ここをわざと無視してる奴がいるがそれこそ無視でよろしく
大きい胸のことを、ボインと呼ぶか巨乳と呼ぶかについて熱く語ってるスレはここですか?
>>855 るびま最新号の一つ前の号に特集記事があるよ
「乳」がレシーバですね。わかります。 しかしボインは巨乳より前に登場した言葉です。 巨乳にしろ爆乳にしろ貧乳にしろ、すべて「乳」体系に属します。 巨乳にレシーバが省略されたものを、ボインと呼ぶのはおかしくないですか?
ボインとか言ってるやつは全く乳を理解してないよなw
_Y_ r'。∧。y. ゝ∨ノ 春厨がクソレスを ,,,ィf...,,,__ )~~( している間に _,,.∠/゙`'''t-nヾ ̄"'''=ー-.....,,, ,i i, ,z'"  ̄ ̄ /n゙゙''''ー--... ,i> <i 文明はどんどん発達し r”^ヽ く:::::|::|:::〔〕〔〕 i> <i. ていく・・・・・・。 入_,..ノ ℃  ̄U ̄_二ニ= `=.,,ー- ...,,,__ |,r'''"7ヽ、| __,,,... -ー,,.=' >ーz-,,,...--,‐,‐;;:'''""~ ~''':x.,, ~"|{ G ゝG }|"~ ,,z:''" ___ ~"'=| ゝ、.3 _ノ |=''"~ <ー<> / l ̄ ̄\ .|)) ((| / ̄ ゙̄i;:、 「 ̄ ̄ ̄ ̄| ̄| ̄ ̄ ̄\ ))| r'´ ̄「中] ̄`ヾv、 `-◎──────◎一' ├―┤=├―┤ |li:, |「 ̄ |i ̄i|「.//||「ln|:; ||//__|L_」||__.||l」u|:; |ニ⊃| |⊂ニ| || ,|/ |_. └ー┘ ._| ||/ ヘ 「 ̄ ̄ ̄| /
なにもそんな涙目にならなくてもw
>>855 >皆さんテンプレートって何使ってますか?
>amrita、tenjinなど違いが良くわかりません
違いがわからないレベルならERBで十分。
堀北真希と戸田恵梨香の違いが分からないレベルならオナヌーでもしろ(すごい得意げ)
大地真央と太地喜和子の違いぐらい漏れにだってわかるお
言われなくてもボクにはプログラミングとオナヌーしかありません
>>803 $ cat $HOME/.irbrc
IRB.conf[:PROMPT][:NAGATO_PROMPT] = {
:PROMPT_I => "YUKI.N>",
:PROMPT_S => " "*7,
:PROMPT_C => " "*7,
:RETURN => ""
}
882 :
881 :2009/03/30(月) 11:59:05
起動方法書き忘れた。 $ irb --prompt nagato-prompt
>>802 $ irb
irb(main):001:0> foo = Object.new
=> #<Object:0x800e186a8>
irb(main):002:0> irb foo
irb#1(#<Object:0x800e186a8>):001:0>
のように、カッコの中は self を表してる。
とやってみたら と親切に変換してくれます ↓ &nbspとやってみたら&amp;&nbspと親切に変換してくれます
>>732 数分だけど立ち読みしてきた。
二次元配列はビットマップの処理で出てくる。
いちゃもんがつくことを想定してか「配列の配列」って言い方もしていた。
関数について。puts関数って言い方を注意を促すことなく使っていることは確か。
まずいことに索引を「関数」で引いてもでてこない。
そこでシリーズ一巻目にさかのぼってみると、コラムで
「本書はレシーバを意識しない場合は関数、そうでない場合はメソッドと使い分ける」
(立ち読みしてきただけなので正確な引用ではない)みたいに触れてあった。
二巻だけ読んで当惑する人が中にはいるかもしれない。
たのしいRubyの次にこれ読むのも悪くなさそうな感じ。
>>888 > 「本書はレシーバを意識しない場合は関数、そうでない場合はメソッドと使い分ける」
こういう無意味なルール敷いてモノを書くから、混乱を招くんだよね。
はじめから全部メソッドって呼べばいいじゃん。
そして「メソッドの中には、レシーバーを省略可能なものもある」ことを説明すりゃいいんだよ。
890 :
デフォルトの名無しさん :2009/03/30(月) 19:59:54
実際、関数みたいに使えるからなあ。 関数って書いちゃ駄目って松本教祖に勅命出してもらうか?
リファレンスマニュアルで、「組み込み関数」って堂々と呼んじゃってたぐらい 教祖様みずからお勧めになられているからなぁ
>>892 じゃあ君は今もイテレータと呼んでる?
ブロックつきメソッドって呼んでるよね?
>>889 なんで省略できるの?と聞かれたら答えられる?
>>893 …まあ、そういうことなんだろうな
Perl移行なんかも意図して関数ありますという呼び方をしたんだと思うけど、
「全部メソッドです」という説明は現状意外と受け入れられてるわけだし、
もう無理して関数と呼ばなくてもいいんじゃないかとは思う
導入記事組の人に通達出せばいいんじゃないかね
解説記事や書籍で使わなくなれば徐々に無くなっていくんじゃないかと思うぞ
>>894 レシーバが省略されていない場合はレシーバオブジェクトから、
省略した場合は呼び出している self のオブジェクトとみなしてそこからメソッドを検索する
これはクラス定義構造を見せながらじゃないとわかりにくいな
self が省略された場合は知り合いから検索
>>896 知り合いがいないひきこもりの俺はどうすれば?
898 :
デフォルトの名無しさん :2009/03/30(月) 21:45:28
さくらインターネットのスタンダートプランを使用しています。
動かしたいCGIのソースは以下のようなものです。
#!/usr/local/bin/ruby
print "Content-Type: text/html; charset=utf-8\n\n";
print "aaa";
ENV['GEM_HOME'] = "/home/User/lib/ruby/gem"
※Userはユーザー名
require 'rubygems'
require 'hpricot'
require 'open-uri'
print "bbb";
doc = Hpricot( open("
http://www.xxx.jp/xxx.html ").read )
print <<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "
http://www.w3.org/TR (以下略)
899 :
デフォルトの名無しさん :2009/03/30(月) 21:48:00
コマンドラインで実行するとちゃんと動作するのですが、 ブラウザで表示しようとするとaaaしか表示されません。 require 'rubygems' require 'hpricot' の2行をコメントアウトするとbbbも表示されるので、 おそらくgemsが読み込まれてないことは推測できるのですが、 どうすれば直るでしょうか。 いろいろググってみましたが見つかりません。 あっ、ちなみにパーミッションはちゃんと755にしています。 他のスレに書き込んだのですが、よく読んだら質問不可だったのでマルチポストさせていただきました。すいません。
そもそも最初からRubyGemsが入っていないんじゃ?
てかさくらのレンタルサーバのスレで聞けよ あと環境変数はシェルで設定しろ
902 :
デフォルトの名無しさん :2009/03/30(月) 22:05:01
さくらスタンダードはSuExec下で動くから
CGI動作時は設定した環境変数がクリアされてるかもしれないぞ
言いたいこと言ったからあとは
>>902 で
904 :
デフォルトの名無しさん :2009/03/30(月) 22:24:53
みなさんレスありがとうございます。
>>900 コマンドラインで実行するとちゃんと動作するんです。
>>902 おぉ、そのスレ知りませんでした。ありがとうございます。そちらで訊いてみます。
>>891 Pythonみたいにself強制にすればよいと思います
ruby-talk MLに入ろうと思ってsubscribeのメールを送ったけど、 数日経っても音沙汰なし。webの過去ログは文字化けしてるし。 rubyのMLは今使われてないのですか?
ruby-talkは英語だからほぼ化けてないと思うが……
デジャヴかとおもた
つかbladeさっさと直せと。
>>911 お金か人員ください
ってか、オフィシャルでアーカイブ公開すべきだよな
検索クエリが来るたびにMLに問い合わせ管理メールを送って取得するWebインタフェースとか作ったら目が醒めてくれるかも
オフィシャル 「お金か人員ください」
ドネーションとか受け付けてないんだっけ?
>>915 ドネーションなんて受け付けてるわけどねーしょん
日本語でおk
918 :
デフォルトの名無しさん :2009/03/31(火) 12:48:32
寄付
そっちかいw
ruby 標準の rss だと CDATA が扱えません。 CDATA が扱えるライブラリありませんか?
javascript
>>920 今、まったく同じことを調べてソース見てた。
おまえはおれか?
923 :
920 :2009/03/31(火) 14:19:05
>>922 よう、俺。
CDATA 付加するパッチを紹介したページ見た?
全国の ruby プログラマは、あのページを見て毎回パッチを当てているのかな。
無駄だー。
おれそこまでたどり着いてない・・・ おまえは未来のおれか?
このパッチを適用してくれ、ってredmineに書いたら?
ruby 1.8.6 を Apache 2.2 で CGI として使っています。 エラーメッセージは error.log に書かれますが、 これをブラウザ上に表示させることはできませんか。
>>926 できますが、そんなことをすべきではありません
というか、CGIやるより先に学ぶことがたくさんありそうなので、とりあえずCGI作る手を止めてください
エラーというか、Rubyが出す例外は begin エラーが出るかもしれない処理 rescue 例外がマッチするクラス => ex 例外オブジェクト ex の情報で何かする end という構造で捕捉することができる 例外メッセージは HTTPD のエラーログに表示されるが、 権限上読めないという場合は適当な外部ファイルをエラーログファイルにして rescue 〜 end の中で書き込むようにしたりするのがまあ妥当 というか、ブラウザ上でデバッグすんな
>>927 > そんなことをすべきではありません
なぜ?開発中の話でしょ?
それと、例外をトラップして適切に処理する方法ってのは、アプリを作る上で当然の質問かと。
と、Ruby知らないけど言ってみる。スマートな方法ある?
>>929 普通は、$stderr をファイルに振り分ける
Apache のログに書き込まれてもめんどくさいだけだし
require 'cgi'
$stderr = File.open('cgi_err.txt', 'a+')
cgi = CGI.new
cgi.out{ raise "error!"}
例外は rescue するとしても、 開発中の構文エラーはどうしてますか? 全部 rescue に入れてる?
932 :
929 :2009/03/31(火) 17:13:41
>>930 なるほど。
んで、
>>928 みたいに全体をbegin 〜 rescue 〜 endで囲って、
デバッグモード中のみ画面出力もするとかできる、のかな?
927ではないけど、ありがとうございます。
933 :
929 :2009/03/31(火) 17:27:02
> 927ではないけど 926ではないけど、でした。
>>932 エラーログ用ファイルがあるときだけ俺用デバッグモードだとみなせばいい
$stderr = File.open(errfile 'a+') if FileTest.exist?(errfile='cgi_err.txt')
cgierr.txt がない場合は普通に標準エラー出力に例外が表示され(て、ユーザーには 500 InternalServerError だけが表示され)る
時刻がないと嫌だという場合は適当にブロックつければ毎回実行される
$stderr = File.open('cgi_err.txt', 'a+'){|f| f.print "#{Time.now}: "; f}
気の利いた CGI サポートライブラリは Logger を組み込めるようになってるはず
>>931 それくらい好きにせえ
文法エラーが起こった回数を別途即時メールしなければならないとかそういうのなら分けるべき
PHPと比べると面倒だね
>>935 Apache組込みテンプレートエンジンと比較するのはPHPにむしろ失礼
937 :
926 :2009/03/31(火) 18:22:39
なんかいろいろあるみたいですね。ありがとうございます。 Rails は画面に出ますが、 tDiary を見たら全体を rescue で囲っていました。 真似てみようと思います。 # 確かに PHP と比べると不便かも。
文法チェックは ruby -c hoge.rb テンプレートが使いたいならerb、その他いろいろ
939 :
926 :2009/03/31(火) 19:21:16
tdiary を参考にエラーハンドラを用意してみました。
HEREDOC の部分を TEST にすると、
Internal Server Error になってしまいます…。
Rails なら画面に
can't find string "TEST" anywhere before EOF
と出るのですが、同様にブラウザに出すにはどうしたらいいでしょう?
RSpec ベースで進めていますが、
Ruby 初心者のためモックコードをよく書いているので、
どうしてもブラウザでデバッグしたいことがあって…。
require 'cgi'
cgi = CGI::new
print cgi.header
print "<pre>"
begin
print <<HEREDOC # ここを TEST
hello
HEREDOC
rescue SyntaxError
rescue Exception
puts "<hr>"
puts CGI::escapeHTML("#{$!} (#{$!.class})")
puts ""
puts CGI::escapeHTML(
[email protected] ("\n"))
end
>>939 begin内部を別ファイルにしてrequireすればいけるはず
MLアーカイブを有料にすればいいのかもな。必要ならコスト負担しろと。 金払ってるからメールアドレス収集もおkに成ると痛いが。
cgi.rb使うなら,webサーバで動かす前にコマンドラインで動かしてみたほうがいいと思う
944 :
926 :2009/03/31(火) 21:59:36
いろいろとありがとうございます。
>>941 おお!と思って早速試してみましたが、
画面に Internal Server Error が出ない代わりに、画面が真っ白になるだけでした…
HEREDOC を TEST にすると Internal Server Error で、
print "<pre>" の下に xxx とすると画面に出てくれる。不思議。
>>942 なぜか動いていたコードでも Internal Server Error に。
CGI-Exception を外すと動く。
後ほど試してみたいと思います。
>>944 >画面が真っ白
ローカルで、CGIではなくただのスクリプトとして実行すると
どういう結果になる?
view sourceしたら何か出てるんじゃないかね
947 :
926 :2009/03/31(火) 22:41:29
>>945 $ ruby -v test.rb
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
(offline mode: enter name=value pairs on standard input)
q=test と入れて C-z すると
Content-Type: text/html
<pre>
になり何故かエラーにならないですね。
ログにも残っていないし。
948 :
926 :2009/03/31(火) 22:42:51
現在は
>>941 により begin ... resure 部分を require してます。
require 'cgi'
cgi = CGI::new
print cgi.header
print "<pre>"
begin
require 'a.rb'
rescue SyntaxError
rescue Exception
puts "<hr>"
puts CGI::escapeHTML("#{$!} (#{$!.class})")
puts ""
puts CGI::escapeHTML(
[email protected] ("\n"))
end
そして a.rb は
print <<TEST
hello
HEREDOC
です。
そりゃ真っ白だなw 恐らくこっちの想像してるコードと異なるから、もう一度晒してもらえる?
950 :
926 :2009/03/31(火) 22:45:25
cgi.rb だと print <<TEST hello HEREDOC は Internal Server Error になり、 Apache ログに can't find string "TEST" が記録される。 でも rails なら画面に can't find string "TEST" と出てくれる。 rescue SyntaxError や Exception みたいに、何かあるんですかね・
951 :
926 :2009/03/31(火) 22:46:38
>>948 > rescue SyntaxError
の行を削除してもっかいやってみ
すまん把握。
>>926 と同じ勘違いしてたorz
rescue SyntaxError
rescue Exception
エラー処理
end
これは
・SyntaxErrorならなにもしない
・その他のExceptionとその子クラスならエラー処理をする
という動作になる。
954 :
926 :2009/03/31(火) 23:08:48
>>952-953 やったー、画面にエラーが出ましたー。
なるほどー。そうでしたか。
遅い時間までありがとうございました。
近くにいるなら回転寿司なら奢るのに!
おみくじもAFバージョンかな
4/1だからって別に何かやらなきゃいけないわけじゃないのだが やるならもうちょいおもしろいのを頼みたいな
>>958 を見るまで完璧に騙されていた俺って何なの?www
海外はWhitespaceみたいに処理系まで書くからなあ やはりそれぐらいの意気込みは必要かもしれん
matsとか まつもと「ひろゆき」とか 判り易すぎ
963 :
926 :2009/04/01(水) 09:33:06
>>963 SyntaxError はコンパイル時に出るエラー
require 'a.rb' 行を実行する時点で a.rb を読み込んでコンパイルする
あと実行部分をrequireで呼ぶのはよろしくない、loadを使え
>>963 そりゃ、rescue部分までヒアドキュメント内だから、例外を補足する処理そのものが
書かれていないことになっちゃってるからじゃね?
966 :
926 :2009/04/01(水) 11:57:56
コンパイル時や実行時とかでピンときてないんだろうなあ ふつパイラが早く発売されることを祈る
968 :
デフォルトの名無しさん :2009/04/01(水) 15:48:41
s = '"a b" x y "c d"' ↑の様な文字列を ↓の様に峻別したい。 ["a b", x, y, "c d"] ←「"」は削除してる つまり検索エンジンでの語句の峻別みたいな事がしたいんだけど 自分でコード書いたらちょっと冗長になったので 一番簡潔に書ける方法が知りたいのです。どんな方法がありますか?
>>968 xとyはそういう名前の変数を参照したいの?
本当は"x" "y"という文字列にしたいんじゃないの?
とりあえず文字列にしたいのだと仮定すると、
require "shellwords"
p Shellwords.shellsplit(s)
>>969 ごめんなさい、そうでした(「"」を付けるの忘れてました)。
>require "shellwords"
>p Shellwords.shellsplit(s)
こんな便利なものが… まさに目から鱗。
あと、もしそれを自力でやるとするとどう書けますか?
自分は技量不足&知識不足で以下みたいなヘボいコードしか書けません。
p '"a b" x y "c d"'.scan(/"([^"]+)"|\s+([^"\s ]+)| +([^"\s ]+)/).map{|v| v = v.to_s }
>>970 正規表現でやるのは別にへぼいとは思わないけど、
>>970 のだと文字列の最初のワード?が
""で囲まれていないとヒットしないね。他にも漏れたりずれたりするかもな怪しさだし。
やるんなら、下記URLでの例とか参考になったりするかも
ttp://www.din.or.jp/~ohzaki/perl.htm#CSV2Values こんな感じ?(※ マルチバイト無考慮、無試験・無保証です^^)
s.gsub!(/\s*$/, " ")
result = s.scan(/("[^"]*(?:""[^"]*)*"|[^ ]*) /).map{|tmp| t = tmp.first; /\A"(.*)"\z/ =~ t ? t.gsub(/\A"(.*)"\z/, $1.gsub(/""/, '"')): t}
とくにこだわりがなく、目的に合うのであれば、ライブラリを使うのが賢明かも。
ネストを許すかどうかで違うだろ あとエスケープがあるのかどうかとか
973 :
sage :2009/04/01(水) 17:28:45
>>971 ご丁寧なレス感謝します。
そうですね、出来ればライブラリの方が信頼もあっていいんですが
全角スペースでのsplitが出来ないのと区切りのスペースを連続して入れた時に
一つのスペースで区切ってしまうのがちょっとやなんですよね。
ちょっと自作のコードを修正したのですがどうでしょうか。
一応色々なキーワードを入力して試してみて大丈夫そうだったのですが… イマイチ自分のコードが信用ならないなぁww
p s.scan(/"([^"]+)"|[\s ]+([^"\s ]+)|([^"\s ]+)[\s ]+/).map{|v| v = v.to_s }
>>973 つ s = 'a'
いきなりアウトっすね。
自作するなら、テスト文字列を(脳みそ振り絞って)山の様に書いて実験するのが吉かと。
>>974 あらら…
とりあえず↓の様に修正ww
t = s.scan(/"([^"]+)"|[\s ]+([^"\s ]+)|([^"\s ]+)[\s ]+/).map{|v| v = v.to_s }
s = (t.size == 0) ? (s.to_a) : (t)
そうですね、がんばって色々テストしてみたいと思います。
みなさんありがとうございました。
レンタルサーバで tDiary をインストールして使っています。 改造しようと思って、自宅にも tDiary 2.2.1 を入れました。 画面の表示に数分待たせれ、その挙句 stack level too deep (SystemStackError) が表示されます。環境は Vista Apache/2.0.63 ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32] です。心当たりある人いませんかー?
エスパー待ちw
978 :
デフォルトの名無しさん :2009/04/01(水) 19:21:27
エスパー来たよー
俺のサイコキネシスではどうにもならんかった
stack level too deep だけ切り出して貼るあたりプロだな。
うむ
>>976 エイプリルフールネタじゃないんだよな?
> 改造しようと思って、自宅にも tDiary 2.2.1 を入れました。
改造しようと思って、まだ改造はしてないの?
それともインストールは済んで「改造」を始めたらそうなったの?
> stack level too deep (SystemStackError)
何が必要な情報で何が不必要な情報なのか、自分で判断できないのなら
一部を切り出すんじゃなくて、全てを貼り付けて。
曲の頭0.1秒だけ聞いて曲名を当てられる人でないと無理かも エスパーが活躍するわけだ
stack level too deepを全て貼るのはいやがらせじゃないかと 思ったが、1.9は途中省略してくれるんだったかな。
985 :
976 :2009/04/01(水) 21:24:19
ありゃ、エスパー募集になってしまった。ごめん。 出たメッセージは下記です。 stack level too deep (SystemStackError) C:/home/foo/public_html/tdiary/tdiary.rb:524:in `method_missing' C:/home/foo/public_html/tdiary/tdiary.rb:105:in `join' C:/home/foo/public_html/tdiary/tdiary.rb:105:in `safe' C:/home/foo/public_html/tdiary/tdiary.rb:635:in `load_cgi_conf' (tdiary.conf):250:in `load' C:/home/foo/public_html/tdiary/tdiary.rb:548:in `load' C:/home/foo/public_html/tdiary/tdiary.rb:466:in `initialize' C:/home/foo/public_html/tdiary/index.rb:21:in `new' C:/home/foo/public_html/tdiary/index.rb:21 まだ改造してないです。ダウンロードして解凍して index.rb の一行目の #!/usr/bin/env ruby を #!/usr/bin/ruby に変えたのと、tdiary.conf.beginner を tdiary.conf に改名して @data_path を変えただけです。
ここからがエスパーの本領発揮か というかソース読まなきゃまずわからんわな 作者もしくは奇特な人があらわれるのを気長に待って見ればいいさ
tDiaryは全く知らんが、変更したというtdiary.confの250行目が問題なんじゃないのか? (tdiary.conf):250:in `load' って出てるじゃん
* tdiary.conf.beginner の 250行目は load_cgi_conf の呼び出し * load_cgi_conf は @data_path/tdiary.conf を読む ってことで、インストールトップディレクトリに置くはずの tdiary.conf を @data_path 下にも置いてしまっていて無限ループしてるんじゃないかと思われる。 tDiary はサッパリだけど、たぶん doc/INSTALL.html あたりの話からして、これは ブラウザのインターフェイスで設定された項目を保存するのに tDiary が自分で作るんじゃね? ユーザが設置するものではない気がする。
おまいら優しいなあ 漏れもtDiary使ってたけど tdiary.confを@data_pathに設置した記憶はないね・・・
次スレ立てれ
了解
992 :
976 :2009/04/02(木) 09:27:45
>>988 その通りでした。ありがとうございました。
エスパーすげえw
994 :
デフォルトの名無しさん :2009/04/02(木) 09:47:25
エスパーおつ
このテキーラは私のオゴリだ
∧_∧
(`・ω・) シュッ
(つ と彡 /
/ /
/// /
/旦 / ツツー
/ /
/ /
∧_∧ / /
⊂('・ω・`) / /
ヽ ⊂ ) / /
(⌒) |///// /
三 / 旦 /
| ̄ ̄ ̄ ̄|
| |
| |
/ _ /
| ̄ ̄V ̄|
≡〃/∇ ∧_∧゙、旦 |
≡"⊂~⌒⊃`・ω・)⊃ |
>>994 もおつ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
996 :
デフォルトの名無しさん :2009/04/02(木) 12:43:26
英語のエラーメッセージで 「not found, ignored.」 のような、かなりシンプルな構文で書かれることがありますが、これを英文法 上の用語でなんと言いますか? また、これについて勉強できる書籍(など)があれば教えてください。
言語習得のコツは「受け入れる」こと。 日本語を自由に使いこなす日本人でも、 自分の使ってる言葉を文法的にきちんと説明できるかといえば、 できる方が少数派だろう。 「not found」でも「ignored」でも、 向こうの人間がそう使ってるんだからそのまま受け入れるのがいい。 じゃないと時間の無駄になるぞい。 たぶん過去分詞なんだろうが。
コメントやエラーメッセージでは、文脈上あきらかなことは省け 文法を気にしてダラダラ長く書くのはよろしくない 的な主張をどこかで読んだ記憶があるが思い出せない ウメス
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。