1 :
980 :
2006/05/18(木) 11:09:57 プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
宗教的な話題は禁止します。
7 :
デフォルトの名無しさん :2006/05/18(木) 11:30:14
CGI#out の文字コード変換だけど、 charset が iso-2022-jp, euc-jp, shift_jis の場合は 元の content が「日本語」で書かれていると想定できるから アレで良いかも知れないけど、 charset が utf-8 の場合は、 元の content が何語で書かれてるか想定はできないので、 NKF で自動的に変換するのはまずくないかな。
>>12 おれもちょうどcgi.rb見直してたとこなんだけど、outとかHTMLタグ生成関連って分離できねーの?
思ったより行数あるなーとおもったら、あれ取ったら半分以下になったよ。
cgi/http.rb
cgi/cookie.rb
cgi/html.rb
とかにわけて、cgi.rbはそいつらをrequireするだけにしてほしい。
cgi.rbをrequireするからおなじことでわ?
いらないときは必要な.rbだけ直呼びできるってことでわ?
21/22/23は捨てスレ ここが本スレってことで
いやここは初心者スレだから 本スレの代用なんかに使われて、ここまで荒れたら困るよ
cgi.rb一個で足りる便利さのほうが支持を受けてたとかそんなとこでは
cgi.rbはそいつらをrequireするだけのことでわ?
23 :
デフォルトの名無しさん :2006/05/19(金) 00:22:16
済みませんが、質問です。 ActiveRubyで、テキストファイルを一行位置ファイルに分割するプログラムを 書こうとしているのですが、改行コードをLFのみにすることが出来ません。出 来たファイルの改行コードは、すべてCR+LFになってしまいます。 count = 1 while gets file_name = "hogehoge" + count.to_s + ".tsv" foo = File::open("tsv/" + file_name, "w") foo.print NKF.nkf('-Lu', $_) foo.close count += 1 end どこが間違っているのでしょうか?
binmode()
既に答え出てるみたいだけど、サンプルとしてはこんな感じ chompしたり"\n"つけたりしなきゃいかんのかなと思ったんだけど 何かこれでちゃんとLFだけになるみたい require 'kconv' ARGF.each_with_index do |line, i| filename = "hogehoge#{i}.tsv" open('tsv/' + filename, 'wb'){|f| f.print line.toutf8} end
27 :
デフォルトの名無しさん :2006/05/19(金) 01:17:31
htmlをパースしてわびさび方式にしてくれるライブラリってありますか?
>>28 htreeというライブラリがそれっぽいかと思ったけど違うかも。
>>29 ども、できました。qwikのほうにhtree-to-wabisabiなんてのが入ってたんですね
>>23 ,25
ActiveScriptRuby?
ActiveStateはrubyだしてないよな。
32 :
23 :2006/05/19(金) 11:37:09
>>24-26 できました!ありがとうございます。Rubyって本当に便利ですね。
>>32 便利だけど質問と答えを見る限りは全く便利そうに見えないな。
うむ 具体的にどうとは言えんがなんかあまり便利そうには見えん
おまえら、急にw
特定の範囲のテキストを処理したい場合はどうするのが普通なんでしょう? <start> 中略 <end> の用に囲まれている部分を抜き出したり置換する場合です。
その範囲のテキストを抜き出してきたり置換したりするのが普通です。 じゃなくて、えーと、正規表現を使います、とかいう答えでいいのかな?
"foo\n<start>\nbar\nbaz\n<end>\nquux".scan(/<start>\n(.*)<end>/m){p $1}
>>38 ぜんぶ読み込んで、正規表現で抜き出す。
str = File.read('file.txt')
str.scan(/<start>(.*?)<end>/m) do
matched = $1
puts matched
end
あとは、一行ずつ読み込んで、開始パターンにマッチしたらフラグをたて、終了パターンにマッチしたらフラグをおろすという方法がある。
>>39-40 ありがとうございます
ところでそういうブロックが同じ文章中にいくつもあって
2番目のブロックだけ処理したい場合がわかりません
最初の<start>と最後の<end>が対応してしまうような
# flip-flop if (/^<start>$/=~$_)..(/^<end>$/=~$_)
>>41 2番目のブロックというのが何をさしているのかわからない。
...<start>...<end>...<start>...<end>... のようになっているだけだったら、教えられた方法でできる。
...<start>...<start>...<end>...<end>... のように入れ子になっているんだったら、もうちょっと難しいやり方が必要。
ほんとうにやりたいことは何なのかをもっと詳しく。
>>44 <start>
abcde
fghij
<end>
<start>
klmno
prqst
<end>
こういう内容の空行を含むtxtがあったとして
str = open("file.txt").read
str.scan(/<start>(.*?)<end>/m) {
matched = $1
puts matched
}
これだと
abcde
fghij
klmno
prqst
こう表示されるのですわ。
klmno
prqst
これだけあるいは最初のabcde〜だけを選択して抜き出せればってことなのですが。
>>45 よくわからんが
i = 0
str.scan(/<start>(.*?)<end>/m) {
i += 1
matched = $1
puts matched if i > 1
}
じゃだめなのか?
scanにブロックを渡さず、ふつうに<start>〜<end>にマッチした文字列の配列を吐き出させて、ゆっくり料理すりゃいいじゃん。 マッチした文字列が<start>か<end>を含んでいたら、その要素は削除するとか。
あ、マッチした文字列の途中に<start>か<end>があったら、に訂正。
>>45 ひとつ。puts だとわけがわからなくなる。 p 使え。正規表現やってるときは特に。
もうひとつ。ブロックを使ってるときに「これの2番目に出てくるやつを…」とか考えるのは面倒なのでやめとけ。
str = open("file.txt").read
matchedarr=str.scan(/<start>(.*?)<end>/m)
p matchedarr
実行結果:
[["\nabcde\n\nfghij\n"], ["\nklmno\n\nprqst\n"]]
目的っぽいスクリプト:
str = open("file.txt").read
matchedarr=str.scan(/<start>.(.*?).<end>/m).flatten
puts matchedarr[1]
抜き出したいのが2番目かどうかは実は内容によって決まるとかいうなら
配列matchedarrに対してfindやgrep使って目的の要素探せ
>>46-49 ども
45で書いたものの出力結果をどうにかして配列に入れようとしていたのですが
scanを使えばそのまま入ってくれるのですね
参考になりました。
RDocで、行頭の * が<ul>、[ ] が<dl>になりますが、これをエスケープするにはどうしたらいいですか。 バックスラッシュをつけたら、そのバックスラッシュも表示されてしまいました。
むきー! Vine の Ruby は 1.8.2 のくせに Kconv::UTF8 が定義されてねぇぇぇーーーーー!!! $ ruby --version ruby 1.8.2 (2004-11-03) [i386-linux] $ irb irb(main):001:0> require "kconv" => false irb(main):002:0> Kconv::EUC => 2 irb(main):003:0> Kconv::UTF8 NameError: uninitialized constant Kconv::UTF8 from (irb):3 なにこれ…。
>>52 1.8.4をコンパイルしろというお告げではないか?
>>52 そのRuby(多分 1.8.2 preview 2)にはまだKconv::UTF8がなかった、
というオチではないかと。
いずれにしろ最新版、せめて1.8.2にはしてもらったほうがいいと思う。
Vine Linux の Ruby、 ruby --version は 1.8.2 ってでるけど rpm -qi したら version 1.8.1 って書いてありました。
VineのRubyは確かにそうなってた VineSeedにしたら1.8.4になった
面倒なバージョンがデフォになってんなあ
>>51 試してないけど、実態参照か数値参照でやってみれ。
>>52 そういえば、使わてもらってる鯖が Vine で困ったことがあったな。
チラシの裏ここまで
適切なクラス名とインスタンス変数使ってデータ状態を表現するのと 適当な名前のハッシュ変数に適当な入れ子構造でデータ保持するのって データ書き換えたり読み込んだりという点においてはあんまご利益変わらなくね?
変数は単なるオブジェクトの器だからなあ。 どちらかというとその中身のほうが重要なんだが。
構造の決まってるコンテナオブジェクトが何重にも入れ子になるような場合は、一個そんなクラスを作って再帰的定義する方がかっちょよくね?
俺の知ってるクラスはそんな便利そうで超面白カッコいいぜなことはしてくれん(w
便利機能は自分で定義しなきゃ。 例えば中身はただの配列なんだけど、頭からウン番目までの仕様が決まってるんだったら、そこの要素だけはメソッドでもアクセスできるとか、そんな程度を定義しとくだけでもあとあと楽できるよ。
それってなんてStruct ?
うにおn
rubyでUNIXのgrep -vのような機能(正規表現にマッチしないパターンを出力する)を 作ってるんですが、どうすりゃいいかが思い浮かばないです。 とりあえず・・・ ・OptionParserで-vを定義する ・ARGV.shiftでコマンドライン引数からパターンを抜き出す。 ・パターンに[^hoge](hoge以外にマッチする正規表現)を前後からくっつける って具合でやってるんですが、上手く行きません。Rubyじゃ[^]って使えないんでしたっけ?
>>69 「うまくいかない」だけじゃ正直わかんないんだが、
Rubyに限らず[](character class)は底に含まれる文字の集合/補集合に
マッチするもんなんだけど、その辺勘違いしてるってことないか?
> ・パターンに[^hoge](hoge以外にマッチする正規表現)を前後からくっつける
ここ読むとひじょーにアヤシイんだが。
>>70 ええと、まず実装したいのは
Unixのgrep -vのような機能
・正規表現にマッチしない部分を出力
で、
http://www.ruby-lang.org/ja/man/?cmd=view;name=%C0%B5%B5%AC%C9%BD%B8%BD#a.ca.b8.bb.fa.a5.af.a5.e9.a5.b9 の文字クラスってあたりを読んだんですが・・・。
>>・パターンに[^hoge](hoge以外にマッチする正規表現)を前後からくっつける
>ここ読むとひじょーにアヤシイんだが。
正直自分でも、あやしいです。
require 'optparse'
patopts = 0
opt = OptionParser.new
opt.def_option("-i" , "case insensitive"){
patopts = Regexp::MULTILINE
}
opt.parse!
temp1 ="[^"
temp2 =".]$"
pattern = temp1 + ARGV.shift + temp2
p pattern
regexp = Regexp.compile(pattern,patopts)
ARGF.each{|line|print line if (regexp =~ line)
}
なんか分からなくて、無理矢理やってる感が。。。
[^hoge]は e, g, h, o の4文字のどれにも当てはまらない文字にマッチするよ
[^hoge]は e, g, h, o のどれにも当てはまらない文字 にマッチ
>>69 試してないけどこんなんでいいんじゃない?
pattern = ARGV.shift
regexp = Regexp.new(pattern)
while line = gets()
print line unless line =~ regexp
end
車輪の再発明することないとおもうけどな
mjk
>>76 grep -v を実装したいんでしょ?だったら行ごとでよくね?なんで改行越えが問題になるの。
・・・と思ったけど、エスパー発揮してみた。
以下は「hogehoge」以外の部分を出力するスクリプト。
str = ARGF.read()
str.scan(/(.*)hogehoge/m) do
unmatched = $1
print unmatched
end
rest = $'
print rest if rest
81 :
デフォルトの名無しさん :2006/05/23(火) 16:59:39
ハッシュオブジェクトのテストってどうするのが賢いですか。 今はinspectで文字列にしてからassert_equal()しているんですけど、 なにかの拍子でinspectの結果がちょこちょこ変わるので困ってます。 json = { :x=>1, :y=>2 } json.inspect #=> {:x=>1, :y=>2}だったり{:y=>2, :x=>1}だったり inspectがキーの値でソートしてくれればいいんですけど。
文字列にしないでそのまま assert_equal すればいいじゃない
{:x => 1, :y => 2} == {:y => 2, :x => 1} # => true
Rubyの構文木を出力するライブラリってないすか?
>>82 ,83
テスト対象となっているオブジェクトはハッシュと配列とが入れ子になっているので、めんどくさいので全体をinspectして文字列に変換しています。
もしかして、入れ子になっていても問題なく==で比較できるんでしょうか。試してガッテン。
>>86 自分でも試してみようよ。
{:x => 1, :y => [1, 2, 3], :z => {:a => [4, 5]}} == {:z => {:a => [4, 5]}, :x => 1, :y => [1, 2, 3]}
=> true
配列には順序があるので[1, 2] != [2, 1]だが、 ハッシュ(のキー)には順序が無いので{1 => 2, 3 => 4} == {3 => 4, 1 => 2}。
>>85 >>87 ありがたい。
brubyって、exerbで使われてるんだな。
もしかして、exerbってコンパイルしてたりする
どんなに複雑でもハッシュというデータ構造が維持される限りハッシュ部分はハッシュとして振舞う ブロックつきメソッド通すとハッシュから配列になることはあるけどな irb> h = { 'k1' => 'v1', 'k2' => 'v2' } => {"k1"=>"v1", "k2"=>"v2"} irb> h.find{ |k,v| k=='k1' } => ["k1", "v1"] いやまあ配列を返すってきちんと書いてはあるんだがなんか悲しい
>>91 言ってる意味はわかるが言いたいことはわからない。
1行目と2行目以降に関連性があまりないな
> ハッシュというデータ構造が維持される限りハッシュ部分はハッシュとして振舞う これがもの凄いトートロジーに見えるのは俺が変なのかな?
アイデンティティが維持される限りそれはそれであり続ける、という話だからそう珍しいわけでもない 言葉の技巧はいいからもうちょいわかりやすく喋れ、という気はしなくもないが
>>90 コンパイルはしていない
ソースをアーカイブしてローダーとRuby実行環境付けてexe化してるだけ
とりあえずオプションでソースを圧縮するかしないかを選べる
暗号化・難読化は未対応
file=open("./test.dat","r") while line=file.gets print line end file.close これってのは一行ずつ読み込んで、最後の行まで達したらその次の行でnilを返されるからwhileが終了するってのでおk?
おk
ありがと。 あと、この手のループってのはたくさん使う機会が出てくるのだと思うけど、 while使ったやり方が一番スマートって認識でおk?
んg
>>101 ・each 使うほうがいい
・ファイルディスクリプタはあんまり長い間あけっぱなしにしないのが賢いらしい
→ lines = File.readlines(filename) #これだとオープンとクローズ書かなくて済むし
lines.each do |line|
print line
end
なるほど。じゃあ初心者用にとりあえずわかりやすく説明のタメに使ってるのかな。 これからも似たような例でwhile使われてたりしたら、自分で変換してみることにします。 ありがとです。
whileのほうが直感的でわかりやすい場合はあると思う。 標準入力からユーザー入力を受け付ける場合とか。 while input=STDIN.gets.chomp do break if input=='exit' puts "#{input}さん、こんにちは!" end あるいはFile.readとかで変数として一気に格納するには ちょいと大き過ぎるファイルを相手にする場合とか。 (こっちの理由の場合が多いと思う)
close し忘れがちな漏れはこうかな。 File::foreach(filename) { |line| puts line }
>>103 > ・ファイルディスクリプタはあんまり長い間あけっぱなしにしないのが賢いらしい
巨大なファイルをフィルタリングしたくなったときに、んなことないだろと思ってIO::readしてたコードが問題になる気がしてて、
ケースバイケースなのはわかるんだけど、開けっ放しイクナイの実例が記憶にないので教えていただけると大変嬉しいです。
>>105 そこはinputじゃなくnameとかのほうが好ましい希ガス
名前として扱われる変数は名前っぽい名称で使うことを癖にしとくといい
STDIN.gets と書いてある時点で 'input' であることはわかるわけだしな。 とするとファイルでもないものに each do |line| とかline(行)を使うのは好ましくない?
ファイルポインタでもないものにfpとか使うのも好ましくないな(w
>>109 場合によるのでは。
たとえばファイル名が入ってることを想定してるならfilenameのほうが適切な気がする。
なんかのテキストデータを単に各行マッチングかけて、とかするときはlineで合ってると思う。
fpはシラネ。fはよく使うけど。それどこの文化?
C言語の解説書だと大体 FILE *fp; と宣言してる気がする。 つーか、ポインタは変数名の末尾が p で、 ポインタのポインタとかになると pp(FILE **fpp; とか)とかしてたな。 その辺の名残と思われ。
>>114 d は何の略?
Perlのサンプルソースなら、fh が多い気がする。C++ なら fin, fout が多い気がする。
split("=")とsplit(/=/)はどこか違うんですか?
わざわざありがとうございます。 見てもサッパリ分からないので、とりあえず後者を使っておくことにします。
>>115 fd はファイルディスクリプタのことだろう。
File.open('hoge.txt') はなんと呼ぶのが正しいんだろうな
>>120 できないことはするな
必要なことができないのならそもそもするな
下手糞なWebフェッチャを作る奴は全員氏ね
というかあれだ、それはHTTPについての知識が要る。
「HTTPヘッダ」とかそういうのについて勉強したのちに適切なヘッダを発行させろ。
122 :
デフォルトの名無しさん :2006/05/24(水) 19:50:08
>>120 大人しくはてなアンテナ使った方が幸せになれる希ガス
>>119 Fileオブジェクトなんだからfoでどうだろう
ブロック変数は、いつもxにしてる。
>>121 >下手糞なWebフェッチャを作る奴は全員氏ね
鯖管理者? ごくろうさま。
>>124 わざわざオブジェクトって言わなくたって全部オブジェクトなんだから、o を取って f ってことで。
>>109 より具体的な名前があるならそれをつけたほうがいい、
という話であって、代入時に自明な名前(fgetsだからinputとか)
をつけること自体は悪くないだろ。
その名前は代入時以外にも使われるんだから。
>>125 俺も{}を使った一行ブロックのときは
基本的にxで統一してるな
do〜endならだいたい名前付けるけど
おれはelementのeにしてるけど、簡単な処理なら groovyみたいに it が欲しいなと思うこともあるねぇ。
>>130 groovyは、
{ x | println x }
と
{ println it }
これが一緒ってことか
セグメントセレクタとオフセットで構成される farポインタ
it は便利なんだが、結局 Perl の $_ と同じ気がするのでやっぱりいらない。
>>107 オープンできるファイル数に制限があった頃の名残じゃないかなぁ
今でもあると思うけど
そんだけくらいですまん
引数のうち大きいほうを返すメソッドって標準でありませんでしたっけ? module Math module_function def max(x, y) x > y ? x : y end end なんてのがあるかと思いましたが、ないようです。 どっかにあったような気がしたんですが、見つかりません。
>>136 $_も意味分かるからいいと思うけど
省略可っていうのがあれだ
>>137 Enumerableモジュールあたりにmaxメソッドとかなかったっけ
[x,y].max とかできたような気が
クラスやらモジュールやらメソッドやらはリファレンスを見て覚えろとあるのですが、 書いてあることが難しすぎて分からない事が多いです。 もっと平易な表現で書いてあるものは無いでしょうか? それとも、リファレンスを読めるレベルになるまで、様々な入門サイト等で勉強した方が良いのでしょうか?
>>140 わからないことはここで聞いたらいいよ。
MLでもいいけどこっちの方が簡単。
とりあえず何をしたくて何を調べたのか。
コード書いたのならコードも可能な範囲で晒すとよい。
コードの意図も書くと尚よいな。
>>140 どういうところがわからんのかがわからんので確かなことは言えんが、おーむねYESだ。
一般に、リファレンスマニュアルは専門用語を理解した人向けに書かれている。
つか、「リファレンス読むと便利」のリファレンスっていうのは
「組み込みクラス/モジュール/例外クラス」と「添付ライブラリ」のあたりの一覧を指してるはず。
その前にある言語仕様や文法についてのところはみんなあんま読んでないと思うぞ。
この辺は解説本や初心者サイトあたりで概略つかんだほうがいい。
Web上でなら逆引きRubyが役に立つことがある
ttp://www.namaraii.com/rubytips/ マニュアルはマニュアル語を最大限理解した人にとって最大限に便利になるように書かれてるから
“普通”に読んでるだけではやたら小難しく書いてあるように感じるかもしれない
マニュアルとして記述が不足してるという場合も多々あるけどな
>>140 最初の勉強には書籍がお勧め
できれば購入した方が良いけれど、図書館で探してもいい
俺のお薦めは「たのしいRuby」
>>141-144 レスありがとうございます。
書籍の購入も視野に入れて、勉強してみます。
その上でどうしてもわからなかったら、コードやエラーコードを晒して、
添削していただこうと思います。
アドバイスありがとうございました。
147 :
デフォルトの名無しさん :2006/05/26(金) 04:09:24
Windowsタスクマネージャみたいいに全プロセス名を取得するにはどうすればいいですか?
シングル、ダブルクォテーションは混在させるのと、常にダブルで統一する方のどちらが良いのでしょうか?
用途によって違うんだからどっちも使うよ
それでは、エスケープシーケンスの使用の有無によって使い分けるという事で良いですか? それとも、もっと他の意味なども含めてという事でしょうか?
__,{ ;;,, ミミ i ´Z, ゝ ''〃//,,, ,,..`ミミ、_ノリ}j; f彡 _) 〃///, ,;彡'rffッ、ィ彡'ノ从iノ彡 >';;,, ノ丿川j !川|; :.`7ラ公 '>了 _く彡川f゙ノ'ノノ ノ_ノノノイシノ| }.: '〈八ミ、、;.) ヽ.:.:.:.:.:.;=、彡/‐-ニ''_ー<、{_,ノ -一ヾ`~;.;.;) く .:.:.:.:.:!ハ.Yイ ぇ'无テ,`ヽ}}}ィt于 `|ィ"~ ):.:.:.:.:|.Y }: :! `二´/' ; |丶ニ ノノ ) :.: ト、リ: :!ヾ:、 丶 ; | ゙ イ:} 逆に考えるんだ { .:.: l {: : } ` ,.__(__,} /ノ ヽ ! `'゙! ,.,,.`三'゙、,_ /´ 「エスケープシーケンスを使いたくない時に ,/´{ ミ l /゙,:-…-〜、 ) | ,r{ \ ミ \ `' '≡≡' " ノ シングルクォーテーションする」と考えるんだ __ノ ヽ \ ヽ\ 彡 ,イ_ \ \ ヽ 丶. ノ!|ヽ`ヽ、 \ \ヽ `¨¨¨¨´/ |l ト、 `'ー-、__
____ __,,/ _, ----`ヽ / _ ___ 、\ / / i \ \\ ,'./ i ヽ:. ヽ:.:.. ヽ.ヽ ,'/ / .ハ ヽ ヽ:.:.:.:. ヽ::.. ヽヽ |i .i i .i / ヽ ト 、 \、:.:.:. ',:.',:.:.lヽ} |i .i l :N_, -弋 \弌弋ナ:}:.:} わかりました。 |i∧ ', :{ ,ィjモト \ イjミトイイV .| :メヽ.', `ozZ} izN。ハ::{ そういう風に考えてみます。 | :ヾ_! ゝ "゙゙ ' `゙ ハ.:', | :.:_イ .:.ヽ. (二フ , イ :.:.:!:.ヽ ありがとうございました。 / rィイ | :.:.ヽ: >r/`<ノ .:.::.}ヽ、\ / ∧l;l ! :.:.:.://{二 ̄ .} ..:..::リ//ハ.:\ / .{. ',ヾ、ヽi .:.:.{ /(^` |.:.:.:.//: : :.}: . ヽ. / / ) ヽ ヾ、ヽ:.ハ ヤ{ ∧/.-‐'": : |:.:. i ', ./ .,イ .:..} : :\ヾレ'ハ ∧__ノノハヾ、 : : : l:.:.: .ハ ', { /| .:.:ハ : : :i Y {ヾ`Yヽニン'ノ}: : } : : : :/:.:.:/ }:.} V | .:.:/:.:|_,ィ' ̄ ヽ三{ `ー-ノ : イ : : :/:.:i.:{ リ ヽ:.:{、.:.V : : ヘ : : {: : :/:.::∧| ヽ! )人 : : :人 : : : / \! " ヽ : : : : :/イ{ :.ノ: : : :.\ \__///: :\______/: : : : : : : ヽ / //: : :|;|: : : : : : i: : : __: : : : ', / 、 {;{ |;| . : i/. : : : : : :| / `Y;{. . . .|;|. : : : /i: : : : : : : : :l
>>148 これはときどきみかけるけど、結局は「好きにして」としか言いようがない。
バックスラッシュ記法と変数展開の有無でこまめに使い分けるか 気にせずダブルクォートで統一するかどちらかだろう 変数が展開されるダブルクォート乱用は本来好ましくないんだが Rubyでは #{ } がないと動かないからあんま気にしなくていいな
> 変数が展開されるダブルクォート乱用は本来好ましくないんだが kwsk
>>150 式展開を忘れてるじゃないの。
ダブルクォートの時は式展開してくれるけど、シングルクォートだと式展開されないんだから。
わかってるとは思うけど%記法とヒアドキュメントでも同じことが言えるんだからね。
>155
shとかperlとかの話っしょ。 ruby では関係ない。
青木さんのコーディングスタイルから。これもひとつの考え方として。
http://i.loveruby.net/w/RubyCodingStyle.html > まず、エスケープや式展開がなく、一行のときは常に「'」。このほうが見やすいじゃないか。
> エスケープや式展開があるときは「""」にする。ちなみに、\n はできるだけ使わず puts を使うほうが好きだ。
> 「"」が文字列中に出てきてバックスラッシュが多くなるときは迷わず % 文字列を使う。
> 最後に使うのがヒアドキュメント。これを使うとインデントの最中に割り込んでくるので気持ちわるい。 <<-HEREDOC を使えばインデントはできるが、インデント部分が取り除かれるわけではないので、例えば出力するための文字列には使えない。
おれは基本的に "" を使っていて、それでややこしい時に % を使ってるなぁ。
漏れは str = Q(あほ >>#{148} , ばか >>#{151} , かわいい >>#{152}\n) とかで統一してるけど
インデント判別するヒアドキュメントもありゃいいのにね
クォートで速度が変わったりしないの?
インデントは、HTMLみたいに ひとつの空白にまとめるなんて アホな仕様にならないといいな。
>>160 変わらないこともないこともないこともないけど、
そんなの気にするよりもっと他にチューニングすべきことが山のようにあるはず。
>>162 俺のATOKタンだったら怒りそうな文章だな。
クォートとダブルクォートのどちらが速いかはrubyの最適化うんぬんで誰かのページでみたな
どっちが速いかって比べないと分からないようなものでしょうか?
素直に考えればシングルクォーテーションのほうが処理速度は速いはずだな これを気にする人は読み込み時のファイルサイズ増大を嫌ってインデントの空白も取り去ってるだろうがね
Rubyで最速を求めるのは無理な話だし、細かいところは気にしないのが吉
>>167 禿同
とりあえずyarvベースになってからだな。
YARV ベースになっても気にしないだろ。 コンパイル終わったら差が無いんだし。
>>169 あるだろ。
文字列の展開は静的な処理じゃないんだから。
文字列の展開? シングルクォートとダブルクォートの比較をしてるんだから、 文字列の展開があるようなケースは関係ないでしょ。
実はシングルクォートよりダブルクォートの方が速いという研究成果があったと思う。
実はコンパイラによって違う。というデマを流してみるテスト。
'#{value}' "#{value}" この二つだと当然スピードは変わる。 'value' "value' これらの場合はどうなんだろうね。展開しなくてもいいような文字列だから、 ''と同じ扱いをするようにコンパイルをするのか、それともそのままなのか。 そのままなら、'value'の方が速いって事になるんじゃない?
うん、そこまではみんな理解してると思う。 しかし、 > ''と同じ扱いをするようにコンパイルをするのか、それともそのままなのか。 に答えられる香具師がなかなか現れないという初心者スレクオリティ。
>>175 Stringオブジェクトにさえなってしまえば元々どうクォートされていようがその先は関係ない。
パースするとこは確実に処理が違うし、それ故速度も違う。
でも気にするほどじゃない。
俺はエスケープシーケンスや式展開はもちろん考慮するが なんとなく単語ならシングル、文ならダブルを使ったりする ハッシュのキーとかなら、なんとなく文字列でなくシンボルを使ったりする
ハッシュのキーには文字列よりシンボルの方が格段にパフォーマンス良いからね。 という都市伝説。
すみません、これ↓って何をしているのですか? attr :sgr0 同じクラス内に、@sgr0 っていう変数があるのですが、これと何か関係してるのでしょうか?
そもそもパフォを求めるのにスクプリト(なぜか変換できない)使ってんじゃねーよwwww 軽量言語なんだから、とにかく早くできればいいいんだよ。 そういや今年のLLゴンって行くやついる?
>>181 ごめんなさい。
マニュアルを見て理解不能だったので質問させてもらいました。
>>182 attr :sgr0
は
def sgr0
@sgr0
end
と同義、とそのマニュアルには書いてある
def sgr0 return @sgr0 end これならわかると思う returnをやたら省略したがるのはRubyの悪い癖
>>185 あっ!、わかりました。
hoge.sgr0で@sgr0の値が取れるということですね。
サンクス。
> returnをやたら省略したがるのはRubyの悪い癖 あったほうがわかりやすいよな。 メソッドの最後の行に変数だけ書かれてると「書き間違い?」とか思うぞ。
return を省略した方が格段にパフォーマンス良いからね。 という都市伝説。
まぁ慣れてしまうとそうでもない
現在のメソッド名を知る方法はありますか。 callerだと呼び出し元のメソッド名はわかりますが、今実行しているメソッド名は取得できないようです。
caller(0) の in `メソッド名'
イテレータブロックの戻り値を next value で書くのは好きじゃない。
よーわからんが x = bar(y, z) do ... end こういう書き方のこと?
>>189 > return を省略した方が格段にパフォーマンス良いからね。
メソッド末尾のreturnは内部的に省略されるようになったから、
ほとんどの場合変わらない。
と思ったらこれ1.9 featureだったか。
197 :
194 :2006/05/27(土) 10:15:17
>>195 いや、たとえば
(1..16).to_a.map do |x|
if x < 10
next x
else
next (?a + x - 10).chr
end
end
みたいな。
return が書ければ分かりやすい気もするんだけど、仕方ないんだろうね。
(1..16).each do |x| hoge(x) end.each |x| fuga(x) end
>>193 さんくすこ。caller()は引数をとれるんですね。
201 :
デフォルトの名無しさん :2006/05/27(土) 22:29:14
やっとruby会議のチケットとれたお。
>>201 そう かんけいないね
メ几
→木又してでもうばいとる
ゆずってくれ たのむ!!
203 :
デフォルトの名無しさん :2006/05/28(日) 12:42:09
/<a href=
204 :
デフォルトの名無しさん :2006/05/28(日) 12:44:22
/<a href="(.*?)次の/ =~ '<table border=0 cellpadding=5 cellspacing=0 width="100%">
<tr><td><small>* 分割による調整については、<a href="
http://help.yahoo.co.jp/help/j p/fin/quote/historical/his_07.html">こちら</a>を参照してください。</small></td><td
align=right><small>[<a href="t?s=6758.t&a=1&b=1&c=1980&d=5&e=28&f=2006&g=d&q=t&y=
50&z=6758.t&x=.csv">前の50件</a> | <a href="t?s=6758.t&a=1&b=1&c=1980&d=5&e=28&f=
2006&g=d&q=t&y=150&z=6758.t&x=.csv">次の50件</a>]</small></td></tr></table></td><
/tr></table></center><br>' #本来は一行です
print $1
とすると下のように延々マッチしてしまいます。
http://help.yahoo.co.jp/help/jp/fin/quote/historical/his_07.html ">こちら</a>を参照
してください。</small></td><td align=right><small>[<a href="t?s=6758.t&a=1&b=1&c=1
980&d=5&e=28&f=2006&g=d&q=t&y=50&z=6758.t&x=.csv">前の50件</a> | <a href="t?s=6758
.t&a=1&b=1&c=1980&d=5&e=28&f=2006&g=d&q=t&y=150&z=6758.t&x=.csv"> #これも出力結果は1行です
最後のリンクだけ取り出したいのですが何が間違ってるのでしょうか?
t?s=6758.t&a=1&b=1&c=1980&d=5&e=28&f=2006&g=d&q=t&y=150&z=6758.t&x=.csv
↑こういうのが欲しい
/<a href="([^"])*?)">次の/ みたいにしてみたらどうだ?
>>204 そりゃ
/<a href="(.*?)次の/
にマッチするのは
「<a href="」の次から最初の「次の」の前まで
だろ。イメージ的には。
/\| <a href="(.*?)">次の/
でどうだ。
“本文”に「|、スペース、Aタグ」の順番の文字列が出てこないことが前提だけど。
207 :
sage :2006/05/28(日) 13:09:43
>>205-206 ども
/<a href="([^"]*?)">次の/
で行けました
最短マッチで後方が指定してあれば
その直前を拾ってくれるかと思ったんですが
[^"]こいつがいったい何なのか、今から調べてきます
208 :
デフォルトの名無しさん :2006/05/28(日) 14:35:24
eclipse + rdt の環境でコードの保管が出来ない?のですが、 教えてください〜。 とりあえず、ctrl + spaceを押すと 自己定義変数名などは出てくれます。 putsなども出してくれます。 クラスメソッド名までは出してくれません。 そういう物なのでしょうか。 OS:XP eclipse 3.1.1 + rdt 8.0?(org.rubypeople.rdt-0.8.0.604272100PRD.zip)
209 :
デフォルトの名無しさん :2006/05/29(月) 03:36:26
ロリポップでeruby(rhtml)使えますか?初心者質問じゃなくてすみません。
exerbのサイトからexerb3.3.1とmswin32版バイナリ3.2.0を取ってきて exyファイルを生成し、exerb.exeを実行してみたのですが どうやら3.2.0のバイナリはexy形式に対応していないらしく unknown directiveエラーになってしまいます。 exy形式でも実行できるバイナリって、どこかで配布していませんか?
エクリプススレのほうがいいと思う。 エクリプスが、全クラスインクルードしまくってサーチしてくれるとは思えないけどな。 自己定義変数名もそのファイル内程度でしょ。
>>209 ブラウザで *.rhtml を指定したら実行されるかってことかな?
デフォルトではたぶん実行されないようになっている。
.htaccess をかけばもしかしたら使えるようになるかもしれない。
だめだったら CGI プログラムから *.rhtml を読み込むようにするしかないと思う。
require 'cgi'
cgi = CGI.new
print cgi.header('text/html; charset=UTF-8')
require 'erb'
trim_mode = 1
erb = ERB.new('file.rhtml', $SAFE, trim_mode)
print erb.result(binding())
214 :
210 :2006/05/29(月) 23:11:30
>>213 ありがとうございます!
これから落として使ってみます
使ってみてから返事書けよ 取り急ぎのお礼なんていらねーって
結局、Matz(Ruby作者)が、日記でカルト宗教の宣伝をやっている件につ いては、どうなったんですか? もう下火ですか?
テンプレから、カルト宗教日記を外す提案は、どうなったのでしょう?
しかしRubyの進むべき方向を見定めるには教祖様のお告げは不可欠
>>216-218 スレを間違えてはおられませんか?
本スレでは、そんな話で盛り上がっていたようですが
ここは初心者スレですので
どうなったのか、と聞かれても、別にそういう話題は扱っていませんよ
220 :
デフォルトの名無しさん :2006/05/30(火) 15:19:10
class Foo def initialize @child = Bar.new(self) end end class Bar def initialize(parent) @parent = parent end end こういう関係の二つのオブジェクトを作る時、子オブジェクトに親オブジェクトがどれかを伝えるには newメソッドにselfを引き渡す他に方法はないでしょうか 例えばクラスの継承関係をあらわすancestorsメソッドのように 生成元オブジェクトを表すようなメソッドや変数は存在しませんか?
>>220 クラスの親子関係とオブジェクトの親子関係をごっちゃにしている。
class Foo < Bar はクラスの親子関係を表しており、ancestorで調べられる。
インスタンスオブジェクトには基本的に親子関係はない。あるのは他オブジェクトへの参照のみ。
それを人が見て親子関係だと見なしているだけ。
繰り返す。オブジェクトには親子関係はない。
もし、newにselfを渡すのが面倒くさいというだけなら、次のようにするとよい。
class Foo
def initialize
@child =Bar.new
@child.parent = self
end
end
class Bar
attr_accessor :parent
end
222 :
:2006/05/30(火) 19:10:48
>>221 レスありがとうございます。
ちょっと、意図をよくご理解いただけなかったようですが
子クラスから親クラスを参照するように、というのは喩えとして出したまでのことです。
またparent、childなどのプロパティを設定したのも、設計上のものであってクラス継承を意図したものではありません。
要は、あるオブジェクトA内で、別のオブジェクトBを生成するときに、
AからBに明示的にselfなどの情報を伝達する他に、BからAを特定する方法はないか、ということです。
Bar.parentをattr_accessorで定義してしまうと
Bar外部から自由にparentが書き換え可能になってしまうわけですから
設計上はあまり好ましいことではないですよね。
この種のプロパティはread onlyにするのが普通だと思いますので。
ですから、それより他に手がないということであれば、new(self)で生成時に自分自身への参照を送るしか
ないのかな、と思うのですが、newメソッドに他に引き渡すべきデータがあるときには、new(data, self)とか
なっちゃって、どうもあんまり美しくない気がするんですよねえ・・・
ないんじゃないかな。 美しくない気がする理由もよく分からない。
>>222 Object#instance_variable_setを使えば、Bar#parentなしでできる。
class Foo
def initialize
@child = Bar.new
@child.instance_variable_set("@parent", self)
end
end
>AからBに明示的にselfなどの情報を伝達する他に、BからAを特定する方法はないか
ない。わかるのは、メソッド呼び出しの関係ぐらい。
caller()を使えばメソッド呼び出しの情報はわかるが、そこにはクラスの情報が含まれていない。
方法はないように思えるので、美しくないけど我慢してください。 呼び出し元のBindingを取り出す方法があればいいか、とか思うんだけどね。 なんとなくこんなの思いついたけど、事実上何も変わってない。 class Foo def initialize @child = Bar.new{self} end end class Bar def initialize @parent = yield end end
$STACK = [] set_trace_func(Proc.new do |event, file, line, id, binding, klass| case event when "call" $STACK.push(eval("self", binding)) when "return" $STACK.pop end end) class A attr_reader :b def initialize @b = B.new end end class B attr_reader :owner def initialize @owner = $STACK[-2] end end a = A.new p(a.b.owner)
>>227 すごいことはわかったから、多少なりとも解説をいれてくれ。
ここは初心者スレだ。わかるやつだけわかればいいという、まるでRubyのリファレンスマニュアルみたいなのは勘弁。
っていうかわかるやつにしかわからんからわからんやつにわからせようとするだけむだとさとったきょうこのごろ
232 :
227 :2006/05/30(火) 23:00:23
>>227 の内容は、メソッド呼び出し時に self を保存していって、
後からその self の履歴をさかのぼって参照する、というものです。
$STACK = []
class A
def initialize
$STACK.push(self)
@b = B.new
$STACK.pop
end
end
class B
def initialize
$STACK.push(self)
@owner = $STACK[-2]
$STACK.pop
end
end
a = A.new
p(a.b.owner)
これは
>>227 と似たようなことをやろうとしているもの。
上記でいちいち push して pop しているところ、
組み込みメソッドの set_trace_func を使うことで、
その push pop を一カ所にまとめて書いています。
set_trace_func の詳細はリファレンスマニュアルを読んでください。
set_trace_func以外は特に難しいことはしていないつもりだけどどうかな。
それってスタックにしたのは何か意味があるの? $STACK = self @parent = $STACK でも同じ? スタックにしてすべてのオブジェクトの生成を監視した方が 汎用性が高いってこと?
>>233 A以外からBオブジェクトを生成しないと仮定できれば、それでも良いですね。
>>232 に書いたように、各メソッド内でselfを管理してもそんなに違いは
無いんですよ。ただ、いちいち書くのが面倒で、Rubyには便利なメソッドが
用意されているのでそれを使おう、これに尽きます。
全てのメソッド呼び出しを管理しているのは今回は成り行き上なのですが
(管理するselfを選別するほうが面倒そうですし)、
A -> B -> (なにか) -> A -> B -> ... などのネストにも対応できるので、
便利といえば便利だと思います。
でも元はといえば222の設計が悪いだけだと思っている。
でかいテキストファイルを一発でreadlinesするとメモリを圧迫するので注意 と何かに書いてあったけど 小分けにして何度もファイルの入出力を行うのもマシンの負担となると何かに書いてあった かといってファイルを長時間開きっぱなしにしたまま一行ずつちまちま処理するのもあまりよろしくないようで 一般的にはどうするのが最良とされているのでしょうか たとえば何万行もあるcsvファイルの3列目の値が"HOGE"となっている行だけを抽出して新たなcsvファイルを作りたいときとか
小分けで入出力しとけばOSが適切なサイズでバッファリングを行ってくれると期待する、というのはどうかな。
5Mくらいまでなら一気に読み込んじゃうなぁ。 100M超なら切り分けて読み込むけど。
誰もそんなことは聞きたくないと思われ
テキストファイルで行ごとに処理するなら、File#each_line でいいじゃない。
>>237 は「俺がどうしているのか」を聞きたいのではないだろう
grep使って出力もらったほうがrubyより速かったりして
一般的には、最適な方法を選択するのが最良とされています。
じゃあRubyの出番ないなー
このお題だとそうだね。
「てきとーにgrepやcutしていたシェルスクリプト」をRubyで書き直すとたいていワンテンポ遅いな
モルモン♪
ここが rubyist.net だったら
>>249 を消してやるのに!
251 :
237 :2006/06/03(土) 22:38:42
>>238 なんだか無難な感じですね。参考にします。
>>239 大変参考になりました。
>>241 それだとファイル開きっぱなしになるのでは?
>>244-248 まあ、そういわずにRubyを使う前提でよろしくお願いします;
あと、シェルスクリプトとかgrepとかcatとかの話もunixをまったく知らないのでご勘弁ください…なにぶん初心者なもので…orz。
ファイルが開きっぱなしで困るってのは、他のプロセスからのアクセスを 考慮してのことだと思うんだけど、同じスクリプトからのアクセスだったら 排他制御をしっかりしとけばいい話だと思う。 そうでないとしても、本当にそんなことを気にする必要があるのかな。
253 :
237 :2006/06/03(土) 23:27:27
>>252 >本当にそんなことを気にする必要があるのかな。
ハイ、まさにそこなんです;
一般に言われている「〜の場合には〜した方がよい」的なのがあれば、変なクセが付く前にその定番的手法を身につけておきたいっていう気持ちがありまして。
このへんに関して特に一般論が存在せず「お好きなように」ということであれば、気にせずreadlinesなりファイル開きっぱなしでeach_lineなりで処理したいと思います。
別にreadlinesでもeach_lineでもいいんじゃねーの それが変な癖であって何か問題が生じるということに気づいたら それを修正していくことで段々ノウハウわかっていくんだから 最初から定番的方法だけ効率的に覚えていこうなんざおこがましいってもんよ
一般論は存在しないだろうね。 一気に読み込んだほうがいい場合もあるし、一行一行処理した方がいい場合もある。 何のためのプログラムなのか、どんなとき使うのかを考えれば どうやるのがベストかは自ずと分かるような気がする。
>>254 世間様に氾濫する「俺流プログラミングテクニック」が矯正されてるかというとあんまそうでもないことを鑑みるに
最初から「正しく」覚えるのは学習コストの面から言っても悪くない選択だと思うぞ
Rubyの場合は「どう書いてもたいてい正しいし趣味レベルではたいして変わらん」というのが少なくないけどな
悪いコードがなぜ悪いと言われるのか説明出来てこそ良いコードを書く資格があるというもの そのために失敗の経験をすることは無駄ではない 経験があることで初めて最初から悪いコードを避け良いコードを書くことが出来る 良いコードだけ都合良く覚えようなんて虫が良過ぎる
>>257 俺も無駄とは思わないけど
そんなに暇あるわけじゃないし
良いコードを都合よく覚えてなんの問題があるというのか
よほどの天才以外はどうせそれでも失敗するんだし
特に独学だと、それが悪いということにすら気が付かない可能性もある。 始めから良いコードに揉まれるのも良いと思うがね。 Perl の KENT 厨や、PHP 使いなんか見ると特にそう思う。
>よほどの天才以外はどうせそれでも失敗するんだし それならいいよ 良いコードを都合よく覚えると失敗しないと思ってる馬鹿がいるからね
小姑の論理だな 楽は許さない 自分と同じに苦労せよ
KENTって駄目ソースなの? 読みやすいし、初期のころはセキュリティホールになるだろって 言うコードもあったけど、最近はいいんでない? スクリプトに生の管理パスワード書かせる仕様はやめた方がいいと思うけど。
>KENTって駄目ソースなの? >読みやすいし、初期のころはセキュリティホールになるだろって >言うコードもあったけど、最近はいいんでない? 読んだの? 評判だけで判断するより読めば分かる話だよ。
265 :
sage :2006/06/05(月) 01:00:59
はいはいこんな低レベルなスレ覗いてる時点で同類なのに何をいがみ合うことがあるのか。 まあでもどちらかというと、暇がないのに、効率を気にしているのに、 こんなスレ覗いてる香具師がアホっぽいな。 あといきなり細部に拘るようなプログラマは概して使えないと思われ。 ファイル操作のとこだけ鉄板教えてもらってあとどうするつもりなんだこいつは。 教えて君が一生許させるなら別にいいが大抵はそうじゃないんだぞ。
生パスは馬鹿除けでしょ。本当はMD5エンコードぐらいさせるべきだし。 まともな香具師ならKENT使わないし、自分で最低限エンコードハックぐらいするでしょ。 何万行もあるならその時点でperlやrubyって選択肢は無いね。プロトタイプぐらいは作るかも知れないけど、最終的にはCで組む。面倒だから最初からCで組むなあ。
>>265 > ファイル操作のとこだけ鉄板教えてもらって
じゃあファイル操作のところだけは鉄壁になるな。
いい癖がつくことはいいことだ。
きっとモジュールの利用も否定派なんだろうな こんなもの使ったら身にならないとか本質がわからないとか言って コードの再利用がありえるのならコーディングスタイルの再利用があってもいい
>>266 >何万行もあるならその時点でperlやrubyって選択肢は無いね。プロトタイプぐらいは作るかも知れないけど、最終的にはCで組む。面倒だから最初からCで組むなあ。
おれなら逆だな。何万行にもなるプログラムだからこそPerlやRubyで書いて、行数を減らす。
これをCで書いたら大変すぎ。Cで1万行になるコードはスクリプト言語だと千行で済むから、大きいプログラムほどスクリプト言語で書いて楽をする。
そして、本当に速さが必要な部分だけをCで書く。
>>269 Cで構造化プログラミングしてないんですか?
272 :
sage :2006/06/05(月) 09:19:55
>>269 状況にも因るかな。
→人間が楽したい(させなければいけない)OR機械に楽させたい(させなければいけない)。
何万行もあるならってのは、読み込む対象のファイルが何万行もあるってことでない?
rubyで何万行も読み込んだら、速攻kernelにkillされてアボーンするよ。
んなこたぁない
irbで何万行も読み込んだら、速攻Segmentation faultでBUGにされてアボートするよ。
それは行数じゃなくて容量の問題じゃないのか?
>>267 File::(open|read|write|close)する部分は実アプリだとごくごく一部だけどな。
まあ教えてやってよ。鉄板コードを。その都度。
>>263 たとえばどんなとこが駄目なの?
おれが敢えて挙げるとすれば、グローバル変数がやたらと多いくらいしか
不満はないんだけど、他にはどういうところが良くない?
巷でよく使われているスクリプトの中には、絶望的なくらい汚いソースの
ものもあるけど、KENTってかなりましな方だと思っている。
下と比べて叩いて喜んでる場合じゃないと思うが
だよなー。それほどまでに KENT を擁護して何か得るものがあるとは思えないし。
>>280 そりゃそうだ。
勝ち負けの話じゃねえんだから。
べつに負け惜しみって勝敗についてだけ使う言葉じゃねえよな
この頭の弱さになんか可哀想になってきた
まあせいぜい頑張って KENT みたいなコードが書けるようになれよ。
ruby廚は無駄な再生産はしない。 わざわざkentライクなもの作るくらいならrorで作る。 なんでもperlで済ませようとするperl廚とは違うよ。
KENTのコードは汚い これだけはガチ
KENTでPerlの勉強をした。 Rubyはお手本がないから困る。
Perlerが糞コードばっかり書くのはKENTがお手本になってるからなのか
誰が悪いってわけでもないけどな
悪いお手本なら無い方がマシなので Ruby ユーザは恵まれてるよな。
KENT的なコードは収斂の結果だと思う 適当に書くとそうなるってことはその利用感覚が「普通である」証拠 「凡人が普通に適当に使う」と足元を撃ち抜く仕様であるというのなら それは言語作者やモジュール作者が気を遣うべき箇所だと考える …Perlくらい有名なら「定型動作しかしないがガチガチにセキュアなネット利用モジュール」とか 誰か作ってそうなもんだけど
KENTってどっかのサイトで、10年前のような糞コードの塊とか言ってさらされてたなー。 どこだっけか。
perlってああいうもんだと思ってたんだけど、そうでもないの? perlの綺麗なソースっていうと、たとえばどんなのがあるかな。
今時のperlはこういうのを覚えとけって言うページがあった。 10年前の大学生のようなコードかくなっていう記事。 前にこのスレでも見かけたのだがどこだったか。
use strict と use warnings だかなんだか最初から使ってプログラミングしろというのは聞いた覚えがある
こんだけケント・ベックを貶すってこのスレの住人は一体何様だよ、と。
有名だから嫉妬?
ユタ州イナカジャナイヨ!
304 :
デフォルトの名無しさん :2006/06/07(水) 22:19:19
相談です。 プログラム始めようと思い人に相談すると、最初はRubyを進められました。 で、参考書買おうと思いますが、何かお勧めを教えてください。 達人プログラマーガイドというのが、評判よさそうですが、玄人向きですよね。 (相談した人はあまり参考書に詳しくありませんでした)
どもです。 会社の環境と学びやすさから勧められました。 ある程度マスターしたらJavaに進んで、それからは自由に。 という感じ。 はじめたらまた来ますね。
rubyの場合、言語仕様の前にオブジェクト指向の説明が入ってそれを理解しないとうまく使えないのが問題。 オブジェクト指向って、ふっと発想の転換でアハッするものだしねえ。
というか、この本品切れですか…。 amazonはアホみたいな値段ついてるし。
>>307 それは非オブジェクト指向の経験があるからでしょ
最初からプログラミングとはこういうもんだよ、
つって覚えれば、発想の転換なんて必要ないだろ
オブジェクト指向って苦労するのは、転換が必要なときであって
最初からそれで覚えるなら、そんなに難解ではないと思うんだけど、どうよ
同感だね オブジェクト指向むずかしいって言う人しばしば見かけるけど 個人的にはオブジェクト指向になんら違和感は覚えなかったし むずかしいって言う人は非オブジェクト指向からの乗り換えに苦労した人ではなかろうか というか俺はいまだにポインタとかの方が難解だと思う
>>307 >>305 だと133ページまでロクな解説は出てこないから安心しろ(w
それまでは「なんかドットの後ろにやらせたいことつけるらしい」程度の理解でいいし
なんならずっとその程度の理解でもいい
>>311 それだよ
「なんかドットの後ろにやらせたいことつけるらしい」ってのに気づいたとき
急にRubyがわかるようになった
>312 それって、VBすら出来なくないか?
漏れはポインタは理解出来た香具師だからオブジェクト指向のほうが苦労したけどな。 CPU的にどう動くのか理解できなかった。
さいですか
カプセル化や継承がわかんないうちは、オブジェクト指向が理解できたとはいわない。 と思う。
ポインタ理解できたらオブジェクト指向も理解しやすいんじゃ。 ポインタなくて非オブジェクト指向系の言語からの乗換えが一番大変な気がする。
「オブジェクト指向が理解できた」ってのは「C言語マスターした」と同じくらい間抜けな概念だと思う
カプセル化や継承がオブジェクト指向に要ると思ってるうちは、理解できたとはいわない。 と思う。
321 :
320 :2006/06/08(木) 13:08:37
我ながら言ってることがおかしいな。 要るっちゃあ要る。けど必須ではない。くらいか。
クラス継承が出来ないとほとんどのオブジェクト操作が使えないんだけどね。
> ポインタなくて非オブジェクト指向系の言語からの乗換えが一番大変な気がする。 Rubyユーザは、Perl から乗り換えたタイプの人が一番多い気がする。 一応 Perl はOOPLだけどさっ。
Rubyとは直接関係ないけど、プログラミングの質問。 ファイル名はfile、ディレクトリ名はdirという変数をよく使うんですが、 ファイルでもディレクトリでもどっちもとるような変数を何にするかでよく困ります。 ディレクトリもファイルの一種というのがUNIXの設計だそうですが、 一般的な間隔だとファイルとディレクトリ(フォルダ)は別のものだと思うんです。 で、「ファイルまたはディレクトリ」を表すような適当な用語を知らないんで、 もしなんかいい名称があれば教えてください。 変数名重要。
path
file_or_directory
むしろfileという名前が色々使えるのが困る File.open(file){|file| file=file.read } とかどれも違和感ないもの
>>326 pathか。。。path。。。path。。。
なんか、pathだとfileともdirectoryとも違う、微妙に別の概念のような気がするんですが、そんなことないですか。
>>327 それはちょっとやだなあ。file_or_dirもなんかかっこわるい。
せっかくのアドバイスに文句いって申し訳ない。
>>328 そうなんですよね。
・ファイル名
・ファイルオブジェクト
・ファイルの中身
のどれもfileで表しそうだから、それぞれ
・filename
・f
・content
とかにしてます。
「ディレクトリエントリ」で e とか「ノード」で n とか。
ストリーム
>>330 でいいんじゃねーの?
つか、ファイルもディレクトリも取り得る変数ってどんな状況?
>>333 ディレクトリをopen()してread()しているときです。
ディレクトリの要素はファイルかもしれないし、ディレクトリかもしれない。
>>331 エントリかあ。それもいいかも。
336 :
304 :2006/06/08(木) 22:27:40
けっきょくのところ、305の本以外には学ぶに値する本は無いってことですか? 下手に本買うならネットで学習したほうがよい?
>>335 pathだな
どうせそのあとファイルなのかディレクトリなのか調べるんだろ
そのときRubyリファレンスでは、
> File.directory?(path)
> FileTest.directory? と同じです。
ほらpathだ、と言おうとしたら
> FileTest.directory?(filename)
> filename がディレクトリの時、真を返します。
こっちはfilenameだった・・・orz
339 :
デフォルトの名無しさん :2006/06/08(木) 23:42:20
>>338 いえ、尼では品切れみたいで手に入りにくそうなので、
他のよさそうなのをお尋ねしているのですが。
>>335 (広義の)file でいいんじゃねーの?
regular fileもディレクトリもデバイスファイルその他も「ファイル」なんだし。
でもディレクトリ名もファイル名も含むのはパスだしなあ。 漏れもfile_or_directoryがいいとおもう。
>339 しいて買うなら、Rubyプログラミング基礎講座、かな。新しいし。 たのしいRubyは半分以上がリファレンスみたいなものだから、一通り読んだらなくてもかまわないんだが、 PC版HTMLヘルプがすこうし使いづらいんで、紙のマニュアルが手元にあるとはじめのうちは心強い。 >プログラム始めようと思い 配列・文字列・正規表現・ファイル入出力とかある程度できないうちは、他の本よんでもなあ。 とりあえず、本買う前にrubyco(るびこ)の日記とRubyistMagazineでも読んでみそ。
>>343 > 新しいし
そういう理由で物を勧めるな
>>347 そうなんだよ、Rubyプログラミング基礎講座、この本つまらんよな
教科書みたい
なんつーか実際にやりたいこと(目標・目的、最初は高望みイクナイ)があって、 それをどういうふうにプログラムにすりゃいいかっていうがプログラムを書くために肝心なところであって、 そういうのはあんまり本で読んだことないんだけど俺は。 俺の場合UNIXシェルプログラミングとかの本で、入力に対してif ;then;else;fiとか globしてwhileしてgrep|sort|awkしてとか、そんなののほうがわかりやすかったよ。 ちょうどそのときテスターで入ったとこがHP-UXで処理結果ファイルからシェルでサマリ出したりとか してたんで目標があってモチベーションが高かったから理解できたんだと思っている。 Rubyもその昔静的にRDからHTMLに吐く日記ツールをなんとなく必要に迫られて作って使ってたから今それなりに使えてる。 つまり、自分のニーズに合わないサンプルなんかで勉強しても身に付かない 目標、目的もないでは、モチベーションが低いのでプログラミングは学習できない、と言いたい。 なので、目的があるならそれを書いたら誰かピンポイントな本を知ってるかも知れないよ。 それはRuby本じゃないかもしれないけど。 Rubyに限らず要件を満たすための手順をどうプログラムに変換するかっていう 考え方の壁だけ越えればあとはだいたい大丈夫だしほとんどの言語は使えると思うんだけどな。
>>349 「水流をやわらげ、水はねを防ぎます」まで読んだ
>>347-348 > あわせて買いたい
> 『Rubyプログラミング基礎講座』と『恋するプログラム―Rubyでつくる人工無脳』、どちらもおすすめ!
これはどうよ。
>>351 Rubyの入門書としてはいかがなものかと。
結局、ロクな書籍は無いってことでおk?
プログラミング初心者にRubyを薦めるのがアフォ
煽りとしては疑問だが独学に際してのサポート力という点では正解だな
日本語でおk
>>355 掃いて捨てるほど書籍のあるPerlのほうが好ましいともいえる
それらの書籍が掃いて捨てられる程度のプログラマを量産してるわけですね
本は数じゃなくて質だろ。Javaみたいにクソな本がたくさん出てるより、一冊でいいからまともな本があればそれでいい。 初心者には「たのしいRuby」、中級者以上にはウサギ本でOK。
RubyはTIPSを知らなくても使いこなせる言語だから本は要らないって感じ。 なんつーかPerlのように使いこなしの「コツ」みたいなのは特になくって 技術的な知識あればマニュアルがすらすら読める感じ。
つ【レシピ本】
技術的な知識がないとマニュアルをすらすら読むのは厳しい。厳しすぎる。
技術的な知識ってつまりクラスとかメソッドとか マニュアル読めるレベルの予備知識ね。 Java/C++を使えるなら、すらすら掛けるまで3日とかからないはず。
レシピブックは良書。
a,b,cと3(n)個の要素があった時に、 全通りの組み合わせを出力するにはどんなやり方が賢いですか? a-b-cとc-b-aは区別しますし、a-a-aや、a-aも出力したいです。 nは最大でも10程度なので、簡単なアルゴリズムで良いと思うのですが。
>>366 arr = ['a', 'b', 'c']
arr.each do |x|
arr.each do |y|
arr.each do |z|
puts "#{x}-#{y}-#{z}"
end
end
end
module Enumerable def repeated_permutation(n) if n == 1 each {|x| yield [x]} else each do |x| repeated_permutation(n-1) do |y| yield [x] + y end end end end end ary = [1,2,3,4,5] ary.repeated_permutation(1) {|a| puts a.join("-")} ary.repeated_permutation(2) {|a| puts a.join("-")} ary.repeated_permutation(3) {|a| puts a.join("-")}
>>367 ,368
うわ、さすが綺麗。
ありがとう
a,b,cと3(n)個の要素があった時に、 重複しない全通りの組み合わせを出力するにはどんなやり方が賢いですか? a-b-cとc-b-aは区別します。 a-a-aや、a-aは出力しません。 1,2,3 のときは 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 の6通りを出力です。
これってどっかの宿題だろ。どうみても実プログラムで困ってるとは思えん。 def f(arr) arrの要素eについて繰り返す arrからeを取り除いたものをarr1とする arr1が空なら print e, "¥n" そうでなければ print "#{e}-" f(arr1) end end end まずは自分で考えような。 で、Rubyの宿題を出すような学校ってどこ?
マルチのようだが微妙に質問内容が変わってるな 今度のの方が簡単になってる
マルチ指摘するなら、そっちのスレも教えてくれよ。
マルチじゃねえや このスレのすぐ上だった
うへ、366で俺が質問したのだれかがパクって371で質問してやがる。
これはひどい自演ですね
Subject: [ruby-list:42388] Rubyカンファレンスのレポート記事を公開させていただきました 貴社のの力不足により,事例を中心とした一部のご紹介にとどまってしまいましたこ とをお詫びいたします。 貴社じゃおかしくないか?
弊社だね
貴社で正しい可能性もなきにしもあらずだが間違えてると考えるほうが妥当だな そしてスレ違い
記者の変換ミスくらい目をつぶろうよ……。
なるほど、記者の間違いなのか。弊社との間違いだと思ったよ。
それもなんかおかしい。 他人事のように感じる。
387 :
デフォルトの名無しさん :2006/06/14(水) 20:34:52
ループの上限を無限にすることってできるんですか? 調べてみたけれど見つかりません… ある条件を満たす最初の正の整数を求めたいんですが、 今は、 1.upto(10000000000000) { } と適当に大きい数を上限にしていますが、 上限を無しで、条件を満たしたらbreakにしたいのです
while true do end
loop do end
390 :
デフォルトの名無しさん :2006/06/14(水) 22:00:42
>>388 ,389
ありがとうございます
やっぱそうなりますか
schemaか何かで
ループの範囲で 0..
って書いてたのを見たので
>>389 がRubyっぽいと思う
i=0
loop do
break if calc(i)
i=i+1
end
と
i=0
until calc(i) do
i=i+1
end
のどっちがカッコイイかはよくわからない
STDIN.each { p $. }
>>391 ループからの脱出個所が1箇所だけ(untilのとこ)なら後者
ループからの脱出個所がbreakとかreturnとかでたくさんあるなら前者
静的にRDからHTMLに吐く日記ツール見てみたい。うpしといて。 当社じゃないの? おまいらビジネスマナー研修すら受けてない?
もし内容の不都合があるとしたら、それはまず自分自身だという意味で「記者」って書きたかったんでしょ。 つか、書いた本人が「弊社の力不足」なんて言ったら、それこそ他人事みたいだ。
Rubyでperlで言う なんとか or die みたいなのをやるのってどうするんでしょ
begin resume ensure end
>>396 ああいう妙に便利な感じにはできない
できると便利だと思うんだがRubyには輸入されなかった
>>396 なんとか or raise "ほげほげ"
なんとか or die オブジェクト指向的じゃないような
Rubyにもor演算子あるから、 f = open('file') or raise "error" とかけるよ。
開けなかった場合、FALSEじゃなくて例外が発生するから、or dir みたいな書き方は出来ない。
私のjcpadの宿題を全部やってくれる所はありませんか?
>>402 なら rescue 演算子で良いんじゃないの?
「なんとか」がエラー時に例外を発生させるもので、エラーに乗じて何かメッセージを出したい場合 なんとか rescue(STDERR.puts "エラーだよ: #{$!}") begin なんとか rescue => err STDERR.puts "エラーだよ: #{err}" end 「なんとか」が自作でエラー時にfalseを返すものである場合 なんとか or raise なんとか or raise('姉さん事件です') …これは「なんとか」の中で素直に例外を発生させてくれ dieほどお手軽便利なものはないな 事前の用意がご面倒でも範囲を指定して待ち構えて例外を捕捉するのがRuby流なんじゃないかな
>>395 一人称が「記者」って見慣れないな。
「筆者」なら見るが。
この場合素直に「私」でいいとオモタ。
>>396 openでdieしたいだけならRubyではエラーの場合ほっとけばその場で自動的にdieすっから何もしなくていいぞ。
例外時デフォルトでor dieするRubyは先進的だなあ。
>>406 筆者ってああいうレポートの場合にも使うの?
あと、「私」は私的な印象が強い感じがする。
弊社を使うと他人事に感じるという感覚が俺には分からん
いいかげんしつこいよ
だって「記者」って仕事は特別だから。
スコープがよくわかりません 下のような一括してテキストの一部を置換するスクリプトを書きましたが この場合グローバル変数を使う以外に方法がないのでしょうか? グローバル変数は使ってはいけないように言われている気がするのですが file = Dir.glob("./*.html") file.each {|t| File.open(t) {|f| content = f.read $ncontent = content.gsub(/aaa.ne.jp/, "bbb.ne.jp/") } File.open("./2/" + t.gsub(/.\//, ""), "w") {|f2| f2.write($ncontent) } }
「ブロックのそと」で有効だった変数は「そのブロックの中にあるブロックの内部」でも有効 ブロックの外でも利用したい変数があるならブロックが開始される前に代入して存在させておけばよい なんとなく気持ち悪いがこれは仕方がない file = Dir.glob("./*.html") file.each {|t| ncontent = '' # File.openのブロックの外で利用したいので File.open(t) {|f| content=f.read ncontent = content.gsub(/aaa.ne.jp/, "bbb.ne.jp/") } File.open("./2/" + t.gsub(/.\//, ""), "w") {|f2| f2.write(ncontent) } } っていうかいろいろ変だな aaa.ne.jpの正規表現はきっと望んだ形ではないだろうしf2はfでよかろう
>>411 3行目に、"ncontent = nil"とすればグローバル変数を使わずに住むし、File.openでブロックを
使わなくてもグローバル変数にする必要が無い。
ただその程度のスクリプトならグローバル変数でもかまわないと思う。
スクリプトはちゃちゃっと書いて、さっと動かすもんだし。
>>412 わかりました、どうも
確かに気持ち悪いですね
aaa.ne.jpは書き込み時に適当に書いてしまいました
正規表現が身に染みこんでいないので適当か不適当かまで
考えてなかったです
415 :
411 :2006/06/15(木) 20:49:28
>>413 > ただその程度のスクリプトならグローバル変数でもかまわないと思う。
確かに(^_^;
でもやっぱり気になりますね
Cの宣言みたいな物だと思っておけばいいのかな
files = Dir.glob("*.html")
files.each {|file|
replaced = String.new
File.open(file) {|f|
content = f.read
replaced = content.gsub(/aaa\.ne\.jp/, 'bbb.ne.jp/')
}
File.open("./2/" + file, "w") {|f|
f.write(replaced)
}
}
>>413 スコープを理解できないという理由でグローバル変数を使うのは危険で無駄
ん?ブロックの終わりでローカル変数のスコープが終わるってわかってるから グローバル変数にしたんじゃないの?
スコープの範囲の利用の仕方を理解すると、
書き捨てスクリプトでもグローバル変数を使う機会はまずなくなるな。
普段のスクリプトを書くときも書き捨てを書くときもたいてい同じ書き方になる。
>>417 スコープの範囲というかスコープの扱い方を知ってるかどうかだと思う。
ブロック前に変数に代入しておくとか、そういうことをたまたま知らなかっただけでは。
>>412 でグローバル変数をローカル変数にするメリットが全然わからんのだが・・・
いや、議論するつもり無いんで読み捨ててください。
421 :
419 :2006/06/15(木) 21:07:02
ちなみに俺も
>>412 のように書くから。
でもそれはプログラマとしての強迫観念のなせる業であって、俺自身なぜローカルにするのだと
聞かれると答えられないんだよね・・・
>>419 スコープという安全装置のないグローバル変数を使わずにすむ
まああれだ、どんな小さなスクリプトでも必ずクラスを作ってスクリプトの最後に
Hoge.new
の一行で実行させるとかそんな細かい手前勝手ポリシーの一種だと思ってもらえれば
>422 更に初期化子に何でもかんでもさせるんじゃない!! という強迫観念にとらわれた漏れなんぞは hoge = Hoge.new # initializeにはできるだけ「初期化」に関わることしか書かない。例外上がるようなのも書かない hoge.setup # 例外が上がるかも? な「初期化」はここ hoge.do_work # お仕事本体 とわざわざ分ける……意味ねーって? いいじゃねーかヽ(`Д´)ノ
なんでグローバル変数が駄目と言われるかというと、使いやすくて便利だからだな goto文みたいなもんだ
>>423 あんまりいくない。
おまじないを強要させてるだけ。
そのクラスを使う側のことも考えろ。
>>423 読み出し順間違えて、はじょうしそうだなw
USB メモリで実行できる PortableRuby みたいなのってある? インタプリタだから、あると面白いと思うんだけど。
>>411 そういうときはIO.read
Dir.glob("./*.html") {|t|
content = File.read(t)
content = content.gsub(/aaa\.ne\.jp/, "bbb.ne.jp/")
File.open("./2/" + t.sub(/.\//, ""), "w") {|f2|
f2.write(content)
}
}
>>427 USB メモリにインストールすればいいだけ。
そこがRubyのいいところでもあるな。必要なディスクスペースは10MB前後。 それに対してPerlは100MB前後。その分ライブラリが充実してるとも言えますが。
>>427 俺の場合、USBメモリにrubyを放り込んだ上で
NYAOSとJmEditorを入れて簡易開発環境にしてる
NYAOSのおかげで環境変数設定の手間も要らないぜ
本当はRDEを使いたいんだけど
RDEはレジストリ使ってるみたいなので断念
>>426 > 読み出し順間違えて、はじょうしそうだなw
はじょう?
波状?
PerlにあってRubyにないようなライブラリで、主なものってのはどんなのがある? 自分がほしいものとしては、これといって思いつかないんだけど。
そういう意味のライブラリじゃないけど、諸文字エンコーディング間のコンバージョン。
あんま初心者スレで聞くようなことでもないな
「はじょう」は、わざと読み間違えて ←なぜか変換できない ていうアレと同じロジックだよ。
>>438 ごめん。破綻のことを言ってるって全然わからなかったorz
a href="
http://なんとか " ではなく、
a href="なんとか" という文字なときに処理をしたいのですが、
以下のような感じでできました。
ちょっと、冗長です。
もう少しスマートにできまないでしょうか?
if !(line =~ /<a href="
http:/ ) and line =~ /<a / then
441 :
440 :2006/06/16(金) 23:44:20
444 :
440 :2006/06/17(土) 01:14:03
そのまま、条件式でやってみますた。
line.gsub!(/(<a href=")([^"]*")/) do
head = $1
url = $2
if $2 =~ /^
http:/ then
head + url
else
head + "
http://ほげほげ/ " + url
end
end
>>442-443 わお。
いろいろやり方ありますね。
参考になります!
URIライブラリないんだっけ?
446 :
440 :2006/06/17(土) 01:16:46
448 :
デフォルトの名無しさん :2006/06/17(土) 18:48:59
すみませんが、質問です。 どこかに、Rubyに関する高橋メソッドのプレゼンテーションがありました。 内容は 「Rubyはひとつの書き方を強制することはない。 行末のセミコロンや、引数の括弧をつけることも許す。 プログラマがRubyに習熟するにつれ、自然によりRubyらしい エレガントな記述に導かれていく」 という感じのものでした。 URLを忘れてしまいましたので、ご存知の方、お教えいただけませんか?
>>423 俺ならここまでやるかな
class Hoge
def setup!
setup
return self
end
end
Hoge.new.setup!.do_work
451 :
450 :2006/06/18(日) 03:18:51
でもやっぱりsetupはinitialize内でやると思うけどなぁ……
個人的に bang method の後に method chain するのは見た目に違和感があるなあ。
失敗したときに nil が返ってくる仕様なメソッドが多いからねぇ。
初心者スレということで敢えて聞いてしまいますが initializeで例外発生したときにそのインスタンスいぢって大丈夫なんだっけ? (よくあるでしょ、初期化子が完了しないとインスタンスに触れただけであぼーんな言語)
>>454 initialize で例外発生したらインスタンス取得できないと思ふ。
ぜったいにだめというわけではない。クラスの定義しだい。 initializeはたんなる初期化のメソッドにすぎないから、initalizeで失敗したオブジェクトは 「initialize()が完了しなかったオブジェクト」以外の何者でもない。
458 :
455 :2006/06/18(日) 15:09:21
あり?俺が思いっきり初心者か。 initialize で例外発生したときのそのインスタンスってどうやって取得するの?
>>458 def initialize
$a = self
raise
end
>>456 は知ったか
460 :
457 :2006/06/18(日) 15:21:53
いやいや、俺らが知らないだけかもしれないし。
本気で
>>456 のレス待ってますから。
煽りじゃないよ。
>>460 てか、その前に、
>initializeで例外発生したときにそのインスタンスいぢって大丈夫なんだっけ?
initilalizeで例外発生したときに、そのインスタンスを弄るというのは
どんな状況か答えろ
462 :
457 :2006/06/18(日) 16:16:37
俺につっかからないでくれよ。俺も
>>458 と同じ認識だよ。
俺の知らないRubyの深遠が覗けるかもしれないと思ってるだけだよ。
463 :
457 :2006/06/18(日) 16:18:19
ああ、俺は
>>454 じゃないよ。
ななめから口はさんだだけです。
少なくとも通常の使い方ではないな スタンス間違ってそうな気もする
465 :
デフォルトの名無しさん :2006/06/18(日) 16:59:33
p Time.now.to_f
http = Net::
HTTP::start (host, port)
p Time.now.to_f
CGIから↑のメソッドを呼び出すと毎回約20秒かかっているようです
普通のrubyスクリプトだと1秒もかかりません
原因分かる人いませんか?
OSは? httpdは? CGIはマルチプロセス?モジュール?
467 :
デフォルトの名無しさん :2006/06/18(日) 17:18:33
OS: Linux httpd: Apache 1.3 CGI: マルチプロセス です
468 :
側近中の側近 ◆0351148456 :2006/06/18(日) 17:47:27
(っ´▽`)っ やあ☆RubyがあるってことはSapphireもあるの?
Rubyの次はPeridotじゃないの?
470 :
455 :2006/06/18(日) 19:12:28
Matz 日記で既存の仕様に縛られて動きが鈍くなってくるから、 Emerald とか作ろうかと冗談半分で言ってたことがあったような?
コテに返事返す阿呆の集まるスレはここですか?
473 :
448 :2006/06/18(日) 23:04:12
>>449 遅くなりましたが、ありがとうございました。読み返してみて、
Rubyが初心者でもすぐ使える理由は、まさにこれだと思いました。
474 :
454 :2006/06/19(月) 00:28:12
やあ知ったかが戻ってきましたよorz 皆さん申し訳ない。初期化中に例外投げるなってどっかで習い覚えた気がしてたんだが 改めて調べたらC++のバッドプラクティスの話だったようで。 スレ汚し失礼しますた。
えええっ! そんなことどこに書いてた? デストラクタの間違いじゃないか?
>>476 そのページの内容は糞。
しかも、デストラクタ内での例外に関する説明は嘘八百。
Hash#mergeとHash#updateとHash#merge!の違いが覚えられない 一発で思い通りに動作した覚えがない ってゆーか、このへんのリファレンスマニュアルもうちょっとだけわかりやすく書いてくれ 何度読んでもピンとこないぞ
479 :
デフォルトの名無しさん :2006/06/19(月) 23:33:59
>>478 hash1 << hash2 のようなもの
hash1をhash2の内容で*更新*(hash1は変わる)
hash1.update(hash2)
hash1 + hash2 のようなもの
hash1とhash2を*混ぜる*だけ(hash1はそのまま)
hash1.dup.update(hash2)
hash1.merge(hash2)
字面は混ぜるだけのはずなのにhash1が書き換わる危険なメソッドがmerge!
つまりupdateと同じ動作
こんな理解でどうだ
っていうかハッシュ同士の演算って定義されてないのな
なんで?
>>477 読んだが、糞というほど間違っては居ない。お前が糞
bang methodだから、merge!でhash1が変更されるのは自然
そういう話でもないと思われ
>>482 まてまて、そういう切捨て方はよくない。
>>481 あの考えでは、標準C++ライブラリやSTLはバッドノウハウだらけなんだけど、それはどう思う?
それから、あの考えだと、コードがポインタだらけになりかねないんだけど、そうれはどう思う?
Effective C++は読んだことある?(読んでるからえらいって言ってるわけじゃないよ)
スレ違い
読んでるからえらいってことはないが読んでないなら糞だな
デストラクタでの例外送出の禁止は、もっと強く言うべき、ってこと?
>>485 2版、3版共に読んでるが何か?
Cマガジンの記事はコンストラクタで絶対に例外を投げるなと言ってるわけではないだろ。
投げるならちゃんと後始末をしろ、しないなら投げるな。と書いてある。
事実、チームで開発する場合、全ての人がそういう精神を持っていないことは明白。
何が間違っている?
デストラクタは例外投げたら完全に死ぬってのが抜けてるだけだろ。
EffectiveC++の表現だけを神聖視して、
ちょっとでも違う表現を何でもかんでも糞扱いするのは低脳の証。
スレ違い
で、Rubyでは、 デストラクタで例外出していいの? コンストラクタで例外出していいの? コンストラクタで自分自身をグローバル変数に保存していいの?
>>489 しかし、あの記事を読んで、「コンストラクタで例外をスローするのはバッドノウハウ」と
思考停止してしまうのはいかがなものか。
>>489 コンストラクタでは初期化は行わず、initializeメソッドを常に用意し、呼び忘れを
防ぐために必ずfactoryメソッドを用意する。
これのどこが「賢い」やり方なんだ?これこそが、無駄にコードを複雑にする
バッドノウハウだろうが。
あの記事の代わりに、Effective C++にあるような、例外が起こる可能性がある
オブジェクトを、安全にコンストラクタ内で初期化する方法を載せといたほうが
よっぽどまし。
デストラクタの件は、「例外は絶対に投げちゃいけない」だ。
それ以外の説明は糞。
>>492 例外処理を使えない、使わないプログラマとで働くのは嫌なものだが、なあに、かえって免疫力がつく。
495 :
デフォルトの名無しさん :2006/06/20(火) 11:43:17
スレ違い
まぁ、引数付コンストラクタが氾濫する世の中で、コンストラクタで初期化しちゃいかん つーのは変だわな。
ネットワークエラーとか、ファイルオープンエラーとかは出しちゃマズイだろうけど newがこける状況なら回復しても悲惨だから許容する。 致命的な場合だけは投げるというポリシーで良い。
498 :
デフォルトの名無しさん :2006/06/21(水) 00:59:08
>498
>CGIから↑のメソッドを呼び出す
どんな風に呼び出すん?
#!/usr/local/bin/ruby
require 'net/http'
def get_head_code(host,port)
stime = Time.new.to_f
http = Net::
HTTP::start ('www.ruby-lang.org',80)
head = http.head('/')
ftime = Time.new.to_f
[stime.to_s, ftime.to_s, head.code,host].join("\n")
end
puts "Content-type: text/plain\n"
puts get_head_code('www.google.co.jp',80)
exit
WindowsXP Apache/2.0.58 ASR1.8.4.2 ADSL1.5M だけど1秒もかからんなあ。
#=>
1150847371.265
1150847371.765
302
www.google.co.jp
俺はRubyを始めて実質3時間のド初心者だが、スレタイ読めない奴が低脳か文盲なのは理解できてる。
>>477 ,481,482,485,487,489,492,493あたりが低脳な連中だな。
つーか
>>491 の回答が気になるので、エロい人、教えておくれ。
>>501 何を持ってOKというか分からんが、
可能かどうかで判断するとすれば、
×デストラクタで例外出していいの?
○コンストラクタで例外出していいの?
○コンストラクタで自分自身をグローバル変数に保存していいの?
になると思われ。
グローバル変数に保存は使い道が思い浮かばないがね。
ですとらくたとかこんすとらくたってなんだろうと思うオレはRubyをシェルスクリプト的にしか使っていない
>>502 そもそもファイナライザはあってもデストラクタはないもんな。
>>501 ファイナライザで例外出すのは可能なんだけど
>ObjectSpace.define_finalizer | proc の呼び出しで発生した大域脱出(exitや例外)は無視されます。
Rubyではオブジェクトを明示的に破棄しないし、いつGCされるかわからないし、無意味。
グローバル変数に保存するのは、自分でしなくてもどっかですればいいだけだから、悪手だと思う。
コンストラクタで例外は必要なだけ出していいと思うよ。
>>501 もともtRubyの話から発展した話題だから、そう目くじらたてんでもいいだろ。
現に君は
>>491 の内容に対して判断がつかなかったんだろう?
ああ、そうかくとまた変にとられそうなんで付け加えておくと、Rubyは特に特殊な 言語じゃないんで、他のOOPLと同じように判断すればいいってことだよ。
C++での善悪を論じてるのは馬鹿でよい
一番馬鹿なのはC++でコンストラクタから例外を出しちゃいけないから、 Rubyでもそうだと思い込んだ奴。
他のOOPLが疑似オブジェクト指向だから、真のオブジェクト指向のrubyでは戸惑う罠。
真のオブジェクト指向ならコンストラクタ内で初期化処理するのは当然だろ
いや、問題はその次のステップでね
次のステップて何?
右足を軽く前に出す
そして右足が沈む前に左足を
右足に寄せるとみせて
右足のアウトサイドでボールを右に
転がしたと思ったら自分の左脚につまづいて
こう言った。「俺柳沢」
クラスって言うのが何のためにあるのかわかりません 実用的なプログラミング時に何のために、どんなときに使ったりする物なのでしょうか?
ファイルをフォルダごとにまとめるようなもんだ
全ての処理がsqrt(x)関数のように副作用も何もなければクラス定義など不要だが そうでなければ構造体を定義したり、それに関連する関数を作ったりとか、 クラス定義に類似した作業が結局必要になる。
よくわからなけりゃ 「関連する関数とかをひとつにまとめておく入れ物」ぐらいに考えときゃいい その点ではモジュールも似たようなもんだが クラスの場合は「その型のコピー(インスタンス)をたくさんつくることができる」 そして「各コピーごとに変数とかを保持することができる」 というのがポイントだ 他にも継承とかいろいろあるけど まあ最初のうちはこんなもんだろ
型を表すオブジェクトがクラスだと思う あってるか知らないけどこの理解で特に困ったことはない プログラム自体もあまり知らないなら タイヤキ(インスタンス)とタイヤキ作るときの型(クラス) という理解で十分だと思う
コンストラクタで例外云々は、 オブジェクト指向ってよりGCがあるかないかの問題だろう
意味不明
freeしなくてもリークしないってことだろうけど C++でもbad_allocが飛ぶような状況って ミドルウェア側の致命的な問題やヒープの破壊など、 どうせ検知してもエラー吐いて落ちることしかできないありさまだよ。
527 :
デフォルトの名無しさん :2006/06/21(水) 23:22:57
#!/usr/bin/env ruby
require 'net/http'
print "Content-Type: text/html\n\n"
p Time.now.to_f
http = Net::
HTTP::start ('www.2ch.net', 80)
p Time.now.to_f
res = http.get('/')
p res.code
ブラウザからCGIとして実行すると
1150899495.98265 1150899516.2025 "200"
1150899563.27309 1150899583.4663 "200"
1150899615.03507 1150899635.2512 "200"
1150899647.47004 1150899667.6945 "200"
こんな感じでだいたい20秒かかる
なんで?
みやびちゃんのおっぱいが小さすぎてすいません
528 :
527 :2006/06/21(水) 23:31:51
名前解決っぽい IPだと1秒かからん
急に質問されても答えられないよ。
>>528 パケット覗いてみれば 名前解決かはっきりするんじゃね?
はっきりしても直せるかは知らんが。
>>527 >みやびちゃんのおっぱいが小さすぎてすいません
これは何だ
ここはロリコンの巣窟?
おっぱいが小さすぎて謝ってるんだから、ロリコンじゃないんじゃない? で、みやびちゃんって何?
フィルタの働きをするコマンド hoge.exe があるときに、 rubyスクリプトから hoge.exe の標準入力に文字列データを渡して hoge.exe の標準出力からの処理結果を再び rubyスクリプトで受け取りたいのですが 上手いやりかたはありますか? ret = `hoge.exe` だとデータを渡せないし、 io = IO.popen('hoge.exe', 'w') io << data だとデータを受け取れない・・・
っ 双方向パイプ と言いたいところなんだが、.exeとか言ってるからWindowsなんだろうなあ。 微妙。 ruby aaa.rb | hoge | ruby bbb.rb とかでいいんじゃん?
io = IO.popen("hoge.exe", "r+") io << data io.close_write nanika = io.read io.close_read
537 :
534 :2006/06/22(木) 15:20:11
おおおおお、できました! 聞いてみて良かったっす(T_T) ありがとうございます!
>>536 今さっきputsしたあとgetsで刺さるので悩んでたよ。
サンクス。
ruby -e 'i = 1; print "%02d" % i' こういう技を覚えたのですが ruby -e 'i = 1; j = 2; print "%02d %02d" % i, j' だとエラーが出ます。変数2つの時はどう書くんでしょ?
% [i, j]
printf "%02d %02d", i, j
>>543 あー、( )をつけるのが面倒でprintfを使うのをさけようとしたんですが
rubyでは省略できるんですか
( ) がなくても解釈が1通りに定まりそうな場合は省略しても適度に解釈してくれる [ ] や { } がそばにあって見にくい場合は省略する人も多い
antidojinをexerbで作ってた人は def func arg1, arg2 p arg1, arg2 end なんつーような書き方してた。
括弧省略すんの普通かと思ってた
関数的に使われるメソッドは省略することはあるけど 包括関係がわかりにくいから基本的には省略しないのが「普通」な気がする Rubyのパーサ(だっけ?)はメソッドの引数の数を知ってるから 明示的なカッコがなくてもひと目でメソッドと引数部分を区切れるけど 人間の目は引数をいちいち考えて 「これはこのメソッドに渡ってこれも渡って」 とか考えないといけなくて却って不便だと思う
そこで改行ですよ
引数の数多すぎやねん
括弧省略する/しないについては↓が参考になるかも
ttp://jp.rubyist.net/magazine/?0014-Hotlinks#f29 > *29 括弧 : collect/map 対立以外にも、Ruby コミュニティには括弧を省略す
> べきでない派と省略できるところでは省略すべし派の対立がある。須藤さん
> は省略しない派だが、ささだは省略する派。省略する派をささだ以外見たこ
> とがないのだけれど。ちなみに、優先順位の影響などがあるために、完全に
> 括弧を排除した Ruby スクリプトを書くというのは結構難しい。
----
>>548 > Rubyのパーサ(だっけ?)はメソッドの引数の数を知ってるから
> 明示的なカッコがなくてもひと目でメソッドと引数部分を区切れるけど
そんなことはやってない
546、547、552を総合すると、antidojinを作ったのはささださん=547?
普通に考えてそういうのはお里が知れないように 普段の自分と違うコーディングスタイルをとるもんなんじゃないの?
電波強い人がいますな
そういうスレですから
print Dir.glob("./"+ ARGV[0]) として、引数にhtml\*.htmlを与えると、最初の一つのファイルしか表示されません。 ディレクトリ内のすべての.htmlを表示したいのですが、何まずいのでしょうか? mswin32 rubyです。
>>558 cmd.exeかなにかわからんが、そのコマンドラインをrubyに渡す前に展開してるのが原因。
展開されないようにシングルクォーテーションで囲んで渡せ。
なお、mswin32版は良く分からんが、パス区切り文字は/を使ったほうが良い。'html/*.html'を渡せ。
>>559 その通りでした
くくった所、期待通りの挙動
/も参考にさせていただきます。
外部コマンドに 標準入力からデータを与えて 標準出力 (実行結果) を得る 方法が分かりません。 入力を与えて出力を捨てるなら open('|command', 'w') {|f| ... } 入力を与えずに出力を得るだけなら `command` で済むのですが、両方を同時に実現できるのでしょうか?
そんなのの解決法が立ち読みしたレシピ本にあった希ガス
つい最近このスレでそんな話があった希ガス
564 :
561 :2006/06/23(金) 21:28:56
565 :
デフォルトの名無しさん :2006/06/23(金) 23:14:50
rubyというよりはアルゴリズムに関する質問なのですが、配列の要素をある数だけ 組み合わせた配列を求めるにはどのようにすればいいのでしょうか。 個数(n)と配列(a)が入力され、r==a.sizeとすると、出力は、nCr個の配列がでる感じです。 出力の順序や、計算時間、オブジェクトがコピーされるのかなどはいまのところ気にしていません。 例をあげると以下のようになります。 p kumiawase(2,[1,2,3,4]).map{|x| x.sort}.sort => [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] 4C2=(4*3)/(2*1)=6 6個の配列が出る。 p kumiawase(3,["a","b","c","d"]).map{|x| x.sort}.sort => [["a", "b", "c"], ["a", "b", "d"], ["a", "c", "d"], ["b", "c", "d"]] 4C3=4C1=4 4個の配列が出る。 よろしくお願いします。
しゅくだい?
567 :
565 :2006/06/23(金) 23:58:41
>>566 宿題ではないです。独学でrubyを勉強しています。
再帰をつかっていろいろやっているのですが、うまくいきません。
↓n=1以外で変な結果が出る失敗例
def kumiawase(n,a)
kumiawase2(n,a).map{|x| x.sort}.sort.uniq
end
def kumiawase2(n,a)
n==1 and return a.map{|x| [x]}
r=[]
a.size.times{|i|
b=a.dup
x=b.delete_at(i)
r<<kumiawase2(n-1,b)
}
r
end
nCr = {n-1}Cr + {n-1}C{r-1} を意識してみながら、書いてみた。 yield を使ってブロックで処理するのと、yieldを使わないでふつーの再帰で処理するの class Array def combination(r) if r == 0 yield [] elsif r == size yield self else x = (ary = dup).shift ary.combination(r - 1){|y| yield [x] + y } # self[0] を含む ary.combination(r){|y| yield y } # self[0] を含まない end end end [1, 2, 3].combination(2) {|c| p c } def kimiawase(n, a) case n when 0 return [[]] when a.size return [a] else x = (ary = a.dup).shift return kimiawase(n-1, ary).map{|y| [x] + y} + kimiawase(n, ary) end end p kimiawase(2, [1, 2, 3])
うちでは 99.36 が返ってきました
573 :
565 :2006/06/25(日) 13:48:24
>>569 ありがとうございました。
シンプルにかけるものですね。
非常に勉強になりました。
うちも99.36が表示されるなあ とりあえず p response で #<Net::HTTPOK 200 readbody=true>が返ってきてることを確認して p response.body で目的のHTMLファイルが送られてきてることを確認したあと ローカルにそのファイルを保存しておもむろにirbを起動し file=File.read('index.htm') としたあと p file.scan(/<td><span class="onedown"><b>(.*?)<\/b><\/span><\/td>\s*<\/tr>/m) して正規表現に誤りがないか確かめる かなあ
575 :
571 :2006/06/25(日) 14:13:13
576 :
572 :2006/06/25(日) 14:20:38
うちのは古いけど ruby 1.8.1 (2003-12-25) [i386-cygwin]
577 :
574 :2006/06/25(日) 14:47:31
~$ ruby -v ruby 1.8.2 (2005-04-11) [i386-linux] ぶっちゃけそんなのはどうでもよくて、データがどのように扱われていったか手と目で確かめろって 不具合が出る部分があるならそこを自作スクリプト上で極力絞り込め バグかどうか考えるのはその部分が判明してからだ
>>577 しかしあんな短いスクリプトでミスが起きるはずがないだろ
15,124.04 ruby 1.8.4 (2005-12-24) [i386-mswin32]
なるほどなるほど。
>>575 で動かすと何らかの理由で
Content-Type: application/x-www-form-urlencoded
をサーバに送ってないな。
require 'net/http'
response = nil
Net::HTTP.start('www3.nikkei.co.jp') {|http|
header={'Content-Type'=>'application/x-www-form-urlencoded'}
response = http.post('/nkave/data/index.cfm', 'yyyy=1950&mm=1&dd=11',header)
print response.body.scan(/<td><span class="onedown"><b>(.*?)<\/b><\/span><\/td>\s*<\/tr>/m)
}
これなら99.36が表示されるはず
添付ライブラリのバグだと思う
RubyでDLLって作れますか? exerbなんかで、exeは作れるみたいですが・・・
>>581 DLLは作れない。
COMなら作れる。
DLLも作ろうと思えば作れるんじゃないかなぁ。 誰もその仕組みのものを作ろうとしないだけで。
やっぱり、組み込みRubyで組み込んで間接的にDLL作るしかないかな・・・
exerb の exe にしても ちょっと違うんじゃないの? ってシロモノだからなぁ
kwsk
587 :
デフォルトの名無しさん :2006/06/27(火) 11:10:17
流れをぶった切って質問です。 $ ls /tmp/ sqlite.rb test.db $ cat sqlite.rb require 'rubygems' require_gem 'sqlite-ruby' # db = SQLite::Database.new('test.db') # 1 # db = SQLite::Database.new('./test.db') # 2 # db = SQLite::Database.new('../tmp/test.db') # 3 # db = SQLite::Database.new('/tmp/test.db') # 4 上記のスクリプトで、# 4の場合のみエラーが出てしまいます。 $ ruby sqlite.rb /usr/lib/ruby/gems/1.8/gems/sqlite-ruby-2.2.3/lib/sqlite/database.rb:117:in `open': unable to open database: /tmp/test.db (SQLite::Exceptions::DatabaseException) from /usr/lib/ruby/gems/1.8/gems/sqlite-ruby-2.2.3/lib/sqlite/database.rb:117:in `initialize' from sqlite.rb:7 1.sqlite-rubyで絶対パスを扱うことはできませんか? 2.バージョンによっては可能なのでしょうか? Railsのconfig/database.ymlで相対パスで書いていても、 勝手に絶対パスに直されてしまうのでエラーが出てしまって困っています。 @@環境 ruby 1.8.4 (2005-12-24) [i386-cygwin] sqlite-ruby 2.2.3 sqlite 2.8.17
/tmpがない、または書き込み権限がない、というオチ? ls -ld /tmp してみよう。
インスタンス変数に、protected属性みたいなのってないんですか? 自作クラスに dup 書くときによく感じるんだけど、インスタンス変数を コピーするためだけに、attr_writerを指定するのって良くないですよね。
>589 どうも勘違いしてるみたいだが 元々Rubyのインスタンス変数には可視性なんてない。 言うなれば全てprivateみたいなもん。 attr_系がやってる事はpublicな変数を定義してるのではなくて 【インスタンス変数にアクセスする為のpublicメソッドを定義】している。 具体的に言うと attr_accessor :name は def name return @name end def name=(val) @name = val end と同じ。だからこの場合なら protected :name :name= とやれば多分望みに近い動作になるはず
591 :
590 :2006/06/27(火) 18:02:01
ゴメン最後のところ、protected :name=
592 :
589 :2006/06/27(火) 18:55:29
>>590 了解です。
attr_* はただのシンタクスシュガーで変数には
直にアクセスは出来ない仕様になってるんですね。
教えていただいたように、protected なメソッドで
アクセスすることにします。
しかし、そのprotectedは本当に求めるprotectedなのかね?
594 :
589 :2006/06/27(火) 23:12:20
本当に求めているものかどうかは、よく分からないです。 とりあえず現状では十分な感じですけど。 言語によってprotectedの動作が異なるって言うのは なんとなく知っていたけれど、それぞれの細かい違いは 知らないし、実用的なソフトを作る上でどれくらいの影響を もたらすものか分かんないです。OOPは奥が深い(気がする)。 その内じっくり勉強しようと思ってるけど、なかなかその内がやって来ない。
>>588 > /tmpがない、または書き込み権限がない、というオチ?
> ls -ld /tmp してみよう。
1,2,3,4は全て同じパスを見ているのですが・・・?
>>595 なんでsqlite3を使わないのかと小一(ry
>587 みてみたけど sqlite-ruby はあんま大したことしてなくて、けっきょく sqlite_open を呼んでるだけっぽいな。 コマンドラインで sqlite /tmp/test.db とかはできてる? あと、なぜいま sqlite2 ?
>>596 あぁ、3だとできるんですね。
どうもありがとうございました。
まあ当たり前。 sqliteはrubyのコンパイル時からやり直しでもしないと、rubyに組み込めないし。 まずはmysqlとかrorが前提にしてる環境で作ったほうがいいよ。 応用は動作確認してからじゃないと、何が悪いか切り分け出来なくて、解決策が見つけにくくなる。
>>599 > まずはmysqlとかrorが前提にしてる環境で作ったほうがいいよ。
> 応用は動作確認してからじゃないと、何が悪いか切り分け出来なくて、解決策が見つけにくくなる。
mysqlでは動きますよ?どこをどう曲解したらそうなるんでしょうか?
でもsqlite2で変なのは変なんだよな。
バージョンも最新みたいだし。
tracとかMLとかないのかね。
>>595 同じパスを参照してるってどうやって確かめたの?
>>587 で1〜3の場合ls -l /tmp/test.dbするとファイルがあるってこと?
602 :
デフォルトの名無しさん :2006/06/29(木) 12:01:35
ruby標準のwebrickを使ってHTTPサーバもどきとしています。 これで公開している、DocumentRoot以下全てにユーザ認証をかけたいのですが、 何かよい方法はあるでしょうか。 リファレンスマニュアルのWEBrick::HTTPAuth::BasicAuthを参考にしながら mount_proc('/')とするとres.bodyで書いたものしか表示できず、公開部分が表示できなく なってしまいます。 webrickはリファレンスマニュアルのWEBrick::Config::HTTPと同じように 書いています。
>>602 require "webrick"
callback = Proc.new{|req, res|
WEBrick::HTTPAuth.basic_auth(req, res, "WEBrick's realm") {|user, pass|
user == 'webrick' && pass == 'supersecretpassword'
}
}
httpd = WEBrick::HTTPServer.new(
:DocumentRoot => File::dirname(__FILE__),
:RequestCallback => callback,
:Port => 10080
)
trap(:INT){ httpd.shutdown }
httpd.start
そういえば trap(:INT) { httpd.shutdown } くらいデフォルトで定義しといてくれよ と思っているのは俺だけだってのはもうとっくにわかってるからほっといてくれよな。
605 :
602 :2006/06/29(木) 18:38:48
>>603 ありがとうございます。
そのままコピペして実行してみたのですが、なぜか認証なしで
実行ディレクトリが表示されてしまいました。
RequestCallbackがなぜか動いていないような感じがします…
プログラミングRuby デビット トーマス (著)って初版からだいぶたっているのですが これから始めようという人にもオススメできますか? 仕様の変更とかで動かないと、この本で勉強してもおもしろくないだろうし・・・・
本当は今月出るはずだったんだけどね
出る出る詐欺には騙されねーど
>>605 :RequestCallbackを:RequestHandlerに変えたらどうなる?
その前にRubyのバージョンいくつ?
612 :
602 :2006/06/30(金) 08:57:40
>>611 ありがとうございます。
求めている動作がおこなえました。
Rubyのバージョンは、
WEBrick/1.3.1 (Ruby/1.8.1/2003-12-25)
となっています。
ちょwwww古wwwww
>>606 でも今度出るのは2冊組で高くつくし、普通の用途なら旧版でも十分だから
今のうちに買っておくのも悪くない。内容は既刊の中で未だトップレベルだ。
615 :
606 :2006/07/01(土) 06:07:09
>>607 おおおおおおおおおおおおおおw
よい情報をありがとうございました!
これからRubyを始めたいと思います``
616 :
606 :2006/07/01(土) 06:20:44
みなさんレスありがとうございました! これからもよろしくです。
617 :
デフォルトの名無しさん :2006/07/03(月) 15:45:04
すいません。 ruby1.8での日本語変換はどうすればできるのですか? 初歩的な質問ですいません。
619 :
デフォルトの名無しさん :2006/07/03(月) 16:43:39
すいませんできるようになりました。 しかし改行がどうすればいいのかわかりません。
>>620 を参考にしてくれなきゃ、何が言いたいのかサッパリだが、
String#gsub!("\r\rn", "\n") みたいので言いんじゃね?
さっぱり さっぱり
mysqlで動くならrorには問題は無いね。 単純にsqliteの問題。sqliteスレにでも逝けば?
#! ruby -Ke #!/usr/local/bin/ruby open(file,"r"){|f| while line = f.gets if /pattern/ =~ line print line end end } このようなコードでeuc_jpコードのファイルから日本語で正規表現を行おうとしたのですが、 日本語がshift-jisに認識され文字化けが起きてうまくいきません。どうすれば正しく認識して くれるのでしょうか。環境はWindowsXP上のCygwinでRubyは1.8.4,エディタはmeadowを使ってます。
Cygwin の VT が Shift_JIS 専用だから print line で EUC-JP が吐かれても化けて当然というオチとみた。 つまり、Ruby はちゃんと処理してるんじゃない? require "kconv" して print line.tosjis してみたり、 require "nkf" して NKF#guess で文字コードをちゃんと見てみたらどうよ? あと、一行目と2行目を足して #!/usr/local/bin/ruby -Ke とするのが普通。 それじゃあ、2行目は、ただコメントアウトされてるんじゃないか?
>>627 ,628
返信ありがとうございます、それが原因のようでした。リンク先のやつ早速
導入させていただきます。
630 :
tojis はトジス :2006/07/05(水) 00:36:34
>>627 >print line.tosjis
ruby では、to_i, to_s, to_f があるから、
to_sjis, to_utf8 とかになるのが普通だと、見るたびに思う。
もう、何度も話題にしているような気がするけど・・・
俺はそうは思わない。 ほら、これでevenだ。普通じゃなくなったよ。
>>631 > ほら、これでevenだ。
不用意な言葉使いを皮肉ろうとするあまりに、
根拠なしに文句言うだけのノイズになっちゃう例?
>>630 エンコードの数だけメソッドを用意するんかい。
といって-Keだとかkconvだとか$kcodeみたいなK(たぶんKanjiのK)なんちゃらっ
てのも前時代的だよねえ。
PerlIOはスマートな解決法だと思う。
xxtojisみたいな関数名は、古くからあるコード変換ライブラリにありがちだから、 tojisというメソッドも違和感なし。 toiとかtosなら違和感ある。
Ruby的にはtosjisもto_sjisも 両方使えるべきであると思うがどうか
tosijsはいいとしても、変換元のコードを明示的に指定しないといろいろまずくないか?
>>625 今年1月初頭にRuby人気が上がったきっかけは
Ruby Harvey vigil this afternoon
だったのかww
phpが実際以上に多いような気がするんだけど、これはきっと URLの拡張子のせいだな。
いっそのこと、このスレで いくつかの便利メソッドを追加したKconv+を作ろうぜ
昔本スレでNKFに異議あり!!と唱える猛者がいたんだが まだ頑張ってくれてるのだろうか
M17N の動向を生暖かく見守ってるところ
日本原産なのに日本語操作関連がPHP並にがっかりなのはどうにかしてほしい
詳しく
かつて、日本語処理が楽そうなので Ruby を始めた俺も知りたい。 Unicode に統一されてないからなどの話? そんなのが、Matz 日記あたりに最近あったな。
Perlに比べりゃ全然まし
ああはなりたくないね
kwsk
ML の「世代別 GC について」の人のトップページを見て期待度あっぷした俺
だめだこりゃ
>>647 utf8 flag というろくでもない機構
>>626 if /pattern/e =~ line
こんなんでいけないものか
まつもとさん 連載やめて本を出してください。
その本の価格がべらぼーに高くなる予感 連載ってそれ自体はそんなお金入んないか
発売日: 2006/08/31 。。。
去年の10月に「半年以内には出てると思います」って言ってたけど 高校生みたいなやつが発売日に関してしつこく質問したり マーケティングって言葉を使いたくてしょうがなさそうな頭の悪いやつが ぐだぐだ言ったから、翻訳する気がなくなったのかなと思ったりw ググっててそれらしいやりとりを見つけた。 それともただ忙しいのか・・・・もしくは生後確認に一生懸命なのか・・・・ お盆休みにゆっくり読みたかったorz
自分用CGIでAmazonのAPIに投げるISBNの正当性チェックに3時間もかかった俺アホス
もっと早く書けるようになりたい
っていうか来年1月からISBNが13桁に変わるなんて知らなかった
>>655 してやったりと思ってるかもしれないぞ
>>655 > お盆休みにゆっくり読みたかったorz
ゆっくり1.8.5をインストールしてくれ。
ruby と perlってどう違うの? パールを元にしてルビーって作ったんですよね? パール 時代遅れのテキスト処理で見辛い ルビー 作者が日本人でコード見易い。ただ教科書が少ない って聞いたんですけどそれぞれの特徴教えてください
Perl いろんな関数を知っていなければいけないので 使いこなすのにコツがいる。 Ruby メソッド名や使い方がある程度統一されているので、 基本を押さえていればおおよそ使い方が分かる。 文字列から整数への変換はto_iだが、 浮動少数から整数への変換もto_i。
perl 先駆者にして常に時代の最先端を行く。 メジャーバージョンアップの度にぶっとんだ仕様をぶち込んできて ユーザーの度肝を抜く。 もうすぐperl6が出るということになっているが、いつになるのやら。 ruby perlの機能を参考にして作られた。 マイナーバージョンアップの度に予期せぬ仕様変更をぶち込んできて ユーザーの怒りを呼ぶ。 もうすぐruby1.8.5が出るということになっているが、いつになるのやら。
何のために特徴知りたいのかで答は違うな
言語自体は後発のRubyの方がはるかによくできてる ただしPerlの方がドキュメントいっぱいあるし 先人の作ったライブラリいっぱいあるし CGIで使えるレンタルサーバーいっぱいある
Perlでは飯が食えるがRubyでは飯が食えない
>>664 あのへんで今とりあえず飯が食える言語はPHPだと思う
あと2〜3年は食いっぱぐれないでそ
変な言語が流行っちゃったなあ
vbs だと、 Function func() MsgBox "Hi!" End Function Set document.OnLoad = GetRef("func") って書けるんですけど、 これを ActiveScriptRuby で書くにはどうしたらいいでしょう? def func() # なにか end document.OnLoad = func とやっても、func の呼び出しになっちゃうんですよね〜。
>666 そこはJavaScriptみたくbodyのonload属性に仕込む。 <body onload="func" language="RubyScript">
>>667 すみません、HTML で使うんじゃないんですよ。
単に、拡張子.rb のスクリプトファイル内で、com のイベントを拾いたいんです。
相手は GetIDsOfNames せずに、単に Invoke(dispid=0) してくるだけなので、
document.onload=proc{ puts "Hi!"}
としたら一応動きました。
これを、
def func
puts "hi!
end
document.onload=(なにか演算子?)func
に書き換える方法が知りたいんです。
>>668 COM知らないんだがw
method(:func)
はどう?
670 :
668 :2006/07/08(土) 10:39:04
>>669 COM の説明はよけいでしたね^^;
教えていただいた方法でばっちり動きました。
ありがとうございました。
>671 う〜、ばうあう!! がうがうがうあ、がうがう!!
>>671 PHP はくそだよなぁ。
Python がはやるならまだ納得できるが。
いくつかのディレクトリと、その中のファイルネームとファイルサイズを扱いたいけど、どう扱うのが良い? 多元配列? % ls -l dir* dir_a: total 0 -rw-r--r-- 1 rubyuser rubyuser 1 9 Jul 00:00 file_aa dir_b: total 0 -rw-r--r-- 1 rubyuser rubyuser 2 9 Jul 00:00 file_ba -rw-r--r-- 1 rubyuser rubyuser 3 9 Jul 00:00 file_bb
後から何度も使うデータ構造として持っておきたいなら、Composite pattern。
HashにHash入れればいいんじゃないかな
しっかり作るなら
>>675
Composite patternは難しくて勉強しないと手に負えず。orz 多重連想配列ですかね。 動かしてないけどこんな感じ? dir = Hash.new dir["dir_a"] = { "file_aa" => 1 } dir["dir_b"] = { "file_ba" => 2 } dir["dir_b"] = { "file_bb" => 3 } たぶん、 {"dir_a"=>{"file_aa"=>1}, "dir_b"=>{{"file_ba"=>2}, {"file_bb"=>3}} になる。
entry[:name] = "abc" entry[:size] = 0 entry[:leaves] = [] leavesがあるならDir なければFile の方がいい気がするがどうだろ
struct版 dir_name_class = Struct.new(:dir_name, :file_name, :byte_size) data = [] data[0] = dir_name_class.new("dir_a", "file_aa", 1) data[1] = dir_name_class.new("dir_b", "file_ba", 2) data[2] = dir_name_class.new("dir_b", "file_bb", 3) data.each_index {|number| i = 0 data[number].members.each {|value| if i != 0 then printf", " end i += 1 printf("%s = %s", value, data[number].send(value).to_s) } printf("\n") } 実行結果 dir_name = dir_a, file_name = file_aa, byte_size = 1 dir_name = dir_b, file_name = file_ba, byte_size = 2 dir_name = dir_b, file_name = file_bb, byte_size = 3
ハッシュのハッシュは無理。 dir_name_hash = Hash.new dir_name_hash["dir_a"] = { "file_aa" => 1 } p dir_name_hash["dir_a"].keys dir_name_hash["dir_b"] = {{ "file_ba" => 2 }, { "file_bb" => 3 }} p dir_name_hash["dir_b"].keys p dir_name_hash 実行結果 ["file_aa"] [{"file_ba"=>2}] {"dir_a"=>{"file_aa"=>1}, "dir_b"=>{{"file_ba"=>2}=>{"file_bb"=>3}}} 配列の配列はおk。 dir_name_array = [] dir_name_array.push ["dir_a", "file_aa", 1] dir_name_array.push ["dir_b", "file_ba", 2] dir_name_array.push ["dir_b", "file_bb", 3] p dir_name_array 実行結果 [["dir_a", "file_aa", 1], ["dir_b", "file_ba", 2], ["dir_b", "file_bb", 3]]
>>680 > ハッシュのハッシュは無理。
> dir_name_hash["dir_b"] = {{ "file_ba" => 2 }, { "file_bb" => 3 }}
dir_name_hash["dir_b"] = { "file_ba" => 2, "file_bb" => 3 }
682 :
デフォルトの名無しさん :2006/07/10(月) 16:26:33
kick ='ローキック' 10.times do |t| if t%2 == 0 puts('ワンツー') else puts(kick) end end でエラーが出てしまうんですけどどうしてでしょう?
>>682 どんなエラーが出たのかコピペすれ。
てか、そのプログラム過去に見た記憶が・・・
684 :
デフォルトの名無しさん :2006/07/10(月) 16:40:33
SyntaxError: compile error (irb):7; parse error,unexpected tINTEGER, expecting $ kick ='ローキック' 10.times do |t| if t%2 == 0 puts('ワンツー') else puts(kick) end end ^ from(irb):7 from:0 です。
$ ruby --version の結果と、 irb じゃなくて、ruby -d スクリプトフィアル の結果はどうなる?
687 :
デフォルトの名無しさん :2006/07/10(月) 16:55:00
唐突でわかりにくいよな
>>683 スレッドで動かすとワンツーキックの順序が崩れるかもとかそんな説明のスクリプトじゃない?
690 :
デフォルトの名無しさん :2006/07/10(月) 18:58:22
結局、どうすればエラーは直るんでしょう?
>>684 いや、ちゃんと動くぞ。irbでやったけど。
$ ruby -v
ruby 1.8.2 (2005-04-11) [x86_64-linux]
692 :
デフォルトの名無しさん :2006/07/10(月) 20:50:05
おかしいっすね。 ruby -v ruby 1.8.4 (2005-12-24) [i386-mswin32] irb(main):002:0> kick='ローキック' 10.times do |t| if t%2==0 puts('ワンツー') else puts(kick) end end SyntaxError: compile error (irb):2: parse error, unexpected tINTEGER, expecting $ kick='ローキック' 10.times do |t| if t%2==0 puts('ワンツー') else puts(kick) end ^ from (irb):2 from :0
まてまて、それ全部一行として扱われてるぞ。 それじゃあエラーにもなるよ。 それってDOS窓上のirbにコピペしてるの?
694 :
デフォルトの名無しさん :2006/07/10(月) 21:20:32
はい、そうです。 どうすれば改行できるんすか??
いや、手元で試すとちゃんと動くんだけど。 ASRのRuby Console上のirbに、 このスレからソースをコピペしてみた。 irb(main):001:0> kick='ローキック' => "\203\215\201[\203L\203b\203N" irb(main):002:0> 10.times do |t| irb(main):003:1* if t%2==0 irb(main):004:2> puts('ワンツー') irb(main):005:2> else irb(main):006:2* puts(kick) irb(main):007:2> end irb(main):008:1> end ワンツー ローキック ワンツー ローキック ワンツー ローキック ワンツー ローキック ワンツー ローキック => 10 irb(main):009:0> うまく動かない状態を再現できない。
696 :
デフォルトの名無しさん :2006/07/10(月) 21:53:23
恋するRubyとかなんとかだっけ?
>>696 で、なにが原因でうごかなくて、どうやって解決したの?
それがなくて「できました」だけじゃあ、参考にならんなあ。
参考にしてもらう気も別にないんだろう
正直、それを知りたいとも思わんな。
そして再び同じ質問が永遠に繰り返される不毛の大地。
こんな意味不明の質問を投げる奴はこいつしかいないから、 同じ質問はさすがにもう来ない。 キチガイが荒らす場合以外は。
複数行あるテキストを、最下行から順に表示して行くにはどうしたらいいんでしょうか?
コマンドで言うtacかな。 上から配列に入れてreverseしたものを表示しろ。
テキストがでかい場合、全部読み込んでreverseすると大変。 末尾から適当に区切って読み込んでいけるスクリプトが書ければ 初心者から初級者にランクアップできるぞ。1
どのように組めばいいのかわからずに困っています。アイデアをお願いします。 このようにその日の最高と最低気温を記録したデータあります。 2006/06/27,23.3,20.9 2006/06/28,25.5,23.0 2006/06/29,33.3,27.6 2006/06/30,24.6,22.1 2006/07/01,33.7,31.7 2006/07/02,30.1,28.0 2006/07/03,29.4,20.4 2006/07/04,31.3,30.0 2006/07/05,25.5,19.8 2006/07/06,28.8,21.0 2006/07/07,32.6,25.7 2006/07/08,22.0,16.5 また、例年の平均気温の週ごとのデータもあります。 2006/07/01,27.9,24.5 2006/07/08,24.4,20.0 日付を比較して週ごとのデータを日ごとのデータにくっつけたいんです 2006/06/27,23.3,20.9,27.9,24.5 2006/06/28,25.5,23.0,27.9,24.5 2006/06/29,33.3,27.6,27.9,24.5 2006/06/30,24.6,22.1,27.9,24.5 2006/07/01,33.7,31.7,27.9,24.5 2006/07/02,30.1,28.0,24.4,20.0 2006/07/03,29.4,20.4,24.4,20.0 2006/07/04,31.3,30.0,24.4,20.0 2006/07/05,25.5,19.8,24.4,20.0 2006/07/06,28.8,21.0,24.4,20.0 2006/07/07,32.6,25.7,24.4,20.0 2006/07/08,22.0,16.5,24.4,20.0 (続く)
(続き) 日ごとのデータの日付の/を削除し整数値のデータに変換した後で 週ごとのデータをeachで全て読み込み、そのデータと大小比較して 貼り付けるという物を考えたのですが、複雑すぎるような気がして 混乱しています。 もっと単純な方法はない物でしょうか?
そのアイデアでも十分単純に組めるとは思うけど? ただ、/を削除して整数値に変換する必要はないね。文字列のまま比較してよし。 次に比較でなく、日付から相当する「週」のラベル(日)を出すロジックを考えるといいかも。 あとはハッシュなり配列なりで工夫して。 もっとうまい手もあると思うけどね。
両方のデータがともに日付でソートされているなら df = open('daily') wf = open('weekly') w, wt = wf.gets.chomp.split(/,/, 2) df.each do |dl| &nbp; d, t = dl.chomp.split(/,/, 2) &nbp; while d > w &nbp; &nbp; w, wt = wf.gets.chomp.split(/,/, 2) &nbp; end &nbp; puts [d, t, wt].join(',') end wf.close df.close
“消えない”空白は Non-Breakable whiteSPace(区切り候補にならない空白)の略
失敗。&nbp;はスペース。 あとエラーチェックとか全然してない。
> 日付から相当する「週」のラベル(日)を出すロジックを考えるといいかも。 > あとはハッシュなり配列なりで工夫して。 こんなのか? require 'date' delta = nil weeklyh = {} IO.foreach('weekly') do |l| a = l.split(/,/,2) d = Date.parse(a[0]) weeklyh[d.cweek]= a[1] delta ||= (7 - d.cwday) end IO.foreach('dayly') do |l| d = Date.parse(l[/\d+\/\d+\/\d+/]) + delta puts l.chomp + ',' + weeklyh[d.cweek] end
Windowsへインストールする際、One-click InstallerとActiveScriptRubyは どちらがおすすめでしょうか? 差がよくわからなくて...
何をしたいかを書け おすすめのしようがない
718 :
716 :2006/07/12(水) 07:45:35
Rubyを勉強してちょっとしたテキスト処理のスクリプトをしたいだけです。 あと、ゆくゆくWindowsのGUIを使ったスクリプトも作りたいです。
よくわからんがRubyというものに触れて今後の糧にしたいのなら普通のRubyにしとけ
OneClickInstallerでいいと思う。 違いはよく知らないんだけど。
ASR + RDE で良いんじゃね?
740821853621031666072323047816479569603068959994684069733778925634 こんな感じのランダムな数字があって、これを4文字ずつに切り分けるにはどうしたらいいんでしょう? unpackを使うらしいのですが unpack("a4") とやっても7408が切り出されるだけで、残りが無視されてしまいます
7408・・略・・925634.to_s.scan(/..../) どうでしょうか
>>725 なるほど、その手がありましたか
どうも
第二版ですが、いっそのこと来年春発売予定にしておいてくれませんか? どんどん延長しますね。 楽しみにしているのが馬鹿馬鹿しく思えてきました。 つーか、もう出さなくてもイイですよ。
いま Python に乗り換えるかどうか迷っています
>>728 学ぶ時間があるのなら迷わず乗り換えちまえ。
言語はそれぞれに独特の考え方があって視野を広げてくれる。
自分の都合で言語を選べるのは恵まれているのだから
チャンスは生かせばいい。
はじめまして。Rubyをちょくちょく勉強してる者なんだけど 今回RDF/XMLを使おうと思うんだけど、それに関するいい書籍はありませんか? Rubyの本を調べてみたけど、どれもピンとこないので実際に読んでる人に 教えて貰いたいんだけど・・・ いいのがあったら購入を考えてるのでお願いします
731 :
730 :2006/07/13(木) 11:56:47
ごめん書き方が悪かったです。 Rubyを使ってRDF/XMLを作れる、使えるような事を書いてる本です。 Rubyについてはそこそこ本が出てますけど、 具体的な中身がわからないので・・・
>>727 去年そうそうに英語版買った俺が買ち組。1冊だし、安いし。
今となってはどうでもいい。
require 'net/http' host = 'www.amazon.co.jp' directory = '/test' h = Net::HTTP.new(host, 80) while htmlfile = DATA.gets htmlfile = htmlfile.chomp resp, data = h.get(directory + "/" + htmlfile, nil) data.each { |i| puts i } end __END__ product/B0000AIRN3/250-6594702-0116251?v=glance&n=561958 このやり方でamazonのページを取得できないのですがなぜでしょうか? ちなみにほかのサイトは取得できました。
DATAって何だよ
普通に取得できるが。404だけどな。
先ほどのプログラムにミスがありました。
こっちが正しいやつです。すみません。
require 'net/http'
host = 'www.amazon.co.jp'
directory = '/gp'
h = Net::HTTP.new(host, 80)
while htmlfile = DATA.gets
htmlfile = htmlfile.chomp
resp, data = h.get(directory + "/" + htmlfile, nil)
data.each { |i| puts i }
end
__END__
product/B0000AIRN3/250-6594702-0116251?v=glance&n=561958
これも試してみましたが、
>>737 さんのおっしゃるとおり何も取得できません。
http://www.amazon.co.jp/gp/product/B0000AIRN3/250-6594702-0116251?v=glance&n=561958 ↑このページは存在するのに、なぜ何も取得できないのでしょうか?
>>738 ヒント: 301 MovedPermanently
740 :
738 :2006/07/13(木) 18:44:13
MovedPermanently・・恒久的に移動しました。 とありましたが、こういった場合はどうやって取得すればよいのでしょうか?
Locationヘッダ
erubyを tp://blog.koss.jp/article_346.html の方法に従ってdebain/sergeにインストールしたんですが。 eruby上でエラー構文を書くと、webの表示で「500 Internal Server Error」となってしまいます。 こういうものなんでしょうか? もう少し親切にエラーで怒ってくれないものでしょうか。
begin rescue end
744 :
742 :2006/07/14(金) 16:42:27
自分でエラーを書けって事ですね。 つまり構文のエラーを突っ込んでくれるような機能はデバッガ等を導入しろって事だと理解しますた。
ちがうよ
ていうかWebサーバから見てInternelServerErrorである以上 ユーザーに対してInternelServerErrorを表示するのは当たり前 Webサーバのエラーログあたりを見ろ Rubyが返してるエラーが書き出されてるはずだ
747 :
742 :2006/07/14(金) 16:56:47
>>746 さん
ご指摘ありがとうございます、apacheのログを確認してみようと思います。
これ以上簡便なエラー表示方法は無いのでしょうか?
デバッグ中はweb上からエラー表示するとか・・
標準エラー出力に何も表示されなければWebサーバ側からは内部エラーが起きたとはわからないはず エラーや例外の出す標準エラー出力を全部捕捉して標準出力に書き直せばいんでないの
>>748 標準エラー出力を捕捉して書き直しってけっこう大変だと思うが。
>>743 のいうように、rescue Exceptionで、文法エラーも含めて全部捕捉して、
書き出すのが楽だと思う。
それでも捕捉できなかったら、ローカルで、ruby -cとやってみること。
サーバアプリの場合、詳細なエラーメッセージ出すと セキュリティ上良くない場合もあるからね 500しか言わなくて良いよ
> 標準エラー出力を捕捉して書き直しってけっこう大変だと思うが。 Perl だとサクッと出来る。
たぶん、
>>742 がほしいのは、erubyを書いててsyntax errorがあったときに
簡単に見つける方法なんじゃないだろうか。
もしそうだとしたら、こんなのはどうでせう?
$ erb -x file.rhtml | ruby -wc
erb -x で file.rhtml を rubyスクリプトに変換し、それを ruby -wc で構文チェックかけてます。
>>749 文法エラーはスクリプトの実行前に発生するので無理だが、
実行時のエラー出力は$stderrを変えておけば捕捉できる。
$stderr = StringIO.new
begin
...
ensure
err = $stderr.string
unless err.empty?
puts err
end
end
>>751 perlだったらCGI::Carpってのがあるけど、rubyにはないのだろうか。
不器用ですが、無理やり表示 #!/usr/bin/ruby END { puts "Content-type: text/html\n\n<h3>#{$@}<br>#{$!}" if $!} hoge.to_s puts "Content-type: text/html\n" puts "<html>" … puts "</body></html>" exit #=> D:/www/cgi-bin/index.cgi:3 undefined local variable or method `hoge' for main:Object
$@は複数行になるんだけど、headingにすんの? つーかタグ閉じろよ。サニタイズしろよ。
>>754 syntax error も捕捉してくれるんだっけか?
というかデバッグ用だったらtext/plainでいい罠
>>757 しない。
つーか捕捉する側のコードがerrorだったらそもそも走らない。
別ファイルに分けてloadするか、evalするかしないと無理。
こんな感じ? begin load "foo" rescue Exception => e print "Content-Type: text/plain\n\n" print "#{e.backtrace[0]}: #{e.to_s} (#{e.class})\n" e.backtrace[1 .. -1].each do |bt| print "\tfrom #{bt}\n" end end
>>757 は Perl の話なんじゃね?
=cut
ところで今日
proc do
retry if gets
end.call
ってやったら retry 出来なくてびっくりした
require 'open-uri'
require 'nkf'
title = Array.new
url = "
http://money.jp.msn.com/newslist.aspx "
def get_title(url)
body = NKF.nkf("-s", open(url).read)
title << body.scan(/<div class="newsheadlinelist">(.*?)<\/div>/)
if /<a href='(.*?)'>次へ>/s =~ body
next_url = $1
get_title(next_url)
end
end
get_title(url)
title.each {|i|
print i, "<br>\n"
}
なんでこれ
msn.rb:8:in `get_title': undefined local variable or method `title' for main:Obj
ect (NameError)
とか言われるんでしょうか?
一番外で最初に宣言してるのですが
変数のスコープの問題だね。 C とかとはちょっと違うんだよね。 変数をグローバルスコープで使いたい場合は、title じゃなくて $title としましょう。
Rubyにおいては、メソッドの定義の中では外部のローカル変数にアクセスできない。 …なんでかはよくわからん。 Rubyのいくつかのスコープは字面は同じなのに不思議な挙動を示すことがある。 書き捨てならグローバル変数にしてしまうか、引数でメソッド内部に持ち込め。
defやclassは外と共有しない新しいスコープ do〜endや{〜}は外のも読める入れ子のスコープ if〜endやwhile〜endはスコープを作らない
Rubyでグローバル変数勧める奴は氏んでいいよ
いいんだよ。 変数表でしっかり管理していれば グローバルが最強なのはどの言語にも言えること。 変数スコープはバグの温床。
変数表ってなに?
クラスのメソッド定義内でグローバル変数にアクセスするなんて、 筋が悪いにもほどがある。
げふっ、クラスじゃなかった。
>>770 は取り消す。
グローバル変数とは プログラム構造が複雑怪奇でどうしても如何ともし難いときに 最終奥義としてうやうやしくこっそりと最低限の用量で慎重に使うものだ でも実際上はフツーの人が作るプログラム程度においては破綻の原因にはなりっこない罠
書いた瞬間は破綻はそう無いけど、後日そのコードを何かしようと したときに破綻のトリガーになったりする。
もまいらMatzもオススメのCOBOLに一辺触れてみ。 グローバル変数なんて一生使いたくなくなるから。
質問者がグローバル変数として使うつもりのようなんだから グローバル変数の使い方教えて何が悪い。
意地が悪いかも
俺はトップレベルでクラス変数を使った事がある
長さの不揃いな「配列の配列」をtransposeしたいんですが 良い方法はないでしょうか?Rubyは1.8です
RubyでRSSリーダーを作ろうと思ってるんですが そういうのを解説したサイトとかありませんか?
>779 ありがとうございます。 ですがこれ、数値が前提みたいで…… 扱いたいのは自作クラスのインスタンスなんです。 一応自分でこんなのを作ってみました。 でも、もう少しサラっと書けないかなぁと思います。 def trans_aryary(src) dst = [] row = 0 begin tmp = [] found = nil src.each do |col| tmp.push col[row] found ||= col[row] end dst.push(tmp) if found row += 1 end while found return dst end
>>780 そんなピンポイントな解説サイトなんてあってたまるかー
いや、あっても楽しそうな気もするが
せっかくの自作なら自力で作っていくのもいいんじゃね
RSSを読んでREXMLでパースするもやたら遅すぎるので正規表現で適当に区切って
1回目の表示はうまくいったけど未読と既読の管理の実装どうしようというとこで是非挫折してくれ(w
え、巷のRSSリーダーって、ローカルにarticleを貯めないのか?
「読んだ」記事とはなんぞや、というRSSリーダー特有の問題のことだろう title一覧からクリックしてdescriptionを表示した記事だけを既読として扱うのかとか titleとdescriptionをセットでずらずら一覧表示して全部既読ということにしてしまうのか メーラーのような既読処理のほうが間違いはないが、数十数百の記事になるととてもとても
それRSSリーダ特有の問題なの?
786 :
780 :2006/07/18(火) 13:41:38
>>780 確かに。でも他の言語ならあってもおかしくない気も・・・
挫折前提ですかw
とりあえずでいいから動くものを作りたいです
そっからカスタマイズでいいので・・・
未読既読は後でもいいかなとか
787 :
780 :2006/07/18(火) 13:45:03
789 :
デフォルトの名無しさん :2006/07/18(火) 16:24:29
railsの話ですが、
ttp://wota.jp/ac/?date=20060525#p02 に認証プラグインが載っているのですが、
インストールして、コントローラーに
htpasswd :user=>"foo", :pass=>"bar"
と入れて実行してみると
undefined local variable or method `htpasswd_options' for #<BbsController:0x409d1014>
となって、エラーになってしまう。なんでだろ?知っている人おしえてください。
791 :
780 :2006/07/18(火) 19:56:27
>>788 おーサンキューです。調べが足りなかったですね。
でも、ほんとに読み込むだけだな・・・
これをWebにするならRailsを使わないと駄目なわけか・・・
792 :
780 :2006/07/18(火) 19:58:01
そういえば、Rubyの日本語のIDEってありますか? CとかのCpadみたいな・・・ 探してるんですが、英語版しか無いんで・・・
RDEで良いんじゃない?
俺もRDEをオススメする。
中学生日記
797 :
780 :2006/07/18(火) 22:09:35
>>793 ,794
ありがとうございます。早速インストールしたのですが
日本語化の仕方が分からない・・・
TransrationFileってどこだー!
799 :
780 :2006/07/18(火) 23:30:43
エスパーさん、出番です
とりあえず打ち間違いを直しましょう
何をして、どの様なエラーが出たかをちゃんと書かないと。 たぶん、「RSSを構築する」の部分ソースを動かしたのだと思うが。 Ruby をちゃんと普通に学習するなり、このサイトをベースにしてちゃんと学習するなりして、 本家行って RSS の仕様(英語)をちゃんと読んで、 両者を理解して上で自分で作らないと、むしろ茨の道な気がするが。 俺は自前で作ったことあるけど、あまり苦労しなかったし。
>781 def transpose_nonsquarematrix(mtx) max = mtx.map{ |array| array.size }.max mtx.map{ |e| e.concat( Array.new(max - e.size, nil) ) }.transpose end
805 :
800 :2006/07/19(水) 14:11:19
>>803 そうです。RSSを構築するの部分のソースを動かしたんですけど、
RDE使ってデバッグした所、
1行目と
rss=のところの行にエラーが出て何これ?って感じでした・・・
Rubyの本は注文したのですが、まだ届いてない状況。
自前で作るのが難しそうなので、こういったサイトを頼りにしてたのですが・・・
とりあえずプログラム作ること自体初心者なのはわかった。 わかったからエラー内容をコピペ汁。
807 :
800 :2006/07/19(水) 15:16:18
>>806 C:/DOCUME~1/○○○/LOCALS~1/Temp/rb13.tmp:11:in `make': wrong number of arguments (2 for 1) (ArgumentError)
from C:/DOCUME~1/○○○/LOCALS~1/Temp/rb13.tmp:11
Completed(1)
実行するとこんなエラーが出ます・・・
なにこれ
>>807 11行目でmakeという関数を実行しようとしたが、(rb13.tmp:11: in `make')
引数の数が違っていますよ。(wrong number of arguments)
引数に1つだけ値を渡すべきところに2つ渡されていますよ。((2 for 1))
というエラーが出ているようだ。
it = Hoge.newするとit[0]やit[2]でデータが取り出せるクラスを作りたいんですがうまくいきません。 class Hoge def initialize(str) i = 0 strs = str.to_s.split(/\t/) strs.each do |s| self[i] = s i = i + 1 end end def []=(x,y) end end みたいに見よう見まねで書いてみたんですが[]=がうまくいかないです。 どうかヒントだけでも
>>811 ではヒントをあげよう。
見 よ う 見 ま ね で 書 く な
以上。
クラスの作り方とメソッドの作り方を勉強してからいじれ。
見よう見まねは、プログラミングの基本
814 :
デフォルトの名無しさん :2006/07/19(水) 20:30:30
>>810 1.8.2から1.8.3の境目って結構そーいうの多いよね
>>813 「動かなくても文句言わない」が付随すると思うぞ
class Hoge def initialize(str) @strs = str.to_s.split(/\t/) end def [](x) return strs[x] end end
817 :
デフォルトの名無しさん :2006/07/19(水) 20:46:33
initializeで処理を溜め込むのもどーかと思うけどね
>>812 いやまあ確かにそうなんだけど
演算子の多重定義とか言ったってC++のoperator+とかみたいに
構造が見てれば分かるような記法じゃないみたいだし
せっかく買った入門書には変態的な例が一つだけ載っていてしかも
「このような真似はしないほうがいいでしょう」とか書いてあって
ちょっと相当参ってます。なにとぞ
とか言ってるうちにレス来てましたか。 本当に申し訳ない。んでは
>>816 return @strs[x]
だった
すまん
822 :
デフォルトの名無しさん :2006/07/19(水) 22:18:59
>>819 あまり複雑な事をやらせて、そのうち例外処理とかまではいったら
目も当てられないだろう。
initializeはあくまでインスタンスを作成する為の処理だと思う。
こんな奴がstartとかいうメソッド作るんだろうな、と思う
class Hoge def initialize(str) @strs = str.to_s.split(/\t/) end def [](x) return @strs[x] end def each @strs.each {|s| yield s } end end h = Hoge.new("aho\tbaka\thage") h.each {|s| p s}
825 :
800 :2006/07/19(水) 22:53:25
>>810 わ、マジですか・・・
確かVerは1.8.4だと思います・・・
Verを1.8.1に変えて今一度やってみます。
そんなやつがabortするプログラム組むんだろうな
いやそのアプローチは正直どうかと 1.8.4用に書き換えようよ
828 :
800 :2006/07/19(水) 23:02:34
C:/DOCUME~1/Owner/LOCALS~1/Temp/rb398.tmp:3:in `require': No such file to load -- rss/1.0 (LoadError) from C:/DOCUME~1/Owner/LOCALS~1/Temp/rb398.tmp:3 Completed(1) 1.8。1に変えました。 でも C:/DOCUME~1/Owner/LOCALS~1/Temp/rb398.tmp:3:in `require': No such file to load -- rss/1.0 (LoadError) from C:/DOCUME~1/Owner/LOCALS~1/Temp/rb398.tmp:3 Completed(1) こんなエラーが・・・
ほう。で?
831 :
800 :2006/07/19(水) 23:27:41
>>830 RSSパーサですよね?インストールしました。ですが、
C:/DOCUME~1/Owner/LOCALS~1/Temp/rb3A1.tmp:6:in `require': No such file to load -- uconv (LoadError)
from C:/DOCUME~1/Owner/LOCALS~1/Temp/rb3A1.tmp:6
Completed(1)
と出ます。uconvって何だ・・・
まだ何かインストールしないと駄目なんですかね?
「こんなエラーが」とか思考停止すんなよ。英語なんだから読めよ。 そんなレベルじゃ、初心者スレでも相手にされないって。思考しない向上心も無い初心者なんてクソだ。 RDE の事情なんて知ったこっちゃないが、 恐らく、C:/DOCUME~1/Owner/LOCALS~1/Temp/rb398.tmp:3 がソースファイルなんだろ? 公式のマニュアルで require を知れ。わざわざクォートで括って強調してくれてるんだろ? そうすれば、$LOAD_PATH 以下に foo.rb やら bar.so があるかどうか、自然と調べるだろうに。 $ ruby -e 'p $LOAD_PATH' とかやってみな。
833 :
800 :2006/07/19(水) 23:33:41
>>832 すみません・・・
831のエラーは、requireってCで言うインポートみたいなもんですよね?
で、インポートする為のファイルが読めないってエラーだと思うんですが・・・
で、tmpの6行目だからuconvつーものが読めないって事だと思うんですが違いますかね?
834 :
800 :2006/07/19(水) 23:35:51
検索したらUconvってモジュールがあるんですね。 いけるかどーか分かりませんがとりあえずインストしてみます。
835 :
800 :2006/07/19(水) 23:50:48
Uconvをインストしようとして色々調べたんですが ruby extconf.rb make make install と順番に入れると書いてあったのでそのようにしたのですが、 makeの所で、 ’Make'は内部コマンドまたは外部コマンド・・・ と出てきて認識してくれません。 ruby exconf.rbでは、ちゃんとcreating makefileと出るんですが・・・ 原因分かる方いませんか?
どういう環境なんだろ? OS板でもどうぞ。 まずはRoRが前提としてる環境を理解したほうがいいよ。
839 :
800 :2006/07/20(木) 00:22:40
>>833 ごめん。Javaだった・・・
makeがなぜかできねぇぇぇぇ・・・
どういう事だろ?環境変数のPATHはちゃんと通してるはずなんだけど・・・
>>800 とりあえず、Ruby 以前の問題だから出直してきた方がいいよ。
初心者スレッドだからって、何聞いてもいいわけじゃない。
教訓:「なぜかエラーが出る」という奴にろくなのはいない
>>842 お前のような奴がスレを駄目にする
後に続く何百何千の人間が迷惑を被る
まじで? すまん。 実際そんなにいるのか知らんけど、 後につづく、何千もの人間の人、すまんかった。
リンク張られちゃったサイトのアクセスログによると1日30人くらいはいると思う 1年で1000人くらいにはなるかと(w
846 :
800 :2006/07/20(木) 01:11:57
>>840 すみませんでした。皆様にはご迷惑おかけしました。
なんかRubyの本体を解凍した中&インストした中にmakeが無いのは如何に?って感じですが・・・
パチもん掴まされたのか、そういうものなのか・・・
何はともあれせめてまともに動くようになってからまた来ます。
あ、回答が間違ってたの? 間違った回答に誘導される人にとって迷惑だと。 てっきり、「安易に回答する」ことに対して >843に説教いただいたのかと 思ってました。 すみませんでした。 あと>846は、まともに動くようになったら、もう来なくていいと思った。
>> 846 > なんかRubyの本体を解凍した中&インストした中にmakeが無いのは如何に?って感じですが・・・ おまえさん、makeってコマンドがどーゆーものか知らないのかえ?
まぁ「初心者」だから……と思わんでもないが さて「makeがないって言われます」なんてFAQ項目が必要なのかな? # 正直言うと、ことこの板でそんなこと言ってるのは「マウスが机の端まで来てもう動かせません」 # って困ってるのと同レベルな気もしないでもない
私は
>>800 ではないのですが、
ruby 1.8.1 の環境で
rss 0.1.5
uconv 0.4.12
xmlparser 0.6.8
xmlscan 0.2.3
をなんとか入れてみましたが、
やはりエラーが出てしまいます。
(
>>800 さんが指摘していたエラーも一通り出ましたが
上のいくつかをインストールしたら消えました )
/usr/lib/ruby/1.8/date/format.rb:228:in `dup': can't dup NilClass (TypeError)
from /usr/lib/ruby/1.8/date/format.rb:228:in `_parse'
from /usr/lib/ruby/1.8/parsedate.rb:9:in `parsedate'
from /usr/lib/ruby/1.8/time.rb:137:in `parse'
from ./makerss.rb:17
なんか誤読してる人が多そうなんで一応いっとくけど、makeはメソッド名だからね。
>>807 ,809をよーく読むべし。
852 :
851 :2006/07/20(木) 02:57:04
って、俺が誤読してるじゃん、死ね、俺 orz
なんつーかmakeを知らないというだけで ここまで厳しくされるのを見てると、Windowsユーザーへの風当たりを感じる Linuxユーザーは「make知ってて当然」みたいに考えてるのかもしれないが WindowsでRuby動かす初心者がそんなもん知ってるわけ無いだろ 実際、俺はRuby初めてから3年目にコンパイルという概念を知った
>853 俺ドザーだが「makeがない」言われたら 「make.exe」か「make.com」でググるぐらいするよ。
>>853 Windowsユーザーだから、makeを知らないから、というよりは、
質問の仕方、自分で調べる姿勢、テンプレ読んでないという問題でしょう。
>>850 rssに付属してるサンプルも動かない?
たったこれだけのソースで time や date あたりでコケてるのが丸見えなんだから、すぐ修正できそうなものだが。 せっかく、スクリプト言語だったり Ruby なのに。 端から見てて、他人のソースで考えずに愚痴るくらいなら、自分で考えて1から書いた方が早そうだ。 ところで、なんでわざわざ非標準添付の uconv 使ってるんだろ? そもそも、半角等を考慮すると nkf 一択だった記憶があるんだが。
コンピューターリテラシー(プッ)の問題だと思う プログラミング(メジャーでもない言語でしかも非GUIなスクリプト言語)を始める人というのは なんつーかそれなりにパソコンに詳しい人であろうというのをあちこちで期待されてる節があって そういう知識というか勘を持たないままプログラミングを始める人が増えてるのは喜ばしいやら寂しいやら
「じゃあまずDOSプロンプト開いて下さい」 「どすぷろんぷとって何ですか?」 「…わかったよ悪かったよ2000からはコマンドプロンプトだよなどうせ俺は古い人間だよリターンキーだよ」 「こまんどぷろんぷとって何ですか?」 「皮肉じゃなくて普通に知らないのかよ…」
面倒だから ruby 1.8.4 (2006-05-27) [i386-cygwin] で
動作確認したソースをコピペするよ。元のサンプルに出来るだけ合わせた。
あとは好きにして。
require "open-uri"
require "kconv"
require "rss/maker"
response = URI.parse("
http://www.tea4miki.org/articles/2004/11/15 ").read
lastmodified = response.last_modified
rss = RSS::Maker.make("1.0") do |maker|
maker.channel.about = "
http://www.tea4miki.org/rss "
maker.channel.title = "プログラマっ子の足跡"
maker.channel.description = "藤本美貴様の指先を見つめるプログラマっ子のサイトです"
maker.channel.link = "
http://www.tea4miki.org/ "
maker.items.do_sort = true
item = maker.items.new_item
item.link = "
http://www.tea4miki.org/articles/2004/11/15 "
item.title = "Rubyを使ってRSSを生成する"
item.date = lastmodified
end
File.open("rss.txt", "w") do |file|
file.puts(rss.to_s.toutf8)
end
861 :
850 :2006/07/20(木) 10:01:53
>>860 さんありがとうございます。
素人の私には何がなんやらさっぱり分かりませんが
そのコードで動作しました。 ( 当方 ruby 1.8.1 です )
本当にありがとうございました。
ミキサマミキサマオシオキキボンヌ
こういう出元不明のソースでもパクって客に納品すればぼったくれるのがプログラマという職業の魅力です。
perlで言うとこの s/hoge/huga/e (eオプション)とか elispで言うとこの query-replace-regexp-eval とかみたいに 置換後の文字列を評価して返す方法って、Rubyでどうするんでしたっけ?
古いperlしかしらないので、e修飾子は知らないけど、 string.gsub(/regexp/) { eval($~[0]) } っていうような感じで何とかなるのかな。
s/hoge/huga/e って書くと、huga という文字列が実行されるんじゃなかったっけ。 つまり、string.sub(/hoge/, huga) でいいと思うんだが、違うか?
867 :
デフォルトの名無しさん :2006/07/20(木) 14:44:54
関数を通過して###2の出力をbbbにしたいのですが、 Cみたくポインタとかあるのでしょうか? def aaa( test ) test = "bbb" end st = "aaa" p st ###1 aaa(st) p st ###2
aaa!
Cみたいなポインタは無いよ。 testの指すものがStringなら def aaa(test) test.replace('bbb') end
test.replace("bbb")
871 :
デフォルトの名無しさん :2006/07/20(木) 15:38:20
ありがとうございました
>>867 =871
余談だけど、「引数の中身を書き換える」ってのはあんまりRuby的じゃないので、
可能なら他の方法をお勧めする
gsub!
A,1 B,2 C,3 みたいな列と行を記した入力が合って A B C 1○ 2 ○ 3 ○ というテキストの表を出力するとします。 1.列名の配列を作る 2.HashのHashをつくって、hash[行][列]="○"とする 3.列名の配列と、hash.keys を捜査して表を出力する って泥臭い方法でコード書いてみたいんですが、 もっと、Ruby っぽいシンプルな書き方ありませんでしょうか?
動作するならそれでもいいじゃん。
>>874 トリッキーなコードを求めているのではないとすれば、無い。
matrix mを作ってAを0にした[0,1],[1,2],[2,3]…[i,j]に対してm[i,j]=1とかにして入力を全部登録したあと m.to_aで配列の配列に戻して配列ごとに1があったら○を出力 うまくいきそうにないな
Rつかうといいかもな
879 :
864 :2006/07/21(金) 00:44:03
>>865 , 866
ほぼその通りでした。
"hoge_huga_hage".gsub(/(^|_)([a-z])/){$2.upcase} # => "HogeHugaHage"
みたいな感じ。ありがとうございました。
>>857 nkf-utf8になったのは1.8.2からだからだろう。
>> 853 ActivePerl の ppmみたいな仕掛けが必要ってこと? あればいいとは思うけど、とてもそこまでのリソースがあるとは思えない。 そもそも、なかむらさんが VC++のランタイムライブラリの名前変更にかなり 頭にきてるみたいだし(ruby-core 参照してね)、基準となるバイナリをどの コンパイラによるものにするとかいろいろ障害があるね。
883 :
874 :2006/07/21(金) 07:11:36
適当なクラスがあって、 while gets a=$_.split(/,/) hoge[a[0]][a[1]]="○" end hoge.fieldseparator=nil hoge.rowseparator="\n" puts hoge.to_s とすれば表になる、みたいなのがあればいいなと 思いましたが、ないですか。 勉強がてら自分でクラスにまとめてみます。 ありがとうございました。
>>879 なんか最初に書いてたことと問題が違う気がするんだが?
初心者の向きにはこっちの方がわかりやすい気がする。
"hoge_huga_hage".split("_").map{|x| x.capitalize}.join => "HogeHugaHage"
>>882 それでちょうど One Click Installer の Curt Hibbs も悩んでたりするようだね。
>>887 規則性に乗っ取って取得するのもいいんですが
この場合何でうまくいかないのかそれが気になる物で
なんだせっかく自動で動くように書き直してたのに(w
>>888 「str.scan(/<a href="(.*?)">次の40件/s) がブロックを伴ってないから」
要は { } の書き忘れですな
いじょ
>>889 str.scan(/<a href="(.*?)">次の40件/s) {|i|
print "#"
nurl = url1 + i[0]
getn(nurl)
}
こういうことですか?
でも駄目なようです..
自動で動く版、よかったら見せてください。
str.scan(/<a href="(.*?)">次の40件/s) {|i| print "#" nurl = url1 + i[0] p nurl # 内容確認 getn(nurl) } ということで渡すurlがどうなってるか確認してみるといい。 ぶっちゃけURLが間違ってる Infoseekのほうで「次の40件」という文字列を含まない別のページを返してきてるから 2度目のgetnのココで何もマッチせずに終わってる。
>>891 どうもありがとうございました
あんな間違いが起きていたと考えてなかったです
あんまり初心者的でない方法。
ruby -ropen-uri -rhpricot -e 'h="
http://money.www.infoseek.co.jp ";a="href";d=Hpricot(open("#{h}/MnJbn/jbnindex/"));(d/"#content//li/a").each{|i|i.attributes[a]=h+i.attributes[a];puts i}'
>>892 なんでもかんでも302を返してリダイレクトするインフォシークのアホ仕様の被害者さんですな。
net/httpでアクセスしてればもうちょっと早くに異変に気づけたと思うんだけども。
open-uriはリダイレクトでも無言で辿って別のページを取り込んでしまうので注意(抑制法はある?)。
def check(server,path)
Net::HTTP.start(server, 80){ |http|
response=http.get(path)
puts "net/http"
puts "response.message: #{response.message}"
puts "title: #{response.body.scan(/<title>.+?<\/title>/)}"
}
html=open("
http://#{server}#{path} ").read #2chブラウザでは"に見える
puts "open-uri"
puts "title: #{html.scan(/<title>.+?<\/title>/)}"
end
check('money.www.infoseek.co.jp','/MnJbn/jbnindex/?st=41') # 正しいURL
check('money.www.infoseek.co.jp','//MnJbn/jbnindex/?st=41')# 誤りなURL
結果:
net/http
response.message: OK
title: <title>ニュース 一覧 - Infoseek マネー</title>
open-uri
title: <title>ニュース 一覧 - Infoseek マネー</title>
net/http
response.message: Moved Temporarily
title:
open-uri
title: <title>株価 外為 信用情報 - Infoseek マネー</title>
いや、これはどう考えてもInfoseekのほうが変態的なだけであって 302の移動先に自動でアクセスするopen-uriの挙動は正当なもんだと思うぞ
Hash の Hash を使うときの初期化って、 h=Hash.new({}) が正解?
h=Hash.new()
漏れは h = Hash.new h['hoge'] = fuga で使ってるけど
>>898 ハッシュのハッシュを使うにしても
該当のキーが存在しない場合にも空ハッシュを返したいならそれで正解
nilを返されると困る場合やnil判定すると処理がややっこになる場合か
個人的にはそういう理由がなければデフォルトのまま生成して
素直にnil返して貰った方が気が楽かなぁ
>>896 不正解、かも。用途によるが。
h = Hash.new({})
h1 = h["ahaha"]
h1["hoge"] = "fuga"
p h["a"]["hoge"] #=> "fuga"
h = Hash.new() {|k, k| h[k] = defvalue } とか h = Hash.new() { raise } あたりの
方が当り障りがないことが多いと思う。
ハッシュは即値じゃないから、初期値は ブロック形式で指定した方が良いかもね
なんかかっこわるい
elseifじゃなくてelsifにヤラレタ。
>>903 >elseifじゃなくてelsifにヤラレタ。
昔の英語の ruby ml で、何度も見た。
905 :
896 :2006/07/23(日) 22:46:58
質問の仕方が悪かったです。スマソ h={} while なにか h[それか]={} if h[それか]==nil ※ h[それか][これか]=あれか end hashのhashを作るとき、※の処理をするのが冗長な気がしたので、 h=Hash.new({}) と書いてみたら ※ の行を削除しても とりあえず動いたんですが、 この書き方でいいのかな〜。 ハッシュのハッシュの初期化にはなんか別の書き方があるのかな〜 と思って質問しました。
そういう目的なら、Hash.new({}) よりも Hash.new(){ Hash.new } がよいね。 h = Hash.new({}) h[1][2] = 3 p h[4] #=> {2 => 3} が表示されるけど、{} であって欲しいでしょ? あと、関係ないけどキーが登録されているかどうかは Hash#[] == nil じゃなくて、Hash#key?、 Hash#include? あたりで調べた方がいい。
>>906 > そういう目的なら、Hash.new({}) よりも Hash.new(){ Hash.new } がよいね。
それ違うくない?
irb> hoge = Hash.new{Hash.new}
=> {}
irb> hoge[1][2] = 3
=> 3
irb> hoge[4]
=> {}
irb> hoge[1]
=> {}
↑こうなるよ?
↓こっちが正解だと思うけど
irb> fuga = Hash.new{|h,k| h[k] = {}}
=> {}
irb> fuga[1][2] = 3
=> 3
irb> fuga[4]
=> {}
irb> fuga[1]
=> {2=>3}
908 :
りぃか :2006/07/24(月) 18:40:51
助けてください(>_<) 学校の課題で三角形の塗りつぶしをやっているのですが、エラーが消えなくて困っています。 エラーはこんな感じです。 「triangle.rb:219:in '-': nil can't be coerced into Fixnum (TypeError)」 使用環境はruby 1.6.7 (2002-03-19) [i386-linux]です。 プログラミング初心者です、どうかよろしくおねがいします。
triangle.rbの219行目にある引き算の 引かれる数にあたる変数か何かの値がnilなので 引き算を実行できないぞバカなんとかしろバカ だそうな
長くならなくてもそっちのスレに行け。
912 :
りぃか :2006/07/24(月) 19:02:08
長くなるので途中飛ばして書きます。 v = vertices() x0 = v[0][0] x1 = v[1][0] x2 = v[2][0] それからxの大小関係で場合分けをして、小さい順にax,bx,cxってしました。 問題の219行目が my = (ay-cy)*(fx-cy)/(ax-cx)+cy です。
913 :
りぃか :2006/07/24(月) 20:24:16
たびたびすみません。 あと909さんありがとうございました。 ayやcxに数字入れてみたら、ちゃんと三角形が表示されました。 なぜaxとかのままだとnilになってしまうのか、教えていただきたいです。 よろしくおねがいします。
夏だな
夏だよ
おう なつだぜ おれは げんきだぜ
どうでもいいけど、もっと新しいRuby入れたいところだな。
夏になると小学生までがrubyに手を出すわけ?
920 :
デフォルトの名無しさん :2006/07/24(月) 23:02:19
「3の倍数ではない」というのは、どのように打てば良いのか教えてください。 if n ??? 3 then print n, "は", 3, "の倍数ではありません。\n"
n % 3 != 0
宿題なんだからそれくらい教科書嫁よ
今、小学生の間でRubyが熱い。
924 :
りぃか :2006/07/25(火) 03:02:36
>>917 さん
ご指摘ごもっともです。ありがとうございます。
長くなりますが、書いてみます。邪魔だったらごめんなさい。
セミコロンを使ってる部分は、本当は改行してます。
require 'gfc'; require 'line_utils'; class Gfc; class Triangle
def fill(g,c)
v = vertices() # v = [[x0,y0],[x1,y1],[x2,y2]]; color=c[0]
g.draw_line(v[0][0],v[0][1],v[1][0],v[1][1],color)
g.draw_line(v[1][0],v[1][1],v[2][0],v[2][1],color)
g.draw_line(v[2][0],v[2][1],v[0][0],v[0][1],color)
x0 = v[0][0]; x1 = v[1][0]; x2 = v[2][0]; y0 = v[0][1]; y1 = v[1][1]; y2 = v[2][1]
if x0 < x1; if x0 < x2; ax = x0; ay = x0; if x1 < x2; bx = x1; by = y1; cx = x2; cy = y2
(上と同様に、if,elseを使って場合分け、省略)end
## ax < bx < cx となるようにした
fx = ax
## ここから下は,なぜかaxとかがnilになる.
fx.upto(cx) do |x|
my = (ay-cy)*(fx-cx)/(ax-cx)+cy
if fx < bx; ny = (ay-by)*(fx-bx)/(ax-bx)+by
else; ny = (by-cy)*(fx-cx)/(bx-cx)+cy; end
g.draw_vline(my,ny,x,color)
fx = fx + 1
end; end; end; end
g=Gfc.new(300,300,Gfc::COLOR_COLOR); t=Gfc::Triangle.new [[120,60],[50,190],[220,130]]
g.fill_figure(t,[0,0,255]); g.view
draw_lineというのは自分で定義したもので、線分を書くプログラムです。
何故axなどがnilになってしまうのでしょうか??(>_<)
>## ax < bx < cx となるようにした どうやってそうしたんだよ。そこがバグってるに決まってるだろ。
くだ質ですが ruby 1.8.4 (2005-12-24) [i386-mswin32] の環境で 文字列クラスのメモリ領域を開放するのって↓のやり方で正しいですか? str = "" それとクラス関数で class IniParam def get_string( key, default ) ret = default f = open("myprog.ini", 'r') ini = f.read f.close ini.scan(/^#{key} *=.*/){ |s| ret = s.gsub(/^#{key} *= *(.*)/, '\1') } ret end end 上記のget_string関数を呼び出した後で ローカルで使った ini のメモリ領域って開放されますか?
924の情報の出し方は、わかってからかってるのか真剣に悩んでいるのかちっともわからん。
>>927 >文字列クラスのメモリ領域を開放するのって↓のやり方で正しいですか?
いいえ。その後解放されるかもしれないしされないかもしれません。
あと、どうでもいいけど、普通は str = nil とするかと思います。
>ローカルで使った ini のメモリ領域って開放されますか?
いいえ。その後解放されるかもしれないしされないかもしれません。
どうでもいいけど、「開放」じゃなくて「解放」な。
if /hoge/ !=~ のようなことがしたいのですが unless /hoge/ =~ でやるのが普通なんでしょうか?
普通 !~ だよな
>>927 Rubyのメモリの解放は、GCが勝手にやってくれるので
あまり気にしなくてもいい
どうしても意図的にやりたければ
str = nil
GC.start
でおk
>>930 一応、unlessの方が一般的だと思われる
>>933 >Rubyのメモリの解放は、GCが勝手にやってくれる
だから、解放されるかもしれないしされないかも(ry
>>933 はイマイチ理解してなさそうだな。いろいろ。
$'と$`で格納する情報が異なることを知ったんですが`はキーボードのどこを打つと出ますかこの書き込みはコピペです。
$`の部分がコピペということです。どなたかご教授お願いします。
普通に出ました失礼しました。
940 :
933 :2006/07/25(火) 18:21:03
むしろ933はここにいる他の誰よりも詳しいような気がする。
942 :
927 :2006/07/25(火) 19:44:56
>>929 >>933 レスありがとうございます。いろいろ考えましたが、ガベコレに任せることにします。
別件でまた質問で恐縮なのですが
sec_files.each { |s|
dist_files.each { |t|
break if /^#{s.file}$/ == t.file
}
disp_string "削除:[#{s.id}] #{s.file}" if $~ == nil
}
↑の処理するときに、一度も内側のイテレータ通らなかった時って、
$~ が不定だと思うんですが、$~ = nil って勝手に代入しても大丈夫でしょうか?
それとも何かほかの良い方法がありますでしょうか?
>>942 いまのところ、不定じゃなくてnilになると思うが、変わるかもしれないし、
普通に一時変数を使ったらどうだ?
if $~ == nil は、 unless $~ と書く方がいいよ。
>>944 意味違ってるじゃん。 unless肯定派にしても unless $~.nil? だろ。
>>942 dist_filesに一致しないものについてdisp_stringを呼びたいんなら、any?を
使うほうがわかりやすいと思う。
あと、RegexpとStringでマッチさせたいなら==じゃなくて=~だな。
pat = /^#{s.file}$/
unless dist_files.any? {|t| pat =~ t.file}
disp_string "削除:[#{s.id}] #{s.file}"
end
>>945 そもそも$~.nil?にする必要がないもの
値がfalseである可能性があるならともかく
そうでなければわざわざnil?を使う必要はない
>>948 どっちが自然に感じるかは人による
俺はnil?付けない派だなー
945は痛いということがわかった。
というか、unlessは俺の言語感覚になじまないので使わない
if厨はこれだからwwwwwww if厨ってなんだ
unlessやnil?は各人の好みが出るよな 実用上は大差ないだけに
オレはif使わずにunlessだけでやるよ?
955 :
デフォルトの名無しさん :2006/07/26(水) 10:16:26
rubyのGraphics Library で一番メジャーなのは何ですか。 GDは2001年に開発がストップしているみたいなのですが。
956 :
デフォルトの名無しさん :2006/07/26(水) 10:36:20
>>955 そもそも、rubyでGUIを作るか? 他にツールはいくらでもあるが、
まあ、ruby/tkか、ruby/Gtkだろ。
unless と if not は意味が違うからね。
>>956 RMagickとかそんな答えを期待しているような気がするが。
imlibのラッパーがあるならそれでもいいかも。
unlessにはelsifを続けられないという致命的な欠点があるな。
Windowsで、OneClickInstaller + gem で rakeをインストールしました。 cygwinのbashで、rake.batは入るんですが、rakeが(スクリプト)が入ってくれません。 rakeを入れる方法はないですか?
>>961 >cygwinのbashで、rake.batは入るんですが、
意味がわからん。
rake.batはインストールされるんですが、rakeはインストールされないんです・・・
あー、意味がわかった。 cygwinのbashから実行したいからrakeスクリプトそのものが欲しいんだけど、 ということか。 で、意味はわかったけど、解決方法は知らん。 誰か詳しい人、よろ。
cygwinのパッケージで入れる。
うん rake.batが、rakeで実行できればいいんだけどねー って、alias作ればいいのか orz
普通にリナクスつかえばいいと思う。 バーチャルPCも無料公開されてるし。
968 :
k :2006/07/27(木) 06:19:21
969 :
デフォルトの名無しさん :2006/07/27(木) 13:17:59
>>959 ありがとうございます。
参考にします。
970 :
デフォルトの名無しさん :2006/07/27(木) 15:24:00
うい
$KCODE を指定すれば正規表現が日本語対応するってのは 完全ではないのかな? ruby -Ke -e 'p(/[^あ]い/ =~ "あい")' がマッチしないのに ruby -Ke -e 'p(/[^あ]い/i =~ "あい")' がマッチしてしまう。
>>971 それ()1.8系列のバグ。
何ヶ月か前の ruby-list で報告されてたはず。
1.8.5のpreviewか。1.8.4でもstable-snapshotなら多分おk
おいおい、よりによってコードロジックからでは見えにくい 正規表現機能にバグがあるのかよ。 やっぱ個人が開発してるフリーソフトは恐くて業務には使えんなあ…
0点。 はい、次の方〜
商用の場合、こういった修正はむしろ手抜き。 ビジネスではコスト意識が出てくるから、繊細な作業ってカットされる。 針の穴に糸を通すような作業は、時間を浪費できるフリーソフトならではのものだよ。 なお、漢字を100%きっちりサポートする正規表現エンジンはかなり少数派。 (だからRubyの正規表現エンジンは次世代で交代する) この辺り、世間的に認知されてないから、どこもサポートが悪いの。
これでこまるひとってなんでもかんでも正規表現で済ませようとするひとだけでしょ
978 :
971 :2006/07/28(金) 11:32:16
>>973 ありがとう。バグか制限かが知りたかったんです。
それでプログラミングの方針が変わりますから。
バージョンは 1.8.4 リリース版です。
そもそも日本語を正規表現でマッチさせようとしているのに"i"をつけるのがヘン
そんなこと言うならそもそものそもそもとして IGNORECASEの有無によって日本語文字の正規表現の挙動が変化すること自体 「ぜってーありえねー」と思うんだがどうか
>>980 「ありえねー」と考えるほうがありえねー。
ありえるだろ。
こういうときにRubyの良さを再認識させられるね
ありえるとしても2バイト文字の正規表現の挙動が i の有無で変化してほしくはないな
984 :
デフォルトの名無しさん :2006/07/28(金) 14:22:38
あるサイトで音?動画?見ようと思って書いてあったとおりにいろんなのインストール しても聞けないし、前聞けたのまで出来なくなっちゃったんですけどどうしたらいいですか?
>>983 何を言いたいのか良く分からんが、だからこそ修正された。
>>984 小学生大嫌い板、あるいは、日本語のお勉強板に行け。
987 :
デフォルトの名無しさん :2006/07/28(金) 15:10:38
ちょっとお聞きしたいのですが、
drubyをWindowsで動かそうとして、
ttp://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-list/37530?37432-39039 から始まるスレッドで
# dhello.rb
require 'drb/drb'
class World
def hello
'Hello, World.'
end
end
uri = ARGV.shift
DRb.start_service(uri, World.new)
puts DRb.uri
puts '[return] to exit'
gets
というサンプルがあって、Windowsで使う場合は、
getsはスレッド全部をとめるから、
Thread.list.each do |t|
t.join
end
にしておけって書いてあるのですが、実行すると確かにそれでうまくはいくのですが、
CPUパワーが100%になってしまいます。もちろん全力でループしているせいなのですが、
これってなんとかならないんですか?CPUを浪費せずに待ちたいです。
そのスレッドの最後にsleepする例が載ってるわけだが。
なんでRubyって、馬鹿にする輩が多いんですか? 私はJavaやPerlも一通り入門程度の本で学んだだけだけど、 就職の時にRubyが出来たほうが、他と違う言語が出来るという 事でアピールになるかなと思って、しっかり勉強してみようかな と思ってます。止めた方がいいですか?
>>989 そもそも入門書読んだ程度で「できる」なんて言うな。
1行目の表現見たら答える気半減
>>989 Rubyを使っていて他人から評価されることはまず無い
あとは好きにしろ
誰か新スレ立てて
テンプレ書いて。
テンプレ
988>> sleepすると、スレッド全部がsleepするから使えない。 だから逃げ道としてwhileで回しているわけだ。 んで、やり方継続募集中。
てか別に
>>1 のままでいいじゃん
他の部分は好きな人が適当に書くってことで
>>989 そういう動機ならやめとけ
あと馬鹿にする輩が多いのは
PerlでもJavaでもPHPでもPythonでもかなりいるから
Rubyに限った話ではない
馬鹿にする香具師は自分の少ない知識がばれたり テリトリーを侵されたりするのを恐れる小心者。 まともに使いこなしてる香具師は馬鹿にしたりはしないから。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。