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

152 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 11:44:14 ]
>>149が考えるところの「本スレ」のレベルに依存するな

153 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 18:15:48 ]
>>149
同意。

154 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 18:39:06 ]
あんなS/Nの小さいスレ
使ってられねーよ

155 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:00:41 ]
irb> s = '2'; case s; when /(1)/,/(2)/,/(3)/ then p $1 end
"2"

irb> s = '2'; case s; when Regexp.union(/(1)/,/(2)/,/(3)/) then p $1 end
nil

なんで?

156 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:07:39 ]
unionすると
/(1|2|3)/ になるのではなく
/(1)|(2)|(3)/ になって、
今回マッチしたのは(2)のとこだからグループとしては$2。
$1ではない。


157 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:16:53 ]
>>156
をを

…正規表現をコンマで並べても用が済むcaseでunionを使うのはめんどくさいっすな

158 名前:デフォルトの名無しさん [2008/03/01(土) 21:37:16 ]
nkf.guessやKconv.guessなんかを文字列にしたいんだけど、
この文字列の配列ってあらかじめ定義されてないんでしょうか?

文字コードの推測
www2u.biglobe.ne.jp/~MAS/ruby/CAB8BBFAA5B3A1BCA5C9A4CEBFE4C2AC.html

159 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:54:35 ]
ないっす
いわゆるエンコーディングの名称・略称を表示するようにはできてない

puts "#{str}は日本語EUCだよ!" if NKF.guess(str) == NKF::EUC

というような使い方しか想定してない模様

一応
irb> NKF.constants
["UTF8", "VERSION", "JIS", "UNKNOWN", "NKF_VERSION", "ASCII", "UTF32", "SJIS", "NOCONV", "AUTO", "REVISION", "UTF16", "EUC", "BINARY", "NKF_RELEASE_DATE"]
の結果をどうにかすればできなくはないけど、
自前で文字列対応テーブルを書いたほうがたぶん早い

160 名前:デフォルトの名無しさん [2008/03/01(土) 22:05:26 ]
>>159
サンクス >>158のページのようなのを使いまわすことにする



161 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:52:59 ]
net/httpで相手サーバがタイムアウトした場合の例外をキャッチしたいんだけど、
具体的に何の例外が発生するんですか?

というか、そのへんの情報ってどっかにまとまってませんか?

162 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:58:15 ]
手元の俺スクリプトの例

rescue Net::ProtoRetriableError,Net::ProtoFatalError,Net::ProtoServerError,Errno::ETIMEDOUT,TimeoutError =>ex
puts 'サーバーから応答がないので空データを使います'
return ''

正直、ドレが効いてるんだかよくわからん

163 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:04:24 ]
net/protocol.rbを見ると、ソケット生成(接続)や読み書きは
timeoutメソッドの中でやってるのでTimeout::Errorかな。
TimeoutErrorはこれの後方互換用。



164 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:10:11 ]
http.getに該当する部分から飛び出す例外を全部捕捉して
「よくわからんけど鯖がエラー返しましたエラー」にすれば桶

begin
res = open(uri).read
rescue
puts "#{uri.host}のサーバかそこへのアクセスで何かエラーです"
res = ''
end

実際問題としてサーバー側の原因以外の例外はここでは起こらんわけだし
Timeoutだけ補足してもProtoServerErrorの500系エラーはスルーされるぞ
500系エラーって新幹線みたいだな

165 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:15:10 ]
Timeout::ErrorはStandardErrorのサブクラスではないので、
引数なしのrescueでは捕まらんのだわ。


166 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:27:51 ]
>>165
既にFAQレベルだな…
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40726

直感的という言葉は使いたくないがやっぱ説明なしじゃわかりにくいよね
シグナルとかあのへんの勉強をするといいんだが、ちと重いな

167 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:33:49 ]
Errno::ETIMEDOUT って何?

168 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:39:30 ]
タイムアウトした(Timed Out)というエラー。


169 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:46:43 ]
ネット系はErrno::ECONNABORTEDとかErrno::ECONNRESETみたいなのも飛んでくるし、
例外をキャッチしても、それ以降の接続はなにやっても失敗したりするので悩ましい

170 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:51:49 ]
>>167
システムコールが返すタイムアウト

Timeout::Error → 「相手のWebサーバからHTTPの返事が返ってこない」
Errno::ETIMEOUT → 「Webサーバ以外の色々から返事が来ないタイムアウト」

と思って桶
そもそもサーバが見つからないとかそういうの。たぶん

>>169
retryはたいてい成功しないよね



171 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 16:23:37 ]

return @hoge = kekka



@hoge = kekka
return kekka



@hoge = kekka
return @hoge

ってどれが一般的かな

172 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 19:11:27 ]
@hoge = kekka

173 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 20:47:42 ]
@hoge = kekka
return

174 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 21:09:01 ]
>>171
returnを使いたくて仕方ないのなら2番目でよろしく
1番目はなんか見てて不安だ

175 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 21:33:05 ]
win環境で、一番簡単に
ファイルのオープンダイアログを表示するには
どうすればいいでしょうか

もろもろインストールの必要を最小限にしたかったりもします。

176 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:03:12 ]
require 'win32ole'

d = WIN32OLE.new("MSComDlg.CommonDialog")
d.maxFileSize = 256
d.showOpen
p d.fileName

177 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:05:12 ]
楽なのはVisualuRubyかなぁ。通常のrubyには入ってないけど、
Windows用のActiveScriptRubyならデフォで入ってます

require 'vr/vrcontrol'
fn=SWin::CommonDialog::openFilename(nil,[ ["All file","*.*"],["bmp file","*.bmp"] ])
p fn

細かいことはVisualuRubyサイトのドキュメントやサンプル見てください

ActiveScriptRuby
arton.hp.infoseek.co.jp/indexj.html
VisualuRuby計画(仮称)
www.osk.3web.ne.jp/~nyasu/software/vrproject.html

178 名前:デフォルトの名無しさん [2008/03/02(日) 22:13:20 ]
ファイルロックに関する事なんですが、みなさんはどの様なロジックで組んでますか?
自分は普通に以下みたいな感じなんですが、ごくたまにファイルが壊れる事があるんですよね…
なにか良い方法があればご教示お願いします。

File.open('data.dat', 'r'){|file|
file.flock(File::LOCK_SH)
file.read
}

File.open('data.dat', 'w'){|file|
file.flock(File::LOCK_EX)
file.write(data)
}

179 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:17:53 ]
>>178
スレッド使ってる?

180 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:22:39 ]
>>179
いえ使ってません。



181 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:45:34 ]
書き込みの場合は、アンロックする前に
flushしないと、アンロックした後に書き込みが行われる場合がある
みたいな事を言っている方がいたので、その辺の問題のせいでしょうか…

File.open('data.dat', 'w'){|file|
file.flock(File::LOCK_EX)
file.write(data)
file.flush
file.flock(File::LOCK_UN)
}

とかなのかな??

182 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:51:49 ]
175です。早速にレス感謝です。
>>176を試みてみまして
WIN32OLERuntimeError
に悩まされております・・・

もうちょっとWIN32OLE研究してみます。

183 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:17:15 ]
>>176はOS側の環境依存の度合いが大きいよ
インストールしたRubyの種類に依存する>>177と好きなほう選べ

184 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:52:19 ]
# RDEで以下のようなスクリプトを実行します
puts '文字を打ってくれ'
s = gets
puts s + 'と打ったのだね'
#すると画面左下の実行画面が表示される部分に'文字を打ってくれ'と表示される前に
#文字を入力するように求められます(文字を打たないと'文字を打ってくれ'と出ない)

ヒントだけでいいのでご享受ください。RDEとかいう開発環境なんか捨てた方がいいのでしょうか?

185 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:54:36 ]
getsの前に$stdout.flushしたらうまくいったりする?



186 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:56:47 ]
STDOUT.sync = trueな予感


187 名前:184 mailto:sage [2008/03/03(月) 01:03:01 ]
STDOUT.sync = true を使うことで
RDEでgetsが実行される前の文字が表示されるようになりました($stdout.flushではだめでした)
ありがとうございました! >>185 >>186

188 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:15:51 ]
>>182
これはどうかな?
tk環境が要るけど。

require "tk"
#rootを非表示にする
root=TkRoot.new.withdraw
types = [
["Ruby" , ".rb"],
["All Files", "*" ]
]
path = Tk::getOpenFile(:filetypes=>types, :defaultextension=>".rb")
p path

189 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 13:37:22 ]
「あまり別途インストールしたくない」という要求に対してWin32OLEやVisualuRubyが既に出てるのに
わざわざRuby/Tkで同じ標準ファイルオープンダイアログを出す根性に感服した

190 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 13:43:03 ]
宿題スレとか一部で流行ってるからな >Ruby/tk



191 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 14:39:30 ]
>>178
flock関数を使わずに、自前でロック処理を作るとか

192 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:07:19 ]
「自前」は迷宮への入り口の罠
何か有るはず。
俺はしらないけど^^;

193 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:44:29 ]
わざわざ関数って言い換えてる奴は同一人物か?

File.flockより堅固なファイルロックを自前で作れる奴なら悩んだりしないだろ
ファイルロックの失敗によってファイルが破損しているのだということを確かめる必要があると思われ

194 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:39:45 ]
>>187
実際の実行では不要なんだけどね
RDEの時だけ必要

195 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 18:48:29 ]
日本語にマッチする正規表現はどのように書きますか。
文字コードはUTF8またはEUC-JPです。

196 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 19:56:30 ]
それはあれだ、スクリプトがUTF-8だけどEUC-JPの日本語文字にマッチする正規表現を書きたいとかそういう引っかけ問題か(w

197 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 20:23:04 ]
Shift_JIS = /\A(?:
[\x00-\x7f\xa1-\xdf] |
[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]
)*\z/nx

EUC_JP = /\A(?:
[\x00-\x7f] |
\x8e [\xa1-\xdf] |
\x8f [\xa1-\xdf] [\xa1-\xdf] |
[\xa1-\xdf] [\xa1-\xdf]
)*\z/nx

UTF8 = /\A(?:
[\x00-\x7f] |
[\xc2-\xdf] [\x80-\xbf] |
\xe0 [\xa0-\xbf] [\x80-\xbf] |
[\xe1-\xef] [\x80-\xbf] [\x80-\xbf] |
\xf0 [\x90-\xbf] [\x80-\xbf] [\x80-\xbf] |
[\xf1-\xf3] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] |
\xf4 [\x80-\x8f] [\x80-\xbf] [\x80-\xbf]
)*\z/nx


198 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:16:12 ]
ジス イズ ア ペン。

199 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:38:47 ]
>>178
file.flock(File::LOCK_EX) よりも前に、File.open('data.dat','w') の時点でファイルの内容がクリアされてしまっている。

File.open('data.dat', File::WRONLY|File::CREAT) {|file|
file.flock(File::LOCK_EX)
file.truncate(0)
file.write(data)
}

…のようにすればいいんじゃないかな。


200 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 03:28:37 ]
>>197
Kconv::RegexpEucjp と Kconv::RegexpUtf8 だな
いわゆる全角文字と半角カタカナだけ欲しい場合は [\x00-\x7f] だけの行を消すといい

irb> puts 'aa康1アアア1煕表示字典ねdこd'.scan(/(?:\x8e[\xa1-\xdf]|\x8f[\xa1-\xdf][\xa1-\xfe]|[\xa1-\xdf][\xa1-\xfe])+/n)

アアア
煕表示字典ね





201 名前:178 mailto:sage [2008/03/04(火) 07:36:00 ]
>>191
File.rename使って色々やってみたんですが
やはり上手く行かなくて…

>>199

> File.open('data.dat','w') の時点でファイルの内容がクリアされてしまっている。
それはそうですね、確かに。

ちなみに、以下のコードみたいにする事で、だいぶ頑丈になりました!

#Read
File.open(path, 'r'){|f|
f.flock(File::LOCK_SH)
data = f.read
}

#Write
File.open(path, File::WRONLY | File::CREAT){|f|
f.flock(File::LOCK_EX)
f.rewind
f.write(data)
f.truncate(f.tell)
}

#Append
File.open(path, 'a'){|f|
f.flock(File::LOCK_EX)
f.seek(0, File::SEEK_END)
f.write(data)
}

202 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:22:04 ]
どうして atomic な方のディレクトリロックを使わないん?

203 名前:ルファー ◆XSlQ/Lfer. [2008/03/04(火) 12:48:34 ]
Win32APIライブラリを使い、DLL関数から文字列を取得するにはどうすれば良いんですか?
ツクール(tkool.jp/products/rpgxp/)のRGSS1を使っているので、バージョンアップできないし、
ライブラリはRubyで作らないとrequireできないし・・・。

204 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:07:45 ]
>>203
www.google.com/search?num=50&hl=ja&q=RGSS+Win32API&lr=lang_ja

205 名前:ルファー ◆XSlQ/Lfer. [2008/03/04(火) 13:11:44 ]
>>204
あぁ、解決しました。ありがとうございます。

206 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:14:27 ]
うわあ…

207 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:40:32 ]
1レスで解決したならそれはそれでいいじゃん

208 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:42:14 ]
標準添付のWeb::Agentって使ってる人いる?

209 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 20:58:32 ]
ruby -v; egrep '¥<Web¥>' **/*(.)
ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
webrick/httprequest.rb: # (Web.Golux.Com/coar/cgi/)
webrick/httpservlet/filehandler.rb: # (Web Distributed Authoring and Versioning)

どこにあるクラス?


210 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 22:17:54 ]
Noraは標準添付ではない。



211 名前:デフォルトの名無しさん [2008/03/06(木) 06:35:30 ]
例えばCで定義された以下の様な構造体があって
その構造体のデータが格納されたデータファイルを
1レコードずつRubyスクリプトで読み込む時に

struct Record{
char n, int a, int b;
};

以下の様な、なんだか非効率な方法しか分かりません…
とりあえず、一括してreadして、あとで上手くunpackで切り分けとか出来ないでしょうか?

File.open('data.dat', 'rb'){|f|
while !f.eof?
n = f.read(1)
a = f.read(4)
b = f.read(4)
data.push(n.unpack('L')[0].to_s + ',' + a.unpack('S')[0].to_s + ',' + b.unpack('L')[0].to_s)
end
}

212 名前:211 mailto:sage [2008/03/06(木) 06:38:11 ]
× data.push(n.unpack('L')[0].to_s + ',' + a.unpack('S')[0].to_s + ',' + b.unpack('L')[0].to_s)
○ data.push(n.unpack('c')[0].to_s + ',' + a.unpack('i')[0].to_s + ',' + b.unpack('i')[0].to_s)

213 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:08:47 ]
>>211
# char n の後ろに3バイトのパディングがあると仮定して
data << f.read(12).unpack('cxxxii').join(',')

214 名前:211 mailto:sage [2008/03/06(木) 11:22:00 ]
>>213
あ、レスどうも。

一応以下みたいなコードでだいぶマシになりました。
あとはループ展開するとかで、どうにか納得いく速度が出せそうです。

tmp = ''
data = []
File.open('data.dat', 'rb'){|f| data = f.read }
(tmp.size / 9).times{
(n, a, b) = tmp[p, 9].unpack('LSL')
p += 9
data.push(n + ',' + v + ',' + b)
}

215 名前:211 mailto:sage [2008/03/06(木) 11:23:35 ]
× (n, a, b) = tmp[p, 9].unpack('LSL')
○ (n, a, b) = tmp[p, 9].unpack('cii')

216 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:37:48 ]
見てるこっちが切なくなるやりとりだな・・・

217 名前:デフォルトの名無しさん [2008/03/06(木) 12:51:12 ]
pで表示すると、
"hoge"
とカッコ付きで表示されます。
hoge
とカッコなしで表示するにはどうしたらいいですか?

218 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:54:06 ]
print

219 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:57:41 ]
え?pってprintの略じゃなかったんですか…

220 名前:211 mailto:sage [2008/03/06(木) 13:15:50 ]
>>216
何かもっと良い方法があればご教示下さい><



221 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 14:08:49 ]
>>219
そういう解説をしてるサイトか書籍があったら即晒せ

222 名前:211 mailto:sage [2008/03/07(金) 02:24:18 ]
これ以上良い方法が思いつかない…

data = []
File.open('data.dat', 'rb'){|f|
tmp = f.read
cnt = tmp.size / 9
a = tmp.unpack('cii' * cnt)
cnt.times{|i| data.push([a[3 * i], a[3 * i + 1], a[3 * i + 2]].join(',')) }
}

223 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 03:07:28 ]
効率といっても速度なのかメモリフットプリントなのかコードサイズなのか
data = f.read.enum_for(:scan, /.{9}/m).map {|x| x.unpack('cii').join(',') }

あと、>>213が書いてるけど、パディングは考慮してある?
処理系によっては#pragma packeとか


224 名前:211 mailto:sage [2008/03/07(金) 03:39:45 ]
>>223
効率は速度です><

>パディングは考慮してある?
ちょっと説明の仕方が悪かったです…
要するに、[1][4][4] の各バイトのデータの並びという事です(バディングは考慮する必要はないです)

変な説明をしてすみませんでした!><

225 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 09:55:09 ]
>>217
ダブルクォートをカッコと呼ぶやつは初めて見た。

226 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:30:10 ]
カッコ悪い呼び方だよな

227 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:05:55 ]
審議中AAry

228 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:13:38 ]
Float のメソッドで、
「0 から遠い方に丸める(切上げ)メソッドはありません。」
のはなんでだろう?

truncate (to_i) との対称性から、あってもバチは当たらないと思うんだけど。
やっぱ名前?

229 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:16:19 ]
【審議チュウ】

   (⌒ー⌒) (⌒ー⌒)
(⌒-⌒)´・ω)(・ω・`(⌒ー⌒)
(  ´・ω ー⌒)(⌒ー⌒)ω・` )
| U(  ´・) (・`  ) と ノ
〜-u (l    ) (     ノu-u'〜
    〜'u-u'  `u-u`〜






               _
            /´  `フ
           /      ,!
           レ   _,  r ミ       (⌒ー⌒)
          /  `ミ __,xノ゙、      r(   ´n
.         /        i        >   ,/   (⌒ー⌒)
         ,'    .     ,'     〜'oー、_)     r(   n)
        ;     ',  l  l                `/  <_
        i       |  | |              〜'し -一┘
      ,.-‐!     ミ  i i                     (⌒ー⌒)
     //´``、    ミ  、 ー、                   ( ´・ω)
.    | l    `──-ハ、,,),)'''´                 〜、/  っっ
     ヽ.ー─'´)                   (⌒ー⌒)   └ー-、ぅ
        ̄ ̄                      r、´・ω・))
                  (⌒ー⌒)      >  _/´
        n__n        (´・ω・`)    〜'し-一┘
      (⌒ー⌒)ノ         c'   っ
    c('・ω・`)っ      〜(_,'ーo'

230 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:55:39 ]
なんだかわからんがなごんだ



231 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:00:49 ]
ショッピングカートを作っています。
session["cart"]=Hash.new
session["cart"][@itemid]=@amount
のような形でsession["cart"]にハッシュを詰め込みたいのですが、
sessionにハッシュを詰め込むことは無理なのでしょうか?
また、無理であればto_aで配列に変換して詰め込もうと思うのですが、
元に戻すとき、
@tempSession=Hash[*session["cart"].flatten]
と、WEBの公式マニュアル(ハッシュの項)にあるようにやっても
うまくいきません…。
どなたかご教授いただければ幸いです。

232 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:03:38 ]
なお、使っている鯖はlolipopで、Rubyバージョンは1.8.2です。
よろしくお願いいたします。

233 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 11:53:03 ]
>>231
デフォルトだと文字列しか格納できない。
任意のオブジェクトを格納するには CGI::Session::PStore を使う。
require 'cgi/sesion/pstore'
session = CGI::Session.new(cgi, 'database_manager'=>CGI::Session::PStore)
session[key] = Hash.new

234 名前:231-232 mailto:sage [2008/03/08(土) 12:52:26 ]
>>233さん
書き込み後、文字列→配列へ変換→処理→文字列へ返還でできましたが、
やはりコードが汚くなったので悩んでいました。
PStoreについて勉強してみようと思います。
これで悩みが解決しそうです。ありがとうございました!

235 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 14:00:53 ]
>>234
JSON や YAML の文字列に変換するという手もある。

236 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 14:16:02 ]
「文字列→配列へ変換→処理→文字列」と似たようなシロモノ紹介してどうする

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 はブロックの外側のスコープだから
影響を受けてしまうっちゅーことか。






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

前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