1 :
デフォルトの名無しさん :
2010/08/26(木) 09:18:42 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
1.8.7 は 1.9 系の新機能のいくつかが利用可能なため、1.8.7 を習得すればスムーズに 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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
バージョンに関するよくある質問 ・Ruby 1.8.5 レンタルサーバ等にいまだに残ってる非安定な古いバージョン 1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい ・Ruby 1.8.6 過去の長期政権と数の暴力で一大勢力圏を維持中の旧安定版 公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ ・Ruby 1.8.7 1.9 シリーズの機能をいくつか足したハイブリッドなバージョン、初学者にこそお勧め 1.9 系機能は 1.8.6 では動かないが「えーマジ1.8.6!? 1.8.6が許されるのは小(AA略」と煽ってよい ・Ruby 1.9.0 不安定にして先鋭機能が超満載の開発版バージョンだったもの 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に ・Ruby 1.9.1 満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている) 本体と添付ライブラリの動作は問題がないのだがgem等外部第三者ライブラリの対応が超適当特に英語圏産 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
○
>>1 乙 もうお前に用はない
く|)へ
〉 ヽ○ノ
 ̄ ̄7 ヘ/
/ ノ
|
/
|
/
8 :
デフォルトの名無しさん :2010/08/26(木) 10:48:35
,―ヽ_(((((_、― ,/ ノ ヽ ~\ / ノ IPA ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ IPA Rubyスレは誰でもウェルカム i、 \ ./ / \ ーー ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i |
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━-┓ ┃ ┌────────────────────────ーーー┐ ┃ ┃ │ / ̄ ̄\ │ ┃ ┃ │ / ヽ_ .\ │ ┃ ┃ │ ( ●)( ●) | ____ │ ┃ ┃ │ (__人__) | / \ .| ┃ ┃ │ l` ⌒´ | / ─ ─ \ │ ┃ ┃ │ . { |/ (●) ( ●) \ .| ┃ ┃ │ { / | (__人__) | │ ┃ ┃ │ ,-、 ヽ ノ、\ ` ⌒´ ,/__ .| ┃ ┃ │ / ノ/ ̄/ ` ー ─ '/>< ` ー─ ' ┌、 ヽ ヽ、 │ ┃ ┃ │ / L_  ̄ / _l__( { r-、 .ト、 . │ ┃ ┃ │ _,,二) / 〔― ‐} Ll | l) ).│ ┃ ┃ │ >_,フ / }二 コ\ Li‐' .| ┃ ┃ │ __,,,i‐ノ l └―イ ヽ | . | ┃ ┃ │ l i ヽl . | ┃ ┃ └ーーー────────────────────────┘ ┃ ┗-━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 平成22年8月26日 クソスレにて
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究
お決まりとは言えいきんらい荒砂w
ruby 楽しいね。 こんな楽しみ、うつ病→統合失調症→引きこもりニートにならないと 出会えなかった。
Ruby会議2010が明日から開かれますが行く価値ありますか? チケットはなぜかあるけどだるいので止めとこうかと。
>>12 が、意外と名文な件
もちょっと推敲すればなんか真理に近づけそうな気がする
かみさまありがとう ぼくにともだちをくれて Ruby にあわせてくれて
そこは 'Pascal' の方が語呂がいいよな
Prologのほうがいいんじゃないか Prologスレとか宿題スレ見てると楽しそうで妬ける
あらいぐまが通じないなんて…
語呂log
>>15 2ch 楽しいね。
こんな楽しみ、うつ病→統合失調症→引きこもりニートにならないと
出会えなかった。
いろいろ使えるな
1.9.1そんなに初心者向きでないとは知らなかったぜw
もう 1.9.2 出たんだからそっち使えよ
>>23 そういう情報もチェックしてない位初心者です(´・ω・`)
Rails 3でも1.9.2正式サポートだっけ
26 :
Perl忍者 ◆M5ZWRnXOj6 :2010/08/29(日) 19:27:00
ここも潰そう
DBIインストールしようと思ってるんだけど、何が必要なのか分からん 今のところMySQLだけいじれればいいんだけど、 Ruby/MySQLかMySQL/RubyとRuby/DBIがあればいいんですか? あとググったらCで書かれたMySQL/Rubyの場合は さらにruby-develとmysql-develかC APIが必要とか書いてあったんだけど、 どういうことですか?ruby-develとかmysql-develとかC APIって何者?
邪魔者
曲者
>>27 なんたら-devel って Linux のパッケージだろうと思うけど、
それはビルドに必要なんじゃないかなぁ。
説明が果てしなくめんどくさいな Windowsの場合、mysqlのdllを公式から落としてきてパスを通してれば mysqlのgemパッケージをrubygemsでインストールするだけでいいはず Linuxとかの場合はmysqlのgemパッケージインストール時にコンパイルが行われるはずだから もしRubyをLinux等のパッケージシステムでインストールしていた場合はruby-develまたはruby-devを、 MySQLをLinux等のパッケージシステムでインストールしていた場合はmysql-develまたはmysql-devのような何かが必要 共に、ソースからコンパイルしてふつうにインストールしていた場合は不要
32 :
27 :2010/08/30(月) 23:51:45
何をやってもうまくいかない・・・・・・・・・・・・・ とりあえずRuby/MySQLだけはインストールできたけど、他が全くインストールできないです とりあえず、Ruby/DBIをインストールする前には何が必要なんですか?
>>27 環境plz OSとか、Rubyのバージョンとか
>>33 Linux Fedora13
ruby 1.8.7
http://www.jiubao.org/ruby-dbi/ruby-dbi.html ここを参考にしていましたが、初心者故にあまり用語などが理解できていません
そもそもRuby/DBIってDBをいじる時にMySQLだとかPgSQLだとかの差異を吸収するためのものですよね?
Rubyと例えばMySQLとの間の関係は
Ruby
↑↓
Ruby/DBI
↑↓
Ruby/MySQL
↑↓
MySQL C API
↑↓
MySQL
って感じで考えてるんですが、これで合ってるんでしょうか?
その上でRuby/DBIをインストールするにはMySQL本体とRuby/MySQLが必要と考えてるんですが…
あとRuby本体含めてすべてソースからコンパイルしています
Ruby/MySQLだけうまくコンパイルしてインストールできたけど、
MySQL/RubyとRuby/DBIがコンパイルがうまくいきません
素直にgemつかったほうがいいのかな?
Ruby ↑↓ Ruby/MySQL ↑↓ MySQL
Windowsで、gemを使う環境をセットアップするのに、 (1)mswin32だとセットアップが大変 (2)AcritveScriptRubyだとインストール一発で使用可能 という認識でよいでしょうか?
Rubyで主要な処理を行うdllのような物を作り UIはGUIが得意な別の言語で作り、 内部からRubyで作ったdllのような物を呼び出すことはできますか? 自分のレベルだと引数をとるRubyの単体のプログラムを作り それを他のプログラムから外部プログラムとして呼び出す方法しかわかりませんでした。
それでいいんじゃね
>>37 たまにRubyを組み込みスクリプトとして使っているソフトは見かけるよ
SWIGとかRubyのソースそのものも参考になるとおもう
40 :
デフォルトの名無しさん :2010/08/31(火) 10:43:07
RubyのオブジェクトをCコードで作って、そのメソッドを呼ぶことは 容易にできるよ。
ubuntuでruby1.9.1にしたら全部動かなくなったお(・ω・)
あれほど最新版の1.9.2にしておけとあれほど Ubuntuのパッケージシステムは非互換性の警告をすることができないからなあ 1.8.7がインストールされてたら「1.9.1いきなり入れるのやめと毛」というメッセージくらいはあってもいい なくてもいいけど
まだリポジトリに入ってないよ
libxml2 も 2.7.6 だよね めんどくさいから 2.7.7 にして欲しいなあ
45 :
Perl忍者 ◆M5ZWRnXOj6 :2010/08/31(火) 20:52:02
{:::::i:::::::::::::::::::::::i::/!:::::ハj ヽ_ン´、レ'´ {:::::::i:::::\__ レ|::|::::::::::::'、::::::N j/ ノ,、_`__> }:::::::i`i::ト-'´- i::|、::::::ハ{`、:::{ ー夂_,ノイ:::::ノ ノ、j: : : : : j_ハ`、 { `ヾ `、\ ノ / ー'´___,ィ ム'´i j-―ー-- }::!'i、`、ー=r==、 ` 、 / ,r='ラ ̄// i`ソ/: : : : : : : : '、`ハ \_`ー'´\ 、_ i i /__`´__ノノ ム'/、__: : : : : : : r')、゛'、  ̄二ニ´ 、`= /´ニ二 ̄ レ':::r'´'、: : : : : : r-、_!厶`Ti、 ` /:::::トv':.:.:.:.iー- ..__ / j .V レ、 , ハ∧j:.:.:.:.:.:.:.\:.:.:.:.: _ノ i / |ハ!`、 _ `ー' _,.r / |:.:.:.:.:.:.:.:.:.:.:.:.:.:.: r-‐'´ |/ |' `ヽ、 ̄ ̄二二 ̄ ,.イ |:.:.:.:.:.:.:.:.:.:.:.:.:.:. r-‐/ i | i`ー..._ ,.. -'´/ |:.:.:.:.:.:.:.:.:.:.:.:.:.:. おい、まつもと しねよ
Rubyスレ初の逮捕者ですねわかります
>>42 バージョン0.2はバージョン0.1と互換性がなくても文句言えないと思う
バージョン0.2とバージョン0.2.1に動作互換性がなかったら一応文句だけは言っていい
48 :
Perl忍者 ◆M5ZWRnXOj6 :2010/08/31(火) 21:53:47
俺の意志を継ぐ者が現れてRubyコミュニティを破壊しつくすだろ
ライブドアからでてくんな
50 :
デフォルトの名無しさん :2010/09/01(水) 05:56:54
Nokogiriでの日本語の扱いについて質問させて下さい。 node = Nokogiri::XML::Node::new "test", doc node.content = "こんにちは".toutf8 puts node.to_s このとき、"こんにちは"がエンコードされて次のように表示されてしまいます。 "<test>こん.....</test>" (一部省略) これをそのまま "<test>こんにちは</test>"と表示させるにはどうすればいいのでしょうか?
Nokogiri の to_s とか to_html とか to_xml は、なにもなければマルチバイト等を数値実体参照で記述する irb> puts node.to_html <test>こんにちは</test> で、マニュアル見るとうっすらわかるのだが、これらのメソッドは実は引数を受け付ける irb> puts node.to_html(:encoding => 'utf-8') <test>こんにちは</test> でどうだ require 'rubygems'; require 'nokogiri' doc = Nokogiri::HTML.parse('<html></html>') node = Nokogiri::XML::Node::new "test", doc node.content = "こんにちは".toutf8 puts node.to_html puts node.to_html(:encoding => 'utf-8')
52 :
50 :2010/09/01(水) 07:08:25
>>51 おー、解決しました!
これからはマニュアルとの付き合い方を少し変える必要がありそうです。
どうもありがとうございました。
一発目は他人に聞いたほうが早い 気づいた2回目からは自力で自由に調べたほうが早いが
54 :
デフォルトの名無しさん :2010/09/01(水) 19:26:16
400字くらいある文字列textを、 20文字ずつ区切って、配列aに入れて行くのにイカした方法は無いでしょうか。 やっぱり、普通に一文字ずつやっていくのが良いのでしょうか。 よろしくお願いします。
「1文字」って何? 「1文字」が正規表現 /./ にマッチするという条件のもとで text.scan(/.{0,20}/)[0..-2] textがUTF-8ならたとえば $KCODE = 'u' text = "あいうえお12345"*7 puts text.scan(/.{0,20}/)[0..-2] #=> あいうえお12345あいうえお12345 あいうえお12345あいうえお12345 あいうえお12345あいうえお12345 あいうえお12345
56 :
デフォルトの名無しさん :2010/09/01(水) 19:52:59
>>55 ありがとうございます。
非常にスマートですね。
参考にさせて頂きます。
1文字とは、一般的な方の1文字を想定しています。
表示文字と言えば伝わりやすいでしょうか。
例えばの場合ですが、ちょっと意地悪な条件として
「1文字」を「全角1文字分のスペースに収まる文字」と置いた場合は、
(つまり半角文字は2つで全角1文字になるとします)
このようにスマートに処理ができるものなのでしょうか。
もし、偉そうに見えたらすみません。
そういう意図では書いていないつもりです。
ちょっと書き方が工夫できなかったもので。
>「1文字」が正規表現 /./ にマッチするという条件のもとで
なにこいつ 偉そう
59 :
デフォルトの名無しさん :2010/09/01(水) 20:02:41
やはり偉そうですよね。 そういう意図ではないつもりでしたので、 書くべきではなかったと後悔しています。 ありがとうございました。
全角半角の問題もあるけど
3バイトとかの文字コードの途中で切るとか
「20文字」の中に改行があったらどうすんだとか
そもそも
>>54 だとアバウトすぎるんだよ
条件あとだしは良くないぬ
つまり「1文字」という言葉は理解できたが「正規表現」という言葉が理解できなかったということか
文字幅のことを言ってるんなら 半角をぜんぶ全角に置き換える処理を入れてみてはどうか
>>62 だと思うよ
正規表現は勉強しておいたほうがいいな
半角2文字を全角1文字換算で文字数を数える性器表現はどうかけばよいでしょうか?
RDE位簡単で初心者に優しいIDE、ubuntuには無いでしょうか?
先日 Ruby でファイル一覧を生成するスクリプトを作成したのですが、 途中で止まってしまいます。 (227,000 ファイルぐらいのところで止まります) 師匠、何が原因なのか助言頂けると助かります。 環境:Windows 7 Ruby:ActiveScriptRuby 1.8.7(p302) with-winsock2 tcl-stub ソースは↓
こんな感じです。 def listup(path, exclusion) time_format = "%Y-%m-%d %H:%M:%S" fullpath = File.expand_path(path) print "\"dirname\",", "\"basename\",", "\"extension\",", "\"size(byte)\",", "\"ctime\",", "\"mtime\",", "\"atime\",", "\"sha1\"\n" begin Find.find(fullpath) do |entry| begin if exclusion != nil and entry =~ /#{exclusion}/ next end if File.file?(entry) ctime = File::stat(entry).ctime mtime = File::stat(entry).mtime atime = File::stat(entry).atime print "\"#{File::dirname(entry)}\"," print "\"#{File::basename(entry)}\"," print "\"#{File::extname(entry).downcase}\"," print "\"#{File::stat(entry).size}\","
print "\"#{ctime.strftime(time_format)}\"," print "\"#{mtime.strftime(time_format)}\"," print "\"#{atime.strftime(time_format)}\"," print "\"#{Digest::SHA1.file(entry).to_s}\"\n" File::utime(atime, mtime, entry) end rescue => e STDERR.print "#{e}\n" end end rescue => e STDERR.print "#{e}\n" end end
ファイルが多すぎ
2. ばかでかいファイルがあってSHA1計算時に(一時的に)止まった
マルチスレッドにすべき
>>71 SHA1 のところをコメントアウトしても
止まるんです。
>>72 マルチスレッドだとどう書けばいいのでしょうか
お手数ですが、サンプルでも頂けると助かります。
>(227,000 ファイルぐらいのところで止まります) これは実行するたびに変わるんかい?
>>74 同じ時もあるし、違う時もあるんです。
出力が行の途中で止まっていることもあって
いることも、、、
実はlist_upは終わってて、その後で止まってる説
わるい、rescueで拾ってたか。 おわびに今手元で軽く動かしてみてる。
NTFSで2万超えのファイルとかやめとけ。
いや fullpath フォルダの直下にファイルが20まんこあるわけじゃないだろ Find.find の結果としてサブディレクトリ含めて20まんこ超したってことだろ Find.find をカウントだけした結果が、エクスプローラなどで表示される総ファイル数と同じであることのチェックからだろうな
>>67-69 $stdout.sync = true
を上に入れて
> Find.find(fullpath) do |entry|
を
Dir.glob(fullpath).each_with_index do |entry, index|
にして、
> print "\"#{Digest::SHA1.file(entry).to_s}\"\n"
> File::utime(atime, mtime, entry)
をコメントアウトして同ディレクトリの6万ファイルくらいに試してみたが、
マルチコアCPUでもOSが操作不能になるくらいにはなったが、表示はちゃんとされて問題なく終わったぞ
Windows Vista, Ruby 1.8.7
ああっと操作不能になった点は、多分teeでファイルに表示と同時にファイルに落していたせいもあるかもしれないし、 コマンドプロンプトにログ流すのが重いのかもしれない
83 :
デフォルトの名無しさん :2010/09/02(木) 19:04:46
配列の参照について質問させてください。 次のコードを期待通りに動作させるにはどうすればいいのでしょうか? * 関数への参照を配列に格納し、配列の添え字を利用して関数を呼び出したい。 def a() ... end def b() ... end def c() ... end methods = [a,b,c] methods[1]() よろしくお願いします。
空の () は普通書かない よおおおっぽど区別しにくい場合だけ書く __send___(:mes) や __send___('mes') で mes メソッドを呼ぶことができる methods = ['a', 'b', 'c'] __send__(methods[1])
85 :
デフォルトの名無しさん :2010/09/02(木) 19:13:30
>>84 関数の件、ご指摘ありがとうございます。
__send__メソッドは知らなかったです。面白いメソッドですね。
どうもありがとうございました。
Rubyに関数はありません。 メソッド名で手続き実体のようなオブジェクトにアクセスすることもできません。 Proc オブジェクトを使って以下のようにします。 methods = [Proc.new{a()}, Proc.new{b()}, Proc.new{c()}] methods[1].call()
def a(n) print n end Proc.new{a()}.call(1234) wrong number of arguments (0 for 1) (ArgumentError)
Proc の使い方知ってるということ前提のネタだしなあ irb> def a(n) print n end irb> Proc.new{|x| a(x)}.call(1234) 1234
>>77 CPU は ruby.exe が占有している感じはしないです。
書いていなかったのですが DOS 窓で実行していて、標準出力と
標準エラー出力をファイルにリダイレクトしています。
何時間たってもプロンプトが表示されないので、出力結果を tail で
見てみると途中で止まっている、もしくは追加出力されない・・・と。
ちなみに $stdout.sync と % の使い方は勉強になりました。ありがとうございます。
>>80 カウントの途中で止まらないことを祈って、試してみます。
>>81 Find.find と Dir.glob の動きの違いを分かっていません、私。
サブフォルダの中も全て調べたいので、Dir.glob の引数に **/{.*,*} を
追加して実行してたのですが、長時間出力されていないので、一旦
メモリ上にファイル情報を配列として取得して、その後動く作りのかな…と
勝手な理解をしています。
find だとすぐに出力されているので、ファイル走査をしながら
順次処理できるように感じて、find で実装していました。
ちなみに
Dir.glob(fullpath) do |entry|
と
Dir.glob(fullpath).each do |entry|
でも、動きは違うものなんでしょうか?
>>75 出力の途中でとまるなら、コードの問題じゃなくてリソースの問題じゃないかな。野生の勘だけど
悪い。恥ずかしながらFind.findの存在しらなくて個別の依存ライブラリかと思ってDir.glob書いたので Dir.globはスルーしてくれ
rubyの人はzsh使うってほんとですか?
えー俺bashしか使えない
俺はzsh使ってるが、「使ってる」ってレベルじゃないな。 マイコミの漢のzshの設定ファイルをほぼそのまま使ってるだけ。 スクリプト的な使い方はRubyがあるからまったくしてないなぁ。 bashでも全然いいと思う。
95 :
デフォルトの名無しさん :2010/09/05(日) 09:51:27
変数のスコープについて質問させてください。 次のコードで、bメソッド内で test 変数を参照するにはどうすればいいでしょうか? def a test = "OK" def b puts test end b end testはaメソッド内に閉じ込めたいので、グローバル変数は使いません。 よろしくお願いします。
> bメソッド内で test 変数を参照する うn > 閉じ込めたいので うn?
>>95 閉じ込めたいのに参照したいって
矛盾してるじゃん
とまあ初心者スレに似つかわしくない応酬が続いております 妥当なのは全部メソッドと引数と返り値の関係にしてしまうこと def a(arg) disp text(arg) end def text(s) "#{s}です!" end def disp(arg) puts arg end
壮絶なまでに初心者スレらしいスレになっております
>>95 の質問がよくわかんない人は
ポップアップなりしてコードのインデントを復元すればよくわかるよ
>>95 やりたいことがイマイチ見えない
クロージャに変数testを閉じ込めたいなら
Rubyではこのように書く
入れ子のメソッドはRubyではサポートしない
def a
test = "OK"
Proc.new { puts test }
end
b = a
b.call
>>99 わかってないわけじゃない
マニュアル嫁レベルでできねーという返答だ
102 :
95 :2010/09/05(日) 10:27:09
>>98 やはりその方法が一番妥当みたいですね。
>>100 入れ子関数がサポートされていないのは残念です。
>>98 の方法では、testは隠れてもbが表に出てしまいますし;
クロージャの使用も検討しながら、コードの体系について見直したいと思います。
どうもありがとうございました。
103 :
デフォルトの名無しさん :2010/09/05(日) 10:30:37
def define_a_and_b v = "initial" Kernel.send(:define_method, :a) do v = "OK" end Kernel.send(:define_method, :b) do puts v end end define_a_and_b # puts v #=>undefined local variable or method `v' a b
104 :
デフォルトの名無しさん :2010/09/05(日) 10:32:39
>>68 ・Find.find() do ... end の中の処理は別の関数を定義してそこにやらせたほうがいい
・if exclusion != nil and entry =~ /#{exclusion}/ .. end は begin の内側にある必要がない
・/#{exclusion}/ は Find.find() の内側にあると正規表現オブジェクトが毎回作成されて無駄だから、外側にもっていくべき
・if 条件 then next end は next if 条件 と書いた方がいい
・特に理由がなければ STDERR よりも $stderr のほうを使ったほうがいい(後者のほうがテストしやすい)
・STDERR.print "#{e}¥n" は $stderr.puts e でいい
すまんあげちまった
>>68 の修正
$KCODE = 'shift_jis' # 必要なら
def update(entry)
begin
return unless File.file?(entry)
#
dirname = File.dirname(entry)
basename = File.dirname(entry)
extname = File.extname(entry).downcase
print "#{dirname.inspect}, #{basename.inspect}, #{extname.inspect}, "
#
stat = File.stat(entry)
times = [stat.ctime, stat.mtime, stat.atime]
times.each {|t| print "#{t.strftime("%Y-%m-%d %H:%M:%S").inspect}, " }
#
digest = Digest::SHA1.file(entry)
puts "{digest.inspect}"
#
ctime, mtime, atime = times
File.uptime(atime, mtime, entry)
rescue => e
$stderr.puts e
end
end
つづき def listup(path, exclusion) fullpath = File.expand_path(path) exc_rexp = exclusion ? /#{exclusion}/ : nil begin Find.find(fullpath) do |entry| next if exc_rexp && exc_rexp =~ entry update(entry) end rescue => e $stderr.puts e end end あと def f() begin ... rescue => ex ... end end は def f() ... rescue => ex ... end とかける
メソッド内にメソッドは宣言できるけど、クラスでメソッドを宣言したのと同じだし 他の言語の関数内関数のような期待されるものとは違う挙動するからな (スコープが関数内に限定される、言語によってはクロージャを自動で作るなど) RubyだとProcやlamdaでクロージャ作る方向ででいいんじゃないかな
> クラスでメソッドを宣言したのと同じだし 定義か、失礼。 動的言語でそもそも定義とよんでいいのかしらんけど
VBあたりに慣れている人だと 異国の魔言語みたいでキツイね。 スコープなどの基本的なところから異次元。
フツーに使ってるぶんにはわりとわかりやすくて異次元言うほどでもないと思うんだけど… いやまあ時々変な仕様のとこで引っかかって魔境になったりはするけど
VBの方が異次元
人間から見たら、異次元怪獣にみえるし、 怪獣からみたら、異次元人間に見えるし そんなもん
VB6 にだけは言われたくないと全言語が思ってると思う VB .net になってからはわりと素直 作りやすさのコンセプトが継続されてよくなった感じ
Basic使ってた人間から言わせるとVB.netは全然VBやBasicじゃないな Basicの皮を被ったC#だろ VBが期待されるのは、phpとかhspとかAutoHotKeyスクリプトとかそういうのだからな
他言語の話は荒れるからやめようぜ ここはRubyのスレ
Railsでしか使えないRubyの拡張って一覧ありますか
>>116 Ruby本体のマニュアルを適当に読んで適当に頭に入れるといい
それに書いてないものはすべて非標準
Railsがどうとか考える必要なし
Railsだけで完結することなんて稀でたいてい他の gem 使うわけだし
>>103 はdefを使わずに定義することでスコープを新規に作らずに
束縛を共有しているってことでいいのかな。
悪い、cattr_accesorもRailsか(というかActiveSupport)
>>120 みたいなアホにならないためにもある程度の初心者になったら標準Rubyのマニュアルは通読しましょう
Railsでインストールされるクラスのメソッドのスレ的に悪いところは、読み解くのに分厚い本の解説が要ること Activeなんとか単体ならまだマシなんだけど…
after railsだか言うらしいが、メタプログラミング使いすぎだろJK
メタプログラミングのないRubyなんて粕
ruby自体メソッドと文法の区別つかないじゃん
127 :
67 :2010/09/06(月) 22:08:39
>>104-106 私のレベルでは、まだこのエレガントなコードの解読が
出来ていませんが、明日試してみようと思います。
ありがとうございます。
Module内のメソッドでモジュール名を得ることってできないでしょうか? 例えばログを取るときに def foobar logger.debug("#{self.name} foobar called!!") などと書いてみたのですが、extendした場合なら モジュール名ではなくextendしたクラス名がself.nameで取れてしまいます。当たり前ですが・・・ Rubyのmoduleは単なるプリプロセッサのようなマクロではない構造なくはないと思っているのですが、 何か良い方法ないでしょうか?
変数にしないで、そのまま自分で書けばいいじゃん
はい、今はそのまま書いてます。 module FooBar def foobar logger.debug("FooBar foobar called!!") こんなコードですね。 ただなんだかRubyらしくないな、と
自モジュール名が変更される場合ってどんな時? それがないから変数としても用意されてないとか?
>>128 質問の意図がよくわからない。self.name がモジュール名を返すなら、selfはインスタンスじゃなくてモジュールオブジェクトだよね。
module A
def self.foobar
puts "#{self.name}.foobar() called"
end
end
こうしたいってこと?
class A include M end A.new.hello #=> "Hello, M !" b = B.new b.extend(M) b.hello #=> "Hello, M !" という動作をする module M def hello # Mは直書きしない puts "Hello, #{何か} !" end end を作りたいということかぬ
Rubyの内部動作のお勉強をしてるのでない限り不要な追求のような気もする module L puts '私はLです' end という直書きの仕方はRubyでは普通だと思う
1.8.7以降だが module M puts "Hello, #{method(__method__).owner}" end
>>133-135 まさにそれです。
>>126 何故かActiveSupport 3がパフォーマンス上の理由で、既存のクラスをmixinで拡張するのやめた話を思い出した
了解
>>136 "#{method(__method__).owner}##{__method__}"
でいけました
当たり前なんですが、これを共通化しようとメソッド化して他から呼び出しても、上記を書いたメソッド名が帰ってきます
__method__を引数にして渡すしか無いですかね。
だからそれやる意味ないだろう
http://www.sakalab.org/prog-ruby/ruby-man-ja-html-20051129/CGI_Session.html このページの最後の「ただ、名前を入力するとあいさつをするだけのつまらないCGI」を
少し改変してみたら動かなくなりました。
改変した部分は、cmd_startというメソッドで、
@cgi.out( @header ) {
となっている部分を
@cgi.header
として改変してヘッダーを出力させましたがinternalservererrorが出ます。
cgi.out(header)とcgi.headerとで違いはあるんでしょうか。
以下改変後のcmd_start
def cmd_start
@cgi.header
print <<END
<html><head><title>CGI::Session Demo</title></head>
<body>
<form action="#{ENV['SCRIPT_NAME']}" method="get">
<p>
あなたの名前は?
<input type="text" name="name">
<input type="hidden" name="cmd" value="hello">
<input type="submit" value="です。">
</p>
</form>
</body></html>
END
end
「たのしいRuby」でもちょっと難しそうと感じた私にオススメ教えてください
猿でもわかるRuby
Ruby逆引きハンドブックを買い、てやりたいこと 興味のあることを引いて試していく方が良いと俺は思う。 たのしいRubyは、一通りのことを無難に並べているだけの 退屈極まりない本で、オススメしない。
>>136 初心者スレなので、簡単でもいいので解説を求む。
>>145 それが出来るのは非プログラミング初心者
だいいちたのしいRubyで文句言うとかどんだけ贅沢なんだよ
みんなのなんとかとかそりゃもう以下略
>>143 作りたいものがないならプログラミングの勉強なんてやめて他の楽しいことをしましょう
>>142 改変もとの CGI クラスのインスタンスメソッド CGI#out がどういう動作してるか調べてから改変しろ
なんで改変先しか見てないんだよ
151 :
デフォルトの名無しさん :2010/09/09(木) 09:45:01
>>151 いや、俺も長年ぷログラム書いてめし食ってるが、作りたいものが無いなら
別のことした方が絶対楽しいと思う。
そもそもRubyでやる必要性があるか考えたほうがいい 結果的に早く目的が達成する手段がRubyであるというだけだろう
>>154 x ・method#owner
o ・Method#owner
>>146 ・ダブルクオーテーションの文字列リテラル内に#{}があると式展開される
http://rurema.clear-code.com/1.8.7/doc/spec=2fliteral.html#exp ・__method__ はメソッド名を文字列で返す
・methodはObject#methodで、指定したメソッドをMethodオブジェクトのインスタンスにしたものを返す
・.ownerはMethod#ownerで、そのメソッドの定義されているModuleを返している
>>140 も合わせるとこういう使い方するのだろう
module M
def puts_module_name
puts "Hello, #{method(__method__).owner}"
end
def puts_method_name
puts "Good bye, #{method(__method__).owner}##{__method__}"
end
end
class A
extend M
end
A.puts_module_name #=> Hello, M
A.puts_method_name #=> Good bye, M#puts_method_name
endの書き忘れを見つけづらいんだけどなんとかならないの? エラーメッセージが糞すぎる
>>156 なんともなんね
end でなくても } でも同じだとは思うが
自動インデント整形機能のあるエディタだと気づけたりそうでもなかったり
>>156 いくらRubyのIDEがないなどと言われる現状でも
実際のIDEではリアルタイムである程度文法チェックはしてくれてend閉じ忘れは編集中に表示してくれるが
お使いのエディタにはそういうのない?
endの閉じ忘れチェックの機能くらいはありそうなもんだと思うけど
>>156 君はまずendをつけ忘れるレベルから脱却しなさい
エラーメッセージが糞と言われても、 構文規則的にどうにもできないものだからどうしようもない。
>>156 一つは(
>>157 ,158が勧めるように)文法チェック機能のあるエディタ/IDEへ乗り換える方法。
あるいはendの書き忘れが問題にならないようなコーディング技法を身につける道もある。
自分の場合はvimで開発してるけど、最近だとend忘れは苦痛になっていない。
おそらく、以下の作法でコーディングするようになってきたからだと思う。
(1)インデント幅は(Ruby業界標準(?)の2文字ではなく)4文字にする。
(自分は K&R のC言語で初歩を習ったから、今流の2文字インデントは狭苦しく感じてしまう。)
(2)一貫したインデント規則を厳守する。規則は俺様流ルールで全くかまわない。
規則よりも一貫性を大切にする。(もちろん俺様流ルールは個人で楽しむ場合に限定される。)
(3)発想を手続き型から関数型へ切り替える。具体的には、wihle/for文は極力使わず、代わりに
リスト(Array/Hashクラス)とEnumerableモジュール(select/map/eachメソッド)を使う。
これによって自然とendの使用機会が減り、残るif式のendとブロック("{" .. "}")が
混在することで、コード全体にメリハリが出る。(ブロックならvimでカッコの対応がチェック可能。)
(4)1ソースのサイズは500step(せいぜい700step)までとし、それ以上はファイルを分割する。
(5)module/classに対応するendの後ろには、それと分かるコメントを入れる。例:end % module
1.9にはインデントとの対応を見ることで end抜けを発見するオプションが無かったっけ?
>>161 Rubyやってない人のスレへの参加はご遠慮いただいております
164 :
161 :2010/09/09(木) 17:21:29
>>163 意味不明。
>>161 は現在のRubyの話だよ。(K&R Cは過去の話だ。)
もちろん顧客相手の開発ではなくて、ごく個人的なツール開発だけど、それは無問題だろ?
%
>>161 が書いてるのは、どう見ても Ruby ユーザーのノウハウだぞ。
俺もだいたい同意見だが、いくつかフォローが必要そうなので書いてみる。
vim で色分けを有効にしてると、if end などの end と、メソッドやモジュールの end は
違う色になるので、対応がずれてると気付く。
それから、(3) を補足すると、やたら制御構造であれこれ書くのではなく、Ruby らしく
ブロック付きメソッド呼び出しを積極的に使うようにして、ブロックは do end でなく { } で
囲む。ということ。
167 :
161 :2010/09/09(木) 17:34:33
>>165 ああ、揚げ足取りがしたかったのか。いかにも2chらしいレスですね。
では、
>>161 (5)の末尾の文章を以下のように訂正。
[X] 例:end % module
[O] 例:end # module
168 :
161 :2010/09/09(木) 17:37:32
コメント記号として # を書けないって重傷だよな
あんま言うとそのうち藁とか使い出すからやめといたほうが… 素直にMLや研究室に引きこもってりゃいいのにと思うことはある
ナウなヤングはメーリスと言います
こうでいいじゃん module A end == A
>>172 module … end や class … end 自体は nil を返す
無意味な比較をするくらいならコメントでも書いたほうがマシ
真面目か
>>173 irb> class C; 1; end
1
def ... end が nil を返すから class や module も nil になることが多いというだけ
最後に何か書けばそれが返る
176 :
161 :2010/09/09(木) 18:18:34
>>161 の(3)について、具体例がないと理解しづらいと思うので、以下に書く。
このコードは、XML文書を別のテキスト形式へ変換するプログラムのトップレベル(メイン部分)の一部。
xml_doc = XmlDocument.new(source)
term_lists = xml_doc.map { |path, element, tag, attr, text|
trasform_xml_to_term_lists(
importer_id,
path, element, tag, attr, text
)
}.select { |term_list|
term_list
}.flatten
base_terms = xml_doc.map { |path, element, tag, attr, text|
trasform_xml_to_base_terms(
importer_id,
path, element, tag, attr, text
)
}.select { |base_term| # <-- 補足
base_term
}.flatten
(term_lists + base_terms).each { |term|
puts term
puts
}
補足:この部分は compactメソッド一発で書き換えできる。(1年前のコードをそのままコピペした)
(続く)
177 :
161 :2010/09/09(木) 18:22:46
(
>>176 の続き。これで終わり。)
以下は、Rubyコードを静的解析するツールの一部。(現在開発中)
def mo_include_modules
mo_modules = @object_model.mo_modules
@include_module_paths.map { |include_module_path|
mo_include_module = mo_modules[include_module_path]
if mo_include_module
mo_include_module
else
module_path, module_name = include_module_path.divide
MoExternalModule.new(module_path, module_name)
end
}
end
def mo_included_modules
@object_model.mo_modules.reject { |mo_module|
mo_module == self
}.map { |mo_module|
mo_module.mo_include_modules.map { |include_module|
{ :module => mo_module, :path => include_module.path }
}
}.flatten.select { |pair|
self.path == pair[:path]
}.map { |pair|
pair[:module]
}
end
なるほど Untouchable か
おまえがな
>>153 それいったらみんなphpにいっちゃう(初心者は)
>>180 いや、発端の質問(
>>149 )の内容は「あるruby本が難しそう」なのに、
それを
>>149 ,151が勝手に「作りたいものが無い」へと改変してレスしてるのが問題な訳で
おそらく「作りたいものが無い」というのは
>>149 ,151本人の切実な悩みで、
それを(
>>149 が自分より低レベルな初心者だと見下して)ヤツアタリしてるだけじゃないかと思われる
アンカーを間違えた。発端のカキコは>>じゃなくて
>>143 だし、
改変レスしたのは
>>149 ,151じゃなくて
>>149 ,152だ ,,,, orz吊ってくる
>>176-177 おじさんつられちゃうぞ
制御構造をブロックで表現するもの場合は do end したくなるが、
mapのようにEnumerableなものは複数行でも { }で表したくなるということだな。
>>161 で言っている意味わかってきた
複数行=do end厨の俺にはつられたくなるのも分かる
もうわかったからリャマ本パクってこいよ 表紙赤くすればバレないって
趣味のプログラミングなんてやりたくてやるもんだからなあ 必要ない状態なのなら無理に勉強せず放っておいたほうがいいと思う その人の人生に必要なのなら必ずまた巡り合う 車を運転しなければいけなくなるときのように
>>186 自分もようやくそれに気づいた。
35年間独学でプログラミングを勉強してきたが
何一つ身につかなかったのは、能力のせいではない。
結局自分がプログラムを作る必要に
迫られていなかった、ということだ。
作りたいモノがあるなら、作りたいという情熱があるなら
どんな難しい本でも読みあさって身につけていたはずだ。
犬小屋作る羽目になって日曜大工の基礎スキルがあがるのと似たようなもんだな 板と釘と金槌買ってきて本を見ながら釘打ちと釘抜きを100回繰り返しても辛い
Web関連や文字列いじりで作りたいものが(思いつか)ない人はRubyの学習が遅々として進まないかも C#やJavaで放っておいても見慣れたウィンドウがぽこぽこできる環境だと作りたいものが思いつくかも あるいはその逆もあるかも かものはしかも
>>184 ここは初心者スレであって、バトルスレではない。
また、少なくとも
>>143 のカキコは初心者の態度としてマナーを逸したものでは無く、
なおかつ「プログラミングが楽しくない」とか「造りたいものが無い」とは、どこにも書かれていない。
そんな
>>143 をつかまえて、いきなり「勉強なんてやめろ(
>>149 ,152)」とレスするのは
非常識ではないのか、と言いたかった。
カキコのネタが無いなら黙っていればいい。漏れはそうだった。
あるいは「具体的には、どこが難しいと思ったの?」と逆質問を返すこともできたはずだ。
まあ、バトルスレでハイテンションになっていたというのは理解した。
漏れはてっきり、
>>148 ,152を心身に重い障害(ストレス)を抱えた気の毒な人のカキコだと勘違いしたよ。
再度、言う。ここは初心者スレであって、バトルスレではない。
自分にしか分からないスレ違いの話題で初心者を惑わすのは、それこそ悪徳商法または新興宗教の手口。
そして、誰でも最初は皆初心者であったことを想い出せ。
>>187 いや、35年やって身に付かないなら、さすがに他にもっとクリティカルな問題があるよ…
不用意に煽らなくていいから Railsスレみたいになっても知らん
Ruby こそ現代の COBOL
Ruby は読み易さよりも書き易さを重視した言語
メソッドチェーンのお陰で、左から右にフローが書けることが結構多いんだよな
>>199 SUGEE
「そのまま」がポイントだな
あまりにもエスパーすぎて5分ほど意味が分からなかった
分からん testだったらどっちになるんだ?
Cと同時に学んでいるけど、ざっと見て Cの100倍くらい覚えることが多い感じっすね。 オブジェクト指向のため、言語仕様がデカくて複雑。 プログラミング初心者が最初に学ぶべき言語では ないと思うっす。
ぷw
前半はネタだろうけど後半は同意
Cの言語仕様はそれなりに大きいんだけどなあ JISやISOの仕様書はだいたい200ページ Rubyのドラフト規格(まあサブセット的なものではあるけど)も200ページぐらい
RubyはRailsやその他のメタプログラミングの要素も入れないと話にならない
208 :
161 :2010/09/11(土) 05:50:36
>>183 わかってもらえる人が増えてくれるというのは嬉しいものです。
>>176 ,177のコードを読むポイントは、以下の3点だと考えました。
(1)if や case は「文」ではなく、「式」である。
(2)複数行(式)から構成されるブロックの評価値(戻り値)が、最後の式の評価値である。
(3)メソッドセレクタ(".")はUNIXシェルのパイプ("|")である。
>>205 でしょ。
Rubyで楽しくプログラミングを学ぼう!なんて謳い文句の
入門書があるけど、あれはひどいと思うっす。
たぶん本を買った人のほとんどが挫折してるっす。
それは他のプログラミング言語も同じようなもんだぬ
211 :
デフォルトの名無しさん :2010/09/11(土) 07:21:10
>>203 最初の頃はシンプルだったけど、今はすげぇ水膨れしてる気がすう。
Cにしたって、Windowsみたいにライブラリーが膨大だと、stdio.h, stdlib.hさえ
押さえればなんとかなるUNIXのCよりずっと難しい。
unistd.hもよろしくね
でも実際Rubyのオブジェクト指向って難しいと思う 処理系がどうなってるか想像できれば納得できるけど入門者に理解できるのかこれ
たしかにRubyのオブジェクト指向って複雑だよね 単一class継承だけどmoduleのMix-inはあるし、 メタプログラミングがやたらと使われてるから
>>209 俺のことかー!!!
たのしいRubyが微妙すぎ、初めてのプログラミング最高。
>>215 ナカーマ
たのしいRubyはたしかに微妙だった。
逆引きハンドブック読んだら、
数字の並んだファイルを読み込んで
いい感じに処理してCSVで吐き出す
くらいのミニミニスクリプトは書けるようになった。
どういうときに自分でクラスを作ればいいのかは、いまだによく分からん。
下っ端の利用者は def main だけ使ってりゃいいんだよ
Ruby 楽しいですね。ニートの暇つぶしに使える。 こんな面白いのはLISP以来かも
仕様がシンプルなのが好みならLuaにでも行けばいい ただRubyの仕様も初心者が使うべきでないものがいくつもある 特異メソッドとかalias, undefには手を出さない方が良い 継承もできるだけ使わない方がいい 委譲とダックタイプでほとんど事足りるのだから
>>218 Rubyでmainって「トップレベルのself」ってイメージがあるから
あんまり使いたくないなあその名前
そだな わざわざ被る名称を選ぶこともあんめえ $ ruby -e "p self" main $
Rubyだけじゃなくプログラム全体の初心者には、入門書はたのしいRubyよりもRuby(@初めてのプログラミングからの全三冊) の方がよさげな気がする・・・と言いたいところなんだがお前らだとどうかナ 全編通して1.9で解説してるのを良しとするかどうかがこのスレ的に微妙かも知れんが
標準ライブラリのopen-uriとnet/httpって何が違うんでしょう? それぞれの長所短所を教えてもらえると嬉しいです。
>>224 net/http はHTTPを直接喋るために使う。
HTTPリクエスト/レスポンスヘッダを操作したり(セッションとか
クッキーの操作も結局はこれ)、GET以外のメソッドを使ったり。
open-uriはURIをファイル名であるかのように見なして内容を取得する
という限られた用途のために使う。内部ではnet/httpを道具として使っ
ている。
わからないうちは、
単にURLの指す内容をHTTP GETするだけなら open-uri
それ以上のことがしたいなら net/http
Ruby標準の「ほーむぺーじあくせすらいぶらり」がnet/http そのnet/httpを利用して便利にサイト取得できるようにしたのがopen-uri open-uri は HTTP の知識がなくても利用できるが、 net/http は基礎動作過ぎて HTTP の知識がないと扱えない open-uri のほうが一般ユーザー向けだが、open-uri はぜんぜん万能ではないので、 open-uri にできないことに遭遇したなら、標準ライブラリの範囲内では net/http を勉強して利用するしかない
net/http だと記述量が多くてめんどいというだけだよね net/http 自体はそれなりにそこそこ使いやすくはある
228 :
224 :2010/09/11(土) 22:42:09
ホットペッパーとかぐるなびなんかのapiでxml取得して解析して・・・ってのをやりたかったんだけど 色々調べてみたらこの2つのライブラリを発見したので聞いてみました とりあえずそういう用途ならopen-uriのほうが良さそうなのかな たくさん答えていただいてありがとう
Rubyに限らないけど、他サイトに直接アクセスする アプリはあんまり作らない方がいいんじゃないかな。 この前ニュースになったでしょ。 図書館の蔵書情報を得ようとして 自作アプリからサイトにアクセスしまくって ダウンさせた人が逮捕されたってのが。
プログラムの問題じゃなくて 三菱が埋め込んだサイト側のバグだろ その逮捕は取り消されるべき
231 :
224 :2010/09/11(土) 23:41:29
>>231 APIの公開/非公開は関係ない。
一定の常識があれば、連続的に間隔を置かずアクセスすれば、
相手(Webサービス提供者)に迷惑がかかることは分かるだろ。
API非公開でも(生のHTMLをGETしても)、一定の間隔を置けば無問題だし、
API公開サイトでも、長時間に渡って無間隔でアクセスし続けるのは問題になる。
自分の行為が相手にとって迷惑かそうでないか、社会一般常識と照らし合わせて判断し、
マナーを守ってサービスを利用しなさいってこと。子供じゃなけりゃ何も難しいことじゃない。
>>229 は、本人が常識を知らないお馬鹿さんだから、無視してヨシ
あるいは、単なる嫌がらせカキコだよ
omae mona
>>225 open-uriはメソッド拡張しちゃうのがキモいから、俺はスクリプティング専用にしてる。
んだな net/httpで実装を始めて必要に応じてStringIOを返す メソッドを自作した方が後々楽だし弊害も少ない
>>229 は他所で散々繰り返し議論されてるんで、そっち行ってくれや
>>237 おいおい、俺はRuby初心者に警告してやってるんだぜ。
もしこのようなWEBアクセスアプリを組む目的で
Rubyを学ぼうとしているなら、それはやめた方がいい。
スクリプト言語を学ぶ主な動機の98%がエロ画像の収集だという確固たる調査結果があるのに お前はいったい何を言ってるんだ
>>223 両方持ってるが、後者のほうが色々と実践的かつ親切だとは思う。
defで関数の定義をする解説なんだが
たのしいRubyは「こうやったら作れるよ」で終わってる所を
Rubyはじめてのプログラミングでは「こうやったら作れるよ、こういう時に作るんだよ」まで書いてある感じかなぁ。
でも三冊揃えるとたのしいRubyの倍くらいの価格だし、実践的である分初心者には難しく映るかも。
rubyに限った話じゃないけど、forkとThreadの違いがよくわかりません。 Thread → そのスクリプトの中である処理を同時に行う fork → 別々のスクリプトに書かれてる処理を同時に行う って感じで理解してますが間違ってるんでしょうか? あとforkの使い方もいまいちわかりません rp, wp = IO.pipe pid = fork if pid rp.close count = 0 loop do wp.print(count, "\n") count += 1 sleep 1 end else wp.close while c = rp.getc STDOUT.putc(c) end end 上のコードが参考書に載ってたんで試してみたのですが、 どのような流れで動いてるのかもよくわかりません forkを使うとどういう流れでプログラムは動くのでしょうか?
forkは自分自身をもうひとつ作る で fork() の戻り値が fork() を呼んだ方か 複製されたもうひとつの自分かを示しているので 戻り値に従って次の動作を変えるようにプログラムするのが普通
rp, wp = IO.pipe pid = fork if pid rp.close count = 0 loop do wp.print(count, "\n") count += 1 sleep 1 end else wp.close while c = rp.getc STDOUT.putc(c) end end この場合 fork する前に rp, wp = IO.pipe を作って fork するから rp <- IO.pipe -> wp という PIPE が作られる fork を呼んだプロセスを A として fork で作られたプロセスを B とすると最初はどちらも同じ状態なので rp(A) <- IO.pipe -> wp(A) rp(B) <- IO.pipe -> wp(B) という二重化された結合が出来る (IO.pipe は同じもの) if pid によって pid の値のある方 (fork を呼んだ方 = A) は rp(A) を閉じる 一方 else によって pid の値が 0 の方 (fork で作られた方 = B) は wp(B) を閉じる このとき IO.pipe -> wp(A) rp(B) <- IO.pipe という状態になっているので wp(A) に書き込んだデータが rp(B) の方で読み出せるという塩梅
ああ 矢印の向きが変だった orz 適当に脳内変換して読み替えて rp <- IO.pipe <- wp ↓ rp(A) <- IO.pipe <- wp(A) rp(B) <- IO.pipe <- wp(B) ↓ IO.pipe <- wp(A) (if pid ) rp(B) <- IO.pipe (else の方で読み出し)
>>241 通常、forkした(=forkによって生成された)子プロセスは、
他のプログラムをexecする(=プログラムをロードして実行する)。
いわゆる fork/exec と呼ばれ、二つの操作を組み合わせることが多い。
言い換えると、forkだけを使ってexecを使わないのは特殊なケース。
fork/execパターンを使用する典型的なプログラムがシェル(shやbash等)。
シェルはユーザからプログラムの実行を指示されると、forkでプロセス(自身のコピー)を
生成し、その子プロセスは指定されたプログラムをexecする。
これはforkが親プロセスと子プロセスとの間でメモリ空間が分離されているから実現できる。
それがスレッドとの決定的な差異。
スレッドは、親子間でメモリ空間を共有するからシェルのような機能は実現できないけど、
逆にメモリ空間を共有するから、スレッド生成のオーバヘッドが(プロセス生成よりも)小さいという
利点もある。これは大量の並行処理を実装しなければならないサーバーアプリケーションでは特に有用。
たとえばWebサービスの場合、小規模であれば(プロセス生成を伴う)CGIを使ったアプリでもかまわないが、
大規模なWebサービスを実装する場合には(スレッド生成を伴う)Apacheモジュール(mod-ruby)の導入を
検討する必要性がでてくる。
forkに失敗したときの処理は書かなくて良いんですか?
>>239 ネットウォッチとアフィリエイトサイト作成も入れてくれ
> rubyに限った話じゃないけど、forkとThreadの違いがよくわかりません。 fork→mswin32だと使えない Thread→mswin32でも使える
cgi = CGI.new("html4") cgi.ol(){ ["A","B"].map{|x| cgi.li(){x} } } 上記コードを、1.8と1.9で動かすと結果が変わってしまいます 1.8の場合 <OL><LI>A</LI><LI>B</LI></OL> 1.9の場合 <OL>["<LI>A</LI>", "<LI>B</LI>"]</OL> 1.9で1.8のような結果になるようにすることはできますか?
あー悪い、Array#to_s を活用してる人は 1.9.x で注意な irb1.8> p [1, 2, 3].to_s 123 irb1.9> p [1, 2, 3].to_s "[1, 2, 3]" CGI の cgi.foo(){ なにか } のなにかは暗黙ではない文字列であることが望ましい つまり手動で文字列にしとけ cgi = CGI.new("html4") cgi.ol(){ ["A","B"].map{|x| cgi.li(){x} }.join }
>>249 別にあおりじゃないけど、cgi.rbのタグ生成メソッドを使ってる人って初めてみた。
あれって何か利点あるのかな。ERBのほうがずっとつかいやすいんだけど。
・ ["A","B"].map{|x| cgi.li(){x} }.は配列を返す、 ・ cgi.ol(){ … } はブロック内のオブジェクトを to_s して処理する ・ Ruby1.8のArray#to_s は要素連結だが Ruby1.9 のは inspect だ という複合要因だな 配列をそのまま「自動to_s機構」に渡すのはわりとバグ入れ行為だ Array#join とかで自前で明示的に文字列にしておいたほうが安心
>>251 Ruby のブロックつきメソッドで「R u b y ら し く」 HTML を生成することができます
うん、そんだけ
Rubyスゲー時代にうっかりRuby駆使して作ったライブラリが今も残ってる状態
というかCGI.pmにあったから移植したんだろう
テンプレートっていうか RoR 使うようになったら erb いらなくね?
じゃあ全部Railsで作ってRailsで動かせばいいんじゃね
RailsってRubyでしか動かないの?
他言語 on Rails は趣味実装試験実装レベルでは存在する Ruby on Rails がいちばん完成度が高いというか、Ruby 以外では Rails 相当を作っても得しないんだ どー考えてもライブラリを直接書いたほうが早い ああ、Lisp なら得できるかも
「Rubyってスゲェんじゃね!!?」と興奮した時期時代にテクニック(笑)を駆使して作ったライブラリの後始末が大変、 というのは甘酸っぱい青春の思い出的にわりと広く認知されていることだと思ったが違うのか
それはj
Ruby on Rails ってどうして Rails on Ruby じゃない訳?
えw
どちらも同じじゃ。それがわからんのか
すまん アホなんで教えてちょんまげ
強いて言えばレールの上を走る電車と、 レールを屋根にのっけて止まってる電車の違いじゃ どっちもかわらんのじゃ
A on B と B on A は接触という点において差はない
Ruby1.9.1 で png 形式の画像が読み込めて ピクセル毎の RGB 値を取得できるライブラリでお勧めはありますか? 複数人で使用するため、なるべく導入が簡単なものがいいです
初心者が、岡崎図書館事件のようにならないためにできる防衛策としては、自前サーバじゃなくレンタルサーバで実行すればいきなり逮捕ってことはないかな? レンサバが先に逮捕されそうな気がするけどどうだろう?
>>269 その話はもうやめよう。
Rubyからサイトにアクセスするなんて
初心者のやることじゃないし。
またおまえか
ありゃなんかタブー扱いになってんの? 別に板違いでもないし、明日は我が身だと思うけどな まぁ禁止ならこれで終わりでいいです 229とは別人っす
またおまえらか
229は俺だけど、 書くとイチャモン付けて潰そうとしてくる変なやつらが 常駐してるんで、スレが荒れるからそれ以上書かないことにした。 Rubyは他サイトに容易にアクセスできる言語だから 初心者が安易にそういうスクリプトを書かないよう 指導するのもこのスレも役目だと思うんだけどさ。
相手システムが常軌を逸したタコシステムだったというだけで、 10並列で毎秒100とかとんでもないことをやんなきゃ 安易に書いたっていいじゃん。 どっちかといえば、安直に調書にサインするからこんなことに なるんだってのを広める方が大事じゃね?
>>276 クロスドメインクッキーインジェクションとかの話もしてください
>>277 あきらかに自分のアクセスが原因で落ちていることは分かっているのに
IPアドレスブロックされてもプロバイダ変えてしつこくアクセスしたら
そりゃ相手が糞システムだと言い張る度胸はなかなか持てない
>>276 よく分からんけど、料理板の包丁初心者スレで
包丁は殺人の道具になるから安易に振り回さないよう注意してあげたほうがいいよね!!
などと、言ってるのと大した差は無かったりする
当人の記述を信じるなら、 固定IPのレンタルサーバ(3月14日から3月31日、cronで起動) プロバイダより割り振られるIPの自宅や実家(4月2日から4月15日、Thinkpadを持ち運んで自宅と実家から手動で、日毎にどちらか一方から) プロバイダを変えてなんて書いてないけど…
>>278 まあそういうことになるよな
単なる自転車置き場の議論だ
プロバイダ変わってるじゃん
>>282 「ボクでも話に参加できる」からなー
タチ悪いわー
DBのコネクションを切らずに放置しちゃうシステムを擁護してるやつって まともなシステム作ったことないだろ。 実際同じソフトを使ってたほかの図書館では通常利用で落ちてたということだし。
>>283 移動に伴って変わるのと、ブロック回避のために変えるのを同一視か。
別にどっちでもいいよ。結果的には、落ちてからでもしつこくアクセスしたんだから。
>>288 まとめもなにも、みんな知ってて話してるものかと眺めていたが、
読み返すと確かに経緯を知らない奴もいるな。
それじゃ訪問者いなくなるぞ
>>270 のシンプルな一言が読めないアホが多すぎる
269だけど、事件の流れは把握した上で書いた それでも、たとえ図書館や警察やMDISがアホだったという結果論だったとしても、実際にプログラム作成者が逮捕されたのは事実 日本では、逮捕される=犯罪者、という誤った認識がある以上、社会的に終了しないためにも逮捕されるのだけは避けなくてはならない そうした上で、そういう誤認逮捕を可能な限り事前に避ける為には、どうすれば良いか?、という話を振ったつもりだった 上級者ならそういう情報や技術に長けてるから、自分で回避できるだろうけど、初心者はそういう事件があったことすら知らないかもしれない そういうのが、最初から自分のパソコン(自鯖含む)からスクレイピングやらなにかやりはじめたら、同じように逮捕されるリスクを伴う レンサバなら、苦情は一旦レンサバ側に行くから、いきなり即逮捕されることはないんじゃないだろうかと思った でもRubyやRailsを自分の都合のいいように使えるレンサバはまだ少ないから… 長くなってしまったのでここでやめておこう
「Ruby利用者が逮捕」って記事に見出しが付くのを恐れてるんじゃまいか
>レンサバなら、苦情は一旦レンサバ側に行くから、いきなり即逮捕されることはないんじゃないだろうかと思った 岡崎の件ではさくらにも捜査が入ってトラウマになったのか さくらの利用規約が変わったとか つまりレンサバの共同利用者にも迷惑が掛かる行為だと認識すべし
>でもRubyやRailsを自分の都合のいいように使えるレンサバはまだ少ないから… 安いVPSいっぱい出てるからこれから増えるよ
297 :
269 :2010/09/15(水) 10:29:38
>>295 自分もこの事件が起こるまではそういう考え方だった
いきなりレンサバで動かしてリソース使いまくったらほかの利用者に迷惑掛かるだろうから、まずは自分のパソコンだけでいろいろやってみて、上手に使えるようになったらサーバで使おう、と。
でも、この事件によって、自分のパソコンでいろいろやってみてる間に逮捕される可能性があることがわかった
例の逮捕者は、3箇所からアクセスしていて、そのうちのひとつがさくらなんだろうけど、仮にさくら1箇所からだけしかアクセスがなかったとしたら、今回のような「即逮捕」になっただろうか?
アクセス元が個人じゃなく、特定のレンサバだったら、逮捕前にもうワンクッションあったと思うんだよね
それによって利用者がさくらを利用停止や強制退会になったとしても、逮捕に比べりゃ全然マシといえる
同じさくらの周りの利用者にとってはいい迷惑かもしれんが、自分が逮捕される可能性が少しでも減るなら背に腹は変えられない
>固定IPのレンタルサーバ(3月14日から3月31日、cronで起動) >プロバイダより割り振られるIPの自宅や実家(4月2日から4月15日、Thinkpadを持ち運んで自宅と実家から手動で、日毎にどちらか一方から) 憶測で悪いんだけどこの時間の流れ見ると 4/1にさくらのIPアドレスがアク禁になったから自宅と実家からやり始めたように見える
299 :
デフォルトの名無しさん :2010/09/15(水) 10:44:02
>>297 まずさくらで使っていて、さくらのIPアドレスでアクセス禁止が行われた。
しかし、さくら側に連絡が行ったわけではなかったので気づけず、
さくら側のCPU占有率制限に引っかかったと誤解して、
さくら以外からアクセスすることになった。
で、警察的はこれが「制限したのにアクセスしてくるから悪質!」と取られたわけだ。
ということもまとめサイトに書いてあります。
結果的には誤認逮捕だったんだから マスゴミでももっと大きく取り上げても良いと思うんだがな
この議論をあえてRubyスレでやる理由がわからない
同意
>>303 Rubyスレどころか「初心者スレ」だからな
本スレでやるならともかく
307 :
デフォルトの名無しさん :2010/09/15(水) 22:20:35
1.9.2で追加されたArray#repeated_combination 今まで自分で実装していた同種のものより圧倒的に速いんですけど これってC言語で書かれているんですか?
array.cのrb_ary_repeated_combination関数が実体。 ついでに、 Array.instance_method(:repeated_combination).source_location #=> nil Rubyで実装されたメソッドの場合はその定義位置が返る。
Ruby メタプログラミング って Ruby のバージョンいくつが対象ですか?
メタプログラミングRuby だった スマソ
質問です。 たまにRuby win32のスクリプトをbatファイルがわりに書く事があるのですが、 外部コマンドの実行をするベストソリュー・・・ 良い方法は何があるでしょうか? Kernel#sysmem逐一実行してくれるのですが、例えばloggerに渡したい時などに出力を得られません。 `your_command` の記法だと出力を得られるのですが、逐一出力が得られません。 よい方法はないでしょうか?
312 :
311 :2010/09/16(木) 00:40:14
loggerでSTDOUTとファイルに両方出力する方法はありませんか? コマンドラインからなら、STDOUTに出しておいてteeにでも渡せばいいのですが、 あくまで例の一つですが、.irbrcでRails版irb(script/consoleです)のlogger出力を置き換えたい時に RAILS_DEFAULT_LOGGER = Logger.new(STDOUT) とだけすると、コンソールにはlogger出力ができて便利にはなるのですが、 デフォルトのようにファイルにはログを吐く、ということができません。 Loggerで複数の出力先を指定する方法はないのでしょうか? IOを渡せばいい、ということであれば複数に出力するIOなんてあるものでしょうか?
そういうオブジェクト作ればいいんじゃね Logger のマニュアルを見ると Logger.new の引数は write と close があればいいらしいので class Tee def initialize(io, file) @io = io if file.kind_of?(File) then @file = file else @file = File.open(file, 'wb') end end def write(s) @io.write(s) @file.write(s) end def close @io.close @file.close end end logger = Tee.new($stdout, './log.txt')
logger = Logger.new(Tee.new($stdout, './log.txt')) だった まだ眠い あと標準出力は定数 STDOUT ではなく予約されたグローバル変数 $stdout を使うのが普通 (というか昨今のマナーとしてほぼ必須) なんでかというといざというときに捻じ曲げ可能で便利だから $stdout = File.new('output.txt', 'wb') とするとそれ以降の $stdout 対応メソッド、関数的メソッド puts や print や p の出力先がファイルになる こんなこともあろうかと超便利
>>309 1.9系が基本で、バージョンで差異がある部分には都度言及がある。
rubyでmysqlを使いたかったのでgemでMysql/Rubyをインストールしようと思ったのですが 上手くインストールできていないみたいで困ってます。 コマンドは以下の通りです。 $sudo gem install mysql Building native extensions. This could take a while... Successfully installed mysql-2.8.1 1 gem installed Installing ri documentation for mysql-2.8.1... No definition for next_result No definition for field_name No definition for field_table . . . No definition for time_equal No definition for error_errno No definition for error_sqlstate これで上手くインストール出来たと思ったのでirbを起動し、 require 'mysql' とやって確認したのですが LoadError: no such file to load -- mysql が出てしまいます。 ちなみに環境はRuby1.8.7、Mysql 5.0.77、CentOS 5.5です。 よろしくお願いします。
rails3やrspec2も出揃うし、そろそろ1.9に移行する頃かな?
>>317 rubygemsの仕組みは1.8が出てからデファクトスタンダードになり、
1.9で標準添付になった、という経緯なので、1.8では明示的に
ライブラリとして rubygems を require する必要がある。
irb -rubygems -rmysql
シェルの設定で
RUBYOPT=-rubygems (または、RUBYOPT=-rrubygems)
export RUBYOPT
しておくと、勝手に毎回使ってくれるのでおすすめ。
RUBYOPT 使用はあまりお勧めされないのではなかったか
>>318 指定したRubyGemsが1.9に対応しているかチェックするwebサービスなかったけ?
rubygemsって1.9で標準になったんだ、しらんかった
>>319 ありがとうございます。無事require出来ました。
>>320 うん、require 'rubygems' は必要な人が必要な時に自力で書く
>>324 gem ライブラリとして公開するときは書かないほうがいいんだっけ
326 :
デフォルトの名無しさん :2010/09/17(金) 18:32:01
tableA id|first_name|last_name|code tableB id|first_name|last_name|address|code 上記のようなテーブルがあり(ActiveRecordで作ったSQLite3) SELECT tableA.id AS A_id, tableA.last, tableB.id AS B_id from tableA LEFT OUTER JOIN tableB USING(code) WHERE tableA.code IN (SELECT code FROM tableB WHERE last_name = ''); とすると次のように結果が得られます。 A_id|last_name|B_id .... .... (両方のテーブルのidを取得するのが目的です。) ところが、Active Recordで Table_A.find_by_sql(["select tableA.id AS A_id, talbeA.last_name, tableB.id AS B_id from tableA left outer join tableB using(code) where tableA.code in (select code from tableB where last_name = :name)", {:name => ''}]) としても Table_B.find(:all, :select => 'tableA.id as A_id, tableA.last_name, tableB.id as B_id', :joins => 'LEFT OUTER JOIN tableB USING(code)', :conditions => 'tableA.code IN (select code from tableB where last_nam = "")') としても同じ結果を得られません。 ようするに,tableBのlast_nameが未入力であるもののidと,それにcodeで対応しているtableAのidを同時に取得したいというのが目的です。 (-> [#<Table_A last_name: "ほげほげ">]みたいなかんじでで,肝心のtableA.idとtableB.idがない。) 構文のどの辺りが間違っているのでしょうか? よろしくお願いいたします.
>>326 ActiveRecodeの振る舞いに関する相談なんだから、
このスレじゃなくWebProg板のRailsスレで質問すべきだろうし、
そのほうが
>>326 が期待する返答を得られると思うよ
ActiveRecord単体なら別にここでもいいよ ただ、回答率は低いとは思うが
上記のようなテーブルがあり(ActiveRecordで作ったSQLite3) SELECT tableA.id AS A_id, tableA.last, tableB.id AS B_id from tableA LEFT OUTER JOIN tableB USING(code) WHERE tableA.code IN (SELECT code FROM tableB WHERE last_name = ''); とすると次のように結果が得られます。 A_id|last_name|B_id .... うそつくな エラーになるはずだろ
それ以前にJOINしてるのになんでサブクエリー使ってるの? sqlite使ったことないけどおかしいし、かなり遅くなると思うだが sqliteの時点でパフォーマンスなんて関係ないかもしれんが
if ture x=5 end puts x => 5 これは・・・rubyの仕様なのですか?
そうだけど、どんな結果を期待していたのかな?
ifはスコープを作らない。
334 :
331 :2010/09/18(土) 01:06:19
>>332 nilを期待してました。。
>>333 ありがとうございます。
そういうことだったのですね。
for i in 1..10
puts i
end
puts i => 10
実験してみたらfor文も同様ですね!
う〜ん不思議な仕様だ
スコープを作るのはclass, module, def。 あと、ブロック(do...end, {...})でのローカル変数の扱いが少し特殊(1.9でシンプルになったけど)
>>334 (1..3).each do |i|
puts i
end
puts i
rubyで実装された簡易的なcronってないですか? デーモンとかじゃなくユーザーのプロセスとして動くものでいいんですが。
ないです
無限ループにsleep(1)挟んでTime.now覗きゃそれっぽくなんでねーの
> ユーザーのプロセスとして動くもの そんなものイヤだ…
crontabの文法が発狂しているから何か代替記法が欲しいという 話なら whenever あたりを見ればいいんだが、(簡易な)cronその ものが欲しいのかな?
342 :
326 :2010/09/18(土) 13:13:20
>327 適切な誘導をありがとうございました。2chは広すぎて,適切なスレがわからないこともあります。 (スクリプトのできも含めて初心者ということで^^)
Rubyのバージョンの使い分けについて質問です。 rvm でローカルユーザについては 1.8.7 と 1.9.2 を切り替えて使うことができるようになりました。 しかしCGIなどウェブサーバで使う Ruby のバージョン切り替えはどうすればいいのでしょうか。 毎回 make install して上書きするものなのでしょうか。
>>344 よくわからんがyoutubeの動作はyoutubeに聞け
>>345 rvmでやれんこともないけど。
configureスクリプトの--program-prefix、--program-suffixオプション
などで異なる実行ファイル名になるようにする。
同じく--prefixオプションで入る場所自体を分ける。
など
>>345 サーバーサイドはrvmのようなものと思想的にあんまし合わない気がする
実行時にさくっと切り替える方法もないしな
/usr 以下に rvm をインストールして運用する方法がオフィシャルにあるので
それ見て適宜 sudo するしかないかと
default_ruby から /usr/local/bin/ruby にシンボリックリンク張っとくとか
349 :
345 :2010/09/19(日) 14:07:25
>>347 >>348 なるほどちょっとrvmでやる方法はおいといて、先に別名でインストールして切り替える方向で行ってみます。
ありがとうございました。
別名でインストールとかあり得ん。 素直にprefixオプションで違う場所にインストールした方がいいよ。 あとはrubyコマンドにシンボリック張り替えるだけでOKでしょ。
Phusion Passenger 3.0がrvm対応になってたよ
353 :
345 :2010/09/19(日) 15:00:37
>>350 あ、そうですかね。
今標準で入っている1.8.7が/usr/bin/なので
1.9.2を/usr/local/binに素で入れてみます。
あれそうするとシンボリックリンクをどうするのがいいのかな・・・←初心者かww
configure をよく読めば「実行ファイル群に prefix や suffix つけて ruby1.8.7 や irb1.8.7 としてインストールする」という設定がある これ使ってインストールして、メインにしたい実行ファイルだけ ruby や irb としてシンボリックリンク張れ
既に/usr/binにrubyがインスコされちゃってるから困ってるのでは?
PATHなんか好きなようにいじれるし、絶対パス指定というのもあるのに何が問題?
ruby enterprise使ってる人は少ないのかな? rails使いなら現状では他に選択肢は無いと思うんだけど。
鋸入れたいんだけど↓
$ gem install nokogiri
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.
/usr/bin/ruby.exe extconf.rb
checking for libxml/parser.h... yes
checking for libxslt/xslt.h... yes
checking for libexslt/exslt.h... yes
checking for xmlParseDoc() in -lxml2... no
-----
libxml2 is missing. please visit
http://nokogiri.org/tutorials/installing_nokog iri.html for help with installing dependencies.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.
…
誰か解決方法教えてください。
libxml2-2.2.7、libxlt-1.1.26インスコ済み、
win7-32、cygwin版ruby1.8.7です。
>>359 はっきり言う
これを解決できないような人間がcygwinなんて使うな
素直にmswin32版使え
> これを解決できないような人間がcygwinなんて使うな に一応同意を返しておきたい気はする xmlParseDocということはlibxml2だな cygwinってなんか変なとこにヘッダファイル置いたっけ? とりあえず示されたサイト見るといい gem installするときにlibxml2やlibxsltのディレクトリを指定する方法が載ってる
libxml2-dev みたいなのをcygwin のsetupでインスコせよ。
…え、パッケージ使ってるの? なんで?
>>363 いまは cygwin も主要ライブラリはパッケージですよおじいちゃん
コンパイラ入れないこともできます
あー忘れてた
>>362 cygwin では devel
libxml2-devel と libxslt-devel がいるね
centos5でruby/gemを使っています。 require "rubygemes" require "twitter" しただけで、 /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': /usr/lib/ruby/1.8/rexml/element.rb:445: Invalid char `\277' in expression (SyntaxError) /usr/lib/ruby/1.8/rexml/element.rb:445: syntax error, unexpected '=', expecting kEND ?% doc =hvocumend?new "<z.some t?xt <b... (以下Invalid charが延々と続く) のように死ぬので、エラーメッセージを参考に /usr/lib/ruby/1.8/rexml/element.rb を見たところ、445行目以降が文字化けを起こしていました。 マルチバイトなんて使ってるわけがないのですが、ファイルとエディタのエンコーディングを間違えているときのように化けています。 これはgemから再インストールしたほうがいいでしょうか?
367 :
359 :2010/09/20(月) 00:17:16
>>366 rubygemesだからじゃないっすかね
369 :
デフォルトの名無しさん :2010/09/20(月) 14:17:34
,―ヽ____、― ,/ ノ ヽ ~\ / ノ IPA ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ 「言語設計者たちが考えること」にMatzのインタビュー載るからな。おまえら、読めよ。 i、 \___/ _/ \ ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i | > ヽ. ハ | ||
rubyのfor文は以下のようにinを伴う構文しかないのでしょうか? for element in array puts element end Javaみたいに for (int i = 1; i < 10; i++) { } のような書き方をしたい場合は、forではなくtimesメソッドを使わなければ出来ないのでしょうか。
(1..10).each
1.upto(9) do |i| p i end
for文は使わないのがあたりまえ。
for i in 1..10 (終端を含む) for i in 1...10 (終端を含まない)
↑何も特別な記法ではなく、単にinのあとにRangeオブジェクトリテラルを 置いただけだからな。ねんのため。
開区間と左閉右開区間の区別をドットの数で決めるのは単なる悪習で、使用しないほうがよい イテレーションなら Integer#upto なり Integer#step なり存在するわけで、そっち使うべき ちなみに Range オブジェクトのデフォは閉区間 ..
それは同意せざるを得ない
他言語はfor文だけですっきりしてるのにアホみたいな仕様だな
>>378 他言語に for や while があるのと全く同じ
そもそも Ruby では for は使わないからなあ… while に至っては while line = gets do みたいなイディオムしか頭に入ってない
Rubyのfor文なんてのはな、熟達者であるほど使い方を「思い出す」 必要があるんだ。それくらい使わないモノ。 なのに予約語を2つも占有しやがって…
each とか map みたいなEnumerableメソッドがあれば、それで十分なんだよな。 自分も while や for は、最近、ほとんど使った記憶が無い。(erb内を除く)
どうせ for (int i = 1; i < 10; i++) { だって「変数 i を1から10の直前まで1ずつ増やして」って読み下すんだし、 じゃあそのまんま 1.upto(9) do |i| とか 1.step(9, 1) do |i| と書いてもいいじゃん? みたいな感じ
文が数字リテラルから始まるのは 生理的に受け付けないな俺は。 コンピュータ文化では非常に異端な仕様。 言語=文化の一端だから、自然であることも大事。
まあ from とか times とかいう関数的メソッドがあってもいいとは常々思ってる from(1).upto(9) do |i| times(9) do |i| でもそれなら Range(1, 9).each do |i| とかでいいんじゃねとも思う
文とかいっちゃってて大丈夫か コンピュータ文化では基本だろオブジェクト指向
日本語ベーシックなら「1から9」って書けるから1.upto(9)もそんなに不自然とは思わない。
times(9) は repeat(9) で実装してる人がいるな
>>386 Expression と Statement の区分とオブジェクト指向は何の関連性もない
Rangeリテラルは 1..9.eachだと 9.each がひとかたまりに見なされてしまうので (1..9).each と括弧をつけなければいけないのが惜しいところだ。
for文は確かに見ないけどwhile文はライブラリのソースの中でも結構見るぞ
横槍ですが… 1.upto(10) {|n| puts n} これは正しく動くけど 1.upto 10 {|n| puts n} これはエラーになりますよね。 このケースはどうして引数のカッコ省けないんですかね? ちなみに 1.upto 10 do |n| puts n end これはエラーにならない。
ブロック記述の結合強度が問題になることは普通ない カッコ省略しまくって空白区切りでメソッド引数を利用するような場合に引っかかる blockmethod arg1, arg2 {|e| block} と書くのはぶっちゃけキモい そもそもカッコなくしたらメソッドチェーンのドットが浮いてしまうじゃないか
394 :
391 :2010/09/20(月) 22:54:59
>>392 >>393 ありがとうございます。
なるほど…結合強度の違いでしたか。
{...}ブロックやメソッドチェーンで繋ぐ場合はメソッド引数にカッコ付ける
習慣付けておけばとりあえず回避できそうですね。
いや通常のメソッドは基本括弧つけろよ 関数的メソッドくらいだぞ括弧つけないこと検討するの
396 :
391 :2010/09/20(月) 23:25:56
>>395 Railsのソースを見るとカッコ省略がデフォなんですよね。
これは特殊なケースなのかな。
でも確かにカッコなるべくつけるようにした方が安全ですね。
RailsはRubyではない 絶対にソースを見てはいけない
>>384 言語によっては、条件分岐すら
あたかもtrue/falseのメソッドであるかのように書くんだぜ
before rails・・・forを使う after rails・・・forを使わない と思って手元のRailsによるアジャイル開発本みたら、forつかってるし
>>398 Smalltalk系の言語か?
io言語もifすらメソッドだった気がするわ。さすがに組み込みだが
>>400 before/after関係なくforは使わない。
Railsのscaffoldはもと初期はforを使っていたが、最近はeachになっている。
Railsのソース読めにゃい
分かってしまえばシンプル 分かる人に解説してもらいながら読むとすごくよく分かるよ 1日で概要掴めた
最近rubyさわり始めたんですけど解説してるサイトとか見てると obj#method とかいう表記で#使って表現してるのはなんかの理由とか由来とかあったりそれともruby業界の慣習とかだったりするんですか? 最初そういう構文があるのかと勘違いしました
慣習 これだけ、見たまま実行できない 紛らわしい欠陥表記なんだが、うまい代案もないのでずるずるこれが使われてる
慣習ですか これですっきりしましたありがとうございます
インスタンスメソッドとクラスメソッドの違いで表記を分けてるとかの話じゃなくて?
だからそれを「実行できない形式」でわざわざ記述してるのなんで、という話だろ
a_<ClassName>.<InstanceMethodName> でよかったのに
>>406-409 インスタンスメソッドの表記だよね
他の言語だというどういう表記してるんだろう
obj::method
>>406 多分Class#methodのことかな?obj.methodは普通に書くよ
違いは#が「そのクラスから生成されたインスタンスが持つメソッド」
ドットは「そのオブジェクト自体が持つメソッド」
ちなみに元ネタは別の言語らしい、Ruby的には慣習という認識でおk
String#downcase と str.downcase はインスタンスメソッドの説明として書く str#downcase とは書かない String.downcase はクラスメソッドで別物 str::downcase と書く奴は C++ に帰れ
Ruby でも :: 使うよね
Rubyで::を使うのはクラスやモジュールに直接所属する「定数」を書くときだね ちなみにクラスやモジュールもRubyでは多くの場合定数なので クラス内部のクラスを表す時にも使うことが多い
when ... case ... end で変数スコープがどうなってたか毎回覚えられないんだけどいい方法ある?
あああ逆だった str = case when A then a when B then b end と書くのと case when A then str = a when B then str = b end と書くのとどうだったかなーとか毎回悩む
それは変数スコープの仕様とは無関係な気がするけどな というか、上の書き方で統一すれば悩みは解消すると思うんだけど、 そういう問題じゃあないのか
case 〜 end の中のローカル変数が case 〜 end の外でも参照できるかどうかは必ずしも明快自明ではない いやまあ参照できるんだけど if 〜 end と一緒
似てるけど違う参照できないパターンがあるのが紛らわしいんだよね いっそブロックの形してるものは一切スコープ作らない、みたいなのならよかったのに
そこらへんなおしたいってmatz言ってなかったっけ
まあ言うのは無料ですみたいな感じではある
ブロックが(1.8だと)とまどうことがある。 他にスコープに影響するのはmodule(class)とdefだけかな。 Cのifとかforのは、複文の {...}がスコープを導入するからであって、 ifやfor自体がスコープを作るわけではない。
しつもん 自分と同一ディレクトリ内にある uri.rb を require したいです どう書くのが妥当で確実動作ですか? require 'uri' だと標準ライブラリの uri を読んでしまいますよね
# 汎用 require File.join(File.dirname(__FILE__), 'uri') # ruby 1.9 限定 require_relative 'uri'
これならまず誤爆しないし見た目から意図もそこそこわかりやすい require "#{File.dirname(__FILE__)}/uri" $LOAD_PATH を自力でいじるのは提供ライブラリ内ではやったらイカン というか問題増えるだけだな 余談だけどRubyが読み書きするファイルのディレクトリ区切りは / 決め打ちできちんと動作する File.join は作ったファイルパスをOS依存で外部に書き出したいときとかに使えば充分
require './uri'
>>432 それ不思議動作だからあんまし使いたくない
リクツ上は $LOAD_PATH + './uri' に該当するファイルがあれば読み込めるはずだろ
RUBYDIR/lib/ruby/1.8/./uri.rb を読まない保証ってなんじゃらほ
誰か安心できる解説とかしてくれないもんかな
あと __FILE__ がどんな起動のされ方どんな読み込み方されても絶対パスを返すかどうかとか
> pwd /private/tmp > cat foo.rb puts __FILE__ > cat bar.rb $:.unshift('.') require 'foo' > /usr/bin/ruby -v bar.rb ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0] ./foo.rb > /opt/local/bin/ruby -v bar.rb ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10] /private/tmp/foo.rb rubyspecのこれかな。 ruby_version_is ""..."1.8.8" do it "equals the relative path of a file loaded by a relative path" do... ... なので 1.8.8 (まだ出てないけど) 以降には該当しない。
>>433 > RUBYDIR/lib/ruby/1.8/./uri.rb を読まない保証ってなんじゃらほ
ドットで開始されている場合$LOAD_PATHを無視してカレントディレクトリから探す、とかやってくれてるんじゃないと駄目だよね
>>431 >File.join は作ったファイルパスをOS依存で外部に書き出したいとき
すっごい昔はそういうような動作を目指してた気もする
現在は File::SEPARATOR は mswin32 でも常に "/" で、
Ruby の(標準の)クラス経由で呼び出してる限りは、
ファイル名だろうがパス名だろうがドライブだろうが全部区切りは /
外部プログラム等から読み込んだOS依存記述のファイルパスは、
File::ALT_SEPARATOR で split して join しろという話だったはず
irb> puts Dir.pwd
C:/Documents and Settings/俺/デスクトップ
irb> p File.join(`echo %WINDIR%`.chomp.split(File::ALT_SEPARATOR))
"C:/WINNT"
irb> Dir.chdir _
irb> puts Dir.pwd
C:/WINNT
ちなみに Linux とかで OS 標準パス区切り文字が / な場合、File::ALT_SEPARATOR は nil を返す
あ、実際は Dir.chdir 自体 "C:\WINNT" という文字列を解釈できるんでこの処理は意味がないよ
で結局 __FILE__ には File.expand_path は要るの? 必須なの?
>>435 カレントディレクトリが一番最初だろ常考
WindowsのUNICODEファイル名はDirクラスだと"?"に化けますが Win32APIを使えば取得できますか? UNICODEファイル名にアクセスできるライブラリはありませんか?
ディレクトリ走査とファイル読み込みとファイル書き込みのすべてをWin32APIで完結させれば可能 Rubyの既存のクラスやメソッドと混ぜることはできない 作ってる人はいてもいいんだけど、あまり聞かない
そうなんですよね。どうにかファイル名が取れてもFileじゃopenできない。
えー
pメソッドについての質問なんですが,以下の環境だと文字化け?が 起こります. ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux] OS:Ubuntu 10.04 LTS ***$irb -Ku irb(main):001:0> p "文字列" "文字\345\210\227" => nil 調べると,String#inspectのバグみたいですが,対処する方法はないでしょうか? また ["abc", "def"] という配列を ["abcxyz", "defxyz"] としたい場合に ary = ["abc", "def"] ary.each do |str| str += "xyz" end で実現できないのは何故ですか?
> ary.each do |str| > str += "xyz" > end > > で実現できないのは何故ですか? str += "xyz" は str = str + "xyz" の意味で、 + メソッドは、文字列を連結した新しい文字列を作って返すメソッドだから。 破壊的に連結する String#concat を使って ary.each do |str| str.concat "xyz" end とする。 それかmapを使って新しい配列で新しい結果を得るようにする。 ary2 = ary.map do |str| str + "xyz" end
>>445 前半
p250で直ってるのでバージョンアップするが吉。
自分でコンパイルしたくないならディストリに圧力をかける。
後半
代入前の str は配列の要素を指しているが、
str += "xyz" は str = str + "xyz" の略記なので、
代入前の要素と"xyz"を連結した *新たな* Stringインスタンスを
指している。配列の中身はノータッチ。
ary.each_with_index {|x,i| a[i] = x + "xyz" }
よりRubyらしくは、
ary = ary.map {|x| x + "xyz" }
または
ary.map! {|x| x + "xyz"}
などとする。
>>445 inspectのはRubyのバージョンアップで対応
悪いこと言わないからバージョンアップしとけ
後者は String の + メソッドの動作が
「自分と引数をくっつけて新規の文字列にして返す」だからだ
これが「自分の後ろに引数をくっつける」だったら望みの動作になっただろう
>>445 > a = [0]
=> [0]
> a.each{|e| e = 100}
=> [0]
> a
=> [0]
代入した時点であたらしい e が作られてる
その e は配列の要素を指していない
>>445 10/10まで待てばもしかしたら10.04でもrubyのverがあがるかも
自分はapt-get source rubyで取得したソースでbug修正してdeb作って入れたよ
451 :
445 :2010/09/22(水) 22:54:27
>>446 ,
>>447 ,
>>448 ,
>>449 ,
>>450 ありがとうございます.
前半の方は頑張ってコンパイルしてみます.
後半の方なのですが,String#+メソッドが,新しいインスタンスを
生成することは分かりました.
また,
>>449 さんによるとObject#=メソッドも新しいインスタンスを
生成するということですが,その場合,それより前に生成された
同名のインスタンスはどうなるのですか?
インスタンス(オブジェクト)に名前はない。 代入は、変数(名前)とインスタンスの結びつきを変える操作。 (複数の結びつきを持つことも可能) 変数が以前に結びついていたインスタンスは、代入によって 結びつきを失う。 あらゆる結びつきを失ったインスタンスもメモリー上には存在 するが、そのメモリー領域はいずれGCによって再利用可能な 状態になる。 100(Fixnum)は少し扱いが特殊だけど、認識としては上のような感じ。
453 :
445 :2010/09/23(木) 08:55:10
>>452 丁寧な解説ありがとうございます.
私自身,少し勘違いして質問していました.
インスタンスに名前を付けるのに変数が必要なんですね.
変数は「オブジェクト置き場に置かれたオブジェクトに貼られたラベル」説が根強い ラベルなのでひとつのオブジェクトにラベルは何枚も貼れる ラベルの貼られてないオブジェクトはガベージコレクタさんが定期的に巡回してがーっと捨てる
> Object#=メソッド そんなものはない
>>451 = には大きく別けて2つの使い方があって
1つは「代入」もう1つは「特殊なメソッド呼び出し」なんだ。
違いはドットの有無。
x = hoge #代入
obj.hoge = #特殊なメソッド呼び出し
obj.[x] = #特殊なメソッド呼び出し
代入は、変数の参照先を設定する、もしくは変える操作。
メソッド呼び出しはメソッド呼び出し。ドットの前の変数が参照する先は変わらない。
457 :
445 :2010/09/23(木) 13:06:39
>>454 ,
>>455 ,
>>456 ありがとうございます.Object#=メソッドなんてないんですね.
少し混乱してしまったのですが,つまり
ary = ["abc", "def"]
ary.each do |str|
str = str + "xyz"
end
とした場合には,ブロックの中の str + "xyz" の部分で新しい
インスタンスが生成されて,それが左辺の str に代入されるんですよね?
ということは,ブロックの中の str はC言語で言う仮引数に相当して,ary[0],
ary[1]自体を参照していないということですか?
> それが左辺の str に代入されるんですよね? > 変数は「オブジェクト置き場に置かれたオブジェクトに貼られたラベル」 変数という「箱」は存在しない
>>457 そう
配列から既に取り出してしまったものについて代入しても
配列の中身は書き換え出来ないってこと
460 :
445 :2010/09/23(木) 14:15:44
>>441 RubyはWindowsのUNICODEファイル名に対応してない。
JRubyやIronRubyならいけるかもしれない
誰か直してくれってみんな思ってる
小さな処理をそれぞれファイルに記述しておき、 指定したファイル(複数)の処理を実行したい。 とりあえず、下記のような処理を書いてみました。 一応動くけど、シンボル(関数)をひたすら上書きというのが不満です。 こういった処理のナイスな実装例とか、ヒントを教えてくれませんか? $ cat main.rb #!/usr/bin/ruby ARGV.each do |filename| load filename, true suba("hoge") subb("fuga") end
(続き) $ cat a.rb def suba(str) puts "a.subA:" + str end def subb(str) puts "a.subB:" + str end $ cat a.rb def suba(str) puts "b.subA:" + str end //subb() 記述し忘れ $ main.rb a.rb b.rb a.subA:hoge a.subB:fuga b.subA:hoge a.subB:fuga //エラーになってくれたほうがうれしい
464 :
462 :2010/09/23(木) 18:04:05
変な改行が入ってしまい申し訳ない。
よくわからんがクラス作れクラス
何をしたいのかよく分からんが、Rakeじゃダメなのか?
Thorが近いかもしれない。
ぬおおおおおおおお クラスメソッドの正体は特異クラスのインスタンスメソッドだったのか 今までのモヤモヤが晴れて全ての謎が解けた感じだ クラスメソッドなんて呼称は廃止した方がいいんじゃないですかね? 自分のようなJava出身者はみんな悩みそうだ
よくわからんけど、Javaだってインスタンス化しなくても メソッドの呼び出しはできるよね。何を悩んでたんだ?
>>469 逆だろ
Javaのクラスメソッドはインスタンスからも呼べるけど
Rubyのクラスメソッドでそれが出来ないのが悩みだったんじゃね?
えっ?
インスタンスに属してるからインスタンスメソッド クラスオブジェクトに属してるインスタンスメソッドを特にクラスメソッドと呼ぶ という見掛けになるので、一応呼び名としての対応は取れてなくもない どちかってとクラスメソッド内から同クラス内の別のクラスメソッドを呼ぶときどう書けばいいか迷うと思う
>>468 いや
クラスメソッドしかありえないんだが
Javaがあほすぎなんだろう
クラスメソッドに関しては class C class << self def classdisplay; puts classstr; end def classstr; "class!"end end end という書き方がもうちょい流行ってもよい irb> C.classdisplay class!
static メソッドのオブジェクト指向的気持ち悪さを実用的に解消した素晴らしいモデルだと思うが これが駄目な場合「インスタンスに関係しないメソッドの存在禁止」と言うしかなくなるぞ それは美しい世界かもしれないが実用上辛い
>>474 入れ子になったクラス定義かな。あと入れ子になったメソッド定義というのもあるね。
個人的には、Pascalの入れ子だらけになった、非常に読みづらいプログラムを憶い出す。
そんな入れ子でしか記述できない手続き型言語の可読性の悪さを解決するために、
抽象化データやオブジェクト指向が考案されたというのに、退化した時代錯誤な考え方に見える。
名前空間が欲しいのなら、モジュールを使えばいい。
module M
def M.classdisplay; puts M.classstr; end
def M.classstr; "class!"; end
end
モジュールをインクルードした時に裏で変なクラス作られてるのが最強に気持ち悪い。
>>476 class << self ... end の中でのselfは、最初に書いたself(ここではC)の
特異クラスになる。
そしてクラスの中で普通にdefでメソッド定義するとそのクラスのインス
タンスメソッドの定義になることを思い出せば、
クラスメソッド == 特異クラスのインスタンスメソッド
と理解できる、という話じゃないかな。
>>476 > 入れ子になったクラス定義かな
違う、class << obj; end で obj にインスタンスメソッドを定義する
o = Object.new
class << o
def foo; puts "foo!"; end
end
# irb> o.foo
# foo!
クラス定義内で obj を self と指定した場合、self にインスタンスメソッドを定義する
つまり、クラスメソッド定義だ
これがいいのは
class C
class << self
attr_accessor :classvar
end
end
C.classvar = 123
とか
class C
class << self
def disp; str; end
private
def str; "str"; end
end
end
C.disp #=> str
C.str #=> NoMethodError: private method `str' called for C:Class
とかがインスタンスメソッドの文法一発で書けるとこ
Ruby1.8とRuby1.9の共通のスクリプト作ろうとしてるんだけど、 @str = {Ruby1.9ならエンコーディング情報つける} というのはどう書けばいいですか RUBY_VERSION 使って分岐してもいいですか
エンコーディング関連に関しては respond_to? は無力なので RUBY_VERSION で分岐してもよい 必要なのはメソッドの存在ではなく、それに付随して呼ばれる長大なライブラリ群だから メソッドいっこ作ったから回避できるとか言うレベルの問題じゃないことを示す必要がある たとえばさ obj.respond_to?(:read) って書いてあったら、 「あーreadで文字列返せるオブジェクトなら動作するのかな」とか思うだろ でも respond_to?(:force_encoding) とか respond_to?(:encode) とか書いてあっても 「あーここは force_encoding できるオブジェクトならなんでもいいのかな」とは思えないだろ実際
>>478 それは分かっているんだ。
>>479 可変(mutable)なクラス変数が必要になるの状況はかなり限定されるよね。
プライベートなクラスメソッドが実現できるようになることは明確な利点だけど、
それも上の理由で、用途は一層限定される。
逆に、この記法に慣れて(流行して)一般的なクラスメソッド定義でも使われるようになると、
インスタンスメソッド定義と一目で区別がつかなくなって、かえって可読性が低下するのでは。
特異クラス/特異メソッドの存在を否定する気は毛頭無いけど、それらは本当にそれが
必要な場合に限って使うべきものなんじゃないかと思う。
同様に、近頃はRailsの影響でメタプログラミング(リフレクション)が「流行」しているけど、
それも本来は流行すべきものじゃない気がする。安易な導入は保守性を著しく悪化させるから。
たぶん、数年後には特異クラスやメタプログラミングの多用はバッドノウハウ扱いされるようになると思う。
以上、過去にPascalの入れ子構造とLispのリフレクションに悩んだ、
頭の固いオッサンからの余計なおせっかいですた。
>>482 じゃないが、
Javaみたいな言語と違って、クラスの定義も上から順にスクリプトが走った結果、
クラスが定義され、メソッドが定義され、クラスメソッドが定義されていくよね?
(そういうのはなんというのかはしらん。動的言語ということなのか?)
何が混乱するかというと、言語作者やライブラリ作者の想定通りなんだろうけど、
スコープによってというのかわからんのだが、スクリプトの位置やブロックによってselfが変わりまくるのがなかなか慣れない。
今ここで、selfが何であるかを理解しながらコード書いていくのがけっこうしんどいぞ?
classだけならまだいいけど、
includeされるmodule(A)を書いたり、extendされるmodule(A::ClassMethods)を書いたり、
extendされるmodule内に拡張するためのメソッド(A::ClassMethods#unko、extendされたあとはクラスメソッドになる)を書いたり、
unkoメソッドを読んだときにのみメソッドを追加したいがためのモジュールをネストしたincludeされるmodule(A::ClassMethods::InstanceMethods)を書いて、
同様にunkoメソッドを読んだときにのみクラスメソッドを追加(略) されるmodule(A::ClassMethods::InstanceMethods::ClassMethods)を書いたり
してると今これselfなに?という感じになってくる
何を言っているかわからなくなってきたが、
何かというとRailsのプラグインやライブラリとかの書き方の話ね
あの定型みたいな処理こそメタプログラミングかもしくはシンタックスシュガーみたいなもので
なんとかわかりやすくならないのか
あ、書いてて、moduleのネストの複雑さとselfの話はまた別か
Rubyを使った言語内DSLの設定ファイルなどでも、ブロックによってselfが変わりまくるからな
文法はRubyに近く、一見ライブラリを(ブロックとカッコなしメソッドにより)簡単な文法で利用しているように見えて、
selfがブロックごとに変化しまくる。
>>134 みたいなのがまるで想定しない動作になったりw
selfの理解が足りないのを言語のせいにしている人がいると聞いて
>>483 >今これselfなに?という感じになってくる
ちょー同意
selfがどこでどう切り替わるか知らないと、rubyのコードは読めないよね。
そんな大層なもんでもないだろ… その都度irbで調べてればだいたい分かってくるし。
いちおう釘をさしておくが、「RailsはRubyではない」のでそこんとこよろしく DSL魔術で奔放に構築されているRails関連のソース読んでRubyに文句言う人が絶えないのは何故だ
「RailsはRubyではない」って言うほうが無理があるだろ。 RailsはRubyの代表作で、RailsのおかげでRubyが普及したんだろ。
ここってすぐ質問者そっちのけの雑談に突入するよね
>>490 別に質問スレじゃないからな
わからんのならわからんと続ければ答える気のある奴が続けて返事したりしなかったりするだろう
というか、今、困っている質問者って誰?
>>462 は何人かが意味分からんというレスを返してるけど
本人から何も返答がないからどうしようもないし、
その後の
>>469 はつぶやきで
>>474 は提案にしか見えないんだけど。
>>486 個人的にはJavaScriptのthisよりはマシだと思ってる…
thisは全然わからん
>>489 ある言語でクラスとメソッドとライブラリを作ったとして、
そのクラスとメソッドとライブラリの使い勝手が悪かったら言語のせいになるのか
Delphiアプリケーションが馬鹿にされていたのと似ている気がする いやそうでもないか いやそうでもないな
>>496 Delphi馬鹿にするなお
当時のVB4とかと比べてもいい動きしてたお
Delphi製のソフトはどれもこれも無駄に使わない画像リソース埋め込んで ファイルサイズがデカくてうざかったお 某単機能ツール群を入れただけでUSBメモリがパンパンだお
今の最新のDelphiは新規作成したフォームありのアプリでもexeのサイズが1MB超えた気がする
>>496-498 最初のころのバージョンのDelphiは要インストールのランタイムなくても動く、
例外が起きても落ちないのは当時VBと比べれば画期的だったぜw
501 :
デフォルトの名無しさん :2010/09/25(土) 15:47:11
tes
502 :
デフォルトの名無しさん :2010/09/25(土) 16:02:12
全般的に初心者ですが、質問よろしくお願いします。 環境 CentOS5 ruby1.8.7-p302 gem1.3.6 下記エラーが出力され解決できず困っています。 /usr/local/lib/ruby/gems/1.8/gems/rest-client-1.4.2/lib/restclient.rb:9: no such file to load -- net/https. Try running apt-get install libopenssl-ruby (LoadError) yumにはlibopenssl-rubyは存在しませんでした。 そこで、aptを入れようとしたのですが、GPGキーのところでつまづいてしましました。 libopenssl-rubyのインストール方法をご教授頂けないでしょうか。
CentOS はおまえには向いていない
まあLinuxの使い方はLinuxの解説なりなんなり読んでくれという話だな
>>502 何をしようとした時に、そのメッセージが出力されたのかな?
要は、エラーの発生条件を書いて欲しい。たとえば、irbを起動して
> require "XXXX"
と入力しただけでエラーメッセージが出力されてしまう、とか。
その操作(発生条件)を書いてくれないと、(エスパーはどこにもいないから) 誰にも返答なんてできないよ
508 :
502 :2010/09/25(土) 18:25:09
ご返答ありがとうございます。502です。 502のエラーメッセージはherokuというホスティングサービスを使用するため gemでherokuをインストール後、heroku createを実行した際に出力されました。 502のエラーはrubyをコンパイルして入れた際に、/ruby-1.8.7-p302/ext配下の opensslをインストールしていなかったことが原因でした。 opensslをインストール後、今度はreadlineのエラーが出力されたので /ext配下のreadlineをインストールしようと試みたのですが失敗してしまいました。 (ruby extconf.rbの直後にエラーになりました。左記にオプションはつけていません。) 調べたところ、yum install ncurses-develを入れるとあり、試してみましたがうまくいきませんでした。 mkmf.logを確認したところ、ヘッダがないとのエラーメッセージが出力されていますが、どこが原因がわかりません。 ----mkmf.log一部抜粋 conftest.c:3: error: ‘tgetnum’ undeclared (first use in this function) conftest.c:3: error: (Each undeclared identifier is reported only once conftest.c:3: error: for each function it appears in.) conftest.c:1:31: error: readline/readline.h: そのようなファイルやディレクトリはありません conftest.c:1:31: error: editline/readline.h: そのようなファイルやディレクトリはありません readlineのインストール方法をご教授いただけないでしょうか。 (オプション不足またはパッケージが不足と思っていますが、どうにもわかりません。) また、/ext配下のインストールについてのマニュアルページのようなものがありましたら、教えて頂けないでしょうか。
説明めんどいな yum install zlib-devel openssl-devel readline-devel したあとで Ruby をコンパイルする コンパイル済みのディレクトリが既にあるなら ext/openssl に移動s…いや、いいや 再度 make clean して ./configure して make して make install しろ
>>508 なぜか ruby をソースからビルドしようとしてるみたいだけど、それなら README.ja をよく読みなさい。
この文書のインストール手順のどこにも「ruby extconf.rb を実行しなさい」とは書かれていないんだけど。
rubyのビルド&インストールは、ごく一般的な configure; make; make install で済むよ。
で、その時に、configure の --prefix オプションでインストール先ディレクトリを忘れずに指定する。
特別な事は何も無いはずだよ。
>>510 >この文書のインストール手順のどこにも「ruby extconf.rb を実行しなさい」とは書かれていないんだけど。
これは既にrubyをインストールしてある状態でのextライブラリの正当な追加インストール法です
>>507 ひどいな、このエラーメッセージ
Linuxだったら問答無用でパッケージ管理ツールとパッケージ名まで決め打ちか。
気を回したつもりで混乱の元じゃないか。
513 :
502 :2010/09/25(土) 20:12:49
502です。 yum install readline-develを行った後、ruby extconf.rb; make&&make installでうまくいきました。 ありがとうございました。
日記はチラウラで
CentOSのパッケージのRubyはど古いのものなのか
CentOS5 ruby1.8.7-p302 gem1.3.6
CentOSのRPMのRubyは古いし、ソースから入れるのが普通。
もはやCentOSは遣う意味が無い。 開発マシンとして使う人は元々いないだろうけどサーバーとしてもdebianやubuntuで十分だし。 会社で複数のサービス公開してるけど全てdebianだ。 開発マシンと統一することにもそれなりに価値がある。
うちの会社の場合は、開発環境はCentOSで、本番環境はRedHatというパターンだな。
>>515 CentOS5のRubyはRuby1.8.5です
安定版ですらない
他の基幹ライブラリもお察し
>>520 こいつのせいでライブラリは1.8.5の面倒も見なけりゃならんのだよな
とっとと死滅してくれ
>>520 マジデ!?うけるww
ということはRedHatも古いのを使っているのか。パッチ当ててるんだろうけど。
今のRailsはRuby1.8.5対応してないような はなからRailsは度外視ということかw UbuntuならRails入れるためのドキュメントくらいあるのに
>>483 eval系が絡まないかぎり、ブロックの中でselfが変わることはない。
クラス定義中やトップレベルではselfなんて意識する必要すらないはず。
unkoどうのこうのってのは明らかにRubyのダークサイドに落ちてる。
そんなプログラムを書く必要が本当にあるのか確認したほうがいい。
メソッドを呼んだらクラスメソッドを追加させるとか、明らかにおかしい。
Rubyが何でもできるからって、何でもすればいいわけじゃない。
また、ブロックによってselfが変わりまくるようなダークなライブラリは
うんこだから使わなくていい。
526 :
525 :2010/09/26(日) 18:27:22
>>482 を読んでなかった、スマソ。
メタプログラミングの多用はRailsが出る前から、現在まで
ずっとバッドノウハウになってると思うよ。
少なくとも俺らが普段から使うものではない。
>DSL風に定義するライブラリ使えないじゃないか うんこなので使わなくていい ほぼ全てが開発者の性質の悪いオナニー DSL表記にして何かがよくなったということはまず無い
Railsの黒魔術が悪だと言う人が多いけど その根拠をちゃんと示せる人が全くいないのが笑える
どうぞ笑っていてください
分かりにくいから
オブジェクト指向とか俺みたいなCOBOL30年戦士には分かりにくいだけなんだよ。 まったく性質の悪いオナニーだな。
笑えよベジータ
笑えばいいと思うよ
↓構造化プログラミングが分かりにくい人の出番ですよ
>>530 解り切った事をわざわざ説明する馬鹿はおらん
質問させてください。 変数1 = クラス.new newしたインスタンス内で別のクラスのインスタンス生成したりそれをいじったりする 変数1 = nil これで生成したものは全部自動で開放される、で合ってますか?
循環参照していない限りはyes
ありがとうございました!
Rubyってデストラクタ定義出来るんだっけ?
「newしたインスタンス内で別のクラスのインスタンス生成したりそれをいじったりする」の中で 別の生きてるオブジェクトや変数から、そのオブジェクトが参照されるようなことをしてない限り。 あと、いつ解放されるかは保証されない(終了までそのままかもしれない)。 だから、ファイルのクローズとかは自分でやるか、ブロック付きのクローズが保証されている メソッドを使うとかしないとダメ。
543 :
デフォルトの名無しさん :2010/09/26(日) 23:02:22
>>538-539 代入してすぐには解放されないよ、いつかそのうち。
あと、Mark&Sweepだから循環参照とか関係ないよ。
GC.stress=trueしてるとまた話は変わる。
>>541 ファイナライザはある
ただ、Javaでの議論とほぼ同様、
Rubyでも原則ファイナライザには頼らないほうがいいんじゃないかね
例外が握りつぶされるとか、面倒な問題がいくつもある
ちょうでっかいオブジェクトがメモリから早めに削除されることがあってメモリの節約になるかも、程度のご利益しかない その程度の動作しか期待したらいかん GCされるからこの動作がこうなるはず、なんてのをRubyに期待するのはアウト
スクリプト終了時にどーしてもやって欲しい処理がある場合は at_exit がある
ファイナライザ自体の登録はできるが、実行タイミングはGC依存で不定だ
ObjectSpace.define_finalizer(obj, proc)
>>544 の言うようにproc内の例外は抑制されて掴めないし外にも出ない
ファイナライザに頼りたくなるような処理は ちゃんと例外処理とか、例外処理付きのブロック付きメソッドだな
ああ表現が判りにくいな 最後の文を「を使うべきだな」に直してくれ
領海w
>>526 > メタプログラミングの多用はRailsが出る前から、現在まで
> ずっとバッドノウハウになってると思うよ。
>
> 少なくとも俺らが普段から使うものではない。
一昔前のgotoは機能としてあるけど使っちゃだめ、みたいな言い分だな
それなら、最初から入れるなとは言わんが(最初はそれがいいと思ったんだろうから)
使えないようにすればいいんじゃね?
何でRubyにメタプログラミングの機能が載ってるの?
メタプログラミングは必要悪なのか?
>>526 がついていけてないだけじゃないのか?
もっとメタプログラミングを簡単にした方がいいのでは?(馬鹿でも当たり前に使えるように)という話なら同意はするが
>>550 メタプログラミングは、Lispのマクロと同じだ
使わなければならない場所以外では使ってはいけない
継承が最後の武器なのと一緒だな
553 :
526 :2010/09/27(月) 23:15:47
>>527 変わり「まくる」と言った。別にRSpecとかRakeとかTkぐらいなら余裕。
>>530 Railsが悪なんていってない。魔術自体を使うことが危険なだけであって、
Railsみたいに魔術を使って作られた綺麗なAPIは素晴らしい。
>>550 バリバリ必要悪です。attr系とか超便利。危険だからといって、
使えないようにしたらJavaになっちゃうよ。
危険でも強力なら搭載するのがRuby。
>>551 >>552 そそ。
>>550 Rubyはあなたが自分の足を打ち抜くのを妨げません。
配列要素(Fixnum)に代入できるイテレータって書けませんか?
Fixnum関係なさそうだな あんま無いです a という中身の入った配列と b という空の配列があったとして、 配列 a の中身を適度に選んで b に意味ある順番で移すのを一発で書く、とかいうのは Ruby ができそうでできない微妙に不得意とするところ 実際にナニをどうしたいのかがわかると迂回策を誰かが思いつくかも
Railsは箱さえ開けなきゃ綺麗といえなくもない 個々人でまだ箱を開けざるを得ないのががっかりで醜い もしRails実装を覗く必要に迫られることが将来なくなったとしたら、それは
箱を開けるって具体的にはどんなことだよ
Railsは真空管アンプの真空管だけ色々差し替えて楽しむ物 決して箱の中の配線を見てはいけない
560 :
555 :2010/09/28(火) 01:20:33
ぞろ目Get やりたいことは、2次元配列の指定位置に隣接する要素のインクリメント等ですが
railsのソース読むな?本気で言ってんの? こんなに素晴らしい教材はなかなか見つからないのに。 うちの会社はRails勉強会やる時は、rubyに興味無い連中も寄ってきて部屋いっぱいになってしまう。 社外向けのRails勉強会もやってるのだが高校生の応募もあったりして驚いたよ。
一人で読んでも理解しにくいコードではあるのかな。 慣れてない人間には理解しにくくても、それをカバーできるほど有用なテクニックなら問題ないのだろうが。
メタプログラミングが理解しにくいっていう話なら本人の能力の問題だな
>>558 共通の処理まとめたい(DRYという手法だっけ?)
↓
lib/以下におけばいいの?
↓
ただのrequireじゃなくて、autoload使えって?(autoload使うと開発時のリロードのときに上手く働くとかどうとか)
↓
おい、リロードするたびにクラスがunloadされてないとかどうとか、エラーでるようになったぞ、どうしてくれるんだ
↓
production環境だと動くんだけど、、、、
↓
Railsのソースを見出す
↓
ヽ(`Д´)ノ わけわからん!!
>>564 急いでるときにそうなると困るよね
Rapid Programing 出来ると思って Rails 使ってるのに・・・
そもそも「勉強会」になってしまう時点で何かおかしいと感じてほしいもんだ
まあRailsはRailsスレで 「RailsはRubyではない」という文言が理解できないのは区別できない初心者か、 自分の頭の後ろにくっついてるRailsの知識の意味を理解できない可哀想な人
Rubyを(比較的詳しく)知っててもRails解らんって人は多いらしい
>>569 特定ライブラリの挙動を知ってるはずがないだろ
rubyプログラマならactiverecordの実装ぐらいは知っておいたほうがいいぞ… いくらrailsに興味無くても。
ArelやNamedScopeのソースみたら卒倒するぞ
rspecの日本語の本ないのかな? そしたらBDDで開発しながらruby勉強できるのに。
連載2回で止まってるけどるびまは読んだ?
教科書を原書のドイツ語にして独習すればドイツ語の勉強にもなって一石二鳥かというと別にそんなことはない むしろ理解がどっちつかずだ 言語にある程度慣れるまでは特別なテスト開発はやめと毛
でも英語の本でプログラミング勉強すると両方の勉強になっていやなんでもない
C++で言う「関数への参照渡し」みたいなことをするにはどうすればいいんでしょうか? Integerの参照をメソッドに与えメソッド内で値を変更したいのですが
>>577 できないのでほかの方法を模索してください
あなたの思考法はRubyとして間違っています
が妥当な回答な気がする
やってできないことはないんだが
できなくはないがIntegerを例にするのは不適切。
じゃあFixnumで
マテ
あれ全部参照なんじゃなかったっけ 普通に引数変えたら元も変わると思ってたけど違った?
Rubyの引数は値渡しです。 オブジェクト渡しとかいろいろと名前が考えられているけど、一つだけ確かなことは、 参照渡しではないということです。
FixnumはImutableで即値扱いされる、という仕様はどこかマニュアルに書いてないのか 他の言語のつもりでいると、Stringも即値と勘違いするんだよな
Integerには実はFixnumとBignumがあり、その境目とされる値が なぜ境目となるのかを理解できれば難しい話ではないんだけどね。 README.EXT.ja なんて普通のユーザーは読まないしな。
即値って言葉はアセンブリ言語ぐらいしか使わないと思ってたけど Rubyみたいな超高水準言語でも使うものなの?
それイミディエイトじゃ?
Rubyの場合は、即値と言うよりimmutableって言葉のがよく使うね
オブジェクトなんだけど、オブジェクト自身に変更を加えるメソッドが一切無いものを言う
そして、そういうのは処理系の内部では即値で扱われることが多い
FixnumとBignumは普通に使う分には区別がほとんど付かないようになってるね
区別しようと思えば区別もできる程度
>>585 どうしても即値にしたければSymbolがあるからなあ
とは言っても、SymbolとStringは全然用途が違うのだけれども
即値で思い出したけど、ときどきマジックナンバーのことを 即値と呼ぶ人がいて困る。
>>587 聞かないねえ。
Cでさえ即値なんて言わない。
アセンブリ言語特有の呼称だと思っている。
592 :
587 :2010/09/30(木) 01:35:29
そんなもんだよね。サンクス
リテラルの意味で使う場合もあるな
> 即値って言葉はアセンブリ言語ぐらいしか使わないと思ってたけど 悪い悪い。一般的にはなんというのかわからなかったので知ってる単語だしただけ。 Rubyの場合はimmutableで通じるのね
ほっとして寝ようと思ったら > 即値 > Immediate Value > 参照ではなく、実際の値が変数に格納されるもの。Rubyの現在の実装では > Fixnum、Symbolとnil/true/falseだけが即値である。 > しかし、Fixnumが即値でないRubyの実装があっても構わないし、モデル上 > 全ての値がオブジェクトへの参照であると考えても差し支えない。 うへえ。やっぱり寝る
>>595 > モデル上全ての値がオブジェクトへの参照であると考えても差し支えない
ってところは意外と重要なところだと思う
内部的には即値を扱ってるんだけど
コード上は全てオブジェクトを扱ってるように見えるからな
immutableオブジェクトには自身を変更するメソッドが無いおかげでそれを実現できてる
BignumはimmutableだけどImmediateでない?
>>596 いやいや、実装の細部を隠すことに成功しているという意味だから
本質的に重要な指摘でしょ
いわゆる即値かどうかなんて、気にしなくてもいい
何? 何なの? 何がいやいやなんだよ そう言ってるじゃん
600 :
デフォルトの名無しさん :2010/09/30(木) 03:28:31
ドロップダウンでテーブルから参照するサンプルプログラム どっかにありませんか?できるだけ簡易なのがいいです。
実際上の即値が何を意味するかというと、その値を意味するオブジェクトがひとつだけということ 小さい整数は何度も使われるからオブジェクト生成は1回だけにしておこうという単なる効率上の話に過ぎない irb> p 100.object_id 201 irb> p 100.object_id 201 irb> p 100.object_id 201 irb> p true.object_id 2 irb> p true.object_id 2 irb> p true.object_id 2 irb> p "100".object_id -608236338 irb> p "100".object_id -608244138 irb> p "100".object_id -608251918 50.times{|x| 100} で Integer.new("100") 相当のことを50回やるという リッチゴジャースで「本物のオブジェクト指向」な Ruby 実装があってもいいという程度のお話
しつこく出てくるものは変更の可能性なくても定数使えってことか
まあそうなんだけど、1万くらいの要素をもった配列から 'str!' と同一なものが含まれるかどうかを返す array_10000elements.find{|s| s == 'str!'} を target = 'str!' array_10000elements.find{|s| s == target} とするあたりは「名前を付けるリファクタリング」の範疇で推奨だとしても def search(s) s == 'str!' end array_10000elements.find{|s| search(s)} とメソッドに吐出ししたときにさらに TARGET = 'str!' def search(s) s == TARGET end array_10000elements.find{|s| search(s)} と定数にするようなことがどれだけ正義なのかについては結構議論の余地が ちなみに #{...} での変数埋め込みがない「静的」な正規表現については Ruby が勝手に同一オブジェクトを使い回してくれます irb> 3.times{|x| p /re!/.object_id} -608271818 -608271818 -608271818 文字列でもやってくれたらよかったのに irb> 3.times{|x| p "str!".object_id} -608279388 -608279408 -608279428
うへぇ、ImmutableはMutableと対置される概念だとしか認識してなかった。 即値とImmutableって別の概念だと思うけどなぁ。
あなんだ。 ImmediateとImmutableを誤読してたorz
>>604 「定数」という言葉の使い方しだいですけど、そこまで考えるのであれば
MATCH_TARGET = lambda{|s| s=='str!'}
array_10000elements.find{|s| MATCH_TARGET[s]}
とか書いた方が素直なような気が。
>>607 Procを最大1万回起動するくらいなら文字列を直に書いたほうがまし
>>607 問題勘違いしてるな
文字列の生成のコストを嫌ってるんだぞ
> lambda{|s| s=='str!'}
これだとlambdaがcallされるたびに'str!'が生成されるから無意味
ローカルスコープの外に変数置くと遡って探して呼び出すコストがかかるようになるから、 実際に計測しないと単純にどっちがいいとは言えんな 文字列くらいならブロック内に置いておいたほうがたぶんいいと思う リテラルで書ける程度の配列やHashも直に書いたほうがいい 正規表現は前にあったレスの通り 変数にして得するのは自作のなんかごっついオブジェクトとかじゃね、やっぱ
require 'benchmark' class C STR = 'str!' def initialize; @str = 'str!'; end def search_without_external(x); x == 'str!'; end def search_with_insvalue(x); x == @str; end def search_with_const(x); x == STR; end def run arr = Array.new(100000, nil) Benchmark.bmbm do |x| x.report('inline') do arr.each{|e| e == 'str!'} end x.report('method w/o external') do arr.each{|e| search_without_external(e)} end x.report('method with @instance_value') do arr.each{|e| search_with_insvalue(e)} end x.report('method with CONSTANT') do arr.each{|e| search_with_const(e)} end end end end C.new.run
すまん x.report('local') do str = 'str!' arr.each{|e| e == str} end を足してくれ んで結果 Rehearsal --------------------------------------------------------------- inline 0.610000 0.000000 0.610000 ( 0.612713) local 0.290000 0.000000 0.290000 ( 0.285593) method w/o external 0.860000 0.000000 0.860000 ( 0.865840) method with @instance_value 0.540000 0.000000 0.540000 ( 0.544721) method with CONSTANT 0.570000 0.000000 0.570000 ( 0.563352) ------------------------------------------------------ total: 2.870000sec user system total real inline 0.610000 0.000000 0.610000 ( 0.608649) local 0.290000 0.000000 0.290000 ( 0.284991) method w/o external 0.860000 0.000000 0.860000 ( 0.855065) method with @instance_value 0.550000 0.000000 0.550000 ( 0.543961) method with CONSTANT 0.560000 0.000000 0.560000 ( 0.564894) 結論 ・ ローカル変数最強 ・ インスタンス変数や定数にするのは見栄えとお好みとプログラムの意味考えた上で好きにしろ
え、これは 「何万回も行う処理をブロック外のメソッドに単純に掃き出ししたら処理自体が遅くなった」 「が、文字列生成を1回にしたらちょっと戻った」 だよね なにげにまずいと思うんだが
>>613 こんな「文字列生成は1回だけでメソッドの引数で渡す」を追加してみる
def search_with_arg(x, s); x == s; end
x.report('method with arg') do
str = 'str!'
arr.each{|e| search_with_arg(e, str)}
end
で、結果
user system total real
inline 0.600000 0.000000 0.600000 ( 0.598644)
local 0.280000 0.000000 0.280000 ( 0.279111)
method w/o external 0.860000 0.000000 0.860000 ( 0.857289)
method with arg 0.530000 0.000000 0.530000 ( 0.530060)
method with @instance_value 0.540000 0.000000 0.540000 ( 0.534953)
method with CONSTANT 0.560000 0.000000 0.560000 ( 0.554683)
文字列生成が1回かどうかだけが効いてて、どこから探してくるかはそれほど問題にならない模様
ちなみに1.8.7ではなく1.9.2でやるとどこか間違ってる感じに爆速だったことを追記しておく
user system total real
inline 0.420000 0.000000 0.420000 ( 0.413724)
local 0.120000 0.000000 0.120000 ( 0.121577)
method w/o external 0.540000 0.010000 0.550000 ( 0.544168)
method with arg 0.200000 0.000000 0.200000 ( 0.202301)
method with @instance_value 0.210000 0.000000 0.210000 ( 0.207914)
method with CONSTANT 0.190000 0.010000 0.200000 ( 0.204321)
あと、proc はうんざりするほど遅かった(文字列生成を1回だけにするとそのぶんだけは軽減) ただし 1.9.2 で実行すると 1.8.7 よりはうんと速く、メソッド呼び出しより少し遅い程度
616 :
デフォルトの名無しさん :2010/09/30(木) 12:36:57
はじめまして。 勉強し始めなので、よくわからないことがあるので教えていただければ、 と思いカキコします。 hashの部分を勉強中なのですが、deleteメソッドに関して、 本で見ていると「keyをnilにしてvalとの結びつきをなくす」 とあり、さらに「valは削除されていない・・・」との記述なのですが、 どういうことなのでしょうか? valを表示させることが可能なのか、また、ガーベジコレクション関係の 話なのでしょうか? 教えていただけると助かります。
Hash オブジェクトからペアを取り除く、という以上の意味はないよ 取り除かれたオブジェクトが実際にどうなるかまでは関与しない プログラム上で誰も参照していなければ他の変数同様GCの対象になるだけ あとそれはかなりへちょい解説なのでむしろ書名晒せ
618 :
デフォルトの名無しさん :2010/09/30(木) 12:46:30
>>617 ありがとうございます。
署名は「作りながら学ぶRuby入門」です。
P.110の上部にあります。
単純に削除、という理解で良いってことですね。
それは入門者用の参考書だからそれで十分でしょ。
>>619 入門用なら
「Hash#deleteはkeyに関連するキーと値のペアをHashオブジェクトから削除します」
で削除部分の動作説明は充分だ
入門どころか中級者向けでもこれで充分
>>614 手元の 1.9.1 で実行してみると
s == 'str!' と s =~ /^str\!/
は後者の方が速いみたいなのだけれども、そういうもの?
>>621 正規表現処理の速度はマッチの仕方に依存
それはたまたま正規表現のほうが速かっただけに過ぎない
str = 'str'*100
arr = Array.new(100000){'str'*100}
re = /\A#{str}\!\Z/
Benchmark.bmbm do |x|
x.report("==") do
arr.each{|e| e == str}
end
x.report("re") do
arr.each{|e| e =~ re}
end
end
こんなスクリプトにすると、
3000文字ぶんを行ったり来たりしながら十万回マッチ試行しなければならない正規表現のほうが遅い
これも1.8.7はバカ遅いが1.9.2だとやたら速いな
>>616 一旦 keyをdeleteさせたら
復活させる方法はないかもね。
object_id()で調べてみたけど
同じ要素を消してから入れ直しても
違うobject_idが表示される。
想定していたのはキーと要素をハッシュに登録し直したら
同じobject_idが表示されるかもしれないかと期待したが、
結果は違うobject_idだったから、別物だという事。
疑問の「valを表示させる事は可能なのか?」の答えは出来ないだ。
まぁ、上級者向けのテクニックならあるのかもしれないが。
object_idを記憶させておいて、それをどうにかして再設定させるとか。
(消えてないと書かれているのだから)
>>616 >>623 こういう話だと思ってたけど違うの?
irb(main):001:0> val = "yugui"; hash = {:lovely => val }
=> {:lovely=>"yugui"}
irb(main):002:0> hash.delete(:lovely) # hashからは消す
=> "yugui"
irb(main):003:0> hash
=> {}
irb(main):004:0> val # valは削除されてない
=> "yugui"
irb(main):005:0> puts val # valは表示できる
yugui
=> nil
>>624 単なるそういう話
「ハッシュから削除っていうけどそれはハッシュから削除というだけの話でハッシュに登録されていたオブジェクトが削除されるという意味では必ずしもありませんよ」
という頭でっかちな説明
>>623 はわかってない
friends = { :shin => "Shin Tanaka",} friends.delete(:shin) p friends これでdeleteしたらもうアクセス出来ない。
おいおい、ひょっとして本当に分かってんのは俺だけなんじゃないだろうな?
>>626 今の趣旨は、こういう話なんだよ。
friends = { :shin => "Shin Tanaka" }
value = friends[:shin]
p value.object_id,value #=> 84260, "Shin Tanaka"
friends.delete :shin
p value.object_id,value #=> 84260, "Shin Tanaka"
Hash#deleteは、要素自体を『削除』する訳ではなく、Hashから登録を抹消するのみ。
元の説明が「親切と正確」というものを履き違えてるんだな Hash だからといって特別な説明が必要だとは思えない
だね。これといっしょだぬ a = "hoge" b = a a = nil b #=> "hoge"
>>631 aもbもメモリの番地を記憶しているという事だな。
ハッシュも、変数も配列もすべてメモリ番地を記憶しているのか?
>>632-633 番地ではない
実装のメモリをまったく反映しない
そういう考え方は害悪しか生まないので即忘れるべき
オブジェクトの呼び出し法に過ぎない
通常利用に必要な程度のオブジェクトの概念が理解できないならRuby無理して使うのやめと毛
害悪ってどんなん
Cのポインタやらレジスタやらで説明すると Cと同様の動作を期待するあほの子が絶対出るので避けたほうがいいという経験則はなくもない
変数に*とか&とか付けてC言語と違うのはなぜですか、とか?
メソッド引数が参照かどうかとか聞くのはデフォ
>>633 どっつかっつーと、object_idを記憶してると考えたほうが良いかな
Pascalのポインタくらい抽象化されているものでの理解ならまだいいのかも。
実はJavaにもポインタがありますっていう話だろ
どこからも参照されなくなったオブジェクトがGCに回収されることを確かめてみようと a = 'hoge' p id = a.object_id a = nil GC.start p ObjectSpace.each_object.find{|e| e.object_id == id} とかすると いつまでたっても ObjectSpaceから'hoge'が見つかる a = String.new('hoge') だと、Stringオブジェクトはすぐに回収されてみつけられなくなる リテラルから直に生成されるStringオブジェクトは特別なんだろうか?
>>643 GC に回収されるタイミングを GC.start やら GC.stress=true やらで保証することはできない
Ruby の GC は保守的な GC(conservative GC) だから、
最終的に回収されることは保証するが、それが実際にいつかは保証できないし、
それが途中で行われていることを見越したコードを書いてもいけないことになっとる
つまり GC 実行のタイミングのテストを Ruby で試すのはたいへんめんどい
脳内で
「まーこんだけオブジェクト作って時間経ってればGCがどっかで動いてさっきのは消えてるんじゃないかなあ」
と想像するしかできない
> Ruby の GC は保守的な GC(conservative GC) だから、 > 最終的に回収されることは保証するが、それが実際にいつかは保証できないし、 > それが途中で行われていることを見越したコードを書いてもいけないことになっとる これは保守的と関係ない。
保守的GCは、最終的にすら回収されないことがあるGCだな。
vimでRuby書く場合のおすすめプラグインとかある? 例えば補完させるのとかあるのかな
>>644 一応、それはわかってるつもりなんだけど
10000000.times{String.new}
GC.start
sleep 5 # sleep中にGCが動くか知らんのだけど
とかやっても、あいかわらず'hoge'がObjectSpaceに居座ってる
長いスクリプトだったら、いつかそのうち回収されてるのだろうけど
Object.newやString.new や Array.new 等だと GC.startすらしなくても
すぐさま回収されて消えて無くなる
いろいろ試してみたところ 別の文字列リテラルを評価するとすぐに回収されるみたい
p "fuga"
とかすると、GC.start しなくても'hoge'が回収されてる
ふしぎだ
通常の使い方だとそんなこと気にせずとも、どうでもいいことなんだけどね
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
で試したことです
rubykaigiやらなんやらでGCの実装のプレゼントあったような気がする GCの実装見てみればいいんじゃないの と思ったけど、それができて簡単に理解できるならここで聞いてないか
GCが開始するかもしれないタイミング自体はアルゴリズムである程度決まってるんじゃなかったっけ
質問があるのですが、Rubyのセキュリティ情報やリリースアナウンスだけが流れてくるメーリングリストはありませんでしょうか? メーリングリストというのかわかりませんが・・・ Linuxのディストリビューションや海外のOSSではSecurity Announcement用のメールを流してくれたりするのですが、 そういうのはないものかと
「セキュリティ情報」の粒度によりそうな
655 :
デフォルトの名無しさん :2010/10/03(日) 19:58:37
鍵交換プロトコルの実装をしたいのですが、ソケットの様な通信用関数って Rubyにあるのでしょうか。
opensslの再実装でもしたいのだろうか。
658 :
デフォルトの名無しさん :2010/10/03(日) 20:20:41
GPGのもっと使いやすいやつを目指してます。 通信も出来ればいいかなと。Zebedeeみたいに。
>>653 サンクス、やっぱり公式のニュースのフィードか。
rssをメールで送るの使ってみるわ。rssだしgrowlにも設定しておけばいいか。
ruby-listのMLの方から抽出するのも早いのだろうけど、
"[ANN]"や"[ANN] リリース"だとRuby本体以外も入るし、
なかなか面倒なんだよ
661 :
デフォルトの名無しさん :2010/10/04(月) 16:42:23
rand(特別な数字) だと速い、みたいなのってありますか? たとえばrand(99999)までは速いけどrand(100000)だと桁の関係で遅くなる、みたいな
測定してみたら?
require 'benchmark' Benchmark.bmbm {|x| 100000.step(1000000, 100000) { |i| x.report("rand(10**#{i})") { rand(10**i) } } } Rehearsal ----------------------------------------------------- rand(10**100000) 0.080000 0.000000 0.080000 ( 0.090130) rand(10**200000) 0.210000 0.000000 0.210000 ( 0.210302) rand(10**300000) 2.213000 0.010000 2.223000 ( 2.303312) rand(10**400000) 2.143000 0.000000 2.143000 ( 2.303312) rand(10**500000) 0.972000 0.010000 0.982000 ( 1.011454) rand(10**600000) 3.545000 0.000000 3.545000 ( 3.585155) rand(10**700000) 1.752000 0.000000 1.752000 ( 1.792578) rand(10**800000) 2.204000 0.010000 2.214000 ( 2.243226) rand(10**900000) 3.174000 0.000000 3.174000 ( 3.334795) rand(10**1000000) 3.856000 0.020000 3.876000 ( 4.005760) ------------------------------------------- total: 20.199000sec user system total real rand(10**100000) 0.070000 0.000000 0.070000 ( 0.070101) rand(10**200000) 0.300000 0.000000 0.300000 ( 0.310446) rand(10**300000) 0.441000 0.000000 0.441000 ( 0.440634) rand(10**400000) 0.721000 0.000000 0.721000 ( 0.741065) rand(10**500000) 1.502000 0.000000 1.502000 ( 1.542217) rand(10**600000) 1.362000 0.010000 1.372000 ( 1.412030) rand(10**700000) 1.733000 0.000000 1.733000 ( 1.782563) rand(10**800000) 2.183000 0.010000 2.193000 ( 2.243225) rand(10**900000) 19.398000 0.000000 19.398000 ( 19.818498) rand(10**1000000) 3.184000 0.000000 3.184000 ( 3.304752) rand(i) の i が大きくなればなるほど遅くなるのが一般的な傾向だけど、 必ずしも i が大きい方が遅いというわけではないみたい。
i自体の計算時間がかなり影響してるとかないだろうな
require 'benchmark' Benchmark.bmbm {|x| 100000.step(1000000, 100000) { |i| seed=10**i x.report("rand(#{seed})") { rand(seed) } } } こうだな
>>665 うはwww そうでした
require 'benchmark'
Benchmark.bmbm {|x|
100000.step(1000000, 100000) { |i|
seed=10**i
x.report("#{i}") { rand(seed) }
}
}
user system total real
100000 0.000000 0.000000 0.000000 ( 0.000000)
200000 0.000000 0.000000 0.000000 ( 0.000000)
300000 0.000000 0.000000 0.000000 ( 0.000000)
400000 0.000000 0.000000 0.000000 ( 0.000000)
500000 0.000000 0.000000 0.000000 ( 0.000000)
600000 0.000000 0.000000 0.000000 ( 0.000000)
700000 0.000000 0.010000 0.010000 ( 0.010014)
800000 0.000000 0.000000 0.000000 ( 0.000000)
900000 0.000000 0.010000 0.010000 ( 0.010014)
1000000 0.000000 0.000000 0.000000 ( 0.000000)
例外クラスを自分で定義すべきかどうかを判断する基準がわからない…しにたい
Rubyの個々の例外クラスを作った人は、 自分が全ユーザーの全スクリプトのエラークラスの継承元になるということに 全く気を払ってないように見える 概念もまあまあで実装もまあまあだが実際がへぼいというなんとも
具体的にどういうときに例外クラスを使うかのガイドはあるべきと言われて誰も書けない状態が続いてるな 無いものは説明できんというたいへん正直な
test
673 :
デフォルトの名無しさん :2010/10/05(火) 15:02:52
質問です。 1. XML を別サーバーから GET で取得(http/net を使用) 2. その XML を整形/スタイルを指定して HTML に変換 3. ブラウザに表示 というのをやろうとしているのですが、どうやったらいいのかイマイチわかりません。 今のところちゃんと出来ているのは 1. だけです。 2. は XSLT を使って実現しようとしていましたが、現在頓挫しています。 こういうことをやりたいときのスタンダードなやり方はなんなのかなど、 自分なりに時間をかけて調べていたのですが、 答えが見つからず、質問させて頂きました。 よろしくお願いします
上司に「(メソッドのなかで)引数チェックしろよ。」って言われたんですけど、 「そんなのメソッドを呼ぶ側がチェックして放り込めばいいじゃないですか?」 って聞き返したら「はぁ?もっぺん入門書読んでこいよ。」とか言われました。 もう何が正しいのかわからなくなりました…
入門書読んでこいよだァ?コノヤロウ!てめェがもういっぺん読んでこいよ! でおk
>>675 printf の戻り値はチェックしてますか?と言い返せばよい
そのへんはもう Ruby 関係ないなw 一応、 ・ メソッド使用者がオブジェクトの吟味をする ・ メソッド内部で引数オブジェクトの吟味をする ・ どうせ動作しないので NoMethodError とかが出てから考える の3種類ある マニュアルに使用法が記述されるレベルのパブリックに供するメソッドは 「引数として受け取れるっぽいものは一応なんでも受け付けておいて内部でチェック」という動作が妥当 マニュアルレベルのパブリックでないなら好きにせえ hogestr_to_array(hoge) の hoge が String かどうかを内部でチェックするのはバカっぽい
ひきすうちぇっくしたうえでどうするのかにもよるきがす
引数のチェックは基本的に呼び出される側でやる。 が、入門書には載ってないな。 呼び出し側とか言ってるやつは、 エラーの使いこなしとかいつまで経っても進歩しない。
例外出さないチェックならメソッド外部でもいいよ
下手に気を利かせて nil とか false とかが返却されたり、 独自の例外が発生したりするのは勘弁。 まだ NoMethodError が出た方が引数間違ったと分かっていい。
Date#leap? ってばぐってる?西暦900年とかが、 うるう年になるんだけど。
>>683 西暦900年なら閏年でいいような気がする
rescue しても既にどうしようもなさそうな独自例外を出すメソッドはピキっとくる
687 :
683 :2010/10/06(水) 00:34:49
ユリウス暦は正直見落としてたけど、うるう年が単純で4で割り切れると知って考えても おかしくて1700年とか1800年とかがうるう年でないって判断される。 ちなみにruby 1.8.7 ね
>>688 それはグレゴリオ暦ですよね
1582年を境にユリウス暦からグレゴリオ暦に変えているということでしょうか?
ん?そもそも900年はfalseになるぞ $ ruby -v ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin] $ ruby -rDate -e "p Date.leap?(900)" false
$ ruby --version ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux] $ruby -r date -e "p Date.leap?(900)" false falseだな
クラスメソッドとインスタンスメソッドで結果が違うね $ ruby -rdate -e '100.step(3000,100){|i|print "#{i} #{Date.new(i).leap?} "}' 100 true 200 true 300 true 400 true 500 true 600 true 700 true 800 true 900 true 1000 true 1100 true 1200 true 1300 true 1400 true 1500 true 1600 true 1700 false 1800 false 1900 false 2000 true 2100 false 2200 false 2300 false 2400 true 2500 false 2600 false 2700 false 2800 true 2900 false 3000 false
694 :
小学生 :2010/10/06(水) 01:50:02
どもです。もうちょっと自分でいろいろ考えながらやってみます。
>>689 1582年10月4日(木曜日)までユリウス暦、
1582年10月15日(金曜日)からグレゴリオ暦
なんでしょ。
5日から14日までは欠番ね。
たまに思うのだが、rubyのリファレンスマニュアルの記述って なんか読みにくいんだよな。 引数説明とかあいまいだし
rubyで、CPUやメモリの情報をとってくることはできますか。 今は/procをみることぐらいしかやり方が思いつかないんですが、 できればプラットフォームに依存せず使える方法がほしいです。
CPUやメモリ自体が個別の「プラットフォーム」だろ 世の中にはメモリが連続でマップされてないシステムだってあるんだぞ
うむ もしそれを感じさせないのならそれはそのプログラム内部で細かく条件分岐してるだけだ ということで gem の sys-cpu とかになるんだが
>>700 sys-cpuがそのものズバリです。ありがとうございました!
702 :
デフォルトの名無しさん :2010/10/06(水) 21:19:40
VISTAのコマンドラインからrubyを使えるようにするにはどうすればいいですか?
rubyをインストールしろ
環境変数にパスが設定されているか確認。
cygwinで(ry
そういうめんどくさいことがないように Ruby Console がスタートメニューに入るんじゃないの どっか適当なコマンドプロンプトでも実行できるようにするのにはコマンドプロンプトについての基礎知識が要るな
ちょwC:\WINDOWS\system32にrubyをインストールすればよくね?
708 :
デフォルトの名無しさん :2010/10/07(木) 07:03:28
>>674 遅レスですみません!
>>673 を書き込んだ当日から予定外の出張が入ったのと、
規制(iPhone)とで書き込めませんでした。
明日から通常作業に戻れそうなので、さっそく試してみます。
親切で丁寧なアドバイス、ありがとうございました!
>>707 PATH設定したほうが余計なことを気にしなくても済むし手間もかからないだろう
710 :
デフォルトの名無しさん :2010/10/07(木) 13:05:21
こんにちは。
>>673 >>708 です。
あっさりつまりました。
環境は Windows7(64bit)で ruby 1.9.2 です。
1. Nokogiri をとりあえず動かしてみようとしたけど、動かない?
以下のように書いて、ブラウザでアクセスしたけど画面が真っ白です。
ブラウザは Firefox3.6.10 です。
#!/Ruby/bin/ruby.exe
print "Content-Type: text/plain\r\n\r\n"
require 'nokogiri'
doc = Nokogiri::XML(File.read('C:\Apache2.2\htdocs\test\sample01.xml'))
xslt = Nokogiri::XSLT(File.read('C:\Apache2.2\htdocs\test\test01.xslt'))
puts xslt.transform(doc)
2. ruby r- debug *.rb して s → Enter というのをやってみた
require 'nokogiri' のところで
<internal:lib/rubygems/custom_require>:29:
と出ます。何度繰り返しても末尾の数字が変わるだけで
前に進まないので、おそらくエラーメッセージが出ているのだろうと思い、
検索してみたけれど有益な情報にはたどり着けず。
まったくの初心者なので上記の ruby -r debug も、ついさっき知りました。
対処法以外にもアドバイスなどあればいただけるとありがたいです。
よろしくお願いします。
>>710 スクリプトをWebサーバー上で実行するな死ぬまでPHPやってろ
712 :
デフォルトの名無しさん :2010/10/07(木) 13:21:58
713 :
デフォルトの名無しさん :2010/10/07(木) 13:36:32
リンク先思ったのとちがってた…ひとりでもりあがってすみません
普通は標準出力への出力が妥当であることを確認してからCGIなりなんなりに移行させると思う Webブラウザの出力を見てデバッグするようなことはない そういうサポートがほしけりゃそれこそPHP使え で、nokogiri は rubygems で提供されているから gem コマンドでインストールしないと使えない gem 経由でインストールしたなら rubygems ライブラリを読み込んだ状態でないと利用できない ということで #!/Ruby/bin/ruby.exe # -*- coding: shift_jis -*-. require 'rubygems' require 'nokogiri' doc = Nokogiri::XML(File.read('C:\Apache2.2\htdocs\test\sample01.xml')) xslt = Nokogiri::XSLT(File.read('C:\Apache2.2\htdocs\test\test01.xslt')) print "Content-Type: text/plain\r\n\r\n" puts xslt.transform(doc)
>>710 や
>>714 じゃないけど、gemが足りないときに、このgemねーぞ!!って言ってくれる仕組みないの?
Railsだとenvironment.rbに config.gem でgem名とバージョン指定しといたら、
gem足りない時も rake gems:installで一気に入れられるじゃん?
あ、今はBundler使うのだっけ?
そういうことを書き捨てスクリプトでもできないかな、と
>>715 今年 rubygems なら gem install とするだけで依存する gem パッケージはすべてインストールされる
require 'hogehoge' としたときに LoadError なら gem search --remote hogehoge してくれるような
gem-not-found みたいなシステムは特に無いというかそれ多分うざい
717 :
デフォルトの名無しさん :2010/10/07(木) 16:30:51
>>714 なるほど、初心者の自分にもすごいわかりやすいです。
めちゃめちゃ助かりました。
参考にしてもうひとがんばりしてみます。
ありがとうございました!
文字列を自動変換するプログラムを作ってますが kconvは半角カナが自動で全角カナになってしまうので nkfで-xオプションをつかってみましたが nkfは配列を変換することができません。 アドバイスお願い致します。 require 'kconv' while line = gets s = line.split(/\t/) str = NKF.nkf('-e -x', s) next unless str[2] print str[0].toeuc print " # " puts str[1].toeuc.gsub(/ /, "\\ ") end
>>718 コレクションの概念がないのか
配列はただの配列だ
Array クラスの each メソッドで、要素を順に枚挙できる
['A', 'B', 'C'].each do |x|
puts x
end
自分で配列作ったら、文字列を each で枚挙させて文字列を変換すればいい
>>716 あーいや、gemにするようなものは他のgemの依存を記述するけど、
そうじゃなくてちょっとしたスクリプトでgem使いたい時の話
gem "hogehoge"
の後にrequireするという方法あった気がするけど、今でも使えるんだっけ・・・
instance_eval にブロックだけでなく引数を渡すことはできますか。 proc_obj = proc {|x| p x } obj = Hello.new obj.instance_eval(&proc_obj) # ここで proc_obj のために引数も渡したい
obj.instance_eval do proc_obj.call(xxx) end
724 :
720 :2010/10/08(金) 04:59:41
bundlerでいい気がしたわ
>>723 説明が足りてませんでした。
proc_objはselfがobjの状態で実行したいので、723の方法ではだめです。
proc_obj = proc {|x| x + @val }
class Foo
def initialize(val)
@val = val
end
end
obj = Foo.new
obj.instance_eval(&proc_obj)
instance_execは?
727 :
デフォルトの名無しさん :2010/10/08(金) 10:08:06
>>714 遅くなりましたが、できました!
本当にありがとうございました!
>>728 何年前の話だよ、と思ったが、たった2年前か。trunkにはかなり前からあったんだけどね
モジュールに定義した特異メソッドを、別のクラスの得意メソッドとして 利用可能にする方法はありますか。 module Mod def self.hello puts "Hello!" end end class Klass include Mod # NG extend Mod # NG #extend (class << Mod; self; end) # NG end Klass.hello #=> undefined method `hello' for Klass:Class (NoMethodError) たぶんできないとは思うんですが、もしできる方法がありましたら教えて下さい。
>>730 もし
module M
def self.eigen
end
end
としたeigenメソッドをほかのクラスの特異メソッドとして提供したいのだとしたら、
そもそもeigenメソッドをMの特異メソッドとして定義すべきではない
んで、それとは別に、C.eigen という見かけで M.eigen を「呼びたい」というだけなのなら、委譲をすればいい
require 'forwardable'
module M
def self.eigen; p "eigen!"; end
end
class C
class << self
extend Forwardable
def_delegators(M, :eigen)
end
end
C.eigen
732 :
デフォルトの名無しさん :2010/10/10(日) 02:25:21
C言語で書いたサブルーチンをRubyプログラムから呼び出して使う方法はありませんか?
あるぜ!
Lispを勉強しようと思い手始めにRubyを始めました。よろしくお願いします。
Lisp勉強したけりゃLispやったほうがいいかと
>>732 dlってライブラリがあるよ
#include <stdio.h>
void say_hello(void) { printf("Hello!\n"); return; }
$ cc -shared greetings..c -o greetings.so
#!/usr/bin/env ruby
require 'dl'
require 'dl/import'
module Greetings
extend DL::Importable
dlload './greetings.so'
extern 'void say_hello()' # 'void say_hello(void)' だとなぜか怒られる
end
Greetings.say_hello()
>>731 >もし
>module M
>def self.eigen
>end
>end
>としたeigenメソッドをほかのクラスの特異メソッドとして提供したいのだとしたら、
>そもそもeigenメソッドをMの特異メソッドとして定義すべきではない
まさにこれをしようとしてました。
やっぱりできないということで、別のアプローチを採用することに決定しました。
できないということがわかっただけで大助かりです。ありがとうございました。
クラスオブジェクトを動的に作成するには c1 = Class.new としますが、あるクラスのサブクラスを動的に作成するにはどうしたらいいですか。 class A end B = A.new #=> Aのサブクラスではなくインスタンスが作られる
サブクラスってなんですか?
クラスがサブなことです
>>738 Class.new(A)
としたら、Aのサブクラスが作成できました。
class A
end
B = Class.new(A)
B.class #=> Class
B.ancestors => [B,A,Object,Kernel]
>>740 なにその「マルチメディアとはメディアがマルチ」みたいな論
>>739 はきっと 派生クラス と言わせたい C++ 脳。
サブクラスという名称は公式にはない、と思う
>>744 確か、スーパークラスの説明はあってもサブクラスの説明はないんだよね
サブクラスという言葉自体は説明なしでいきなり出るはず
ハイパークラスはありますか?
747 :
デフォルトの名無しさん :2010/10/10(日) 18:36:21
πの計算をしたいです。Rubyでは巨大整数は扱えますが、浮動小数点は何ケタ 位計算できるのでしょうか。ニュートン法で近似していけば無限の精度で 求められますか?
>>747 BigDecimal を使えば巨大な浮動小数点数を扱える。
クラスという名称はなくて スーパークラスかサブクラスかの二択 rubyでは クラスという概念の中に スーパークラスかサブクラスが入っている。
RubyのJIS規格化って今どうなってんだろうな
大臣が審査するわけか。 誰か知らないが、大臣にRubyなんてわかるのかな?
一応エリート様なんだから解かるように書けば解かるだらう…きっと。
「役人や官僚がよってたかって精査して妥当と判断した結果に大臣名義ではんこ押す」という程度の意味だよな こんなようなことが大臣個人の能力に左右されてたまるかw
756 :
デフォルトの名無しさん :2010/10/11(月) 08:43:06
BigDecimalの使い方がよくわかりません。ライブラリをインポートしなければ ならないのか、BogDecimalとして変数を宣言するためにはどうしたらいいのか 教えてください。
その質問をする直前にどこの情報、サイトを見てわからなかったのかが気になる
758 :
デフォルトの名無しさん :2010/10/11(月) 08:48:46
すみません、何も見てません。日経サイエンスという雑誌で見つけました。
require 'bigdecimal' a = BigDecimal::new("0.123456789123456789") b = BigDecimal("123456.78912345678",40) c = a + b
760 :
デフォルトの名無しさん :2010/10/11(月) 09:08:10
BigDecimalの配列にしたいのですが、方法が解りません。 次のプログラムです。よろしくお願いします。 def pi2() y=BigDecimal::new("0.0") y=[20] a=BigDecimal::new("0.0") a=[20] y[0]=sqrt(2)-1.0 a[0]=6-4.0*sqrt(2) for n in 0..20 y[n+1]=(1-sqrt(sqrt(1-y[n]**4)))/(1+sqrt(sqrt(1.0-y[n]**4))) a[n+1]=((1+y[n+1])**4)*a[n]-(2**(2*n+3))*y[n+1]*(1+y[n+1]+y[n+1]**2) print "pi2=",1/a[n+1],"\n" end end
761 :
デフォルトの名無しさん :2010/10/11(月) 10:06:06
有効桁数まで表示されません。 def sqrt() x=BigDecimal("5.0",40) s=BigDecimal("1.0",40) last=BigDecimal("1.0",40) last=last+x if(x>1.0) s=x end while(s<last) last=s s=(x/s+s)/2.0 # print last,"\n" end print "x*x=",last*last," x=",x #print last end
762 :
デフォルトの名無しさん :2010/10/11(月) 10:30:51
すみません、表示できました。 計算に使う変数全部がBigDecimalでないといけないんですね。
みんなはテキストエディタはなに使ってる? テキストに載ってるSciTXを使ってるけど、いちいち日本設定しないといけないし正直微妙 ハイライトがしっかりしてるいいやつないかな?
vim でもリファクタリングとかはやっぱIDEがいいと思う今日この頃
自分もvimだねえ。 歴史の長いエディタだけど、文字コード対応や言語別ハイライトなど 最新の要件にもよく追随している。 でもvimは学習コストが半端ないので、今から使うのはオススメしない。 サクラエディタや秀丸なんかで十分いけるんじゃないの?
763です サクラエディタをインスコしてみました 設定が若干面倒だったけど、これよさそうですね。 これから使って見ます。
emacs でも、vimすげぇと思う
普通に文章書いたりする時はサクラ プログラミングするときはgvim
769 :
デフォルトの名無しさん :2010/10/12(火) 04:38:01
xyzzy使ってる
770 :
デフォルトの名無しさん :2010/10/12(火) 05:08:21
実行速度がものすごく遅いんですけど、スーパーπみたいに早く計算 することはできないのでしょうか。Cでないとだめですか?実装が 悪いのでしょうか? require 'bigdecimal' N=1040000 def sqrt(x) x=BigDecimal(x.to_s,4) s=BigDecimal("1.0",4) last=BigDecimal("6.0",4) a=BigDecimal("2.0",4) k=0 if(x>1.0) s=x end while(k<4) last=s.truncate(N) s=((x/s+s)/a).truncate(N) # print last,"\n" print "k=",k,"\n" k=k+1 end #print "x*x=",(last*last).truncate(N)," x=",x.truncate(N),"\n" return last.truncate(N) end
>>770 bigdecimalの便利さをRubyによって享受したいのは大いに理解できるのだけど、
純粋な計算速度を求める場合、Rubyは不向きだし、Cのような言語と比較するとRubyはかなり遅いです。
100倍遅くても泣かないことが必要。
bigdecimalみたいな機能やライブラリがある高速な代替言語のオススメは知らんので詳しい方頼む
BigDecimalは1回の足し算でCの足し算コードを100回以上利用しているので Cの足し算1回より100倍以上遅いのはそれこそ足し算で当たり前
rubyでgitやdiffみたいにテキストの履歴を管理できるライブらりってありますか? それともgitをコマンドで呼び出して使う方法をプログラム中にかけるでしょうか?
>>774 git使うのでよいのならば、githubが利用しているライブラリが使えたと思う
gitやdiffみたいなのがやりたいなら gitやdiffを呼べばいい result = `diff a.txt b.txt`
Webアプリ全盛のこのご時世に外部シェルコマンドを `` で呼ばせる人間は今すぐ死滅していいよ
呼ばせる、って表現としてあってるの?
webグラマはカタコトでも通用するお仕事です。
質問者はWebアプリとして使うと言ってるわけでもなく
diffの引数も文字列定数なのに
>>777 は何を怒ってるんだめんどくさい
代替手段があってアンゼンでないものを使わせないよう習慣付けるのは大事だとは思う 1.8 で File.read 使うなとかと同レベルの話かと
>>777 意味わかんね。
Webアプリが全盛であることと
>>774 がgitを呼びたいことと
何の関連があるんだ。
> 1.8 で File.read 使うなとかと同レベルの話かと kwsk
>>776 を見た人が(
>>774 が、ではない)「そうなんだすごーい」で
result = 'diff #{file1] #{file2}'
というコードになるということに思い至らない頭が怖い
>>776 を見て
「じゃあ変数で、あっ 'diff #{file1] #{file2}' だと変数が外部入力由来で file1 に ; が含まれていた場合は
任意のコマンドが外部入力者の指示で実行されちゃうね!いけないいいけないsystem使わなきゃ」
result = system('diff', file1, file2)
とか即対処できるような奴はそもそも参考にしたりせん
質問に直接答えるか答えず黙するかどっちかにしなさい
>>784 そんなもん、お前が危険と思ってるってだけの話じゃないか。
他人のレスに死滅していいよとか書くんじゃない。
こうするとセキュリティ上もっと安全だよ、とか 穏やかに書けばいいんだよ。 何が死滅していいよ、だ。 横から出てきて他人の善意のレスをけなす輩は 人として許せねえ。
セキュアなコードが書きたいならセキュアなコードの書き方を体系的に学ぶべきで ム板の初心者スレで場当たり的に知識を仕入れてもしゃーない
一応 $SAFE=1 だと弾かれるこた弾かれる $ cat a.rb $SAFE=1 puts `cat #{ARGV[0]}` $ ruby a.rb a.rb a.rb:2:in ``': Insecure operation - ` (SecurityError) が、まあたぶんそんな「不便な設定」などしないだろうな
793 :
774 :2010/10/12(火) 10:17:20
794 :
774 :2010/10/12(火) 10:22:47
戻せる時点でバージョン管理のお仕事だと思われ
ルビ厨のコミュニケーション、コンサル能力のなさを露呈してしまった不幸な事件であった…
RCS前提になるけど、rcsdiffコマンドを呼び出して、その差分リスト出力を加工し、 追加部分/削除部分/未変更部分をマージしたHTMLを生成するRubyスクリプトでよければ、 過去に書いたのがあるよ。今見たら、全体で128ステップほど。 diffコマンドの出力も大きな違いは無いから、改造すれば使えるかも。もし必要ならアップするよ。
>>794 > 差分を表示したり
ttp://raa.ruby-lang.org/search.rhtml?search=diff から探そう。
> 保存したり、元に戻したり
PStoreにまるごと保存してたり、古いものを取り出したりする、じゃだめかな。
db = PStore.new("foo.db")
db['bar.txt'] = []
db['bar.txt'] << File.read("bar.txt")
db['bar.txt'] << File.read("bar.txt")
db['bar.txt'].first
これらをひっくるめたものというとライブラリというよりは
アプリケーションのような気がする。Wikiエンジンとか。
>>777 >Webアプリ全盛のこのご時世に外部シェルコマンドを `` で呼ばせる人間は今すぐ死滅していいよ
ふつうにさ、
`` は安全性に問題あるからsystem使った方がいいよ
と書けばいいだけなのに、なんであんな書き方するんだろうね。
これはRuby連中のコミュニケ―ション力がないといわれても仕方ない。
#でもきっと本人は、自分は正しいことを言っていると思ってるから、改善しないんだろうな。
>>789 >こうするとセキュリティ上もっと安全だよ、とか
>穏やかに書けばいいんだよ。
ですよねー
800 :
デフォルトの名無しさん :2010/10/12(火) 17:49:04
>>721 です
>>714 のアドバイスのおかげで順調に作業が進んでいたのですが、
いざブラウザに表示するとなった段階で問題が発生しました。
いろいろ調べたり勉強したりはしたものの、
いまだに解決の糸口がつかめないので質問させていただきます。
>>714 のソースをブラウザで表示しようとすると
500 Internal Server Error になります。
http://blog.tofu-kun.org/071220192353.php を参考にブラウザに表示したエラーログを以下に貼りつけます。
*** CGI Error List ***
#<TypeError: can't convert nil into String>
C:/Ruby/lib/ruby/1.9.1/rubygems/config_file.rb:56:in `join'
C:/Ruby/lib/ruby/1.9.1/rubygems/config_file.rb:56:in `<class:ConfigFile>'
C:/Ruby/lib/ruby/1.9.1/rubygems/config_file.rb:28:in `<top (required)>'
<internal:lib/rubygems/custom_require>:29:in `require'
<internal:lib/rubygems/custom_require>:29:in `require'
C:/Ruby/lib/ruby/1.9.1/rubygems.rb:1110:in `<top (required)>'
<internal:lib/rubygems/custom_require>:29:in `require'
<internal:lib/rubygems/custom_require>:29:in `require'
C:/Apache2.2/htdocs/test/nokogiri.rb:17:in `<main>'
なんども申し訳ありません。よろしくお願いいたします。
``がダメなら、外部コマンドを呼んでその出力がほしいときはどうするのpopen?
>>799 既に収束した20レス以上も前のレスを穿り返すような人間が何言っても説得力ないな
>>800 nil ですエラー見せられても正直見当もつかんが、
とりあえずrequire する gem パッケージ名と同名のファイルはやめとけ
require 'nokogiri' と書いた nokogiri.rb を実行するとか混乱するぞ
804 :
デフォルトの名無しさん :2010/10/12(火) 18:40:22
>>803 >とりあえずrequire する gem パッケージ名と同名のファイルはやめとけ
たしかにそうですよね、変更しました。
ありがとうございます。
>nil ですエラー見せられても正直見当もつかんが
なにか他にお知らせできそうなことがなさそうか探してみます。
>>802 777本人様ですか?お疲れさまです。
20レス前のことを話題にされるとお困りでしょうか?以後気をつけます!
>>800 エラーメッセージの意味は分かる?
>#<TypeError: can't convert nil into String>
とあるから、「nilをStringに変換できない」という意味なんだが。
#もし分かってたらすまん。
だからconfig_file.rbの56行目を見て、joinしているものの中にnilになってるものが
ないかどうか調べたらいいんじゃないかな。
807 :
デフォルトの名無しさん :2010/10/12(火) 19:03:20
>>806 なるほど!そういう意味ですか、全くわかってなかったです。
ということはこのファイルをコマンドプロンプトでステップ実行して
調査すれば、光が見えてきそうな感じでしょうか。
ちょっとやってみます。
>>807 ステップ実行するまでもなく、データをpとかinspectとかで表示させればいいよ。
config_file.rbの56行目がどうなってるか見せてもらわないと分かんないけど、
たとえば "".join(list) とかだったら p list とか puts list.inspect とかして
データの中身を調べればいい。
ステップ実行ならどこか当たりをつけてpとかソース書き換えるまでもなく調べられますよね
ステップ実行ができるならそれにこしたことはない。 エラーメッセージが読めてない程度の初心者にはデバッガは難しいと思って printデバッグを進めたのだが、杞憂だったようだすまん。 最近のIDEならデバッガ付いてるもんな。
ruby のデバッガといえば rdb
なんかアンダースヘルスバーグがC#で開発する時も デバッガよりもprintfデバッグをよく使うそうで てめえの言語には立派なIDEがあるのにw
質問があります。 ちょっとしたメソッドに渡す引数をメソッド側をなるべく変化させずに遅延評価させるうまい方法はないものでしょうか? 例えば、 hoge :value => lambda{ rand(100) } というようなhogeメソッドの呼び出しで、名前付き引数のように利用されている:valueの指定を メソッドが呼ばれるときに引数をすぐに評価するのではなく、 メソッド内で必要になったときに評価する方法はないものか?と思っています。 上の例ではvalueを遅延評価させたい意図です。 この例の場合、通常はhogeメソッド側で、ハッシュの引数をoptionsとして受け取って、 options[:value] = options[:value].call if options[:value].respond_to?(:call) というようなProc的な値かどうかで場合分けの処理が必要になってきます。 しかし、できればhogeの方に手を入れずに上手く処理することができれば?と思ってます。
httpサーバーというものが何をやってるのかを知りたいと思い ちょうどrubyの勉強中でもあったのでwebrickのソースを読もうとしていますが、 ruby/lib/webrickの中にたくさんソースがあってどれから読んだらいいのか分からないです どれから読んだらいいんでしょうか?
>>814 やめとけ
素直にCで書かれた小型のWebサーバのソース読め
WEBrickは単純なレスポンダ以外の動作もさせるように小細工埋め込まれまくりだから混乱するぞ
一般論としては、自分でサーバ作るのでなけりゃHTTPの勉強で充分な気もする
>>815 ,816
あれ?なんか色んなブログやら何やらで
「webrickのソースは綺麗だからrubyの勉強にもなるし読んでみるといいよ!!」
みたいなこと言われたから、容易に読めるもんなのかと思ってました。
確かにその割にはブログでwebrickのソース解説してるしてるとこ
見たことないしな…
Rubyの勉強にはなるんだけど、 Webサーバがナニをどうするものなのかという事前知識はどーしても要る ファイル名を見てサーバ構造を想像できるくらいの基礎知識だ あと、余談だが、WEBrick の利用自体はわりと小難しい
>>817 Rubyでウェブサーバを作ろうと思った人がソースを読むとニヤニヤできるという意味で、勉強になる
Rubyの知識が浅い人、HTTPの知識のない人、Webサーバ作ったことのない人にとっては大変難解
「HTTPとCGI/ASPを実現可能なプログラムが綺麗なわけないじゃん」 というたいへんありがたーい言葉がございましてですな (「HTTPとHTMLを解釈可能なプログラムが綺麗なわけがない」というのもあり)
Rubyの面白いテクニックをいろいろ知ることはできるけど、理解できるのは多分中級者以上。 初心者が勉強のために読むのはすすめられない。
どうもです もう少しrubyとかhttpとかの勉強をしてから挑戦してみることにしました 有難うございました。
823 :
807 :2010/10/13(水) 13:25:42
>>810 誤解させてすみません。
print デバッグを選択しなかったのは「ステップ実行できる」からじゃなく、
素人考えで、なんとなくこちらの方が王道なのかなと思っていたのと、
Ruby のデバッグ方法を検索して参考にしたのがこちらのブログだったからです。
http://asaasa.tk/wiki/index.php?Ruby%2FDebug それと自分は IDE じゃなくって Vim を使ってます(初心者ですが)。
いちど Netbeans を使おうとしたのですが、なんとなくやめてしまいました。
最初は Vim で Ruby のデバッグをしようと思っていたのですが、
「Vim Ruby デバッグ」で検索しても特にヒットしないので、
おそらく Vim でやるというのは一般的ではないのだろうと判断して、
今のところはコマンドプロンプトを使ってやっています。
824 :
807 :2010/10/13(水) 13:27:12
肝心の56行目なのですが、 SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'gemrc' とありました。 わからないなりにステップ実行してみた結果が以下ですが、 さらにわからなくなった気もしています。 もしかしたらやり方を間違っているのかも知れません。
825 :
807 :2010/10/13(水) 13:29:29
さきほどから改行が多すぎると怒られるので、 関係ありそうな気がするあたりからコピーします。 連投してすみません。 config_file.rb:50: require 'etc.so' (rdb:1) s <internal:lib/rubygems/custom_require>:29: (rdb:1) s config_file.rb:51: Etc.sysconfdir (rdb:1) s config_file.rb:56: SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'gemrc' (rdb:1) s config_file.rb:57: puts file.inspect (rdb:1) s config_file.rb:57: `' (NilClass) from config_file.rb:57:in `<class:ConfigFile>' from config_file.rb:28:in `<main>' config_file.rb:57: puts file.inspect (rdb:1) s config_file.rb:57:in `<class:ConfigFile>': undefined local variable or method `file' for Gem::Config File:Class (NameError) from config_file.rb:28:in `<main>'
>>813 特にはできないと思う。本当にやりたいことは何かを書けば別の解決策があるかもしれない。
>>814 Rubyの勉強が目的なら「Ruby 添削」でぐぐって出てきた記事を読むのがいちばんいい。
他の人が書いているように Webrick をいきなり読むのはあまりお勧めできない。
>>824 56行目がほんとうにその通りなら、system_config_path の結果が nil であるせいでエラーになってる。
system_config_path が何者なのかはしらん。
827 :
デフォルトの名無しさん :2010/10/13(水) 16:05:23
>>813 hogeの内部処理がどうなっているかによるが、
Hashのラッパークラスを作って遅延評価するインデクサを付加できる様にしてみるとか。
828 :
827 :2010/10/13(水) 16:08:03
この場合、ラッパーではなくサブクラスだな。 用語の使い方が不適切ですまん。
830 :
デフォルトの名無しさん :2010/10/13(水) 18:32:28
831 :
デフォルトの名無しさん :2010/10/13(水) 19:03:37
Rubyでファイルを読み書きするにはどうすればいいですか?
>>830 全く無問題。
自分もPerlを使っていたんけど、OOPをやりたくなってRubyに乗り換えた一人。
言語の文法もPerlと似ている(= Perlユーザにも違和感のない設計になっている)。
Matz氏は「RubyはPerlの皮を被ったSmalltalkである」と語っているし。
基本的なオブジェクト指向から順々に理解していけば、Perlが使える人なら、たやすいと思う。
ただし、最近はRailsの影響で「メタプログラミングを駆使するのがRuby流である」という風潮がある。
これに惑わされず、Perlで学んだ「読み易いプログラミング作法」をRubyに活かしていけばいい。
なかなか恥ずかしいことしてるな
perlの皮をかぶったlispじゃなかった? smalltalkに似てるのは偶然で参考にした覚えはない、って言ってた様な
これのどこがlispやねん
いや、東大かどこかの教授が言ってたよ。 RubyはカッコのないLispだって。
『はじめてのRuby』で
「ALGOLの皮を被ったLisp」と紹介したのがyugui氏
>>837 そういえば、教養学部でRubyを採用した背景には
Lisp系教授の支持があったかららしいがw
ALGOLの皮を被ったLisp?
840 :
813 :2010/10/14(木) 01:53:34
>>826-827 考えた挙句、汎用的に書いてしまったのですが、せっかくなので具体的に書いてみます。
元々はCapistranoのCapfileスクリプトにて、リモートに接続する環境(ユーザー名やパスワード等)をタスクごとに簡単に切り替えたく、
set :user, "ユーザー名"
のようにCapistrano内部でも使われる変数を局所的に変化させる方法はないものか?という問題です。
Capfileの各タスクでは、set :user, "他のユーザー名" という指定で上書きしてしまうこともできるのですが、
他のタスクにもグローバルに影響を与えてしまいます。
Aタスクで上書きしたuserが、他のBタスクにも影響を与えます。
このsetも曲者でブロックを取って遅延評価させられるのですが、
そのため単に一時的に退避して切り替え(pushしてpopするような)てということがしにくくなっています。
ただ、このuser他いくつかの設定は、roleという設定に指定でき、タスク自身は指定したroleでだけで実行させられ、
つまりroleでuserを指定すれば擬似的にuserを一時的に切り替えることが出来ます。
(ソースをよんだかぎり、グローバルなuserよりもroleで指定したuserが優先されます)
ところが、roleでuserを指定する場合、
role :role_name, "example.com" :user => other_user
というように指定しますが、other_userはこのroleの設定を読むときに評価されてしまうのです。
other_userが固定ならばそれでもかまわないのですが、この場合setのときに使っているような遅延評価ができません。
setのような指定であれば、
set(:user){ Capistrano::CLI.ui.ask("other user name: "){|q| q.default = "baribari_denka" }
というように、ユーザーからの情報の入力が必要な場合にブロックで渡すことで、
userが最初に使われた時、つまり、fetch("user")されたときや、内部的にmethod_missingにより単にuserとして参照されたときに初めて入力を促すことができます。
roleの例では、利用するつもりはないのにユーザー名を聞かれてしまいます(setではそうならない)
841 :
813 :2010/10/14(木) 01:56:11
長くなってわかりにくくなってしまいました。 Capistranoではそもそもuserはあまり変えないよ、という話はそうなのかもしれませんし、 Capistranoでやりにくいところは、moonshineのようなShadowPuppetや、Chefを使えということかもしれません
>>840 ごめん理解できなかった。
だれか助けてあげて。
> そのため単に一時的に退避して切り替え(pushしてpopするような)てということがしにくくなっています。
自分でpush/popを定義するというのはなし?
843 :
デフォルトの名無しさん :2010/10/14(木) 08:47:26
RMD160のメッセージダイジェストについて質問です。 initialize wrong number of argument 1 for 0 ArgumentError となり実行できません。SHAは動くのにどこが悪いのでしょう。 require 'digest/rmd160' RMD160=Digest::RMD160 class String def rmdhex RMD160.new(self).hexdigest end end
ruby 1.9 だとエラーにならないので、多分バグ
バグというかリファレンスが間違ってるんじゃね
こうじゃね? d = Digest::RMD160.new d << "foobar" p d.hexdigest
1.8ブランチの先端でも1.8.5でもエラーにならなくて、1.8.7p248ではエラーになるので、どうもかなり 特定の版だけエラーになるっぽい。 とりあえず回避策としては、特異メソッド版のほうを使って、 RMD160.hexdigest self とすればいいと思うのだけど、なんか特異メソッド版と ふつうのメソッド版とで返してくる値が違うようで、なんか変だな。
あれ?1.8.7p248だとSHAもダメだな。 ほんとにSHAでは動いてる?
849 :
デフォルトの名無しさん :2010/10/14(木) 09:33:06
エラーが出なくなりました。ありがとうございます。 結果も確認しました。よくわからないで使っているので理解できるように がんばりたいと思います。
>>849 悪いんだけど
>>848 の質問に答えてもらえないかな?
直さなきゃならないところを絞るのが楽になるので。
851 :
デフォルトの名無しさん :2010/10/14(木) 10:08:38
あー了解 digestのDigest::SHA1じゃなくて、sha1のSHA1を使ってたわけね
853 :
デフォルトの名無しさん :2010/10/14(木) 10:39:53
すみません、どう違うのか教えてください。
機能は同じですが、違う(古いのと新しいの)ライブラリです
855 :
デフォルトの名無しさん :2010/10/14(木) 10:52:44
両方で動かすためには require 'digest/sha1' SHA1=Digest::SHA1 class String def sha1hex SHA1.hexdigest self end end の書き方の方がいいのでしょうか。
digestが使えるrubyを使っているのであればそのほうがいいでしょう。
857 :
デフォルトの名無しさん :2010/10/14(木) 11:01:45
ありがとうございました。
858 :
832 :2010/10/14(木) 11:09:21
リンク先も確認せず脊髄反射でカキコして、ああ恥ずかしい ...orz
>>835-839 「RubyはPerlの皮を被ったSmalltalkである」の発言は、以下の書籍の p.477 からでした。
オブジェクト指向スクリプト言語 Ruby - まつもとゆきひろ著
http://ascii.asciimw.jp/books/books/detail/4-7561-3254-5.shtml ただ、ちょいと勘違いしてました。この部分を指した、誰かの発言(blog?)と混同してたようです。
書籍の該当部分(p.477)を引用しときます。
.... Rubyは「Perl的なSmalltalk」というあだ名があるくらいです(*18)。 ....
________
*18 決して「Smalltalk的なPerl」ではないところが非常に重要です。
859 :
デフォルトの名無しさん :2010/10/14(木) 16:59:53
乱数として32バイト整数を入力したいのですが、以下の方法以外に 直接的な方法はありますか? salt=[OpenSSL::Random.random_bytes(32)].pack("m") salt.each_byte{|c| int=(int<<8)^c} salt=int
860 :
デフォルトの名無しさん :2010/10/14(木) 17:15:09
OpenSSLの機能を使ってRubyでRSA暗号とかは使えますか?
>>859 MTでよければ
rand(2**(32*8)) か Random.rand(2**32*8)) (1.9.2)
暗号的には
require 'securerandom'
SecureRandom.random_number(2**(32*8))
とか。
>>860 OpenSSL::PKey::RSAとかOpenSSL::Cipherとか調べるとよいのでは?
862 :
デフォルトの名無しさん :2010/10/14(木) 20:20:46
ファイルから32バイトずつ読み込んで、32バイト整数として演算したい のですが、以下の方法以外に効率的なやり方はありませんか? while((str=f.read(32))!=nil) c=0 salt=0 str.each_byte{|c| salt=(salt<<8)^c} eadd(@Gen_key_x,@CRV_G_x,@Gen_key_y,@CRV_G_y,@CRV_p) salt^=@T_y g.write(salt) g.write("\n") end
少しは自分で作れよ
864 :
デフォルトの名無しさん :2010/10/14(木) 20:28:58
自分なりに考えたんですが余りに遅いので・・・
String#unpack でq/Qを使うと64ビット整数に分割できるから 少しは速度が上がるかも。
>ファイルから32バイトずつ読み込んで これが遅い原因
867 :
デフォルトの名無しさん :2010/10/14(木) 22:44:40
処理のブロックが32バイトなんです。 最初に全部読んでもその後の処理を分割しなければならないかと。 そんなことないですかね。
バファリングはされてるだろうからIOはそんなに律速しない気がするなー (などとコードも動かさずに寝言を言ってみる)
869 :
デフォルトの名無しさん :2010/10/14(木) 23:22:48
f.readとかやるとメモリいっぱい読み込むんですよね。 その後いっぺんに処理して、いっぺんに書きこむみたいな?
870 :
デフォルトの名無しさん :2010/10/14(木) 23:32:26
バッファリングされたデータを32バイト毎にXORして最後に書き込み という操作をすればいいですか。
871 :
デフォルトの名無しさん :2010/10/14(木) 23:49:01
g=open(file,"wb") g.write(salt) これでファイルがバイナリじゃなくて数字になるのはなぜですか。
>>871 バイナリモード/テキストモードってのはWindowsなどに備わってるモードで
読み書きの際、改行コードなどの処理が変わる、というもの。
Ruby的には「バイナリモードとOSに伝えるか否か」の違いしかない。
バイナリデータを読み書きしたいのであれば
ファイルをバイナリモードで開くだけでなく
packやunpackを使っての変換が必要。
>>799 一応注意しておくけど、system()もパイプやリダイレクトを使うと /bin/sh 経由の実行になるから、
``と同じ程度に危険。
874 :
デフォルトの名無しさん :2010/10/15(金) 02:21:32
変換できません。 `pack': can't convert Bignum into String (TypeError)
なんかコミュニケーション能力に欠けた質問者だな。
今日も来るのでお楽しみに! 餌やった奴は責任持って処分するように
877 :
デフォルトの名無しさん :2010/10/15(金) 11:47:13
nokogiri のインストールに失敗します。 以前同じ条件でやってうまくいってたと思ったのですが…。 Windows 7 の 64bit 版で Ruby 1.9.2 です。 C:\Windows\system32>gem install nokogiri Building native extensions. This could take a while... ERROR: Error installing nokogiri: ERROR: Failed to build gem native extension. C:/Ruby/bin/ruby.exe extconf.rb checking for libxml/parser.h... *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --srcdir=. --curdir --ruby=C:/Ruby/bin/ruby --with-zlib-dir --without-zlib-dir --with-zlib-include --without-zlib-include=${zlib-dir}/include --with-zlib-lib --without-zlib-lib=${zlib-dir}/lib
878 :
デフォルトの名無しさん :2010/10/15(金) 11:48:50
--with-iconv-dir --without-iconv-dir --with-iconv-include --without-iconv-include=${iconv-dir}/include --with-iconv-lib --without-iconv-lib=${iconv-dir}/lib --with-xml2-dir --without-xml2-dir --with-xml2-include --without-xml2-include=${xml2-dir}/include --with-xml2-lib --without-xml2-lib=${xml2-dir}/lib --with-xslt-dir --without-xslt-dir --with-xslt-include --without-xslt-include=${xslt-dir}/include --with-xslt-lib --without-xslt-lib=${xslt-dir}/lib C:/Ruby/lib/ruby/1.9.1/mkmf.rb:368:in `try_do': The complier failed to generate an executable file. (RuntimeError) You have to install development tools first. from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:446:in `try_compile' from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:853:in `block in find_header' from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:693:in `block in checking_for' from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:280:in `block (2 levels) in postpone' from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:254:in `open' from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:280:in `block in postpone' from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:254:in `open' from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:276:in `postpone' from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:692:in `checking_for' from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:852:in `find_header' from extconf.rb:99:in `<main>'
64bit版Ruby用のバイナリを用意してるgemパッケージなんて存在しないんじゃなかろうか
ruby -v で [mswin32] か [mingw32] が表示されない Windows 版 Ruby なのなら、 gem 用に自前でコンパイラ用意しないと駄目だと思う
881 :
デフォルトの名無しさん :2010/10/15(金) 12:08:10
>>880 ruby 1.9.2p0 (2010-08-18 revision 29036) [x64-mswin64_80]
でした。たぶん以前は32bit版を使ってたんでしょうね、お騒がせしました。
ところで 32bit 版 Ruby を 64bit 版 Windows で使用することで、
何かまずいことってありますか?
開発環境を慣れない Ubuntu に移すかどうか迷っています。
特にない たま〜にへちょいgemインストーラが 「64ビット版Windowsを確認!ということはつまり64ビット版Rubyだな!」とか条件分岐するが そんなのは焼いて捨てちゃってよし
883 :
デフォルトの名無しさん :2010/10/15(金) 12:38:03
>>882 ありがとうございます、焼いて捨てます。
32bitプロセスからは普通にはアクセスできないフォルダやレジストリがあるけど、実用上は問題ないと思う。
885 :
デフォルトの名無しさん :2010/10/15(金) 16:22:51
sprintfでアスキー変換できない数値を識別する関数はありますか?
886 :
デフォルトの名無しさん :2010/10/15(金) 16:34:03
>>884 >32bitプロセスからは普通にはアクセスできないフォルダやレジストリがあるけど、実用上は問題ないと思う。
そういったケースに出くわした場合、なにか対処が必要ですか?
また、その場合通常エラーメッセージなどでアラートがされるのでしょうか?
>>885 もうちょっと詳しく。
どういう書式文字列で、どんな型の数値を整形したいのか具体的に。
888 :
デフォルトの名無しさん :2010/10/15(金) 17:56:38
ファイルの処理の時なんですが、パディングする代わりに
アスキー文字に変換できない文字は無視して書き込むという
処理をしようとしてました。以下のプログラムです。
アスキーコードをアスキー文字に変換して書き込みます。
while(l>0)
i=0
while(i<ls)
salt[i]=l&0xff
salt[i]=sprintf("%c",salt[i])
l=(l
>>8 )
i=i+1
end
end
また書き込んだデータがアスキー数値になっているのでファイルサイズ
が大きいのでバイナリにpackしたいのですがうまくいきません。
バイナリファイルの読み書きも教えてください。よろしくお願いします。
>>886 884じゃないけど、32ビットアプリからの\Windows\System32へのアクセスは自動的に\Windows\syswow64に
リダイレクトされる。例えば32ビットアプリからはsystem32下のdefrag.exeは呼び出せない
(syswow64にはdefrag.exeがない)。
どうしても本当のsystem32にアクセスしたい場合はVista以降では\Windows\Sysnativeにアクセスする方法がある。
XP/2003ではWin32APIでWow64DisableWow64FsRedirectionを呼び出してリダイレクションを無効化する。
レジストリはHKLM\SoftwareへのアクセスがHKLM\Software\Wow6432Nodeにリダイレクトされる。
こっちはWin32APIでRegDisableReflectionKeyかな。
>>877 コンパイル環境がないみたいだけど、devkitいれたら解決するとかそういう問題ではないのか
module Kuso class Shine def baka puts "omaegana" end end end というのを、短く書く方法はないでしょうか? def Kuso::Shine.baka puts "omaegana" end だと、.bakaのところでsyntax errorになります。 この編の仕様についてのドキュメントはありませんか?
893 :
892 :2010/10/16(土) 04:13:20
def (Kuso::Shine).baka puts "omaegana" end 最初が式ならこれでいける、と思ったのですが、、、 そもそも後者のような書き方だとクラスメソッドになってしまうんですね
>>892-893 クラスの部分だけなら繋げて
class Kuso::Shine
def baka
と出来るが…classの部分も繋ぐのはちょっと苦しいかな。
もしかしたら出来るかも知れんが、たぶん解りにくくなるだけだと思う。
せいぜいセミコロンで2行を纏めて
class Kuso::Shine; def baka
〜
end; end
程度が限界か。
def foo.bar
って感じの書き方は、正確には特異メソッドの定義。
クラスメソッドは特異メソッドの一種だから、クラスメソッドの定義にも使える。
なぜMatzという老害がいつまでもコミュニティに 巣食って発言力維持しようとしているのですか? 言語の発展に寄与しない老害がなぜ強いのですか? ごみ言語だから問題ないの?
ごみって
>>895 自身のことだと思うの。Matzが消えたら困る人が世界のいたるところにいるけど、895が消えてもだれも困らないと思うの。
だから895のことはそっとしておいてあげよう。
RubyってMatzいないとメンテ出来ないの? なんとかなるんじゃないの?
>>898 コードの追加は誰でもできるが、
それを本家crubyとして認めるかどうか(厳密には認めないかどうか)の権限が
まつもとゆきひろにある
その機能は本家Rubyではないと言ったらそのコードは追加されない
そんだけ
方向性の強い決定権を持ってるから、今のところはいなくなると困る
githubのライブラリにおける、pullリクエストの認証者のような立場
900 :
デフォルトの名無しさん :2010/10/16(土) 15:03:24
pack、unpackの使い方がわかりません。 現在データがアスキー数字で書き込まれています。 バイナリでファイルを書き込む方法を教えてください。 while((str=f.read(32))!=nil) salt=0 str.each_byte{|c| salt=(salt<<8)^c} eadd(@Gen_key_x,@CRV_G_x,@Gen_key_y,@CRV_G_y,@CRV_p) salt^=(@T_y%(2**8*str.size)) @Gen_key_x=@T_x @Gen_key_y=@T_y g.write(salt) g.write("\n") end
お、きたな
うむ というか、残念ながら pack/unpack は「Rubyではない」ので、 これに関しては専門の解説を別途参照することをお勧めする Ruby っぽく実装された gem があれば人気が出そうな蛇足になりそうな微妙な感じ
というかこの一連のは素直にRuby以外の"元の言語"でやったほうが効率的なんじゃあ…
たしかこの質問者の扱っている整数はpackで扱える64ビット整数を 超えていたよーな記憶。
905 :
デフォルトの名無しさん :2010/10/16(土) 16:46:12
packで扱える数には大きさの制限があるのですか?知りませんでした。 試しに g.write([salt.to_s].pack("B*")) と書き込んで l=l.unpack("B*") とやると2進数でなく10進数と解釈されます。 配列の先頭に0bを入れても文字列として解釈され10進数にはなりません。 どうすればいいですか?
906 :
デフォルトの名無しさん :2010/10/16(土) 17:28:11
別に暗号化後のファイルの大きさが倍増することを問題にしなければ どうでもいい問題なのですが、解決できるなら解決したいと思い投稿してます。 暗号化ファイル形式がアスキー数字というのも気になります。
907 :
デフォルトの名無しさん :2010/10/16(土) 17:37:10
Rubyはスクリプトながら高機能で暗号の実装に適しているツールが 呼び出せるので遊びで使う分には問題ないけど、100M暗号化する のに800分もかかるとスクリプトではもう限界かと思う今日この頃。
pack('B*') は *2進数を表す文字列* からバイナリ文字列を作る。 ["0000111111110000"].pack('B*') => "¥x0F¥xF0" 他には、たとえば [ 65534, 65534 ] という配列をリトルエンディアン2バイトとビッグエンディアン2バイト 計4バイトのバイナリ文字列に変換したいなら * v:16ビット整数(リトルエンディアン) * n:16ビット整数(ビッグエンディアン) なので、 [ 65534, 65534 ].pack('vn') #=> "¥xFE¥xFF¥xFF¥xFE" のように使う。 packで使える記法を調べると、64ビット整数までは扱う記法があるが、 それより大きいのはないので、2**64 で割っていった余りの配列に対して 変換を行えばいいんじゃないだろうか。
909 :
デフォルトの名無しさん :2010/10/16(土) 17:57:29
私がむしろ問題に感じているのは、10進数から2進数に変換する処理 はあるのに、2進数から直接10進数に変換できる関数がないという所 です。出力をみると64ビッを超えていても2進数の文字列として packされているようなのですが、unpackした結果は10進数扱いの 2進数文字列なのです。配列の先頭に0bをつけてもだめでした。 どうして? 試しに scanf("%b",l.unpack("B*")) とかやるとさらに大きな数に変換されます。
"0b1111111111111111".to_i(2) #=> 65535 二進数と二進数文字列とバイナリの区別ついてないんじゃ?
911 :
デフォルトの名無しさん :2010/10/16(土) 18:07:27
packされてませんでした。ファイルサイズが半分になってました。 unpackの出力が何を意味しているのかわかりません。
912 :
デフォルトの名無しさん :2010/10/16(土) 18:17:55
二進文字列を期待してto_i(2)をするとエラーになります。 undefined method to_i for #Array:XXX
to_iは文字列のメソッド。 エスパーじゃないので何をどうしたのか知らないけど Arrayが返って来てるんならそりゃエラーになるわ。
914 :
デフォルトの名無しさん :2010/10/16(土) 18:34:03
g.write([salt.to_s].pack("B*"))したものを、 open(ARGF.filename + ".ecc") {|file| while l = file.gets l=l.unpack("B*").to_i とするとエラーになります。基本的なところが解りません。
salt.to_s と pack('B*') の時点で間違っている。 # 巨大な数 salt をバイトごとの配列に変換(packが使えないので原始的に) bytes = [] while salt > 0 salt, byte = salt >> 8, salt & 0xff bytes.unshift(byte) # 望むエンディアネスによっては push かも。 end # バイトの配列をバイト文字列として書き出す open('file', 'wb') {|out| out.print(bytes.pack('C*')) } value = 0 # バイナリデータを読み込んでバイト列に分解 raw = File.binread('file').unpack('C*') # 数を復元 until raw.empty? value = (value << 8) + raw.shift end
916 :
デフォルトの名無しさん :2010/10/16(土) 19:31:42
エラーが出ます。 undefined method binread for File:Class (NoMethod Error)
917 :
デフォルトの名無しさん :2010/10/16(土) 19:34:05
ソース見てもらっていいですか?
File.binreadがないRubyバージョンなら open('file', 'rb') {|f| f.read }
920 :
デフォルトの名無しさん :2010/10/16(土) 20:05:14
if と case はどのように使い分ければよいでしょうか? PHPの時は、swichは評判が悪かったので一切使っていませんでした。
より見易くなるほう。 caseの比較は === で行われることを念頭に置いておく。
return 1 if a return 2 if b return 3 if c return 4 って書くかcaseでどっちが可愛い?
>>924 可愛いはどうでもいいが、
「if a」や「if b」が異常系の条件だったりすると、
ガード節とかいってそう書いた方がいいと「リファクタリング」にあるな。
拡張ライブラリを作る際、 rubyからCに、longに収まりきらない整数を渡すにはどうすればいいんですか?
doubleに変えればいんじゃない
>>926 RubyからCへは文字列として渡し、C側で文字列から多倍長整数に変換する、というのはどうでしょう。
多倍長整数についてはぐぐってください。
SecureRandom.hex(6) -> 23c5a790ab4c どうして12桁の出力になるのでしょうか? もう1点、セキュアなランダム英数字を作りたい場合はどのような方法がありますか? よろしくお願い致します。
931 :
679 :2010/10/19(火) 12:53:43
ruby&mechanizeで 500 => Net::HTTPInternalServerError (Mechanize::ResponseCodeError) のときに,サーバから送られてくるHTMLを利用したいのですが、方法を教えてください。 (もちろん,begin rescueで処理するとして) Mechanize::インスタンスのどこかにありそうなのですが,見つけられませんでした。 よろしく
>>931 require 'rubygems'
require 'mechanize'
require 'webmock'
uri = '
http://example.com/ '
headers = {'Content-Type' => 'text/html'}
html = '<html><title>ERROR!</title></html>'
WebMock.stub_request(:get, uri).to_return(
:status => 500,
:headers => headers,
:body => html)
agent = Mechanize.new
begin
agent.get(uri)
rescue Mechanize::ResponseCodeError => ex
p ex.page.title
end
結果
"ERROR!"
というわけで普通に例外オブジェクト捕まえてpageメソッド使え
933 :
デフォルトの名無しさん :2010/10/19(火) 21:50:45
ハッシュにキーは同じだけど値は違うみたいなのって保存して表示することできないんですか?
>>933 適当に補完して回答するが、できない
そういう用途では普通、値を配列にする
cgi/sessionで session['hoge'] = 'aiueo' session.close としてセッションを閉じますけど、 puts session['hoge'] のように読み込んだだけでも session.closeは必要ですか? expireはまだ大丈夫なのにページを行ったり来たりしてるうちに消えてしまうんですよね。 何が原因なんでしょう。
>>933 そもそもハッシュは1キー1レコードだろ
937 :
デフォルトの名無しさん :2010/10/19(火) 22:08:16
>>934 素早い回答ありがとうございました
しつこいですが、
ハッシュにキーと値を次々と保存していき、同じキーがあった場合、値が違っても
ハッシュに保存し、それを別々に表示することはできないでしょうか?
939 :
デフォルトの名無しさん :2010/10/19(火) 22:22:52
衝突処理戦略を決める方法は、 perfect hashing(完全ハッシュ法)を使う。 chaining(連鎖)を使う。 open addressing(オープンアドレス法)を使う。 アルゴリズムで調べればいくらでも出てくるだろ。
941 :
デフォルトの名無しさん :2010/10/19(火) 22:55:06
>>940 衝突はキーじゃなくてキーのハッシュ値が重複する場合でそ。
>>935 読み込むだけならSet-Cookieヘッダを送信する必要はないからcloseも必要ないはず・・・
と思ったけど、セッションファイルがオープンされたままになっていると次のリクエスト時に困るかもね。
CGIでなければcloseしたほうが無難(CGIならプロセス終了時に勝手にクローズされるはず)。
あとセッションが消えるというのは
・サーバサイドのセッションファイルが消える
・クライアントからのクッキーが送られてこない
の両方が考えられる。どっちが原因かを特定したほうがいい。
もし後者なら単にセッション用クッキーのパスの問題である可能性が高い。
>>929 マニュアルに書いてると思うけど、SecureRandom.hex(n)はランダムなnバイトのデータを生成してそれを16進数にして返す。
16進数だから、1バイトあたり2文字必要。
セキュアなランダム英数字は、SecureRandom.hex()でいいと思うよ。
同じUTF8で書かれたRubyコードをWindowsのコマンドプロンプトとMacのターミナルで実行すると、日本語が含まれる出力があるとWindowsの方は文字化けするけど、なにかいい解決方法ないですか? rbファイルを複製してsjisにする、とかそういうの以外で
chcp 65001
特にない Rubyが手を出せる範疇を越えている コマンドプロンプトがCP932しか出力できないのはコマンドプロンプトの仕様 コマンドプロンプト上に出力しようとしているということがスクリプト上でチェックできれば その時だけ標準出力をtosjisとかで変換すればいいんだけど
cygwin とか msys とかで
Windows のシステムロケールを変更する
>>946 それって日本語の入出力できなくなりませんか?自分の環境だとできなかったんですが、普通はできるのかな…
>>947 やっぱり厳しい感じですかー
Pythonはそういうことがないみたいなんですが(普通に意識せずにマルチプラットフォームで日本語使える)、内部で判定して変換でもしてくらてるんでしょうか
うん、コマンドプロンプトを使わないというのが解決法のひとつ 配布スクリプトなら諦めろ
rubyはwindowsに冷たいです
>>950 >>946 は実際に使ってないから気にするな
コードポイント切り替えてまともに動作することはない
沢山のレスありがとうございます 厳しそうなのが改めて理解出来ました Ruby好きで使いたいのに使えないってのは歯痒いですね… Winをばっさり切り捨てられればいいですけど、なかなかそうもいかなくて、Python調べてみるかな…
PythonだとUTF-8で出力した文字列を SJIS前提のコンソールで見られるのか?
Pythonだと print u'ほげほげ' という形で unicodeで出力すると 自動的に環境に合わせてエンコードしてくれるよ
直に書けないんだよね
958 :
956 :2010/10/20(水) 22:26:32
ソースが utf-8 固定のときでも #!/usr/local/bin/python # -*- coding: utf-8 -*- a = 'ほげ' # ここは utf-8 print a.decode('utf-8') で print u'ほげ' したのと同じになる
PythonにできてRubyにできないのは 怠慢?仕様?
Rubyも2.4くらいから出来るんじゃないか
-Ks とか -Ku の意味が微妙に違うんだよな
>>959 PythonはWindowsでしか動作しない専用のコードが物凄く組み込まれてる
彼らはOS依存のコードを大量にパッケージングすることを厭わない
Pythonだからできた、わけではない
Rubyでできないのは単なるリソース不足
Ruby1.9ならでき…たはず
Rubyはやるきがない
そして最近話題の閉鎖的な開発陣、一回終わってみるべき論、につながるわけですね、わかります
そもそもコマンドプロンプト出力するRubyスクリプト案件がどんだけあるのかという問題
俺も困ってるわ。
コマンドプロンプトはUTF-8もまともに扱えず確かにクソだが、WindowsでいうUnicode(UCS-2、UTF-16か?)は扱えるみたいだし、
そのせいにするのはおかしい。そうでなかったらPowerShellやコンソールアプリどうすんだよ
tosjisで出力するのは現時点での現実的な解だし、
それでもいいならtermtterがその路線のようで、
readlineで入力もできているし、オマケでターミナル向けのカラーも表示できるので、ソースが参考になるかな。
この部分簡単に使えるようにgemでくれ > termtter開発者
http://github.com/jugyo/termtter/blob/master/lib/termtter/system_extensions/windows.rb 内部的に従来どおりUTF-8にしておいて、入出力する時はUCS-2で処理することはできないかな。
Pythonの話が出ていたけど、Windowsと親和性たかいといわれるPythonの実装はどうなってるか知らない?
ようするに誰かパッチ書くか、ハックするgemくれ!!!
>>948 Cygwin 1.7版のRubyはUTF-8いけそう。
mswinやmingw版はUTF-8対応のターミナルで使おうとしても表示はできるが、
irbやインタラクティブな部分はだめだし、他にもいくつか不具合がある。
>>946 chcp 65001まともにつかえないだろ
Pythonの文字コード周りは紛糾する初心者続出の危険な領域であって 隣の芝生はよく見えるの典型的ないやなんでもない
わるい、Pythonの部分はその後のログ 見逃していたスルーしてくれ
>>967 > 内部的に従来どおりUTF-8にしておいて、入出力する時はUCS-2で処理することはできないかな。
1.9.2だとそういう試みがあると聞いたけど具体的なMLログと、Redmineチケットとソースくれ
>>966 表示が無理だというのが知れ渡ってるからコマンドプロンプト表示活用者が少ないんじゃないかと
鶏卵な感じもちょっとする
擁護ではないが、Perlもできない
Windows専用でShift_JIS固定俺用スクリプトでも コマンドプロンプトに表示させて便利に使ってるスクリプトはゼロだな
Pythonの文字コードよりもRuby1.9の文字コードの方が初心者はまると思う
ちょっとまてよ、Windowsユーザーは irb使ってないのかw
それとか、autotestとかautospecとかデフォがコマンドラインやターミナルが前提のツールもあろだろ みんなIDEやエディタの拡張機能から直接実行してるのか
"ほげ"が"縺サ縺・"みたいに文字化けで表示されるんなら分かるんだけど "\343\201\273\343\201\222"みたいになるのがよく分からんね 前者なら(フォント変えてから)chcp 65001でとりあえず解決するんだけど Rubyの方でUTF-8でない何かにしちゃってる気がする
なんでわかんねーんだよアンポンタン
>>977 その場合putsやpだとでなくね?
1.8なら$KCODE指定してないとinspectするときにそうなった気がする
例えば$KCODEとか-Kなんとかを指定せずにirbで、文字列を変数に入れたときに
戻り値をirbが表示してくれるが、
>>977 みたいになる
irbの良さがわからない。 何が良くて使ってるんだ???
で?
そうねぇ。 結婚して、子どもができて、飯食わすために出世して、親とお別れして、世代が移り変わって… いよいよ所帯じみてきたら、わかるんじゃないかな…。
>>980 TTYとは何かを100篇暗誦しろ
環境変数TERMを読んで条件分岐というのが一般的なんだが、
TERM(に相当するもの)を変更してシェルを起動しないタイプの場合どうにもならない
途中で送信してしまった
>>980 ですがエディタ以外にmswin32のRubyをCygwinから実行した場合にも
$stdin.tty?がtrueになってしまい同様の問題がおきてしまいます。
Rubyではないですが、pythonのインタプリタは標準入力がないときやファイルの指定がないときは
インタラクティブモードに自動的になりますがやはり同様の問題があるようです。
これは仕方がないものでしょうか?
>>977 あぁ、これ自分もなんでこうなるのかわからず悩んでた
$KCODEか-Kオプション指定すればなおるのかーサンクス
>>979
直るというか、1.8のString#inspectとしては絶対に化けずにinspectしてくれるほうが正しい動作
蒸し返して悪いんけど、Perlだと、 binmode STDOUT, ':encoding(cp932)'; で、コンソール出力時に自動でエンコードしてくれるけど、Rubyだとどうするのでしょうか?
>>988 それはコンソール出力時ではなく標準出力全部が切り替わるだろ嘘つくな
まあそれはそれとして、$stdout.write を書き換えるとやっぱり標準出力全部が書き換わる
NKF噛ませるのがポピュラーで汚い解決法
require 'kconv'
class << $stdout
alias :write_orig :write
def write(s); write_orig(NKF.nkf('-sxm0', s)); end
end
puts "Ruby1.8はうんこ".toutf8
次スレ立てまーす
梅まーす
出力をsjisにしたいなら、そういうプログラム書いてパイプでつなげばいいやん
995 :
デフォルトの名無しさん :2010/10/21(木) 16:01:03
jrubyを使ってRubyからJAVAにコンバートしたいのですが方法が解りません。 コマンドラインを知っていたら教えてください。
996 :
デフォルトの名無しさん :2010/10/21(木) 16:11:08
bignum too big to convert into long というエラーが出ます。
だからなんだよ
998 :
デフォルトの名無しさん :2010/10/21(木) 16:36:46
正しい使い方を知りたいです
JRubyは別スレ立ててもいいくらいの違いっぷりだからなあ
python~~~~
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。