Ruby 初心者スレッド Part 33at TECH
Ruby 初心者スレッド Part 33 - 暇つぶし2ch39:デフォルトの名無しさん
09/12/07 03:52:50
s = "aaa bbb ccc:ddd eee"
if s =~ /ccc:(\S+)/
   t = $1
   s.gsub!(/ccc:(\S+)/, "") # この二度手間な記述をもっと簡潔に書くやり方はないですか?
end
p s # "aaa bbb eee"
p t # "ddd"


40:デフォルトの名無しさん
09/12/07 05:06:06
こう?

s = "aaa bbb ccc:ddd eee"
t = s.gsub!(/ccc:(\S+)/, '') ? $~[1] : ''


41:デフォルトの名無しさん
09/12/07 05:10:30
>>39
これくらいしか思い付かん
s = "aaa bbb ccc:ddd eee"
t = s[/ccc:(\S+)/,1]
s.gsub!(/ccc:(\S+)/,"")
又は
s,t = "aaa bbb ccc:ddd eee"
s.gsub!(/ccc:(\S+)/) { t = $1 ; "" }
もしくは
s = "aaa bbb ccc:ddd eee"
s,t = $`+$',$1 if s =~ /ccc:(\S+)/

42:デフォルトの名無しさん
09/12/07 05:12:15
>>40
ここで $1 ではなく $~[1] を使う理由はある?

43:デフォルトの名無しさん
09/12/07 10:18:05
というか特段二度手間でもない
簡潔でわかりやすくていいじゃん

44:デフォルトの名無しさん
09/12/07 11:08:35
attr_* をそのままライブラリ外に公開する理由ってたいていの場合薄いよね?

45:デフォルトの名無しさん
09/12/07 11:16:10
>>44
そういう考え方もある
内部変数名と同じ名前のpublicなメソッドを外部提供する理由は本来無い
ユーザーに提供されるべきは、もっと一段上の名称&機能なメソッドであるべき

 attr_writer :username, :password

ではなく

 def user_info(h={})
  @username, @password = h[:username], h[:password]
 end

とかのほうがいいんじゃね、みたいな考え

オープンクラスだし堅いこと言うなJava使えJavaって感じではあるが

46:デフォルトの名無しさん
09/12/07 16:30:36
>>39
gsub!を使うということは複数回の置換が想定されるのか?
tの値は置換が起こらなければ保存しておきたいのか?

置換でも$1は得られるので
複数回の置換がおこなわれるうちの最後の$1が取れればいいだけなら
>>40 でいい
置換が起こらなければtを変更したくないのならば
t = $1 if s.gsub!(/ccc:(\S+)/, '')
とか、置換が起こらなければt=nilになってもいいのなら
t = s.gsub!(/ccc:(\S+)/, '') && $1

複数回置換のうちの最初の $1 が得たいのなら
置換が起こらなければt=nilになりますが >>41 の二番目をちょっと変えた
t = nil
s.gsub!(/ccc:(\S+)/) { t ||= $1 ; "" }
とか
t = nil
t ||= $1 while s.sub!(/ccc:(\S+)/,'') #gsub!と違って置換した結果をさらに置換していくので結果が変わることもある
とかですかね
でも、巨大文字列内の大量置換を一気にやり、なおかつ最初の$1を得たいのなら>>39が一番速いかな
>>41の最初のでもいいけど tが変更されるし>>39の方がわかりやすい


47:デフォルトの名無しさん
09/12/07 19:14:47
URLリンク(itpro.nikkeibp.co.jp)
今年はじめのこんな記事を見つけたんだけど、仕様書草案ってもうどこかで見られる?

48:デフォルトの名無しさん
09/12/07 19:19:46
RubySpecかな

49:デフォルトの名無しさん
09/12/07 19:31:48
>>47

Rubyについて Part 38
スレリンク(tech板)

261 名前: デフォルトの名無しさん Mail: sage 投稿日: 2009/12/01(火) 19:36:45
URLリンク(ruby-std.netlab.jp)


50:デフォルトの名無しさん
09/12/07 19:39:59
㌧㌧㌧! ありがとうございます!

51:デフォルトの名無しさん
09/12/07 21:34:59
Rubyのテスト用フレームワークっていくつかあるみたいですが何がいいでしょうか?
場合による、という結論かもしれませんが
みなさんは何を使ってますか?

52:デフォルトの名無しさん
09/12/07 21:45:45
目的によるし、おおむね目的ごとに分かれてると思う
自分で使ってテストの方向性に合うものを選択するといい
テストフレームワークを1種類しか使えない、という人は少ない

よーわからんがテストってあると便利そうじゃね、というのなら RSpec から始めるといいんじゃね

53:デフォルトの名無しさん
09/12/07 22:19:44
よーわからんがテストってあると便利そうじゃね、というレベルなら、
標準添付のtest/unitがいいんじゃね

54:デフォルトの名無しさん
09/12/07 22:34:53
テストっちゃ、「ファイルに保存されたかどうか」のテストってどうやるん

55:デフォルトの名無しさん
09/12/07 22:44:51
>>52-53
アドバイスありがとうございます
そうですね、もう少し調べたりいろいろ使ってみて決めたいと思います

56:デフォルトの名無しさん
09/12/07 22:47:08
・ 書き出し先ファイルがあれば削除
・ ファイル保存を含んだメソッドを実行
・ 例外が起こらないことをテスト
・ ファイルの中身が期待通りであることをテスト
・ 書き出し先ファイルがあれば削除

書き出すファイルを削除できないという場合は知らん
「きっと保存されるはず」みたいなテストするしかなくね

57:デフォルトの名無しさん
09/12/08 03:20:32
最終手段的には、事前にFile.openやFile#writeをフックとか・・・

58:デフォルトの名無しさん
09/12/08 11:45:06
FTPでディレクトリの更新日時が知りたいのですが取れません
一般的に、FTPではLSコマンドの結果を解釈するしかないのでしょうか?
(net/ftpを利用してます)

59:デフォルトの名無しさん
09/12/08 11:55:44
MLSDとか送ればいいんじゃないの

60:デフォルトの名無しさん
09/12/08 13:17:10
>>58
一般には自力で解析するしかない。
MDTMというコマンドもあるがすべてのftpサーバが実装しているわけではない。


61:デフォルトの名無しさん
09/12/08 14:02:01
>>54
class Publisher
def initialize(p)
@text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path]
end
def publish
output = replace(@text, @from, @to)
save(output, @path)
end
def replace(text, from, to); text.gsub(/#{from}/){to}; end
def save(str, path); File.open(path, 'wb'){|f| f.print(str)}; end
end

# Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby',
# :path=> 'ruby_love.txt').publish #=> "オブジェクト指向スクリプト言語Ruby大好き!"

これの Publisher#save をテストしたいとかそんなの?

62:デフォルトの名無しさん
09/12/08 14:29:56
>>61
こう囁く
「なー、そのsaveするときの文字列がクラス本体にpとか追記せずに画面に表示できたら便利だと思わね?」
そしてこうする

class Publisher
def initialize(p)
@text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path]
end
def publish
output = replace(@text, @from, @to)
save(io, output)
end
def io
case @path
when IO, File then @path
when "$stdout", nil then $stdout
when "$stderr" then $stderr
else File.open(@path, 'wb')
end
end
def replace(text, from, to); text.gsub(/#{from}/){to}; end
def save(io, str); io.print(str); io.close if io.kind_of?(File); end
end

Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby', :path=> $stdout).publish

これなら Publisher#save に StringIO を渡せばテストできるはず
保存時ファイル操作のエラーのときに独自処理したい場合はこれでは駄目だけど

63:デフォルトの名無しさん
09/12/08 16:17:20
JRubyとRubyの違いについて調べてみたのですが、
いまいちわからなかったのでここで質問してみます。
JRubyはコーディングの仕方が、Rubyと同じなだけであり、
それ以外の部分は全く別なものという解釈でいいのかな?

根本は全く違うものではあるが、コードレベルでは
同じ内容で動くものなので、移植する場合は、
コードのコピペでおk・・・かな?

64:デフォルトの名無しさん
09/12/08 17:29:49
>>59, 60
ありがとうございました

65:デフォルトの名無しさん
09/12/08 19:03:00
>>63
普通のRubyはCで書いてある
Cで書いてあるので拡張ライブラリはCで作るとよく動く
現在のCのバイナリはだいたい同じように動作することが期待できるのでRubyスクリプトを一度書けばどこでも動く

JRubyはJavaで書いてあるというかJavaで動くというかJava仮想マシンJVM上で動作する
Javaで書いてあるので拡張ライブラリはJavaで作ると普通に動く
おまけにJavaプログラムの一部として埋め込むことも実行することもJavaのライブラリを呼ぶこともできる
通常のRuby(Cで書かれているので区別のためにCRubyと呼ぶ)と同じように動作するように作ってあるものの
たまーに動作が違う部分が混じってることもないわけではないんだが
いちいちスクリプトレベルで対処するのも面倒だしそれこそ煩雑なので無視

本質的にはJVMのぶんだけJRubyのほうが遅い
ただ、JVMを常に起動してる場合は遜色ないか、JRubyのほうが処理が速いこともある

66:デフォルトの名無しさん
09/12/09 06:11:28
      ,―ヽ____、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-―-、   ・ /
    i、  <(EEEEE)> ∵/    まピョーん☆ IPA Rubyをこれからもよろしく
      i、   \___/  _/
       \       ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||

67:デフォルトの名無しさん
09/12/09 10:43:59
おまえら1.9.1更新しろー
URLリンク(sourceforge.jp)
と思ったがインストーラつきを公開してる人はまだいないのね

68:デフォルトの名無しさん
09/12/09 10:47:19
みんなに広まってからアップグレードする
どうせチェックにしか使ってないし、自分だけ「みんなと違って最新」だと意味ないし

69:デフォルトの名無しさん
09/12/09 11:01:47
>>68
安心しろ
1.9.1を普段使ってる奴は普通にアップグレードするし、
1.9.1を自分のスクリプト用のチェックにしか使ってない奴は
「この人のスクリプト俺の1.9.1-p0(しかもmswin32)だと動かないんすけどー」とか言ってきたりはしない
とっととアップグレードすれ

70:デフォルトの名無しさん
09/12/09 11:14:16
head使いには関係ないしな。


71:デフォルトの名無しさん
09/12/09 11:19:29
というか、パッチレベル0を鬱陶しいと思ってる人にこそ、
「1.9.1は最新版でしかチェックしてません」と公言するのをお勧め
そうしないといつまでたってもだらだら残るぞ
自分のサイトに最新版へのリンクでも張っとけ

72:デフォルトの名無しさん
09/12/09 11:25:34
~/work/source/ruby-1.9.1-p243$ make uninstall
make: *** ターゲット `uninstall' を make するルールがありません. 中止.

ぬう
てか前回のconfigureにどんなオプションつけたか忘れたしどこにインストールされたか調べるのめどい

73:デフォルトの名無しさん
09/12/09 11:45:58
「引数はHashの入ったArrayにしろ」って英語の警告でどう言えばいい?

74:デフォルトの名無しさん
09/12/09 11:54:23
raise ArgumentError, "invalid argument, RTFM"

75:デフォルトの名無しさん
09/12/09 12:12:55
ArgumentError を出したなら「引数が不正です」は言う必要なくね

76:デフォルトの名無しさん
09/12/09 12:35:33
>>73
スレ違い。 このへんで聞け。
スレリンク(tech板)

77:デフォルトの名無しさん
09/12/09 12:37:03
URLを間違えた。こっちだ。
スレリンク(tech板)

78:デフォルトの名無しさん
09/12/09 12:44:01
>>73
Hashを要素にしたArrayって英語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど

79:デフォルトの名無しさん
09/12/09 12:45:27
>>78
Hashを要素にしたArrayって日本語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど


80:デフォルトの名無しさん
09/12/09 12:55:43
>>78
Hashed Array

81:デフォルトの名無しさん
09/12/09 13:25:14
初心者以前の入門者の質問で申し訳ないのですが
Rubyの絵本で勉強を始めましたところ
「配列要素の代入と参照」の項のサンプルコードで躓きました。

n cats = [] = 1
cats[0] = "Kuro"
cats[1] = "Tama"
cats[2] = "Mike"
cats[3] = "Tora"
puts cats[n]
cats[0] = "Shiro"

このサンプルの1行目で以下のようなエラーが出てしまいます

hello.rb:1: syntax error
n cats = [] = 1
^
ググりまして「syntax error」が文法だということは分かりましたが
文法はまだ「文字列表示」と「変数」と「文字列」しか学習出来ていません
本の通りに入力しただけで、この1行目について本には一切説明がないので
どのように文法が違うのかも分からない状態です
この1行目がどのような意味なのか教えていただけないでしょうか
よろしくお願いいたします

環境
CentOS 5.3
ruby 1.8.5 (2006-08-25) [x86_64-linux]


82:81
09/12/09 13:28:11
>n cats = [] = 1
>^
スペースが省略されて「^」の位置がずれてしまいました
「^」は=と1の間にあるスペース部分を指しています

83:デフォルトの名無しさん
09/12/09 13:31:59
本書くとき間違えたんだろうな
売れてないのか何なのか正誤表にはとくに載ってない
おそらくこれが正しい

n = 1
cats = []
cats[0] = "Kuro"
cats[1] = "Tama"
cats[2] = "Mike"
cats[3] = "Tora"
puts cats[n]
cats[0] = "Shiro"

putsでは cats[1] の Tama が表示されるはず

84:デフォルトの名無しさん
09/12/09 13:38:25
質問
メソッドの中から、そのメソッドを呼び出しているメソッドの名前を知りたいのですが、
Kernel#caller以外の方法はありますか?

現在、caller が返す配列の中身に大してパターンマッチングを行って
メソッド名を切り出しているのですが、もっとよい方法がありそうな気がしまして

85:デフォルトの名無しさん
09/12/09 13:42:44
個人的には、空の配列に添え字代入のサンプルを書く本はあんまし好きじゃない
せっかくのRubyなんだからもっとコレクションとしての扱い方から見せたほうがいいと思うなあ

cats = []
cats << "Kuro"
cats << "Tama"
cats << "Mike"
cats << "Tora"
p cats
puts cats[1]
cats[1] = "Shiro"
p cats

こっちのほうがきっと驚いてもらえるぞ
「配列ってなんかざくざく入るんだね!」みたいな

86:81
09/12/09 13:43:10
>>83
ありがとうございます
無事Tamaを表示することができました。

87:デフォルトの名無しさん
09/12/09 13:58:35
>>80
うそをいうな。

88:デフォルトの名無しさん
09/12/09 14:02:07
>>87
では真実を

89:デフォルトの名無しさん
09/12/09 14:20:00
Hashed Array = Associative Array = rubyのHash

90:デフォルトの名無しさん
09/12/09 14:20:08
array of hashes じゃないの?

91:デフォルトの名無しさん
09/12/09 14:57:30
array containing hash

92:デフォルトの名無しさん
09/12/09 14:59:57
泣きながらF5連打してたらこまるので

>>84
それが普通の手段

93:デフォルトの名無しさん
09/12/09 15:03:04
>>84,92
1.8.7以降を使ってるなら、__method__で。

94:93
09/12/09 15:04:07
あ、ごめん、見間違えた。
呼び出し元を知るには、当然callerですね。

95:デフォルトの名無しさん
09/12/10 05:12:13
独習Rubyってどうよ?

96:デフォルトの名無しさん
09/12/10 08:41:52
Googったんですけどわかんなかったんで教えてくださいおながいします。

「AはBクラスのインスタンスである」ってのは A === B って書きますが、「AはBクラスの
インスタンスでない」ってのはどう書けばいいでしょうか?

97:デフォルトの名無しさん
09/12/10 09:16:33
=== の否定はないから全体を !

98:デフォルトの名無しさん
09/12/10 09:20:24
> 「AはBクラスのインスタンスである」ってのは A === B って書きますが
いいえ

a.kind_of?(B)

とでも書いてください
特定クラスのインスタンスでないということをチェックしたい場合は

unless a.kind_of?(B)

と書くか、または

if !a.kind_of?(B)

と書きます

99:デフォルトの名無しさん
09/12/10 09:22:57
>>96
A === B というのはA(レシーバ)の持つ===というメソッドに引数としてBを渡すということ(A.===(B)と同じ)
メソッド===はレシーバのクラスによって意味が違う
URLリンク(www.ruby-lang.org)

Classクラス(の親クラスであるModuleクラス)の===メソッドは以下の意味
URLリンク(www.ruby-lang.org)

だから「AはBクラスのインスタンスである」を書くとするならBのメソッドなので B === A としなければならない

目的のはinstance_of?の否定かkind_of?の否定か
URLリンク(www.ruby-lang.org)



100:デフォルトの名無しさん
09/12/10 09:37:35
>>99
初心者に instance_of? を勧めるのは正直あまりお勧めしない

irb> p 12.instance_of?(Integer)
false
irb> p 12.instance_of?(Fixnum)
true
irb> p 10000000000.instance_of?(Fixnum)
false
irb> p 10000000000.instance_of?(Bignum)
true

irb> require 'uri'
irb> p URI.parse("URLリンク(example.com)").instance_of?(URI)
false
irb> p URI.parse("URLリンク(example.com)").instance_of?(URI::HTTP)
true

間違ってないけどー
動作合ってるけどー
でもー

101:96
09/12/10 09:50:45
みなさんありがとう。Googり方が悪いんだよカス!とか言われると思ってました。

102:デフォルトの名無しさん
09/12/10 09:52:57
=== が検索できるようになってたら罵倒されたと思う

103:デフォルトの名無しさん
09/12/10 09:53:39
>>101
いちいちスレあげんなカス!

104:デフォルトの名無しさん
09/12/10 09:57:37
>>65
分かりやすい解説ありがとうございました。
イメージがつきました。

105:デフォルトの名無しさん
09/12/10 14:00:10
>>103
うるせーバカ

106:デフォルトの名無しさん
09/12/10 16:30:19
2chブラウザ使っている人で、スレッドの位置を気にしている人はいるの?
俺は履歴とかブックマークからスレッドにたどり着いているので、板一覧とか
見ていないし、スレッドの位置も特に気にしていない。

そもそも、こういう掲示板のage/sageって自由であるべきで
他人が強制するものではないと思う。

107:デフォルトの名無しさん
09/12/10 19:27:14
aというハッシュのキーにclassがあったらその値に " button"を追加して、なかったら"button"だけ、という記述を
下記のように書いたのですが、
もうちょっといい書き方ないもんでしょうか?

[{}, {:class => "hoge"}].each do |a|
  a[:class] = (a[:class] ? a[:class] + " ": "") + "button" #←ここをなんとかしたい
  p a
end

108:デフォルトの名無しさん
09/12/10 19:48:10
マジレス
if a[:class]
 a[:class] += ": button"
else
 a[:class] = "button"
end

ネタレス
a[:class] = [a[:class], "button"].compact.join(": ")

109:デフォルトの名無しさん
09/12/10 21:16:51
デフォルト値が設定されてるとおかしなことになりそうな気が…

110:デフォルトの名無しさん
09/12/10 21:19:23
デフォルト値を設定すること自体がおかしいだろ

111:デフォルトの名無しさん
09/12/10 21:27:35
二時間近く>>108に突っ込む奴がいないわけだが
年末でいつもの人は忙しいのかw

112:デフォルトの名無しさん
09/12/10 21:53:53
デフォルト値は設定しちゃダメなの?

113:デフォルトの名無しさん
09/12/10 23:00:34
配列aとbが対等な関係にある場合に、
a.zip(b)
とするのは対称でなくて見た目が悪いと思うのですが、どう思いますか?

114:デフォルトの名無しさん
09/12/10 23:03:00
それ感じたことがある。けれど代替案が見つからない。

115:デフォルトの名無しさん
09/12/10 23:03:18
別にどうも思いませんが
まあ気になるならArrayクラスのクラスメソッドにでもしてしまうとよろし
Array.zip(a, b) みたいなのなら問題あんめえ

116:デフォルトの名無しさん
09/12/10 23:04:58
>>115
それいいね。それなら、3項間以上でもすっきりかけるね。

117:デフォルトの名無しさん
09/12/10 23:05:20
Array.zip(a, b)
みたいな形だとどう?

118:デフォルトの名無しさん
09/12/10 23:05:42
ついでにEnumeratorを返すようにしてほしいと思いませんか?

119:デフォルトの名無しさん
09/12/10 23:08:22
つーとむしろ
Enumerator.zip(a,b)
なんか変か?

120:デフォルトの名無しさん
09/12/10 23:34:04
>>107

[{}, {:class => "hoge"}].each do |a|
a[:class] &&= a[:class]+" button"
a[:class] ||= "button"
p a
end

[{}, {:class => "hoge"}].each do |a|
begin
a[:class] += " button"
rescue
a[:class] = "button"
end
p a
end

def space_add h,s
return nil if h.nil?
h.replace( h+" "+s )
end
[{}, {:class => "hoge"}].each do |a|
space_add(a[:class],"buttom") || a[:class] = "button"
p a
end


121:デフォルトの名無しさん
09/12/10 23:53:39
>>113
ですが、新しいメソッド付加するほどでもないと思っていたら困ったことに・・・
ちなみに本当にほしいものは、長いほうに合わせて
[[3, 1], [4, 2], [5, 2], [6, 2]]
です。メソッド追加しないと無理ですかね?
################################

irb(main):005:0> a = [1,2]
=> [1, 2]
irb(main):006:0> b = [3,4,5,6]
=> [3, 4, 5, 6]
irb(main):007:0> a.zip(b)
=> [[1, 3], [2, 4]]
irb(main):008:0> b.zip(a)
=> [[3, 1], [4, 2], [5, nil], [6, nil]]

122:デフォルトの名無しさん
09/12/11 00:02:14
追伸:
しかも欲しいものは配列じゃなくてEnumeratorです。
> zip(a,b).each{|e| p e}
[1,3]
[2,4]
[2,5]
[2,6]

みたいに。

123:デフォルトの名無しさん
09/12/11 00:08:32
twitterとかで、投稿時刻を HH:MM:SS ではなく、「約15分前」「約2時間前」というふうに表示してますけど、
これをやってくれるRubyのライブラリはありますか。
ついでにJavaScriptのライブラリもあるとうれしいです。

124:デフォルトの名無しさん
09/12/11 00:35:15
ありません。自分で書いてください。

(Time.now.to_i - time.to_i) を適当に加工したらできるし。

125:デフォルトの名無しさん
09/12/11 00:45:02
railsならdistance_of_time_in_words

126:デフォルトの名無しさん
09/12/11 01:57:30
>>125
>distance_of_time_in_words

Thank you very much!

>>124
F***!

127:デフォルトの名無しさん
09/12/11 06:25:36
RubyはLispの替わりで使えるのか?

128:デフォルトの名無しさん
09/12/11 07:49:58
文法が全然違うからLispのソースはまず動かないよ

129:デフォルトの名無しさん
09/12/11 08:25:43
>>126
Railsならそう言えよ。


130:デフォルトの名無しさん
09/12/11 12:04:28
>>125-126
RailsのActionPackのActionViewっぽいね。これだけ使えないのかな

131:デフォルトの名無しさん
09/12/11 12:27:45
RailsはRailsで

132:デフォルトの名無しさん
09/12/11 13:40:27
>>130
require 'active_support'
require 'action_view/helpers/date_helper'
include ActionView::Helpers::DateHelper

あー、あとI18n関係の設定がいるかな。以外と面倒かも。



133:デフォルトの名無しさん
09/12/11 13:57:40
そもそも単独で使うようにできてないからな
たった一つの処理のために本質でないファイルをウンコのごとく読まなきゃならんし割に合わん

134:デフォルトの名無しさん
09/12/11 14:46:29
>>133
「ウンコのごとく読む」っていう比喩がわかんない。
どんな風に読むことを「ウンコのごとく」って言うの?

135:デフォルトの名無しさん
09/12/11 17:58:38
>>129
Railsだと分かっていたら答えられたとでもいうのかよwwww

136:デフォルトの名無しさん
09/12/11 18:23:13
たぶんYESなんじゃないかな

137:デフォルトの名無しさん
09/12/11 19:21:02
      ,―ヽ____、―
   ,/  ノ       ヽ  ~\
  /   ノ   Ruby    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-―-、   ・ /
    i、  <(EEEEE)> ∵/    楽しいプログラミング言語はIPA Rubyだけ
      i、   \___/  _/
       \       ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||

138:デフォルトの名無しさん
09/12/11 21:48:40
モジュールの定義の有無を確認する方法ってありますか?
method_defined?のモジュール版みたいなのを探しているのですが・・・

139:デフォルトの名無しさん
09/12/11 21:57:29
>>138
require 'net/http'
Object.const_defined?(:Net) #=> true
Net.const_defined?(:HTTP) #=> true

140:デフォルトの名無しさん
09/12/12 23:46:17
メソッド中で変数を書き換えられる場合と書き換えられない場合の区別がいまだに分からないのですが、
X=[1,2,3]
def f X[1]=4 end
大文字(const配列?)のくせにこれは書き換え成功する。

x = 1
def g x=2 end
これはスコープ内で局所変数と解釈されて、書き換えられない。

Y=1
def h Y=2 end
これは定数書き換えが不正と解釈されて通らない。

h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。
ポインタっぽいのがあると一番いいのですが・・・。

141:デフォルトの名無しさん
09/12/12 23:49:33
>>140
>X=[1,2,3]
>def f X[1]=4 end
>大文字(const配列?)のくせにこれは書き換え成功する。

前後にX.object_idを表示してみると、「同じオブジェクト」を
指したままであることが確認できるはず。

配列のような内部に状態を持つオブジェクトの状態を変更することは
定数という観点でいうと「書き換え」ではない。

>x = 1
>def g x=2 end
>これはスコープ内で局所変数と解釈されて、書き換えられない。

>h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。
>ポインタっぽいのがあると一番いいのですが・・・。

オブジェクトと変数の区別を理解してから出直しておいで。


142:デフォルトの名無しさん
09/12/13 00:07:05
返信ありがとうございます。
オブジェクトと変数の区別があるのは分かりますが、
X = Integer(1)

Y = [1,2,3]
はどちらも
定数=「オブジェクトのインスタンス」
に見えるのですが。

143:デフォルトの名無しさん
09/12/13 00:12:11
irb(main):001:0> CONS = [0, 1, 2]
=> [0, 1, 2]
irb(main):002:0> CONS = ["A", "B", "C"]
(irb):2: warning: already initialized constant CONS
=> ["A", "B", "C"]

144:デフォルトの名無しさん
09/12/13 00:12:28
定数は参照の付け替えが出来ないだけで
参照先のオブジェクトが内部状態を変えることには関知しない

145:デフォルトの名無しさん
09/12/13 00:18:59
では
class Integer
def f
self = 8
end
end
X = Integer(3)
X.f()
p X
みたいな感じで内部状態を変えることは原理的には可能でしょうか?

146:デフォルトの名無しさん
09/12/13 00:23:02
>>145
オブジェクトと変数の区別を理解してから出直しておいで。

147:デフォルトの名無しさん
09/12/13 00:25:02
いや、もちろん
@なんとか=8
でしょうけど。

148:デフォルトの名無しさん
09/12/13 00:29:09
オブジェクトと変数の区別を理解したいので
質問を続けます。

149:デフォルトの名無しさん
09/12/13 00:29:25
>>145
Integerのような組み込みのクラスだとそれできないから、i++とかインクリメンタル演算子が実装できないんだよね・・・

150:デフォルトの名無しさん
09/12/13 00:31:32
>>149
selfを変更できるクラスはRubyにはないぞ
データ格納領域がRuby的に保護されてて触れない

151:デフォルトの名無しさん
09/12/13 00:36:43
selfはたんに気分で書いてしまったので気にしないでください。
(私のミスです)

自分で定義したクラスなら
class MyInt
def initialize(i)
@i=i
end
def ++() # 前置演算子の定義の仕方はしらないですが・・・
@i+=1
end
end
でいいわけですよね。


152:デフォルトの名無しさん
09/12/13 00:36:49
もとのxの件はオブジェクトと変数の違いではなく
ローカル変数のスコープの問題だねえ。

153:デフォルトの名無しさん
09/12/13 00:38:42
>>152
そうですね。本当はそれが知りたかったわけですが・・・。
グローバル変数にすればいいんだけど、なんか気持ち悪い。

154:デフォルトの名無しさん
09/12/13 00:41:31
なんか引数で参照渡して、それを書き換えればいいんだよ~
みたいなのはないんでしょうか?

・・・たぶんないんでしょうね

155:デフォルトの名無しさん
09/12/13 00:44:42
引数で渡していいならArrayみたいな内部状態を持つオブジェクトに包んで
渡すくらいかね。


156:デフォルトの名無しさん
09/12/13 00:48:32
初心者なんで間違っているかもだけど、参照渡しだから引数に渡された
オブジェクト自体を書き換えることはできるよね?

def method(str) {str.gsub! /a/, '!'}

x = "katakana"
puts x #=> "katakana"
method x
puts x #=> "k!t!k!n!"

157:デフォルトの名無しさん
09/12/13 00:48:47
やっぱそれですか。
議論によって問題の所在がはっきりしてきました。
おつきあいありがとうございます。

158:デフォルトの名無しさん
09/12/13 00:51:40
>>156
それはたぶん文字の配列わたしてるですね。

159:デフォルトの名無しさん
09/12/13 00:53:10
えっ?

160:デフォルトの名無しさん
09/12/13 00:53:23
そうだ、eval使おうか(笑)!

161:156
09/12/13 00:54:39
>>158
Ruby のStringオブジェクトの内部ってArrayで表現されていたんですか?
知りませんでした。><
C言語みたいですね。

162:デフォルトの名無しさん
09/12/13 00:56:25
158ですが、私も初心者なので、フォローお願いします。
普通の言語なら文字列の扱いはそうなってるんじゃないかなぁ?

163:デフォルトの名無しさん
09/12/13 01:06:12
何の意味があるか分からない思いつきだけど通りました。
X='12'
def f
X.gsub!('12','2')
end
f()
p eval(X)

164:デフォルトの名無しさん
09/12/13 01:22:35
>>162
文字列がイミュータブル(変更不可)な言語は普通にあるよ
Pythonなんかもそう

>>> s = 'abc'
>>> s[0] = 'A'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

上のごちゃっとしたところをまとめると
* 変数はオブジェクトに付けられた矢印(あるいはラベル)。例: a = [1,2,3]
* 変数を通じてオブジェクトを操作することが出来る。例: a[0], a[1]
* Rubyの文字列はミュータブル(変更可能)なので
 変数が指すオブジェクトの中身を書き換えることができる。例: a[1] = 20 # [1,20,3]

165:156
09/12/13 01:24:26
>>162
自分なりに調べてみました。

def method(obj)
 obj.object_id
end
str = "katakana"
p str.object_id #=> 69877275538400
p method str #=> 69877275538400

この結果から分かりますが、上記の変数 str と obj は同一のオブジェクトを指しています。
したがって、変数 obj に対して破壊的なメソッド(オブジェクト自体を変更するメソッド)を使うと
str が指しているオブジェクトも同一ですから、objに対して行った操作が反映されている、というわけですね。
あってますか?

あと、Stringオブジェクトの内部表現については詳しくしりません。
Rubyのソースを読んでみればわかると思うのですが、まだそこまでのレベルではないので...
スレ汚し失礼しましたです。

166:164
09/12/13 01:27:10
例が文字列じゃなく配列になってた。それぞれ以下に読み替えて

例: s = '123' # sは文字列 '123' を指す
例: s[0], s[1] # sの一文字(バイト)目と二文字目を取得
例: s[1] = '5' # sの一文字目を '5' に変更

>>165
あってるお
内部表現なんて実装次第なんだから
出来ることを正確に把握するほうが大切

167:デフォルトの名無しさん
09/12/13 01:32:12
カビの生えた例だけどこんなのも貼っとく

a = [0, 1, 2]
b = a
b[1] = 10

これでaが何になるのかわからなかった人は横着しないで入門書嫁

168:140
09/12/13 08:24:28
昨日の者ですが、
結局クラスでラップする感じになるのかなぁ。
下は意図した通りに動きます。

def State(val)
Monad.new(val)
end
class Monad
def initialize(val)
@val=val
end
attr_accessor :val
end
def f(st)
st.val += 1
end

X = State 1
f(X)
p X.val

169:140
09/12/13 08:30:00
なるほどRubyって関数型言語だったのか!

170:デフォルトの名無しさん
09/12/13 08:33:09
Dir.globが探索するファイル/ディレクトリの条件って何ですか?

i=0
Dir.chdir("C:\\"){Dir.glob('**/*'){i+=1}}
p i
=>150660

dir c:\ /s /b /a|find /c /v ""
=>154483

C:\の全ファイルを選択→プロパティのファイル数+フォルダ数
=>153390

1~2違うどころではないんだが・・・('A`)

171:デフォルトの名無しさん
09/12/13 09:22:12
>>170
DOSのコマンドを知らないから憶測だけど、
"."と".."を含めてる含めてないとか?

172:デフォルトの名無しさん
09/12/13 09:40:23
>>170
日本語ファイル名が膨らまれているとか

173:デフォルトの名無しさん
09/12/13 11:00:49
るびまのページいま停止中?

174:デフォルトの名無しさん
09/12/13 11:22:02




175:デフォルトの名無しさん
09/12/13 11:44:38
p "あ"

とすると、

"\202\240"

8進数で返ってくるのでわかりにくいです。
16進数で帰ってきて欲しいのですが、どうすればいいのでしょうか?

176:デフォルトの名無しさん
09/12/13 12:05:56
String#inspect の定義を変更すれば良い。
class String; def inspect; "\""+ self.each_byte.map{|c| "\\x%02x" % c }.join + "\""; end; end

177:デフォルトの名無しさん
09/12/13 12:15:41
0x20...0x80はそのままにした方が目に優しそうだ
あと?\と?"は別扱いでとか考え出したら面倒くせええ

178:デフォルトの名無しさん
09/12/13 12:17:32
>>176
それ、他のオブジェクトをinspectするときに影響が出ちゃわない?

179:デフォルトの名無しさん
09/12/13 13:03:51
8進表記されてるのだけ、16進に直すのはどう?

class String
 alias _inspect inspect

 def inspect
  self._inspect.gsub(/\\(\d+)/){ "\\x{%02x}" % $1.oct }
 end
end

180:デフォルトの名無しさん
09/12/13 13:06:37
文字列を16進表記にする関数的メソッドを定義するべきだと思うなあ

181:デフォルトの名無しさん
09/12/13 13:40:29
直前の式の返り血が入ってる組み込み変数とかってないですか?
Rubyを関数電卓代わりに使いたいんですけど

182:デフォルトの名無しさん
09/12/13 13:44:29
>>181
irb でよければ _ だと思う

183:デフォルトの名無しさん
09/12/13 13:44:54
>>181
irb

irb> 1+2
3
irb> _ +4
7

まあ返り値ならなんでもいいんだけど

irb> Time.now
Sun Dec 13 13:40:19 +0900 2009
irb> _.year
2009

184:デフォルトの名無しさん
09/12/13 13:48:02
ありがとうございます
できればirbじゃなくても使いたいんですが無いですか

185:デフォルトの名無しさん
09/12/13 13:52:21
関数の戻り値は最後の参照みてるんだし
@かなにかに保持してくれるといいと祈り続けて早10年

186:デフォルトの名無しさん
09/12/13 14:08:15
>>179
俺もそれ考えたけど"\\1000"とかで困る

187:デフォルトの名無しさん
09/12/13 15:24:26
>>180
こうするのが一般的?

p "あ".unpack("H*")

188:デフォルトの名無しさん
09/12/13 18:12:58
PHPのcall_user_funcにあたる機能はRubyでも実現できますか?
実行時に呼び出すメソッドを切り替えたいのです。

189:デフォルトの名無しさん
09/12/13 18:15:34
>>188
send, evalなど

190:デフォルトの名無しさん
09/12/13 18:24:48
>>188
ありがとうございます。

191:デフォルトの名無しさん
09/12/13 18:25:33
間違えた…>>189でした

192:デフォルトの名無しさん
09/12/13 18:49:28
異なる文字コードの文字列を同時に出力するとかじゃない限り
適切に漢字コードを指定しておけばちゃんと日本語表示されるんじゃないの?
$KCODE = 'S'
p "あ"
> "あ"

文字じゃないバイナリ列とか表示させるときに16進文字列がいいのなら
そういう出力メソッドを作るなりすれば


193:デフォルトの名無しさん
09/12/13 19:07:54
1.9 なら encoding を文字列が持ってるからできるが、1.8 なら無理だね。
あと $KCODE は 1.9 じゃ廃止だ


194:デフォルトの名無しさん
09/12/14 01:00:47
module Hoge
def f1 end
def f2 end
・・・ってかんじでメソッドがたくさんあったときに
module_function :f1,:f2,...
って全部書くしか、外からアクセスする方法はないでしょうか?
end

195:デフォルトの名無しさん
09/12/14 01:05:21
include Hoge で f1 や f2 を取り込めるよ

196:デフォルトの名無しさん
09/12/14 01:12:46
名前空間は汚染したくないので
Hoge::f1
というアクセスだけ許したいのですが・・・
いちいち書くのは保守が面倒だと思ったので。

いま考えてるのは
module_function self.methods.join(' ') #未完成
みたいな怪しい方法です。

197:デフォルトの名無しさん
09/12/14 01:20:55
module M
def m1; "m1"; end
extend M
end
M.m1 #=> "m1"

198:デフォルトの名無しさん
09/12/14 01:22:36
どんぴしゃです!
ありがとうございます。

199:デフォルトの名無しさん
09/12/14 05:51:45
メイン関数は書いた方が良いのでしょうか?

200:デフォルトの名無しさん
09/12/14 06:07:46
>>198
リファレンスより
If used with no arguments,
subsequently defined methods become module functions.

モジュール定義の頭に module_function と引数なしで書いておけば
以後に定義するメソッドにはすべて module_function が適用される。

public, private とかと同じだよ。

201:デフォルトの名無しさん
09/12/14 06:28:54
>>199
メイン関数って
スクリプトを実行した時に処理系が最初に呼び出すメソッド、という意味?

そういう意味なら、書けない、でFA
そんな取り決めないし

202:デフォルトの名無しさん
09/12/14 07:36:02
>>199
def main() しとけばRubyがエントリポイントとして呼んでくれる、とかいうことはないよ
ただ if __FILE__ == $0 ... って常套句を使って少し似たようなことはできる

203:デフォルトの名無しさん
09/12/14 08:32:24
>>199
ruby -e 'p self'

204:デフォルトの名無しさん
09/12/14 08:53:07
俺最初なんとなくmainてメソッド書いて
if __FILE__ == $0
main
end
って書いてたな

205:デフォルトの名無しさん
09/12/14 11:18:57
>>200
これでもいいなぁ。
URLリンク(ruby-doc.org)
ですね。

初心者はドキュメントのどこを見ればいいかも分からないので、とても助かります。

206:デフォルトの名無しさん
09/12/14 11:43:32
>>199
いろんなソース読んだ限り、
Rubyではこんな感じで書いている人が多い。俺も習ってる

class Application
  def initialize
  end
  def run
    # ここにメイン処理
  end
end

if __FILE__ == $0
  Application.new.run
end

207:デフォルトの名無しさん
09/12/14 13:15:18
待て、$0って廃止予定じゃなかったか

208:デフォルトの名無しさん
09/12/14 13:29:31
心配なら$PROGRAM_NAMEを使っておけ。


209:デフォルトの名無しさん
09/12/14 13:30:08
あと10年は1.8使い続けるから無問題

210:デフォルトの名無しさん
09/12/14 13:33:57
まあ、$0 が動かなくなる頃にはそのスクリプト本体もどっか手入れしないと動作しないとは思う
そのときにその人に直してもらうことにして $0 は使ってもよし
$PROGRAM_NAME はバージョンによらず使えるんだっけ?

211:デフォルトの名無しさん
09/12/14 13:38:35
質問が有ります。

引数があれば引数で指定したファイルに
引数がなければ標準出力(もしくはエラー出力)に文字列を出したい場合はどのように書いたものでしょうか?

212:デフォルトの名無しさん
09/12/14 13:46:34
そのまんま if とかで書けばいいと思うよ!

213:デフォルトの名無しさん
09/12/14 13:48:20
if (ARGV[0])
$stdout = File.open ARGV[0]
end

こんな感じニカ ?

214:デフォルトの名無しさん
09/12/14 13:51:15
こんな感じか
if ARGV.length > 0
   f = open(ARGV[0], "w")
else
   f = $stdout
end
f.write "hello"


215:デフォルトの名無しさん
09/12/14 13:52:13
>>211
def output
 if filename = ARGV[0]
  File.open(filename, "w"){|f| yield f }
 else
  yield $stdout
 end
end
output{|io| io.write "a"}

closeめんどくせえ

216:デフォルトの名無しさん
09/12/14 13:55:43
> closeめんどくせえ
うむ
$stdout.close がIOError で拒否られたときは軽く眩暈がした

217:デフォルトの名無しさん
09/12/14 17:25:48
>>211
個々のプログラムでそういうことをするより
シェルのリダイレクトやパイプを使いなさいと言いたいのだが

出力先をプログラムの引数として受け取らなければならない理由はなんだろう?

218:デフォルトの名無しさん
09/12/14 18:09:37
STDOUT にログ出力をするタイプのプログラムはたいてい引数指定
たとえば wget

219:211
09/12/14 19:36:53
>>212-215
ありがとうございます、ありがとうございます
いろいろ方法ありますね。

>>217
事の発端は、最初は標準出力に出してリダイレクト(?でしたっけ)でファイルに書いていたのですが、
ファイルには出したくないBenchmarkとかで計測した結果も表示したくなってそうすると、
どうしたものかって感じになりました。

こういう時って計測結果などはエラーに出せばいいもんですかね?エラーに出していいものかどうか。

>>218
wgetは引数でファイル指定でしたっけ

220:デフォルトの名無しさん
09/12/14 20:14:48
wget -O

221:デフォルトの名無しさん
09/12/14 20:19:22
質問です。

時間の計算するにはどのクラスを使えばいいでしょうか?
具体的には時間の差分を加算したりしたいのです。

例えば、
elapsed_time += Time.local(2008,12,14,1,50,10) - Time.local(2008,12,10,1,50,10)
のような感じ(実際にはTime.localの中身は可変)

elapsed_timeをTimeにする場合だと初期化にTime.at(0)しても Thu Jan 01 09:00:00 0900 1970 になったり、
0からの時間を考えられていないようなのです。

222:デフォルトの名無しさん
09/12/14 20:24:17
>>221
基本的には「ない」
61s が 1m1s になるような、秒数のみを表すクラスというようなのは標準では存在しない

223:デフォルトの名無しさん
09/12/14 20:25:23
>>221
Time.at(0).to_i

224:デフォルトの名無しさん
09/12/14 20:26:07
>>222
そういうことか、>>223は忘れて

225:221
09/12/14 20:35:18
ありがとうです

ないですかー。
何が困るかというと、加算した差分の時間を例えば書式で出力するときにstrftimeみたいなのを自前で書かないといけないってことですよね。

誰かそういうの作ってないか探してみたんですがどうも無いようで・・・。
active_supportとかの日付の拡張あたりでなんとかならないもんですかね。

226:デフォルトの名無しさん
09/12/14 20:49:16
time = 100000
sec = time % 60
min = (time / 60) % 60
hour = (time / (60 * 60)) % 24
day = time / (24 * 60 * 60)
puts "%dday %d:%d:%d" % [day, hour, min, sec]

こんなんでいいか?

227:221
09/12/14 21:01:02
>>226
ずばりそのまま書いてくださってありがとうさんです。

使わせていだきます。
ActiveSupport使ってもこんな感じですか。かわらないやw

time = 100000
sec = time % 60
min = (time / 1.minute) % 60
hour = (time / 1.hour) % 24
day = time / 1.day
puts "%dday %d:%d:%d" % [day, hour, min, sec]

228:デフォルトの名無しさん
09/12/14 22:30:38
二年ほど前にdevでTimeSpanというクラスが提案されたことはあるみたいだねー。
立ち消えしてるのかな、これは。


229:デフォルトの名無しさん
09/12/14 22:34:40
.NETからそのままいろんなクラスパクってくりゃいいのに

230:デフォルトの名無しさん
09/12/14 22:36:53
やだあんな使いにくいAPI
.NET好きな人はIronRuby使ったらいい

231:デフォルトの名無しさん
09/12/15 00:52:12
数値積分や微分できるようなライブラリとかってないですか?
Rubyを関数電卓代わりに使いたいんですけど

232:デフォルトの名無しさん
09/12/15 00:58:10
パッチレベル上がったのにmingwでmake通らん

233:デフォルトの名無しさん
09/12/15 01:01:41
>>231
よくわからんけど「Ruby 数値積分 微分」でぐぐってみた
URLリンク(jp.rubyist.net)
こっちは結構すごそうだぞ
URLリンク(blade.nagaokaut.ac.jp)

234:デフォルトの名無しさん
09/12/15 01:01:55
GSL(GNU Scientific Library)のRubyバインドがあるようだ。
詳しくは見ていないけど、数値積分や微分はあるみたい。
ただし、最後のリリースが約2年前というのが気掛かり。
十分枯れているのだろうけれど、新しめのRubyで動くかは不明。

ところで、本格的な数式処理なら、Maximaとか使ったほうがいいんじゃない?


235:デフォルトの名無しさん
09/12/15 01:05:33
かぶりんこ。


236:デフォルトの名無しさん
09/12/15 01:43:08
ありがとうございます
導入めんどくさそうですけど頑張ってみます

237:デフォルトの名無しさん
09/12/15 02:03:40
数値積分や微分できるような関数電卓を持っていたら、それを使う。
でなければ、カシオの計算センターとか。
自前のコードからコールしたいなら、ついでにそっちも自分で書いてしまう。
てのは、いかがでしょう。

238:デフォルトの名無しさん
09/12/15 06:35:31
>>219
> ファイルには出したくないBenchmarkとかで計測した結果も表示したくなって

標準ライブラリの Logger を使ってみるというのは?
URLリンク(jp.rubyist.net)

239:デフォルトの名無しさん
09/12/15 09:20:54
いわゆる数値計算には向かないよね、Ruby

240:デフォルトの名無しさん
09/12/15 09:53:38
しかし、「5分で作って5秒で実行させる」ような、「計算機なんだから計算できてもいいんじゃね」という
カジュアルなデータ計算をさせることが期待されるプログラミング言語のトップグループにいることは間違いない
専門数値計算ソフトやC(やJava)を持ち出さなくてもいい程度の計算なら、もっと気楽にできてもいい
高校や大学1年教養の宿題をうっかり解けてしまうような、そんな用途があってもいいはず

241:デフォルトの名無しさん
09/12/15 10:06:28
そういう用途ならあるげぶらーじゃね

242:デフォルトの名無しさん
09/12/15 10:09:15
Rでもいいしますまてぃか覚えるのでもいいしいっそExcelでも充分使える範囲である可能性も高いな

243:デフォルトの名無しさん
09/12/15 10:20:55
カタカナでおk

244:デフォルトの名無しさん
09/12/15 10:28:35
アールやエクセルってなんか変だろ

245:221
09/12/15 15:52:28
>>238
ああ、その手もありました!その名のとおりログのこりますしLoggerいいですねw

246:デフォルトの名無しさん
09/12/15 15:56:00
数値計算したいんなら構文的にPython+numpyのほうがいいよ。Rubyには不向き。

247:デフォルトの名無しさん
09/12/15 18:38:35
>>221
ワンライナーで時間の計算をする時に24時間以内なら
ruby -rtime -e "a=Time.parse('09:08:20')-Time.parse('01:40:02');puts Time.at(a).utc.strftime('%H:%M:%S')"
とかしたりしますな


248:デフォルトの名無しさん
09/12/15 18:47:01
ていうか、やろうと思えば結構できるんだよ
でも自己責任の域を出れない

249:デフォルトの名無しさん
09/12/15 18:54:35
name=gets
puts "私は#{name}です"

nameに日本語を入力するとエラーが出てしまいます
C:/My Documents/g/Ruby/test.rb:4:in `<main>': incompatible character encodings: ASCII-8BIT and
Windows-31J (Encoding::CompatibilityError)
これはどういったエラーなんでしょうか?

250:デフォルトの名無しさん
09/12/15 19:03:50
>>249
初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー

251:デフォルトの名無しさん
09/12/15 19:08:17
それってスクリプトつーか内部文字列がWindows-31Jで標準入力がASCII-8BITってこと?
Windows-31Jがロードできたら標準入力もそっち使うようになってなかったっけ
どういうときにそんなことになりえるのか知りたい、誰か教えて

252:デフォルトの名無しさん
09/12/15 19:08:20
スレタイに【1.9】 【使うな】っていれとけよ

253:デフォルトの名無しさん
09/12/15 19:21:35
【Windows】【使うな】とか


254:デフォルトの名無しさん
09/12/15 19:36:02
順番からいって標準入力がWindows-31Jか、なんでスクリプトがASCII-8BITになったんだろう?
とりあえず>>249は1.9使い続ける気ならマジックコメントを使えるようになるべき

255:デフォルトの名無しさん
09/12/15 19:38:08
MCって一番やっちゃいけないタイプの変更だよな

256:デフォルトの名無しさん
09/12/15 19:50:04
スレチだが微積やってくれて感動した
URLリンク(www.wolframalpha.com)

257:デフォルトの名無しさん
09/12/15 19:52:31
>>252
>>1

258:デフォルトの名無しさん
09/12/15 20:10:57
>>255
じゃあファイルごとに違う文字エンコーディングをインタプリタに知らせる方法を考えてくれ

259:デフォルトの名無しさん
09/12/15 20:18:58
いいこと考えた、ファイルは全部ASCII-8BIT相当にするってのはどう

260:デフォルトの名無しさん
09/12/15 20:25:36
これでますますPythonへの移行が加速しちゃうな。
マイナー環境に媚びすぎるあまり全員が等しくLoseしちゃうなんてあまりにも悲しい。

261:デフォルトの名無しさん
09/12/15 20:27:49
>>259
それ 1.8 じゃん…

262:デフォルトの名無しさん
09/12/15 20:29:51
やっぱ今からでもせめてデフォルトUTF-8に

263:デフォルトの名無しさん
09/12/15 20:32:17
>>262
マッキン使えマッキン

264:デフォルトの名無しさん
09/12/15 20:36:27
UTF-8-MACはUTF-8じゃありませんっていうか今すぐ滅びてくださいお願いします

265:デフォルトの名無しさん
09/12/15 22:35:13
>>264
Pythonはもろそれにぶつかったな。よくそれではまったよ。

あのさ、require 'foo' したときの、foo.rb または foo.so の在処をしるにはどうしたらいいんだっけ。
よく聞かれる質問だと思うけど、だれか教えて。

266:デフォルトの名無しさん
09/12/15 22:44:32
1.8.6と1.8.7の違いってどこかにまとめられてますか?

267:デフォルトの名無しさん
09/12/15 22:47:55
>>265
前スレでみたのは
gem which foo

268:デフォルトの名無しさん
09/12/15 22:57:27
$" または $LOADED_FEATURES

269:デフォルトの名無しさん
09/12/15 23:04:43
>>267
それは求めるものじゃないなー

>>268
それはファイル名だけだよね。ディレクトリ名も含めたパスが欲しい。


270:デフォルトの名無しさん
09/12/15 23:10:31
それは提供されてない

271:デフォルトの名無しさん
09/12/15 23:10:37
>>265
結局こうしました
$ ruby -r nkf -e 'puts $:.map {|x| Dir.glob("#{x}/nkf*") }.flatten'
/usr/local/lib/ruby/1.8/i686-darwin10.0.0/nkf.bundle



272:デフォルトの名無しさん
09/12/15 23:45:36
>>266
URLリンク(svn.ruby-lang.org)

273:デフォルトの名無しさん
09/12/15 23:59:23
>>272
Thanks.

わーおEnglishじゃん!開発者は日本人が多いのに、ぷんぷん!

274:デフォルトの名無しさん
09/12/16 00:05:46
>>272
ていうか、これ読んで分かるの開発陣だけだから。
Ruby利用者がよんでもわけわからん。

275:デフォルトの名無しさん
09/12/16 00:12:20
これを元にした噛み砕いたユーザー向け解説というのを誰か第三者が作ってきちんとフォローすべきなんだ
でも、Ruby(特に日本の)ではそういうのが特にないんだよね
商売っけがないというか、目立ちたがり屋がいないというか

ちなみにオフィシャルの仕事ではないのでこれ以上は望んじゃ駄目よ
取り巻きの役目

276:デフォルトの名無しさん
09/12/16 00:15:59
user visible feature changes と書いてあるんだが…


277:デフォルトの名無しさん
09/12/16 00:18:07
これとRubyリファレンスマニュアルを併用すればきっと・・!

278:デフォルトの名無しさん
09/12/16 00:18:17
るびきち氏の日記に載ってたのはリリース当時欲紹介されてた気がする。
URLリンク(d.hatena.ne.jp)

279:デフォルトの名無しさん
09/12/16 00:31:54
>>278
神いわゆるゴッド

280:デフォルトの名無しさん
09/12/16 01:55:08
>>275
>ちなみにオフィシャルの仕事ではないのでこれ以上は望んじゃ駄目よ

なんで?

ちなみにPythonはα版でもこれだけの出来。
URLリンク(docs.python.org)

これだけの差がありながら、「Rubyはドキュメントが揃ってる」とぬかす古参上級者がほんとジャマ。



281:デフォルトの名無しさん
09/12/16 02:03:55
Andrew Kuchlingは取り巻きどころかPythonの主要開発者だな
Python3.0のWhat's newはGuido書き下ろしだし
ドキュメントは取り巻きに任せろってのはガンかもしれないね

でもこれ本スレでやったらいいよ
初心者にはいい迷惑だ

282:デフォルトの名無しさん
09/12/16 02:11:24
>>280
人材が究極的に少ないから
現状に加えて一般向けにドキュメント揃えろなんて言ったらどんどんリリースが遅くなる
当事者だからという理由だけでできない人に無理やりやらせる理由はない
得意な人に任せておけばいい

まあ初心者スレ向けでないのとドキュメント揃ってるほうだと言ってる人間が障害になってるのには同意

283:デフォルトの名無しさん
09/12/16 10:33:28
rubyの勉強をしろと言われ、perlのプログラムを渡された
雰囲気は似てるからrubyに書き換えて動作させてみろという
perlもrubyもほとんど触ったことない俺にどうしろっていうんですか…
書き換え方にコツとかあるんでしょうか?元のperlプログラムにはサブルーチンにハッシュやら配列やらが結構混ざって泣きそう

284:デフォルトの名無しさん
09/12/16 10:43:08
>>283
とりあえず元のプログラムが何をするものなのか理解しないことには
始まらないと思われ

285:221
09/12/16 11:02:32
>>247
ありがとう。24時間は超えてしまうのでTimeはやはり使わない方向でいきます

286:デフォルトの名無しさん
09/12/16 11:06:02
質問です。
Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
環境は、Ruby 1.8.7、Windowsです。

できれば、あくまでできればですが、実行環境では追加のリソース(ランタイム)が必要ないものがよいのですが…
例えばexeに固めれば単体で実行できる、もしくはRubyとそのライブラリがあれば動くと言ったようなものです。

下記サイトでは、shose(why氏とともにサイト死んでる?)、Ruby-GNOME2、wxRubyがよく使われているとありますが、
みなさんは何を使われてますか?
Ruby GUI調査2008
URLリンク(www.pressure.to)

287:デフォルトの名無しさん
09/12/16 11:14:52
>>286
> Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
RubyではGUIアプリケーションは作らない

288:デフォルトの名無しさん
09/12/16 11:15:28
Windowsで1.8でexe単体なら自分だったらvruby+Exerb+UPX
でも上の縛りがなければwxRuby+Ocra
あとやったことないけどWebアプリ+RubyStationも面白そう

289:286
09/12/16 11:24:17
shoesはgithubにありましたけど、Javaのprocessingみたいな感じなんですね。ちょっと用途が違うとおもた
samples at master from shoes's shoes - GitHub
URLリンク(github.com)


>>287
(´;ω;`)ブワッ
昔Delphi使ってたんでそっちでもいいんですが、できれば最近なれたRubyでGUI作れたらなとか思うわけですよ…

>>288
必ずしもexe単体でなくてもいいです。

webアプリは面白そうなんですが、とりあえず、vrubyとwxRuby試してみます

290:デフォルトの名無しさん
09/12/16 11:26:15
たぶん、GUIというイベントドリブンな概念とRubyの記法が合わないんだと思う

291:デフォルトの名無しさん
09/12/16 11:28:25
イベントハンドラにprocオブジェクトを登録することがごく自然に出来るわけで。


292:デフォルトの名無しさん
09/12/16 11:31:44
実装の便利度に差がありすぎるんだよな
中にはHSPからシェル経由でスクリプト呼んで引数連携させたほうがマシといゲフンゲフン

293:デフォルトの名無しさん
09/12/16 11:43:07
>>271
パスに{}[]が含まれると良くない

294:デフォルトの名無しさん
09/12/16 11:51:03
>>293
一般に使ってもらうならともかく、自分の用が果たせたならそれでいいんじゃないか?


295:デフォルトの名無しさん
09/12/16 13:56:13
wxRubyをgemで入れてみたのですが、wxruby-2.0.1-x86-mswin32-60がインストールされたのですが、
これて古くないんでしょうか?wxWidgetの0.6.0だったりしませんか?

ruby -v #=> ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] 古いな…

296:uy ◆e6.oHu1j.o
09/12/16 17:55:27
純粋にrubyのレベルをあげたいです
小さなツールとWebアプリケーションとGUIゲームくらいならrubyで作れるようになったんですが
ルビリストと呼ばれるようになる為の次のステップ教えてください

297:デフォルトの名無しさん
09/12/16 18:05:30
いろいろな言語を使う。
とくにRubyのバックグラウンドを育んだLispやSmalltalkを。


298:デフォルトの名無しさん
09/12/16 18:09:09
Lispやれ(EmacsLisp以外ならなんでもいい)
PerlがまだならPerlも齧れ
オブジェクト指向の関係でJavaもできるといいんだが

299:デフォルトの名無しさん
09/12/16 18:12:54
>>296
もの凄い勢いでRuby初心者スレ/本スレ/ruby-list等
あらゆるサイトの質問にコテハンで答えまくる
質の高い回答が数千溜まるとGoogleに雇ってもらえる

300:デフォルトの名無しさん
09/12/16 18:14:14
ルビリストってなんですか?

301:デフォルトの名無しさん
09/12/16 18:27:26
googleって実際優秀な人材だけってわけじゃないんだよねぇ
広告塔の人間もたくさんいるし

302:デフォルトの名無しさん
09/12/16 18:47:10
>>296
>ルビリストと呼ばれるようになる為の次のステップ教えてください

るびまの添削記事を読むのがいいと思う。
URLリンク(jp.rubyist.net)
URLリンク(jp.rubyist.net)
URLリンク(jp.rubyist.net)
URLリンク(jp.rubyist.net)
URLリンク(jp.rubyist.net)


303:デフォルトの名無しさん
09/12/16 18:51:14
>>282
>人材が究極的に少ないから
>現状に加えて一般向けにドキュメント揃えろなんて言ったらどんどんリリースが遅くなる
>当事者だからという理由だけでできない人に無理やりやらせる理由はない
>得意な人に任せておけばいい

ばかをいえ、ChangeLogやNEW FEATURESなんて、開発当事者ぐらいしか詳しくは知らないんだから
開発当事者が書くべきだろ。
こんなことすらも嫌がる開発陣ってなんなの?

どうせ開発リソースが増えたところで、ドキュメントに回すつもりないんだろ。

304:283
09/12/16 19:00:12
昼間は無事だったのに規制が…
283です。
>>284
jcorrectとかいうやつだったかな
プログラムを実行して文章を入力すると、cabochaの解析結果と一緒に文章の校正を促すメッセージが出た
これを実行するためにcabochaとかいろいろ入れてた
プログラムを読んでいると、サブルーチンから値を順に渡していたり$foo->{$var}->とか見たことないのがいっぱいでなんかもうキーーーーってなったんだ…

305:デフォルトの名無しさん
09/12/16 19:06:54
>>303
言ってること自体には賛同できるけどそういうのは本スレでどうぞ

306:デフォルトの名無しさん
09/12/16 23:36:21
質問です。
実行環境:Xubuntu9.10、Ruby1.9.1
使用ライブラリ:tk、pty、expect
やりたいことは、外部プログラム(対話型のCUIプログラム)をRubyスクリプト内から実行する際に、
外部プログラムの実行結果(標準出力。エラーが発生して終了したならその時のエラー出力)
を取得したいのですが、何か方法はあるでしょうか。
ネットを見るとsshやtelnetのサンプルが転がってますが、
sshやtelnetが出力するメッセージ自体やエラー文(はあるのかな?)を処理するようなものがなく、
どうするんだーと悩んでます。

307:デフォルトの名無しさん
09/12/16 23:43:41
シェルからパイプでつなぐ
` ... ` (バッククォート)でコマンド実行して出力取る
手の込んだことがしたければ require 'open3'

308:デフォルトの名無しさん
09/12/17 00:23:55
wxRubyとかGUIアプリの話がでたついでに聞きたいんですけど、
↓みたいにマニフェストをruby/bin/において、Windows XP移行のLuna(?)風のUIにする方法があるんですが、
Ruby on Windows: Windows XP Visual Style Controls with wxRuby
URLリンク(rubyonwindows.blogspot.com)

…うまくいきません。
古いルックアンドフィールのままになります。
上記サイトのxmlをファイルをruby.exe.manifestとrubyw.exe.manifestに新規作成してコピペして、
ruby/binに放りこめばいいんですよね?

309:デフォルトの名無しさん
09/12/17 00:38:30
>>307
ありがとうございます。
標準出力と標準エラー出力に違いがあるのを知らなかったですorz
open3は標準入力・出力・エラー出力のみ対応という形だったので、
except実行→出力結果を一時ファイルに出力→実行元プログラムでopen
という形で無事結果を得られるようになりました。

PTYがttyを別個に作ってそっちで実行させるっぽいのでバッククォート使えない(のかなぁ……)

310:245
09/12/17 11:43:14
logger使ってみているのですが、
Benchmarkの出力結果が余計な改行が入るのですが、これってこんなもん?

time = Benchmark.measure do
:(略)
end
logger.debug Benchmark::CAPTION
logger.debug time.to_s

311:デフォルトの名無しさん
09/12/17 12:21:56
そんなの logger は与り知らんよ
logger は対象のオブジェクトを to_s しての末尾に改行つけて書き出してるに過ぎない
何か問題あるならそのオブジェクトの to_s 調べれ

312:245
09/12/17 13:01:09
>>311
舌足らずでごめんなさい。
puts Benchmark::CAPTION
puts time.to_s
だと改行の問題ないんです。気味が悪いんですが、何でなんでしょ

313:デフォルトの名無しさん
09/12/17 13:10:17
>>312
改行が問題になるときの検証に puts 使ったら駄目
puts は文字列末尾に改行があったら自前で改行をつけない

というかこれはそのまんまで

irb> require 'benchmark'
irb> p Benchmark::CAPTION
" user system total real\n"

そもそも改行が末尾に入ってる
気になるなら Benchmark::CAPTION.chomp を logger に渡す

314:デフォルトの名無しさん
09/12/17 18:13:47
> puts は文字列末尾に改行があったら自前で改行をつけない
漏れは大変なことを知ってしまった
近いうちに消されるかもしれない

315:デフォルトの名無しさん
09/12/17 18:18:58
xpathって難しい。もっと簡単にできるか?
id('Layer3')//td[
following-sibling::td//a[contains(@href,
'URLリンク(money.www.infoseek.co.jp)')]]/b//font[@color]

316:sage
09/12/17 21:38:37
>>228
trunk には Date::Delta ってのが入ってるよ

317:デフォルトの名無しさん
09/12/17 22:32:29
RSpecの用語について質問。
describe ... や it .... で書いたひとまとまりを、なんて呼ぶの?
たとえば Test::Unit なら
class FooTestCase < Test::Unit::TestCase ← これはテストクラス
 def test_equal       ← これはテストケース
  assert_equal(2, 1+1)
 end
end
のような呼び方をしてると思うんですけど、RSpecの場合は何と呼ぶのかわからないので、教えてください。


318:デフォルトの名無しさん
09/12/17 23:36:33
現在β版のRSpec本によれば、
We use the describe( ) method to define an example group.
The it( ) method defines a code example.

なお、
describe(および別名のcontext)メソッドが作るのは
Spec::Example::ExampleGroupのサブクラス
it(および別名のexample)メソッドが作るのは
それのインスタンスメソッド
になる


319:デフォルトの名無しさん
09/12/18 06:03:22
質問です。
001
002
のような、3桁の連番を表示したいんですが、どうやればいいんですか。
for i in 001..100
だと
1
2
になるんですが。

320:デフォルトの名無しさん
09/12/18 06:18:23
Rubyらしい書き方ではないかもだが

for i in 1..100
 p '%03d' % i
end

数字の頭に0がつくとRubyでは8進数って意味になるので注意

321:デフォルトの名無しさん
09/12/18 06:23:07
('001'..'100').each{|s| puts s}

322:デフォルトの名無しさん
09/12/18 06:25:56
>>320
見事にできました。
素早い回答どうもありがとうございました。

323:デフォルトの名無しさん
09/12/18 10:03:11
WEBrickで、
・Basic認証またはDigest認証
・IPアドレスによるアクセス制限
を実現したいのですが、サンプルとか参考になるページがあれば教えてください。
「WEBrick IPアドレス 制限」とかでぐぐったけど、それらしいのはヒットしませんでした。

324:デフォルトの名無しさん
09/12/18 10:32:21
追記。
ちなみに、今使っているサンプルはこんなのです。
require 'webrick'
server = WEBrick::HTTPServer.new({
:DocumentRoot => '.',
#:BindAddress => '127.0.0.1',
:Port => 3000,
})
Signal.trap('INT') { server.shutdown }
Signal.trap('TERM'){ server.shutdown }
server.start

325:デフォルトの名無しさん
09/12/18 11:10:43
認証
WEBrick::HTTPAuth::BasicAuth
WEBrick::HTTPAuth::DigestAuth

IPアドレスでの制御は HTTPRequest#addr あたりを見て403を返せばいいんじゃない?



326:デフォルトの名無しさん
09/12/19 12:18:34
{1=>[2]}となる事を期待したけど、この方法では駄目みたいですね。

% irb1.9.1
irb(main):001:0> h=Hash.new([])
=> {}
irb(main):002:0> h
=> {}
irb(main):003:0> h[1]
=> []
irb(main):004:0> h[3]
=> []
irb(main):005:0> h[1] << 2
=> [2]
irb(main):006:0> h
=> {}
irb(main):007:0> h[1]
=> [2]
irb(main):008:0> h[3]
=> [2]


327:デフォルトの名無しさん
09/12/19 12:29:26
>>326
URLリンク(www.ruby-lang.org)

ぶっちゃけRubyの怪しげな機能は使わないほうがいいと思う

328:デフォルトの名無しさん
09/12/19 12:32:18
>>326
そりゃArrayやHashの初期値つきnewは毎回初期値のオブジェクトを生成するからな

irb> p h[2].object_id == h[2].object_id
false

irb> h=Hash.new([])
{}
irb> h[1]=[2]
[2]
irb> h
{1=>[2]}

329:デフォルトの名無しさん
09/12/19 12:39:22
>>328
> p h[2].object_id == h[2].object_id
これうち(1.8.7cygwin)でやるとtrueになるんだが1.9で変わったとか?

330:デフォルトの名無しさん
09/12/19 12:42:53
>>326
それだとh[1]の参照先(初期値オブジェクト[])に2を入れてることにしかならない

h[1] = ほげほげ
としない限り
{1=>ほげほげ}にはならない

331:デフォルトの名無しさん
09/12/19 13:35:34
$ rvm use system
<i> Now using system ruby. </i>
$ irb --prompt simple
>> RUBY_DESCRIPTION
=> "ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]"
>> h = Hash.new([])
=> {}
>> [h.default, h[0], h[1]].map(&:object_id)
=> [2156963800, 2156963800, 2156963800]

$ rvm use 1.9.1-head
<i> Now using ruby 1.9.1 head </i>
$ irb --prompt simple
>> RUBY_DESCRIPTION
=> "ruby 1.9.2dev (2009-12-11 trunk 26067) [x86_64-darwin10.2.0]"
ruby-1.9.1-head > h = Hash.new([])
=> {}
>> [h.default, h[0], h[1]].map(&:object_id)
=> [2151892720, 2151892720, 2151892720]


332:デフォルトの名無しさん
09/12/19 15:45:53
>>331みたいな人ってソース中のコメントもほぼかかなそうだよな

333:デフォルトの名無しさん
09/12/19 16:35:24
>>332は初心者

334:デフォルトの名無しさん
09/12/19 16:59:49
まあ初心者スレだしな

335:デフォルトの名無しさん
09/12/19 17:53:52
結局>>328は間違ってるということかい?

336:デフォルトの名無しさん
09/12/19 18:26:49
new(初期値)で生成されたハッシュに存在しないキーでアクセスした場合の挙動は、
同じオブジェクトが返るというのが正しく、
毎回異なるオブジェクトが返るというのは誤り。


337:デフォルトの名無しさん
09/12/19 18:37:34
質問するならリファレンスマニュアルくらい読んでからこい

338:デフォルトの名無しさん
09/12/19 18:47:27
初心者スレ的には
「マニュアルのここ読めわかりやすくて疑問の余地無し氏ね」
と言える環境を揃えるほうが先な気もする

339:デフォルトの名無しさん
09/12/19 23:53:39
>>328
それは初期値じゃなくて初期ブロックじゃないのか?

h = Hash.new{|hash,key| [] }
p h[2].object_id == h[2].object_id # => false

未設定のキーを指定された時に、そのつどブロックを実行した結果を返す
よって同じキーでも毎回違うArrayが帰ってくる


340:デフォルトの名無しさん
09/12/20 01:14:37
>>338
ようやくたどり着いたと思ったら、

xxxx()
執筆者を募集中

おい、コードを書いたのはどこに行ったの?
採用した人は?

なので、動かないものは、自分で書き直すことにしてる。
一から一人でするより、ちょっと近道。

341:デフォルトの名無しさん
09/12/20 05:46:41
>>337
>質問するならリファレンスマニュアルくらい読んでからこい
おまえは書き込むまえに>>1を読んでこい

342:デフォルトの名無しさん
09/12/20 06:50:04
>>341
おまえは書き込むまえに>>1を読んでこい

343:デフォルトの名無しさん
09/12/20 07:39:01
そんなことより俺のIDを見てくれ。どう思う?

344:デフォルトの名無しさん
09/12/20 09:13:46
見えない

345:デフォルトの名無しさん
09/12/20 10:15:45
>>344はバカ

346:デフォルトの名無しさん
09/12/20 10:27:17
まあバカスレだしな

347:デフォルトの名無しさん
09/12/20 12:45:29
教えてください
Hpricotで日本語テキストのリンク検索が上手く動きません
どうすればNokogiriと同じ動きになるのでしょうか

#!ruby -Ku
require 'hpricot'
require 'nokogiri'

html = "<html><a>りんく1</a><a>りんく2</a><a>りんく3</a></html>"
doc = Hpricot(html)
print doc.at("a[text()*='りんく2']"); # エラー発生

doc = Nokogiri(html)
print doc.at("a[text()*='りんく2']"); # こちらは正しく動く

エラー内容
/usr/local/lib/ruby/gems/1.9.1/gems/hpricot-0.8.2/lib/hpricot/elements.rb:486:in `index':
incompatible character encodings: ASCII-8BIT and UTF-8 (Encoding::CompatibilityError)



348:デフォルトの名無しさん
09/12/20 12:48:10
>>347
初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー

349:デフォルトの名無しさん
09/12/20 12:54:16
>>348が FA なのだが

というか何もわからず動かしていることが原因で、
Nokogiri が動いたのはただの偶然に過ぎない
むしろ「Nokogiri が動いたのは何故ですか」という質問になるべき事象

無理しないで Ruby 1.8.7 使え
1.8.7 を理解したあとで差分学習で 1.9.1 を習得するのが一番早い

350:デフォルトの名無しさん
09/12/20 12:57:10
了承、1.8.7にする

351:デフォルトの名無しさん
09/12/20 12:59:15
hpricotはコンパイルが通る程度に1.9対応されてるだけ。
作者の _why the lucky stiff はネット上から失踪しているので、事実上塩漬け状態。


352:デフォルトの名無しさん
09/12/20 16:02:52
質問
rdoc が生成する HTML について、特定の要素(例えば <pre>タグ)のスタイルだけ
いじりたいという場合はどうしたらいいのでしょうか?

353:デフォルトの名無しさん
09/12/20 16:27:02
>>352
ちょっと見た感じでは rdoc に --template オプションで
自作のテンプレートを指定してやればいいんじゃまいか

既存のテンプレが rdoc/genarators/template/html に入ってるから
それを部分的に書き換えて使えばよさそう

354:デフォルトの名無しさん
09/12/20 19:17:36
whyさん死んじゃったからNokogiri推奨だと思うけど、
>>347がhpricot使いたいと思った理由はなんだろ

355:デフォルトの名無しさん
09/12/20 19:20:40
え、whyって死んじゃったの?
もしそうならHpricotきめえとかdisるのやめて冥福を祈る

356:352
09/12/20 19:31:28
>>353
ありがとうございます。
ベースになるテンプレートを選んで、それに改変を加えたものを使おうと思います。

357:デフォルトの名無しさん
09/12/20 20:19:30
ネットワーク的に、ね。
自分できれいさっぱり痕跡を消していった。


358:352
09/12/21 15:57:51
追記
rdoc の --style オプションにスタイルシートのパスを渡すことで
HTML生成時に自前のスタイルシートを読み込ませることができました。

テンプレから CSS の部分だけ切り出して編集して、
rdoc --style=path_to/hoge.css

でうまくいきました。
というか、manページに普通に書いてあったorz

359:デフォルトの名無しさん
09/12/21 22:18:49
hpricot でも nokogiri でもいいんですが、

doc = Hpricot(open(uri).read)
(doc/:a).each do | link |
 if link[:href] == '#'
  p "設定し忘れ => #{link[:lineno]}"
 end
end

みたいに、行番号を取得することって出来ませんか?

360:デフォルトの名無しさん
09/12/21 22:21:13
行番号というメタ情報があれば取得できるよ
ないならできない
自分で行番号だと思うものを作って数えるしかない

361:デフォルトの名無しさん
09/12/22 09:38:58
>>359
その程度なら普通に正規表現でよさそうだね。

File.open(filename) do |f|
 i = 0
 f.each_line do |line|
  i += 1
  puts "#{filename}:#{i}: 設定し忘れ" if /href=("¥#"|'¥#¥')/
 end
end

362:デフォルトの名無しさん
09/12/22 09:39:08
jrubyでmechanize使えている人います?hpricotのjava版使うしかないんでしょうか?

363:デフォルトの名無しさん
09/12/22 09:45:49
>>361みたいに例示依存の回答する人なんなの

364:デフォルトの名無しさん
09/12/22 10:39:36
>>361 欲しいのは行番号であって、例文なんかどうでもいいんだが

365:デフォルトの名無しさん
09/12/22 11:00:20
例題コードを添削するのはどうかとw

366:デフォルトの名無しさん
09/12/22 11:10:57
作業ディレクトリの変更って出来ませんか?
./data/a.rb
./data/1.txt
./main.rb
ってあったときに
main.rbからa.rbをrequireするんですけど
a.rbは
open("1.txt","r") これで読めるようにしたいです

367:デフォルトの名無しさん
09/12/22 11:21:49
save = Dir.pwd
Dir.chdir "./data"
# 作業
Dir.chdir save
とかかな

同じディレクトリにあるファイルを使うってことなら
open(File.dirname(__FILE__)+"/1.txt")
でもいいかも

368:デフォルトの名無しさん
09/12/22 11:34:12
Pythonのdirみたいに、あるオブジェクトが持ってるメソッドと変数を一覧するものってありますか?

369:デフォルトの名無しさん
09/12/22 11:36:29
>>367
それでいけそうです
ありがとうございます

370:デフォルトの名無しさん
09/12/22 11:37:30
puts Object.methods

ソートするとなおみやすい
puts Object.methods.sort

371:デフォルトの名無しさん
09/12/22 11:41:30
Object#methods
Object#instance_variables

372:デフォルトの名無しさん
09/12/22 12:00:57
>>370-371 ありがとうございます!
これが欲しかった。

373:デフォルトの名無しさん
09/12/22 12:36:02
>>359
Nokogiriの要素は #line メソッドがあるはず。


374:デフォルトの名無しさん
09/12/22 14:41:59
>>367
Dir.chdir "./data" do
# 作業
end

でもいけるよ。

375:デフォルトの名無しさん
09/12/22 14:46:45
>>374
おお知らなかった
もっかいリファレンス見直すことにしよう

376:デフォルトの名無しさん
09/12/23 10:27:52
ねー、

hoge/lib/  ← 自作ライブラリの rb ファイル
hoge/test/ ← lib のファイルに対応するテストスクリプト

という一般的なディレクトリ構成で test/test_hoge.rb を実行する場合、どうするのが「ふつう」なんだ?

:~/hoge$ ruby test/test_hoge.rb

:~/hoge/test$ ruby test_hoge.rb

:~/hoge$ testrb test/test_hoge.rb

:~/hoge/test$ testrb test_hoge.rb

377:デフォルトの名無しさん
09/12/23 11:29:21
コマンド直叩きするときは ruby -Ilib test/test_xxx.rb とする気がするが、
普段はrakeのTestTask任せだから、どうやってるか意識してないわ。

TestTaskの中をみてみたけど、testrbを使うことも使わないことも可能みたい。
(デフォルトはrakeのライブラリ内の機能を使う)

なお、rakeの場合、test/ の中で起動しても、ディレクトリを遡ってRakefileを
探して、見つかったディレクトリで動くので、hoge/Rakefileとして置いている
場合は、実質的には hoge直下でやってることになるはず。


378:デフォルトの名無しさん
09/12/23 11:52:34
ruby test/test_hoge.rb とかやりたいなあ
テストするためだけに test/ に降りてしまうのは、どうも…

379:デフォルトの名無しさん
09/12/23 11:54:14
そのへんは、helper.rb をどうやって読むかの一点にかかってる気がしてならない

380:デフォルトの名無しさん
09/12/23 11:55:55
ファイルいっこテストするだけなのにrakeはないわー

381:デフォルトの名無しさん
09/12/23 12:04:42
rake test TEST=test/test_hoge.rb でファイル一個か。

382:デフォルトの名無しさん
09/12/23 13:39:33
テスト実行するのにコマンド売ってるのかよ。
autotestでファイル保存と同時に自動でテスト実行だろJK

383:362
09/12/23 13:40:52
JRuby 1.4でNokogiri対応になったみたいですね。失礼しました。

384:デフォルトの名無しさん
09/12/23 13:52:22
>>382
テストが通らないタイミングでファイルを保存したりしないの?
というか編集途中で保存し辛くなりじゃん

385:デフォルトの名無しさん
09/12/23 13:54:01
なるじゃん

386:デフォルトの名無しさん
09/12/23 14:12:02
ファイルいっこのテスト方法がないわけじゃなかろう
autotestを使うかどうかとはまた別の議論だと思う

387:デフォルトの名無しさん
09/12/23 15:17:10
>>382
コードを保存したいタイミングと、テストを走らせたいタイミングは別じゃね?
エディタからテストを実行させられればそれでいいけどなあ。
わざわざ保存したときに勝手にテストが走ってほしくないよ。

388:デフォルトの名無しさん
09/12/23 18:03:22
かりに毎回毎回コマンドラインからテストするとしても
シェルの履歴ぐらい使うだろう。


389:デフォルトの名無しさん
09/12/23 18:27:27
秀丸とかサクラエディタとか外部コマンドを
実行できるテキストエディタを使うがよろし。
俺はVim使ってるけど。

390:デフォルトの名無しさん
09/12/23 18:36:19
俺はタブ機能付きの端末エミュレータ使って
右端のタブをテスト用に使ってる
タブ切り替えにキーを割り当ててやるとかなり快適だ

同じ用途で GNU Screen とか使ってる人もいるのでは?

391:デフォルトの名無しさん
09/12/23 19:41:16
auto-save-buffersつかってるとautotestは使えない

392:デフォルトの名無しさん
09/12/23 21:51:25
>>387
そうかー、その品は人それぞれだな。

autotest連携で結果をSnarl(今ならGrawlか?)で通知出したり、サウンド出したりしてるけど
けっこう快適よ?
ただ、coLinuxで動かすとその辺の連携がしにくくて困る

さらに、AutoHotKeyで保存キー入力と同時にブラウザリロードとかもやってる。

393:デフォルトの名無しさん
09/12/24 01:40:48
自動保存+すきあらば無意識で手動保存してるから、
保存とか意識したことがないなー。


394:デフォルトの名無しさん
09/12/24 09:39:55
warning: Insecure world writable dir /home in PATH, mode 040777
という警告がでて困ってます。
この警告だけを出さないようにする方法があれば教えてください。

home のパーミッションが 777 なのがおかしい!といわれればそうなんですけど、
下請けにはそんなことすら変更する権限がないんです。



395:デフォルトの名無しさん
09/12/24 09:47:09
>>394
知らんよ
RailsはRailsスレで

396:デフォルトの名無しさん
09/12/24 10:47:41
>>394
環境を詳しく

もしRailsなら権限くれっていえ。まともに開発できんから

397:デフォルトの名無しさん
09/12/24 11:31:38
>>394
ENV['PATH']から /home を抜け。


398:デフォルトの名無しさん
09/12/24 11:33:56
ENV['PATH']つーか、rubyを実行する前だからシェルの環境変数PATHね。


399:デフォルトの名無しさん
09/12/24 11:52:12
>>395
なぜRails?

>>396
環境はlinux 2.6.9-89.EL, ruby 1.8.7-p174です

>>397
$PATHには/homeがないけど、/home/username/binがあります。
これを除くことはできないので、どうしたもんか困ってます。



400:デフォルトの名無しさん
09/12/24 12:28:44
フルパスで実行するようにすれば除けるんじゃないの?


401:デフォルトの名無しさん
09/12/24 12:32:16
あくまでrubyに伝わるPATHだけ変わればいいので、

* コマンドの環境だけ変える。
PATH=/usr/bin:/bin(などなど) ruby 引数
とか

* 一度変えて戻す
OLD_PATH=$PATH
PATH=/usr/bin:/bin(などなど)
ruby 引数
PATH=$OLD_PATH
とか

* サブシェル内で変える
(
PATH=....
ruby
)

とかでもいい。


402:デフォルトの名無しさん
09/12/24 16:39:54
RubyGemsで依存関係を調べる方法ないですか?
gem dependency を使ってみているんですがうまくいきません。

$ gem dependency mechanize -v "0.9.3" --remote
Gem mechanize-0.9.3
nokogiri (>= 1.2.1, runtime)
hoe (>= 1.12.2, development)

$ gem dependency mechanize -v "0.9.0" --remote
No gems found matching mechanize (= 0.9.0)

$ gem dependency mechanize -v "<0.9.0" --remote
Gem mechanized_session-0.0.2
mechanize (>= 0.9.3, runtime)
hoe (>= 2.3.3, development)

何がやりたいかというとmechanizeでnokogiri非依存のバージョンを探したいのです。

403:デフォルトの名無しさん
09/12/24 16:56:21
>>402
WWW::Mechanize.html_parser = Hpricot

404:デフォルトの名無しさん
09/12/24 17:04:10
>>402
libxml2 に依存したくないというのなら>>403
Nokogiri のインストール自体を dependency 経由で行って欲しくないというのなら、Mechanize 0.8.4 かそれ以前が必要

405:402
09/12/24 17:13:20
即レスありがとうございます。

>>403
あー、いや、Bundlerで利用しようとしておりまして、
実行環境ではNokogiriが動かないため依存段階そのものから外したいのです。

# 実際はappengine-jrubyでmechanizeを使いたいという難儀なアレなのです
# jruby版Nokogiriはffi依存のせいでappengineでは動かんのですわ・・・
appengine-jruby - Project Hosting on Google Code
URLリンク(code.google.com)

>>404
ありがたい
0.8.4ですね、試してみます。

後学のために聞きたいのですが、こういうのってどうやって調べられるもんなんでしょうか?
以前はgemコマンドでgemのパッケージ時の設定を見る方法があったような気がしたのですが、どこいったんでしょう?

406:402
09/12/24 17:16:34
>>405 の前半の説明が足りないので補足。
mechanize 0.9.3では >>403したいところなんですが、
require 'mechanize'
するだけでffiねーぞゴラァ(appengine版のjrubyでは含まれてないためらしいです。pure java版Nokogiriが望まれます)
のエラーがでてしまうのです。

407:デフォルトの名無しさん
09/12/24 17:20:09
>>405
何もしてない
賞味3分の力技
add_dependency から Nokogiri が消えるまで mechanize.gemspec の github 履歴を直接調べて遡った

408:デフォルトの名無しさん
09/12/24 18:55:35
参考までに聞きたいのですが、
長くなり過ぎたメソッドチェーンの途中に改行を入れる場合、
皆さんはどこで改行するのが適切だと思いますか?

1) ピリオドの後に \
value = this.is.a.\
very.long.method.chain

2) ピリオドの前に \
value = this.is.a\
.very.long.method.chain

3) そもそも途中で改行しない

value = this.is.a
value = value.very.long.method.chain


409:デフォルトの名無しさん
09/12/24 19:03:30
>>408
長くなりすぎたと感じる時点で「よくないコードの匂い」なので、リファクタリング開始

410:デフォルトの名無しさん
09/12/24 19:13:53
>>408
メソッドチェーンでは改行は入れない
今更80文字制限などとは言わないが、メソッドチェーンで長い場合は途中変数で分ける
該当するとすれば3

411:408
09/12/24 19:16:52
>>409
長くなり過ぎた場合という表現にちょっと語弊があったかも知れません。
実際にはメソッドのブロック付き呼び出しが2~3続くような場合で
どうしても1行には収まらない場合、です。例をあげると

files = Dir.glob("**/*.rb").select {|file| ... }.reject {|file| ... }.map {|file| ... }

のようなパターンです。


412:402
09/12/24 19:18:31
>>407
ΩΩΩな、なんだってー。恐れ入りました。そんな手がw

gem dependencyやgem specコマンドは--remoteのときには最新版からしかとれないんですね。
一旦gemをインスコしたらOK見られるようですが・・・

413:デフォルトの名無しさん
09/12/24 19:19:43
>>408 >>411
files = Dir.glob("**/*.rb").select {|file| ... }.
    reject {|file| ... }.map {|file| ... }

って俺はやってるな

414:デフォルトの名無しさん
09/12/24 19:20:46
>>410
> メソッドチェーンでは改行は入れない

>>411 であげたようなパターンでもそうなのですか?
自分はああいうパターンだとピリオドの後で改行しちゃうのですが、
一般的には推奨されない(マナーの悪い)書き方なのでしょうか


415:408
09/12/24 19:24:34
>>413
ピリオドの後は \ なくてもいいんですよね。
自分の場合意図的な改行であることを明示するために \ を付けてます。

というか、>>411 の例は最後の map が意味的におかしいですね、しまったorz

416:デフォルトの名無しさん
09/12/24 19:29:58
files = Dir.glob("**/*.rb").select{|file|
      ...
    }.reject{|file|
      ...
    }.map{|file|
      ...
    }

417:デフォルトの名無しさん
09/12/24 21:32:51
ワンライナー書いてるならともかく、どっかで区切れよと
なぜそんなにつなぎまくるのかと

418:デフォルトの名無しさん
09/12/24 22:41:13
>>417
自分の場合はつなぐというより、
つながっていくという感じでついつい長くなってしまうw
返値を無駄にしたくないというか

変数の名前を processed_values とかにした場合も名前に引きずられて
途中の状態を入れたくないという雑念が生じ、無理してでも一連のチェーンで書いちゃう


419:デフォルトの名無しさん
09/12/25 01:09:13
Ping打ちたいんだけどどう書くの?

420:デフォルトの名無しさん
09/12/25 01:25:21
>>419
URLリンク(www.sakalab.net)

421:デフォルトの名無しさん
09/12/25 01:35:21
俺もそれ出そうかと思ったけど、ICMP使わないんだよな

422:デフォルトの名無しさん
09/12/25 01:38:51
わかりやすくていいじゃん

423:デフォルトの名無しさん
09/12/25 05:59:43
files = Dir.glob("**/*.rb")
files.reject! {|file| ... }
files.map! {|file| ... }

424:デフォルトの名無しさん
09/12/25 09:08:05
>>423みたいに例示依存の回答する人なんなの

425:デフォルトの名無しさん
09/12/25 09:21:57
実際には存在しないメソッドを使って質問したほうがいいな

426:デフォルトの名無しさん
09/12/25 09:54:59
別にいいんじゃない?
破壊的メソッドが使える状況なのに気づかなかった初心者がいてもおかしくないし
役に立たないならスルーすればいい
回答者にエスパーを要求するっていうのはそういうことだと思う

427:デフォルトの名無しさん
09/12/25 12:03:27
1.9 だと メソッドのピリオド前でも改行できるようになった
複数行のメソッドチェーンのピリオド位置をそろえられるらしい

if とか class とか直後に識別子や式が必須のところは改行しても行が継続するとか
そういう行継続のルールってマニュアルあるの?


428:デフォルトの名無しさん
09/12/25 12:16:41
従来のルール
「改行までの箇所を読んで完結していると見なされる(パースできる)ことがないなら改行OK」
に追加されたのは「メソッド呼び出しのピリオドの前もOK」だけのはず。



429:デフォルトの名無しさん
09/12/25 12:18:40
あれ、>>428 のルールだけでは
class Hoge
で改行が許されるのは説明できないのか。


430:デフォルトの名無しさん
09/12/25 15:44:18
>>429
ん? 説明できてるように思うけど
class Hoge って end で閉じるまで完結しないでしょ

431:デフォルトの名無しさん
09/12/25 16:16:30
1.8.7p174

puts 1+
2
これは3と出る。+がまだ完結していないから2までがまとまって解釈される。

puts(1+
+2)
同じく3。

puts 1
+2
これは1までで完結しているから1と出て、+2は単項演算して捨てられる。

puts(1
+2)
これは unexpected tINTEGER, expecting ')'
次の行まで見て完結させてくれないのはどうして?




432:デフォルトの名無しさん
09/12/25 16:22:47
パーサをそんなにいじめるなよ

433:デフォルトの名無しさん
09/12/25 16:57:33
>>431
パーサには puts (1 2) と見えてる(+ は単項演算子と解釈されてる)

puts (1
+ 2)
だといけるかなと思ったが syntax error, unexpected '+', expecting ')' だった
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]


434:デフォルトの名無しさん
09/12/25 19:49:28
> puts 1
> +2
> これは1までで完結しているから1と出て、+2は単項演算して捨てられる。

↑ここまできたら

> puts(1
> +2)

これは駄目ってわかりそうなもんだろw

435:デフォルトの名無しさん
09/12/25 20:00:39
>>434
kwsk

436:デフォルトの名無しさん
09/12/25 20:05:56
puts(1\
+2)

437:デフォルトの名無しさん
09/12/25 20:08:58
>>434
どうして?
>>436
解決法を求めてるわけじゃないぜ。


438:デフォルトの名無しさん
09/12/25 20:30:44
()の構文は(式)。
(1 と書くと1は完結した式と解釈され、次の行には残りの)しか書けない
ってことでok?

439:デフォルトの名無しさん
09/12/25 20:42:13
ずいぶんしみったれてるな。
'('が出て来たら')'の直前までを式と解釈してくれても良さそうなもんだが

440:デフォルトの名無しさん
09/12/25 21:15:20
Rubyのパーサは(人間にすると)曖昧な解釈だからなw

>>437
puts 1
+2
が駄目なので、演算子を行末におかない場合は次行と連結されないため、式として認識しない、までは認識できるだろう。

なので、次の
puts (1
の時点で次行とは連結されないでその行までで解釈される、と考えられるので、
閉じ括弧がその行にないのでエラーとなる、と

そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
もしくは俺が長い行を複数行に分割するのに慣れすぎているのでそう感じてしまうだけかw


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch