From miwarin @ gmail.com Thu Jan 5 23:54:35 2012 From: miwarin @ gmail.com (=?ISO-2022-JP?B?GyRCOzBOWD84GyhCKCBNaXdhIFN1c3VtdSAp?=) Date: Thu, 5 Jan 2012 23:54:35 +0900 Subject: [tDiary-users-talk: 0485] =?iso-2022-jp?b?cnVieSBtZWNoYW5pemUbJEIkR0Z8NS05OT83JDckPyQkGyhC?= Message-ID: 三輪と申します。 tdiary の問題ではなくて mechanize の使い方だと思うのですが、質問があります。 日記を ruby mechanize で更新しようとすると サーバーから 500 が返答されてしまいます。 日記を更新するには append (追記)ボタンを submit すれば いいのだと思ってるのですが間違ってるでしょうか。 [環境] tDiary 3.1.0 NetBSD 5.1/i386 ruby 1.8.6 mechanize 1.0.0 nokogiri 1.4.4 [詳細] 以下のようなコードを書きました。 user や pass には実際の文字列が入ります。 日記本文に「"!test\nhello tdiary!\n"」( wiki 書式です )を入力し append ボタンを submit しようとしてます。 #!/usr/pkg/bin/ruby -Ku require 'rubygems' require 'mechanize' require 'logger' def main @diary_uri = "http://www.area51.gr.jp/~rin/diary/update.rb" @diary_user = "USER" @diary_pass = "PASS" text = "!test\nhello tdiary!\n" agent = Mechanize.new agent.log = Logger.new($stdout) agent.log.level = Logger::INFO agent.auth(@diary_user, @diary_pass) agent.get(@diary_uri) agent.page.form_with(:action => "update.rb") { |form| form['body'] = text form.submit( form.button_with(:name => 'append')) } end main [現象] コードを実行すると以下のように出力されます。 % ./tdwrite.rb I, [2012-01-05T23:35:45.022004 #10949] INFO -- : Net::HTTP::Get: /~rin/diary/update.rb I, [2012-01-05T23:35:45.099852 #10949] INFO -- : status: Net::HTTPUnauthorized 1.1 401 Authorization Required I, [2012-01-05T23:35:45.107026 #10949] INFO -- : Net::HTTP::Get: /~rin/diary/update.rb I, [2012-01-05T23:35:45.325946 #10949] INFO -- : status: Net::HTTPOK 1.1 200 OK I, [2012-01-05T23:35:45.383730 #10949] INFO -- : form encoding: ISO-8859-1 I, [2012-01-05T23:35:45.386748 #10949] INFO -- : Net::HTTP::Post: /~rin/diary/update.rb I, [2012-01-05T23:35:45.409135 #10949] INFO -- : status: Net::HTTPUnauthorized 1.1 401 Authorization Required I, [2012-01-05T23:35:45.418526 #10949] INFO -- : Net::HTTP::Post: /~rin/diary/update.rb I, [2012-01-05T23:35:45.518211 #10949] INFO -- : status: Net::HTTPInternalServerError 1.1 500 Internal Server Error /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:303:in `fetch': 500 => Net::HTTPInternalServerError (Mechanize::ResponseCodeError) from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:655:in `response_authenticate' from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:300:in `fetch' from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize.rb:1036:in `post_form' from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize.rb:426:in `submit' from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/form.rb:178:in `submit' from ./tdwrite.rb:21:in `main' from (eval):23:in `form_with' from ./tdwrite.rb:19:in `main' from ./tdwrite.rb:26 ググると「サーバーのログを見ろ」というコメントがチラホラあるのですが サーバー( httpd )のログにはそれらしいログがありません。 ( tdiary とは関係ないログです ) % tail /var/log/httpd/error_log [Thu Jan 05 23:25:08 2012] [error] (13)Permission denied: exec of '/home/rin/public_html/diary-hns/index.cgi' failed [Thu Jan 05 23:25:08 2012] [error] [client 66.249.69.238] Premature end of script headers: index.cgi [Thu Jan 05 23:29:14 2012] [error] [client 207.46.204.32] File does not exist: /usr/pkg/share/httpd/htdocs/robots.txt [Thu Jan 05 23:32:09 2012] [error] [client 209.85.238.115] File does not exist: /home/rin/public_html/hikifarm [Thu Jan 05 23:32:40 2012] [error] (13)Permission denied: exec of '/home/rin/public_html/diary-hns/index.cgi' failed [Thu Jan 05 23:32:40 2012] [error] [client 66.249.69.238] Premature end of script headers: index.cgi [Thu Jan 05 23:34:33 2012] [error] (13)Permission denied: exec of '/home/rin/public_html/diary-hns/index.cgi' failed [Thu Jan 05 23:34:33 2012] [error] [client 66.249.69.238] Premature end of script headers: index.cgi [Thu Jan 05 23:36:26 2012] [error] (13)Permission denied: exec of '/home/rin/public_html/diary-hns/index.cgi' failed [Thu Jan 05 23:36:26 2012] [error] [client 66.249.69.238] Premature end of script headers: index.cgi どなたか mechanize で日記更新している方はいますでしょうか。 -- みわ From t @ tdtds.jp Fri Jan 6 18:54:57 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Fri, 6 Jan 2012 18:54:57 +0900 Subject: [tDiary-users-talk: 0486] Re: =?iso-2022-jp?b?cnVieSBtZWNoYW5pemUbJEIkR0Z8NS05OT83JDcbKEI=?= =?iso-2022-jp?b?GyRCJD8kJBsoQg==?= In-Reply-To: References: Message-ID: ただただしです。 手元でほぼ同じスクリプトを実行してみましたが、ちゃんと更新 されましたよ。rubyは1.9しかないのでちょっと環境が違いますが: tDiary 3.1.1.20111213 Debian squeeze ruby 1.9.3-p0 mechanize 2.0.1 nokogiri 1.5.0 そもそも500エラーが返ってきているのにWebサーバにエラーの 痕跡がないというのが怪しいと思うんですが……。access_logの 方はどうなっていますか? 2012年1月5日23:54 三輪晋( Miwa Susumu ) : > tdiary の問題ではなくて mechanize の使い方だと思うのですが、質問があります。 > > 日記を ruby mechanize で更新しようとすると > サーバーから 500 が返答されてしまいます。 > > 日記を更新するには append (追記)ボタンを submit すれば > いいのだと思ってるのですが間違ってるでしょうか。 > > > [環境] > tDiary 3.1.0 > NetBSD 5.1/i386 > ruby 1.8.6 > mechanize 1.0.0 > nokogiri 1.4.4 -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From miwarin @ gmail.com Fri Jan 6 19:20:50 2012 From: miwarin @ gmail.com (=?ISO-2022-JP?B?GyRCOzBOWD84GyhCKCBNaXdhIFN1c3VtdSAp?=) Date: Fri, 6 Jan 2012 19:20:50 +0900 Subject: [tDiary-users-talk: 0487] Re: =?iso-2022-jp?b?cnVieSBtZWNoYW5pemUbJEIkR0Z8NS05OT83JDcbKEI=?= =?iso-2022-jp?b?GyRCJD8kJBsoQg==?= In-Reply-To: References: Message-ID: 三輪です。 2012年1月6日18:54 TADA Tadashi : > 手元でほぼ同じスクリプトを実行してみましたが、ちゃんと更新 > されましたよ。rubyは1.9しかないのでちょっと環境が違いますが: なんと.... > そもそも500エラーが返ってきているのにWebサーバにエラーの > 痕跡がないというのが怪しいと思うんですが……。access_logの > 方はどうなっていますか? access_log の該当箇所は以下のようになってます。 218.45.17.166 - - [06/Jan/2012:19:17:01 +0900] "GET /~rin/diary/update.rb HTTP/1.1" 401 290 218.45.17.166 - diary [06/Jan/2012:19:17:01 +0900] "GET /~rin/diary/update.rb HTTP/1.1" 200 6105 218.45.17.166 - - [06/Jan/2012:19:17:01 +0900] "POST /~rin/diary/update.rb HTTP/1.1" 401 290 218.45.17.166 - diary [06/Jan/2012:19:17:01 +0900] "POST /~rin/diary/update.rb HTTP/1.1" 500 446 -- みわ From kdmsnr @ gmail.com Fri Jan 6 19:52:09 2012 From: kdmsnr @ gmail.com (KADO Masanori) Date: Fri, 6 Jan 2012 19:52:09 +0900 Subject: [tDiary-users-talk: 0488] Re: =?utf-8?b?cnVieSBtZWNoYW5pemXjgafml6XoqJjmm7TmlrDjgZfjgZ8=?= =?utf-8?b?44GE?= In-Reply-To: References: Message-ID: 2012年1月5日23:54 三輪晋( Miwa Susumu ) : > [環境] [snip] > mechanize 1.0.0 ↑とありますが、 > /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:303:in > `fetch': 500 => Net::HTTPInternalServerError > (Mechanize::ResponseCodeError) > from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:655:in > `response_authenticate' 2.1でエラーが出ているのは関係ないですか? # 2.1 は "requires Ruby version >= 1.8.7." でした。 -- kdmsnr - KADO, Masanori From miwarin @ gmail.com Fri Jan 6 20:11:54 2012 From: miwarin @ gmail.com (=?ISO-2022-JP?B?GyRCOzBOWD84GyhCKCBNaXdhIFN1c3VtdSAp?=) Date: Fri, 6 Jan 2012 20:11:54 +0900 Subject: [tDiary-users-talk: 0489] Re: =?iso-2022-jp?b?cnVieSBtZWNoYW5pemUbJEIkR0Z8NS05OT83JDcbKEI=?= =?iso-2022-jp?b?GyRCJD8kJBsoQg==?= In-Reply-To: References: Message-ID: 三輪です 2012年1月6日19:52 KADO Masanori : >> [環境] > [snip] >> mechanize 1.0.0 > > ↑とありますが、 > >> /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:303:in >> `fetch': 500 => Net::HTTPInternalServerError >> (Mechanize::ResponseCodeError) >> from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:655:in >> `response_authenticate' > > 2.1でエラーが出ているのは関係ないですか? > # 2.1 は "requires Ruby version >= 1.8.7." でした。 ごめんなさい。環境を間違ました orz スクリプトを実行するホストと、tdiary を実行しているホスト(つまりサーバー)があるので 双方の環境が混ざりました。 最初のメールに書いた「環境」はサーバーの環境でした。 (サーバーには mechanize 1.0.0 が入ってます ) 「現象」に書いたログはスクリプトを実行するホストの環境でした。 (スクリプトを実行するホストには mechanize 2.1 が入ってます ) 整理します。 スクリプトを実行するホストの環境はこうです。 NetBSD 5.99.58 % ruby --version ruby 1.8.7 (2011-02-18 patchlevel 334) [i386-netbsdelf] % gem list *** LOCAL GEMS *** domain_name (0.5.1) mechanize (2.1) net-http-digest_auth (1.2) net-http-persistent (2.3.3) nokogiri (1.5.0) ntlm-http (0.1.1) tmail (1.2.7.1) unf (0.0.4) unf_ext (0.0.4) webrobots (0.0.12) サーバーの環境はこうです。 NetBSD 5.1 tDiary version 3.1.0 % ruby --version ruby 1.8.7 (2011-02-18 patchlevel 334) [i386-netbsdelf] % gem list *** LOCAL GEMS *** gruff (0.3.6) hoe (2.8.0) mechanize (1.0.0) nokogiri (1.4.4) rake (0.8.7) rmagick (2.13.1) tmail (1.2.7.1) 環境が異なっている必要性はとくにありません。 環境整備をサボっているだけです ('A`) そして、スクリプトを実行するホストでスクリプトを実行すると、 最初のメールに書いた「現象」のログが出力されます。 (再掲します) [スクリプトのログ] % ./tdwrite.rb I, [2012-01-06T20:03:49.960821 #3905] INFO -- : Net::HTTP::Get: /~rin/diary/update.rb I, [2012-01-06T20:03:50.032033 #3905] INFO -- : status: Net::HTTPUnauthorized 1.1 401 Authorization Required I, [2012-01-06T20:03:50.041733 #3905] INFO -- : Net::HTTP::Get: /~rin/diary/update.rb I, [2012-01-06T20:03:50.277806 #3905] INFO -- : status: Net::HTTPOK 1.1 200 OK I, [2012-01-06T20:03:50.349072 #3905] INFO -- : form encoding: ISO-8859-1 I, [2012-01-06T20:03:50.355784 #3905] INFO -- : Net::HTTP::Post: /~rin/diary/update.rb I, [2012-01-06T20:03:50.395595 #3905] INFO -- : status: Net::HTTPUnauthorized 1.1 401 Authorization Required I, [2012-01-06T20:03:50.419704 #3905] INFO -- : Net::HTTP::Post: /~rin/diary/update.rb I, [2012-01-06T20:03:50.516790 #3905] INFO -- : status: Net::HTTPInternalServerError 1.1 500 Internal Server Error /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:303:in `fetch': 500 => Net::HTTPInternalServerError (Mechanize::ResponseCodeError) from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:655:in `response_authenticate' from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/http/agent.rb:300:in `fetch' from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize.rb:1036:in `post_form' from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize.rb:426:in `submit' from /usr/pkg/lib/ruby/gems/1.8/gems/mechanize-2.1/lib/mechanize/form.rb:178:in `submit' from ./tdwrite.rb:21:in `main' from (eval):23:in `form_with' from ./tdwrite.rb:19:in `main' from ./tdwrite.rb:26 [サーバーのログ] access_log 218.45.17.166 - - [06/Jan/2012:20:03:48 +0900] "GET /~rin/diary/update.rb HTTP/1.1" 401 290 218.45.17.166 - diary [06/Jan/2012:20:03:48 +0900] "GET /~rin/diary/update.rb HTTP/1.1" 200 6105 218.45.17.166 - - [06/Jan/2012:20:03:48 +0900] "POST /~rin/diary/update.rb HTTP/1.1" 401 290 218.45.17.166 - diary [06/Jan/2012:20:03:48 +0900] "POST /~rin/diary/update.rb HTTP/1.1" 500 446 error_log にはとくにそれらしいログがありません。 -- みわ From kdmsnr @ gmail.com Fri Jan 6 23:14:57 2012 From: kdmsnr @ gmail.com (KADO Masanori) Date: Fri, 6 Jan 2012 23:14:57 +0900 Subject: [tDiary-users-talk: 0490] Re: =?utf-8?b?cnVieSBtZWNoYW5pemXjgafml6XoqJjmm7TmlrDjgZfjgZ8=?= =?utf-8?b?44GE?= In-Reply-To: References: Message-ID: 2012年1月6日20:11 三輪晋( Miwa Susumu ) : > [スクリプトのログ] > % ./tdwrite.rb snip > I, [2012-01-06T20:03:50.395595 #3905] ?INFO -- : status: > Net::HTTPUnauthorized 1.1 401 Authorization Required > I, [2012-01-06T20:03:50.419704 #3905] ?INFO -- : Net::HTTP::Post: > /~rin/diary/update.rb > I, [2012-01-06T20:03:50.516790 #3905] ?INFO -- : status: > Net::HTTPInternalServerError 1.1 500 Internal Server Error 手元で Digest 認証を使ったら同じように失敗しました。 Digest 認証を使っていますか? -- kdmsnr - KADO, Masanori From miwarin @ gmail.com Fri Jan 6 23:33:10 2012 From: miwarin @ gmail.com (=?ISO-2022-JP?B?GyRCOzBOWD84GyhCKCBNaXdhIFN1c3VtdSAp?=) Date: Fri, 6 Jan 2012 23:33:10 +0900 Subject: [tDiary-users-talk: 0491] Re: =?iso-2022-jp?b?cnVieSBtZWNoYW5pemUbJEIkR0Z8NS05OT83JDcbKEI=?= =?iso-2022-jp?b?GyRCJD8kJBsoQg==?= In-Reply-To: References: Message-ID: 三輪です。 2012/1/6 KADO Masanori : > 手元で Digest 認証を使ったら同じように失敗しました。 > Digest 認証を使っていますか? oh! そうです。Digest 認証を使っています。 ↓auth を設定しておけばよい、と解釈してたんですが、何か足りないということかしら.... RubyのMechanizeでのHTTPステータスとmetaリフレッシュ - きたももんががきたん。 http://d.hatena.ne.jp/kitamomonga/20110329/ruby_mechanize_2_0_http_status_and_meta_refresh#status_401_authorization_required Mechanize - Ruby Mechanize wiki (ja) - livedoor Wiki(ウィキ) http://w.livedoor.jp/ruby_mechanize/d/Mechanize#auth -- みわ From kdmsnr @ gmail.com Sat Jan 7 00:03:49 2012 From: kdmsnr @ gmail.com (KADO Masanori) Date: Sat, 7 Jan 2012 00:03:49 +0900 Subject: [tDiary-users-talk: 0492] Re: =?utf-8?b?cnVieSBtZWNoYW5pemXjgafml6XoqJjmm7TmlrDjgZfjgZ8=?= =?utf-8?b?44GE?= In-Reply-To: References: Message-ID: 2012年1月6日23:33 三輪晋( Miwa Susumu ) : > ↓auth を設定しておけばよい、と解釈してたんですが、何か足りないということかしら.... Mechanizeが対応してないか問題があるような気がしますねえ。 本家で聞いてみるのが早いかもです。 -- kdmsnr - KADO, Masanori From miwarin @ gmail.com Mon Jan 9 01:09:56 2012 From: miwarin @ gmail.com (=?ISO-2022-JP?B?IhskQjswTlg/OBsoQihNaXdhIFN1c3VtdSki?=) Date: Mon, 09 Jan 2012 01:09:56 +0900 Subject: [tDiary-users-talk: 0493] Re: =?iso-2022-jp?b?cnVieSBtZWNoYW5pemUbJEIkR0Z8NS05OT83JDcbKEI=?= =?iso-2022-jp?b?GyRCJD8kJBsoQg==?= In-Reply-To: References: Message-ID: <4F09BFD4.5030900@gmail.com> 三輪です。 (2012/01/07 0:03), KADO Masanori wrote: > 2012年1月6日23:33 三輪晋( Miwa Susumu ) : >> ↓auth を設定しておけばよい、と解釈してたんですが、何か足りないということかしら.... > Mechanizeが対応してないか問題があるような気がしますねえ。 > 本家で聞いてみるのが早いかもです。 > 聞いてみたところ「HTTP ヘッダを比較してみろ」と言われたので比較してみま した。 [Mechanize-users] 500 error in tdiary using mechanize http://rubyforge.org/pipermail/mechanize-users/2012-January/000713.html 結局 referer の指定が不足していたようです。 Firefox と mechanizeでの HTTP ヘッダを比較してみたらreferer が異なってい ました。 mechanize: request-header: referer => http://test:test @ www.area51.gr.jp/~rin/diary/update.rb Firefox: Referer: http://www.area51.gr.jp/~rin/diary/update.rb submit の headers に referer を追加したら日記に「追記」できました。 #!/usr/pkg/bin/ruby -Ku require 'rubygems' require 'mechanize' require 'logger' require 'pp' def main uri = "http://localhost/~rin/diary/update.rb" user = "test" pass = "test" referer = "http://www.area51.gr.jp/~rin/diary/update.rb" text = "!test\nhello tdiary!\n" agent = Mechanize.new agent.log = Logger.new($stdout) agent.auth(user, pass) agent.get(uri, nil, referer) agent.page.form_with(:action => "update.rb") { |form| form['body'] = text form.submit(form.button_with(:name => "append"), headers={"referer" => referer}) } end main referer についてはこっちのドキュメントに書いてありました ('A`) Mechanize - Ruby Mechanize wiki (ja) - livedoor Wiki(ウィキ) http://w.livedoor.jp/ruby_mechanize/d/Mechanize#submit >> 第 3引数 headers は追加の HTTP リクエストヘッダです。headers のキーは大 文字小文字無関係の文字列です。Mechanize::Chain::CustomHeaders? で処理されるのでそちらを参照してください。 リファラは常に現在のページになります。変更は headers 引数で。 ~~~~~~~~~~~~~~~~~~~~~~~ << ありがとうございました。 しかし同じコードで たださんは動作して、私は動作しなかったのは謎です ('A`) From kwa @ kuwata-lab.com Sat Jan 14 15:16:29 2012 From: kwa @ kuwata-lab.com (Makoto Kuwata) Date: Sat, 14 Jan 2012 15:16:29 +0900 Subject: [tDiary-users-talk: 0494] [patch] change to load 'rexml' lazily for performance Message-ID: 桑田といいます。 tDiary (3.1.1) のパフォーマンスを改善するために、 REXML の require を遅延させてはどうでしょうか。 ・REXML は読みこみがかなり重いライブラリであるため、これを読み込まないように  するだけで簡単にパフォーマンスを改善できる (ただし CGI の場合) ・REXML は amazon plugin で利用されており、標準で enable になっているが、  必ずしも amazon plugin の機能をみんなが使っているわけではない パッチを添付します。 ------------------------------------------------------------ diff --git a/misc/plugin/amazon.rb b/misc/plugin/amazon.rb index 47e2519..ed5fdfa 100644 --- a/misc/plugin/amazon.rb +++ b/misc/plugin/amazon.rb @@ -8,7 +8,7 @@ require 'net/http' require 'uri' require 'timeout' -require 'rexml/document' +autoload :REXML, 'rexml/document' # do not change these variables @amazon_subscription_id = '1CVA98NEF1G753PFESR2' diff --git a/misc/plugin/amazon/amazonimg.rb b/misc/plugin/amazon/amazonimg.rb index c84a760..b3dc984 100644 --- a/misc/plugin/amazon/amazonimg.rb +++ b/misc/plugin/amazon/amazonimg.rb @@ -51,7 +51,7 @@ require 'cgi' require 'open-uri' require 'timeout' -require 'rexml/document' +autoload :REXML, 'rexml/document' def amazon_call_ecs( asin, country = nil ) aid = @amazon_aid || 'cshs-22' ------------------------------------------------------------ apache bench での計測結果です。 (MacOS X 10.6, Apache 2.2.14, tDiary 3.1.1, CPU Core2Duo 2GHz) ### (Ruby 1.8.7-p334) ### before Requests per second: 3.46 [#/sec] (mean) ### after Requests per second: 4.09 [#/sec] (mean)  # 18% up ### (Ruby 1.9.3-p0) ### before Requests per second: 1.93 [#/sec] (mean) ### after Requests per second: 2.23 [#/sec] (mean) # 16% up 同じことは rss.rb にも言えます。 rss.rb は REXML よりさらに読み込みが重いライブラリなので、 これも読み込みを遅延できるならしたほうがいいと思います。 たた、rss.rb を使っているのは recent_rss.rb だけであり、 これはデフォルトでは disable になっているので、デフォルトの 状態でつかっている限りは影響はないです。 その他、主なライブラリの読み込みコストについては http://www.slideshare.net/kwatch/how-to-make-ruby-cgi-script-faster-cgi をご覧ください。 以上です。パッチの取り込みをご検討下さるようお願いします。 -- makoto kuwata From kwa @ kuwata-lab.com Sat Jan 14 22:25:10 2012 From: kwa @ kuwata-lab.com (Makoto Kuwata) Date: Sat, 14 Jan 2012 22:25:10 +0900 Subject: [tDiary-users-talk: 0495] [patch] change to load plugins only once Message-ID: 桑田です。 質問ですが、tDiaryのプラグインは、複数回読み込む必要があるでしょうか。 tDiaryが遅いのは、プラグインの読み込みが原因のひとつみたいです。 これを減らすことができれば、パフォーマンスは改善できます。 調査したところ、リクエストごとに TDiary::TDiaryBase#load_plugins() が 複数回呼び出され、そのたびにプラグインが読み込み直されていました。 以下のパッチで、プラグインの読み込みを 1 回だけにすることができます。 ただし、これで正しいのかはわかりません。 ------------------------------------------------------------ diff --git a/tdiary.rb b/tdiary.rb index 94531d8..7ea0e1e 100644 --- a/tdiary.rb +++ b/tdiary.rb @@ -243,7 +243,7 @@ module TDiary def load_plugins calendar - @plugin = Plugin::new( + @plugin ||= Plugin::new( 'conf' => @conf, 'mode' => mode, 'diaries' => @diaries, ------------------------------------------------------------ apache bench でのベンチマーク結果です。 (MacOS X 10.6, Apache 2.2.14, tDiary 3.1.1, CPU Core2Duo 2GHz) ### (Ruby 1.8.7-p334) ### before Requests per second: 4.06 [#/sec] (mean) ### after Requests per second: 4.72 [#/sec] (mean) # 16% up ### (Ruby 1.9.3-p0) ### before Requests per second: 2.23 [#/sec] (mean) ### after Requests per second: 2.79 [#/sec] (mean) # 25% up このパッチが正しいのかどうかは当方では判断しかねますが、 もし tDiary のプラグインは 1 回だけ読み込めばいいのであれば、 パッチの採用をご検討ください。 #なお、読み込みがいちばん重いのは plugins/50sp.rb でした。 #原因は未調査です。 以上です。 -- makoto kuwata From shibata.hiroshi @ gmail.com Sat Jan 14 22:47:11 2012 From: shibata.hiroshi @ gmail.com (SHIBATA Hiroshi) Date: Sat, 14 Jan 2012 22:47:11 +0900 Subject: [tDiary-users-talk: 0496] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: 柴田です。 > 桑田といいます。 お久しぶりです:) > tDiary (3.1.1) のパフォーマンスを改善するために、 > REXML の require を遅延させてはどうでしょうか。 > > ・REXML は読みこみがかなり重いライブラリであるため、これを読み込まないように >  するだけで簡単にパフォーマンスを改善できる (ただし CGI の場合) > ・REXML は amazon plugin で利用されており、標準で enable になっているが、 >  必ずしも amazon plugin の機能をみんなが使っているわけではない amazon.rb は使う意思がある人のみが有効にしているはずなので、使っていない人は REXML の読み込み速度によるパフォーマンス劣化の影響は受けない…と思いきや リファレンス設定の tdiary.conf.beginner では有効になっているんですね。 確かに amazon.rb を使う気がないのにパフォーマンス劣化を引き起こすのは イマイチだと思うので、 autoload にすることには賛成です。 反対意見の方いますか? -- SHIBATA Hiroshi shibata.hiroshi @ gmail.com http://www.hsbt.org/ From t @ tdtds.jp Sat Jan 14 22:49:02 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Sat, 14 Jan 2012 22:49:02 +0900 Subject: [tDiary-users-talk: 0497] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: ただただしです。 良いと思います。 2012年1月14日22:47 SHIBATA Hiroshi : > amazon.rb は使う意思がある人のみが有効にしているはずなので、使っていない人は > REXML の読み込み速度によるパフォーマンス劣化の影響は受けない…と思いきや > リファレンス設定の tdiary.conf.beginner では有効になっているんですね。 > > 確かに amazon.rb を使う気がないのにパフォーマンス劣化を引き起こすのは > イマイチだと思うので、 autoload にすることには賛成です。 > > 反対意見の方いますか? -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From shibata.hiroshi @ gmail.com Sat Jan 14 22:49:08 2012 From: shibata.hiroshi @ gmail.com (SHIBATA Hiroshi) Date: Sat, 14 Jan 2012 22:49:08 +0900 Subject: [tDiary-users-talk: 0498] Re: [patch] change to load plugins only once In-Reply-To: References: Message-ID: 柴田です。 > 質問ですが、tDiaryのプラグインは、複数回読み込む必要があるでしょうか。 ないと思います。 > tDiaryが遅いのは、プラグインの読み込みが原因のひとつみたいです。 > これを減らすことができれば、パフォーマンスは改善できます。 > 調査したところ、リクエストごとに TDiary::TDiaryBase#load_plugins() が > 複数回呼び出され、そのたびにプラグインが読み込み直されていました。 > > 以下のパッチで、プラグインの読み込みを 1 回だけにすることができます。 > ただし、これで正しいのかはわかりません。 良さそうに思うのでとりあえず master に入れてみて、何か問題があったら revert するというのでどうでしょう? > たださん 人柱は私がやります。 -- SHIBATA Hiroshi shibata.hiroshi @ gmail.com http://www.hsbt.org/ From t @ tdtds.jp Sat Jan 14 22:54:33 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Sat, 14 Jan 2012 22:54:33 +0900 Subject: [tDiary-users-talk: 0499] Re: [patch] change to load plugins only once In-Reply-To: References: Message-ID: ただただしです。 2012年1月14日22:49 SHIBATA Hiroshi : >> 質問ですが、tDiaryのプラグインは、複数回読み込む必要があるでしょうか。 > > ないと思います。 理屈から言えば、稼働中にプラグインのコードが変わることは 想定していないので、1回読み込むだけでいいはずですね。 ただ、(遠い昔の記憶をたどると)このことには気づいていて、 でもあえて放置していたような気もする。けど記憶違いの可能 性も否定できない。というかたぶん記憶違い(笑)。 > 良さそうに思うのでとりあえず master に入れてみて、何か問題があったら > revert するというのでどうでしょう? > たださん > 人柱は私がやります。 じゃあ入れてみましょう。今月はリリース月なので、それまで に何かあったら巻き戻します。 -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From shibata.hiroshi @ gmail.com Sat Jan 14 23:39:02 2012 From: shibata.hiroshi @ gmail.com (SHIBATA Hiroshi) Date: Sat, 14 Jan 2012 23:39:02 +0900 Subject: [tDiary-users-talk: 0500] Re: [patch] change to load plugins only once In-Reply-To: References: Message-ID: >> 良さそうに思うのでとりあえず master に入れてみて、何か問題があったら >> revert するというのでどうでしょう? > たださん >> 人柱は私がやります。 > > じゃあ入れてみましょう。今月はリリース月なので、それまで > に何かあったら巻き戻します。 REXML の autoload の件と合わせてやっておきます。 -- SHIBATA Hiroshi shibata.hiroshi @ gmail.com http://www.hsbt.org/ From kwa @ kuwata-lab.com Sun Jan 15 12:19:25 2012 From: kwa @ kuwata-lab.com (Makoto Kuwata) Date: Sun, 15 Jan 2012 12:19:25 +0900 Subject: [tDiary-users-talk: 0501] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: 桑田です。 amazon.rb プラグインを調べたところ、REXMLだけでなく他のライブラリも 読み込みを遅延させられることがわかりました。 パッチを添付します。 なお今回は autoload ではなく require '...' unless defined?(...) を 使ってますが (timeout() のため)、もちろん autoload でもいいと思います。 ------------------------------------------------------------ diff --git a/misc/plugin/amazon.rb b/misc/plugin/amazon.rb index 47e2519..9c2d4b6 100644 --- a/misc/plugin/amazon.rb +++ b/misc/plugin/amazon.rb @@ -5,10 +5,10 @@ # Copyright (C) 2005-2007 TADA Tadashi # You can redistribute it and/or modify it under GPL2. # -require 'net/http' -require 'uri' -require 'timeout' -require 'rexml/document' +#require 'net/http' # lazy load +#require 'uri' # lazy load +#require 'timeout' # lazy load +#require 'rexml/document' # lazy load # do not change these variables @amazon_subscription_id = '1CVA98NEF1G753PFESR2' @@ -46,6 +46,8 @@ if @conf['amazon.bitly'] and @conf['bitly.login'] and @conf['bitly.key'] then end def amazon_fetch( url, limit = 10 ) + require 'net/http' unless defined?(::Net::HTTP) # lazy load + require 'uri' unless defined?(::URI) # lazy load raise ArgumentError, 'HTTP redirect too deep' if limit == 0 px_host, px_port = (@conf['proxy'] || '').split( /:/ ) @@ -78,6 +80,7 @@ def amazon_call_ecs( asin, id_type, country ) url << "&Version=#{@amazon_require_version}" begin + require 'timeout' unless defined?(::Timeout) # lazy load timeout( 10 ) do amazon_fetch( url ) end @@ -256,6 +259,8 @@ def amazon_get( asin, with_image = true, label = nil, pos = 'amazon' ) if @conf.secure then amazon_secure_html( asin, with_image, label, pos, country ) else + require 'rexml/document' unless defined?(::REXML) + require 'timeout' unless defined?(::Timeout) # lazy load begin cache = "#{@cache_path}/amazon" Dir::mkdir( cache ) unless File::directory?( cache ) ------------------------------------------------------------ apache benchでのベンチマークです。 なお「プラグイン複数回読み込み防止パッチ」適用後の計測です。 ## (Ruby 1.8.7-p334) ## before Requests per second: 4.34 [#/sec] (mean) ## after (lazy load: rexml) Requests per second: 4.77 [#/sec] (mean) # 10% up ## after (lazy load: rexml, net/http, uri, timeout) Requests per second: 4.96 [#/sec] (mean) # 14% up ## (Ruby 1.9.3-p0) ## before Requests per second: 2.33 [#/sec] (mean) ## after (lazy load: rexml) # 19% up Requests per second: 2.77 [#/sec] (mean) ## after (lazy load: rexml, net/http, uri, timeout) Requests per second: 2.98 [#/sec] (mean) # 28% up このパッチにより、amazon.rb プラグインの読み込みコストはほぼなくなりますので、 amazon.rb プラグインがデフォルトで enable になっていてもパフォーマンスに 影響をあたえることはないでしょう。 読み込みコストの大きいプラグインとしては、amazon.rb のほかに disp_referrer.rb があります。 しかし読んで見たかぎりでは、コードが複雑でどう改善していいのかわかりませんでした。 これを改善できれば、CGI の性能が 10% 〜 20% 向上するでしょう。 以上です。 -- makoto kuwata From kwa @ kuwata-lab.com Sun Jan 15 12:33:47 2012 From: kwa @ kuwata-lab.com (Makoto Kuwata) Date: Sun, 15 Jan 2012 12:33:47 +0900 Subject: [tDiary-users-talk: 0502] [patch] eliminate calling 'instance_eval()' Message-ID: 桑田です。 tDiaryでは、いたるところで eval や instance_eval がつかわれてますが、 これを多少なりとも少なくするパッチを書きました。 自分が調べた限りでは、1回のリクエストにつき instance_eval() の 呼び出し回数を 43 回減らせました。 ただし、ベンチマークしたかぎりではアプリケーション全体のパフォーマンスは ほとんど変わらなかったので、興味なければ無視していただいて結構です。 ------------------------------------------------------------ diff --git a/tdiary/config.rb b/tdiary/config.rb index 6a1ca95..adc0c0d 100644 --- a/tdiary/config.rb +++ b/tdiary/config.rb @@ -246,18 +246,16 @@ module TDiary private def setup_attr_accessor_to_all_ivars - instance_variables.each do |ivar_sym| + s = '' + instance_variables().each do |ivar_sym| v = ivar_sym.to_s.sub( /@/, '' ) - instance_eval( <<-SRC - def #{v} - @#{v} - end - def #{v}=(p) - @#{v} = p - end - SRC - ) + s << "def #{v}; @#{v}; end\n" + s << "def #{v}=(p); @#{v}=p; end\n" end + instance_eval(s) + ## or + #names = instance_variables().collect {|ivar| ivar.to_s.sub(/@/, '') } + #(class << self; self; end).class_eval { attr_accessor *names } end def configure_bot_pattern ------------------------------------------------------------ 以上です。 -- makoto kuwata From t @ tdtds.jp Mon Jan 16 19:33:20 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Mon, 16 Jan 2012 19:33:20 +0900 Subject: [tDiary-users-talk: 0503] Re: [patch] eliminate calling 'instance_eval()' In-Reply-To: References: Message-ID: ただただしです。 2012年1月15日12:33 Makoto Kuwata : > tDiaryでは、いたるところで eval や instance_eval がつかわれてますが、 > これを多少なりとも少なくするパッチを書きました。 > 自分が調べた限りでは、1回のリクエストにつき instance_eval() の > 呼び出し回数を 43 回減らせました。 ここはeval覚えたての頃にかなりやっつけで書いたコードですねぇ。 たしかにさほど性能には影響なさそうではあります。 でも最後にコメントアウトされた実装はカッコイイな。これは採用 したい(笑)。 -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From t @ tdtds.jp Mon Jan 16 19:41:38 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Mon, 16 Jan 2012 19:41:38 +0900 Subject: [tDiary-users-talk: 0504] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: ただただしです。 2012年1月15日12:19 Makoto Kuwata : > amazon.rb プラグインを調べたところ、REXMLだけでなく他のライブラリも > 読み込みを遅延させられることがわかりました。 > パッチを添付します。 > なお今回は autoload ではなく require '...' unless defined?(...) を > 使ってますが (timeout() のため)、もちろん autoload でもいいと思います。 メソッド内でのrequireはそのメソッドが呼ばれる(つまりamazon プラグインが実際に利用される)まで実行されないのだから、require をメソッド内に移動すれば目的は達成できるように思えます。 unless...の部分は不要では? もちろん同じrequireを何度も呼ぶコス トはありますが。 #そういう意味では先のREXMLもそうか。 -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From t @ tdtds.jp Mon Jan 16 19:50:40 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Mon, 16 Jan 2012 19:50:40 +0900 Subject: [tDiary-users-talk: 0505] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: ただただしです。 2012年1月16日19:41 TADA Tadashi : > #そういう意味では先のREXMLもそうか。 失礼、REXMLは複数のメソッドで使っているからダメですね。 -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From shibata.hiroshi @ gmail.com Tue Jan 17 09:25:17 2012 From: shibata.hiroshi @ gmail.com (SHIBATA Hiroshi) Date: Tue, 17 Jan 2012 09:25:17 +0900 Subject: [tDiary-users-talk: 0506] Re: [patch] eliminate calling 'instance_eval()' In-Reply-To: References: Message-ID: > ここはeval覚えたての頃にかなりやっつけで書いたコードですねぇ。 > たしかにさほど性能には影響なさそうではあります。 > > でも最後にコメントアウトされた実装はカッコイイな。これは採用 > したい(笑)。 とても Ruby っぽいコードなので入れちゃいましょうか。 -- SHIBATA Hiroshi shibata.hiroshi @ gmail.com http://www.hsbt.org/ From t @ tdtds.jp Tue Jan 17 12:35:27 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Tue, 17 Jan 2012 12:35:27 +0900 Subject: [tDiary-users-talk: 0507] Re: [patch] eliminate calling 'instance_eval()' In-Reply-To: References: Message-ID: ただただしです。 2012年1月17日9:25 SHIBATA Hiroshi : >> でも最後にコメントアウトされた実装はカッコイイな。これは採用 >> したい(笑)。 > > とても Ruby っぽいコードなので入れちゃいましょうか。 そうしましょう。 -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From shibata.hiroshi @ gmail.com Tue Jan 17 20:29:01 2012 From: shibata.hiroshi @ gmail.com (SHIBATA Hiroshi) Date: Tue, 17 Jan 2012 20:29:01 +0900 Subject: [tDiary-users-talk: 0508] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: > メソッド内でのrequireはそのメソッドが呼ばれる(つまりamazon > プラグインが実際に利用される)まで実行されないのだから、require > をメソッド内に移動すれば目的は達成できるように思えます。 > unless...の部分は不要では? もちろん同じrequireを何度も呼ぶコス > トはありますが。 net/http, uri, timeout は他のプラグインやフィルタ、本体でも多分に使って いるので lazy load にしてもあまり効果が無いような気がしますがどうでしょうか。 やります? From t @ tdtds.jp Thu Jan 19 12:08:59 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Thu, 19 Jan 2012 12:08:59 +0900 Subject: [tDiary-users-talk: 0509] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: ただただしです。 2012年1月17日20:29 SHIBATA Hiroshi : > net/http, uri, timeout は他のプラグインやフィルタ、本体でも多分に使って > いるので lazy load にしてもあまり効果が無いような気がしますがどうでしょうか。 そういうのもふくめ、requireはできるだけメソッド内でするように しましょう、というガイドライン的なものを制定するべきなんでしょ うな。 amazonに関しては、requireをメソッド内に移すだけならやっても いいんじゃないかと思います。 -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From kwa @ kuwata-lab.com Sun Jan 22 10:05:56 2012 From: kwa @ kuwata-lab.com (Makoto Kuwata) Date: Sun, 22 Jan 2012 10:05:56 +0900 Subject: [tDiary-users-talk: 0510] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: 桑田です。 2012/1/16 TADA Tadashi : > メソッド内でのrequireはそのメソッドが呼ばれる(つまりamazon > プラグインが実際に利用される)まで実行されないのだから、require > をメソッド内に移動すれば目的は達成できるように思えます。 > unless...の部分は不要では? もちろん同じrequireを何度も呼ぶコス > トはありますが。 一般的には、require 'xxxx' よりも require 'xxxx' unless defined?(...) のほうが高速です。 理由は、たぶんですが require がメソッドなのに対して defined? は演算子だから。 特に rubygems のように rquire を上書きした状態では、require が組み込みのものでは なくなるため、遅くなります。 とはいっても、マイクロベンチマーク上では require '...' unless defined?(...) のほうが ずいぶん高速なんですが、それがアプリケーションの速度にまで影響するのはまれなので、 unless defined? なしでもいいと思います。 unless defined? をつけたのは、たとえば hash['key'] より hash[:key] のほうが速いよねーとか、 str.length == 0 より str.empty? のほうが速いよねーといった程度のものであり、個人的な習慣です。 -- makoto kuwata From kwa @ kuwata-lab.com Sun Jan 22 10:25:58 2012 From: kwa @ kuwata-lab.com (Makoto Kuwata) Date: Sun, 22 Jan 2012 10:25:58 +0900 Subject: [tDiary-users-talk: 0511] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: 2012/1/17 SHIBATA Hiroshi : > > net/http, uri, timeout は他のプラグインやフィルタ、本体でも多分に使って > いるので lazy load にしてもあまり効果が無いような気がしますがどうでしょうか。 > > やります? 先に掲載したベンチマーク上では明確に効果が現れています。 結果を再掲します。 > > ## (Ruby 1.8.7-p334) > ## before > Requests per second: 4.34 [#/sec] (mean) > ## after (lazy load: rexml) > Requests per second: 4.77 [#/sec] (mean) # 10% up > ## after (lazy load: rexml, net/http, uri, timeout) > Requests per second: 4.96 [#/sec] (mean) # 14% up > > ## (Ruby 1.9.3-p0) > ## before > Requests per second: 2.33 [#/sec] (mean) > ## after (lazy load: rexml) # 19% up > Requests per second: 2.77 [#/sec] (mean) > ## after (lazy load: rexml, net/http, uri, timeout) > Requests per second: 2.98 [#/sec] (mean) # 28% up また require を遅延させることで、なにかデメリットはあるでしょうか。 もし大きなデメリットがないのであれば、高速化というメリットを選択して いただけるとうれしいです。 ### なお高速化のためのパッチを添付した背景を説明しまと、 先日、さくらインターネットのレンタルサーバにtdiaryをインストールして動かしたところ、 apache bench測定で 0.7 req/sec しか速度が出ませんでした。 ## 試してみたい方は以下をどうぞ。ご自由にお試し下さい。 $ ab -n 10 -c 1 'http://gal.undo.jp/tdiary/?date=20120101' ... Requests per second: 0.67 [#/sec] (mean) ... いくらなんでもこれは遅すぎると思いました。 同じ環境で、別のCGIスクリプトは 6〜7 req/sec の性能が出てるので、 tdiaryはもうちょっと速度がでてもいいのかなと思います。 -- makoto kuwata From miwarin @ gmail.com Sun Jan 22 15:28:15 2012 From: miwarin @ gmail.com (=?ISO-2022-JP?B?GyRCOzBOWD84GyhCKCBNaXdhIFN1c3VtdSAp?=) Date: Sun, 22 Jan 2012 15:28:15 +0900 Subject: [tDiary-users-talk: 0512] =?iso-2022-jp?b?Z3JlcC5yYiAbJEIkThsoQiBVVEYtOCAbJEJCUDF+JEgbKEIg?= =?iso-2022-jp?b?cnVieSAxLjkgGyRCQlAxfhsoQg==?= Message-ID: 三輪です。 青木さんの grep.rb http://i.loveruby.net/svn/public/tdiarytools/trunk/grep.rb の UTF-8 対応と ruby 1.9 対応してみました。( すごくバータリーです ) ( というか grep.rb ではなくて search.rb を使ってるのかしら https://github.com/tdiary/tdiary-contrib/blob/master/util/tdiarysearch/search.rb ) --- C:/Users/rin/Desktop/grep.rb.orig Sun Jan 22 15:20:40 2012 +++ C:/Users/rin/Desktop/grep.rb Sun Jan 22 15:23:07 2012 @@ -1,4 +1,5 @@ #!/usr/bin/env ruby +# -*- coding: utf-8 -*- # # $Id$ # @@ -26,7 +27,7 @@ - + tDiary Grep @@ -115,12 +116,12 @@ begin Uconv.u8toeuc(str) rescue Uconv::Error - NKF::nkf('-e -m0', str) + NKF::nkf('-w -m0', str) end end rescue LoadError def to_euc(str) - NKF::nkf('-e -m0', str) + NKF::nkf('-w -m0', str) end end @@ -133,12 +134,12 @@ class InvalidTDiaryFormat < TDiaryGrepError; end class ConfigError < TDiaryGrepError; end -Z_SPACE = "\241\241" # zen-kaku space +Z_SPACE = " " # zen-kaku space -BEGIN { $defout.binmode } +BEGIN { $stdout.binmode } def main - $KCODE = 'EUC' +# $KCODE = 'UTF8' cgi = CGI.new html = '

error

' begin @@ -158,7 +159,7 @@ elsif not cgi.valid?('q') return search_form_page() else - query = to_euc([cgi.params['q']].compact.flatten.join(' ')) + query = [cgi.params['q']].compact.flatten.join(' ') html = search_result_page(setup_patterns(query)) save_query(query, query_log()) if LOGGING return html @@ -183,7 +184,7 @@ def send_html(cgi, html) print cgi.header('status' => '200 OK', 'type' => 'text/html', - 'charset' => 'euc-jp', + 'charset' => 'UTF-8', 'Content-Length' => html.length.to_s, 'Cache-Control' => 'no-cache', 'Pragma' => 'no-cache') @@ -193,7 +194,7 @@ def setup_patterns(query) patterns = split_string(query).map {|pat| check_pattern pat - /#{Regexp.quote(pat)}/ie + /#{Regexp.quote(pat)}/iu } raise WrongQuery, 'no pattern' if patterns.empty? raise WrongQuery, 'too many sub patterns' if patterns.length > 8 @@ -208,7 +209,7 @@ end def split_string(str) - str.split(/[\s#{Z_SPACE}]+/oe).reject {|w| w.empty? } + str.split(/[\s#{Z_SPACE}]+/ou).reject {|w| w.empty? } end def save_query(query, file) @@ -312,7 +313,7 @@ def read_diaries(path) diaries = [] - File.open(path) {|f| + File.open(path, :encoding => 'UTF-8') {|f| f.each('') do |header| diaries.push Diary.parse(header, f.gets("\n.\n").chomp(".\n")) end @@ -398,7 +399,7 @@ title, body = @source.split(/\n/, 2) sprintf('%-30s | %s', title.to_s.strip, - remove_tags(body.to_s).gsub(/[\s#{Z_SPACE}]+/oe, ' ').slice(/\A.{0,60}/me)) + remove_tags(body.to_s).gsub(/[\s#{Z_SPACE}]+/ou, ' ').slice(/\A.{0,60}/mu)) end private @@ -420,7 +421,7 @@ @tdiary_conf = nil def tdiary_conf - @tdiary_conf ||= File.read("#{File.dirname(__FILE__)}/tdiary.conf") + @tdiary_conf ||= File.read("#{File.dirname(__FILE__)}/tdiary.conf", :encoding => 'UTF-8') end # -- みわ From shibata.hiroshi @ gmail.com Sun Jan 22 21:07:38 2012 From: shibata.hiroshi @ gmail.com (SHIBATA Hiroshi) Date: Sun, 22 Jan 2012 21:07:38 +0900 Subject: [tDiary-users-talk: 0513] Re: [patch] change to load 'rexml' lazily for performance In-Reply-To: References: Message-ID: > なお高速化のためのパッチを添付した背景を説明しまと、 > 先日、さくらインターネットのレンタルサーバにtdiaryをインストールして動かしたところ、 > apache bench測定で 0.7 req/sec しか速度が出ませんでした。 結果をもう一度見てさすがに重いというのと、簡単な変更で改善できるということですので amazon.rb で使っている require を autoload で置き換える方法で対応しました。 >桑田さん 他にも何か気がついた場所があれば報告して頂けると嬉しいです。 -- SHIBATA Hiroshi shibata.hiroshi @ gmail.com http://www.hsbt.org/ From t @ tdtds.jp Mon Jan 23 19:08:00 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Mon, 23 Jan 2012 19:08:00 +0900 Subject: [tDiary-users-talk: 0514] Re: =?iso-2022-jp?b?Z3JlcC5yYiAbJEIkThsoQiBVVEYtOCAbJEJCUDF+GyhC?= =?iso-2022-jp?b?GyRCJEgbKEIgcnVieSAxLjkgGyRCQlAxfhsoQg==?= In-Reply-To: References: Message-ID: ただただしです。 2012年1月22日15:28 三輪晋( Miwa Susumu ) : > 青木さんの grep.rb http://i.loveruby.net/svn/public/tdiarytools/trunk/grep.rb > の UTF-8 対応と ruby 1.9 対応してみました。( すごくバータリーです ) > > ( というか grep.rb ではなくて search.rb を使ってるのかしら > https://github.com/tdiary/tdiary-contrib/blob/master/util/tdiarysearch/search.rb > ) 個人的にはgrepもsearchも使ったことがないのでなんとも 言えないのですが(search.rbが1.9対応されているかどうか も知らない)、grep.rbもcontribに入れてみては? -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From miwarin @ gmail.com Sun Jan 29 19:08:34 2012 From: miwarin @ gmail.com (=?ISO-2022-JP?B?GyRCOzBOWD84GyhCKCBNaXdhIFN1c3VtdSAp?=) Date: Sun, 29 Jan 2012 19:08:34 +0900 Subject: [tDiary-users-talk: 0515] =?iso-2022-jp?b?Y2FsZW5kYXIyLnJiIBskQiRLJUslMyVLJTMlKyVsJXMbKEI=?= =?iso-2022-jp?b?GyRCJUAhPERJMkMbKEI=?= Message-ID: 三輪です。 だいぶ前に作業したんですが calendar2.rb にニコニコカレンダーを表示するようにしてみました。 ニコニコカレンダー http://www.geocities.jp/nikonikocalendar/index_ja.html 手前味噌ですが以下のページの右側のようなカレンダーになります。 http://www.area51.gr.jp/~rin/diary/ 差分をメール最後に書きました。 ( こういうのは github に pull request するものでしょうか ) 【使い方】 顔画像を @calendar2_image_dir に設置する。 ( 画像を添付しました。ML に添付できるんだっけ... ) nikocal_bad.gif nikocal_good.gif nikocal_normal.gif 日記の 追記→設定→ヘッダ・フッタに以下を書く <%=calendar2 %> 日記のタイトルに「:-)」「:-|」「:-(」のいずれかを書く 【補足】 添付した顔画像は「ニコニコカレンダー」サイトから頂きました。 坂田さんから、画像の二次配布の許可は頂いています。 --- //MOGU/rin/public_html/diary/misc/plugin/calendar2.rb.orig Sun Sep 05 13:06:59 2010 +++ //MOGU/rin/public_html/diary/misc/plugin/calendar2.rb Sat Jul 30 00:29:58 2011 @@ -29,6 +29,10 @@ @calendar2_image_url.chop! if /\/$/ =~ @calendar2_image_url @calendar2_imageex_yearlydir = @options && @options['image_ex.yearlydir'] || 0 @calendar2_show_image = @options && @options['calendar2.show_image'] || false + @ calendar2_show_nikocal = @options && @options['calendar2.show_nikocal'] || false + @ calendar2_image_nikocal_good = @options && @options['calendar2.image_nikocal_good'] || 'nikocal_good.gif' + @ calendar2_image_nikocal_normal = @options && @options['calendar2.image_nikocal_normal'] || 'nikocal_normal.gif' + @ calendar2_image_nikocal_bad = @options && @options['calendar2.image_nikocal_bad'] || 'nikocal_bad.gif' def calendar2_make_cal(year, month) result = [] @@ -92,6 +96,28 @@ end end +def calender2_make_nikocal(diary) + + /(:-\)|:-\||:-\()/ =~ diary.title + if $1 == nil + return nil + end + + image_url = @calendar2_image_url + + case diary.title + when ':-)' + %Q|| + when ':-|' + %Q|| + when ':-(' + %Q|| + else + nil + end +end + + def calendar2(days_format = nil, navi_format = nil, show_todo = nil) days_format ||= @calendar2_days_format navi_format ||= @calendar2_navi_format @@ -162,7 +188,13 @@ subtitles << h( %Q|#{idx}. #{@conf.shorten(apply_plugin( text, true ))}| ) idx.succ! end - day_img = ((@calendar2_show_image and !@conf.secure) ? calender2_make_image(@diaries[date], date) : day.to_s) + if (@calendar2_show_image and !@conf.secure) + day_img = calender2_make_image(@diaries[date], date) + elsif (@calendar2_show_nikocal and !@conf.secure) + day_img = calender2_make_nikocal(@diaries[date]) + else + day_img = day.to_s + end day_img = day.to_s if day_img == nil %Q|#{day_img}| end -- みわ -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: images.zip 型: application/zip サイズ: 2935 バイト 説明: 無し URL: http://lists.sourceforge.jp/mailman/archives/tdiary-users-talk/attachments/20120129/83ac14ea/attachment.zip From t @ tdtds.jp Mon Jan 30 12:07:00 2012 From: t @ tdtds.jp (TADA Tadashi) Date: Mon, 30 Jan 2012 12:07:00 +0900 Subject: [tDiary-users-talk: 0516] Re: =?iso-2022-jp?b?Y2FsZW5kYXIyLnJiIBskQiRLJUslMyVLJTMlKyVsGyhC?= =?iso-2022-jp?b?GyRCJXMlQCE8REkyQxsoQg==?= In-Reply-To: References: Message-ID: ただただしです。 なるほど、面白いですね。ただ、こういうそれほど一般的でない 機能(すみません)をいきなり元プラグインにマージするのはあま りよくないと考えます。 別のプラグインに分離して、calendar2と同時使用すると機能を 発揮できるようなパッチであれば受け入れられると思います。そ のためのcalendar2へのパッチが必要であればそれも込みで。 #この場合、ニコカレプラグインはまずはcontribに入れることに #なります。 うまく分離できれば、画像表示も別プラグインにできるかもです ね。 2012年1月29日19:08 三輪晋( Miwa Susumu ) : > だいぶ前に作業したんですが calendar2.rb にニコニコカレンダーを表示するようにしてみました。 > > ニコニコカレンダー > http://www.geocities.jp/nikonikocalendar/index_ja.html > > 手前味噌ですが以下のページの右側のようなカレンダーになります。 > http://www.area51.gr.jp/~rin/diary/ > > 差分をメール最後に書きました。 > ( こういうのは github に pull request するものでしょうか ) -- ただただし - ツッコミは、短く鋭く愛を込めて♪ http://tdtds.jp/ @tdtds From shibata.hiroshi @ gmail.com Mon Jan 30 16:47:15 2012 From: shibata.hiroshi @ gmail.com (SHIBATA Hiroshi) Date: Mon, 30 Jan 2012 16:47:15 +0900 Subject: [tDiary-users-talk: 0517] Re: =?iso-2022-jp?b?Y2FsZW5kYXIyLnJiIBskQiRLJUslMyVLJTMlKyVsGyhC?= =?iso-2022-jp?b?GyRCJXMlQCE8REkyQxsoQg==?= In-Reply-To: References: Message-ID: > 差分をメール最後に書きました。 > ( こういうのは github に pull request するものでしょうか ) github に pull request するとコードにもコメントできて便利です:)