Ruby 初心者スレッド ..
[2ch|▼Menu]
39:デフォルトの名無しさん
09/05/17 15:16:47
得意げに typo に突っ込んでいるかも知れないという危惧を
少しは抱くべきではないだろうか

40:デフォルトの名無しさん
09/05/17 15:21:33
>>39
URLリンク(www.google.com)

41:デフォルトの名無しさん
09/05/17 15:27:59
「うる覚え」は少なくとも誤記ではないな
「う・る・お・ぼ・え」と書くつもりで正しく書いてるだけだ
その人にとっては「うる覚え」が完全に正しい

もちろん「うろ覚え」が辞書上も多数派的にも"正しい"が、
だからといって今更「うる覚え」がなくなるわけでもなく

42:デフォルトの名無しさん
09/05/17 15:30:24
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /

43:デフォルトの名無しさん
09/05/17 20:31:45
今日1日かけて自作スクリプトのクラス名やメソッド名を書き換えてそれに伴う構造再構成をした
見通しがちょっとよくなったような気がする
Rubyあんまり関係ないな

44:デフォルトの名無しさん
09/05/17 20:35:40
def hoge
 h = Hash.new
  …
 return h
end

というメソッドを勢いで作ってしまうことはある
適切な名前を付けるべきだとは思うんだけどね

45:デフォルトの名無しさん
09/05/17 21:12:55
CRubyでは通るけどJRubyではまだ通らないようなテストがあります。
で、とりあえずこのテストをJRubyで通るようにするのはあとまわしにすることに決定しました。
このとき、そのテストに『今はテストが失敗するけどあとまわしにするよ』というような目印をつける方法が
Test::UnitかRSpecにあったと思うんですけど、どなたかご存じないですか。
ぐぐろうにもキーワードが思いつきません。

46:デフォルトの名無しさん
09/05/17 21:16:01
>>44
「スコープが広いものにほど明瞭な(長い)名前を付けよ」って一般原則からすれば
メソッドが十分短いならhは許されるだろう。hogeは不味いだろうけど
というか、極端に長すぎるのも考え物
記述密度が上がって逆に可読性を落としてしまう

Linusに言わせれば
>Modula-2 や Pascal のプログラマとは違って、C言語プログラマは 「こ
>の変数は一時的に使われるカウンターである(ThisVariableIsATemporaryCounter)」
>などというような気のきいた名前は使いません。C言語プログラマは、"tmp" な
>どの十分に書きやすく、それでいて少なくとも分かりにくくはならない変数名を
>選ぶものです。

Rubyも立場的には近いと思う
to_sとか、意味が通る限りにおいて短い名前を希求する

47:デフォルトの名無しさん
09/05/17 21:19:50
>>45
RSpecのpendingのことかな
詳しくはるびまの連載記事に載ってる

48:デフォルトの名無しさん
09/05/17 21:39:47
>>47
それです。さんきゅー。あいしてる。

49:デフォルトの名無しさん
09/05/18 11:07:46
>>12
>File.open('file.xml', 'r+') do |f|
> f.flock(File::LOCK_EX)
> f.truncate(0)
> f.rewind
> f.write('<?xml version="1.0" ?>')
>end

'r+' だとファイルが存在しなかったときにエラーになるよね。
それがいやで、自分は 'r+' じゃなくて 'a' にしてるんだけど、なにか問題あるでしょうか。
詳しい人のコメント求む。

50:デフォルトの名無しさん
09/05/18 11:18:10
'a' はファイルの最後から書き込む
'r+' はファイルの先頭から書き込む

対象のファイルが全くの空である場合は動作が「たまたま」同一

51:デフォルトの名無しさん
09/05/18 11:20:57
なら IO::CREAT|IO::WRONLY で

52:デフォルトの名無しさん
09/05/18 11:24:10
>>49
「あるはずのファイルが無い」とか「書けるはずなのに(権限などで)書けない」なんてのは
似たようなもんで、どのみちきっちりやるならチェックなり例外処理なりしなきゃいけない。
つまり、こまけぇこた(ry

53:デフォルトの名無しさん
09/05/18 11:38:29
>>49

def exclusive_write(path, content)
 body = lambda{|f|
  f.flock File::LOCK_EX
  f.write content
  f.truncate f.tell
 }
 File.open(path, 'r+', &body)
rescue Errno::ENOENT
 File.open(path, 'w', &body)
end

自分の過去を掘り返してきたらこんなんが出てきた。
正しいかどうかは…。

54:デフォルトの名無しさん
09/05/18 11:48:30
>>48
> あいしてる
これは、

 あいしてる ( ^з^)-☆Chu!!

までやるべき

55:17
09/05/18 17:02:45
前スレの982です(ファイルアクセスが他のソフトとぶつかる場合で質問)。

皆さんのレスを一通り見ましたが、File.openの箇所で工夫するというのが定石
なのでしょうか?
本を読んでいたら、 File.readable?(path) と File.writable?(path) なるものが
ありましたが、(これらが未だ登場しないといいうことは)使うと何か弊害が
生じるのでしょうか?


56:デフォルトの名無しさん
09/05/18 17:54:21
>>50
>'a' はファイルの最後から書き込む
>'r+' はファイルの先頭から書き込む

そうなんだけど、今の場合は f.truncate(0) して f.rewind(0) してから書き込んでいるから、
最初のファイルポインタの位置は関係ないよね。

>>51
これって何?初めて見るんだけど。マニュアルに書いてある?

57:デフォルトの名無しさん
09/05/18 18:05:17
>>56
URLリンク(www.ruby-lang.org)

58:デフォルトの名無しさん
09/05/18 18:07:42
>>52
そういえば昔、CGIだけどレンサバの容量の制限(quota?)でファイルが書けず、
1日分のデータが無くなったってトラブルがあったな・・・(遠い目

59:デフォルトの名無しさん
09/05/18 18:11:38
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /


60:デフォルトの名無しさん
09/05/18 18:46:21
マジックコメントをとりあえず強制的に utf-8 あたりで自動挿入する機能とかないかな
Emacsでいいんだけど

61:デフォルトの名無しさん
09/05/18 19:00:04
URLリンク(d.hatena.ne.jp)

62:デフォルトの名無しさん
09/05/18 21:16:28
1.9に添付されてるruby-mode.elを使え

63:デフォルトの名無しさん
09/05/19 01:53:42
URLリンク(wonko.com)

こいつのソース見てくれ。殆どの処理が module として定義されて
普通に実行しただけでは何も起こらないよね?

これはどうなっているの?
よくわからないけど、rubygems がゴニョゴニョしていると考えていいのかい。

64:デフォルトの名無しさん
09/05/19 02:20:21
crackup-1.0.1$ rak "at_exit|END"
lib/crackup.rb
288| at_exit do

まったく読み込んでないが、これじゃないか。

65:デフォルトの名無しさん
09/05/19 02:26:30
単純にmodule直下で色々やってるだけっぽいけど

66:63
09/05/19 02:36:16
>>65
すまん、勘違いしていた。さんくす。

67:デフォルトの名無しさん
09/05/19 08:09:15
>>60
検索すると、マジックコメントが Ruby(と Ruby が参考にした Python)独自のものだと思ってる人がちょくちょくいる模様
これ Emacs 自身が解釈する文字列で、読み込むファイル全般で効くから
-*- coding: utf-8 -*-
の行があったら Emacs はその文字エンコーディングだとみなして読み込むから
嘘だと思ったら

-*- ruby -*-

とだけ書いた hoge ファイルを Emacs で読み込んでみるといい
いわゆる拡張子がなくて判断情報がないはずなのに ruby-mode になるからさ
-*- perl -*- と書いたら perl-mode に、 -*- html -*- と書いたら html-mode になる

68:デフォルトの名無しさん
09/05/19 09:50:33
>>67
ほー知らなかった。emacsはそういう機能があるんだな。vimも似たようなのなのなかったっけ?

69:デフォルトの名無しさん
09/05/19 11:28:56
>>68
67 じゃないけど
URLリンク(jp.rubyist.net)


70:デフォルトの名無しさん
09/05/19 16:27:04
Rubyの、文字列中に任意の式を埋め込む機能は式展開という名前らしいですが、
これを英語でいうと何といいますか。

71:デフォルトの名無しさん
09/05/19 16:58:19
まんまだけどembedded expressionとか?

72:デフォルトの名無しさん
09/05/19 17:20:32
ruby-doc.org の Programming Ruby だと、その他のエスケープと一緒に
substitution となってるな。

73:デフォルトの名無しさん
09/05/19 20:31:20
少しお聞きします。
メソッドチェーンの途中で nil があってもそれ以後予期に計らってくれる便利なハックや方法はありませんでしょうか?

Delphi Prismのコロン演算子みたいなのです(例がマイナーすぎてスマソ・・)
Colon Operator - Delphi Prism
URLリンク(prismwiki.codegear.com)

74:73
09/05/19 20:36:41
すいません。
>>73 ですが、既存のgemsとかのユーティリティ的なものがあればそれキボンという感じです。
わがままですいません…。
Activeなんたらとかにないのかなーと探しているのですが、見つからず

75:デフォルトの名無しさん
09/05/19 20:40:43
((o = obj.hoge()) && (o = o.page()) && (o = o.moge()) && o.done()) || (puts "nil!!!")

・・・ごめん、忘れてw

76:デフォルトの名無しさん
09/05/19 20:59:01
演算子として使いたいなら、言語機能として組み込まれないとどうにもならないように思える
あえて小手先の拡張でなんとかするなら・・・こんな感じか?

obj.send_if_defined(:method1).send_if_defined(:method2)

77:デフォルトの名無しさん
09/05/19 21:08:54
>>73
眺めた程度ではリンク先の意味を理解できず申し訳ないのだけど
良きに計らうっていうのは具体的にどういう挙動を期待してる?

ふとこんなのを思いついた
class Nil; def method_missing; return nil; end

78:デフォルトの名無しさん
09/05/19 21:22:12
>>73
メソッドチェーンを使わないか、
期待した返り値にならない場合は例外出して抜けるメソッドだけをチェーンに使うか、
NoMethodError を rescue する

79:デフォルトの名無しさん
09/05/19 21:59:40
>>70
variable interpolation
いや、
expression interpolationだな。


80:デフォルトの名無しさん
09/05/19 22:00:42
>>73
ActiveSupportのObject#tryおよびそれの同等品でどうか。
実態はsendだが、nilにだけはnilを返すように定義されている。


81:デフォルトの名無しさん
09/05/19 22:17:57
ま た R a i l s か
でもこれ確かに便利だな

URLリンク(d.hatena.ne.jp)

82:デフォルトの名無しさん
09/05/20 01:11:27
tryを1.9に取り込むって話はどうなったんだっけ?

83:デフォルトの名無しさん
09/05/20 01:18:26
>>82
catch〜tryのtry?
それとも


84:デフォルトの名無しさん
09/05/20 01:39:50
haskellのめいびーがうんたらかんたら

85:デフォルトの名無しさん
09/05/20 02:18:00
>>82
名前がよければ採用してもいいという話になっていたと思うが、
誰かが思い出させないとそれきりかな?
いちおうRedmineには入っていたハズ。



86:73
09/05/20 04:16:49
ActiveSupportのtryですね。確かにそんな感じですw
ちょっと使ってみようと思います。

> require 'activesupport'; [4649, "HageUnko", nil].map{|i| i.try(:+, i) }
[9298, "HageUnkoHageUnko", nil]

ありがとうございました。

87:デフォルトの名無しさん
09/05/20 04:51:55
WinXP-ProでRubyは1.8.6です。
URLリンク(www.func09.com) 
を参考にSocketサーバーを作りたいと思っています。

先ずは、server_client.rb中の require "socket_server" について調べましたが、
リファレンス URLリンク(www.ruby-lang.org) には socket_server
というライブラリはありません。

もしかして、ある時期から単に socket になったのでしょうか?
参考サイトの日付は2007年10月です。


88:87
09/05/20 06:35:46
(補足)
目標は、厳密にはXMLSocketサーバーです。


89:デフォルトの名無しさん
09/05/20 10:43:00
obj = PStore.new(path)
pstore = obj.transaction
p pstore.roots
pstore.close

とすると、2行目で止まって、Ctrl+C すると

/usr/lib/ruby/1.8/pstore.rb:296:in `flock': Interrupt
from /usr/lib/ruby/1.8/pstore.rb:296:in `transaction'
from /home/俺/上記ファイル.rb:2:in `hoge_method'

というようになるようになってしまったんだが、
似たような現象にぶち当たった経験があるとかで原因の心当たりある人いる?

90:デフォルトの名無しさん
09/05/20 11:31:07
flockってことはファイルロックしっぱなしなんじゃないのか?
他のスクリプトやエディタ(てことはないか・・・)が開いててロックしているとか

91:デフォルトの名無しさん
09/05/20 12:34:18
>>90
あ、ほんとだ、超でっかいpstoreのトランザクションの奥で同じファイルをPStore.newしてる
何がどうなっていつのまにこうなったんだ、これ

まあいいや、ありがとう

92:デフォルトの名無しさん
09/05/20 15:02:35
>>79
>interpolation

さんくすです

93:デフォルトの名無しさん
09/05/20 15:17:04
存在してないファイルからpstoreで読み込んだときに何が返るかの記憶法あるかな
nil だったか空のハッシュだったかぜんぜん覚えられないんだが

94:デフォルトの名無しさん
09/05/20 15:17:49
irbでさくっと試せ

95:デフォルトの名無しさん
09/05/20 15:21:43
わざわざターミナル開いて

irb
require 'pstore'
PStore.new('1').transaction{|p| p[p.roots.first]}

これを打つのがしんどいから聞いてるんだよ逆切れ

96:デフォルトの名無しさん
09/05/20 15:25:05
PStoreでハッシュを保存してるとわけわかめになることが全くないでもない

というかなんであれは ENOENT とか発生しないのは何故?

97:デフォルトの名無しさん
09/05/20 15:34:21
>>93-95
言うのをめんどくさがるから却ってめんどくさくなる好例だなw
まあそのコードが一発で出てきたところから推測できるように
rootsの初期値は空のArray
nilもHashもfirstが通らん

98:デフォルトの名無しさん
09/05/20 15:49:54
pstore は、ファイルが存在しているかどうかを全く関知しない

ファイルがそもそも存在しない場合も、
ファイルはあるけど登録が空である場合も、
ファイルがあって何らかのデータが登録されてる場合も、
transaction の返り値オブジェクトの [] メソッドはハッシュのように振舞うし、
fetch メソッドはキーの有無をチェックして例外を出す

ということで、 ファイル自体が無い場合もそのキーでの登録が無い場合も一律 nil だな
nil をキーとして何かデータが登録されていると誤動作するであろう pstore 利用スクリプトは時々見る

99:デフォルトの名無しさん
09/05/20 18:00:35
ruby 1.8.6 で日本語を slice しようと思ってます。

URLリンク(taiyaki.org)

が定番でしょうか?
最終版が 2003-5-7 ですが、枯れているのか
放置されているのか分からなくて。

100:デフォルトの名無しさん
09/05/20 18:14:13
>>99
UTF-8で、
puts "日本語".scan(/./u)[1]

とかではいかんのでしょうか?

101:99
09/05/20 18:32:30
>>100
できました。ステキ。

/./u の u がないともっとステキなのですが、
これはどうしようもないのでしょうか。

102:デフォルトの名無しさん
09/05/20 18:41:55
じゃあメソッド作って隠せ
それで>>99と同じになる

103:デフォルトの名無しさん
09/05/20 18:47:03
>>101
$KCODE設定だけでいけるんじゃないかと。
詳しくは知らない

URLリンク(www.ruby-lang.org)

104:デフォルトの名無しさん
09/05/21 00:14:09
ファイルからUTF8のテキストデータを読んだのですが、

p line[0,2]

としても期待どおりに文字を切り出せません。
どう書けばよいのでしょうか?

105:デフォルトの名無しさん
09/05/21 01:01:58
>>104
期待とは line = 'こんにちは' のとき line[0,2] #=> 'こん' ということ?

1.8系 $KCODE = 'u' 前提
1.8.6 までなら line.split(//)[0,2].join
1.8.7 なら line.chars.to_a[0,2].join でも。
おまけ line[0, 6] # 漢字(1文字3バイト)のみからなるのが確実な場合

1.9系
エンコーディングが正しければ、それで期待どおりになる。

106:デフォルトの名無しさん
09/05/21 01:25:29
>>105
ありがとうございます。うまくいきました。

107:デフォルトの名無しさん
09/05/21 02:02:56
1〜10の数字のうち、ランダムに5個を選ぶ記述で悩んでいます。

単純に r=rand(10) r=r+1 を5回やるとしても、5,4,8,8,7と同じ数が並ぶ
可能性があり、条件式で判別するのは元の数が増えた場合を考えると
スマートではないような気がします。
(数が増えて100万個の中から1000個を選ぶとか)

何か良い方法はありますか?


108:デフォルトの名無しさん
09/05/21 02:37:07
>100万個の中から1000個を選ぶ
大きな量でも扱える方法が少量の際でもスマートとは限らないから
別個に考えた方がいいと思う

とりあえず一例
ary = []
(1..10).each{|i| ary << i }
5.times{ puts ary.delete_at(rand(ary.length)) }
もちろん数が大きい時には向かない

109:デフォルトの名無しさん
09/05/21 02:38:04
なんで書き込んだ直後に(1..10).to_aを思い出すかなorz

110:デフォルトの名無しさん
09/05/21 02:48:19
numbers=[]
while numbers.size<5
  numbers|=[rand(10)]
end
こんな感じかな
乱数の出てきた順番がどうでもいいならSet使ったほうが良いと思うが

111:デフォルトの名無しさん
09/05/21 02:49:31
>>107
step.0 選ばれた数の総数 n = 0
step.1 1を選ぶ確率 5/10
step.2 2を選ぶ確率 (5-n)/9
step.3 3を選ぶ確率 (5-n)/8
...
nが5になるまでstepごとに0から1の一様乱数を発生させて確率以下ならその数を選択することを続ける

112:デフォルトの名無しさん
09/05/21 03:54:58
それと選ぶ総数が全体数の半分以上なら選ばない数の方を選択して
それを全体から除外するようにしたほうが特に全体数が多い場合は現実的な効率はいいと思う
起こりうる最悪ケースではどちらでも変わらないし全体数の半分程度を選ぶとかではあまり関係ないけど
それから全体数が多いときは一様乱数の有効数字の桁数が問題になるかもしれないので
0から1の浮動小数でなく選択確率の分母以下の整数値をランダムに生成して分子と比較するとかの方がいいかも
でもそれでよくなるかどうかは乱数の生成方法次第だしそもそも100万個くらいならこれは問題ないのかな?

113:デフォルトの名無しさん
09/05/21 04:19:05
100まんこのランダム抽出程度なら手抜きで作っても普通に終わるだろ

result = Array.new
max = 1_000_000 ; period = max / 100
$stdout.sync = true
print 'prepareing...' ; base = (1..max).to_a ; puts "done"
while e = base.delete_at(rand(base.size)) do
result << e
print '.' if (result.size % period).zero?
end
puts
p result.size
p result[0],result[max]

ごめん嘘ついた
インジケータ1個も出ない(w

114:デフォルトの名無しさん
09/05/21 05:50:28
spec_helper.rb って spec コマンドが勝手に探して自動で読んでくれる便利なファイル名とかそういうのじゃないのね

require '../../../spec_helper'

とか spec ファイルの最初に書くのカッコ悪いんだけどもこれは構造上仕方ないのかな

115:デフォルトの名無しさん
09/05/21 06:01:28
それだとカレントディレクトリ以外で spec コマンド使ったときに動作しないぞ

require "#{File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..', '..', '..', 'spec_helper'))}"

こうだな
長大なファイルパスを記述するのが面倒だから spec_helper を使おうと思ってる人には逆に憂鬱かもしれん
しかしこれ1行で済むとも言えるが

116:デフォルトの名無しさん
09/05/21 08:04:42
>>107
[*1..10].sample(5)
[*1..1_000_000].sample(1000)

117:デフォルトの名無しさん
09/05/21 08:09:23
>>115
なんでわざわざ同じことを何回も繰り返す?

require File.expand_path('../../../../spec_helper', __FILE__)


118:デフォルトの名無しさん
09/05/21 09:32:24
File.expand_path の第2引数の扱いは undocumented だからな
現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら
つまり、以下の4つは同じように /full/path/basedir/dir/file を返す

File.expand_path('dir/file', '/full/path/basedir')) # マニュアルを素直に読む場合、第2引数はフルパス
File.expand_path('dir/file', 'basedir'))
File.expand_path('dir/file', File.dirname(File.expand_path('file_in_basedir'))))
File.expand_path('dir/file', 'file_in_basedir'))

というか、このへんは実験終了と称して次のバージョンくらいでぽっと無くなりそうで嫌だ

119:デフォルトの名無しさん
09/05/21 11:40:41
第二引数なし・pathnameなしで一番短いのはこれかな

require File.join(File.dirname(__FILE__), '../../../spec_helper')

でも確かに、spec_helper.rbを自動or独自メソッドで読んでくれれば一番早いとは思う

120:デフォルトの名無しさん
09/05/21 12:08:01
メモリ上で文字列の圧縮・展開を行いたいです。
そういったライブラリはありますか?

121:デフォルトの名無しさん
09/05/21 12:20:56
よーわからんが

irb> require 'zlib'
irb> str = "プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】
   【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
    ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です"
irb> p str.size
560
irb> z = Zlib::Deflate.deflate(str)
irb> p z.size
375

こういう話ではなく?

122:デフォルトの名無しさん
09/05/21 12:53:49
>>121
ありがとうございます。zlibを調べてみますね。

123:デフォルトの名無しさん
09/05/21 13:31:52
すいません。
>>87をお願いします。


124:デフォルトの名無しさん
09/05/21 13:48:27
>>123
socket_server.rb はライブラリではなく単なるアプリケーションで、同じページの
server_client.rb の次に説明されてる


125:デフォルトの名無しさん
09/05/21 16:16:25
rspecにて、spec/hello_spec.rbから hello.rbを起動テストしようとしています。

しかし、NetBeansの "rspecテスト"からrspecを起動した場合だけテストに失敗してしまいます。
コマンドプロンプトから spec spec/hello_spec.rb では問題ないのですし、直接 ruby hello.rbでも問題ないです。

warningの文字列で、テストしているので起動時の "-w" をとれば成功するようになるのですが、
コマンドプロンプトからは -w をつけても問題ないのが気になります。

'my script should have no errors or warnings' FAILED
expected not: =~ /warning/n,
         got:    "(Rubyインストールディレクトリ)/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:138: warning: d:/my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8/specifications: Invalid argument\nHelloWorld\n"
./spec/hello_spec.rb:15:
./spec/hello_spec.rb:13:in `chdir'
./spec/hello_spec.rb:13:

hello_spec.rbのソース
require File.join(File.dirname(__FILE__), '/spec_helper.rb')
describe "my script" do
  before do
    @bin_path = File.join(File.dirname(__FILE__), "/../hello.rb")
  end
  
  it "should have no errors or warnings" do
    pending "Hangs on JRuby" if PLATFORM =~ /java/
        
    Dir.chdir(File.join(File.dirname(__FILE__), "/../")) do
      output = `ruby -w #{@bin_path} --help 2>&1`
      output.should_not =~ /warning/n
      output.should_not =~ /Error/n
    end
  end
end

126:デフォルトの名無しさん
09/05/21 16:23:38
=~ というマッチャは見たことないな

127:デフォルトの名無しさん
09/05/21 16:35:42
>>124
さんきゅう。
同時に、「SocketServerというクラスがリファレンスにないぞ・・・」と思って
いましたが、これも下の socket_server.rb で定義していたんですね。

納得。


128:デフォルトの名無しさん
09/05/21 17:06:27
>>125
推測だが、コマンドプロンプトとNetBeansが
それぞれ違う場所にインストールされたrubyを使っていて、それで何かの問題が起こっているのでは?
実際にsource_index.rbの138行目見れば何か分かるかもよ

>>126
あるよ

129:125
09/05/21 18:40:11
>>126
正規表現のマッチャみたいです。

>>128
ありがとうさんです。

source_index.rb見てても何故かよーわからんくて、
使われているのがNetBeans標準のjrubyでなくちゃんとMatzRubyにしたよなー、
と思って設定を見直していたころ、gemパスがバグっていたことになっていたことに気づきました。

1行1パスなのに、何故か、
/my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8
と : で区切って2つパスが記述してありました…(´・ω・`)

削除して、/my_home/.gem/ruby/1.8 だけにしたところ、
問題なく動きました!
今思うと、source_index.rbはの該当行はgemパスの処理のところでした。

おかげさまで、無事に解決いたしました。
ありがとうございました。

130:デフォルトの名無しさん
09/05/21 19:38:56
>>116
[*1..10]も1_000_000も知らなかった
前者のはRange#to_aと優劣あるんだろうか

131:デフォルトの名無しさん
09/05/21 19:44:56
>>109-112, 116
Thx

ごめんなさい。未だ試してないです。


132:デフォルトの名無しさん
09/05/22 00:16:37
>>118
> File.expand_path の第2引数の扱いは undocumented だからな

Converts a pathname to an absolute pathname. Relative paths are
referenced from the current working directory of the process unless
<i>dir_string</i> is given, in which case it will be used as the
starting point.

「dir_stringを始点として絶対パスに展開する」とちゃんと書いてあるだろ。

> 現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら

勝手にdirnameしてるわけではなくて、>>117>>114より'..'が一つ多い。


133:デフォルトの名無しさん
09/05/22 00:18:05
>>130
[*1..10]のほうが(1..10).to_aより短い。
遅いけどな。


134:デフォルトの名無しさん
09/05/22 05:39:26
スレ違いな質問で申し訳ないが、GnomeVFSのSSH接続で、鍵を指定することはできないの?
普通に ssh://user@host と指定しただけでは ~/.ssh 下しか探さないみたい。

Net::SSH は鍵を指定できたんだけど。。

135:デフォルトの名無しさん
09/05/22 15:46:03
eRubyについて教えてほしい

eRubyで書かれたファイルの中に
eRubyで書かれたファイルを埋め込みたい

なんか出来そうな気がするのだけど
イメージがまとまらないので、できるのなら教えてほしい。

具体的な運用としては
Apacheで*.rhtmlのファイルをeRubyを通すように設定したサーバで
運用したいと思っている。
で、ページを構成する細かい部品をeRubyで書いて
そのレイアウトをeRubyで定義できないかな〜って感じです。

136:デフォルトの名無しさん
09/05/22 16:03:52
<% require 'erb' %>
<%= ERB.new(File.open(filename).read).result %>
じゃダメなんだっけ?

137:デフォルトの名無しさん
09/05/22 16:09:11
>>132
日本語マニュアル不備だよね
基本の添付ライブラリのマニュアルが英語とかなにそれ

138:デフォルトの名無しさん
09/05/22 16:35:47
>>136
それでいけました
ただ、単にERBオブジェクト作ってあげるだけでよかたんか。
これで、ヒャッホ〜イ!できそうです。ありがとう。

139:デフォルトの名無しさん
09/05/22 16:50:58
>>133
サンクス
数文字程度長いぐらいならわかりやすいほうが好みだから
[*1..10]を選ぶ理由はなさそうだ

140:デフォルトの名無しさん
09/05/22 17:42:51
>>137
ri File.expand_path


141:140
09/05/22 17:44:48
いや、これも英語か。

ソースから抜き出してるから、日本語版を作るとなると
ソースに日本語でドキュメントを書くか、
自動生成を諦めるかになるのかな。




142:デフォルトの名無しさん
09/05/22 17:46:35
ja.po 形式はどうだろう

143:デフォルトの名無しさん
09/05/22 17:49:56
そういえば、rubyをgettext対応させた人っていないのかな。


144:デフォルトの名無しさん
09/05/22 17:55:05
>>143
スクリプトの話?本体の話?
前者はライブラリがある

145:デフォルトの名無しさん
09/05/22 17:56:24
>>132
第2引数は /path/to/file を渡しても /path/to/ とみなして処理される
相対パスを渡しても、絶対パスに変換したあとで基点とみなされる
startint point という語にそれだけの処理の意味を任せるのは初耳だ

146:デフォルトの名無しさん
09/05/22 18:16:07
>>141
日本語版のリファレンスにはReFeというツールが付属していてだな

147:デフォルトの名無しさん
09/05/22 18:30:33
>>145
> 第2引数は /path/to/file を渡しても /path/to/ とみなして処理される
違う。あやふやな知識で書くより、ちゃんと試してみることをすすめる。

File.expand_path("foo", "/path/to/file") #=> "/path/to/file/foo"
File.expand_path("foo", "/path/to/") #=> "/path/to/foo"
File.expand_path("../foo", "/path/to/file") #=> "/path/to/foo"
File.expand_path("../foo", "/path/to/") #=> "/path/foo"

> 相対パスを渡しても、絶対パスに変換したあとで基点とみなされる
> startint point という語にそれだけの処理の意味を任せるのは初耳だ
これも違う。重要なのは戻り値は絶対パスだということ。
File.expand_path("foo", "path") が "path/foo" だったら絶対パ
スじゃないだろ? 絶対パスを返すという仕様が前提なんだから、相
対パスは他にどう扱いようがあるというんだ。


148:デフォルトの名無しさん
09/05/22 18:50:06
>>144
ruby-gettext-packageは知ってる。
本体の出力メッセージとかの話。


149:デフォルトの名無しさん
09/05/22 18:55:53
GNU gettextはLの付かないGPLだから、使うとRubyを
Ruby's ライセンスではなくGPLで配布する必要が生じるかも。


150:デフォルトの名無しさん
09/05/22 18:56:19
URLリンク(www.nicovideo.jp)

151:デフォルトの名無しさん
09/05/22 19:01:06
「読まない人は日本語でも読まない」wwww


152:デフォルトの名無しさん
09/05/22 19:16:33
インタプリタの出すメッセージは用語みたいなもんだから
翻訳するとかえってめんどくさいことになりそうな

153:デフォルトの名無しさん
09/05/22 19:23:19
入ります

154:デフォルトの名無しさん
09/05/22 19:28:51
みんな なでしこ やったことある?

155:デフォルトの名無しさん
09/05/22 19:40:55
このスレでその質問をするココロは?

156:デフォルトの名無しさん
09/05/23 02:19:17
@port = port if( !port.nil? ) の解釈で質問です。

最初の@はインスタンス変数で、右辺のifは修飾子だと思うのですが、
()内の「?」の意味が分かりません。

これがは文字コードリテラルとは思えませんし・・・
どういう意味(役割り)なのでしょうか?


157:デフォルトの名無しさん
09/05/23 02:24:44
nil? というメソッドです

158:デフォルトの名無しさん
09/05/23 02:48:30
いちおう補足、リファレンスでObjectクラスのインスタンスメソッドを眺めてみて

しかしなんというか、不慣れな時期にそのコードというのは運が悪いな
せめて @port = port unless port.nil? と書いてほしい

159:デフォルトの名無しさん
09/05/23 02:53:02
うーん。識別子に使える文字等の解説が見つからない。

URLリンク(www.ruby-lang.org)
↑これ、ぶっちゃけ不正確じゃね?

160:デフォルトの名無しさん
09/05/23 02:59:45
>>157-159
さんきゅうです。

つまり if( !port.nil? )  というのは、「portが無効でないなら(不活性でないなら)〜」
ということでOKですか?


161:デフォルトの名無しさん
09/05/23 03:05:25
うんにゃ。
if( !port.ni? ) → if()

162:デフォルトの名無しさん
09/05/23 03:07:57
あら。途中で書き込んだ。

if( !port.ni? ) → if( !port.nil? == true ) → if( port.nil? == false )
で理解してくらはい。
port.nil? は boolean を返すことが期待されてるメソッドです(たぶん)。

163:デフォルトの名無しさん
09/05/23 05:05:12
Ruby に Boolean などというものはありませんが何か
あーでも結構使ってるなー

>>156
A if COND という構造だということはわかってるんだよね

if はメソッドではなく制御構造だから、このカッコは引数のカッコではなく式を作る「まとめカッコ」だ
中身1つだけだから、本当はこのカッコは必要ない

で、最初の ! は否定の NOT だ
URLリンク(www.ruby-lang.org)
直後にあるものの真偽の概念を逆転する
つぎの port はなんらかのローカル変数またはメソッド呼び出しで、
ドットで繋がってる nil? は port の返り値のクラスの nil? というメソッド
port のクラスで再定義されていないのなら、それは Object#nil? で、オブジェクトが nil である場合に true を返す

まとめると、
「port の返り値が nli でない場合に、@port に port の返り値を代入する」
となる

164:デフォルトの名無しさん
09/05/23 05:14:20
Rubyではよっぽどでない限り
@port = port unless port
と書くけどな

 ・ port に false が入る可能性があって、それは nil とは違う処理が必要
 ・ port が nil であるというのが何か重要なサインであってソース読み下し上目立たせたい

というのでない限り、今回でいうところの
「port に何か入ってたら @port に入れとく」
というフツーの意図である限り、 Ruby では unless を使う

165:デフォルトの名無しさん
09/05/23 05:35:31
>>164.gsub("unless", "if")


166:デフォルトの名無しさん
09/05/23 05:58:35
「nil でない」なら if だと思う

167:デフォルトの名無しさん
09/05/23 10:07:30
# データからHTMLを作って返す
def html
 html = String.new
 …
 return html
end

というように、メソッド内のローカル変数名とそのメソッドの名称が全く同じなのって、ある程度は紛らわしいですよね
できれば避けるべきなんでしょうか?

168:デフォルトの名無しさん
09/05/23 10:58:18
再帰のような処理と混同する可能性があるってこと?
メソッド内1行目でローカル変数として定義されてれば読んでて混乱はしないと思う

if (html = init_data) then みたいにどっかの文の途中でこっそり変数定義を使ってることがあるとか、
変数とメソッドを混ぜて使い倒してる処理があるとか、そういうのが1ヶ所でもあれば注意深く読む

169:デフォルトの名無しさん
09/05/23 11:28:11
IOのexpertな方、教えてください ><

# afio - manipulate archives and files
COMMAND = "afio -oZ -"

IO.popen(COMMAND, "r+") do |src|
  Find.find("/etc") do |f|
    src.puts(f.chomp)
  end
  src.close_write
  File.open("myArchive.afz", "w") {|dst| dst.write(src.read)}
end

afioコマンドが pipe_wait になって終了しません。
何が悪いのでしょうか?

170:169
09/05/23 11:49:24
ちなみに、コマンドライン上から
 $ find /etc | afio -oZ - 1>./myArchive.afz

とやれば、何も問題なく動作するんです。
ワケワカメで頭が破裂しそうです ><

171:デフォルトの名無しさん
09/05/23 11:52:44
afioコマンドが、入力を読み切らずに何か書き出そうとして固まってるとか?

172:169
09/05/23 13:22:11
afioで作成されたアーカイブをバイナリエディタで読んでいてふと思ったのですが、
なにやらヘッダらしきものが書かれていて、その後ろにgzipで圧縮されたバイナリがずらーと並んでいる感じです。

このバイナリファイルをハッキングして、自分でライブラリを書いてしまえばいいと思いました。
外部のコマンドに投げるよりはよりキレイに書けるとおもいまつ。

ありがとうございました。

173:デフォルトの名無しさん
09/05/23 13:25:37
>>169
原因は>>171の通りだろう。
アーカイブデータをなんか加工したいというんでなければ、直接書き出させた方がよい。
あとFind.findからyieldされるパス名はchompする必要はない、というかしてはいけない。

COMMAND = "afio -oZ myArchive.afz"
IO.popen(COMMAND, "w") do |src|
Find.find("/etc") {|f| src.puts(f)}
end


174:デフォルトの名無しさん
09/05/23 13:39:58
>>172
manpageによるとcpioフォーマットだな

Except in special cases discussed below, afio will create archives
with the same format as ASCII cpio(1) archives.
以下に述べる特殊なケースをのぞいて、afioはASCII cpio(1)アーカイブと同じ
フォーマットでアーカイブを作成する。

When creating an archive, the `large ASCII' header is used by afio to
cover the following situations:
アーカイブを作成する際、以下の場合は「large ASCII」ヘッダが使用される。

o A file has a size larger than 2 GB
・ 2GBよりも大きいファイル

o The archive contains more than 64K files which have hard links
・アーカイブ中のハードリンクが64Kを越えるファイル

o A file, directory, or special file has a UID or GID value larger
than 65535.
・65535より大きいUIDやGIDを持つファイル、ディレクトリ、特殊ファイル


175:169
09/05/23 21:41:37
すみません、最後に勉強のためにも教えてください。
納得したらもう寝ます。

>>171にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。
全て入力した後に IO#close_write も呼びましたし、他に意識することって何でしょうか。
Pythonの os.popen2 で同様の事をやってみたのですが、あっさりうまくいって
クソワロタ状態です (;_;)

>>173
ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで
何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。

> あとFind.findからyieldされるパス名はchompする必要はない、
> というかしてはいけない。
すみません、確かにchompする必要はありませんでしたね。
でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。

以上、よろしくお願いします。

176:デフォルトの名無しさん
09/05/23 23:24:38
whileの条件による終了(ループ脱出?)が分かりません。
下記は受信サーバー側のSocket通信の記述で、クライアントからの
信号s(オブジェクト)を受信したらRubyを終了したいのですが・・・

while true
Thread.start(gs.accept) do |s|
print(s, " is accepted\n")
puts(s.gets)
s.close
break # ここでは無効
end
end

どう変更すべきでしょうか?


177:169
09/05/24 00:19:36
あああ、pythonでうまくいったというのは勘違いでした。(test caseのミス)
でも
 IO.popen("cat | afio -oZ -")
のように、catコマンドをクッションにしてみたらうまくいきました。

なんでだろうね。
バッファの関係??
朝起きたらlinux板でも行って聞いてみます。。もう疲れた。

178:デフォルトの名無しさん
09/05/24 01:15:44
>>175
> >>171にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。
もちろんあり得る。それはプログラムの構造次第。afioの場合ファイル名を受
け取れば処理できるんだから、一つ分出力してもなにも不思議じゃない。

>>177は、catでバッファリングされてclose_writeされるまでafioに何も渡されて
ないんだろ。

> >>173
> ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで
> 何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。

書き込みと読み込みでThreadをわける。

IO.popen(COMMAND, "r+") do |src|
Thread.start do
Find.find("/etc") do |f|
src.puts(f.chomp)
end
src.close_write
end
File.open("myArchive.afz", "w") {|dst| dst.write(src.read)}
end

> でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。
"\n"で終わるファイル名を正しく扱えない。

179:デフォルトの名無しさん
09/05/24 01:19:36
>>176
mth = Thread.current
while true
Thread.start(gs.accept) do |s|
print(s, " is accepted\n")
puts(s.gets)
s.close
mth.raise(SystemExit)
end
end


180:デフォルトの名無しさん
09/05/24 01:32:45
>>176
gsってTCPServer?
サンプルをコピーしたとするとwhileで囲う必要もスレッドを生成する必要も無いと思う

s = gs.accept
print(s, " is accepted\n")
puts(s.gets)
exit

181:176
09/05/24 02:49:36
>>179-180
Thx 確かにwhile文無しでもOKでした。
今回は URLリンク(www.ftnk.jp)
を参考にしました。

すいません。もう一つ質問です。

上記HPのクライアント側を改変して2行のテキスト「memo.txt」を読み込み
サーバーに渡すように
data = File.read("memo.txt")
puts data # チェック用
s.puts(data)

を書きました。
クライアント側では2行で表示されるのですが、サーバーの表示 puts(s.gets)
では最初の1行目のみが表示されます。
これは何故でしょうか?


182:デフォルトの名無しさん
09/05/24 03:57:22
文字列がcopy on writeじゃないのが他の言語と違って結構ハマることが多いのですが、
何か気をつける方法ってないのでしょうか?
Rubyでは全部オブジェクトってのはわかっているつもりなのですが…。

#!ruby -Ku

a = "hage"
b = a
b << "UNKO==!!"

def change_string(s)
s << "(((^^)))))"
end
change_string(b)

puts a, b

結果:
hageUNKO==!!(((^^)))))
hageUNKO==!!(((^^)))))

183:デフォルトの名無しさん
09/05/24 04:50:17
>>181
IO#gets が何をするメソッドなのかマニュアルで調べてみ

>>182
それって別に文字列に限った話じゃないよね
配列、ハッシュ、その他のオブジェクト、なんでも当てはまる
オリジナルでは無くてコピーが必要なら必ずdup,clone、を徹底するしかないかな

184:176
09/05/24 05:02:30
>>183
どうも。
readに変えたらOKでした。


185:デフォルトの名無しさん
09/05/24 05:45:31
>>182
Rubyのあらゆる変数(や定数)はただの参照タグだ
a = HogeObject.new は HogeObject.new の処理の最後を辿って(return してた)そのオブジェクトに存在を許して
それに a という参照タグを1個つけるという行為
b = a は a の処理の最後を辿って、つまりは a の返り値のオブジェクト、に b という参照タグを追加する行為

Ruby スクリプトは変数の名前を後生大事に覚えてるわけじゃない
Rubyはスクリプトのそれが変数名だとわかったら、その変数が参照している先にあるオブジェクト
(の保管場所を表す数値「オブジェクトID」)だけを記憶する

だから、
a = なにか
b = a
と書いた時点で、変数 a も変数 b も全く同一のオブジェクトを指す(つまり、一般的にはあまり意味がない)

a = "なにか"
p a.object_id
b = a
p b.object_id
p a.object_id == b.object_id



186:182
09/05/24 05:51:03
>>183 >>185
せっかく説明してくださって申し訳ないのですが
原理をわかってて言ってるのです…(´・ω・`)

他の言語のつもりで書いちゃうと、ついバグを埋め込んでしまう
まあ、ユニットテストしっかりしろってことになるのだと思いますが…。

187:デフォルトの名無しさん
09/05/24 05:52:21
で、既存のオブジェクトを破壊せずに、その内容を利用した新たなオブジェクトを作りたい場合は、
その既存のオブジェクトを破壊しないような方法を意図的に使う

a = "hage"
b = a + "ADD"

def change_string(s)
s + "CHINGE!"
end

c = change_string(a)

p a, b, c

結果:
"hage"
"hageADD"
"hageCHINGE!"

オブジェクトを「足して」新たなオブジェクトを作るようなメソッドが提供されていなかったらどうするか、というのなら
そりゃ>>183の言うようにオブジェクト内容自体を複製して新たなオブジェクトを作る dup や clone を使うしかあんめえ

188:デフォルトの名無しさん
09/05/24 05:54:44
>>186
「わかってない」と思う
わかってるのなら“絶対に間違えない”から

逆にいうと、オブジェクトと変数の関係を理解するまではよーわからんバグで悩まされて
変数は安全のためにと称して全部 initialize やメソッド定義の 1行目で dup することになるんだけどな

189:182
09/05/24 05:57:44
>>188
「わかってる」のと「間違えない」というのは等しくないですよ。
わかってて、正しいことができるなら、俺は今頃、億万長者になってる

190:182
09/05/24 06:00:14
変なところだけレスして煽りっぽくなってしもうた orz 流してくださいwww

>>187
ああ、なるほど、確かに既存のオブジェクトを破壊しないでコピーされる場合は、OKですね。

>>188
メソッドなどで渡された引数とかなるべくdupするわけですか。なるほど。

191:デフォルトの名無しさん
09/05/24 06:01:54
>>189
いいえ、理解してないんです
「他言語を使いこなす俺がこれごときを理解できていないはずがない」というようにプライドが邪魔をしてるだけです
本当は理解してないのを見なかったことにして「他の言語と違って結構ハマる」と問題を差し替えているのです

これは特に目新しい概念というわけでもありません
きちんと理解しましょう

192:デフォルトの名無しさん
09/05/24 06:27:16
むしろ Ruby に慣れると、ほかのスクリプト言語で「同じデータ」を使う必要性が出てきたときに
メモリでどういう状態になってるのかがとっても気になる
Ruby なら同じものを使い倒してるということが感覚的にわかって安心できるんだけれど


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

5373日前に更新/107 KB
担当:undef