1 :
デフォルトの名無しさん :
2007/10/25(木) 16:42:55 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは
>>2-10 あたりを見てください。Ruby on Railsの質問はWebProg板のRailsスレで。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・ぐぐる
・マニュアルで探す
http://www.ruby-lang.org/ja/man/ ・FAQを読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(なるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
3 :
デフォルトの名無しさん :2007/10/25(木) 16:44:08
莫大な量のURLは初心者のやる気をなくさせる孔明の罠としか思えんな
>>11 全部読まなきゃいけない訳でもないし
むしろ今時のコピペしたがる風潮で育った子らには
安心感を与えるんじゃない?
14 :
デフォルトの名無しさん :2007/10/25(木) 17:43:36
前スレにおける「テンプレ読め」レス数は1レスでした。
質問です。
WWW::Mechanize を使い、リファラをつけて、ページにアクセスしたいのですが、引数がよくわかりません。
agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 6'
page = agent.get('
http:// 〜〜','第二引数がリファラ??')
get() の第二引数がリファラという事のようなので、
agent.get('
http:// 〜〜','
http://google.co.jp ')
としても、エラーがでてしまいます。
どなたか、ご存知のかたはいますでしょうか?
マニュアルくらい読めって
漏れ知ってるぜ
むしろわざわざマニュアルわかりにくいWWW::Mechanizeでなければならん理由がわからん
便利だと思うけどなぁ ほかにもっといいものある?
Nora とか scRUBYt! とか?
Noraって便利なのかな るびま記事のあの顔写真で、第一印象悪くて試したことないんだが というかあれスクレイピングできるの?
できるっちゃよ。使い勝手もまあ良いっちゃ。
んじゃかるーく零崎を始めるちや
24 :
デフォルトの名無しさん :2007/10/28(日) 06:08:27
たのしいRubyは1.8対応の第2版のほうがいいですか? 1.6対応ていうのが図書館にあるんだけど さてどうしたもんかね
Ruby1.6を使ってるなら古いほうがいいかもしれない
Nora試してみようとしたらマニュアルが死んでた やっぱりWEBrickだな
たのしいRubyのレベルではたいして変わらんので、金出して買ってずっと手元に置くんでなければ第1版でもおk 「1.6では動いたけど1.8では動かない」という記述は稀だから …なんかまずいのあったっけ?
>>24 気合いの入れ方による。
本気で勉強したいなら、新しいのをかって手元に置いた方がいい。
触ってみたいだけなら、古い方で十分。
29 :
デフォルトの名無しさん :2007/10/29(月) 00:08:40
RubyGemsについて質問させていただきます。 Rubyをワンクリックのやつでインストールして、 RubyGemsもちゃんと入ってるのですが、 Railsをインストールしようと思ってRubyGemsを実行したときに、 C:\>gem install rails ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError) 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または 接続済みのホストが応答しなかったため、確立された接続は失敗しました。 - connect(2)(Errno::ETIMEDOUT) というエラーがでてしまいます。なぜでしょうか。教えてください。 よろしくお願いします。
gem使用時でいちばん見たくないエラーだ ・ プロクシあるいはそれに類するセキュリティ機能があるならプロクシを環境変数に設定する ・ パーソナルファイアウォールを使用しているならruby.exeか何かにインターネット接続を許可する それでなきゃ知らん
Server 2003 に SP2 だとそうなるんじゃないかな DEP を off にするか一部の exe に限定するとか
>>26 あれ?スクレイピングするんじゃなかったの?何故いきなり WEBrick ?
Windows環境でUTF-16BigEndianのファイルを読み込みたいのですがうまくいきません こんなコードです f_in = open(filename, 'r') #UTF-16beファイルをS-JISに変換しながら配列に格納 raw_data = f_in.readlines.collect do | line | # line.kconv(Kconv::SJIS, Kconv::UTF16) # カタカナ変換されちゃうらしいので使えない # 出力SJIS 入力UTF-16BE mimeデコード無し カタカナ変換無し NKF.nkf('-s -W16 -m0 -x', line).chomp end f_in.close puts "line count = #{raw_data.size}" Windowsなので-Ks でShift-JISに設定しています -KオプションにはUTF16はなさそうなので、-Kuとかしてみても Invalid char '\377' in expression と出て実行できません どなたか、よろしくお願いします
連投すみません 先ほどのプログラムで、実際は193行ある入力ファイルが74行と表示されます
>>34 ,35
まずオープンする時は'rb'とするか、オープンした後binmode。
読むときはいったんreadで全部読み込んで、その読み込んだ文字列全体を一括で変換。
変換した後、each_lineで回すなりsplitして配列にするなり好きにしてくれ。
読み込めました! こんなコードになりました f_in = open(@news_source, 'rb') all_file = NKF.nkf('-s -W16 -m0 -x', f_in.read) raw_data = all_file.split("\n") puts "line count = #{raw_data.size}" やっと加工に移れます ありがとうございました
大学の試験以下だな
最低のロゴ
41 :
29 :2007/10/30(火) 21:39:18
>>30-32 大変遅くなりましたが何とか解消しました。
原因はウイルスセキュリティのファイアウォールだったようです。
なぜかruby.exeに例外許可を与えてもブロックしていたらしく
ファイアウォールを解除してgemを実行してみたら
すんなり通りました。
レスくださった方ありがとうございました。
出遅れたけど書いとくか・・・ count = Hash.new(0) File.read("test.txt").each_byte{|c| count[c.chr] += 1 } count.to_a.sort.each{|k,v| puts k + " : " + v.to_s }
>>42 どうでもいいんだけど、その用途なら Hash より Array じゃね?
count = Array.new(255, 0)
File.read("test.txt").each_byte{|c|
count[c] += 1
}
count.each_index{
|i|
if count[i] > 0 then
puts i.chr + ":" + count[i].to_s
end
}
こういう枚挙は素直にハッシュでいいよ…
入門レベルでなければ Hash.new {|h, k| h[k] = 0 }を集計初期値につかってinjectだな。
a = "eeeeeddddcccbba".split(//) a.uniq.sort.each{|e| puts "#{e}は#{a.grep(e).size}個"} aは1個 bは2個 cは3個 dは4個 eは5個 たぶんこれが素直な最短
「番地」を考えて格納するような配列は あんま初心者スレ的に素直とは思えねーんだがどうだろう
>>47 if count[i] > 0 then のどこが素直なのかと
プログラミング出自によって配列依存度は違うと思われ Cやフォートランから来た人はデータ格納に要素数決め打ちの配列をよく使う 今回ならアルファベット26文字だから26個の要素の配列作って数を格納 Perlから来た人はハッシュをデータ保存に使うことをあまり気にしないと思う
>>49 このご時世にスクリプト言語でASCIIコードなんぞ持ち出すのが激しく嫌
文字コードの細かいところが関わった処理かと思ったら何よコレって感じ
>>43 だとマルチバイト文字も数えるように拡張するのがめんどいな。
手作業で文字を数えるとき、ノートかなんかに、
i)新しい文字が出たら書く
ii)その文字の横に「正」でも書いて数える
ってするイメージがあるから、ifnone=0のHashを使うほうが
そのイメージに合致する感じがある。
ノートに書くって都合上、順番はつくけど、カウント作業の際その順序は問題に
ならないから、順番付けがない。
また、この方法でカウント作業を始める前に、出て来る可能性のある文字の集合なんて
いちいち意識しないと思うので、255長の配列をあらかじめ取るっていうのも何だかな、と思う。
こういう考えから、文字のカウントにはやっぱHashのほうが合ったデータ構造のような希ガス。
や、マルチバイト以前に、テキストデータに改行が含まれてるということにするだけで 今回のたいていの短いスクリプトは変なデータ表示するぞ(w てかこのスクリプトはアドホックな解法であって、汎用性とか意味とか使いまわしとかは考えてないだろ
str.split(/\s+/).map{|word| word.split(//) }.flatten.each …で、/\s+/以外は数えられるかな。重そうだ。
>>50 は?じゃあ
count.to_a.sort.each{|k,v|
これは素直なわけ?
>>56 それはおそらくただのミス
>>42 は Hash を sort すると配列が返ってくるということを知らないんだろ
irb> {1=>2, 3=>4}.sort
[[1, 2], [3, 4]]
「配列」が云々というのはカウント時のデータ格納手段についてだろうし
そこは表示用に簡易的に(適当に)書いてるだけだろ 配列がいいって言うならその理由をちゃんと書け
素直どうこう言ってる奴がいたから、その浅はかさバカにしてみただけだよ。
とりあえずいきなり配列を持ち出してなおかつ領域確保する
>>43 は時代遅れの化石なので自覚するように
スレタイにはそぐわないかもしれんが、珍しく内容のある議論 してるんだから、煽るのはやめよーぜ。
はい、むかついたのであおってみました
話についていけなくてムカつくのは、 一定未満の学歴の人にはしばしばあることらしいです。
>>65 あれが素直なら、
↓も素直だろ
>if count[i] > 0 then のどこが素直なのかと
>if count[i] > 0 then コレは十分素直だと思うけど。 HashかArray,数える部分はどっちが素直かと聞かれれば、個人的にはHashかな。 何かの種類別にカウントする時に、「この時はHashあの時はArray」ってやるより、 「とりあえずHash」って方が頭使わないから。 頭使わないってことは、ある意味「素直」ってことなんじゃね? ま、「素直」の意味の取り方次第なんだろうけどね。
Array版のほうでサイズを255って決めうちしてるところ以外は 正直、どっちでもいいと思う。
いや、今回の配列のかっこ悪いとこは2つあって ・要素数が事前に決め打ち ・意味的には count[chr-1] であるべきだった(いやこれは別にどうでもいいが) ・文字と対応させるには配列の番地を流用しなければならない あれ、3つになるか。まあいいや。 alphabets = Array(26, 0) File.read("test.txt").each_byte{|c| alphabets[c-97] += 1 } alphabets.each_with_index{|count,i| puts "#{(i+96).chr}は#{count}回です" unless count.zero? } だから、255でない、たとえこれでもやっぱかっこ悪いと思う
それを見て配列にする利点ってのがますます分からなくなった
そもそもこんなに引っ張るほど深いテーマでは無いのだろうけど、
煽るだけじゃなくて利点か意図を説明してほしい、
>>43 に
71 :
デフォルトの名無しさん :2007/11/01(木) 05:47:28
こんな所でこんな小さなことで熱くなってどうする、落ち着け。
43じゃないけど
>>70 ・わざわざソートする必要がない
・毎回ハッシュ値を計算する必要がないから速い
・Hashのようなデータ構造を組み込みでもってない言語でも使える(まあこのスレ的にはおまけの理由だな)
汎用性という点ではHashを使ったほうがいいけど、今回のお題は『アルファベットの出現頻度』を数えるのが目的であり、キーとなる値の範囲が明確で、しかも順番に並んでいる値だから、配列でも十分自然だと思う。
マルチバイトうんぬんいいだす
>>53 みたいなのは問題を自分勝手に拡張しててわめいてるようにしかみえない。
>>69 >いや、今回の配列のかっこ悪いとこは2つあって
>・要素数が事前に決め打ち
だって問題自体が要素数を決めうちしてるんだから、べつにいいじゃん。
しかもRubyの配列は固定長ではなく自動的に長くなるから、気にする必要ないと思うけど。
>・意味的には count[chr-1] であるべきだった(いやこれは別にどうでもいいが)
なんで1引く必要があるの?
>・文字と対応させるには配列の番地を流用しなければならない
なぜこれがかっこわるいの?アルファベットというデータの性質を利用した、ごく普通の方法だと思うけど。
Array, Hash が自然と思うかどうかはその人の経験じゃないのかな。 Hash 自体が初心者にはわからん、という考えも、初心者には Hash も Array も一緒という考え方もありうるし。今まで他言語 (Fortran, C/C++, Java, Pascal, etc)を長く使ってた人は考えないとすぐなんでも Array にすると思う。
配列の添え字でアクセスするかハッシュのキーでアクセスするかってのは結構深いかと まあそのへんはどっちでもいいっちゃいいんだけどな 今回の配列のカッコ悪さの本質はAsciiコードと配列添字の関係のあたりだと思う
スクリプト作成の見通し思考中にInteger#chrをどれくらい普通と思えるかどうかにかかってる。 これが平気な人はArrayの数字をアルファベットに変換することを何とも思わん。 これに「うへえぇ」と感じる人はHashを使うはず。 てか、こういう枚挙が全く未経験なのに「いきなりHashを選択できる」人ってそうはいないだろ。 たいていArray(とHash)を検討して、Arrayではどこかが「面倒」に思えたからHashを使おうかと考えるんじゃね?
>>75 まず Array があって Hash という考え方はやっぱり C とかをまず
勉強した人の発想だと思う(俺もそうだけど)。Perl/Ruby から入って
くれば、頻度を数える→Hash というのは教科書の典型例。例えば言葉の頻度の例とか。
(教科書は元が英語だから日本語になると厄介だけど)
>>75 ・一番最初に考えたデータ構造
(a 2個) (b 14個) (c 0個) (d 5個) ...
・配列にしてみる
[ ['a',2], ['b',14], ['c',0], ['d',5], ...]
・ちょwwwwこれただのハッシュwwww
{'a'=>2, 'b'=>14, 'c'=>0, 'd'=>5, ...}
・ハッシュへの登録方法を考える
h[文字abc] = 回数123
・おk
・ハッシュは順番がないから結果表示時に困ったことになりそう
・Hash#sortがあったのでsortしてみるとどっかで見た[ ['a',2], ['b',14], ['c',0], ['d',5], ...]に
・マニュアルのArray#assocをしばらく眺める
・うーん、使ったことないしハッシュでいいや
>>75 C とか Perl の経験もなく、いきなり
アルファベット → 数値 → Array のインデックス
という発想というか選択ができるひとも最近は少ないんじゃないかなあと思ったり。
ASCIIコードの利用がナチュラルに検討範囲に入るのはBASIC/マイコン世代の思考だと思ってる いや割とマジ
>>77 > 配列にしてみる
や、
> (a 2個) (b 14個) (c 0個) (d 5個) ...
というペア構造を見たら一発でハッシュを考えて欲しいなとちょっと思う
>>79 配列のインデックスに使おうとすると範囲外をちゃんと検出して
例外にしてやらなきゃだよな...とか考えてしまった自分の頭の
硬さにorz
ハッシュでやればとりあえずどんな文字でもカウントしちゃえる
ように作れるわけだし
>>75 >スクリプト作成の見通し思考中にInteger#chrをどれくらい普通と思えるかどうかにかかってる。
違う。HashのほうでもInteger#chrを使ってる。
>>42 をよくみてみろ。
>>52 >このご時世にスクリプト言語でASCIIコードなんぞ持ち出すのが激しく嫌
文字コードはHashのプログラムでも使ってるだろ?自分が理解できないからって駄々こねるなよ。
>文字コードの細かいところが関わった処理かと思ったら何よコレって感じ
どこが細かいのかさっぱりわからん。
>>42 も
>>43 もeach_byteしてる時点で、文字コードを使ってる点ではまったく同じなんだけど。
今回は『アルファベットの文字数』を数えるのが目的だから、Hashでも配列でもどっちも自然に書ける。
『配列は不自然』とか『文字コードを意識するのが面倒』いってるやつは頭が固すぎ。やり方がひとつしか思いつかない、発想が貧困なだけ。
そういうやり方もあるね、で終われば済む話。自分の知能の貧困さを認めず『配列は不自然』とか相手を罵倒するほうがよっぼと不自然。
でも正直言って
>>43 のプログラムもうまくない。たぶんHash相当が組み込みではない言語から入ってきたRuby初心者だろうけど。
count = Array.new(256, 0)
File.read("test.txt").each_byte {|c| count[c] += 1 }
count.each_with_index {|n, i| puts "#{i.chr}: #{n}" if n > 0 }
83 :
デフォルトの名無しさん :2007/11/01(木) 12:57:44
個人的には外部化してるから改行とか意図しない文字を考慮してしまうなぁ・・・
84 :
83 :2007/11/01(木) 12:58:16
ageすまん
もしかして、each_byteに拘ってるやつがいるのか?
前スレのfile.split(//)で一旦配列にするやつあたりが常道だろ? ASCIIコードを考える必要すらない。
なんで遠回りな
>>42 をいちいちベースに持ち出すんだい?
ってこっちのスレに貼られてないな
>>997 hash = {}
str.split(//).each do |c|
if hash[c].nil?
hash[c] = 1
else
hash[c] += 1
end
end
p hash
______________________________________________________________
>>998 file=File.open('g:\test.txt').read
h=Hash.new
file.split(//e).each do |s|
h[s] = 0 unless h.has_key?(s)
h[s] = h[s] + 1
end
h.sort.each do |a|
puts "#{a[0]}は#{a[1]}個です"
end
>>82 > そういうやり方もあるね、で終われば済む話。
そこで済ましちゃうのは思考停止で良くないというか、
どういうのがより良い方法かとか、こういうときはこっちの方が良いねとか、
あれこれ言い合って論じるのは有意義だと思うけどなあ。
てか、なんですぐそう喧嘩腰な口調になんねん?
2chねらーの心理というのは結構複雑で、 「出るところに出たら通用しないレベルの内容である」と自覚しているから2chに書いている一方、 2chの中に居る間は、その書き込みをもって「俺ってなんて"わかってる奴"なんだ」と本気で小鼻をひくひくさせてるんだ。
人が議論する場所を2chしか知らないと
>>88 のようなことを口走ってしまうので気をつけよう
とまぁ、こんな感じの「わかったふうな返し」で気分よくなれるわけだ。
文字の集計の時点で普通はHashだろw
配列を使う前提がないやつは文字→文字コード(数値)の変換はしない。
更に言えば
>>42 は文字コードになっちゃったから文字に直してるだけで文字コードなんか欲しくない。
>>89 どこでも同じだよな
2ch特有とか言ってるの見ると苦笑するしかない
「配列」という名前でも中身は連想配列って言語も結構あるよな
よっぽど変態なデータ型つかってるならともかく、HashかArrayぐらいだと TIMTOWTDIの範囲じゃねーの。お釈迦様の手の上で「俺のが普通」 「いや俺のが」って争っても意味内よ
>>94 俺もそう思うよ。結局自分にとって自然な方で処理すりゃいい。
自分のそれまでの経験によって変ってくるわけだから。
実際に書くコードの量もそんな変わらんわけだし。
俺は古い人だからあせっていたら、Hash 使うべきだと思いつつ
Array 使うだろうな。ちょっと考える暇あれば Hash 使うと思う。
本筋から外れるけど、 Ruby 1.9の ?x リテラルは1文字の文字列を返すんだよね。 あと str[i] とかも。
そうです。 String#ordで文字コードを得ます。
じゃあ、"A"[0][0][0][0][0][0][0][0][0][0] は "A" を返すの? いや、それはどうでもいいか。 それより、 str = "long long long long long .................................. string" str[5555] とやると、文字列の最初から一文字づつ数えるようになるの?
>俺は古い人だからあせっていたら、Hash 使うべきだと思いつつ >Array 使うだろうな。ちょっと考える暇あれば Hash 使うと思う。 一文字ごとに切り出すんなら 自前でHash値の計算をするときに それをコードとしても差し支えなかろう でoffsetを0にすればArrayと等価であることがわかる
>>99 じゃあ、str[n] って、短い文字列にしかもう使えないな。
あんまりつかったことないな。 つーか、当然文字が返ると思ってたら数値が返ってきてつかいにきー。
数値が返ってきた時点で頭から活用法が消える
>>102-103 いやいや、 str[n]という形では使ってないかもしれんけど、
str[n..,m]というよう風な形では使ってるんじゃ?
お前らなかなか面白い話をしてるじゃないか
Rubyのメソッドの引数は全てJava同様の「参照の値渡し」だと聞いたのですが, def hoge(a) a = a + [2] end b = [1] hoge(b) p b # => [1,2]が返って欲しいが [1] が返る となります。 本当に参照の値渡しなんでしょうか?
107 :
106 :2007/11/03(土) 02:34:53
すみません,自己解決しました。 a=a+[2]の時点でaという仮引数が新たなArrayオブジェクトを参照してしまったので,元のオブジェクトに変更が加わっていないんですね。
自己解決してないけど、まあいいか
def hoge(a) a << [2] end b = [1] hoge(b)
>>109 どーでもいい事かもしれないけど、それだと [1, 2] にならないよ
a.concat([2])だな
>>111 素直に a.push(2) ではダメ?
ちょっと気になってやってみたら
>>106 も [1,2] になる。(ruby-1.8.5)
>>112 > ちょっと気になってやってみたら
>>106 も [1,2] になる。(ruby-1.8.5)
いや、それありえないから。
それはそれとして、配列に要素を追加したいのなら << か push が、配列に配列を連結したいのなら concat が、それぞれ「素直」だと思う。
>>112 手元で試したら << も push も要素の追加になったぞ(ruby-1.8.5)
> ruby -ve "p [1] << [2]" ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mingw32] [1, [2]]
配列に「1個だけ足す」のはカッコの使い方とか間違えやすいから気をつけないとな 配列への << は見かけだけ汎用性がある状態だから嫌い concatかpushのどちらかだけを使うようにしてる
117 :
デフォルトの名無しさん :2007/11/03(土) 13:53:26
def hoge(a) a << 2 end b = [1] hoge(b)
a = [1, 2, 3] + [4, 5, 6] のときって [5, 7, 9] になって欲しいよね [1, 2, 3, 4, 5, 6] って違和感ありまくり
119 :
デフォルトの名無しさん :2007/11/03(土) 13:57:45
[1, 2, 3, [4, 5, 6]] じゃないのか?
>>118 なぜMatrixを使わない
>>119 [1, 2, 3, 4, 5, 6]で合ってるよ
>>113 >
>>112 > > ちょっと気になってやってみたら
>>106 も [1,2] になる。(ruby-1.8.5)
> いや、それありえないから。
ありえない、ってやってみたの?
p [1]+[2] も [1,2] になるし、
>>106 も [1,2] 返す。
ありえないという根拠を教えてもらえるかな?
だから数値以外に記号の操作使うのはミス誘発しがちでイヤなんだよなあ
>>120 [1, 2, 3] + [4, 5, 6] が [5, 7, 9] になるのはごく普通に数学の行列の計算だよな
行列とみなして計算させれば一発だ
irb> require 'matrix'
irb> (Vector.elements([1,2,3]) + Vector.elements([4,5,6]) ).to_a
[5, 7, 9]
>>121 それは君がirbで実行していて hoge(b) の返り値を見てるからだよ
他の人は p で表示される b の値を見てる
irb> def hoge(a)
irb> a = a + [2]
irb> end
nil
irb> b = [1]
[1]
irb> hoge(b)
[1, 2]
irb> p b
[1]
nil
irb>
def hoge(a) a += [2] end b = [1] hoge(b) p b # => [1,2]が返る
>>123 えぇそんなことだったの?無意識のうちに hoge(b) を見ていた。
irb ではないけど。
#!/usr/bin/ruby
def hoge(a)
a = a + [2]
end
b = [1]
p hoge(b)
初めの人もそういう問題だったの??それはこんな凝ったことじゃなくても
x=1 ; x+1; p x → x=1; x=x+1; p x
ってだけなんだが。
元のソースみりゃそう書いてあるが
いや、だから単にメソッド内のスコープの問題 それ以降のレスも「オブジェクトIDが更新されない」concatとか出してるだろうに
なんという手強い
>>125 これが真の初心者か
そしてそんな125をスルーせず、きちんと解答するお前らの優しさに感動した
>>106 は参照の値渡しとか言ってるんで要は
b = [1]
before = b.__id__
hoge(b)
after = b.__id__
p after.eql?(before) #=> trueになって欲しい
ってことだよね?
hoge の中の動作は = や += では駄目で concat や push はおkのはず
>>131 class Hoge
def initialize(data)
@data = data
end
…
という自作クラスで、メソッド間のデータ受け渡しに @data 流用して @data['rawhtml']=html とか使いまくってたら
引数の元の data が凄いことになってて泣いたことを思い出した
dup する癖つけたほうがいいんだろうか
hoge! にしないといけないんじゃなかったっけか
>>118 それはArrayの振舞いじゃない。
ベクトルとか行列の振舞いだ。
なるべく参照透明で非破壊的にしたほうが、後々、見通しいいよ。 代入は操作を非汎用的にしてしまう。
137 :
デフォルトの名無しさん :2007/11/03(土) 15:41:44
gemsでインストールしたライブラリのパスは どのように設定してますか? mailfactory-1.2.3というライブラリをgemsでインストールしたら, /opt/local/lib/ruby/gems/1.8/gems/mailfactory-1.2.3/mailfactory.rb としてインストールされました。 そこで, export RUBYLIB=/opt/local/lib/ruby/gems/1.8/gems/mailfactory-1.2.3/ としたのですが,これだと,gemsでインストールしたライブラリは, その都度, export RUBYLIB=/opt/local/lib/ruby/gems/1.8/gems/mailfactory-1.2.3/:/opt/local/lib/ruby/gems/1.8/gems/hoge/ みたいにRUBYLIBに追加していくことになります。 そんなものなのですか?それとも,何か工夫してる?
そんなものなのです
>>137 以下の二通りの方法がある
1. gemの中身(lib)をsite_rubyディレクトリに手動でコピー
2. 環境変数RUBYOPTに -rubygems を追加
2. 環境変数RUBYOPTに -rubygems を追加 で間違いないが、利用するスクリプトに require 'rubygems" するやりかたもある。
141 :
137 :2007/11/03(土) 16:14:17
>>139 参考にググったら,先にrequire 'rubygems'をしておく
という方法もあるようです。
2.の方法か,require 'rubygems'が良さそうです。
どうもありがとうございました。
142 :
デフォルトの名無しさん :2007/11/03(土) 17:23:34
プログラミングRubyライブラリ編(第2版)って 標準ライブラリをすべて掲載してる? 「すべての標準ライブラリを...」って書いてるけど
「標準ライブラリ」だからな
先行書籍で解説されている基本的な部分は省略されている可能性が しかもどこが省略されてるかは本には書いてない
145 :
デフォルトの名無しさん :2007/11/03(土) 19:28:35
>>137 横から乗っかってスマソ
mailfactoryとTMailは,どっちがおすすめ?
TMailは,2004年で0.10.8のまま開発が止まっているし,
rubygemsではインスコできないし
でも,日本語メールの扱い良さげだし
ごめん、gemも出てたわ。
148 :
デフォルトの名無しさん :2007/11/03(土) 20:27:06
>>147 うわっ,ほんの数週間前じゃん。知らんかった。
150 :
デフォルトの名無しさん :2007/11/04(日) 00:03:16
gem search tmail -r gem query -n tmail -r どちらをやっても,見つからないっす。どして?
>The gem servers are not updating right this minute as the index is being
>rebuilt, however, once they are up you should be able to:
とはあるが、10月29日づけだし更新されてないなんてありえんよなぁ常考。
しかし、確かにないようなので、↓ここから落としてローカルgemで入れとくとか。
http://rubyforge.org/frs/?group_id=4512
サブクラスからでは参照できないメンバ変数を定義したい場合は どうすればいいのでしょうか?
>>133 他のクラスの変数データをどうやって参照すれば適当なのかってよくわからん
def initialize(data)
@data=data
end
としておくべきなのか
def initialize
@data=BaseClass.data
end
とするほうがいいこともあるのかいつも悩む
変数データを実際にいちいちコピーしてるわけじゃないんだから名前参照するくらいガンガンやっとけという気もするし
名前参照するだけならインスタンス変数として参照するようにしたほうがスマートじゃね?とか
initializeするクラスのほうで利用するクラス決め打ちしちゃったら
将来に決め打ちした以外のクラスから利用したくなった時死にそうになったりしねえ?とか
>>152 Rubyでは「サブクラスから参照できないインスタンス変数」を作ることはできません
変数の名前の衝突をシステムで回避することはできませんので変数名で泥臭く対処してください
大昔「プライベートインスタンス変数を作ろうぜ」という話が出たことはあるようだけど、結局どうなったんだか
# -----------------------------
class Main
def initialize
@hoge='hoge!'
end
attr_reader :hoge
end
class Sub < Main
def run
p @hoge
end
end
p Main.new.hoge #=> "hoge!"
p Sub.new.hoge #=> "hoge!"
Sub.new.run #=> "hoge!" ← nilになって欲しい
155 :
152 :2007/11/04(日) 13:11:31
>>154 なるほど。数少ない(シンタックス面での)Rubyの欠点みたいなんですね、
ありがとうございました。
漏れはそれは欠点だとは思わない
サブクラスから利用できることは利点は多いが 制限の選択肢は提供されてもいいとは思う
というか、むしろサブクラスに対してもプライベートな変数を デフォルトにすべきでしょ。 値の設定、取得はattrつかえばできるんだし、スーパークラスで使われている メンバ変数を知らない内に変更しちゃうデメリットは結構大きいと思う。
>>157 利点って何?
それは「オブジェクト指向言語Ruby」において、本当に利点と言っていいべき利点なの?
隠蔽・カプセルブラックボックス化よりも 再利用性を重視したのがRailsだろ どこぞのJavaみたいにコントロールに不満がでて 自分で継承して機能追加しようと思ったら finalばっかりで結局新たに作らにゃならんとか糞だろ
まあ名前がぶつかった(と思われる)ときに警告が出れば十分じゃないのかな
オーバーライドしたのかただの継承なのか、はたまた親クラス固有の属性なのか定かではない
>>161 railsはあんま関係ないでしょ。
インターフェイスさえしってればスーパークラスを拡張できるというのが一応OOPの利点なのに、
スーパークラスのインターフェイスだけでなく、メンバ変数の名前も知っておかないと
バグの原因になってしまうRubyのスコープが今の論点なんだから
なんとなくプログラムを勉強し始めた初心者ですが、 rubyでできる実用的なことってなんでしょうか。 今、文字列ををアルファベット順に並べ替えるとかやっていたんですが。
>>165 君がやりたいことがないならRubyは何もしてくれない
素直にプログラミングは諦めて読書でもするといい
>>165 rubyじゃ実用的なことは何もできません。
pythonおよびPerlなどに移行することをおすすめします。
>>165 RSSリーダでも作ってみたら?
WindowsだかLinuxだか何か知らないけど、
WindowsでGUIなら、Rubyで実用アプリって
俺はオススメしないけどな。
>>168 RSSを利用してる人なら真っ先に思いつく
つまりRSSを使ってないということでRSSを選ぶ理由はゼロだ
プログラム言語は目的にはならない
作りたいものややりたいことが無いならプログラム言語を学ぶ必要はない
>>169 まぁまぁ、それはもっともなんだけども。
他の言語やってたならまだしも、多分まだ「プログラムで何が出来るか」も
分からない状態なんだろうし、取っ掛かりぐらいは無いと辛いっしょ。
そもそも作りたいものややりたいことがある人間は、
最初の言語にRubyなんて選択しないと思うよ。
172 :
165 :2007/11/04(日) 20:26:46
なんか程度の低い質問をしてしまったようですいません。 プログラムができれば、データ処理とか定型処理が楽にできるのかな、と思ったのがきっかけです。 しかしアルファベット順に並べ替えるとか勉強していると、これが何に応用できるのかなと思いました。 また、DOSプロンプト?でプログラムを実行させているんですが、これが最終的に どのような形になってPC上やWEB上で活躍するのかイメージがつかめないでいます。 とりあえずみなさんのアドバイスをもとにもっと勉強したいと思います。 レスありがとうございました。
>>165 やりたい事は特に無いけどプログラムの勉強はしたいって人には Java がお奨め
ドキュメントが豊富で整然としてる(ruby はここがなってない)
蛇足だけど、本気でプログラムやるつもりの人は C はマスターしとけ
ruby python perl とかはその後でいい
全く無目的に言語練習のドリルだけやって一生を終えることもできる本末転倒言語がJava Javaは情熱もインセンティブも無しで学ぶには「おまじない」が多すぎてなあ よく言われるけど、 puts 'hello!' に相当するJavaのコードってどんだけよ、みたいな
>>172 俺のお奨め
1. 簡単な定形処理をやるスクリプト。ファイルの整理とかHTMLの自動作成とか
2. CGIスクリプト。Rubyがかなり得意とする分野
3. Ruby/SDLやMyGameでゲーム作る。ただし3Dや高スペックを要求されるものはつらい
4. GUIツールの製作を目指す。敷居は高いがやってみる価値はある
でも他の人も言ってるとおり、そもそも作りたいものがないと
勉強って言っても難しいと思う
>>172 文字列の処理も立派なデータ処理なんだが、どういう処理がしたいんだ?
177 :
165 :2007/11/04(日) 21:10:12
>>172 いずれ余裕が出来たら『たのしいUNIX』でも読むといいよ
知りたいことがいっぱい書かれてるはず(標準入出力、環境変数等)
179 :
デフォルトの名無しさん :2007/11/04(日) 21:23:29
java勧めるならC#勧めるだろ・・・
ageすまん
Rubyでできないことって言うのは基本的に無いよ。 コマンドベースの処理はもちろん、Webアプリでもデスクトップアプリでも何でも作れる
>>172 MacかえばRubyCocoaでアプリもつくれるよ!
と、マカーな俺が言ってみる
では、Wiiのゲームも作れますか?
185 :
184 :2007/11/04(日) 23:23:09
すまん今の発言は忘れてくれ。勘違いだった
>>179 なんで? C# はプラットフォーム依存性高いんじゃない?
C# とかでの携帯ゲームとかある?
>>186 どっから携帯ゲームが出てきたか知らんがwまだまだプラットフォームとか気にするレベルじゃないし。
>>165 は物作ってる実感がわいてないンだと思うし、直感的に動くWinアプリ作った方が物作ってる気になると思う。
C#⇔javaなら移行はしやすいし。
>>187 どうせするならプラットフォーム依存性が低い方が良いと俺は思うけど。
携帯にしろ Unix 系にしろ。C# に簡単に移れるなら別に Java でもいいじゃん。
他のOSで動作させる理由も予定もないのに 「プラットフォーム間の移植性が…」とか言うのはアホ
>>165 自分も最近Ruby勉強し始めましたが、同じような印象ですね・・・
間もないので、文字列の並び替えすら作った事ないレベルですが。
(思った理由はちょっと違うかも知れませんが)
C/C++とWinAPIでGUIアプリ作ってて、簡単なのはBATとかVBSで済ますし・・・
WebのCGIとかをPerlの代わりに作る位しか思いつかない。(Perlは使えないしので、代わりに覚える位?)
ただ、それならJava覚えた方がより使えそうな印象を持ってしまう。
流行ってるみたいなので試してみてるけど、
実用的な意味で、「これやるときならRubyがいいな」ってのがあまり思いつかないです。
>>188 とりあえずC#触ってみな、
>>187 の2行目の感覚わかってもらえると思う。
まぁスレチだから終わりって事で
>>191 Ruby初心者とプログラミング初心者じゃ視点違うってw
>これやるときならRubyがいいな
それは俺も模索中w誰か教えて
>>188 俺は187と同意見かな。
JavaとC#の言語そのものの良し悪しはさておいて、
最初は見た目が派手な方が良いと思う。
だからまぁ、JBuilderみたいなのでウィンドウがチョロっと出せれば、
Javaでも良いと思うよ。
Rubyは・・・うーん・・・VisualuRuby?
もう何度も何度も言われてるが、現在のRubyの実際はBetter Perlの域を出ない。 まあ、Better Perlと言える位置に一番近いだけで有り難くて後光が差してはいるんだが。 つーことで、PerlやPHPあたりで 「うわーーーーーめんどくせーーーーーーー」 と思えるようなスクリプトを読み書きできる程度に習熟してからまた来てみてくれ。 そのときにこそRubyのよさやRubyでやりたいことが実感できるはず。
RubyやPythonはPerlやPHPに懲りてこそ意味がある いきなりRubyやPerlを学んでもピンと来なくて当然 あと、Rubyのアウトプットは所詮テキストファイルなので 他の手段でテキストファイルを生成できているのなら Rubyを学んで「リプレース」する意義は薄いかもしれない プログラム製作過程が楽しい又は安楽であるというのがウリなので 何か他のプログラミング言語にできないことができるわけじゃない たとえば、この世の全てのRubyプログラムはPerlで置き換え可能だと思う
RubyやPython、あるいはC#なんかでかなりいいとこまでは来てる だから次出る言語あたりで何とか頼むよ
俺はWindowsのバッチをvbsで書くのが嫌になってRubyはじめた。 win32oleが便利すぎ
>>198 Windows 限定なら powershell でもいいんじゃまいか?
使った事ないけど。便利そうなんだがMS の解説コーナーの script guy
前置きが長くて読む気がうせる。
自分で使ったことないのによく人に薦められるなあ 厚顔無恥に感心するよ
お前こそ相当なモンだろ…
>>201 言い返せないと意味不明な切り返し方になっちゃうのね
俺はよくコマンドプロンプトから一行野郎するなぁ。 Linuxなんかだと標準コマンドで済むこともwinじゃ結構面倒だったりするし。 ↓環境変数を改行して表示とか。 ruby -e "puts ENV['Path'].split(';')" ↓cat -n とか。 ruby -pe "printf '%7d ',$." ファイル名
納品するときにソース見られたくない(どっちかというとコピーされたくない)のですが コンパイルとか難読化するツールとかありますか
ない
>>199 script guy はなんか関係ありそうで全然関係ないことを
うだうだ書いて話を煙に巻くというか
2chでいう釣りとか荒らしと変わらんよなぁ
スルー汁
>>204 難読化じゃないけどExerbで圧縮とかなら
>>203 環境変数は SET コマンドで表示される
>>208 ruby -e "puts ENV['Path'].split(';')"
これと同じことをWindowsのコマンドプロンプトでどうやって出来るか教えてくれ
211 :
203 :2007/11/05(月) 12:19:10
>>208 分かりにくい書き方してごめん。
「環境変数Pathを、セミコロンの代わりに改行で区切って表示」
と書けば良かったな。
212 :
デフォルトの名無しさん :2007/11/05(月) 12:39:39
>>189 rubyforgeのインでクッスなおったみたい。
gem search -r tmailでの結果
hotmailer (1.0.1, 1.0.0)
Package for programatically accessing hotmail accounts
TMail (1.1.0, 1.0.0)
The Ruby Email Library
214 :
212 :2007/11/05(月) 14:14:01
>>202 >>199 は俺じゃないし、言い返すつもりもないよ
お前の文章からいやらしさがにじみ出ててさあ、何でこんな人間になっちゃったのかと
gemsはインストール時にバカみたいにメモリとCPUと時間使うからウンコ というか一体何にこんなにリソース食われてるんだ?
| ∧∧ /⌒ヽ) もはようちゃん i三 U 〜三 | (/~∪ 三三 三三 三三
>>207 古いexerbしか知らんのだけど、最近のexerbって圧縮されるようになったの?
>>218 20分くらいずっとガリガリ言ってて嫌になる
それでたった1行「xxが入ってないので中止します」とかもうね
gem嫌いは俺だけじゃないはずだと信じたい
もっと時間をかけて土台を作った上で広めるべきだった 不完全なままで無理矢理広まったから面倒でかなわん
>>225 まじ?試したけどうまくいかなかったような
ダウンしたあとで追加されたんかな
あった
>>222 嫌いじゃないけど、いきなり使うのは結構恐い。必ずテストする。
ただ、プログラミング自体が目的ではないんで楽して使うことがよくある。
229 :
212 :2007/11/06(火) 11:59:16
TMailもMailFacrotyも単体では日本語のメール作れません。 ヘッダや本文をISO-2022-JP (7bit JIS)にエンコードするメソッドがない。 nkfをrequireして自分でやるしかないみたい。 日本語メール作成用のスクリプトなら,MailFactoryを承継して, 新しいクラスを作るのがいいかも
そりゃ、規格は日本語専用じゃないからな エンコーディング変換と記述は外部モジュールで自前でやってくれってことだろ それはそれで正しい振る舞いだと思うぞ
tmail運用して初めて気づくマルチバイト関連のバグ
tmail 運用して 初めて マルチバイトの バグ気づくもの
233 :
デフォルトの名無しさん :2007/11/06(火) 23:20:45
以前、goo、OKwave で質問したんですが、やっぱり納得いかなくなりました。 2chでまた質問させてください。 Windows上でRuby使っています。 NetBeansで勉強していて、ファイルはすべてUTF-8で書くようにしています。 以下のコードのように、あるファイルを保存するプログラムを書いて、 日本語ファイル名で保存したとき(この場合、ファイル名はUTF-8の文字列になるんですよね。)、 (1)と、(2)で同じファイル名の出力を期待しているんですが、名前が変わってしまいます。なぜでしょうか。 Windows上では、ファイル名はShift-JISなどに変換してから保存しないとうまくいかないのでしょうか。 RubyがUTF-8扱えないのか、Windowsの問題なのか。もし後者なら、Linuxマシンを調達しようかと考えてます。 saving_folder = "C:/testrubyfolder/" filename = "ユニコードです" puts filename #←(1) open(saving_folder + filename , "w"){|file| file << "test" } puts Dir.entries(saving_folder) #←(2)
全くわからんので適当に喋るが、WindowsのRubyはUTF-8ファイル名システムを理解できないんだろう Dir.entriesのほうは 「UTF8の"ユニコードです"という文字列をShiftJISだと思い込んでファイル名として書き込まれたものをそのままShiftJISとして表示してる」 だけなんじゃないかね require 'nkf'して puts NKF.nkf('-sU', Dir.entries(saving_folder).to_s) とすればおそらくお望みの表記になるはず
require 'nkf' s = 'ユニコードです' puts s File.open(s,'w'){|f| f.write(s)} File.open(s,'r'){|f| puts f.read} > ruby utf8.rb 繝ヲ繝九さ繝シ繝峨〒縺 繝ヲ繝九さ繝シ繝峨〒縺 うむ、ファイルアクセスするぶんには問題ないな(w
237 :
デフォルトの名無しさん :2007/11/07(水) 04:25:17
添え字が1からはじまる配列が欲しいのですが、 いかにも既出っぽいのに見つけられない。
添字に1を足しなさい
239 :
デフォルトの名無しさん :2007/11/07(水) 04:48:34
>>238 a.index(x)の返値がちゃんと補正されるとか、
そういう細かいところをやろうとするとかなり面倒です。
すでにそういうクラスがあるとおもうのですが?
>>238 無いよ。何であると思ったの?VB.NET ですら 0 なのに。
配列は 0 ではじまり、0 または 長さ -1 でおわる。
そうでない言語は糞。異論は聞かないし認めない。
241 :
240 :2007/11/07(水) 06:06:34
>>238 ごめん、レス番書き間違えた。239 ね
242 :
デフォルトの名無しさん :2007/11/07(水) 06:33:33
>>240 そうじゃなくて。
1から始まる連番と要素が結びついたコンテナクラスが欲しいんです。
これが0だったら単にArrayを使い回せばすむ話。
添え字の細工をクラスに隠蔽するのは自然な発想だとおもうんですが?
VBでもやっと0が発見されたのに わざわざ退化するようなことして楽しい?
244 :
デフォルトの名無しさん :2007/11/07(水) 06:57:02
配列が0オリジンであるべきだということには異論はないけどね。 自然数の連番って頻出するとおもうんだけどなぁ。 0を隠蔽したくならないのかなぁ?
ageと全角英数字が揃うと、9割方はこういうレベルだな。 不思議なくらい高確率。
class MyArrayでも作ったら簡単にできるんじゃないの?
>>239 みたいな#indexとかの補正も別に細かくないし、面倒でもない。
俺はそんな馬鹿なことはやらないってだけ
247 :
デフォルトの名無しさん :2007/11/07(水) 07:08:10
まあ自分で書いたんだけどさ。 こういうレベルなのは初心者スレッドなんだから勘弁してよ。
なんか気が立ってるのか?そんなに怒らなくてもいいじゃないか。
>>237 に対する答は
そういうクラスは用意されてない。
ほしいなら Array のサブクラスでも作ってください。
で、いいんじゃね?
>>237 なんとしても 1 からはじまって欲しいなら Hash 使ったら?
set,get は [] でできるし繰り返しは
hash.keys.sort.each {|key| val = hash[key] } とか
250 :
sage :2007/11/07(水) 07:36:41
>>249 連番を保証するのに手間暇かかるし、
Arrayの添え字をいじる方がいい。
ありゃ、ageたったw
反論が過剰反応過ぎて吹いたwww なんか1オリジンの配列に嫌な思い出でもあるのか いじる必要があるのは []、at、delete_at、index、rindex、insert、slice、values_at、 each_index、each_with_indexぐらいか。あれ意外に多いな
別にArrayクラスをそのまま使って、単に最初の要素をダミーデータにすればいいだけじゃないの? eachつかうときは最初の要素をはじくようにする必要あるけど。
つうか初心者に厳しいやつはここにくるな。初心者スレはお前みたいなのが威張り散らすとこじゃねえ。
255 :
デフォルトの名無しさん :2007/11/07(水) 09:51:24
教える側も初心者ってこった
だから自分で作れと それ以上の回答はないぞ
>>254 誰宛か不明だが(明らかに複数人が回答してるし)、「質問に対して適切な回答をしている」時点で、
初心者スレに必要な初心者への優しさは十分満たしてるだろう。
この場合、「その目的自体がアホだ」ということが色んな角度から書かれているよね。十分すぎる。
この回答を与えずに引っかき回しているなら、確かにそれは「初心者スレにあるまじき反応」だろうけど。
「その目的はアホだ」ではなく「お前はアホだ」で返したりね。でもそんなの
>>245 くらいしか見当たらん。
それとも、初心者には常に敬語を使え、へりくだれ、最後は「ご利用頂きまことにありがとうございました。
またの起こしをお待ちしております」で締めろ、みたいな話?
>「その目的自体がアホだ」ということが色んな角度から書かれているよね (´・ω・`)?
259 :
デフォルトの名無しさん :2007/11/07(水) 10:33:01
>>248 んっんー・・・
俺の記憶違いじゃなきゃ、組み込みクラスのArrayを継承するのは、リファレンス的に非推奨と違ったか?
やるんならインスタンス変数にArrayな変数を持ったラッパクラスを作ることになるのかな
>「その目的自体がアホだ」ということが色んな角度から書かれているよね
んなことどこにどんな角度で書かれてるんだ、っつー話で、
>>248 ,
>>252 あたりのは「適切な回答」と思われ。
Smalltalk とかもそうだし、配列の添字が one-origin ってそんなにアホでもないと思う。
言語仕様のレベルで既に1から始まってるなら問題ないんだよ 自力で1から始まる配列のようなものを作るのも問題ない
収集したデータからHTMLを生成しようと思います 諸般の事情でヒアドキュメントの形式ではなく、HTMLを表す変数に << で追加していく動作をしてます で、エラーなどが起きた場合、data_Aは存在しますが、data_Bが存在しないことがあります それの対応は --------------------- html = 事前のいろいろ html << mkhtml_from_data_A html << mkhtml_from_data_B … def mkhtml_from_data_B return 'エラー:Bのデータがありませんでした' if data_B.empty? … end --------------------- html = 事前のいろいろ html << mkhtml_from_data_A if data_B.empty? then html << 'エラー:Bのデータがありませんでした' else html << mkhtml_from_data_B end … --------------------- どっちが「ふつー」でしょうか
>>263 どっちでもいいよ
メソッドに判断させる前者が見栄え的に楽だと思う
どうせ data_C とか data_D とかたくさんあるんだろうし
Ruby としては mkhtml_from_data_B の中で例外出させて捕捉するべきかもしれん(w
data_Aとかdata_Bとかをちゃんとクラスにして、 html = ... begin data.each do |data| html << data.to_html end rescue to_htmlに投げてもらった例外 ... end ってポリモルフィズム効かせてやるのが私的に理想っぽい。
あ、まちがえた。 datas.each do |data| とかだな。
>>265 dataをどこの変数にどう保持してどう渡してるかにもよると思うんだが、
そういうのって構造が美しいだけでエラーのHTML自体を書くのは面倒そうだな
まあ、例外を自力で適宜発生させて外部で捕捉して処理します、というのは それ自体はものすごくカッコいい論理的な動作に見えるけど、動きの実際は goto 文とほぼ同じだからね 事前に気をつけて設置しないと、ループが1個挟まっただけでスパゲティになったり
>>266 恐ろしくどうでもいいことを言うと data は複数形な。単数は datum。
1オリジン、たまに使いたくなるね。 俺は前に、テキストファイルを読み込んで 行番号でアクセスしたいことがあって。 lines=ファイル.readlines lines.unshift nil して、後は特異メソッドで each上書きして使ったかな。 本来はshift/unshiftとか色々と他にも修正が要るけどな。 個人的なスクリプトだから使わないことで対応。 本格的にやるなら継承せずにラッパクラスかな?
272 :
248 :2007/11/07(水) 20:44:20
>>260 え、そうなんだ。ありがとう、リファレンスとかよく読んでみるよ。
で、その事とは別に考えたんだけど 1 から始まる俺Array と普通の Array が混在すると
地味なバグの温床になりそうな気がしてきた。
ラッパクラスにするにしても、見た目(メソッド的な)は Array と別物に見えるようにしたほうが
いいのかな?
>1 から始まる俺Array と普通の Array が混在すると >地味なバグの温床になりそうな気がしてきた。 えー、そんなことないと思うけど。 自分だけが使うならどんな見た目でもいいけど、他人に使わせるなら、『添字が1から始まる以外はぜんぶ一緒』のほうがいいと思う。 つうか、そんなことを気にするなら標準のArrayで統一しろといいたい。
274 :
デフォルトの名無しさん :2007/11/07(水) 22:44:29
ファイルの上書きって,データを読み込んだ後編集してその場で保存する場合,モードって何? open(file_path,'??') rだと読み込みしか出来ないし,wだとオープンした瞬間ファイルの情報が無くなる. aだとFile.rewindしてもなぜか先頭から書き込めないので,wしかないのかとか,混乱気味.
275 :
266 :2007/11/07(水) 22:49:11
>>269 ふつーに知らんかった。d。
英語の勉強で、英文にdataとか使わないからなぁ…。
英語でも普通使い分けないよ。data/datum。 ラテン語中性名詞の変形だね。
今日Rubyを始めた物ですが いきなり詰まってしまいました i = 1 puts 'お前好きな数字とかある?' su = gets.chomp puts 'え〜お前' + su + 'が好きなの〜?' ma = su.to_i + i.to_i puts 'お前 ' + ma.to_i + 'っぽい顔なのになぁ' どうもエラー(ren1.rb:7:in `+': can't convert Fixnum into String (TypeError))を吐いてしまいます どうすればいいのでしょう?
>>280 maはputsするとき.to_iじゃなく
.to_sで数値を文字に直してやらないと表示できない
data/datum は、知識として知ってはいたけど、 実際に使い分けたことはなかったな。 % irb irb(main):001:0> require "active_support" true irb(main):002:0> "data".pluralize "datas" irb(main):003:0> "datas".singularize "data" irb(main):004:0> "data".singularize "datum" irb(main):005:0> "datum".pluralize "data" ふむー。
285 :
デフォルトの名無しさん :2007/11/08(木) 12:10:26
>>285 日本語のサイト落ちてることが多いような気がする。
それが面倒なんで英語のサイトを見るようにしてる。
>>284 ActiveSupportのinflectionも結構アドホックというかバータリーだからな。
辞書を持ってるわけじゃないし。
Linux上でRubyを使っているのですが require "tcltklib" l = TkLabel.new l.text("Hello World") l.pack Tk.mainloop とかプログラムすると test.rb:1:in `require': no such file to load -- tcltklib (LoadError) from test.rb:1 といエラーが出ます なにやらrequireが無いらしいのですが・・・
そのエラーは「requireが無い」ではなく 「ロードしようとしたファイルが存在しないためrequireできない」の意 つまりtcltklibが無い
290 :
デフォルトの名無しさん :2007/11/09(金) 11:08:37
日本語のメールを扱えるMUAを作ろうと思ってます。 とりあえずTMailを承継したクラスを作って, そのクラスにSubjectや本文をISO-2022-JPに決めうちしてメールを作成するように, したいのですが,Subjectがうまく変換されません。 JISコードのBase64でエンコードして渡しているのですが,JISにしかならないのです。 どのへんがおかしいのか教えてください。 (まだ,発展途上なのですが,シンプルなプレインテキストメールもマルチパートメールもこのクラス一つでできるようにと考えてます。) require 'nkf' require 'tmail' require 'mime/types' class JapaneseMail < TMail::Mail include TMail def initialize super @plain_text = String.new @multipart = Array.new end def subject=(str) super NKF.nkf('-jM', str) end def text=(str) @plain_text = NKF.nkf('-j', str) end def prepare self.mime_version = '1.0' self.set_content_type 'text', 'plain', 'charset' => 'ISO-2022-JP' self.transfer_encoding = '7bit' self.body = @plain_text write_back end end
291 :
デフォルトの名無しさん :2007/11/09(金) 11:13:04
上のクラスを下記のように利用してます。
require 'japanesemail'
mymail = JapaneseMail.new
mymail.to = '
[email protected] '
mymail.from = '
[email protected] '
mymail.subject = '日本語メールです'
mymail.text = "こんにちは。日本語メールの本文です。"
mymail.prepare
puts mymail
subjectの部分はただのISO-2022-JPになるだけで
「Subject: F|K\8l%a!<%k$G$9」
期待しているのは
「Subject: =?ISO-2022-JP?B?GyRCRnxLXDhsJWEhPCVrJEckORsoQg==?=」
です
これは、世の中のカジュアルRubyユーザー全員が引っかかったと思う。
ttp://i.loveruby.net/ja/projects/tmail/doc/details.html > デコード出力
> TMail の大部分のメソッドは特に断りがない限りデコードした文字列を返します。
> 文字列の中に日本語文字列が存在する場合は、 $KCODE に従いエンコードを変換して返します。
> ただしサポートするのは $KCODE=EUC/SJIS の場合のみで、それ以外 (つまり NONE か UTF8) のときはエンコーディングは一切変換されません。
> Ruby 1.6 以降では $KCODE=NONE がデフォルトなので注意してください。
ということで、subjectを入力する前に $KCODE='e' とか書いておけば変換してくれる。
…UTF8でスクリプトを書いてる場合は…
RAA が見れないみたいなんだけど、リファレンスマニュアルが見れなくなるのと同じような原因?
294 :
290 :2007/11/09(金) 13:44:30
>>292 ありがとうございます。まさに日曜プログラマ的レベルですので,
至らぬこともあるかもしれませんが,どうぞよろしくです。
UTF8でスクリプトを書いてます。
>>291 では#!/usr/local/bin/ruby -Kuとしてます。もちろんRuby 1.8
とりあえず,puts mymailをputs.mymail.encodedとすることで
目的のメールを吐き出せました。
295 :
290 :2007/11/09(金) 15:20:45
296 :
デフォルトの名無しさん :2007/11/09(金) 15:50:35
こんにちは、ちょっと質問があるのですが、 正規表現がずらーーーと長くなるときがあるのですが、 例えば、こんなの /^(\d+)\/(\d+)\/(\d+)\s+.+\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$/ =~ s エディタで折り返しになっちゃたりしてみにくくなります。 そこで、適時改行、連結したいのですがいい方法ないですか? 文字列だと、 s = "hogegegegeghoeghoeghoeh" + "hogehgoehgoeghoeghoehge" でいいですよね? 正規表現だと、どうすればいいんだろう
297 :
290 :2007/11/09(金) 16:05:27
>>295 汎用性はないかもしれないけど,とりあえず,自己解決
def header_encode(str)
/(.*?)<(.*?)>/ =~ str
return "#{NKF.nkf('-jM', $1)}<#{$2}>"
end
です
298 :
デフォルトの名無しさん :2007/11/09(金) 16:12:12
340 :デフォルトの名無しさん:2007/11/09(金) 13:22:03 俺小学生だけど年下に聞いて恥ずかしくない? すみません 私の先生が python-PHP. 小学生が教えられる言語だけど Ruby. は小学生が教えられるのか聞く様にと言っています
変なテンプレートが特定個人内で流行ってるなあ
>>298 「プログラム言語の前に国語からやり直せ」としか思えない
>>296 ~$ cat test.rb
re = /abcdefghijklmn\
opqrstuvwxyz/
re2 = Regexp.new('abcde'+'fghijk'+
'lmnopq'+'rstuvwxyz')
p 'abcdefghijklmnopqrstuvwxyz'.scan(re)
p 'abcdefghijklmnopqrstuvwxyz'.scan(re2)
~$ ruby ./test.rb
["abcdefghijklmnopqrstuvwxyz"]
["abcdefghijklmnopqrstuvwxyz"]
>>296 x オプションとか。
re = %r{
^(\d+)\/(\d+)\/(\d+)\s+
.+\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$
}x
303 :
290 :2007/11/09(金) 17:01:54
304 :
デフォルトの名無しさん :2007/11/09(金) 17:03:42
否…(+ФyФ)!流行では無く実験です…
>>299 名前:デフォルトの名無しさん :2007/11/09(金) 16:29:07
変なテンプレートが特定個人内で流行ってるなあ
305 :
290 :2007/11/09(金) 17:24:16
バグです def header_encode(str) /(.*?)<(.*?)>/ =~ str return "#{NKF.nkf('-jM', $1)}<#{$2}>" end の該当箇所を return $& ? "#{NKF.nkf('-jM', $1)}<#{$2}>" : str に変更
>>299 Linux板でさんざんうざがられた変な人だから
今後一切反応しないように
>306 あれ人なの? スクリプトの類だろ?
すみませんが、質問です。 Procオブジェクトの途中で抜けて元の行に戻りたいのですが、関数ではないの でreturnでは戻れないようです。 どうしたらよいでしょうか?
310 :
デフォルトの名無しさん :2007/11/09(金) 22:54:39
RDocの生成なんですけど #コメント1行目 # #コメント2行目 とすると,連結しないで改行してくれるのはいいのだが, 1行置きに表示されちゃいます。 コメント1行目 コメント2行目 のように表示させるにはどうしたらいい? <p> コメント1行目</br> コメント2行目</br> </p> ソースとしてはこうなってほしいのだけど, いちいちコメント行に</br>を自分で書いておかないとダメ?
>>310 というか改行を使う必要があるのか?
たいていの場合は段落切り替えでOKだと思うが
AA的な図を書きたいとか?
313 :
308 :2007/11/09(金) 23:10:44
>>309 > break
ありがとうございます。試してみましたが、エラーになってしまいます。
私は正常に終了させたいのです。
proc1 = Proc.new do
puts "ほげ"
break
puts "うぐ"
end
proc1.call
irb(main):010:0> load "proc.rb"
ほげ
LocalJumpError: break from proc-closure
from ./proc.rb:5:in `call'
from ./proc.rb:9
from (irb):10:in `load'
from (irb):10
from :0
RubyでGUIを使いたいのですが どうすればいいのか分かりません なにかダウンロードしてこなきゃいけないのでしょうか? ちなみにLinux環境です
>>314 標準でtkが使える。
あとruby-gnome2あたりじゃね?
どっちも使ったことないけど。
317 :
308 :2007/11/09(金) 23:37:00
>>316 おお!ありがとうございます。
確かに lambda に変えただけで動きました。
>>315 取りあえずruby-gnome2を使ってみたいと思います
ありがとうございました
320 :
288 :2007/11/10(土) 00:07:23
機能質問したものです 無事tcltklibをインストールして、もう一回実行してみたのですが 今度は test.rb:3: uninitialized constant TkLabel (NameError) といエラーが出ます ちなみにソースは前と同じです どうすればいいのでしょうか
323 :
デフォルトの名無しさん :2007/11/10(土) 11:42:29
「2007年 11月 10日 土曜日 7:00:00 PM」 はTime::parse(parsedate)できません。 正規表現使って一つ一つ分解するしかない? それとも,既にライブラリか方法ある?
あんま無茶言うな 漢字を含む文字列をparseできるメソッドは知らない 正規表現で切り出すか、PaesrDateが解釈できる文字列に変換するしかないんでないかな
>>323 require 'date'
str = '2007年 11月 10日 土曜日 7:00:00 PM'
format = '%Y年 %m月 %d日 %H:%M:%S %p'
dt = DateTime.strptime(str, format) #.new_offset(9.0/24)
# timeだけ取得
t = dt.time
# 日付を含め時刻に変換
# require 'rubygems'
# require 'active_support'
# t = d.to_time
ごめん、土曜日は_
関係ないが、今思うと、remember the milk は、英語圏のサービスなのに、 よく、土曜日とか、漢字に対応しているなーと思う。 バックエンドが、rubyでもないと思うので、スレ違いスマソ
328 :
323 :2007/11/10(土) 13:57:22
329 :
デフォルトの名無しさん :2007/11/10(土) 18:06:50
RubyからDirectXを扱いたいのですが、どこかサンプルになるホームページなどあったら 紹介してもらってもいいでしょうか?
使えるエディタは何があるでしょうか?
331 :
デフォルトの名無しさん :2007/11/11(日) 01:25:06
REXML::Elementクラスの、[]でXPathの指定をして要素を取得したいんだけど、 属性値の指定ができない。 RootElem.element["//A@id='100'"] とやっても、「属性idの値が100の要素A」ではなくて、 「一番最初に発見した要素A」が返ってきてしまう。 XPathをあれこれ変えてみたけど、だめだった。 何で??誰かたすけて。
332 :
デフォルトの名無しさん :2007/11/11(日) 01:27:02
RDE
333 :
デフォルトの名無しさん :2007/11/11(日) 01:28:08
訂正。 誤) REXML::Elementクラスの、[]で 正) REXML::Elementクラスのelementメソッドで
>>331 "//A[@id='100']"
ではなく?
foo.each do |hoge| 処理 end で処理の結果によっては hogeを一つ前の要素に戻すことみたいなことできますか
337 :
330 :2007/11/11(日) 08:31:26
おいおい 初心者スレッドじゃないのかよ 使っているエディタ聞いてもよかように
340 :
331 :2007/11/11(日) 09:13:36
>334,335 そこのサイトも見てるんですが・・ RootElem.elements("//A[@id='100']") とやると ArgumentErrror: wrong number of arguments (1 for 0) となります。 RootElem.each_element("//A[@id='100']") とやると [ ] となり、要素なしのArrayが返ってきます。
341 :
330 :2007/11/11(日) 09:21:13
>>339 すんません 何故か見えてなかったです
RDEはスクリプト言語RubyのGUI開発環境です。だそうですね ありがとうございます。
342 :
デフォルトの名無しさん :2007/11/11(日) 09:32:36
たのしいRUBYって、全部見なくてもいいよね
最初から最後まで読まないといけないようなコンピュータ言語書籍は糞
マニュアルの「はじめに」より > Rubyの特長は次の通りです。 > インタプリタ > Rubyはインタプリタ言語ですのでプログラムを実行するためにコンパイルする必要はありません。 > 変数に型が無い (動的型付け) > Rubyの変数はどのような型のデータも格納する事ができますので、変数の型について心配する必要はありません 。半面、コンパイル時のチェックは弱くなります。 この後者の場合のコンパイルってどういう意味ですか?
スクリプトファイルを最初から最後まで読み込んで OSが理解できる実行形式バイナリに変換してメモリ内に保持すること とでも思っとけ 普通の言語のコンパイルはファイルがディスクに別途作成されるけど、 Rubyはスクリプト言語だからメモリ内に保持
>>343 そんな一般化してもしょうがないと思う。本には本のスタイルがあるからね。
その理屈だと例えば Little Lisper が「糞」ということになる。
俺もイマイチ好きじゃないが、良い本だとは思うよ。
Little Schemer でお星様と遭遇した漏れ様が来ましたよ
>>340 irb(main):003:0> doc = REXML::Document.new('<root><a id="1" /><a id="10" /><a id
="100" /></root>')
=> <UNDEFINED> ... </>
irb(main):005:0> doc.elements[".//a[@id=1]"]
=> <a id='1'/>
irb(main):006:0> doc.elements[".//a[@id=10]"]
=> <a id='10'/>
irb(main):007:0> doc.elements[".//a[@id=100]"]
=> <a id='100'/>
REXMLは三日もたてば使い方忘れちゃうんだよなあ・・・
>>331 ちゃんと見よう。
elementsの後ろの[]はelementsに定義されたメソッドで、
中の[]はXPathのってこと。
ところで XML は case sensitive だから "//A[@id='100']" と "//a[@id='100']" は意味が違うなどという言葉が頭に浮かんだりしたんだが。
idが違うAが引っかかってるからそこは大丈夫なんじゃね?
351 :
331 :2007/11/11(日) 15:14:08
やっぱりだめだ・・・・
>>347 のXMLドキュメントだと取得できるんだけど、
実際に使ってるやつだとやっぱりいかない。
<root>
<a id="AAAAAe77057dcc82dbf40b81595e09291a" name="A1">
<b id="BBBBBe77057dcc82dbf40b81595e09291a" name="B1"/>
</a>
<a id="CCCCCe77057dcc82dbf40b81595e09291a" name="A2">
<b id="DDDDDe77057dcc82dbf40b81595e09291a" name="B2"/>
<b id="EEEEEe77057dcc82dbf40b81595e09291a" name="B3"/>
</a>
</root>
で、
<b id="EEEEEe77057dcc82dbf40b81595e09291a" name="B3"/>
の要素を取得したいんだけど・・
irb(main):029:0> doc = REXML::Document.new('<root>・・・・</root>')
=> <UNDEFINED> ... </>
irb(main):030:0> doc.elements[".//b"]
=> <b name='B1' id='BBBBBe77057dcc82dbf40b81595e09291a'/>
irb(main):031:0> doc.elements[".//b@name='B3'"]
=> <b name='B1' id='BBBBBe77057dcc82dbf40b81595e09291a'/>
irb(main):032:0>
てなってしまう。なんで???
352 :
デフォルトの名無しさん :2007/11/11(日) 15:16:24
ごめん、できた。 irb(main):033:0> doc.elements[".//b[@name='B3']"] => <b name='B3' id='EEEEEe77057dcc82dbf40b81595e09291a'/> で上手くいった。 実際のXMLでやってみる。
書き方の相談です。 例えばXML文書から特定の要素を全て取り出すとき、 doc = REXML::Document.new(test.txt) array=[] doc.root.each_element("/words/word"){ |elem| array << elem.text } として動くことは動くのですが、一度空の配列を用意するのが冗長でRubyらしくない気がします。 もっときれいな書き方があるはず、と思ってしまうのですが、皆さんならどう書きますか?
doc.get_elements(XPATH) でいけると思うんだけどどうだろう
むおー!
require 'enumerator' doc.root.enum_for(:each_element, '/words/word').map {|elem| elem.text } でどうだろうか。
get_elementsなんてあったのか。
358 :
331 :2007/11/11(日) 17:28:29
テスト用じゃない実際に使うXMLファイルだとだめだった・・・ 何が違うんだorz
359 :
331 :2007/11/11(日) 18:03:38
ルート要素に「xmlns」ていう名前のアトリビュート(接頭辞は省略)があると だめだった。 doc.elements[".//b[@name='B3']"] てやってもnilが返ってきちゃう。 XMLドキュメント内の要素には接頭辞は一切使用していないので 全てルート要素で定義したデフォルトの名前空間になってるし、 アトリビュートの指定で名前空間て関係してくるの? なんでルート要素でデフォルト名前空間を宣言すると doc.elements[".//b[@name='B3']"] の返り値がnilになっちゃうの? 誰か教えて。
>>359 名前空間指定してないからに決まっているだろ
えー。 だったら同じように名前空間を指定していない doc.elements[".//b"] でも返り値はnilになるんじゃないの?
>>359 ルート要素でデフォルト名前空間を設定しているからというより
bが名前空間URIを持っているからマッチしないんだという気がする。
XPathの中では実際の文書の接頭辞は意味ないからな。
doc.elements['//b']の返り値はバグのような気がする。
libxml-rubyで同様の処理をするとdoc.find("//b")は空のノードセットを返す。
#!/usr/bin/ruby -Ku
require 'xml/libxml'
require 'pp'
parser = XML::Parser.new
parser.string = <<EOS
<root xmlns='
http://example.com/ '>
<a id="AAAAAe77057dcc82dbf40b81595e09291a" name="A1">
<b id="BBBBBe77057dcc82dbf40b81595e09291a" name="B1"/>
</a>
<a id="CCCCCe77057dcc82dbf40b81595e09291a" name="A2">
<b id="DDDDDe77057dcc82dbf40b81595e09291a" name="B2"/>
<b id="EEEEEe77057dcc82dbf40b81595e09291a" name="B3"/>
</a>
</root>
EOS
doc = parser.parse
p doc.find("//b").class
p doc.find("//x:b",'x:
http://example.com/ ')
p doc.find("//x:b[@name='B3']",'x:
http://example.com/ ')
>>361 REXML公式のチュートリアルに名前空間とXPathについて書いてあったと思う
一読してみては
だれも答えてない?
>>336 >foo.each do |hoge| 処理 end
>で処理の結果によっては
>hogeを一つ前の要素に戻すことみたいなことできますか
prev = nil # ひとつ前の要素をとっておく変数
foo.each do |item|
item = prev if 条件 # 条件によってひとつ前の要素に戻す
処理
prev = item
end
ということではないかと思ったのだがどうだろう
PStoreって「追加」の書き込み時にもpstoreファイル全体を読んで新たに全要素を書き込んでるって本当ですか? def save(k,v) PStore.new("1MB.pstore").transaction do |db| db[k] = v end end という1MBなpstoreに保存するメソッド作ってsave(key,value)をたとえば100回起動したら ディスクから100MBぶんくらい読んで100MBぶんくらい書き込んでるってことですか?
>>365 そう
これを継承するYAML::Storeでも原理は同じ。全部パースして読み込んでる
あ、PStoreはサイズと使用頻度間違うと物凄い負荷になるよ メモリとディスクアクセスの無駄遣いというレベルじゃない テキストでa+で追加書きするほうがいいことも…
368 :
デフォルトの名無しさん :2007/11/12(月) 17:58:13
スクリプトの編集にviをつかってます。 カッコを閉じるとき{}とかは適切にインデントをもどしてくれるのですが、 endのときは対応してくれません。 たしか、ruby向けの設定とかviとかがあったような気がするのですが, 参考になるあるいはおすすめのサイトなど教えてください。
>>368 今時 vi といったら vim を指すのだろうか?
vim の7.? なら
:h :filetype-indent
あたりを見てみるといいんじゃないでしょうか。
vim の help は迷宮だけどな。
>>368 vimなら確かRuby用の環境一式がZipで落とせたと思う。
自動補完とかが不要なら、よくわからんインストールは必要なしに
Zipを展開するだけでよかったと思う。
ていうか俺が使ってるvimがそう。
サイトはどこだか忘れちゃった。すまん。
372 :
デフォルトの名無しさん :2007/11/13(火) 10:11:56
>>369 ,
>>370 ,
>>371 どうもどうも、参考になりました。
おっしゃる通り,viはvimへのリンクになってました。
ちなみに、versionは6.2...ちょっと古かった。
Banmen = [0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,1,2,0,0,0, 0,0,0,2,1,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0] def hyouji for i in Banmen a = i case a.to_i when 0 print "□" when 1 print "●" when 2 print "○" else print "?" end end end hyouji どうしてエラーが出るんでしょうか?
やっぱり Banmen = [0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,1,2,0,0,0, 0,0,0,2,1,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0] def hyouji for i in Banmen case a when 0 print "□" when 1 print "●" when 2 print "○" else print "?" end end end hyouji
case a は case i の間違い? それだったらエラー出ないし何が言いたいか分からんので、もうちょっとまとめてきなさいな Banmenは配列の配列にした方がいいかもね
>>373 エラーがわからんが、とりあえず、Banmen に全角スペース入ってる
みたいだけど、それって code では入ってないよね?(他のところもしかり)
require 'matrix' class Matrix def []=(i,j,x); @rows[i][j]=x; end # matrix[i, j] = x end class GameField SYMBOLS=['□','●','○'] def initialize ; @field = Matrix.zero(8); end def set(x,y,n) ; @field[x,y] = n; end def symbolise(i) if SYMBOLS[i].nil? then; '?'; else SYMBOLS[i]; end end def to_s @field.to_a.map{|a| a.map{|e| symbolise(e)}.join(' ')}.join("\n") end end field = GameField.new field.set(3,3,1) field.set(3,4,2) field.set(4,3,2) field.set(4,4,1) puts field
>>377 あ、いきなり自分の答書くなんてずるい
もうちょい教育的に振舞えよ(w
>>374 「よくわからない」エラーが出るなら全角空白だろうな
> Invalid char `\241' in expression
こんなの
Banmen = [0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
↑このへんの0の前の空間に全角空白がたくさん混じってる
一旦空白を全部消して半角空白にしとけ
全角インデントはレスする時の常識だろ・・・
どんなエラーなのかさっぱりわからんのだから仕方あんめえ
それに
>>373 のメソッド定義では を使ってるから表示のためにあえて混ぜたとは考えにくい
と思ったら
>>374 では悪化してるな
わけわかめ
>>377 うっかりCOMと人間兼用のPlayerクラスとか作ってしまって動作にハマりそうだな
あとゲームの盤面はFieldではなくBoardが好ましいと思う
>>373 "case a.to_i " ←全角スペース
のせいでは?
>>382 Banmen = [0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,2,0,0,0,
0,0,0,2,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0]
def hyouji
for i in Banmen
a = i
case a.to_i
when 0
print "□"
when 1
print "●"
when 2
print "○"
else
print "?"
end
end
end
hyouji
383 :
デフォルトの名無しさん :2007/11/14(水) 22:49:11
>>383 そんなメソッド標準にはないでしょ。
Perlみたいなノリでorのところに例として書いてあるだけで。
>>383 それは例だから。dieなんてない。
PerlとPHPにはある。エラーメッセージを表示してプログラムを終了する関数。
open('file.txt') or die('canot open file.');
のようによく使うから、それを例として使っただけだとおもう。
リファレンスが不親切と言われればそれまでだけどな。
>>383 die は Perl における、Ruby でいうところの raise
die 'エラーです!'
と書くと「エラーです!」とエラー出力に表示して終了する(終了の代わりに捕捉もできる)
異常処理をします、ということを端的に表すのに使ってるだけかと思われ
Ruby に die という名前の何かがあるわけじゃない
だから、これはホントは例としてはあまりよくないね
demo || raise 'cannot run demo !!'
とでも書けばよかったのかもしれない
Rubyは相変わらずわかりやすくしようという気概がゼロだ not 例: ! me not me i != you 例という貴重な欄を潰してまで書くようなことではないな
Perlの or die というのは「さもなくば氏ね」と読めるのがポイントだったな。
>388 らくだ本にも確かそういうニュアンスの文あったぐらいだもんな
390 :
デフォルトの名無しさん :2007/11/14(水) 23:47:46
使用してるモジュールか何かにそういうメソッドが定義されてれば問題ない まさか実行もせずに例示スクリプト書いてるとは思えんし、この環境では動くんだろう
>>386 そんなこといったら demo はいいのかよ。
>>390 そこに紹介されているのは MacOS X 10.5 Leopard の
/Developer/Examples/Ruby/RubyCocoa/Scripts/watcher.rb
というスクリプトの一部で、しっかりと
def die(s)
$stderr.puts s
exit 1
end
と定義されているわけだが。
他の言語からの移行用だと思うんだけど、存在が微妙なメソッドだな Ruby なんだし素直に raise(msg) でいいじゃん、と思わなくもない bash$ cat ./err.rb raise 'エラーです!' bash$ ruby ./err.rb ./err.rb:1: エラーです! (RuntimeError) bash$ echo $? 1 bash$ ruby ./err.rb 2> /dev/null bash$
すみませんが、質問です。
一つのRubyのスクリプトファイルが、異なる複数の文字エンコーディング環境
(Win, UNIX, Macなど)で、文字化けしたりせずに正常に動作するようにするに
は、どういうやり方が標準的なのでしょうか?
$KCODEを修正して、スクリプトファイル全体を別エンコーディングで保存しな
おせば問題なく動くわけですが、そうではなくて、手を入れたり保存しなおし
たりしない、そのままのスクリプトファイルが複数の環境で動くようにしたい
のです。
Pythonだと、
・ソースファイルごとのエンコーディングの指定ができる。だから一つのアプ
リケーションが、スクリプトファイルごとにエンコーディングが異なったり
しても、問題なく動く。
http://www.python.jp/Zope/articles/japanese/Python4Japanese-2 ・ユニコード文字列を使うようにすれば、環境に合わせて自動的にエンコーディ
ングを変えてくれる。
ので、一つのスクリプトファイルが、どんな環境でも文字化けしたりせずに動
くのですが。
http://www.rubyist.net/~matz/20070926.html#p01 ここを読むと、良く分からないのですが、どうもそういう方向には向かってい
ないように見えます。
しかしどう書いたらいいのか、良く分かりません。
397 :
396 :2007/11/15(木) 03:33:07
訂正、というか補足です。 > ・ユニコード文字列を使うようにすれば、環境に合わせて自動的にエンコーディ > ングを変えてくれる。 これは出力エンコーディングのことです。 Pythonで print u"ほげ" # uが頭に付くのはユニコード文字列 と書けば、ソースや環境のエンコーディングによらず、正しく「ほげ」が表示 されます。
>>396 残念ながら、Rubyではご期待に応えることができません。
ファイルごとに文字コードを指定できるPythonの機能は、Rubyに限らず他の言語でもあっていいかもね。
>>387 その気概をまず自分がここに書き込む時に発揮してくれ。
>>399 2chの書き込みとガチで対比させるレベルの言語か・・・
なんつーか、勘違いしてるんだよな。 言語環境は至れり尽くせりが当たり前とか。 そりゃマイクロソフトなどの企業が作ってんならまだしも、これはOSSだよ? 文句があるなら協力するのが筋だっつーのを理解してない。ゆとり。
ttp://dev.ariel-networks.com/articles/workshop/ruby/ RoRを使えるようになることが目的のRuby解説(既存言語学習者用)
> ハッシュテーブル(3)ハッシュテーブルのキーには何でも使えますが、シンボル(後述)を使うことが多いです
> 使い勝手と可読性は文字列と同程度で、実行が速いので、使えるならシンボルを使うこと。
RoRではそうなん?
> メソッドの最後の引数がハッシュテーブルの時、{} を省略できます。
> # 一番省略したパターン (こっちがRubyでは一般的)
> method :key1 => "val1", :key2 => "val2"
一般的なん?
> Rubyの慣習
> symbolを多用
> 複数行のブロックは do end。単一行は { }
> コマンドや宣言っぽいメソッド呼び出しでは () を省略
> メソッド呼び出しの最後の引数のハッシュは {} を省略
> シンボル(後述)を使うことが多いです シンボルのほうが「速い」のは事実でよく指摘されてるよね(いちいちStringオブジェクトを作らないから) Ruby界隈で使用が絶対的に一般的かどうかはちと微妙(少なくとも、初心者に勧める例はあまり見ない) まあ、自分の中で使うと一旦決めりゃそれ以降はずっとシンボルを使うけどな RoRで時々見るハッシュのキーを1まんこくらい作ったり消したりするスクリプトなら違いが効いてくるんじゃないかしら > 一番省略したパターン (こっちがRubyでは一般的) printとかputsとか特定の関数的メソッド以外で引数のカッコを省略するのは現状ではそれほど一般的ではないと思われ メソッドなんだかただの変数なんだか何かの引数なんだか一発でわかりにくいじゃん 書くときのわずかなタイプ量削減のせいで後々ずっと読みにくくなるのは愚行と思えるがどうだろ もうちょっと本気で広く使われるようになれば強いコンセンサスもできて来るんだろうけど、ある意味過渡期だね
>>403-404 こんなところで書かなくていいよ。はてブにでも書けばいいから。
あと、書き方にはちゃんとRubyコーディング規約ってのがあるから。
だいたい、PerlからTIMTOWTDIを継承してるのに強いコンセンサスなんて不要。
最後の行とそのひとつ上の行でかなり真逆なことを言ってると思うんだが
>>405 の中ではこれで平気なんだろうか
>>404 HashにSymbol云々はattr*を使うようになるあたりでだいたいスタンスが固まる
「なんだ全部Symbolでいいじゃん」と感じる人は少なくない模様
>>405 公式なコーディング規約なんてあったか?
shugo.netの規約と、LoveRubyNet WikiのRubyCodingStyleしか見たこと無いが
>>407 オフィシャルなものは無い
特定の企業の内部規約を公開している、といった風情
公開時の主流だった書き方を知るためには役立つけど、その程度
>>408 いや、それほど主流でもなかったぞ
Rubyの言語性能と文法と直感性に則ったコーディングスタイルだとはあんまし言えない
現時点で大人数でがーっとまとめれば少数のパターンに収束すると思うんだけどねえ
そこから好みに合うパターンを取捨選択するということで、誰かやってみない?
・インデントはスペース2個。タブは氏ね はい次
Rubyってタブ文字人気ないよね
rubyにはpython -iのようなものはないのでしょうか? 指定したファイルを実行した後、対話モードになるやつです。
413 :
デフォルトの名無しさん :2007/11/15(木) 10:50:22
>>412 残念ながら無いはず
irb から require './hoge.rb' しても期待通りには動かない
415 :
412 :2007/11/15(木) 11:22:33
>>414 最後の行について詳しく教えてください。
「期待通りに動かない」とは、本来はどのように動くべきなのに、
実際にはどのように動くのでしょうか?
$ cat ./test.rb puts 'loading...' toplevel = 'toplevel!' @toplevel = '@toplevel!' TOPLEVEL = 'TOPLEVEL!' def method ; 'toplevel'; end class Hoge CONST='HOGE!' def method 'hoge!' end end puts 'done!' $ irb -r ./test.rb loading... done! irb> toplevel NameError: undefined local variable or method `toplevel' for #<Object:0x402ea9c0 @toplevel="@toplevel!"> from (irb):1 irb> p @toplevel,TOPLEVEL,method "@toplevel!" "TOPLEVEL!" "toplevel" nil irb> Hoge::CONST "HOGE!" irb> Hoge.new.method "hoge!" うーん、トップレベルのローカル変数にだけアクセスできないな 他のは平気なのかな?
>>414 irbから eval File.read('hoge.rb') とするのはどうでしょう
>>418 それなら普通に動くはず
irb 自体の影響を最小限にするために irb -f で起動したほうがいいかも
420 :
396 :2007/11/15(木) 13:03:34
>>398 >>400 現状ではできないのですね。残念です。
> 出力文字コードの自動変換については情報なし
これはやる予定は無いのだと思います。
[Ruby] M17N開発会議
http://www.rubyist.net/~matz/20070926.html > 最近主流っぽいUCS(Universal Character Set)モデルを 採用するか、日本の
> 伝統的文字列処理の延長線上で(ある意味、茨の道)なんとかするか という話。
> 結局、後者で頑張ることに。
> (略)
> エンコーディングを明示的に指定しない出力は文字列のバイト表現を直接出
> 力する
こういう方針に決まったようです。
ということで、自分がどうするかはちょっと考えることにします。ありがとう
ございました。
>>406 俺は「なんだ全部ClassやStructでいいじゃん」と感じたな
require "sdl" SCREEN_W = 640 SCREEN_H = 480 SDL.init(SDL::INIT_EVERYTHING) SDL::TTF.init screen = SDL.set_video_mode(SCREEN_W, SCREEN_H, 16, SDL::SWSURFACE) font = SDL::Kanji.open("Game/jiskan16-2004-1.bdf", 15) font.set_coding_system(SDL::Kanji::SJIS) haikei = SDL::Surface.load("Game/BG10a.jpg") font.put(screen, "テスト", 30, 350, 0, 0, 0) screen.flip screen.put(haikei, 0, 0) #画像提示 screen.update_rect(0, 0, 0, 0) loop do while event = SDL::Event2.poll case event when SDL::Event2::Quit, SDL::Event2::KeyDown exit end end end というプログラムがあるのですが なぜか game.rb:20: [BUG] Segmentation fault ruby 1.8.6 (2007-06-07) [i486-linux] Aborted (core dumped) というエラーが出ます どうすればいいのでしょう?
BUGと出た場合はMLで報告。
例によってSDLのせいだと思うけどな。
あっ、SDL入れてました どっちに報告するといいのでしょうか
for i in 1..10; p i; end で1から10まで表示されますが、10から1へ表示するベストプラクティスを教えてください。 n = 10 for i in (1..n).to_a.reverse; p i; end は n が大きいときに巨大な配列を作成するので、あまり効率がよくありません。
10.downto(1) do |i| p i end pとputsは意味が違うので注意。Fixnumだと見た目かわらんが。
Rubyでfor文って使うことある? 言語の乗り換えとか最初のうちは仕方ないけど
C言語で同じ型の変数を1行でまとめて宣言するみたいに // int hoge, fuga, piyo; Rubyでインスタンスをまとめて生成する方法はありませんか? hoge = MyClass.new fuga = MyClass.new piyo = MyClass.new ・・・ という書き方を避けたいんですが・・・
staticなら別だが、 int hoge, fuga, piyo; も変数宣言してるだけで初期化はしてないぞ。
irb> a,b,c = ['A','B','C'].map{|e| Regexp.new(e) } [/A/, /B/, /C/] irb(main):004:0> p a,b,c /A/ /B/ /C/ nil irb> a,b,c = Array.new(3).map{ Hash.new } [{}, {}, {}] irb> a['key']='val' "val" irb> p a,b,c {"key"=>"val"} {} {} nil irb>
map しなくても Array.new(3) にブロック渡せばいい
>429 Railsでは多用してると聞いたことがある
Rubyのfor文の書き方はよく忘れる。 そして(実害はないんだが)inが予約語だということもよく忘れる。
>>403 を見る限り、Railsの中身はなかなかカオスだな
「動いて便利ならいいじゃん!」ってのはその通りではあるんだが
もしかして、Railsの中身をRubyっぽく書き直したらもうちょっと速くなったりするか?
Railsは「Rubyっぽく」リフレクション使いまくりなせいで遅いのだ。
>>428 なるほど、Integer#downto()というのがあるんですね。ありがとうございます。
しかしこれだと for 文では使えないですね。
for i in 10.downto(1) do puts i end #=> LocalJumpError: no block given
残念。
>>430 hoge, fuga, piyo = [MyClass.new, MyClass.new, MyClass.new]
とか
hoge, fuga, piyo = (1..3).collect{MyClass.new}
とかどうでしょう?
> しかしこれだと for 文では使えないですね。 はぁ?w
あのな、downtoでループするの。
>>439 ちょ、使い方間違ってるw
10.downto(1) do |i|
puts i
end
>>442 ブロックつきで呼び出すのは分かってます。
>>428 でそう書いてありますから。
ただ
for i in 1..10 do puts i end
はできるのに、その逆(10から1)だとfor文が使えないのが残念だというだけです。
for文は最初から順番に辿るという機能しかない。 ふつーは使わないから存在自体忘れていいよ。
それって for の問題より 10..1 がないってこと?
>>444 多分
>>443 さんがいいたいのは他言語だと
for(int j=10; j>0 ; --j)
みたいなことなんじゃないかね。
確かに ruby だと for 使わないなぁ。ruby での使いかた忘れてる。
どうしてrb厨はrubyのforは欠陥品だから使えないと素直に認めれないのはなぜ?
例えば今あるのが欠陥品で、もっと便利に使えるようになっても Rubyでは絶対使わんだろうな
低機能なforなんか使わんでEnumerableしろよ、というのをどうよめば 「for文が低機能だなんて認められない」という主張だと誤読するんだろう。
俺も他の言語では for 使うけど ruby では、たとえ for i in 10.downto(1) do puts i end たできたとしても 10.downto(1) do |i| puts i end で十分なのに for 使うのにどういうメリットがあんの? なんかもっと説得力のある例無いんかね。
単に慣れだろ 俺もRuby触り出したころはfor使いたくて仕方なかったの思い出したわ
>>429 Rubyの for って確かスコープ作らないんだっけ?
イテレータとの差別化するとしたらそこじゃね
Ruby の制御構造 for はいわゆる for 文ではない
既存の言語の for 文にいちばん近いのは Integer#step だろう
10.step(1,-1){|i| puts i }
引数がいきなり2つあって一見動作不明なのも C 言語系 for 文と同じ
あと、for が Range を受け取るのはオプショナルな動作なので配列渡すようにしとけ
>>451 ループの中で新規に変数を作成する場合は for 文のほうがわかりやすいかもしれない
もうちょっと慣れると「このデータ作成に for ループ使うのは変だ」と思うようになるんだけどさ
Ruby の配列指向は一旦これに染まるととても安楽に物事を処理できる
puts と print って普段どっち使うの
>>453 俺は puts, print, p, 制御が必要なら printf のうち
都合の良いのを使ってる。puts/print どっちでも良い時も多いけど。
>>453 俺の場合はputs一択
式展開が強力なRubyでは、たいていの場合 puts で事足りるし
そうでない場合は $stdout.write や $stdout << を使ってる
オブジェクト至高なんだから#display使えよ
>>455 そんなに桁数がいらない、とか言う場合どうするの? eg.
puts Math::PI
>>457 なんつーか、Rubyでは使用用途的にもそういう状況にぶち当たること自体がそう多くないと思うんだがどうか
もし文字列をいじる必要があるのなら「Stringのメソッドを使った結果の文字列全体」をputsかprintで表示するよ
表示自体をprintfでいじるようなことはまずしないと思う
puts "#{"fmt1"%str1} #{"fmt2"%str2}"
puts "#{sprintf("fmt1",str1)} #{sprintf("fmt2",str2)}"
printfは使わないなぁ。 個人的には puts format % args が多い。
printf使用者層は文字列の#{}埋め込みを使わない層と被ってる印象がある いや、自分でわかりやすいように便利に使ってくれて構わないんだが、なんとなく
>460 俺がまさにそれだ。 書式と内容は分離したい派。 #{}内に式が入るとごちゃごちゃし易いし。 改行入れる場合は printf でなく >459 使うけど。
個人的な事情だが、gettext使うので文字列展開で埋め込むのは難しいことが多い。
>>458 そういう書き方かぁ。俺はテキスト処理もするけど、簡単な計算
もさせてファイルに書き出したりとかもするから数値書き出によくあたる。
両方一緒に処理する必要がある時に ruby とか便利でよく使う。
人それぞれ使いやすい方法という感じだな。
puts と sprintf を両方使うなら俺はやっぱり printf 一発で行っちゃうな。
他言語も使ってて、それとも近いし。
RubyでCGIを簡単に作る方法を教えてください。 但しcgi.rbとerubyとRuby on Railsはダメです。
GETなら環境変数QUERY_STRING、PUTなら標準入力を拾って、 &(or ;)で分割したりしてパラメータを拾い出し、 目的の結果を組み立てて、 print "Content-Type: text/html¥r¥n¥r¥n" の後に結果を書く。
webrick/cgi
>>465 PUTじゃなくてPOSTだろうし
"\r\n\r\n"だとWindowsに置いたらアウトだと思うんだが
ヘッダの改行は¥r¥nでってのはメール(RFC2822)だけ?
いや、Windowsだと¥r¥nは CR CR LF の並びになるのか。
>>467 ,469
はいはい、なりません、なりません。
おまいらワロタ
binmodeうめえ
さぁ方法としてはこんな感じじゃね?しらねーけど
require "uri"
require "net/http"
Net::HTTP.version_1_2
REGEXP_URL = // #URLの正規表現(自分で調べる、h削った奴とかも考えないと駄目だよね)
dat = Net::HTTP.get(URI::parse("
http://news22.2ch.net/newsplus/dat/1194998661.dat "))
urllist = dat.scan(REGEXP_URL)
File::open("hoge.html", "w") do |io|
urllist.each do |url|
io.puts "<a href=\"#{url}\">#{url}</a>"
end
end
>>449 > for i in 10.downto(1) do puts i end
1.9だとdowntoがEnumeratorを返すから、これも動くな。
>>474 つ URI.extract
p 日本語 だと文字化けするんだけど RDEではどこに-Ksを入れればいいの? 引数設定して引数を与えて実行しても文字化けしたままでした
477 :
デフォルトの名無しさん :2007/11/19(月) 04:38:39
先頭行に #! ruby -Ks
>>475 >つ URI.extract
ほぉこんなのもあったのねん
480 :
464 :2007/11/19(月) 08:41:50
誰も答えられないのかよ やっぱrubyはライブラリ周りがクソだな 周りにこんなやつしか集まらないmatzに同情しちゃうよ
481 :
デフォルトの名無しさん :2007/11/19(月) 12:56:46
"あ".length => 2 これを1にするには?
$KCODE = 's' require 'jcode' p "あ".jlength #=> 1
486 :
466 :2007/11/19(月) 20:47:50
ナチュラルにスルーされた俺涙目
つうかさ、
>>464 >RubyでCGIを簡単に作る方法を教えてください。
>但しcgi.rbとerubyとRuby on Railsはダメです。
なんでいちばんよく使われるこの3つを外すのか理由が書いてないのはなぜ?
理由が分からんから、どれを紹介しても「ダメです」といいそう。
こんなのどうみてもアンチの質問だろ
そこまでわかってんならスルーできるだろ常考
いや、なんかかまってほしそうだったからさ。
言い訳は無用
>>488 だからみんなスルーしてたんじゃないか
... 464以外は。
webrick/cgi <-------------> Rails ↑ココ この辺に位置するWebフレームワークが欲しい。SQLを要求するような Railsはちょっと牛刀すぎる。かといって生CGIは触れたくない。 いい落としどころは無いものか・・・
493 :
デフォルトの名無しさん :2007/11/20(火) 08:15:25
RailsってSQLを要求したっけ?
> SQLを要求するようなRails お前Rails使ったこと無いだろ。 DB無しのアプリだって普通に作れるぞ
そりゃ作れるけど普通というのは無理があるだろ。 とにかく依存性が大きくて大規模すぎということが言いたかったわけだ。
もしかしてscaffoldしか使ったこと無いとか? ファイルベースの掲示板とかバリバリ作ってるよ
railsをCGIとして動かしたらトップページ表示するだけで 1秒近く掛かったのでクソと判断したが間違ってたのか?
>>496 一般的ではないだろ。おまえが乾電池をケツに入れてオナニーしてるのは知ってるよ。
でもそれは一般的じゃないんだ。
>>492 Nora
ただし分かりやすいマニュアルはないので、根性で理解すべし
あるいは自分でフレームワークを作る
>>497 Railsを通常の(1回ごとにプロセスを起動しなおす)CGIスクリプトとして
動かそうというのが、まず間違った発想だと思う
>>498 使ったこと無いなら無いって素直に言えば許してあげるのにw
RailsってDBとの連携が簡単ってのがウリじゃないのか
CGIな機能は二の次だよな フォームのGUIも二の次 「ふつう」のネットお楽しみ機能ならnet/httpとCGI.rbとPStoreとrexmlで作ったほうがうまく動くことのほうが多い それこそアプリケーションを考えて作らないとRoRは鯖リソースと時間の無駄撃ちだよ
>>487 無理矢理弁護してみると、理由は既に書いてあって
「簡単」じゃなかったんだよ、その3つは。464 にとっては。
彼女の実家からなると金時が山ほど送られてきたんだが 彼女が炊飯器で芋を炊き出したw 炊飯器で芋炊けるのかよwww
すいません誤爆しました
507 :
デフォルトの名無しさん :2007/11/20(火) 18:37:17
なzうぇらめなんですか?
自前で排他制御とパースを考えてテキストファイルに保存するよりは PStoreのほうが確実性とか耐障害性とかがマシかと思われ これより上のシステムは……なんだろう 数MB程度のデータなら下手にDB試行錯誤して使うより速いと思うぞ
>>507 rubyのバージョンが古くなると駄目になるから
どう駄目になるのか言ってみ? ん?
そんなに感情的になるなよドカスが
>>510 に答えられないような奴は
「Rubyのバージョンが上がると動作しなくなる可能性があるからPStoreは駄目」
なんて口走って欲しくはないな
したり顔で害悪を撒き散らすだけのオタクと重なる
標準添付のオブジェクトの形式でしかPStoreで保存しない主義の俺は勝ち組
いまいちPStoreの意味がわかんない俺 具体的に何につかうんだべ? ハローワールド的に教えてくんろ
>>511 incompatible marshal file format (TypeError)
>>514 ArrayやHash、StringしかPStoreに保存しないってことか?
それでもバージョン変わると読めなくなるよ
>>515 データを任意のファイルに保存する、としか言い様がないと思う
まずリファレンス見れ
古いバージョンのRubyくらい手元にあるだろ この世にある古いRubyが勝手に消えたり急に動作しなくなったりするわけじゃない pstoreファイルだけ持ってきて 古いバージョンのPStoreで読んで テキストとかの中間形式に変換して一時保存して 新しいバージョンのPStoreで書き込めばいい (バージョンアップでスクリプト自体が動作しないような場合はそもそもPStore以前の問題なので除外) その間システムが止まるだあ? あんたの使ってるサーバはある日不意にプログラムがバージョンアップするのか? 違うだろ? 予め予告があったり手動でバージョンアップしたりするだろ? その間に変換しろよ
>>517 のコストを支払いたくない場合はPStore系列ではなくて他の保存形式を選択することになるな
それこそ「PStoreを常用するかどうかはプログラムがどれだけミッションクリティカルかに依存する」というつまんない結論に
SQLiteじゃだめなのか?DBサーバ必要ないし、SQL使えるし。
突然消え去るのがPStore
Rubyってなんでスクリプト言語という選択をしたのだろうか 何度Rubyがコンパイラ言語ならなぁ・・・と思ったことか。
>>492 CGIKitはどうでしょうか
ドキュメントが日本語でしっかり書かれてあるという奇跡のようなフレームワークです
るびまにも解説あります
ttp://jp.rubyist.net/magazine/?0005-CGIKit ほかはrubyforgeで CGI とか Web とか Framework をキーにして検索すれば見つかると思います
海外では Nitro と merb がそこそこ知名度があるようです
英語が読めないならあきらめて cgi.rb 使ってください
>>517 CGIスクリプトだってことを忘れてないか?
バージョンダウンする場合どうするんだよ
>>521 俺は script 言語だからこそ ruby を使ってるけどね。用途次第だね。
compiler もあったら選択肢が増えていいだろうね。
あっちゃいけないとは決まってはないのでは。
てか、コンパイル方式だったら何がよくなるか分かってんの? 速度は変わんないよ。コンパイル方式にしても。
>>525 evalも__send__も使ったことのない人にはいくら説いても無駄かと。
>>519 SQLiteのインストールを前提にするならいい選択肢
バッチファイルのpauseみたいな動作をさせたいのですが何か良い方法がありましたら教えてください これまで $<.gets で代用していたのですが引数を取って起動した場合期待した動作をしてくれないので代わりとなる方法を探しています
/dev/ttyとかCONをopenすればいいんじゃない?
`pause`
$stdin.gets というか、困ったなら自分の使ってるメソッドやオブジェクトのマニュアルはきちんと読め ARGFとARGVとSTDINの違いを説明してない解説は窓から投げ捨てろ > ARGF > 引数(なければ標準入力)で構成される仮想ファイル (詳細は ARGF を参照)
>>527 SQLite を標準添付にすればいいのにね。ライセンスも (たぶん) 問題ないと思うし。
SQLiteはパブリックドメインだよ Python2.5にも入ってるしsqlite3と込みで標準添付にしてほしいなあ 軽量で設定不要、型が無いからRubyには持って来いだと思うんだが
たしかAIRもSQLite3だったよな。
>>532-533 仮にSQLite/Rubyが標準添付されたとしても
SQLite本体のインストールは必要だから、あんまり変わらない気がする
>>535 そのSQLite本体を添付しろという話なわけだが
気持ちは分からなくないが同封する必要がない
ここまでの流れをまったく読んでないのか?
sqliteエンジンをRubyの拡張モジュールに静的リンクすればおk もともとそういうアプリ内組み込みDBなんだから
Ruby内でsqlite使おうとすると、sqliteコマンドの「.」で始まる構文が使えないからなぁ… テキストのインポートもできないしsqliteは便利なのに機能を全て活かせるようにしてほしいわ。
>>540 なんか勘違いしてる気もするが
system('sqlite3 foo.db < bar.sql')でいいじゃまいか
tk みたいな添付方法ならわからなくもないけど sqlite 本体を添付するのは反対だなぁ mysql とか posrgres とか他のデータベース使う人にとっては無用の長物でしかないし ちゃちな cgi なら pstore でいいじゃん 個人の環境でわざわざ ruby のバージョンダウンさせる奴もいないだろ
標準出力のリダイレクトについて質問させてください。 例えば次のようなコードf.rbで、 while sleep 1 puts "ふぁっく" end 次のように実行しても ruby f.rb>>fuck.log fuck.logには何も書き込まれません。 しかし、上のコードのwhileを除くとちゃんと書き込まれます。 上のコードでfuck.logに書き込むには、open等を使ってコードの中で処理するしかないのでしょうか?
>>543 while
sleep 1
puts "ふぁっく"
STDOUT.flush
end
ですよね
しかし、無限ループするという・・ なんでだろう
ああ、なるほどsleep 1が条件式として扱われてるのか
open等を使ってコードの中で処理したとしても、 flushしなければ同じことが起こり得るので注意した方が良いと思われ。
>>550 同じ行に条件式がないときは
文法エラーを出さずに次の行を探すとかそういう処理なんだろうね。
本当に正しい動作なのかはわからない。
Rubyリファレンスマニュアルの字句解析より === 識別子と一部のリテラルの途中を除いては任意の場所に空白文字やコメントを 置くことができます。空白文字とはスペース、タブ、垂直タブ、バックスペース、 キャリッジリターン、ラインフィード、改ページです。改行は行が明らかに次の行 に継続する時だけ、空白文字として、それ以外では文の区切りとして解釈されます。 改行と認識されるのは、キャリッジリターン+ラインフィードかラインフィードです。 === これかな?ここでは改行もスペースと同じ扱いなんだろう。
>>553 ふむ。
「改行は行が明らかに次の行に継続する時だけ」
というのが微妙な表現な気がするけど、これが今回の挙動に合致するのかな?
する。 "while" だけで文が完結することはないから。
556 :
デフォルトの名無しさん :2007/11/22(木) 20:22:49
htmlの数字とか&ltとかを その文字に変換するライブラリってありますか?
require "cgi" CGI.unescapeHTML foo
関数みたいに使えるからソースそのままパクッといけちゃったり
決定版はまだ無いらしい irb> p CGI.unescapeHTML('<') "<" 数値参照は苦手の模様 irb> p CGI.unescapeHTML('…') "…" # "…" が出て欲しい REXML::Text.unnormalizeでもできるが挙動不審という話が
ああしまったうっかりしてた irb> p CGI.unescapeHTML('<') "<" irb> p CGI.unescapeHTML('…') "…" # "…"が出て欲しい
561 :
デフォルトの名無しさん :2007/11/22(木) 22:12:18
557〜560 サンクス
EclipseとRDTでやってる人いる?
>>541 こちら側の環境がwindowsだからかかもしれないが、sqlite独自のドットコマンドがあってRuby側から
system("sqlite3 test.db '.help'")
と第2引数にドットコマンドを渡すことができないんだよ。
今試してみたら
system('sqlite3 foo.db < create-tbl.sql') もできないわ…
tableの作成や、select、insertはexecuteでできるが、.importや.outputなどが、Ruby側で制御できない
のは不便じゃない?
IO.popen('sqlite3 foo.db') {|sqlite3| sqlite3.print File.read('create-tbl.sql') } はできる?
つか、わざわざsystem経由でsqliteコマンドなんて使うのは何でなんだぜ?
まったくだ。
567 :
541 :2007/11/24(土) 00:03:39
>>563 D:\temp>irb
irb(main):001:0> system('sqlite3 foods.db .help')
.bail ON|OFF Stop after hitting an error. Default OFF
[...]
.width NUM NUM ... Set column widths for "column" mode
=> true
irb(main):003:0> system('sqlite3 foods.db < foods.sql')
=> true
irb(main):004:0> system('sqlite3 foods.db < foods.sql')
SQL error near line 1: table foods already exists
=> false
問題ないように見えるんだぜ
>565 >540 のよーな事情があるそうだ
569 :
540 :2007/11/24(土) 00:22:19
>>564 sqliteは起動するが、printされない
vurbyで使い捨て処理のコードをexerbでexe化して他人に渡したりしてるのよ。
logの集計などで
・使う人はスクリプトどころか。sqlコマンド自体も知らない
・サーバー上のDB(オラクルとかMysql)を使えない
という場面あって、現状fasterCSVなどで仕方なくやってる感じ。
別に自分でやるなら別にdos窓でそのまま処理するだろうし
>>565 の言うのも分かる。
. で始まるようなのは sqlite3 コマンドのビルトインコマンドだろ
使いたいんなら上でいわれてるように system とか使うしかない
つーか
>>563 みたいな作業ならバッチファイルの方が良くないか?
Rubyで集合を表すSetクラスつこおうと思ったんだが べき集合や籍集合のメソッドすらないのか・・・ 自分で書かないとダメ?
誰か作ってそうだな? raa 見た?
積集合はもともとある
raaみたらいくつか候補があったのでfinite-setライブラリとやらを使わせてもらう事にしました
>>569 open("test.csv", "w"){|f|
f.write("1,Perl,Larry\n2,Python,Guido\n3,Ruby,Matz\n")
}
IO.popen("sqlite3 test.db", 'r+'){|f|
f.write <<EOT
create table test (id, name, author);
.separator ,
.import test.csv test
.mode tcl
select name, author from test;
EOT
f.close_write
print f.read
f.close_read
}
----
"Perl","Larry",
"Python","Guido",
"Ruby","Matz",
本当はpopenしなくても sqlite3 test.db < test.sql とかすれば十分
test.sql にはSQL文だけでなくドットコマンドも含められる
正規表現の n オプションて何? /foo/n というのを見たんだが。
none
$KCODEの値を無視して「日本語無視したバイト列」の正規表現 $KCODEはどっかで指定されてる可能性があるんだけどこの正規表現では無視したい、というときに使う
582 :
デフォルトの名無しさん :2007/11/24(土) 22:00:59
Rubyって結局何ができるんですか?Web用途のみですか?
地方都市 松江を復興できる
Perlのできることの7割とPHPのできることの8割を 若干のリソースの増加と引き換えに楽しく製作できる Rubyだからこそできるというようなものは特にないし、Rubyだから上手くできるというような分野も特にない あなたがRubyを見て何もひらめかなければ、今のあなたにRubyは必要のない代物
gemすると (OpenURI::HTTPError) 鯖が落ちているだけでしょうか?
Banmen = [ [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,-1,1,0,0,0], [0,0,0,1,-1,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0]] とした時に、Banmen[-1][0]は0となって、Banmen[-1][8]はnilになります。 二つとも定義してないのにどうしてこういう違いが出るのでしょうか? あと、if文の条件式でnilになるオブジェクトを参照するとエラーになる様なのですが、 そういう仕様なんでしょうか?何か解決案はないものでしょうか?
587 :
デフォルトの名無しさん :2007/11/24(土) 22:40:23
>>584 説明の天才。wikipediaに追加しといてくれ。
>>584 PHPにできてRubyではできない2割はなに?
589 :
デフォルトの名無しさん :2007/11/24(土) 22:54:26
うぜぇ
>>586 多くの人がなぜか間違えるんだが、素の Ruby には多次元配列というものはない
array[-1][0] は array[-1] の指す要素の持つ [] メソッドに引数 0 を渡したものに過ぎない
あと、後半のはエスパーするに
puts 'target exists!' if h.has_key?('target')
という if 文を書いたとき、何らかの理由で h が nil だった場合
NoMethodError: undefined method `has_key?' for nil:NilClass
とかいう例外が出ることを言ってるんだと思うが、仕様というか記述されてるそのまんまだ
h が nil にならないことをあらかじめ保証するか、条件で弾くか、例外を捕捉しとけ
puts 'target exists!' if !h.nil? && h.has_key?('target')
むしろ、Rubyに出来てPHPに出来ないことはありそう。
>>591 これって、Ruby使い始めの頃の人だとNilにhas_key?を定義するよね
>>592 そりゃ探せば細かい何かはあるだろ
rubyにできないこと? デバドラ作りかな。
596 :
デフォルトの名無しさん :2007/11/25(日) 00:40:50
RubyにはメールをPOPで受信できるクラスとかありますか? この部分は自作するか他のフリーソフト使うしかないでしょうか?
net/pop
Rubyに出来ないことってそんなに無いよね
クッキーとか保持してくれるHTTPクライアントクラスってあったっけ?
>>598 チューリング完全ならどんな「計算」でもできる。
プログラミング言語はチューリング完全だから、どの言語でもできないことはない。
いやこの文脈では例えばソケットを扱えないだとかそういう所の 話であるような気がする
(Rubyは当然ソケットを扱えるけど)
PHPでYコンビネータは書けますか
>>599 Perlにあるような超便利な自動処理クライアントは今のところ無い
ヘッダから抜き出して明示的に保管するしかないかと
RubyでCurlとか使えないんだっけ
Time.now.to_i とすると、TimeをFixnumに変換できますが、逆はどうすればいいでしょうか。
Time.at(#Fixnum)
webrickに関する質問です。 プロキシサーバースクリプトを組んでいるのですが 串の種類の「Anonymous」のようなタイプの串サーバーにするためにはどのようにすればよいのでしょうか? 参考ページなどがあればぜひお願いします。
>>611 それがどうなってるのか理解していないのなら作ることはできない
"ff"という文字列に、あとから”\x”を指定して 16進数として扱いたいのですが、どのように書けばいいのでしょうか?
x = '¥¥x' + 'ff' eval x.sub(/¥¥/, '0')
"ff".to_i(16)
617 :
デフォルトの名無しさん :2007/11/26(月) 02:12:18
来年4月に新入社員研修で使うRubyの教材を作らないといけないんだけど、
これだけは最低限盛り込んでおけという内容・ポイントはある?
ちなみに本職SEでJavaならなんとか書けるレベル。
この本をポーンと渡されて、参考にしてね。だって。
ttp://www.amazon.co.jp/Programming-Ruby-Pragmatic-Programmers-Guide/dp/0201710897 今のところの構想は、
Rubyのインスコ(今のところの予定はWinXP)を図解で解説
簡単なプログラムの例文を書いて、そこからクラス、オブジェクト、変数を解説
そのプログラムの応用で、条件文、ループ、配列を解説
オブジェクト指向が全員分かるようになるまで詳しく解説、クラスも詳しく解説
他、入出力、例外処理、スレッド・プロセスなどなど。
2週間に1回、課題を用意して自宅でやってくるを3ヶ月しようと思うんだけど。
618 :
デフォルトの名無しさん :2007/11/26(月) 02:15:27
ちなみに、↑の本の第二版(洋書、Ver 1.8)を渡されました。 適当にオンラインで見つけた物を注文した物がそのまま手元に来たと思われます。
Win32API/Win32OLEの使い方も教えとけば?
新入りが受け身にならなくて済むように * irbの使い方 * 添付ライブラリや組み込みクラスの使い方の説明 * マニュアルはどうやって読むか/使うか なんかも教えとくといいんじゃないかと思った。 入門する前の段階も大事っていうか。
Webアプリケーションのプロファイルって簡単にとれましたっけ。 もしできるならやり方のヒントだけでもお願いします。
>>617 実用性考えて gems 使い方もやったら。簡単だし。
>>617 >本職SEでJavaならなんとか書けるレベル
なのは、617自身なのか、新入社員(中途?)なのか。
とりあえず、Java書ける人相手なら、module とブロックが
Ruby の最初の感動ポイントな気がする。
というか、自分の感動ポイントだった。
625 :
デフォルトの名無しさん :2007/11/26(月) 13:52:03
中途入社は新入社員とは言わないだろゆ。 よって本職SEは質問者の方。 ところで社員研修でRuby教えるってどういう会社? 業務でもRuby使ってるの?
>>624 namespaceがかぶってることに感動?
628 :
デフォルトの名無しさん :2007/11/26(月) 15:53:27
Mechanizeのアプロードがうまくいきません。 アップロードのファイルを指定するときは フルパスで指定すればいいんですよね? form = page.forms[0] form.file_uploads.name('Z_FL')[0].file_name = upload_file agent.submit(form) (upload_fileは"/Users/local/Desktop/123.jpg") p formでは [#<WWW::Mechanize::FileUpload:0x14533f4 @name="Z_FL", @value=nil, @file_data=nil, @file_name="/Users/local/Desktop/123.jpg">] それと、submitするとき(postするとき)に、エンコードされるはずですが, そのエンコードの状態(postdata)をみるメソッドはありますか?
>>624 block は初め馴染めなくて苦労したが、慣れたら使いやすい。
C++ → Java とか入りやすかったけど、なぜか ruby は初め違和感があった…
lambda がないからでしょ。 blockイテレータってのは引数に手続きがとれるということだから。 それがわからないと詰まる。インラインで書ける関数ポインタみたいなもんって 教えればいいんじゃないかなあ。
CからRubyだった俺はいろんな意味で戸惑った
Perl → Smalltalk → (vbやらjavaやら) →Ruby だったのでとまどいはなかった。
633 :
628 :2007/11/26(月) 16:54:16
一応テスト用のスクリプト(アップロードできませんでした)
$ cat test.rb
#!/usr/bin/ruby -Ku
require 'rubygems'
require 'mechanize'
require 'nkf'
agent = WWW::Mechanize.new
file = '/Users/local/Desktop/123.jpg'
page = agent.get('
http://www-2ch.net:8080/up/ ')
form = page.forms[0]
form.file_uploads.name('file').first.file_name = file
page = agent.submit(form)
puts NKF.nkf('-w', page.body)
634 :
やばす :2007/11/26(月) 16:59:06
今宿題でrubyで最大値を出すプログラムを作れって。。。 かなりぐぐったがむりぽ。。 だれか教えてくだされ。
635 :
やばす :2007/11/26(月) 17:13:10
誰か。。神きてくれー
>628 form.file_uploads.first.mime_type = 'image/pjpeg'とか入れたり。 あと、Content-Transfer-Encoding: binary があるとダメな場合があるから、 form.rb の def file_to_multipart(file) にある、+ "Content-Transfer-Encoding: binary\r\n" の部分を コメントアウトしてみたり。
637 :
神 :2007/11/26(月) 17:22:53
puts "最大値"
638 :
☆☆☆ :2007/11/26(月) 17:23:01
私も最大値の出しかた知りたいデス☆ 誰かお願いしマス><
639 :
やばす :2007/11/26(月) 17:24:24
神きたあああああああああああ 詳しくお願いできますか?
新手の荒らしですか?
641 :
やばす :2007/11/26(月) 17:26:12
640 俺っすか?
>639 Array#max 使えよ 何、まだ分からない? そりゃあんた講義をちゃんと聞いてないからだ。
644 :
やばす :2007/11/26(月) 17:29:19
643 使ったんですけど。。。 できないっス>< よかったらコマンド全部書いてくれないですか?
646 :
やばす :2007/11/26(月) 17:30:24
642 ここ探したんですが、、、のってなかったです><
648 :
やばす :2007/11/26(月) 17:31:24
645 そのスレだれもいないです><
649 :
やばす :2007/11/26(月) 17:35:15
マジでお願いします。。
><←これって挑発ですよね?
>よかったらコマンド全部書いてくれないですか? なんだ。 ひょっとしてRubyは俺の知らない間にシェルにでもなったのか。
652 :
やばす :2007/11/26(月) 17:38:09
650 そうだよー
653 :
628 :2007/11/26(月) 17:51:45
>>636 どうも
gemでインストールしたライブラリをいじるのは勇気いるなぁ。
mime_typeも指定したけどだめだった。
だれか、2ちゃんねるアップローダーにMechanizeでアップロードできた人いますか?
ポストするデータがエンコードされた状態はみられないみたいです...
rubyなんか自宅で1日で覚えられるよ
>>653 Content-Transfer-Encoding: binaryを削らないとダメ。
rubyの糞ライブラリどもは、どんどん書き換えていかないと使い物にならんぞよ
ライブラリなんかマニュアル見ればいいじゃん。 rubyを覚えるっていうのは構文を覚えること。 ライブラリの細かい挙動なんていちいち覚えるかボケ。
なんかずれてるぞ
660 :
デフォルトの名無しさん :2007/11/26(月) 19:06:40
やばすさん できたよ a = Array.new 10.times do a.push(rand(10)) end a.each_with_index {|x, idx| print "[#{idx}]:#{x}\n" } print "最大値は#{a.max}です♪\n"
今日からRubyを勉強しはじめた者です。 Windowsの、mswin32環境のRubyなのですが、 社用のコマンドラインプログラムを実行すると system ("ほにゃらら.exe #{myfile}") 一瞬DOS窓が出てすぐ消えます。(コマンドは成功している) 目がチカチカするので、DOS窓出さない様にしたいのですが 解決策をご教授頂けないでしょうか。宜しくお願い致します。
>>661 どうやってそのrubyを入れたのかしらんが、実行するときに目をつぶるというのはどうだ。
あとは、拡張子をrbwにしたらうまくいったりするかもしれん。
拡張子 rbw は wrb のタイプミスかと思うので両方で試してみましたが やはり一瞬、DOS窓でちゃいますね。 社用のコマンドラインプログラムをいくつか連続で実行したいので DOS窓がちかちかちかちかするのを抑止したいんですよね;;
ほにゃらら.exeもRubyで書いてしまえ
パイプ使え
>>664 3rd-Party製のコマンドツールなのでそういう訳にもいかず...orz
667 :
デフォルトの名無しさん :2007/11/26(月) 20:13:50
system("start /b .jpg .exe #{arg}")
>>667 DOSプロンプトは&が使えないのが芋だなとかずっと思ってたんだが
これで代替できそうだ。横からだがThx
CMD /? と START /? と SET /? は読んでおいたほうがいい
>>623 あると地味に便利そうだが、期待するほどのものではないという印象
さすがに本人乙としか言い様が無い
ところでこのスレから新たなCGIフレームワークが生まれるのはまだですか
>>667 Winnyに流れてるウィルス入りのファイル名みたいだな > .exe
rubyで使える素敵なリストライブラリとかってありませんか?
676 :
デフォルトの名無しさん :2007/11/27(火) 06:30:08
>>674 こういう表現、英語でもあるのかなぁとか考えちゃって
なかなかスラスラと言葉が出ないんだわ
頭の悪い人は細かい事考えずに適当に知ってる単語並べて
困るのは相手だけだから苦労しないよね
I can't find it on Google.
The Google has not that word ruby-lisp.
Not Found!!
生き方がおかしい人に、日本語のおかしい人が話しかけたという感じ。
682 :
デフォルトの名無しさん :2007/11/27(火) 11:41:08
質問させてください。 h = { "b" => ["b1", "b2" ], "a" => ["a1", "a2"], "c" => ["c1", "c2", "c3"] } 上のようなハッシュを配列に直してソートをかけたいと思っています。 ソートの基準は、第1が値の個数(降順)、第2がキーの アルファベット順(昇順)です。 h.sort_by{ |key, value| value.length } で第1の基準でソートした配列を作ることはできるのですが、 その次で詰まってしまいました。何かいい方法はないでしょうか? 最終的に次のようになって欲しいのです。 [ "c", ["c1", "c2", "c3"], "a", ["a1", "a2"], "b", ["b1", "b2"] ]
まず、第1は降順だから -value.length だよね。 それで本題だけど、複数の基準で sort_by したい場合は、 ソートのキーを配列にすると良いよ。 h.sort_by{ |key, value| [-value.length, key] }
>>682 h.sort_by{ |key, value| [-value.length, key] }
Array の <=> は第1要素が等しい場合は第2、第3と評価されるから
で、まず多い順に並べたいみたいだからマイナスがつけてある
>>682 h.sort_by{ |key, value| [-value.length, key] }
686 :
682 :2007/11/27(火) 12:47:04
>>683 , 684, 685
ご教示ありがとうございました!
ソートのキーを配列にすれば、第3、第4の基準を作ることも
可能なのですね。すばらしい。
irb(main):001:0> def aho; "AHO"; end nil irb(main):002:0> aho "AHO" irb(main):003:0> aho = aho nil irb(main):004:0> aho nil irb(main):005:0> これなんで nil になっちゃうの?
irb(main):003:0> aho = aho でローカル変数ahoが作られ(メソッドのahoが隠蔽され)nilで初期化されるから
> aho = aho は両方とも変数として扱われている 変数 aho は未定義だから > undefined local variable or method `a' for main:Object で落とすべきところを > aho = aho が成功するのが原因 $ ruby -e 'a = a;p a' nil $ ruby -e 'p a' -e:1: undefined local variable or method `a' for main:Object (NameError)
690 :
687 :2007/11/27(火) 15:17:27
えーと、 > aho = aho 右辺を先に (「aho」をメソッド呼び出しとして) 評価してから、 左辺を「aho」を変数として代入を実行、 と想像してたんですが、そうではないんですね。 「aho = aho」という文を解釈する時点で、両辺の「aho」が変数と看做されている、 ということですかね。 ふむ。
>>686 > 第3、第4の基準を作る
ぶっちゃけ、単に結果の配列をソートしてるだけだったりする
何かテクニックを駆使してるわけではない
irb> [[-2,'b'], [-2,'a'], [-3,'c']].sort
[[-3, "c"], [-2, "a"], [-2, "b"]]
配列が入った配列をソートすると内部の配列の具合で並ぶということに気づかない人はけっこう多い
ちなみに
>>678 の後で
irb(main):005:0> self.aho
"AHO"
>>687 aho()
=> "AHO"
RubyはLisp2といって変数と関数の名前空間が分離してる。
関数のほうを呼びたきゃ()をつけなさい。
"\\r\\n" という文字列のバックスラッシュを外して "\r\n" としたいのですがどうしたらいいでしょうか・・・?
696 :
687 :2007/11/27(火) 20:30:38
こんなのとか? str.gsub(/\\\w/) { eval '"%s"' % $& }
697 :
デフォルトの名無しさん :2007/11/27(火) 20:31:55
evalってどういう意味ですか?
gemsを導入して、環境変数で -rubygems を設定した状態で、デバッガ(-rdebug)を起動すると、 起動状態でgemsの中からトレースが始まってしまう。たとえば、 ruby -rdebug foo.rb としたら、foo.rbの1行目たどり着くためににえらく苦労するのだが、何かいい手はない?
>>697 日本語で言うと「評価」とか「計算」とか。
open-uriで日本語が含まれるURLを指定すると 止まってしまいます どうしたらいいでしょう
703 :
デフォルトの名無しさん :2007/11/27(火) 21:53:13
ありがとうございます
>>699 環境変数の -rubygems をやめて
require 'rubygems'
require 'debug'
以下自分のプログラム
とすれば、require 'rubygems' が完了した状態からデバッグモードに移るので大丈夫じゃね?
705 :
デフォルトの名無しさん :2007/11/28(水) 08:25:29
>>699 ファイル指定してブレイクポイントを設定する。例えば
b my.rb:1
してから
c
706 :
デフォルトの名無しさん :2007/11/28(水) 10:49:44
リモートのファイル,ヂレクトリをローカルの状態とそっくりにしたいのですが, rsync -a --delete local remote が使えません。 簡単にいうと,ホームページをローカルで作っておいて, そのままサーバーに送りたいのですが,プロバイダ(niftyとかdionとか)のホームページだから,FTPしかつかえないのです。 そこで FTP(net/ftp)をつかってrsyncと似た動作をするものがないかと探してます。 自分で作るしかないですか?それとも既にライブラリみたいなのはありますか?
707 :
699 :2007/11/28(水) 12:18:55
>>706 Ruby にこだわらなければ lftp とかどうでしょう。
>>708 なんじゃそりゃ?
>>704 環境変数よりコマンドラインのほうが優先されるんだから、
ruby -rubygems -rdebug ...
とすればdebugより前にrubygemsがロードされる。
プログラムを書き換える必要はない。
711 :
706 :2007/11/28(水) 15:32:23
訳) 本当にどうもありがとう。 私は早速インストールします。
ギザなんて使う奴ほんとにいんのな・・・あのバカだけかと思ってた
714 :
デフォルトの名無しさん :2007/11/28(水) 19:49:34
実は彼がその本人なんだよ。
しょこたんもRuby使いなのか
WWW::MechanizeでWikipediaのページを入手しようとするとgetのところで延々とリダイレクトしつづけて処理が終わりません。
googleのトップページとかは普通にgetできました。
何が悪いのでしょうか?(ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-freebsd6.1])
require 'rubygems'
require 'mechanize'
require 'logger'
class Web
attr_reader :page
def initialize(uri)
@page = get_page(uri)
end
private
def get_page(uri)
agent = WWW::Mechanize.new {|a| a.log = Logger.new('access.log')}
# agent.redirect_ok = false
agent.user_agent_alias = 'Windows IE 6'
page=""
begin
page = agent.get(uri)
pp agent
rescue
puts "Error: cant't get"
return false
end
return page
end
end
uri = "
http://ja.wikipedia.org/wiki/%E6%BA%90%E7%BE%A9%E7%B5%8C "
web = Web.new(uri)
pp web.page
Ruby用のテストドライバとスタブの自動生成ツールとかあるかいな?
>>717 agent.get(URI.parse(uri))
720 :
717 :2007/11/28(水) 23:00:22
>>719 サンクスです。できました。
getの中でto_absolute_uriメソッドを呼んでて、
to_absolute_uriメソッドの中でuriがURIオブジェクトであればごにょごにょやってるんですね。
uriはStringオブジェクトオンリーかと思い込んでました。
自分ひとりだと解決できなかった気がします。本当にどうもです。
>>717 どうでもいいがほとんど意味のないクラスだな > Web
722 :
デフォルトの名無しさん :2007/11/30(金) 20:27:40
723 :
717 :2007/11/30(金) 22:26:43
>>721 レスどうもです。
確かにあんまり意味ないですね。
webページのデータを保持するクラスがあるといいなーと思ってこんなつくりにしてみました。
Webクラスのデータは別の解析クラスで解析します。
あんまり良い構造じゃないですか?
正直オブジェクト指向に慣れてなくてどういう構造が良いのかわかりませんのです。
724 :
デフォルトの名無しさん :2007/11/30(金) 22:52:16
irbでベクトルの計算をやってるんですが、 z=[1,2] x=z ってやった後に、 x[0]=3 と打ち込むと、 なぜにx=[3,2]だけでなく、zについてもz=[3,2]になってしまうんですか? これを改善する方法ってありますか?
変数 = 変数 は右辺の変数が指しているオブジェクトを左辺の変数も同じく指すようになるという意味。 x = z.dup (またはz.clone) で明示的に複製する。 dupはshallow copy(ぐぐれ)で、deep copyはない(ループとかめんどいから?) deep copyをしたいときはチマチマ自分でやること。
>>724 > x = z
x = z.clone
x = z という命令だと x と z は同じ実体を指している
だから x には z のコピーを代入させないといけない
実体とポインタという関係は知っている?
irb> require 'matrix' irb> v = Vector[1,2] irb> x = v.dup irb> class Vector; def []=(i,x); @elements[i]=x; end; end irb> v[0] = 0 irb> p x Vector[0, 2] …アレ?
>>724 それはオブジェクトをコピーしてるわけではない
z=[1,2]は,[1,2]という配列とオブジェクトにzという名前をつける意味
x=zは,zが指している[1,2]という配列オブジェクトにzという名前もつける意味
複製が欲しいのならcloneメソッドやdupメソッドを使う
729 :
724 :2007/11/30(金) 23:21:44
とりあえずのところ、わかりました。コピーしているわけじゃなかったんですね。 スカラーでは出来るのに、なんでベクトルになると、出来なくなるのが 、よくわからんかったです。 本当にありがとうございました。
730 :
724 :2007/12/01(土) 00:09:59
すいません。もういちど質問させていただきます。cloneやdupのコマンドで ベクトル計算については出来たのですが、行列計算になるとやはり元に戻ってしまいます。 これはどうしてでしょう?
何をやったらどうなったのか、その質問からはさっぱりわからん。 変数とオブジェクトの区別が分かってから手を出した方がいいと思う。
a = [[1,2],[3,4]] b = a.dup b[0][0] = 0 p a #=> [[0,2],[3,4]] a = [[1,2],[3,4]] b = a.map{|e| e.dup } b[0][0] = 0 p a #=> [[1,2],[3,4]]
733 :
36 :2007/12/01(土) 01:04:44
誰か俺に名前をつけてくれ
配列内の整数の要素の0〜a番目までたす命令って何もモジュール入れないであります?
さあゴルファーのみなさん出番ですよ
>>738 ありがとうございます。
$a=[1,2,3,4,5]
print $a[0..2].sum
これでエラーが出てしまうんですがどう間違っているんでしょうか?
間違ってない。
>>735 array[0..a].inject { |result , item| result + item}
とか
ああっごめん sum は ActiveSupport の拡張だ。
中身は
>>741 みたいなもん。
間違ってないと言い切る740の自信はどこから出たのだろうか
変数に$付けるのは目障りだからやめてくれ
うむ 「整数以外も入ってる配列で整数だけa個選んで足す」なら、ごく普通にeachでぶん回して def countup(array,max) sum = 0 count = 0 array.each do |e| break if count == max if e.is_a? Integer then sum = sum + e count = count + 1 end end return sum end みたいなので動作するはずだけど p countup([1,2,3,6.5,'ねこ'],3) 6 p countup(['ねこだいすき',1,2,3,6.5,Time.now],2) 3
p countup([1,2,3,6.5,'ねこ'],6) p countup(['ねこだいすき',1,2,3,6.5,Time.now],9)
「配列に含まれる整数が足りません」という例外を出すべきだな maxに負の数を指定したときに例外を出さないのもおかしい
ここで俺がエレガントな回答をですね def countup(values, range) re = 0 values[range].each do |v| re += v if v.kind_of?(Integer) end re end values = [1, 2, 3, 6.5, 'ねこ'] p countup(values, 0...2) #=> 2 p countup(values, 0...5) #=> 3
わざわざrange分けんでも
def sum(array) t = 0 array.each {|elem| t += elem } return t end values = [1,2,3,4,5,6,7,8,9,10] p sum(values) => 55 p sum(values[1..3]) => 10
それならinjectでいいんだってば
まあ
>>745 -の例と条件も適当すぎるけど
「それなら」って言うけど 実際 inject はかなり多様に使えるメソッドだよ 合計なんて正に inject 向きの問題だし
ちょっとみただけじゃ「なんだこりゃ」なメソッドだがピッタリはまると気持ちいいメソッドだな。>inject
横レスだけどinjectは理解性が下がるからあんまり使いたくないなぁ・・・ そりゃあんたがアホって言われりゃまぁアホですけど プログラミングってそういうもんじゃないでしょ?
まぁコメントつけとけばいいですけどね ごめんなさいね
p sum(values[1..3]) => 10 ???
758 :
デフォルトの名無しさん :2007/12/01(土) 16:06:45
class B < A def hoge(path) name = File.basename(path, '.jpg') end end 上の場合3行目で undefined method `basename'というエラーが出ます。 IO::Fileはクラスなので,モジュールのようにインクルードできません。 正規表現を使えば,2,3行で目的を達成できますが, (/.*\/(.*).jpg/)とか せっかくFileクラスがあるので,もっとスマートな方法はないかと,,, うまい方法はありますか?
>>758 class A
end
class B < A
def hoge(path)
name = File.basename(path, '.jpg')
puts name
end
end
b = B.new
b.hoge('/hoge/fuga.jpg')
# fuga
こんなん書いてみたがちゃんと動くぞ
もうちょっと状況を詳しく書かないと何が問題でどう動かないか分からん
どこかでFileという名前の定数を定義しているのだと予想
761 :
758 :2007/12/01(土) 16:51:45
>>759 早速のレスありがとうございます。
下のやつは手元ではエラーになります。
test.rb:9:in `hoge': undefined method `basename' for WWW::Mechanize::File:Class (NoMethodError)
mechanizeの問題でしょうか?
#!/usr/bin/ruby -Ku
#
require 'rubygems'
require 'mechanize'
class A < WWW::Mechanize
def hoge(path)
name = File.basename(path, '.jpg')
puts name
end
end
a = A.new
p File.basename('/hoge/fuga.jpg', '.jpg')
a.hoge('/hoge/fuga.jpg')
762 :
758 :2007/12/01(土) 16:52:34
変なインデントが入りました。スマソ
ヒント:undefined method `basename' for WWW::Mechanize::File:Class (NoMethodError)
なぜ初めからエラーをちゃんと書かないのか。
WWW::Mechanize::Fileが定義されているという不幸 name = ::File.basename(path, '.jpg') だな
766 :
617 :2007/12/01(土) 17:47:12
>>619 開発する人はVB.netに移行するから別に良いかな、と思うけど一応書いておく。協力サンクス。
>>620 採用。教材の最初のページに書いた。協力サンクス。
>>622 うーん、gemはどうだろう。補足程度に書く位でいいかな? 協力サンクス。
>>624 俺がJavaレベル7の社員です。新入社員達はJava=携帯の何か、パソコンでたまに表示されるコーヒーアイコン程度の認識しかないです。
人事部に聞いたら、カレーですかとリアルにいった子がいたらしいので、そいつは俺の嫁にしようと思ってる。
>>625 普通の会社なんだけど、社内でIT関連の部署に配属予定の人は営業だろうがなんだろうがプログラミング言語を学ぶのが必須。
その中で開発部に進む人だけ、Rubyの他にVB.netを学ぶ。社員研修でRuby教えるのは幹部が東大卒で東大がRubyを採用したかららしい。
比較的簡単な言語でプログラミングのやり方を覚えて貰おうという狙いがあるらしいが、Rubyの前はJavaを教えてた。
>>766 考え方はいろいろあるだろうが、プログラミングの経験として
Ruby を教えるというのは良いと思う。即プログラム書いて動かせるし、
通常ユースだと便利な小物を書きやすい。大抵の人は数値計算とかより
たくさんのファイル名を変えたり、とかテキスト処理とかプログラム
電卓的なことをするとかが多いからね。
■■□■■ ■□□□■ □□□□□ ■□□□■ ■■□■■ ↑を大きくしたような場で陣地(□)を取り合うゲームを作ってます。 獲得している陣地のつながりを絶たない□でのみ発生するイベントを作りたいです。 □□□←なら両端で発生します。 □□←だと全てで発生します。 □□ 数学的な考えができないもので、正しい条件式にたどり着けそうもありません。 Rubyと直接関係ない質問ですが、よろしくお願いします。
>>768 言いたいことがよくわからないけど、隣り全部見て自分と同じじゃ
ないものがあった場合にイベント発生ってこと?
端から見ていけば、2辺ずつチェックが必要なのかな。
陣地をどう取るかとかの情報が無いとそれ以上チェックさぼれなさそう。
>>768 >Rubyと直接関係ない質問ですが、よろしくお願いします。
全く関係ねぇよ
772 :
768 :2007/12/01(土) 19:33:40
>>769-770 申し訳ない。確かに全く前提の条件を示せてないです。
□は上下左右に、端だけが例外的に斜めにつながっています。■はただの空洞です。
言葉では説明しづらいですが、敵陣地(自分以外)につながっていて、かつ自陣地のつながりが絶たれない場合、発生します。
■□■
□□□
↑で下に敵陣地が続いてるとすると、下段中央は発生しませんが、
□□□
□□□
↑だと下段中央で発生します。
なので自分の考えでは、ひとつの□を対象にまず敵陣地とつながっているかをチェック。
次に自陣地との条件をチェックすると思ってますが、上下左右だけで済まないため混乱してしまいます。
それとも広く盤面をとらえたり(具体的な方法がわからず)した方が良いのか検討がつかないです。
方法としてはややこしい場の概念の方を合わせる手もあると思うのですが、考えが進まず。
>>771 一人で考えるのに限界を感じたのですが、違反でしたら消えます。
できれば適正な場所を教えてもらえるとありがたいです。
open-uriを使って、ファイルを読み込みたいのですが リダイレクトされた先が日本語の文字列を含むURLとなっていると C:/Ruby/lib/ruby/1.8/open-uri.rb:285:in `open_http': bad URI(is not URI?): とエラーになってしまいます windowsのruby 1.8.6です なにか解決策はあるのでしょうか? よろしくお願いします
open-uriだと内部での処理になっちまうな。 276行目のURI.parseを修正すればよい気がする。
「日本語を含むURL」などというものは無いと何度言ったらわかるんだ(日本語ドメインを除く)
どうでもいいけど「日本語」だけだと、スクリプト(用字)が 漢字やかなであるとは限らないんだよな。
>>774 リダイレクトなければこれでいいんですよね?
>>775 ライブラリの修正ってことですか…
ちょっと私には無理そうです
>>776-777 すいません、うまい書き方が分からなくて
そのサイトが良くないと言われたらそれまでなんですが
Rubyの勉強をはじめようと思うのですけども、 一からRubyをはじめる初心者向けのRuby入門書は何がお薦めでしょうか?
781 :
デフォルトの名無しさん :2007/12/02(日) 22:03:59
プログラ自体の初心者だったら「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」 他の言語経験があるんだったら「プログラミングRuby 第2版 言語編」
次スレから入門向けの書籍をテンプレに入れるべきだな 今までに何度も同じ質問が出てる
初心者スレのまとめwikiを作ればおk
784 :
779 :2007/12/02(日) 22:10:13
>>780 ありがとうございます。
なかなか奥が深そうな、読み甲斐のありそうなお薦め本ですが、
私の知識ではとてもついて行けそうにありません。
>>781 プログラミング自体の初心者ですので、
「たのしいRuby 第2版」というお薦め本を読んでみる事にします。
教えていただきありがとうございました。
そういや本スレの前スレで誰かwiki作ってたけど、結局ぐずぐずになってる
>>783 書くことがなくね?
>>785 Ruby Portalのことか
世のWikiの8割は更新されないものだし、あんなものだろう
今見に行ったらスパムも来てた
>>786 質問と回答のレスをカテゴリ別にでもぺたぺた貼り付っけていくだけでよくね?
いいだしっぺのほ
いつも思うんだけど、それ法則じゃないよな。
>>789 > いつも思うんだけど、それ法則じゃないよな。
言い出しっぺがやらない限り誰もやらない――言い出しっぺの法則
これから派生したルール/教訓が「言い出し法則」それ自体として
伝えられている……
なるほど
環境変数のREQUEST_URIかSCRIPT_NAME
もうちょっと付け加えると ENV['REQUEST_URI'] か ENV['SCRIPT_NAME'] #いや、初心者は環境変数といわれても分かんないかなと思って。
795 :
792 :2007/12/03(月) 14:53:50
ありがとうございます! 仕組みが理解できました。 エラーを起こす → htaccessでcgiに送る → リクエストされたURLを処理する
よっしゃ、おっちゃんが空いてるxrea鯖持ってるからHikiでまとめwiki作ったるさかいにな
だから場所は売るほどあるんだよ 継続的に的確にまとめられる奴が必要
継続かあ、、おっちゃん持久力あらへねん、きのうも奥さんに怒られてもうた、、
799 :
デフォルトの名無しさん :2007/12/03(月) 21:10:18
継続(continuation)ってどういうときに使用するんでしょうか?
800 :
デフォルトの名無しさん :2007/12/03(月) 21:11:13
自分のIPアドレスを取得するにはどうすればいいですか?
wiki早く
だめだ。日本語のエンコードがおかしいし Hiki Errorが出る
逆引きRuby があるジャマイカ
そもそもスレのまとめが目的なのに 名前がMoonwolf Wikiとはこれいかに
807 :
デフォルトの名無しさん :2007/12/04(火) 10:04:46
>>807 歴史学の講義を取った事無いんじゃないか?
歴史学に限らず
なにかの題材を扱おうとするなら前史を理解するのは基本だろうに…。
これが卒業研究か・・・
ツッコミどころ満載だけど、それは本人たちが一番良くわかってるだろうからそっとしといてやりたい。
どんな研究成果でも誰かの約に立つときが・・・きっとくるさ・・・
情報分野で、教育ネタとかはこの程度のところもあるよね 情報的にも人文的にも中途半端な
813 :
デフォルトの名無しさん :2007/12/04(火) 11:52:03
卒論ってこんな感じのを3人がかりで書いても通るんだな。 某ログまとめサイトで恋空読者の年齢層と文章レベルをmixiで調べてた猛者がいたけど、 あっちの方が凄いんじゃまいかと思った俺ガイル。 ちなみにRubyを題材に卒論書くなら、どれくらいのレベルのが良いんだろうか? 大学別に難易度は変わってくるんだろうけど、旧帝最下位の大学レベルだとどんなもんなのかな。
>>813 ・RubyでGoogleもどきを作ったらと仮定
・Rubyによるデータ解析フレームワークの構築
とか?偏差値50以下の大学ならRubyで適当なプログラム組んだら
それで通りそうだけどな。この中京大の場合は技術的な事より
教育・マーケティング化が強いな。最初の言語にRubyをやって、
その後にC++やJavaをやるといった大学・専門学校・会社などで
カリキュラムを作る時に役に立つんじゃないか。役に立つはずだ。
>>814 真面目にこの研究をやるなら役に立つと思うんだが、3人がかりでこんなアブストラクトを書くような連中の研究では役立たずだろう。
Rubyだけじゃなくて他の言語の場合はどうなのかを調査すべきだろ・・・ LispやFORTANなどの場合はどうなのかとかさぁ まぁRubyやっててCやってない奴が身近に居る(学科の後輩)から調査しやすいし楽じゃね?ってのが本音なんだろうけどな #この学科はRuby必修みたいだし
そもそもRubyからCってのがわけわかんね。
明らかに「とにかく卒論とゆーモノをでっちあげる」ことしか考えてない代物だから、 質的な突っ込みを入れても虚しいだけだな。 そんなことわかっててやってるんだよーんプププ、ってなもんだろう、当人達としては。
このままだと教養単位のレポートでも不可じゃないの?ほんとに卒論がこんなんでいいの?
>>819 江戸川大学って所で小室哲哉について卒論書いてた人もいたから大丈夫だろ。
823 :
デフォルトの名無しさん :2007/12/04(火) 16:41:00
CRLFが含まれる生のメールを タブとスペースが続かないCRLFで 分割したいのですが message = gets(nil) if message.nil? then break end field = message.split(/\r\n(?=[^\t ])/, 2).shift のようにするとマッチしてくれません。 p message してみるとgetsがCRLFをLFに 変換してしまっているようなのです。 変換しないようにできるでしょうか? rubyのコマンドラインオプション、 コンパイル時のオプション、 環境などが関係するのでしょうか 環境は配布されているバイナリをダウンロードしてきたもので ruby 1.8.5 (2006-12-04 patchlevel 5000) [i386-mswin32] XP Home Edition SP2(5.1,ビルド2600) です。 宜しくお願いします。
$stdin.binmode
825 :
823 :2007/12/04(火) 17:50:19
>>824 目から鱗です!
$stdin.binmode
message = gets(nil)
だと駄目なんですね。
$stdin.binmode
message = $stdin.gets(nil)
でできました。
本当にありがとうございます。
826 :
デフォルトの名無しさん :2007/12/04(火) 19:26:38
すいません、誰か教えてください。 ずいぶん調べたつもりなんですが、わかりません。 下記な感じで、平行サーバを作ったときに、同時に接続できるクライアントの数を制限することはできないのでしょうか? 現在動いてるスレッドが一定数以上ならacceptしないとか。。。 gs = TCPServer.open(8888) $i=0 loop do ns = gs.accept testSocket=Thread.new do while(line=ns.gets) p line end end end よろしくお願いします。
>>826 現在のスレッド数を数えるだけでいいんじゃないか。
>>826 queue を使うとできるかな。
require "socket"
require "thread"
queue = SizedQueue::new(2)
gs = TCPServer.open(8888)
$i=0
loop do
queue.push true
ns = gs.accept
testSocket=Thread.new do
while(line=ns.gets)
p line
break if /^quit/i =~ line
end
ns.close
queue.pop
end
end
>>807 中京大だから放っとけばいいんじゃない?
正直言って皆学部生の卒論に期待しすぎ。無い大学だってあるんだよ。
学部生の論文はたとえ東大生の論文でもクズしかありません。
File.read(filename)は、バイナリモードで読み込みますか。それともテキストモードですか。 #Windowsがないので調べられません。
バイナリモードではなく テキストモードでもなく ASCIIモードです
>>833 ASCIIモードでは、改行コードの変換が行なわれますか。
画像ファイルの読み込みに使えるかどうかが知りたいです。
自分のIPアドレスを取得するにはどうすればいいですか?
卒論てのは内容に意味があるんじゃなくて、作り上げて発表することに意味があるものだからな。
学部の卒論なんて、卒業するための口実だろ。 中身を期待する方が無理。
院に入って真っ先に書き直したくなるのが学部の卒論だろ 学部の卒論は小学校低学年のアサガオ観察日記程度の理論的価値しかない わかってないのは書いてる最中の当人だけだ
840 :
デフォルトの名無しさん :2007/12/04(火) 23:13:04
卒論のテーマ=Rubyの分散形ヘルプをやったら神
卒業論文の派生で賞を取った俺は神
技術者の要望を卒論で書いていけばみんな幸せになれるんじゃね?
技術者の要望を調査する論文をまず書かなくてはいけない
>>835 503 Service Unavailable
>844 悲しいがそこはしょっちゅう503起こす 使う側としては数回リロードしてみるしか対策なし
>>844 「ruby gserver」でググると
>>835 のページがトップに来るから
それのキャッシュを参照してくれ
847 :
デフォルトの名無しさん :2007/12/05(水) 09:59:02
RubyでMySQLを使用したWebで使えるグラフィカルなデータベースCGIを作りたいのですが、 どこか参考になるページはないでしょうか?Perlなら沢山あるのですが、Rubyでは見つける事ができませんでした。
848 :
デフォルトの名無しさん :2007/12/05(水) 10:19:46
Perlのprint << "END_OF_HTML"; Content-type: text/html といったような HTMLを出力する時に使用するテクニックはRubyにも存在するのでしょうか?
>>847 ・RubyでMySQLを使うのに参考になるページ
・RubyでグラフィカルなWebページを作るのに参考になるページ
・RubyでデータベースCGIを作るのに参考になるページ
のどれが欲しいの?
つかデータベースCGIって何?
>>848 print <<END_OF_HTML
<html>
<body>
<h1>#{title}</h1>
</body>
</html>
END_OF_HTML
のことかな。
でもview層にこれを使いたいと考える時点で、完全に初心者だよなあ。
セキュリティのこともあるので、ERBやテンプレートエンジンを使うことをお勧めする。
850 :
デフォルトの名無しさん :2007/12/05(水) 10:27:58
>>848 print <<EOS
一緒じゃねえの?
EOS
851 :
デフォルトの名無しさん :2007/12/05(水) 10:31:19
>>849-850 848です。ありがとうございます。
ERBやテンプレートエンジンとは何でしょうか?
852 :
デフォルトの名無しさん :2007/12/05(水) 10:34:38
853 :
デフォルトの名無しさん :2007/12/05(水) 10:36:11
後、MySQLは使わないなら使わないでlog.datのようなファイルに 情報を登録していきたいです。
>>851 そのくらいぐぐれよなー
----- template.rhtml -----
<ul>
<% i = 0 %>
<% for item in list %>
<li>item[<%=i%>] = <%=h item %></li>
<% i += 1 %>
<% end %>
</ul>
----- main.rb -----
require 'erb'
filename = 'template.rhtml'
erb = ERB.new(File.read(filename))
list = ['AAA', 'BBB', 'CCC']
print erb.result(binding())
----- 実行結果 -----
<ul>
<li>item[0] = AAA</li>
<li>item[1] = BBB</li>
<li>item[2] = CCC</li>
</ul>
854の優しさに感動
えー、昔から、魚を与えるより魚の釣り方を教えよ、などと言いまして、(ry
>>847 本屋に行ってRailsの本を買ってきなよ
xreaっていうレンタルサーバでruby-sqlite3動かしてる人いますか? ここってサーバごとにruby-sqlite3のインストールをお願いせにゃんらんのかいな? require 'sqlite3'がLoadErrorになるし・・・ カレントディレクトリにライブラリ放り込んでやると 今度はSQLite3::Database.new("hoge.db")でエラー吐くし・・・(でもhoge.dbのファイルは出来てる) #!/usr/local/bin/ruby require "sqlite3" print "Content-Type:text/html\n\n" puts "test" SQLite3::Database.new("hoge.db")
うーむ・・・きぼんぬしてくるかなぁ ありがとう
862 :
826 :2007/12/05(水) 16:59:37
>827 >828 >835 ありがとうございます。 課題が少し前進しました。
Rubyで自分のIPアドレスを取得するにはどうすればいいですか?
>>863 require "socket"
Socket::gethostbyname(Socket::gethostname)[3].unpack("C4").join('.')
これで取れる場合もある。
866 :
864 :2007/12/05(水) 20:20:29
2行目はこれでいいのか。 IPSocket::getaddress(Socket::gethostname) 他に ifconfig (Windows なら ipconfig ?) コマンドの結果を正規表現でいじるとか、 NAT してたりしててインターネット側のアドレスが欲しいなんて場合はまた面倒、 ってな話が前スレにあったようななかったようなというかあった。
>>864 出来ました!!
ありがとうございました。
>>866 ありがとうぞざいます。
こっちのほうが簡単でいいです。
NAT を使っている場合で 192.168.0.2 とかが帰ってくる場合は グローバル IP じゃないから気をつけてな
include 'foo/bar' と include "foo/bar" の2種類の書き方を見るんだけど、これはどっちが正しいの? 文字列インスタンスの生成でも s='' や s="" のどっちも散見するし [ダブル|シングル]クォートの使い分けが良くわからん
Rubyリファレンスマニュアルより >ダブルクォートで囲まれた文字列ではバックスラッシュ記法 と式展開(後述)が有効に >なります。シングルクォートで囲まれた文字列では、\\(バックスラッシュそのもの)と >\'(シングルクォート)、行末の\(改行を無視します) を除いて文字列の中身の解釈は >行われません。
という事は include "foo/bar" や s="" は間違いだときっぱりと否定しても良いですかね? ダブルクォートにしてるのは何か特別な意味でも有るのかと思ってたんですが・・・
ほとんど趣味の問題。 ダブルクォートとかバックスラッシュとかを含んでいて、 ダブルクォートで書くとエスケープで頭がウニになりそうな 場合以外は、ダブルクォートで書く、ってスタイルの人も 結構いる。あとで式展開とかを埋め込みたくなった時とか 修正が少なくて済むし。 確かに require とか 空文字列は俺もシングルクォートだけど。
>>872 を読むと""はパフォーマンスが悪くなりそうに思えるかもしれないけど
あおきさんの実験ではほとんど違いはなかったそうだ。
"someone's teacher"とか'を含む文字列は英語では普通にあるから""でいいんじゃない。
Rubyは文字列表現にいろんな書き方があるから面白い。
require %|socket|
とかもできるよ。普通やらないけど。
一つのプログラムやプロジェクトの中では、 どちらかに統一もしくは使い分けのルールがきちんと決めてあれば良いと思う。 どちらかが間違いだときっぱりと否定するのだけは間違いだときっぱりと否定しておく。
''と""も使い分けって、Rubyに限った話でもないよな。 shやらPerlもある程度は似たようなもの。
片手で打てる " のほうが好きだお
a=[0,1] b=a b[1]=0 print a[0] print a[1] これを実行したら、01ではなくて00になりました。 配列の代入は変数の代入とは違うんでしょうか。 だとしたら、bをいじってもaに影響を与えない簡単な解決策はあるのでしょうか?
bにaを代入しない
883 :
デフォルトの名無しさん :2007/12/06(木) 23:46:46
s=STDIN.read ってやるとCtrl-Dするまで止まっちゃうんだけど 標準入力から入力があったら読み込んで、無かったら何もせず次に進むってのはどうやるの?
まあ、初心者がよくはまるところだから・・・
886 :
883 :2007/12/07(金) 00:10:34
>>883 はインタラクティブな標準入力じゃなくてコマンド実行時にパイプで受け取るようなやつね
>>883 select([STDIN], nil, nil, 0) が nil 以外を返したら STDIN.sysread(1024) してみるとか。
888 :
デフォルトの名無しさん :2007/12/07(金) 00:35:39
純粋にプログラミング言語としてRubyがC#より優れている所って何があるの?
プログラミング言語について「純粋」とはどういうことですか。 1レス以内で説明をお願いします。
次の質問をどうぞ
RailesってCGIですか?
892 :
デフォルトの名無しさん :2007/12/07(金) 01:14:49
純粋にとは、開発環境の優劣等を考慮せずに言語の記述能力のみで、という意味です。 開発環境ではC#が圧勝で比較にならないからです。さて、再度質問です。 純粋にプログラミング言語としてRubyがC#より優れている所って何があるの?
そういう人ね
俺は刺身の上にタンポポを乗せるのに忙しいから、 あんたがC#とRubyをハックして論文にでもまとめてくれ。
>>892 そういうのはC#スレでやれば食いつきいいよ
Ruby on RailsっていうのはRubyで書かれたWebフレームワークのことです。
898 :
892 :2007/12/07(金) 01:26:11
食いつきの問題ではなく、客観的なコメントをお願いします。 RubyがC#より優れている点があれば列挙してください。
コンパイルが不要
900 :
892 :2007/12/07(金) 01:30:42
純粋にプログラミング言語としてRubyがC#より優れている点でお願い。
無い
ああ、ない。
括弧がいらない
エントリポイントがいらない
変数の型宣言がいらない
国産 Matz萌え
名前が4文字 次スレってどのぐらいでだっけ?
どちらもチューリング完全 以上。次の方ー
RailsってCGIですか?
違います。
>>910 ありがとうございます。
ではなんという技術を使っているのでしょうか?
CGIはWebサーバ上のプログラムと、標準入出力と環境変数を介して やりとりする仕組みの名称です。 Ruby on RailsはRubyによるWebアプリケーション開発を支援する フレームワークです。 「CGI≒CGIによって動くプログラム」という用法も一般化してきているので Railsの成果物≒CGIと言えるかもしれません。
クリスマスにみんなが家族や恋人と過ごしてる中, 自分は独りRubyしてようと思うんですけどいいでしょうか
RUBY最強wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
>>912 詳しい説明ありがとうございます。
なんとなく分かりました。
だってrubyで何か作ろうと思っても 既に誰かが作ってるんだもん・・・クスン・・・
>>913 今のうちにRubyと結婚すればいいんじゃね?
>>916 >だってrubyで何か作ろうと思っても
>既に誰かが作ってるんだもん・・・クスン・・・
作ってないものは無限にある。
「俺に作れる範囲で」が付く
萌え萌えだな
obj.extend Foo したときに、objがどのモジュールをextendしたか調べる方法はありますか。 obj.class.ancestors には見つかりませんでした。
判定だけなら is_a? で出来るけど、この質問だと一覧が欲しいんだよね。 なんかメソッドありそうだけど思い出せなかったので # require 'enumerator' obj.extend Foo ObjectSpace.enum_for(:each_object, Module).select {|m| obj.is_a? m} とかやってみた。
924 :
デフォルトの名無しさん :2007/12/07(金) 12:38:24
エラーを吐き出したとき ... 13 levels... みたいに省略されることがあるのですが, これを省略させない方法はありますか? あったらそれを教えてください。
>>922 特異クラス定義中ではancestorsでわかる。
class << obj
puts ancestors
end
みたいに。
>>925 included_modulesならModuleだけ出てくる。
>>924 rescue => e
puts e.backtrace
end
>>932 ,925,926
ありがとうございます。
class <<obj; p ancestors; end
class <<obj; p included_modules; end
のどちらでもいけました。
929 :
デフォルトの名無しさん :2007/12/07(金) 15:33:15
MySQL/Rubyライブラリが必要なのはどうにかならないもんかな。 MySQL/Rubyが使える無料サーバーってあるのかな?
>>929 無料は知らないが、有料ならヘムテルとか?
open(dir + fn, "wb") {|io| ファイルを決められたディレクトリに書き出したいのですが こういう指定はできないんですか? ここで毎回エラーが出る
>>931 もちろんできるが、エラーの内容がわからんとなんとも言えん。
エスパーすると、
open(File.join(dir, fn), "wb"){|io|
あたりか?
>>932 レスありがとうございます
駄目なようです
上のままの時と同じエラーが出ます
C:/temp/bin/ruby/lib/ruby/1.8/open-uri.rb:32:in `initialize': No such file or di
rectory - test/hoge.dat (Errno::ENOENT)
>>933 open には存在しないディレクトリを作る機能は無いです
手動で 'test;' を作るか
もしくは
Dir::mkdir('test')
を実行してディレクトリを作ってください
test というディレクトリを勝手に作ってくれたりはしないぞ とエスパー。どうかな?
>>934 それは作ってあるんです
unless File.directory?(dir)
Dir::mkdir(dir)
end
って事前に入れてあるんで
>>929 s145.xrea.com でmysqlは使えるみたいだ
require "mysql" #=>OK
require "sqlite" #=>LoadError
require "sqlite3" #=>LoadError
えぇいっ、 情報が小出しに出てくると答えるほうも大変だ 一度プログラムを整理して エラーを出力する最小構成単位に切り出して 関係ない関数を削ったり、関係ない表示を削ったり プログラム全文と実行する環境等を書け こっちもレスしたらそれはやってあるだと面倒なんだよ
きたないソースだなぁ・・・
じゃあそれも直して
末尾スペースのディレクトリはWindows のファイルシステムとして作成できないため 作成しようとした段階で末尾のスペースは削られます それにも関わらず open で末尾スペースのついたディレクトリとファイル名で アクセスしようとしたために存在しないディレクトリとみなされているようです 末尾のスペースを削る等の処理を入れるとちゃんと実行できると思いますよ # その、URLは、まぁなんだ
ありがと stripつけて解決した 全文出したくなかったから情報小出しだったのに
いやいやなかなか良いサイトをご存知で
綺麗なソースを書けばデバッグもやりやすいってもんだ 全部一度にやるんじゃなくて分けて書くのが良いよ
欲を言えばスレッドを使って並列ダウンロードしたい所だけどな 一個ずつ画像をダウンロードするとすんげぇ遅いよ
mswin32版ってスレッド使えないって聞いたのだけれどひょっとして嘘?
使えるけど、コンソール入出力が入ると他のスレッドも止まる。 1.8では。
スレッド使うと「ほぼ間断なく画像をディスクに書き出し続けるプログラム」のような動作になるな 全体的視野における効率はどっちもどっちだと思われ
Windowsの場合スレッド使わないときで ファイルコピー1個でNetwork負荷50%くらいしかいかない 2個にしても2倍時間かかるだけ 同時に2個コピーして初めて負荷100%になる
>>949 やってみればわかるよ
◆スレッドなし
リクエスト─→レスポンス─→ダウソ完了→リクエスト─→レスポンス─→ダウソ完了→リクエスト───→レスポンス─→ダウソ完了→・・・
◆スレッド
リクエスト─→レスポンス─→ダウソ完了
リクエスト─→レスポンス─→ダウソ完了
リクエスト─→レスポンス─→ダウソ完了・・・
ぜんぜん違う
#全体的視野の意味が解んないけど
>>950 ネットワークの負荷云々じゃなくてこの場合はレスポンスの待ち時間がボトルネックなのよ
>>951 矢印の長さが微妙に違うのが気になってしまった。
下は一緒なのに・・・なんで?w
>>951 はなんか違うかと
|URLを解釈し鯖にリクエスト△△△|鯖から画像データ▽▽▽▽▽▽▽▽▽|メモリからディスクに書き出し◇|
こうだろ
スレッドを大量に使うと◇の合計が律速になる
自作ダウンローダーでスレッドを実際にお得に使おうとするのは意外と難しい(脳内予定ではきれいに行くんだがね) 外部プログラムのwgetにURLのリストを丸投げしたほうが合計ダウンロード時間は短かったりする
ディスクへの書き出しがボトルネックになるなら言うことないんじゃない・・・ と思うのは間違いなのかな?
a = [ [0,1], [0,1] ] ってしたときに bをaの単なるコピー(bをいじってもaに影響しない)にするために、 b = [ a[0].clone, a[1].clone ] とする以外に簡単な方法はないでしょうか?
b = a.clone
Marshal.load(Marshal.dump(a))
b = a.dup
書き込んだあとで「単なるコピー」という言い回しに違和感を覚えたんだがやっぱりそういう話か
deep copy が必要な場合はマニュアルにもある通り
>>959 が正解
irb> a1 = ['a', 1]
irb> a2 = ['a', 2]
irb> a = [a1, a2]
irb> b = a.clone
irb> a1[0] = 'changed'
irb> p b
[["changed", 1], ["a", 2]]
Rubyでスタートアップ常駐アプリってつらいの?
つらいって言うか、無理
965 :
デフォルトの名無しさん :2007/12/08(土) 02:21:39
class Student < ActiveRecord::Base set_primary_key :student_no end student=Student.new student.stdudent_no="a123" student.name="Matz" student.save ってやるとエラーになって INSERT INTO students(name) VALUES("Matz") ってSQL発行してるっぽいんだけど主キーってAuto Incrementな整数じゃないとダメなん?
エラーねぇ・・・ > stdudent まさかこれが原因ではないよね?
"
students ~ student とか。
969 :
デフォルトの名無しさん :2007/12/08(土) 08:42:01
サイズがちょっとずつ違う200個くらいのpng画像の大きさを揃えたいと思っています。 画像のサイズはそれぞれ 800x1200 pixel くらいの大きさです。 そこでRMagickを使って #!ruby require 'Rmagick' include Magick filenames = ARGV w = [] h = [] filenames.each do |each| img = ImageList.new(each) w.push(img.columns) h.push(img.rows) end puts "min width: #{w.min}" puts "min height: #{h.max}" というスクリプトを書いて動かしたところ、最初は順調に動いているのですが、 だんだん仮想メモリを食いつぶしてスラッシングで動作も遅くなっていき、 最後はSEGVで落ちてしまいます。 最終的には、サイズを揃えたり色調を整えたりといった処理もしたいのですが、 今ではとてもそこまで行き着けません。 多分読み込んだImageオブジェクトがGCされずにどんどんたまっていってるんだと思いますが、 いらなくなったオブジェクトを強制的にdeleteする方法はないのでしょうか?
970 :
969 :2007/12/08(土) 08:45:54
自己レスです ×誤 puts "min height: #{h.max}" ○正 puts "min height: #{h.min}" でした。
971 :
デフォルトの名無しさん :2007/12/08(土) 08:48:15
> いらなくなったオブジェクト って具体的にどこにあるんだ? w や h が“生きてる”限りは参照先の ImageList オブジェクトは全部必要とみなされて保持されてんじゃね filenames の個数の ImageList オブジェクトをメモリ内にキープしているのと同じことだ each 内で画像処理を終わらせるようにすれば問題は起きないはず ログとして ImageList オブジェクトのデータが欲しい場合はそれこそ話題の clone や dup で
filenamesに入ってるのはファイルだろうから filenames.each do |file| とか filenames.each do |path| とか書いて欲しい 名前考えるのにめんどくさい場合によく使われるのは要素(Elements)の頭文字e
俺は hoge.each{|matz| matz.fuga} にしてるよ☆
975 :
デフォルトの名無しさん :2007/12/08(土) 09:11:57
matz.strip とかちょっと楽しそうだな
977 :
969 :2007/12/08(土) 09:36:01
> いらなくなったオブジェクト って具体的にどこにあるんだ? Image.columnsやImage.rowsは整数を返すので、 wやhからImageインスタンスへの参照は持っていないと思っていました。 違うのでしょうか?
978 :
デフォルトの名無しさん :2007/12/08(土) 10:00:28
matz.slice matz.dump matz.freeze
979 :
965 :2007/12/08(土) 10:29:53
↓っていまだにこのままなん?
http://d.hatena.ne.jp/akm/20061025 ■[rails] 犯人はMysqlAdapter
というわけで何でそんな理不尽なことが起きるのかを突き止めました。ActiveRecord::ConnectionAdapters::MysqlAdapterのnative_database_typesメソッドの中身。
def native_database_types #:nodoc
{
:primary_key => "int(11) DEFAULT NULL auto_increment PRIMARY KEY",
:string => { :name => "varchar", :limit => 255 },
:text => { :name => "text" },
:integer => { :name => "int", :limit => 11 },
:float => { :name => "float" },
:datetime => { :name => "datetime" },
:timestamp => { :name => "datetime" },
:time => { :name => "time" },
:date => { :name => "date" },
:binary => { :name => "blob" },
:boolean => { :name => "tinyint", :limit => 1 }
}
end
という風になっているので、primary_keyに指定されたカラムは嫌でもint(11)になってしまいます。
ただし、これは、set_primary_key/set_primary_keysを使って複合キーでないキーを指定した場合の話です。varcharのカラムひとつをPKに使用とした場合とか。
>>975 CGIはWebプログラミング板で聞くと幸せになれる。
982 :
デフォルトの名無しさん :2007/12/08(土) 11:28:56
>>980 Webプログラミング板に行ってみたのですが、
Rubyのスレッドが存在しませんでした…
>>975 もうちょっと具体的に、「どこが分からないのか」を言わないと
どう解説していいのやら分からん
985 :
デフォルトの名無しさん :2007/12/08(土) 16:38:32
>>984 説明不足で申し訳ありませんでした。
ttp://www.atmarkit.co.jp/flinux/rensai/mysql07/mysql07b.html このソースコードを少し改造して、新たにお店(store)というデータを追加し、
果物の名前、それを売っているお店の名前、値段といったデータを追加したテーブルを作りました。
htmlの方もお店検索ができるようし、一応動くようにはなっているのですが、
これを書いた作者さんがf_and_or = form['and_or1'][0]を設定し忘れているみたいで、
andとorの検索ができません。
例えば以下のデータがある場合で、
りんご、鳥羽伊三、300
みかん、鳥羽伊三、80
メロン、山田商店、300
りんご、300 と検索した場合、以下の要に、りんご と 300が当てはまるすべてのデータが表示されます。
りんご、鳥羽伊三、300
メロン、山田商店、300
なので、コードにあるf_and_or = form['and_or1'][0]を使用して、and と orの検索ができるようにしたいのですが、どうすれば良いのでしょうか?
ローカル変数を一時的にグローバル変数にできる方法ってありますか?
そうしたくなる時点で設計レベルで何かがまずい 内容を確かめるだけならファイルに書き出したりするといいぞ
もしかしてインスタンス変数がわからないのなら オブジェクト指向について勉強する良い機会かも
>>985 1. HTML側のフォームに、name属性がand_or1のラジオボタンを追加する
2. search.cgiの24〜25行目、二つのSQL文を一つにまとめて
名前・値段の両方の条件で一度に検索できるようにする
3. SQL文以降のソースコードを、2の変更に合わせて書き換える
ちなみに、CGI#[]はバージョン間の違いが大きいため
できるだけ利用するべきではない
CGI#paramsを使って、form.params['and_or1'][0]とすべき
990 :
デフォルトの名無しさん :2007/12/08(土) 20:25:04
Rubyのグローバル変数って有用な使い道あんの?
$stdin のように本質的にグローバルな物に結び付いているものとか
>>990 SDLのScreenは、プロセスにつき一つしか作らない(作れない?)ので
たいていグローバル変数に入れて使ってたな
しかし最近では、モジュールやクラスのインスタンス変数に
入れればいいということに気付いたので
やっぱり$stdinぐらいしか使う機会はないのかもしれない
グローバルというよりシングルトン
シングルトンって要はグローバルじゃないの?
全然
Cで言うstaticだな。とさらに混乱を誘ってみる。
初心者で恐縮なのですが、Railsのscaffoldで作ったlist.rhtmlを編集しても、アプリケーションに 反映されないのですが、何故なのかわかりません。どなたかお教えください。お願いします。
>>997 再起動
それでだめなら編集するファイルそのものを間違ってる
まずないとは思うがproductionモードで動かしたままでキャッシュONだったりな。
ポインタ本にそう書いてあったのに・・・
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。