1 :
京 ◆SsSSsSsSSs :
2011/02/10(木) 13:47:51 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。
関連スレやURLは
>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2 :
デフォルトの名無しさん :2011/02/10(木) 13:48:19
3 :
デフォルトの名無しさん :2011/02/10(木) 13:48:40
4 :
デフォルトの名無しさん :2011/02/10(木) 13:51:02
5 :
デフォルトの名無しさん :2011/02/10(木) 13:51:37
【バージョンに関するよくある流れ】
Ruby 1.8.5(非安定板)→ Ruby 1.8.6(旧安定版、長期政権)→ Ruby 1.8.7(超お勧め)
Ruby 1.9.0(旧開発版)→ Ruby 1.9.1(旧1.9系列安定版)→ Ruby 1.9.2(1.9系最新安定版)
実のところ、よくできた教科書またはトラブル時に聞き倒せる師匠がいるなら 1.9.2 から入っても特に問題はない
1.9.2ユーザーの場合は「1.9.2使ってます」と断った上で質問してほしい由
【Windows版に関するよくある疑問】
初心者の人はとりあえず ActiveScriptRuby の 1.8.7 使っておけば間違いない(mswin32)
ttp://www.artonx.org/data/asr/ の題字のでかい 「ActiveScriptRuby 1.8.7(pなんとか) with-winsock2 tcl-stub」
マニュアルはWebで見ることもできるが手元にあると便利、1.8.7 の HTML ヘルプ版が
ttp://www.ruby-lang.org/ja/documentation/ の「Rubyリファレンスマニュアル刷新計画 chm版 1.8.7用」
夢のお告げ等、何かの間違いで Ruby の知識がない初心者時代から 1.9.2 を使いたいマゾい人は
ttp://www.artonx.org/data/asr/ の「Ruby-1.9.2-p数字 Microsoft Installter Package」
「Windows版Ruby」として紹介されることのある以下の「RubyInstaller」は
これ特有のトラブルの修復知識が必要なので今のところは初心者には勧めない(mingw32)
ttp://rubyinstaller.org/ このトラブルを回避できるようになったら初級者脱出かも
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
7 :
デフォルトの名無しさん :2011/02/11(金) 09:42:30
スレたて乙
プログラムの結果を出力する際は 基本的にはputsとprintとprintfを使い分ければいいのかな? 改行したいときはputsで したくない時はprint フォーマットしたい時はprintf という感じでOKですか?
p
基本的にはputsしまくりだが、表示後の改行を確実に厳密にしたい場合はprintを使う オブジェクトの内容を人間にわかりやすく表示するデバッグ用途ならp いわゆるsprintフォーマットを使用したい場合は%やsprintfの結果をputsするのが多数派 標準エラー出力に表示するwarnというのもあるが誰も使ってない $stderr.puts "error!" とか書く
12 :
8 :2011/02/12(土) 20:12:57
ありがとうございます! pの存在を忘れてました。 そしてprintfの中に改行文字入れるよりputs sprintfなのか。なるほど。。
puts "%x %d" % [10, 0xF] とかもあるよね。
>>11 そういや俺も warn の存在は知ってるけど何故かいつも $stderr.puts だな。
なんでみんな使わないんだろ?
「warn」だと字面的に目立たないからかなあ?
warnが組み込みライブラリに入ったのって1.8に入ってからじゃないっけ それ以前はstderr使うしか無かったと思うから、それでじゃね?
warn知らなかった
warnなんてあったのかw 宣伝不足じゃね?
warn「うわ〜んT-T」
warnなんてperlとの互換のために放置されてるだけで非推奨
perlとの互換??
21 :
デフォルトの名無しさん :2011/02/16(水) 12:01:25
さあ・・・
なんで (1..5).each(&method(:puts)) が (1..5).each { |num| puts num } になるの?
それはもうそういうもんだとおもっていただくのがいちばんよろしいかと思われます すぱぁと明確に説明できる人は今のところ現れておりませぬ inject みたいにわかりやすい変形ができるならよかったのですが
マクロとかテンプレートのノリだと思えばいいんじゃないか というかそういう変形が出来ると初めて知ったのですが
そうですか (1..5).map(&(1.method(:+))) => [2, 3, 4, 5, 6] おおっ、できました それではなんとなく分かった気分になっておきます
>>23 >(1..5).each(&method(:puts))
これは
proc_obj = method(:puts).to_proc()
(1..5).each(&proc_obj)
とおなじ。
そしてこれは
proc_obj = Proc {|x| puts x }
(1..5).each(&proc_obj)
とおなじ。
そしてこれは
(1..5).each {|x| puts x}
とおなじ。
てきとーに書いてみたので、まちがってたらごめん。
proc_obj = method(:puts).to_proc() から proc_obj = Proc {|x| puts x } を詳しく
うむ というか、それ以外は既に何度も出てきてる
1.8だとクラスの特異クラスのスーパークラスはClassクラスの特異クラスなのに1.9だとクラスの特異クラスのスーパークラスはクラスのスーパークラスの特異クラスなんだね〜。 なんで仕様が変わったのかな?
method(:puts)ってのはself.method(:puts)と同じ。 つまりself.putsをeachに渡してるわけだけど このself.putsってのは大抵はKernel.putsのこと。 なので(1..5).each { |num| Kernel.puts num }と同じ意味になるって感じかなぁ…?
>>27 >>(1..5).each(&method(:puts))
>これは
>proc_obj = method(:puts).to_proc()
>(1..5).each(&proc_obj)
>とおなじ。
to_proc()をつけなくても表面上の動作は変わらないのですが、
>>27 さんの例示では何故
to_proc()をつけているのでしょうか?
proc_obj = method(:puts)
(1..5).each(&proc_obj)
to_proc()をつけるつけないで意味合いが違うのでしょうか?
>>32 動作に違いがないのはその通り。同じことを分かりやすく書いただけだから。
33が説明してくれてるけど、&proc_objとすると、暗黙的にproc_obj.to_proc()が呼ばれる。
それだと初心者にはわかりづらいだろうから、明示的に .to_proc() を呼びだしているだけ。
35 :
デフォルトの名無しさん :2011/02/17(木) 10:48:11
Rubyは if () { 〜 } みたいに括弧で書く方法は用意されてないのでしょうか? basicみたいにendなど使うのに違和感があります
>>33-34 なるほど、そういうことですか。
&をつけると、暗黙的にto_proc()が呼ばれるんですね。
>>35 ない
if はブロック構造ではないので { } で代用することはできない
まあ、実際問題としてすぐ慣れる
>>35 最初は気持ち悪いかもしれません。それは仕方ないです。
でもすぐに慣れると思います。Lispだと慣れない可能性大ですが、Ruby程度なら十分慣れます。
これって作者の趣味でそうなったの?
>>39 このへんは初期構造を引き継いでるので、本人の趣味と断じてしまえばまあ、そうなんだが、
Ruby では { } は
・ Hash リテラル {'one' => 1, :two => 2}
・ スコープを作るブロック構文 arr.each{|x| puts x}
・ リテラル中の埋め込み "#{mes}"
に既に使用されてて若干構文解析負荷が高い
それに加えて「スコープを作らない if かもしれないヨ〜」というのを付け加えるのはさすがにちょっと、
というようなのがあったんじゃないかなーと外野推測
to_procの話題なら前スレでも出てるのに
Ruby覚えたてのころよくやった遊び def IF(bool) if bool then yield end end IF(true){puts 'true!'} elseは綺麗にかけない
def THEN(&blk) blk end def ELSE(&blk) blk end def IF(bool,tblk=nil, fblk=nil) if bool if tblk.respond_to?(:call) if block_given? raise else tblk.call end elsif block_given? yield end elsif fblk.respond_to?(:call) fblk.call end end IF(true){puts 'true'} IF (true),THEN{puts 'true'},ELSE{puts 'false'} IF (false),THEN{puts 'true'},ELSE{puts 'false'} IF直後の空白重要 なんか、ぶさいく
>>23 は普段使わない機能の複合なのでめんどくさいのだよな
そもそも
>>33 のいうように、mes(&pr) とすると mes{|x| ...} の {|x| ...} 部分を
proc オブジェクトとして「分離して」おいて代入することができる
['a', 'b', 'c'].each{|x| puts x.upcase} #=> A B C
pr = proc{|x| puts x.upcase}
pr.call('yes!') #=> "YES!" # proc のいちばん一般的な使いかた
['a', 'b', 'c'].each(&pr) #=> A B C
> to_proc メソッドを持つオブジェクトならば、`&' 修飾した引数として渡すことができます
> (デフォルトで Proc、Method オブジェクトは共に to_proc メソッドを持ちます)。
ということで、内部的には to_proc メソッドが呼ばれて「ブロックが復元」されてるらしい
場面転換
method という関数的メソッドがあり、これは Object#method を呼ぶ
Object#method(name) は self の name というメソッドをレシーバとの関係ごと固定化してオブジェクトとして返す
m = Kernel.method(:puts)
m.call('message!') #=> "message!"
Method#call(args) という、proc とまったく同じ書き方(ここ最重要)で時間差起動することができる
で、これらを踏まえると
(1..5).each(&method(:puts)) は
(1..5).each(&putsメソッドのMethodオブジェクト)
(1..5).each(&呼ばれたときの引数をputsに渡すprocオブジェクトのようなもの)
(1..5).each(& proc{|x| puts x})
(1..5).each{|x| puts x}
となる
でどうよ
いやそこじゃなくてレシーバや引数がどう決まるかがよく分からないんだ &:foo 1引数のとき {|x| x.foo } 2引数のとき {|x, y| x.foo y} &method(:foo) {|x| self.foo x}
今日始めた初心者です. a = [ 1, 2, 3, 4 ] a.inject {|a, b| a + b} =>10 の後, a =>6 となるのが納得できません. 仕様書のどの辺に書いてあるか教えてください.
読んで理解するような仕様書とかはないんだが、Ruby ではブロック引数は被ると考えてもらっていい 被らないバージョンのRubyも存在するが、互換性の問題でこれに頼った記述は全く勧められないので忘れてくれ a.inject{|x, y| x + y} とか書くのが一応回答
>互換性の問題でこれに頼った記述は全く勧められない そうなんだよなあ… 何がめんどくさいって、ここが問題で1.8ではうまく動作しないということを見つけるまでが果てしなくめんどくさい
>>47 「a」.inject {|「a」, b| 「a」 + b}
上のaは全部同じオブジェクトなのでループしたときにaが上書きされる
>>46 &:foo と &method(:foo)は見た目似ているけど
仕組みは全然違うから混同しちゃダメ。
後者はあくまでもself.method(:foo)のことで
self.foo をMethod Objectとして取り出しているので
{|x| self.foo x}と同じ意味になる。
&:foo の方はSymbol#to_procによってProc Objectに変換されるので
実際には :foo.to_proc がブロックとして渡されてる。
Symbol#to_procってのは
class Symbol
def to_proc
proc{|obj, *args| obj.send(self, *args)}
end
end
な感じの定義なわけでつまり:foo.to_procは
proc{|obj, *args| obj.send(:foo, *args)}
ちょっと書き換えると
proc{|obj, *args| obj.foo(*args)}
となる。 つまり1つ目の引数のメソッドfooに残りの引数を引き渡す感じ
{|x| x.foo }とか {|x, y| x.foo y }と同じ動作になる
OK, 理解した。ありがとう &method(:foo)のほうは{|*args| self.foo *args}かな しかし↓この説明でそこまで分かる人いるのか? Symbol#to_proc -> Proc self に対応する Proc オブジェクトを返します。 (1..3).collect(&:to_s) #=> ["1", "2", "3"] (1..3).inject(&:+) #=> 6
>Ruby ではブロック引数は被ると考えてもらっていい
1.9からは被らずにちゃんと遮蔽するよ
ついでに実験的仕様でブロックローカル変数を作れるようにもなった
a,b = :a,:b
[:foo].each do |a;b| # ;の後ろにブロックローカル変数を宣言できるぞ
b=:bar
p [a,b] #=> [:foo,:bar]
end
p [a,b] #=> [:a,:b]
1.8までは何でも書けたらしいね
a = [[:a,:b,:c]]
a.each{|a,$b,@c|}
p [a,$b,@c] #=> [:a,:b,:c]
>>50 ちょっとちがうんじゃね?
オブジェクトうんぬんじゃなくて、ローカル変数のスコープの話だと思うんだけど
>>53 >互換性の問題でこれに頼った記述は全く勧められないので忘れてくれ
ぐぇ〜,みんなありがとう.有名な話だったのね. っていうか 1.8 が消え去るまで ruby やる気が失せた... ありえないだろJK.
56 :
47 :2011/02/18(金) 00:38:00
↑ 47 でした.
Rubyではローカルスコープの外に同名の変数があるとそれへの参照となり なければ新たな変数の定義となる(ただし1.9系のブロック引数は常に後者) 宣言無しで変数を使えますよ系言語の欠点 外側に同名の変数があっても新たな変数を定義できるような構文が欲しくなることがある
というか広めのスコープに1文字変数使うやつってなんなの? ブロック等の一番せまいスコープならまだ許せる i、jは例外だと思うけど、それでもスコープ狭くするべき テンポラリでないなら変数にちゃんとした名前つけろ
なんなのっていうやつなんなの 以下スタック食いつぶすまで続く
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい. x = 1 [2,3].each {|y;x| x = y } こうすると x は 1 のままになる.
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい. x = 1 [2,3].each {|y;x| x = y } こうすると x は 1 のままになる.
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい. x = 1 [2,3].each {|y;x| x = y } こうすると x は 1 のままになる.
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい. x = 1 [2,3].each {|y;x| x = y } こうすると x は 1 のままになる.
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい. x = 1 [2,3].each {|y;x| x = y } こうすると x は 1 のままになる.
1.8のときは、自分でスタックに積んでた。 def local &block local_vars = eval("local_variables", block) name_of_vals_arr = "__local_vals" loop do break if local_vars.all?{|var| var != name_of_vals_arr } name_of_vals_arr += "_" end eval("#{name_of_vals_arr} = [#{local_vars.join(',')}]", block) yield local_vars.each{|var| eval(var + " = #{name_of_vals_arr}.shift", block) } end i = 1 j = 2 puts "i = #{i}, j = #{j}" # => i = 1, j = 2 local do i = "a" j = "b" puts "i = #{i}, j = #{j}" # => i = a, j = b end puts "i = #{i}, j = #{j}" # => i = 1, j = 2
66 :
デフォルトの名無しさん :2011/02/18(金) 19:29:03
ファイルの先頭に追加書き込みってできるんでしょうか? ファイルポインタを動かしても write を使うと後ろに書き込まれてしまいます。 よろしくお願いします。
>>66 いわゆる挿入モードは一発ではできません、が回答だと思う…
そーゆーもんなので、どうしようもない
irb> File.open('a','w'){|f| f.puts "111\n222\n333\n444"}
irb> puts File.open('a'){|f| f.read}
111
222
333
444
irb> File.open('a','r+'){|f| body = f.read; f.rewind; f.puts "000\n#{body}"}
irb> puts File.open('a'){|f| f.read}
000
111
222
333
444
Rubyだと(処理性能的な意味で)力技で通せなさそうだな
end } end } end end end ↑はちょっと大げさだけど混在が気持ち悪い。 みな賛同してますか
皆さん、どうしてますか?
基本{}はワンライナーで書くようにしてる
>>70 あまり気にしてない
ちょっと慣れると、エンドという英単語を読んでるわけではない、という境地になる
ただのヨコ長のブロック終端記号だ
>>70 >混在が気持ち悪い。
混在は気にしないかな。end自体は気にするけど。
ブレースが見た目に浮くことを利用して リソース管理や大域脱出のブロックはブレースを使って目立たせる コーディングルールもあったはず
ご意見ありがとうございました 参考にさせていただきます
77 :
デフォルトの名無しさん :2011/02/20(日) 07:25:41.22
Windows上でファイルをRubyのプログラムに ドラグ&ドロップしたときの実行パスを取得するには、どうすればいいのでしょうか? よろしくお願いします。 プログラムを通常実行したなら、File.expand_path(__FILE__)でパスが取れるのですが、 ドラグ&ドロップ時には、File.expand_path(__FILE__)の中身が、 C:/Documents and Settings/ユーザー名/実行ファイル名.rb となってしまいます。
>>77 聞き方がおかしかった。どういう値になるのを期待している?
80 :
77 :2011/02/20(日) 08:03:45.59
>>79 >聞き方がおかしかった。どういう値になるのを期待している?
c:\temp\program.exe
の上にファイルをドラッグしたら、c:\tempのパスが取得できることを期待しています。
(プログラム自体は、program.rbをexerbでprogram.exeに変換しています)
できれば「program.exeへのショートカット」上にドラッグしたとしても、
元のc:\temp\program.exeの実行パスを取得したいです。
82 :
77 :2011/02/20(日) 14:52:00.80
>>81 ありがとうございます。とても助かりました。
Windows上で ruby 1.9.2 を使い、ファイル名がUNICODEで ファイルの中身がWindows-31Jのテキストファイルで正規表現を使うにはどうしたら良いの? # coding:utf-8 と書くとファイルは開けるけど正規表現でエラー # coding:Windows-31Jと書くとファイル名が文字化けして開けず
文字エンコーディングの概念ない奴は1.8使えバーカバーカって煽られそうな内容だな マジックコメントにはソースファイルの文字エンコーディングを記述する openに渡すファイルパス名のStringオブジェクトの文字エンコーディングをUTF-8にして マッチに使う正規表現の文字エンコーディングをWindows-31Jにすればよかんべ Ruby1.9はぜんぶ別個にできるぞ
86 :
デフォルトの名無しさん :2011/02/21(月) 08:50:12.61
あと、読み込むファイルのエンコーディングも ばらばらに指定できるぞ。
>>84 >ファイルの中身がWindows-31Jのテキストファイルで正規表現を使うにはどうしたら良いの?
こっちを優先して、コードはwindows-31jで書く。
ほんで、ファイル名を表す文字列はunicodeに変換してやる。
おまい頭いいな
Ruby初心者向け1.9文字エンコーディング教室とかサイト作ったら繁盛するかな
絶対繁盛するからやってくれよ
つーかファイル名をutf-8で直書きすれば普通に開けるのを今知った。M系APIだとばかり ARGVはダメっぽい?
92 :
84 :2011/02/21(月) 20:18:15.66
自己解決しました。自分も
>>87 の方法に行き着きました。
あと、Encoding.default_internal がよく分かりません。
指定しておくと読み込んだ内容がその文字コードに変換されるのかと思ったんですが……
>>80 ちょっと遅レスだが
require 'Win32API'
rubypath = "\0"*2048
Win32API.new('kernel32', 'GetModuleFileName', %w(i p i), 'i').call(0,rubypath,rubypath.size)
rubypath.rstrip!
p rubypath
rvm使ってる人は自分用CGI起動するRubyとかgemとかどうしてるの?
中学生が書いたパッチ見たけどさっぱりわからなかった。
むしろ中学生が書くとプログラムという半定型文法文の何が変わるつもりだったのか
>>96 に聞いてみたい
たわいもないレスにむきになりすぎだとおもいます。
これはいいニュースだ。将来は第2代教皇だな
スレッドについて初心者が学ぶのに最適な書籍はあるでしょうか 手元にあるたのしいRubyには全く載っていませんでした
そもそものスレッドに関しての知識があれば楽勝 とかいうようなシロモノなので結構厳しい
ダグリーの本のRuby版みたいなのか あったらいいね
だれやねん、それ
調べずに書くが、並列処理とかで有名な大学教授 JavaのConcurrentパッケージとか日本語訳もされてる 並列処理関連のJava本を書いてたような
『Java並行処理プログラミング 』はいい書籍だが、 Doug Leaはダグリーって呼ぶのだろうか……?
ダグ=リーかダッグ=リーだと思う
>>106 普通に英語読みしたらダグリーだけど
実は英語圏出身じゃなくて読み方が微妙に違うとか何とかあるのかい?
109 :
デフォルトの名無しさん :2011/02/23(水) 02:04:44.44
フルネームは Douglas Lea なわけで、 DougはDouglas の愛称のダグなので確定として、 Leaのほうは、英語読みすればリーかな、程度だなぁ。 ま、実際彼の名のカタカナ書きはダグ・リーが一般的。
RubyとかCとかJavaとかLispとか色々使える人が、 「ここはRubyで書くかな」って判断する基準って何かありますか?
>>110 そんなものはない
Rubyで書きにくい・動かしにくい・指定されてないから他の言語で書く
Rubyのほうが低コストなとき
Lisp以外との比較なら、メタプログラミングならRuby。 マクロならLisp。
文字列処理が多いならRuby 再帰が多いならScheme GUI扱うならJava ライブラリ開発や、OSのAPIとか使いまくるならC
class Vec attr_accessor :x, :y, :z def setp @x = "@x" self.y = "self.y" z = "z" end def say print x,' ',y,' ',z puts end end 本を読みながらこんなの書いて実験してみたけど・・・ @変数とself.変数って同じ挙動だから好きな方使っていいんですよね? 高度な使い方すると違うかもしれないけど、そこまで到達してないから違いがわかんない
var = 1 puts "this number is #{var}" => this number is 1 puts "this number is" + var => エラー この仕様は何か意図があるんでしょうか。。 fixnumを自動でstringに変換してくれてもいいのに、って思ってしまいます。 譲って後者をエラーにするのであれば前者もエラーにすべきとも思います。 rubyistの方のどのように考えているのですか?
>>115 ぶっちゃけ最初はよくわからないと思う
クラス定義の中から使うなら @変数 を使う、
クラス定義の外から使うならメソッド使う、でしばらくいっと毛
>>116 var = 1
puts "this number is #{var}" # varがto_sされるのは誰が見ても明らか
puts "this number is " + var # これも明らか
other_var + var # どうだっけ
>>118 は + で一方のオペランドの自動変換を許した場合のシナリオ
>>116 思いっきり大前提として、「+は表示用連結記号ではない」というのをしっかり認識して欲しいと思う
puts "STRING" + var は "STRING" + var つまり "STRING".+(var) の返り値を puts に渡してるに過ぎない
表示するときに便利とかどうでもよくて、String クラスのインスタンスメソッド + の処理結果を利用している
で、String#+ の引数に String クラスのオブジェクト以外がきたとき、どうするのが本来好ましいか
・ 引数のオブジェクトの to_s メソッドを勝手に試して、自身と連結して返す ← まちがい
・ 引数のオブジェクトが文字列と全く同じ動作をする場合にのみ、自身と連結して返す ← せいかい!
ということで、自分と同じ動作をするオブジェクトである場合に限って + で連結を試す
+ の引数になるということは String オブジェクトのメソッドが動作するとみなしてもよいということ
そういう「俺 String オブジェクトのつもりで頑張りますメソッドも作ってきました」という宣言が、to_str メソッド
"#{うめこみ}" で呼ばれる うめこみ#to_s は「オブジェクトを文字列で表現するとこんな感じ」を返す
書いているうちに飽きてきたのでトス
String#+ が to_s を呼ばないのはなんで、という話はもう太古の昔からあるな Stringオブジェクト + foo は "ABC#{foo}DEF" ほど foo を文字列化する意図が明確ではないのでとりあえず例外出して止める、 + で連結したいなら foo をなんとかして自力で文字列化しろ、というのがいちおう回答ではあるのだが
str + num は、交換法則とか考えると面倒なので、例外がシンプルで良いと思う。
% irb irb(main):414:0> require 'self' Principle of minimum surprise, by Matz Explicit is better than implicit. Ruby is far better than P^D %
puts "1" + 2 => 12 こうなってほしいの? 俺は嫌だ。むしろ3になって欲しい
>>> print "1" + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects
>>116 すでに124が書いているように、"1" + 2 が "12" になるべきか "3" になるべきかは
人によって意見が違う。
そういう、あいまいな解釈ができそうな場合はとりあえずエラーにしておき、
どちらの挙動を意図しているのかを書き手が明示するほうがいいと思う。
"1".to_i + 2
"1" + 2.to_s
またRubyではすでに "x=#{x}" のような埋め込み式が使えるから、
わざわざ "x=" + x を自動変換したいという要求は出ないと思うよ。
>>120 説明が長いよ・・・初心者がそんなの読むわけないじゃん
>>115 アクセサを作らずにやったら違いが解ると思う
>>115 direct variable access と indirect variable access でぐぐって。
どっちを使うかはケースバイケース。
130 :
116 :2011/02/24(木) 02:47:08.45
回答してくれた方、丁寧にありがとうございました。よく分かりました。 #{うめこみ} と puts "string" + 1 を比較するのではなく、 #{うめこみ} と "string" + 1 を比較しないと駄目、というところで氷解しました。 確かに"string" + 1 だけでは何に変換すべきか分からないですね。 ただWebプログラミングの場合、 フォームから送られてきた値とか DBから取り出した値とか 型がstrだかnumだか気にするのが面倒で 型を自動変換してくれない言語ではちょくちょくエラーになったりしますね。 まぁ予期しない型に勝手に変換して気付かぬバグが紛れ込むよりは良いのかなやっぱり。
>>130 webなら普通Validator使う罠
Ruby は、オープンクラスだから、便利だと思ったら自己責任で勝手に改造すればいい。 class String alias :__old_plus__ + def +(o) __old_plus__(o.to_s) end end こういう思いつきを簡単に試せるのが、rubyの楽しさ。
標準クラスの既存のメソッドを改変するのはよろしくないな
#!/usr/bin/ruby file = File.open('./test.txt','r+') file.flock(File::LOCK_EX) sleep(10) file.close こんなスクリプトを書いて実行中でも、対象ファイルをcatできたのですが、これはロックに失敗しているんでしょうか?
もちろんです
>>135 ロックには成功してるけど、
>>135 がロックを理解してないと思われ。
cat じゃなくてそのスクリプトを 2 個同時に動かしてみて。
で、ロックについてもっとちゃんと調べれ。
他人ですが調べてみた flockはアドバイザリ・ロック(紳士協定)でしかなく ファイルのアクセス権とは無関係 ファイルの入出力をも排他制御するのは強制ロックといい、OS依存の処理になる で、どうでしょうか?
>>135 >>138 なるほど。ぐぐってもrubyで強制ロックを行う方法がでてこないのですが、rubyでは提供されていないのしょうか?
flockもunixのシステムコールだということなので同様にできると考えたのですが…
140 :
デフォルトの名無しさん :2011/02/24(木) 23:18:12.87
fcntlやioctlを使えば、対象OSのシステムコールで出来るのと同等のことは 出来ると思うが、そもそもOS/ファイルシステムによってmandatory lockは できたりできなかったり。
141 :
デフォルトの名無しさん :2011/02/24(木) 23:29:38.28
>>139 そのUnixシステムコールflockが紳士協定なの。
143 :
デフォルトの名無しさん :2011/02/25(金) 00:13:54.42
まぁ、できないということを納得するにはまずは flock(2) を読むことだな。 (man 2 flock)
arr.values_at(*foo())ではなくarr.values_at(foo())と書けるようにしたい values_atの引数に複数のインデックスを渡しつつ *を書かずにすむ方法はないでしょうか?
>>144 Array#values_atを書き換えるしかないと思う。
Array.class_eval do
alias _orig_values_at values_at
def values_at(*args)
_orig_values_at(*args.flatten)
end
end
やっぱりそうですか。ありがとうございました。
URLのサブドメインを除去したドメインのみを取得したいです
uri = Addressable::URI.parse("
http://hibari.2ch.net/ ").normalize
p uri.host
これだと「hibari.2ch.net」が返ってきますが「2ch.net」だけ返ってくるメソッドは無いのでしょうか
正規表現で頑張るしかないのでしょうか
サブドメインという概念はURIそのものにはないと思う 正規表現使うしかないねえ
for(int i=array.size(); i>=0; --i){ f(i) } をrubyで書く場合 for i in 0..array.size-1 f(array.size-1-i) end (array.size-1).downto(0) do |i| f(i) end より一般的な書き方ってありますか?
(0...array.size).reverse_each{|i| f(i)}が比較的分かりやすい
>>150 おお・・・それがわかりやすいですね、ありがとう
>>149 元コードがバグってました(/ω\) ハズカシー
ふぅん… each_indexはあるのにreverse_each_indexはないのか…
別になくてもなんとかなるよね、と言ってしまってから需要が発覚した好例
each_indexってArrayのメソッドだったのか
indexがないコンテナ、というのも存在しうるからEnumerableのメソッドには出来んだろ
reverse.each_index
メソッドチェーンではだめなのですよ
質問だよおっかさん gem の spec/ とかのテストディレクトリは lib/ ディレクトリのネスト具合を正確に反映させるべきすかね 一身上の都合で AAA::BBB::111 という妙に深い名前の gem ライブラリスクリプトを2個ほど作ります lib/aaa/000.rb # require 'aaa/000' 用 lib/aaa/bbb/111.rb lib/aaa/bbb/222.rb bbb/ には特にファイルはありません で、spec/ ディレクトリに 111_spec.rb を作りたいのですが spec/aaa/bbb/111_spec.rb spec/111_spec.rb spec/aaa_bbb_111_spec.rb どれが普通っぽいですか?
159 :
デフォルトの名無しさん :2011/02/28(月) 14:09:05.25
IDEやらエディタマクロで、実装とspecを相互に行き来できる機能が あるけど、その手のって、たぶん実装とspecのパスが対応している ことを仮定していると思う。
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper') とか書かないといけなくなって若干めどい まあ既存のどれかのをコピペすればいけるが
irb起動後にechoのon/offは切り替えられないのかい?
echo ってなんじゃらほ $ irb -f irb>"string!" => "string!" irb> irb_context.return_format => "=> %s\n" irb> irb_context.return_format = "%s\n" "%s\n" irb> "string!" "string!" ということで、起動後の irb の設定変更は irb_context のメソッドを通じて行う irb_context とだけ入力するとなんかいろいろ出てくる conf. は irb_context の別名で被る可能性が大なので irb_context. で指定するのが無難
できました。ありがとう。 irb> irb_context.echo=false
164 :
デフォルトの名無しさん :2011/03/01(火) 09:21:40.09
簡易なオートロード機能を考えています。 ひとまず自分で書いたコードを載せます(1.8系です) # グローバル定数 SCRIPT_LINES__ = { __FILE__ => File.readlines(__FILE__) } # Moduleを拡張 class Module def const_missing(name) const_name = name.to_s filename, line_no = caller(0)[1].split(":") # 呼び出し元の情報 line = SCRIPT_LINES__[filename][line_no.to_i-1] # SCRIPT_LINES__よりコード行を取得=>"t = Mobi::MobiMobi::FooBar.new" if const_name = /([:_0-9a-zA-Z]*#{name}[:_0-9a-zA-Z]*)/.match(line) # 定数部分を抽出=>"Mobi::MobiMobi::FooBar" const_name = const_name[1] file = const_to_path(const_name) # 自前の別メソッドによりパスを得る=>"mobi/mobi_mobi/foo_bar" begin require file const = const_get(name) rescue LoadError # 通常の定数呼び出しだった場合に備えてLoadErrorは無視 else return const end end raise NameError, "uninitialize constant #{const_name}" end end # 実行 t = Mobi::MobiMobi::FooBar.new
165 :
164 :2011/03/01(火) 09:22:26.92
(続き) これは一応うまくいくのですが、デバッグコードみたいなのを使ってるのと、 $SAFEが0じゃないとSCRIPT_LINES__を使えないので、いまいちと感じています でも他にconst_missingで"Mobi::MobiMobi::FooBar"を得る方法がわかりません。 上のコードの場合、const_missingに送られるのは:Mobiだけなので mobi.rbやmobi/mobi_mobi.rbが存在すれば順に読み込まれてうまくいきますが、 モジュール階層のディレクトリのみであればLoadErrorで止まってしまいます。 定義済み定数と照らしながらディレクトリ階層内を走査していくほかないでしょうか。
166 :
164 :2011/03/01(火) 09:28:25.55
>>165 mobi.rbやmobi/mobi_mobi.rbが存在すれば
すいません、今すぐ確認できないんですが
これうまくいかなかったと思います。
∩___∩ 未だ連絡ゼロクマー | ノ ___ヽ /。・゚・(____ `・゜゚・。 いつでも連絡するクマー | u( _●_)ヽ 〉 彡、 |∪| / 誰か助けるクマー . / ヽノ . /´ .____ / ヽ、 _ノ\ / (○)iji(○)\ 正義がキチガイ呼ばわりされたんだぞ。 / (__人__) \ | |::::::| | 義憤に駆られることはないのかお? \ l;;;;;;l /l!| ! / `ー' \ |i Rubyistとして後ろめたさはないのかお! / ヽ !l ヽi ( 丶- 、 しE |そ 一生後悔することになるお! `ー、_ノ 煤@l、E ノ < レY^V^ヽl そこのあなた!勇気を出すんだお。 ____ / \ 助けて欲しいんだお・・・ / _ノ ヽ、_ \ 同じ釜の飯を食ったんだお・・・ / o゚((●)) ((●))゚o \ いつも一人で居残り残業してたんだお・・・ | (__人__) | あまりの悲しさに、むせび泣いたこともあったお \ ` ⌒´ / そんなやる夫を見捨てるのかお? ____ このままだったら一生恨むお / \ たとえ誰がなんと言おうと、強烈な違和感なんだお / _ノ ヽ、_ \ 直観がモノ言ってんだお / o゚⌒ ⌒゚o \ えっぇっえ〜ん。え〜ん。 | (__人__) | えっぇっえっぇっ。うっぅっぅうー。。。 \ ` ⌒´ / うええ〜ん。。。えぐっぇぐっうっうっううぅー。。。
わけがわからないよ。
>>168 ム板でスレひとつしか取得してないからそうなる
新着レスの内容読まなくても複数のスレを表示しておくのは必須だよね 自衛とはいえ我ながらアホくさいとは思うんだが
>>170 なんか余裕だよね。
どんな対策したの?2ch禁止令とか出したの?
なんか2chに書き込んでも駄目な気がした。
奴らが書き込むことはないんだろうね!
ましてや、メールしてくるなんてないんだろ?
もうちょっと他の手考えるわ。
こっちは必死こいて頑張ってきとんねんで
しかし、余裕の態度は気になる。
何らかの対策しやがった臭い
ま、なんにしろ、もう2chには書き込まないよ
もっと有意義なことに時間使うわ
レスあんがと
>>170 マルチポストとか多い板だからな
書き込みしてからマルチだと気づいたときの虚しさったらないぞ
書き込みがマルチでないことと、自分の質問がコピペされてマルチ扱いにされてないかのチェックは必ずしないといかん めんどくさい
過去に俺も何度かやられたが、 メインであろうスレに一番最初に書かれてれば本物とみなしてあまり気にしないぞ というわけで質問どうぞ
Rubyが64bitでコンパイルされているかどうか調べる方法はありますか。 今は (2**32).class が Fixnum だったら64bit、Bignumだったら32bitというふうに 判定してるんですが、もっとすまーとな方法があれば教えてください。 require 'rbconfig' してもそれらしきものはありませんでした。
CONFIG["target"] とかは?
>>168-174 話が見えないな。どっかのマルチが出たって話を
ここに集まってきてしゃべってるのか
うわ!こんなゴミクズ言語使ってる低能たちいたいの かわいそう かわいそう
日本語もろくに使えない低能にゴミクズ言語扱いされるのって…
春休みか…
>>176 require 'rbconfig'
puts Config::CONFIG['target'] #=> i686-apple-darwin10.6.0
だめみたいですね。
183 :
デフォルトの名無しさん :2011/03/02(水) 14:44:36.86
pack('P') とか使えないかね
StringIO に書き込んだ文字列を取得する方法って rewind とかして read しかないですか? いちいち sio.rewind; str = sio.read って書くのめどいです
186 :
デフォルトの名無しさん :2011/03/02(水) 15:20:46.14
Windows 32bitしか知らないのでよくわかりませんが RUBY_DESCRIPTION や RUBY_PLATFORM で判別できないと面倒ですね 64bitのRubyだと p [""].pack("p").size したときに 8 になるんでしょうか? これってポインタのサイズを見るってことですよね
2011年2月のプログラミング言語インデックス
1 Java 18.482% ↑ 7ヶ月連続1位
2 C. 14.986% ↓
3 C++ 8.187% ↓
4 Python 7.038% ↑ 5位から4位へ浮上。2ヶ月連続で順位を上げている。
5 PHP. 6.973% ↓ 4位から5位へ下落。下落傾向
6 C# 6.809% ↑
7 (Visual)Basic 4.924% ↓
8 Objective-C 2.571% ↑ 安定化傾向
9 JavaScript 2.558% ↑
10 Perl. 1.907% ↓
http://journal.mycom.co.jp/news/2011/03/01/064/index.html
…おかしいな、朝作ったときはもっとこうシンプルなライブラリだったはずなのだが
>>190 そういうときは寝て起きると不要なものが浮いてきます
64bit判定はバージョン文字列判定的にはできねーというのが定説だった気がする
実際の動作で判定するのが現状安定
もしかしたら今後なにかあるかもしれないけど、現状は無理っぽい
>>188 Rubyが64bitモードでコンパイルされたかどうかってのは、ポインタサイズで判定すべきものなんでしたっけ?
intのサイズだと思ってけど、違うのかな。
(2**32).class が Fixnum なら 64bit、Bignumなら32bitだと思ってた。
>>183 pack('P') とか使えないかね
とあったんで ポインタサイズでも判別できるのかな?と思っただけです
WindowsXPしかないんで、確かめようも無いのですが
intじゃなくて VALUEのサイズですね
VALUEのサイズはポインタと同じで
64bit Windowsでは unsigned long long
それ以外だとunsigned long なのかな
64bitとか未知の世界だ
>>192 64ビットWindowsはLLP64だからintもlongも32ビット。
ポインタサイズじゃないと判定できないかも。
>>194 そうか、自分が知りたいのは、x86_64かどうかだ。
今実行中のRubyバイナリがx86_64かどうかを調べる方法ってあります?
require 'rbconfig'
p Config::ARCHFLAGS #=> "-arch i386 -arch x86_64"
はコンパイル時のフラグであって、実行時にどっちなのかはわかんない。
196 :
デフォルトの名無しさん :2011/03/03(木) 18:33:56.80
実行ファイル自身のマジックナンバーで分かるのだろうか。 でも、同じx86_64でもELFだったりPEだったりMach-Oだったりあるか。
MacOSのことはよくわからんのでググったら ユニバーサルバイナリなので PowerPCのとx86のとx86-64のとがひとつの実行ファイルとかになってて 実行ファイル見ても判別付かんことがわかった 64bitかの判別なら(2**32).class が Fixnum かどうかでいいんじゃないの? ポインタが64bitならVALUEも64bitになって Fixnumはポインタサイズ-1 になるんじゃないのかな PowerPC32,PowerPC64,x86,x86-64 を判別したいとかなら C拡張作るか、OSのAPI呼ぶとかしないとだめなんじゃないの?
まったく自信がないし 64bit Windowsで確かめることもできないけど Windowsならばおそらくこんなの(XP以降) require 'Win32API' current_process = Win32API.new('Kernel32.dll','GetCurrentProcess',%w[v],'v').call bIsWow64 = "\x0"*4 Win32API.new('Kernel32.dll','IsWow64Process',%w[i p],'i').call(current_process,[bIsWow64].pack('p')).zero? || raise puts bIsWow64.unpack('l').first.zero? ? '32bit' : '64bit' Macだとdlライブラリとかでできるのかな?
おっとそういえば、WindowsにもIA64版がありました GetNativeSystemInfo とか呼んでCPUアーキテクチャも見ないとだめかな
[nil].pack("P") が一番速いと思う (2**32).class を見る方法は、Fixnum の範囲がポインタのサイズではなく、long のサイズ依存だからダメ もっとも、多くの場合は RUBY_PLATFORM でいい気がするけど
open-uriで、タイムアウトをくらったらリトライするメソッドを作っています。 こんな感じです。 def get_html_doc(url) trial ||= 0 open(url, 'r:binary') do |io| return Nokogiri::HTML(io.read.toutf8, nil, 'utf-8') end rescue Errno::ETIMEDOUT => e trial += 1 if trial < RETRY retry else raise e, e.message, e.backtrace end end これをrspecでテストしたいのですが、 タイムアウトをくらってもリトライで成功するケースが テストできません。 1回目のトライではopenでErrno::ETIMEDOUTをraiseして、 2回目のトライではopenがraiseしないようなrspecってどう書きます? こんな感じでできたらいいのですが、 kicked = false should_receive(:open).exactly(2).times do unless kicked kicked = true raise Errno::ETIMEDOUT end end get_html_doc('/dev/null').should be_nil should_receive節の中でraiseするとrspecに怒られてしまいます。 何かうまい方法はないでしょうか。
思いつかないときは自分の知ってる分野に引きずり込んでお茶濁せってじっちゃんが言ってた
$ cat getweb_spec.rb
require 'rspec'
require 'webmock/rspec'
require 'open-uri'
def getweb(url)
t = false
begin
open(url).read
rescue Errno::ETIMEDOUT
unless t then t = !t; retry else raise end
end
end
describe "getweb" do
before do
@url = '
http://host/ '
WebMock.stub_request(:get, @url).to_raise(Errno::ETIMEDOUT).to_return(:body => 'BODY')
end
it "gets a file over Error::ETIMEOUT" do
getweb(@url).should eql('BODY')
WebMock.request(:get, @url).should have_been_made.twice
end
end
# -----------------------------
$ rspec -fs getweb_spec.rb
getweb
gets a file over Error::ETIMEOUT
>>200 >もっとも、多くの場合は RUBY_PLATFORM でいい気がするけど
その定数にx86_64という文字列が入ってくれるならいいんだけど、そうじゃないよね。
もしかして1.9なら入ってたりするのかな。
>
>>200 > >もっとも、多くの場合は RUBY_PLATFORM でいい気がするけど
> その定数にx86_64という文字列が入ってくれるならいいんだけど、そうじゃないよね。
> もしかして1.9なら入ってたりするのかな。
環境とバージョンにもよるけど、amd64とかx64とかx86_64とか。
しかしそもそも、1.8 on Windowsだとmswin64対応してませんぜ
>>204 うちんところは入っとらん。
irb> RUBY_PLATFORM
=> ""i686-darwin10.6.0""
どういうときに入ってるの?linuxじゃないとだめ?
>>205 それは32bit版だと思います
[nil].pack("p").sizeが4じゃないですか
>>206 いやいや、そうでもないみたいよ
ttp://ktjx.blogspot.com/2009/12/mac-os-x-ruby-os.html によると
OS付属、MacPorts、自分で入れたものでそれぞれ
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin10]
ruby 1.8.7 (2009-12-24 patchlevel 248) [x86_64-darwin10.2.0]
みたいになるそうだ
それぞれの実行ファイルは
% file /usr/bin/ruby
/usr/bin/ruby: Mach-O universal binary with 3 architectures
/usr/bin/ruby (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/ruby (for architecture i386): Mach-O executable i386
/usr/bin/ruby (for architecture ppc7400): Mach-O executable ppc
% file /opt/local/bin/ruby
/opt/local/bin/ruby: Mach-O 64-bit executable x86_64
% file ~/local/bin/ruby
/Users/katsuji/local/bin/ruby: Mach-O 64-bit executable x86_64
なんだって
>>200 64bit RubyだとFixnumは63bitだと思ってたら
Windowsでは31bitなのね、とほほ
ruby.hみたら
#define FIXNUM_MAX (LONG_MAX
>>1 )
#define FIXNUM_MIN RSHIFT((long)LONG_MIN,1)
ってなってた
ググったら、互換性のためにlongじゃないとまずいだろってことになったみたいですね
せっかくVALUEが64bitなのに、半分しか使えないとは
PHPの文字列が2Gまでしか対応してないっていうブログ記事を思い出して
RStringを見たら、これまたサイズがlongだった
64ビットだと2G超のメモリも確保できると思うんですけど
WindowsだけStringも2G制限のままなのか
ところで、Fixnum#sizeを使えばFixnumの実装上のサイズが返ってくるのでした Windows以外の64bitRubyだと 1.size > 4 なんでしょうね Fixnum::MAXとかFixnum::MINとかがあれば手っ取り早いのですが WindowsXPのJRubyだと8が返ってきました…… これはもうあれだ 実行中のCPUアーキテクチャを取得する定数なんかを用意するしか
instance.hoge.moge.method1()といった具合に、 クラスのインスタンスメソッドをhogeやmogeで分けたいです。 現状は、instance.method2()やinstance.method3()程度でしかできず、 深い階層を使った呼び出しができていません。 class Testdrive def method2() end def hoge.moge.method1() end end としてみましたが、undefined local variable or methodが返ります。 クラスをネストで定義して、initialize()呼び出し時に 入れ子のクラスを@hogeなどに代入するとできますが、 都度行うのは手間なので、何か慣例となっているやり方が あるのではないかと考えています。 どのようにしたらよいでしょうか。
メソッドチェーンは単なる記述じゃなくて、レシーバに対するメソッド呼び出しの連続だ レシーバに存在しないメソッドは呼べない
>>210 そんなことの前になぜ分けるのか
instance.hoge.moge.method1()ってパッと見どう考えても「instance#hogeの戻り値にその戻り値のクラスが持つmogeメソッドを実行し〜」でしょ
@ary.to_s.gsub!(/abc/, "def")
余計なことを考えてるだけにしか思えない
213 :
デフォルトの名無しさん :2011/03/04(金) 19:38:11.38
def hoge self end def moge self end とかしたいのかと思ったがさすがにちがうよな。
>>213 や、テクニーク的にはそうなのだろ
メソッドチェーンが繋がる外見であることが、なんだか重要らしいし
でもレシーバという概念を勉強して卒業してほしいよかん
あれって無意味ににょろにょろ繋がってるわけじゃないのよw
>>211 メソッドチェーンで、hogeメソッド、mogeメソッド、
metho1メソッドと返り値を流したいわけではないです。
method1以外にもいくつかmogeに関するインスタンスメソッドがあり、
それを人間の目でまとまっているように見せておきたいのです。
現状だと、metho1を定義するのに、
def hoge_moge_method1()
end
とするか
別途クラスを定義してinitialize時に
@mogeなどに代入するしかないので不便です。
>>213 selfについて分からないので調べてみます。
216 :
デフォルトの名無しさん :2011/03/04(金) 20:28:30.04
もしかして instance.hoge.tap {|h| h.moge.tap {|m| m.method1 } } ※ きっと違う。
class Testdrive
def initialize
#@hoge = Hoge.new() #?
end
def medthod4()
end
class Hoge
def method5()
end
def method6()
end
end
end
これをインスタンス化して、
instance.method4()
instance.hoge.method5()
とそれぞれ呼び分けたいです。
method5とmethod6はHogeについてのメソッドなので、
Hogeについてのメソッドを呼んでいますよってことを分かり易くしたいのです。
selfについては読みました。
>>213 にさらに
def method1
end
を追記しておけば
hoge.moge.medhod1()でもmoge.hoge.method1()でも何でもいけるってことで合っていますか。
>>215 メソッドチェーンは単なる記述じゃなくて、レシーバに対するメソッド呼び出しの連続だ
その仕組みを勝手に変えられても、とても困る
まあそのへんの見かけ重視でメソッドの呼ばれ方を見かけ上変えたのがDSLなんだけど
まあ、昔ちょっと流行ったことがある メソッドチェーンするだけで何もしない、読み下し用メソッド class C def foo puts "foo" self end def bar puts "bar" self end def and self end end c = C.new c.foo.and.bar ただ、小手先ニヤニヤドヤ顔っぽくてあまり気持ちよくないというので最近は廃れた
Rubyのやり方を理解していないということですね。
class Net
class Http
end
class Ftp
end
end
とあったときに、
Netをインスタンス化した際に、
instanceからHttpクラスのインスタンスメソッドや
Ftpクラスのインスタンスメソッドを呼び出すには、
どのようにコーディングするのがよいのでしょうか。
私よりもプログラミングに疎い者が簡単な調節で
新しい処理を作れるようにしたいので、
>>218 にあるDSLはまさにうってつけなのでしょうけれど、
私にDSLを設計するほどの技量がなくできる範囲で
扱いやすいクラスを作ろうと考えています。
221 :
デフォルトの名無しさん :2011/03/04(金) 21:10:30.32
>>220 それは Net::Http や Net::Ftp (標準クラスのじゃないよな?) を
インスタンス化するところ。
wxRuby と RubyQt だとどっちが使いやすいですか?
>>222 具体的にどんなもの作るつもりか2行半くらいで
>>220 http = Net::Http.new(...)
http.foo(....)
ftp = Net::Ftp;new(....)
ftp.bar(....)
これがRubyの基本だよ。何も難しい話は無いと思うんだけどな。
>>221 そうですか。
リファレンス見てたら例としてあげられそうだったのであげました。
ありがとうございます。
ということは定義したクラスを実際に使う時に、
HttpなりFtpなりをそれぞれnew()するしかないということでしょうか。
一度のnew()でどのクラスのインスタンスメソッドなのか
分かりやすい状態を作り出すというのは難しいのですか。
みなさんレスありがとうございます。
>>224 それで私も基本は構わないのですが、
new()を1度呼び出すだけでHttpもFtpもインスタンス化できるように
クラス定義の段階で細工できないかと考えています。
class C def initialize @foo = Foo.new @bar = Bar.new end def foo; @foo; end def bar; @bar; end end class Foo; def f; puts "f!"; end; end class Bar; def b; puts "b!"; end; end c = C.new c.foo.f c.bar.b
>>226 >new()を1度呼び出すだけでHttpもFtpもインスタンス化できるように
それなら、こんな感じかな?
class Net
def initilize
@http = Http.new(....)
@ftp = Ftp.new(....)
end
attr_reader :http, :ftp
class Http; ....; end
class Ftp; ....; end
end
net = Net.new
net.http.foo(....)
net.ftp.bar(....)
229 :
227 :2011/03/04(金) 21:32:26.10
6秒勝った…!
>>227 >>228 うまくいきました。どうもありがとうです。
私のやりたいことは実現できそうです。
アクセサについても調べていましたが、
シンボルの記述をミスしていました。
これで次のコーディングに進めそうですが、
net.ftp.bar(....)
これは最初にレスを頂いたメソッドチェーンと形式が非常によく似ています。
違いについてもう少し知りたいのですが、
何と調べると解説ページなど出てくるか教えて下さい。
報告になります。 class A def initialize() @b = B.new() end attr_reader :b class B def initialize() @c = C.new() end attr_reader :c class C def bar() puts 'bar' end end end end a = A.new() a.b.c.bar() これでやりたいことができました。 本当にありがとうございます。
なるほど、def foo; @foo; end はselfの代わりに@fooを返すということで、 c.foo.fはメソッドチェーンではあるんですね。 クラスをネスト表記する利点について、調べてみることにします。 ネスト表記で納得できなければまた質問に来るかもしれませんが、 その時はまたレスくれると有難いです。 だらだらと書いて済みません、 ありがとうございました。
>>207 なるほど、1.8だとx86_64用なのにi686を名乗ることがあるんですねぇ
>>208 Rubyで2GBのString扱いたい事ってあります?
あるなら次のABI互換性破壊時に提案するのが正解ですかね
>>209 そもそも何がやりたくてlongとかポインタのサイズを調べているんでしょうか
たぶんそれによって話が違ってきます
メソッドを呼び出したオブジェクトって取れませんかね? selfを引数にして渡すしかない?
235 :
デフォルトの名無しさん :2011/03/04(金) 22:22:04.43
できねっす。 Rubinius では出来なくもないようだけど。 あと、MRI 1.8.4 あたりまではバグを突いて取得可能だった。
>>232 >クラスをネスト表記する利点
クラスはモジュールの一種である(サブクラスである)から、
クラス定義のネストはモジュールの階層的な構造を表現するという意味がある。
いわゆるモジュラプログラミングとか構造化設計の具体化になる。
>>228 のコードについて、モジュール構造を(意識的に)明示して書き直してみると、
以下のようになる。(冗長だけど、例ということで....)
module Net
class Net; .... end
class Http; ....; end
class Ftp; ....; end
end
net = Net::Net.new
net.http.foo(....)
net.ftp.bar(....)
また、クラス特有の階層とは継承(インヘリタンス)を意味するけど、
これら二つ(モジュール構造とクラス継承)は混同しやすいので注意したい。
>>223 Windows用のネットワークゲーム管理サーバーとその管理ツールです
>>237 …wxでいいんじゃね
なんかモノによっては物凄く遠回りになりそうな気もしなくもないが
html = <<<
http://ruby.com >>> # htmlの内容を取得
みたいな `` と同格なユーザーが戻り値や副作用を好きに定義できる文字列?ってないですよね。
foo("a")
"a".foo
にするのが普通なんでしょうが。
一部の演算子は実体がメソッドなので再定義可能だけど
<<http...>>みたいにはどうやってもできないと思う
Rubyマニュアルの演算子のとこ見てね
とはいえこういうことはできるみたい
require 'open-uri'
def `(uri); URI.read(uri); end
html = `
http://www.example.com/`
>>240 f("aaa") は f "aaa" とかけて、さらにスペースをなくして f"aaa" と書ける。
これじゃだめ?
>>210 だと思うんだけど、「そういうのぜんぜんわかりやすくない」から
初心者というものを完全に勘違いしたシステムには枚挙に暇がないけれど
>>240 どうしてそうしたいのか、そのほうが好ましいのかをじっくりと考えてみるべき。
新しい演算子や構文を作ることは(小細工しないと)できない
-― ̄ ̄ ` ―-- _ , ´ , ~  ̄、"ー 、 _/ / ,r _ ヽ ノ , ´ / / ● i" ,/ ,| / / _i⌒ l| i | と,-‐ ´ ̄ / / (⊂ ● j'__ | (´__ 、 / /  ̄!,__,u● |  ̄ ̄`ヾ_ し u l| i /ヽ、 ,_ \ ノ(`'__ノ (__  ̄~" __ , --‐一~⊂ ⊃_  ̄ ̄ ̄ ⊂ ̄ __⊃ ⊂_____⊃
まあ文句ばかり言ってても非生産的だぬ
「プログラミング知らない人にも極力わかりやすいようにする」アプローチはいくつかある
いちばんメジャーなのは、設定ファイルを分離してユーザーにデータだけ書かせることだ
プログラムロジックを記述する必要がなければ、だいたいの人はだいたいそれなりに納得する
** 管理者が頑張って作る実行スクリプト
require 'yaml'
require 'open-uri'
data = YAML.load_file('config.yml')
url = data['url']
name = data['name']
html = open(url).read
title = html.scan(/<title>(.+?)</)[0]
puts "#{name}さんこんにちは!\n#{url} のタイトルは #{title} です!"
** ユーザーが自由に記述する config.yml の中身(2行)
url :
http://www.ruby-lang.org/en/ name : デフォルトの名無し
** 上記2つを同じディレクトリに入れて実行した結果
デフォルトの名無しさんこんにちは!
http://www.ruby-lang.org/en/ のタイトルは Ruby Programming Language です!
247 :
デフォルトの名無しさん :2011/03/05(土) 10:53:43.57
設定だけUnicodeで保存してくれ、と事務方向けのサービスを 用意したら、メモ帳でUTF16とかBOM付きUTF8保存されて YAMLロードでコケたトラウマが…
UTF-8やUnicode関連のファイル保存オプションが膨大すぎて、 どれで保存するのが妥当なのか常用してても忘れるエディタとか このへんYAMLのほうで自動でなんかどうにかしてくれるとよかったのだけど でもその変な文字がデータとして必要になる可能性もあるから駄目だな
日本人向けの設定ファイルは文字エンコーディング自動判別できるくらいの初期コメントを書いておくのが重要 ときどき、リソースフォークが恋しくなる
def my_sort(e, list) if 0 == list.size then nil elsif list.first == e then list else my_sort(e, list[1..list.size]) << list.first end end puts my_sort('C', ['A', 'B', 'C', 'D']).join() #=>CDBA eに与えた値を先頭にして、配列を並べなおしたいのですが、 CDBAとなってしまいます。 CDABとこれを変えたいです。 どのようにしたらよいでしょうか。
再帰使うのやめたら?w その再帰ではどう見てもCDABだぞw 頭の中で追えてる?
間違えたw 正:どうみえてもCDBAだぞw
>>250 def my_sort(e, list)
return if !list
i = list.index(e)
i ? list[i..list.size] + list[0...i] : list
end
もっとカッコイイ書き方は他の人に考えてもらってくれ…。
とりあえずこれでCDABにはなるから…。
漏れのピットフォールレーダーが!listに反応しています
並びなおすっていうのがどういうことかよくわからんが roteteさせるって事? def my_sort(e, list) if list.empty? nil elsif list.first == e or !(ind = list.index(e)) list else list[ind..-1] + list[0..ind-1] # list.rotate(ind) #Ruby 1.9.2以上だとroteteがある end end p my_sort('A', []) # => nil p my_sort('X', ['A', 'B', 'C', 'D']) # => ["A", "B", "C", "D"] p my_sort('A', ['A', 'B', 'C', 'D']) # => ["A", "B", "C", "D"] p my_sort('C', ['A', 'B', 'C', 'D']) # => ["C", "D", "A", "B"] p my_sort('D', ['A', 'B', 'C', 'D']) # => ["D", "A", "B", "C"]
>>251 printf()デバッグで逐次見ているので、
CDBAになるのが正しいことは把握しています。
解決するコードも書けるのですが、
コードが数倍に膨らむのでよい書き方が他にあるのではないかと。
>>250 ありがとうございます。助かります。
def mysort(z,x) z=z[0].unpack('C*')[0]-1 x.sort_by{|x| x=x.unpack('C*')[0]; ((x - z > 0)? x-z+26 : x) } end p mysort('C',['A','B','C','D'])
>>255 うまく動きます。
rotateと言うのですね、1.9.2以降にあげたら置き換えることにします。
もうちょっと出来るか def mysort(z,x) z=z.ord-1 x.sort_by{|x| x=x.ord; ((x-z > 0)? x-z+26 : x) } end p mysort('C','ABCD'.split(//)).join
K&Rみたいなコードだな
どちらにしてもまったく意味のないコードだ
'ABCD'.split(//) %w(A B C D)
>>233 >そもそも何がやりたくて
>>175 の人は何をしたいんでしょうね?
私は単に興味がわいて調べてみただけなんで
すると、64bitWindowsではFixnumが31bitのままだったんで、ちょっとがっかりな感じ
> Rubyで2GBのString扱いたい事ってあります?
そんな大きいStringが必要になる処理はRuby向きじゃないでしょうが
64bit LinuxとかだとStringもメモリいっぱい使えそうなのに
Windows版だけが残念だなぁと
Windowsサーバーなんて、すでに64bit版だけだし
次期Windowsも64bit版だけになるかもしれないというのに
>>233 同じマシンでも、x86とx64ではRubyの性能が違うので、どちらでコンパイルされているのかを知りたかったから。
1.8と1.9の性能を比較する時に、1.8がx86で1.9がx64でコンパイルされていたことが発覚し、
これじゃあベンチマークの意味なくね?と言われた。
たしかにその通りなので、x86かx64なのかを**Rubyのスクリプトから**調べる方法を探してた。
結局、Rubyではできないらしい。しょぼん。
ヨドバシカメラの近くまで行ったんでパソコンコーナー覗いたんだが 今のプレインストールはみんな64bit Windowsなのな
ふへぇ 16bitOSはもう時代遅れなのか
>>264 いや、だから[nil].pack('P').sizeが4か8かでわかるって
>>264 MacOSでCPUがPowerPCじゃなくx86とわかっていてMatzRuby限定なら
[nil].pack('p').size == 4 ? '32bit' : '64bit'
とか
1.size == 4 ? '32bit' : '64bit'
で、いいんじゃないですかね
つまり現在使ってる人に直接聞いて選択してもらえってことですね
自動判別させるのはかなり骨だと思う
数値を入力させたいのですが、 12 23 34 みたいに一行に複数の数字がある場合にいいやり方とかありませんか?
s = '12 23 34' ia = s.split(/\D/).map {|x| x.to_i}
273 :
デフォルトの名無しさん :2011/03/06(日) 00:12:49.61
String#scanとかString#splitとか。
>>261 アルファベット1文字であることを前提とされてもねえ…
>>259 ,260
自分ならこう書くかな。(冗長ではあるけど、可読性を優先して)
def mysort(z, x)
z = z.ord - 1
x.sort_by { |x|
x = x.ord
if x - z > 0
x - z + 26
else
x
end
}
end
p mysort('C','ABCD'.split(//)).join
ポイントは「Rubyの条件分岐が(文ではなくて)式である」こと。
以前は K&R C風の条件演算子(? .. : ..)を使っていたけど、
判定条件が複雑になってくると読み辛くなってきたので、
すべてif/case式を使うようになった。
本当にA B C D というアルファベットの1文字で用が済む可能性は限りなく低い 質問をするためにわざわざ本質部分を抜き出した結果の表記である可能性が極めて高い なのになんでアスキーコードとか使う気になるの本当に本気で馬鹿なのと思う
文字列操作派とコレクション操作派は昔から聖戦を続けてるからな たぶんどっちも退かない(w 今回はコレクションのまま操作するのが正解だけれど
まぁソートっていうメソッド名から色々想像しちゃうわな…。 ソートするんら、ってんでああなるんだろうな。
my_rotateのほうがいいな
p my_sort('C', ['A', 'B', 'C', 'D']) # => ["C", "D", "A", "B"] を満たすだけのメソッドを定義する っていうネタをやってるんだろうに 無粋な人たちですな 完全な仕様が提示されてないんだから 間違いとは言い切れないでしょうよ
間違いでいいと思う 少なくとも初心者スレには不要
なんでもかんでも初心者にとってよくないからって排してしまうのはよくない 実は技術的に興味深い話だったりすることもあるし (Rubyは文字列同士の比較ができるのでASCIIコードに変換するのは ネタとしても微妙な気はするけど) 自分もこれを他山の石としたいと以下略
いやそれについてはLinuxタコの時代からさんざん試されて結論は出ている 「初心者の質問にオタクのニヤニヤした仄めかしは不要」 C言語の相談室みたいなの覗いてた人なら痛いほどわかるはずだw あれもチシキノスイを集めた無意味なコード書く人がとれとれぴちぴちカニ料理
回答があれくらい混沌とするくらいが言語として成熟してていいんじゃないかと思うことが稀にあるが… まあ、参考にすべきでないという突っ込みくらいはその都度適宜入るだろうしなんとかなると思う 次の質問の方どうぞ
Rubyのやり方がわかりません。教えてください。
いいよ。 rubyの初心者かな?プログラミング自体初心者かな?
289 :
デフォルトの名無しさん :2011/03/06(日) 13:46:29.03
>>287 わからないのはどんな場面?インストール?
環境は?win、mac、linux とバージョンも教えて
290 :
デフォルトの名無しさん :2011/03/06(日) 14:02:15.47
すいません。Ruby on rails(つづりあってますかね?)を覚えるためだけにRubyをやりたいと思います Windowsなんですが種類がいっぱいどれをインストールしたらいいのか分かりません これはこうって書かれている説明も読みましたが自分の用途に向いているものなのか分からず選択できません 主にWebページ用に利用する場合は何をインストールしたら良いでしょうか?
優しく受け入れて突き返す
293 :
デフォルトの名無しさん :2011/03/06(日) 14:26:58.53
わかりました
今railsに使うんであれば、ruby 1.8.7-p334かな 自分は330つこーとった・・・バージョンアップしよっとw
>>292 専門性の高いスレのほうがよかんべ
少なくともこのスレはRailsに対するFAQを持ちあわせてない
んだべな
んだんだ
だらー
同じ静岡でも「だら」は駿河(中部)の方言で、 遠州(西部)は三河の影響で「ずら」を使い、 伊豆(東部)は関東系に近かったりする
埼玉は東京に隣接した都市なので方言が無い 田舎はいいね。羨ましいよ。
でも所ジョージの奥さんはおにぎりのことをおぬぐりと呼ぶからなあ
茨城は関東地方のはずだけど、 県庁に常駐するSEさん達の方言はすごかったなw
埼玉人は異常に東京に詳しい。 休日の池袋と渋谷にいる人間の5割は埼玉人です。 神奈川に劣等感を持っており、千葉を見下すのが埼玉人。
305 :
デフォルトの名無しさん :2011/03/06(日) 16:15:26.43
1.8と1.9って1.9から始めたらダメですか? pythonも2.7と3.2ありますけど3.2でググリながらやって覚えてます ライブラリを使ったりするまで時間も掛かりますので標準のもので何か作れればいいのでrubyを覚えられる頃ぐらいに1.9のライブラリとか出てくればいいかななんて思っていたりしてるのですが 1.8っていうのはメンテナンスだけされるってだけですよね?
306 :
デフォルトの名無しさん :2011/03/06(日) 16:18:07.85
そういうスタンスなら1.9.2でなんの問題もないと思う。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ / \ やる夫に対してうしろめたさを感じるような / \ / ――― ――― \ 人生歩んで欲しくないお / _ _ \ / /´ ,..::::::::::.ヽ ヽ /´ ,..:::::::::::.ヽ ヽ \ 全うな人生をみんなに歩んで欲しいんだお / ,' ,;::::::::::::::::::', ', ,' ,;:::::::::::::::::::', ', \ / { {:::::::::::::::::::::} } { {::::::::::::::::::::::} } \ 過去の行いを悔いながら / '、 ヽ::::::::::::::/ / '、 ヽ::::::::::::::/ / \ | (;;;;;;;;;;)) ̄ / | \  ̄ | 過ごす人生なんて楽しくねーお | /' / ∧ ', | | {{ { / ヽ } | 今ならまだ許せるお | ヽ ヽ___/ __ \___ノ | \ 人 ヽ ´ ` ' / 次回期日が刻一刻と迫ってるお。 \ ( し.) / \ `¨ / 助けて欲しいんだお。 / \ / \ お願いなんだお。
それはあれか とりあえず標準のライブラリがあればよくて自分で情報を集める能力がある → 1.9系列で鉄板 ってテンプレに入れろということか
1.8を前提にした1.9学習術、みたいなのを教えてくれる師匠がいないなら、1.9から始めるのはあんまりお勧めしない
提示されたサンプルやぐぐって見つけたコードが1.9では(一見動作してるようで実は)動かない理由を判別するのが手間だ
完全に1.9だけしかない世界で1.9だけ学んで1.9だけ使うなら1.9.2から始めるのがおすすめだが、
そんな世界は残念ながらまだない
外部の変なファイル、外部の変な文字エンコーディング、1.9を意識しないコードやサンプル、
そういったものと学習と並行して戦わないといけないのでしんどいぞ
たとえば
>>246 は1.9では動作しない
$ ruby ./hello.rb
/home/ch2/hello.rb:9: invalid multibyte char (US-ASCII)
/home/ch2/hello.rb:9: invalid multibyte char (US-ASCII)
UTF-8 でファイルを作成したとして、hello.rb の先頭に # coding: utf-8 という行を追加する
$ ruby ./hello.rb
デフォルトの名無しさんこんにちは!
http://www.ruby-lang.org/en/ のタイトルは ["Ruby Programming Language"] です!
サンプルの表示となぜか違う
これは Array#inspect の返り値が 1.9 で変更になったことの影響による
title = html.scan(/<title>(.+?)</)[0] を title = html.scan(/<title>(.+?)</).flatten[0] に変更
$ ruby ./hello.rb
デフォルトの名無しさんこんにちは!
http://www.ruby-lang.org/en/ のタイトルは Ruby Programming Language です!
これでやっと「ネットで見つけたサンプルが自分の Ruby で動く」ことになる
この知識を 1.9 で Ruby を最初に学ぶ前提に置くのはやっぱなんか違うだろ
Pythonのリストの子要素に再帰的に__str__が適用されないのと同じ理屈だから Pythonっ子にはどうってことないよ
まちがいた
× これは Array#inspect の返り値が 1.9 で変更になったことの影響による
○ これは Array#to_s の返り値が 1.9 で変更になったことの影響による
じゃあ
>>246 を
# coding: utf-8
require 'yaml'
require 'open-uri'
のように親切に書いて投稿するようにすればいいのかっていうとね、
「コピペしてファイルに保存」した結果のファイルが UTF-8 だとは限らなくてね、
そのときはinvalid multibyte char (UTF-8) になるだろう
異常なまでな独善的さで1.8.7をゴリ押しするやつが頭おかしいって、 ずっと昔からしかも何度も何度も結論出てるだろ。蒸し返すな。
おぼえることたくさんで絡み合った1.9に手を出して挫折してくれないと本が売れません 地道な営業活動はいつか実を結びます
自分が1.9系列を使えるということと、初学者が1.8よりも1.9を習得しやすいということは全く別
「Ruby1.9初心者スレ」というのがあってもいいかなあと思うことはけっこうある
>>316-317 1.9.xを使うなと言ってる人は別にいないんだよな
なんかアレルギー持ちがいるっぽいんだが
ここが初心者スレだということを忘れてる人がいるらしい
>>310 の問題はわりと根深い
「俺も苦労したんだからお前も苦労しろこれが唯一の道だ」的なスタンスはあんまり好きではない
1.8.7を学んでから1.9.xを学ぶという、おそらく現状躓き最小であろう道の何がまずいというのかさっぱりだ
どこがねぶかいのですか(棒
ここにいる人は、時期的な問題で、1.8 を学んでから 1.9 に手を出した人がほとんどだと思う そーゆー意味で、経験を元にして正しく初心者にアドバイスできる人は一人もいないハズw 1.8 をベースにしてる時点で、1.9 差分取得の容易さはどーにもならない たのしい Ruby ですら、いまだに 1.8 ベースでの差分学習になってる どっかに「1.9 から始めたけどそれから追加で 1.8 学んでも余裕でした」みたいなニューエイジがいないもんか あるいは完全 1.9 ベースで進めて、1.8 情報は 「ちなみに過去の 1.8 ではエンコーディング指定を書かないので大混乱でしたwwwww」 みたいなコラムに追い出す参考書とか 次の版の本ではそうなったりしないかな
世の中が1.9ベースに移行してねえという事実そのものが、習得難易度への回答なような… そんなにも初心者向けならみんな即っと習得して即っと書き換えて即っと移行してると思うの
>>322 一応、普段使いは1.9.2なんだけどね
1.8.7がある以上、初心者にいきなり1.9.2勧める気はしないわ
Rubyのこともプログラミングのことも嫌いになってほしくないもん
なんか、1.9って「優しくない」よね。「易しくない」じゃなくてさ。 1.8のことで困った、技術のある人たちが作ったのだということはよくわかるけれど、それってとても……
windowsのコードページ65001でirbが起動できないのはなんで?
Windows環境で始めるなら断然1.9.2 unicodeファイル名扱えるしね
1.8.6で十分ですよ。
329 :
初心者 :2011/03/06(日) 23:03:17.85
初心者としては新しいバージョンに惹かれるのです
1.9.2行っとけ たいがい動く
1.9.2からはけっこう普通に使える印象なんだけど。 Railsもすでに対応しているし、まだ1.9に未対応な、メジャーどころのアプリやライブラリって何かある?
332 :
デフォルトの名無しさん :2011/03/06(日) 23:30:50.24
常に最新版を使いたいのでwindows用で自分でソースをコンパイルしたい 初心者では難しいですか? C#でMessageBoxなら出せるスキルはあります
>>331 Ruby本体の習得煩雑度の問題な気がする
ぐぐっても1.8ベースの情報が多くて、1.9にコンバートするのには1.8経験がないと困るというのは
まあ実際問題としてよくあることで、初心者の壁になると言われれば、まあ、そうかなという…
>>332 1.8と1.9の最新安定版なら、頑張ってくれてる人がかなり早いタイミングでWindowsバイナリを提供してくれる
ので、おおむね自力コンパイルの必要はない
335 :
デフォルトの名無しさん :2011/03/06(日) 23:40:48.77
1.9の日本語マニュアルってないの?
336 :
290 :2011/03/06(日) 23:42:18.44
無事回答を頂けました ありがとうございます
>>337 やっべ初めて聞いたw
基本他力本願なんで、人の作ったプラグインやライブラリを入れて
やってます。
>>338 Facetsなんて使わなくていいよ
はしかみたいなライブラリだ
ActiveSupportだけrequireするような滑稽さを感じる
>>326 コードページ65001にするとバッチファイルが動かなくなるからじゃないかな。
Windows 7で直っていると思った。
341 :
デフォルトの名無しさん :2011/03/07(月) 11:23:05.25
Windowsなんですが1.9.2-p180が使いたいです 公式サイトには古いのしかありませんでした どこでダウンロードできますか?
(⌒ ( ) ⌒) 何かすればすぐレンラク・ツーホーなんでしょ? ( ) ) (_ヽ_ハ从人_ノ_ノ できることが限られてるんだよね。私はね | || | | ノ L,l ,|| |、l、 正義が負けるのか?それが正しいわけないだろ? ⌒:::\:::::/::\ / <●>::::<●>\ 裁判は証拠主義、証拠主義。そりゃもっともだ、だが / (__人__) \ | |::::::| | 俺が正しいってこと分かってんだろーがっ! \ l;;;;;;l /l!| / `ー' \ |i かーっ、腹立つなー! / ヽ !l ヽi ( 丶- 、 しE | ドンッ! `ー、_ノ 煤@l、E ノ > レY^V^ヽ /.: ̄ ̄ ̄ ̄ ̄ \ 黙ってるだけ、確かに黙ってるだけだよね /: : : \ でもさあ、お前らが黙ることで苦しむ人間がいるんだよ /: : : : \ ねえ、聞いてる?良心が痛まない? /: : : : : : \ あなた方は真実を知ってるよね? / : : : : : : : ___ノ'′ ゙ヽ、___ \ お願いだから、真実を伝えるメールを下さい l : : : : : :.; '⌒` ´⌒ヽ l 嘘を言って欲しい訳じゃない、真実を知りたいんです | : : .::;;(。o〇 ) ( 〇o。);;:: | どうしても、どうしても真実と思えないんだ l : : : :°o゚゚~'"´ `"~゜o゚;° l 準備書面が事実ならば、伝え忘れるわけがないんだよ \ : : : : : : 。;゚( j ) ; 。+/ 誰が発案者かは間違いなく主張してくる事実なんだ \: : : : : : ::`┬‐'´`ー┬′ + / そこを主張しなかった理由を知りたい /ヽ: : : : : : : |/⌒⌒、| イ\ 見当はついている : : : : : : :゚: : : ゚´ ̄~:j ̄` ; \ そこを証拠で立証したいだけなんだ : : : : . : : . : : ; '"`` + \
あらやだ、先月出たやつのバイナリがどこにもないな MinGWをインストールして自力でコンパイルするしかないわ
ま、立証できなかったからといってすぐ負けるわけじゃないんだけどね。 他の事実から立証していけばいいんだけど、 楽して裁判に勝ちたいから協力してって言ってるだけだけどね。
いや少なくとも RubyInstaller のはあるだろ、と思ったらあった
ttp://rubyinstaller.org/downloads/ MinGW の Ruby になるので、思いっきり古い gem ライブラリをインストールするときにエラーが出ることがある
そのときは gem install hogehoge ではなく gem install --platform mswin32 hogehoge とオプションつきにするといい
ナイトリー ビルド とかは難しいの?
>>346 そこまで大多数にエッジ追いかけてもらって意味のある大人気のソフトウェアじゃないしなあ
クライアントプログラムなら開発版バイナリ公開するのにも意義があるけど、スクリプト言語ではな…
ちなみに、ある程度のマシンスペックがあればRubyのコンパイルは現実的な時間で終わる
ナイトリーはアレだが、週1で更新して遊んで試すということは可能
バイナリ公開されてないだけで、自分用のを適宜開発最新版にしてる人はいるはず
「誰も日本語をpで表示して使ってなかったZEやっちゃったZE!」というエンバグの過去があるので、
ある程度知識のある人が開発版コンパイルして日常使用してもらうのは実はありがたい
ただ、初心者スレ向きの話じゃないなw
>>346 人手が足りてないとか何とか
(まあ人手が足りてるオープンソースなんてあるのか知らんが)
最新版おっかけるような人に求められてるスキルとして、 自力でビルドできる、とかは当然含まれてるので、ナイトリービルドのバイナリとか あまり意味がない。
確かWindows環境だともう入手困難なかなり昔のコンパイラが必要なんだっけ? VC++ 6あたりだっけか
352 :
デフォルトの名無しさん :2011/03/07(月) 19:29:20.36
>>348 /opt 以下にインストールしちゃえという事で、自前コンパイルしてたけど、仮想環境内で
ものの5分くらいでコンパイルは終わってた気がする
>>351 mswin32 を今から環境そろえて作るのはもう無理
今からやる人は mingw になると思う
コンパイル経験さえあれば怖くないので興味のある方はどうぞ
Rubyは不親切な人が多いのですね 最新版あげてくれたらいいのに
諸先輩方に悩みを聞いて頂きたく、筆をとらせていただきました。 テキスト形式で出納帳をつけており、スクリプトで月別に集計しています。 先日、Ruby のバージョンにより計算時間が4倍ほど異なることに気が付きまして、 どのように修正すれば良いのかアドバイスを頂きたいのです。 ずいぶんと昔に例題をコピーして書いたものなので、実は自分でも何をしているのか 忘れてしまいました。根本的に誤っているのであれば、サンプルのようなもを教えて 頂けると助かります。 1.スペック マシン: 600MHz, 384MB Ruby : $ /usr/bin/ruby --version ruby 1.6.8 (2002-12-24) [powerpc-darwin7.0] $ /usr/local/bin/ruby --version ruby 1.9.2p180 (2011-02-18 revision 30909) [powerpc-darwin7.9.0] 出納帳: UTF-8 768KB 11013行 自分 : 40 童貞
356 :
355 :2011/03/07(月) 19:55:20.94
2.実行結果 $ time /usr/bin/ruby suitou.rb 2000 2000.01月の支出額 253421 円 ... 2000.12月の支出額 345123 円 ------------------------------------------ 2000年の支出総額 3946492 円 real 0m1.285s user 0m0.980s sys 0m0.070s $ time /usr/local/bin/ruby suitou.rb 2000 2000.01月の支出額 253421 円 ... 2000.12月の支出額 345123 円 ------------------------------------------ 2000年の支出総額 3946492 円 real 0m4.456s user 0m3.720s sys 0m0.120s 3.出納帳(suitou.csv) 2000.01.01,1000,食費,外食,メイド喫茶,* 2000.02.02,2000,教養,HなDVD,立花書店,* 2000.03.03,3000,交通費,地獄-天国,Rails,* ...
357 :
355 :2011/03/07(月) 19:58:55.81
4−1.スクリプト #!/usr/bin/ruby # -*- coding: utf-8 -*- # Created by: Cherry 2002.06.26 # Last modified: 2010.04.15 ref_file = "/Users/cherry/suitou.csv" sum = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] sougaku = 0 $pat = ARGV.shift hoge = ["#{$pat}.01", "#{$pat}.02", "#{$pat}.03", "#{$pat}.04", "#{$pat}.05", "#{$pat}.06", "#{$pat}.07", "#{$pat}.08", "#{$pat}.09", "#{$pat}.10", "#{$pat}.11", "#{$pat}.12"]
358 :
355 :2011/03/07(月) 19:59:38.08
4−2.スクリプト open("#{ref_file}") {|file| while l = file.gets if l =~ /^#{$pat}/ hairetsu = l.split(/,+/) for i in 0..11 if hairetsu[0] =~ /#{hoge[i]}/ sum[i] += hairetsu[1].to_i end end end end } for j in 0..11 puts "#{hoge[j]}月の支出額 #{sum[j].to_s.rjust(6)} 円" sougaku += sum[j] end puts "------------------------------------------" puts "#{$pat}年の支出総額 #{sougaku} 円"
359 :
デフォルトの名無しさん :2011/03/07(月) 20:22:51.18
open(ARGF.filename + ".ecc") {|file|
while l = file.gets
l=l.to_i
ls=@I[ii]
ii=ii+1
lines += 1
fields += l.to_s.split(',').size
l^=(@P_y%(2**8*ls))
for i in 0..31
salt[i]=0
end
while(l>0)
i=0
while(i<ls)
salt[i]=l&0xff
salt[i]=sprintf("%c",salt[i])
l=(l
>>8 )
i=i+1
end
end
i=ls-1
while(i>-1)
g.write(salt[i])
i=i-1
end
end
これをCで書くとどうなりますか?教えてください。よろしくお願いします。
あれ、あまり速くならない # -*- coding: utf-8 -*- ref_file = "/Users/cherry/suitou.csv" sums = {"01" => 0, "02" => 0, "03" => 0, "04" => 0, "05" => 0, "06" => 0, "07" => 0, "08" => 0, "09" => 0, "10" => 0, "11" => 0, "12" => 0} sougaku = 0 target_year = ARGV[0] re_target_year = /^#{target_year}/ open("#{ref_file}") {|file| while line = file.gets if line =~ re_target_year hairetsu = line.split(/,+/) if hairetsu[0] =~ /\d\d\d\d\.(\d\d)\.\d\d/ month = $1 else raise "日時の表記が不正です:#{line}" end sums[month] += hairetsu[1].to_i end end } sums.sort_by{|pair| pair[0].to_i}.each do |month, sum| puts "#{target_year}年#{month}月の支出額 #{sum.to_s.rjust(6)} 円" sougaku += sum end puts "------------------------------------------" puts "#{target_year}年の支出総額 #{sougaku} 円"
余談だけど、Ruby1.9が速いってのは嘘だから 「速くする事もできる」が正確 普通なスクリプトを普通に作ったら、1.8よりも遅い
362 :
デフォルトの名無しさん :2011/03/07(月) 21:29:15.80
RubyをCに変換するソフト知りませんか?
>>361 全ての文字列がエンコーディング情報つき文字列になったのに、それで速くなるわけないじゃん
>>361 >「速くする事もできる」が正確
詳しく
368 :
355 :2011/03/07(月) 22:13:12.35
>>360 さん
改良ありがとうございました。これは1.9以降用になりますね?
自分にとって "01" => 0 と sort_by, pair というものが新しい概念ですが、
調べて身に付くようにしたいと思います。
$ time /usr/local/bin/ruby suitou_2ch_360.rb 2000
real 0m0.741s
user 0m0.470s
sys 0m0.090s
ブレはありますが、おおむね 0.8秒以内(5倍増し!)で計算が完了するように
なりました。1.6.8 よりも早くなってる〜。
これでこのマシンをまだまだ使ってやれます。
>>361 さん
アルゴリズムを勉強した方が良いということですね?がんばってみます。
railsからruby始めますって人には rails installerがいいの? rubyのホームページには、バイナリを使う場合は mswin版とmingw版の違いはないって書いてあるけど 実際のとこどうなの? xpにはmswin、7にはmingwってのはガセ?
WindowsでUTF8だかUNICODEだかのファイル名やテキストを 操作するスクリプト書きたいんですが どのバイナリだと可能でどのバイナリだと不可能みたいのってあるんですか? -KuというのをつけておけばどれでもOK?
>>369 Railsやるって人はRailsスレに行ったほうが的確なアドバイスがもらえるかと思う
ttp://hibari.2ch.net/test/read.cgi/php/1292032736/ 一般論として、Rubyインストール後にgem install railsでRails一式と自分に必要なものをインストールするのは
若干の知識と根性がいる
オールインワンなモノが自分にあったもの全部用意してくれるなら、それに頼ったほうがいんでないかね
mswinとmingwには動作的違いはないことになってるのだが、
「名前は違うけど動作おんなじ」というシステムのことをrubygemsが考えてくれなかったので、
mingwが一般認知される前に作られた古いバイナリつきgemライブラリが時々mingwを弾く、対処は
>>345 >>5 にもあるんだけど、稀に躓いてもいい(回復できる)のならmingwのほうがいいと思う、なにより新しいw
Ruby学習中に本質でないトラブルがジェットストリームアタックなので、手一杯な初心者には勧めない
>>370 Unicodeファイル名は扱えない(若干の語弊あり)
UTF-8で書かれたテキストファイルの内容は扱える
>Unicodeファイル名は扱えない(若干の語弊あり) 内部はA系のAPI固定ってことなんですかね。 Ruby.NET(Iron Ruby?)も軽く調べつつ とりあえずPowerShellでやることにします。 ありがとうございます。
>>354 壊れてて自力じゃどうしようもできないこともありえるナイトリービルドを提供するのが
「親切」だと思うような危篤な人はあなたぐらいです。
ここまでの流れからすると1.8だとUTF-8を扱えないからWebサイト作るときはSJISかEUCしか使えないって事ですか? 基本的にHTMLはUTF-8でやりたいので厳しいですね
何かの入力を元にランダムな文字列を作成する場合は Digest::SHA1などのハッシュ関数を使うと思うのですが、 入力元データが無く、単純にランダムな文字列を作成したい場合は ハッシュ関数を使う必要は無いでしょうか? 0~1とa~zをランダムで選んで適当な数だけくっつければOKですか? 具体的にはユーザーから送られてくる画像に対して、出来る限りダブらないような任意のunique_idを振りたいのです。 よろしくお願い致します。
376 :
375 :2011/03/08(火) 13:39:30.10
すいません、付け足しです。 自分で調べた限り、SecureRandomというモジュールで安全なランダム文字列を作れるとのことですが、 入力元データが無い以上、 0~1とa~zをランダムで選択してくっつける方法よりもセキュアにランダム文字列作る方法があるとは思えないのですが この考え方は間違ってるのでしょうか。
画像に振るIDにセキュアとか関係ないと思うが 連番が一番信頼できるIDなのだが、連番じゃダメなのか?
378 :
375 :2011/03/08(火) 13:55:23.44
セキュアの意味は、同じ文字列を生成しないという意味だと思っていたのですが、違うのですか? 連番にできれば一番効率もいいと思うのですが、仕様でランダム文字列で管理するように決まっていまして 下っ端PGの自分には意見する権利が無いのです。
>>376 SecureRandomはシステムからアクセス可能な最大レベルの乱数発生器を使用してランダム数列を作る
というかむしろ、そういうのが入手不可能だった場合は実行できずに例外出して死ぬ
自前で「らんだむにする」なんてのよりもよっぽど偏りがないぞ
ただ、既存との被りチェック機能はないので、それのチェックは自力でやる必要あり
過去と被る可能性がかなり低いというだけで、絶対被らないというわけではない
100まんこのデータIDが溜まってしまった場合、作ったIDが過去と被らないかのチェックは100まん回行う必要がある
これのコストを許すことができない場合は
>>377 の言うように素直に連番にする
これは少なくとも絶対に被らないから、被りチェックのコストはゼロだ
>>378 セキュアは「安全」という意味で、
大体こういう場合は「セキュリティ的に問題がない」みたいな意味。
ネットの辞書で調べられるでしょ。
ランダム文字列がいいなら、
現在時間のTimeオブジェクトにランダム数値の文字列をくっつけてハッシュとか、
かっこつけたければsaltとして真ん中に適当な文字列を入れ込むとか。
まあなんでもいいと思うよ。
>>379 ああ、エロ画像の一括ダウンロードとかか
>>378 「セキュアな」というのは、
悪意のあるユーザーが乱数の規則性を発見しようとしても困難だという意味
単に衝突を回避したいというのであれば、
乱数を元に十分なだけ文字列を並べればいい
そうすると乱数の種が問題だが、まあ現在時刻とかでもいいかもね
あんまり厳密なことを求めてないようだし
>>380 コリジョンについてのはどうなんだろうね
そのへん脅すとたいてい連番でいいよって言ってくれるもんなんだが
いや、衝突なんてまず起きないけどさ…
ひとえに「万一衝突が起きたらどうなるか」によるな 地球が爆発しますとかなら連番にしておいたほうが無難 過去のファイルが上書きされて公開されますとかなら菓子折りでも持って謝りに行っとけ
Rubyに向いてない処理ってどういうのですか?
Ruby 関係ないけど、連番+乱数みたいなフォーマットにすればコリジョンは発生しないのでは?
387 :
375 :2011/03/08(火) 15:25:19.08
皆様ありがとうございます。 しかし乱数発生器という概念がやはりよく分かりません。。 たとえば以下のようにランダム文字列を作った場合、 source = ('a'..'z').to_a + (0..9).to_a a = Array.new(10){source[rand(source.size)]} a.join 同じくa~zと0~9を用いてこれよりランダムな10桁の文字列を作るのは不可能ではないですか? 全ての桁で何にも依存せずにランダムに文字を決めているのだからこれ以上分散させようが無いと思うのですが。 推測もしようがないと思います。
連番というか、日付をプラスするというのはよく見るね /upload/20110308/a8b3c7f382.jpg これなら万一の場合の被害範囲も小さいので説得も簡単だろう その日のディレクトリ内のファイルなんて多くて1万とかだろ(適当) 「本日のディレクトリ内にファイルが既に存在したら再抽選」という処理でも間に合うはず まあ、そんな小細工しなくても、結果の文字列がじゅうぶんに長ければ衝突の心配はほぼない 正確を期すと「衝突しないわけではありません」と答えるしかないのが大変辛いところではあるが Ruby関係ないな
>>385 Rubyで実行して1秒以上かかるような処理は本質的に向いてない
まるちめでぃあとか数値計算とかGUIぐりぐりとかあのへんは苦手分野だ
一般的なゲームも、他の言語と比べた場合はあんまり得意とは言えない
頑張ればなんとかならなくもないのだが、「敢えてRubyでやることに意義がある」という状態なので、
結果が欲しいだけという一般なピーポー様は素直に他の言語で作ろうPythonとかどうすかPython
>>387 その rand() の精度が問題
たとえば、100万回を3回実行したけど毎回1が100個ほど多い、とかだと困る
乱数の種として oasjfoiefdasifj を与えると 4829384 番目の7文字目に同じ数字が出るとか
100万回の結果をプロファイリングすると乱数の種の4文字目は34パーセントの確率で1だとか
普段の使用ではこんなの気にするのは基地外レベルだが、乱数発生器としては失格
SecureRandom.hex とかが重宝されているのは、ランダム数字から16進数を導き出す計算に偏りがないため
rand() で被る確率と SecureRandom で被る確率そのものは、前者のほうがはるかに高いはず
SecureRandom 相当が自由に使用できるなら、乱数発生に SecureRandom を使用しない理由は何もないと思うよ
被らない乱数製造機 ransuu = 1..1000000000.to_a.sort_by{|x| rand} ransuu.pop
391 :
375 :2011/03/08(火) 16:48:22.61
うーむ、とても難しいですね(汗) 今の自分にはちょっと理解できないですが、頂いたレスをもう一度じっくり読んでみます。 ありがとうございました。
だから何も言わず SecureRandom 使え 天文学的確率でしか被りませんと胸を張れる rand() は一意になる ID のようなものを作るのにはもともと向いてないのだ
>>375 > 具体的にはユーザーから送られてくる画像に対して、出来る限りダブらないような任意のunique_idを振りたいのです。
1) スレッドセーフにシーケンスな整数を割り振り
2) 受付時間を整数にして使う
2ちゃんのdatなんかは後者でファイル名つけてるね。
394 :
393 :2011/03/08(火) 17:04:24.51
あ、スレ読めてなかったスマソ…。忘れて…。
>>372 1.9.2ならunicodeファイル名扱えるよ
>>376 入力元データがないなら、乱数を使ってデータを作ればいい。
require 'digest/sha1'
seed = [rand(), rand(), rand(), rand(), Time.now.to_f].pack('ddddd')
p Digest::SHA256.hexdigest(seed)
ところでhexdigest()は0-9a-fまでの16文字を使うけど、これを0-9a-zまでの文字を
使うようにすれば、同じ情報量でも生成される文字列は短くできるよね。
0-9a-zまでなら36文字か。0-9a-zA-Zと'-'と'_'を使えば、64文字。
hexdigest()のかわりに、バイト列をこの64文字を使って表現する方法を
だれか教えてください。
397 :
デフォルトの名無しさん :2011/03/08(火) 18:56:10.67
近いところで SecureRandom.base64(32) => "97LXeNU4g2xG75E0qmvX0+kI34zJkw1+fh/XvJAvEOY="
>>397 できれば任意のバイナリを受け取る方法が知りたい。
>>398 ヒント:
0と1の2文字しか使わない2進数
0から7の8文字しか使わない8進数
0から9の10文字しか使わない10進数
0からfの16文字しか使わない16進数
0から_までの64文字しか使わないのは
ハッシュはキーがシンボルなら key:val って書けるじゃん で値もシンボルなら key: :val ってなって見た目ががっかりなんだが ここらへん開発陣に問題意識はある感じですかね?
追いかけてないが、特になかったと思った 値もシンボルというのはそういうの的には稀だし
Pythonを覚える場合はRuby覚える必要ってないですか?
ない
404 :
デフォルトの名無しさん :2011/03/08(火) 20:12:46.15
>>398 バイナリを6ビットずつに区切って、使いたい文字に割り当てればよろしい。
つまりBASE64と
そうですか。今日ちょうどそういうのがあったので dir=Dir.glob '*.*'.encode Encoding::UTF_8 dir.each{|e| puts e.encode Encoding::WINDOWS_31J, undef: :replace, invalid: :replace, replace: '?'}
>>404 それをやってくれる便利なメソッドかライブラリがないでしょうか。
base64
[SecureRandom.hex(16)].pack("H*")
あーすまん。よく読んでなかった
>>400 先日IRCでちょっと話題になったな
問題意識がないわけじゃないがノーアイディア
劣化って程じゃないんだね 安心してPS3版買えるよ 教えてくれてありがとう
どういたしまして
>>411 というかJSON互換なんだから値は数値と文字列しか想定してないだろ
415 :
デフォルトの名無しさん :2011/03/09(水) 13:05:56.75
>>414 JSON互換ならキーはクォートされた文字列でなければならない。
YAML互換と言うべきだろう。
>>415 YAMLの仕様にはシンボルなんてない。
もしシンボルが使えたら、それはSyck独自拡張。
てか所詮リテラルレベルで互換性語ってもかなり滑稽だ 「どっかから○○形式の記述をコピペしてここで使える」という以上の意義をまったく見出せない
そうだ! :key => :value って表記法はどうかな?
>>414-416 の展開がそのまんま答だなw
みんなして「○○記述形式でよくある、なんかコロンで繋ぐやつ」という認識でしかねえw
だから実際に何形式なのかを言葉にするとガンガンすれ違う
解釈後に生成されるオブジェクトからして、Ruby引数オリジナルと考えるのが一番真っ当だと思う
420 :
デフォルトの名無しさん :2011/03/09(水) 14:16:22.94
たぶんPythonのキーワード引数の踏襲。
引数以外でも使えるよ {kew: 'value'} => {:kew=>"value"}
>>420 Matzの趣味的にはCommon Lispだろう
Ruby1.9.2でWindowsのUnicodeテキストファイル UTF-16LE(改行:<CR+LF>)+BOM を 読み書きするにはどうしたらよろしいのでしょうか? abc<CR+LF> を読むとバイト列が [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10] となってLFの2バイト目が分断されているようです それとBOMの適切な処理方法があれば教えてください。 (設定によってBOMを読み飛ばしてくれたりバイトオーダーを設定できたりする機能があれば) ソース # coding: utf-8 $stdin.binmode #$stdout.binmode $stdin.set_encoding 'utf-16le' $stdout.set_encoding 'utf-16le' while row = gets p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10] print '#', row end printのところでエラー xxxx.rb:11:in `write': incomplete "\n" on UTF-16LE (Encoding::InvalidByteSequenceError)
>>423 質問の一部にだけしか回答できないけど
> LFの2バイト目が分断されているようです
getsのline separatorが10 00ではなく10になっているとかじゃないか
getsって意外とめんどくさいよね
426 :
デフォルトの名無しさん :2011/03/09(水) 23:13:59.29
>>423 gets のあとで tell すると 11 と返ってきたけど、これって
次に読むのが最後の1バイト(00)っていう状態かしら。
getsは使うときドキドキするね $stdin.binmodeを外すとどうなるだろう
428 :
デフォルトの名無しさん :2011/03/09(水) 23:19:50.29
gets は $/ を区切りとするんだけど、これがそのままだと 0x10 なので、
$/ = "¥r¥n".encode('UTF-16LE') としたらうまくいった。
BOMをむしるところまでは出来ないけど。
>>427 binmode は ascii-incompatible なエンコーディングを読むときに必要だと
怒られる。
>>428 なるほど。やってみた
`set_encoding': ASCII incompatible encoding needs binmode (ArgumentError)
テキスト読むのにbinmodeにしろとか気持ち悪いね
BOM, $/ともども手当てしてあってもおかしくないんだけど
NoMethodError: undefined method `to_utf8' for "\343\201\277\343\201\213\343\202\223":String (#^ω^)ピキピキ
(::゚∀゚::) そんなにピキピキしてないで俺でも食えよ
432 :
デフォルトの名無しさん :2011/03/10(木) 00:07:52.94
$/ をケアするとして、こいつはあいにく特定のIOに結びついたものでは ないので、やるとすれば、getsが毎回その時点での $/ を対象IOの エンコーディングに合わせて変換することになるんだろうな。 IOインスタンスごとに line_delimiter みたいなプロパティを用意して、 デフォルトがそれになるようにするのがよいのかもしれん。 あれ、ないんだっけ…?
getsはデリミタとして使用する文字列を引数にとるだろ
まったく試してないが gets("\r\n".encode('UTF-16LE')) でいけるはずだ
あと
>>428 はマカー
434 :
デフォルトの名無しさん :2011/03/10(木) 00:38:45.19
WebKit通すとバックスラッシュが yen になっちまうからばれるんだよね…
435 :
423 :2011/03/10(木) 00:51:17.63
改行の読み込みはデリミタ指定でうまくいきました。ありがとうございました。 BOMはとりあえず見てみぬふりをします。 # coding: utf-8 $stdin.binmode # バイナリモードでないとエラー :in `set_encoding': ASCII incompatible encoding needs binmode (ArgumentError) # $stdout.binmode # バイナリモードだと改行が<LF> $stdin.set_encoding 'utf-16le' $stdout.set_encoding 'utf-16le' while row = gets("\r\n".encode('utf-16le')) p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10, 0] print '#', row.chomp, "\n" # <CRCRLF>対策 end
436 :
デフォルトの名無しさん :2011/03/10(木) 01:08:58.29
BOMについてはまともに対応しようとすると大変らしいので(よくわからない)、 とりあえず$stdinを2バイトseekしてから使い始めとけばいいんじゃないかな。
なにその誤爆するまで前進
IO#getsだとちゃんと改行を読むね open('hoge','rb:UTF-16LE') do |io| while row = io.gets p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10, 0] end end p $/ #=> "\n" Kernel#getsの不具合なのかな
それと、Ruby1.9.2だとBOM判別、読み飛ばし機能が付いてた open('hoge','rb:BOM|UTF-16BE') do |io| while row = io.gets p row.each_byte.to_a #=> [ 97, 0, 98, 0, 99, 0, 13, 0, 10, 0] p row.encoding #=> #<Encoding:UTF-16LE> end end openのモード指定でexternal-encodingがUTF系のときBOM|をつけると BOMを判別してエンコーディング決定&BOM読み飛ばし BOMがなければ指定されたエンコーディングに 1.9でIOのクラスメソッドが ハッシュ引数をとるようになったので IO.foreach('hoge',mode:'rb:BOM|UTF-16LE'){|row| p row.each_byte.to_a} とかできる でも IO.foreach('hoge',binmode:true, external_encoding:'BOM|UTF-16LE') みたいな external_encodingでの指定は効かなかった 対応し忘れ? 例によってドキュメントないけどorz
> mode:'rb:BOM|UTF-16LE' やっぱこの記法キモいわ あ、でも1.9専用って示すのにはいいかも
>>441 新しいハッシュの記法だと思ってた。
ハッシュじゃないならmode:の部分がベアワードでエラーになりそうな気がするから。
Ruby初心者を脱した自覚くらいはあって、 これからかっこいい中級者になりたいなと思ってるんだけど、 そのために必要なぷろぐらみんぐちしきとかを勉強できる本とかないもんですかね っていうか足りない知識ってなんだろう
デザインパターンとかリファクタリングとかあのへんの本を読むと、今なら面白いかも あとソフトウェアテスト関係 Webに関連する生活をしてるならHTTPのRFCとか 他人のライブラリソースを読むのもいいけれどね
配列内の要素をソートしたいのですが、方法が分かりません。 具体的には、scoreというインスタンス変数を持ったBookクラスがあり、 このBookクラスのオブジェクトの配列book_listがあるとします。 book_list内のBookオブジェクトをscoreの高い順に並び替えたいのですが、 自分で考える限り、以下のような感じで力尽きます。 sorted_book_list = [] book_list.each do |b| sorted_book_list.each_with_index do |sb, i| if b.score > sb.score # i番以降の要素を全て一つ後ろにずらす処理がここで必要だが実現できたとしてもパフォーマンスが酷そう。 sorted_book_list[i] = b break end end end もっとスマートな方法があれば教えて頂けないでしょうか。
sorted_book_list = book_list.sort {|a, b| a.score <=> b.score }
Perlだとハッシュテーブルの配列の大きさを keys %hash = 64; と指定できるのですが、Rubyにもそういう機能はありますでしょうか?
>>445 book_list.sort_by {|book| book.score }
>>447 残念ながらない
450 :
445 :2011/03/11(金) 23:34:16.09
>>444 GoFなデザインパターンは、Rubyみたいな後発で動的で完全オブジェクトで
プロックとブロックが跋扈してるような言語ではあまり新鮮な有り難味がないかも
「あーこれ名前ついてたんだー」とか思うことがしばしばある
ちょっとjavascriptに浮気してくる。 ウェブサイトに必須のようだから。
0から99までの数字の配列が欲しいのですが、 i = [0..100] puts i とやっても期待した結果が得られません。 (実行結果=[0..100]) 配列をバラバラにして取得するにはどうすればいいでしょうか?
(0..100).to_a
455 :
デフォルトの名無しさん :2011/03/17(木) 21:05:24.01
0..100 だと 0, 1, 2, ..., 98, 99, 100 になる。 末尾を含まないRangeは 0...100 (ドット3つ)
>>453 (0..99).to_a だな
Range クラスというのがある
開始と終了と succ メソッドの返り値(と比較メソッド)だけ見てる変なクラスだ
457 :
デフォルトの名無しさん :2011/03/17(木) 21:44:20.33
to_a する方法はいろいろあるけど、元のコードに一番近いのは それよりもこれじゃないかと思った。 [*0..99]
[*0...100]
あんまり話題としては取りざたされないけど Rangeクラスって、Rubyの特徴的な機能の一つだよね これも何かほかの言語にあった機能を、Rubyが取り込んだものなんだろうか
460 :
デフォルトの名無しさん :2011/03/18(金) 01:05:24.55
状態を持つ演算子としての .. (...) は Perl 由来。 その状態をRuby以前にオブジェクト化したものがあるかは生憎知らない。
>>453 >i = [0..100]
>puts i
これは
r = 0..100
i = [r]
と同じである、つまり
・「0..100」というRangeオブジェクトが1つだけ入った配列
になる。
0から99までの配列の作り方は
>>454 以降を参照。
Perlだと範囲演算子はリストに展開するからRubyも同様と思ったのかも
何をするかにもよるが、Rubyの場合Rangeのまま使っちゃうのもアリ Rangeもイテレータ呼んだり出来るからね
0..9.to_a って書けるようになったんだっけ? 1.9で演算子?の優先順位が変わったとか。 代わってないか。
465 :
デフォルトの名無しさん :2011/03/18(金) 19:01:44.69
変わってないからみんな括弧つけてるじゃん。
有理数のリテラル
> [*0..99] これどういう意味?
範囲オブジェクトをリストに展開
to_aしてから展開する [*1..3] == [1,2,3] マニュアル見たら [*obj] の説明は無かったが メソッド呼び出しの最後の引数に*をつけると、配列を展開して渡せる それと同じことが 配列リテラルでもできる [0,1,2,*7..9] == [0,1,2,7,8,9] Ruby 1.9からは、ちょっと拡張されて 最後の引数だけじゃなくてどこでもよくなって、複数でも可能に [*1..3,5,*7..9] == [1,2,3,5,7,8,9]
470 :
デフォルトの名無しさん :2011/03/18(金) 23:47:42.59
一時期 to_splat というメソッド名があったのだが、今はないようだ。
>ruby -E utf-16le -e "$stdin.binmode" -e: ASCII incompatible encoding needs binmode (ArgumentError) どうすれば?
それあれだよね、中身としては binmode 以前の $ ruby -E utf-16le -e "" -e: ASCII incompatible encoding needs binmode (ArgumentError) > ruby -E utf-16le -e "" <internal:prelude>:3:in `require': incompatible character encodings: Windows-31J and UTF-16LE (Encoding::CompatibilityError) とか出るのをどうすればいいかという話だよね
まったくのRuby初心者ですが Windowsユーザーの方に質問です みなさんはどのような環境でプログラミングされていますか? RDEやEclipse、NetBeans等いろいろあるので どれを選択すべきか悩んでいます 意見を頂けないでしょうか?
475 :
デフォルトの名無しさん :2011/03/19(土) 14:51:00.17
>>474 基本はVirtualBox上にLinux入れて、自前コンパイルをインストールした環境。
パッケージングシステムとgemの相性が悪いので…
んで、Windows上で使うものの時にはNetBeans + JRubyで。
rawrでexe化が出来るので…。Macのappも作れるよ。
基本的にはエディタとコマンドプロンプトだと思うの IDEがない時代に考えられた言語で、スクリプト単体で動作するように作られてるから 標準入力と標準出力をきちんと把握したあとで (悲しいけどこれ最重要、IDEべったりの人はここで詰まる) IDEがサックサクの環境ならEclipseでいいんでないかね NetBeansが次点人気 RDEはとりあえず初心者は捨てていい あと、Javaや.netのような親切で高度で指一本な連携サポートはできないのでご注意
RubyをIDEで始めてしまうと、実際のスクリプトの実行方法がよくわからないことになるからな… IDE上からは実行できるんですが普通に使う方法がわかりませんというのはFAQに近い エディタとコマンドプロンプトで作って、ある程度納得してから進む道決めたほうがいいかもしれん うまい教科書があるといいんだけど
その手の根性主義はもう流行らないと思う
だって、IDEのRubyサポートって初心者に全然優しくないもの あんなものを最初に触らせること自体「俺ならできる、だからお前もやれ!」という体育会系の思考だわ
あれはJavaとかC++とかでEclipseやNetBeansを使い慣れている人が Rubyでも似たようなことをしたいと思って使うもんだ Ruby初心者には若干厳しく、統合開発環境初心者には鬼だ そのへん見極めて勧めないと逆効果になりかねん
意見を下さった方、ありがとうございました
viとemacsどっちがいいの?
483 :
デフォルトの名無しさん :2011/03/19(土) 16:49:36.59
宗教論争になるので両方試せ。
Emacs → あの Emacs で Ruby スクリプトが書ける Vim → あの Vim で Ruby スクリプトが書ける メリットだと思うほう使え
485 :
471 :2011/03/19(土) 17:32:37.82
>ruby -E utf-16le:utf-8 -e "" で行けた
487 :
471 :2011/03/19(土) 20:28:00.07
ok
[1,2,3,4,5,6].each{|a,b| puts a,b} で、12,34,56と消費するイテレータってないんですか? [[1,2],,,というのはなしで
each_slice
30%の需要があるとのことなので、出てくるかと思ったが、出ないのね。 ありそうなので、探したんだけど、無いから自分で作った。 習い初めのものなので、つっこみはご勘弁。 # 多次元配列と文字列の複製 # dataの値を新しいアドレスを作成して複製 def copy(data) if Array.try_convert(data) == nil String.try_convert(data) ? data.dup : data else (0 ... data.size).map{|i| copy(data[i]) } end end
>>490 Marshal.load(Marshal.dump(data)じゃいやだったの?
つっこみはご勘弁ってならなぜ貼ったのだろう
誤爆だろ 多次元配列はRubyにはない
アドレスもないしな 多次元配列自体は存在できないわけではないんだが、専用にクラス作らんといかんぬ
Ruby の構造的仕様だな obj[x][y][z] が obj[x, y, z] ではなく retx = obj[x] rety = retx[y] retz = rety[z] return retz というレシーバ依存のメソッドチェーンである時点で、もうどうしようもない 単純には諦めてネストした巨大な配列にするしかなく、実用的には NArray gem を使うとかしかないわ
Python の NumPy みたいなものがあればいいんだよね?
>>496 だから NArray ではご不満ですか
本当の意味での多次元配列実現したいならクラス作っちゃうかな
雑魚どもが
ポインタと参照みたいなもんだから そう刺々しくせずに生温かく見守ってあげてください
多次元配列ではないというのは単に言葉尻の問題ではなく実際的な脅威 なんでわざわざ同じように間違えるまで放置しなければならないのかと
いやだってary[0][1]はRuby使いにとってary[0]のそのまた[1]にしか見えないでしょ どこが実際的な脅威なのか不明
なんでもいいんだが、Ruby 次元配列 -"NArray" あたりでぐぐったのはほぼ全部 「ary[0][1]はRuby使いにとってary[0]のそのまた[1]にしか見え」てない実例だと思う
ネストしただけの配列を多次元配列と呼んでいる時点で 「私Rubyわかってませんこれからここで勢いよく躓きますみなさん見ててください」 と言ってるようなもんだろ m = Array.new(3, []) と書いてあったら危険なのと同じ それは違いますそれは動きませんと言ってあげること自体は非難されるべきではない(今回は言い方がアレだが) なんでニヤニヤ笑いながら手を差し伸べずに眺めて失敗してから先輩風吹かせて「いやーそれはねー」とか言うの
>>505 先生、それは単に参照とはなんぞやの問題です
多次元配列以前の問題です
ていうかこれぶっちゃけバグだよね 誰も得しないだろ
>>507 まさに参照の問題じゃない
同じオブジェクトを指すという
うわあバカがいる
配列が出てこない str.gsub(/re/, '\1') とかにしたほうがよかったか
>>505 は具体的な配列の動作の話してるわけじゃないぞ
>>510 誰に言ってるかわからないからアンカつけれ
>>480 IDEはIDEに慣れた人が使う開発環境だよ
特にRubyのようにIDEの利用者が少ないなら、JavaやC#のようにサクサク使えないのを分かった上でIDEに慣れた人が使うものだと思うよ
もしWindowsでC#やVB.netをvimやemacsで開発する人がいたらちと酔狂だなとは思うかもしれないが、慣れている環境というのを差し引くのは難しいよ
俺の結論も
>>475 なんだが
>>474 が初心者なら特に多くの人が使っていない開発環境を積極的に使う理由がないな
趣味でちょっとしたスクリプトを書くのなら何でもいいんだがな
Windowsギライなジジイの押し付けがましい意見は参考にならない。まで読んだ
Windows使いはさっさとNetBeans(RDEその他はよく知らないけど使い物になるなら何でもいい)入れとけ。 コード補完+ステップ実行+変数ウォッチできるだけでも開発効率が段違い。 ruby.exe+テキストエディタな環境と排他でもなんでもないから IDEでパーツ作って残りは従来環境で仕上げてテストする事も普通にできる。 2011年にもなってIDEは是か非かなんてあまりにも不毛すぎるよ。
5年後も同じ論争やってると思うよ。正解なんてないから。
Amazonのレビューだと「たのしいruby」はプログラム自体が初めての者には難易度が高いとのことですが そういった者に向く入門書はないでしょうか 調べてみると「Ruby1はじめてのプログラミング」が良いらしいですがこちらは如何でしょう
>「たのしいruby」はプログラム自体が初めての者には難易度が高い
くっそー誰だそんなやたらピンポイントに的確なレビューしてる奴は
ttp://www.amazon.co.jp/product-reviews/4797357401/ 提供する問題が若干独り善がりであるという指摘は前からうっすらあった
書き換えたの送ったら更新してくれるかなあ
Ruby1ってあれだよねピンクのガゼルの大きいやつ
ttp://www.amazon.co.jp/dp/4798117994/ Rubyの初心者向け薄い本は当人の当たり外れが大き過ぎるので
できれば事前に立ち読みとかしてマッチングしてもらえるとまいっちんぐなことにならないんだが
内容としては普通に初心者向けだと思う
…つまり、下手したら本の半分くらいが自分にとって不要な記述である可能性があるってことだけど
たのしいRubyより前に位置する本であることは保証するよ
1.9に関する記述がなかった気がするが、まあそれは必要になってから上乗せで勉強すればええ
「天気予報サイトの現在の予報マーク(↓こんなの)を表示するライブラリ」を作り、gem で管理したいです
ttp://i.yimg.jp/images/weather/general/forcast/clouds_sun_st.gif この画像をローカルにキャッシュしたいのですが、ディレクトリをどこに置いていいのかわかりません
Otenki::Config とかクラスを作って、ユーザが事前に指定しない場合は動作しない、みたいなのがいいんでしょうか
Otenki::Config.cache_dir = "/home/ch2/otenki/cache" # 必須
Otenki.new.show
インストール先に勝手に gems/otenkiview-0.1.2/cache/ を作ってそこに一律保存する、みたいなのってよくないですよね?
>>519 うーん、現在の天気を調べるクラスは別にいいんだけど
画像までライブラリに含むのはどうかと思うなあ
ライブラリ使う人が違う画像を使いたいと思ったらどうするの?
本来なんて呼ぶのかわからないんだけど、 gems/libname-1.0.0/ のライブラリホームにスクリプトが書き込むのはよろしくないな パーミッションの関係で書き込めないことが多いし、スーパーユーザーで書き込んだら上書きできない 永続的な設定ファイルとかをどうしようかというのはみんな悩んでるんだけどね
ライブラリが書き込むディレクトリはユーザーに手動で指定させるしかあんめえ いつのまにか $HOME/.otenki/cache/ みたいなのを作る糞ライブラリもあるけどな
523 :
デフォルトの名無しさん :2011/03/23(水) 20:18:16.60
インストール時にgemが参照する第三者のリソースもディプロイしたい、 という話ではないのか。 ↑なら post_install フックでやりゃいいんだけど。
cache なので、たぶん doc = Nokogiri.parse(open(天気予報サイト).read) yohou_text = doc.at('今日の天気文字列').inner_text mark_src = doc.at('img/今日の天気マーク')['src'] local_cache = @cache_dir + File.basename(mark_src) File.open(local_cache, 'w'){|f| f.print(open(mark_src).read)} unless File.exist?(local_cache) puts <<EOS <title>今日のお天気</title> <img src="file://#{local_cache}"> 今日の天気は#{yohou_text}です! EOS とかやるんじゃないの で、@cache_dir の初期値をどうしましょうと ライブラリが共通で使うなら gem インストール時になんか適当に自動で GET すればいいじゃんね
shareディレクトリとかどう? Linux使ったことないから、こういう目的にshareを使って良いものなのかどうかわからないけど
526 :
デフォルトの名無しさん :2011/03/24(木) 01:33:01.49
運用状況により容量可変となるディレクトリだから、shareじゃなくて、/var/libじゃね? ただ、ふと考えてみたら、他のユーザーが使った後にはシステムデフォルトの画像が変わってるかもしれないって、 結構、嫌な仕様じゃね?
お前らはWebブラウザのキャッシュをログインユーザー全員で使い回す気なのかと小一時間 まあ、そういうような共用読み書きディレクトリの指定方法がないのも確かなんだが Webのキャッシュって言ったら普通はログインユーザーごとに個別だろ、普通は 意外とこのへんの基本設定のデファクトって固まってないのね
ユーザーに設定で指定させるのが普通だろ 指定されてなかったらデフォルト使うのではなくエラーで止める ユーザーが指定しなくても適当にクラスをnewしてgetするだけで 適当にホームにディレクトリ掘って永続保存してあら便利、みたいなのはキモいのでやめるべき
> 「天気予報サイトの現在の予報マーク(↓こんなの)を表示するライブラリ」 そもそもこれはキャッシュなのか
いろいろ動作説明が足りないのは間違いないな てかそこを突っ込んでどうする
>>530 ライブラリ動作用のユーザーディレクトリ位置なんてうまい固定回答がない分野なので、
初心者スレとしてはもうそこらへん突っ込むしかないのよ
知りませんってレスするわけにはいかないだろプライドとしてw
どこそこにフォルダを作ってくれって言われただけで思考停止する情弱もいるし ホームディレクトリに勝手に設定ファイル作るソフト排除してたら何も出来ないよ 俺はユーザの指定が無いならホームに勝手に作っていいと思う派
少なくとも gem ライブラリを使用するようなユーザーは プログラミングが可能な程度のPCリテラシ持ちだとみなしてよいでそ ほとんど存在しないものに対してコストをかけるこことほど間抜けなものもない
>>532 セキュリティ考えろよカス、ユーザに確認とれメンテ苦労するわ
2KBの自分用スクリプト書くのに半日ほどかかった Ruby始めて4年くらいなのだがなんか絶望した
別に良いんじゃね、自分用なんだしそんな気に病むこともねえべ
単体テストつきとかなら別にいいんじゃね 無軌道に書いて半日とかはさすがになんかちょっとアレだが
>>534 セキュリティって何ですか?おいしいの?
>>519 のプログラムがセキュリティを確保するにはどうしたらいいの?
539 :
デフォルトの名無しさん :2011/03/24(木) 21:37:41.15
まぁ、ユーザーが自分で掘っていたディレクトリと名前がかぶったら 悲惨だよね。
テストの話が出てたので expected ってリテラルのような実際の値で書くべきだよね? def arr_change(arr) arrを標準メソッドでアレしてコレした配列 end に対して expected = arrを標準メソッドでアレしてコレした配列 arr_change(arr).should eql(expected) というテスト書いても実際的な意味はないですよね expected = [741, 332, 93, (中略), 23140, 9847, 30994, 4, 43098] arr_change(arr).should eql(expected) と、若干長いリテラルになったとしても書くべきですよね
>>541 知らないな
アプリケーションがホームにディレクトリ掘ったりファイル作ったりするだけで
破綻してしまうようなセキュリティてどんなん
もちろんそのアプリケーションが悪意を持って作られたってんなら話は別だが
>>534 一応言っておくと俺は
>>532 で「ユーザの指定が無いなら」と前置きしてるんだから
ユーザに確認しなくてもセキュリティが確保できる方法を示してくれよ
人の事をカス呼ばわりするんだからそれくらい出来るだろう?
どんだけファビョってんだよ
知らないなら、人を批判する立場ではない 5年後に自分の文章を読んでみろ、カスと呼ばれた意味がわかる 俺は教えない
セキュリティとか言いたいだけのカスだもんな
知らない事は教えられんわな
せっかくだから俺が
>>519 のプログラムを作るならこのようにするってのを書いとく
(gemはOSのパッケージシステム使ってて意識した事無いんで考慮してない)
ライブラリの提供する機能は指定場所日時の天気をSymbolやStringで返すだけ。
問題の画像ファイルはそのライブラリを使用するアプリケーションが用意する。
利用者に同じ画像ファイルを使わせるために配布物の中にあらかじめ納めておく。
用意できず他所から持ってくるならインストール時にユーザに確認を取ってからやるか
手動でダウンロードさせる。
各ユーザの設定ファイルでファイルの場所を指定するのも良いだろう。
どっちにしてもキャッシュやセキュリティ等の問題は発生しない。
インストールというフェイズが存在する gem ライブラリであるというのが この場合はかなり大きなウェイト占めてると思うんだが
個人的には妥当な線として 1.ネットワーク上のリソースだろうが、ローカルなリソースだろうか同一メソッドで統一したアクセスを可能にする 2.ローカルリソースはライブラリじゃなくて、アプリ側に準備して貰う(サンプルをドキュメントに添付すれば一応標準リソース) 3.ネットワーク上のリソースアクセスに関しては、トラフィックを減らしたいならプロキシでなんとかして貰う(アプリがローカルに落としても良いが…) まぁ、全部ライブラリで面倒見ようとするからメンドクサイので有って、可変部分ならアプリ側に任せるのが筋じゃね?
復活させた。なぜ死んだのか 20秒以内前 TweetIrcGatewayから # あっ、このまま起き続けて死ぬ死んでる 1分未満前 TweetIrcGatewayから Load Averageがこの時間帯に1くらいまで上昇してた 8分前 DoS食らってる 31分前 TweetIrcGatewayから
>>546 ライブラリのあるディレクトリにユーザーが書き込みできない可能性が高いからね…
ユーザーが持つべきデータのディレクトリは
ユーザーが明示的に指定するまで使わない/動かないのがいちばんいいような気がする
一般GUIアプリケーションならホームに適当にディレクトリ掘っても許されそうだけど、ライブラリじゃねえ
初心者が絶えて久しいな
初心者の質問してよいですか? File.readlines(filename) IO.readlines(filename) File.open(filename).readlines このようなreadlinesでファイルをよむと得られた配列の要素に改行が含まれるのですがこの動作は想定されたものなのでしょうか? 配列の要素に改行が欲しくないのでつい File.read(filename).split("\n") としていてこれはこれでわかりやすいのですが釈然としません readlinesは本来はどのような時つかうものなのでしょうか? ruby 1.9.2-p180です
line なんだからそりゃ改行つきだろう 行改の直後から行改の直後までが「行」だ ただ、この正確な動作はあまり直感的ではなく文句がつきまくったので String#lines という改行抜きで配列にするメソッドが 1.9 と 1.8.7 についた
チョップすればいんじゃね
554 :
デフォルトの名無しさん :2011/03/25(金) 15:41:59.47
RUBY_DESCRIPTION=> "ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin9]" # String#lines で Enumerator が返る。 File.read('/etc/passwd').lines.class => Enumerable::Enumerator # Enumerator なのでそのままいろいろ出来る。 File.read('/etc/passwd').lines.grep(/root/).first => "root:*:0:0:System Administrator:/var/root:/bin/sah\n" # 配列でないと出来ないことをやりたい場合は to_a すべし。 irb(main):003:0> File.read('/etc/passwd').lines.shuffle NoMethodError: undefined method `shuffle' irb(main):004:0> File.read('/etc/passwd').lines.to_a.shuffle => (略) 尚、各行は改行そのまま。不要なら map(&:chomp) する。
> String#lines という改行抜きで配列にするメソッドが 1.9 と 1.8.7 についた 俺の1.9.2には付いてないみたいだ
ありがとうございます そういうものなのですね chompするなりすることにします
Loggerってスレッドセーフですか?
558 :
デフォルトの名無しさん :2011/03/27(日) 10:37:04.69
write時に@mutex.synchronizeしてるからスレッドセーフなんじゃね?
おお、ほんとだ。助かった。
rubyフォージ?(スペル忘れた)いいですね 常に最新版が提供されてていいですね 公式サイトで紹介されてる国内の配布サイトのは古いのばっかりでやる気を感じられない
表示系ライブラリはスレッドセーフとか考えないと駄目なのかなあ めんどくさいなあ
自作ライブラリがスレッド上で動作する可能性を織り込んで対策するようになれば初級脱出
Rubyのスレッドはよーく考えてセッティングしないと逆に遅くなるので嫌い
>>560 何の最新版かしらんが
rubyフォージよりも最新版を見たければrubygems.orgやgithub見ておけばいいんでないの
>>564 単にRAAが打ち捨てられただけなのでは?
すみません余所にも書いたのですが返事がなかったためここでも質問させていただきます。
RubyをEmacsで使おうとして苦戦しております。
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=Emacs このサイトにて、
「Debianの"ruby-elisp.deb"のようにパッケージが利用できるなら、
それをインストールする。ソースからビルドした場合などは、
適当な場所(たとえば~/site-lispなど)にmisc/*.elをコピーする。
そして~/.emacsに次のように書いておく」
と書いてあります。
最後の部分は恐らくパスを追加するということなのだと思うのですが、
私はパスを追加するとはコントロールパネルから辿って行って、絶対パスを
ペーストするやり方しか知らないので、ここがよくわかりません。
~/.emacsって言うのはどこを指していて、どうやって書き込めばいいのでしょうか?
そのチルダはホームディレクトリのことだけど EmacsやるまえにLinux入門みたいなの一冊買ったほうがいいよ
Emacsを勉強するかRubyを勉強するかどっちか片方だけにしておけ Emacsの知識がないならRubyに慣れるまではとりあえずふつうのエディタ使え
~ってのはホームディレクトリ。 ababaさんがログインしたらだいたい、 /home/ababa それか env | grep HOME= としてみてもわかる。 そこに、,emacsっていう名前のファイルがあればそれを編集。
Windowsの予感!
…ぬ、ぬう…… Windows版Emacs(というかXEmacs)にはイヤな思い出しかないんだが とりあえず、そのサイトはWindowsを対象にしてないのは確かだ
572 :
566 :2011/03/29(火) 19:33:14.48
みなさんご親切にありがとうございました。 なんとかやってみます。
573 :
566 :2011/03/29(火) 19:34:06.79
あ、windowsでやってます。 使いにくいのでcygwin使ってるんですが、ちょっと仕様が違ったりするんですかね??
日本でサマータイムが導入されたらどう対応したらいいんですか?
>>573 仕様っつーか、ちょっとしたトラブルとかのときに
Cygwinの問題なのかWindowsの問題なのかソフトの問題なのかよーわからんことになる。
576 :
566 :2011/03/29(火) 20:54:38.03
>>575 (´・ω・`)え。。
(´・ω・,';,';,',
(´・ω,';,';,',
(´・ω・,';,';,',
(`・ω・´)仕方ないのでこのままがんばってみます!
meadowってやつで頑張ってみます!ありがとうございました!
普通のテキストエディタでいいじゃない
ノーパソ使ってるとemacsのほうが結局使いやすいかも。 導入時に多少てこずったとしても。
Rubyの導入したくご教示お願いします
Windowsを利用してます
Apache2.2も入れてます
主に日々の作業を自動化する目的で利用するのとCGIの勉強用途に利用します
http://rubyinstaller.org/downloads/からRuby 1.8.7-p334をダウンロードしてインストールしました
gem update --systemでgemは1.6.2にアップデートできました
ほかに何かインストールや設定するものはございますでしょうか?
RedmineとRuby on railsも入れてみたいなと思うのですが
ApacheのドキュメントルートがC:\www\docroot\で
ユーザーディレクトリがC:\user\*\public_htmlとなっております(*の部分は適当に付けたユーザー名が入ります)
gemでインストールする場合はユーザーディレクトリに入れて動かしたいのですがディレクトリの指定は可能でしょうか?
Rails使う場合は全部をRails風にしたほうがいいと思う
RailsとCGIはあんまり相容れないから
Railsのお話はこちら
ttp://hibari.2ch.net/test/read.cgi/php/1292032736/ Apache さんが使う gem は Apache さん用にインストールするか
gem をシステムワイドにインストールして Apache さんに使わせるかだと思う
gem はユーザーのホームに .gemrc があればそれを読むので
そこに gem: "--user-install" とでも書いとけ
前スレ1〜10ぐらい昔にputで文字列を出力するのがイヤで引退した者です 昔からprintとpってありました? put、print、pの違いが分かりません
コマンドラインからruby -Ks test.rbとして呼び出すのを この-Ksをファイルの中に書いてruby test.rbで呼ぶ方法を教えてください
>>581 >>11 >>582 スクリプトの1行目に適当に
#!ruby -Ks
と書いておくというのはどう
あらゆる環境で動作するかどうかは保証できないけど
$KCODE を使う場合は
$KCODE = "s"
load "./test.rb"
と書いた main.rb を ruby main.rb で呼ぶとかそういう小細工が必要
winならバッチにするとか ruby -Ks -x "%~0" goto :eof #!ruby
for i in 1..10 print rand(3)+1, "\n" end どうもRubyの乱数生成は偏りがある感じがあるのですが 良い乱数生成方法はございますか?
>>586 その結果を見てわかるようなレベルの偏りは存在しない
>>586 Rubyの乱数はMTだからそんなに粗悪な値は出ないはずだけど
常に偏らない値が欲しいならこんなんにするしかない
乱数生成とは又違う話だけど
[1,1,1,2,2,2,3,3,3,rand(3)+1].shuffle
確かに、サイコロ5回振って1が3回出ても怒らないのに 1から6までの乱数を返すルーチンで1が3回返ったら怒る人は稀にいる 乱数による各々の出目は平均的でなければならないんだってさ
いまさらながら、確率ってなんか不思議だな。 サイコロ振りまくったら、出目ごとの出た回数が平均的になっていくなんて。
スゴロクで1が連続で出ると萎えるじゃん
592 :
デフォルトの名無しさん :2011/03/30(水) 14:20:03.56
複数回の試行を1事象としてみたとき、 偏って同じ目が出るという事象も 平均して出るという事象も ぜんぜん出ないという事象も 生じる。
Ruby 1.8.7 です。
以下のようなフォームでメールアドレスを入力し「次へ進む」を押すと、
登録完了メールがユーザに届くプログラムを作成中です。
<form method='post' action='test.rb'>
<input type='text' name='email'>
<input type='submit' value='次へ進む'>
</form>
メールを送る機能は既に完成し、メールの送信自体は行えているのですが
上記のフォームを実際に使用してみると Internal Server Error と表示されてしまいます。
また、エラーが発生するにも関わらずメールは意図したとおりのアドレスに送信されます。
作成して利用しているスクリプトの概要は以下のとおりです。
mail = TMail::Mail.new
mail.to = '
[email protected] '
mail.from = '
[email protected] '
mail.subject = '登録完了'.tojis
mail.date = Time.now
mail.mime_version = '1.0'
mail.set_content_type 'text', 'plain', {'charset'=>'iso-2022-jp'}
mail.body = ('登録完了いたしました').tojis
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.sendmail(mail.encoded, mail.from, mail.to)
}
何が原因なのでしょうか?なにかおわかりになる方がいらっしゃれば、助言お願い致します。
他のやり方でやってみたら? 俺昔どうやってたかな?と調べたら以下のようにやってた。 kconv使うかどうかはさておき、他のパラメータの与え方はこんなもん。 これで十分? mailbody = Kconv.tojis(mailbody) Net::SMTP.start(smtphost, smtpport) {|smtp| src = <<EndOfMail From: #{mailfromaddr} To: #{mailtoaddr} Subject: #{subject} Content-Transfer-Encoding: 7bit Content-Type: Text/Plain; charset=iso-2022-jp #{mailbody} EndOfMail smtp.send_mail src, mailfromaddr, mailtoaddr }
595 :
Perl忍者 ◆M5ZWRnXOj6 :2011/03/30(水) 18:18:56.42
お前がバカだからだよ原因は
596 :
デフォルトの名無しさん :2011/03/30(水) 18:24:59.21
>>593 HTTPレスポンスとしてはどういうものを返しているの?
ちゃんと200が返るようになってるの?
>>594 確か自分も以前そのやり方でやろうとしていたんですが、
そのやり方でのユーザ名とパスワードの設定方法が
わかんなくて今のやり方に行き着いたような気がします。
でも、他のやり方を探してみるのはありですね。
ちょっとやってみます。ありがとうございます。
>>596 ありがとうございます。
正しいやり方なのかどうかはわからないのですが、
先ほどのスクリプトの末尾に
print "Content-Type: text/html\n\n"
print "OK"
のようにやってみたりはしました。
我流?というか常識的なところを理解してません、
正しいやり方を教えていただけるとありがたいです。
>>593 >上記のフォームを実際に使用してみると Internal Server Error と表示されてしまいます。
うん、
……ってそれで終わりかよ!
Internal Server Error ってことは Apache のログにエラーの出力があるだろそれ読めよ!
思いっきり補完すると
「ローカルで問題なく動作するスクリプトをサーバに設置するとなぜか動作しません」
なわけで、そりゃサーバ側の環境が悪いんじゃないん、というお話に
HTTP サーバのエラーログあたりに原因究明の鍵というかそのまま答が表示されてるはずなんだけど
たぶんそれを読む権限がなく、HTTP サーバがどうやって Ruby を実行してるか調べることもできないと推測
おまけにそれの原因は
>>593 に書いたスクリプト以外の部分にあると
$SAFE=1 と先頭に書いた上でローカルでスクリプト実行してたらなにか warning が出るかも
CGI がファイル作成できるのなら、$stderr を捻じ曲げてファイル出力にしてサーバ実行するとなにか書いてあるかも
$stderr = File.open('error.txt') と先頭に書いて error.txt を実行後に読んでみるとか
× $stderr = File.open('error.txt') ○ $stderr = File.open('error.txt', 'w')
>>598 >>599 >>600 ありがとうございます!
ご教授いただいたとおりにやってみましたので報告致します。
まずは Apache のエラーログを見てみました。
が、以下のように表示されているだけでした。
Premature end of script headers:test.rb, referer:
http://foo/bar.html とりあえずここに有益な情報はないと判断しました。
つぎに「HTTP サーバがどうやって Ruby を実行してるか調べることもできない」という部分ですが、
具体的に何をどうすればよいのかがわからなかったので保留させていただきました。
つぎに「先頭に」$SAFE=1 と $stderr = File.open('error.txt', 'w') を書き足した上で、
ローカルでスクリプトを実行してみました。
この「先頭に」の位置ですが、
#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.
(ここ)
require "rubygems"
require "cgi"
require "tmail"
require "net/smtp"
と判断しました。
再度ローカルにてスクリプトを実行した結果、出力されたエラーは以下のとおりでした。 C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/defaults.rb:43:in `exist?': Insecure operation - exist? (SecurityError) from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/defaults.rb:43:in `default_path' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:726:in `path' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:57:in `installed_spec_directories' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:47:in `from_installed_gems' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:1025:in `source_index' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/gem_path_searcher.rb:135:in `init_gemspecs' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/gem_path_searcher.rb:14:in `initialize' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:984:in `new' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:984:in `searcher' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:206:in `try_activate' from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:57:in `require' from test.rb:9 ちなみに require 以下に $SAFE=1 と $stderr = File.open('error.txt', 'w') を書き足した場合は 特にエラーは出力されませんでした。
一番肝心な「エラー出力先をファイルにした上でサーバで実行」がないぞ
ローカルで$SAFEを上げて実行してセキュリティエラーが出るのはそりゃ当たり前
というか、もしかして
>>596 の言うように HTTP としてのレスポンスが何もないだけなんじゃ…
CGI なんだから、リクエストに対して返すレスポンスのステータスが空文字列だとまずい
適当な「メール送信しましたありがとうございます」なHTMLを返すとかにしておけ
こういうときのステータスって201?
>>606 「○○さんありがとう! トップに戻る」というカスタムなHTMLを返したいなら200
ブラウザ真っ白の空っぽのボディでいいなら201か202
静的な「ご利用ありがとうございました.html」に飛ばすだけなら302
>>605 申しわけありません、報告し忘れていました。
サーバ上で実行=ブラウザでアクセス と思ってよろしいでしょうか??
もしそうであればファイル error.txt に出力された内容は、上記のエラー内容と全く同じでした。
レスポンスに関してなのですが
>>597 で書いたようにこのスクリプトの末尾に
print "Content-Type: text/html\n\n"
print "OK"
や
header = cgi.header({"charset"=>"Shift-JIS"})
puts header
puts <<-EOS
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=Shift-JIS'/>
<meta http-equiv='Content-Language' content='ja'/>
<title>test</title>
</head>
<body>
<p>OK</p>
</body>
</html>
などとやってはみているのですが、現状うまくいっておりません。
なにか間違っているのでしょうか??
サーバ上で$SAFE=1にしても同じなのは当然だろ…
わかってない人同士が混乱してるなw
CGI は HTTP レスポンスを「返さなければならない」
200 でいいから返しておけ
返し方わからないなら今日は作るの諦めろ
サーバの CGI が $SAFE=1 で実行されている場合、
PATH がワールドに対して読み書き可能になっていると、
require でセキュリティエラーが出ることがある
ttp://www.ruby-lang.org/ja/man/html/_A5BBA5ADA5E5A5EAA5C6A5A3A5E2A5C7A5EB.html gem の変数が環境変数由来なので、たぶんここでもセキュリティエラーが出る可能性がある
warn $SAFE をどっかに書いてサーバで実行して値確かめて、0以外が表示されたら $SAFE が原因
スクリプトの本体は実行されてるそうなので、最終的な HTTP レスポンスをうまく返せてない説に一票
NPH で実行されてて、自前で HTTP ステータスを書き出さないといけないのだろう
print "HTTP/1.1 200 OK\r\n"
print "Content-Type: text/html\r\n\r\n"
print "<html>done.</html>"
そもそもCGIでページを表示させるのはできてるの? cgi = CGI.new cgi.out({"type" => "text/html", "charset" => "shift_jis"}) { <<END あばば END } メールと組み合わせず、まず表示だけやってみたら?
>>611 ありがとうございます、表示はできています。
>>593 の
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.sendmail(mail.encoded, mail.from, mail.to)
}
のところをコメントアウトして、代わりに
>>611 のような適当な HTML を
表示させるような命令を書けば普通に表示されます。
なので
>>610 の NPH で〜というのも恐らく違うのではないかと思います。
実際に「自前で HTTP ステータスを書き出す」というやつも試してみましたが、
うまくいきませんでしたし…。
>>610 さん、本当にありがとうございます。
先ほどからお話にあがっている $SAFE というものについて調べてみようと思います。
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
}
これだけにしてうまくいってる?startのパラメータは正しい?
> のところをコメントアウトして、代わりに
>>611 のような適当な HTML を
そもそも、コメントアウトしたらまずいんじゃない?
なんらかの表示をさせてる?
なんらかの表示をさせなきゃ、
Premature end of script headers:test.rb,
って出るのも当然かも。
>>613 >>611 で「メールと組み合わせず、まず表示だけやってみたら?」とのことだったので、
「表示だけなら出来てますよ」と回答したつもりだったのですが…。
もしずれたことを言っていたら申し訳無いです…。
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
}
これだけにしてうまくいってる?startのパラメータは正しい?
というのは、
smtp.sendmail(mail.encoded, mail.from, mail.to)
を外したら表示がうまくいくかということでしょうか??
とりあえずやってみましたが表示はうまくいきません。
パラメータに関してですが、いちおうメールの送信は正常に出来てはいますので、
今のところは正しいのではないかと判断しています。
わたしの未熟さゆえ、アドバイスの意味が理解出来ていない可能性がありますが、
ありがとうございます。
> パラメータに関してですが、いちおうメールの送信は正常に出来てはいますので、
なるほど。Net::SMTP.startのブロックは正しく動いてると。
>
>>611 で「メールと組み合わせず、まず表示だけやってみたら?」とのことだったので、
> 「表示だけなら出来てますよ」と回答したつもりだったのですが…。
いえ、それについてはこちらが早とちりしたかも。うん、了解。テスト了解、その次の話。
一般的に、エラーメッセージを得たら、それをコピーしてそのままぐぐりって学ぶのが正解。
Premature end of script headersでぐぐったらいっぱい情報を得れると思う。
メッセージの意味
cgiプログラムがContent-Type ヘッダを出力する前に終了した
だから、メール送信をさせようとしたときも、なんらかの出力をして、
そのうえでスクリプトが終わるようにしないといけないんでは? という話。
>>610 再度ご報告。
スクリプトのいろんな箇所に warn $SAFE と書いて
実行してみましたが error.txt に出力されたのは 0 のみでした。
(いちおう申告、先頭の $SAFE=1 はコメントアウトしました)
ありがとうございます。
>>613 の1段落目と2段落目は別の話だな
>>610 にもあるが、CGI は HTTP のレスポンスを絶対に返さなければならない
「メール送るだけの CGI だからメールだけ送って終わり」ということはできない
Web ブラウザ経由で指示をしたなら、なんらかの返事をブラウザへ返さないと Web サーバはエラーとみなす
"Premature end of script headers" と Web サーバに記録されるエラーは典型的で、
・ Web ブラウザに返す返事の(HTTP 1.1/200 OK 等の)前に CGI がエラーや警告を出して混ざってわけわかめ
・ Web ブラウザに返す返事が、そもそも HTTP ステータスすら 1文字もない
のどちらかのときによく起こる
絶対に後者ではないという確証が得られてから、前者の CGI 本体のエラー潰しをする
HTTP 1.1/200 OK だの Content-Type: text/html だの、cgi.out だのの表示をしろというのは症状チェック用ではない
そもそもの CGI 動作に必須なものだ
>>615 >>617 ありがとうございます。
誤解を与えてしまっていたようで申しわけありません。
たぶん私が「200 を返す」が何を指しているのか、
はっきり確信出来ていなかったのが原因なのではないかと思います。
テスト用などではなく、必須という認識は一応あるので、スクリプトの末尾には必ず
「HTTP 1.1/200 OK だの Content-Type: text/html だの、cgi.out だの」は表示しています。
わたしの最初の書き込みが
>>593 なのですが、このソースの直後に
print "Content-Type: text/html\n\n"
print "<html>OK</html>"
のように必ず書いています。
現在の状況を私の見解でまとめてみます。
上記の「200 を返す」文を加えたソースを使用しても、
メールは飛ぶのですがブラウザには Internal Server Error と表示されます。
エラーの内容は Premature end of script headers です。
メールは飛ぶのでメールのところのプログラムは正常なのかな、と思いたいのですが
>>612 に書いたようにメールの部分3行をコメントアウトして実行すると、
当然メールは飛ばないのですがページ(<html>OK</html>)は表示されます。
メール部分は正常に動いているように思えるのに、疑わしいのもメール部分なのかな…
と、勝手に思っております。みなさま、どう思われるでしょうか?
なるほど。メール部分三行を生かすと、ページは表示されないと? メールを送ったあとにスクリプトが異常終了してるのかな? begin メール部分三行 rescue => exc print "Content-Type: text/html\n\n" print "<html>#{exc}</html>" end みたいに一度してみたら?
>>619 ありがとうございます。
試してみたのですが変わらず…です。
うーん…。
>>619 で「メールを送ったあとにスクリプトが異常終了してるのかな?」と言われた件を検証してみました。
と言っても
begin
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
rescue => exc
print "Content-Type: text/html\n\n"
print "<html>#{exc}</html>"
end
print "Content-Type: text/html\n\n"
puts <<-EOS
<html>
<body>
<p>OK</p>
</body>
</html>
EOS
としただけなのですが。
結果、一度の実行で2通メールが送られてきました。
どういうことなのでしょうかw もう謎が深まるばかりです…。
二通?? えーっw print "Content-Type: text/html\n\n" s = 'OK' begin Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp| smtp.send_mail(mail.encoded, mail.from, mail.to) } rescue => exc s = exc.inspect ensure puts <<-EOS <html> <body> <p>OK</p> </body> </html> EOS end みたいにしてContent-Typeを必ず出してみるとか。
おっと。 <p>#{s}</p> で。
>>622 あ、すみません。
begin
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
rescue => exc
print "Content-Type: text/html\n\n"
print "<html>#{exc}</html>"
end
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
print "Content-Type: text/html\n\n"
puts <<-EOS
<html>
<body>
<p>OK</p>
</body>
</html>
EOS
の間違いでした。
もしメールを送信した直後に異常終了してるなら、
2回目の送信が行われるわけないと思ったわけです。
>>622 うーん、試してみたがやはりだめです…。
なんども申し訳ない。ありがとうございます(涙)
ところで print "Content-Type: text/html\n\n" って\nだけでいいの? \r\n\r\nじゃないのかな WindowsでRubyで遊んでるだけの私にはWebサーバーのことはよくわからんけど OSとかWebサーバーが何なのかとか、手元にサーバーがあるのかとか サーバーの環境をもっと詳しく書かないとアドバイスしにくいんじゃないのかな
>>610 ,617
200 OKはWebサーバ側で勝手に付け加えてくれるよ
もしCGIスクリプト側でつけるのが必須なのであれば
print "Content-Type: text/html\n\n"
print "<p>hello, ruby cgi!</p>"
すら動かない
>>626 ApacheならLFしかなくてもCR LFに直してくれるよ
他も似たようなものじゃないか
content-type出力の前後でerror.txtに何かメッセージを出力してみたら?
ところで
>>624 を見る限り2通送られるのは正常じゃないか
メール送信処理がふたつ書いてあってどっちも実行されてるんだろうから
1通だけ送りたいのなら2番目のNet::SMTP...を削れば済むような
というわけでこんな感じか begin Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp| smtp.send_mail(mail.encoded, mail.from, mail.to) } print "Content-Type: text/html\n\n" print "<p>OK</p>" rescue => exc print "Content-Type: text/html\n\n" print "<p>exception raised</p>" end
てゆーか、実行の余分なコストはゼロなんだろうし、 エラーが出なくなるまでスクリプトの内容削っていけばいいのに もし10行くらいになってもエラーが消えなければ、個人情報がない範囲でスレに書け
>>629 もしメールを送信した直後に異常終了してるなら、
2回目の送信が行われるわけないと思ったわけです。
>>632 なるほど了解
ただ
>>624 だと一回目のメール送信直後に例外が発生した場合にややこしい
とりあえず確認すべきはprint "Content-Type: text/html\n\n"の前に
標準出力に何か出力していないかどうか。あとは
>>631 の言う通り
) ( ,, ) ) ゙ミ;;;;;,_ ( ミ;;;;;;;;、;:..,,.,,,,, i;i;i;i; '',',;^′..ヽ ゙ゞy、、;:..、) } .¨.、,_,,、_,,r_,ノ′ /;:;":;.:;";i; '',',;;;_~;;;′.ヽ ゙{y、、;:...:,:.:.、;:..:,:.:. ._ 、} ".¨ー=v ''‐ .:v、,,、_,r_,ノ′ /;i;i; '',',;;;_~⌒¨;;;;;;;;ヾ.ミ゙´゙^′..ヽ ゙{y、、;:...:,:.:.、;、;:.:,:.:. ._ .、) 、} ".¨ー=v ''‐ .:v、冫_._ .、,_,,、_,,r_,ノ′ /i;i; '',',;;;_~υ⌒¨;;;;;;;;ヾ.ミ゙´゙^′.ソ.ヽ ゙{y、、;:..ゞ.:,:.:.、;:.ミ.:,:.:. ._υ゚o,,'.、) 、} ヾ,,..;::;;;::,;,::;):;:;:; .:v、冫_._ .、,_,,、_,,r_,ノ′
みなさんありがとうございます。
>>631 >>633 10行にはならなかったんですが、スクリプトの頭からお尻までが↓です
#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.
require "rubygems"
require "cgi"
require "tmail"
require "net/smtp"
mail = TMail::Mail.new
mail.to = "
[email protected] "
mail.from = "
[email protected] "
mail.subject = "test title".tojis
mail.date = Time.now
mail.mime_version = "1.0"
mail.set_content_type "text", "plain", {"charset"=>"iso-2022-jp"}
mail.body = "test body".tojis
Net::SMTP.start("foo.bar.jp", 25, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
print "Content-Type: text/html\n\n"
print "<html>OK</html>"
>>626 ありがとうございます、たしかにそうかもしれません。
環境は
OS は Windows7 の 64bit
サーバーは Apache 2.2.16 (Win32)
Ruby のバージョンは 1.8.7
自分の PC に Apache インストールしていろいろやってるかんじです。
よろしくおねがいします。
メールは tmail を使用する必要は必ずしもない
これだと rubygems と tmail が不要になる
cgi ライブラリも使用してないようなので外した
これで駄目な場合は…
#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.
require "net/smtp"
from = "
[email protected] "
to = "
[email protected] "
mail_body = <<EOM
Date: Fri, 1 Apr 2011 10:03:27 +0900
From: #{from}
To: #{to}
Subject: test title
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
test body
EOM
Net::SMTP.start("foo.bar.jp", 25, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail_body, from, to)
}
print "Content-Type: text/html\n\n"
print "<html>OK</html>"
というか外部にSMTP接続してるのね
Net::SMTP ってなにか警告出すことってあったっけ
>>637 ありがとうございます。
試してみましたが、やはりうまくいきません。
今までと同じでメールは送信されるのですが、ページが表示されません。
プログラム云々ではなく、環境の問題なのでしょうか…?
>cgi ライブラリも使用してないようなので外した 今回は頼ったほうがいいような気がする ていうか print "HTTP/1.1 200 OK\r\n" は書いても害はないだろ サーバ設定上不要だったら最初から全体がテキストとして余分に表示されるだけだ そのとき改めて外せばいい
>>635 の最初と最後の二行ずつだけにしたスクリプトがエラーになるなら
ruby.exe の場所間違ってるか apache の設定じゃないかな
>>640 >>612 に書いたようにメールの部分3行をコメントアウトして実行すると、
当然メールは飛ばないのですがページ(<html>OK</html>)は表示されます。
>>635 メール送信を、表示のあとにもってきたら?
>>641 CGIスクリプトとしてではなく単にコマンドラインから
C:\>ruby
>>637 のスクリプト.rb
とかしたらどうなるか試してみた?
>>642 うーん、それでもだめでした…。
ありがとうございます。
>>643 はい、それだとエラーも出ずうまくいきます。
ありがとうございます。
windowsです gemでインストールしたライブラリってどこのフォルダにインストールされるのですか?
>>645 ruby -rubygems -e "p Gem.dir" で表示されたディレクトリの中
cache/ と doc/ と gems/ と specifications/ の4つのディレクトリを(通常は)すべて使う
>>646 ありがとうございます
確認dけいました
おなかすいた
#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.
from = "
[email protected] "
to = "
[email protected] "
mail_body = <<EOM
Date: Fri, 1 Apr 2011 10:03:27 +0900
From: #{from}
To: #{to}
Subject: test title
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
test body
EOM
@error = []
begin
require "net/smtp"
Net::SMTP.start("foo.bar.jp", 25, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail_body, from, to)
}
rescue Exception => ex
File.open('smp_error.txt', 'w'){|f| f.puts ex.backtrace }
@error << ex.backtrace
end
print "HTTP/1.1 200 OK\n"
print "Content-Type: text/plain\n\n"
puts @error
>>644 です
問題がすべて解決したわけではないのですが、大きな進展がありましたのでご報告致します。
今まで Windows 7 上で Apache2.2.16 / Ruby 1.8.7 を動かして開発をしてきたのですが、
今回手元にあった Windows XP に Apache2.2.17 と Ruby 1.8.7 をインストールし、
問題のスクリプトを実行してみたところ、正常に HTML のページが表示されました。
何が原因なのかは依然わかりませんが、皆さまのご協力のおかげで解決に一歩近づけました。
ありがとうございます、心より感謝致しております。
というかwindows用apacheって都市伝説かと思ってた。 実際に動かしている人がいるとは驚きだ。
>>648 できるのであればなにかごちそうしたいです。
ありがとうございます。
実行してみたのですが 7 でも XP でも動作しませんでした。
ただし XP の方では
print "HTTP/1.1 200 OK\n"
この行を削除すると正常に動作し、ページも表示されました。
また、どちらの OS でも smp_error.txt というファイルは作成されませんでした。
>>650 Windows での情報が少ないな、とは思っていたのですがやはりそうなんですね。
ちょうどいろいろ不便で、限界を感じていたところだったので、
土日を利用して CentOS で環境を構築してみようかと思います。
SMTP.startだけやってsmtp.send_mailしないとどうなる?
ブロックの有無にかかわらず、HELO だけして接続を終了する 接続そのものは行われるので、変な接続先やパスワードを設定するとエラーが出る
>>651 CentOSでRuby使うのだけはやめておけ
というかわざわざCentOS使う人が多いのはなんで?
RedHat厨の残党では?
CentOS自体は悪いもんじゃない パッケージのRubyが5年前の不安定版のままなだけ
ソースからいれてるけどそれでもダメなの? aptとかyumとかそんなの一切使わないけど
普通はソースからコンパイルしてインストールしたりしません 特に初心者は 新しい言語環境試すのにとりあえず最新版をコンパイルしてホームにインストールとかするのはマニアだけです
どんだけ初心者かにもよるよな Linuxもプログラミングもはじめてでちゅこんぱいるってなに、という人には勧めないが、まあ、そんな程度だ
普通はソースから入れるものだろ まあ趣味の世界でしかrubyを動かす事のない人にはパッケージで管理してればいいよ
Rubyにおける「普通の環境」って何よ 個人的には普通なんて存在しないと思うよ
松本尊師はデビアン使ってたはず。尊師と同じ環境じゃないと解脱出来ないだろうね。
rubyをCみたいにコンパイルして利用する事はできますか? PHPやPERLやPYTHONでは出来るのですがRubyではあまり聞かないので
>>666 「コンパイル済み」の状態のバイナリを持ち歩くことはできない
Ruby実行環境ごとひとつのexeファイルにまとめてスクリプトを実行することはできる
668 :
デフォルトの名無しさん :2011/04/02(土) 17:42:38.81
いぐざーぶとかまだ開発してるのかな。
Ruby始めようとサイトいったんだけど、英語版が充実しててワロタ Try Ruby 日本語サイトにも置いといてくれよ
exerbは開発進んでるけど、Ruby 1.9.xにはまだ未対応ぽい 個人的にはそれで困ったことはないが
| ̄:/ : : /: : : : : : : :i: : : i: :\ : :\ \ |: / : : : / : : : : :.i: : : : |: : : :|: : : |: : : i ' : :|: : : : |: : i: : : :|: : : /i|: : :|:| : : :|: : : | | : :|: : : : |: :.|:斗 十‐/ i|: :∧-‐ト|: : : | | : :|: : : : |イ|: :|:/ |:/ |:/ |ハ: : |: : : | \_,ノ : :|: : : : | レヤ示ト rテv|:./|: : : :| ヽ|: : : : |/{:::::::i } トイ レ: :|/|/ 関東地方 ( |: : : : 代c::ノソ レリ |: : : : | 東北地方 北海道地方 .〈.|: : : : |x`¨ 、¨x.|: : : i:| にいる \|i: : : :| , /|: : : i:| すべての 愛すべき 国民へ 告ぐ ∨リ\: :iト 、 `´ ィ |: : /|リ ‐┴―\|- 〈 >rァ 爪|V |/ :::::::::::::::::::::::ヽ \ リ ::::::::::::::::::::::::__\ :::::::::::::::/ ::r――‐へ rっr‐-、_ :::::::::/ ::// ∧. | ̄ ̄ ̄| | | | | ̄ ̄ ̄ ̄ ̄ ̄ ̄|.. :::/ ::/ / ヽ|. L|_|_ト' | / ::::/ / \ ただちに 逃げろ | . :::/ |/ | |
MacO
コンソールから年代を入力し, 入力された年代の天気のデータが記載されたhtmlページを取得, 保存したいと思っています
例えば, (
http://weather.jp/XXXX.html ) というページの, 2010年のhtmlを保存( 2010.txt )しようとした場合,
year = gets().to_i
output_file = File.open( )
open( )
・
・
・
となると思います
これらの File.open( )と open( ) には どのように記述すればよいでしょうか?
今回の場合,
File.open の中には ("2010.txt" , "w") , open の中には ("
http://weather.jp/2010.html ") が最終的に入力されれば良い, ということは分かりますが
数字が変数に代入されている場合どのようにして記述してやればいいのでしょう?
Rubyの基本動作の解説をどっかで読んだほうがいいと思うぞ StringとArrayとHashの3つだけ眺めてわかった気になるだけでもかなり違う で、文字列の中に変数(やメソッド返り値)の結果を埋め込むには 文字リテラルを "" で囲って作った上で #{ } を使う year = 2010 path =
がーん、TabとEnterがほぼ同時に押ささった(北海道弁)
>>674 続き
year = 2010
path = "#{year}.txt"
とすると、path は "2010.txt" になる
あと、かんたんスクリプトの作り方として、外部入力確定は後回しにしたほうがいいと思うぞ
year = 2010 # あとで外部入力にする
url = "
http://weather.jp/#{year}.html "
path = "#{year}.txt"
html = open(url).read
File.open(path, 'w'){|f| f.print(html)}
とかやって、2010.txt がうまく書き込まれるようになってからおもむろに year をなんとかする
>>674-676 …どうやらとても基本的なことを学び足らなかったようですね…
課題に向かうときは簡単な土台から積み上げていくテクニック おっしゃるとおりです
もう少し下積みしてからもう一度挑戦したいと思います. ありがとうございましたm(_ _)m
open( )でurlまで開けるの?知らなかった
通常は開けない require 'open-uri' として open メソッドを書き換える必要がある open の引数の信頼性に注意
>>663 Rubyにおける「普通の環境」=rvm
rubyでipadのアプリを開発しようと思ったが、 Rhodes + Macが無いと無理なんでしょうか? どうも解説ページが少なくてわからない・・・。
ruby+cocoaみたいなののipad,iphone版みたいなフレームワークってないよね。
自作ライブラリで open(path){|f| f.read} にするか File.open(path){|f| f.read} にするかは結構迷う
>>682 そっか、ないんですね・・・。
世の中のipadアプリケーションエンジニアは
みんなMac持ちなのか・・・?
少なくとも、Rubyでどうにかしようと思ってる人はいないと思う データ関連いじるならまだしも
>>686 WebアプリならiPadに最適化されたUIにする手もあるがネイティブアプリを開発したいんだよな
> 世の中のipadアプリケーションエンジニアは
> みんなMac持ちなのか・・・?
もしそこに気付けなかったのならiPadでの開発はやめておいた方がいいかもしれない
vm使えばええやん
l.callで呼び出せる理由はなんとなくわかるのですが、l[]で呼び出せる理由がわかりません。 何故関数が呼び出されるのでしょうか? irb(main):001:0> l = lambda{puts "lambda"} => #<Proc:0x00007ff619093dc0@(irb):1> irb(main):002:0> l.call lambda => nil irb(main):003:0> l[] lambda => nil
691 :
デフォルトの名無しさん :2011/04/06(水) 09:08:25.40
[]をcallと同等にした理由は、見かけが()に似ているから。
>>690 単なる.call()の略記法としてそういうメソッドが定義されてるだけ
本当は()にしたかったんだろうけど、言語仕様的に無理があるんで
それっぽい表記で、かつメソッドとして有効な名前として[]が選ばれた
693 :
690 :2011/04/06(水) 09:50:05.74
>>693 今は3種あるのかな
Proc#call
Proc#[]
proc_obj.()
今から1.9って勉強したらダメなんですか? マニュアルってそろってないのですか?
Rubyの知識がある人向けのマニュアルはある 文字エンコーディングに関して造詣がある人向けのガイドもある が、どちらに関しても初心者な人が読めるかどうかまでは保証しない ぐぐって出た記述がRuby1.9で動作するかどうかは初見ではわからないので、それで挫折しない心も必要
イロイロ言われてはいるんだが、 Ruby 1.9.2 が初めてのプログラム言語というのでないならおk ASCII-8BIT のことを「つまりバイナリです」と言われて納得してもらえるくらいの事前知識があれば問題ない
自宅窓鯖からレンサバへ移行するため C++で作っていたCGIを移植するべくRubyを始めようと思っています 一般的なプログラミングと文字コードに関して一通りの知識を有しています それでもやはりRuby初学者は1.8から始めるべきでしょうか 1.9では速度も相当改善されていると聞きます なので1.9から始めたいという気持ちが強いのですが よく考えるとレンサバでは1.8しか使えないことがほとんどなので 選択の余地がありません。本当にありがとうございました。
>1.9では速度も相当改善されていると聞きます 一般の人がふつうに(Ruby上で)文字列作ってふつうに文字列使うライブラリではふつうに遅いよ ベンチマークが速いのは、単に負担がかかる動作を回避してるからに過ぎない
700 :
デフォルトの名無しさん :2011/04/06(水) 14:26:35.70
レン鯖に入っているのはそれこそ1.8.5以下だったりすることも…
Ruby1.9で速くなった部分と遅くなった部分とがあって、 ライブラリ中で速くなった部分がたくさん使われてて遅くなった部分があまり使われてないと 最終的にそのライブラリは「Ruby1.9では速くなった」になる そんだけ 遅くなった筆頭がたまたま文字列作成だったので、 文字列たくさん作るようなライブラリは1.8よりも遅くなる可能性が高い
php4→php5のようにいつかは1.9に移行するなら今のうちに1.9使ったほうがよくないのですか?
移行自体は未練がましくのろのろと進んでるよ ただ、それはRubyを学んで使い倒してる人の間でのお話で、 初心者スレとしては「いきなりRuby1.9は逆にめんどくさいぞ」というのが一応結論 めんどくさくてもいいなら1.9から始めるといい ひょっとしたら君にとってはめんどくさく感じられないかもしれないし このスレの想定する初心者というのはかなり初心者だから
レン鯖で1.9が動かせるかどうか確認するのが先決じゃなかろうか
>>694 Ruby 1.9 以上で 引数がひとつだけならば
Proc#===
を演算子形式で呼べる
lambda{|x| 2**x} === 3 # => 8
本来はcaseなどで真偽値を返す用途に使うのだろうけど
カリー化すれば複数の引数も何とか
(lambda{|x,y| x**y}.curry === 2) === 3 # => 8
メソッドとして呼べば複数の引数も渡せる
lambda{|x,y| x**y}.===(2,3) # => 8
で、「you普通にcallしちゃえよ」と突っ込まれる
すいませんgemをインストールすることで、gemからRubyをインストール&アップデートすることも可能なのでしょうか? また、gemというのはPythonやPHPやApacheなどにも対応してそうですね linuxのaptみたいなのがwinでも使えると便利ですね
pikじゃないの
>>706 gemで直接Ruby本体(ruby)をアップデートすることはできない
でも707も言ってるとおり、pikというソフトウェアを使うと似たようなことはできる
コマンドラインからのrubyの一発インストールとか、バージョンアップとか
pik使ってみたいと思います pik教えてくれてありがとうございます
>>688 そうですね。Rubyでネイティブアプリを作りたいです。
やはり無理なのか・・・。
だからVMとかググレカス
>>706 定番はrvmだがWindowsならpikだと思う
pikはRuby本体のインストールだけならmingw版やさらにDevKit(gemのコンパイルに使う)がバイナリですぐに入るしむしろrvmより楽かもね
RubyとPython両方使えるに質問です 以下の各ケースでは、どちらの言語を選択したらよいでしょうか? 1.ゲームを作る場合 2.レンタルサーバを借りてWEBサイトを制作する場合 個人的な未開として1についてはライブラリの選択肢が多いほうを選択したいのですが、どちらが多いのかわかりません。 2についてはPythonだとバージョンにより特定のライブラリが使えなかったりするので互換性の面でRubyのほうがいいのかなと考えてます。
見解(けんかい)
俺はRubyしか触ったこと無いんだけどRubyの利点ってなんなの?
例えばCできる人が初めて触ってもCの書き方で何となく動かせるとか 文字列操作が強力でテキストファイルの整形を手軽にできるとか
perlだってpythonだって同じじゃん。
メリットが欲しいならJavaやれJava 就職できるぞwww
記述の方向性が違うだけで、単体としての中身はあまり変わらないよ 第三者ライブラリとか含めるとかなり違うが
そのサイト久しぶりに見た 1.9で動作する記述はあったっけ?
>>722 日本語文字列とかじゃなければだいたい大丈夫なはず
まあ、動かなかったらこことかで聞けばいい
3回くらい躓けば慣れる程度のことだし
スレ的には躓きまくることでRubyそのものを諦められてしまうことを恐れてるっぽいが
724 :
デフォルトの名無しさん :2011/04/08(金) 18:04:02.41
Ruby1.8.7をダウンロードしてMinGWでコンパイルしてインストールしたのですが、 'require':no such file to load -- openssl(LoadError) というエラーが出て動きません。 Cygwinでは予め入っているので動きます。どうすれば動くようになる でしょうか?よろしくお願いします。
openssl入れろ
726 :
デフォルトの名無しさん :2011/04/08(金) 18:40:45.96
require 'digest/sha1' でも同じエラーが出ます。
digest/sha1が入ってないんじゃね
だからコンパイル時にopensslが見つからなかったのでSSL関連が全部取り除かれてるんだよ マニュアルくらい読め
729 :
デフォルトの名無しさん :2011/04/08(金) 19:40:21.63
1.6のころは何もしなくても動いたのに、あれこれやらなきゃ動かなく なったスクリプト言語はもう卒業かな。sha1なんてどこで手に入れれ ばいいの?NTL使ってC++に移植したほうがいいかも。
730 :
デフォルトの名無しさん :2011/04/08(金) 19:42:57.22
一々探してインストールするのがマンドクセ。 第一ネットしかしない一般ユーザーがRubyを動かすために態々Ruby インストールするなんてWindows環境じゃありえないし。
>>732 完成版ではありません網羅してませんという程度の意味
現状、内容そのものは合ってはいる
致命的に不足してるが
ほしい情報はあまり載ってないよね 実際のソース読んだほうが早い
735 :
デフォルトの名無しさん :2011/04/08(金) 20:22:03.03
>>731 やっぱり動かないよ。require 'digest/sha1' LoadError
Cで書かれているのではない部分に関しては、Rubyスクリプトを提示したほうが早い場合は多い ローカル変数名とかを適切にしまくって短めのメソッドにしてる場合、 (日本語の)文章で説明するより早そうな場合も多々…
737 :
デフォルトの名無しさん :2011/04/08(金) 20:23:44.35
Cygwinでコンパイルするとエラーで止まるし。 どういう開発してるんだ?
WinのコマンドプロンプトでRubyを動かしてます
1.9.2での日本語表示についてご教示お願いします
# -*- encoding: utf-8 -*-
require "kconv"
a = "あ"
puts Kconv.tosjis(a)
で日本語が表示できました
しかし日本語があるごとに毎回Kconv.tosjis()を書くのは面倒です
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/45331 を元に以下のようにしてPHPのecho()みたいにしてみました
# -*- encoding: utf-8 -*-
require "kconv"
def echo(*arg)
puts NKF.nkf("--ic=UTF-8 --oc=Windows-31J", arg.map{|x|x.to_s}.join("\n"))
end
a = "あ"
echo(a)
もっと楽な方法ってございませんか?
739 :
デフォルトの名無しさん :2011/04/08(金) 20:33:44.35
とりあえず
>>5 その上で、mswin32ではなくmingw32を選ぶ理由を述べよ
さらに、マニュアルとかすっ飛ばして自前でコンパイルしようとする理由も述べよ
それと、解説サイト探さずにファイルだけ持ってきてどうにかしようとする理由も言ってくれるとうれしい
>>738 # -*- encoding: utf-8 -*-
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
puts "ねこだいすき"
> TYPE ja.rb
# -*- encoding: utf-8 -*-
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
puts "縺ュ縺薙□縺・☆縺・
> ruby ja.rb
ねこだいすき
>
$stdout.set_encoding を使わずに、スクリプトの実行時に ruby -EWindows-31J:UTF-8 ja.rb としてもいい 本当はこっちのほうがいいんだけど、なんかこれがうまく動かないWindowsの環境があったはず
743 :
デフォルトの名無しさん :2011/04/08(金) 20:57:09.62
>>740 1.自分のマシンに最適化して-march=core2 とかコンパイルオプションを
付け足して早く動かしたいから。
2.昔と同じ感覚でやっているので。昔のRubyは簡単に覚えられてmake
一発すぐ完成だったのに、最近のは使わない機能だけが肥大化して、
本当に使いたい部分が後回しにされている。昔はマニュアルなんか要
らなかったし読むのも面倒くさい。
3.楽でしょ?お手軽さが一番なんだよ。
あ、後パス通したら動いたので感謝。まだ使えるねw
バージョン1.0くらいのRubyでも外部ライブラリは必要だったはず
>>742 うちの
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
では動作しないっぽい気がする
いい機会だし1.9.2に上げよう
っていうか2009もないわな
>>742 -EWindows-31J:UTF-8
って
-E Windows-31J:UTF-8
でも動くんだけどどうなってるんだこれ
-EWindows-31J:UTF-8でググってもヒットしなかった
>>747 Rubyに対する引数から
・ "-Eなんとか" を探して、先頭の -E を取り除いて使う
・ "-E" を探し、見つかったらその次の引数を使う
という処理をすればいい
基本的にはRubyの中で正規表現を頑張りまくってる状態
>>748 Object#dupはオブジェクトを複製して新しいオブジェクトを作る
a.object_idとb.object_idを表示してみるとわかるかも
オブジェクトとはなんぞやということがわからなければその勉強をするといい
Rubyには必須の知識で、理解すれば効率が上がるぞ
勉強になりました
PHPからRubyに来た口だけどi++とか--iとか出来ないのがきもい i +=1 と i-= 1って書くのめんどくさい
Twitter、検索結果表示が“3倍速く”なったと発表――フロントエンドの切り替えで
Twitterは、フロントエンドをRuby on RailsからBlenderに切り替えた結果、検索結果の待ち時間が大幅に改善されたと発表した。
http://www.itmedia.co.jp/news/articles/1104/07/news043.html -----------------
急成長する検索ニーズに対処するために検索エンジンを書き換え、リアルタイム検索エンジンを立ち上げた。
その際にバックエンドをMySQLからJavaベースのテキスト全文検索エンジンLuceneに移行した。
また先週、フロントエンドをRuby on RailsからBlenderと呼ばれるJavaサーバに切り替えた。
待ち時間の短縮は、こうした取り組みの成果だという
>>752 まあ皆さんそうおっしゃるのですが、
実のところ i = i + 1 のようなコードを書く機会は Ruby では極めて稀なので
やっぱどうでもいいかなあとか1ヵ月後くらいには思ってます
あれば便利かもしれないけど、どうしても使うなら i+=1 でもいいか、みたいな
irb> 3.times{|i| p i} 0 1 2 irb> (3..5).each{|i| p i} 3 4 5 irb> (10..30).step(10){|i| p i} 10 20 30 irb> 8.upto(11){|i| p i} 8 9 10 11 irb> ['a', 'b', 'c'].each_with_index{|x, i| puts "#{i}: #{x}"} 0: a 1: b 2: c で足りなかったらまたおいで
while(true)〜endでできるのにloop{〜}が無限ループ用に用意されてる意味が理解できない これも後一ヶ月修行をしろということかっ!
>>756 PHPでできるんだからRubyなんてやる必要ないだろ
そうなんだよな 他言語経験者がi++とか○○は当然あるに違いないと思ってたものがなかったり privateとか微妙に意味が違ったりすると戸惑うよな
>>723 WindowsでRuby使おうとしたら
インストールするところで何選んで良いか判らなくて躓いたわ
>>757 うむ
冗長なAでできるから端的なBいらないじゃんをつきつめるとRubyは使われない可能性は高いw
Ruby ではループカウンタはまず使わない
Array#each か Hash#each のイテレーションを使うかまたは
>>755 みたいに整数でくるくる回す
配列の内容全部が必要なのなら、添え字アクセスはひとまず忘れて、each する構造にできないかを最初に考える
>>759 アレで理解できる一握りの人だけが Windows で Ruby を使うことができます
>>5 でいいと思うけどね
>>759 だいたいの場所で、ActiveScriptRubyが第1のお薦めになってない?
まあ今はRubyInstallerとかRumixとか、他にも候補あるから迷うのはわかるが
まだ定番とはいえないだろう 英語だし、mingw版だし 「次の選択肢」くらいの位置になってるとは思うけど
rubyinstallerで入れてgemをupdateしてpikいれてaddが一番楽だったな
>>764 URLが同じなら同じだろう
というかオフィシャルサイトのダウンロードページだけにするのが筋だな
rubyforgeのページ見せられてオフィシャルだと判断できるような人はおらん
単純に
>>731 のスジが悪い
Ruby1.9.2 a = 123.45 b = a.to_a puts b 実行するとundefined method `to_a' for 123.45:Float (NoMethodError)エラーになるのは何故ですか?
Floatクラスにto_aが無いよってエラーに書いてあるよね
770 :
デフォルトの名無しさん :2011/04/09(土) 11:46:38.41
過去には Object#to_a があったのだが、なくなった。
ていうか Hash 以外の to_a の存在は忘れてくれ 古い解説ではもやもやしたベンリ機能のように書いてあることがあるんだが、 Object#to_a は今後使用しないことになったので [ ] で括ってリテラルで書いてくれ a = 123.45 b = [a] p b 配列っぽくなりうる Hash を to_a するのはアリだが、 h = {'k1' => 'v1', 'k2' => 'v2'} p h.to_a それ以外の「ひとつしかない」オブジェクトを to_a するのはダメ
>>766 それが楽だと思うんだけどね
まず初めての人なら"pik入れてadd"のところはのちのちでいいかもしれない
>>768 ruby 1.8でもなくなるって警告出てたんだけどな
warning: default `to_a' will be obsolete
こんにちは質問させてください!! RubyGemsでインストールすると古くて動かないようなrubyで作られた便利なプログラムがある時に 最新版やforkされたソース(主にgitリポジトリから取得)だと動くことがあります すかし、そのようなプログラムはRubyGemsのディレクトリ構成のせいか、 (便利プログラム)/bin/以下のファイルを/usr/local/binのようなパスを通った場所においても `require': no such file to load になり動いてくれません。 絶対パスだと動くようなのでaliasを作ればいいのですが、 一般的にこのようなRubyGemsの構造をしたプログラムの最新版のソースから利用するときの ベストプラクティスは何かありますでしょうか? bundler??とかいうのを使うのでしょうか
> (便利プログラム)/bin/以下のファイルを/usr/local/binのようなパスを通った場所においても > `require': no such file to load > になり動いてくれません。 (便利プログラム)/bin/以下のファイルを/usr/local/binのようなパスを通った場所にシンボリックリンクをおいても の間違いでした
これからRubyを学ぶものは1.9から始めたほうがいいんだよね
776 :
デフォルトの名無しさん :2011/04/09(土) 12:10:09.04
ふつうに gem コマンドでインストールすると、パスの通った位置に、 (便利プログラム)/bin/以下のファイル をloadするスクリプトがインストールされる。たとえば、 ~/.gem/ruby/1.9.1/gems/bundler-1.0.10/bin/bundle をロードする ~/.gem/ruby/1.9.1/bin/bundle (こっちはパスが通っている) みたいな関係。 後者はどのgemでもほぼ同じだから、まねして作ってやればよい。 あるいは、ソースを取ってこれるのだから、rakeでgemを作って(ターゲットは gemとかpackageとかpkgとかいろいろ)、 gem install --local でインストールしてもよい。
>>773 git clone
https://github.com/user/hogehoge cd hogehoge/
rake pkg
gem install pkg/hogehoge-1.0.1.gem
rake pkg は rake build かもしれない
ようは開発版のソースから gem パッケージを手元で生成してインストールしてしまうという荒業
バージョン番号が同じだと既存の hogehoge-1.0.1 が上書きされるので、 rake で適当にバージョン上げれ
>>775 >>695-704
1.9から始めて心が折れないとよいが
勉強になりました ありがとうございます
rubygems が bundler を内部で使うようになってから gem install に毎回5分くらいかかるんですが なんか回避方法はありませんか
>>780 それは単にBundlerの展開データ量に実メモリが追いついてないんだろう
gem installを行うためには空きメモリが200MBくらい必要
ちなみに必要となるのはそのうちの2KBくらいのデータだ
それを探すために公開されてる全データを取得して展開してサーチしてる
782 :
759 :2011/04/09(土) 12:35:31.69
こんなにいっぱいレスもらえるとは思いませんでした みなさん本当にありがとうございました
Rubyってbasicみたいだよね 何かVBやってるみたい C#派ならPHPか!?
コレクションとイテレーションとオブジェクトとメソッドコールが言語中枢を侵してるRubyと同じって なんかずいぶん先進的なBasicやってたんだな
>>781 gem作った人ってストリームって知らないの?
>>785 そんなもの必要ないだろ
サーバの負担にもならないし、全部メモリに展開したほうが早い
まあ、ああいうのは開発者さんの環境ではサクサク動くのだろうとは思う
>>771 Enumerable#to_a は別名があるとはいえ、別に忘れなくても良いと思うんだ…
>>786 swapがないVPSでgemがインストールできなかった当時の全俺がないた
そもそものgemクライアントとして、こんなにたくさんのgemが登録されることを予期してはいなかった だから途中で破綻するはずだったんだが、間の悪いことに開発者のマシンがスペックアップしたので 本当なら遅くなって使い物にならなくなるはずのシステムが普通に使えてしまった 世の中そんなもんだよね
だれかgemをフォークして作り直してくれ。 Pythonで。
792 :
デフォルトの名無しさん :2011/04/09(土) 22:26:44.55
eggじゃだめなん?
いやいや、i++で1増えるほうが気持ち悪いから。 ってかこれこれ誰が考えたんだよ。 C言語作った奴か?
まあオブジェクト指向が机上の空論か学者のオモチャだったころのイケてるフィーチャーだったものなので 現在のRubyのようにイテレータがきちんと枚挙をサポートしてれば出番は確実に減る
i++はC++からだったと思う
797 :
デフォルトの名無しさん :2011/04/10(日) 08:39:36.13
i++ はCが考案されたときPDP-11のアセンブラ命令にそのまま落とせて便利じゃね? と思って作られたもの。
http://cm.bell-labs.com/cm/cs/who/dmr/chist.html > Thompson went a step further by inventing the ++ and -- operators, [...].
> They were not in the earliest versions of B, but appeared along the way.
訳)ケンは大きいつづらを、リッチーは小さなつづらを選びました。
すると中には黄金虫が
800 :
デフォルトの名無しさん :2011/04/10(日) 10:35:35.16
Cの次はPといううわさが大昔にあったな。
801 :
デフォルトの名無しさん :2011/04/10(日) 10:49:37.97
class Test
def a()
return b()
end
def b()
return "bbbb"
end
private :b
end
test = Test.new()
puts test.a()
メソッドaはpublic、メソッドbはprivate。
メソッドaからメソッドbを呼び出せて、メソッドbを直接呼び出したらエラーになるようにしたいと思います。
Ruby1.9.2です。
この書き方で合ってますでしょうか?
特にprivateの仕方はマニュアルの通りに書いたのですが、サイトによっては
ttp://www.nslabs.jp/access-control.rhtmlのように private
def pri
p true
end
と書いたり,
ttp://blog.s21g.com/articles/561のように class Foo
def self.bar
end
private_class_method :bar
end
と書いたりしてあってどれが正しいのか判断できません
>>801 まず、private について。
privateは、引数なしで呼ばれた場合は、その後のメソッドが全てprivateになる。
引数をつけて呼ばれた場合は、引数のメソッドをprivateにする。
なので、その例ではどちらでもbをprivateにできる。
んで、private_class_method だけは意味が違う。
それは通常のメソッドではなく
クラスメソッド(Testから作ったオブジェクトではなく「Test自体」が持つメソッド)をprivateにするもの。
追記。 class Foo def self.bar という記述は、さっき上に書いたように 「Fooから作ったオブジェクト」ではなく「Foo自体」のメソッドを定義する書き方。 だからprivateにするのに、private_class_methodを使っている。
privateって構文じゃなくてメソッドだったのか しらんかた
805 :
デフォルトの名無しさん :2011/04/10(日) 12:37:14.78
ということはprivate_class_methodを使っておけば間違いないという事であってますか?
いいえ メソッドのアクセス制限を利用したいなら、 Rubyにおけるメソッドの所属の仕組みの知識は必須になるます 既存言語と違うというだけで、わかってしまえばたいしたことないので、ちょっと時間割いてくださせ
若干の語弊あり
・ Ruby には オブジェクトに属するインスタンスメソッドというものしかない
・ Ruby のクラスは、Class クラスのオブジェクトを定数で呼んでるだけである
String クラスは、 STRING = Class.new{ なんか色々設定 } にコンセプト上は同一
irb> p String.class #=> Class
・ クラスもオブジェクトなので、それに属するインスタンスメソッドというのもありえる
・ クラスに属するインスタンスメソッドなので、じゃあクラスメソッドって呼ぶことにしようぜ
ということで、クラスメソッドはクラス自体を self とするインスタンスメソッドだ
private_class_method は、書かれた文脈からわざわざクラスメソッドを探して private を実行する
てことで、どれも必要っちゃ必要。用途は
>>802 メソッド定義の書き方を工夫して private 1個で済ます人のほうが多いかなという印象
>amachang 今粛々と民事刑事の方面で進めています。一応、すべて証拠として保存しなければいけないので、冗談でも今はこのスレに変なこと書き込まないでください。
>2011/01/28
http://hibari.2ch.net/test/read.cgi/prog/1291518728/ >1 :amachang撲滅振興協議会:2010/12/05(日) 12:12:08
> amachangが憎い・・・・amachangが許せない・・・・
> ククク・・・・クククククク・・・・・
> クックックックックックックッ・・・・・
> クー、クー、クー、クー、クー、クー・・・・・
>
> もう許せない。
> もはや沸き上がる滅意を抑えることが出来ない!!!
809 :
デフォルトの名無しさん :2011/04/10(日) 15:53:03.95
■test.xml <?xml version="1.0"?> <root> <item> <title>Ruby</title> <date>2011/04/10 12:15:22</date> </item> <item> <title>Java</title> <date>2011/03/25 21:38:57</date> </item> </root> ■test.rb require "rexml/document" file = File.new("test.xml") xml = REXML::Document.new(file) puts xml.elements['root/item[2]/title'] これでxmlからJavaというデータを取得できるのですが このJavaの部分をPythonに書き換えるには何を使えば良いのでしょうか? 検索しても新たに追加する方法は見つかるのですが更新・書き換え方法が見つかりません
xml.elements['root/item[2]/title'].text = 'Python' とかありそうな予感
811 :
デフォルトの名無しさん :2011/04/10(日) 16:14:58.46
おお!すごいですね! Rubyって簡単にxmlの操作ができますね これで更新は出来たのですが、PHPののDOM関数のように書き換えと同時にxmlに書き込んでるわけではないのですね データの追加・更新をしたら fp = open(ファイル名, "w") fp.print xml fp.close って書き込まないとダメってことでしょうか?
うん。メモリ上のXMLツリーをいじくってるだけなので いじりおわったらファイルに自分で書き出す
勉強になりました ありがとうございます
utf-8のwebページを取ってきて、取ってきたページをscanで特定の文字列を抜き取りました。 抜き取った文字列をputsしたときに以下のエラーが出たのですがどのように解決したらよいでしょうか? スクリプトファイルはUTF-8で保存してあり、ファイルの先頭には # -*- encoding: utf-8 -*- $stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8) と書いてます。 `write': "\xE5" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J (Encoding::UndefinedConversionError)
ハッシュの値で検索かけて、該当するキーを全て取得したいです(Ruby1.8.7) hash = {:a => 1 ,:b => 1 ,:c => 2} p hash.index(1) #=> :a :aと:bが配列になって返ってきてくれると嬉しかったのですが、いずれか一つしか返ってこないようです 全て返ってくるメソッドってないでしょうか?
たぶん無かったと思う。find_allとか使って何とかしたほうがいいんじゃないかな
hash.select{|_,v| v == 1}.map{|k,_| k } でもいいんじゃない
818 :
デフォルトの名無しさん :2011/04/10(日) 23:30:25.06
>>818 そりゃそうだろうな、入ってるはずはない
オフィシャルにいくとインストーラーがあるのでそれ使わせてもらえ
ねむい
>>814 ttp://doc.ruby-lang.org/ja/1.9.2/method/String/i/encode.html その設定をしてputs時にUndefinedConversionErrorということは、
puts対象の文字列をUTF-8からWindows-31Jにしようとしたけど
Windows-31Jにできない文字が含まれていましたごめんなさい指示くださいということだろう
その文字が具体的に何かは知らん
正規表現での切り出しが間違っていないのなら
(たとえばUTF-8でファイルに書き出してエディタで読むと文字化けなしとか)、
String#encodeを直接使うしかない
puts の前で str.encode!(::Encoding::Windows_31J, :undef => :replace) とかしろ
>>817 selectとdetectとcollectとrejectとinjectは紛らわしいから使用禁止じゃムキー
injectはいいセンスだと思う 関数型言語みたいにfoldlでもいいような気もするけど、 あえて挿し込むというイメージを持たせた辺りはRubyらしい
select, collec, injectとかはSmalltalkでしょ
824 :
822 :2011/04/11(月) 03:20:13.24
そうだったのかッ!! 長年の謎が解けた
injectは書き方が違うのでパッと見でも区別できる 他は無理だな
hash.reject{|_,v| v != 1}.keys という書き方あるな。でも欲しい条件が真じゃなくて、 要らない条件を書くからパッと見分かりづらいな駄目だこりゃ rejectだけEnumerableじゃなくてHashクラスにあるからハッシュ返すのね
827 :
デフォルトの名無しさん :2011/04/11(月) 12:26:08.18
REXMLで要素を追加するときに改行やインデントも入れたいのですが出来ませんか? libxmlに乗り換えるべきでしょうか?
828 :
デフォルトの名無しさん :2011/04/11(月) 12:28:30.24
rootに追加すると <?xml version='1.0'?> <root> <item name='Ruby'><date>Mon Apr 11 12:25:20 2011</date></item></root> と、なるので <?xml version='1.0'?> <root> <item name='Ruby'> <date>Mon Apr 11 12:25:20 2011</date> </item> </root> (インデント部分はタブとと考えてください) としたい
要素を追加するたびに改行やインデントをいれるんじゃなくて 操作しおわった最後の(直列化する)段階で清書するなら doc = REXML::Document.new(...) ... pprinter = REXML::Formatters::Pretty.new(4) # スペース4つでインデント pprinter.write(doc, $stdout) # 標準出力$stdoutに書き出し 出力先は$stdout以外にFileインスタンスなんかでもOK doc.write($stdout, 4)でもいけるんだけど今は廃止されてるとか 文字列で清書の結果を受け取る場合はとりあえずの方法 require 'stringio' f = StringIO.new pprinter.write(doc, f) print f.string
まさしく検索で見つかったdoc.writeでやってしまいました Formattersのほう使わせて頂きます ありがとうございます
■test.rb require "class1" class1 = Class1.new() puts class1.a() ■class.rb class Class1 def a() return "aaa" end end クラスファイルを外部に残して、使いたいときにメインファイルから呼び出して使いたいのですが test.rbのrequireの所でエラー(`require': no such file to load)になります どちらのファイルも同じフォルダに入っています どのように外部ファイルを読み込めるのでしょうか?
すみません require "./class1.rb" としたら読み込めました 何故require "./class1.rb"じゃないと読み込めないのでしょうか? 何故require "class1.rb"とrequire "./class1.rb"は同じフォルダのクラスを指してないのですか?
$LOAD_PATHにカレントディレクトリが含まれてないとか?
というか1.9では最近含まれなくなった
test というファイル名や Test というクラス名はあまりよくない
実害は少ないとは思うのだが
>>832 require は $LOAD_PATH の中から該当するファイルを探して読み込むのだが、
Ruby 1.9.2 からは $LOAD_PATH からカレントディレクトリが取り除かれたので
カレントディレクトリの自作ファイルを require 一発では読み込めなくなった
ただ、require でカレントディレクトリのファイルを読む事故の防止のために外してるだけなので
(たとえば、カレントディレクトリに瓜の情報を書いた uri.rb というファイルを置いて
require 'uri' すると、URL 用の組み込みの URI クラスがそれ以降どうやっても読めない)
・ 相対パスですとパスで明示して require './class1.rb' と書く
・ require_relative 'class1' と書いて、書いたファイルからの相対パスで探してもらう
ということは何も問題ない
1.9.1 以前でも動作する前者が人気
836 :
デフォルトの名無しさん :2011/04/11(月) 15:04:20.11
line = STDIN.gets case line when 1 puts "1" when 2 puts "2" else puts "none" end 1と2を入力してもnoneが表示されます どこか間違えてるのかアドバイスお願いします
1.9を使っているので相対パスで./など明示的に書くクセを付けようと思います あとFile.dirname(__FILE__) + "/class1.rb"と書く方法もあったので、気分に応じてプロジェクト毎に使い分けたいと思います ありがとうございます
>>836 標準入力から返ってくるものは文字列なので、 整数 1 にも整数 2 にもマッチしないので else に着く
あと標準入力は今は STDIN ではなく $stdin を使うほうがいい
>>836 思ったとおりに動かない場合は
line = STDIN.gets
p line # <--
case line
とかする癖をつけるといいよ
改行がくっついてるなんて思いませんでした pってデバッグの役割みたいなものなんですね便利ですねこれは line = $stdin.gets case line when "1\n" puts "1" when "2\n" puts "2" else puts "none" end 1\nって書くのが気持ち悪いけどRubyはこういうもなんだと言い聞かせるしかないですね
IO#gets は行志向だから、「行」の文字列が丸ごと返る 行って言うくらいだから、もちろん改行つきだ 改行が不要な場合、ふつうは String#chomp する line = $stdin.gets.chomp case line when "1" puts "one" when "2" puts "two" else puts "none" end
他の言語の一行読むメソッドは行末の改行を削るものもあるから もちろんとは言えないよ
行は改行記号を含むだろ普通 Rubyのgetsは通常の行の概念に沿ってるというだけの話
getsといえばC言語のgetsが真っ先に思い浮かぶなー
ダンディ坂野
>>843 テキストファイルの末尾が改行で終わらない場合は?
行は普通改行を含むものとしてもメリットはないと思うけどな
含んだり含まなかったりする、としておくほうが無難
Ruby1.9.1でファイルを書き込みモードで開くときは f = File::open("sample.txt", "w")とf = open("sample.txt", "a")どちらで書く事が推奨されてますか? 好みの問題であればFile::は省略しようと思います
848 :
デフォルトの名無しさん :2011/04/11(月) 20:40:34.65
openをFile::openの略だと思っているのならそれは間違い。
モード w とモード a もそもそも別物
RubyでIEで開いたページ内のフォームにタイピングするマクロを作りたいのですが どのようなキーワードで検索したらよいのでしょうか? 以前、過去スレ(過去半年分)でそういうやりかたが書いてあったのを記憶しているのですが見つかりませんでした
watir
初心者だけど1.9から始めてよかったと思う 言われてるほど難しいものってないよ
難しいっていうかめんどくさいんだよ 文字エンコーディング関連 何も考えずにエラー出さないで一発で書けたことないぞ
>>852 それ言ってたの書き込み数は多かったけど一人だけだから
今から使うんだったら1.8使う理由ないだろ
require "〜" 「〜」の部分の読み込む標準ライブラリ名の一覧ってマニュアルのどのページをみたらよいのでしょうか? 例えばrequire "kconv"のkconv
昔は単なるめんどくささ以上に手放しで進められる状態じゃなかったのは間違いない で、当時お勧めされてなかったというのはそれはそれで何か問題あるの?
まあ、いつまでも引っ張る人というのはどこにもいるものでして… UTF-8だけ使ってると楽だよね1.9
railsが1.9に正式対応したのが大きいんじゃない それから一気に他のライブラリも対応したし
>>861 問題ないなら日本語は最初からUTF-8使おうぜムーブメントの後押しをしたのは間違いない
今のRubyはたいていUTF-8だ
テンプレはこれからも1.8.7を推進するのですか?
EUC-JP-MSとかCP932とか難しいです
>>864 どっちか片方なら1.8.7でいいんじゃないのかね
前にもちらっとあったが、
このスレの想定してる初心者は文字エンコーディングに関する知識もないという仮定っぽいし
既にプログラミング言語の経験があるなら1.9.2で問題あんめえ 全くの初めてなら、悪いこと言わんので1.8.7にしとけ
Ruby 2.0って2038年1月19日まで出ないのですか?
文字エンコーディングの問題だけで1.8.7推奨してんの?
あとはマニュアルが1.8系に比べ弱いとかが指摘されていたような 個人的には初心者も含めどんどん1.9使ってもらって 本当の初心者が1.8ではなく1.9を使うとどういうところでハマるのか 情報を蓄積していったほうがいいと思う 最初から1.9を対象にした入門書(artonさんの本とか)も出てきてるし
>>870 あなたたちプロの人間にはたいしたことのないものかもしれませんが、
文字列操作しないライブラリなんてないんだし、
そこの使い勝手が悪いというのは初心者の全てに影響します
初心者向け解説があるならまだしも、そんなものは現存しないようだし
>>872 1.8で日本語文字列の長さを得るのってどうやってやるんだっけ?
…まあ、誰が人柱になるか、人柱になったあとのフォロー体制が整っているかという問題は大きい 初心者が飛び込んで怪我しても大丈夫な環境が用意されているかというと、かなり怪しいなw Cと英語が読めて当たり前というのはかなり人を選ぶという自覚くらいは持って頂きたいところ
Cは読めなくても何とかなるが 英語が読めないと、エラーメッセージの意味がわからなくて致命的だからな・・・ 「なんかよくわからんけど日本語処理でエラー出た」で諦めてしまう
>>873 require 'kconv'
str = "日本語deアベシ".tosjis
p str.split(//s).size #=> 8
正規表現でうまく拾えない場合はアウト
>>876 半角カタカナをkconvすると全角になるのでコード自体0点
文字数なんだから全角であってんじゃん もしかして濁点が文字だとか思ってる韓国人?
>>880 あれ戻ってこないから嫌いなんだよね
使い終わったら jcode.rb の効果を取り除くとか、そういうことができれば使い倒したんだけど…
昔は標準のメソッドを書き換えるのがクールだったんだよ
まだobsoleteになってなかったのか
リテラルで半角カタカナになってる以上、変換後も半角カタカナだと「思ってた」はず
そうでないなら "日本語でアベシ" と全角で書けばいい
リテラルでは半角カタカナだったけどメソッドチェーンで全角に即変換されて消えるんですねえ、なんてのに教育的効果はねえ
変換後も人間に読める形の(それこそ文字数同じの)リテラルで普通に書けるんだから、
だったら最初から変換後のをわかりやすく書いと毛
>>881 jperl みたいなもんだなあと思って見てた(Java Perl ではなく Japanese Perl のほう)
動作書き換えすぎて jcode がないと保守できないコードになる上に
日本語知らないライブラリでのバグも増えそうだったので、早々に使うのやめちゃったよ
半角カタカナの文字数を数えるサンプルなのに全角で書いたら意味ないじゃんw
htmlとcssしかできない初心者だけど 初めての言語がRuby1.9だけど別に1.9でもいいかなと思ってるよ
違う文字コードのデータを扱う時点で、 何も知らない超初心者を想定するというのがおかしい。
プログラム経験者ですが文字コードがサッパリなんで1.8のままだよ
1.8 はあと 10 年くらい使われる
新しいものに移行できない老害は1.8を使い続けるしかないもんな
891 :
デフォルトの名無しさん :2011/04/13(水) 21:43:01.90
numericの「5」を「+5」という風に表示するにはどうすればいいのでしょうか?
892 :
デフォルトの名無しさん :2011/04/13(水) 21:51:21.97
以下のようなテキストファイルがあります { ここに不特定の文字列が何十行にも入ります } ファイルの最後には必ず}の文字列があります(前後にタブや改行を含む場合あり) ファイルの最後の}を見つけて、}の前に特定の文字列を追加したいのですが ファイルの最後の}を見つけて}を「特定の文字+}として置換したらいいのかなと考えてます。 このファイルの最後の}の見つけ方はどうやって見つけたらよいでしょうか? }はファイルの最後だけでなく、ファイルの途中に何度も出てきます
正規表現
>>891 printf("%+d", 5)
s = "%d" % 5; printf(s)
>>892 idx = text.rindex('}')
text[idx] = "特定の文字+}"
895 :
894 :2011/04/13(水) 22:06:15.61
ああっと訂正 s = "%+d" % 5; printf(s)
896 :
デフォルトの名無しさん :2011/04/13(水) 22:29:59.83
% が既に sprintf なので、printfじゃなくてprintね。
897 :
891 :2011/04/13(水) 22:50:18.10
なるほどありがとうございました
なんだろう、今までケンカで明け暮れて警察に何度も補導されるような人生を送ってきたのに ここの人たちは皆俺に優しくしてくれる
>>896 ああそうか。指摘ありがとう超ありがとう
Windowsでメジャーな開発環境を教えてください
python それは吸引力の衰えないただ一つの(ry
実行環境 OS名:Ubuntu10.04 Ruby:Ruby1.8.7 【やりたいこと】 >> 愛/あい 藍/あい AI/あい 朱/あか 赤/あか AKA/あか << これを >> 愛 藍 朱 赤 AKA << と言う形で一括置換をしたいです ひとまず 各行をstrに格納して str.gsub(/\/.*\s/,"")としてみたのですが思うように動きませんでした. どうすればよいのでしょうか?よろしくお願い申し上げます.
愛 藍 AI 朱 赤 AKA じゃないの? str.gsub(/\/[^\s]+/,'')
>>905 様
そうです.
ありがとうございます.
907 :
デフォルトの名無しさん :2011/04/14(木) 21:13:47.34
スラッシュが正規表現リテラルに入るときは高確率で %r 使う俺。
軽量言語というのはプログラマーに取って負担が少ないという話を聞いて、勉強しやすいのかなと思いましたが Rubyは初めてプログラミングに手を出す者が学ぶ言語としては難しい方でしょうか?
プログラミング言語を勉強して何をやりたいかによる 言語の勉強が目的なら他の言語にしておけ 就職や転職に有利なのがいいならJavaとかC#にしておけ 「ふつうのWindowsプログラム」を作りたいなら他の……、まあ、とりあえずRuby以外にしておけ シェアウェア(死語?)で小遣い稼ぎとかしたい場合も他の言語にしておけ レンタルサーバとか借りてなんか自作で投稿とかデータとかのサイトみたいなの作りたい場合も、 そのレンタルサーバでRuby1.8.7以降が使えるかどうかを先にチェックだ これらを踏まえてなお「そういうことを欲しない」のなら、 Rubyはそんなあなたにとっておおむね読みやすく書きやすくちょっぴり遅い 全くの手探りで進められるほどのシロモノではないが、解説なり教科書なりがあれば問題はなかろう
全くのプログラミング初心者にRubyをやらせて挫折したって話は聞いたことがない。 本当の意味で使いこなすには程遠いが、やりたいことを動かすまでのハードルは低いかと。
>>910 じゃあとりあえずメモ帳作りたいですみたいなこと言い出したらどうしようもないぞ
メモ帳作りたいならRubyやらせるべきじゃないだろ
どう言い訳しても少なくとも「めもちょうのぶぶん」はRubyではないわけで
プログラムには標準入力と標準出力があって〜これがWebでは〜みたいな話をするには最適だが、
そういったものを望んでプログラミングを始める人がいるとはそうそう思えん
>>911 どうだろうねえ
というかもう若くないし若い人べったりの環境でもないので、
今の「プログラム作ってみたい」と考える人が思うところのプログラムがナニを指してるのかよくわからん
昔は、えー、そうだな、20世紀は完全に プログラム=クライアントサイドプログラム で、
Windowsで動くexeでインストーラがあってウィンドウが出てマウスでぽちぽち音がジャーンみたいなのがそうだったんだけど、
今の人はプログラムと言うとサーバサイドのプログラムも考慮に入れてくれてるもんなのかね
Rubyは入門しやすい Rubyは万能ではない ただそれだけ
>>911 んー、そこまで過保護にしなくてもいいのでは。
このスレいちいちレスがくどいw
じゃああっさりめの回答 いいんじゃないかな とりあえず入門書一冊買ってRubyインスコして試してみては
Windowsで動かすプログラム作りたいなら最初は他のやれ サーバ上のは得意だがレンタルサーバでRuby1.8.7が動くかどうか先に調べれ Rubyそのものは難しくはないが、あなたの想像していたものの7割くらいはそもそも作れない
>>908 僕はプログラミング初心者ですがRubyは判りやすいと思いますよ
本当はGoogleApiEngineで無料サーバとして使いたいのでJavaかPythonを覚えたかったのですが
前はマクロとして使ってたけど 今じゃrailsにしか使ってないわ
HSPでいいんでないの?
Rubyの学習は非線形でガクガク、躓く箇所がある。 暗黙にプログラミングの常識を要求する=LL的よくあるコードは楽 Pythonの学習曲線は平坦でつまずく箇所が少ない。暗黙知の代わりにPythonそのものの知識をかなり要求する=面倒だが潜在的な汎用性がある? あとPythonのサイトには初心者と超人の中間が大勢いるけど、Rubyのサイトにはいない 学習前のリサーチではこんな印象でした プログラミングの抽象度が高く初期の学習がスムーズなのでは、と思ってRubyをはじめました あってるかどうかは判りません
rubyというかブロックというか、 便利なフリして下手したらメンテしにくい、 ごっつごってごてぐっちゃぐちゃの構造へ突っ走ってる時はある。
>>922 じゃあRuby以外のプログラムはメンテナンスしやすいんですね!!
ブロックってメソッド呼び出しに局所化されているから メンテしにくさとは逆を行ってないか?
>>923 が真理だと思う
たぶんそれは言語の特性ではなく単に書く人のせいだw
だらだらブロックのネストを書いたりと 読みにくく、手を入れにくくする方法は沢山あるから、 この辺りは、どんな言語でも、書き手次第だろうね。
内側から読まないと意味のわからないネストとかね
コミッタの質がここまで低い言語は他に無いと思うよ
RubyMineというIDEを使い始めたのですがマルチバイト文字をコンソールに表示させたときの挙動で躓きました puts "あ" #=> あ print "あ" #=> あ p "あ" #=>"\343\201\202" pp "あ" #=> "\343\201\202" この挙動の違いはIDE自体に問題があるのか、それともrubyのpやppが特別な動きをしているのでしょうか? NetbeansなどのIDEでは普通にマルチバイト文字を表示できていましたので戸惑いました
>>928 ま、コミッタがコミットしてRuby作っていったんだけどね。
ブロックやネストの話からコミッタにまで普通話が飛ぶか?
Rubyにまでやってきて一々嫌味いいたいんですね。
これだからPythonの馬鹿には手を焼くんだよなあ
┐(´д`)┌ヤレヤレ
>>929 NetBeans なんかのほうが通常ではない動作をしている
Ruby 1.8 において、本来、使用日本語に関する情報が何もなければ、
非アスキー文字の含まれる文字列に対する String#inspect、
つまりそれを引数にとった関数的メソッド p はバイナリ表記をする
(Ruby 1.9 では日本語として区切って表示するようになってしまった、個人的には改悪)
p はデバッグ表記用メソッドなので、
人間に読めるように表示したいなら人間表示専用の puts や print 使え
なお、 ruby の起動時に -Ku や -Ks などで日本語モードが指定されてると、
String#inspect は日本語体系がそれであるとみなしてバイナリを区切って表示する
「何もしてない」のに Ruby 1.8 の p で日本語が表示できる場合、
どこかの誰かがあなたに無断でそれを指定している
(IDE内コンソールである場合は、勝手に変換している可能性すらある)
$KCODE="u" や $KCODE="s" をスクリプト内で誰かが指定していても同様
「文字列を絶対に10進表記にして表示する」という簡便な一発メソッドがあればよかったのに
何が何でも無理やり10進表記してくれるto_iがあるじゃないか というか具体的な入力と出力をplz
>> "アホか".to_i => 0
936 :
934 :2011/04/16(土) 10:43:37.51
>>935 「何が何でも無理やり」ってのはその挙動を指してるんだけど
to_iにしても10進表記にしてるわけじゃなくて単に整数にしてるだけだね
変なレスして失礼しました
String#dump
>>937 dump は p と死ぬほど相性が悪いので嫌い
まあこのへん推し進めると文字列自体にエンコーディング情報くっつける Ruby 1.9 になるんだがw
939 :
929 :2011/04/16(土) 12:03:50.47
>>932 IDEのRuby起動オプションに-Kuを追加することでpでも日本語を表示できるようになりました
わかりやすい説明ありがとうございます 勉強になりました
下のunlessのような条件分岐はどういう意味があるのでしょうか? 基本は unless ?? then ?? end って感じで覚えていたので少し混乱しています str.each_char do |c| count[c] = 0 unless count[c] count[c] += 1 end
if と unless は(Perlのように)後置できる 式 if 条件 は if 条件 then 式 end と同じだ 1行で書けて便利、という程度の意味 str.each_char do |c| unless count[c] then count[c] = 0 end count[c] += 1 end
nilが入ってたら0で初期化して1増やすってコードだな
943 :
940 :2011/04/16(土) 20:20:40.18
なるほどそうだっんですね。 お二方ありがとうございました!
いえいえどういたしまして
a += 1 は a = a + 1 だけど a ||= 0 は a = a || 0 ではなくて a || a = 0 で、あってる?
へぇそんな違いがあったのか。 無駄な代入処理を行わないための仕様なのかな?
nullをnilって書かないといけないのに違和感 nullって書かせてくれよ
>>947 というより ||= 演算子自体が
「最初に使われるときには初期化、次回以降はスルー」って処理を意識してると思われ
>>948 nullとnilとの違いとかそういう話?
元々は形容詞と名詞の違いらしいし
厳密な区別なんてせずに片方で良いと思うが…
使うのがnullじゃないとヤダヤダってんなら
他にも色んな言語がやれなくなるな
NoneとかNothingとか、相当する要素は色々あるから
>>948 一般的な null とは違うので nil と呼ぶ
null やundef は予約語的な「無」だが、nil は NilClass のインスタンス(オブジェクト)だ
無であるならメソッドを受け付けないはずだが、メソッドだってきちんと動作する
「とりあえず全部オブジェクトにしようぜ」というコンセプトのもと、
いわゆる null や undef を表すために作られた決め事
…まあ、だからわざわざ lisp の言葉を持ってきたんだろう
これが null オブジェクトまたは予約語 null だったら大混乱必至だったと思う
952 :
デフォルトの名無しさん :2011/04/17(日) 10:10:05.08
※よろしくお願いします。 ruby で,あるページを取得したのですが、 『フレーム対応のブラウザでない場合は、本画面が表示されます。』 と返ってきます。どうすれば、ページの文字列を取得できるのでしょうか??
953 :
デフォルトの名無しさん :2011/04/17(日) 10:12:00.37
それ、取ってきたページのNOFRAMES要素が見えてるだけじゃねーの? 取ってきたページのFRAME要素のSRC属性のURLにさらにリクエストかければいいんじゃねーの?
せめて初心者じゃない方荒らしてくれ
>>952 HTML に関する知識がないご様子
HTML の基本的な勉強してからやろう
そっちのほうが躓くことなくスムーズにコトが進むぞ
PHPみたいにHTMLに<?php〜?>でRubyを埋め込んで利用する方法って用意されてますか?
958 :
952 :2011/04/17(日) 10:57:52.99
>>953 ありがとうございます。
自分はOperaを使ってるんですが、Operaで、
[ページのソースを表示]っていうメニューをクリックすると『フレーム対応でないとだめ』
のソースが表示され、
[フレームのソースを表示]っていうメニューをクリックすると、目的のページソースが表示されます。
しかし、目ぼしいSRCは記述されておらず、ruby でどうやればフレーム内のソースを取得できるのか
困ってます。。。
どなたか、ヒントだけでもいいので、何かありませんでしょうか?
urlもhtmlもさらさずにエスパーしろと言われても無理。 まずはhtmlのframeの項の説明読もうよ。すっごい簡単だから。
960 :
デフォルトの名無しさん :2011/04/17(日) 11:02:51.96
ヒント: えちいサイトだろうが気にせずURLを貼る
963 :
953 :2011/04/17(日) 11:16:35.14
Rubyコミュニティは厨の匂いがプンプンしますね
Mac上のRuby(1.8.7)でコマンドラインプログラムを作っています。 Terminal.appを立ち上げてSTDIN.getsでユーザーに文字入力させる のですが、日本語文字列を入力するとき、deleteキーでの消去が 文字単位にならず、何とも微妙な感じです。 1文字消すのにdeleteの打鍵が2回必要だったり、文字列によっては 最後まで消去できなかったりして(実際には消えているようですが 画面には残ります)ストレスがたまります。 ちなみにTerminalで普通にシェルを使うときには上記の問題は でません。アドバイスよろしくお願いします。
そのへんの環境揃えるのめんどくさいんだよね require 'readline' while s = Readline.readline("INPUT>", true) do p s end
967 :
965 :2011/04/17(日) 18:48:31.50
>>966 ありがとうございました。うまく行きました。
Readlineは聞いたことがありましたが、
こういうときに使うものなんですね。
RubyInstallerで入れたのですがTKが入っていませんでした TKはどのサイトから入手できますでしょうか? gemからインストールする事は出来ないのですか?
RubyInstallerめんどくさいよね…
このスレWindowsネタになると変なスイッチ入っちゃう人いるのねw
初心者スレなのにね
>>970 お勧めされてないのには理由があるってことだな
素直にActiveScriptRuby使え
aptで入れろよカス
標準添付と銘打たれているライブラリが、さりげなく入ってないのはtrapだよな・・・ お間抜けさんというか、多くの初心者はRuby/Tkも入ってると思うだろう まあRubyInstaller以外でも似たようなのはあるから、どっちもどっちではあるけど
ASRが意図的にてんこもりなんだよね いらん物までゴテゴテついてるという見方もできなくもない
Pythonみたいに公式でWindows用バイナリが配布されてて Tkinter込みなので、そのままTkが動かせるのはいいなぁと思う
Pythonは公式が大量のライブラリ添付する方針だからな
Windows7でActiveScriptRubyをインストールして gem installすると ERROR: While execution gem ... (Errno::EACCES) Permission denied - C:/PROGRA~1/ruby-1.8/bin/rackup.bat ってエラーがでてうまくいかないのはなぜ? そのディレクトリは書き込み可能にしてるんだけど。
asrって古いからいやです 新しいものを使いたいのでriを使いたいのです
981 :
デフォルトの名無しさん :2011/04/18(月) 01:37:56.22
riと書くとリファレンス閲覧ツールのほうと間違えるから略さないほうがいいよ。 文脈で違うと分かるけどさ。
>>979 エラーとしてはまあそのまんま
そのファイル「が」パーミッションのエラーを起こしてる
そのファイル「で」パーミッションのエラーを起こしてるんじゃないので、bin/ だけいじってもダメ
gem install -V hogehoge すると、たぶん該当フォルダの書き込み表示したところでエラーだ
いくつか方法はあるんだけど、gem をホームのフォルダに user-install してしまうというのはどう
ユーザーのホームのフォルダの中にある .gemrc という6文字ファイルの先頭が
---
gem: "--user-install"
という2行になるように編集
それ以降、gem はすべてホームのフォルダの .gem/ というフォルダの中に入る
あと、rubygems 本体の更新ができないので
C:\Program Files\ruby-1.8\lib\ruby\bin
C:\Program Files\ruby-1.8\lib\ruby\vendor_ruby
の2つの書き込み権をrubyさんかgemさんのどっちかに対してどうにしかしておく
何からの理由でユーザーインストールせずパーミッションだけで解決したい場合は、上記の2フォルダに加えて
C:\Program Files\ruby-1.8\lib\ruby\gems
の3つくらいに対して、rubyさんかgemさんが書き込み可能にしておく
>>982 サンクス。
ちょっと今時間がないので、試したらまた報告します。