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


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

Ruby 初心者スレッド Part 31



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

★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
 なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の 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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

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

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

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

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

307 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 17:25:10 ]
C++ の vtbl の仕組みでは説明できません。
Ruby の場合「頼んで答えられれば答える」ただそれだけです。

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

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

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

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

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

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

313 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 17:44:20 ]
>>311 そんなあなたに Scala をどーぞ。

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

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

とか一緒



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

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

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

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

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

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

319 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 20:41:52 ]
Ruby のバージョンだけが問題なんだから RUBY_VERSION で場合分けすべきだよね
defined?(Encoding) は時々見るんだけど、何が目的なのかな

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

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

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

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

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



325 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 21:38:25 ]
エンコーディングではなさそうだけど:

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

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



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

327 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 09:01:16 ]
ダッチタイピングに空耳した

328 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 15:43:22 ]
だからRUBY_VERSIONで分岐すんなつってんだろ

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


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

330 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:45:12 ]
RUBY_VERSION 否定派は何も根拠がないのが笑える

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

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

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

333 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 17:47:57 ]
涙拭けよ

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



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

336 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 18:27:42 ]
>>336
それって全部同じ 'key' でも何か意味があるの?
keyは色々なものでってこと?

338 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 18:54:14 ]
結局、Encoding関連で今まで出た案をまとめると

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

あたりが現実的な解か

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

340 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 21:40:37 ]
dataは配列でいいんじゃないか?

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

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

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



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

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

346 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 22:39:09 ]
え!Hashの順番保持されるようになったのか

347 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 22:51:52 ]
どちらかというとネガティブな方向で話題になった気がする
順番記憶したら Hash じゃねえとか Rubyオワタ\(^o^)/ とか

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

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

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

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

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

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

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

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

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



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

だと思う

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

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

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


358 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 01:22:27 ]
確かに列挙は早そうだな

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

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

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

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

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

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



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


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

367 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 11:37:01 ]
>>338
>>328のmethod_defined?も。

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

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

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

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

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


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

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

374 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 20:35:44 ]
プログラムが止まったあと>>373がどう改修するのかにちょっと興味がある

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

376 名前:デフォルトの名無しさん [2009/09/27(日) 00:35:12 ]
blog.livedoor.jp/dankogai/archives/51183588.html
上のページに掲載されている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 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 00:49:00 ]
unpackが怪しい気がするから、Base64デコードしたデータのハッシュを、Perlのやつと比べてみたらどうかな?
あと、詳しくないんだけど、そもそもRawDeflateと普通のDeflateって同じものじゃないとか?

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

379 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 03:45:29 ]
配列の中にハッシュ入れたんですけど
a = [0, {1 >= 5}, 3]
これの配列データがFixnumかハッシュかどうかで処理を分けたいんですが
is_a?(Fixnum)で分岐させようとしたらエラーが出ました
classで調べたらエラーが出ます
どうすればいいんでしょうか?

380 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 03:56:08 ]
{1 >= 5} でエラーという落ちじゃないだろうな
ちょっとコードをはってみろ


381 名前:379 mailto:sage [2009/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 mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 04:19:58 ]
どの行でそんなエラー出てるんだい

384 名前:379 mailto:sage [2009/09/27(日) 04:28:48 ]
if MASTERY_ARRAY::HASH_DATA[1][i].is_a?(Fixnum)
ここです
配列のインデックス2のハッシュ読もうとしたら出ます



385 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 04:38:30 ]
www.ruby-lang.org/ja/man/html/Array.html の each と each_index をよく読むといい
って、eachの例がeach_indexの結果と区別つきにくいね…1,2,3じゃない例つかえばいいのに


387 名前:379 mailto:sage [2009/09/27(日) 04:40:24 ]
あーそういうことですか
インデックス入らないと困るんですが
何かうまい書き方ありますか?
とりあえず考えてみます
あったらお願いします
ありがとうございました

388 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 04:47:09 ]
each {|要素| ... }
each_index {|インデックス| ... }
each_with_index {|要素, インデックス| ...}


389 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/09/27(日) 04:58:13 ]
おーすごいさすがプログラム板
each_indexで動きましたありがとうございます
389さんが書いたとおり「要素がハッシュであること」が評価の大筋です
kind_of?(Hash) これは知りませんでした
なんとかいけそうですありがとうございました


391 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/09/27(日) 13:24:58 ]
Win32で一文字入力してすぐ制御を返すサンプルないですか?

393 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 13:44:36 ]
Curses.getch は?

394 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 18:44:37 ]
ありがとう。
Winにもcursesってあるのか。



395 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 18:53:34 ]
>>394
普通に導入可能だよー

396 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:22:24 ]
rubyでCGIの勉強しようとおもって
lighttpdをインストールしました。

ところが、設定方法がわからず、htmlは表示出来るのですが
cgiが動きません。涙目状態です。あちこちググりました・・・
途方にくれています・・・

397 名前:デフォルトの名無しさん [2009/09/27(日) 21:25:08 ]
mongrelをいれるといいよ

398 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:26:57 ]
力になっちゃあげたいけど、スレ違いかな・・・
WebProg板か、どっかにLighttpdのスレがあるから、そこで質問したらいいよ

399 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:28:09 ]
SocketってライブラリがあるからそれでWebサーバ書くのがいいと思うな

というか環境や参考にしたページをどこまで試してどこで詰まったとか
そういうのも無しに答えられるわけないので

400 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:30:33 ]
それが無いこと自体が答だろ
つまり、サーバ立てる知識が無い

401 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:32:26 ]
>>398
lighttpdのスレは先に見ました。最終書き込みが8月、その前が6月くらいと
人の気配が感じられませんでした・・・

402 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:36:43 ]
どう転んでもWebサーバの挙動の知識は必要になるわけなんだし
普通にゼロから勉強したほうが早いんだけどね

403 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:36:52 ]
Linuxなら各ディストリの初心者スレにいけば、誰かが教えてくれそう。

404 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:40:14 ]
>>402
まったくだぬ

「WebサーバやHTTPはお着せとコピペで済ませて本題のRubyの学習をしよう」というのは
CGI関連に限ってはありえん



405 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:44:58 ]
>>404
翻訳しながら、lighttpdの本家のページ見てみます。
mongrelも検討してみます。

apacheの設定よりは、ずいぶん楽そうに見えたんですが。。

406 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:47:26 ]
中途半端にマイナーなサーバソフトウェアだと情報が全くないということはばしばしある
めっちゃメジャーなのを小規模で使うのが結局マシだったりすることは意外と多い






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

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

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