1 :
デフォルトの名無しさん :
2007/05/03(木) 13:47:30 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは2以降。Ruby on Railsの質問はWebProg板のRailsスレで。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・ぐぐる
・マニュアルで探す
http://www.ruby-lang.org/ja/man/ ・FAQを読む
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(なるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
宗教的な話題は禁止します。
Rubyを使って脱獄するコードを教えてください。 当方初心者(♀)なのでやさしくお願いします。
def prison ->(){break} end
前スレ
>>999 >>991 には最後にselfって書いてあるからクラスが返ってる。
他の式を最後に書けば違うものが返るぞ。
つまり class A p 'foo' p 'bar' end で "foo" と "bar" が表示されるという事なんだが、 何だかなあとは思うな。
俺は違和感感じないが、慣れただけなのかなぁ。
self と書かないと返らないのと 書かなくても返るのとでは大違い
で、実際にそこら辺の仕様を活用したコードって実在するの?
attr_* とかは基本的には同じようなものなんだけどなぁ。 class A attr_accessor :a end
定数の定義くらいならやるけども。
>>14 self と書けば self を返せるのと
他のものを書いても self しか返せないのとでは大違い
とでも答えておけば満足?
RoRで作って、問題なく動くものが出来たら、それをjavaのコードで吐くってアプリケーションが有れば最強な気がする。 RubytoJavaコンパイラって感じか?
.to_s.to_iってださくね?
26 :
デフォルトの名無しさん :2007/05/04(金) 15:24:05
直接to_iを定義すりゃええやん
>>28 俺も嫌いだし、いまはもう廃れた習慣でせいせいしてるけど、
昔は to を 2 と表記する習慣がこの世界にはあった。
昔の俺のPascalのライブラリとか見ると、int2strとか余裕である。 時代を感じさせる
変換系のコマンドラインツールには山ほどあるぞ
f2c とか。 ごく普通な表記だと思ってるけど。
真ん中に2がはさまってるのは山ほどあるけど、2から始まるのは見たことないな
後ろにつくplain2というのならあるな。 plain2 -tex とか plain2 -htmlとかオプションを付けて起動して プレインテキストから指定フォーマットに変換。
int_to_strよりはint2strのほうがいいかとも思うけど、 to_iを2iはないだろ
識別子が数字で始まるのは無理だよなあ。
案外「数字から始まることが許されるなら本当は2iや2sにしたかった」とか言われたりして 2や4はもう習慣的なもんだな _to_や_for_とどっちがいいかと言われるとちょっとだけ悩む
外人とチャットで c u l8er とか、最初は何の文字化けかと思ったな。
日本語で ノシ とだけ書かれるのも似たようなもんだけどな
l8erって初めて見た。理解するのに10秒ぐらいかかったよ。 普通にタイプしたほうが楽そうだ。
41 :
デフォルトの名無しさん :2007/05/04(金) 20:41:48
便乗だけど検索ワードに”エロエロ”とか任意の漢字入れるのってどうやるの? %なんたらって表記に変換する関数ってある?
iconvかなんか使った後、gsubかなー?
open-uriは「1行ずつ」読まないから嫌いだ(w
ローカルに全部持ってきてから配列にして返してるだけじゃん。
仕方ないんだけど。
>>44 今書こうとしてた
%ナントカという形のURLエンコードされた日本語を直書きしてる
>>41 の方法は本当はまずい
require 'open-uri'
require 'kconv'
string = "ねこだいすき フリスキー".toutf8
url = URI.escape("
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=#{str}&num=50 ")
file=open(url).toeuc
print file
こんな形でどうぞ
Googleのie=はインプットのエンコーディングを、oe=はアウトプットのエンコーディングを指定するから、
全部EUC-JPな環境でやるならそのように書き換えるとstringとfileのとこでの変換の手間が減って楽
CGIのを使うよりURI.escapeのほうが意味的にいいな。
open-uri を require すれば uri はくっついてくるからな これのためだけに cgi を require するのはわりと無駄と思われ
cgi.rbは副作用があるからなぁ。
そもそもescape処理が微妙に違うんでないかい?
CGI::escapeの正規表現 str.gsub(/[^a-zA-Z0-9_\-.]/n) URI::escapeの正規表現(長いので色々まとめた) UNRESERVED = "a-zA-Z\d-_.!~*'()" RESERVED = ";/?:@&=+$,\\[\\]" UNSAFE = Regexp.new("[^#{PATTERN::UNRESERVED}#{PATTERN::RESERVED}]",false, 'N').freeze str.gsub(UNSAFE)
っていうか、cgi.rbはuri.rb呼んでるんだと思ってた 独自実装なのね
uriより前からあるからね
$KCODE = 'u' require "cgi" require "Net/Hatena/Diary/keywordlink" #cgi = CGI.new #print cgi.header wrd = <<-"EOF" はてなダイアリーキーワード自動リンクAPI ■ 本ドキュメントに関する注意事項 本ドキュメントははてなキーワード(はてなダイアリーのキーワード)におけるAPI実装を解説するものです。主にはてなスタッフがその作成と更新を行っています。 EOF p Net::Hatena::Diary.set_keyword_link(wrd) 上記スクリプトを実行すると意図する結果が返ってくるのですが、 コメント部分を削除し、CGIとして実行すると Internal Server Errorがでます。 原因と対策を教えてください。 当方の環境。 MacOSX Ruby1.8.5 Apache1.3.33
>56 とりあえず手っ取り早い対策として Apacheのエラーログ見れ&晒せ
i 0 u 4 ever
http:// 〜から始まる文字列やmailto:〜で始まる文字列に自動的に
タグ(
http:// 〜なら<a href=""> </a>を)を挟んでくれるようなライブラリってあるんでしょうか?
こういうことってBBSとかで一般的にやってることだと思うんですが、処理に名前付けされてない
(もしくは自分が知らない)ので検索してもどうも見つからないです…。
ご存知の方いたら教えてください。宜しくお願いします。
>>59 URI.extract
URI.regexp
64 :
56 :2007/05/05(土) 18:11:13
[18:09:51] zushitmacの発言: [Sat May 5 18:01:08 2007] [error] [client 127.0.0.1] Premature end of script headers: /Library/WebServer/CGI-Executables/rubytest.cgi /Library/WebServer/CGI-Executables/rubytest.cgi:7:in `require': no such file to load -- Net/Hatena/Diary/keywordlink (LoadError) from /Library/WebServer/CGI-Executables/rubytest.cgi:7 [Sat May 5 18:02:09 2007] [error] [client 127.0.0.1] Premature end of script headers: /Library/WebServer/CGI-Executables/rubytest.cgi [Sat May 5 18:02:09 2007] [error] [client 127.0.0.1] File does not exist: /Library/WebServer/Documents/favicon.ico 二回ほど実行してみました。 ・ヘッダがおかしいよ ・requireの失敗 という意味だと思いますが、 require部分とメソッド実行部分をコメントアウトして、 適当な文字をprintしてみるとprintされているのでヘッダは大丈夫だと思うのですが、どうすれば解決できるのでしょうか?
65 :
56 :2007/05/05(土) 18:13:05
最初の [18:09:51] zushitmacの発言: の部分は無視してください。 書き込みのためにWinマシンにSkypeでメッセージを送ってコピペしたゴミです。
no such file to load -- Net/Hatena/Diary/keywordlink 指定したファイルが見つからないと言っている。 require しようとしているライブラリが入ってるかどうか、入っているならそれはどこか、ライブラリのサーチパスに含まれるかを調べれ。
>>66 同じスクリプトをCGI関連の部分をコメントアウトし、ターミナルで実行した場合はきちんと実行されるので
ライブラリは入っていると思うのですが、Apache側の設定でライブラリのパスを指定する必要があるということでしょうか?
レスthxです。
>>62 ,63
おお、ナイスな感じですね。
irb(main):035:0> pp URI.__send__(:class_variable_get,'@@schemes')
{"LDAP"=>URI::LDAP,
"FTP"=>URI::FTP,
"HTTPS"=>URI::HTTPS,
"MAILTO"=>URI::MailTo,
"HTTP"=>URI::HTTP}
っていう結果だったのでMailtoもいけちゃいそうですね。素晴らしい。
ただ今回はHTMLからURLを抜き出すのではなくて、テキストからURLを抜き出して
そのURLをHTMLのhrefタグで囲うっていうのが目的なのでそこは自分で実装しないといけなさそうですね。
>>67 よーわからんがもし load "Net/Hatena/Diary/keywordlink.rb"
でCGIが動作したなら mod_ruby が悪い
>>68 一番小難しいとこがライブラリでできて
一番カスタマイズしたいとこが自力でできるんだから喜べよ(w
ちなみにやってやれんこともないがこの機能は非常に不評
require 'open-uri'
require 'uri'
require 'kconv'
require 'cgi'
yahoo = '
http://dailynews.yahoo.co.jp/fc/computer/2channel/ '
html = open(yahoo).read.toeuc
cgi=CGI.new('html4')
URI.extract(html,['http']){|uri|
puts cgi.a(uri){"#{uri}へのリンク"}
puts cgi.a({'href'=>uri,'target'=>'_blank'}){"#{uri}へのリンク(別窓で開きます)"}
}
71 :
56 :2007/05/05(土) 22:39:56
あれからいろいろやってみました。 たぶんですが、Ruby自体を2つインストールしているような・・・ ターミナル(zsh)で ruby -e 'puts $LOAD_PATH' したときは /opt/local/lib/ruby/以下を見に行っているのに CGIスクリプトのほうで p system("ruby -e 'puts $LOAD_PATH'") したときは /usr/lib/ruby/ 以下を見に行っているみたい。 そのせいか、Apacheの環境変数をセットし直したり、もともとライブラリパスが通ってたところにライブラリをコピペしても Net/Hatena/Diary/keywordlinkはちゃんといけてるのですが 以下のようなエラーをRubyが吐いてしまう事態になりました。 #<NoMethodError: private method `gsub' called for nil:NilClass> /usr/lib/ruby/1.8/cgi.rb:342:in `escape' /Library/WebServer/CGI-Executables/whatsthisbookproto1.rb:121 /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in `collect' /Library/WebServer/CGI-Executables/whatsthisbookproto1.rb:121 :in `each' /Library/WebServer/CGI-Executables/whatsthisbookproto1.rb:121 :in `collect' /Library/WebServer/CGI-Executables/whatsthisbookproto1.rb:121 ここまでくると、 ・ローカルでの作業をあきらめる ・一切合切再インストール しかないでしょうか?
ああ OSX なんだったか。 /opt/local/lib/ruby は MacPorts だな。 OSX に は最初から ruby が入っているから、そっちを見ているのだろう。 CGI なんだよな? shebang はどうなっている? ちゃんと #!/opt/local/bin/ruby と指定してる?
>>73 textmateが自動的に吐いてくれる
#!/usr/bin/env ruby
から
#!/opt/local/bin/ruby
に変更することで無事に動くようになりました。
わざわざapacheの環境変数いじくり回す必要もなく、はじめからこうしておけばよかったorz
あと懺悔しますが、
>>71 のエラーは単なるエラーだったのですね。
さっき、shebangのチェックのために新しいCGIを書いていてわかりました。
本当にありがとうございました。
スレ汚してしまいすいませんでした。
配列の要素をマージしたい場合って、 array_a + array_b array_a.concat array_b のどちらがいいの? 変わらないかな? これ以外にもなにかお決まりの方法ある?
>>75 + だと新しいオブジェクトが作られる
concatだと作られない
であってる?
マカってアフォだな。
メールフォーム作ろうと思うんですが、参考になるページを教えていただけませんか?
>>75-76 object_id というメソッドがある
同一のオブジェクトであれば同一の数字が割り振られてるはずだから、気になれば使え
で、マニュアル
> self + other
> self と other の内容を繋げた新しい配列を返します。
| 例:
| a = [1, 2]
| b = [8, 9]
| p a + b #=> [1, 2, 8, 9]
| p a #=> [1, 2] (変化なし)
| p b #=> [8, 9] (こちらも変化なし)
> concat(other)
> 配列 other を self の末尾に(破壊的に)連結します。 self を返します。
| 例:
| array = [1, 2]
| a = [3, 4]
| array.concat a
| p array # => [1, 2, 3, 4]
| p a # => [3, 4] # こちらは変わらない
で、実際上は
「array_a の内容だけを変えたい」なら concat しろ
array_a = array_a + array_b は array_a の中身の数値の結果だけは同じだが無駄で冗長でわかりにくい
(どっかこれ以前に array_a を参照してるオブジェクトがあった場合 array_b はそれには足されてないので注意)
「ふたつの配列を合わせた新しいオブジェクト」が欲しいなら + で足せ
array_c = array_a.concat array_b は(array_a と array_b を捨てるとして)結果は同じだがこう書かれると混乱する
p array_a.push(array_b).flatten とかやるのも何か意図を感じて引っかかるからやめとけ
Dir.globってなんで、Dirをnewしないで使えますか? クラスメソッドって奴?
日本語でどうぞ
>>80 おーむねそういう理解で桶かと
マニュアルにもクラスメソッドのとこに書いてあるし
85 :
デフォルトの名無しさん :2007/05/06(日) 11:39:55
オブジェクトを、boolに変換したいのですが、 to_b ってのはないんですよね? 一発メソッドで変換!ってのはできないですか?
オブジェクトをboolに変換するアルゴリズムを まずは自然言語で記述してみてくれ。
!!(x)
>>85 条件 ? falseでもnilでもない時返す値 : falseかnilのとき返す値
90 :
デフォルトの名無しさん :2007/05/06(日) 12:00:23
def Object.to_b; true & self end "hello".to_b NoMethodError: undefined method `to_b' for "hello":String あれ、上手くいかないや
91 :
デフォルトの名無しさん :2007/05/06(日) 12:01:34
>>87 ああ、こんなのあるんですね。
でも、
!!("hello")
だと、
warning: string literal in condition
ってでますね
Ruby で false と nil が違うってなんでなん?
93 :
デフォルトの名無しさん :2007/05/06(日) 12:03:00
>>91 これって、リテラルのときだから、ふつうは、気にしなくていいですね。
ありがとうございました。
でも、
>>90 がエラーるのはなんでだ
>>88 は冗談だとでも思われてるんだろうか・・・。
TrueClass のリファレンスを見て欲しいよ。
つか「オブジェクトを真か偽のどちらかに変換したい」という要求自体が変
96 :
デフォルトの名無しさん :2007/05/06(日) 12:12:13
97 :
デフォルトの名無しさん :2007/05/06(日) 12:13:22
>>95 変換したいわけではなく、ifにつっこんで、どうなるのかを得たいだけなのです
>>90 は静的メソッドにしてるからおかしいんだろ。
class Object; def to_b; true & self; end; end
p "hello".to_b
こうだ。
>>95 オブジェクトが nil か false の時は偽、それ以外のときは真なんだぜ。
スクリプト内で標準エラー出力の出力先をすげ替えるのってどうやりますか? def mystderr(s) end が最終的に呼ばれるようにしてごにょごにょしたいんですが。
この手の人は真はどうでもよくて irb> [false] ? 'T' : 'F' => "T" irb> > '' ? 'T' : 'F' => "T" これを偽にしたいとかいう要求だと予想
>>100 $stderrを書き変えれ
ただ、こういう事したスクリプトは公開せず自分のとこで使うだけにしとけ
>>100 マニュアルの $stderr の部分を参照
104 :
デフォルトの名無しさん :2007/05/06(日) 12:30:02
if(0) は真なのに注意な。
irb> > p if(0) => nil うそつきいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
p "hoge" if(0) hoge
>>106 それは単に p の返り値じゃねーか…
でもなんでここで次行待ちしないで切れちゃうんだろう?
irb は p や puts を見かけたら行末で特別な処理してる?
括弧を付けたからifというメソッドだと誤認したんだろうけど、 このくらいまず予約語として認識してもいいような気がする。
110 :
デフォルトの名無しさん :2007/05/06(日) 13:30:03
privateなクラス定数/クラスメソッドはどのように書けばよいですか?
大人しくconcatします。ども。
privateってどんな動作を期待?
114 :
111 :2007/05/06(日) 14:07:25
>>113 定義されたクラスとそのサブクラスからだけ参照できるのが望みです。
115 :
デフォルトの名無しさん :2007/05/06(日) 14:30:18
class Foo class << self def foo; puts "foo"; end private :foo end end 定数は無理っぽいかなあ
すごく低レベルですみません puts 'あなたの好きな数字を入力してね' number = gets.chomp puts 'あなたの選んだ数字に1を足すと' + number.to_i + 1 をするとtypeeroorがでてしまいますなぜでしょうk?
>>116 puts 'あなたの選んだ数字に1を足すと' , number.to_i + 1
これでどう?
>>116 一番楽なのは
puts 'あなたの選んだ数字に1を足すと' + number.to_i.to_s + 1.to_s
もしくは
puts ['あなたの選んだ数字に1を足すと' ,number.to_i ,1].join
かな
String + Int はIntがデフォルトでStringには型変換してくれないからエラー
俺もまだ初心者だから内部動作まで詳しく知ってるわけじゃないけど
あとちゃんとエラー内容も貼れ & 読め
>116 文字列は数値に対しての + の操作が定義されていないないから。to_sなどを 使って明示的に文字列化してやらないと + できない。 >117 それだと改行が入るのでは? たぶんお手軽なのは、 puts "あなたの選んだ数字に1を足すと#{number.to_i+1}" あたりじゃないかな。
puts 'あなたの好きな数字を入力してね' number = gets.chomp.to_i result = number + 1 puts "あなたの選んだ数字に1を足すと#{result}" これが一番真っ当 エラーが出る理由はみんなのレスのとおり「文字列 + 整数」ができないことによる
121 :
111 :2007/05/06(日) 15:16:28
>>115 ありがとうございます。 定数はメソッドで代用できるのでこれだけでも十分です。
……と思っていたのですが、これはインスタンスメソッドから呼べないですよね。
考えてみれば当然の事なんですが……、つまり要件定義が間違っていたと orz
自分の要求を自分でちゃんと理解できていなかったようです。
求めていたのは、正確にはクラス変数(@@変数)の定数版でした。
申し訳ありませんが、この場合についても、再度ご教示お願いします。
>>121 要求に合うかな…
privateなクラスメソッドは、文字通りprivate_class_methodを使う。
123 :
111 :2007/05/06(日) 15:53:19
あれ? クラス変数が定数になったのと、自/サブクラスからしか呼べない
クラス定数とは、ほとんど同じものになるのかな。
そうすると答えは
>>115 の通り無理?
>>122 ありがとうございます。調べてみます。
今からちょっと出かけるので、お返事は遅くなります。
124 :
デフォルトの名無しさん :2007/05/06(日) 16:52:25
カルト洗脳言語
カルト洗脳と言えばORACLE厨だな あいつらひどすぎ
神託という名前からしてヤバい
127 :
デフォルトの名無しさん :2007/05/06(日) 17:50:01
Delphiを馬鹿にするなよ?
そうだそうだ、あんまり馬鹿にしてると邪鬼眼使いのDelphiユーザに殺されちまうぞ。
定数を返す関数を作れば 一応動作的には private な定数を作る事は出来る。
>>115 class << self って、どういうこと?
class Foo private def foo end def bar end end としても foo と bar は private になるけど、 private :foo とか使ってる人は何か理由はあってそうしてるの?
>>130 クラスメソッドをまとめて定義するときに使う
>>131 後で見るときにスクロールとかしないで一行で分かるからじゃないかな
rubyっておらおらできないの?
Rubyを使って素敵な彼女を取得するコードを教えてください(><
現在のコード位置がprivateか否かを気にしなくて済むので private :foo を使う。
クラスメソッドの定義の書き方をどうしようか、という話に似てるな
全部に public/protected/private を付ければいいって話でもないのだろうか。
>>134 それは難しいですね。
前科者のレッテルなら、大抵のコードで取得できるんですが。
>>134 銀座の宝石店にでも連れて行け
一緒に行ってくれるとは限らないがw
Dir.globで、専用ディレクトリから年月日の数字のファイル名を配列として得てた。 毎日ファイルは増えるんだが、「最新の日時のファイル名」を得るために lastfile=Dir.glob("hogedir/200?????.dat")[-1,1] とかやってた。 …ソートされたような順で取り出されてるとは限らないんだな。 これまでは数字の大きいのが配列の最後になってたんだが、 5月4日からなぜか5月4日のファイル(20070504.dat)がいつも最後に来るようになった。 変なとこに依存するコード書くのやめよう…。
>>140 それじゃ「最新の日時のファイル名」じゃなくてそれだけを含む配列だろう。
> …ソートされたような順で取り出されてるとは限らないんだな。
ファイルシステム依存。
毎回違う順序でもなんら問題ないけど、セクタ内ではソートされてるけどセクタはソートされてないとかかね。
Marshalの信頼性、耐障害性ってどんなもんですか? 掲示板の過去ログファイルに使えないかと検討しているんですが・・・ xmlをパースして、追加データをマージして、整合性をとって・・・は結構大変そうなのでMarshalが使えればと・・・
>>142 正直言って、信頼性や耐障害性はそうとう低い。
Web掲示板のログみたいなものだったら、もっと別の手段を検討することをお勧めする。
「元データ」を別に確保した上で「便利にアクセス可能な加工済みデータ」を保持するのに使うのが最上 元データからガリゴリやると3秒だがPStoreからにょろっと読み込むと0.5秒だとかそういうの 壊れる可能性や壊れたときの悲惨さは改行区切りのテキストファイルより悲惨 書き込み順番キーつきでコンマ区切りに保存して表示前に書き込み順にソートとか そういう方法のほうが処理時間もCPU時間も使うが遥かにマシ
>>120 話は若干ずれるんだけど、
sprintfとかprintfはRubyだとあまり使わないですか?
printf "あなたの選んだ数字に1を足すと%s",result
とか
これくらい単純だと確かにputsに式展開でいいかもとは思うんだけど、長くなったり
出力じゃなくて文字列を整形したい場合とかも多いからよくsprintf使うんだけれど、
遅かったりするのかなぁ、と思いまして
整形する場合は普通に使うが。
「Rubyたのしー」と言ってる人は "〜" と '〜' を平気で使い分けるので sprintf でないとできない、あるいは遠回り大回りであるのなら別にフツーに使うと思われ ただ表示するだけでは printf はまず使わないな sprintf は % で代用する人が多いように見える
ActiveRecordでサブクエリーすることってできないの?
>>149 スレち
今んとこfind_by_sqlで直接書くしかないね
>>142 xmlや独自形式以外にも、yamlやjsonといった手もある
>>142 YAMLを使ってみてはどうだろう。
require 'yaml'
data = { 'key': 'data' } # 任意のデータ
puts data.to_yaml
日本語がバイナリとして認識されるという問題があるが、そもそもmarshalを使うつもりだったんだし問題ないだろう。
rake 0.7.3 を WinXPで試しているのですが、 出力先ディレクトリを指定したくて、以下のようなスクリプトを書いてみたのですが、 rake aborted! となってしまいます。 出力先を変更しないで(ちょうどmap!のところ)をコメントアウトすれば、動作してくれます。 このようなケースではどうするのがセオリーでしょうか? OUTPUT_DIR = "output/" SRCS = FileList["**/*.src"] DSTS = SRCS.ext('dst') DSTS.map! do |e| # OUTPUT_DIR + e # end # task "default" => DSTS rule '.dst' => '.src' do |t| sh "SRC2DST.exe #{t.source} -o#{OUTPUT_DIR}" end
154 :
デフォルトの名無しさん :2007/05/07(月) 23:26:32
ruleでlamdaるのがセオリーじゃなかったけ・・・
155 :
デフォルトの名無しさん :2007/05/07(月) 23:31:13
いや、違うな・・・ 正規表現で、ruleでOUTPUT_DIR含めて指定すればよかったと思う。 で、lambdaで、srcをbasenameして指定する
156 :
デフォルトの名無しさん :2007/05/07(月) 23:34:33
んー。手元のRakefileみたら、別にOUTPUT_DIR含めなくてもいいようになってたな・・・ わかんねーな・・・
157 :
デフォルトの名無しさん :2007/05/07(月) 23:36:18
ああ、わかった。 OUTPUT_DIRとSRCSが対応してないからだ。 やはり、rule の srcをlambdaで、SRCSに関連付ける必要があるはず
>>154-157 ありがとうございます。
lambda使ったことない厨房なんで、lambdaの使い方から調べる必要があるようです。
rule '.dst' => lambda{SRCS} do |t|
とやっただけだとやっぱりだめでした。
とりあえず、終電逃しそうなので帰宅後にlambda調べます。
159 :
デフォルトの名無しさん :2007/05/08(火) 00:39:57
いや、SRCSだと全体じゃないかw '.dst'と、どこの.srcかを関連付けないといけないとダメなはず
160 :
デフォルトの名無しさん :2007/05/08(火) 00:41:50
>>148 print("Hello, World!\n")
って書いたら
puts 'Hello, World!'
って書き直すのがRuby信者
Javaで使えるYAMLクラスはありますか?
あるかないかという問いなら「ある」が答え。
俺は puts format() をよく使う。 inspect も format で返すかな。 俺にはどうも "#{式}" は読みづらい。 単純に変数を埋め込むぐらいならいいが 式を書くなら俺は format("%s",式) するよ。
まあ、表示結果は一緒だし好きなの使えって話なんだが禁句だな
>>168 「フォーマット文字列」が必要ない場合、普通に使うと %s だらけになるのがイヤ。超イヤ。
だいたい %s って何よ。「文字列です」以上の意味ないじゃん。お前の中身は何なのよ。
ケツの式の一覧を一対一で対応させていちいち数えて探せってか。首振って首つるわアホ。
その点 #{〜} 埋め込みならフクザツな式は直前で変数に入れれば解決。
しかも変数名ごと読めば読み下しやすい。完璧。超完璧。
対応とか考えなくていいから、# の方が安全になるわな。
Ruby以前に printf にどれだけ慣れてしまってるかどうかがかなり分かれ目かと思う
#{ } 内が長くなるような場合は、事前に計算しとけばいいな。
173 :
168 :2007/05/08(火) 17:34:36
>169 引数多くなるような format なら、素直に文字列同士繋ぐよw >171 俺はDelphi厨時代 + で繋ぐことしかしてなかった。 '文字列' + IntToStr(式) + '文字列' って感じね。 C言語とかやったこと無いから printf 書式は Ruby が初だよ。 "#{ }" が馴染めないのは…なんでだろ? 自分でもよく分からんが、ゴチャゴチャした感じを受けるんだよ…
#{ } でまずいのは、国際化だな。
175 :
134 :2007/05/08(火) 17:43:14
>>139 ありがとうございます! でもダメでした
mvしようとしたら、permission deniedってエラーが出るんです・・・
>>143 これもエラーでした。Ko1が見つからないそうです
>>173 IntToStr って、# よりゴチャゴチャしてるだろ・・・
俺はエディタが色変えてくれるおかげか、#{ }はそんなにゴチャゴチャ してるようには感じないが、色の変化がなければちょっとキツイかも
179 :
デフォルトの名無しさん :2007/05/08(火) 21:45:26
FOX★公認!!!
俺たちのクリックで日本を一位にしようぜ!!
“30年は日本に手は出せないな”という勝ち方をしたい
http://wwwww.2ch.net/test/read.cgi/news4vip/1178602852/ 1. ポーランド 139,797,680
2. チリ 137,040,439
3. ★日本 86,475,213★
4. イスラエル 80,930,530
5. スロベニア 57,137,042
6. フィンランド 40,857,499
石を投げる戦争から人は進化・進歩を遂げ、剣や槍などの武器をもって戦うようになった
人間はさらに発展し兵器を使う戦争を始めた
そして今、指先一つを武器とした電脳戦争が勃発したのであった・・・
皇国を勝利へと導くには貴様らの参戦が不可欠である
・戦場
http://www.clickclickclick.com/default.asp ・まとめサイト
http://www33.atwiki.jp/clickvip/
コピペ君って馬鹿だな、まで読んだ。
ruby のif文って使いにくくないですか? if ひとつにつき end を付けなきゃいけないから深く掘り過ぎるとend一つか二つ忘れる・・・
Perl の if 文って使いにくくないですか? if ひとつにつき } を付けなきゃいけないから深く掘り過ぎると } 一つか二つ忘れる・・・ そんくらいで使いにくいってあり得ないだろ。 というか、if 書いた時にはとりあえず対の end を書いてから、中身を書くもんだ。
まあ、改行で区切る仕様でもよかったとは思う endはエディタの支援機能で書く endと書いてTabキーを押すとinvalid nestとか文句言われる
そしてインデントで区別する仕様に(ry
いまだに if(){ } って書いて実行時にあれ?って思うことが良くある
稀に when と case を間違えるのは俺だけでいい しかし return << <<EOF <html> <title>やほー</title> <h1>#{title}</h1> </html> EOF とか html <<EOB <table> <tr><td>テーブルだよ</td><tr> </table> EOB とか書いてエラーに悩んでしまう人は俺以外にも居ると信じていいですか
>186 いないとは言わないが敢えて言わせてくれ このうっかりさん ( ゚∀゚)σ)∀`)
<<-EOF って書くようにしてるけど
>>171 Ruby以前に10年Cプログラマをやってたおれがやってきましたよ。
Rubyでprintfとかほとんど使ったことありませんよ。だって#{}の方が便利だもの。
なんでむりなんだろ
>>169 ruby-gettextを入れると % が拡張されていろいろ便利になるよ。
標準にしてもいい気がするくらい。
#とか{}や()って入力めんどくさくない? printf("%d",a )とかのほうが楽で慣れてる。
別に
>>192 ダブルクオートの中にカーソルがあるときに、
Ctrl+"を押すとエディタが#{}と出して括弧の中にカーソルを置いてくれるようにしている。
なので全然面倒じゃない。
キーマクロとか
"マクロ"じゃなかったりして
とゆーか近似的には ・ 「Ctrl+Shift+2」(あるいは単にCtrl+2)のキー動作を常用から外す ・ C-S-2に「#{}の3文字を挿入しカーソル1個戻す」機能を振り分ける ということをするだけで用が足りそうだが #{}が有効な文字列の判別とか定義面倒そうだし、有効かどうかでC-S-2の動作が違うのは混乱しそうだ
3ならわかるがなぜ2なんだ。
どっちもどっちだな " (ダブルクオーテーション) 相当の入力で挿入を開始するのも # (ナンバーサイン、いわゆる半角シャープ) 相当の入力で挿入を開始するのも どっちもそれなりに道理にかなってる気がする
bikeshedな議論は盛り上がるなあ
閑話休題 俺は^2には括弧閉じ機能を割り当ててるな。 {foo("bar #{a■ ↓ {foo("bar #{a■}")} こんな感じ。 ところでRubyのbegin〜endってめちゃくちゃウザいよな。 エディタの支援があるならPython方式のほうがはるかに 優れているというのは一目瞭然だな。
平和を愛して何が悪い(w
P y t h o n方式 左に戻ってこいよ うまい言語仕様ってなかなかないもんだな
begin〜endが嫌ってのはたまに言われるな 俺には理解できないが
漏れも始めは嫌だったけど、慣れたなあ。 むしろ今はPythonみたいに閉まりがないのは嫌。
Pascal/Delphiのbegin-endの羅列よりは全然マシだろ あれはC言語の { } をそのまま begin end に置き換えたみたいな (当然正確には違うんだが)書き方するからなぁ
隔離スレでやれ
moduleのクラス(?)メソッドを追加するときって必ず def self.hogehoge ってやらないといけないんですかね? class << self みたいな文法があればいいなぁ、と…
Pythonのインデント方式は何個のネストを終了したかが分からなくなるから嫌い。
214 :
212 :2007/05/09(水) 19:54:30
すいません、moduleでもclass << selfいけました…o....rz
記号の方が区切りが目に入りやすいんだよな。 だから end は俺も嫌い。
そんな表示フォント依存の話を言語仕様に持ち込まれても困る
フォントの問題じゃないだろー。 英文って似たような文字の羅列でどこも目立たないけど、 記号があると目立つだろ。
おまいら perlでも使っとけ
あれは記号大杉
lllllll|!1111|1111lll!l|1l1l1!l1|1 まあどうでもいいが とりあえず{;]!|):}[(の見分けにくさは異常 いっそ |==> から始まって <==| で終わるとかして欲しい
俺は ! の後には 1 つ空白入れるようにしてる。
ふつーのブロックは begin - end でいいから、 せめて def と class と rescue のブロックの終わりは別な語にして欲しかった end # each end # if return array end # each end # rescue end # def end # class ### ↑ class Hoge ### ------------------------ ### ↓ HogeをUnyaするクラスUnya とかコメント書いてて泣きたくなる いやこのへんは俺が未熟なんだけど
emacsとか使って、ちゃんとインデントしてれば問題ない と思うけどなあ。
どうでもいい話は、 学が無い奴等でも参加できるから 議論が活発になるってのは本当だよな。 「記号があると目立つだろ」、とか「人による」としか言えんことを 水掛け論的に言ってどうなるというのだろう。
↑ こうやって、またどうでもいい議論に引きずり込もうとするんだよな…。
学(がく)がある人(ひと)がどうしてruby初心者(るびーしょしんしゃ)スッドレにいるのか 俺(おれ)には理解(りかい)できない
>>224 デザイン論を根底から否定する暴言ですな。
>>224 は学が有ったとしても空気が読めないvb厨にそっくり
「学が無い奴等」というより 「まともな知能が欠如した奴等」の方が的確だな。
↑ こうやって、またどうでもいい議論に引きずり込もうとするんだよな…。
どうでもいい話でしか参加できないからしょうがない。
ここは議論するスレというより 初心者の質問とそれに対する回答 もしくは質問を肴にした雑談 のスレでなかったのか
超肴中
237 :
デフォルトの名無しさん :2007/05/10(木) 00:06:38
hash[keyword] << word ってなにやってるの? <<て何よ?
>237初心者らっさい hashに配列が登録されててそれにpushしてるんだと思うぞ
>>197 はいよー
(defun ruby-string-expand-expression ()
"Rubyの文字列中にカーソルがあれば#{}を挿入する。リージョンがあればそこを#{}で括る"
(interactive)
(let ((parens (if (eq 'font-lock-string-face (get-char-property (point) 'face))
'("#{" "}")
'("¥"" "¥""))))
(if mark-active
(progn
(if (> (point) (mark))
(exchange-point-and-mark))
(insert (car parens))
(exchange-point-and-mark)
(insert (cadr parens)))
(progn (insert (concat (car parens) (cadr parens)))
(backward-char)))))
21世紀にもなってema糞はないだろう
いやあるよ。便利だもん
21世紀はVimだよな!Vim7さいこおおおおおおおお
お、7 出たのか?
>>237 そんなあなたに irb
irb上で試せばいろいろわかるぞ
irb> h=Hash.new
irb> h['hoge'] << 'test'
NoMethodError: undefined method `<<' for nil:NilClass
from (irb):2
irb> h['hoge'] = 'nya'
=> "nya"
irb> h['hoge'] << 'test'
=> "nyatest"
irb> p h['hoge']
"nyatest"
ということで「ハッシュhashのkeywordの値に適当に<<して更新してる」模様
<<だけでハッシュの中身が追加更新されるのはなんかキモいな
いやとても便利だが
>>243 Vim7はちょうど1年前に出てる
ただいま醸成中
なんかね、どんどんデカくなってな
Vimって前に使おうと思ったことあるけど、マクロで任意の位置の文字列を取得する方法がわからなくて挫折した記憶がある。
間違って入力したらいちいちEsc押してコマンドモードに戻してxとか押さなきゃいけないのが面倒でメイン化挫折してる(全く使わないわけではない) 最近のは挿入モードでもBackSpaceとか平気で効くけどな
vi と vim は別物だぜ。 vi はイマイチ。vim 最高。
両方試して自分はemacsが好きなんだけど、 最近はvim派が多いのかな?
先生! xyzzyはemacs派に含まれますか?
レンタルサーバでRubyスクリプトのCGIを動かしてます メモリ内に大きなデータを保持してる時間をなるべく減らしたいなと思い def メイン html = ネットにあるでかいHTML data = htmlをparseしたハッシュ html = '' htmlを参照しないごっつい処理 htmlを参照しない手間のかかる処理 htmlを参照しないめんどくさい処理 return 何か #終了 end などと「途中で大きなデータの参照先を明示的に空」にしてるんですが ・ データ保持時間短縮という点で一応意味はある ・ 気休めにもならないし読みにくいからやめとけ ・ 「HTMLをgetしてパースして返す」メソッド作っとけばいいじゃん など意見お願いします
>251 htmlの処理とhtmlを参照しない処理の メソッドを分ければ、気にする必要なくなると思うが
メソッド分ければHTML使うメソッド終わった時点でGCが回収にくるよな そりゃ空文字列指定すれば回収までの数瞬の間は軽くなれるとは思うが
>メソッド分ければHTML使うメソッド終わった時点でGCが回収にくるよな そうだっけ?
>254 否。 $n = 1343 def foo s = "." * $n end def print ObjectSpace.each_object{|o| if o.is_a?(String) && o.length == $n puts "found" return end } puts "not found" end print # not found foo print # found
「回収対象になる」が正確かも 実際に収集車が回収しにくるのは回収日
空白文字列代入するのもゴミ袋を交換して ゴミ出して回収待ちってとこだよな
ゴミの袋の数は変わってないけど、 ゴミの大きさはコンパクトになって部屋なりご近所なりを圧迫することがなくなってるはず という主張なんじゃね、最初の話は
def make_str puts "making now..." return 'hoge' end str=make_str p str p str strはmake_strを「指してる」以上、make_strはstrが使われるたびに毎回動くべきで この場合"making now..."は2回表示されるべきだと感じます たすけて
>>259 勝手に「べき」とか思わないように。
str=make_str は、「make_strメソッドを呼び出してその返却値をstrに代入する」という意味なので、その後何回strを参照しようがmake_strはもう呼ばれない。
>>259 1回しか動かないのは、"1回目"の = で str が指すオブジェクトが確定してる(make_str で return されるもの)から
と考えるのはどう。
確かに「参照の矢印のようなもんである」という考えだけで字面を遡ると make_str を再度呼ぶようにも見えなくはない。
str は make_str で、その make_str は上に書いたヤツだから。
>>251 > 「HTMLをgetしてパースして返す」メソッド作っとけばいいじゃん
が正解だと思う
それならわざわざ空白文字代入する必要もないしな
>>262 メモリ占有を考えるなら「空データで上書きする」意味はあるようにも思うけど…どうだろ
まあどっちにしても上書きはパラノイアっぽいな
小さいメソッド内のローカル変数で完結させてGCの回収対象にしておく、というのがふつーの対処法なのかも
264 :
212 :2007/05/10(木) 17:36:46
>>259 str=make_str
と
str=make_str()
は等価だと思うんだが
あら、残ってた…o...rz
空データなら''よりもnilのほうが軽くない?
有為な差はないと思うけど、nilのほうが「変数をクリアしました」という感じがでるので好き。 できればRubyにも undef みたいなのがあるといいんだけど。
p がオブジェクトの中身を参照する命令だとすると p str で strの中身 hogeが表示される、と。 もし str = make_str で strが関数オブジェクトとして扱われると 仮定すると(なんかjavascriptみたい)、p str で表示されるのは make_strという関数オブジェクトの中身が表示されるはず…。 それをさらに飛躍(蛇足?)させて p str で関数を呼び出せるのはとてもイレギュラーな命令のように感じます。 ruby だと p は、基本的にオブジェクトの中身を参照する命令と 考えればおkみたいなかんじですか?とか聞いてみたり。
なんか日本語が変だなっと orz
str = make_str を「strというキーワードでmake_strを"起動"した値を返す」と読めばいい もし右辺が変数なら変数内容を"起動"するわけ なんかめんどくさくなってきたからどうでもいいや 要は参照先が"定まった値を持たない"メソッドであるのが引っかかるんだろ strが参照されるたびに「参照先のメソッドの返り値はhogeです」と動作すると思えると
URL全体をエスケープするんじゃなくて、cgiに渡すパラメータだけエスケープするんだよ。
>>270 str=make_str() # 関数呼び出し making...表示 返り値hoge格納
p str # オブジェクト表示、hoge表示
p str # オブジェクト表示、hoge表示
すみません。もの凄く初歩的なことを難しく考えすぎてた
だけみたいでした。ありがとうございました!
275 :
237 :2007/05/11(金) 00:00:52
>>238 >>244 レスありがとうございますにゃん
おかげで助かりました
動作は自分でもソース書いて確認しました
が、これいったいドキュメントのどこ読んで勉強すりゃいいんでしょ?
演算子の項目みてもそれらしい説明無いし
276 :
デフォルトの名無しさん :2007/05/11(金) 00:15:44
一つ質問があるのですが、 rubyで他の言語のsubstringみたいなのはありますか?
「他の言語のsubstring」ってのが具体的にどういう動作を期待してるのか 今一分からんが 例えばJavaScriptのString#substring()については String#[s...e] が近いかな //JavaScript "abcde".substring(1,3) == "bc" # Ruby "abcde"[1...3] == "bc"
str[first, len] str[first..last] str[first...next] str.slice(上に同じ) str.slice!(上に同じ)
>>275 「標準ライブラリ」内の「組み込みクラス」の項を参照
数値・文字列・配列・ハッシュなどの基本的な振る舞いは、ここを見ればだいたい分かる
>>276 とりあえずStringのメソッドを片っ端から探し回ると吉
280 :
237 :2007/05/11(金) 00:53:24
>>279 ありがとサンクスベロマッチェですにゃん
Kernelもっと理解しとかなきゃダメだな
今日はスレッドの勉強をしようと思う
そうか
すれでどうした
だれが上手いこと言えといった
puts '文字列を入力してください' x = gets.chomp puts '入力された文字列は「' + x + '」です' 文字列を入力してください、と表示させてからコンソール入力をさせたいのですが、 その前にコンソール入力になってしまいます。 これはどのように解決したらよいのでしょうか?
>>286 $stdout.flush を gets の前の行に。
288 :
286 :2007/05/11(金) 15:03:00
「プログラミングRuby」のうさぎ本のほう持ってるんだけど、 改訂版(2分冊のほう)になってどれぐらい良くなったの?
290 :
デフォルトの名無しさん :2007/05/13(日) 08:40:07
>>290 最初のやつ:returnは制御構造なので<<演算子を適用できない。
次のやつ: htmlは多分変数でメソッドではない。このとき、
この式は変数htmlに
html "baka"
と書くのと(文字列の中身を覗いて)等価だ。
ヒアドキュメント「<<EOF」が「次行からEOFまでを返す式」のように機能するということを失念した誤りだな っていうか << と同じ記号使ってなおかつ間に空白があるかないかで動作が違うなんて極悪だ
293 :
デフォルトの名無しさん :2007/05/13(日) 11:08:27
つまり、 html << <<EOB か、 html = <<EOB ならおkっつーことですね。
294 :
デフォルトの名無しさん :2007/05/13(日) 19:36:40
open(file) do |f| while s = f.gets.chomp end end だとエラーが出ます。 in `test': private method `chomp' called for nil:NilClass (NoMethodError) 以下の一行だとうまくいくのに何ででしょう? puts f.gets.chomp ところで、 f.gets.class するとStringなのになぜ?
295 :
デフォルトの名無しさん :2007/05/13(日) 19:37:47
>>294 に関連してなのですが、
Rubyで、ファイルを読み込んで一行ずつ処理する定石って他にはありませんか?
逆引きRubyには、
>>294 のchompなしのが書いてありました。
ファイルを最後まで読み切った以降は、f.getsがnil返すからだろ。
IO.foreachでもつかってろ
ARGV.each だっけ?で大概間にあうな
300 :
デフォルトの名無しさん :2007/05/13(日) 21:11:13
>>296 あ、そっかー!ワカタ
>>297 IO.foreachは短くてよいですね。
IO.foreach("log.txt") do |s|
puts s
end
>>298 IOオブジェクトを取得していた場合は、IO#each_line=IO#each使うということで・・・
open("log.txt") do |file|
file.each do |s|
puts s
end
end
>>299 ?
間に合うも何も動作違うんだから 無目的にコピペして動かんとか文句垂れずに用途に合わせて利用して終了検知しろよ
>>295 IO#eachとかwhile text=io.getsかな。
>>299 ARGF.each
自動的にchompしてくれる奴が欲しいなぁ。
ARGF.each do |line| line.chomp! end でどうよ
リファレンスの Hash.new {|hash, key| ...} のサンプルの 「# ブロックを使うとうまく行く」は h = Hash.new {"foo"} ではだめ? いきなりあんなことされても意味が全然わかりません.
>>303 それがやだ、という話だと思った。そんな我が儘言われてもとは思うけどw
>>304 えーと、どこから説明していいものか。ちょっと複雑になるけど説明してみる。
まずその例は値を与えていないハッシュのキーに初期値を与えたいってことだよね。
んで初期値を整数にしたいときはh = Hash.new(0)でできる。このとき、
h[1]=0とか代入しなくてもh[1]は0になる。ここまではいいね?
では初期値として"baka"(文字列)を与えてみたらどうなるか。
h2 = Hash.new("baka")
p h2[1] # => "baka"
h2[1] << "shine"
p h2[1] #=> "bakashine"
p h2[2] #=> "bakashine" ??? "baka"ではないの?
ということになる。それぞれの初期値は同じインスタンスを指しているためにこういったことが起こる。
これは直感に反する動きなのでそれを解決するためにブロックを渡せるようにした。
h2 = Hash.new{|h, k| h[k] = "baka"} # その都度新しいStringオブジェクトを生成して代入
p h2[1] # => "baka"
h2[1] << "shine"
p h2[1] #=> "bakashine"
p h2[2] #=> "baka"
というわけ。ややこしいけど。
ハッシュへの代入は必須じゃないからね。 ブロックの評価した値が戻り値になる。 たまに複数行のブロック書いて、それを忘れてはまる。
ここ読んでて仕事思い出したわ 逝ってくる
309 :
304 :2007/05/13(日) 23:43:38
>>306 その機能を実現するだけならば, 単に h2 = Hash.new {"baka"} で可能ですよね.
ブロック引数 key, hash を持ち出すならば, 本質的に引数を必要とするような,
もう少し複雑な例を別にリファレンスに提示すべきと思ったのです.
>>309 可能ではないです。コード列の最初の例はかなり直感に反すると思いますがいかがですか?
h[1]に破壊的メソッドを適用したら、なぜかh[2]も変わってしまうんですよ。
# いや、べつに「なぜか」はわかっているんだけども
>>309 あ、ごめんなさい。言っている意味を取り違えていました。
たしかに固定の文字列だけを与えるのであればそれでもいいでしょうが、
せっかくブロックを取るのであればもっと汎用な形の方がいいんじゃないすかね。
この場合ハッシュとキーが渡ってくればなんかいろいろできそうじゃないっすか。
こんな感じとか? nickname = Hash.new{|h, k| h[k] = k} nickname['浜崎伝助'] = 'ハマちゃん' nickname['鈴木一之助'] = 'スーさん' p nickname['浜崎伝助'] p nickname['佐々木和男']
>305 こんなんでどう。 class IO def each_line2() self.each_line {|line| yeild(line.chomp) } end end
h = Hash.new{"baka"} p h[0].object_id p h[0].object_id p h[0].object_id h = Hash.new{|x, k| x[k] = "baka"} p h[0].object_id p h[0].object_id p h[0].object_id
315 :
304 :2007/05/14(月) 01:02:57
>>314 俺は1つ目の動作で無問題と思っていたけれど,
ハッシュのあるべき姿は2つ目の動作ということ? なら仕方ない.
>>312 は思い出にしまっておきます. お返しにこれ.
files = Hash.new {|h,path| h[path] = File.open(path, 'w') }
>302-303 >305 >313 io.read.split($/).each {|line| ... } というのはどうだろう。でかいファイルにはあまり使いたくないが。
>>316 io.readlines.each {|line| ... } に短縮できるよ
そのへんはブロックのなかでなんとかするんだろ
321 :
318 :2007/05/14(月) 23:15:50
関数内でincludeしているソースを見かけたのですが、これって何をしてるんですかね? ただ単に遅延評価(?)でその関数が呼ばれたときにMix-inされる っていうだけなのか、Mix-inされている期間がその関数内だけなのか そもそもなんか気持ち悪いですね。。
>>322 関数外の名前空間を汚さずに、そのincludeされたmoduleのメソッドを使えるじゃん
関数って何で(略 めったに使用されないメソッドでしか使わないものを そのメソッド内でrequireやincludeすることはある 普段の起動時に読まないぶん普段の動作が若干速くなったと思い込んでるが効果のほどはよくわからん
>>323 includeはメソッドローカルじゃねえ
VS.Net 2005 でビルドした ruby 1.8.6 を C++ のプログラムに組み込もうと思ってる んですが、うまくいきません。 どーも Socketを使おうとするとdllとかのビルド環境違いでこういう問題(?)が起こる ようですが、手元の ruby は手元の VS.Net 2005 でビルドしたもので、原因がわから ず……。Net::HTTP などが使えません。 ruby 1.8.6 は VS2005 のコマンドプロンプトから configure.bat, nmake, nmake install でビルドし、C\:Program Files\ruby の bin\ から msvcr80-ruby18.dll と lib\ 以下を 全部 exe ファイルがあるディレクトリに突っ込んであります。 // TEST.cpp : #include "stdafx.h" #include <ruby.h> #pragma comment(lib, "msvcr80-ruby18.lib") int main (int argc, char **argv) { ruby_init (); ruby_init_loadpath(); rb_eval_string("require 'net/http'"); rb_eval_string("Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'"); return 0; }
327 :
デフォルトの名無しさん :2007/05/15(火) 14:11:15
C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\de bug>TEST.exe C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/de bug/lib/ruby/1.8/net/http.rb:560: C:/Documents and Settings/giko/My Documents/V isual Studio 2005/Projects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `initializ e': getaddrinfo: non-recoverable failure in name resolution. (SocketError) from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro jects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `open' from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro jects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `connect' from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro jects/TEST/debug/lib/ruby/1.8/timeout.rb:48:in `timeout' from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro jects/TEST/debug/lib/ruby/1.8/timeout.rb:76:in `timeout' from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro jects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `connect' from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro jects/TEST/debug/lib/ruby/1.8/net/http.rb:553:in `do_start' from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro jects/TEST/debug/lib/ruby/1.8/net/http.rb:542:in `start' from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro jects/TEST/debug/lib/ruby/1.8/net/http.rb:374:in `get_response' from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro jects/TEST/debug/lib/ruby/1.8/net/http.rb:337:in `get_print' from (eval):0
328 :
デフォルトの名無しさん :2007/05/15(火) 14:33:26
ruby-win32って2005でコンパイルできるようになったのか・・・ 俺が試した時は、できなくて、諦めたんだが
329 :
デフォルトの名無しさん :2007/05/15(火) 14:34:18
>>326 さすがに、DLLだけしかおいてないってことはないよね?
330 :
デフォルトの名無しさん :2007/05/15(火) 14:50:38
>>328 1.8.6 で(?)入ったそうです。1.8.5 はビルドできませんでした。
C:\Program Files\ruby\bin>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32_80]
>>329 え? DLLとlib/以下しか置いていませんが……。
何か他に必要なんでしょうか?
あ、あと関係ないかもしれませんが、プロジェクトのプロパティで
C/C++全般の「追加のインクルードディレクトリ」に ruby のソースがある場所:
"C:\Documents and Settings\giko\デスクトップ\ruby-1.8.6\win32";"C:\Documents and Settings\giko\デスクトップ\ruby-1.8.6"
リンカ全般の「追加のライブラリディレクトリ」にインストールしたrubyの場所:
"C:\Program Files\ruby\lib\ruby\1.8\i386-mswin32_80";"C:\Program Files\ruby\lib"
を指定しています。
>>326 普通にそのrubyで
require "net/http"
Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'
というスクリプトを実行したらちゃんと動きますか?
それから、関係あるかどうかわかんないけど、そのTEST.exeのrelease版を作って試したらどうなりますか?
332 :
デフォルトの名無しさん :2007/05/15(火) 16:43:53
libは入っているか・・・ 前に、結局使わなかったんだけど、VC2003でコンパイルしたときに、 /MTとか/ML指定している(つまり、MSVCRTのDLLなしにすると)と、挙動不審になった その時も、net関連が動かなかったような
>>332 今はそれやるとconfigure.batでエラーになると思う。
334 :
326 :2007/05/15(火) 19:53:35
>>331 ruby 単体では、
C:\Program Files\ruby\bin>type test.rb
require 'net/http'
Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'
C:\Program Files\ruby\bin>ruby test.rb
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"
http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd ">
<html xmlns="
http://www.w3.org/1999/xhtml ">
<head>
<title>Oops! The page you were looking for could not be found.</title>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
<style type="text/css">
# snip
のように、普通に動いています。
後、releaseにしてプロジェクトのプロパティを同じにしてビルドしてみたところ、
ruby が SEGV してしまいました。
335 :
326 :2007/05/15(火) 19:57:00
C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\re
lease>TEST.exe
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/re
lease/lib/ruby/1.8/net/http.rb:560: C:/Documents and Settings/giko/My Documents
/Visual Studio 2005/Projects/TEST/release/lib/ruby/1.8/net/http.rb:560:in `initi
alize': getaddrinfo: non-recoverable failure in name resolution. (SocketError)
from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/net/http.rb:560:in `open'
from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/net/http.rb:560:in `connect'
from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/timeout.rb:48:in `timeout'
<snip>
from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/net/http.rb:337:in `get_print'
from (eval):0
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/re
lease/lib/ruby/1.8/net/http.rb:560: [BUG] Segmentation fault
ruby 1.8.6 (2007-03-13) [i386-mswin32_80]
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\re
lease>
ruby のビルドの仕方がおかしいのでしょうか。
>>326 で言ったとおり、
特に変わったことはしていないのですが……。
336 :
デフォルトの名無しさん :2007/05/16(水) 00:33:33
337 :
326 :2007/05/16(水) 01:04:55
>>336 こういうことでしょうか?
#include "stdafx.h"
#include <ruby.h>
#pragma comment(lib, "msvcr80-ruby18.lib")
int main (int argc, char **argv)
{
ruby_init ();
ruby_init_loadpath();
rb_eval_string("require 'test'");
/*
rb_eval_string("require 'net/http'");
rb_eval_string("Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'");
*/
return 0;
}
338 :
326 :2007/05/16(水) 01:06:43
<snip> 2007/05/16 01:00 40,960 TEST.exe 2007/05/16 01:00 315,220 TEST.ilk 2007/05/16 01:00 429,056 TEST.pdb 2007/05/15 08:38 <DIR> lib 2007/05/14 22:06 663,552 msvcr80-ruby18.dll 2007/05/15 19:38 76 test.rb <snip> C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\debug>type t est.rb require 'net/http' Net::HTTP.get_print 'www.ruby-lang.org', '/index.html' C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\debug>TEST.e xe (eval): C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/debu g/lib/ruby/1.8/net/http.rb:560:in `initialize': getaddrinfo: non-recoverable failure in na me resolution. (SocketError) from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST /debug/lib/ruby/1.8/net/http.rb:560:in `open' <snip> from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST /debug/lib/ruby/1.8/net/http.rb:337:in `get_print' from ./test.rb:2 from (eval):0:in `require' from (eval):0
つかエラーメッセージ見る限り C版では名前解決できてないんだよなこれ www.ruby-lang.orgをIPアドレスにしたらどーなるんだろう
>>326 「そのruby」ってのはmsvcr80-ruby18.dll作ったときに一緒にできてるはずの
ruby.exeで、ってことだ。
RubyでDLLは作成出来ますか?
RubyはDLLにコンパイルされてるよ。
出来ない
344 :
326 :2007/05/16(水) 14:34:33
>>340 >>339 221.186.184.68にして試してみましたが、rubyでのエラーメッセージが表示されるよりも前にデバッガに落ちてしまうようです。
release版だとこんな感じです。
C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\release>TEST.exe
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/release/lib/ruby/1.8/net/http.rb:560: [BUG] Segmentation fault
ruby 1.8.6 (2007-03-13) [i386-mswin32_80]
>>326 で書いたとおり、msvcr80-ruby18.dllはProgram Files\ruby\bin\からぱくってきているのです……。
345 :
デフォルトの名無しさん :2007/05/16(水) 17:28:15
> C\:Program Files\ruby の bin\ から msvcr80-ruby18.dll と lib\ 以下を > 全部 exe ファイルがあるディレクトリに突っ込んであります。 見落としていた。 つまり、公式配布のwin32版のDLLってこと?
346 :
326 :2007/05/16(水) 19:25:41
>>345 公式配布(というか、配布されているものはほとんど)vc6でビルドされていますが、
それだと組み込みを行った時に"MSC version unmatch"とVS.NETに怒られるので、
VS.NET 2005 で独自にビルドしたものを使っています。それがProgram Files\ruby
に入っており、そこからコピーしたものを組み込もうとしています。
そんだけバラバラで動くほうが奇跡だな
win32版は、ruby_init以外に NtInitializeを呼ぶ必要がある。
349 :
326 :2007/05/16(水) 21:45:23
>>348 すばらしい!ありがとうございます!
TEST.cpp を
#include "stdafx.h"
#include <ruby.h>
#pragma comment(lib, "msvcr80-ruby18.lib")
int main (int argc, char **argv)
{
ruby_init ();
ruby_init_loadpath();
NtInitialize(&argc, &argv);
rb_eval_string("require 'net/http'");
rb_eval_string("Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'");
return 0;
}
のようにしたところ、問題なく取得できました。
重ねて、ありがとうございました。
>>349 > ruby_init ();
> ruby_init_loadpath();
> NtInitialize(&argc, &argv);
順序逆だろ。
351 :
デフォルトの名無しさん :2007/05/16(水) 22:09:30
352 :
326 :2007/05/16(水) 22:15:06
>>350 orz。不勉強で申し訳ない。適当に入れたら動いてしまったので思わず興奮して
書き込んでしまいました。重ねて、ありがとうございました。
>>351 ありがとー。
えとぉ…毎度初心者ですまないんだが、クラスメソッドってありますやん? オブジェクトを生成せずにメソッドだけ強制的に実行するわけですよね?(誤解してるかもしれないけども) んで、それってさ、つまり初期化されて無いって事は、そのクラスメソッドがいくら長くなろうとも、似たルーティンがあろうとも、そのクラス無いの別メソッドを呼び出しできないって事なのん? こんな感じに書いたんですが… class Hoge def a return 1 end def Hoge.hoge() num = a return num end end obj = Hoge.hoge
class Hoge class << self def a return 1 end def hoge() num = a return num end end end obj = Hoge.hoge
>>353 初期化されてないも何も、クラスメソッドはそのクラスオブジェクトの特異メソッドであって、
インスタンスのメソッドじゃないよ。
つってもわからんか…。
Hoge.hoge()
の例で行くと、Hogeがクラスオブジェクト(Classクラスのインスタンス)なんですよ。
Hogeがオブジェクトなんです。Hogeはどのクラスに属しているかというと、
p Hoge.class #=> Class
ということになります。リファレンスマニュアルを開くとわかると思うけど、
Classというクラスが存在しています。で、HogeはそのClassクラスのインスタンスというわけです。
で、hogeは何かというと、オブジェクトHogeの特異メソッドというわけです。
Hogeというオブジェクトのメソッドだから Hoge.hoge() と呼ぶわけです。
実際にhoge()の中でp self.classと1行加えると「Class」と出力されるでしょう。
ここでメソッドaは何かというと、クラスHogeの(インスタンス)メソッドです。
なのでメソッドaを呼ぶにはHogeオブジェクトが必要になります。
ここで、メソッドaの中で p self.classと1行加えて、
たとえばHoge.new.aとやると「Hoge」と出るはずです。
というわけで、インスタンスメソッドとクラスメソッドは全く異なるクラスに属しているということになります。
なので呼べません。
この場合はむしろ 「なぜ普段メソッド内でaという関数なカタチでメソッドを呼べるのか」 ってとこから理解深めたほうが
ああ!!なるほd・・・・・あぁ? すまん、354のソースもお手数ですが解説いただけないか。。。
Rubyは << にいろいろな意味負わせすぎで困る
Javaだとnewでインスタンスを作らせたくないクラスはコンストラクタを privateにする事でできるのですが、Rubyでinitializeメソッドを private指定にしてもnewできてしまいました。 newからインスタンスを作る事を禁止するスタンダードな方法ってありますか?
>>359 newをprivateにする
class Hoge
class << self
private :new
end
end
というか、インスタンスを作らせたくなくないならクラスにしなきゃいいと思うけど。
>>359 class Hello
def initialize
puts "OK"
end
end
Hello.new #=> OK
class << Hello
private :new
end
Hello.new #=> NoMethodError: private method `new' called for Hello:Class
しかし、
>>363 の続きに
class << Hello
public :new
end
と書けてしまうから、privateにする甲斐もあまりないな。
>>357 >>354 のメソッド定義は、こう書いたのとほぼ同じ
class Hoge
def Hoge.a
return 1
end
def Hoge.hoge()
num = a
return num
end
end
obj = Hoge.hoge
つまりaとhogeは、両方ともクラスメソッド
>>359 ClassじゃなくてModule使うんじゃダメなの?
「インスタンスを作らせたくない」って異常だよな 自動でインスタンス作る機構でも入れてんだろか
別に異常ってことはないだろ。 てかJava知らん奴が無駄に突っかかるなと。
GoF4のデザインパターンまわりにインスタンスを作らせたくない ケースはごろごろありそうだけど。
要するにJavaの言語仕様上の要求から出て来るだけで、Rubyだとほとんど意味 をなさないパターンだな。 一応singleton.rbというのもあるけど。
どちらにせよ359の目的が分からんとなんとも言えん
Windows環境で スクリプト中に ディレクトリ名などを含めたいとき ディレクトリ区切り記号が バックスラッシュなので たとえば path = "c:\\tmp\\" のように \\ふたつ重ねで 書く必要がある あるいは path = "c:/tmp/" のように バックスラッシュの代わりに スラッシュに置き換える必要がある. …でも 私の場合, こういったパス名は ほとんどの場合, Explolerから コピペしてくるので 長いパス名だと \ を 間違えないように \\ とか / に置き換えるのが面倒だし 第一, 見た目にも \だらけで やさしくない. C# みたいに @"c:\tmp" って書けるような 文字列リテラル書式って ないんでしょうか?
372 :
デフォルトの名無しさん :2007/05/17(木) 19:31:00
作らせないってどういう時に使うんですか? シングルトンとか? あとは、Factoryを介してほしいときとかかな?
373 :
デフォルトの名無しさん :2007/05/17(木) 19:32:31
>>371 %q(c:\hoge\mage)
ではダメですかね?
Windowsのような糞OSのための特殊仕様なんてありませんし あ り え ま せ ん
>>373 ちょっとやってみると…
%q(c:\tmp\)
では エラーでした.
%q は すべてのバックスラッシュ記法を無効にするというわけでは
ないみたいですね
>>375 %q(c:¥tmp)
なら問題ないかと
>>376 そうですね.
調べてみると…
シングルクォート or %q 記法では ほとんどのバックスラッシュは そのまま書けるけど
文字列の最後だけは エスケープの必要があるようです.
ちなみに…私がpath名の最後に \ をつけたいのは
見てすぐ ディレクトリ名だと思う …ってのと
後で ファイル名を くっつける時に楽だから…という理由で, わりとよくつけるのでした.
まぁ これくらは 慣れでなんとかやっていけそうです.
以上, ありがとうございました>コメントくれた人々
>文字列の最後だけは エスケープの必要があるようです. じゃなくて、「'」とか「)」とかの文字列閉じるやつを バックスラッシュがエスケープするからだと思われ unterminated string meets end of fileって叱られたし
["a", "b", "a", "c"] から ["a", "b", "c"]を得たいのですけども、 Array#uniq じゃダメですよね。 どうするのが手軽で良いでしょうか。
["a", "b", "a", "c"].uniq.sortでいいんじゃない?
uniqでよい ただ、おそらくは例が悪くて irb> arr = ["c", "b", "a", "a"] => ["c", "b", "a", "a"] irb> arr.uniq => ["c", "b", "a"] これを一発で ["a", "b", "c"] にしたいという話だと推測 適当に sort するしかないな ref = ['北海道', '青森', '秋田', '岩手'] # 順番を記述した配列 arr = ['青森', '岩手', '北海道', '北海道', '秋田'] # 整頓したい配列 puts arr.uniq.sort_by{|a| ref.index(a)} 北海道 青森 秋田 岩手
今ふっと思ったんだけど、puts [1,2,3,4]って 1234 であるべきじゃね? 1 2 3 4 になってる現状っておかしくね? なんで配列の場合だけ配列を生かして印字するん? ハッシュは前者のように印字するのに。
>>382 to_sの結果と違うから、ちょっと困るね。
ハッシュをputsした場合、キーの順序が不定になってうまく動かない気が。。。
.join("\n") より *"\n" を選ぶオレはgolf脳。 もちろん \n は生の改行文字に置き換えます。
puts(*ary)
388 :
デフォルトの名無しさん :2007/05/19(土) 08:41:54
>>386 なるへそ
となると、putsの便利機能とやらは、もはやほとんど不必要なわけか
puts(nil) の特別扱いも要らないよなぁ
"\n"よりも$/のほうが短くね?
一行目しか読めねぇのかよこのデブが!
配列のタプルへの変換は常識
タプタプするとか言うな殺すぞデブ!
んでタプルって何?
マニュアルの Rinda::Tuple には…書いてないな
>>392 >>391 のこと?
\nを生の改行コードにしても3バイトだよね。
$/なら2バイトだよ。
改行コードが\r\nでもうまく動くから$/のほうがいいな。
>\nを生の改行コードにしても3バイトだよね。 >$/なら2バイトだよ \n も $/ どちらも2バイトなような気がする… 生の改行コード、がわからない orz
"改行 " で3バイトってことかな。
その伝だと、"¥n"は " ¥ n " で4バイトだね。
引用符なしで直接 \n って書いたら、"\n"のことだと見なしてくれたら便利だな
お前は puts の話でいったい何を得たんだ(w
最後に改行が付いてる文字列を puts したら 改行 1 個しか出力されない仕様はどうかと思うんだ。
>>403 puts は「適当に改行を補って表示する」メソッドです(chomp が適当に改行取るのと似たような感じ)
常に改行を補いたい場合は print str + "\n" と明示的に書いてください
というのはどうだろう
ファイルにputsしたら駄目だよな putsは入力と出力が必ずしも一致しない putsは再現度の重要度の低い画面表示向け
Ruby2.0ではputs a, b, cで改行無しにくっつけて表示してもらいたい
408 :
デフォルトの名無しさん :2007/05/19(土) 18:38:18
>>403 実際にやってみたけど普通に改行2つでるよ?
何か勘違いしてるのかなぁ。
str = "hoge\n"
puts str
----
409 :
デフォルトの名無しさん :2007/05/19(土) 18:40:27
試験の要件を満たすプログラムを作成できるようになるための勉強ってやっぱ必要だよな print "---------------------\n" str = "改行なし" puts str print "---------------------\n" str = "改行あり\n" puts str print "---------------------\n"
411 :
デフォルトの名無しさん :2007/05/19(土) 20:15:47
>>403 げ、本当だw
> ruby -e 'puts "str"'
str
> ruby -e 'puts "str\n"'
str
>
これも「どんな文末でも必ず改行つきで表示する」ならそれはそれでいいんだけどな $ ruby -e 'puts "str"' | cat -n 1 str $ ruby -e 'puts "str\n"' | cat -n 1 str $ ruby -e 'puts "str\n\n"' | cat -n 1 str 2 $ ruby -e 'puts "str\n\n\n"' | cat -n 1 str 2 3 機械的に1回chompしてるだけじゃねーか(w
rubyで配列に対して同じものが何回出たか一言で数える方法ってありますか? uniq -c みたいな
414 :
デフォルトの名無しさん :2007/05/19(土) 21:11:04
a=[1,1,2,2,3]; a.size - a.uniq.size こんな感じ?
arr=[1,2,2,3,3,3,4,4,4,4] arr.uniq.each do |e| same_elements = arr.find_all{|e2| e == e2} puts "#{e}は#{same_elements.size}回" end ------------- 1は1回 2は2回 3は3回 4は4回 こんなん?
a.inject(Hash.new(0)) { |hash, e| hash[e] += 1; h} なんかでじゃぶを感じる。
× h ○ hash
h=Hash.new(0);a.each{|e|h[e]+=1};p h
てか
>>416 のinjectをバラしてeachにしたのが
>>418 のような気も…
ハッシュ作って登録しながらカウントというのはよくある手法だな
>>415 みたいに素直に毎回サーチすると、対象の配列がデカいときに困ったことになる
…はずだ
>>415 と同じようなfind_allの方法しか思いつかなかった俺は修行不足のようだ
422 :
413 :2007/05/19(土) 22:53:19 BE:674495093-2BP(0)
ありがとうございます cat foo.txt | sort |uniq -c みたいな感じです。 a.uniqがあるので何か一言で書く方法があるのかなと思いましたが プログラム組まないと駄目ですよね。
423 :
デフォルトの名無しさん :2007/05/21(月) 10:06:59
scrapiを使おうとしました。
gem install scrapiでインストールして、
#!ruby -Ks
SRC_URL = "
http://d.hatena.ne.jp/ "
require 'rubygems'
require 'scrapi'
require 'open-uri'
require 'pp'
links = Scraper.define do
process "a[href]", "urls[]"=>"@href"
result :urls
end.scrape(URI.parse(SRC_URL)).sort.uniq
pp links
以上のソースを実行したところ、
---------------------------
ruby.exe - 正しくないイメージ
---------------------------
アプリケーションまたは DLL (Rubyを入れたディレクトリ)ruby\gems\1.8\gems\scrapi-1.2.0\lib\tidy\libtidy.so は
正しい Windows イメージではありません。これをインストール ディスクのファイルと照合してください。
---------------------------
OK
---------------------------
というダイアログが出てしまいます。
実行結果は、きちんとでているようです。
424 :
423 :2007/05/21(月) 10:09:45
RUBYOPT = -rubygems は、環境変数で指定してあります。 このダイアログがいちいち出てしまうのですが、出ないようにすることはできないでしょうか? なお、cygwinのbash上から実行した場合は、何故かダイアログがでません・・・。
425 :
423 :2007/05/21(月) 10:16:20
自己解決っぽいです。
検索してみると、どうも、libtidy.soがlinux用らしくて、
3 日坊主日記 - scrapi - ScrAPI toolkit for Ruby
http://moriq.tdiary.net/20061011.html によると、win32用のdllが先に読まれないようなので、
ruby\lib\ruby\gems\1.8\gems\scrapi-1.2.0\lib\tidy\libtidy.so
を
libtidy.so.0あたりにリネームしてやると、
libtidy.dllが読まれて、ダイアログが出なくなりました。
腐ったgemだな。 > scrapi 本来入ってるはずでないlibtidyまで適当にぶちこんでるのか。
そうなのか? Cygwinでエラーにならないのはなんで?
cygwin用のtidyが入ってんじゃない?
すみません。 正規表現Regexpでヒットした複数行をtxtファイルに書き込んで保存したいのですが、 良い方法ありませんか? $stdout = File.open("xxxx.txt", "w") というのでやってみたところ、 最初の一行と途中のやつが文字化けで現れるだけなんですが。。。 FAQにあったらごめんなさい。
>>429 a1. 正規表現で複数行マッチさせ変数に保存
a2. 複数行マッチした結果の変数の内容を画面に表示させ確認する
b1. 複数行の文章を手入力し変数に入れておく
b2. 複数行の文章を適当なファイルに保存、エディタなどで確認する
上記aとbを組み合わせ、
「正規表現で複数行マッチしたものを変数に入れその変数をファイルに書き出す」
ということをする
まずは一つ一つ成功させて積み重ねれ
ありがとうございます 入門書読みながら格闘してきます
あるmoduleのメソッドを別のモジュールでも使いたいと思い module A def hoge puts "hoge"; end end module B include A end としたのですが、includeはクラスにのみ作用するようで、B.hogeとしても NoMethodErrorとなってしまいました。 この辺りはRubyのメタプログラミングを理解する上でとても重要だと思うのですが、 どうもその辺りが理解がまったくできていないようです。 知る限りではmodule_evalなどがあるのですが、それも上手く行きませんでした。。 この場合はどのように処理すればよいのでしょうか?
includeはたぶん普通に行えています。 B.hogeのようなカタチで使用するには、Bの定義内で module_function :hogeする必要があります。
そもそもそれじゃ A.hoge 自体できないだろうが。
>432 そもそも、そのコードじゃA.hogeも呼べなくね? まぁB.hogeしたいなら、単にextendすればいいんじゃね。
>>432 メタプログラミングを理解する前にやっとくべきことがいろいろとありそうだな…。
module A def hoge; puts "hoge"; end end module B extend A end B.hoge
>>434-436 Aの方にclass << selfを入れ忘れ... orz
hogeメソッドはAのクラスメソッドのつもりでした。
>>437 ありがとうございます。できました!
Bの特異クラス?に対してincludeするって事なんでしょうか。
継承って言うより注入って感じだなぁ。。。
>>433 ありがとうございます。
includeだとインスタンスメソッドになってるから
module_functionでクラスメソッドに変えるって事なんでしょうか。
今回は
>>437 で行きたいと思います。
CGIでCookieを使おうと思ってマニュアルを頑張って読む。
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=cgi > require "cgi"
> cgi = CGI.new
> for name, cookie in cgi.cookies
> cookie.expires = Time.now + 30
> end
> cgi.out("cookie" => cgi.cookies){"string"}
…。わかりにくいです先生。
require 'cgi' cgi = CGI.new now = Time.now mycookie = cgi.cookies['accesslog'] # クライアントから受け取ったクッキー unless mycookie.empty? mycookie.value.push(now.to_s) # 既存のクッキーがあるなら時刻を追加 else # クッキーが空の場合新規作成 mycookie = CGI::Cookie::new({ 'name' => 'accesslog', 'value' => [now.to_s], # 必ず文字列入り配列 'domain' => cgi.server_name, 'path' => cgi.script_name }) end mycookie.expires = now + 60 cgi.out({'cookie' => mycookie}){"#{mycookie.join('<br>')}"} わかりやすいサンプルって難しいな
Cookieの分かりにくさはRubyのせいじゃないからなぁ
1. ブラウザが'accesslog'という名?のクッキーを要求して来てます 2. 机にクッキー置いてあった => 時刻も付けとく 机の上にクッキーなかったり => 新しく袋から出して、時刻も付けとく 3. 賞味期限を60日に設定 expire 4. とっとと、どうぞ召し上がっちゃってください 1. のとこの'accesslog' の辺りが よくわからないぽ …orz 'accesslog'いうのはキャッシュに保存されてるファイル名か なにかなのかな?
Moduleのインスタンスは、作成した時点ではnameが""で 定数に代入するとその定数名がnameに設定されますが これと同じことを自作クラスのインスタンスでも実現出来るでしょうか?
>>442 これはコメントがよくない
# クライアントから送りつけられた全クッキーの中からaccesslog名義のデータを取り出す
mycookie = cgi.cookies['accesslog']
:
:
:
# 変更したクッキーをクライアントに返し、HTMLでaccesslogの値を<br>で区切って表示する
cgi.out({'cookie' => mycookie}){"#{mycookie.join('<br>')}"}
これならわかりやすい…かも
サーバー側は送ってもらうクッキーの名前を選べない
クライアントからはdomainとpathが一致するものを全て一気に送ってくる
(だから、変なのを濫造すると接続時に100項目くらいどばっと送られてくる羽目に)
RUNIT はどうして RUnit じゃないんでしょう? RUNIT::TestCase とか書いてると、ちょっと気持ち悪いです。
test/unitのほうを使うべし。 rubyunit(runitはAPI互換性のために残っているだけで、実装の 大半はtest/unitを使ってる。 だったと思うぞ。
最近だとRSpecも面白いかもん
rubyzipを使って、c:\hoge以下の「サブフォルダを含む拡張子が付いたもの」 をアーカイブ圧縮しようとしています。 require 'zip/zip' Dir.chdir(c:\\hoge) inner_files = Dir.glob("**/*.*") Zip::ZipFile.open(zip_name, Zip::ZipFile::CREATE) {|zf| inner_files.each do |i| zf.add(NKF::nkf("-s",i), i) end } 上記のコードだと、「c:\hoge\foo\test.html」や「c:\hoge\foo\test2.gif」など同じ ディレクトリがある場合は圧縮されるのですが、ディレクトリ構成が違うものが 含むとエラーになったり、同じフォルダ内でもtest.swfなど、swfがあるとエラー になり、原因も分からずで困っています。 解決策はありますでしょうか?
日本語でおk > 「サブフォルダを含む拡張子が付いたもの」 フォルダ名に拡張子が付いてる、って話? あとエラーの内容もkwsk > Dir.chdir(c:\\hoge) ここで parse error になると思うけど、実際に動かしてるコードと合ってる?
451 :
449 :2007/05/26(土) 05:31:30
>>450 すいません、詳しく書きますと、vrubyにてドロップされたフォルダを、そのフォルダ構成ごとzip圧縮したいということです。
以下、その部分のロジックのコードです。
def self_dropfiles(files)
d_file = files.to_s #ドロップされたフォルダパス
Dir.chdir(d_file) #ドロップされたフォルダをカレントディレクトリにする
inner_files = Dir.glob("**/*.*") #カレントディレクトリ内の拡張子が付くファイルを配列にする
Zip::ZipFile.open(zip_name, Zip::ZipFile::CREATE) {|zf|
inner_files.each do |i|
zf.add(NKF::nkf("-s",i), i)
end
}
end
RDEにて下記のエラーが出る。
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
※但し、階層が1つだけで「html」や「txt」などのtxt系ファイルだけの場合は圧縮が成功します。
hoge →これはOK
├hoge.txt
└hoge.html
hoge →これは×
├hoge.txt
└hoge.swf
hoge →これは×
├hoge.txt
├hoge.html
└sub_dir(フォルダ)
└hoge.txt
Dir.glob("**/*.*")
最近Rubyを勉強しはじめたものなのですが質問があります。 calcを用いて計算を行うという練習を行っているのですが def calc(test) calc(test[1]) + calc(test[2]) として、calc([:plus,5,10])を実行した際に15が出力されるのは把握しております。 ここで calc([:plus,5,10,30])という風に数を増やしていった場合 calc(test[1]) + calc(test[2])の場所をどのように変更すれば一番効率よく計算が行われるでしょうか? whileを用いて繰り返そうと思っているのですがどうにも上手くいきません。 よろしくお願い致します。
>>453 メソッドの設計にまず問題があると思うが
とりあえずそれは置いておいて
その場合なら
result = 0
test.shift
test.each do |operand|
result += operand
end
return result
が常道だと思われる
>>454 ありがとうございます。
最近初めたばかりなので
>>454 の意味を把握しきれていません;;
def calc(test)
if test.respond_to? :to_int
test
else
p calc(test[1]) + calc(test[2])
end
end
calc([:plus,5,10,30]){
}
こういった形の構成なのですが、4行目に
p calc(test[1]) + calc(test[2])にwhileを足し
while test[y] != EOF
calc( x + test[y])
y += 1
end
p x
のようには出来ないのでしょうか??
質問ばかりで申し訳ございません。
この質問者ならコレで答えにたどり着くだろう。 つ test.size
>>456 ありがとうございます。
while test[y] <= test.size
でやってみます。
>>456 ナイスエスパー
>>457 その練習(課題?)が終わったら、もっと簡潔に書けないかどうか
チャレンジしてみると吉
できました!
until使ってやってみました。
ご教授下さった皆様方ありがとうございました。
>>458 各メソッド等について把握しておりませんので
頑張って勉強してみたいと思います。
ありがとうございました。
test[y]じゃなくてyと比較しなくていいのか?
result=0;test[1..-1].each{|item| result += item}とか test[1..-1].inject(0) {|result, item| result + item }とか
いるよな無理に1行で書くアホ
inject便利
コマンドラインで実行するときあるからなー
文区切りの ; が入ってると「無理してんなー」という気はする
以下のコードを Apache の CGI として実行するとエラーに…なぜでしょう? alias :puts_ :puts def puts s puts_ s end Windows 環境でも日本語が化けないよう、 条件付きで puts の中身を替えたりしようと思っていたのですが、 その過程で↑に気付きました。 puts を変えたいのはローカルでコンソールから実行している時なので 知らなくてもいいっていえば、そうなんですが気になってしまって。
>>446 , 447
遅レスすみません。
「Rubyを256倍使うための本 極道編」を読んでたので、
情報が古かったんですね。test/unit 勉強してみます。
次の質問が見えるようだ
>>466 「エラーになる」禁止
どんなエラーかきちんと書く
十中八九 malformed header from script. Bad header だろうけどな
CGIというかHTTPの勉強しろ
CGIではHTTPヘッダ群を最初に出力しないとWebサーバがエラー出すぞ
CGIのエラーは基本的にコンソールから直接実行した結果とapacheのエラーログが必須
470 :
466 :2007/05/27(日) 19:58:00
曖昧な表現をしてしまい失礼しました。 問題は Apache を再起動したら発生しなくなりました。
>>451 >>468 言うとおりエラーの内容を書けよ。
と言いつつ、やってみた
zip.rb:1087: [BUG] Segmentation fault
これってrubyの配列系バグじゃね?
ご愁傷様
alias と method_alias はどう使い分ければいいか分からん。。。 大抵は method_alias 使っとけ、でおけ?
>>471 配列の時点でいまさらそんな変なバグがあってたまるか(w
inner_files の中身を表示してみれば見当つくかも
どうせ Dir.glob で変なの渡してるんだろう
このスレ見てると死にたくなるよ
>473 >配列の時点でいまさらそんな変なバグがあってたまるか(w いやいや、コミットするたびにバグるのがRuby流。
とりあえずバージョンも書かないエラー報告は放置。
BUGと出るのはRubyのバグなので報告よろ、 とmatzが言ってた記憶があるお。
478 :
デフォルトの名無しさん :2007/05/28(月) 14:03:17
レスのアンカーのやりかたを教えて
インナークラスで外側のクラスのインスタンスメソッドを呼ぶ方法はありますか? class A def foo; puts "foo"; end class B def bar ???.foo #<- Aのインスタンスのfooを呼びたい end end end イニシャライザでAのインスタンスを渡すなり、 BのインスタンスにAのインスタンスを明示的に教えないと無理?
> イニシャライザでAのインスタンスを渡すなり、 > BのインスタンスにAのインスタンスを明示的に教えないと無理? A::BのインスタンスとAのインスタンスにはなんの関係もないから、 そうしないと無理。
481 :
479 :2007/05/28(月) 15:51:32
482 :
デフォルトの名無しさん :2007/05/28(月) 19:45:13
Babel... it's not the God's anger, but human beings' foolness, even in programming languages.
そしてプログラミング印欧祖語を再構築する漢達のドラマが始まる
484 :
デフォルトの名無しさん :2007/05/29(火) 03:17:46
すみません、rubyが全然わからないんですが、linuxでのmmapのインストール過程でよくわからないエラーが出たので質問させていただきます。 extconf.rbを実行してMakefileが出来たようなんですが、makeを実行しようとすると以下のエラーが出ます。 mmap.c:In function ‘mm_sub_bang_int’: mmap.c:1116: error: too few arguments to function ‘rb_reg_regsub’ mmap.c:In function ‘mm_gsub_bang_int’: mmap.c:1214: error: too few arguments to function ‘rb_reg_regsub’ make: *** [mmap.o] エラー 1 これはを怒られているのでしょうか?教えていただきたいです。
Linux板逝けば?
>484 ruby-mmap の話? Rubyのバージョンは? 1.9系では rb_reg_regsub への引数の与え方が変わったようなので(鬼車の影響?)、 その場合はそのようなエラーになる。
しかし1.9を使ってる奴がこんなところで質問するはずもない
わからんぞ。人気のUbuntuなんかじゃruby1.9が一発で入るし。
489 :
デフォルトの名無しさん :2007/05/29(火) 16:52:43
>485 すみません。僕もlinux板かプログラミング板かのどちらかで悩んだんですが、どちらかというとプログラミング寄りの問題だと思ったので。。 >486 >487 >488 488さんのおっしゃっている通り、ディストリビューションはUbuntu7.04です。 ruby-mmapはlinux上で英辞郎を利用するための「rdic」というソフトをインストールする過程で必要だっただけで、rubyに関しては全くのド素人です。 Ubuntuでは、デフォルトでruby1.8が入っていたのですが、ruby-mmapのインストールをする過程のextconf.rbの時点でmkmf.rbが見つからないと言われたので自分なりに色々と調べてみました。 その結果、mkmf.rbはruby1.9-devの中に含まれていると知ったため、ruby1.8をアンインストールしてruby1.9とruby1.9-devをインストールすることでMakefileまではできたと言う感じです。 その後のmakeで>484のようなエラーが出て悩んでいました。>486さんのおっしゃっている通りなら、やはりruby1.8で解決していく方法を調べるしかないのでしょうか?
mkmfなんて大昔からあるだろう
Ubuntuは全然知らんが、たぶんruby-1.8-devつーのがあって、それにmkmf.rbが含まれてるんジャマイカ? ruby 1.9は開発中で実験しまくりなので、ruby自体の開発に興味があるのでなければ触る必要はない。
492 :
デフォルトの名無しさん :2007/05/29(火) 19:39:34
>490 >491 ruby-1.8-devを探し直してみたら普通に見つかりました!! 自分もruby1.9を入れる前にruby1.8-devがあるかどうか確認して見つからなかったはずだったんですが、自分の打ったコマンドの履歴を見直してみたら見事に打ち間違いをしていました。。ものすごい初歩的なミスでしたスミマセン。 ruby1.8とruby1.8-devをインストールして改めてruby-mmapとrdicのインストールに挑戦してみたら拍子抜けするほどすんなり成功しました。嬉しいです♪ こんな初心者にアドバイスをしてくださった皆様、本当にありがとうございました!!
procの挙動がマニュアルと違うのですが。
"ruby 1.7 feature" というのは1.8には含まれないのですか?
http://www.ruby-lang.org/ja/man/?cmd=view;name=Proc#yield $ ruby -e 'pr = Proc.new{|a,b,c| p [a,b,c]}; pr.call 1'
[1, nil, nil]
$ ruby -e 'pr = Proc.new{|a,b,c| p [a,b,c]}; pr.yield 1'
-e:1: undefined method `yield' for #<Proc:0x0806e5e8@-e:1> (NoMethodError)
$ ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-freebsd6]
494 :
デフォルトの名無しさん :2007/05/29(火) 21:10:16
以前は世話になりもうした。ほんと助かった。
ところで、クラスメソッドがそのクラスそのものをオブジェクトとした場合の特異メソッドというのでだいたい理解したのだが、
ふと気になって考えて見ると、
class Hoge
def Hoge.hoge()
end
end
でも、
class Hoge
end
def Hoge.hoge()
end
でも問題ない気がする。
実際試したところ動いちゃうが、これはRubyの柔軟性の一つという捕らえ方でいいのか、
それとも、後者は非標準の書き方であるという捕らえ方のほうがマトモなのかが少し気になる。
ついでに、このクラスメソッド、一部のルーティンを切り出して、クラスメソッド内から関数として呼び出したい場合
(かつmainで定義するのはさすがによろしくないと思うので)、同様にクラスメソッドでの実装になると思われるのだが、
これをプライベートにしたい場合は、ふつーに
>>361 みたいな方法でいいのかすら。
前スレでもたしか出たけど private_class_method
Ruby/PythonならぬRuby/Perlみたいなライブラリがあったら教えて下さい PerlのライブラリをRubyから使いたいです…
適当にコードを書いて遊んでいるところなのですが、挙動がよく分かりません。 以下のコードで何が起きているのか、誰か教えてください。 メソッドb(k)はkをkeyとしてHashの値を返しますが、みつからないときは デフォルト値として C#a の結果を返す、という処理のつもりです。
498 :
497 :2007/05/30(水) 00:23:47
irb(main):001:0> class C0 irb(main):002:1> def a(*args) p "C0#a", args end irb(main):003:1> end => nil irb(main):004:0> class C1 < C0 irb(main):005:1> def a() @h = Hash.new { super } end irb(main):006:1> def b(k) @h[k] end irb(main):007:1> end => nil irb(main):008:0> class C2 < C0 irb(main):009:1> h = nil irb(main):010:1> define_method(:a) { h = Hash.new { super } } irb(main):011:1> define_method(:b) { |k| h[k] } irb(main):012:1> end => #<Proc:0x08117d28@(irb):11> irb(main):013:0> c2 = C2.new => #<C2:0x81156e0> irb(main):014:0> c2.a => {} irb(main):015:0> c2.b 10 "C0#a" [{}, 8032] => nil irb(main):016:0> c1 = C1.new => #<C1:0x810f81c> irb(main):017:0> c1.a => {} irb(main):018:0> c1.b 10 (irb):5: [BUG] Segmentation fault ruby 1.8.6 (2007-03-13) [i386-freebsd6] IOT trap
500 :
497 :2007/05/30(水) 00:47:10
irb(main):004:0> class C1 < C0 irb(main):005:1> def a(x,y) @h = Hash.new { super } end こうすると irb(main):017:0> c1.a 2, 4 => {} irb(main):018:0> c1.b 10 "C0#a" [2, 4] => nil こうなるので、superを呼ぶときの引数の問題なのか。 しかしこちらは irb(main):008:0> class C2 < C0 irb(main):010:1> define_method(:a) { |x,y| h = Hash.new { super } } ... irb(main):014:0> c2.a 2, 4 => {} irb(main):015:0> c2.b 10 NoMethodError: undefined method `[]' for nil:NilClass from (irb):11:in `b' from (irb):15 from :0 こうなってしまう。 superに引数を明示すれば問題なく動くのだけど、 何でこうなってしまうのだろう。 やはりバグかな?
% ruby -v ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-freebsd6] >bt #11 0x2819aa24 in sigaction () from /lib/libpthread.so.2 #12 0x280aacfa in rb_call0 (klass=135605680, recv=135353200, id=16065, oid=16065, argc=2, argv=0x8, body=0x8152f40, flags=0) at eval.c:5953 #13 0x280ab89a in rb_call (klass=135605680, recv=135353200, mid=16065, argc=2, argv=0x8, scope=3, self=6) at eval.c:6062 #14 0x280abcee in rb_call_super (argc=2, argv=0x8) at eval.c:6230 #15 0x280a51ff in rb_eval (self=135353200, n=0x8133370) at eval.c:3509 #16 0x280a888b in rb_yield_0 (val=135313220, self=135353200, klass=0, flags=0, avalue=2) at eval.c:4991 略 argv=0x8ってことで、ぬるぽだな〜。
502 :
494 :2007/05/30(水) 03:15:21
あかん…なぜ上手くうごかないんだ・・・ class Hoge def Hoge.bar print "test" end private_class_method :bar def Hoge.foo Hoge.bar return end end obj = Hoge.foo
503 :
494 :2007/05/30(水) 03:17:46
うあ、書きかけで送信しちまった・・・ 連投すまそ… んと、つまり、Hoge.fooのサブルーチンを、Hoge.barに書き出したくて、 かつ、外部に公開するレシーバーは、fooのみにしたいんだが・・・
504 :
449 :2007/05/30(水) 03:23:18
先日は自分の環境も書かずに失礼しました。
Microsoft Windows XP [Version 5.1.2600]
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] にて下記のコードでエラーが出ます。
def self_dropfiles(files)
d_file = files.to_s #ドロップされたフォルダパス
Dir.chdir(d_file) #ドロップされたフォルダをカレントディレクトリにする
inner_files = Dir.glob("**/*") #カレントディレクトリ内のディレクトリ及びファイルを配列にする
zip_name = d_file + ".zip"
Zip::ZipFile.open(zip_name, Zip::ZipFile::CREATE) {|zf|
inner_files.each do |i|
zf.add(NKF::nkf("-s",i), i)
end
}
end
C:/ruby/lib/ruby/1.8/zip/zip.rb:1087: [BUG] Segmentation fault
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
>>452 どこか変ですか?(因みにDir.glob("**/*")でも同じエラーでした。)
>>471-477 色々すいません、inner_filesにはドロップしたフォルダの中が相対パスで配列で帰ってきてました。
全く動かないというわけではなく、
>>449 のように場合によっては成功するのですが…
尚、1階層のみでも拡張子がxhtmlになるとダメでしたので、txt系ファイルならOKではありませんでした。
Index: eval.c =================================================================== --- eval.c(revision 12402) +++ eval.c(working copy) @@ -3505,4 +3505,8 @@ rb_eval(self, n) argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr; } +else if (!ruby_scope->local_vars) { + argc = 0; + argv = 0; +} else { argv = ruby_scope->local_vars + 2;
>>504 > ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] にて下記のコードでエラーが出ます。
1.8.6でも再現する?
507 :
497 :2007/05/30(水) 10:21:21
>>501 ,505
この書き込みは自分の件についてですか?
スコープとローカル変数あたりを弄っているので多分そうだと思うけど。
修正してコンパイルする技量はないので、本家に取り込まれるのを待ちます。
ありがとうございました。
>>502 プライベートメソッドはレシーバを省略した形でしか呼べない。
def Hoge.foo
bar
end
これでどうかな。
>>507 > スコープとローカル変数あたりを弄っているので多分そうだと思うけど。
> 修正してコンパイルする技量はないので、本家に取り込まれるのを待ちます。
今朝コミットされてるので、1.8.7や1.8.6,1.8.5の次期パッチリリースでは直っ
てるはず。
* eval.c (rb_eval): get rid of SEGV at ZSUPER in a block
&bsp; [ruby-dev:30836]
> ありがとうございました。
報告乙。
初心者スレで聞くべきかどうか迷ったのですが
Rubyist MagazineのHotlinks、以下の記事↓
ttp://jp.rubyist.net/magazine/?0017-Hotlinks#l15 で「tDiaryのプラグイン設計はよくない」という発言があります。
ソースコードやドキュメントを読んで考えているのですが
どういう点で悪いのかがよく分かりません。
ささだ氏・あおき氏の個人的な見解と考えたほうがいいのでしょうか?
それとも客観的に見て、問題の多い設計なのでしょうか?
(私もプラグイン設計を考えているので気になりました)
510 :
494 :2007/05/31(木) 10:09:47
お、できた、本当にありがとう。 でもなぜこんな仕様に?
>>509 「読み込んでeval()」は明らかにどう考えてもイクナイ。
ファイル構造だけ分離可能でも、名前空間すら分離できてないのは
「えせ」プラグインです(断言)。
それは考え方次第。evalつかう連中は、ぶつかれば直せばいいとう考え方。 ぶつかる可能性はゼロではないが、極めて低いから、それよりは便利さをとるという態度。 そして、そんな態度でもうまくいくやつはうまくいく。うまくいかないやつはeval使わなくてもうまくいかない。
>>510 何故って言うかRubyにおけるprivateは
「レシーバを書いたら呼べない」であって
Javaなんかのprivateとは全然違う意味
515 :
449 :2007/06/01(金) 01:04:54
>>506 1.8.6にしたら無事できました。
ただ、exerbでexeにすると以前と同じ条件下でVC++のエラーが出てしまいました。
(makeファイルを作る際のテストではエラー出ず。)
exerbでは使えないライブラリがあるので、rubyzipライブラリがひっかかってるのかもしれません。
上記と元の質問の内容は無関係と思いますし、本来のrubyファイルでは問題なく動作しました。
本当にありがとうございました。
class C; end C.instance_eval { def a() end } C.instance_eval { define_method(:b) {} } C.class_eval { def c() end } C.class_eval { define_method(:d) {} } p C.singleton_methods # ["a"] p C.public_instance_methods false # ["b", "c", "d"] メソッドbがクラスCの特異メソッドにならないのは何故ですか?
517 :
516 :2007/06/02(土) 03:54:49
追記 $ ruby -v ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-freebsd6]
>>516 define_methodはinstance methodを定義するメソッドだから。
ClassもClassのインスタンスじゃねーの?
いいえ Class は Klass のインスタンスです
初心者スレのレベル的に微妙な遣り取りだな
>>520 そのKlassというのは
>>523 のklassと同じものですか?
とりあえずその記述に従ってklassとはあるコンテキストにおける
メソッドの定義先であるとして話を進めますが、
>>518 するとdefine_methodはレシーバの、つまりそのコンテキストでの
selfのインスタンスメソッドを定義するメソッドということでしょうか。
対してdefはklassのインスタンスメソッドを定義すると。
C.class_eval では self = klass = C
C.instance_eval では self = C, klass = Cの特異クラス
なのでself = klass の場合にメソッドの定義先が同じになるだけ
という解釈でよいですか?
>>522 あー、"Rubyについて"スレに移動した方がいいですかね?
>524 移動しなくていいと思うよ 向うは技術的な話題最近ないし こっちの方がレベル高いw
>>525 リアル低レベルな人は発言の切れが違いますね。
>>526 # klass = Class.new(super)
変数klassに superを親クラスとする無名クラスを代入
# klass.module_eval { |m| .... }
klass.class_eval { |m| .... } こちらでも同じ
無名クラスのコンテキストで何かする mは無名クラス
# klass
無名クラス自体(クラスのオブジェクト)を返す
以上を書き換えるとこんなふうになる
proc { |super|
class 無名クラス < super
do_something
end
return 無名クラス
}.call(super)
こんなかんじ?
実際試してないので間違ってたら御免
あう、do_sometingと書いてある部分ところは、 Class.new に与えられたブロックが呼び出される部分です。 左記の例に沿うなら、その直前に一行 m = 無名クラス としたほうがわかりやすいかな。 # 校正したつもりでもミスばっかり…… # 酒が入るとこれだから、といいわけしてみる。
そしてまた誤字やらなにやらが複数 orz しばらく寝てよう....
Object#inspect の返す文字列内の 16進の数値って何ですか? Object#__id__ かなと思って試したのですが obj = Object.new puts obj.inspect #=> #<Object:0x2ab087c> puts '%#x' % obj.__id__ #=> 0x155843e となって、どうやら違うようです。 ruby は 1.8.5 です。
0x155843e*2 == 0x2ab087c
>532 2倍されていたのですね。ありがとうございます。 でも、何故こんな仕様に…?
IDとかSYMBOLとかFixnumとかプリミティブ型とかがよくわかりません
>>534 もっと具体的に質問してください
・どういう意味でIDやプリミティブ型と言っているのか
・どこまで分かっていてどこから分からないのか
・そもそもなぜそんな事を聞くのか
>>533 README.EXT.jaを見るとわかると思う。
533じゃないけど、とりあえず途中まで読んでみた Fixnumの数値はCレベルでは、元の値を1ビット左シフトして開いたビットを立て、その他のオブジェクトだったらアドレス値を左シフトのみして開いたビットは立てない仕様になっているのはわかった で、inspectはそのままアドレスを2倍しっぱなしの値が返り、__id__のほうはちゃんとアドレスの値に戻したものが返ってきているということ? でも、Fixnumのオブジェクトだと、なぜか__id__で2倍して1足した値が出てくるね それだったらFixnum以外のオブジェクトの__id__も2倍しっぱなしでいいような気がするけど・・・
Fixnumの1足した値ってのは、Fixnumかそれ以外かを判別するbitなのでは?
539 :
537 :2007/06/03(日) 13:30:26
いちおうその判別の意図は理解してるつもりなんだけど、なんか__id__の返す値に違和感あるなぁと思って __id__はユニークな値にしたいのかしたくないのかが、何か釈然としないような気がする アドレスを表す値は奇数(LSBが立ってる値)にはなりえないってことも、微妙に考慮してるってことなのかな? でもそれだったら2倍しっぱなしの値でも問題ないし、inspectと同じものが返ったほうがユーザ的には安心な気もする
Fixnumの__id__はアドレスじゃないし
そりゃ見りゃわかりますがなw
>>537 まずはちゃんと最後まで読んでみ。
inspectのほうがアドレスの値がそのまま出ている。
VALUEをFixnumとしてみた場合が逆に1/2になるので、
object_idのほうが変換されている。
もしinspectに出てくるのと同じ値にしようとすると、
環境にもよるがBignumが必要になってしまって無駄。
Fixnumもそれ以外も2倍しっぱなしでいいなら そもそもどっちも2倍にする必要すらないw
544 :
537 :2007/06/03(日) 15:31:43
あ、なるほど 読み違えてましたorz ポインタのLSBが立っていないことを仮定するってのも書いてあるね 納得です
なんでMSBじゃなくてLSBにしたんだろう 知ってるひといる?
>>545 もちろん現代のほとんどのプロセッサが奇数アドレスからワードアクセスすることを
禁止しているかあるいは少なくとも非推奨であるから。
なので有効なポインタの値は偶数しかあり得ず、奇数のポインタ値はあり得ないから。
まあよくあるハックではあるけど、ちょっと汚いかなとは思う。
>>546 にあわせて
LSBなら右算術シフト1発で済む。
MSBで符号を正しく扱うためには、左に一度シフトしてから右にシフトするか
条件分岐する必要がある。
548 :
デフォルトの名無しさん :2007/06/03(日) 19:03:48
プログラムがまったく未経験からRubyを始めたいと思ってるんですが、 何か良い参考書などあれば教えてください。
>548 檻の中から乙
「たのしいRuby」か「プログラミング言語Ruby」
まったく未経験からrubyできるもんかな? 俺の場合javaやる前にrubyはできなかったな
Cやって、今rubyの勉強を始めた 構文とかはすぐ覚えられそう Cとは比較にならないほど簡単に書けて衝撃的だわ
なんで本スレよりこっちのほうが議論のレベルが高いんだろうw
case 〜 when 〜 else 〜 endとか if elsif elsif else endとかのネスティング段数が 多くなるとおかしくなる。 cygwinで使っているのだがね…。
PerlかJavaの初級修めてからRubyというのがいろいろな意味で無難だと思う どうしてもRubyだけ最初に学びたいという場合は…どうしよう
>>549 モニタにシミができてしまったので、損害賠償請求します。
>>556 Javaはまだわからんでもないけど、Perlは入門にはあんまりよくないんじゃないかなあ。
あのコンテキストの考え方って癖がありすぎて初心者は混乱するだけだと思うんだけど。
>>554 >>557 こんなんあったのか。初めて見た
読んでみた人いる?
>>556 PerlやJavaを知らなくてもなんとかなると思う
自習用としては、Rubyは意外と初学向き
俺の場合はBASICしか知らなかったけど何とかなった
>>560 店頭で立ち読みしたことがあります。
プログラミング初学者におすすめの非常に良い本だと思いました。
562 :
デフォルトの名無しさん :2007/06/03(日) 22:20:05
他の言語から始めると→Rubyをやったときに、オブジェクト指向の徹底ぶりに感動する Rubyから始めると→他の言語やったときに、イライラ
>>555 インデント間違ってないか?
if の終わりには end が必要だぞw
独自なインデント規則で書いてたり then を省いたりすると 意図しない意味の構造になってたりはするとは思う
構文木を出力する機能ってなかったっけ
>542 Bignumが要らないほうに揃えたらいいんじゃ?
>>567 object_idにってこと?
inspectとobject_idは別物だから、別に揃えなければならない必然性はないしなぁ。
個人的には、デバッガで見るときにそのまま対応させられる現状のほうがありがたい。
「錢」っていう漢字をKconvでEUCからUTF-8にしようとしたんですが ちゃんと変換されずにゴミみたいのになってしまいました。 「銭」だと大丈夫です。Kconvで使えない文字があるんでしょうか? require 'kconv' print '錢'.toutf8, "¥n" print '銭'.toutf8, "¥n"
>>569 使えるけど。
どういう環境でどういう出力?
上のコードをeucで保存して UTF-8に設定したMacのTerminal.appで実行しました。 これでどっちの文字も表示されると思うんですが、、 下の「銭」は表示されるけど上のはなんかゴミみたいな □にゴミがついたみたいな文字になってしまいました。 Terminal.appが悪い・・?
ちゃんと-Keつけて実行してる?
odでも通してゴミのコード観てみたら
わが Mac ではちゃんと表示されるけど。 【OS】 Mac OS X 10.4.9 (i386)
どうもです。-Keつけてませんでした・・が、つけても結果同じでした。 od -Hで見てみたら、「銭」はe98aad、「錢」はeebea2 になってました。 その二文字をそのままUTF-8のテキストファイルに保存して od -Hで見ると、それぞれ e98aad と e98ca2 なので eebea2というのがおかしい?
>>574 どうもです。。うちの環境の何かが壊れてるっぽいですね。。
Mac OS X 10.4.9 PPC
ruby 1.8.6 (2007-03-13 patchlevel 0) [powerpc-darwin8.9.0]
RubyはMacportsで入れたものです。
データがおかしいということは、 その Ruby のせいなのかな。
ちゃんと表示されるうちの Ruby のバージョン。 デフォでインスコされてたやつのまま放置。 ruby 1.8.2 (2004-12-25) [universal-darwin8.0]
579 :
576 :2007/06/04(月) 13:25:20
お!システム標準のruby(1.8.2)でやってみたらちゃんと出ました! うちのMacportsの1.8.6が壊れてるのかもしれないので とりあえず再インストールしてみます。多謝!
>>569 Debianのruby 1.8.6+PuTTYで試したらゴミ文字になったよ。
KconvだとNKFで文字コードを自動判定してUTF-8に変換するから
短い文字だと化けることがあるみたい。
昔HTMLの文字化けで使われた'美乳'を'賤'に追加したらちゃんと変換された。
>>580 なるほどです。kconvのtoutf8等は文字コード自動判定してるんですね
(指定してないんだから当たり前か・・)。
旧バージョンでいけるのは、判定アルゴリズムが変わったのかな?
どっちにしてもこの場合は入力コードが分かってるんだから
明示的に指定しろってことですね。。
錢はEUCでEFA2だけど、これをunicodeとみなしてそのままUTF-8に持ってくと eebea2になるね
元のエンコーディングがわかってるならiconvで変換した方が確実じゃないの。 iconv自体の変換テーブルが信用できない場合もなくはないが。
え、変換元エンコードを指定してても化けるという話ではないの? 指定してなくて推測させて化けることがあるのは当たり前じゃん
どっちのスレも文字コードの話ししててワロタ
586 :
デフォルトの名無しさん :2007/06/04(月) 16:56:48
WindowsXP + irb + Poderosa3 で、
>>569 のコードのUTF8大丈夫だったよ。
メソッドの引数に()を付けるのと付けないのってどう違うのよ?
どうも違わんよ
ありがとう。 じゃあ好みでいいわけね。
すみません 質問させてください 書籍「プログラミングRuby第二版言語編」のP68に メソッドの本体には通常Rubyの式を書きます。ただし、メソッドの内に非singletonクラスまたはモジュールを定義することはできません。 とあるのですが、この非singletonクラスとはデザパタのsingletonとは別物でしょうか? ためしにsingletonクラスをメソッドの中に書いて見たのですが、エラーになります。 Rubyではsingletonとは何か特別な意味があるのでしょうか? よろしくお願いいたします。
特異クラスのことじゃないかな
>>590 別物。
「特異」という意味では同じだけど、
デザパタ: 「一つしか無い」事を意図的に保証
Rubyのクラス: 「固有」だから自ずと他のものではありえない
ってことで。
Rubyの「非singletonクラス」っつーのは、まあ「普通のクラス」と
思っといて間違いない。singletonクラス自体が何かとか、どういう時に
使うとかは本にあると思う。
そういえば、singletonクラスが
>>591 の通り特異クラスと言うのは
やっぱデザパタとの混同を避けるためなんだろうね。
一部コミュニティでは「eigenclass」なんて呼び方も定着しつつある。
>>592 >一部コミュニティでは「eigenclass」なんて呼び方も定着しつつある。
えーいいじゃん singleton class で。
594 :
デフォルトの名無しさん :2007/06/05(火) 01:09:19
10.0/3*3 やると、答えが、10.0になるのはなんででしょう? 他の言語だと、9.9999・・・になると思うのですが 前にどこかのwebページで見たのですが、忘れてしまいました。
595 :
デフォルトの名無しさん :2007/06/05(火) 01:13:11
あれ? #include <stdio.h> main(void) { float d = 10.0/3*3; printf("%f", d); } でも、10.0になるな。 俺の勘違いか。
変数にしたほうが良くない? 最適化してくれそう
>>595 それコンパイル時の最適化で /3*3 削られない?
だから変数にしてレジスタに入るようにしろと その前にスレ違い
599 :
デフォルトの名無しさん :2007/06/05(火) 01:45:45
rubyと他の言語との比較の話なんですが、スレ違いですか?
600 :
デフォルトの名無しさん :2007/06/05(火) 01:47:16
#include <stdio.h> float d() { return 10.0; } float e() { return 3.0; } float f() { return 3.0; } main(void) { printf("%f", d() / e() * f()); } でも、10.0になった。 rubyの/3*3も最適化?かと思って、 a = 10.0; b = 3.0; c = 3.0; a/b*c にしたのだが、やはり、10.0だ
601 :
デフォルトの名無しさん :2007/06/05(火) 01:49:23
irb(main):022:0> d=a/b; puts d; e = d * c; puts e 3.33333333333333 10.0 むむむむ・・・
ループして0.1を1000回くらい足してみろ
>>589 明示的にカッコがつくとパース時に最初からメソッドだと思って検索してくれるような気がする
(本当にそういう優先動作になってるかどうかは知らない)
Rubyやる前は var = method_hoge() のように空の引数を書くことが当たり前でわかりやすいと思ってたんだけど、
Rubyやるようになってからは「メソッドであること」はメソッド名に負わせるようにして空の引数は省略するようになった
すいません、 ARGVで渡された文字の配列を適宜つないで文字列して最後にsystem()に 渡すプログラムを作ったのですが、 たまにARGVの文字列で空白やクォートを含むものがあり(これら以外にもあるかも)、 その結果system()内でshのエラーになるようです。 こういう場合system()にどのようにコマンドの文字列を渡せばいいでしょうか。
>>569 仕様だよ、元の文字コードわかるんなら明示的に指定しろヴォケ
・・・ってレスしようとして念のため確認したらバグでした(
>>603 カッコがついてもそうだけど、引数があるだけでもメソッドと認識する。
ローカル変数に引数はつかないからな。
608 :
デフォルトの名無しさん :2007/06/05(火) 10:44:04
>>602 irb(main):024:0> i=0;1..1000.times{i+=0.1};i
=> 99.9999999999986
なるほど・・・
もしやと思って、
irb(main):032:0> 0.3333333333333333 * 3
=> 1.0
orz
そういうことですか。
二進数計算の誤差ってやつ?
すみませんまた文字コードの質問です。 -Kオプションは「文字列やアクセスするファイルの内容」の コードを指定するってマニュアルに書いてますが、 ソース中に書かれた文字列と、操作するファイルの文字コードは 違う場合もあると思うんですがその場合はどっちを指定すべきでしょう? 同じでないとうまいこと動かない場合があるということでしょうか?
えーと、、、元ソースと、require したソースで文字コードが違うの?
じゃなくて、スクリプトのコードと、 そのスクリプトで操作するファイルのコードが違う場合です。 んとたとえば、いろんなサイトのHTMLを処理するとすると EUCだったりSJISだったりいろいろだと思うんですけど それを同じUTF-8で書いたスクリプトで扱おうとする場合などです。
別に読み込むファイルなら文字コードなんてどうにでもなるでしょ
ruby -K で指定する文字コードは「そのスクリプト自体」の文字コード 文字列内部操作の文字コードは自分で1種類に決めておいて読み込み時に変換するのが望ましい 読み込むファイルの文字コードはtoeucやtoutf8などで「決めておいた文字コード」へ変換 そういう癖をつけておかないと動かないありがち例: ================ nekosearch.rb(いわゆる文字コードはいわゆるutf8) /usr/bin/ruby -Ku file = File.read('euc.txt') # toutf8の変換忘れた if /ねこ/ =~ file then # スクリプト自体がutf8なので無指定の /ねこ/ はutf8の「ねこ」にのみマッチ puts 'ねこがいたよ!' end =============== euc.txtの中身 ねこだいすき ねこだいすき ねっこだいすっき ================ 実行結果 ~$ ruby ./nekosearch.rb ~$
-Kで指定する必要があるのは文字列リテラルとか正規表現のデフォルトの文字コードを 指定する必要がある場合だけでしょ。 読み書きするファイルの文字コードは$KCODEとは無関係と思ったほうがいい。 複数文字コード読み書きするならruby-Kuにして内部処理は全部UTF-8に統一するのがいいかな。
なるほどマニュアルに「アクセスするファイルの・・」っていう 記述があったのでよくわからなくなってたんですが つまりは読んだあとパーズ(?)したりするときに 正規表現などを使うと指定した文字コードが仮定されるので 読んだものをその文字コードにあらかじめ変換しまえばよいと。 全部処理はUTF-8にしてruby -Kuでやってみます。ありがとうございます。
Rubyのリファレンスが一つのプレインテキストになってるようなのありませんか?
elsifのように制御構造をチェインする文法がunlessの場合はないのは なんでなのでしょうか? ちょっと不自然な感じがしました。 (でもelseunlessとかだと違和感ありまくりなのですが)
unless 自体濫用しない方がいいと思うし、そんなもんじゃない?
elsif自体、Perlに入ってたからしかたなく入れたという感じがする
チェインは大概caseでいいしなぁ notでそんなにチェインする必要ってあるかな?
>>618 俺はunlessもelsifもすごく便利だと思ってるけど
かといってunlessチェインは必要とは思わないなー
何でかって考えると
1.elsifと比べて、あまり使いたい機会がない
2.elsif notで代用できる
3.適当な単語が思い浮かばない
そして重要な理由として
4.頭がunlessチェインについていかない
else if を elsif とか elif とかいろんな言語でいろんな縮め方してるけど 「 ef 」 まで踏み込んだ言語ってあるのかな if と同じ2字で列を揃えられるから綺麗だと思うんだけど
if(hoge) ef(hage) ef(hige) else end
if ef fi
(1..100).each do |i| printf(["%5d", " Fizz", " Buzz", "FizzBuzz\n"][[3, 0, 0, 1, 0, 2, 1, 0, 0, 1, 2, 0, 1, 0, 0][i % 15]], i) end
もうおなか一杯
if foo > bar -> foobar [] foo < bar -> barfoo [] else -> foobarbaz fi ……いかん SR なんぞ忘れた……
派生クラスと基底クラスではインスタンス変数を共有するわけですが、 これって、知らずインスタンス変数の名前が重なったときに、 悲しいことになる気がしています。 Ruby では派生自体、あまりしないものなんでしょうか?
630 :
512 :2007/06/05(火) 23:21:01
それは考え方次第。派生つかう連中は、ぶつかれば直せばいいとう考え方。 ぶつかる可能性はゼロではないが、極めて低いから、それよりは便利さをとるという態度。 そして、そんな態度でもうまくいくやつはうまくいく。うまくいかないやつは派生使わなくてもうまくいかない。
あと、派生クラス、基底クラスってのはC++系の言葉だから、 Rubyではスーパークラス、サブクラスと呼ぼうぜ。
順序が逆になってしまった。 スーパークラスがC++でいう基底クラスのほう。
633 :
604 :2007/06/06(水) 00:19:07
>>606 >system(*ARGV)
どうもありがとうございます。ちなみにこれは
1. ruby の system() はコマンドの引数をばらした形でも受け付けてくれる
(で、空白等は内部でよしなに処理してくれる)
2. 配列を複数の引数として渡したいときは先頭に*を付ける
という理解で良いでしょうか?
ちなみに 1. がもしなかったら(Cのsystem()みたいに)どうやるんでしょう。
蛇足ではありますが。
>>630 べつに便利さをとってこんな仕様になったわけでもなかろうに。
>629 2.0ではその辺をちゃんとしようとかいった議論があったようななかったような。 Ruby では派生をあまりしない、というのもその通りだと思う。 is_a 関係に あるというだけで派生したりはしない。青木さんのるびま記事にも、そんなこ とが書いてあったね。
>>512 特に「ぶつからない様に」とかしているわけじゃないんですね。
問題が出たらユニットテストで発見できるものの、
もし「あ〜ここがまずかったのか!」というのを何度も体験したら
ウンザリしちゃうかも。
それとも「名前がかぶる」っていう時点で何かよくない兆候なのかなぁ。
>>635 おお、そうなんですか。うんうん是非ちゃんと(?)してほしい。
やはり Ruby では派生をあまりしないのですね。
るびま記事は読んでないので、明日にでも見てみます。どもです。
深く考えてないけど、確かに、継承した(is-aである)のなら、 名前がかぶるインスタンス変数ってのはなかなか出てこない ような気がするな。親のをアクセサメソッド経由で使えそうなものだ。
$cat printa.rb puts "a=#{a}" $ruby -e "a=4" printa.rb a=4 みたいな事はできませんか?
e=4; load "printa.rb"
>>638 ですよね…って思いつつも @output とか @result とかは
すぐぶつかる気がしてきました。命名が悪い?
かといって究極的に名前の衝突を怖がると、
再利用目的のモジュールやクラスに
インスタンス変数が持てなくなるし…。
何かスッキリできるアイデアは無いもんですかねぇ。
単に表示上だけの話というわけでもない a = b = 1.0 b /= 3; b *= 3 p a, b, a==b 1.0 1.0 true
>>636 名前がかぶるだけだったら問題ない
それを容易に発見出来ないのが問題
>>641 命名も悪いけど
その名前のインスタンス変数が沢山必要になる設計って
どんな設計なんだろうと心配してしまう
590です
>>591 >>592 >>593 遅くなりましたが、レスありがとうございます
しかしながら、特異クラスとやらが良くわかりません。
どうやったら特異クラスをかけるのでしょうか?
そして、それをメソッド内で定義できるのでしょうか?
よろしくお願いいたします。
647 :
604 :2007/06/06(水) 07:43:53
>>606 すみません、別の問題が発生しました。
実は system(string) を呼ぶときに > でリダイレクトを期待していた呼び出しが
ありました。system(*array)だと sh 経由じゃなくなるみたいでよくないようです。
リダイレクトを簡単に済ませたかったんですが。
マニュアルをぱっと見たところでは system() のようにバラでコマンド引数を与えられる
のは exec() ですか。もしかして fork open dup exec 系のプログラムを書かないと
いけないんですかねえ。
Rubyのソース中の数値にマッチするのって 0x[0-9A-Za-z]|[+-]?\d+(\.\d+)? でいいですか?
([+-]\s*)?(0[xX][0-9a-fA-F]+|0[bB][01]+|0[0-7]+|\d+(\.\d+)?(e[+-]\d+)?) こんなところじゃないかな。
>>647 クォートしていいメタキャラクタとしていけないものと、
ちゃんと区別できるようなデータになってるのか?
一辺、例を示してみ。
>>639 -sオプションがつかえる
$ cat hoge.rb
puts $data
$ ruby -s hoge.rb -data=10
10
でもスクリプト名が必要だから、-eだとつかえないかも
653 :
デフォルトの名無しさん :2007/06/06(水) 15:52:02
特定の文字が入っていると、実行時にエラーが出てしまいます。 何故なのでしょう? xyzzyで、utf-8n(crlf)で保存しています。 -Kで、utf8を指定しています。 エラー: unterminated string meets end of file ---------------- #!ruby -Ku puts "ん" ----------------
654 :
653 :2007/06/06(水) 15:54:25
環境は、WindowsXPのRuby-win32です。 あれ?と思ったら、 コマンドプロンプトや、bash上から実行したら、きちんと実行できますね どうも、xyzzyのruby-modeの C-C, C-X で、だけ起きるようです。 なんでだろ・・・。
655 :
653 :2007/06/06(水) 15:57:06
ruby-modeのC-C, C-Xは、どうも、SJISに変換して実行している?ようで、 utf-8なのに、xyzzy内のコンソールの出力もSJISになってました。 おとなしく、sjisにすることにします。
>>652 > でもスクリプト名が必要だから、-eだとつかえないかも
$ ruby -s -e 'p $data' -- -data=10
"10"
>>655 *default-process-encoding* をいじってみれば?
658 :
604 :2007/06/06(水) 20:22:27
>>647 >クォートしていいメタキャラクタとしていけないものと、
>ちゃんと区別できるようなデータになってるのか?
とりあえずメタキャラクタはシェルのリダイレクト > の箇所だけです。
将来的にはもう少し複雑なもの(例えば >パス名 2>&1 みたいな)も使いたくなるかも
しれませんが。
それ以外の箇所ではメタキャラクタとして解釈してほしくないです。例えばパス名に*が
入っていたとしても普通の文字として扱いたいです。
>一辺、例を示してみ。
system() に食わせたいのは、普通に
コマンドパス名 オプション パス名 > 別のパス名
みたいな感じのものです。system(string) を使っていたときは「パス名」か「別のパス名」
にスペースやシングルクォート(いずれも ASCII にあるやつです)があったときエラーに
なってたと思います。system(*array) では > がエラーになってたと思います。
>>647 > 実は system(string) を呼ぶときに > でリダイレクトを期待していた呼び出しが
> ありました。system(*array)だと sh 経由じゃなくなるみたいでよくないようです。
> リダイレクトを簡単に済ませたかったんですが。
スレッドセーフじゃないけど、こんな感じで $stdout とかを reopen すればいいよ。
require "tempfile"
def capture
tmp = Tempfile.new("hoge")
stdout = $stdout.dup
stderr = $stderr.dup
begin
$stdout.reopen(tmp)
$stderr.reopen(tmp)
yield
ensure
$stdout.reopen(stdout)
$stderr.reopen(stderr)
end
begin
tmp.flush
tmp.rewind
tmp.read
ensure
tmp.close(true)
end
end
p capture{ system("ls", "-la") }
>>644 > それを容易に発見出来ないのが問題
そうなのです。なので、できれば名前がかぶったら分かる方法または
かぶっても別物になる仕組みはないかと思ってます。
>>645 > その名前のインスタンス変数が沢山必要になる設計って
> どんな設計なんだろうと心配してしまう
すごく安易な名前だとは思っているのですが、
名前が簡単でもクラスの役割と合わせるとその名前が
簡潔だったりすることってありません?
@output なんて名前今まで一度も使ったことねーな…
>>660 いまいち使い方がイメージできないんだが・・・
@outputや@resultって、どういう風に使うんだ?
なんかのデザインパターンで必要になるのかな
@resultはまだわからんでもないが(でもおれも使わんが)、 変数名に動詞の@outputはないだろ、常識的に考えて・・・
そうか? 俺はローカル変数なら使うよ というかoutputは名詞でもあるぞ
疲れてて思いつかない時には出力をよってたかって溜めておく一時変数にoutputを使うことはあるなー
IOオブジェクトによく使う<input、output
俺も一時変数にoutputやresultは使う だがインスタンス変数に@outputや@resultは使ったことないな どんなクラスを作ろうとしてるんだろう?
>>666 でもそれ継承して同じような名前で別目的で使いたい場合って何だろう?
>>662 〜667
正に
>>666 さんの言われるように IO オブジェクトをしまうときに
@output とかはあるかな、と思ってます。Logger モジュール作るとか。
※そもそも Logger モジュールなんて作るか?という点は
Ruby だとどうするのがロギングのセオリーなのかとかまだ知らないので
スルーしてください。
>>668 ↑で書いた Logger モジュールで言うと、
継承、というよりモジュールとして作っておいて
モジュールを利用するクラス側で include したものの、
クラス側も IO オブジェクトを持ってて、
インスタンス変数名が同じだった…とかを心配してます。
まあ、C++やJavaならprotectedやめてprivateにしろって話だよな。Rubyには privateないの?
すいません、教えて頂けないでしょうか 初心者なので全く見当違いなモノを書いてるような気もするんですが・・・ #AAA#(a11 a12 a13) #BBB#(b1) #CCC#(c1) #AAA#(a21 a22 a23) #BBB#(b2) #CCC#(c2) ・ ・ ・ ↑上の文から#AAA#と#CCC#の()内を抽出し、 a11c1 a12c1 a13c1 a21c2 a22c2 a23c2 ・ ・ ・ と表示したいのです。
672 :
604 :2007/06/07(木) 00:55:30
>>659 >スレッドセーフじゃないけど、こんな感じで $stdout とかを reopen すればいいよ。
ありがとうございます。うまくいきました。
Tempfile というクラスは便利そうですね。なお、自分の場合リダイレクトしたファイルを
残したいので、Tempfile でなく普通にファイルを open しようかと思いますが...
ちなみに yield というのを知らなかったんですが、面白いですね。
673 :
671 :2007/06/07(木) 00:58:20
↓取り敢えず書いてみたヤツです #!/usr/bin/ruby a=[] c=[] while line=gets if /#AAA#\((.*)\s(.*)\s(.*)\)/ =~ line a.push $1,$2,$3 end if /#CCC#\((.*)\)/ =~ line c.push $1 end end n=0 while a!=a.last puts a[n]+c[n] puts a[n+1]+c[n] puts a[n+2]+c[n] n=n+1 end 特に2個目のwhile辺りが
色々変だけど表示できてるならいいじゃん
675 :
デフォルトの名無しさん :2007/06/07(木) 01:12:58
>>674 いや、表示できないんです
n=n+1の所で・・・
で、ループしないのでwhile a!=a.lastも合っているかどうか
676 :
675 :2007/06/07(木) 01:13:46
スイマセン、ageてしまいました
arr = Array.new re = /#AAA#\((.+?) (.+?) (.+?)\)..+?#CCC#\((.+?)\)/m ARGF.read.scan(re){ arr.push([[$1,$2,$3],$4]) } arr.each do |a| puts "#{a[0][0]}#{a[1]}" puts "#{a[0][1]}#{a[1]}" puts "#{a[0][2]}#{a[1]}" end たぶん動く めんどくさいので「#AAA#から#CCC#まで」をひと塊として配列にぶち込んだ データは一気に読み込んでるので、100メガ単位とかで実行マシンのメモリに対してあまりに大きいと危険
678 :
675 :2007/06/07(木) 01:22:45
679 :
デフォルトの名無しさん :2007/06/07(木) 05:27:23
> ※そもそも Logger モジュールなんて作るか?という点は > Ruby だとどうするのがロギングのセオリーなのかとかまだ知らないので 知りたいので、スルーしないでください
p $:
>>670 「privateなインスタンス変数」を作る機能はRubyにはない
>>679 Rubyのセオリーとか特にない気もするが
あえて言うならrequire 'logger'
rhtmlとjavascriptの連携についての質問です。 js内の変数をruby側の変数に代入したいのですがどのようにすればよいのでしょうか? やりたいことをそのまま書くと、 function pop(jsStr){ <% rbStr = jsStr %> alert(<%= rbStr %>); } rbとjs間で変数を代入し合える方法がありましたら、ご教授の程宜しくお願いします。
683 :
デフォルトの名無しさん :2007/06/07(木) 16:18:41
rhtmlのrubyが評価されて出力されてから、Javascriptが評価されるから、 ruby→javascriptは、できても、逆は、 無理なんじゃない?
>>682 Rubyがサーバ側で実行され、出力された後で、JSはブラウザ側で実行されるっていうイメージはできてんのか?
その上で、JSからさらにサーバ側にアクセスし返すにはAjaxを使う。
つーかWebProg板のRoRスレ行けば?
685 :
682 :2007/06/07(木) 16:54:10
ということは、ajaxで処理して返すrbを別に用意しなくてはならないのですね。 なんとなく流れはわかりました。ありがとうございます。 <%= %>タグ内をjavascriptコードに置き換えたりするのもおもしろそうですね。 失礼しました。
686 :
デフォルトの名無しさん :2007/06/07(木) 17:00:23
Rubyist Magazine - Ruby Library Report 【第 4 回】 Win32Utils
http://jp.rubyist.net/magazine/?0005-RLR ここを見て、クリップボードを利用しようと思ったのですが、
require 'win32/clipboard'
puts Win32::Clipboard.data
中身の表示はできましたが、
require 'win32/clipboard'
Win32::Clipboard.data = "hoge moge poo"
で、設定ができません。
エラーメッセージは、
undefined method `data=' for Win32::Clipboard:Class (NoMethodError)
でした。実装されていないでしょうか?
>>686 されてない。が、set_dataならあった。
格納するデータがテキスト限定じゃなくなったのの
影響っぽいな。
詳しくはソース見れ。
688 :
デフォルトの名無しさん :2007/06/07(木) 17:30:35
>>687 Win32::Clipboard.set_data("hoge moge poo")
でいけました。サンクスです。
689 :
デフォルトの名無しさん :2007/06/07(木) 17:33:38
例外を細くして、メッセージダイアログを出したいのですが、 詰まっています。ご助言くだされ。 require 'win32ole' def show(msg, title) wsh = WIN32OLE.new('WScript.Shell') wsh.Popup(msg, 0, title, 0 + 64 + 0x40000) end begin raise "exception" rescue => e show(e, "error") end とすると、 in `method_missing': undefined method `value' for #<RuntimeError: exception> (NoMethodError) from (ファイル名):5:in `show' from (ファイル名):11 と出てしまいます。 show("Hello", "error") などちゃんとダイアログが出るのですが・・・
eは例外クラスだからじゃないか? e.message渡せば?
set_dataじゃない?
692 :
デフォルトの名無しさん :2007/06/07(木) 18:19:35
>>690 そっか、俺、アホだwww
begin
raise "exception"
rescue => e
show(e.to_s, "error")
end
でいけた。
e.message
でもいけますた!
俺何年Rubyやっとんだ・・・
Arrayクラスの範囲指定のメソッドと同じIFのメソッドを 作りたいのですが、 def [](start..last) とやってもだめなようです。 どうしたらいいもんでしょうか
>>693 1..10 とかは Range クラスのインスタンスなんで普通に引数に取ればいいよ。
def [](range)
# range.begin と range.end を使ってお好きにどうぞ
end
>694 引数は1つなんですね ありがとうございます
696 :
デフォルトの名無しさん :2007/06/08(金) 16:36:13
arrayを逆順にeachしたいのですが、 [1,2,3,4,].reverse.each{|i| puts i} みたいに、reverse使うのって、って、効率わるいですかね? 配列がでかいと、遅いとか・・・
[1,2,3,4,].reverse_each{|i| puts i}
>>696 あんまり速度を気にするほどの部分でもない
Rubyって見栄えのいい高級な書き方すると 後で高確率でチューニングするハメになるんだよな・・・
それはその人の見通しが悪いだけであって言語のせいではない そういう人はきっとPerlで書いてもJavaで書いてもC…はもともと見通し悪いか
irb> arr = ['1st','2nd','3rd'] => ["1st", "2nd", "3rd"] irb> arr.object_id === arr.reverse.object_id => false irb> arr[0].object_id === arr.reverse[-1].object_id => true ということで、並びだけが変わっただけで要素の指してるものは一緒の模様 要素数がバカみたいに多いのでない限り負荷とか気にせずreverseしてよし
702 :
デフォルトの名無しさん :2007/06/08(金) 18:00:12
>>697 reverse_eachってあったのね orz
Cからすでに存在するRubyのブロックを付けてRubyのメソッドを呼ぶにはrb_iterate、 またはtrunkにあるrb_block_callを使うしか方法はありませんか? Rubyで書いた例: def method(argblk, &block) method_deep(&argblk) method_deep(&block) end Cで次のように記述したい: VALUE func(VALUE self, VALUE argblk) { <ブロック付きメソッドを呼ぶAPI>(self, argblk, rb_intern("method_deep"), 0, 0); <ブロック付きメソッドを呼ぶAPI>(self, rb_block_proc(), rb_intern("method_deep"), 0, 0); } rb_yieldの方がrb_funcall(... "call" ...)よりも実行コストが遥かに低く、rb_iterateや rb_block_callは毎回新しいProcインスタンスを生成するので、再帰処理を 行うとき実行コストが馬鹿になりません。 どなたかおいしいAPIや、うまい方法があればご教授ください。
704 :
703 :2007/06/08(金) 20:44:08
trunk-12273上でRubyコードのみを試したら、Ruby-1.8.6上での
RubyとCの混成コードよりも圧倒的に成績が良かったです
>>703 は忘れて見なかったことにしてください orz
文字列として "(a)\[(b)[(c)[(d)\](e)](f)" みたいなのがあったとき、これを正規表現とみなした場合に (a),(b),...が文字クラス内にあるかないかを簡単に判断 する方法ってないかなあ。
日本語でおk
え、問題わからないの? 問題はよくわかるんだけど、答はわからないよ。
日本語でOK
ようするにこういうことかな。 /(\A|[^\\])\[(.*?[^\\])\]/ =~ '(a)\[(b)[(c)[(d)\](e)](f)' # => 7 $2 # => "(c)[(d)\\](e)"
>>705 (a)→文字クラスの外
(b)→文字クラスの外
(c)→文字クラスの中
(d)→文字クラスの中
(e)→文字クラスの中
(f)→文字クラスの外
欲しいのはこういうこと?
>>710 そういう事です。最初からそこまで書くべきでした。すみません。
>>709 tnx. ちょっとそのパターンでいろいろ試してみます。
というか、まず理解しようとしてみます。
713 :
デフォルトの名無しさん :2007/06/09(土) 19:55:02
ー
>>712 文字クラスだと[A-Z]のような範囲指定とか[^0-9]みたいな否定もあるから
真面目に解析しようとすると大変じゃない?
動的にインスタンス変数名を作りたいんですが どうしたらいいでしょうか。 def create(name) @#{name} end こんなのではだめなので、おねがいします。
instance_variable_set(name, value) nameは @ で始まる名前にすること。
>716 できました ありがとうございます。
>>714 だと思います。
一文字づつ状態遷移で処理してくのが面倒だけど一番なのかなあ。
regex.cを見るとゾッとするけども。。。
>>718 strscanあたりを使って正規表現パーサー(スキャナ?)みたいなのをつくることになりますね。
マッチングの処理は不要みたいなのでregex.cのようなことにはならないと思う。
http://www.ruby-doc.org/core/classes/Module.html#M001677 を参考に
動的にインスタンス変数とアクセッサを作ろうとしているのですが、
def create_method(name)
var = "@#{name}"
instance_variable_set(var, 0)
self.class.send(:define_method, name) do |val|
if val
instance_variable_set(var, val)
else
instance_variable_get(var)
end
end
end
こんな風にすると目的は果せたのですが
warning: multiple values for a block parameter (0 for 1)
というwarningが出て困っています。
邪道すぎたでしょうか?
正当なやりかたを教えてください
>720 作成されたメソッドに渡すべき引数が val と1つなのに、何も渡さないからエラーになるのだろう。 def create_method(name) var = "@{name}" instance_variable_set(var, 0) self.class.send(:define_method, name) do |*vals| if vals.empty? instance_variable_get(var) else instance_variable_set(var, val) end end end この方式の方が有利な点はもうひとつあって、720の方式では作成したインスタンス変数に nil を代入できないが、これならできる。
>721 できました。 ありがとうございます。 rubyのメソッドはよく可変引数を意識させられる ので慣れがいりますね
引数に*が書いてあるものはいまだに動作がわからん
ただの配列だし
分かれば簡単 配列なだけだからCのなんかよりよっぽどいい
* は配列からタプルへの変換演算子。 関数の引数はタプルで実装されている。
def foo(*args) p args, args.class end foo(1,2,3) def bar(args) p args, args.class end bar([4,5,6]) 結果 [1, 2, 3] Array [4, 5, 6] Array
foo(1,2,3) → 1, 2, 3 という 3 項目のタプルを foo に渡す def foo(*args); ...; end → 渡されてきたタプルを配列に変換して args という変数で受ける
729 :
デフォルトの名無しさん :2007/06/10(日) 21:19:44
JAVAと見比べてて分からないことがあるんだが、 JAVAって、複数のクラスを違うファイルに書いておいて、 相互に呼び出して連携させることができるだろ? Rubyはそういうことできるの? それとも、1つのファイルに長々と全部書かなきゃいけないの?
>>729 importのこと?
require "ファイル名"
で普通に読み込めるよ
昔はともかく、今のスクリプト言語で出来ない言語は少ないと思われ
>>729 Rubyではrequireが用意されている。
Javaは1クラス1ファイルの関係にあったけど、
Rubyは複数クラス1ファイルも可能だし、逆に1クラス複数ファイルも出来る。
732 :
デフォルトの名無しさん :2007/06/10(日) 22:43:56
733 :
デフォルトの名無しさん :2007/06/10(日) 22:51:15
RDEというRubyの開発環境を使っていて、 test = <<EOM これは山手線です そうです"埼京線"です。 EOM p test と入れて実行すると、 "\202\261\202\352\202\315\216R\216\350\220\374\202\305\202\267\n\202\273\202\244\202\305\202\267\"\215\351\213\236\220\374\"\202\305\202\267\201B\n" とコンソール画面に出力されてしまうんですが、 \nを改行のまま、日本語は日本語のまま出力できませんか?
puts
735 :
デフォルトの名無しさん :2007/06/10(日) 22:55:39
>>734 さん
ありがとうございます!解決しました
…。
むしろ p をどういう表示メソッドだと学んだのかが気になるな
predicate
>>731 Javaのクラス名とファイル名が一致していないといけないっつーのもなんだかな
最近rubyのよさが分ってきた 動的なことするのに慣れるとやばいね 関数型言語の利点を取りこんでるのかな Javaとか使う気しなくなる
動的なこと云々は関数型とは別に関係ないと思う。
Ruby が関数型言語的な要素を持っていないとは言わないが、 このこととは関係ないな。
1行ごとに別なこと書いてるのかも
あーそう読むとわかるなw
>>740 はノストラダムスの4行詩だろ?
五島勉の本で見たことあるよ。
746 :
デフォルトの名無しさん :2007/06/11(月) 22:29:15
最 的 型 か
最近 動的 関数型言語の Java
748 :
デフォルトの名無しさん :2007/06/12(火) 10:18:03
ShiftJISの文字列 "Rubyはウンコ" にマッチするような正規表現 /(Ruby|Java|Perl|PHP)はウンコ/ をEUCのソースの中で使うにはどうしたらいいですか?
>>748 /(Ruby|Java|Perl|PHP)はウンコ/s
>>748 ,749
「はウンコ」をsjisで書くことを忘れずに。
しかし、たぶんそれじゃいろいろ問題があるだろうから、require "kconv"してあるとして、
Regexp.new("(Ruby|Java|Perl|PHP)はウンコ".tosjis, 0, "s")
とかでどうかな。
webrickを使って、自作のCGIスクリプトを スタンドアロンで動かすためのサーバを作ろうとしているのですが 探し回っても、情報がほとんど見当たりません・・・ Rubyリファレンスには詳しい情報がありませんし Magazineの記事はプロキシ作りがメイン Googleで検索しても、「使ってみた」的なblog記事しか見つからず 英語を覚悟して公式ページに行っても文書はない 諦めてwebrickのソースと格闘するしかないのでしょうか
>751 Railsからパクったら?
>>751 どこまで分かってて、どのあたりではまってるの?
とりあえず CGIInterpreter でググって見れば分かると思う。
WEBrick::HTTPServerのドキュメントだけでつくれる内容のような。
>>752 今までRailsに触ったことがないので、正直腰が引けていますが
お手本になりそうなら週末あたりにトライしてみます
>>753 色々なページを参考にさせていただいて
server.mount('/blog.rb', WEBrick::HTTPServlet::CGIHandler, 'blog.rb')
こうやって普通に動くところまでは行けたんですが
server.mount('/', WEBrick::HTTPServlet::CGIHandler, 'blog.rb')
こうすると、PATH_INFOの値が正しく代入されなかったり
CSSや画像(相対URL参照)を呼べなかったりします
引数をいろいろ書き換えてみても、今ひとつ挙動が理解できず・・・
た
> server.mount('/blog.rb', WEBrick::HTTPServlet::CGIHandler, 'blog.rb') > こうやって普通に動くところまでは行けたんですが > server.mount('/', WEBrick::HTTPServlet::CGIHandler, 'blog.rb') このあとに server.mount('/styles', WEBrick::HTTPServlet::FileHandler, 'css があるローカルのディレクトリ') server.mount('/hoge.css', WEBrick::HTTPServlet::FileHandler, 'css のパス') とかってやってる? / に blog.rb をマウントしただけなら / 配下はすべて blog.rb でハンドルする必要が あると思うんだけど。 > こうすると、PATH_INFOの値が正しく代入されなかったり 今適当にためしたら PATH_INFO も取れたよ。 PATH_INFOが取れない最低限の再現コードをさらしたほうが早いかも
perlの substr($str, $idx) =~ s/(foo.*bar)/\U\1/ みたいなのは、どうするのがrubyっぽいのでしょうか。
>759 perl知らないから
761 :
755 :2007/06/13(水) 23:49:36
>>758 助言を参考に、もう一度試してみました
正常に実行できる状態のコードはこんな感じです
require 'webrick'
server = WEBrick::HTTPServer.new({
:DocumentRoot => Dir.pwd,
:BindAddress => '127.0.0.1',
:CGIInterpreter => 'x:/ruby/bin/ruby.exe',
})
server.mount('/blog.rb', WEBrick::HTTPServlet::CGIHandler, 'blog.rb')
['INT', 'TERM'].each {|signal|
Signal.trap(signal){ server.shutdown }
}
server.start
762 :
755 :2007/06/14(木) 00:02:15
mountの引数を色々変えて実行してみました
1. server.mount('/blog.rb', HTTPServlet::CGIHandler, 'blog.rb')
→問題なく動く
2. server.mount('/', HTTPServlet::CGIHandler, 'blog.rb')
→相対パスで指定した画像やCSSを読み込めない
(しかしリクエストは行われていて、ちゃんと200 OKが返っている)
http://localhost/blog.rb にアクセスすると、PATH_INFOが '/blog.rb' になってしまう
3. server.mount('./', HTTPServlet::CGIHandler, 'blog.rb')
→スクリプトが実行できない
763 :
755 :2007/06/14(木) 00:06:53
考察 ・mountの第一引数は、リファレンスには「ディレクトリを表すパス」と書かれているが 実際にはファイルパスを指定しないと適切に動かない? ・第一引数は、サーバーのDocumentRootをルートとした絶対パスの必要がある?
>>759 str = '_____foohogebar_____'
str[/(foo.*bar)/] = $1.upcase
puts str
=>
_____FOOHOGEHOGEBAR_____
こういうこと?
おっとHOGE一個余計だた。
>>764 多分違う。
置換の対象は、$strの$idx以降の部分文字列だから。
perlのsubstrは代入可能な l-valueを持っている。
> str[/(foo.*bar)/] こんなことできたんだ。。。
しかも「最初にマッチした文字列が入る」なんて 普通に使うぶんには全く遠回りな動作しかしないのが狙いすぎてて反吐が全部出ちゃう(w
条件分岐が100個くらいあるとき配列とハッシュとwhen〜caseのどれがいいのかな
設計が悪い。
771 :
デフォルトの名無しさん :2007/06/14(木) 12:11:20
クラス100個つくって多態するのとどっちが頭悪いでしょうか
>>759 str = 'foobar_____foohogebar_____'
idx = 8
str[idx..-1] = str[idx..-1].sub(/(foo.*bar)/){$1.upcase}
puts str
=>
foobar_____FOOHOGEBAR_____
rubyっぽいかどうかは知らないが
>>769 そんなの保守できんのか。
何をもって分岐すんの?
質問に不備があるから問い直してるんじゃないの?
ハッシュが使えるなら普通にハッシュだろ。
778 :
デフォルトの名無しさん :2007/06/14(木) 15:02:56
そうだな、この場合ハッシュだな
matzのとこのnaclがruby ralisisの開発者急募してるみたいだぞ。 matzに興味ある奴は、naclでぐぐってみ。
そんな条件分岐なんかしないほうがいいよ
(100..200)[0,5,10,0] => (100, 105, 110, 100) みたな事できね
>>781 仕様が全然わかんない。
110の次は本当は115で200まで5きざみでデータが欲しいのと違うの?
Rangeに定義するような仕様ではないな。
あー、[100+0,100+5,100+10,100+0]ということか。 Range#endいらなくね?
またperl厨か
class Array def select_by_index(*list) ret = [] list.each{|i| ret.push self[i] } ret end end (100..200).to_a.select_by_index(0,5,10,0) へぼですまぬ
Rubyの文法に沿ってないから意図がぜんぜんわからんな 日本語で言ってもらえたほうがなんぼかマシだ
>>785 それは [].values_at ではないか?
正規表現にて、全角スペースの扱いで困っています。
次のような文字列があった場合にURL部を抜き出すにはどのようにすれよいのでしょうか?
現在は、[^\S| ] のようにしています。
どうぞ宜しくお願いいたします。(_ は 全角スペース,URLは毎度変化)
"
http://google.co.jp/abc__ "
URIクラスは凄まじく便利なのに 微妙に知れ渡ってない気がする・・・
class Base def foo @name = "foo" bar end end class Sub < Base def initialize(name) super() @name = name end private def bar puts @name end end sub = Sub.new("mona") sub.foo 基底クラスから子のメソッドや変数にアクセス出来るのね・・・
792 :
788 :2007/06/15(金) 14:43:54
>>789 うわーーー!あまりの求めていた結果に感動です!
複数の例を盛り込んでいただいたことにも感動です!
URIは今まで、hostやらpathだけでしか使用していませんでしたがそんなすごいことができるんですね。。
ありがとうございました!
>>791 その例だとJavaでも出来る。
ただしJavaの場合は
基底クラスに抽象メソッドを宣言しておく必要があるし
protectedと書く必要があるが。
(RubyのprivateとJavaのprivateでは意味が違うため)
というか、その例は作成してるインスタンスが派生クラスのインスタンスだから
「基底クラスからアクセス」とはあまり言わない希ガス。
Rubyスクリプトのprivateは4割が完全な誤りで4割が別な書き方で消える protectedに至っては9割5分までが間違いだ
ただし、ソースはソニー
796 :
デフォルトの名無しさん :2007/06/15(金) 21:25:14
797 :
デフォルトの名無しさん :2007/06/15(金) 21:33:54
>>796 > version 1.6 〜 1.9 対応リファレンス
> version 1.6 〜 1.9
> 1.6 〜 1.9
ということなのでしょうか
>>788 解決したんでもういないかもしれんが、ブラケットの中にあるパイプ '|' は
何のためにあるんだ?
or の意味で使ってるのならいらんぞそれ。
800 :
デフォルトの名無しさん :2007/06/16(土) 07:52:45
メールフォームcgiを作っているんですが、 require "cgi" と読み込んで、 cgi['name'] と取得することはできるのですが、 to_name = cgi['name'] と変数に代入しようとするとエラーになってしまいます。 どうしてこうなるのか、どうすればいいのか、どうか教えてください。
>>800 どんなエラーか書かないとわからない
cgi = CGi.new はしてるんだよね
802 :
デフォルトの名無しさん :2007/06/16(土) 07:58:36
>>800 cgi = CGI.new
より先に書いていただけでした。
どうもすいません・・・。
またすいません。メールCGIで、
sendmail.sendto( "
[email protected] " )
と書く部分なんですが、
address =
[email protected] sendmail.sendto( "address" )
と書くと、作動しません。
address = "
[email protected] "
sendmail.sendto(address)
ならOKなんですが、メアドは外部ファイルからの取り込みなので、これはできません。
sendmail.sendto( "address" ) のaddressを、
文字列ではなく、変数として認識させる方法を教えてください。
外部ファイルからの取り込みだとできないってのがわからん まあよくわからんが、eval使えば?
「作動しません」とか「動きません」とか禁止
spam屋だな 変数内容確認の方法も知らずに永遠にさ迷っとれ
ものすごく大きな勘違いをしてるようだが、、プログラムはRubyが初めて? 説明すんの面倒だな・・・ とにかくいろいろ試してみ、単純な形で解決すると思うよ
yahooのメアドに一日100件送りつけて来るのはこいつか
なんだ、スパマーだったのか
ってもしかしてクオートの中に変数入れられる変なスクリプト言語からきてる勘違いか・・・
色々根は深い 口頭で説明するのは割に合わん
> ってもしかしてクオートの中に変数入れられる変なスクリプト言語からきてる勘違いか・・・ $foo = 'bar' print "#$foo"
"#{foo}" は変だと思わんが、"$foo"は変だろ
リストに関数を適応するにはrubyではどうやってやればいいのですか? mapcarにあたるものです。
会社でrailsの案件をやることになった。俺以外rubyはつかえない。 んで、参考書を会社で買うことになったわけだが俺はネットで勉強したからどの本がいいのかわからん。 参考書も無駄に種類がでてやがって立ち読みするのも疲れた。 初心者〜上級者(になってもらわんと困る)におすすめな参考書を2,3冊教えてください。
>>817 リスト.map{|v| 関数(v) }
でリストの各要素に関数を適用した結果が返るかと
mapの代わりに map! を使うと
結果を返す代わりに直接、元リストの内容を変更する
>>819 ありがとうございます。なるほど、mapがあったのですね。
lispのmapcarやpythonのmapのように関数を渡すのとはちょっと違ってますね。
>818 とりあえず Ruby on Rails入門―優しいRailsの育て方 が上級でもリファレンスになっていいらしい が、中級以上向けな気がする 手取り足取りな入門本は、俺も欲しい
>>821 thx。リファレンスになるってのは結構でかいですね。
とりあえずrails本+入門書を何セットか買おうと思ってます。
優しい本は変なAA使ってて気持ち悪いのがいやだなあ。 ああいうのがあるからRubyが変な目で観られる。やめてほしいよ。
最初の19ページまでだよ つか2chに出入りしといて言うなよw
でかけたついでに立ち読み再会してきま
網羅的なのはAWDwR。 入門ぽいのは「はじめよう〜」 最初から上級向けがマイッハ〜 「ライドオン〜」も入門パート少なめであとあと使える印象が。
827 :
デフォルトの名無しさん :2007/06/16(土) 18:30:38
828 :
デフォルトの名無しさん :2007/06/16(土) 18:36:36
win32版の irb.bat がすごく使いにくいのですが、なんとかならいなでしょうか? 左右移動や、上下での履歴が効きません。 仕方なく、cygwin入れて、cygwin版rubyを入れて irb を使っているのですが、 そうすると、メインで使っているwin32版を更新すると (例えば、バージョンアップしたり、gem入れたりすると) cygwin版も更新しないといけなくなります。 これは仕方がないことなのでしょうか?
>左右移動や、上下での履歴が効きません。 ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] でおもいっきりできてるが。
830 :
デフォルトの名無しさん :2007/06/16(土) 18:52:47
>>829 マジスカッ!
ところで、どこのバイナリでしょうか?
うちのは、OneClickInstallerで入れたのですが
って、
>ruby -v
ruby 1.8.5 (2006-08-25) [i386-mswin32]
古かたので、新しいのいれてきまつ
831 :
デフォルトの名無しさん :2007/06/16(土) 19:13:38
げ、One Click Installer って上書きインストールできないのか・・・ mswin32版で上書きでいいのかな・・・
832 :
デフォルトの名無しさん :2007/06/16(土) 19:24:57
>>829 アプデトしましたが、駄目でした orz
irb(main):003:0> dir%%%''''%%%%%'
みたいに、変な文字が入力されます。
WindowsXP SP2 のコマンドプロンプトです。
ruby -v は、
ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-mswin32]
です。
833 :
デフォルトの名無しさん :2007/06/16(土) 19:25:31
ほほう >ruby -v ruby 1.8.1 (2003-12-25) [i386-mswin32] 古ッ!
>>824 3xページにもあるよ。あと全般的に口調もキモい。
こういうクセのある書き方はそれだけで読者が逃げること
なんで気づかないかなあ・・・・
>834 まあ、くノ一が主人公であんな技やこんな技を 継承しないだけでもよしとしようや
>832 思いつきだがコマンドプロンプトから > ruby -rreadline -e0 ってしたらどうなる?
837 :
デフォルトの名無しさん :2007/06/16(土) 22:04:45
>>836 >ruby -rreadline -e0
>
なーんも表示されません
>837 何も出なくておk つか、それでエラーが出るんじゃないかなと思ってたが外したかorz もしかしてだがWindowsの環境変数(cygwin環境外)で cygwinのディレクトリ配下にPATH通してない?
840 :
デフォルトの名無しさん :2007/06/17(日) 10:05:34
>>838 あ、通してます。
コマンドプロンプトでも、cygwinを使えるように、
c:\cygwin\bin
みたいに通してます。
これが原因だったりするんでしょうか?
841 :
デフォルトの名無しさん :2007/06/17(日) 13:22:01
ご質問です wikiを作っているのですが,cgi上ではファイル書き込みができません. ローカルでは動くのですが. 何か特別な操作が必要なのでしょうか? お願いします. OS:Redhat ruby -v:1.8.5
842 :
デフォルトの名無しさん :2007/06/17(日) 13:24:36
>>841 ディレクトリに書き込み権限は与えていますか?
apacheがsuExecで動いていいない場合は、
オーナー以外のその他に人にも実行権限を与える必要があるかもです。
707とか
843 :
デフォルトの名無しさん :2007/06/17(日) 13:33:46
>>842 ありがとうございます
書き込み実行直前に権限を与えて,
終わったら権限を奪うというのがよさそうですが
可能でしょうか?
>>843 書き込み権限を与える権限があるなら苦労しないと思う・・・
845 :
デフォルトの名無しさん :2007/06/17(日) 13:46:42
>>844 あ,そうですね・・・
権限がなかったんだ(汗
ということは前もって与えておくしかないのか・・・
846 :
デフォルトの名無しさん :2007/06/17(日) 13:52:24
セキュリティ上どうのという場合は、書き込み用のディレクトリを作ってそこだけ、書き込み許可するのがよいです。
847 :
デフォルトの名無しさん :2007/06/17(日) 13:53:15
>>846 は、 あ、あらかじめ、作っておいて、あらかじめ書き込み権限を与えておくという意味です。
848 :
デフォルトの名無しさん :2007/06/17(日) 13:57:43
849 :
デフォルトの名無しさん :2007/06/17(日) 15:07:53
>>849 Exerbを使って、dllごとgame.exeに固められている
あと、きちんとsageて欲しい
851 :
デフォルトの名無しさん :2007/06/17(日) 17:14:11
>>850 おいおい。game.exeが、60KBしかないぞ・・・・
最低でも、RubyのDLLは500Kはあったと思う。
exerb40.dllに入っているが、これはどういう技術なんだ絽
852 :
850 :2007/06/17(日) 17:37:22
ごめんよ、思いっきりウソ教えるところだった exerbではランタイム別にできるの忘れてた
>840 ちとOS入れ直してからcygwin入れてなくて、しかも使ってるRubyはASR版という状況で 検証ができんでスマンのだがorz とりあえずいっぺん、cygwin関係PATHから外してirb起動して味噌 Ruby-mswin32のreadline.soがcygwinのreadline.dllを読みに行ってる悪寒
そんな欠陥OSは捨ててLinuxをいれれば全て解決
すみません、質問させてください。 あるインスタンスから、そのインスタンスのクラスを取り出すのはどうすれば良いんでしょうか? インスタンスからクラスメソッドを実行したいのですが。
object.class
>>855 object.class.クラスメソッド
858 :
855 :2007/06/17(日) 23:46:27
>>856 ,857
できました〜
すばやい返事ありがとうございます!!
質問です。 バイナリファイルに数値を書き込むにはどうすればよいでしょうか? 例えば以下のようにファイルを作っても文字として書かれてしまいます。 num = 1 file = File.open("test.bin", "wb") file.write(num) file.close
num.to_s
file.write([num].pack("i"))
この前のyahooスパマーではないのですが、net/pop net/smtpについての質問です。 Gmailアカウントを使用し、ローカルから送信するために、 Net::POP3.auth_only()を呼んでから、Net::SMTP.start(){sendmail()}を 実行しているのですがうまくいきません。 エラーメッセージは"execution expired (Timeout::Error)"です。 他になにか処理を追加しなければならないのでしょうか?
Gmailって外からメールの送信できたっけ?
gmailってMUAで読みたいだけなのにその時点で既に設定めんどくさいんだよな 普通の対応メーラーで読み書きできるのならそのプロトコルとポートをエミュレートすればいいんじゃね SSLとか要るんだっけ?
普通のPOPが使えるはず。 確か、Gmail側でウェブから設定するのが必要だよ。
require 'open-uri'
open("
http://www.ruby-lang.org/ja/ ", :proxy => nil) {|f|
f.each_line {|line| p line}
}
上のプログラムを実行すると下のようなエラーが出ます。
ネットで調べたらProxyが怪しいのですが、Proxyのない環境で実行しています。
他に原因が分からないのでどなたか教えてください。
C:/ruby/lib/ruby/1.8/net/http.rb:560:in `initialize': Bad file descriptor - connect(2) (Errno::EBADF)
from C:/ruby/lib/ruby/1.8/net/http.rb:560:in `open'
from C:/ruby/lib/ruby/1.8/net/http.rb:560:in `connect'
from C:/ruby/lib/ruby/1.8/timeout.rb:48:in `timeout'
from C:/ruby/lib/ruby/1.8/timeout.rb:76:in `timeout'
from C:/ruby/lib/ruby/1.8/net/http.rb:560:in `connect'
from C:/ruby/lib/ruby/1.8/net/http.rb:553:in `do_start'
from C:/ruby/lib/ruby/1.8/net/http.rb:542:in `start'
from C:/ruby/lib/ruby/1.8/open-uri.rb:242:in `open_http'
from C:/ruby/lib/ruby/1.8/open-uri.rb:626:in `buffer_open'
from C:/ruby/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
from C:/ruby/lib/ruby/1.8/open-uri.rb:162:in `catch'
from C:/ruby/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
from C:/ruby/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
from C:/ruby/lib/ruby/1.8/open-uri.rb:528:in `open'
from C:/ruby/lib/ruby/1.8/open-uri.rb:30:in `open'
from D:/My Documents/NetBeansProjects/test/lib/main.rb:2
ホントにproxy無い? telnet www.ruby-lang.org 80 って打って接続できる?
接続中と出た後止まります。 ということはproxyがあるということでしょうか? FireFoxのプロキシ設定では「インターネットに直接接続する」を選んでいます。 また、http_proxy, no_proxy環境変数は設定していません。 参考になるかどうか分かりませんが、診断くんで調べてみた結果を書いておきます。 ntoska6桁の数字.oska.nt.ftth.ppp.infoweb.ne.jp 判定:(未判定) 漏れ判定:(未判定) 総合評価:?(A 以上 or 生 IP。下記参照) 疑惑 〜20%:proxy の可能性もわずかにあります。
ローカルでファイヤーウオールが邪魔してたりしない?
ウイルスセキュリティのファイアウォールを無効にしたら無事つながりました。 ありがとうございました。 できればファイアウォールを有効にしたまま使いたいので、プログラムからの接続を許可したいのですが、ruby.exeを許可にしてもだめでした。どのプログラムからの接続を許可にすればいいのでしょうか? ファイアウォールの履歴を見ると以下のようになっています。 ユーザー:SYSTEM 方向:送信 アクセス:拒否 説明:ルール不明 プロトコル:TCP(6) 送信元ポート:1047 リモートポート:80
871 :
1/2 :2007/06/19(火) 13:46:06
rdicという辞書引きプログラムを、某所にあった方法で サーバー化したのですが、 クライアントプログラムで失敗しています。 telnetでは、rdicが動作しています。 下のプログラムでも、単語をtelnetに渡して、rdicが動いているようなのですが、 rdic-client:10:in `gets': Interrupt ← n=s.gets.to_iの行 from ./rdic-client:10 rdicの仕様で、xtermの一文字目がクルクル回転するのですが、 それが邪魔をしているのかもしれません。 どのようにしたら、telnetから結果をとりだせるでしょうか。 アドバイス、よろしくおねがいします。
872 :
2/2 :2007/06/19(火) 13:57:17
>>871 つづき
(このプログラムはGPLと明言されていなかったので、
著作権についてなにか支障があったら削除します)
(telnetでポートをオープンして、ファイルハンドラsとする、ARGV[0]が検索する単語)
s.puts(ARGV[0])
n=s.gets.to_i
for i in 0...n
s.gets
$_.chomp!
puts $_
end
STDOUT.flush
s.close
pukiwikiの#contentsみたいに .htm解析して<h1>〜<h6>の見出しのリンク作成するフィルタってないですか?
874 :
デフォルトの名無しさん :2007/06/19(火) 15:19:45
>>853 「これが原因なんでしょうか?」っていう前に試せ馬鹿!っていう気がします。ごめんなさい。
試してきます。
cygwinのパスの前に、rubyのパスとおしてるけど、cygwinのパスの方を読みに行っちゃうものなんですかねえ・・・
875 :
デフォルトの名無しさん :2007/06/19(火) 15:28:16
>>853 結局、ダメぽでした orz
cygwinのほかに、perlとか、pythonとかのPATHもはずしてみたのですが、
だめぽ・・・
うちと職場二つの環境で発生するので何か法則があるはずなのですが・・・
パスを通すって環境変数PATHのこと? $LOAD_PATH のほうかな
セッション管理してるサイトから情報を得ようとしてるのですが、 w3mでヘッダ情報を見たときに Set-Cookie: FOO=a,iueo; domain=example.com; path=/ Set-Cookie: BAR={kakikukeko}; domain=example.com; path=/ Set-Cookie: BAZ=sasisuseso; domain=example.com; path=/ と複数送られているときに net/httpのレスポンスをres['set-cookie']とすると ["FOO=a,iueo", "domain=example.com", "path=/, BAR={kakikukeko}", "domain=example.com", "path=/, BAZ=sasisuseso", "domain=example.com", "path=/"] と、適切に分離されてないようです。','でsplitするのは、FOOの中にも ','が含まれるので使えません。 どのようにするのがいいでしょうか。
>>873 #contents専用のライブラリはたぶんない
HTMLを解析するライブラリを使ってスクリプト書いた方が早いよ
Hpricotかhtmlsplitあたりが便利
879 :
877 :2007/06/19(火) 19:29:11
get_fields('Set-Cookie')使えばよかったんですね。すつれいしました。
犯罪者御用達言語
>>820 亀だが、&付けて手続きオブジェクト(正確にはto_procを実装したオブジェクト)を渡すことによって
Pythonと同じようなこともできる
a = [5, 10, 15, 20, 25, 30]
p a.map(&lambda {|x| x + 1 }) => [6, 11, 16, 21, 26, 31]
Pythonのmap関数のように関数func(x)を渡して各要素をxとして処理することは標準ではできないが
ActiveSupportを入れれば Symbol#to_proc を使って
require 'active_support'
a = [5, 10, 15, 20, 25, 30]
p a.map(&:succ) => [6, 11, 16, 21, 26, 31]
とできる
>>881 > p a.map(&:succ) => [6, 11, 16, 21, 26, 31]
1.9だと標準。
なんだかんだいって、Rubyでもいろんなやりかたが増えつつあるな。 といってもPerlのそれほどではないが。
884 :
デフォルトの名無しさん :2007/06/20(水) 17:44:27
アクセッサを作りたいのですが、 class Sample attr_accessor :val def initialize(str) @val = str end end s = Sample.new(2) s.val(1) puts "val is #{s.val}" `val': wrong number of arguments (1 for 0) (ArgumentError) writeができないようです。 attr_accessorの使いかたは間違ってないと思うんですが 何がいけないんでしょ?
attr_accessorが定義するのは Sample#valとSample#val=です。
>886 俺の理解がいかんかったってことですね。 val=が解らないので炒ってきます。
s.val = 1
>>885 Perlだと、そんな感じのアクセサを定義することがあるな。
引数なしだと値を返して与えると変更みたいな。
けどRubyのアクセサは普通
def val()
def val=(v)
の2つ。当然 attr_accessor もコレに準じてる。
その例だと write が失敗してるのではなく
s.val(1) が失敗してる。
引数なしの val に引数与えてるから
「引数の数がおかしい」というエラー。
>888,889 やっと解りました。 Java歴の影響か、val=はインスタンス変数を 直接変更するようなちょっと違和感がありまして 使ったことなかった
>>890 Rubyではインスタンス変数を直接変更することは出来ない。
必ずメソッドを経由してアクセスしなければならない。
attr_accessor はそのメソッドを楽に書く方法ってだけ。
俺もruby初心者だけど役に立ったぜ!
>891 val=をメソッドと言われてもちょっと見た目が
まあねえ。普段はメソッドのようには使わないしねえ。 凝った利用する段になっていきなり「こいつは実はメソッドなんでこう書いてください」とか言われてもって感じはする。 ------------- Ruby では arr[1] = 'B' とかいう代入表記自体が既にシンタックスシュガーで、実際は irb> arr = ['a', 'b', 'c'] => ["a", "b", "c"] irb> arr.[]=(1,'B') => "B" irb> arr => ["a", "B", "c"] こういうことをしてるわけで、arr.[]=(1,'B') と書けば、obj.method(param) の形に見えんでもない。 これは hoge.hoo=10 なんかのときも同様。 実際は hoge.hoo=( 10 ) で、hoge で示されるオブジェクトの hoo= メソッドに引数 10 を渡してる。 初心者スレなのでツッコミ希望
カッコを省略できる、っていうのがRuby文法の肝なんだね。
ときとして、ピリオドも省略できる…のもね。 a=3; p a.*(4) アクセッサのセマンティックスの話も含めて、こういうRubyの変態性は 初学者にはどういうタイミングで学んでもらえばいいのだろう。
やっぱ、クラス書き出すときじゃね
「標準」よりもカッコやドットを省略してトクした経験はないんだが
括弧の省略し過ぎには注意が要るけどな。 Perl ではよく↓みたいな書き方をするが print sprintf "%f\n", rand; このPerlコードをそのまま ruby 1.8.5 に読ませると test01:1: warning: parenthesize argument(s) for future version てな感じで警告される。 この場合、最初の print と、引数の無い rand くらいは省略できるが sprintf の括弧は省略すべきじゃない。
>>894 > 実際は hoge.hoo=( 10 ) で、hoge で示されるオブジェクトの hoo= メソッドに引数 10 を渡してる。
それは10が括弧に入ってるだけで、文法的には hoge.hoo = (10) とまったく等価なんで、
例としては不適切だろう。
hoge = class Hoge; def hoo=(x) self end; new end
p hoge.hoo=( 10 )
p hoge.send(:hoo=, 10)
902 :
デフォルトの名無しさん :2007/06/22(金) 21:32:23
privateであるinitialize()をサブクラスのsuperで呼べるのは何故なんだぜ?
Rubyのprivateは、同じインスタンスからしか呼べないという意味だから。
privateはもう名前変えたほうがいいよな
>>897 何言ってるんだお前。
別に、a * 4 はピリオドを省略してるわけじゃねーよ。
ピリオドを省略してる記法だとするなら、
a + b * 10
が説明できないだろうが?
a + b * 10 → a.+(b.*(10)) b * 10 + a → b.*(10).+(a)
>>906 右結合と左結合を混合しちゃった時点でダメと気付けよ…
C++も a.operator*(4) と書けるけど、これを 「C++はときとして、ピリオドとoperatorと括弧も省略できる…のもね。」 とか言ったらアホだよね。
C++ならどんな変態記法も思いのまま。
>>905 kwsk
それでは、a * 4 はどうなってるの?
if文もピリオドが省略されてるとか言いだすんだろうか
>>910 a * 4はピリオドを省略した書き方なわけじゃないってことになってるの。
Windows上で簡単にRubyからシリアルポートを使いたいのですが 何か良い方法があったら教えてください
>>912 ほとんどの演算子は特別な形式のメソッド呼び出しです
>>913 open("com$", "rb+")
>>914 それはそうだよ?
でも、a * 4はピリオドを省略してるわけじゃない。分かる?
ピリオドの省略どうこうは、あんまり拘るところでもないと思うんだ メソッド呼び出しのシンタックスシュガーだってことが分かってれば十分だろ
>>916 たしかに。
def (obj = Object.new).+; end
しても obj +() とは呼べないもんね。obj.+() じゃないと。
つまり、2 + 3 と 2.+(3) は別物。
a * b + c と a .* b .+ c で実行結果違うしな
921 :
デフォルトの名無しさん :2007/06/24(日) 05:50:11
関数の実行に優先順位があるんです!と言いたそうな勢い
rubyで、あるクラスからメソッドを取り除くようなことはできますか。 class Foo def f(); end; end とあったときに、f()を無効化するようなことがしたいです。
>>922 class Foo
undef f
end
924 :
デフォルトの名無しさん :2007/06/24(日) 15:58:19
TCPserverとTCPSocketを使って サーバー&クライアントのプログラムserver.rb, client.rbを作りました。 サーバーのserver.rbをバックグラウンドで常駐させていないと、 client.rbで、当然Connection refused になります。 しかし、なんとかサーバープログラムを常駐させなくてもよい、 rubyプログラミングの方法はないでしょうか。 xinetdで、たとえばport番号55555にserver.rbを設定したのですが、 それでは、client.rbからserver.rbを使えませんでした。 よろしくお願いいたします。
927 :
924 :2007/06/24(日) 17:00:36
>>926 xinetdのログは↓です。
07/6/24@16:48:50: START: rubyserver pid=4529 from=127.0.0.1
inetdから起動されたプログラムは標準入出力がソケットにつながっていて、
標準入出力を相手にしてやりとりするだけでネットワーク通信が行えます。
Rubyで言うなら、STDINから入力して、STDOUTに出力すればよいのです。
ということなので、server.rbでTCPserverをつかわずにただのプログラムにし、
client.rbで、server.rbのポートをたたき、
STDOUTでserver.rbの出力を受け取ればいいのでしょうか?
clientは変える必要ない。 clientとserverの間にTCPserverがはさまって、 ソケットの入出力をserver.rbのSTDIN, STDOUTに変換してるだけだから。
930 :
924 :2007/06/24(日) 20:01:37
>>929 おっしゃる通りで、
はじめは、そのようにTCPserverをつかったサーバープログラムを組んでいたのですが、
サーバープログラムを常に立ちあげておくのも勿体無いので、
スーパーデーモンのxinetdを利用することにしました。
xinetd経由でたたくプログラムをprog.rb内で、
a=[]
a<<ごにょごにょ
print(a.size)
a.each do |l|
print(l)
end
client.rbで、
s = TCPSocket.open('localhost','rubyserver')
n=s.gets.to_i
for i in 0...n
s.gets
$_.chomp!
puts $_
end
これだと、配列aの一番最後の1要素しか出力せず、そこにひっかかっています。
どこかお気づきになるところはないでしょうか。
> print(a.size) > n=s.gets.to_i サーバとクライアントでプロトコル認識にずれがあるようだが
932 :
924 :2007/06/24(日) 20:55:48
>>931 xinetdをつかうとソケットと標準入出力をつないでくれるとあったので、
そうしたのですが、まちがっていますか?
一応、client.rb 内で p n をすると nの値は正しく渡せています。
自分が質問の意図を理解していない可能性が高いので、その点もご指摘ください。
933 :
デフォルトの名無しさん :2007/06/24(日) 21:50:31
>>924 printだと改行コードが送られないので次の行と結合してしまう。
client.rbでgetsしているのだからprog.rbからはputsする必要がある
ということなんでない?
935 :
924 :2007/06/24(日) 22:06:31
>>934 ご丁寧にありがとうございます。
prog.rbのprintをputsに変えたところ、
client.rbで配列aのすべての要素を標準出力にだせました。
改行コードのことを知らなかったので、勉強になりました。
rubyがどこにインストールされているかは調べた? /usr/bin/rubyだったり/usr/local/bin/rubyだったりで違ってるのかもよ。 パーミッションは755にするって書いてあるから合わせておいたほうがいいね。 cgi-binフォルダがあるならそこに配置しないと駄目ということもありえるね。 急がば回れで、一旦rubyから離れてPerlでHello Worldが動くか確かめてから Rubyで動かすように書き換えたほうが確実じゃないかな?
937 :
933 :2007/06/24(日) 22:32:52
>>936 ありがとうございます。
サポートしないとあるので、問い合わせはしていないのですが、
RubyはFAQにてインストール済みとあるので、
/usr/bin/rubyと/usr/local/bin/rubyは試しました。
パーミッションも、775と755を試しました。
ファイル名をtest211.cgiにしたり、test211.rbにしたりしましたが、
前者は真っ白な画面で、ソースを表示すると、<BODY><PRE></PRE></BODY></HTML>な状態で、
後者は#!/usr/local/bin/ruby print "Content-type: text/html\n\n" print "Hello World" と1行で。
Perlとかわからないのですが、Perlを先に試してみるべきでしょうか。
938 :
933 :2007/06/24(日) 22:40:32
>>936 すみません!出来ました!
>/usr/bin/rubyと/usr/local/bin/rubyは試しました。
といっていましたが、前者は/usr/local/rubyでやっていました。
/usr/bin/rubyで試してみたら、出来るようになりました。
本当に初歩的なミスで、しかも間違った報告をしてすみませんでした。
本当にありがとうございます。
939 :
925 :2007/06/24(日) 22:45:26
>>928 そっちにありましたか。ありがとうございます。
ちなみに undef は構文で、undef_method はメソッドという理解であってますか。
940 :
429 :2007/06/25(月) 06:27:24
>>430 思いついて、$stdout = File.open("xxxx.txt", "w")のwをa+にしたら解決しました(´・ω・`)
毎回閉じていたのかw
改行が複数含まれた文字列に対して、 「3行目から10行目まで取得」、「最終行から50行文取得」 というような関数を作ろうとしています。 まず、str.each_lineのブロックの中でインクリで行数を取得してから その後再びブロックで回し、if 指定した行数ならreturn文字列に結合 というような流れで作るつもりなのです。 もっとスマート方法をどなかたお願いします。
split(/\r?\n/,-1)でArrayにしてからアクセスしたほうがいいんじゃない?
String#to_aの方がいいんじゃね?
head,tailをpopen。
readlines もおわすれなく
データ全部読んでからおもむろに分割、という手順を取るものばっかなので 巨大ファイルを連続起動の場合はコストに注意
each_lineでカウントしつつ、ファイルポインタの位置をメモっておいて シーク&必要サイズを読むとか。 富豪的にやるほうが普通な気がする
そんなとこにRuby使っておいてそこに文句言うなアホ、で片付けられる例の分野だな
そしてユーザーはハイパフォーマンスなPHPへ以降と
Rubyで5〜20までの間だったら、みたいな条件文はどのように書くとエレガントでしょうか? Cとかであれば x >=5 && x <= 20 だと思うんですが、Rubyぽくない気がします (5..20).include? x だとなんか重そうです 皆さんはどうやってますか?
俺は (5..20).include? x を使うなぁ。 ついでながら、比較で書くなら 5 <= x && x <= 20 と書く。
>>951 「なんか重そう」で簡潔な書き方を控えるのは良くないよ
たいてい気にするほどの差はつかない
俺の場合は
case x
when 5..20
end
で基本的に統一してる
includeは語の順番が好きじゃないし、条件が増えると厄介
あとは between? とか。
if x in 5..20 って書けるようにして
>>955 Object#in?を定義すれば解決するぜ
標準で欲しいとは思うが
Range の include? はまさに境界値との不等号の計算しかしていない。 つまり (5..20).include? x は x >= 5 && x <= 20 と同じ意味。 下手に Ruby レベルの処理に戻ってこないぶん、 include? の方が速かったりするかもしれないよ(検証してないけど)
str = File.read_lines(5..20) ができればいいのにね
959 :
デフォルトの名無しさん :2007/06/26(火) 13:16:12
デフォルトのrequireのパスってどこに記述してあるんですか? 追加したいんです。
デフォルトの$LOAD_PATHを追加するなら環境変数RUBYLIB を設定する
>>962 レスが遅れましたが、うまくいきました。ありがとうございました。
964 :
951 :2007/06/26(火) 18:05:38
色々なご回答ありがとうございました Object#in?が一番Rubyっぽいですね Range#include?だと本来操作するべきオブジェクトが逆?というかCっぽいというか。。 速度的にも問題ないようですし、些事で標準から外れるのもアレなのでRange#include?でいきたいと思います
Base64エンコード/デコードを試してみているのですが、
ttp://ddo-jp.ddo.jp/download.php?no=6420 (DL pass "rb")
これだとテストに使ったJPEGは復号されずに壊れたものが出来上がります。
変換はpack/unpackに突っ込むだけなのでIO周りでわかっていないことが
あるのかと思っていますが…。
どこがまずいでしょうか。指摘していただけると幸いです。
見ないで言うがbinmode
>>966 $stdin、$stdoutはbinmodeしました…って言おうとして、
ARGFに触ってないことに気づきました orz
で、ARGF.binmodeする一行を付け加えたら
よくわからんエラーが出ました…
base64.rb:33:in `syswrite': Not enough space (Errno::ENOMEM)
from base64.rb:33
>>965 素直にARGVの内容を見て、open(path, 'rb')するべき
ARGFの動作はよく分からんが、バイナリだと途中で内容が切れてしまうので
バイナリファイルを読むのに使うべきではない
あと、質問の内容とは関係ないけど
・syswriteを使うのはなぜ?
・mode_tblは不要なのではないか(proc_tblだけで十分では)
・ハッシュのキーがSymbolなのはなぜ?
という点が気にかかる
>>968 syswriteは試行錯誤の名残です。
つまりIO#printに責任転嫁してみたりしてたんです。
HashのキーがSymbolなのって珍しいんですか?
わりとそんな例を見かけるもんで…
あとせこい高速化を期待して
modes_tblはif文を簡単に書きたかったっていう不精です
あとは、caseでencode, decode, none全部捕まえるよりも
Hashのリテラルのほうがパッと見でどういうモードがあるか
判りやすいかな、とかいう目算と、これまたせこい高速化を期待してです。
>>968 ARGVをeachで回して、ひとつずつ開けても
base64.rb:33:in `write': Not enough space (Errno::ENOMEM)
from base64.rb:33
from base64.rb:32
from base64.rb:31
と、$stdoutにprintするところで叱られました。出力を止めて変換だけを
するとふつうに動くので、出力が原因っぽいのですが…
RubyのErrnoはCのerrno.hのラップだと思っていたのですが、出力で
メモリが足りなくなる状況がよくわからず、解決策が浮かばないです。
どなたか知恵を貸してください… orz
>>970 自己解決しました。StringIOに突っ込んで
少ないバイトずつ取ってきてはprintしたら上手くいきました。
レスしてくれた方、ありがとうございます。
euc-jpな標準出力をだすプログラムを変更して、 jisx0213な文字を数値実体参照にして、utf-8で出力したいのですが、 ヒントになるようなモジュールを教えてください。 iconvだけでは足りませんよね? はじめ、perlで作ろうかと考え、perl質問スレで尋ねたのですが、 元々のプログラムがrubyだったので、不案内ながら、 そのrubyプログラム自体を改造しようと思いました。 マルチレスになるのでしたら、控えます。 よろしくお願いします。
JIS X 0213な文字というのは2面のこと? str.gsub(/\x8f[\xa1-\xfe][\xa1-\xfe]/n) {|x| ... } とかで最初に置換しちゃうとか。 UTF-8で出力するのに数値実体参照にする意味あるんですか? XML全般だとしたら要素名は数値実体参照に置換できないとか制限あった気が。
>>969 細かい突っ込みになるけど
>キーがSymbol
そのスクリプトの場合だと、わざわざinternするの面倒くさくないか?
>modes_tbl
proc_tbl.keysで代用した方がいいと思う
>>970 俺の方でも試してみたけど、2MB超のJpeg食わせてもENOMEMは出なかった
PCのメモリの差だろうか?
>わざわざintern まぁ二箇所ですし…。Stringより軽い…とか言いながら 実際は染み付いた性癖に近いような。 >>modes_tbl >proc_tbl.keysで代用した方がいいと思う 思いつかなかった… そうですね、確かにその通りです orz RAMは512MBっす。 45KBのBMPでも落ちました。ショボ。
メモリ破損じゃねーの? リアルに。
977 :
972 :2007/06/28(木) 01:10:25
具体的には、æ & a e l i g ; のような発音記号です。 utf-8での数値実体参照は & # 2 3 0 ; や & # x E 6 ; になります。 euc-jp では \xa9\xdc です。 数値実体参照以外に、utf-8でæを表示する術を知らないので、 やむを得ずというところです。 エディタはutf-8なemacsなのですが、 発音記号をだそうとするとjisx0213のフォントをもってきてしまうのです。 じぶんでもよくわからないので、説明になっていなくてすみません。 教えていただいた >str.gsub(/\x8f[\xa1-\xfe][\xa1-\xfe]/n) {|x| ... } を参考に、がんばってみます。 \x8f が、JIS X 0212ということなのですね。
>>977 ae1 = Iconv.conv('UTF-8','EUC-JISX0213',"\xa9\xdc")
ae2 = [0xe6].pack('U')
ae3 = 'æ'
ae4 = 'æ'
このUTF-8なæをIE7,Firefoxで表示させてみたら、全部同じように表示されました。
Firefoxからxyzzyにコピペするとæと表示されます。
IE7からだと"a"=="\x61"に化けてしまいますが^^;
iconvで指定するencodingは'EUC-JP'ではなく'EUC-JISX0213'にしないと
Iconv::IllegalSequenceが発生しました。
> \x8f が、JIS X 0212ということなのですね。
単にJIS X 0213の2面という印ですので、1面に追加された文字については個別で
判定しないと駄目ですね。
http://x0213.org/codetable/ にある対応表が参考になるのかな?
[2000]とか[2004]と書いてある文字は注意が必要みたいですね。
utf8にするんだったら わざわざ数値ナンタラにする必要あんの? とはいえ、どっかでそんなライブラリ?を見たな
Rubyってvariantっぽい型ないの? いちいち(...).to_iばら撒くのマンドクセ
ume
array0 = array1.map_with_index{ |x,i| x*i } みたいなことって綺麗にできますか?
>>982 arr1 = [10, 9, 8, 7, 6, 5]
arr0 = []
arr1.each_with_index{|val, index| arr0 << val * index }
すぐに思い付くのはこれくらいかなぁ。
array0 = (0...array1.size).map{|i| array1[i] * i} array0 = array1.enum_for(:each_with_index).map{|v,i| v * i}
>>982 (0..array0.size-1).zip(array0).map{ |i,x| i*x }
mapってのは(順番のない)集合から集合への写像のことだから with_indexってのが最初から無理があるよね
>>982 array0 = array1.each_index{ |i| i * array1[i] }
988 :
デフォルトの名無しさん :2007/06/29(金) 07:52:47
system("gnuplot xxx.gp") ってするとなんか実行出来ない。Cなら実行出来るのに
そうですか
>>983 , 984, 985
ありがと。984さん勉強になりました。enum_forを使います!
早くThread.newするんだ
つーか今のこのスレって初心者スレというより、質問スレって感じじゃない?
梅
throw :さじ
自演乙
rubiestはコードゴルフに熱中しすぎて開発効率が悪いの法則
うめ〜
1000ということで
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。