Ruby 初心者スレッド ..
[2ch|▼Menu]
184:デフォルトの名無しさん
09/09/19 21:00:13
すんません。このスレどっからドコまで自作自演なんてしょうか?

185:デフォルトの名無しさん
09/09/19 21:06:16
ココまで俺の自演

186:デフォルトの名無しさん
09/09/20 05:42:36
require ってなんで複数のライブラリ名を受け付けないんでしょうか。
けっこう不便なんですけど。

187:デフォルトの名無しさん
09/09/20 05:58:31
>>186
リファレンスを見たらわかることではないでしょうか?

188:デフォルトの名無しさん
09/09/20 06:35:34
書いてはあるが、意図を読み取るのは不可能だと思う

>>186
require が真偽値を返すメソッドとして作られているから、がいちおうの答
複数受け取ったときは真偽値の配列を返すようにしてもいいんだけど、おおむねキモい

each で回してもいいはずなんだけど、そういう人はなぜか見ないね

189:デフォルトの名無しさん
09/09/20 06:46:28
かなり初期に一瞬だけ実装されたことがあったと記憶
false が返ってきたほうが便利だということでお流れになったんでなかったかな

190:デフォルトの名無しさん
09/09/20 07:50:00
ふとした疑問なのですが、Mechanizeのテストというのはどのように書いたものでしょうか?

191:デフォルトの名無しさん
09/09/20 08:22:58
>>190
FakeWeb 1.2.6 API Documentation
URLリンク(fakeweb.rubyforge.org)

FakeWeb使ったらいけるかも…

192:デフォルトの名無しさん
09/09/20 11:46:12
test

193:デフォルトの名無しさん
09/09/20 11:51:53
>>192
それはRubyで作った2chブラウザのテストですか?

194:デフォルトの名無しさん
09/09/20 12:34:04
186です。

>>188
なるほど!たしかにrequireは戻り値がありますね。でも戻り値を気にする場面っていうのはまれなので、
そういう理由で複数の引数を指定できないのはちょっと勿体ないですね。

Railsとかには require_all というのがあるそうなので、戻り値を気にしなくていいから
引数を複数とれるバージョンのrequireを、requireとは別に用意してほしいなと思いました。

195:デフォルトの名無しさん
09/09/20 12:34:37
yes,we can

196:デフォルトの名無しさん
09/09/20 12:59:39
>>194
なければ自分で作るという選択肢ももとう

197:デフォルトの名無しさん
09/09/20 13:01:42
require を再定義すればいい。


198:デフォルトの名無しさん
09/09/20 16:09:37

..  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                 /\(<●>)/\    /\(<●>)/\
                 /\(<●>)/\  /\(<●>)/\
                /\(<●> )/\  \(<●>)/\
             /        \\(<●>)/\
           /   ,ゝ===く   <●>)/\  
           !  γ      `ヾ,_   \
          │ :く(   r,J三;ヾ   )>   \
          l    =; {三●;= }  ,=ニ    l
           ヽ   ゝ≡三=イ       /     <>>1ワロタw
            ヽ       .,,,.    /.|
               ヽ  'ぐ'''''''' /    / ト,
             ヽ.  ヾ''" /  /  |ヽ
             ,./ヽ  `´  /    ./  \、
      -‐ '''"  ̄ /  :| \,,,__,,,, /    /    | `'''‐- 、.._\


199:デフォルトの名無しさん
09/09/20 16:17:33
eRubyとMySQLをつかって、DBに写真のアップをしたいのだけど

<form action="syasinhenkou.rhtml" method="post" enctype="multipart/form-data">
<input type="file" name="syasin" size="30" maxlength="100">
<input type="hidden" name="id" value="<%= cgi["id"] %>">
<input type="submit" value="登録">
</form>

ってかんじで、ファイルを登録用のページにおくりたい

sql = "UPDATE rireki SET"
sql += " syasin = '" + cgi["syasin"] + "'"
sql += " WHERE id = '" + cgi["id"] + "'"
sql += ";"
my.query(sql)

受け側はこんな感じで書いてみた。
IDのところに変な文字列が入ってアップデートされないいのだけど
enctype="multipart/form-data"のオプションのせいだよね。
ファイルを送るときは、このオプションがいるみたいだけど
どうしたらいいかな?

DB側のidがキーで文字列、syasinがBLOB型でやってる
これでDBにファイルが送れるのかもよくわからんのだけど
教えてくれるとありがたいです。

200:デフォルトの名無しさん
09/09/20 17:25:56
>>199
idの所が変になるんじゃなくて、cgi['syashin']以降が変になってるはず
blobとかのバイナリオブジェクトは文字列の連結でSQLを作れない
プリペアードステートメントとかを使え

201:デフォルトの名無しさん
09/09/20 17:56:53
blobじゃなくても普通プリペアードステートメント使うとこだろ

202:デフォルトの名無しさん
09/09/20 18:41:08
何で空配列がかえってくんねん
空文字列ちゃうん?

>> "a".split(/a/)
=> []
>> "aa".split(/a/)
=> []
>> "ab".split(/a/)
=> ["", "b"]


203:デフォルトの名無しさん
09/09/20 18:43:58
空配列に空文字列がつっこまれるべきちゃうん?

[""]

204:デフォルトの名無しさん
09/09/20 18:57:36
>>194
%w(lib0 lib1 lib2).each{|feat| require feat}
でいいじゃん

205:デフォルトの名無しさん
09/09/20 19:12:10
>>202-203
新リファレンスマニュアルから抜粋

> instance method String#split
> split(sep = $/, limit = 0)

> 第 2 引数 limit は以下のいずれかです。

> limit == 0
> 分割個数制限はなしで、配列末尾の空文字列を取り除く
> limit < 0
> 分割個数の制限はなし

「配列末尾の空文字列を」いくつあっても全部「取り除く」ってことなんだろうな多分
それがデフォルトの動作である理由は知らん

206:デフォルトの名無しさん
09/09/20 19:23:06
> 「配列末尾の空文字列を」いくつあっても全部「取り除く」
こんなん知らへんかったがな。おーきに

理由は実装上の都合なんやろなぁ

207:デフォルトの名無しさん
09/09/20 19:33:54
Perlがそうだったから。
Perlがそうだった理由は知らん。

208:デフォルトの名無しさん
09/09/20 22:23:37
>>206
web上では関西弁禁止だよ?知らないな?他の方言ならいいけど


209:デフォルトの名無しさん
09/09/20 22:53:07
>>199
syasinじゃなくてphotoとかpictureつかえ

210:デフォルトの名無しさん
09/09/20 23:01:59
1.9からThreadにかわりFiberというのが入ったそうですが、どうやって使うものでしょうか。
ぐぐってみたけど、上級者向けの説明しかなくてさっぱりでした。
例:Fiberはいわゆるコルーチンです。←コルーチンが何かわからないからさっぱり理解できない説明

高校生でもわかるような説明をどなたかお願いできますか。

211:デフォルトの名無しさん
09/09/20 23:13:30
>>200-201
Ruby/MySQLではプリペアードステートメントつかえない?

MySQL/Rubyじゃないとだめ?

212:デフォルトの名無しさん
09/09/20 23:17:15
>>210
Threadなくなったわけじゃないし、上級者(地雷踏み?)向けの機能だから忘れていいよ
否定的なこと言われてるし
URLリンク(blade.nagaokaut.ac.jp)

213:デフォルトの名無しさん
09/09/20 23:58:30
>>211
こんなのもある
URLリンク(d.hatena.ne.jp)

214:デフォルトの名無しさん
09/09/21 00:21:13
>>211
出来るみたいだけど使ってないんで確認はしてない
URLリンク(planet.mysql.com)
stmt = my.prepare("select ?,?")
stmt.execute 123, "abc"
stmt.fetch # => [123, "abc"]

215:デフォルトの名無しさん
09/09/21 00:43:01
refe2簡単に入れたいけどパッケージとかある?

216:デフォルトの名無しさん
09/09/21 00:58:24
そんなに面倒なことはない気がするんだが

217:デフォルトの名無しさん
09/09/21 01:37:34
>>213-214
プリペアードステートメントは
MySQL/Rubyをいれて解決した

あとは、ファイルのアップだけど
st = my.prepare("UPDATE rireki SET syasin = ? WHERE id = ?")
st.execute(cgi["syasin"].read,cgi["id"].read)
res = st.fetch

って書いてみたところ、MySQLのほうから

2053
Attempt to read a row while there is no result set associated with the statement

って怒られた・・・・BLOBだとだめなんか?
こんなところで詰まってるようだと、表示にもてまどりそう
っていうか、表示できるのか?


218:デフォルトの名無しさん
09/09/21 03:42:41
MySQLの本でも買えよ・・・またはRails使うか

219:デフォルトの名無しさん
09/09/21 04:02:16
>>217
エラーメッセージの意味はわかる?
SQL文を実行したけどresult setが返されなかった、なのに行を読み込もうとしてエラーになっている、という意味。
SQLをみるとupdate文を実行しているよね。だからresult setは返ってこない。なのに st.fetch しようとしているからエラーになっているだけ。
これがselect文だったらfetchできるけど。

220:デフォルトの名無しさん
09/09/21 11:47:02
>>219
SERECTしたらはいってた〜〜!!
ありがと〜〜!!!

表示のほうも、相談にのってください
格納したデータを

<img src="data:image/jpg;base64,/9j/4AAQ....中略.....">

って感じには表示できるのですが
これだとIE6では見れない。
エンドユーザにFF入れろとか言えないし
IEでも表示させる方法ありますかね?

221:デフォルトの名無しさん
09/09/21 12:24:04
もはやRuby関係なし

222:デフォルトの名無しさん
09/09/21 12:41:30
どうみてもHTMLの質問です
動的か静的かは用途次第だけど、素直にURL割り当てろって

223:デフォルトの名無しさん
09/09/21 12:54:14
スレリンク(tech板)
スレ立てるまでもない質問はここで 100匹目
スレリンク(tech板)
【漏れは】猫でもわかる質問スレ【猫以下です】

224:デフォルトの名無しさん
09/09/21 13:26:50
>>220
アホだなぁ。
base64デコードして出力すればいいだろが。
Content-Typeヘッダも適切に吐いてね。

あ、スレチだね。

225:デフォルトの名無しさん
09/09/21 13:51:04
>>220
さすがにスレ違いすぎるけど。
src="data:..." は IE6 ではサポートされてない。これはブラウザを変えてもらう以外に方法はない。
だから data: を使わずすなおに画像を別ファイルにしておこう。

あるいは URLリンク(example.com)(base64文字列)....
が画像ファイルを返すようなCGIを用意して、
src="data:..." をすべて src="URLリンク(example.com)" に変換するとか。

226:デフォルトの名無しさん
09/09/21 18:26:18
アホです。すんません。
>>224-225
URLの?以降の文字列はENV['QUERY_STRING']で受け取れるはず
そいつをデコードして元に戻すって考えて

#!/usr/local/bin/ruby
require 'base64'
file = ENV['QUERY_STRING']
out = decode64(file)
print "Content-Disposition: filename=\"syasin.jpg\"\n"
print "Content-type:image/jpge\n\n"
print out

って言う具合に組んでみた。
700バイトとかの小さいファイルだとうまく行くんだけど、
8kぐらいのファイルになると表示できなくなるな

そもそも、CGI呼べてないっぽい
これもRubyのはなじしゃないよね(涙

227:デフォルトの名無しさん
09/09/21 18:59:21
アホなりに解決しました。

どうもbase64のコードが長すぎでうまく行かなかったっぽいので
idを指定してDBから画像を引っ張って垂れ流すだけのCGIを作成しました。
idなら長くても50桁とか行かんので、これで解決!!
いろいろ、ご迷惑おかけしました。
ヒント本当に助かりました。ありがとうございます。

228:デフォルトの名無しさん
09/09/21 19:05:28
>>226
>700バイトとかの小さいファイルだとうまく行くんだけど、
>8kぐらいのファイルになると表示できなくなるな

ENV['QUERY_STRING'] をそのままつかってるのが問題なんじゃないかな。
(つまりENV['QUERY_STRING']に %2F や %2B が含まれているんだろう。)
URLエンコードされているからデコードしないと。
require 'cgi'
qstr = ENV['QUERY_STRING']
out = decode64(CGI.unescape(qstr || ""))
詳しくは
URLリンク(blog.s21g.com)
をみてくれ。


229:デフォルトの名無しさん
09/09/21 20:00:17
いやいや、というか
そんな巨大なデータをクエリ文字列としてURIで渡すなよ、と。

230:デフォルトの名無しさん
09/09/21 20:02:48
URLの長さ上限は、普及しているブラウザでは、一番短かいIEが
2083バイトだったかね。



231:デフォルトの名無しさん
09/09/21 20:04:53
一発でroot奪取されかねない素敵コードだな

232:デフォルトの名無しさん
09/09/21 21:06:05
なんかワロタw

233:デフォルトの名無しさん
09/09/22 14:17:19
ルヴィーっておもしろいですか?ルヴィー使ってる友達が、開発者が日本人だから誇らしいと言ってました

234:デフォルトの名無しさん
09/09/22 14:23:06
>>233
またお前か。
もういいから自分の巣に帰れ!

235:デフォルトの名無しさん
09/09/22 15:31:24
URIのやり取りでトンネル掘り出すアフォとか出てきそうだな。

236:デフォルトの名無しさん
09/09/22 19:39:02
$0とか__FILE__とかARGFとか・・・
最初から備わってる変数が色々ありますけど、どうしてこんなに表記法に統一性が無いのですか?

237:デフォルトの名無しさん
09/09/22 20:31:24
変数

238:デフォルトの名無しさん
09/09/22 21:03:37
>>236
Larry Wallに聞いてくれ

239:デフォルトの名無しさん
09/09/22 21:08:08
Larryにそんなことを聞いたら
Perlの文法が言語学的にどう優れているのかの講義が始まるぞ
そしてハッシュの頭になぜ%が付くのかを聞いたらPerl信者になること確実だからやめておけ

240:デフォルトの名無しさん
09/09/22 21:28:45
$0はsh
__FILE__はC
ARGFはARGVの発展系、ARGVはCのmain関数の引数argvが元になっている
どれもこれもunix+Cを知ってれば、なじみの物ばかりだ

241:236
09/09/22 22:02:34
ありがとうございます。他言語からの習慣に習って付けてるんですね。
でもARGFはどうして定数なんでしょうか?Cだとargvなんかは変数ですよね。
__FILE__は擬似変数で$0はグローバル変数と全部違うけど、どれもグローバルにアクセスしたいものだから
統一してしまえばいいのに、と思ったのです。
ここら辺の、定数やグローバル変数、擬似変数といった使い分けは実装内部のことが分かるような人じゃないと理解できないのでしょうか。

242:デフォルトの名無しさん
09/09/22 22:06:29
ARGFは大文字で始まる
__FILE__は違う


243:デフォルトの名無しさん
09/09/22 22:08:10
定数だったNILが変数nilになったりしてるから絶対的な境界は無いんだろう
ARGFをグローバル変数にするのはおかしな話だが、何でといわれても説明できん

244:デフォルトの名無しさん
09/09/22 22:23:44
ARGFはARGVの発展系、ARGVが大文字でグローバルなのは多分awkが元
他の言語もそれに習ってるからrubyもそれに習っているんだろう

245:デフォルトの名無しさん
09/09/22 22:27:10
>>241
どこかでMatzが
「特殊変数周りの仕様はPerlから引きずった。今では後悔している」
的なことを書いてたような

いずれにせよ、一貫性がないという意見には同意

246:デフォルトの名無しさん
09/09/22 22:41:46
Perlからの脱却
ってのがRubyの精神じゃなかったっけ…

247:デフォルトの名無しさん
09/09/22 22:44:06
Ruby2.0では特殊変数は一新するんじゃない?

248:デフォルトの名無しさん
09/09/22 23:22:18
以下のような感じでセッションにアクセスしているのですが
リロードするたびにセッションIDが変わってしまいうまく数値を取り出せないです。
どなたか助言をよろしくおねがいします。

def GetSession()
cgi = CGI.new
session_option = {"tmpdir" => "./"}
session = CGI::Session.new(cgi, session_option)
return session
end

249:デフォルトの名無しさん
09/09/22 23:43:38
色々と突っ込みたい所はあるが、まずはtmpdirにセッション情報が書き込まれたファイルが存在しているかどうかを確認するんだ。

250:デフォルトの名無しさん
09/09/22 23:48:07
ファイルが作成されているのが確認できました。
リロードするたびに増えていきます。
サーバー側の問題でしょうか?

251:デフォルトの名無しさん
09/09/22 23:58:52
ようし、じゃあ次はFirefoxにFirebugを入れてcookieの受信と送信ができているか確認するんだ。
CGIモジュールの仕様はよく知らんが、きっとセッションIDをクッキーに入れて送ってきてくれているはずだぞ!

252:デフォルトの名無しさん
09/09/23 00:15:52
クッキーのリストが反応しないみたいです、他のサイトだとExpiresの項目にsessionというのが出てきています。

253:デフォルトの名無しさん
09/09/23 00:50:05
で、セッションを発行したときのレスポンスヘッダにSet-Cookieはあったのか?

254:デフォルトの名無しさん
09/09/23 00:58:52
まじキチ…ユダヤが人工地震を起こすぞ

【緊急情報カクサンよろしく】

ついに来ました。

大きい動きです。250nT超えてきました。ほぼ間違いありません。もう一度言います。

友人、知人、親類縁者、あらゆるつながりを駆使して巨大地震がくることを教えて下さい。

四川地震より大きいのが来る可能性があります。
URLリンク(g)<)★253494015/
【大気イオン】e-PISCO Part11【また延長】
スレリンク(eq板)★252991726/

本当に地震が来たら、犯人は特権階級全員だということ2


255:デフォルトの名無しさん
09/09/23 01:01:28
すいませんレスポンスヘッダを確認することができませんでした。
Firefoxのコンソールで確認できるような事を書いてあるサイトを見つけたのですが
うまく確認できませんでした。

256:デフォルトの名無しさん
09/09/23 01:04:36
>>2555
Firebugでの見方がわからんならLive HTTP Headers入れろ。


257:デフォルトの名無しさん
09/09/23 01:17:14
ありがとうございます、インストールしてみました。
レスポンスヘッダにCookieと名前のつく項目はなかったです。

258:デフォルトの名無しさん
09/09/23 01:20:23
じゃあそれが原因だろw

ってかCGIクラスのインスタンスって何度も生成したらバグるんじゃないの?
関数の中でインスタンス作成して、破棄しているあたりからして使い方が間違ってるんじゃないのかと。

259:デフォルトの名無しさん
09/09/23 01:26:40
なるほど、少し簡単なプログラムを作って実験してみます。
rubyは明確なルールが分かりづらくて難しいですね。

ありがとうございました。

260:デフォルトの名無しさん
09/09/23 01:32:05
問題はHTTPの理解のほうじゃないだろうか。


261:デフォルトの名無しさん
09/09/23 01:46:05
>>248
たんにHttpヘッダーを送信してないだけかも。
「ruby cgi session」でぐぐったら、こんなページがあった。
URLリンク(d.hatena.ne.jp)
参考にしてみて。

262:デフォルトの名無しさん
09/09/23 02:23:35
ありがとうございます、確認してみたらヘッダーはERBを処理した後に追加しているので問題なさそうでした。
erb = File.open(path) { |f| ERB.new(f.read) }
print cgi.header + erb.result(binding)

以下のようなtest.rbというのを作成して実験してみたところうまくいきましたが
本番用のソースだとうまくいかないようです><
#!/usr/local/bin/ruby
require 'cgi'
require 'cgi/session'
cgi = CGI.new
session = CGI::Session.new(cgi)
print cgi.header
print "session test'#{session.session_id}'\n"


まだ解決していませんがデバック方法やアドバイスなど、とても勉強になりました。
本当にありがとうございました。
もう少し自分なりにrubyやhtmlの勉強を行ってみます。

263:デフォルトの名無しさん
09/09/23 07:51:45
どうしても分からなければ
ソースをまるごと貼り付けて、アドバイスを求めるという手もある
もちろん自力で解決できるならその方がいいけど

264:デフォルトの名無しさん
09/09/23 08:05:08
2chに投稿するとインデントがなくなってすごく見にくいんだけど、JaneStyleのリンクポップアップで
見るとちゃんとインデントされてる!

それをコピーしたらインデント付きでコピーもできる!
全角スペースや&nbsp;によるインデントを使う必要なし!

265:デフォルトの名無しさん
09/09/23 11:05:48
>>264
書き込み時に置換面倒なんだけど、ソースとリンクを毎回書き込むのが面倒なのだが

266:デフォルトの名無しさん
09/09/23 11:15:02
コードを貼付ける場合、どうせなら
URLリンク(pastie.org)
とか
URLリンク(gist.github.com)
とか使うといいんじゃないかな。
詳しくは URLリンク(journal.mycom.co.jp)


267:デフォルトの名無しさん
09/09/23 11:20:00
長い場合はそのほうが望ましいけど
短い場合はそのまま貼ってくれたほうがいいな

あとインデント類の扱いは2chブラウザごとに全然違うらしいよ

268:デフォルトの名無しさん
09/09/23 11:32:03
rubyのせいにしてるが、http知らないと実装は無理なんじゃ。

269:デフォルトの名無しさん
09/09/23 11:35:06
CGIも知ってないと無理な悪寒

270:デフォルトの名無しさん
09/09/23 11:38:57
アホばっかだな・・・
ソース張ってるんだからrubyが原因って一発で原因わかるだろw

271:デフォルトの名無しさん
09/09/23 11:52:44
正しくrubyをかくための
http,cgiの前提知識が足りないのかもしれん

272:デフォルトの名無しさん
09/09/23 19:47:00
Rubyって、GUIアプリを作れるの?

273:デフォルトの名無しさん
09/09/23 19:56:01
Ruby 自身は GUI 部品を持ってない
GUI 部品を司る他の言語や API を直接呼ぶ

一般論としては、GUI が目的なら Ruby を使う理由は何もない
素直に GUI 部品を提供する他の言語を使え
Windows でウィンドウを表示したけりゃ、そりゃ C# を使えばいいのさ

274:デフォルトの名無しさん
09/09/23 20:03:27
うわ 糞言語じゃん

275:デフォルトの名無しさん
09/09/23 20:05:01
>>274
GUI部品がどういうふうに成り立ってるか理解してないだろ、おまえ。


276:デフォルトの名無しさん
09/09/23 20:11:42
>>274


ま た お ま え か !



277:デフォルトの名無しさん
09/09/23 20:13:41
Ruby/Tkの不遇って本当なんだなあ・・・

278:デフォルトの名無しさん
09/09/23 20:24:45
>>277
Windows環境の俺に言わせると
ActiveTclを別に導入しなければならないあたりが原因
Exerbでまとめて配布できるWxRubyと比べて、いろいろ不便だ

279:デフォルトの名無しさん
09/09/23 20:29:24
Win32API経由なら「ActiveTclを別途インストールしてください」という必要もない
Tclの文法をわざわざ勉強する必要もない
アリモノ全部で賄える

280:デフォルトの名無しさん
09/09/23 20:33:10
One Click InstallerにはRuby/Tk最初から入ってなかったっけ
まあPythonでTkinter使ったら幸せになれそうなケース

281:デフォルトの名無しさん
09/09/23 20:35:56
ruby厨涙拭けよ

282:デフォルトの名無しさん
09/09/23 20:47:46
というかTkってけっこう大きいんだよね

必要な人だけ適当に別途入れて使って、というスタンスにしておいたら
実行環境持ってない人に配布するという場合のサポートがすっこんと抜けた
そこまでRubyでやらなくてもいいじゃん却って不便だろ、と思うんだけれど

283:デフォルトの名無しさん
09/09/23 20:48:31
あれ? どこか涙流すような流れになってたっけ?


284:デフォルトの名無しさん
09/09/23 21:05:57
jruby でいいじゃんじゃん。

285:デフォルトの名無しさん
09/09/23 21:09:32
pythonに標準添付されてるtkをrubyから使う事って出来るん?

286:デフォルトの名無しさん
09/09/23 21:18:26
Linux使ってるけど、Ruby/gtk2が便利。書きやすい。
シグナルまわりの書き方が好きだ。

287:デフォルトの名無しさん
09/09/23 21:36:19
>>279
? どういうこと?
dllファイルを直接呼べばいいってこと?

288:デフォルトの名無しさん
09/09/23 22:15:39
Win32APIでやれることだけでなんとかしろって意味だと思う

289:デフォルトの名無しさん
09/09/23 22:18:29
Win32API向けにヘッダファイルの翻訳やってくれたりするライブラリでもあるの?

290:デフォルトの名無しさん
09/09/24 07:36:30
gemのjsonライブラリって日本語まんま変換できないの?
UTF8で["ほげ"].to_jsonとかすると["\u307b\u3052"]とかなっちゃうんだけど

291:デフォルトの名無しさん
09/09/24 08:05:05
いやそれそのまんまだと思うのだが

irb> puts JSON.parse(["ほげ"].to_json)
ほげ

何か問題ある?

292:デフォルトの名無しさん
09/09/24 08:42:47
javascript内では日本語は直接記述しないとか、そういう話?

293:デフォルトの名無しさん
09/09/24 08:45:26
>>290
JSONの仕様としては変換するのが正しい。
ただ、それが日本人にとって便利かどうかはまた別の話。
ユニコードに変換させないオプションがほしいよね。

294:デフォルトの名無しさん
09/09/24 08:47:18
>>293
ごめん、ウソ書いた。「変換するほうが仕様上正しい」というのは間違い。
JSONでは文字列中に日本語をかけるはずだね。

295:デフォルトの名無しさん
09/09/24 08:49:10
機械が生成した JSON はたいてい Unicode エスケープで日本語が書かれてるぞ
仕様上はエスケープしても構わない(may)のでたいていのライブラリは自動エスケープする
そのほうがめんどくさくないからというのが積極的理由

JSON を生で読むなバカという意図が働いてるという気はせんでもない

296:デフォルトの名無しさん
09/09/24 09:34:48
便乗して質問

JSONやYAMLに変換したとき、日本語をそのまま出力してくれるライブラリって
AnJSONやYa2YAMLぐらいしか知らないんだけれど
他に同じことができるライブラリってないかな

297:デフォルトの名無しさん
09/09/24 09:48:05
Jsonて生で読むなっていうようなものなの?
生で読めるのもいいところの一つだと思ってたんだけど

298:デフォルトの名無しさん
09/09/24 10:45:45
クラス変数が定義されているかどうかを調べる方法ありますか?

299:デフォルトの名無しさん
09/09/24 11:18:24
class_variable_defined?

300:デフォルトの名無しさん
09/09/24 11:26:31
Perlでは複数の返り値(リスト)があって、必要のないものには、以下のようにundefと記述しますが、

my ($second, undef, $hour) = localtime;

Rubyではどのように書くものなのでしょうか?

def meth
return 1, 2, 3
end

a, ??, c = meth

301:デフォルトの名無しさん
09/09/24 11:46:53
>>296
Rubyでは知らない。
PythonのYAMLライブラリは、オプションでユニコードに変換する・しないが選べるんだけど、
同じようなオプションがRubyにも欲しいよね。

>>300
特に用意はされてないと思うので、いらない変数を指定するしかないんじゃないかな。
a, _, c = meth
とか
a, dummy, meth
とか


302:デフォルトの名無しさん
09/09/24 12:00:51
>>301
ダミー変数を使うしかないんですね。
了解しました。

303:デフォルトの名無しさん
09/09/24 12:31:35
>>299
古いオンラインマニュアルでは載ってないclass_variable_defined?!古いオンラインマニュアルでは載ってないclass_variable_defined?!じゃないか!

304:デフォルトの名無しさん
09/09/24 12:34:56
class_variable_defined? が載ってない HTML ヘルプ版マニュアルは持ってる
これでも一応 1.8.6 対応だったはずなんだが
まいっか

305:デフォルトの名無しさん
09/09/24 12:36:10
大事なことなので2回いいました

306:デフォルトの名無しさん
09/09/24 17:08:05
Mix-inが言語的にサポートされていると聞いてRubyに心ひかれてます。
とはいえまだ使ってませんが。普段はC++/Javaを使っています。

Mix-in するモジュールを A、その中で定義されているメソッドを foo
とすると、foo からは A を Mix-in した側のクラス C1 内のメソッドを
使うことができるんですよね?

そのクラス C1 をさらに継承して C2 としたらその C2 で定義した
メソッドも呼び出せるんでしょうか?

C++の仮想関数や仮想関数テーブルとのアナロジーで説明してくれている
ページってありませんか?

307:デフォルトの名無しさん
09/09/24 17:23:53
これ貼ると人によってはなぜか大変がっかりされるんだけど

>>306
irb> module A; def foo; 'foo!'; end; end
irb> class C1; end
irb> p C1.ancestors
 [C1, Object, Kernel]
irb> class C2 < C1; end
irb> p C2.ancestors
 [C2, C1, Object, Kernel]
irb> class C1; include A; end
irb> p C1.ancestors
 [C1, A, Object, Kernel]
irb> p C2.ancestors
 [C2, C1, A, Object, Kernel]
irb> p C2.new.foo
 "foo!"

こうなる
Ruby のクラスは再オープン可能でそれが日常であることに注意のこと
Ruby は ancestors に含まれている「前のほうのクラスやモジュール」からメソッドなどを探す
C2 は [C2, C1, A, Object, Kernel] になっているが、
これだと C2 を探して C1 を探して A を探して Object を探す
もし C2 に foo が定義されていれば、 順番表の下にある A の foo は呼ばれない
もし C1 に foo が定義されていれば、 順番表の下にある A の foo はやっぱり呼ばれない
Ruby の include はこの検索順番表(の2番目)に自分を追加するだけのシンプルな機能
継承もこの検索順番表(の2番目)に継承元クラスを追加するだけのシンプルな概念

irb> module B; end
irb> class C2; include B; end
irb> p C2.ancestors
 [C2, B, C1, A, Object, Kernel]

308:デフォルトの名無しさん
09/09/24 17:25:10
C++ の vtbl の仕組みでは説明できません。
Ruby の場合「頼んで答えられれば答える」ただそれだけです。

309:306
09/09/24 17:26:45
もう一つの疑問です。
二つのMix-inモジュール A, B をクラス C でMix-inしたとき、
AのメソッドからBのメソッドを呼び出すこともできるのでしょうか?

つまり A のメソッド foo を書くにあたって、foo の中で
呼び出す bar というメソッドを呼び出したいけど、
それはまぁどこかで実装されてるんだろうと思って
書いて構わないですよね?

その bar の実装は A を Mix-in するクラス C に書くべきなのか
ほかの Mix-in で bar の実装を提供することができるのか、
という質問です。

310:306
09/09/24 17:35:01
>>307 , >>308
ありがとうございます。分かってきました(気がします)。
RubyというかMix-inという以前に頭が動的型付けの言語に
慣れていないことが原因だったように思います。

>Ruby の include はこの検索順番表(の2番目)に自分を追加するだけのシンプルな機能
>継承もこの検索順番表(の2番目)に継承元クラスを追加するだけのシンプルな概念

その解説ですっきりしました。
ということは >>309 も当然可能で
複数のモジュールを Mix-in したりさらに継承を続けたりして
メソッドの名前が重複する場合には、要注意、
つまり include の順番も依存するということですね。

311:306
09/09/24 17:38:28
ということは言語仕様としてMix-inとしての制約を
課しているという点以外は Python の多重継承と
良く似ているなぁ・・・

どうしても業務が静的型付け・手続き型言語
べったりなんで、まだこっち方面(どっち?)は
指をくわえて見てるだけしたが、そろそろ。

312:デフォルトの名無しさん
09/09/24 17:40:18
Matzは恥ずかしい表紙の本でMix-inは多重継承って言い切ってたな

313:デフォルトの名無しさん
09/09/24 17:44:20
>>311 そんなあなたに Scala をどーぞ。

314:デフォルトの名無しさん
09/09/24 17:47:26
>>312
多重継承の形してないだけで、実際は多重継承だと思う

 ・ 自作以外を include すると地獄
 ・ 自作でも 2つ include するとわけわかめ
 ・ 下手に include せずにクラスメソッドとして単体利用すると異常に楽

とか一緒

315:デフォルトの名無しさん
09/09/24 18:12:17
弱めた多重継承には違いない
実装を共有しつつ、ダイヤモンド継承とか面倒な問題は生じなくなる

まあRubyの場合、今度は変数がぶつかる問題があるけど・・・・・
なんかSchemeの健全なマクロみたいに、
名前の衝突を自動回避できないのかね

316:306
09/09/24 18:26:57
>>315
モジュールのメソッドの中で自由にインスタンス変数作れちゃうんですよね
そうするとたしかに変数名は衝突しますね。

317:デフォルトの名無しさん
09/09/24 20:13:26
ま、>>315の言う通りだね。
多重継承には嫌な問題がたくさんあるけど、あれば便利な場面もある。
そこで、通常の継承は単一継承のみに制限した上で、多重継承したい場面のためにMix-inを用意してある、と。
この辺のバランスの取り方は、まさにRuby的。好き嫌いはあるとは思うが。

318:デフォルトの名無しさん
09/09/24 20:19:22
実際問題として include ってあまりしないよねえ
やろうと思えばできるって感じ
慎重に設計した上で組み込む必要があるから、あまり気軽ではない

あと NameSpace::Application を include NameSpace して使う人はトイレのドア開けた瞬間に漏れろ

319:デフォルトの名無しさん
09/09/24 20:36:13
Ruby1.8 で include REXML したときの defined?(Encoding) の誤爆なんとかしろとか言ってた奴もうんこ漏れろ
なんでもかんでも include するんじゃねえ
include は「クラスパス」を短くするために使うもんじゃねえ

irb> require 'rexml/document'
irb> "s".force_encoding('BINARY') if defined?(Encoding)
nil
irb> include REXML
irb> "s".force_encoding('BINARY') if defined?(Encoding)
NoMethodError: undefined method `force_encoding' for "s":String
   from (irb):4
   from /usr/lib/ruby/1.8/rexml/namespace.rb:37

これ関連で Ruby1.9 の文字列処理の場合分けを defined?(Encoding) でやってる奴も漏れなくうんこ漏れろ

320:デフォルトの名無しさん
09/09/24 20:41:52
Ruby のバージョンだけが問題なんだから RUBY_VERSION で場合分けすべきだよね
defined?(Encoding) は時々見るんだけど、何が目的なのかな

321:デフォルトの名無しさん
09/09/24 20:51:16
defined?(Encoding)って何がまずいの?

322:デフォルトの名無しさん
09/09/24 21:00:52
Encoding という名前のモジュールまたはクラスまたは定数が定義されていること、ということしか調べられないこと
>>319 のような問題が起こるし、Encoding という名前のクラスかモジュールがどこかに存在してさえいればいいとか
Encoding という名前のクラスにならほぼ確実に存在して動作も確定なメソッドがあるという問題でもないわけで

文字列のエンコーディング処理に本当に必要なのはナニかというと Ruby 1.9.1 なわけで、
じゃあ素直に 1.9.1 の存在をチェックしたほうが素直なんじゃね、ということに

323:デフォルトの名無しさん
09/09/24 21:19:57
>文字列のエンコーディング処理に本当に必要なのはナニかというと
つーか例えば>>319の場合ならforce_encodingの存在チェックをするほうがよくね?

324:デフォルトの名無しさん
09/09/24 21:27:53
ダックタイピングとして意味がありゃあな

325:デフォルトの名無しさん
09/09/24 21:38:25
エンコーディングではなさそうだけど:

1.9以降の機能と思ってバージョンでチェックしていたら
1.8.8にバックポートされたでござる、という場合を考慮すると
バージョンで全部OKというわけでもないだろうな。

ケースバイケースとしか。



326:デフォルトの名無しさん
09/09/24 21:43:06
いやそれでもそれはバージョンでチェックすべきだろう
Rubyのバージョン名と機能の関係はそんなにまでも信頼できない魔境ではない
ソース触れる人がアップデートすべきだ

327:デフォルトの名無しさん
09/09/25 09:01:16
ダッチタイピングに空耳した

328:デフォルトの名無しさん
09/09/25 15:43:22
だからRUBY_VERSIONで分岐すんなつってんだろ

Encodingで被るなら::Encodingとか
String.method_defined?(:encoding)とか
使えよ


329:デフォルトの名無しさん
09/09/25 16:03:28
ある機能を備えているかが定数の存在やメソッドの存在でしかわからないのが問題なのかな。
Open Classなのでいくらでも後から定数やメソッドを追加できるわけで。
かといって、Javaのパッケージみたいにドメイン名使って一意にするのも鬱陶しいけれど。

330:デフォルトの名無しさん
09/09/25 16:45:12
RUBY_VERSION 否定派は何も根拠がないのが笑える

331:デフォルトの名無しさん
09/09/25 16:54:42
やはり組み込みと添付は Std モジュールに全部入れておくべきだった

332:デフォルトの名無しさん
09/09/25 17:41:18
>>330
1.9の機能を模倣する外部ライブラリができるかもしれないし
Ruby実装だって今やMRI一択じゃない
それと機能の有無で分岐してくれた方が後で読んだときに意図がつかみやすい

といっても俺自身否定派でもないから好きにすればいいと思うよ
できれば1.9スレや本スレとか然るべき場所でやってくれればなお良い

333:デフォルトの名無しさん
09/09/25 17:47:57
涙拭けよ

334:デフォルトの名無しさん
09/09/25 18:12:41
配列の中にハッシュ作りたいんですけど不可能ですか?

335:デフォルトの名無しさん
09/09/25 18:16:30
irb> foo = [{"a"=>0, "b"=>1}]
=> [{"a"=>0, "b"=>1}]

336:デフォルトの名無しさん
09/09/25 18:17:59
>>334
入れ子にすることは普通にできる

[{'key1' => 'val1'}]

以下のようなことはできそうだができない

['key1' => 'val1', 'key2' => 'val2']

以下のような使い方は一見無駄で遅いっぽい上に実際無駄だが、
Ruby ではけっこう普通にやってるのでどんどん使え

arr = [{'key' => 'val1'}, {'key' => 'val2'}, {'key' => 'val3'}]
arr.each do |h|
p h['key']
end

337:デフォルトの名無しさん
09/09/25 18:27:42
>>336
それって全部同じ 'key' でも何か意味があるの?
keyは色々なものでってこと?

338:デフォルトの名無しさん
09/09/25 18:54:14
結局、Encoding関連で今まで出た案をまとめると

1. RUBY_VERSIONで分岐
2. defined?(::Encoding)
3. str.respond_to?(:force_encoding)

あたりが現実的な解か

339:デフォルトの名無しさん
09/09/25 21:03:11
>>336みたいなのは
{'title' => 'タイトル', 'author' =>'著者', 'date' => '日付'}
という固定フォーマットのハッシュを、何らかの理由で順番を保持したまま
深く考えずに適当に処理したいというときに時々見る

340:デフォルトの名無しさん
09/09/25 21:30:24
data = {
1 => {'title' => 'タイトル1', 'author' =>'著者1', 'date' => '日付1'},
2 => {'title' => 'タイトル2', 'author' =>'著者2', 'date' => '日付2'},
3 => {'title' => 'タイトル3', 'author' =>'著者3', 'date' => '日付3'}}

0.upto(data.keys.size).each do |i|
p data[i]['title']
end

イエス超解決
data を作るときにキーのためにわざわざ整数をカウントしないといけないのが不便

341:デフォルトの名無しさん
09/09/25 21:40:37
dataは配列でいいんじゃないか?

342:デフォルトの名無しさん
09/09/25 21:42:22
railsのソースコード読むとハッシュの上手な使い方が理解できるよネー

343:デフォルトの名無しさん
09/09/25 21:48:45
>>341
敢えて全部ハッシュにするという例なんじゃないのか

344:デフォルトの名無しさん
09/09/25 22:25:41
>>339
つまり1.9なら不要の発想ってことでおk?

345:デフォルトの名無しさん
09/09/25 22:32:52
1.9.1 (以降)でしか使わないスクリプトであるなら、ハッシュ入り配列は不要だな
普通にハッシュを each で回せばいい

個人的には Hash の順番保持は 1.9.3 くらいで唐突に無くなりそうな機能だと思ってて
これに依存したスクリプトはあまり作りたくないなあと思ってるんだが

346:デフォルトの名無しさん
09/09/25 22:39:09
え!Hashの順番保持されるようになったのか

347:デフォルトの名無しさん
09/09/25 22:46:43
えー 1.9.1 でめちゃくちゃ話題になったじゃん

$ irb1.9
irb> h = {2 => 'two', 3 => 'three', 1 => 'one'}
irb> h.each_pair{|k, v| puts "#{k} => #{v}"}
2 => two
3 => three
1 => one

$ irb
irb> h = {2 => 'two', 3 => 'three', 1 => 'one'}
irb> h.each_pair{|k, v| puts "#{k} => #{v}"}
1 => one
2 => two
3 => three


348:デフォルトの名無しさん
09/09/25 22:51:52
どちらかというとネガティブな方向で話題になった気がする
順番記憶したら Hash じゃねえとか Rubyオワタ\(^o^)/ とか

349:デフォルトの名無しさん
09/09/25 22:57:26
確かにHashはあるキーに対応する値を保持するだけのものな気がするな
順番保持したいなら配列にしろ・・・・・
とこんな話もすでにさんざんしたわけか

350:デフォルトの名無しさん
09/09/25 23:13:16
Java風に言うなら単なるLinkedHashMapでしょ
単なるハッシュとして使う分にはそれでもいいし、
追加コストは定数だからRuby的には許容範囲だとの判断があったのだろう

351:デフォルトの名無しさん
09/09/26 00:16:02
標準でOrderedHashクラス作って、Hashの仕様が変更されてもOrderedHashだったら大丈夫って風にしないと
まったく意味ないんじゃないの?

352:デフォルトの名無しさん
09/09/26 00:16:16
ruby をスクリプトエンジンとして使用するフリーソフトを作ったんですが、
Artisticライセンスな windows 版 ruby ってありますか?

353:デフォルトの名無しさん
09/09/26 00:38:34
yugui氏が担当している間は大丈夫そうなイメージがある、なんとなく

最悪OrderedHash < Hashになったとしても
互換性が必要な場面でHash = OrderedHashとかしときゃいいんじゃねw

冗談はともかく、現時点であらかじめこうしてから利用するとか
class OrderedHash < Hash; end
順列が必要な連想配列だというのが明確になるし
obsoになったときの対応も比較的容易なはず

まあ俺はArrayクラスがArrayとQueueとStackに七変化するようなもんだと思うから抵抗はないし
消える心配も今のところしてない

354:デフォルトの名無しさん
09/09/26 00:42:41
Hashでも順番持ってた方が普通に便利なんだが
別に深刻な害があるわけでなし、何が不満なんだがさっぱりわからん

355:デフォルトの名無しさん
09/09/26 00:49:15
>>354
・性能落ちるかもしれない不安
・今後消えるかもしれない不安

だと思う

356:デフォルトの名無しさん
09/09/26 00:52:52
言語処理系としてのruby1.9独自仕様なのか、
それともプログラミング言語Ruby1.9の仕様と解釈していいのか混乱があるのでは
もし前者だとしたら、処理系依存には抵抗がある

ハチドリ本いわく
>Ruby 1.9 では、ハッシュの要素は、実装によっては挿入された順序で反復処理される。
う〜ん・・・・・

357:デフォルトの名無しさん
09/09/26 01:19:10
>>355
性能というのが速度のことであれば逆に速くなった。
というか、だからこそ入った。


358:デフォルトの名無しさん
09/09/26 01:22:27
確かに列挙は早そうだな

359:デフォルトの名無しさん
09/09/26 02:14:22
実装依存じゃOrderedHashのつもりで使うのは御法度か

360:デフォルトの名無しさん
09/09/26 02:16:02
rubyの開発グループは本当に人材酷いな。Railsに全部任せちゃえよ

361:デフォルトの名無しさん
09/09/26 02:36:06
いやいやRailsの人たちに任せたら新機能と非互換がTINYごとにどんどん増えるよ。

362:デフォルトの名無しさん
09/09/26 04:38:27
>>360
お前Rails使ってないか、あるいは使い始めたの今月だろ

363:デフォルトの名無しさん
09/09/26 05:31:14
来月には後悔するのか、流動性速すぎだろRails

364:デフォルトの名無しさん
09/09/26 07:24:58
Railsは、こっち推奨になりました→やっぱやめました→ごめん、やっぱこれ
とかバージョンアップのたびにあったりして笑うw
いや、使っている方としてはどっちだよ!とか思うけど

365:デフォルトの名無しさん
09/09/26 11:11:13
前田さんたちに頑張ってもらって、言語仕様で明文化してもらうまでは
Hashのキー順序については昔ながらの意識でいることにする。


366:デフォルトの名無しさん
09/09/26 11:28:47
JISの話なら、1.8ベースだから順序の保証は入らんと思うぞ

367:デフォルトの名無しさん
09/09/26 11:37:01
>>338
>>328のmethod_defined?も。

>>329
ある機能自体がある定数やメソッドで提供されてるんだから、最も自然だろう。

368:デフォルトの名無しさん
09/09/26 19:22:53
defined? や responsed_to? はダックタイピング用の機能であって
モジュール存在判定に使うもんではないと思う

369:デフォルトの名無しさん
09/09/26 19:48:38
むしろモジュールの存在を問わず
メッセージに応答できるか否かだけを問うべきでは?

370:デフォルトの名無しさん
09/09/26 19:54:42
実際に必要なのは処理結果であって返事そのものではないというのが理想と現実の深くて暗い谷間

371:デフォルトの名無しさん
09/09/26 20:01:47
>>368
ダックタイピングならそんな判定はしない


372:デフォルトの名無しさん
09/09/26 20:04:48
ていうかさあ、responed_to? 使ってる奴だって
その名前のメソッドを持っていることを期待してるのではなく
「Ruby 1.9 の」 force_encoding であることを期待しているんだろ
じゃあそれの条件をきちんと書けよ

373:デフォルトの名無しさん
09/09/26 20:08:05
>>372
期待していない不正なメソッドが動作した場合はたいてい例外が発生してプログラムが止まる

374:デフォルトの名無しさん
09/09/26 20:26:09
if str.respond_to?(:force_encoding) && defined?(::Encoding::ASCII_8BIT) &&
str.respond_to?(:encode) && str.respond_to?(:encoding) &&
defined?(::Encoding::UTF_8) && str.class.new.encode(::Encoding::UTF_8).encoding == ::Encoding::UTF_8 &&
(_ = str.class.new.encode(::Encoding::UTF_8).force_encoding(::Encoding::ASCII_8BIT); _.encoding == ::Encoding::ASCII_8BIT) then
str.force_encoding(::Encoding::ASCII_8BIT)
end

375:デフォルトの名無しさん
09/09/26 20:35:44
プログラムが止まったあと>>373がどう改修するのかにちょっと興味がある

どうせ基本雑談なので次の質問の方気後れせずにどうぞ

376:デフォルトの名無しさん
09/09/27 00:35:12
URLリンク(blog.livedoor.jp)
上のページに掲載されているjavascriptを使って、ブラウザ上で文字列にRaw Deflateにかけた上で Base64 encodeしたデータをサーバへ送信し、
サーバ側ではrubyでBase 64 decode、標準のzlibライブラリを用いてRaw Inflateしたいのですが、
「Zlib::DataError: incorrect header check」が発生しうまく圧縮データを伸張できません。

サーバ側のrubyは以下のようなコードです。
#!/usr/bin/ruby
require 'zlib'
data = "(javascriptで生成した圧縮データ)"
p Zlib::Inflate.inflate(data.unpack('m')[0])

ちなみに、perlだと同じように標準的なライブラリを使って以下のようなコードで圧縮データを伸張できましたので、このjavascriptのコードが特殊なことをやっているというわけではないのかな?と思います。
#!/usr/bin/perl
use IO::Uncompress::RawInflate ':all';
use MIME::Base64;
$data = "(javascriptで生成した圧縮データ)";
$decoded = decode_base64($data);
rawinflate(\$decoded => \$inflated);
print $inflated;

このJavascriptライブラリ特有の問題なのか、rubyの問題なのか切り分けができておらず微妙かと思ったのですが、
perlで動いたので一度ruby界隈で聞いてみようと思い書き込みしています。
何か分かりましたらご教授いただけないでしょうか。

377:デフォルトの名無しさん
09/09/27 00:49:00
unpackが怪しい気がするから、Base64デコードしたデータのハッシュを、Perlのやつと比べてみたらどうかな?
あと、詳しくないんだけど、そもそもRawDeflateと普通のDeflateって同じものじゃないとか?

378:デフォルトの名無しさん
09/09/27 01:20:21
>>377
まさかと思って調べたところ、RawDeflateと普通のDeflateが違うものでした。
考えが及びませんで、ありがとうございました。
RawDeflateにchecksumなんかが頭についたものがDeflateのようで、以下のようにしたら動きました。
p Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(data.unpack('m')[0])


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5393日前に更新/199 KB
担当:undef