09/09/19 14:36:42
String[] の動作が期待に添っていて、短いのがスマートだと勘違いしているのなら、>>174
そのまんまの正規表現でマッチした部分を取り出す以上のわかりやすいスマートなものはないかと思われ
str =~ /\A[\(\{\[<](.+?)[\)\]\}>]\Z/; $1
開きカッコの対応を取るライブラリは標準では無いので自作してくれ
176:デフォルトの名無しさん
09/09/19 14:38:04
というかカッコの対応は正規表現では本来書けない。
とCマガで大昔に読んだけど、最近の拡張しまくりのだと可能かもなー。
177:デフォルトの名無しさん
09/09/19 14:48:30
後ろの1文字はchopで毟れるけど、先頭の1文字を毟り取るメソッドっ
てないよな。
178:デフォルトの名無しさん
09/09/19 14:51:08
>>177
その手があったか
"[hoge]".chop.reverse.chop.reverse
179:デフォルトの名無しさん
09/09/19 14:52:59
>>178
ちょwwwwwプwwwww
180:デフォルトの名無しさん
09/09/19 14:54:21
小橋の回転チョップを思い出した
181:デフォルトの名無しさん
09/09/19 17:26:08
右のほうをチョップされたら左のほうを差し出せ
182:デフォルトの名無しさん
09/09/19 20:20:22
×ほう
○ほお
183:デフォルトの名無しさん
09/09/19 20:28:43
>>172
"[hoge]"[/\[(.+?)\]/, 1]
とも書ける。
>>175
Onigurumaならできるはず。
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のリンクポップアップで
見るとちゃんとインデントされてる!
それをコピーしたらインデント付きでコピーもできる!
全角スペースや によるインデントを使う必要なし!
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])
379:デフォルトの名無しさん
09/09/27 03:45:29
配列の中にハッシュ入れたんですけど
a = [0, {1 >= 5}, 3]
これの配列データがFixnumかハッシュかどうかで処理を分けたいんですが
is_a?(Fixnum)で分岐させようとしたらエラーが出ました
classで調べたらエラーが出ます
どうすればいいんでしょうか?
380:デフォルトの名無しさん
09/09/27 03:56:08
{1 >= 5} でエラーという落ちじゃないだろうな
ちょっとコードをはってみろ
381:379
09/09/27 04:07:10
class hogehoge
def mastery_open_flag
MASTERY_ARRAY::HASH_DATA[1].each{|i|
open_flag = true
if MASTERY_ARRAY::HASH_DATA[1][i].is_a?(Fixnum)
MASTERY_ARRAY::HASH_DATA[1][i].each{|index, level|
unless @actor.mastery_level_data[index] >= level
open_flag = false
end
}
if open_flag
@actor.mastery_open_data[i] = true
end
end
}
end
end
エラーはTypeErrorで
cannot convert Hash into Integerと出ます
382:379
09/09/27 04:08:30
module MASTERY_ARRAY
HASH_DATA[1] = [
0, 0, {0 => 5, 1 => 3}, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]
end
モジュールの配列です。
383:デフォルトの名無しさん
09/09/27 04:19:58
どの行でそんなエラー出てるんだい
384:379
09/09/27 04:28:48
if MASTERY_ARRAY::HASH_DATA[1][i].is_a?(Fixnum)
ここです
配列のインデックス2のハッシュ読もうとしたら出ます
385:デフォルトの名無しさん
09/09/27 04:35:08
mastery_open_flag の MASTERY_ARRAY::HASH_DATA[1].each{|i| ... } の i に hash が
きてるからだろう。
i = {0 => 5, 1 => 3}
if MASTERY_ARRAY::HASH_DATA[1][i].is_a?(Fixnum)
状態で配列のインデックスにハッシュをブチ込んで、
整数に変換できないよエラーになってる。eachの i にインデックスが入ると勘違いしてない?
386:デフォルトの名無しさん
09/09/27 04:38:30
URLリンク(www.ruby-lang.org) の each と each_index をよく読むといい
って、eachの例がeach_indexの結果と区別つきにくいね…1,2,3じゃない例つかえばいいのに
387:379
09/09/27 04:40:24
あーそういうことですか
インデックス入らないと困るんですが
何かうまい書き方ありますか?
とりあえず考えてみます
あったらお願いします
ありがとうございました
388:デフォルトの名無しさん
09/09/27 04:47:09
each {|要素| ... }
each_index {|インデックス| ... }
each_with_index {|要素, インデックス| ...}
389:デフォルトの名無しさん
09/09/27 04:49:28
用件は「要素が整数であること」なんだろうか
「要素がハッシュであること」なんじゃなかろうか
MASTERY_ARRAY::HASH_DATA[1].each{|e|
open_flag = true
if e.kind_of?(Hash)
e.each_pair{|index, level|
open_flag = false unless @actor.mastery_level_data[index] >= level
}
end
@actor.mastery_open_data[e] = true if open_flag
end
390:379
09/09/27 04:58:13
おーすごいさすがプログラム板
each_indexで動きましたありがとうございます
389さんが書いたとおり「要素がハッシュであること」が評価の大筋です
kind_of?(Hash) これは知りませんでした
なんとかいけそうですありがとうございました
391:デフォルトの名無しさん
09/09/27 05:02:31
>>389
@actor.mastery_open_data[e] = true の e は each_with_index の i だと思う
要はナントカデータは全部要素数 100の配列なんだろう
マス目みたいに決まっててアクセス手段がインデックスしかないんだ
MASTERY_ARRAY::HASH_DATA[1].each_with_index{|e, i|
open_flag = true
e.each_pair{|index, level|
open_flag = false unless @actor.mastery_level_data[index] >= level
} if e.kind_of?(Hash)
@actor.mastery_open_data[i] = true if open_flag
}
392:デフォルトの名無しさん
09/09/27 13:24:58
Win32で一文字入力してすぐ制御を返すサンプルないですか?
393:デフォルトの名無しさん
09/09/27 13:44:36
Curses.getch は?
394:デフォルトの名無しさん
09/09/27 18:44:37
ありがとう。
Winにもcursesってあるのか。
395:デフォルトの名無しさん
09/09/27 18:53:34
>>394
普通に導入可能だよー
396:デフォルトの名無しさん
09/09/27 21:22:24
rubyでCGIの勉強しようとおもって
lighttpdをインストールしました。
ところが、設定方法がわからず、htmlは表示出来るのですが
cgiが動きません。涙目状態です。あちこちググりました・・・
途方にくれています・・・
397:デフォルトの名無しさん
09/09/27 21:25:08
mongrelをいれるといいよ
398:デフォルトの名無しさん
09/09/27 21:26:57
力になっちゃあげたいけど、スレ違いかな・・・
WebProg板か、どっかにLighttpdのスレがあるから、そこで質問したらいいよ
399:デフォルトの名無しさん
09/09/27 21:28:09
SocketってライブラリがあるからそれでWebサーバ書くのがいいと思うな
というか環境や参考にしたページをどこまで試してどこで詰まったとか
そういうのも無しに答えられるわけないので
400:デフォルトの名無しさん
09/09/27 21:30:33
それが無いこと自体が答だろ
つまり、サーバ立てる知識が無い
401:デフォルトの名無しさん
09/09/27 21:32:26
>>398
lighttpdのスレは先に見ました。最終書き込みが8月、その前が6月くらいと
人の気配が感じられませんでした・・・
402:デフォルトの名無しさん
09/09/27 21:36:43
どう転んでもWebサーバの挙動の知識は必要になるわけなんだし
普通にゼロから勉強したほうが早いんだけどね
403:デフォルトの名無しさん
09/09/27 21:36:52
Linuxなら各ディストリの初心者スレにいけば、誰かが教えてくれそう。
404:デフォルトの名無しさん
09/09/27 21:40:14
>>402
まったくだぬ
「WebサーバやHTTPはお着せとコピペで済ませて本題のRubyの学習をしよう」というのは
CGI関連に限ってはありえん
405:デフォルトの名無しさん
09/09/27 21:44:58
>>404
翻訳しながら、lighttpdの本家のページ見てみます。
mongrelも検討してみます。
apacheの設定よりは、ずいぶん楽そうに見えたんですが。。
406:デフォルトの名無しさん
09/09/27 21:47:26
中途半端にマイナーなサーバソフトウェアだと情報が全くないということはばしばしある
めっちゃメジャーなのを小規模で使うのが結局マシだったりすることは意外と多い
407:デフォルトの名無しさん
09/09/27 21:50:40
自分用WebサーバはApacheを接続数とか1人用に絞って使うのが一番だという結論になった
408:デフォルトの名無しさん
09/09/27 21:50:52
>>396はどう動かないか書いていないから誰も助けようがないよ。
cgiがどう動かないのさ。スクリプトを貼ったりしろよ。
409:デフォルトの名無しさん
09/09/27 22:02:07
Apacheの方が情報多いのに。
410:デフォルトの名無しさん
09/09/27 22:03:40
>>408
/var/wwwがドキュメントルートディレクトリで、ここに1.html
/usr/lib/cgi-binがcgiディレクトリに、1.cgi
1.htmlで、action=/usr/lib/cgi-bin/1.cgiと記述。
ブラウザで、localhost/1.htmlを表示。ボタンを押すと
404 not foundとなります。
lighttpd.confでのcgiディレクトリ指定が間違ってるんかなぁと・・
411:デフォルトの名無しさん
09/09/27 22:13:48
ログをまずは見ようぜ。
1.cgiに実行権限がついているかとか1.htmlの読み込み権限とかもチェックしような
412:デフォルトの名無しさん
09/09/27 22:15:53
action=/usr/lib/cgi-bin/1.cgi っておかしいだろ… lighttpd とかにかかわらず
/usr/lib とか公開するとは考えにくいから action=/cgi-bin/1.cgi とかなんじゃないのか
この調子じゃ権限とかもだめそうだな
413:デフォルトの名無しさん
09/09/27 22:31:01
>>396
RubyでCGIの勉強をするなら、lighttpdから始めるのはオススメしない
cgi.rbを使って、WEBrick上 or Apache上で動かしてみるとか
Sinatra使うとかしたほうがいい
414:デフォルトの名無しさん
09/09/27 22:40:09
>>411
chmod 755はしてあります。
>>412
あ、cgi-binでいいんですね。フルパスにしちゃいました。
たしかに公開しないですもんね。
415:デフォルトの名無しさん
09/09/27 22:52:59
ファイルの所有者も確認しような
lighttpdを起動したユーザがownerだよな?
416:デフォルトの名無しさん
09/09/27 22:55:57
式がnil, false, 0なら偽になるif文てないの?
417:デフォルトの名無しさん
09/09/27 23:06:09
>>415
ファイルオーナーが、「root」ですね
lighttpdは、「www-data」が起動してます
sudo cpでファイルを/usr/lib/cgi-binにコピーすると
所有者が、ルートになってしまいます。
ちょっと、apacheや他のを調べてみます。みなさん、スレ違いに付き合って
くださって申し訳ありがとうございまsyた
418:デフォルトの名無しさん
09/09/27 23:18:45
>>416
!x || x== 0
'' や [] や {} も偽にしたいならActiveSupport入れてblank? と present?
を使え。
419:デフォルトの名無しさん
09/09/27 23:23:03
>>418
それだとnil, false, 0で真になるんだけど。偽がほしいんですが無理なんですか?
420:デフォルトの名無しさん
09/09/27 23:29:26
x && x != 0
どんだけ応用力ないのかな…
421:デフォルトの名無しさん
09/09/27 23:33:29
いかにも落とし穴がありそうだと漏れのアンテナが反応しております
422:418
09/09/27 23:35:35
すまん逆転させるのわすれてた。てへ。
423:デフォルトの名無しさん
09/09/27 23:49:22
>>417
ファイルの権限を777にして実行してみな。
それで実行できれば権限関係の設定がおかしかったってことだ
linuxの基礎を勉強私的な。
424:デフォルトの名無しさん
09/09/28 10:48:55
Digest::MD5.digest の値を hexdigest に変換する計算式を教えてください。
convert(Digest::MD5.digest(value)) == Digest::MD5.hexdigest(value)
となるようなconvert()です。
あるいはヒントでもいいのでお願いします。
425:デフォルトの名無しさん
09/09/28 10:59:18
そのへんはさすがにマニュアルにも書いてあるだろ
> 与えられた文字列に対するハッシュ値を、ASCIIコードを使って 16進数の列を示す文字列にエンコードして返す。
ということで
irb> p Digest::MD5.digest('12345')
"\202|\313\016\352\212plL4\241h\221\370N{"
irb> p Digest::MD5.hexdigest('12345')
"827ccb0eea8a706c4c34a16891f84e7b"
irb> p Digest::MD5.digest('12345').unpack("H*")[0]
"827ccb0eea8a706c4c34a16891f84e7b"
426:デフォルトの名無しさん
09/09/28 11:12:25
>>425
ありがとうございます。
1バイトずつ16進数に変換するということなので、こう理解しました。
irb> Digest::MD5.hexdigest('foo')
=> "acbd18db4cc2f85cedef654fccc4a4d8"
irb> Digest::MD5.digest('foo')
=> "¥254¥275¥030¥333L¥302¥370¥¥¥355¥357eO¥314¥304¥244¥330"
irb> Digest::MD5.digest('foo').unpack('C*') # 1バイトずつに分解
=> [172, 189, 24, 219, 76, 194, 248, 92, 237, 239, 101, 79, 204, 196, 164, 216]
irb> Digest::MD5.digest('foo').unpack('C*').collect{|c| '%x' % c } # 16進数に変換
=> ["ac", "bd", "18", "db", "4c", "c2", "f8", "5c", "ed", "ef", "65", "4f", "cc", "c4", "a4", "d8"]
irb> Digest::MD5.digest('foo').unpack('C*').collect{|c| '%x' % c }.join == Digest::MD5.hexdigest('foo')
=> true
なるほどー。
どうもでした。
427:デフォルトの名無しさん
09/09/28 20:26:36
Dir.foreach('hoge'){|filename|
filename.match(/(aaa)(bbb)/}
print $1
}
この状況で、$1や$2の情報を配列に入れるにはどうすればいいですか?
具体的にはこの後、$1の内容について一つ一つ処理をしていきたいんです。
428:デフォルトの名無しさん
09/09/28 20:39:11
ary = []
Dir.foreach('hoge'){|filename|
filename.match(/(aaa)(bbb)/}
ary << [$1, $2] # もしくは ary << $1 << $2
}
p ary
429:デフォルトの名無しさん
09/09/28 20:47:13
filename.scan(/(aaa)(bbb)/)
430:デフォルトの名無しさん
09/09/28 20:51:17
>>428
「<<」ってこういうところで使うんですね。
勉強になりました。ありがとうございました!
431:デフォルトの名無しさん
09/09/29 00:50:52
rubyを使ってgnuplotで簡単にグラフを書きたいんだけど、
何かお勧めありますか?
432:デフォルトの名無しさん
09/09/29 08:15:40
h = YAML.load_file(path)
@username ||= h[:user]||h[:username]||h[:id]||h['user']||h['username']||h['id']
@password ||= h[:pass]||h[:password]||h['pass']||h['password']
イライラ
433:デフォルトの名無しさん
09/09/29 12:52:20
エディタから編集中のRubyのスクリプトを独立したウィンドウ、ターミナルで起動したい
エラーがあったらエディタがそれを取り込んでタグジャンプしたい
teeやら別のモジュールをrequireするのはなるべく避けたい
もちろんユーザーはputs/getsを制約なく使いたい
といううまいやり方ってないですか?
ようするにエラーが出たらそれだけをログファイルに書き込んでrubyは終了コード1を返したいです
標準エラーをファイルに書き込むようなファイルをこっそり-rするのが現実的なんですかね
434:デフォルトの名無しさん
09/09/29 13:06:42
>>433
Emacs使え
435:デフォルトの名無しさん
09/09/29 13:10:50
標準の ruby-mode で M-x run-ruby で Emacs 内に irb 開いて
M-x ruby-load-file → Enter すれば irb でファイルが実行されるな
エラー行ジャンプはどうしようか
436:デフォルトの名無しさん
09/09/29 14:56:39
>>432
>h = YAML.load_file(path)
>@username ||= h[:user]||h[:username]||h[:id]||h['user']||h['username']||h['id']
>@password ||= h[:pass]||h[:password]||h['pass']||h['password']
YAML使ってるなら、キーは文字列になるだろうから、Symbolは考えなくていいんじゃないかな。
YAMLでわざわざSymbolをキーに使うとは考えにくい。
@username ||= h['user'] || h['username'] || h['id']
437:デフォルトの名無しさん
09/09/29 19:21:13
1万PVのPHPで作られたサイトをRuby(ROR)かScala(Lift)どちらかを使って
バージョンアップしようと計画していますが、どちらがお勧めでしょうか?
TwitterもRubyからScalaへ書き換えたりしていますので...
438:デフォルトの名無しさん
09/09/29 19:28:02
問題ないならPHPのままにしておく
439:デフォルトの名無しさん
09/09/29 19:33:59
scalaって日本でも実績あるの?
440:デフォルトの名無しさん
09/09/29 20:17:30
1万PVって何かを説明してるように見えて、実際はまったく説明してないよなあ。
開設以来10年で1万PVなのか、毎秒1万PVなのか。
441:デフォルトの名無しさん
09/09/29 20:21:10
>>434-435
特定のエディタの話はしてないんだけど…
442:デフォルトの名無しさん
09/09/29 20:22:53
一応、単位としては1日か1ヶ月かのどっちかだな
1日1万PVならコンテンツによってはまあ普通
1ヶ月1万PVなら内容によっては閉鎖したほうがエコ
どっちにしてもPHPで動いてるならPHPで増強したほうがきっと楽だ
443:デフォルトの名無しさん
09/09/29 20:24:12
>>441
だからEmacs使えって
どうせ使いもしないで脳内で考えてるんだろ
444:デフォルトの名無しさん
09/09/29 20:28:12
エディタの布教は余所でやれ。
445:デフォルトの名無しさん
09/09/29 20:32:33
求めること全部できるんだから仕方あんめえ
エディタとして動作するものではEmacs以外ではgvimかPeggyくらいしか心当たりがない
どう動作するのが効率いいかの研究もEmacsの動作見れば丸分かりだ
446:デフォルトの名無しさん
09/09/29 20:35:49
特定のエディタじゃなくて何を求めてるんだ
どんなエディタでも連携して動く万能スクリプトが欲しいのか
447:デフォルトの名無しさん
09/09/29 20:38:44
>>446
たぶんそうだと思う
エディタ内でシェルを起動するのでなければ
emacsclient みたいなシステムがないと無理だと思うんだけどね
というか、できないからこそ数十年かけて Emacs が M-x compile を進化させてきたのではないんかのう
448:デフォルトの名無しさん
09/09/29 20:43:52
うん、Emacsのとか使ってれば「Rubyは特に関係ない」ということにすぐ気づけたはずなのに
コンパイラ等が異常終了コードをシェルに返してエラー行を標準出力などに表示さえしてくれれば用は済む
449:デフォルトの名無しさん
09/09/29 20:45:04
$stderr.reopen($0 + ".errorlog")
450:デフォルトの名無しさん
09/09/29 20:54:21
>>442
単純にPVって言ったら普通に日単位だろ
何この馬鹿
451:デフォルトの名無しさん
09/09/29 23:38:21
>>437
>1万PVのPHPで作られたサイトをRuby(ROR)かScala(Lift)どちらかを使って
>バージョンアップしようと計画していますが、どちらがお勧めでしょうか?
どういう理由でバージョンアップしようとしているのかがわからないので、答えられる人はいないでしょう。
パフォーマンスが理由ならRoRはイバラの道だし、開発効率が理由ならLiftはイバラの道。
どちらの道を選んでもイバラの道だと思うので、PHPのまま改善することをお勧めします。
あるいはPythonを使ってGoogleAppEngineにするとか。これもイバラだな。
452:デフォルトの名無しさん
09/09/29 23:47:46
railsは慣れてしまえば今までの開発が馬鹿に思えるぐらい楽になる
453:デフォルトの名無しさん
09/09/29 23:49:40
日に1万PV程度なら、サーバ丸1台あればRoRでも余裕だよ。
下手するとキャッシュなしでもいけるくらい。
454:デフォルトの名無しさん
09/09/30 00:35:22
そりゃ1日8万秒以上あるんだから言われなくても分かる
455:デフォルトの名無しさん
09/09/30 06:13:47
結局ピーク性能が足りるかどうかだよな。
456:デフォルトの名無しさん
09/09/30 08:24:47
そして既存のPHP+サーバではおそらく足りてるわけであって、
現時点で言えることは「じゃあPHPでやっとけ」にしかならんという
457:デフォルトの名無しさん
09/09/30 10:56:30
でも結局ピーク性能が足りるかどうかだよ。
458:デフォルトの名無しさん
09/09/30 11:42:46
おいちょっと待てよ、ピーク性能が足りてるかどうかが問題だろ
459:デフォルトの名無しさん
09/09/30 11:46:40
WebProg板に帰れ
460:デフォルトの名無しさん
09/09/30 12:24:24
1ヵ月1万PVwww
461:デフォルトの名無しさん
09/09/30 12:57:50
いや、ここはピーク性能が足りるかどうかが肝だろ。
462:デフォルトの名無しさん
09/09/30 18:46:43
全角の数字を半角にしようと下記のフィルタつくったんだけど
変換されないで、元の値が戻ってくる。
何が間違ってるか教えてください。
使う文字コードはUTF-8です。
#全角数字を半角数字に変換するフィルタ
def zen_to_han_int(str)
outstr = str.gsub(/0/,"0")
outstr.gsub!(/1/,"1")
outstr.gsub!(/2/,"2")
outstr.gsub!(/3/,"3")
outstr.gsub!(/4/,"4")
outstr.gsub!(/5/,"5")
outstr.gsub!(/6/,"6")
outstr.gsub!(/7/,"7")
outstr.gsub!(/8/,"8")
outstr.gsub!(/9/,"9")
return outstr
end
463:デフォルトの名無しさん
09/09/30 18:52:32
>>462
str とスクリプトファイルの文字コードが合ってない
ごく一般的には str とスクリプトの正規表現リテラルの文字コードは同一にする
…あーつまりスクリプトのファイルが UTF-8 じゃないか str が UTF-8 じゃないか
あるいは ruby -Ku のような実行指定をしてないかどれか
464:デフォルトの名無しさん
09/09/30 18:53:19
今はじめて気がついたけどメイリオって数字が全角と半角全く同じに見える。きめぇw
465:デフォルトの名無しさん
09/09/30 18:54:43
def zen_to_han_int(str)
p "yes!" if /0/ =~ str
end
これで 0 を含む文字列渡したときに "yes!" と表示されなければ>>463
466:デフォルトの名無しさん
09/09/30 20:10:23
むしろ、メイリオになってから、半角全角混同さんが気にならなくなりました ^p^
467:デフォルトの名無しさん
09/09/30 20:12:28
やっとWindowsに標準添付された真の意味での表示用のフォントだからな
表示されるぶんには全角半角の区別がある意味は何もないわけで
つまり区別が必要な人は使ったら駄目よ
468:デフォルトの名無しさん
09/09/30 20:25:22
>>463-465
見直したら、スクリプトがS-JISでかかれてました。
$JCODE = "UTF-8"
ってやってもだめなのね
もうひとつ、お願いします。
#数字に変換できるか
def intrger_string?(str)
begin
Integer(str)
return true
rescue ArgumentError
return false
end
end
Rubyレシピブックのまるぱくりなのですが
3桁の先頭に0を含む文字列を渡すとfalseになる場合があります。
例えば078から099までのあいだとか
これも原因が良くわかりません。
どなたか教えてください。
469:デフォルトの名無しさん
09/09/30 20:30:25
>>468
8進数
470:デフォルトの名無しさん
09/09/30 20:30:28
該当メソッドのマニュアルくらい読め
URLリンク(www.ruby-lang.org)
マニュアル読んだ上でここがわからんとかそういう質問してくれ
どうせマニュアル読んで調べてる時間のほうが長いんだから、マニュアルの見方を勉強したほうが結局は得だ
471:デフォルトの名無しさん
09/09/30 21:18:02
>>468
$JCODEってなんやねん
472:デフォルトの名無しさん
09/09/30 21:21:37
>>468
0x1234 とかも渡してみろ。
473:デフォルトの名無しさん
09/09/30 21:47:46
>>468
正規表現じゃだめなん?
del integer_string?(str)
return str =~ /¥A¥d+¥z/
end
474:デフォルトの名無しさん
09/09/30 22:25:26
>>469-470
お恥ずかしいです
下記のように書き直しました
def intrger_string?(str)
if str.gsub(/\d/,"").size == 0 then
return true
else
return false
end
end
>>471
$KCODEの間違えです(´Д⊂
475:デフォルトの名無しさん
09/09/30 22:32:57
>>473
それだと2/8/16進表記に対応してないから>>468とは別物になるぞ
476:デフォルトの名無しさん
09/09/30 22:56:18
>>474
メソッド本体だが、ifの条件式が
成立したら(=false, nil以外を返ったら)true
成立しなかったら(=falseかnilが返ったら)false
を返すだけなので、その条件判定式だけでruby的には十分。
ところで str == '' のときはtrue/falseどっちになって欲しいのだろう?
477:デフォルトの名無しさん
09/10/01 08:49:38
>>475
十進だけにしたいんだろ
/\A\d+\z/ =~ str が最善だと思う
478:デフォルトの名無しさん
09/10/01 11:28:02
hoge= メソッドと hoge メソッドって、どっちが先に定義されてると自然?
reader があってから wiriter があるとわかりやすいよね?
479:デフォルトの名無しさん
09/10/01 14:25:42
attr_reader :hoge
def hoge=(value)
でやるのが俺の定番
でも両方書くなら書きやすさ的にライタ側から書くかなあ
480:デフォルトの名無しさん
09/10/01 16:38:52
ここの真ん中辺のコードなんですが
URLリンク(www.aoky.net)
wordlist.rb
code_words = {
'スターモンキー' => '新帝国の神経質な閣僚のフィルとピート',
'カタパルト' => 'chuckyゴーゴー', '火炎瓶' => '暖房つきのリビング',
'ナイジェリア' => "Ny and Jerry'sドライクリーニング(ドーナッツ付き)",
'とどめをさす' => 'コンセントをさす'
}
require 'wordlist'
# 邪悪なアイデアを取ってコードワードと入れ替える
print "新しいアイデアを入力してください: "
idea = gets
code_words.each do |real, code|
idea.gsub!( real, code )
end
メソッドdoのブロック引数で、real, codeの二つが出てきます。
これはなんですか?意味がわからないです。。。
コピペで、rbファイルを2つ作って、下のコードをruby hoge.rbとして実行しても
想定通り動きませんし・・・
481:デフォルトの名無しさん
09/10/01 16:53:16
>>480
こゆこと
これなんぞと思ったら出力して中身を見れ
code_words.each do |key, value|
puts "#{key} -> #{value}"
end
ナイジェリア -> Ny and Jerry'sドライクリーニング(ドーナッツ付き)
カタパルト -> chuckyゴーゴー
スターモンキー -> 新帝国の神経質な閣僚のフィルとピート
火炎瓶 -> 暖房つきのリビング
とどめをさす -> コンセントをさす
482:デフォルトの名無しさん
09/10/01 16:54:10
だからそういう文法というか基本クラスのメソッドの使い方っぽいのは
マニュアルを一応眺めてから「ここの部分がさっぱりわからんおまえら親切に教えろ」とか言ってくれ
親切かどうかはともかくおおむね解説なりツッコミなりが入るからさ
URLリンク(www.ruby-lang.org)
> key と value を引数としてブロックを評価します。 self を返します。
{:a=>1, :b=>2}.each_pair {|k, v| p [k, v]}
# => [:a, 1]
[:b, 2]
483:デフォルトの名無しさん
09/10/01 16:54:20
doはメソッドではない。ではdoでなければメソッドは何でしょう?
484:デフォルトの名無しさん
09/10/01 16:59:00
>>482
それはマニュアルを読むだけの力があるのに
手抜きして読まない人向けのお言葉
485:デフォルトの名無しさん
09/10/01 17:00:29
>>483
do はブロック開始の(予約)文字列
メソッドに引数を渡すときの ( と ) それそのものがメソッドではないのとおおむね同じ理屈
文字列だからたまたま読めるだけで、別に <<<<<< >>>>>> でもよかった
486:デフォルトの名無しさん
09/10/01 17:06:57
>>481
eachメソッドがハッシュに対して使われたときは、その引数は
|key,value|という形になるわけですね。
>>482
申し訳ないです。
>>483
481の結果からすると、each(すべての要素にたいして)do以下を行えという
ことだと思いますが、メソッドでないならdoはなんだろう。
487:デフォルトの名無しさん
09/10/01 17:14:30
>>481
実行してみました。
undefined local variable or method `code_words' for main:Object (NameError)
というエラーが出ました。code_wordsが定義されていない?
488:デフォルトの名無しさん
09/10/01 17:20:19
初心者が最初にwhyの感動的rubyガイドで勉強するのは
不適切だったりしますか?
489:デフォルトの名無しさん
09/10/01 17:44:46
>>488
こっちのが無難
URLリンク(www1.tf.chiba-u.jp)
490:デフォルトの名無しさん
09/10/01 17:56:55
>>486
だから、doは予約語だってば。
ifがメソッドでないのと同じ。
491:デフォルトの名無しさん
09/10/01 18:12:37
> >>483
> 481の結果からすると、each(すべての要素にたいして)do以下を行えという
> ことだと思いますが、メソッドでないならdoはなんだろう。
そのeachはなんですか?
すべての要素にたいして、というおまじないか何かですか?
プログラミング言語はそういうふわふわとしたものではないです。
492:デフォルトの名無しさん
09/10/01 18:21:35
おまいら、ここは初心者スレだ。
初心者っつーのはとんでもない思い込みや勘違いをしていることも多いんだから
あたたかい目でみてください。
>>486
>メソッドでないならdoはなんだろう。
すでに指摘があるように、doは構文を表す予約語のひとつです。
while i < 10 do
print i
end
では、whileやdoやendが予約語です。なおこの場合ならdoは省略可能。
[1, 2, 3].each do |x| puts x end
なら、each や puts はメソッド名、do と end は構文を表す予約語。
493:デフォルトの名無しさん
09/10/01 18:39:54
do が何だかわかりませんレベルの人には来て欲しくないな
質問するなら最低限、言語の基礎は身に付けておいて欲しい
これくらいは自力で学習、調査しておくのが質問する側のマナーだろう
494:デフォルトの名無しさん
09/10/01 18:42:28
そもそも、動作としては arr.each(ブロック) なんだよ
オブジェクト arr の インスタンスメソッド each に引数でブロックを与えている
ただ、便利なブロックがこのままだとたいそう使いにくいので
[1,2,3].each(do |e| p e endのブロック、ただし実行できるならこのブロックを要素ごとに実行すること)
といちいちテクニカルにする代わりに
[1,2,3].each do |e|
p e
end
と平易に書くように Ruby を作ったのだ
このへんの動作が気になるなら
my_block = lambda do |e|
p e
end
[1,2,3].each(&my_block)
とでも書いてみるといい
495:デフォルトの名無しさん
09/10/01 18:58:26
>>493
思考過程の筋が見えるなら特に問題はないと思われ
まあ、つまりは「勝手に省略せず詳しく書け」ということでしかないわけだが
若干のエスパー能力が要るから万人には勧められない
496:デフォルトの名無しさん
09/10/01 19:29:15
理解としては>>486でまったく問題ないのになんでこんなことになってるんだ
497:デフォルトの名無しさん
09/10/01 20:58:03
申し訳ありません。whyのrubyガイドが
最初の方は、とてもわかりやすかったのです。
読み進めていると、コードが出てきて、ruby ファイル.rbと実行しても
エラーが出たりするようになり、僕はアホなのだろうかと思って質問しました。
初心者向けとして適当でないようなので、もうすこし文法を押さえながら
読んでみようと思います。ありがとうございました。
498:デフォルトの名無しさん
09/10/01 23:29:17
>>493
>do が何だかわかりませんレベルの人には来て欲しくないな
おまえは>>1を声に出して10回よめ。
この程度が我慢できないやつはこのスレくるな。
499:デフォルトの名無しさん
09/10/01 23:41:55
でも>>493程度が我慢できない人は2chに来るべきじゃないよね。
500:デフォルトの名無しさん
09/10/01 23:45:19
せめてネタ系のスレで頑張ってもらえるとありがたいんだけど
そうもいかないんだろうね
501:デフォルトの名無しさん
09/10/02 00:48:12
rubyに限らず初心者スレッドは全てを受け入れる糞溜だと思ってる
502:デフォルトの名無しさん
09/10/02 05:22:34
日本語の文字抽出でうまい方法が分からず困っています。
抽出元のサンプルは下記の通り
11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69
上記サンプルのうち、「この、文字列を抽出したいんdesu.」の部分を抽出したいんです。
抽出対象:日本語、句読点、日本語文字列に付随する半角英数字、半角記号("テスト."等。空白類を挟んだら不要対象とする)
不要対象:半角英数字、半角記号、空白、"○"、"×"等
現在のコードは下記の通り
while line=gets
if /\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*/ =~ line
if $1 != " "
print "日本語抽出:", $1, $2, $3,$4,$5,$6,"\n"
end
end
end
実行結果↓
日本語抽出:○ × ::この&カ字列を抽盾オたいん
(続きます)
503:デフォルトの名無しさん
09/10/02 05:25:20
(続き)
if文の条件が大変なことになっているのは
if /(\W+)/ =~ line
としてしまうと最初の"○ ×"のみ抽出して終わってしまうためです。
プログラムとして力技で美しくないのは分かっています。
また、日本語が文字化けしてしまっています・・・文字コードの問題だろうとソース先頭に#!ruby -Ksを足してみましたが、
空白類の扱いが変わった?のと記号以外の文字類が表示されなくなりました。
抽出部分を綺麗にするにはイテレータで回せば良いかなと思っています。
→一文字ずつチェックしようと思いましたが、String#each_byteが全半角を問題なく捌けるのか問題が・・・
問題をまとめると
1:文字列の中から上記抽出対象のみ抽出したいが、力技で汎用性がないので改善したい
2:文字化けしてしまうが原因、対策が分からない
となります。
OSはWindows XP SP3でRubyのバージョンは1.8.6です。
長文乱文で分かりにくい質問となってしまい申し訳ありませんが、よろしくお願いします。
504:デフォルトの名無しさん
09/10/02 05:32:32
まあrubyはメゾットの様なものが多いのも事実だけどな。
そこらの統一性の無さは、原理追求派よりも教祖信仰派のほうが多いってだけじゃないかと。
メゾットだからこうって寄りも、教祖がこう使う様に教えたから深く考えずに同じ様に使うのほうが、良いruby信者に成れる気がする。
505:デフォルトの名無しさん
09/10/02 05:36:40
irb> s = "11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69"
irb> puts s.split[6]
この、文字列を抽出したいんdesu.
空白で区切られた7フィールド目という意味ならこれでいいのでは
フィールド内に半角空白が混じっても構わないという条件だととたんに面倒になるが
506:503
09/10/02 06:02:35
>>505
レスありがとうございます。
すみません、確かにサンプルに限定すればそれで解決ですね。
ただ、やりたいのは日本語部分(日本語文字列に付随する記号類、英数字は抽出対象とする)の抽出なのです。
質問の書き方が悪かったのですが、おっしゃる通り、日本語列の中の空白、記号、英数字、
もしくは日本語列の先頭・末尾の半角英数字、記号類は抽出したいんです。
(日本語列と結合していない日本語以外(英数字、記号、空白類)は除外)
507:デフォルトの名無しさん
09/10/02 06:13:51
結合ってなんだ?
508:503
09/10/02 06:21:11
>>507
付随と同義です。ややこしくてすみません。
文字列の結ご・・・連結ですね。すみません。
509:デフォルトの名無しさん
09/10/02 06:46:02
>>507
おそらく、セパレータとフィールドという概念がないんだと思う
だから、元データを作った人の意図を読むことができないし、説明もできてないから俺らもどうにもできん
たとえば、俺らは>>502を見たときに
「番号、マルバツ、マルバツ、英数字、時分秒、英数字、日本語入り文字列、年月日、時分秒、数字」
という空白で区切られた固定の何らかの意味を持った10項目(または年月日+時分秒の9項目)と読むが、
>>503にとってはおそらくそうではないのだろう
ひょっとしたら例示のために出しためちゃくちゃな文字の集まりなのかもしれない
空白の数には全く意味がなく、
形態素解析のように「空白で区切られた、日本語文字を含む文字の連なり」が欲しいのなら
split.find_all{|e| <eがShift_JISの日本語文字を含むということ> }
とすればよい
Shift_JIS (というかたぶん CP932)の日本語文字を含む条件を表す正確な正規表現はどっかから拾え
irb> s = "11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69"
irb> puts s.split.find_all{|e| /[\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]/n =~ e}.delete_if{|e| /\A[○|×|△]\Z/s =~ e}
この、文字列を抽出したいんdesu.
510:デフォルトの名無しさん
09/10/02 10:01:18
>>503
>>509のようにsplitで配列にしてからfind_allでもいいし
文字列に繰り返し正規表現をしたいのならscanてのもある
Array,String,Hash,Enumerableあたりのメソッドは軽くリファレンスに目を通しておくといいよ
へぇこんなのあるんだっていう程度でも使う時に思い出せる
511:デフォルトの名無しさん
09/10/02 10:02:44
-Ksを指定するとShift_jis全角文字も\wでマッチするようになる
512:デフォルトの名無しさん
09/10/02 10:18:29
>>511
「も」では駄目だろ
英数字記号だけの場合はマッチしてはいけない
irb> /\w/ =~ "あういえ".tosjis
nil
irb> $KCODE = 's'
irb> /\w/ =~ "あういえ".tosjis
0
irb> /\w/ =~ "a"
0
全角文字(と場合によっては半角カタカナ)にのみマッチする正規表現か、
英数字記号だけにマッチして全角区域に誤爆しないという正規表現が必要
513:デフォルトの名無しさん
09/10/02 10:32:08
>>512
ああすまん-Ksにして結果が変わった原因ってことで書いただけなんだ
514:デフォルトの名無しさん
09/10/02 11:09:04
ruby って、ライブラリやクラスメソッドの使い方を
覚える言語ってことですか?
515:デフォルトの名無しさん
09/10/02 11:10:33
オブジェクト指向言語は大体そんなもんだ
516:デフォルトの名無しさん
09/10/02 11:26:59
大抵のプログラミング言語において、文法なんて数時間で全部理解し終えるもんだからなあ。
後は当然ライブラリの使いこなしってことになるだろう。
517:デフォルトの名無しさん
09/10/02 11:32:04
クラスメソッドよりもインスタンスメソッドのほうが多いよ!
とかそんな話を
別に覚えなくてもいいけど、その場合はライブラリに相当するものを全部自力で作ることになる
どっちか気に入ったほう選んでくれ
518:デフォルトの名無しさん
09/10/02 13:13:39
Windows版のRubyって、OpenSSLも使えるんでしょうか。
知っている人がいたら教えてください。
519:デフォルトの名無しさん
09/10/02 13:22:50
パッケージ次第だった気もするけど、基本的に使える
520:デフォルトの名無しさん
09/10/02 13:24:35
>>518
推奨されてるパッケージでインストールする限りは使えるはず
他の人のWindows版でも絶対に使えるとは限らないのは他のOS版のRubyと同じ
521:デフォルトの名無しさん
09/10/02 13:42:25
ありがとうございます。
RSAの仕組みを勉強するのにRubyを使うことにします。
522:デフォルトの名無しさん
09/10/02 14:40:48
rubyでは、値がすべてオブジェクトということは
1という数値や"太陽パクパク"という文字列や、それらを代入した
number,sun_eaterといった変数もオブジェクトということですか?
number = 1
sun_eater = "太陽パクパク"
523:デフォルトの名無しさん
09/10/02 14:59:20
>>522
整数とかはさすがに高速処理するように小細工を施してはありますが、
それらも含めオブジェクトは全部クラスのインスタンス(=オブジェクト)です
irb> p 1.class
Integer
irb> p "太陽パクパク".class
String
変数はオブジェクトについたラベルです
ラベル名 → オブジェクトID
というような対応表を Ruby が管理していて、
該当ラベルの変数が呼ばれたときにはその表の対応を参照して該当オブジェクトが使われます
変数というハコが入れ物オブジェクトとして存在するわけではありません
irb> p 1.object_id
3
irb> p "太陽パクパク".object_id
-605838888
524:デフォルトの名無しさん
09/10/02 15:06:21
>>522
>rubyでは、値がすべてオブジェクトということは
>1という数値や"太陽パクパク"という文字列や、それらを代入した
>number,sun_eaterといった変数もオブジェクトということですか?
数値や文字列もオブジェクト。
ただし、「変数」はそれらオブジェクトを格納するもの(あるいはオブジェクトとひもづけるもの)であって、オブジェクトそのものではない。
そのへんは他の言語でも同じ。
525:デフォルトの名無しさん
09/10/02 15:08:38
>>523
変数はオブジェクトじゃなくラベル。
あやうく、間違った認識で通り過ぎるところでした。
ありがとうございます。
526:デフォルトの名無しさん
09/10/02 15:10:25
>>524
他の言語でも同じなんですね。ありがとうございます。
527:デフォルトの名無しさん
09/10/02 15:50:19
C++、Perlでは宣言された変数自体がオブジェクトの実体であるケースもあるけどね
と、話をややこしくしてみる
528:デフォルトの名無しさん
09/10/02 17:55:56
他言語がどうであれ、Rubyにおいて変数は箱ではなくラベルなのは間違い無い
沢山あるオブジェクトの中のいくつかに名前を付けるのが変数
1つのオブジェクトに複数の名前があることも珍しくないし
無名のまま役割を終えるオブジェクトも存在する
529:デフォルトの名無しさん
09/10/02 17:58:09
だいなみっくえいりあしんぐ
530:デフォルトの名無しさん
09/10/02 18:04:25
2chまとめエディターを作っているのですがどうにもこうにもならなくなってしまったのでヒントをください。
やろうとしていることは
DATの中身をコピペで入力
↓
下ごしらえの置換
アンカー順に並べ替える
チェックボッックスによるdivのclassの追加(文字色を変えたり大きくしたりするため)
↓
ソースを出力
というものです。
ひとまずここまでひとりでつくりました。
URLリンク(tomiya.bne.jp)
やっていることは
簡単な置換とレスに1~1001までの番号をハッシュとして付ける
ことまでです。
教えて欲しいことは
アンカー順に並べ替える方法
本文をスキャンして「>>○○」を抽出しハッシュのkeyに代入?
チェックしたレスのみ出力する方法
チェックボックスでdivのclassを追加
<div class="res">を<div class="res aka">や<div class="res aka deka">などに置換?
です、見当がつきそうな方はどうかご教授ください。
531:デフォルトの名無しさん
09/10/02 18:26:40
オブジェクトについて、もうひとつ質問です。
class Gohan
def caree
print "今日のご飯はラーメンだ\n"
end
def natto
print "朝飯は納豆だ\n"
end
end
yuhan = Gohan.new
yuhan.caree
asamesi = Gohan.new
asamesi.natto
この場合、yuhanやasamesiがオブジェクトになるのでしょうか?
532:デフォルトの名無しさん
09/10/02 18:29:10
ARGVで漢字のフォルダ名が展開できず困っています。
英字だと
>ruby -e "p ARGV" hon/*
["hon/新規テキスト ドキュメント.txt"]
となってうまくいきますが、漢字だと
>ruby -e "p ARGV" 本/*
["本/*"]
となってしまい、フォルダ内の新規テキスト ドキュメント.txtが展開されません。
どうすれば展開できるかご教示ください。
OSはWindows XP SP3です。
>ruby -v
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
533:デフォルトの名無しさん
09/10/02 18:31:30
Ruby標準のCGIクラスって、どれぐらいの大きさのデータを受け取れるのでしょうかね?
DBの内容をWeb上からバックアップ(DL)したり、復帰させたり(UP)するシステムを考えてるのですが
バックアップするときは、ストリーミングで流せばいいような気がするけど
復帰させるときは、大量のデータが一度メモリに溜め込まれる気がします
たとえば、サーバの実メモリを超えるようなデータを受け取ったときに処理できるのか?っていうのが疑問です。
また、なにか回避策が有るのでしたら、教えてください。
534:デフォルトの名無しさん
09/10/02 18:35:45
ワイルドカードの展開ってシェルの役割じゃ・・・?
と思ったらWinではやってくれないのか
535:デフォルトの名無しさん
09/10/02 18:39:19
>>531
>>523
536:デフォルトの名無しさん
09/10/02 18:42:14
>>532
ARGV の処理は環境依存
コマンドプロンプトで
DIR 本/*
とやって、望みの出力が得られなければ ARGV では無理というかコマンドプロンプトの使い方の知識が足りない
537:532
09/10/02 18:50:17
>>536
それはうまくいきます。/の代わりに\ですが。
>dir 本\*
ドライブ D のボリューム ラベルは以下略
>ruby -e "p ARGV" hon\*
["hon/新規テキスト ドキュメント.txt"]
英字は/でも\でもok
>ruby -e "p ARGV" 本\*
["本\\*"]
漢字はどっともだめ
538:532
09/10/02 18:55:24
書き忘れ
>ruby -e "p ARGV" */*
["hon/新規テキスト ドキュメント.txt", "本/新規テキスト ドキュメント.txt"]
539:デフォルトの名無しさん
09/10/02 18:56:09
>>530
#!/usr/local/bin/ruby -Ks
class Ch2Thread
def initialize(file)
@dat = file
parse
end
attr_reader :data, :title, :size
def [](v); @data[v]; end
def parse
@data = Array.new
arr = @dat.to_a
arr.each_with_index do |res, i|
@data << parse_res(res, i)
end
@title, @size = arr[0].split(/<>/)[-1], @data.size
end
def parse_res(res, resno)
e = res.split(/<>/)
d = e[2].split
return {:no => resno + 1, :name => e[0], :mail => e[1],
:date => "#{d[0]} #{d[1]}", :id => d[2], :be => d[3], :res => e[3]}
end
end
sure = Ch2Thread.new(File.open('./sample.dat').read)
puts "Title => #{sure.title}"
sure[0..3].each do |res|
res.each{|k,v| puts "#{k} => #{v}"}
end
540:デフォルトの名無しさん
09/10/02 18:59:22
>>532
WinXP SP2 + ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
だけど展開してくれた。なんなんだろうね
541:540
09/10/02 19:02:24
SP3だった・・・
あとコマンドプロンプトから動かしてる?
専用エディタとかから走らせたりしてると挙動が違ってくるかも
542:デフォルトの名無しさん
09/10/02 19:03:55
>>532
ren 本 書
ruby -e "p ARGV" 書/*
1.9のglob周りは多バイト文字に関しては腐ってるね。
543:デフォルトの名無しさん
09/10/02 19:04:15
1.9.1リファレンスより
>標準のシェルがワイルドカードを展開しない環境 (Win32)では、Ruby インタプリタが自前でワイルドカードを展開して Kernel::ARGV に設定します。
らしいからできるはずだと思うけど
うち(Vista コマンドプロンプト)でも
1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]だと 本\* 本/* どっちも認識してくれるけど
1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]だとできなくなってるな
544:532
09/10/02 19:11:36
ご確認いただきありがとうございます。
うちも1.8.7はokでした。
1.9.1で通る漢字もありました。
>ruby -e "p ARGV" ホン/*
["ホン/新規テキスト ドキュメント.txt"]
>ruby -e "p ARGV" 川/*
["川/新規テキスト ドキュメント.txt"]
>ruby -e "p ARGV" 山/*
["山/新規テキスト ドキュメント.txt"]
545:デフォルトの名無しさん
09/10/02 19:14:53
Ruby Freaks Lounge 第8回 Windows版Ruby 1.9で培う危機回避スキル(前編)
URLリンク(gihyo.jp)
Rubyで日本語ファイル名と聞いた瞬間に悪寒がする漏れは正しかった