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

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の規格に詳しくないので当てずっぽうですが。

550 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 01:49:17 ]
windows機でタイマーを実装しようとしてます。
マルチスケジューリングなキッチンタイマーのようなものです。

問題がありまして、
例えば60分後にアラームを鳴らせるというタイマーのプログラムを行ったときに
やっぱりその30分前にもう一個のプログラムを追加したいと思ってもそれを行うためには
常に入力待ち状態である必要があります。
その一方で常に出力待ち状態でないと指定時刻にタイマーを実行することができません。

今は
タイマー入力(空入力も化)待機モード→
1分間のタイマー実行待機モード→
その1分の間に起こるべきイベントがあれば指定時刻にイベントを起こす→
またタイマー入力待機モードに戻る→
以下ループ

というようにユーザに入力によって待機モードを切り替えることでそれらしい動作をさせています。
どのようにすればもっとスマートにこのタイマーを実装できるでしょうか?

一つのスマートじゃない方法はテキストエディタと外部ファイルを使ってこのタイマー入力を行うことかなと思うんですが。(非排他モードでファイルの書き込み読み取りする)
forkがwindows rubyでは使えなくて、そもそも子プロセスを使ったことがないので悩んでいます。

551 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 01:57:34 ]
www1.axfc.net/uploader/Sc/so/70232.txt

しょーもないソースコードですが、文章で書くより伝わりやすいと思うので
よろしくお願いします。

552 名前:538 mailto:sage [2010/01/04(月) 03:29:30 ]
>>549
レスありがとうございます
WEBrickはソースコードを理解するだけで時間が相当かかりそうな感じなので
改造はあきらめます・・・

バイナリデータをgetsで読み出そうとすると最悪の場合、最後まで読み込んで
しまうように思いますが・・・
Socketの終了が判らない件ですがノンブロックモードで読み出す方法
(sysreadを使う。getsが使えなくなるけど・・・)が判ったのでひとまず解消しました
普通にreadを使うとブロックモードなんで帰ってこない・・・(TT

しかし1セッションに複数のホストへのリクエストとかマンドクセ(´・ω・`)

553 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 05:32:35 ]
>552
getsはバイト列に$/(普通は0x0A)がでてこなければ
最後まで読み込んでしまうけれど、その確率は気にするほどのものかな
ミッションクリティカルなアプリケーションならしかたないとは思うけど

554 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 06:17:44 ]
>>550
つ Thread & ConditionVariable



555 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 12:40:48 ]
あるURLから特定のURLのみを抽出するにはどうしたらいいでしょうか?
例えばmenu.2ch.net/bbsmenu.htmlから"pc11"が含まれるURLを抽出したいです。

require "open-uri"
url = ARGV[0] || "menu.2ch.net/bbsmenu.html"
uri = open(url).read
URI.extract(uri, ['http']){
|uri|
puts uri
}

URL自体を抜き出すのは比較的簡単に出来たのですが、特定のURLを抜き出すのってこの状態からどうしたらいいでしょうか?
宜しくお願いします。

556 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 13:03:47 ]
puts uri if /pc11/ =~ uri.to_s

557 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 13:05:12 ]
>>555
URI.extract の返値(URI の配列)に対し find_all でいいんじゃない?

str = open(url).read
URI.extract(str, ['http']).find_all {|uri| uri =~ /pc11/ }

正規表現マッチの部分はもう少し厳密にした方がいいと思うので適当に

558 名前:557 mailto:sage [2010/01/04(月) 13:13:58 ]
返値を変数に格納するの忘れてたw

559 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 13:20:49 ]
str = open(url).read
URI.extract(str, ['http']).grep(/pc11/)

560 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:31:50 ]
「特定のURLを抜き出す機能」と考えるからわからなくなるんだと思う

配列から特定の条件を満たす要素を抜き出す方法とか
URIオブジェクトのURI構成要素を返すメソッドは何かとか
そういうの調べていったほうがたぶん早い

561 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:41:17 ]
御託はいいから妥当解とっとと出せカス

562 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:43:13 ]
「手抜き」じゃね?
いつ動かなくなるのか不安だ。。

563 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:51:14 ]
どうでもいいけど、
普通はstr = open(url).{|io|io.read}じゃね?
それかstr = URI(uri).readか。

564 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:54:18 ]
>>561
require 'open-uri'
url = "menu.2ch.net/bbsmenu.html"
purls = URI.extract(open(url).read, ['http'])
uris = purls.map{|url| URI.parse(url)}.find_all{|uri| /\Apc11\.2ch\.net\Z/ =~ uri.host}

ただ、
 「URLを抽出したあとそれに対して何をしたいのか」
 「本当に抽出したいのは本文のURLではなくて<a href>のリンクなのではないか」
 「貴様は次のレスで「あっあとttp://も抽出したいです」と言うッ!」
とかいうような危惧がないわけでもない

普通にHTMLパーサ通したほうが近道だったり
一般的な適当範囲の正規表現を通したほうがマシな処理だったりしなくもなくもないかも



565 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:56:56 ]
関係ないけど、2chのAPIは糞。

566 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:00:02 ]
そりゃ急いで突貫工事したものをずっと継ぎ接ぎで使ってるからな

これがめちゃくちゃ洗練されて、2chアクセス者全員にdat直読みだけをされるようになっても
本当は運営的にはちょっと困るのよ

567 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:03:29 ]
datはまぁ良いとして、bbsmenu.htmlだけはどうにかして欲しいな。

568 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:03:47 ]
>>566
APIが洗練されたとしても利用者全員がdat読みすることなんてありえんから
後半は全然関係ないだろw

569 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:10:00 ]
>>568
本当に洗練されたWeb経由APIはJavaScriptのみでの実装を許す
API経由で広告を見せて有効に動作させるロジックはまだ発明されていない
今の2chから広告収入外されたら傾くぞ

なんかこう物理的にナナメに傾くだけで済む気もするのがなんか謎な収益だが

570 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:29:00 ]
>>563
まあなんか非常にめんどくさいのだけど

open(path).read は close 忘れが多いので推奨されない書き方
(open(path){|f| f.read} を強く推奨、File.read(path) は Windows のバイナリスイッチが入らなので非推奨)
ただ、open-uri を読み込んだ URL や URI に限っては、
open(uri).read は IO#close 相当を必要としないので妥当安全にたまたま動作する

いや、ブロックつきで書いてもいいけど
っていうかレスしてて気づいたけど本当にたまたま動くんだなこれ

ローカルのファイルを読むことがなくて、簡便な HTTP アクセサとしてしか使用しないのなら
あなたの言うように URI.parse(url).read するのがいちばんではあるっていうかお前ら初心者スレで手を抜くな

571 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:11:39 ]
>>570
手を抜くな、と言われましても、2chの手抜きAPIに対して
真面目にプログラミングする気がしませんん。

572 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:16:54 ]
手抜きAPIを調教して俺色に染めてやんよ

573 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:19:33 ]
そもそも2ちゃんのそれはAPIなんかじゃない無いだろw
一時期XML吐こうぜみたいな動きがあったみたいだけど、
「やっぱだりぃわ」で自然消滅した?w

574 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:23:55 ]
>>571
URLにアクセスしてHTMLを取得するという根幹部分すらまともに書けませんと素直に言ったら



575 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:30:23 ]
>>574
は?HTTPのライブラリぐらい作ったことあるから w

576 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:40:14 ]
しっかし、open-uriって、
open(path)ってしただけでゴリゴリとTempfileをディスクに書いちゃうのね。
大量のURIを扱うならopenは使うべきじゃないな。

577 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 04:26:10 ]
>>571のような open(file).read と open(file){|f| f.read} の違いがわからないような人間にはなりたくないと思う

578 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 05:17:44 ]
>>576
f = open(uri) が open として何を返すべきかを考えたら、
StringIO が返ってくる低サイズ帯のほうがむしろ特殊というか変

579 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:25:56 ]
無圧縮のzipを作成したいのですが
ziprubyもrubyzipも無圧縮オプションが見当たりません
この2つは無圧縮zipの作成をサポートしていないのでしょうか?
あるいはlibtarで作成すれば無圧縮zipと同じものが出来ますか?


580 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 19:57:04 ]
open-uriだけでよくここまで話せるな

581 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 22:54:32 ]
>>579
ヒント
Zlib::NO_COMPRESSION

582 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 05:24:47 ]
>>579
オレも気になったので調べてみたけど見当たらないね、実装されてないのかな?
おそらくPKZIP形式を求めていると思ったので
偽Zip32J.DLLてのを使ってやってみた

require 'dl/win32'
zip = Win32API.new("Zip32J.DLL","Zip","lppl","l")
p zip.call(0,"-q -0 out.zip 1.txt 2.txt", "" , 0)

拘り無いならtarでいいと思う

583 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 07:15:17 ]
rubyzipのZip::ZipOutputStream#put_next_entry見ろよ。
どこ見てんのよ。

584 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 12:31:59 ]
a='/'
a.sub!(/\//, "\\")
p a

これで出力は \ 1個を期待したのだけど
\\ 2個になってしまう

a.sub!(/\//, "\")
こうすると怒られるし
どうしたらいい?





585 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 12:36:25 ]
>>584
irbでinspectの結果を見てないか?


586 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 12:37:22 ]
ごめん、pか。
pはinspectの結果を出すので、そうなって当然。
putsせよ。


587 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 12:40:36 ]
ttp://doc.okkez.net/187/view/method/Kernel/m/p
ttp://doc.okkez.net/187/view/method/String/i/inspect

588 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 14:25:27 ]
subとgsubはブロックを使えと先生から習わなかったか

589 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 14:38:24 ]
しかしそれ以前の問題だからのう。

どうでもいいけど、個人的には正規表現に / が入るときは %r が見やすい

590 名前:584 mailto:sage [2010/01/06(水) 14:48:46 ]
>>585-589
あざーした!
pの方が短くてうちやすいので
ついputs代わりに使ってました
今度から気をつけます!


591 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 15:03:29 ]
exerb 使う時って open-uri 使っちゃいけないの?

592 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 20:42:04 ]
こんなのあったのね。テンプレに入れとけばどうか。まーActiveScriptRubyでもいいけどw

窓の杜 - 【REVIEW】Windowsでスクリプト言語“Ruby”を導入するための和製インストーラー「Rumix」
www.forest.impress.co.jp/docs/review/20100106_340742.html

593 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 23:46:16 ]
WindowsでRubyを使うこと自体が既に初心者レベルを超えてる

594 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 23:52:33 ]
いや、逆じゃないのか。。



595 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 08:02:18 ]
RumixってOne-Click Installerとなにがちゃうんや!

596 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 08:37:14 ]
One-Click Installer 海外版Windows向けRubyパッケージ(ただしRuby古い)
Rumix 日本語版Windows向けRubyパッケージ






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

前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