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パッケージ