[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 05/09 18:31 / Filesize : 81 KB / Number-of Response : 296
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

Ruby 初心者スレッド Part 18



1 名前:デフォルトの名無しさん [2008/02/22(金) 14:31:31 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.6 の使用を強くお勧めします】

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

237 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 15:27:12 ]
はあ?YAMLやJSON使うなら手軽だしコードが汚くなることもないじゃん。
ちゃんとメリットあるものを紹介してなにが悪いの?

238 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 15:36:34 ]
net/httpについての質問です。
対象ページの[keywords][description]を取得したいのですが
http.getで返ったボディを正規表現で抜き出す以外によい方法はないでしょうか?
宜しくお願いします。

239 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 15:43:58 ]
>>237
236じゃないが、
突っ込む前と取り出した後に処理がいらうってとこの
面倒くささは大して変わらないじゃん。
CGI::Session::YAMLStoreとかをこさえて使うなら
アリだろうけど。

240 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:06:45 ]
>>238
[keywords][description] というのが何を指してるのかイマイチよーわからんが

<meta name="keywords" content="Ruby,初心者,プログラミング" />
<meta name="description" content="プログラミング言語Rubyの初心者が集うスレです。" />

というようなののことを指してるのだと勝手に解釈

特定のページのkeywordsとdescriptionの2つにしか興味がないというのなら、
特定のページ専用の正規表現で最初にマッチする文字列を抜き出すのが素直だし時間もかからない

どんなページのどんな変態HTMLが来るのかわからないというのなら、HpricotとかのHTMLパーサを使うといい

241 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:39:04 ]
>>240
レスありがとうございます。
おとなしく正規表現で取得しようと思います。

242 名前:デフォルトの名無しさん [2008/03/08(土) 19:52:15 ]
変数名を代入した変数を使って新しい変数を作るにはどうしたらいいですか?
PHPで言う$$var = 'value'
みたいなことをしたいのです

243 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:33:46 ]
そんな曲芸みたいな処理は本当に必要なのか?

244 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:04:35 ]
インスタンス変数ならinstance_variable_get/setで出来ることはできる。


245 名前:デフォルトの名無しさん [2008/03/08(土) 22:05:57 ]
Threadで引数に渡した値はthread内のローカル変数として使われて、他のスレッドの影響を受けないというような事が書いてありますが、つまりこういう事なんですか?

foo = 1
a=1
Thread.new( foo ){ | bar |
bar += 10
a += bar
hoge = a
}

この場合、barの値は他のスレッドの影響は受けないが、aは他のスレッドの影響を受けて値が変わってしまう。

bar は常に11が入っている状態になるが、aは他スレッドの影響を受けた場合、11とは限らない。

影響を受ける変数とそうでない変数との違いがいまいち分からん・・・。



246 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 22:45:41 ]
え、単なる変数のスコープの問題なんじゃないん?

247 名前:デフォルトの名無しさん [2008/03/08(土) 23:19:54 ]
え、そうなん?
ちょっと考えてみる。。。

248 名前:デフォルトの名無しさん [2008/03/09(日) 00:09:29 ]
あ、ブロックの問題か。
他のスレッドの影響を受けるような物って、どうやって作るんだ。
あれあれ。

249 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 00:21:16 ]
リファレンスの例がそのまま分かりやすいと思うけど

for i in 1..5
# スレッド内のiが書き換わる可能性がある
# Thread.start { p i }

# スレッド固有のローカル変数になる
Thread.start(i) {|t| p t }
end


250 名前:デフォルトの名無しさん [2008/03/09(日) 01:04:04 ]
それはブロックの問題にならないのか。。

#1
foo = 1
Thread.new{
foo +=10
}

ってのと
#2
for i in 1..5
Thread.new{ p i }
end

って両方ともスコープの問題なように思えてしまいます。
#2は他スレッドの影響で i の値が変わるのではなく、外側のスコープの
i が変わっているから変わってくるのでは?
#それともそういうつもりで書かれたんですかね。





251 名前:デフォルトの名無しさん [2008/03/09(日) 01:25:56 ]
ThreadのMutexの使いどころって言うのは、

1同じスコープを共有している
2同時に実行されている処理がある

1、2が当てはまる場合で、かつ2の両者が同じ変数をアクセスする際に
Mutexは使うべきなんだと思うんですが、スレッドの処理がまるまるメソッド化
されている場合はそもそも1が当てはまらないから、Mutexは必要ない
って認識でOKですか?

#ex.
i=0
th = []
def thread_run
puts i
end

1000.times{
th.push Tread.new{ thread_run }
}

while true
i += 1
puts i
end


252 名前:250 [2008/03/09(日) 01:30:13 ]
いや、やっぱ

for i in 1..5
 Thread.new{ p i }
end

は他スレッドの影響を受けているのか。
そう公式リファに書いてあるもんなw

他スレッドの影響で i が書き変わって、
かつ、i はブロックの外側のスコープだから
影響を受けてしまうっちゅーことか。

253 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 08:35:45 ]
スレッド生成した直後にスレッドの処理が終了するようなテストじゃ
よそのスレッドの影響受けてるかどうかもわからんだろ
for i in 1..5
 Thread.start(i) {|n| sleep(n) ; puts 'i = %d : n = %d'%[i,n] }
end

254 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:05:40 ]
「特定のWebサイトにある特定の動的HTMLを取得して解析してデータを蓄積・別途表示するよスクリプト」
というありがちなものを頑張って作ってます

で、最近微妙にスレでも話題なRSpecとか使ってテストとかしようと思ったんですが、
「Webサイトに接続してHTMLを取得するかわりにローカルのHTMLファイルを読み込ませたい」です
定番の書き方とか方法とか考え方とかありますか

255 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:21:39 ]
>>253
でたなsprintf厨



256 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:27:34 ]
>>255
でも文字列への埋め込みよりは論理的にも見える
ていうか指示子覚えちゃったら結構どっちもどっちだよね

257 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:47:32 ]
>>254
とりあえず
「アクセス用URIを作るクラス」
「URIを引数で受け取ってHTMLを取得しそのまま返すクラス」
「HTMLを引数で受け取って解析しデータ構造にして返すクラス」
「データを引数で受け取ってDBとかに保存するクラス」
とか細かく分けるんだ

258 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:56:12 ]
>>253 がそうかは知らないけど
Python 使ってると Ruby でもそう書きたくなる
5.times じゃなくて for i in 1..5 してるのもそれっぽいと感じた
関数のカッコも省略してないし

259 名前:デフォルトの名無しさん [2008/03/09(日) 18:57:30 ]
Rubyのライブラリリファレンス本て結構いい値段するけど
ネットで見れるマニュアルに比べてのアドバンテージって何ですか?
検索も出来ないし、買う意味あるのかなーと思うんですが。

260 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 18:59:25 ]
結局はwindowsのHTMLヘルプが一番いいね

261 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:01:28 ]
>>259
金光編のなら、持ってますが、買う価値ないです。


262 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:10:21 ]
>>259

・ まじめな意味でお布施
・ オンラインヘルプの利用ができない環境向け
・ 安くない本を買ったんだからと自分を追い込む用

263 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:17:12 ]
return self
(returnなしでも桶)の効用がわかった気がする

264 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:24:33 ]
半年前の自分のスクリプトはいい意味でも悪い意味でも読めないよね
Perlでの妙な凝りっぷりほどじゃないけどさ

265 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:41:28 ]
ちょっと聞きたいんだけど、

irb(main):001:0> require "kconv"
=> true
irb(main):002:0> puts "シーソーゲーム".kconv(Kconv::UTF8, Kconv::SJIS).kconv(Kconv::SJIS, Kconv::UTF8)
シーメ[ゲーム
=> nil

ってやると元通りのものが帰ってきてくれないのはなんでなんだぜ?



266 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:02:55 ]
rubyのバージョンとかは?

267 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:05:05 ]
バージョンあんま関係ないと思うぞ
irb> p "シーソーゲーム".kconv(Kconv::UTF8,Kconv::SJIS)
"\343\202\267\343\203\274\343\203\241[\343\202\262\343\203\274\343\203\240"


268 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:09:06 ]
それ単純に$KCODEが適切じゃないだけだと思う
puts "シーソーゲーム"でもシーメ[ゲームって出力されるだろ多分

269 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:23:12 ]
$KCODEのデフォルトは日本語環境のWndowsであろうが、NONE


270 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:24:20 ]
>>266
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

>>268
ぬぉほんとだ
勉強不足だったみたいだ 調べてくるありがとー

271 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:02:16 ]
すまんもーいっこ聞きたいんだけど、ある変数ではSJISで、ある変数ではUTF8で持つとかってできないの?

test = "シーソー"
puts test.kconv(Kconv::UTF8, Kconv::SJIS)

で、ruby -Ks hoge.rb とかすると意図した通りUTF8で"シーソー"って出てくるけど、$KCODE = "SJIS"とかだとうまく動いてくれんのだが…
2種混在とか無理なのか?

272 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:10:17 ]
>>271
できるよ
というかStringオブジェクト自体には文字コードの情報は付記されてない
内容を表示したり正規表現にマッチさせたりするときに利用メソッド側で改めて調べてる

273 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:24:28 ]
>>272
そうなのかー
リファレンス見ると、KCODEが影響するのは
* インタプリタの字句解析器 etc
って書いてあるけど、これって例えば
test = "シーソー"
の "シーソー" を評価するときにKCODEを元に評価してtestに代入するってこと?

つか
$KCODE = "SJIS"
test = "シーソー"
puts test
ってやっても文字化けるのが納得いかん
irbとかでやると化けずにでるのも意味がわからん…

274 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:35:55 ]
#!ruby -Ks
test = "シーソー"
puts test

275 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:38:31 ]
>>274
それでちゃんとできるのは知ってる
$KCODEだとできたりできなかったりするのが不思議な昨今です



276 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:41:34 ]
>>273
あ、悪い、$KCODEについては誤解がけっこう蔓延してる
$KCODE='s'はRubyスクリプトだから、これが解釈されるということは既に実行済みってことでそのファイルについては手遅れなんだ
(それ以降にrequireとかで読み込んだファイルは$KCODEにしたがって解釈してくれる)

スクリプトの先頭からShift_JISだと認識した上で読み込んで実行してくれないと困るので、普通は-Ksを使う
Windows版Rubyでも、 1行目に
#!ruby -Ks
とか適当に書いておくだけで、スクリプト解釈前(構文木生成前)に適当に解釈してくれる

スクリプトを読み込む
    ↓ -Ks の出番
スクリプトを解釈する
    ↓
プログラムを実行する
    ↓ $KCODE='s' の出番


277 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:48:52 ]
スクリプト中に書き込まれた日本語文字列に駄目文字がなければ
$KCODE='NONE'(つまり #!ruby -Ks 無し)でも動くんだよ
駄目文字があった場合はうまく動作しない
Ruby作者さんも言っとる

ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/41939
> まつもと ゆきひろです
> |あまりよい解決方法ではないかもしれませんが,二行目に
> |$KCODE='SJIS'
> |とするとruby -Ksと同じ挙動になると思います.
> |
> |#!/usr/bin/env ruby
> |$KCODE='SJIS'
> |
> |のような感じでどうでしょう.
>
> 残念ながら「$KCODE='SJIS'」の解釈は実行時に行われるので、プ
> ログラムの読み込みを行う時点での処理が行われません。たとえば
> ソースコードがSJISであった場合に文字列中の「表」などの処理が
> 適切に行われないことになります。


278 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:21:01 ]
require したファイルの名前って一覧できますか。


279 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:23:14 ]
>>278
irb> p $"
["irb.rb", "e2mmap.rb", "irb/init.rb", "irb/context.rb", "irb/workspace.rb", "irb/extend-command.rb",
"irb/ruby-lex.rb", "irb/slex.rb", "irb/ruby-token.rb", "irb/input-method.rb", "readline.so", "irb/locale.rb",
"kconv.rb", "nkf.so"]


280 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:25:29 ]
>>278
$" ($LOADED_FEATURES)



281 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:27:09 ]
>>279,280
さんくすです

もいっこ質問。
PHPとRubyとで、Webアプリのセッション情報を共有することはできますか。

282 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:28:59 ]
>>281
テキストでファイルに保存あるいはテキストベースで遣り取り可能ならできんじゃね

283 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:36:49 ]
memcachedとかでもイケそう。


284 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:51:30 ]
セッション情報って別に形式決まってないよな

285 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:44:58 ]
>>276
そうなのかー
$KCODE = "SJIS"を読んだ時点で設定が変更されんのかと思った
つーことはファイル毎に文字コードの設定が可能ちぅことか

>>277
ソースまで発掘してもらって申し訳ねぇ
でも2行目でやればいいってのはなんでなんだろう?
Rubyってインタプリタなんじゃないの?
読み込んだ片端から逐次実行なんじゃないの?
わかんねー



286 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:09:27 ]
1.8は構文木、1.9は中間コードに一旦変換してるが、インタプリタには違いない
ttp://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF

287 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:14:18 ]
1. -Kオプションを解釈
2. パース
3. 実行

ソース中の「表」とかが問題になるのは2の時点、
$KCODEへの代入が実行される3の時点では手遅れ

288 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:32:56 ]
>>286-287
全部一旦構文木にしてから実行すんのか?
Rubyって前方宣言じゃなかったっけ?

前方宣言だよなぁ→読み込み即実行だよなぁ→$KCODEに値代入した時点で即有効になる気がするよなぁ
っていう発想なんだが…

289 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:42:34 ]
宣言してるというより実行時に作り上げてるだけ

290 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:01:50 ]
なんか勝手な前提で色々考えてる感があるが…
$KCODE = "SJIS"
↑これだって単なる代入式なんだから実行されるまで作用しないだろ。

前方宣言どころかクラス定義やメソッド定義まで実行文だぞ。

291 名前:デフォルトの名無しさん [2008/03/10(月) 06:51:16 ]
配列自体をeachで変更したいのですが、どうしたらいいですか?
破壊的メソッドは!を付けるので
each!とかやってみたのですが駄目でした

292 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 07:00:14 ]
>>291
要素数が同じでいいなら普通はmap!やcollect!を使う

irb> arr = [1,2,3]
irb> arr.map!{|e| e*2}
irb> p arr
[2, 4, 6]

293 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 07:04:59 ]
>>292
おお!ありがとうございました

294 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 07:19:01 ]
mapでの写像を覚えるとRubyコードのステキ度が100単位でアップするので超お勧め

「配列の要素をひとつずつ取り出して計算してひとつずつ格納する」から
「ある配列にブロックを作用させてもうひとつの配列を作る」という思考と記述が自然に行えるだけで超絶パラダイム
昨日までの小学生レベルのプログラムの勉強とはオサラバよオ・サ・ラ・バ

295 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 16:36:07 ]
WinXPで音声編集をできるライブラリがあったら教えてください。
RAAを見た限りではなさそうですが。

1. 1秒以上の無音部分で音声ファイル分割
2. file1とfile2を、間に1秒無音部を入れて結合

というような事をやりたいです。









[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<81KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef