トップページ⇒tech
983コメント375KB

Ruby 初心者スレッド Part 41

■ このスレッドは過去ログ倉庫に格納されています
0001京 ◆SsSSsSsSSs 2011/02/10(木) 13:47:51
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0429デフォルトの名無しさん2011/03/09(水) 23:41:14.14
>>428
なるほど。やってみた

`set_encoding': ASCII incompatible encoding needs binmode (ArgumentError)

テキスト読むのにbinmodeにしろとか気持ち悪いね
BOM, $/ともども手当てしてあってもおかしくないんだけど
0430デフォルトの名無しさん2011/03/10(木) 00:03:48.58
NoMethodError: undefined method `to_utf8' for "\343\201\277\343\201\213\343\202\223":String
(#^ω^)ピキピキ
0431デフォルトの名無しさん2011/03/10(木) 00:07:24.88
(::゚∀゚::) そんなにピキピキしてないで俺でも食えよ
0432デフォルトの名無しさん2011/03/10(木) 00:07:52.94
$/ をケアするとして、こいつはあいにく特定のIOに結びついたものでは
ないので、やるとすれば、getsが毎回その時点での $/ を対象IOの
エンコーディングに合わせて変換することになるんだろうな。

IOインスタンスごとに line_delimiter みたいなプロパティを用意して、
デフォルトがそれになるようにするのがよいのかもしれん。
あれ、ないんだっけ…?

0433デフォルトの名無しさん2011/03/10(木) 00:12:40.29
getsはデリミタとして使用する文字列を引数にとるだろ
まったく試してないが gets("\r\n".encode('UTF-16LE')) でいけるはずだ
あと>>428はマカー
0434デフォルトの名無しさん2011/03/10(木) 00:38:45.19
WebKit通すとバックスラッシュが yen になっちまうからばれるんだよね…
04354232011/03/10(木) 00:51:17.63
改行の読み込みはデリミタ指定でうまくいきました。ありがとうございました。
BOMはとりあえず見てみぬふりをします。

# coding: utf-8

$stdin.binmode # バイナリモードでないとエラー :in `set_encoding': ASCII incompatible encoding needs binmode (ArgumentError)
# $stdout.binmode # バイナリモードだと改行が<LF>

$stdin.set_encoding 'utf-16le'
$stdout.set_encoding 'utf-16le'

while row = gets("\r\n".encode('utf-16le'))
p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10, 0]
 print '#', row.chomp, "\n" # <CRCRLF>対策
end
0436デフォルトの名無しさん2011/03/10(木) 01:08:58.29
BOMについてはまともに対応しようとすると大変らしいので(よくわからない)、
とりあえず$stdinを2バイトseekしてから使い始めとけばいいんじゃないかな。
0437デフォルトの名無しさん2011/03/10(木) 01:15:35.90
なにその誤爆するまで前進
0438デフォルトの名無しさん2011/03/10(木) 07:52:45.66
IO#getsだとちゃんと改行を読むね
open('hoge','rb:UTF-16LE') do |io|
while row = io.gets
p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10, 0]
end
end
p $/ #=> "\n"

Kernel#getsの不具合なのかな
0439デフォルトの名無しさん2011/03/10(木) 08:07:06.44
それと、Ruby1.9.2だとBOM判別、読み飛ばし機能が付いてた
open('hoge','rb:BOM|UTF-16BE') do |io|
while row = io.gets
p row.each_byte.to_a #=> [ 97, 0, 98, 0, 99, 0, 13, 0, 10, 0]
p row.encoding #=> #<Encoding:UTF-16LE>
end
end

openのモード指定でexternal-encodingがUTF系のときBOM|をつけると
BOMを判別してエンコーディング決定&BOM読み飛ばし
BOMがなければ指定されたエンコーディングに

1.9でIOのクラスメソッドが ハッシュ引数をとるようになったので
IO.foreach('hoge',mode:'rb:BOM|UTF-16LE'){|row| p row.each_byte.to_a}
とかできる
でも
IO.foreach('hoge',binmode:true, external_encoding:'BOM|UTF-16LE')
みたいな external_encodingでの指定は効かなかった
対応し忘れ?
例によってドキュメントないけどorz
0440デフォルトの名無しさん2011/03/10(木) 08:26:13.93
> mode:'rb:BOM|UTF-16LE'

やっぱこの記法キモいわ
あ、でも1.9専用って示すのにはいいかも
0441デフォルトの名無しさん2011/03/10(木) 18:19:42.88
>>438-439
ほう……俺が考え付くようなことは既に実装されてるんだね

>>440
一瞬新しいハッシュの記法かと思った
0442デフォルトの名無しさん2011/03/11(金) 07:46:49.98
>>441
新しいハッシュの記法だと思ってた。
ハッシュじゃないならmode:の部分がベアワードでエラーになりそうな気がするから。
0443デフォルトの名無しさん2011/03/11(金) 14:13:43.92
Ruby初心者を脱した自覚くらいはあって、
これからかっこいい中級者になりたいなと思ってるんだけど、
そのために必要なぷろぐらみんぐちしきとかを勉強できる本とかないもんですかね
っていうか足りない知識ってなんだろう
0444デフォルトの名無しさん2011/03/11(金) 14:18:06.57
デザインパターンとかリファクタリングとかあのへんの本を読むと、今なら面白いかも
あとソフトウェアテスト関係
Webに関連する生活をしてるならHTTPのRFCとか

他人のライブラリソースを読むのもいいけれどね
0445デフォルトの名無しさん2011/03/11(金) 14:27:16.65
配列内の要素をソートしたいのですが、方法が分かりません。

具体的には、scoreというインスタンス変数を持ったBookクラスがあり、
このBookクラスのオブジェクトの配列book_listがあるとします。
book_list内のBookオブジェクトをscoreの高い順に並び替えたいのですが、
自分で考える限り、以下のような感じで力尽きます。

sorted_book_list = []
book_list.each do |b|
sorted_book_list.each_with_index do |sb, i|
if b.score > sb.score
# i番以降の要素を全て一つ後ろにずらす処理がここで必要だが実現できたとしてもパフォーマンスが酷そう。
sorted_book_list[i] = b
break
end
end
end

もっとスマートな方法があれば教えて頂けないでしょうか。
0446デフォルトの名無しさん2011/03/11(金) 15:00:13.72
sorted_book_list = book_list.sort {|a, b| a.score <=> b.score }
0447デフォルトの名無しさん2011/03/11(金) 15:34:37.78
Perlだとハッシュテーブルの配列の大きさを

keys %hash = 64;

と指定できるのですが、Rubyにもそういう機能はありますでしょうか?
0448デフォルトの名無しさん2011/03/11(金) 15:37:39.50
>>445
book_list.sort_by {|book| book.score }

>>447
残念ながらない
0449デフォルトの名無しさん2011/03/11(金) 15:48:19.11
>>448
ないですか。
�d
04504452011/03/11(金) 23:34:16.09
>>446
>>448
ありがとうございます!
まさに求めていた機能です。勉強になりました。
0451デフォルトの名無しさん2011/03/15(火) 11:20:01.58
>>444
GoFなデザインパターンは、Rubyみたいな後発で動的で完全オブジェクトで
プロックとブロックが跋扈してるような言語ではあまり新鮮な有り難味がないかも
「あーこれ名前ついてたんだー」とか思うことがしばしばある
0452デフォルトの名無しさん2011/03/15(火) 18:10:19.84
ちょっとjavascriptに浮気してくる。
ウェブサイトに必須のようだから。
0453デフォルトの名無しさん2011/03/17(木) 20:02:07.00
0から99までの数字の配列が欲しいのですが、

i = [0..100]
puts i

とやっても期待した結果が得られません。
(実行結果=[0..100])
配列をバラバラにして取得するにはどうすればいいでしょうか?
0454デフォルトの名無しさん2011/03/17(木) 20:06:49.06
(0..100).to_a
0455デフォルトの名無しさん2011/03/17(木) 21:05:24.01
0..100 だと 0, 1, 2, ..., 98, 99, 100 になる。
末尾を含まないRangeは 0...100 (ドット3つ)
0456デフォルトの名無しさん2011/03/17(木) 21:40:39.05
>>453
(0..99).to_a だな
Range クラスというのがある
開始と終了と succ メソッドの返り値(と比較メソッド)だけ見てる変なクラスだ
0457デフォルトの名無しさん2011/03/17(木) 21:44:20.33
to_a する方法はいろいろあるけど、元のコードに一番近いのは
それよりもこれじゃないかと思った。

[*0..99]
0458デフォルトの名無しさん2011/03/17(木) 23:00:58.58
[*0...100]
0459デフォルトの名無しさん2011/03/18(金) 00:55:26.51
あんまり話題としては取りざたされないけど
Rangeクラスって、Rubyの特徴的な機能の一つだよね

これも何かほかの言語にあった機能を、Rubyが取り込んだものなんだろうか
0460デフォルトの名無しさん2011/03/18(金) 01:05:24.55
状態を持つ演算子としての .. (...) は Perl 由来。
その状態をRuby以前にオブジェクト化したものがあるかは生憎知らない。
0461デフォルトの名無しさん2011/03/18(金) 10:05:59.40
>>453
>i = [0..100]
>puts i
これは
r = 0..100
i = [r]
と同じである、つまり
・「0..100」というRangeオブジェクトが1つだけ入った配列
になる。
0から99までの配列の作り方は>>454以降を参照。
0462デフォルトの名無しさん2011/03/18(金) 16:10:31.92
Perlだと範囲演算子はリストに展開するからRubyも同様と思ったのかも
0463デフォルトの名無しさん2011/03/18(金) 18:36:28.23
何をするかにもよるが、Rubyの場合Rangeのまま使っちゃうのもアリ
Rangeもイテレータ呼んだり出来るからね
0464デフォルトの名無しさん2011/03/18(金) 18:59:06.05
0..9.to_a

って書けるようになったんだっけ?
1.9で演算子?の優先順位が変わったとか。
代わってないか。
0465デフォルトの名無しさん2011/03/18(金) 19:01:44.69
変わってないからみんな括弧つけてるじゃん。
0466デフォルトの名無しさん2011/03/18(金) 20:17:55.76
有理数のリテラル
0467デフォルトの名無しさん2011/03/18(金) 22:18:53.23
> [*0..99]
これどういう意味?
0468デフォルトの名無しさん2011/03/18(金) 22:51:01.34
範囲オブジェクトをリストに展開
0469デフォルトの名無しさん2011/03/18(金) 23:04:00.96
to_aしてから展開する
[*1..3] == [1,2,3]

マニュアル見たら [*obj] の説明は無かったが
メソッド呼び出しの最後の引数に*をつけると、配列を展開して渡せる
それと同じことが 配列リテラルでもできる
[0,1,2,*7..9] == [0,1,2,7,8,9]

Ruby 1.9からは、ちょっと拡張されて
最後の引数だけじゃなくてどこでもよくなって、複数でも可能に
[*1..3,5,*7..9] == [1,2,3,5,7,8,9]
0470デフォルトの名無しさん2011/03/18(金) 23:47:42.59
一時期 to_splat というメソッド名があったのだが、今はないようだ。
0471デフォルトの名無しさん2011/03/19(土) 03:34:32.77
>ruby -E utf-16le -e "$stdin.binmode"
-e: ASCII incompatible encoding needs binmode (ArgumentError)
どうすれば?
0472デフォルトの名無しさん2011/03/19(土) 08:14:35.15
それあれだよね、中身としては binmode 以前の

$ ruby -E utf-16le -e ""
-e: ASCII incompatible encoding needs binmode (ArgumentError)

> ruby -E utf-16le -e ""
<internal:prelude>:3:in `require': incompatible character encodings: Windows-31J
and UTF-16LE (Encoding::CompatibilityError)

とか出るのをどうすればいいかという話だよね
0473デフォルトの名無しさん2011/03/19(土) 14:10:46.54
>>468-469
質問した人じゃないけど、すごくわかりやすいです。
横から�d
0474デフォルトの名無しさん2011/03/19(土) 14:44:21.99
まったくのRuby初心者ですが
Windowsユーザーの方に質問です
みなさんはどのような環境でプログラミングされていますか?
RDEやEclipse、NetBeans等いろいろあるので
どれを選択すべきか悩んでいます
意見を頂けないでしょうか?
0475デフォルトの名無しさん2011/03/19(土) 14:51:00.17
>>474
基本はVirtualBox上にLinux入れて、自前コンパイルをインストールした環境。
パッケージングシステムとgemの相性が悪いので…

んで、Windows上で使うものの時にはNetBeans + JRubyで。
rawrでexe化が出来るので…。Macのappも作れるよ。
0476デフォルトの名無しさん2011/03/19(土) 15:59:44.25
基本的にはエディタとコマンドプロンプトだと思うの
IDEがない時代に考えられた言語で、スクリプト単体で動作するように作られてるから

標準入力と標準出力をきちんと把握したあとで
(悲しいけどこれ最重要、IDEべったりの人はここで詰まる)
IDEがサックサクの環境ならEclipseでいいんでないかね
NetBeansが次点人気
RDEはとりあえず初心者は捨てていい

あと、Javaや.netのような親切で高度で指一本な連携サポートはできないのでご注意
0477デフォルトの名無しさん2011/03/19(土) 16:07:19.44
RubyをIDEで始めてしまうと、実際のスクリプトの実行方法がよくわからないことになるからな…
IDE上からは実行できるんですが普通に使う方法がわかりませんというのはFAQに近い
エディタとコマンドプロンプトで作って、ある程度納得してから進む道決めたほうがいいかもしれん

うまい教科書があるといいんだけど
0478デフォルトの名無しさん2011/03/19(土) 16:10:44.33
その手の根性主義はもう流行らないと思う
0479デフォルトの名無しさん2011/03/19(土) 16:15:33.40
だって、IDEのRubyサポートって初心者に全然優しくないもの
あんなものを最初に触らせること自体「俺ならできる、だからお前もやれ!」という体育会系の思考だわ
0480デフォルトの名無しさん2011/03/19(土) 16:24:47.12
あれはJavaとかC++とかでEclipseやNetBeansを使い慣れている人が
Rubyでも似たようなことをしたいと思って使うもんだ

Ruby初心者には若干厳しく、統合開発環境初心者には鬼だ
そのへん見極めて勧めないと逆効果になりかねん
0481デフォルトの名無しさん2011/03/19(土) 16:36:06.27
意見を下さった方、ありがとうございました
0482デフォルトの名無しさん2011/03/19(土) 16:37:39.54
viとemacsどっちがいいの?
0483デフォルトの名無しさん2011/03/19(土) 16:49:36.59
宗教論争になるので両方試せ。
0484デフォルトの名無しさん2011/03/19(土) 17:24:16.66
Emacs → あの Emacs で Ruby スクリプトが書ける
Vim → あの Vim で Ruby スクリプトが書ける

メリットだと思うほう使え
04854712011/03/19(土) 17:32:37.82
>ruby -E utf-16le:utf-8 -e ""
で行けた
0486デフォルトの名無しさん2011/03/19(土) 17:35:27.03
>>485
それは要件満たしてるのか?
04874712011/03/19(土) 20:28:00.07
ok
0488デフォルトの名無しさん2011/03/19(土) 21:14:01.61
[1,2,3,4,5,6].each{|a,b| puts a,b}
で、12,34,56と消費するイテレータってないんですか?
[[1,2],,,というのはなしで
0489デフォルトの名無しさん2011/03/19(土) 21:18:30.87
each_slice
0490デフォルトの名無しさん2011/03/20(日) 02:00:07.70
30%の需要があるとのことなので、出てくるかと思ったが、出ないのね。
ありそうなので、探したんだけど、無いから自分で作った。
習い初めのものなので、つっこみはご勘弁。

# 多次元配列と文字列の複製
# dataの値を新しいアドレスを作成して複製
def copy(data)
if Array.try_convert(data) == nil
String.try_convert(data) ? data.dup : data
else
(0 ... data.size).map{|i|
copy(data[i])
}
end
end
0491デフォルトの名無しさん2011/03/20(日) 03:10:30.28
>>490
Marshal.load(Marshal.dump(data)じゃいやだったの?
0492デフォルトの名無しさん2011/03/20(日) 04:15:52.14
つっこみはご勘弁ってならなぜ貼ったのだろう
0493デフォルトの名無しさん2011/03/20(日) 06:58:31.33
誤爆だろ
多次元配列はRubyにはない
0494デフォルトの名無しさん2011/03/20(日) 07:15:53.69
アドレスもないしな

多次元配列自体は存在できないわけではないんだが、専用にクラス作らんといかんぬ
0495デフォルトの名無しさん2011/03/20(日) 13:28:18.96
Ruby の構造的仕様だな

obj[x][y][z] が

 obj[x, y, z]

ではなく

 retx = obj[x]
 rety = retx[y]
 retz = rety[z]
 return retz

というレシーバ依存のメソッドチェーンである時点で、もうどうしようもない
単純には諦めてネストした巨大な配列にするしかなく、実用的には NArray gem を使うとかしかないわ
0496デフォルトの名無しさん2011/03/20(日) 15:58:00.20
Python の NumPy みたいなものがあればいいんだよね?
0497デフォルトの名無しさん2011/03/20(日) 15:59:56.68
>>496
だから NArray ではご不満ですか
0498デフォルトの名無しさん2011/03/20(日) 19:00:14.35
本当の意味での多次元配列実現したいならクラス作っちゃうかな
0499デフォルトの名無しさん2011/03/20(日) 19:21:54.20
>>498
だ
0500デフォルトの名無しさん2011/03/20(日) 20:19:24.33
雑魚どもが
0501デフォルトの名無しさん2011/03/20(日) 20:57:00.75
ポインタと参照みたいなもんだから
そう刺々しくせずに生温かく見守ってあげてください
0502デフォルトの名無しさん2011/03/20(日) 22:06:39.16
多次元配列ではないというのは単に言葉尻の問題ではなく実際的な脅威
なんでわざわざ同じように間違えるまで放置しなければならないのかと
0503デフォルトの名無しさん2011/03/20(日) 22:19:45.81
いやだってary[0][1]はRuby使いにとってary[0]のそのまた[1]にしか見えないでしょ
どこが実際的な脅威なのか不明
0504デフォルトの名無しさん2011/03/20(日) 22:29:57.66
なんでもいいんだが、Ruby 次元配列 -"NArray" あたりでぐぐったのはほぼ全部
「ary[0][1]はRuby使いにとってary[0]のそのまた[1]にしか見え」てない実例だと思う
0505デフォルトの名無しさん2011/03/20(日) 22:41:55.58
ネストしただけの配列を多次元配列と呼んでいる時点で
「私Rubyわかってませんこれからここで勢いよく躓きますみなさん見ててください」
と言ってるようなもんだろ

m = Array.new(3, [])

と書いてあったら危険なのと同じ
それは違いますそれは動きませんと言ってあげること自体は非難されるべきではない(今回は言い方がアレだが)
なんでニヤニヤ笑いながら手を差し伸べずに眺めて失敗してから先輩風吹かせて「いやーそれはねー」とか言うの
0506デフォルトの名無しさん2011/03/20(日) 22:48:39.13
>>505
先生、それは単に参照とはなんぞやの問題です
多次元配列以前の問題です
0507デフォルトの名無しさん2011/03/20(日) 22:54:52.23
>>505
「ネストした配列は多次元配列ではない」というのは、
それと同様にtrap::Arrayに書かれていてもおかしくないと思う

>>506
たぶんこのレベルの話をしてる
ttp://www.ruby-lang.org/ja/man/html/trap_Array.html
0508デフォルトの名無しさん2011/03/20(日) 22:56:44.90
ていうかこれぶっちゃけバグだよね
誰も得しないだろ
0509デフォルトの名無しさん2011/03/20(日) 23:05:16.65
>>507
まさに参照の問題じゃない
同じオブジェクトを指すという
0510デフォルトの名無しさん2011/03/20(日) 23:17:12.97
うわあバカがいる
配列が出てこない str.gsub(/re/, '\1') とかにしたほうがよかったか
>>505は具体的な配列の動作の話してるわけじゃないぞ
0511デフォルトの名無しさん2011/03/20(日) 23:23:46.56
>>510
誰に言ってるかわからないからアンカつけれ
0512デフォルトの名無しさん2011/03/21(月) 11:48:09.04
>>480
IDEはIDEに慣れた人が使う開発環境だよ
特にRubyのようにIDEの利用者が少ないなら、JavaやC#のようにサクサク使えないのを分かった上でIDEに慣れた人が使うものだと思うよ
もしWindowsでC#やVB.netをvimやemacsで開発する人がいたらちと酔狂だなとは思うかもしれないが、慣れている環境というのを差し引くのは難しいよ

俺の結論も>>475なんだが>>474が初心者なら特に多くの人が使っていない開発環境を積極的に使う理由がないな
趣味でちょっとしたスクリプトを書くのなら何でもいいんだがな
0513デフォルトの名無しさん2011/03/22(火) 09:34:14.49
Windowsギライなジジイの押し付けがましい意見は参考にならない。まで読んだ
0514デフォルトの名無しさん2011/03/22(火) 10:47:09.45
Windows使いはさっさとNetBeans(RDEその他はよく知らないけど使い物になるなら何でもいい)入れとけ。
コード補完+ステップ実行+変数ウォッチできるだけでも開発効率が段違い。

ruby.exe+テキストエディタな環境と排他でもなんでもないから
IDEでパーツ作って残りは従来環境で仕上げてテストする事も普通にできる。

2011年にもなってIDEは是か非かなんてあまりにも不毛すぎるよ。
0515デフォルトの名無しさん2011/03/22(火) 11:22:11.43
5年後も同じ論争やってると思うよ。正解なんてないから。
0516デフォルトの名無しさん2011/03/22(火) 14:45:58.74
Amazonのレビューだと「たのしいruby」はプログラム自体が初めての者には難易度が高いとのことですが
そういった者に向く入門書はないでしょうか
調べてみると「Ruby1はじめてのプログラミング」が良いらしいですがこちらは如何でしょう
0517デフォルトの名無しさん2011/03/22(火) 15:53:07.01
>「たのしいruby」はプログラム自体が初めての者には難易度が高い
くっそー誰だそんなやたらピンポイントに的確なレビューしてる奴は
ttp://www.amazon.co.jp/product-reviews/4797357401/
提供する問題が若干独り善がりであるという指摘は前からうっすらあった
書き換えたの送ったら更新してくれるかなあ

Ruby1ってあれだよねピンクのガゼルの大きいやつ
ttp://www.amazon.co.jp/dp/4798117994/
Rubyの初心者向け薄い本は当人の当たり外れが大き過ぎるので
できれば事前に立ち読みとかしてマッチングしてもらえるとまいっちんぐなことにならないんだが

内容としては普通に初心者向けだと思う
…つまり、下手したら本の半分くらいが自分にとって不要な記述である可能性があるってことだけど
たのしいRubyより前に位置する本であることは保証するよ
1.9に関する記述がなかった気がするが、まあそれは必要になってから上乗せで勉強すればええ
0518デフォルトの名無しさん2011/03/22(火) 17:40:21.14
プログラミング自体の初心者なら

http://www.amazon.co.jp/dp/4873112923 これか
http://www.amazon.co.jp/dp/4798019437 これ
0519デフォルトの名無しさん2011/03/23(水) 11:33:45.48
「天気予報サイトの現在の予報マーク(↓こんなの)を表示するライブラリ」を作り、gem で管理したいです
ttp://i.yimg.jp/images/weather/general/forcast/clouds_sun_st.gif

この画像をローカルにキャッシュしたいのですが、ディレクトリをどこに置いていいのかわかりません
Otenki::Config とかクラスを作って、ユーザが事前に指定しない場合は動作しない、みたいなのがいいんでしょうか

 Otenki::Config.cache_dir = "/home/ch2/otenki/cache" # 必須
 Otenki.new.show

インストール先に勝手に gems/otenkiview-0.1.2/cache/ を作ってそこに一律保存する、みたいなのってよくないですよね?
0520デフォルトの名無しさん2011/03/23(水) 12:11:05.93
>>519
うーん、現在の天気を調べるクラスは別にいいんだけど
画像までライブラリに含むのはどうかと思うなあ
ライブラリ使う人が違う画像を使いたいと思ったらどうするの?
0521デフォルトの名無しさん2011/03/23(水) 12:18:48.81
本来なんて呼ぶのかわからないんだけど、
gems/libname-1.0.0/ のライブラリホームにスクリプトが書き込むのはよろしくないな
パーミッションの関係で書き込めないことが多いし、スーパーユーザーで書き込んだら上書きできない

永続的な設定ファイルとかをどうしようかというのはみんな悩んでるんだけどね
0522デフォルトの名無しさん2011/03/23(水) 12:26:35.20
ライブラリが書き込むディレクトリはユーザーに手動で指定させるしかあんめえ
いつのまにか $HOME/.otenki/cache/ みたいなのを作る糞ライブラリもあるけどな
0523デフォルトの名無しさん2011/03/23(水) 20:18:16.60
インストール時にgemが参照する第三者のリソースもディプロイしたい、
という話ではないのか。
↑なら post_install フックでやりゃいいんだけど。
0524デフォルトの名無しさん2011/03/23(水) 20:33:35.92
cache なので、たぶん

doc = Nokogiri.parse(open(天気予報サイト).read)
yohou_text = doc.at('今日の天気文字列').inner_text
mark_src = doc.at('img/今日の天気マーク')['src']
local_cache = @cache_dir + File.basename(mark_src)
File.open(local_cache, 'w'){|f| f.print(open(mark_src).read)} unless File.exist?(local_cache)

puts <<EOS
<title>今日のお天気</title>
<img src="file://#{local_cache}">
今日の天気は#{yohou_text}です!
EOS

とかやるんじゃないの
で、@cache_dir の初期値をどうしましょうと
ライブラリが共通で使うなら gem インストール時になんか適当に自動で GET すればいいじゃんね
0525デフォルトの名無しさん2011/03/24(木) 01:10:55.51
shareディレクトリとかどう?
Linux使ったことないから、こういう目的にshareを使って良いものなのかどうかわからないけど
0526デフォルトの名無しさん2011/03/24(木) 01:33:01.49
運用状況により容量可変となるディレクトリだから、shareじゃなくて、/var/libじゃね?

ただ、ふと考えてみたら、他のユーザーが使った後にはシステムデフォルトの画像が変わってるかもしれないって、
結構、嫌な仕様じゃね?
0527デフォルトの名無しさん2011/03/24(木) 05:14:06.81
お前らはWebブラウザのキャッシュをログインユーザー全員で使い回す気なのかと小一時間
まあ、そういうような共用読み書きディレクトリの指定方法がないのも確かなんだが
Webのキャッシュって言ったら普通はログインユーザーごとに個別だろ、普通は

意外とこのへんの基本設定のデファクトって固まってないのね
0528デフォルトの名無しさん2011/03/24(木) 05:28:34.06
ユーザーに設定で指定させるのが普通だろ
指定されてなかったらデフォルト使うのではなくエラーで止める

ユーザーが指定しなくても適当にクラスをnewしてgetするだけで
適当にホームにディレクトリ掘って永続保存してあら便利、みたいなのはキモいのでやめるべき
■ このスレッドは過去ログ倉庫に格納されています