[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/16 20:51 / Filesize : 256 KB / Number-of Response : 901
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 22



1 名前:730 [2008/09/15(月) 17:25:21 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.7 の使用をお勧めします】
    ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。
      1.9 の新機能の一部が利用可能なので初学者にお勧めです。
    ※ただし十分安定しているとは言えないので
      プロダクション環境での利用にはお勧めしません。

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

263 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 12:11:04 ]
表示端末の文字エンコードを自動判別して変換することはできますか?
ファイル内容を puts した瞬間に
「しまったこれShiftJISかようわ矢印キー効かね」
というようなことを大多数の端末で避けたいです


264 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 12:21:02 ]
>>263
ENV に情報がなければ無理だろな
Windowsのコマンドプロンプトでは特に情報がないようだ

265 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 15:36:52 ]
あー、スクリプト例で文字列を puts とかさせるときちょっと困るね
toeuc 決め打ちしておくのも変だし

266 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 16:08:59 ]
rubygemで特定のパッケージをupdate対象から外すことはできる?
要はholdしたいんだけど

267 名前:デフォルトの名無しさん [2008/09/27(土) 01:13:27 ]
TkcItem.newはrequire 'tk' だけでできるのに
TkcItemのサブクラスを作ろうとするとrequire 'tk/canvas'が必要になるのはなぜ?

268 名前:デフォルトの名無しさん [2008/09/28(日) 03:56:41 ]
rubyをつかって刑務所からプログラミングしてるんですか?

269 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 14:35:51 ]
Rubyでバイナリを16進数文字列に変換するのはどうしたらできますか。
packとかunpackがわかりくすぎて、理解できません

270 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 14:55:34 ]
packとか使え
packはC参考にしれ

271 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 15:22:39 ]
open(ARGV[0], 'rb'){|f|
while bin = f.read(16)
bin.each_byte{|byte|
print '%02X ' % byte
}
puts
end
}



272 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 15:46:05 ]
class XY
attr_reader :x, :y
def xy=(x, y=nil)
@x = x
@y = y || x
end
end

a = XY.new
a.xy=(1, 2)

というのを実行すると、
SyntaxError: compile error
syntax error, unexpected ',', expecting ')'
となってしまいます。
普通にメソッド呼んでいるだけなんですが、何が悪いんでしょうか。。
=のつかないメソッド名だと大丈夫なんですが…

273 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 17:00:00 ]
www.ruby-lang.org/ja/man/html/_A5AFA5E9A5B9A1BFA5E1A5BDA5C3A5C9A4CEC4EAB5C1.html#a.b1.e9.bb.bb.bb.d2.bc.b0.a4.ce.c4.ea.b5.c1
リファレンスマニュアルによると、代入演算子は次の形で再定義できるという
def foo=(value) # obj.foo = value

なので、xy=(x, y=nil) のメソッドを呼ぶには次のようにする
a.xy = 式
そのエラーは式の部分が (1,2) なので文法エラーになっているということ。
value = (1, 2) という式はRubyでは解釈できない。

という話だと思う。 たぶん。 信用度 80% くらい。

274 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:47:03 ]
RoR動くレンタルサーバーって
高いところしかないの?

さくらのライトプランで動かないの?

なるべく月500円以下のところを
紹介してほしいんだけど。

275 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:58:38 ]
500円以下はありえない

そもそものRoR動かすこと自体がかなりサーバ負荷の高い行為だから、
収容人数の多い安いレンタルサーバでは実用的な速度ではまず動作しない

専用サーバと呼ばれる、少人数あるいは自分たちだけの買い取りサーバを使うんだね

276 名前:272 mailto:sage [2008/09/28(日) 19:02:27 ]
>>273
ありがとうございます。

a.xy=(何か)
という形は単なるメソッド呼び出しだと思っていたのですが、
実際には代入用の特別な呼び出しで、「何か」の部分は代入の右辺に
使えるような式である必要があり、普通のメソッドと同じようには
いかない、ってことなんでしょうか。

結局、調査の末これならできるということがわかりました。。
a.send(:xy=, 1, 2)
実際は ActiveRecord::Base#attributes= なんですが。

277 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 19:09:56 ]
a.xy=1, 2とかa.xy=*[1, 2]でもよさそうに思う

278 名前:272 mailto:sage [2008/09/28(日) 19:41:41 ]
>>277
それだと @x が [1, 2] になっちゃうんです…
ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin8]

279 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 20:17:45 ]
class XY
  attr_reader :x, :y
  def xy=(v)
    @x, @y = v
  end
end

a = XY.new
a.xy = 1, 2

280 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 20:55:34 ]
Rubyで、パイプのようなものを実現するにはどうしたらいいですか
input = "aaa¥nbbb¥nccc¥n"
output = open("|cat -n", "r+b") do |io|
 io.write(input) if input
 io.read
end
でいけるかなと思ったのですが、io.read()でブロックされるようで、うまくいきません。

281 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:06:48 ]
>>280
io.close_write()をいれるとできました。
input = "aaa¥nbbb¥nccc¥n"
output = open("|cat -n", "r+b") do |io|
 io.write(input) if input
 io.close_write() ## 追加
 io.read
end




282 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:17:08 ]
popen

283 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:29:15 ]
じゃあ俺はreadpartialを推しておく

284 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:41:56 ]
windows版のrubyが起動に物凄く時間がかかるんですがなぜでしょうか・・・?

285 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:57:46 ]
rubygems読み込んでるんだろ

286 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:18:04 ]
>>276
www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html
>プログラミングの利便のために一部のメソッド呼び出しと制御構造は演算子形式をとります。
>ほとんどの演算子は特別な形式のメソッド呼び出しですが、(後略)

ということだそうだから、普通のメソッド呼び出しとは違うんだろう。
だいたい2項演算子の引数が複数だったりすると混乱の元にしかならんしな。
f( a + 1, 2) と書いたら、実は f( a+(1, 2) ) でしたとか。

287 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:05:45 ]
ちょっと質問なのですが、Vistorパターンがいまいちわかっていません。
サンプルコードを見ても実際にどんな時につかうのかが?

Rubyのライブラリなんかで、Vistorパターンを実際に使っているソースはありませんでしょうか?

288 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:09:01 ]
>>274
安いRailsのホスティングサーバー - Core
d.hatena.ne.jp/core/20080906/1220715811#c

野ログはノロキュアMaxHeart - SlicehostでそれなりにRailsを使っている感想 , Rails動かす環境が欲しい人必見
cureblack.com/20080909.html#p01

まともに動かすには、VPSぐらいでないと無理くさいです。

レンサバでRamaze動かしている人(CGI駆動でw)はいた。

rubyの軽いWebアプリケーションフレームワークを試してみた - NAT’s Programming Champloo
d.hatena.ne.jp/NAT_programming/20080817/1218957113
さくらのレンタルサーバでramazeを動かしてみた - NAT’s Programming Champloo
d.hatena.ne.jp/NAT_programming/20080817/1218962624


289 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:14:09 ]
>>227
C/C++とか触れそうにないなw
あなたには選択肢が少ない、ひまわりとかDelphiがオススメ

290 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 08:23:51 ]
>>287
Visitorははまるときはピッタリはまるんだけどね。

Visitorパターンの例題として見るだけなら少し大きめだが、RDのパーサとか
rubyforge.org/projects/rdtool/


291 名前:デフォルトの名無しさん [2008/09/30(火) 00:28:47 ]
Mac OSXにRails環境を作ってみたのですが、プロジェクトを作成すると
ファイルの文字コードが全て iso-2022-jp-3で作成されてしまいます。

プロジェクト作成時にutf8でファイル生成するオプションなどはありますか?



292 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:23:04 ]
railsコマンドが作る初期プロジェクトに使われる文字の範囲では
ISO-2022-JP-3(初期ASCIIでスタート)とUTF-8は同じだと思うんだが。

293 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 10:00:53 ]
どんなソフトやらでISO-2022-JPでなくISO-2022-JP-3だと判定されたのかはちょっと気になるな

cat > hoge.txt とかで作ったファイルも同じ判定ならコンソールか何かの設定の問題か、その判定ソフトの癖だな

294 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 11:52:43 ]
RoR のフォームヘルパには Smarty でいう html_options みたいなヤツはないの?

295 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 14:09:23 ]
>>294
html_optionsみたいなのがなにかを説明しないと、わかるわけがない

296 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 14:20:57 ]
>>295
ttp://www.smarty.net/manual/ja/language.function.html.options.php

297 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 15:39:13 ]
まずは「rails select option」でぐぐろうぜ

298 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 17:10:47 ]
うぉーあった。ありがとうございます >>297
Rails入門(本)には text とか radio は載ってたのにこれは載ってない。
でもないのはおかしいなと思ってた。date_select まであるじゃんかよ…。

299 名前:287 mailto:sage [2008/09/30(火) 17:21:04 ]
>>290
thanx 見てみます。

300 名前:デフォルトの名無しさん [2008/09/30(火) 23:36:49 ]
>>292
特に気にする必要はないっていうことですか?
今のところ特に問題はないですが、聞いたことない文字コードだったので
そのうち何か問題がでないかと心配です。

>>293
vimに読み込ませた時の文字コードがiso-2022-jp-3で表示されてます。
linux上で作成したutf8のファイルは、問題なくutf8で表示されていますし
他の文字コードに関しても作成時と同じように表示されてるので
ファイルの認識自体は特に問題ないと思いますが。。。
catで作成したファイルもiso-2022-jp-31で作成されているようですし
FInder上で作成したファイルもiso-2022-jp-3なので、たぶんMacOSXでは
指定がない限り、その文字コードで作成してしまうのではないでしょうか。
なにぶん昨日Macにはじめて触りまして。。。詳しいことが。。。

とりあえずOS側の問題のような気もするので、そっちで聞いてみます。

301 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 08:21:11 ]
>>300
とりあえずodなどで問題のテキストをバイナリダンプしてみては?





302 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 11:09:10 ]
>>300
文字エンコード自動評価の順が iso-2022-jp-3 が最初なんだろう
vimrcの文字エンコード推測設定がMacOSX向きじゃないんだと思う
きっとどっかのサイトのを意味もわからず丸コピペしたのだと推測

303 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 12:05:42 ]
>>298
書名をさらして著者に改善を要求しよう

304 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 12:13:37 ]
バージョンアップ後のフォローを求めるアホもいるので注意
ちゃんと冒頭に「バージョン○○を対象にします」って書いてあんじゃんよ

305 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 15:00:25 ]
>>304
今回の select option に限って言えば、どのバージョンでもあるわな

306 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 19:14:46 ]
ruby gemsでdescriptionで検索することってできないのでしょうか?

 gem search --details --both --all hoge

とやっても、名前でしか検索ができません。
説明欄も検索したいのですが・・・

307 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:24:06 ]
searchは最終的にSourceIndex#searchに処理を委譲してて、
そこでは名前がマッチするモノを探しているだけのようだ。
rubygems/source_index.rbの

spec.name =~ gem_pattern and

というところ(手元だと272行め)を

(spec.name =~ gem_pattern or spec.description =~ gem_pattern) and

のように変更すればdescriptionも検索対象にできる。
他にsummaryなども、orで連結して探すようにできるはず。

残念ながら、--detailは出力をkwskするためのオプションだな。


308 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 11:44:41 ]
OSはXP Home SP3、Rubyは1.8.6(最終版)です。
以下のプログラムを実行してもうまく動かず、何がいけないのか分からず困っています。

sum =0
puts "点数を入力してください。"
a=0                     ←なんとなく初期化してみた。あってもなくてもダメ
for i in 1..5
  print i, "番:"
  a = gets.chomp
  sum += a                ←ここが鬼門。ためしにforのiにするとちゃんと動く
 # print a,"\n"
 # sleep 1
end
print "sum=#{sum}"

おそらく7行目のsum += aが問題なのですが何がいけないんでしょうか・・・?
助言頂けるとありがたいです。

309 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 11:49:49 ]
"うまく動かず"を出し惜しめせずに書けw

310 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 11:51:06 ]
sum += a.to_i
かな

311 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:07:40 ]
>>309
コマンドプロンプトだと1つ目の数値を入れたとたん終了・・・
>>310
できた!thx!
getsで入力した数値を文字列だと思ってたのか・・・orz
ほんとありがとう、数値ひとつ入力するのに1時間奮闘してた・・・



312 名前:311 mailto:sage [2008/10/02(木) 12:26:45 ]
またすぐに聞きに来てごめんなさい・・・orz
aを配列にしたとたん動かなくなりました・・・
実行しても「点数を入力してください」すら表示されず終わります。

sum =0
puts "点数を入力してください。"
a[]              ←いらなそうだけど一応宣言
for i in 1..5
  print i, "番:"
  a[i] = gets.chomp   
  sum += a[i].to_i      
end

.to_iの使い方がおかしいのかもと思い、その行をコメント化してみたりしましたがうまくいかず・・・
gets辺りで躓いてると思います。
お手数ですがどなたかアドバイスください。
入力で躓きまくってる私はRuby向いてないのかなぁ・・・orz


313 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:34:11 ]
sum = 0
ary = []
puts "点数を入力してください"
for i in 1..5
    print i, "番: "
    ary[i-1] = gets.chomp.to_i
end
sum = ary.inject(0) {|a, x| a + x }
print "合計: ", sum, "\n"

314 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:37:37 ]
どういう勉強の仕方をしてるのか気になる。

315 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:39:51 ]
>>312
「実行」って、コマンドプロンプトから ruby hoge.rb とかしてる?
普通はこうなる

> ruby hoge.rb
点数を入力してください。
hoge.rb:3: undefined local variable or method `a' for main:Object (NameError)

あと入門書嫁

316 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 12:49:11 ]
本題に関係ないとはいえ一応書いておくが、Rubyでforはめったに使わない
普通はブロックを使う

317 名前:312 mailto:sage [2008/10/02(木) 12:50:02 ]
>>313
おお・・・ちゃんと動く・・・ありがとです。
for文の中でsumに足していかないとは・・・!
sum周りが初見なんで調べないとですね。
ともあれthxです。

>>314
Cは多少やってたのでCの頃に書いた簡単なプログラムをRubyに書き直してみてるところです。
文法がずいぶん違って躓きまくりです・・・

>>315
いや、「.rb」をそのままダブルクリックで実行してます。
だからsleep入れたりしてすぐに消えないようにしてたり・・・
基本はRDEで実行してます。
「たのしいRuby 第2版」を参考にしてますが、必要な所だけ探して読んでるのがいけないかもですね・・・

318 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:19:11 ]
コマンドライン実行のスクリプトをダブルクリックしてどうする
正常終了でウィンドウ閉じるだろ

319 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:36:57 ]
最後にsystem('pause')入れたりする

320 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:02:52 ]
>>317
RDE使ってるなら、プログラムを実行した後
下の出力ウインドウにエラーメッセージとか出てるんじゃないか?
それを貼り付けるべし

出ないようならコンソールから実行

321 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:22:57 ]
>>318
いやだからsleep入れたりしてるんですが、エラーの時は関係なく終わるんです。

>>319
Rubyの場合はスタンダードライブラリを読み込まなくても使えるんですね。(Rubyには存在しない?
活用させていただきます。

>>320
一応出ますね。以後貼り付けます。

みなさんありがとうございます。またすぐに来そうで心配ですが、その時はよろしくお願いします。



322 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:02:43 ]
バッチファイルにしてやればエラーが出てもポーズさせるようにできるよ。
ruby -x "%~0" || pause
と書けばエラーが出たときに限ってとまる。

test.bat
ruby -x "%~0"
pause
goto :eof

#!ruby
put "hello"


323 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:08:34 ]
>>322
横からだがサンクス
これを.rbに関連付けしておけばよいのか・・・
|| でエラー時だけ止まるのかいいな、これ

324 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:15:24 ]
rdocで#:nodoc:と指定されてる要素も無理矢理ドキュメント化するような
オプションとか方法とかってありますか?

325 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:44:42 ]
>>324
そんなのはないから自分で #:nodoc:を消せばいいじゃん
cp -pr src1 src2
find src2 -type f | xargs perl -pi 's/:nodoc://'


326 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 01:37:13 ]
>>325
なるほど
参考にさせていただきます
ありがとうございました

327 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 02:38:35 ]
>>325
そこでrubyでもsedでもなくperlかよw


328 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:54:46 ]
>>327
1 linerでの置換ならrubyよりperlのほうが便利
sedは-pオプションがない

329 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 12:52:51 ]
www.goto.info.waseda.ac.jp/~fukusima/ruby/python-j.html
これ教えてもらってpythonから宗旨替えするのを検討してるんだけど
本当にpythonのモジュールが問題なくつかえるの?
ctypes
boost.python
numpy
matplotlib
PIL
が使えるかが一番問題なんだけど

330 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 13:02:03 ]
>>329
現在の Ruby は 1.8.7 です

331 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 13:09:37 ]
(いろいろとpython側もruby側も追随してないだろうから、やめるのが吉、ってことか...)



332 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:59:38 ]
>>329
作者に聞くか、自分で試してみるしかない。
つうか、PerlやPHPならまだしも、Pythonから宗旨替えする理由って何?

333 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:24:32 ]
>>332
借りてるレンタルサーバーでRubyは動くけど
pythonが動かない

railsが便利なら使ってみたい

334 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:30:26 ]
>>333
Railsを実用的な速度で使うなら、
別プロセスのサービス(MongrelやFastCGI)か
Apache組込のPassengerが必要になる。
レンタルサーバではどちらもできないことが多いので、注意。

335 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:35:41 ]
Windowsで、text ディレクトリのテキストファイルに対して start コマンドを使おうと

require 'shell'
sh = Shell.new
Dir.glob("text/*.txt").each do |path|
path.gsub!(/\//,"\\")
sh.system("start", "#{path}")
end

というスクリプトを作りましたが

c:/ruby/lib/ruby/1.8/shell/command-processor.rb:352:in `find_system_command':
Command not found(start). (Shell::Error::CommandNotFound)

というエラーが出ます。どうしたもんでしょうか。

336 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:46:08 ]
普通にsystem使ったら?

337 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 22:09:57 ]
>>328

sedのデフォルトの動作が -p 指定時のPerlと同じだろ。
おまえさんが言いたいのは -i じゃないのか?
でもこれも GNU sedならあるけどね。


338 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 22:12:47 ]
>>335
gsub!の置換後の文字列だけどそれでいいのか?

あと startはcmd.exe の内部コマンドだからそれだとまずいだろう


339 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:13:37 ]
>>337
>おまえさんが言いたいのは -i じゃないのか?
その通りだ orz
エスパーさんくす

340 名前:デフォルトの名無しさん [2008/10/03(金) 23:40:05 ]
nanoc: a Ruby CMS that generates static HTML ≫ home
nanoc.stoneship.org/

nanocというRuby製のCMSを使ってみています。
nanoc autocompileコマンド時にhttpdサーバーが立ち上がります。
しかし、ブラウザでlocalhost:3000/ というデフォルトのアドレスにアクセスしても
画像が何故か読まれません。

そこで、autocompileコマンドのソースを追って調べていたのですが、

nanoc: lib/nanoc/extra/auto_compiler.rb@55a1480e2719
nanoc.stoneship.org/hg/nanoc/file/55a1480e2719/lib/nanoc/extra/auto_compiler.rb

(ちょうど上記ソース)、255行目の File.read(path) ってもしかして、
Window環境だとバイナリ読めなくないですか?
irbで試しましたが、pngを読むと、

irb(main):028:0> a = File.read "gradient-nav-white.png"
=> "\211PNG\n"

みたいになってしまいます。

341 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:58:19 ]
>>340
ソース読んでないけど、たぶんその通り
UNIX畑の人間が書いたスクリプトには、バイナリモードを考慮してないものがある
最近だとRackでも見た



342 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:00:57 ]
nanoc は面白そうだと思ってはいるんだが

>>340
読めませんねえ

module Nanoc::Extra
class AutoCompiler
def serve_file(path)
[
200,
'Content-Type' => mime_type_of(path, 'application/octet-stream') },
[ File.open(path,'rw'){|f| f.read} ]
]
end
end
end

をスクリプトの前に書いて再チャレンジだ

>>341
ある意味とてもカッコ悪いよな

343 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:01:14 ]
PNGのマジックナンバーに含まれるEOF文字で止まっているようですね。
バイナリモードのopenを使うように書き換えないといかんのかな。


344 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:03:24 ]
なんか足りなかった

module Nanoc::Extra
class AutoCompiler
def serve_file(path)
[
200,
{'Content-Type' => mime_type_of(path, 'application/octet-stream') },
[ File.open(path,'rw'){|f| f.read} ]
]
end
end
end

Ruby のモジュールの多くは自前のスクリプトの先頭で書き換えることができる
きっとこれから何度もお世話になると思うので覚えておくといい
けっこう明確なバグ(で、自前で何とかなるもの)が残ってたりするもんだ

345 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:07:32 ]
あれ、アクセスフラグrbじゃなくてrwなの?

346 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:10:45 ]
rb だな

347 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:16:27 ]
msっていつになったらテキストモードをなくすの?

348 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:24:32 ]
>>347
Cやれ

349 名前:340 [2008/10/04(土) 00:48:47 ]
みなさんありがとう。上手くいきました

trap::IO - Rubyリファレンスマニュアル
www.sakalab.org/prog-ruby/ruby-man-html-20080121/trap_IO.html
> IO.readはファイルを開くときにバイナリモードにしないので、
> バイナリモードの存在する環境でバイナリファイルの読み込みに使うと 内容が壊れることがあります。

これかい!しかし何でこんな罠があるんだ。
罠ってのはバイナリモードじゃなくてIO.readのことだけど。
nanocの作者 mac っぽいし?

-----lib/binary_patch.rb-----
module Nanoc::Extra
  class AutoCompiler
    def serve_file(path)
      # Build response
      [
        200,
        { 'Content-Type' => mime_type_of(path, 'application/octet-stream') },
        [ File.open(path, 'rb'){|f| f.read } ]
      ]
    end
  end
end
-------------------
>>344参考に、これをサイトデータの lib 以下に放り込んでおくとOK的な。
後でさくーしゃにパッチ投げるか……

しかし、grepかけたら、他にも File.read あったり、
File.openでバイナリモードにしてないところがあるから、
直すところがいくつもありそうw

350 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:18:38 ]
これはホントは標準添付の便利メソッドのフリしてバイナリモードガン無視の File.read が悪いんだよね
ライブラリ作者はあんまり悪くない(注意不足なだけ)
2.0 では直ってたりするのかしら

351 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:29:27 ]
1.9にはIO.binreadというのがあるようだ。
あと、1.9以降はstdioと絶縁したんだっけか?




352 名前:デフォルトの名無しさん [2008/10/04(土) 01:48:42 ]
ついでに別の質問があります。
nanoc で nanoc autocompile コマンド時にhttpサーバーと一緒にブラウザも起動したいのだけど、
httpサーバー起動前にブラウザが立ち上がりきってしまって上手くいかない・・・。

gemにあった launchyで起動させているんだけども、httpサーバー(デフォではThin)
起動後かもしくは、数秒後に起動することはできないでしょうか?

当初はこんなコードです。

require 'rubygems'
require 'launchy'

module Nanoc::Extra
  class AutoCompiler
    alias original_start start # :nodoc:
    
    # Boot web browser before original start
    def start(port, handler_name)
      port ||= 3000
      Launchy.open("localhost:#{port}/") if defined?(Launchy)
      original_start(port, handler_name)
    end
  end
end

353 名前:デフォルトの名無しさん [2008/10/04(土) 01:51:50 ]
で、Threadを使ってみようとしたんだけどもネイティブスレッドじゃないせいか
上手くいきませんでした。何かよい方法はないものでしょうか?

    def start(port, handler_name)
      port ||= 3000
      t = Thread.new do
        Sleep(3)
        Launchy.open("localhost:#{port}/") if defined?(Launchy)
      end
      original_start(port, handler_name)
      t.join
    end


354 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 02:37:21 ]
>>352
while (3000ポートに接続できない)
 sleep(1) # 1秒待つ
end

355 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 02:44:59 ]
>>335
WindowsでRubyならWIN32OLEで一択.

require 'win32ole'

fso = WIN32OLE.new('Scripting.FileSystemObject')
shell = WIN32OLE.new('WScript.Shell')

Dir.glob('text/*.txt').each do |path|
 shell.Run(fso.GetAbsolutePathName(path))
end

下記記事も参照すると吉
ttp://jp.rubyist.net/magazine/?0004-Win32OLE


356 名前:352 [2008/10/04(土) 02:52:37 ]
>>354
どうも original_start() でキー入力待ちになってしまうのです。
sleepするところだけメインと平行して走らせることができないかな、と思ったしだいです。

gemにあった win32-thread もつかって見ましたが、

> nanoc autocompile
win32 thread mode
(rubyパス)/lib/ruby/gems/1.8/gems/launchy-0.3.2/lib/launchy/b
rowser.rb:25: [BUG] cross-thread violation on rb_thread_schedule()
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

とか出るしダメポ……

357 名前:デフォルトの名無しさん [2008/10/04(土) 02:53:16 ]
>>355
「全部WSHで書けばいいじゃん」って思うよね?
うん,俺もそう思う.

Jscriptとかも使ってみると意外と便利なんだよなぁ.

358 名前:352 mailto:sage [2008/10/04(土) 02:57:28 ]
深夜に何度もすいません。
キー入力待ちでもsleep後に平行してブラウザが起動してくれました。大丈夫でした。
httpdの起動が遅いせいか、どうもタイミングが悪かったようです。

>>354を実装してみたいと思います。ありがとうございます。

359 名前:352 mailto:sage [2008/10/04(土) 03:33:52 ]
    # Boot web browser before original start
    def start(port, handler_name)
      require 'open-uri'
      require 'resolv-replace'
      
      require_gem('launchy', true)
      
      port ||= 3000
      
      t = Thread.new do
        uri = "localhost:#{port}/"
        loop do
          begin
            exit_loop = false
            open(uri) do |f|
              puts "Eureka #{uri} !";
              exit_loop = true
            end
            break if exit_loop
          rescue
          end
          sleep(1)
        end
        puts "Launching browser..."
        Launchy.open(uri) if defined?(Launchy)
      end
      original_start(port, handler_name)
      t.join
    end

>>354をこんな感じで行けました。
もっと短くかければよかったのですが。

360 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 04:06:35 ]
テキストモードとか意味不明。
ただこういうバグを生むために存在するとしか考えられん。

まあでもそういうのを考慮する環境がクライアント機では90%以上を占めてるので仕方ないか。。

361 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 04:10:20 ]
だからCやれって
テキストモードが生まれたわけがわかるから



362 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 04:35:54 ]
>>361
Cは平素より使用しているが、どうしてテキストモードなるものが存在する必要があるかは理解できない。
ここで、「ググレ」やリンクを貼る行為ではなく、あなたの言葉での説明希望。

363 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 07:12:40 ]
ちゃんとした文責のある文章を拒否して、名無しさんの言葉だけ求めるってw

「知りたい」んじゃなくて「追い込みたい」のが丸わかり。
土曜の早朝から何を厨臭いことを。

364 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 07:17:11 ]
隔離スレにお帰り

365 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 08:31:49 ]
むしろCのstdioがマシンごとに改行の内部表現が異なることを意識して
テキストモードとバイナリモードを用意して抽象性を確保してるんだから
UNIX使いもちゃんと使い分けろって話になりはしないの?

366 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 09:50:05 ]
>>363
煽るだけならCスレへお帰りください

367 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 10:23:42 ]
>>362
>Cは平素より使用しているが、どうしてテキストモードなるものが存在する必要があるかは理解できない。
たんに、プラットフォームによって改行を表す記号が違うので、それを隠蔽して互換性を確保するモードを用意しただけ。

>ここで、「ググレ」やリンクを貼る行為ではなく、あなたの言葉での説明希望。
ほんとにCやってるなら、このくらい分かるだろ。
まずは「教えてください」という言葉を覚えような。

368 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 11:01:03 ]
>>367
>まずは「教えてください」という言葉を覚えような。
お前は文章に「教えてください」って文字列が入ってないと納得できない正規表現脳なのか

369 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 11:10:12 ]
デジタルリサーチとAppleのせいってことで終了にしとけ。
ttp://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89

370 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 12:46:31 ]
>>365
普通UNIX使いは改行記号がが\nのとき、\r\nのとき、\rのときそれぞれを考慮したコードを書きます。
なぜならUnix使いはおそらくwindowsをはじめとする他の環境を触ったことがあり、
それらで改行がどう表現されるかを知っていて、
かつbフラグは無視される環境であることがほとんどだから。

>>367
だからね、それは「テキストモードが必要な理由」にはならないんだよw
なぜなら普通は上に書いたようなことをやるから。
あれば便利かと思って作ったんだろうが、現状むしろあることのほうが害。バグの原因になる。
こんぐらい少し考えればわかるだろwww



371 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 12:56:18 ]
>>368
その文字列を探す様子をたとえるのに、正規表現はないだろう。



372 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:09:55 ]
pc11.2ch.net/test/read.cgi/tech/1221967332/87
こいつ何言ってるの?

373 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:21:33 ]
>>370
>普通UNIX使いは改行記号がが¥nのとき、¥r¥nのとき、¥rのときそれぞれを考慮したコードを書きます。
書かない。ふつうは printf("foo¥n"); としか書かない。printf("foo¥r¥n") なんて書くわけない。
本気でそんな主張をするなら、世の中のUNIX用ツールで改行コードを使い分けているソースの例を挙げて、
それが一般的であることを示してくれ。

>なぜならUnix使いはおそらくwindowsをはじめとする他の環境を触ったことがあり、
触っただけで、自分のコードにそこまでの移植性を考えるわけない。
たとえばUNIXとWindowsではパス区切り文字が違うが、それを考慮しているコードは多くない。
改行コードの違いなんか考えるわけがない。

>それらで改行がどう表現されるかを知っていて、
>かつbフラグは無視される環境であることがほとんどだから。
bフラグを無視するのはUNIX系だけでは? Windowsでは無視されないんだから、「bフラグは無視される環境であることがほとんど」なわけがない。

374 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:27:07 ]
>>372
お前の存在をズバリ言い当ててるのでは?

375 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:50:17 ]
>>373
>それが一般的であることを示してくれ。
まあ\rは無視することもあるな、Macだけだし、はっきり言っておかしいから。
出力は、自分の環境で動けばいいから(移植するときに考えればいい)printf("foo\n")でもいい。
外部に出力する場合は規格通りにすればよい。

当たり前だが、問題なのは出力よりも入力。なぜならどのようなデータがくるか分からないから。
ここで注意すべきなのは、ただ単に改行までシークする場合は
\nと\r\nは改行位置を捜すのに両方\nを捜せばいいから問題にならない。
よって、考慮はしているがそれが実際にコード上に現れないことも多い。
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
しかし、考えなければならない事もある、たとえばhttpの改行は\r\nである必要があるが、
\nである環境もあるかもしれない。例えば、Httpのヘッダとボディ部を分けるのは
"\n\n"と"\r\n\r\n"の両方の可能性がある。
(規格上は後者のみ正しいが、もしかしたら前者の可能性もあるかもしれない。)

よってその場合には分けた処理が必要になる。実例として、MPlayerの
MPlayer/stream/http.cのhttp_is_header_entire()。
wgetのhttp.cなどを参考にしても、もし改行が\nの場合、\r\nの場合両方とも正しく処理できるように
なっている様がわかる。

でもそれが一般的である証明なんて誰にもできませんよ。もちろん一般的でない証明もできません。

>改行コードの違いなんか考えるわけがない。
考えなければならない時は考えるほうがよいです。考えないとバグの原因になる可能性がありますので。

>「bフラグは無視される環境であることがほとんど」なわけがない。
Unix使いは、って書いあるじゃんwwwww
なんで同じ文の中に書いてあって前提が途中で変わっちゃうのwwwww?

376 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 14:08:35 ]
この場合、「一般的であることを示す」のは至難の業だわな。
いったい何百例出せばいいのかと(数例で納得するのは逆におかしい)。

それでいて、いかにも「正当な要求をした俺と、応えられないコイツ」的な構図が
出来上がるから、まぁ、ある種の人間はこの質問をすることを凄く好むんだよね。

「知りたい」んじゃなくて「追い込みたい」のが丸わかり。
土曜の昼に何を厨臭いことを。

377 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 14:46:13 ]
>>376
久々に切れのある内容のスレを見た。
尊敬する。
あなたの言うとおり!!

378 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 16:17:01 ]
>>376
なに語ってるのか知らんけど、
>普通UNIX使いは改行記号がが¥nのとき、¥r¥nのとき、¥rのときそれぞれを考慮したコードを書きます。
なんておかしなことを書いてあるから、それが「普通」である根拠を示してくれといってるだけ。
答えられないならでしゃばんなよ。


379 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 16:20:17 ]
IDの出ないスレは自演が楽だな。

380 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 16:21:10 ]
>>375
>wgetのhttp.cなどを参考にしても、もし改行が¥nの場合、¥r¥nの場合両方とも正しく処理できるように
>なっている様がわかる。

wget はネットで使うんだから、どちらにも対処できるようにするのは普通だろ。
それこそunixもwindowsもmacも関係ない話。
これをbフラグの話で持ち出すほうがおかしい。

381 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 16:46:28 ]
>>378
> なに語ってるのか知らんけど、
知らんまま反応した当然の結果として、まるで的外れだから、「知る」までは黙ってていいよ。



382 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 18:34:37 ]
unixはバイナリモードしかなくても、改行コードがファイル毎にバラバラでも
テキストを問題なく扱えるし、windowsでも当然可能
# 可能にしてるのはライブラリやアプリケーション、だけど問題はそこじゃない
不必要なテキストモードを残しているばかりに>>340の様な問題が起こる
appleがOSXでCRを捨てたようにwinもさっさとテキストモードを廃止してほしいもんだ

383 名前:340 mailto:sage [2008/10/04(土) 19:03:40 ]
なんか、俺のせいで半荒れ?でスマナイ

俺はネイティブ言語はDelphiくらいしかつかわないけど、
テキストモードとかバイナリモードなんて意識したことない。
File.readのテキストモードとかの区別って結局どこから来てるんですかね?

384 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 19:25:51 ]
>>383
Rubyを作るときのCの…えー、WindowsのCライブラリから来ている
結局としては、テキストであるという判断をどの層で誰がやるかという話に過ぎない

385 名前:352 mailto:sage [2008/10/04(土) 19:33:12 ]
>>384
そっか、C言語のライブラリのせいなのね・・・

386 名前:340 mailto:sage [2008/10/04(土) 19:36:58 ]
ん?レス番残ってた 340です。

387 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 19:42:25 ]
1.9はstdioを捨てたと聞いたが、そうするとテキストモードに関する
状況は変化するの?


388 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 18:24:44 ]
>>387
ユニバーサルニューラインが入ってる。
www.garbagecollect.jp/~usa/d/200808c.html#id20080825_P1

389 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 19:15:07 ]
>>388
> "r"なら、"rt"と"rb"のどちらの扱いになるかはプラットフォーム依存。
> とりあえず、いわゆるUNIXなら"rb"と同様に、mswinやmingwなら"rt"と同様になる。

ちょw 問題解決されてなくないですか?

390 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 19:17:52 ]
ああ、違うのかな?
前みたいに適当に"r" だけだとどっちにしろ環境依存になるから、
バイナリかテキストかを意識しなくちゃいけないわけか

391 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 20:19:17 ]
テキストだとエンコーディングも意識する必要があるしのう。
文字=バイトで凝り固まった外人どもよりはこのへん日本人は意識しやすいだろうけど。





392 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 00:31:26 ]
>>389
本質的に問題なのはテキストモードを区別するという慣習だから、
Rubyだけで解決できる性質の問題じゃない。
Windows全体で「CRLFを使うのはやめよう」という流れにならない
限り解決しようがない。


393 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:51:56 ]
結局いつものRubyが糞なのが根源的な原因だけど対応するのが面倒だから
個々の環境(というかいつもWindows狙い撃ち)で対応しやがれというお話ですね。

394 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:00:53 ]
俺の場合、Windows(つかSJIS/CP932)一辺倒の頃は
むしろ「LFなんて糞、CR+LFに統一しる」と思ってた
今はそうでもないが、昔の俺以外にもそう思ってる奴は居るかも

395 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:31:20 ]
ラインをフィードしただけで「行の先頭」に行くUNIXは変
キャリッジをリターンしただけで「次の行」に行く旧Macも変
「カーソルを行頭に戻してから行を送る」というCRLFを具現したWindowsが意味的に妥当

とは思う
っていうか電脳化した時点でCRLFという概念作っとけよもう
何が悲しくてコンピュータでタイプライタのエミュレーションなんぞしなければならんのか

396 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:38:48 ]
SJISが普通に使われるWindowsでは2バイトあった方が誤読しにくい

397 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 08:21:28 ]
>>395
それは端末を中心に考えているから。だから「行頭に戻る」と「次の行に移動する」をわけて考えてしまう。
UNIX作ったひとはテキストを扱うことを考えてて、それでテキストの「行末」が欲しかっただけだから、
それを1文字で表現したことは、そんなにおかしな話ではない。


398 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 10:46:45 ]
CP/Mの呪縛?
EOFとかCR/LFとか


399 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 11:10:10 ]
read() より下のレイヤであれこれやる Windows が変、ってことで

400 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 12:31:57 ]
>>394
統一しる!までは思わんがw
どっちかというと、UNIXとかの人にバイナリで読む時とかちゃんと、"rb" つけてくれ!頼む!って感じ。
いろんなソースいじっていると本当にそう思うw

401 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 12:33:07 ]
なーーんか、そろそろRuby本スレみたいな雰囲気で
初心者さんが質問しにくくなってきている気がするので移動しませんか?w



402 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 17:10:17 ]
s = "s = 'abcde'"; p s; eval(s); p s
を実行すると↓のようになります。

"s = 'abcde'"
"abcde"

eval の中の変数をローカルにするには、eval(s) の代わりに
eval("def tmpfunc() #{s} end; tmpfunc")
などとするしかないでしょうか?
関数持ちだすのもなんかアレな気がして…

403 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 17:20:59 ]
sandbox_binding = (class << Object.new; binding() ; end)
s = "s = 'abcde'"

p s
# => "s = 'abcde'"

eval(s, sandbox_binding)

p s
# => "s = 'abcde'"

なんか汚してもいいBindingでevalするのはどうでしょう

404 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 09:05:04 ]
>>403
> class << Object.new
こんな書き方できるんだ...
「class <<」の右側って任意の式がかけるの?


405 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 11:37:07 ]
ただの特異クラス定義だから、任意の式というか、メソッドを追加したいオブジェクトを返すものを1個書く
class Hoge < HogeBase
は「HogeBaseクラスに以下のメソッドを追加したHogeクラスを作る」という感じなのに対して
class Hoge << hoge
は「オブジェクトhogeに以下のメソッド動作を一時的に追加して便利に使うぞ」という感じ

irb> s = 'nyonyonyo'
irb> class << s ; def hello; puts 'hello!'; end; end
irb> s.hello
hello!
irb> s = nil
irb> s.hello
NoMethodError: undefined method `hello' for nil:NilClass
from (irb):5
from :0


406 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 17:43:46 ]
gemsのライブラリ見ると、シングルトンでこれ使ってるの多いな

module HogeModule
 class << self;
    def application
      @application ||= HogeModule::Application.new
      @application
    end
    def application=(app)
      @applicaiont = app
    end
 end
end

で、
HogeModule.application.run
みたいな感じで使う

407 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 17:44:23 ]
>  class << self;
 class << self

408 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 20:29:39 ]
初心者の質問じゃないですけど、いいですか?

class Foo
 class << self
  def hello; puts "hello"; end
 end
end



class Foo
 def self.hello; puts "hello"; end
end

は、Foo.hello の挙動はまったく同じですけど、内部での仕組みもまったく同じですか?
class << self のほうは、Fooの特異クラスにインスタンスメソッドを追加することで、
def self.hello のほうは、Fooの特異メソッドを定義するという説明になるかと思いますが、
両者はまったく同一のことを行っているという解釈でいいでしょうか。


409 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 20:36:41 ]

  ☆ チン

        ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
          ヽ ___\(\・∀・)<  初心者の質問じゃない質問まだー?
             \_/⊂ ⊂_)_ \____________
           / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
        |  ̄  ̄ ̄ ̄ ̄ ̄ ̄:| :|
        |           .|/


410 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 20:36:43 ]
いいです

411 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 21:39:55 ]
厳密に言うと

class Foo
 class Bar
  def hello; puts "hello"; end
 end
end



class Foo; end
class Foo::Bar
 def hello; puts "hello"; end
end

くらいは違う。




412 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 22:38:52 ]
両者の違いが問題になるようなクラス設計をしてはいけないな

413 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 02:30:36 ]
>>411の上と下って具体的にどう違うの?

414 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 11:48:06 ]
最近、Rubyの勉強を始めた者です。
先週、RubyのMLに登録し「Welcome to our ruby mailing list」のメールも届いたのですが、
その後メールが1件も届きません。ひょっとしてRubyのMLって、コマンドをサーバーに送って
取得しないといけないのでしょうか?それとも、さらに何か手順を踏まないとメールが
届かないのでしょうか?メールに記載されている説明には、過去の投稿が欲しいなら
サーバーにコマンドを送れ、とは書かれているのですが・・・

415 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 11:57:01 ]
RubyのML、じゃどれかわからん。
MLによっては単に流量が少ないだけということもある。

本来流れているはずのメールが届いてないというなら、そのWelcomeメールに書いてある問い合わせ先に質問メールを投げればいい。

416 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 12:00:10 ]
ruby-ext と ruby-math、非公式の rubyist ML は投稿がないな

正直なとこ、ML は何か発言したい人向けだね
初心者さんはこのスレとかマニュアル独学とかしたほうがいいかも

417 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 12:09:57 ]
>>415,416
素早いレス、ありがとうございます。
登録したのは「ruby-list」です。単に投稿が少ないだけなのか、
それとも自分が何かミスをしていて、メールが届かないのかが分からなかったもので。
とりあえず、MLの管理者に問い合せてみようと思います。

418 名前:デフォルトの名無しさん [2008/10/08(水) 12:27:55 ]
ウインドウズでのrakeの実行が遅すぎる、どうにかならないのか?


419 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 12:42:41 ]
>>418
まだCPUが1個なんですか?
Rails開発者はデュアルコアとか普通ですよ?

420 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 13:22:04 ]
gem update のメモリ超絶消費問題が長らく直らなかったくらいだしなあ
メイン開発者たちのマシンでは一瞬あるいは2秒程度で終わってると考えるのが妥当だな
あるいはWindowsのRuby使ってないとか

421 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 13:26:07 ]
Windows使ってる人なんてハイスペックが当たり前で気にならないかもしれない



422 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 13:51:19 ]
>>418
一応回答すると、WindowsのRubyスクリプトで処理開始までが馬鹿みたいに遅いのはどうにもならない
これを改善する方法を見つけられたらRubyは広まると思うんだがというかWindowsで常用したい

423 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 13:55:23 ]
Core2Duo使ってるレベルだったら遅さなんて感じないけどね

424 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 14:09:02 ]
>>423
俺の環境はCore2Duoだが、体感できるぐらいには遅い

425 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 14:09:55 ]
同じマシンにLinuxとか入れて同じRubyスクリプトを実行するとほぼ一瞬なんだよねえ
Cライブラリとかの違いの関係だと思うんだが、残念だな

426 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 14:18:53 ]
WindowsでRubyってそんな遅いの?
ならJRuby使っても気にならないんじゃね

427 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 14:24:38 ]
>>424
そうなってくると、HDDとかにも問題があるんじゃない?

428 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 14:27:56 ]
VistaはVistaで遅い

429 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 14:46:30 ]
ttp://pc11.2ch.net/test/read.cgi/tech/1215531152/692

@echo off
echo %time%
ruby -e "puts 'hello!'"
echo %time%
ruby -v
echo %PROCESSOR_IDENTIFIER%

を実行して

11:35:25.96
hello!
11:35:26.96
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
x86 Family 6 Model 8 Stepping 6, GenuineIntel

だそうな

430 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 15:04:16 ]
15:03:20.45
hello!
15:03:20.46
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
x86 Family 6 Model 15 Stepping 11, GenuineIntel

XP SP2でこれだったぞい?

431 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 15:04:51 ]
そりゃキャッシュに乗ってるかどうかで全然違うよ



432 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 15:10:08 ]
>>429
どうもその人だけみたいな感じだね
いろいろな要素が絡み合って遅くなってるのかな

433 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 15:19:17 ]
>>430
それはCPUが充分速い
>>429はPentium3だぞ

434 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 15:22:24 ]
>>432
「Windows Ruby 遅い」でぐぐるといくつか症例がある模様
ttp://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=Windows+Ruby+%E9%81%85%E3%81%84&num=50

まあ、2GHzくらいあれば気にならないのだろう
あるいは、「CPUが遅い=OSがWin2000とか」だとかいうのの何かが関連してるのかも

435 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 15:26:11 ]
>>433
424みたいのがいるから、CPUの問題じゃなく、遅くなる何かがあるんじゃないか?

436 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 15:30:25 ]
全員が遅いなら、それこそ「WindowsのRubyは遅くて使えねえ」という大合唱になってるはずだしな
大丈夫な人と大丈夫でない人がいる程度には、ポピュラーな別の原因があるんだろう

437 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 15:38:24 ]
VistaだったらWindows defenderの影響とか

438 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 17:53:12 ]
>>433 うちのK6-2 450MHzだと
17:06:29.07
hello!
17:06:29.16
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mingw32]
x86 Family 5 Model 8 Stepping 12, AuthenticAMD

Ruby 1.8.7 0.09秒

17:09:52.56
hello!
17:09:52.86
ruby 1.9.0 (2008-10-04 revision 19669) [i386-mingw32]
x86 Family 5 Model 8 Stepping 12, AuthenticAMD

Ruby 1.9.0-5 0.30秒

MingwでRuby 1.9.0をビルドすると90分くらいかかる


439 名前:424 mailto:sage [2008/10/08(水) 18:47:36 ]
書き忘れてたけど、遅くなるのは基本的に初回起動(キャッシュされてない状態)のとき
キャッシュ無しの状態でrake打つと、だいたい3〜5秒ぐらいかかる
二回目以降は0.1秒くらいしかかからない
(WindowsXP Core2Duo 1.86GHz メモリ1024MB ruby-mswin32)

440 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 19:24:07 ]
rakeとか言われても何も比較できない

441 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:30:31 ]
K6-2 450Mhz Windows 2000
rakeって使ったこと無いけど
Ruby 1.9.0-5 に標準でついてるので
何も無しにrakeすると
No Rakefile found で即終了
約2.5秒 (何回実行しても)




442 名前:デフォルトの名無しさん [2008/10/09(木) 01:22:27 ]
>>419
Core2Duoでも、めちゃくちゃ遅いぞー
今のままではwin上でrailsは開発できない

443 名前:デフォルトの名無しさん [2008/10/09(木) 01:36:48 ]
>>427 >>429 >>430
>>432 >>441
windows上での開発環境のことじゃ。
rake db:migrate reset または ruby script/console
でもしてみな。一日が8時間に感じるほど遅いぞ。
最新のスペックのPCでもだ。win上で開発はできん。

win上でまともに開発できない今のままのrailsでは、
railsバブルははじけるだろうな。もうはじけている予感はあるが...
マーケティング戦略に踊らされたやつの負けー


444 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 01:41:46 ]
根本的にいろいろ勘違いしてるな

445 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:54:55 ]
勘違いしているというより、railsを叩くストーリーを語りたかったんだろう。
「この物語はフィクションです。実在の人物・団体・CPU・プログラミング言語とは
一切関係ありません」

446 名前:デフォルトの名無しさん [2008/10/09(木) 08:09:36 ]
Rubyが遅いのはもうすでにだれもが知っている事
耐えられないならJRubyを使えば速くなる




447 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 08:28:26 ]
JRubyの方が速いのは事実だが、
RailsをJRubyで動かすとCRubyより遅くなる。

448 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 08:32:02 ]
結局Pyhon+Zopeが最強ってことか

449 名前:デフォルトの名無しさん [2008/10/09(木) 09:20:44 ]
>>448
Python + Django
だろー

Railsはscaffoldであっと今に雛形が作れるが、
Djangoはもっと強力で管理ページもあっという間に作れる。



450 名前:デフォルトの名無しさん [2008/10/09(木) 10:08:18 ]
>>445
客観的に見れない信者のような連中が出てきたらそろそろかな?
前出のように、ウインドウズ上で仕事として開発するのは無理。
LinuxとWinでrake db:migrateの比較をしてみればすぐわかる。

Railsは、初回は金利0その後徐々に金利が上がるローンと似ている。


451 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 10:29:10 ]
Railsの「生産性」を叩いてる人はVBAで納品される受注プロダクトもあるということを聞いたら卒倒するんだろうなと思ってる
なんでソフトウェアの全部が全部銀行並みの規模でクオリティでなければならんのん?



452 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 10:59:38 ]
なんでWindows上でRailsを実行させないといけないのかがそもそも理解できないわけだが。

453 名前:デフォルトの名無しさん [2008/10/09(木) 11:14:20 ]
>>452
開発環境の事を言っているんだろ
rakeは本番稼動では使わないからなー
Rails信者はMac信者という事だろう
しかしほとんどは最近Mac信者になったやつらだろうが



454 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 11:33:24 ]
Windows → クライアントサイドアプリケーション以外ヘボい
PC-UNIX系 → サーバサイドプログラム以外ヘボい
MacOSX → どっちも不可もなく見掛けが気持ちよい

という単なる選択の収斂の結果に過ぎない
WinでPC-UNIX系プログラムがきちんと動けばWindowsを使うって
あるいはクライアント環境がもっさりでなければPC-UNIXを常用する

WindowsをクライアントにしてUNIX系OSにログインするというのが最強ではあるが、それだとメンテ対象が2つになるんだよね

455 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 11:50:30 ]
WindowsやLinuxとかを我慢して使ってる人のほうがよっぽど信者だと思う…

456 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:14:08 ]
質問だよ

適宜更新される200字くらいの説明文が常に200個くらいあって、
それらに特定の日本語群(更新は稀で候補100個くらい)が含まれてるかどうかチェックしたいんだ
スレ全部読み込んで、注目したい語を含むレスがあるかどうか調べて抜き出す、みたいなノリだと思ってくださいな

どうするのが速くて妥当かなあ?
検索語100個の正規表現100個を200文全部に適用する? 2万回正規表現起動?

457 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:20:30 ]
数KBのテキストに100回適用を200回とかはRuby的には屁でもない日強茶飯事だと思うぞ
ライブラリの中ではもっとえげつない、力技としか思えない正規表現動作がゴロゴロ…

選択100個入りの正規表現と100個の正規表現をif文で回すのと text.include?(s) とどれが速いかとかそういうのは知らない

458 名前:デフォルトの名無しさん [2008/10/09(木) 12:45:02 ]
>>455
会社にあるPCを見て見ろ、Macなんてあるか?
ほとんどないだろう、どこの会社だって同じだ。
Railsが新しい物好きな連中以外に普及するためには、
Winでまともに使えないとだめなんだろうね。
個人的にはRailsのIDEがもっとコード補完が上手になってもらいたい。

結局、
小規模サイト:PHP
大規模サイト:Java


459 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:47:53 ]
候補や説明文がよほど膨大なら、
Karp-Rabin法も考えられるかもしれんが・・・・・まあその程度なら

460 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:52:25 ]
yieldはなんだかんだ言って遅いから
語群を|でつなげた正規表現200回起動がよさそうに思う
ブロック使わずにif文ずらずら並べるならわからんけど

461 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:53:39 ]
個人的用途を除くと、イメージ的には
Macはデザイン、クリエイター、
Linuxは学術用
UNIXはサーバー
Windowsはビジネスその他って感じだな



462 名前:デフォルトの名無しさん [2008/10/09(木) 13:10:44 ]
Ruby/Tkで
EntryウィジェットやTextウィジェット上でドラッグすると
フリーズします。原因として考えられることは何でしょうか?

463 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:18:57 ]
ドラッグしたときの動作をプログラムしてないからじゃね

464 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:20:10 ]
語群があまり変わらないという話だから、俺も>>460に賛成

465 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:22:01 ]
>>456
正規表現でやるならRegexp.unionっていうのがあるよー

466 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:22:15 ]
学術的なウンタラカンタラならともかく、業務サポートかカジュアルな用途だろうしな(いやわからんが)

467 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:28:13 ]
Regexp#union は p で表示したときの正規表現が自動生成ですって感じでとても不安でイマイチ使う気になれない

irb> arr = ['a', 'bb', 'ccc', 'dddd', 'eeeee']
irb> p Regexp.new(arr.join('|'))
/a|bb|ccc|dddd|eeeee/
irb> p Regexp.union(*arr.map{|e| Regexp.new(e)})
/(?-mix:a)|(?-mix:bb)|(?-mix:ccc)|(?-mix:dddd)|(?-mix:eeeee)/

きちんと動くのかね、これ

468 名前:デフォルトの名無しさん [2008/10/09(木) 13:29:26 ]
Ruby用の高速HTTPライブラリ/サーバMongrelの作者もあきれているようだ。

ttp://slashdot.jp/articles/08/01/02/0046222.shtml
より抜粋
。 Ruby on Railsに関わる人々の技術力の低さや閉鎖性、また「どいつもこいつもRoRでアホなソーシャルネットワークを作って商売にしたがる」風潮に愛想が尽きたとのことで、今後はRubyから手を引き、PythonやFactor、Luaに軸足を移すそうだ。


469 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:31:22 ]
はいはい初心者スレだよここは

470 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:35:36 ]
>>468
Javaを知らないからそんなことになる
Javaを知ってればRoRはJavaで負けたスーツ連中が持ち上げてるだけだと早々に気づけたろうに
いい社会勉強になったことだろう

471 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:36:44 ]
>>467
動くよそりゃw
inspectがごちゃごちゃするのには確かに同意するが



472 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:41:02 ]
>>468
みんな、そこはもう大分前にとおりすぎたのだがwww

473 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:41:51 ]
そもそも ?-mix: って何よマニュアルに書いとけよって感じではある > Regexp.union

474 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:42:54 ]
>>468
あとZed Shawの記事はネタなので釣られないようにな。
単体の記事で見ると本当にそう思っているのかと思うもんだよ。

よくはてなブックマークとかでたくさんブックマークされている、煽り気味のエントリーとか
他の記事よむとネタじゃんってすぐにわかる、みたいなの

475 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:43:20 ]
Rubyしか知らないと悲惨なのにはこっそり同意しておく

476 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:46:23 ]
CとJavaとPerlとPHPとPythonとSchemeはオレオレライブラリを作れる程度には齧っておいたほうがいい

…多いな

477 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:48:55 ]
PerlとPHPは真っ先に除外できるな

478 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:53:31 ]
>>477は何もわかってない
キャッチセールに真っ先に引っかかるタイプ

479 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 13:59:54 ]
アレな方々が流入してくるとすぐスレがおかしくなるな

480 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 14:02:47 ]
PerlやPHPを知らないっていうのは一番悲惨なパターンのRubyユーザーなのでは…

481 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 16:01:00 ]
PerlやPHPを生半可に知ってる方が、変にRubyに入れ込んじゃって不幸になる気もする。



482 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 16:29:26 ]
Rubyって何に適してる言語なの?

483 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 16:53:30 ]
>>482
オブジェクト指向テキスト操作ネット通信言語です

484 名前:デフォルトの名無しさん [2008/10/09(木) 17:09:03 ]
>>470
もっともなご意見です。
周りがみんな騒ぐので、こっそりRailsを触って見たが、
scaffoldまでは良かったがIDEが無いのでこつこつとコーディング
をしなければ行けず、こんなんで生産性がいいか?
と思っちゃいましたね。あと遅いし。

会社ではJavaで開発しているが、Eclipseを使った開発は超快適、
Ctl+スペースを打てば自動的にコードを挿入してくれるし、自動的に関数のヘルプも出るしね。
したい事を実現するためのライブラリはほぼ間違いなくのあるし、その数も桁違いに多いし。

Rubyに比べれば見た目のコーディング量は多いが、ほとんどはIDEが自動的に挿入したものだから、
実質は同じ量か下手すれば少ないだろう。

Railsは、一時の流行じゃないかなと思うね。
結局、ビジネスを企んでいるいるやつらに、うまく乗せられたんだよ。
「うそも100回言えば真実となる。」と誰かが言ったが、これが当てはまる気がする。生産性に関して言えば。


>>458
に一部賛同
PHP or Python:小規模
Java:大規模
でしょう。

どうもRails + Macで、私は先端を行くというような事を見せ付けているような感じが嫌いだ。
所詮、他の方の意見どおりwinでまともに使えなければこれ以上流行はしないだろう。


485 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 17:14:11 ]
RailsはRubyのヘビーユーザーが適当に活用して小ぶりなアプリケーションを連続生産するのに向いている
RailsのためにRubyを学ぶような人や、Railsのソースを読んでも何してるかさっぱりわからんような人が使ってもどうにもならんな

という魔術師(志向)の人向けのフレームワークだったはずなんだが、当初からそのはずだったんだが、誰が捻じ曲げたのやら…

486 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 17:14:19 ]
すごい初歩的な質問していい?
ゲーム作ってみたいと思って、つい最近Ruby始めたんだけど。
講座HPみたいなところで、Ruby/SDLでつくったスクリプトをexeファイルにしても、
Ruby/SDLのdllファイルが全部同じディレクトリにはいってないと動作しないって書いてあったんだけど、
てことは作ったゲーム配布するときはdllファイルも全部つけて配布しなきゃいけないってこと?

487 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 17:19:27 ]
>>484
MacOSXでRubyを使うことに決めた人は、もともとPC-UNIX上でRuby使い倒してたような人が多い
そういう人の使うRoRは、その人のプロダクト作成に非常に役立つものになると思うよ

>>486
Exerbでひとつにまとめることが…DLLはできないのかな
というか、DLLは普通実行ファイルと一緒に配布するもんなんじゃね

あとRubyでゲーム作るのはマゾさんのすることなんだけど、あなたはマゾですか?

488 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 17:22:03 ]
>>484
Railsを擁護する気は全くないけれど
一応、IDEを使ってRailsの開発することはできるよ(EclipseとAptana)

>>486
その通り

>>487
俺は自分のことをSだと思ってたが、本当はMだったのか

489 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 17:41:03 ]
www.domo2.net/search/search.cgi?word=ruby&tnum=50&sort=res+desc

490 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 17:45:19 ]
>>487
>>488
回答ありがとうございますm(__)m
一緒に配布するんですか〜。16個くらいあったんでまとめられれば見栄えがいいんだけど。

Rubyはゲームに向いてないですか;
大学の講義でRubyを軽く使うらしいから、ついでにと思って始めたんだけど・・
Rubyはわかりやすいって評判ですけど、Rubyでプログラミングに慣れてからC言語勉強した場合、
共通点が多くてサクサク覚えられますか?それとも違いが大きくて効率悪いですか?

491 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 17:49:36 ]
>>490
人によるんじゃないかな
共通してる部分も確かにあるけど
片方をしっかり身に着けない内に他に手を出すと
ごっちゃになって混乱しそう



492 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 17:49:46 ]
C言語を使って便利な機能を便利な概念でまとめたのがRubyだ

493 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 17:54:36 ]
>>491
>>492
回答ありがとうございます。
ある程度身につくまでRubyで頑張ってみて、限界感じたらC言語勉強することにします〜

494 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:02:07 ]
C→Rubyは曖昧さを感じて戸惑う
Ruby→Cは堅苦しさ、面倒くささを感じる

495 名前:デフォルトの名無しさん [2008/10/09(木) 18:07:31 ]
>>490 >>491 >>492 >>493
CとRubyはまったく用途が違うだろう。無理に使う事ができるけどね。
Cを勉強するならC++じゃないか。
Rubyでゲームか? 話にならない。
ゲーム開発している人間に聞いてみな。笑われるだけだ。

後々の資産として、C++を先に勉強したほうが得だと思うよ。


496 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:24:53 ]
またC++厨が…
C++を学ぶのとCを学ぶのでは意義が違うと何度言えば

497 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:26:11 ]
そろそろスレタイ嫁

498 名前:デフォルトの名無しさん [2008/10/09(木) 18:30:38 ]
>>496
説明してみぞ




499 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:34:39 ]
うぜぇ

500 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:37:16 ]
こういう香ばしい人って、なんでみんなageるんだろうね

501 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:45:48 ]
>>484,488
業務でAptana使ってるが、コード補完はやはりイマイチ。
候補が無駄に多いうえに欲しいのが出てこなかったりする。
特に、ハッシュで引数与える関数は全滅だ。
この辺はNetBeansも大差ない。
abbrevのあるemacs系の方がまだ使える。

Eclipse + JDT で幸せなJava開発環境を味わってる人には物足りないだろう。



502 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:29:58 ]
Rubyと共に使うなら純Cだろうね。
C++はそれ単体で使うもの。
ゲーム作りならC++オンリーがパフォーマンス的に一番だろうなあ。
ただ、Rubyでも処理速度がさほど求められないならゲームに一応使えると思うが
ゲーム用のライブラリはCかC++だろうしなあ。
一応、RPGツクールはRuby使えるのもある。

503 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 20:03:58 ]
>>502
Ruby/SDLでだいたい満足してたから、他のゲーム用ライブラリ触ったことないんだが
CやC++にはそんなに良いライブラリがあるのか?

504 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 21:45:12 ]
とりあえず、SDLはC/C++でも普通に使える。

505 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 10:57:55 ]
>>503
SDL

506 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 18:18:11 ]
わざわざCからSDL使わなくても、Ruby/SDLでよくね
性能が要求されるなら直接DirectX使うべきだし

507 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 18:27:06 ]
ゲームってのはけっこうハイレベルな感じに常時性能が要求されるもんだと思ってたが違うのか?

508 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 18:29:11 ]
ゲームによるよ
3Dでエフェクトも激しいアクションゲームなんかは大変だけど
そうじゃないゲームもたくさんある

509 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 18:36:43 ]
専用スレがあるんだからそっちでやればよくね?

510 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 18:47:04 ]
>>508
マジレスするとそうでもない
画像表示してブラーかけてるだけのADVなのにDirect9c対応グラフィックボード要求するとかもうアホかと

511 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 18:55:54 ]
「DirectGraphicsの初期化に失敗しました」は昨今けっこう有名なメッセージだと思う



512 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 19:29:48 ]
誘導:
【Ruby/SDL他】Rubyでゲーム制作・総合スレッド
pc11.2ch.net/test/read.cgi/gamedev/1207069887/

513 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 20:31:46 ]
>>510
それはその例がそういうゲームってだけだろ

514 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 10:27:03 ]
玉金破裂ゲーム

515 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 15:25:43 ]
Arrayを継承したクラスのオブジェクト.find_all{|e| e.cond?}

がArrayを継承したクラスのオブジェクトに自動でならないことにほんのりがっかりした

516 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 15:30:32 ]
>>515
gem のライブラリで時々見るな、そういう中途半端実装
そこはレシーバのコレクションクラスのオブジェクトを作って返せと…なんのための独自配列なのかと…

517 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 16:00:49 ]
>>515
find_all は Array じゃなくて Enumerable のメソッドだから
実際のところ自分のクラスは関係ない


518 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:09:09 ]
Arrayは継承するな…とcompositionを使えと

519 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:59:40 ]
Arrayを継承するってどういうシチュエーションなんだ??


520 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:08:31 ]
なんで継承を毛嫌いするかね

521 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:09:37 ]
いらんメソッドが付いてくるから



522 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:13:23 ]
アホすぎて笑えない

523 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:13:39 ]
継承は怖い

524 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:18:59 ]
>>520
作るのは簡単だが使うときに面倒
あと作り直すときにも面倒

525 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:20:50 ]
すごいとこまできてるねRubyistはw

526 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:21:13 ]
>>515
ハッシュからハッシュを返すselectやmapはたまに欲しくなる

527 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:22:01 ]
カンペキに活用した継承は非常に強力だが、ほとんどの継承はそうではない
っていうか、組み込みクラスは継承しないで委譲しろ、継承は自作クラス間でどんどんやれ

528 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:23:05 ]
本当にアホばかりで嫌になる

529 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:24:49 ]
ライブラリを書くくらいに使ってる人がいないってだけ

530 名前:デフォルトの名無しさん [2008/10/12(日) 10:56:19 ]
Integerのaとbのobject_idを常に同じにする方法ってありますか?
a.object_id = b.object_id
みたいなことがやりたいんですが

531 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 11:51:41 ]
>>530
object_id を同じにしたい理由が良くわからんが…
普通に代入すれば同じになるでしょ。

今の実装では Fixnum の場合は即値だから必ず同じ値になるんじゃないかな。





532 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 12:05:34 ]
>>530
できませんという答が妥当な気がする

>>531の言うように、Ruby の整数の数値の値とオブジェクトIDは紐付けられてる
整数の 1 のオブジェクト ID は常に一定だ

533 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 13:33:03 ]
>530
多分参照を扱いたいんだと思うが
そういう場合は配列やオブジェクトにくるんで受け渡しするのがベスト。

534 名前:デフォルトの名無しさん [2008/10/12(日) 13:57:54 ]
>>531,532,533
ありがとうございます
そのままでは無理でしたか

ちなみに、何故やりたかったかというと(railsの話になりますが)
class A; attr_accessor id; end
class B; attr_accessor a_id; end
と二つclassがあり、AのidとBのa_idを同じにしたかったのです。
今までは

A.transaction do
@a.save!(ここで、a.idに代入される)
@b.a_id = @a.id
@b.save!
end

としていましたが、

@b.a_id.object_id = @a.id.object_id(みたいなことができれば。。)
A.transaction do
@a.save!
@b.save!
end

とできると、updateでもcreateでもtransaction内が共通になるため、2つのclassをまとめたclassが定義しやすいなと

535 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 15:39:09 ]
>>534
なぜそうなってしまうのかわからない。
スキーマはどうなってるの?


536 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 16:27:25 ]
>>534
ごめん
その話聞いても,idとa_idを同じオブジェクトIDにしたい理由がわかんないわ
それにそもそも代入やFixnumみたいなやつ以外で同じオブジェクトIDになることない気がする

なにか勘違いしてるんじゃ…

537 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 16:47:40 ]
そんなことできたらそれはIDって言わないんじゃないの

538 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 16:56:36 ]
要するに,例えばaとbっていう変数があったときに
b.object_id = a.object_id
としておけば
a = 10
としたときに,bも自動的に10になってくれませんか?

っていう話でしょ

object_idはそんな用途に使えません

539 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 17:01:37 ]
>>538
すげー
よく検討ついたな

540 名前:デフォルトの名無しさん [2008/10/12(日) 17:54:01 ]
>> 538
その通りです
分かりにくい説明で申し訳ないです

用は参照を使いたかったんですが。。

541 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 18:32:47 ]
なんかa_idって名前が気になるな
すっげー憶測だけど、Bはインスタンス変数でAを持つのが素直な設計だったりしない?
それならB#save!で@a.save!するだけで済むから楽なんだけど



542 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 18:38:16 ]
>>538
おまえ、ほんとエスパーだな。
おれはさっぱり読み解けなかった。

543 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 19:03:44 ]
>>534
railsというかActiveSupportはそういう関連づけを自動化してくれなかったっけ?

あるいは>>541のようにしてB#a_idは@a.idを返すようにするとか。

544 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 20:48:21 ]
>540は自分の頭にあるオブジェクトのイメージをER図やクラス図で
さらっと描きだせるくらいのレベルになるまでARを封印すべきだ。
もし仕事でやってるなら合掌。


545 名前:デフォルトの名無しさん [2008/10/12(日) 21:00:36 ]
>>541, 543
確かにModelはそんな感じの設計です。
@a.b = @b
で関連付けて、
@a.save!
とすればbも入るってことですよね。

ただ、viewに2つのmodelを分けて書くのが面倒だったので、調べているとActivePresenterなるpluginを発見し
(ttp://jamesgolick.com/2008/7/28/introducing-activepresenter-the-presenter-library-you-already-know)
利用してみたところ、さきほどの参照のようなことをしたいなと思った次第です。

このpluginは2つのModelを結合してくれるもので、
 @ab = AB.new(params[:ab])
 @ab.save
で、AもBもsaveできちゃうよということでした。
ただ、DBの保存時に決定される@ab.a_idと@ab.b_a_idが関連づかずに困っていたというわけです。
あまり、plugin自体には手を入れてくなかったので、
@ab.a_idと@ab.b_a_idが同じだよということができれば良いなということでした。

546 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 23:11:18 ]
プライマリキーの値を変更するな、テーブルの設計からやり直せ

547 名前:デフォルトの名無しさん [2008/10/12(日) 23:24:26 ]
>>545
自己レスです
とりあえず、参照は素直にはできないということは分かりました。
ありがとうございました。
もう少し試行錯誤して、無理なら普通のARにしてみます。

548 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 01:37:23 ]
>>544
初心者として気になるんだけど
そのレベルになるまではどんな感じやるのが上達する?

549 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 01:44:19 ]
>>548
1週間に3日書く
今週はRubyスクリプト書いたり改良の試行錯誤が無かったなあという週が無いという状態にする

制御構造覚えたらマニュアル見つつたまに使う程度のカジュアルさでももちろん一向に構わないが、
その場合はRubyが上達することはないだろうし、上達するほど頑張る理由もそもそも無いことだろう

550 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 01:56:31 ]
Rubyのクラス分けやモジュール分けはてきとーで良いということがわかった頃から
スクリプト作るの早くなったような気がする

今でも特異メソッドとかわからんが
インスタンスメソッドとクラスメソッドしか作ってない
Proc はライブラリで要求されないと作らない
yield は使う機会が無いのでわけがわからない

551 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 06:21:15 ]
yield は each 作ったりしたらすぐ覚える



552 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 06:31:29 ]
おれはテストを書く気が全く起こらないんだよなあ…
少しづつでも書けばいいんだろうけど
つまらないから全く続かない…

553 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 07:56:06 ]
どう考えても

 テストを書くのに悩む時間 >> 変なバグで悩む時間

なのでテストを書く理由がない俺
他人様に提供するライブラリ書くんじゃない限り要らないもんだと割り切ってる
書き方指南がないということは本当はみんな不要だと思ってる証拠

554 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 08:32:04 ]
>>553
書き方指南いろいろあるじゃん
本にもwebページにも

俺も有用であるという自信はないが

555 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 08:43:49 ]
テスト書くためのスクリプトでテスト書く説明するだけだしなあ
お前そんなスクリプトなんて普段絶対書かないだろ、というのが多々…(特にテスト駆動)

556 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 08:54:11 ]
スクリプト序盤から中盤での書き方がよくわからないのがテスト駆動の特徴
というかMockとかあのへんを理解しないと関数的スクリプトのテストしかできん

557 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 09:23:47 ]
色々書き方の作法もあるけど、むしろ形式に捕らわれず自由にテスト書くようにしたら
それはそれで楽める部分もあると思う。

558 名前:デフォルトの名無しさん [2008/10/13(月) 09:42:39 ]
俺はテスト書かなくて困るのってリリース後なんだよなぁ。
デグレ出るたびに書いときゃよかったって思う。

559 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 10:07:10 ]
ちゃんとテストが書けるようになったら、もう上級者だよ。
つまり上級者になるためには、テストがきちんと書けるようにならないといけない。

おれはまだうまく書けないんだけどな。
UIのテストなんか、どうしたらいいのかさっぱりだ。

560 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 10:36:29 ]
他人様のライブラリのgitのtestディレクトリとか眺めてるとよくわかる

本文コードの追加変更に対してテストが異常に適当というか不足
時間かけてまでして作りたくないかどうすれば網羅するか考えるの面倒なんだろうな

561 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:01:54 ]
テストなしでロジック修正とかコードの整理(リファクタリング)とか、
怖くてできない体になった。




562 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 15:01:22 ]
ZenTest試用中。なかなか良さげ。
ttp://mono.kmc.gr.jp/~yhara/w/?ZenTestMemo
ttp://zentest.rubyforge.org/ZenTest/files/README_txt.html

gem install ZenTest
でインストール。

563 名前:デフォルトの名無しさん [2008/10/13(月) 17:14:28 ]
>>561
わかります

564 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:30:17 ]
テスト書くとメソッド単位でしか検証できないからめんどくさい
あと、GUIアプリのTestってどうやるの?

565 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:35:59 ]
できない

566 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:55:46 ]
入力の自動化をすれば出来る。
が、チェック項目をリストにして人力でやったほうがなんぼかマシ。

567 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:30:55 ]
RubyでGUIつーと、テスト以前に環境が貧弱だからのう。
WebならSeleniumとか。


568 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:32:59 ]
>>564
自動でマウス動かしてクリックしたりフォーム埋めたりするよプログラムを併用する
稀にどうしても自動化できないところが出てくることがあり、そういうときは漏れのない操作一覧図を書いて手動

569 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:58:10 ]
>>564
ビューとコントローラを極力分離すれば、ある程度までは機械的にテストできる

570 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:02:19 ]
GUI自体をテストしたい場合は?

571 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:15:36 ]
GUI自体のテストって具体的にどんなの?



572 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:52:47 ]
マウスクリックのタイミングとか

573 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 02:10:57 ]
サブネットマスクにマッチするような判定って簡単に出来ますか?
例えば、
"192.168.0.45".in_mask?("192.168.0.0/24") # => true
"192.168.0.45".in_mask?("192.168.0.0/29") # => false
となってほしいのです。

574 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 02:15:25 ]
本質的にサブネットマスクはbitmaskだから
ANDしてやればいい

575 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 03:03:18 ]
>>573
IPAddr#include?


576 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 07:48:35 ]
rubyはじめたばかりのものです。

Windowsにて、ワンクリックインストーラでrubyをインストールし、
RMagick(とImageMagick)をインストールしました。
サンプルプログラムを走らせようとすると(ruby sample.rb)、以下のようなエラーメッセージが出ました。

./RMagick.rb:2: uninitialized constant Magick (NameError)
from D:/Programs/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:
27:in `gem_original_require'
from D:/Programs/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:
27:in `require'
from rmagick.rb:1

ファイルの内容は以下です。

require 'RMagick'
include Magick
img1 = ImageList.new("d:/a.bmp")
img2 = img1.blur_image(0,2)
img2.write("sample01.bmp")
exit

色々と試した結果、上記ファイルがあるディレクトリ(D:\rubyとする)をカレントディレクトリとして、
cmd.exeからruby sample.rbとすると上記のエラーが発生しますが、カレントディレクトリがd:\の
場合は正常に実行されました。どうもカレントディレクトリに*.rbなファイルがあると失敗するようです。
irbでも同様の結果でした。

これを回避する方法はないものでしょうか?

577 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 09:35:18 ]
そろそろ解決してる頃だろうか

>>576
require 'hoge' は カレントディレクトリの hoge.rb ファイルを読み込む
rmagick.rb (大文字小文字問わず)という自作ファイルを改名しろ

「hoge ライブラリを試そうとして hoge.rb を作って実行し、次にまた別のスクリプトを作って変なエラーにはまる」というのは
そろそろ FAQ にしてもいいと思う

578 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 09:46:44 ]
>>577
ああ、まさにそれでした。
5時間くらい悩んでの書き込みだったので、今はRMagickのマニュアルを読んでました。
有難うございました。

579 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 20:24:43 ]
文字列中のすべての"\"を"\\"に、"'"を"\'"に置きかえたいときに
gsubってものすごくつかいづらいんですけど、
なんか他にいい方法はありませんか?


580 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:00:31 ]
str.gsub(/['\\]/){|s|"\\#{s}"}
十分簡潔に思うが、どの辺が使いづらく感じた?

581 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:19:06 ]
str.gsub(/['"]/) { %Q|¥¥#{$&}| }
あたりで手を打たないか?




582 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:19:40 ]
遅すぎたリロード


583 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:42:38 ]
ブロック使わずに表現できないの?

584 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:45:41 ]
str.gsub(/([\\'])/, "\\\\\\1")

・・・うん、ブロックのほうがいい。

>>579-580
後方参照使わずにgsub繰り返すっていう力押しをしてた人が
ハマるパターンだろうね。

585 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 22:04:09 ]
>>580
なるほど、ブロックを使えばいいんですね。

>十分簡潔に思うが、どの辺が使いづらく感じた?
perl なら、 s/([\\'])/\\\1/; と、比較的直感的なところを
>>584 のように"\\\\\\1"と書くとバックスラッシュが多くなりすぎて
後で読みにくいと思ったわけです。


586 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 22:06:36 ]
おっと、 s/([\\'])/\\\1/g; でした。

587 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:56:30 ]
str.gsub(/[\\']/, /\\\&/.source)


588 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:44:09 ]
Windows限定でいいんですけど、OSが32ビット版か64ビット版か調べる方法はあるでしょうか。
ENV["OS"]だと32bit版XPでも64bit版XPでも"Windows_NT"と表示されて区別が付きません。



589 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:51:21 ]
Ruby関係ねえええ

ENV['PROCESSOR_ARCHITECTURE'].include?('64') が true なら 64BitなCPUなのできっと 64Bit版Windows
ttp://support.microsoft.com/kb/827218/

590 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 01:06:42 ]
じゃあruby関係で
ruby -e 'p RUBY_PLATFORM'

64bit環境を持ってないのでどんな出力がされるのかは知らんけど

591 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 01:10:11 ]
RUBY_PLATFORMはコンパイル時に決まりそう



592 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 01:15:50 ]
Fixnumを地道にカウントアップしていってBignumになる境界を見つける -> そこから推定
とかそういうアホを思いついた

593 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 01:21:56 ]
64bitのOSで32bitのバイナリ使ってたら無理じゃないか

594 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 02:22:11 ]
WIN32 API の GetSystemInfo() とか呼んだら良さそうな気がする。
呼び方はあれ、dl 使うなり何なり工夫してくれと。

595 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 03:01:15 ]
Ruby の Web アプリケーションによくでてくる、

class CGI
def valid?( param, idx = 0 )
self.params[param] and self.params[param][idx] and self.params[param][idx].length > 0
end
end

というコードの著作権者、またはライセンスってわかりますか?
GPL だとしてもソースを配布する際には著作権表示が必要ですよね。

tDiary や hiki にも登場していますが、特別そういう表示がないので
勝手に使っても差し支えないんでしょうか?

596 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 03:12:41 ]
その程度の誰が書いても同じになるコードには
著作権が発生するほどの創作性はないよ。

597 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 06:11:16 ]
適当に書き換えればおk

if self.params[param]
if self.params[param][idx]
if not self.params[param][idx].size.zero?
return true
end
end
end
return false


598 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 06:42:47 ]
>>588
64bit の Windows で試していないから動いたらラッキーぐらいで

require 'Win32API'

GetCurrentProcess = Win32API.new('kernel32', 'GetCurrentProcess', 'v', 'i')
hProcess = GetCurrentProcess.call()
isWow64Process = "\0" * 4
is64BitWindows = false
begin
 IsWow64Process = Win32API.new('Kernel32', 'IsWow64Process', ['p', 'p'], 'i')
 IsWow64Process.call(hProcess, isWow64Process)
 is64bitOS = true unless isWow64Process == "\0" * 4
rescue RuntimeError
end
p is64BitWindows

599 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 07:08:01 ]
CamelCaseキモすぎる

600 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 08:10:27 ]
PascalCaseだね

601 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 08:20:52 ]
LCCだろ

さりとて、Windows の API にはハイフン区切りは似合わないのも事実



602 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 08:25:44 ]
CamelCaseは力強さを感じる

603 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 12:36:20 ]
MSは先頭大文字のCamelCase好きだよね
クラス名でもないのに何故?と違和感を感じる

604 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 14:33:09 ]
クラス名は許せるが、rubyでは_区切りとisPredicateではなくpredicate?を使ってほしい

605 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 15:06:15 ]
>>604
>isPredicateではなくpredicate?
変数に?使えたっけ

606 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 15:17:48 ]
使えないよ。
けどpredicateってことは多分604はメソッド名のつもりで言ったんだと思う

607 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 17:14:47 ]
何気に
attr_reader :hoge?
って書けないんだよな

608 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 20:37:53 ]
@hoge? がだめだからなぁ。
Module#attr_readerが再定義されていればその限りじゃないぜ
意義はないけど。

609 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 20:39:11 ]
?付きメソッドを定義したくなるのはよくあることなのに、attrで定義できないのがな・・・
自分でattr_readerを拡張するか、rubyplusのboolattr使うと便利
つーかActiveSupport辺りにも入ってそうな気がする

610 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:32:47 ]
?付きメソッドを自分で定義すれば済むだけなので、漏れは必要ないかなあ。

611 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:48:34 ]
>>610
メソッドごとに一つ一つ?付きを定義していくのって凄く面倒じゃね? 変更に弱くなるし



612 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:59:26 ]
?末尾のシンボルを渡されたら、メソッド名はそのままに
末尾削った変数にアクセスするっていうのも便利かもしらんね

でも真偽値のアクセサが面倒になるほど多いっていうのも
設計見直せる可能性はない?

613 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 22:29:30 ]
class Hoge
 def self.def_predicate(name)
  attr_accessor name
  private name
  private "#{name}="
  define_method("#{name}?"){ __send__(name) }
  public "#{name}?"
 end

 def_predicate :hoge
end

こんなんとか。リフレクションを用いるほど多く使うんじゃなければ
ちゃんと書いたほうがいいと思うけど

614 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 22:40:14 ]
>>611
>>612の言うように?付きメソッドをそんなに定義することあるかな?

615 名前:611 mailto:sage [2008/10/15(水) 22:43:31 ]
>>612 >>614
4〜5つ程度の?付きメソッドでも、似たような定義を続けて書くことになるからかなり面倒だと俺は思う
この辺は個人の意見もあるとは思うが

616 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 22:51:08 ]
attr はあまり使わない
メソッドはきちんと定義する

617 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:34:27 ]
そもそも @hoge? ができないことに疑問を感じるんだが

618 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:45:48 ]
だから ? つきはメソッドだっつーの述語だっつーの

data= っていう変数が作れないのは不自然か?
change! っていう変数が作れないのは不自然か?

619 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:56:18 ]
@is_foo みたいな変数名をどれだけ見かけることか
変数名が述語になれないのはおかしい

620 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:08:25 ]
@hoge? = 123
まず見た目がきもい
そして三項演算子の文法と衝突しそう

621 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:08:33 ]
変数名が述語になるほうがおかしい飢餓す



622 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:12:41 ]
@foop か @foo_p でいい

623 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:14:27 ]
「○○が二者択一のどちらかか、を格納する変数」というのはあまり Ruby っぽくない
二者択一の判断自体をメソッドで参照するのがフツーな気がする

624 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:32:23 ]
>>620
そんなこと言ったらメソッド foo? がどんなオブジェクトも返すことのできる点もおかしくないかい?

625 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:36:58 ]
見た目がきもい、ってのはほんとに見たまんま、?で終わる識別子が左辺値にくるのが
きもいってことだよ。
別に @hoge? = true ならいいってことじゃない

626 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:41:29 ]
>>621
変数名とメソッド名の間で、言葉づかいの上でのセマンティックスが違っている「べき」なら、attr 系は廃止すべきってことになるな

>>625
@hoge? = true なら悪くないと思うけど

627 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:46:06 ]
やだよ。
メソッド名の慣習のせいで、「hogeっすか?」って訊いてるようなイメージがあるじゃん。>@hoge?
で、「そうっすよ」とか「違いますよ」とか返事しようとしてるところに値突っ込むってのは変な感じだ。観念的な言い方でアレだが

628 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:50:34 ]
何も @hoge? があってもそう書かなきゃいけないわけじゃないから、? を使わない自由を奪っているわけではないでしょ。
それよりも、attr 系によって変数名とメソッド名を関連付ける機能が提供されているにもかかわらず、? 付のメソッドだけ特例でそれができないほうが一貫性に欠けて嫌だ。

629 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:54:28 ]
>変数名とメソッド名を関連付ける機能
単なるメソッド。とあるリフレクションのラップなだけ。

>? 付のメソッドだけ特例でそれができない
できないのはそこじゃなくて変数名に?を付けること。
でもってこっちは処理系本体の機能の話。

パーサとかに手を入れて?付き変数を許してまで@hoge?とか書きたいか?

630 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:58:26 ]
そりゃ現状じゃ @hoge? が書けないようにパースしてるんだから、パーサを変えるしかないわな。
別に難しいことじゃない。
あと、attr_reader が処理系そのものが提供しているかどうかなんて関係ないじゃん。飽くまで意味論の話だし、built-inで入ってるんだから。

631 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:02:56 ]
だって…再定義できるもの



632 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:06:57 ]
>>627
メソッドvalueと変数@valueがあったとして、メソッドのほうは「valueは何か?」と問う意味なのに対して@valueはそのままの意味だよね?
同じようにhoge?がメッセージだと解釈されても、@hoge?までメッセージと解釈する必要はないのでは?

633 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:20:26 ]
変数名だからその通りなんだけど、あくまでイメージというか馴れや先入観の問題だよ。>@hoge?がメッセージっぽい

また別の問題として、
変数名に?が付けられて、attr系もそんな名前を受け取るとすると
hoge.foo? = true とか
hoge.bar! = false とかが出て来る。後者なんて比較の否定と見間違う。

さらにいうと、?や!を許すとして、[]とか[]=とか@-は変数名に許す? 全部メソッド名としては有効なはずだよ。
attr_accessor :foo=
-> foo.foo= = 123
こんなことになる

634 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:44:47 ]
hoge.foo? = true はできてもいいと思う。
hoge.foo! = ってのはまあちょっとヘンだけど、attr系で ! つけたかったことないから、あってもなくてもいいや。
[] や = が「メソッドの一部である」というのは別の側面で筋を通すための論法であって必ずしも名前の一部ではないので
(その証拠にメソッド「foo=」は、「foo.foo = 」のようにスペースを入れることができる)、
attr_accessor :foo= 等はなくてもよいかと。

635 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:55:24 ]
>その証拠にメソッド「foo=」は、「foo.foo = 」のようにスペースを入れることができる
いやいや、メソッド名はあくまで「foo=」だよ。__send__(:foo=, 123)とか出来る。
パーサが頑張って「foo.foo = value」を「foo.foo=(value)」と同じような扱いにしてくれているだけで。

636 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 06:05:11 ]
隔離スレでやれ

637 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 09:41:53 ]
本スレが隔離スレってのも難儀な話だよなあ

638 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 07:15:54 ]
RDEのツールバーとコンソール窓の設定などが上手く動作してくれません
ツールバーを移動して1段にまとめたりしても、RDEを最起動すると別の位置へ
勝手に移動した状態になってしまいます
コンソール窓は、フォントの設定が初期値に戻ってしまうのと、
ctrl+alt+cで開閉したりができません

コンソール窓のフォント設定だけは致命的なんで、そこだけでもなんとかできればと

639 名前:638 mailto:sage [2008/10/21(火) 07:27:47 ]
一応環境も
ActiveScriptRuby 1.8.7(p72)
Windows XP SP3
です

640 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 14:20:14 ]
ツールバーの問題は俺の環境(XP)では何年も前からあるよ。

641 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 15:51:59 ]
てかRDE薦めてるサイトでもあるのか?
俺なら間違ってもRDEなんて使わせないんだが



642 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 15:56:44 ]
統合環境使わせるなら EclipseかNetBeansあたりじゃね?

643 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 15:58:04 ]
本筋以外での障壁が大きいからねえ…
「我慢して使う」時点で何か間違っとる
素直にエディタとプロンプトをAlt+Tabで切り替えて使うほうがマシ

644 名前:638 mailto:sage [2008/10/21(火) 17:13:53 ]
コンソール窓のフォント設定は自分のミスでした
コンソール窓で右クリして「設定」からフォントを設定していたのですが、
直ぐ上に「フォント」というのがありました… 見逃してました

>>640
どもです
ツールバーはしょうがないみたいですね

>>641-643
どもです
winの人がrubyを始めようと思うと、RDEがまず最初に目に入るような気がします
NetBeansはDLしてあったのですが、JAVAが云々…とまたやることが増えそうなので
後回しになってました
とりあえず簡単なプログラムを書いて試したかったので、RDEをという感じで
日常はEmEditorのフリー版(かなり古い)を使っていたので、それでやればよかったのですが
コマンド操作には不慣れなwin人なんで、お手軽(そう)なRDEから初めてみようと思い

初心者〜中級者?への道筋がすっぽり抜けてる感じがしていて先行き不安ですが
書いて直ぐ実行できるのはやっぱり楽しいし勉強になります

645 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 18:04:59 ]
RDEはirbと似たような感じでSandBoxとしてしか使わないなぁ。
ファイルに保存はしなきゃならんけど、EmEditorも言語モード別のキー設定と、
外部プログラムのを実行して標準出力を下窓に出す機能が(少なくともVer6からには)
備わってるから、キー1発で実行はできるよ。

646 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 18:48:59 ]
RDEはいろいろなところで紹介されてるから、知名度はかなり高いし
動作はけっこう軽くて多機能、日本語対応と利点は多い
が、不安定さ(特に文字コード関連)とレジストリ使用がそれらの魅力を帳消しにしている

647 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 19:42:48 ]
RDEを普段使ってない人がファーストインプレッションあるいは又聞きで薦めてんじゃないかと思ってる
普段から使っていれば、少なくとも初心者には勧めようとは思えないはずだ

単一言語用だからといってIDE作成が簡単になるわけではない
1種類の言語にしか対応しなくても、10種類の言語に対応してても、IDEとしての作り方は同じだと思う
Rubyに特化すればIDEが俺でも作れそうとか最初に思った人は罪深いなと思ってみる

648 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 19:58:42 ]
FreeRIDEが日本語や他の文字コードに対応してくれれば無敵なんだが

649 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 22:52:51 ]
rubyの表記法の質問なのですが、
Test::Sample
のように書かれていたら、TestとSampleはともにクラスでTestがSampleの親クラス
という認識で合ってますか?
::という記号は定数やクラス変数なども表すとネットで見たのですが
区別は付くのでしょうか?

650 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 23:13:36 ]
:: は 「の」 だ
Test::Sample は Test 「の」 Sample だ
それ以上の意味はないよ
クラスかどうかは普通に識別子で判断する
先頭が大文字なら定数かクラス
先頭が小文字かアンダースコアならメソッド
ただ、あからさまに面倒なのでメソッドを :: で繋ぐことはRubyでは意図的にしない
(他の言語での書き方をしないと死ぬ人が稀に使う)

651 名前:649 mailto:sage [2008/10/22(水) 00:09:42 ]
>>650
ありがとうございます。
そんな曖昧なものだったんですね。メソッドは#でしたっけ?
この業界っていやに自己主張強い人が多いから統一できないのかな



652 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 07:50:20 ]
RDEってRubyのサンプルプログラムとして付いているもんだと思ってた・・・

653 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 09:30:08 ]
>>651
スクリプト上での表記とマニュアルでの表記は違う

…違ってちゃいけないと思うんだが、まあ、
「○○クラスのインスタンスメソッド××を…」と書く代わりに「○○#××を…」と
「○○クラスのクラスメソッド××を…」と書く代わりに「○○.××を…」と
「○○クラスの定数××を…」と書く代わりに「○○::××を…」と書けたほうが
一度理解してしまえば便利ではある

654 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 18:04:18 ]
>>653
> スクリプト上での表記とマニュアルでの表記は違う
>
> …違ってちゃいけないと思うんだが、まあ、

とはいえ、あるクラスのインスタンスメソッドというのは、直接コード上には
現れないから、そもそも同じ表記にはしようがない。
いちいち X.new.m とか書くのもめんどくさいだろ。


655 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 20:22:05 ]
>>650
Test::Sample だったら普通はmoduleかclassがネストされてるやつじゃね?

656 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 09:59:06 ]
>649
::で示されるのは主に
・モジュール内クラス
・クラス内クラス
・モジュール内モジュール
・クラス内モジュール
・モジュールの持つ定数
・クラスの持つ定数
などであって、クラス間の親子関係ではない。
どちらかと言えば所有、もしくは所属の関係。

657 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 17:43:37 ]
Windowsなら、既に更新停止状態だがJmEditorでぜんぜんいける。
コマンドライン登録しとけば、キー一発で実行できるし、プロンプト
勝手に閉じてほしくないなら、ruby.exe実行してからpauseするバッチ
ファイル登録すればいい。

658 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 18:56:51 ]
まさかJmEditor使いが俺の他にもいたとは
動作軽いしUSBで運べるし、便利だよね

659 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 22:50:55 ]
irb とかでいっつも忘れるんだけど、NKF.guess の返り値の数字と文字エンコード名の関係ってどっかに書いてないかな?

660 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 22:57:18 ]
NKF.constants.map{|s|[NKF.const_get(s),s]}
こんな感じで出せばいいんじゃないか?

661 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 23:42:46 ]
refeで引いてみたら出てるかと思ったが

$ refe NKF.guess
require 'nkf'
NKF.guess
--- guess(str)

文字列 str の漢字コードを判別して返します。
返される値は、NKF モジュールのモジュール定数です(下記参照)。
ruby 1.8.2 より前は現在の NKF.guess1 と同じものです。
ruby 1.8.2 以降では NKF.guess2 と同じものです。


下記参照て言われても、下記がない・・・



662 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 08:30:26 ]
.chmもちあるけば解決するお

663 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 09:07:06 ]
>>659
あれは inspect で文字列が出るべきだと思う

664 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 09:07:51 ]
>>662
書いてねえって

665 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 10:01:53 ]
>>664
キーワード:NKF.guess(str) (nkf)
でとんだページの下に定数が書いてあるけど・・・

666 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 11:02:43 ]
> NKF.guess の返り値の数字と文字エンコード名の関係

667 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 23:52:29 ]
ああ、そりゃソース嫁としかw

668 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 13:34:31 ]
>>656
じゃあクラスの継承はどうやって表すの?

669 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 13:55:39 ]
「表しようがない」が正解かと
「XXXを継承したYYY」のように文章で書くしかないな

670 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 23:39:57 ]
Win32OLEを使ってエクセルの自動処理をしようと思っているんですがうまくいきません。

require 'rubygems'
require "win32/clipboard"
require 'win32ole'

excel = WIN32OLE.new('Excel.Application')
excel.visible = false
excel.displayAlerts = false

excel.workbooks.open 'filename' => 'foo'
workbook = excel.workbooks(1)
sheet = workbook.sheets(1)
sheet.select
excel.Columns("B:B").select
excel.selection.copy
excel.quit
↓に続く

671 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 23:40:47 ]

class Excel
end
excel = WIN32OLE.new('Excel.Application')
WIN32OLE.const_load(excel, Excel)
excel.visible = true
excel.displayAlerts = true

book = excel.workbooks.add('bar')
sheet = book.worksheets(1)
sheet.Columns("B:B").Insert Shiftt = Excel::XlToRight

excel.Range("B1").ColumnWidth=11  #セル幅設定                       ←幅や領域が違うっていうエラーが出るのでなんとなく

excel.Columns("B:B").select
excel.selection.parent.paste

book.Save
excel.quit

エラーメッセージは以下
 `method_missing': paste (WIN32OLERuntimeError)
    OLE error code:800A03EC in Microsoft Office Excel
      Worksheet クラスの Paste プロパティを取得できません。
    HRESULT error code:0x80020009
      例外が発生しました

pastespecialなんてのも試してみてもダメ、エラーコードでググってもダメ、"ruby excel paste"などもググって見ましたがダメでした。
よろしくお願いします。



672 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 11:07:36 ]
>>670-671
Excel.Application ペースト でググるんだ
Win32OLEの情報を探すときはRubyに限定しないほうが良い
俺excel持ってないから動作検証できないけどごめんね

673 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 12:43:20 ]
関係ないけど gemで入れられる excel用のライブラリ見つけたぜ
spreadsheet-0.6.1.5 Documentation
spreadsheet.rubyforge.org/


674 名前:670-671 mailto:sage [2008/10/26(日) 17:37:00 ]
>>672-673
ありがとうございます。解決しました。

原因は貼り付ける際に列で指定していたからダメだったようで、
貼り付ける先頭セルの値をRangeで受け渡したらうまく行きました。
また上のプログラムだとちゃんと保存できないのも注意です。
開き方の問題なのか読み取り専用になっているようです。
名前を付けて保存するようにしたらちゃんと保存されました。

675 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:29:35 ]
掲示板スクリプトを作ってるんだけど、動かない。
どこがおかしいのかな。

使っているサーバー @pages (www4サーバー)

一応誘導を受けて来たので誘導元
□規制解除要望□ dion.ne.jp専用 Part727
ex24.2ch.net/test/read.cgi/accuse/1224841217/

スクリプトはここからダウンロードして
www4.atpages.jp/mh35jp/bbsmake.html

676 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:33:52 ]
excelのvlookupのようなものをrubyで書きたいのですが
遅いので速くしたいです。(元々excelのものが遅いのが発端です。)
アドバイスをいただけないでしょうか。
よろしくお願いします。

###################
想定する入力データ

1,0.25,2.25
2,0.75,1.76
3,1.24,1.24
4,1.76,0.75
5,2.25,0.25



677 名前:676 mailto:sage [2008/10/26(日) 19:34:59 ]
#676の続きです
def Vlookup(vs,v)
vx=vs.to_f
if (vx<v[0][0]) then
return -99.9
break
elsif (vx>v[v.size-1][0]) then
return 99.9
break
end
for i in 0..(v.size-1)
vpre=v[i][0]
vpst=v[i+1][0]
if (vx>vpre)&&(vx<=vpst) then
if (vpre-vx).abs<=(vpst-vx).abs then
num=i
elsif (vpre-vx).abs>(vpst-vx).abs then
num=i+1
end
break
end
end
return v[num][1]
end


678 名前:676 mailto:sage [2008/10/26(日) 19:35:43 ]
#677の続きです。
DAT=[[0.5,5.0,50.0],[1.0,10.0,100.0],[1.5,15.0,150.0],[2.0,20.0,200.0]]

lines=Array.new

open(ARGV[0],"r") do |f|
while line = f.gets
line.chomp!
lines=line.split(/,/)
lines[1]=Vlookup(lines[1],DAT)
lines[2]=Vlookup(lines[2],DAT)
print lines.join(","),"\n"
end
end


679 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:44:37 ]
>>675
いきなり自作CGIをレンタルサーバーで動かすとか正気の沙汰ではないぞ
httpdのエラーログをみよう。
いやその前に、まずは、WindowsならばXAMPPでも入れてローカル環境で試そう、な


680 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:54:27 ]
>>679
一応ローカルで実験はした。
方法
1.irbを起動する
2.環境変数を設定
3.systemコマンドで実行
結果
とりあえず動いた

だからアップロードしたわけだが。

681 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:58:41 ]
結論:

 ・ 馬鹿にCGIを渡すな





682 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:02:38 ]
>>681
一応Apacheをインストール中
ところで、WindowsのApacheでCGIを動かすとき#!の行はどうすればいい?

683 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:10:51 ]
家の環境では、ruby.exeをapacheと同じドライブの例えばc:\usr\local\bin\ に放り込んでおけば動いた

684 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:12:44 ]
パスは通しておいてね

685 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:12:47 ]
>>682
パス通して#!rubyでいいんじゃね

686 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:13:15 ]
> パスは通しておいてね
Ruby本体をインスコしたディレクトリにパスは通しておいてね

687 名前:675 mailto:sage [2008/10/26(日) 20:20:11 ]
実験は成功した。普通に動いた。
今度は書き込みを実行したとき何も出力されないバグが出てきたが

688 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:34:55 ]
cgi-exception入れとけ
ttp://cgi-exception.rubyforge.org/

689 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:02:28 ]
>>688
ローカルでは動く。リモートでは動かない
cgi-exceptionをrequireしても(もちろんそのファイルごとアップロード済み)
まったくダメ。

690 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:07:27 ]
この分だと向こうで拡張ライブラリの一部が欠損しているというオチの可能性が
高そう。標準添付のライブラリ(cgi,nkf)しか使ってないのに…

691 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:24:01 ]
CGI.unescape(cgi.params['うんこ']) を CGI.unescape(cgi.params['うんこ'][0]) にするとかさ、
NKF,nkf(略) を NKF.nkf(略) にするとかさ、
変数名やGET/POSTパラメタの名前に誤りがないかよく見るとかさ。



692 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:26:19 ]
環境を疑うよりは、まず自分のスクリプトを徹底的に疑うべき
CGI-Exceptionでエラーが出ないなら次はprintfデバッグだ
スクリプト中の適当な位置で、テキストファイルにログを書き出していけば
たいていエラー箇所を特定できる
(スクリプトが全く実行されない場合は、syntax errorかrubyパス絡みの可能性が高い)

693 名前:692 mailto:sage [2008/10/26(日) 21:37:21 ]
あ、重要なこと書き忘れてた

初心者は(初心者じゃなくても一緒だけど)まず最小限のCGIスクリプトから書き始めろ
小さなスクリプトが動いてから、徐々に機能追加していかないと
ただでさえ特定しづらいCGIのエラーが、余計に特定しづらくなる

少なくとも、そこそこの長さがあって環境変数が関わるような掲示板スクリプトを
一気に書き上げるべきではない

694 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:55:34 ]
>>691
それにはすでに気づいて直した。直したが治らない。
>>692
syntax errorがらみはありえない(-cオプションで検査済み)
パスもチェック済み(/usr/local/bin/ruby)
>>693
一応ローカルで動作確認済みなので

695 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:59:42 ]
これはRubyの問題ではない(まだ)

>>694
だからその方法が間違ってると指摘されてるだろう
CGIは「ブラウザでInternalServerErrorが出なくなるまで書き直す」という手法で開発してはいけない
エラーメッセージを確認しない開発手法は糞だ

696 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:02:14 ]
> 一応ローカルで動作確認済みなので
最小限のCGIスクリプトをサーバー上で動かさないとダメ
「環境変数自分で入れて、systemで実行して動いたから」というのではあまり意味がない

697 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:03:11 ]
結論:

 ・ 馬鹿にCGIを渡すな



698 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:04:18 ]
>>695
とりあえずちょいと方法が思い浮かんだので実験してみる

1.まずは単なるテストスクリプトが動くか確かめる
それすら動かないようならとりあえずこの環境での動作はあきらめたほうがよい
2.次にちょっとした工夫のなされたテストスクリプトを使って実験を行う
3.最後にその結果を見て検証する

699 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:04:55 ]
RubyでWin32弄くる場合に必要な知識はRubyそのものではないのと同様に
RubyでCGIやる場合に必要な知識はRubyそのものではないのだな

ライブラリで吸収隠蔽すべきかどうかというのは悩ましいとこだと思う

700 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:05:14 ]
>>696
Apacheでも動作確認済み
1時間以上前に実験した。

701 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:06:11 ]
bbs.cgi:57: cgi.params['content']をCGI.unescapeに渡している
Arrayが渡ったりしてNoMethodError -> あぼーん
bbs:cgi:58: NKF,nkf('-s',content) カンマとドットのtypo

とりあえず2つみっけ
動作確認済みとは笑わせるな
それともHPのzipからまた弄ってるのか?



702 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:09:26 ]
>>700
どう動作確認したのかkwsk
俺の環境でApache立ち上げて試してみたが、普通にアクセスしただけでエラーが出る
具体的には>>701

703 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:09:46 ]
#!/usr/local/bin/ruby -Ks

print "Content-type: text/html\n\n"
print "<html><head><title>テスト</title></head><body><p>テスト</p></body></html>"

このスクリプトすら動作してないのでもはやお手上げ

704 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:10:02 ]
>>699
だねえ

>>700
小出しにするな
自分で話をまとめられないなら諦めれ

705 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:11:17 ]
> 小出しにするな
> 自分で話をまとめられないなら諦めれ

に一票
そして離脱

706 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:17:59 ]
>最小限のCGIスクリプトをサーバー上で動かさないとダメ

に対して

>Apacheでも動作確認済み
>1時間以上前に実験した。
って…明らかに話噛み合ってないな

707 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:19:34 ]
>>703
自分でApache立ち上げて試すときは、そのパスじゃまず起動しないぞ
#!ruby -Ks
にして試してみ。それでも駄目ならお手上げ

708 名前:675 mailto:sage [2008/10/26(日) 22:21:49 ]
>>706
まったくかみ合わない上に、どうやらこちらの問題ではなさそうだと
判明したのでたぶんこれ以上話し合っても結論が出る可能性は0(正確には)

ただ、根本的バグが見つかったのは皆さんのおかげです。
皆さん、ご協力どうもありがとうございました。

709 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:24:45 ]
>>707
もちろんローカルでやるときはそのためのパスにするわけですけどね。

710 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:31:12 ]
>>707
Rubyの絶対パスを指定して動いてるので、いえるのは
もはやここでは対処しようのない問題だということです。
とりあえずテストスクリプトすら動かないということは
他のところに持っていったのでこれ以上の深入りは
避けたいと思います。

711 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:32:04 ]
>>703
ステータスコード書いてないから動かなくて当然
あと\n\nだとサーバが非winのとき困るんじゃないか?



712 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:33:31 ]
てゆーかbbs.cgi自体も割りと…たぶん2、3個の虫食いじゃないよな、
斜め読みした感じでも

713 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:01:23 ]
パーミッションの設定してませんでした><

714 名前:707 mailto:sage [2008/10/26(日) 23:10:02 ]
>>711
あ、そうか
NPH環境だとステータスコード無しでは動かないのか…

715 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:38:16 ]
超遅レスだけど
>>656 >>668 >>669
ここら辺の話って本当なんですか?
Rubyのライブラリのレファレンスでクラスの説明とか見るとよく::が使われてるけど
あれは本当は間違いなんですか?

716 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:48:43 ]
>>656以外の使い方してるやつなんてあんのか
具体的になんてライブラリのリファレンスのどの部分よ

717 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 00:17:15 ]
>>676
「vlookupのようなもの」ってのが、一体どんなのか分からんのだが
vpreとvpstではさんで比較してるってことは、ソート済みだと仮定してもいいの?
良いなら二分探索が使える

コードについて
・Range#eachがあるんだからeachを使う。Rubyでforは(めったに)使わない
・不要なbreakが見られる
・異常入力に対して99.9とかを返すのは、これでいいの?

718 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 01:26:18 ]
>715
マニュアル内でのその記述はクラスの親子関係じゃなくて、大抵モジュールの定数のハズ。

719 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 01:33:20 ]
例えば、Objectクラス、IOクラス、Fileクラス、File::Statクラスの関係は

IO と File::Stat の直接の親は Object クラス
File は IO の子クラス
File::Stat は File の子クラスではない
File::Stat は File 内のクラス

Rubyのコードで書くとこんな関係。

class Object
end
class IO < Object
end
class File < IO
  class Stat
  end
end

720 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 01:34:23 ]
言うなれば :: でクラス同士を繋いでいたら、それは親子じゃなくて入れ子の関係ってところか。

721 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 01:47:29 ]
Railsの質問はここでいいんでしょうっか?
Web画面を共有出来るアプリが作りたいので
実験で5分で動くshootingstar使ったchatのテストアプリみたいなのを
動かしたんですけど自分でブラウザを更新しないと表示画面が更新されません。
バージョンは、shooting_star (3.2.7)とrailsは2.1.2でOSはUbuntuなんですけど。。



722 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 02:10:00 ]
WebProg板にRailsスレあるよ

【Ruby】Ruby on Rails Part6
pc11.2ch.net/test/read.cgi/php/1224838013/

723 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 05:38:49 ]
>>676
>>677-678の気になる点。

1.vの1列目の値が小さい順で並んでいないと動かない
 以後は1列目は昇順ソート済みであるものとする

2.vs == v[0][0], vs < v[1][0] なら (vs>vpre) && (vs<=vpst) は常に偽
 forの最終ループでvpstがvの範囲外となりエラーを起こす
 vpst = v[v.size][0] => vpst = nil[0]

3.VLOOKUPと検索の仕様が違う
 VLOOKUPは完全一致検索または検索値を超えない最大値の検索
 こちらは四捨五入もどきというか、小さい側優先の再近接値検索?
 (ちなみに四捨五入は中間値切り上げ丸め、つまり大きい側優先)

4.VLOOKUPと違って返値の列が2列目固定
 それならMATCH関数にした方がまだ使いやすくない?

724 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 05:45:45 ]
>>677を問題点もそのままで、ちょっとRubyぽく書き直してみた

def Vlookup(vs,v)
 vx = vs.to_f
 return -99.9 if vx < v[0][0]
 return 99.9 if vx > v[-1][0]

 v.each_cons(2) do |vpre, vpst|
  if vx>vpre[0] && vx<=vpst[0] # *1
   return vx-vpre[0] <= vpst[0]-vx ? vpre[1] : vpst[1] # *2
  end
 end
 nil[0] # *3
end

*1 検索対象が昇順なら"vx>vpre[0] && " 部分は不要
  というか、ここを削れば問題点2は解消する
*2 3項演算子といってexcelのif関数のようなもの (cond ? retA : retB)
*3 問題点2のエラーを発生させるためのもの。
  *1の対策を実施すればこの行には到達しないので削除してよし

高速化とか一切していないので悪しからず。
>>717の言うとおり、二分検索するのがいいんでない。
適当にコード見て書いただけなんで、バグとか指摘の間違いとかあるやも。

725 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 05:51:25 ]
>>711
ほぼ参考書のままです。
とりあえずステータスコードをつけて動くか確かめてみます

726 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 05:59:36 ]
結局Content-typeの改行コードを\r\nにしたら動きました

727 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 06:22:47 ]
>>726
それは誤りだ

728 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 07:26:44 ]
>>727
一応めでたく完成して新しい追加機能2つ(日付表示・連投規制)を
付け加えました。たぶんこれで実運用上、書き込みがぶつからなければ
なんとかなると思います。タグ検索機能はなんか変ですが
おいおい何とかします。

729 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 08:20:38 ]
>>727
誤りではないだろう、HTTPの標準改行コードは\r\nだ
出力先がバイナリモードでさえあれば問題はない

730 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 21:40:37 ]
>>716 >>718 >>719
Java出身のruby初心者だったものでクラスライブラリはクラスの継承で繋がってると思い込んでました。
なるほど、rubyはモジュールや入れ子のクラスを多用するんですね。
勉強になりました。ありがとうございました。

731 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:15:18 ]
Javaだってよく使うだろう。



732 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:25:44 ]
RubyやPerlって一体なにに使う言語なんですか?

Htmlに組み込む言語という解釈でいいんですか?

733 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:41:28 ]
>>732
だいたい何にでも使う

734 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 23:02:23 ]
テキスト処理をするのに使う

テキスト処理と聞いて何も思いつかない場合はまだスクリプト言語に用がないということなので
PerlやRubyのことはすっぱり忘れて別なことを楽しみましょう

735 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 00:49:43 ]
rubyはrailsのために使います。
フリーだと現時点で一番効率よく稼げるのrailsです。
3人月の案件で700は固いから月給200万ですよ。

736 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 17:05:00 ]
日本語でおk

737 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 19:13:55 ]
>>732
>Htmlに組み込む言語

それはPHP

738 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:26:14 ]
>>737
HTMLがPHPになるんですか?
PHPがHTMLになるんですか?
組み込むってそういうことですよね?

739 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:54:46 ]
画面分割はどうやればいいんですか?
自動的に隠したり、分割を×ボタンで消したりする機能のパックになったコントロールとかあるんですか?

740 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:57:37 ]
>>739
Webクライアントの仕組みについて理解してから来なさい。


741 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:58:32 ]
>>739
えーと…
Rubyの仕事ではないので、GUIに何を使ってるか調べて、それに関するスレなりサイトなりに行くといい



742 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:18:58 ]
@蠣←これを右クリでコピーする
Aスタート→すべてのプログラム→アクセサリ→メモ帳を起動
B編集→貼り付け
C編集→すべて選択
D変換キーを押す

743 名前:676 mailto:sage [2008/10/28(火) 23:44:49 ]
>>717
説明不足でした。私がやりたいのは、以下のものです。
・1列目にソート済みの数値が入っている
・2列目には1列目の各行に対応する数値が入っている
・ある数値(入力値)が来た時に1列目の中から最も近い値を探し、それに対応する2列目の値を返す
・もし入力値が1列目の数値の上下限から外れていたら、それぞれ99.9か-99.9を返す
です。

>・Range#eachがあるんだからeachを使う。Rubyでforは(めったに)使わない
始めたばかりなもので。。。今後はeachを使います。(ちなみに速度に差はありますか?)

>・不要なbreakが見られる
入力値が上下限から外れていたら、関数の中のif文より後のfor文にいれたくなかったので使いました。これを見てからelseに書き換えました。
(一般的にbreakは多用しない方がよいのですか?)

>・異常入力に対して99.9とかを返すのは、これでいいの?
異常を示す文字列にしようかとしましたが、今、私がやりたいことにおいて99.9で十分なのでこうしました。


744 名前:676 mailto:sage [2008/10/28(火) 23:45:30 ]
>>723
>1.
書き忘れていましたが、ご指摘のとおりソート済みを仮定しています。

>2.
ちょうどそのエラーに出くわしていたところでした。。。

>3.
事前に一応調べてはみたのですが、ちゃんと理解できていなかったです。
また数学がよくわかっていないため、2の事態が発生しました。

>4.
MATCH関数を知らなかったので調べてみましたが、どのように適用すればよいかわかりませんでした。もう少し詳しく教えていただけないでしょうか。

>>724
知らない事がありすぎるのですが、みやすくなったので使ってみたいと思います。
速くなるのも教えていただけると助かります。。。

745 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 05:33:04 ]
forは内部的にeachを呼び出すそうだから、速度差など無いに等しい。
どうしても気になるなら一億回くらい空ループ回して計ってみるといい。

まぁ、仮に10倍の速度差があったとしても、今は気にする必要ない。
プログラムの高速化はまず何よりもアルゴリズムが最優先。
小手先の最適化に手をつけるのはその後だね。


breakは単に使い方が悪い。
>>677の最初の2つは先にreturnするので、絶対に到達しない。
最後のはbreak後returnしかしていないので、returnで置き換え可能。
breakせずに抜けるパターンの場合、必ず範囲外アクセスで落ちる。
つまりすべての箇所で何の役にも立っていないというわけ。


異常入力にマジックナンバーを返すのもありだけど、発生頻度が低く
検査箇所が多いようなら例外(Exception)を発生させたほうがいいよ。
コードの見通しがまるで違ってくるから。


VLOOKUPは検査値に対応する行と指定した列が交差するセルの値を
返すのに対し、MATCHは検査値に対応する値の位置を返す。
VLOOKUPでは検索範囲が左端の列で、かつ対応する値の列の高さと
縦位置が完全に一致しなければいけない。

MATCHとINDEXまたはOFFSETとの組み合わせなら、検査列に対応
する値の列が左にあってもよいし、縦にずれていてもよいし、列でなく
行(対応する値が横に並ぶ)でもよい。
その気になれば対応する値をnマスおきに飛び飛びにだってできる。
それに比べると列指定不可のVLOOKUPなんてあまりに不便すぎる。

746 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 05:37:23 ]
MATCH関数もどき。 返値は0を起点とする点が異なる。
直近値検索方法は>>677と同じ。

def match_liner(val, array) # >>677と同等
 array[0...-1].each_index do |i|
  if val <= array[i+1]
   return val-array[i] <= array[i+1]-val ? i : i+1
  end
 end
 array.size - 1
end

def match_recursive(val, array)
 case array.size
 when 0
  nil
 when 1
  0
 when 2
  val-array[0] <= array[1]-val ? 0 : 1
 else # ↑↓ 不等号に注意のこと
  i = array.size / 2
  val < array[i] ?
   match_recursive(val,array[0..i]) : match_recursive(val,array[i..-1]) + i
 end
end

747 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 05:40:31 ]
ベンチマーク

srand 1.0 * 2008/10/29 * 3*14 * 0xdeadbeaf # 乱数の種を設定
lookup = Array.new(100000){ rand }.sort!
data = Array.new(2000) { rand }

Benchmark.bm do |x|
 x.report { data.each do |v| match_liner v, lookup end }
 x.report { data.each do |v| match_recursive v, lookup end }
 x.report { data.each do |v| match_loop v, lookup end }
end
   user   system   total    real
221.528000  0.040000 221.568000 (237.392000) # 線形検索
 0.501000  0.000000  0.501000 ( 0.550000) # 二分検索(再帰)
 0.140000  0.000000  0.140000 ( 0.141000) # 二分検索(ループ)

748 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 05:57:19 ]
>>746の二分検索は再帰で実装してあるけど、ループに展開すると
もうちょっと高速化できる。(ベンチ中のmatch_loopがそれ)
どうやって展開するのかは自分で考えてみてほしい。
うまく書ければ20行かそこらで済むはず。


ついでにおまけ。 (>>747続き、 match_なんたらはmatchと定義しておく)
def vlookup(val, range, column) # 指定列は0を起点とする
 val = val.to_f
 if val < range.first[0] or val > range.last[0]
  raise ArgumentError, "value out of range"
 end
 row = match val, range.map(&:first)
 # range[row][column] と同じだが、範囲外では例外を起こす。
 range[row].fetch column
end

pairs = lookup.zip(Array.new(lookup.size) { rand 100000 })
data.take(10).each do |v|
 puts vlookup(v, pairs, 1)
end

749 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 07:00:09 ]
全角空白厨は何を言っても説得力がない

750 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 09:42:12 ]
そこが気になるというのは、もしやコードをテストしてみようとしたわけか?
朝早くから実に殊勝な心がけだ。 大変すばらしい。

それだけ向上心があるなら、更なる技術向上のための課題として、全角半角の
変換フィルタでもチャレンジしていただきたい。 (もちろんワンライナーな)

751 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:08:41 ]
>>750
コードは全く読んでない
全角空白かどうかだけをブラウザ上でチェックした
それで充分



752 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:21:12 ]
>>749,751
俺もコード張るときはwebブラウザとかJaneのこと考えて
全角に変換してから張るんだけど何かまずいの?

753 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:21:57 ]
書き込む際に見やすいように、という理由でいわゆる全角スペースを使うのは
割とよくあることだと思うんだが、それをどういう切り口で転がすと「厨」になるんだろ。
それこそ「説得力が無い」よ。

754 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:26:48 ]
全角空白なんて危険なもの使わなくたって &nbsp; があるだろう
初心者がコピペで実行する初心者スレで全角空白みたいなのをコードに混ぜるのはあまりいい気はしない

arr.each do |e|
  puts e
end

755 名前:752 mailto:sage [2008/10/29(水) 10:31:22 ]
>>754
ああなるほどな、サンクス

756 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:34:41 ]
>>754
本人?

よりよい方法がある、という話ならわかるけど、そんなことで厨呼ばわりした上で、
コードなんか見なくても十分とか言ってのけたわけ?
「あまりいい気はしない」とか、なんか急にトーン下がってるけど。

757 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:40:23 ]
>>756
いや全然

検証のために irb にコピペして全角空白でエラーになってピキッとなったことはないか?
せっかく書き込み前に置換する手間を割いてるのに置換先が全角空白だというのはバカっぽいだろ
なんでわざわざ実行不可能なコードにさせるんだよ

758 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:46:17 ]
他人が実行するかもしれないことに気が回らない俺スゴイ系の人は
2chでは厨呼ばわりされても仕方ないかな、という気はちょっとだけする


759 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 11:01:39 ]
だが、ム板では普通に見かけるけどな。
インデントを全角空白で、ってのは。

760 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 11:24:51 ]
ソース見れば普通に半角空白残ってるんだお

761 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 11:35:27 ]
置換の手間は割けなくても長文粘着はありなんだよねこういう人ってw



762 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 11:47:31 ]
CSV::Writer.generateを使ってCSV出力をしているようなんですが
出力されたCSVを見ると
AAA,BBB,CCC,DDD
と出力されており1データに改行が含まれている場合に正常に解析できなくなってます。
AAA,BBB,CCC,DD
D
本来ですと
"AAA","BBB","CCC","DD
D"
のようにデータが""で囲われてほしいのですが何か方法は無いでしょうか?
ソースは↓な感じですです。
 def issues_to_csv(issues, project = nil)
  ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')  
  export = StringIO.new
  CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
   # csv header fields
   headers = [ "#",
         l(:my_data1),
         l(:my_data2),
         l(:my_data3),
         ]
   csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
  end
  export.rewind
  export
 end

763 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 11:55:24 ]

 投稿者1人が半角スペースなコードをエディタに書く
          ↓
 書き込み時に全角スペースに置換する
          ↓
 参照者複数人が各々のコピペ時に全角スペースを置換する
          ↓
 エディタに半角スペースなコードができる


まあ、プロトコル的に無駄ではあるな
投稿者が半角スペースを&nbsp;に置換してくれさえすれば参照者はコピペだけでおkなのに

2chブラウザによっては半角スペースを投稿時に&nbsp;に変換してくれるものもあるけどな
navi2ch使いあたりはこのへん全く意識しないはず
というか、全角スペース混じってると範囲実行のM-|ができなくてイラつく(w
いちいち

1 [1,2,3].each do |e|
2 puts e
3 end

と行番号つきで書かれるくらいムカつく

764 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 12:05:00 ]
Jane Doe Styleで >>754 をコピーすると
半角スペースの箇所はクリップボードには &#160 (&#は半角)で保存されるぞ

アプリケーション( 2ch 含む)によって文字参照の扱いなんてまちまちなんだから
文字参照に変換してから貼れって主張にはあまり魅力を感じないんだよな

765 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 12:09:49 ]
コピペ内容に関して意識してる2chブラウザはそう多くないよね
どうレンダリングするかとかはRFCに記述ないんだっけ?

766 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 13:14:44 ]
なにやらえらい騒ぎになってしまったな。

全角半角が問題になるのはコピペする人間だけなのだが、実際それをする人間がどれ
ほどいるのか。
他の板ならともかく、いかに初心者スレとはいえここはム板なんだから、一括置換な
んぞ5秒でこなす
くらいの能力は期待できないものなのか。
学校のセンセじゃあるまいし、その程度は勘弁していただきたい。

まぁ、全角を使っているのは書き込みログが読みにくくなるから、というしょーもな
い理由なので、
こちらも置換すれば済む話ではあるし、専ブラで対処できるものなら導入を検討する
よ。

と、ここで新着見たら、そんな簡単な話しでもないのか。
確かに>>764は以前くらったことがあるな。
どうしたもんかね。

767 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 13:17:44 ]
ノンブレイカブルスペースは \x20 とは別物。常識

768 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 16:32:30 ]
おれも &nbsp; つかってたけど、>>764と同じことがあって、
結局全角スペースのほうが害がすくないと判断してる。

>>767
そうなんだよね。しかも&nbsp;が半角スペースにならない環境だと、
置換が全角スペースより面倒なんだよな。

まあ2chの仕様がクソということで。


769 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 16:33:42 ]
>>762
CSVやめて、FasterCSVを使ってみたらどうでしょうか。
「ruby fastercsv」でぐぐってみてください。

770 名前:デフォルトの名無しさん [2008/10/29(水) 17:08:50 ]
>>769
実は先ほどソースはredmineのものなんです
ファイル名app\helpers\issues_helper.rb
なので簡単にFasterCSVに置き換えて大丈夫なものなのか判断しにくいんです。
変更は簡単ですかね?

771 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:43:51 ]
>>762
CSV::Writer ならエスケープが必要なフィールドだけエスケープされるので、
以下のようになるはずだけど。

AAA,BBB,CCC,"DD
D"

DD\nDだけじゃなくてAAAとかもクォートして欲しいってこと?



772 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 13:30:47 ]
>749-768
先頭の空白に関しては、まだRubyは良いほうでしょ
Pythonなんて先頭の空白が纏められたら話にならんかと

773 名前:デフォルトの名無しさん [2008/10/30(木) 16:17:11 ]
while文の中にif文入れられる?

774 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 16:22:19 ]
a = [1, 2, 3]
while if n = a.shift
    n
   else
    false
   end
 p n
end

# => 1
# => 2
# => 3

775 名前:デフォルトの名無しさん [2008/10/30(木) 18:36:04 ]
msg = "(1+2+3)*2/3" などのように数式の入った変数を
プログラムの構文として処理することは可能でしょうか?
  val = 構文評価(msg)
のようなイメージで、
任意の数式をRubyで処理することを期待してるのですが

776 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 18:53:18 ]
>>775
手っ取り早いのはeval。
でも数式に限らずなんでも実行できてしまうから
四則演算だけ処理したいならraccとそのサンプルのcalc.yあたりとか。

777 名前:775 mailto:sage [2008/10/30(木) 19:31:22 ]
>>776
ありがとうございます。助かりました。

778 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 22:51:35 ]
>>776
> 四則演算だけ処理したいならraccとそのサンプルのcalc.yあたりとか。

正規表現で入力を検査してokならevalに渡す方が楽でない?

779 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 22:58:30 ]
そのへんは入力元がどのくらい信用できてどのくらい調教可能かによるな

780 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:07:18 ]
信用できないから検査する。
何によるかというならどれくらい受理する式の文法を限定できるかだろう。
君、バカでしょ。

781 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:18:40 ]
検査が必要かどうかという話だろ
自分で電卓代わりに使いたいだけなら入力検査は不要

こんなの完璧にやるか全くやらないかの2択なんだから信用度は重要
2//3 で エラー吐いて落ちるのは困るだろうし
1 2 + 3 で エラー吐いて落ちるのは困るだろうし
1/3*3 で 0 が返るのも困るだろうし
(1..2) で Range オブジェクトが返るのも困るだろう



782 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 00:02:44 ]
>>781
君はバカさ加減の露出癖でもあるのかね。

> こんなの完璧にやるか全くやらないかの2択なんだから信用度は重要

不測の動作をさせないことが保証できればいいんだよ。
エラーはevalのすぐ外で捕捉すりゃいい話。

> (1..2) で Range オブジェクトが返るのも困るだろう

そうならないように検査するんだろうが。

783 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 00:03:55 ]
じゃあraccでやれよ

784 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 00:06:22 ]
は?

785 名前:676 mailto:sage [2008/10/31(金) 00:28:23 ]
>>745
returnしたら、その後に行かないという基本的な事を知りませんでした。。。

説明していただいた内容が理解できていない部分があるので質問させて下さい。
「MATCHとINDEXまたはOFFSETとの組み合わせなら」とおっしゃっているのは、
それぞれ以下のもののことでしょうか?
www.ruby-lang.org/ja/man/html/Regexp.html#match
www.ruby-lang.org/ja/man/html/Array.html#index
www.ruby-lang.org/ja/man/html/MatchData.html#offset
それとも以下のようなexcelの関数のことでしょうか?
support.microsoft.com/kb/181212/ja
これすらも解からない状況です。申し訳ありませんがよろしくお願いいたします。

>>746-748
ループ版の早さは今の私には驚異的です!
1個のデータを処理するのにexcelで処理していたときは約5分
自分で作ったvlookupで約2分だったので、1秒かからなくなるんですね。
ただ、勉強不足でわからないことだらけです。
ループ版を自分で作るには時間がかかるので少し待って下さい。
完成したら添削をお願いします。

786 名前:デフォルトの名無しさん [2008/10/31(金) 02:28:31 ]
qb5.2ch.net/test/read.cgi/operate/1206636885/657
駄目元で書き込んだ。
賛同してくれる人はこのレスに同意のアンカーをつけてくれ。

787 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 04:54:23 ]
>>785
コードの端々で妙な書き方してるから、他言語でヘンな癖でもつけて
きたのかと思ってたら、もしかしてプログラミング初心者だった?
Excel VBA使いを想定してたんだが、Excelもサッパリのようだし…
INDEXやOFFSET等、全部大文字で書いたのはExcelの関数。
これらについてはスレ違いなので他でよろしく。


まぁ、とりあえずは基本的な文法・制御構造をまず覚えてくれ。
最低限、分岐・ループ・メソッド呼び出しとそこからの脱出あたり。
勧めといてなんだけど例外は後回しでいいかな。
一度苦労した後の方が有り難みもよく分かるだろうし。

次に組み込みクラスについて調べてみる。
上で使ってるのは、数値(Numeric), 文字列(String), 範囲(Range)
あたりを見れば分かる程度の簡単な使い方してる。
重要なのは配列(Array)とEnumerableの2つ。
制御構造と並んで、こいつらがアルゴリズムを実装する要だ。
(今回は使わなかったが、Hashもいずれ知っておくべき)

クラスライブラリを全部覚えるのは大変だろうけど、どんなことが
できるかくらいはざっと目を通しておくといい。

そうしたらコードを読んでみる。
どれもかなり短いから、読み下すのはそう難しくないとおもう。
行数短縮のために三項演算子を濫用している点は申し訳ない。

788 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 04:58:30 ]
コードを読んだだけでは内容を理解するのは難しいだろうから、
短い配列でどのような動きになるか、紙に書いてみるといい。
再帰をループに変更するにはアルゴリズムを十分に理解して
いなければならないが、是非がんばって挑戦してほしい。

ケチな高速化など後回しと書いた理由も実感して貰えたと思うが、
もし興味を持ったなら、アルゴリズムも勉強してみてはどうか。
ほんのちょっとの仕組みの違いで速度が千倍とかざらにあるよ。
計算量の考え方だけでも知っておくことをお勧めする。

789 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 07:54:59 ]
VB系はreturnに直接相当する命令がないからな。
戻り値と、プロシージャを抜ける構文が別になってるから。
で、そのまま直訳してreturnとbreakに分けた、と。そんな感じだろう。

790 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 10:38:32 ]
ひとこといわせてくれ。
>>787-788、おつ。こんごもがんがれ。

791 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 17:14:09 ]
あるクラスAが別のクラスBのサブクラスかどうかを判定するメソッドってありませんでしたっけ?
今は
A.ancestors.include?(B)
とやってるんですけど、かっこわるいですよね。



792 名前:デフォルトの名無しさん [2008/10/31(金) 17:21:41 ]
どうして?それでよいのでは?

793 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 17:45:25 ]
class B;end
class A < B; end
class C; end

p A < B
p A > B
p A < C

794 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 17:51:24 ]
>>793

>> File < IO
=> true
>> Dir < IO
=> nil

なにこれーーー

>> Fixnum < Integer
=> true
>> Array < Enumerable
=> true

module もOKだ

ちょうさんくすです



795 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 18:44:55 ]
まさかModule/Class同士の比較ができるとは・・・知らなかった

796 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 21:10:08 ]
>>795
伊達に継承の記号が "<" なわけじゃない。
……かどうかは知らないが。

797 名前:デフォルトの名無しさん [2008/11/01(土) 06:26:05 ]
VIPから来ますた

798 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 06:26:45 ]
VIPから来ますた

799 名前:デフォルトの名無しさん [2008/11/01(土) 06:28:45 ]





∧_∧
( ´・ω・) みなさん、VIPからさし入れのお茶が入りましたよ・・・・。
( つ旦O
と_)_) 旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦

800 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 06:44:02 ]
VIPから来ますた

801 名前:728 mailto:sage [2008/11/01(土) 08:48:50 ]
検索機能がついに完成しました。
一応私の夢見た掲示板をついに作り終えました。
とはいえまだ課題がいくつか残ってます。
それを今後つぶしていきます。



802 名前:デフォルトの名無しさん [2008/11/01(土) 11:00:45 ]
以下のスクリプトで,30行目で,
usr/lib/ruby/1.8/net/http.rb:451:in `initialize': wrong number of arguments (2 for 1) (ArgumentError)
のエラーが出てしまいます。
比較のためにAとBを作ったのですが、29行目ではエラーが出ません。
Net::HTTPを承継したクラスを作って,コンストラクタの部分を
オーバーライドしようとしています。
エラーの原因は何でしょうか
1 #!/usr/bin/ruby
4 require 'net/http'
5 require 'uri'
7 class A
8 def initialize(arg)
9 puts "A initialized", arg
10 end
11 end
13 class B < A
14 def initialize
15 puts "B initialized"
16 end
17 end
19 class C < Net::HTTP
20 Net::HTTP.version_1_2
21 def initialize(url)
22 uri = URI.parse(url)
23 puts "C initialized"
24 super(uri.host, uri.port)
25 end
26 end
28 url = 'www.yahoo.co.jp/'
29 p b = B.new
30 p c = C.new(url)


803 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:21:28 ]
URIはHTTP専用ってわけじゃないので、ちゃんとプロトコルから書く。
あとNet::HTTPはわりと残念な設計で、サブクラスでinitializeをオーバーライドしても呼ばれない。
委譲したほうがいいかも

804 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:52:20 ]
>>802
これで我慢すれ
class C < Net::HTTP
 def initialize(*args)
  args[0].kind_of?(URI) ? super(args[0].host,args[0].port) : super
 end
end

805 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 08:33:41 ]
そこでhttpclientですね

806 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 12:26:17 ]
802 じゃないけど、なんであのエラーが出るのか理屈がわからない…。>>802 の initialize にダミー引数を渡すと呼ばれるよね。
require 'net/http'
require 'uri'
class C < Net::HTTP
  Net::HTTP.version_1_2
  def initialize(url, dummy=nil)
    uri = URI.parse(url)
    puts "C initialized"
    super(uri.host, uri.port)
  end
end
url = 'www.yahoo.co.jp/'
p c = C.new(url)
 
Net::HTTP を眺めて同じ挙動を再現しようと思ったけど、できないYO!
class A;end
class << A; alias newobj new; end
class A
  def A.new(foo, bar=nil)
    a = A.P(foo, bar).newobj(foo, bar)
  end
  def initialize(foo, bar=nil)
    puts "A init."; @foo = foo; @bar = bar
  end
  def A.P(foo, bar=nil);self;end
end
class B < A
  def initialize(foo)#, bar=nil)
    puts "B init."; super(1, 2)
  end
end
p b = B.new(3)

807 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:50:27 ]
>>806
× a = A.P(foo, bar).newobj(foo, bar) # in A.new
○ a = self.P(foo, bar).newobj(foo, bar)

808 名前:806 mailto:sage [2008/11/03(月) 00:21:05 ]
おおお!!thx>>807
なんで、A付けちゃったんだろ?
これを色々いじって、マニュアル見ながらよく考えてみる。
も一回ありがとう!>>807

809 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:14:38 ]
ディレクトリの中にあるすべてのファイル名を変えるプログラムを作ろうとしたのですが
5分で挫折しました(笑)

File.open("D:\\Data") {|f|
puts f.to_str()
}

とりあえずこうやってファイル名を出力しようとしたのですが、
コマンドプロンプトではすべてUNICODEのファイル名で表示されてしまい
わけわかめです。
$SCODE = SJISとかやってもダメでした

810 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:28:30 ]
それファイル名じゃなくdataというファイルの中身を読んでいるように思えるが

`dir d:\\data /b`.each { |f| f.chop!
  puts f
}


811 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:39:07 ]
その場合メソッドパラメタの名前は line とかのほうがいいぞ



812 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:42:01 ]
メソッドパラメタ → ブロックパラメタ

813 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:58:21 ]
>>809
そういうときは、致命的な動作になるまでは Dirl.glob を使う
ディレクトリ区切り文字は \ ではなく / なので注意

irb> Dir.glob('c:/*')
["c:/AUTOEXEC.BAT", "c:/boot.ini", "c:/bootfont.bin", "c:/CONFIG.SYS", "c:/Documents and Settings",
"c:/Program Files", "c:/RECYCLER", "c:/ruby", "c:/System Volume Information", "c:/WINNT"]
irb> Dir.glob('c:/*/')
["c:/Documents and Settings/", "c:/Program Files/", "c:/RECYCLER/", "c:/ruby/",
"c:/System Volume Information/", "c:/WINNT/"]
irb> Dir.glob('*.txt')
["001.txt", "002.txt", "003.txt"]
irb> Dir.glob('*.txt').each{|e| FileUtils.mv(e, "#{File.basename(e,'.*')}.bak") }
irb> Dir.glob('*')
["001.bak", "002.bak", "003.bak"]


814 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 18:15:13 ]
>>813
今のrubyは\も扱ってくれるよ

と思ってたが、Dir.globは\区切りに対応してないのね……

815 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:31:28 ]
下のディレクトリの中も再帰的にやるんじゃなかったら
Dir.entries(ディレクトリのパス).reject{|d| File.directory? }
とか。

816 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:14:51 ]
rubyでファイルの種類の判断ってできますか?
拡張子で判断するのではなくファイルの中身で、Excelファイルかどうかの判断が
したいんです。
よろしくおねがいします。

817 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:34:00 ]
できますよ

818 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:33:29 ]
>>816
がんばってマジックナンバー嫁

819 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 08:17:09 ]
>>816
unix系ならFileMagicだけどwindowsはよう知らん

820 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 19:22:11 ]
>>815
Windowsですが
再帰でディレクトリリストが欲しい時もcmdのdirですましちゃう
サブディレクトリ一覧
dir /s /ad /b \ほげほげ\ | ruby -ne "puts $_”
ほげほげ下のサブディレクトリ内の.rbファイル一覧
dir /s /a-d /b \ほげほげ\*.rb | ruby -ne "puts $_"
とか

rubyだけでやるならglobで/**/使って
Dir.glob('/ほげほげ/**/*/'){|e| puts e}
とか
Dir.glob('/ほげほげ/**/*.rb'){|e| puts e}

と、いろいろ試してたら列挙される数が違ったんで、あれっ?と思ったら
globの方は標準ではドットファイルが除外されるのを忘れてた
使用してるのがWindowsオンリーなので、普段ドットファイルなんて意識しないし

Dir.glob('/ほげほげ/**/*.rb',File::FNM_DOTMATCH){|e| puts e}


821 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:56:06 ]
>>816
エクセル持って無いけど
たぶんファイルの先頭見たら判るんじゃね?とググって見ると
エクセルもワードも BIFFってフォーマット(OLE?)でどっちもファイルの先頭は同じだったorz

さらにぶらぶらと調べてたら、parseexcelっていうライブラリを見つけたので
適当にインターネットからxlsファイルを落としてきて
require 'parseexcel'
workbook = Spreadsheet::ParseExcel.parse('エクセルのサンプルファイル.xls')
で読み込めたけど、えらく遅かったので parseexcel がパース直前にやってることを直に書いてみた
require 'parseexcel'
begin
ole= OLE::Storage.new('エクセルのサンプルファイル.xls')
biff = ole.search_pps([OLE.asc2ucs('Book'),OLE.asc2ucs('Workbook')],true)
if biff.first
puts "エクセルファイル"
else
raise 'NotExcelfile'
end
rescue
puts "エクセルファイルじゃない"
end

エクセルファイルを漏れなく判定できるのかはわかりませんが…




822 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 11:05:21 ]
require 'foobar'
としたあとで、'foobar.rb' の絶対パスを調べる方法ってありますか。


823 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:13:55 ]
File.expand_path($LOAD_PATH.map{|d| File.join(d, 'foobar.rb') }.find{|path| File.exist?(path) })

824 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:19:42 ]
>>823
それは読み込んだファイルであることを保証しない

825 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:27:19 ]
読み込んだファイルそのものを指定することは1.8ではできないと思った
同名のファイルをファイルパスから探すことはできるけれど

>>823で問題になる場合というのはなくはないとは思うが非常にレアなような気もする

826 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:32:16 ]
foobar.rb で File.expand_path(__FILE__) を返すようなメソッドなりなんなりを用意しておくほうが確実なのかな
>>823の要件に合うとは思えないけど

827 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:35:43 ]
>>826
require を拡張したほうが妥当と思う

が、どうすればいいのやら
gem の require はどうやってるんだっけ

828 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:43:39 ]
foobar.rb で File.expand_path(__FILE__) を返すようなメソッドなりなんなりを
requireしたあとからくっつければ医院で内科医?


829 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 16:20:11 ]
>>828はのび太

830 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:55:23 ]
>>823-828
どうもありがとうございます。
ないということなので、以下の方法で済ませることにしました。
lib = "foobar.rb"
dir = $:.find{|path| File.exist?(File.join(path, lib)) }
filepath = dir ? File.join(dir, lib) : nil
ありがとうございました。

831 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:45:52 ]
拡張子省いてrequireしたとき、.soだったのか.rbだったのかまで知りたくなったら、$LOADED_FEATURESとも突き合わせて比較する必要も出てくる。






832 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:21:42 ]
突然ごめん。
p array
した時の["hoge", "fuga", "boo"]みたいな書式って
変更できたりしない?
あと一歩でcsvなので便利に使えそうなんだが。
pのことをググって調べるのは非常にホネが折れる…

833 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:28:03 ]
inspect

834 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:07:55 ]
>>832
www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#p
なんでもぐぐって調べようとするから骨が折れてるんだろうw

835 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:12:54 ]
>>832
joinの方が楽

836 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 03:23:57 ]
>>832
>>835
その名も「csv」というライブラリが標準で付いてることを忘れないでやってくれ。

837 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:49:56 ]
>>832
一文字目と最後の文字消せばいいだけじゃね?

838 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:18:53 ]
なんでもかんでもググるって馬鹿がすることだよね。
賢い人なら知りたいことが見付かりそうな文書はどこにあるのかをまずは考える。

839 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:15:46 ]
ロックシステムについて相談があるんですが
i=0
begin
File.open('lockfile',File::WRONLY|File::CREAT|File::EXCL,0666) do |lfile|
File.open('hoge','r') do |file|
# hogeを使ったいろいろな処理
end
end
File.unlink('lockfile')
rescue SystemCallError
if(i>10) then raise
i+=1
if(File.stat('lockfile').mtime<Time.new+10) then
File.unlink('lockfile') #残骸のロックファイル削除
else
sleep(0.1)
end
retry
end

どうもi386-mswin32だとEXCLオープンしても例外を投げなくてうまくいかない
ようです。他のプラットフォームだとどうなんでしょう?

840 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:16:58 ]
File#flock() を使う方法しかしらない。

File.open("foobar.txt", "wb") do |f|
 f.flock(File::LOCK_EX) # 排他ロック
 f.unlock();
end

841 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:22:21 ]
なんか既視感がある

組み込みで妥当に動作してるロック機構を再発明しようとするな、というのがアドバイスだったはず



842 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:24:54 ]
>>840
まずそのサーバーでflockが使えないから無理
>>841
組み込みで現に存在してるのが使えないから問題。
確認したいこと
1.とりあえず方法があっているか。
2.Windowsだとまともに動かないようだが他のプラットフォームだとどうか。

843 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:35:38 ]
>>839
1.8.6-FreeBSDだけど File::CREAT|File::EXCL で Errno::EEXIST が出る
ただし>>839のソースをそのまま実行すると例外が rescue でとらえられて
例外処理でロックファイル削除されてからリトライするから、例外が発生してないように見える
あとrescueの下の二行間違ってるよ

844 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:40:52 ]
>>839
$ ./ruby.exe -v -e 'open("hoge", File::WRONLY|File::CREAT|File::EXCL,0666)'
ruby 1.8.7 (2008-11-04 revision 20103) [i386-mswin32]
-e:1:in `initialize': File exists - hoge (Errno::EEXIST)

投げるが。

> if(File.stat('lockfile').mtime<Time.new+10) then
未来の時刻と比較してるようだがこれはいいのか?


845 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:43:49 ]
>>843
確かにおかしいところがあるかもしれないです。
rescue
if(i>10) then
raise
end
i=i+1
if(File.stat('lockfile').mtime<Time.new+10) then
File.unlink('lockfile') #残骸のロックファイル削除
else
sleep(0.1)
end
retry
end

一応rescue節の書き換えはしてみました。これで大丈夫でしょうか。
あと、例外処理でロックファイルが削除されるのはたぶん正しいです。
というのもそのファイルの最終更新時間が10秒以上前なら削除するように
できてますから。

846 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:45:56 ]
>>844
あ、やばい。そこがおかしい。
どう考えてもおかしい。
if(File.stat('lockfile').mtime+10<Time.new) then
こう直すべきだ

847 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:55:09 ]
>>844
どこでおかしかったか分からないが治った。thx

848 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:57:23 ]
>>842
> 組み込みで現に存在してるのが使えないから問題

849 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:10:05 ]
>>842
> 1.とりあえず方法があっているか。
あってない。突っ込み所満載。
・SystemCallError なんて上がらないんだが。
rescue => e
puts e.class
とでもして、何が上がってるのか確認しろ。
・if文が閉じてねーぞ。
> if(i>10) then raise
1行で書きたきゃ「if(i>10) then raise; end」か「raise if (i>10)」だ。
つか、endの対応が合ってなくてさくっとsyntax errorなんだが……。
・mtimeが「現在+10秒」より過去、って何の冗談だ。
・あるプロセスがunlinkした直後に別のプロセスがstatしたら死ぬんだが。
・あるプロセスがstatしてunlinkするまでの間に別のプロセスがstatしてunlinkしてopenしたら不味いんだが。
> 2.Windowsだとまともに動かないようだが他のプラットフォームだとどうか。
とりあえず適当に修正したら、2プロセス程度の簡単なテストならちゃんと動いた。(@mswin32)

850 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:19:35 ]
>>849
1.Errno::XXX系統のクラスは全部SystemCallErrorのサブクラスなので
きちんと受け止められる
2.if文問題は修正済み
3.時間問題も修正済み
4.いまだにレースコンディションが解消してない件は最悪またSystemCallErrorで
受け止めてやればいい
修正したソース(rescue節のみ記載)
rescue
if(i>10) then
raise
end
i=i+1
begin
if(File.stat('lockfile').mtime+10<Time.new) then
File.unlink('lockfile') #残骸のロックファイル削除
else
sleep(0.1)
end
rescue SystemCallError
#rescueするけど何もしない
end
retry
end

851 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:24:21 ]
それでもやっぱり最後のレースコンディションは解消してないのだが、
これ以上この方法にこだわる限り改善の余地はなさそう。



852 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:42:44 ]
>>842
>まずそのサーバーでflockが使えないから無理
File#flock() が使えない環境ってどんなの?
どこでも使えるもんだと思ってた。

853 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 23:03:27 ]
>>850
更新時刻から10秒待つのに、リトライは0.1秒×10回でいいのか、というのはおいといて、ゴミ掃除を別々のプロセスで確実にやるのは無理だと俺は判断してる。
ゴミ掃除専用のプロセスを1個だけ別に動かしとけ。メインの処理に10秒以上かかる可能性がないと言えるなら、それで大丈夫だろ。


854 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 23:31:32 ]
どうせ専用のプロセスを立ち上げるなら,
druby使ってmutexを共有するという強引な方法を思いついた

855 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:22:16 ]
普通にO_EXLOCKでシステムのアドバイザリロック機構に頼ればいいんじゃないのか?
下がnfsだったりするとアレだが。

856 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 05:41:35 ]
>>853-854
レンタルサーバーでCGIを動かすために使うというのが大前提なので。
プロセスの常駐とかまず無理。
10秒待つのではなく確実を期すために10秒以上前のロックファイルを
削除するといっている。待つ時間は1秒。

857 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 05:43:07 ]
flockメソッド(関数)は、言語によって同じ名前でも実装が違ったり
一部のファイルシステムやレンタルサーバ上では使えなかったりしてあまり信用できない

かといって自分でロック機構を実装すれば、レースコンディションの危険がある
なんかこの辺をさくっと解決してくれるpure rubyなライブラリないかな

858 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:34:57 ]
>>857
>flockメソッド(関数)は、言語によって同じ名前でも実装が違ったり
Rubyの話してるんだから他の言語は関係ないだろ。

>一部のファイルシステムやレンタルサーバ上では使えなかったりしてあまり信用できない
だからどんなファイルシステムやレンタルサーバ上で使えないの?
具体名をだしてくれ。
どういう場合にflockが使えないのかを、ドキュメントに書いてもらおうぜ。


859 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:23:44 ]
>>858
NFS上でのロックは不可能。
これはflockシステムコールの実装から来る制約。
fcntlを使えばNFSでロックすることは可能になるがIO.ioctl関数という
可搬性が低いメソッドを用いなければならず(まずWindowsなら実装されていないと
門前払い)かなり面倒。おまけにたいていNFS上でのロックはセキュリティホールに
なるので使えないのが普通。

860 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:49:31 ]
>>858
レンタルサーバだと、flockが明示的に禁止されているサーバがある。パンドラとか

ただ、現在flockを使えないサーバがどのくらいあるかは分からない
無視できるほど少数かも

861 名前:デフォルトの名無しさん [2008/11/08(土) 22:07:38 ]
正規表現の書き方なのですが、、、、
>Sector:</td><td class="yfnc_tabledata1"><a href="biz.yahoo.com/p/7conameu.html">Services<
こんな文字列があって、前後にも改行以外の文字が色々とくっついているのですが、
Sector:の後のServicesをマッチさせて文字としてとってこようとすると、どう書けば良いでしょうか?




862 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 22:17:18 ]
正規表現は書き方を覚えないと駄目
なぜなら、ほんの少し変えようと思っただけで別物になるから
コピペでやろうとすると異常に遠回りになる

正規表現自体は他の言語の正規表現とけっこう互換性があるから適当なサイトで勉強すれ

863 名前:デフォルトの名無しさん [2008/11/09(日) 00:42:26 ]
>>862
ありがとうございます。
マッチしたい文字列が9種類しかないのが分かったので、こうやりました。
if line =~ /.*Sector:<.*(Basic Materials|Conglomerates|Consumer Goods|Financial|Healthcare|Industrial Goods|Services|Technology|Utilities)/
p $1
end


864 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:46:37 ]
wxRubyについて勉強してるんですが、何かいいサイトはありますか?

一応自力で見つけたサイト
www.gesource.jp/programming/ruby/gui/wxruby/index.html
wx.k5-n.com/wxruby/

最小限のことは自分でやってます。require周りは自分でなんとかしてます。

865 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:59:40 ]
具体的には…

1.とりあえずwxWindowをインストールした
2.wxRubyをgems経由でインストールした
3.簡単なテストアプリケーションが動くようになった

以上のことがすでに完了してます。

866 名前:デフォルトの名無しさん [2008/11/09(日) 12:00:00 ]
文字列変換メソッドを多数持たせたモジュールがあります。呼び出し
ごとに正規表現オブジェクトが作成されるのを防ぎたいのですが、
単に/abcde/ の代わりにRegexp.new("abcde")とすればOKですか?
それともグローバル変数みたいなものに格納しないとキャッシュと
しての効果は出ない?



867 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:12:20 ]
式展開を含まないならどうでもいい

868 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:18:17 ]
>>866
irb> class RegData
def reg1; /abc/; end
def reg2; /ABC/; end
def reg3; /123/; end
end
irb> RegData.new.reg1
/abc/
irb> RegData.new.reg1.object_id
537973880
irb> RegData.new.reg1.object_id
537973880
irb> RegData.new.reg1.object_id
537973880

ということで、静的な正規表現は、クラス定義が読み込まれた時点で使いまわしモードに入る
 @re_scan = /xxxx.+?(yyy)zzz+/i
のようにクラス変数に正規表現を保管するというようなよくあるテクニックは、
正規表現が静的である場合に限り、コスト上は実は無意味、あるいは参照コストのぶん損だったりする
>>867の言うように、式展開を含むような「毎回違う可能性のある」正規表現はこの限りではない

869 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:20:32 ]
>>866
/abc/ なら毎回生成されることはない。
/ab#{var}cd/ や Regexp.new("abcd") なら毎回作成される。
あとは
CACHE_REGEXP = {}
def cache_regexp(str)
 CACHE_REGEXP[str] ||= Regexp.new(str)
end
とか。


870 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:42:43 ]
>>864
公式のチュートリアル。
あとWxWidgetsのサイト全般と公式のAPIドキュメント。

wxに限ったことではなく、既存ライブラリのRubyバインディングは
元ネタのサイト漁るのが一番いいと思う。

871 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:57:40 ]
>>870
読んでみたんですが、すでに???状態です。
英語ワカンネじゃなくてそもそも読む気力がないのが大問題だったりするわけですがorz
今度気力が回復したらやってみます



872 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:09:11 ]
わかんなくてもコードコピペしてたら何となく動くし
それでもダメならWxWidgets関連のサイト参考にって>>870の2-4行目で

873 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:15:24 ]
>>872
ええ。一応その段階はある程度OKです。
あとはゆっくり亀のように進んでいけばいいんです。
解決しました。ありがとうございます。

874 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:23:24 ]
>>864
harukaze wxPython で検索

あと、解説サイトじゃないけど
wxRuby開発者が出してるwxsugarオススメ

875 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:49:02 ]
>>874
たぶん言ってるサイトはこれだと思うんだけど、
www.harukaze.net/~haruka/wxpython/index.html
なんかドメイン飛んでるよ
Pythonのが参考になるっつーことは理解できたけど。

876 名前:866 [2008/11/09(日) 15:29:30 ]
>>867-869

ありがとう、よく分かりました。

877 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:22:19 ]
>>859
>NFS上でのロックは不可能。
ほう、そうなのか。知らなかった。さんくす。

>fcntlを使えばNFSでロックすることは可能になるがIO.ioctl関数という
>可搬性が低いメソッドを用いなければならず(まずWindowsなら実装されていないと
>門前払い)かなり面倒。
Windows上でNFSを使うことはないだろうから、ioctlはUNIX限定でいいんじゃね?

>おまけにたいていNFS上でのロックはセキュリティホールに
>なるので使えないのが普通。
これよくわかんないんだけど、理由は?参考になるURLプリーズ。

>>860
>レンタルサーバだと、flockが明示的に禁止されているサーバがある。パンドラとか
これも理由がわからん。レンタルサーバでNFS使ってるわけじゃないだろうし。なんで?

878 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:31:11 ]
>>877
ttps://menu.pandora.nu/public/flock.php
パンドラ側の説明みつけた

879 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 00:06:10 ]
超絶初心者な質問で申し訳ないんですけど、RubyScript2Exeでexeファイル作りたいんですけど上手くいきません。
使い方は、RubyScript2Exe.rbとexeにしたいファイルを同じフォルダに入れて、
コマンドプロンプトで、「ruby [RubyScript2Exeのパス] [exeにしたいファイル]」
で合っていますか?

880 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 07:32:00 ]
>>878
サンクス。あきらかにNFS使ってるね。
そんなサーバがあることに驚いたけど。

881 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 07:50:04 ]
つまりflock前提として、最適なロック方法は
「まずIO.ioctlでロックを試みる、エラーが出ればrescueしてflockする」ということか!

・・・面倒だ
やっぱり、完全に可搬性のあるファイルシステムロック用のライブラリが欲しいな



882 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 08:19:04 ]
「完全に」とか簡単に言っちゃう人って頭悪そう。

883 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 08:36:33 ]
不完全or不安定なライブラリがほしいって言うのもなんだと思うが

884 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 08:49:34 ]
欲しい欲しい、して欲しい。

885 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 09:14:19 ]
RAAやRubyForgeをざっと探してみたけど、ファイルロック用のライブラリらしきものが見当たらない
実はみんな、あまり必要としていないのか?

MLでこんな古い話は見つけたが、ソースコードはもう公開されてないっぽい
(時間ないから詳しく探してないけど)
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/11326

886 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 09:50:16 ]
本来、ファイルロックみたいにべったり環境依存なものに、完全な可搬性を求める発想が普通は余りないんだよね。
とはいうものの「環境依存だから諦めろ」ってのも古い考えで、こういう操作こそ処理系で環境差異を吸収しろ、っていう意見も、確かに一つの見識だと思う。
というわけで、完全な可搬性を持ったファイルロックの実装をコントリビュートしてくれ。

887 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 09:54:31 ]
あんまり気にしたこと無かったけど、makeするあたりで
良きに計らってくれるとよさそうな感じだね

888 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 15:07:35 ]
flockが使えるかどうかがファイルシステムに依存する以上、
コンパイル時に判定するのは無意味じゃないか?


889 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 17:32:32 ]
>>886
SQLが使えるなら簡単な表を作って、そこに1つだけレコードを追加して、
あとはSELECT FOR UPDATEかSELECT LOCK IN SHARE MODEで終了。
幸いSQL用のライブラリは普通に配布されてる。
SQLが使えない場合はやり方を工夫するしかないわけなんだが。
とりあえずパンドラさんのPerlライブラリを解析するしかなさそうだけど。
>>881
むしろ順番は逆のほうがいい。ioctl関数はどちらかといえば汎用関数。
ioctlが使えないのはほぼ例外なくWindowsで作られてるサーバー。

890 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 17:34:51 ]
RuBBSになんかあったな、ロック用のモジュール。
これの可搬性はどうなんだろう。

ttp://www.google.com/codesearch?hl=ja&q=lang:ruby+lock.rb+RuBBS+show:GN3bH3qHRek:P3zWR8HHuh8:MtDFtjKjkEI&sa=N&cd=2&ct=rc&cs_p=www.spc.gr.jp/software/archive/rubbs-1.0.7.tar.gz&cs_f=rubbs-1.0.7/lock.rb

891 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 17:53:13 ]
>>890
この関数の流れは…
1.ロックファイルを固有ファイルに名前を変えようとする。成功したら3へ
2.失敗したらタイムアウトより古いロックファイルがあればロックを取得しようとする。
成功したら3へ
3.1秒待って1へ戻る。ただしtry回試して失敗したら打ち切り
4.ロックを取得できていなければLockError例外を発生させる
5.ブロックをともなって呼び出されていた場合そのブロックを実行する。
そしてロックを解放する

ロックの解除は普通に元のファイル名に変更するだけ。

汎用性はかなり高いと思われる。レースコンディションを検討しても
まずないだろうと考えられる。ファイルのリネームができないサーバーは
まずないだろうからその面でも問題はない。



892 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 18:01:12 ]
ただし、このプログラムを使う場合、GPL2が適用されるので
それを使ったソースの配布もGPL2を用いなければならず、
そこが唯一の問題だったりする。逆に言えば、GPL2で
配布する予定のプログラムならぜんぜん問題はないといってよい。

893 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 19:05:10 ]
>>892
自分で書き直せばいいんじゃね?


894 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 22:36:42 ]
アトミックな処理(シンボリックリンクの作成とか)を利用したロック方法は
それなりにノウハウが枯れきっている話題だし、自分で実装しちゃえばいい。


895 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 07:21:48 ]
試しにファイルシステムロック用のライブラリを書いてみた(不完全)
mkdir方式で共有ロック・排他ロックの区別あり
ttp://eload.run.buttobi.net/cgi-bin/img/e_260.zip

ロック検出→ロックディレクトリ作成の間に
明らかなレースコンディションがあるんだけど、解決の方法が思いつかない・・・
何かいい解決策はないだろうか

896 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:34:09 ]
すでに存在するディレクトリを指定したときにエラー返らないんだっけ?

897 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 13:20:39 ]
Perlだけど解説は参考になるかな
www.din.or.jp/~ohzaki/perl.htm#File_Lock

898 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 21:36:28 ]
>>896
Errno::EEXIST

899 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 08:41:51 ]
改良版。レースコンディションは無くなった……と思う
その代わり1回のロックで2つのディレクトリを作るため、効率はやや悪い
ttp://eload.run.buttobi.net/cgi-bin/img/e_261.zip

>>896
共有ロックだと、複数のロックを同時にかけられるから
「まずmkdirしてみて、失敗するならロックされている」という検出方法が使えなかった

900 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 16:44:54 ]
ボロボロじゃん。
教科書に載るようなちゃんと知られたアルゴリズムを調べて書いた方がいいと思うよ。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<256KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef