[表示 : 全て 最新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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

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やってるなら、このくらい分かるだろ。
まずは「教えてください」という言葉を覚えような。






[ 続きを読む ] / [ 携帯版 ]

前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