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


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

Ruby 初心者スレッド Part 33



1 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:21:25 ]
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

449 名前:デフォルトの名無しさん [2009/12/25(金) 23:54:41 ]
>>441
puts((3;+4))
と同じ

450 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:29:37 ]
>>444
>>443>>440に対して
初心者スレで何で
>そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
なこと言うのってことだ

451 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:34:38 ]
puts (3;+4) はエラーで
puts((3;+4))は通るのは何で?

452 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 02:20:30 ]
前者、おそらく”(”がメソッド引数の括弧だと読まれている
引数部に”;”があるのはおかしいからエラー

後者、(3;+4)は4に等しいから、
puts(4)と同じ。もちろん文法的に正しい

453 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 02:43:20 ]
なぜこんな仕様にしたし

454 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 04:56:34 ]
括弧の省略を可能にするため、とマジレス

455 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:52:07 ]
>>451
引数を括る括弧と、式としての括弧は別

456 名前:デフォルトの名無しさん [2009/12/26(土) 21:00:18 ]
質問です。
include して使われることが想定されているモジュールを書いているのですが
非公開の下請けメソッドの扱いについて悩んでいます。
include先で名前の衝突が起こらないようにするため、以下の方法を考えたのですが……

1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
2、モジュールメソッドにしちゃう → 非公開じゃなくなるw
3、モジュール内部に Privateモジュールを作り、Private.method でアクセス
→ Privateモジュール自体は非公開にできないけど、includeする側からアクセス
されることはまずないだろう

他にもっとよい方法というか、こういう場合のイディオム、定石のようなものが
あったら教えて欲しいです。

457 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 22:19:29 ]
>>456
実用上は
>1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
で十分。それでも心配なら接尾辞もつけるといい。
(もちろん衝突しやすい接頭辞は避けてね)



458 名前:456 mailto:sage [2009/12/27(日) 08:57:11 ]
>>457
わかりました。接頭辞をつけておくことにします。
あまり長すぎるとうるさくなるんで、
アンダースコア+モジュール名を3文字くらいに圧縮したもの ぐらいでいいかな。

459 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 09:43:27 ]
インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど
個人的には3かな、Hoge::Utilsとか

460 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 11:37:54 ]
>>456
>1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw

スクリプト言語は変数の型についてはいいかげんだし、カプセル化についてだけ厳密性を求めてもしょうがないと思う。
もともとそういう言語じゃないんだよ、スクリプト言語は。
接頭辞や接尾辞をつけるだけでは衝突する可能性はゼロにできないけど、実用上は問題ないから、それでよしとしてください。

461 名前:456 mailto:sage [2009/12/27(日) 17:37:52 ]
>>459
> インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど
> 個人的には3かな、Hoge::Utilsとか

Helpers とかもそうですね。
外部から利用しても役に立ちそうなメソッドなら積極的にそうすべきかも

>>460
> カプセル化についてだけ厳密性を求めてもしょうがないと思う。
> もともとそういう言語じゃないんだよ、スクリプト言語は。

そういうもんですか。
サブクラスに対して閉じるアクセス制御って今後もできないんですかね

462 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 01:40:43 ]
>>461
たぶんRubyでのprivateを勘違いしている。
Javaと違うから、マニュアルを読むことをお勧めする。

463 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 04:42:17 ]
可視性メモ
ttp://www.rubyist.net/~matz/20070208.html#p04

464 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 06:26:05 ]
>>462
名前の衝突を懸念している時点で勘違いはしてないと思うのだが

465 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:17:10 ]
>>464
「サブクラスに対して閉じるアクセス制御」と言ってる時点で勘違いしてると思う。

466 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:41:29 ]
あればいいのにって話だろ

467 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:45:35 ]
Rubyではアクセス制御はそもそもできない
可視性を決めるだけ



468 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:09:11 ]
>>466
不要です。
以上。
↓はい次の方。

469 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:12:49 ]
↓    本質的にはオープンクラスを諦めないといけない
↓    再オープンできる時点で制御も何もねえよ


470 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:21:24 ]
本質的にはMatzの設計次第

471 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:04:43 ]
サブクラスに上書きされない為にどうしたらいいかって質問なのに
勘違いしてるとか不要とか諦めろとかどーゆー事よ
質問者の方がよっぽどrubyの事を理解してると思うわ

472 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:07:14 ]
Matzに聞いたら、
サブクラスで気をつけれ
っていうに決まってそう

473 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:15:49 ]
>>471
だからシステム的にできねえって
新しいRuby実装を自分で作れば無論可能だが、そういう回答を求めているわけではあるまい

474 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:18:15 ]
>>471
じゃあ、おまいが答えれ

475 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:57:46 ]

set_position x, y, z
get_positionX

みたいなget,set関数を作りました。
setはともかくgetはつけずに

positionX

の方が良いですか。どちらがよりRubyっぽいか教えてください


476 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:00:26 ]
x メソッドや y= メソッドだと都合が悪い?

477 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:06:09 ]
ziki.position = [x,y,z]
puts ziki.position_x

ですか???
そっちの方がRubyっぽいならそれでも良いです



478 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:20:17 ]
混乱してきたので質問を変えます。
AとBについてどちらが良いですか?

A:
(1) my.position = [1,2,3]
(2) my.set_position 1, 2, 3

B:
(1) puts my.position // 配列
(2) puts my.position_x

479 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:39:37 ]
>>478
[x, y, z] の組が頻出なら Struct を使ってもいいかも
Point = Struct.new(:x, :y, :z)
my.position = Point.new(x, y, z)
my.position.x

480 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:48:58 ]
>>478
attr_accessor, attr_writer, attr_reader とかは知ってる?

481 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:07:20 ]
>>479のPointを使って
class My
 attr_reader :position
 def initialize ; @position = Point.new ; end
 def position=(xyz)
  @position.x,@position.y,@position.z = xyz # 要引数チェック
 end
end

my = My.new
my.position = [0,0,0]
pos = my.position
my.position.x = pos.x + 1

482 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:09:56 ]
初心者スレでStruct使うアホは即爆発していいよ

483 名前:478 mailto:sage [2009/12/28(月) 22:11:56 ]
そんな難しい文法使わないでください。
初心者には理解できません。

484 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:15:23 ]
>>482
お前は永遠に配列の添字アクセスでもやってろ

485 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:23:19 ]
ハッシュで複雑なデータ構造を表現するのは悪らしい。。

486 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:27:43 ]
>>483
>>481 を見て具体的に何が理解できないか書いた方がよいと思われ

487 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 08:24:31 ]
>>485
Javaの人は引数にハッシュを使うことを理解できません
Struct使う人間の95%がRubyをJavaと勘違いして使っています



488 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 08:53:28 ]
質問です
[1,2,3] * [2,2,2] = [2,4,6] と書ける裏技無いですか。
ようは2つの配列を要素毎掛け合わせて欲しい

489 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 09:02:39 ]
>>488
とくにないです

require 'enumerator'
a1 = [1, 2, 3]
a2 = [10, 20, 30]
p a1.enum_with_index.map{|e,i| e*a2[i]} #=> [10, 40, 90]


490 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 09:04:25 ]
>>488
class Array
 def * other
  m = []
  each_index{|i| m << self[i] * other[i]}
  m
 end
end

裏技だからね。既存の Array#* を使ってるコードがどっかにあって
何が起きても知らないよ。

491 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 09:36:10 ]
>>487 は x, y, z の組をどう扱うの?


492 名前:488 mailto:sage [2009/12/29(火) 09:38:30 ]
>>490
いやそれはちょっと……

>>489
うーん、やっぱり無理そうですね。
C++みたいに Array& operator* (const Array& a1, const Array& a2) が定義できると便利なのに

493 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 12:49:27 ]
a1 = [1, 2, 3]
a2 = [10, 20, 30]

p a1.zip(a2).inject([]){|r,(x,y)| r << x*y}
とか


494 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 12:53:15 ]
>>491
配列とかでいいんじゃねえの

組として外部に持ち出さなければならないなら
クラスか何か作って名前付けることをそのときに考える

495 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 16:42:10 ]
eclipseで開発できますか?

496 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 16:44:38 ]
>>495
そらできる。

497 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 16:45:55 ]
def foo=
end

と同様に

def foo<<
end

を定義するとコンパイルエラーになるのですが、もしかしてこれはダメなんでしょうか。
その場合はどうすれば???



498 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 17:07:16 ]
foo= のようなメソッド名は、
obj.foo = ...
のような式のために特別に許されている。
(foo に代入するためには、obj.foo ではなく obj そのものを呼び出す必要があるため)

obj.foo << のような式は、obj.foo の << の呼び出しと解釈されるので、
そういうようなメソッド名はない。

ていうかどういうことがしたいわけ?

499 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 18:15:34 ]
obj.foo = # 代入
obj.foo << # 追加
がやりたいです。
fooは仮想的な配列でメンバー変数ではありません。

500 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 18:22:31 ]
Ruby ではオブジェクトの外からインスタンス変数を直接参照したりはできません。
obj.foo は obj.foo() というメソッド呼び出し(が返す値の参照)です。

obj.foo() を定義して、それが返すオブジェクトの << メソッドでなんとかするしかないと思います。

501 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 18:41:19 ]
あーなるほどそういうふうに見えるのか

502 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 19:17:45 ]
この場合は変数操作でこの場合変数に偽装したメソッド呼び出し
みたいな使い分けで引っかかるのは理解する

>>495
あまり楽しくない

503 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 19:22:20 ]
eclipseで開発したとして、実行はどうするんだろうね
Runとかやって、スクリプトが動いても
なんかな、って感じになりそう

504 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 02:54:55 ]
>>495
もしかして: Aptana

505 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:17:47 ]
<<を定義して配列のように見せかけている例としてはRailsの
ActiveRecordのhas_many関連がありますな。
.classですらArrayと返ってくる徹底ぶり。


506 名前:デフォルトの名無しさん [2009/12/30(水) 15:20:41 ]
def foo= x, y, z
end
を定義して
bar.foo = 1,2,3
と呼び出すと
./main.rb:25:in `foo=': wrong number of arguments (1 for 3) (ArgumentError)
というエラーが出るのですが、なぜ引数3つで呼び出しているのに引数の数が間違えている(1?)とか
うちのRuby様はふざけた事を言い出すのでしょうか

507 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:09:05 ]
bar.foo = a, b, c は bar.foo=([a, b, c]) だからです。
bar.foo=(a, b, c) で呼び出してください。



508 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:12:48 ]
syntax error, unexpected ',', expecting ')'
bar.foo=(1, 2, 3)

末尾= の場合は引数1つに限定かしらね?

bar.foo=[1, 2, 3]は
wrong number of arguments (1 for 3) (ArgumentError)


509 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:49:08 ]
>507 それウソ

たぶん>>508が言うように末尾=の場合は引数1個限定だと思う
けど自信ない

510 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 21:46:36 ]
puts RUBY_DESCRIPTION #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32]
plus = "a".method(:+) #=> #<Method: String#+>
p plus.("b") #=> "ab"

この3行目のシンタックスについてparse.y以外でどこかにドキュメントありませんか?
Method.instance_methodsにそれらしきメソッドが見当たらないのですが,Methodオブジェクトに特有なものなのでしょうか?

511 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 22:47:00 ]
foo.(arg) とすると foo.call(arg) の意味ということになった。

ttp://jp.rubyist.net/?NEWS-1.9.1.ja の「言語の中核部分」→「新しい文法と意味論」
「.()で#callや#[]を使わずにProcなどを呼べる」

512 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 22:47:50 ]
メソッドじゃなく、文法(構文)の範囲だから instance_methods では出てこないよ。
Procでも使える。


513 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 01:32:23 ]
>>509
やはり、呼び出すときには引数が一つしか取れないのだろうか?
でも、定義では3つの引数が必要なので、引数の数が合わないと怒られる

bar.send( :foo=, 1,2,3 )
で、引数三つ与えて呼び出せないこともないけど
なんだか、無意味な感じ


514 名前:デフォルトの名無しさん [2009/12/31(木) 06:56:22 ]
dhh

@37signals is already running a few minor apps on Rails 3. We've just started playing w/ porting Basecamp. Exciting times!
twitter.com/dhh/status/7208264678

Very tentative target date for Rails 3 beta is end of January. But core is staffed with volunteers, so very much subject to change.
twitter.com/dhh/status/7107817801

515 名前:デフォルトの名無しさん [2009/12/31(木) 08:32:35 ]
Very tentative target date for Rails 3 beta is end of January. But core is staffed with volunteers, so very much subject to change.
twitter.com/dhh/status/7208225785
dhh

516 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 09:12:32 ]
>>511 >>512
なるほど。
指摘していただいたドキュメントも拝見いたしました。
#callをできるだけ通常のメソッド呼び出しの記法に近づけるため
#[]をオーバーライドするといった努力をしているというのは
耳にしたことがあったのですが,.()もその一環のようですね。

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

517 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 22:42:29 ]
Ruby1.9で正規表現のエンコーディングにShift_jisを指定するには
どうすればいいんでしたっけ?

オプションでsを指定すればよかったような気がしたのですが、
p /hogehoge/s.encoding
で#<Encoding:Windows-31J>が帰ってきます。

WindowsXPで
ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mswin32]
です。
よろしくお願いします。



518 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 23:39:43 ]
Regexp.new('あ.い.う.え.お’.encode('Shift_JIS')) かなあ。


519 名前:デフォルトの名無しさん mailto:sage [2010/01/01(金) 07:30:44 ]
明けましておめでとうございます。

>>518
/\p{ASCII}/ という表現を使いたいのでその手法は難しいんです。
今回は関係ありませんが/\x82\xA0/
という表現もその手法だと難しいですね。

マジコメでソースエンコーディングをsjisに指定するって手もあるのですが、
大人の事情でこの手法も避けたいのです。

ハチドリ本を読み返したのですが、p.335には"SJISは、s"って書いてありますね。
なんだかなぁ。

引き続きよろしくお願いします。

520 名前:デフォルトの名無しさん mailto:sage [2010/01/01(金) 08:14:35 ]
失礼しました、>>518さんの方法でできますね。
もっとスマートな方法があればいいと思うのですが、とりあえず解決です。

お騒がせしました。

521 名前:デフォルトの名無しさん [2010/01/01(金) 14:23:19 ]
SJISのデータを一度読み込んでUTF-8に変換してごにょごにょ
が一番綺麗だと思う。
SJISでしないといけない理由は実はなかったりしないかい?

522 名前:デフォルトの名無しさん mailto:sage [2010/01/01(金) 21:58:59 ]
rubyのアンインストール方法ってどうするんでしょうか。
./configure --prefix=/usr/local
make
sudo make install
でインストールしたのを、事情によりきれいさっぱり削除したいです。


523 名前:デフォルトの名無しさん mailto:sage [2010/01/01(金) 22:45:28 ]
>>522
特に手段は用意されてない
make -n installでファイルリストを作ってぶん回すぐらいしか思いつかないな

524 名前:デフォルトの名無しさん [2010/01/02(土) 02:18:44 ]
標準ストリームに対する文字コードについて教えて下さい。
まだRubyの問題なのか、OSの問題なのかも上手く切り分け出来ていません。 m(__)m

TCPでクライアントと通信するプログラムを作っています。
環境はサーバー側(作っている側)がDebian Lenny(5.03)で、文字コードはUTF-8です。
クライアントはWindows2000のマシンで、文字コードはShift JISです。

コードは次のような感じです。
他にも色々な処理が入っていますが、話を簡単にするため、コードを思いっきり削っています。

> hoge.rb

#! /usr/bin/ruby -Ku

while receive = STDIN.gets

# コマンドを受信した

msg = "受信しました" # UTF-8

# 送信処理
# STDOUT.puts( NKF.nkf('-Ws', msg)) # これだとWindows側にパケットが全く返らない
STDOUT.puts( msg) # これだとWindows側で漢字は化けるけどパケットは返る
end

というような感じです。
何かパケットが来たら、メッセージを返すものです。
(実際にはPostgreSQLを呼び出し、コマンドの結果を得て返しています。)

525 名前:524 [2010/01/02(土) 02:19:24 ]
このコードはinetdから起動されます。

inetd.confはこんな感じ。

4142 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/hoge.rb

Rubyで扱っているUTF-8の日本語文字列を、標準ストリームにShift JISで流したいだけなのですが、上手くいきません。
Shift JISで出力しようとすると、STDOUTするところで、何事も無かったかのようにパケットが送信されません。
Rubyはエラーにもならず、その行を飛ばしたかのような挙動になります。

UTF-8のままでSTDOUTへ出力すると、Windows側で文字化けしますが、パケットは返ります。

事情により、Windows側のプログラムには手を入れられません。
どこらあたりから、見直していけば良いでしょうか?

この件の調査修正で、お正月休みも返上です。(TT)
よろしくお願いします。

526 名前:524 [2010/01/02(土) 02:48:40 ]
あ、ごめんなさい、すっかり書き忘れていました。
Rubyのバージョンは1.8.7です。
よろしくお願いします。

527 名前:デフォルトの名無しさん [2010/01/02(土) 04:37:19 ]
require 'kconv'

STDOUT.puts(msg.tosjis)



528 名前:524 [2010/01/02(土) 12:29:54 ]
>>527
ありがとうございます、しかし状況変わらずです。
NKFとkconvは、挙動が違うのでしょうか??

529 名前:524 [2010/01/02(土) 12:53:11 ]
>>527
再び524です。

申し訳ありません、確認が足りませんでした。

このmsgには”人の名 ”(漢字3文字+空白14)というように、
ASCIIで20Byte毎に区切って送るという仕様です。
ですが、Windows側には”人の名 ”(漢字3文字+空白11文字)として
届いていて構文チェックで跳ねられていました。

ちょうど空白が漢字の文字数分足りません。

UTF-8からShift JISに変換する時に、漢字とスペースの扱いはどうなるのでしょうか?
何か、特別な処理が必要でしょうか?
以前、EUC-JPとShiftJISでやったときは、問題無かったのですが。

なんとなく光が見えてきました、引き続きよろしくお願いします。

530 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 13:25:36 ]
どっかに全部コード貼ってから来なさい

531 名前:デフォルトの名無しさん [2010/01/02(土) 15:32:50 ]
>>529
utf8では漢字は2バイトではなく3バイト。
ja.wikipedia.org/wiki/UTF-8

532 名前:524 mailto:sage [2010/01/02(土) 17:35:34 ]
>>531
ありがとうございます、解決しました。
結局、SJISに変換してから加工するようにコードを変えました。
UTF-8では、漢字は3バイトなんですね。
勉強になりました。

お騒がせしました。

533 名前:524 mailto:sage [2010/01/02(土) 22:50:27 ]
>>530
524です、今、デバッグを終えて、正常動作を確認しました。
決め手は>>532さんの「漢字は3バイト」でしたが、結構ポカミスもしてまして、今まで掛かりました。

ごめんね、プロジェクトの規模が大きすぎて、コードは晒せないの…
某自動車会社で、国土交通省に提出する書類を作成するためのシステムです。
Rubyの案件としては、中くらいの規模なんじゃないかな。
わりと重要なシステムで、止まると車が作れません。
Rubyはミッションクリティカルでも大丈夫、信頼が置けます。

pgsqlだったかな、DBIになる前の古いやつ。
それからDBIへの移植だったのですが、なかなか…
pgsqlでEUC-JPだから動いてたっていうコードが結構あって、
思っていたより全然はまりました。

何処へ質問を投げようかと思案したのですが、おまいらに聞くのが一番良い気がして
ここに書かせて貰いました。

あとは1月4日の総合テストを待つのみです。
実際に車を測定する設備が無いので、うちの社内では完全なテストは出来ないんですよ。

何はともあれ、おまいらのお陰で解決しました。
本当にありがとう。

それでは、名無しに戻ります。 m(__)m

534 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 00:12:17 ]
>>533
身元と案件を特定出来る情報を2chに書くなよ・・・

535 名前:531 mailto:sage [2010/01/03(日) 00:20:53 ]
>>533
いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが、問題が解決してよかったね。

536 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 00:25:56 ]
> いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが

kwsk

537 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 02:32:44 ]
通報。



538 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 04:20:45 ]
HTTPProxyを作りたいので
WEBrickでプロキシサーバを作って遊ぶ
ttp://jp.rubyist.net/magazine/?0002-WEBrickProxy
を参考に

require 'webrick'
require 'webrick/httpproxy'

s = WEBrick::HTTPProxyServer.new(
:BindAddress => '127.0.0.1',
:Port => 8080,
:Logger => WEBrick::Log::new(nil, WEBrick::Log::DEBUG),
:ProxyVia => false
)

Signal.trap('INT') do
s.shutdown
end

s.start

と書いて実験してみたところ
リモートからのデータをいったんメモリに貯めてからクライアントへ渡す動作をするようです
この場合巨大なファイル(結構大きいファイルを扱うProxyを作る予定です)を通したときにメモリ消費が
洒落にならないので、読み込んだデータから逐次クライアントへ渡すような動作にしたいのですが
そのような設定は可能ですか?可能であればその方法を教えてください。よろしくお願いします

539 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 04:50:47 ]
以前、どこかのスレで
python -i
と同じことをする方法を見たのですが、どうやるんでしたっけ?

540 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 04:57:19 ]
$ irb

541 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 05:17:07 ]
>>540
違う。

542 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 09:50:24 ]
ver #=> Microsoft Windows XP [Version 5.1.2600]
ruby -v #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32]

以下の簡易wget風ワンライナをより短くできませんか?

ruby -ropen-uri -e"$><<URI(*$*).read" www.example.com/>output
ruby -ropen-uri -e"$>.binmode<<URI(*$*).read" www.example.com/hoge.zip>output

短くならなければ「短くならないよ」というご意見や
よりスマートな代替案もいただけたら幸いです。

543 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 10:07:26 ]
>>542
代替案ということはワンライナにこだわらなくていいんだよね?
若干強引だけどlib/site_rubyにwget.rbライブラリを作ってそのなかに処理書いちゃうとか
ruby -rwget www.example.com/ > output
irb.batのようにbinにbat置いてスクリプト実行するとか
rwget www.example.com/ > output

544 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 10:20:40 ]
>>543
早速のレスありがとうございます。
ライブラリ案・バッチ案は個人で使う分にはアリですね。
コマンドもすっきりしますし。

個人的には何もライブラリやファイルをインストール(作成)せずに
Ruby単体で簡易wgetを実現できればいいなと思っています。
あまり実用的な場面はありませんが ^^;

545 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 10:44:08 ]
>>538
データをストリーミング中継したいということでしょうか?

私はネットワークプログラミングに詳しいわけではないのでアドバイスはできませんが,
googleで "webrick ストリーミング" で検索してみてください。
1件目のブログが参考になるかもしれません。

546 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 12:22:32 ]
>>539
対話型debugが目的なら -rdebug

対話型インターフェイスが目的なら
while true
print ">"
input = $stdin.gets.rstrip
break if input == "\x04" # ^D
puts input
end

もしくは(GNU Readlineが必要)
require "readline"
while input = Readline.readline(">")
puts input
end

pythonなんて知らんよ

547 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 13:21:29 ]
OpenGLってDirectXに比べるとプリミティブすぎるというか機能足り無くない?
標準のシーングラフとかあっても良いと思うのだが……
何か無いですか?



548 名前:538 mailto:sage [2010/01/03(日) 13:46:23 ]
>>545
レスありがとうございます
探していた情報はまさにそれです、ストリーミングも含めて考えていました
逐次転送するような動作は不可ですか・・・(´・ω・`)

以前にsocketで似たような物を実装しようとしたことがあったけどリクエスト/レスポンスの
終了を検出する方法が判らなくて断念・・・il||li ○| ̄|_

549 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 15:32:50 ]
>>548
webrickを改造する場合にはリファレンスの以下の項が参考になるかもしれません。
Net::HTTPResponse#read_body {|str| .... }
「エンティティボディを少しづつ取得して順次ブロックに与えます。」

TCPSocketを使う場合でも
socket.gets until $_ == CRLF
でヘッダを切り離して
while data = socket.gets
...dataを料理...
end
ではダメですか?
Rubyで終端を気にする必要はなかったように思います。
他に思いつくにはヘッダのContent-Lengthを信用してそのバイト数だけ読み込むとか。
TCP/IPの規格に詳しくないので当てずっぽうですが。






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

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

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