新規作成
OpenIDで認証してエントリーを新規作成します
共有
エントリーにはOpenIDで閲覧と編集に制限かけることができます
変更履歴
編集履歴もあるので、コラボレーションにも活用できます

CGI.pm vs CGI::Simple

なんかCGIがアツいのでやってみた


CGI.pm

Concurrency Level:      30
Time taken for tests:   82.684799 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      141120 bytes
HTML transferred:       10000 bytes
Requests per second:    12.09 [#/sec] (mean)
Time per request:       2480.544 [ms] (mean)
Time per request:       82.685 [ms] (mean, across all concurrent requests)
Transfer rate:          1.66 [Kbytes/sec] received

CGI::Simple

Concurrency Level:      30
Time taken for tests:   61.789928 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      141220 bytes
HTML transferred:       10000 bytes
Requests per second:    16.18 [#/sec] (mean)
Time per request:       1853.698 [ms] (mean)
Time per request:       61.790 [ms] (mean, across all concurrent requests)
Transfer rate:          2.22 [Kbytes/sec] received
created by blog.nomadscafe.jp

time() vs Time::HiRes::time()

#!/usr/bin/perl

use strict;
use Time::HiRes qw//;
use Benchmark;
Benchmark::timethese(500000, {
    'time' => sub { time() },
    'hires' => sub { Time::HiRes::time() },
});

result

Benchmark: timing 500000 iterations of hires, time...
     hires:  2 wallclock secs ( 0.35 usr +  1.07 sys =  1.42 CPU) @ 352112.68/s (n=500000)
      time:  2 wallclock secs ( 0.19 usr +  1.08 sys =  1.27 CPU) @ 393700.79/s (n=500000)
created by blog.nomadscafe.jp

OpenIDとは(概要)

OpenID(おーぷんあいでぃー)というものが普及し始めている。

Google,Yahoo,Microsoftなど、大手の対応も加速してきている。


経緯

  アカウントが必要なサイトでは、以下の問題が発生する。

  ユーザ側:いろんなサイトでIDを取得していると、アカウントの管理が大変になってくる。

  サイト側:アカウントを取得するときの個人情報を持つことになり、流出のリスクが発生する。


  これらの問題を解消するため、アカウントを1ヶ所で管理するしくみが作られた。


対応例

  サイトごとのログインフォームとは別に、オープンIDでのログインフォームが追加されていて、そこに、自分のOpenIDを入力する。


デメリット?

  ユーザ:IDは、URL形式になるので、文字数が長くなる。←単語登録しておくという手もある。

  サイト:個人情報が欲しい場合は、ログイン後にさらに収集するしかけを考えなければならない。口実がないため、今までよりも集めにくくなる。

      OpenIDを導入しないと、「OpenID八分」とでもいうような状況になり、サービスを利用されなくなる可能性がある。


期待はずれな点

  対応したサイトであれば、どこかにログインしていれば、その後はログインなしで使える(いわゆるシングルサインオン)のかなと思ったが、どうやら違うらしい。


ウィキペディア

  http://ja.wikipedia.org/wiki/OpenID

created by anonymous

WWW::Curl vs LWP

機能に差があるので、公平なテストじゃないけどWWW::Curl速い

結果
Benchmark: timing 500 iterations of curl, lwp...
      curl:  1 wallclock secs ( 0.31 usr +  0.30 sys =  0.61 CPU) @ 819.67/s (n=500)
       lwp:  4 wallclock secs ( 3.13 usr +  0.37 sys =  3.50 CPU) @ 142.86/s (n=500)
スクリプト
use Benchmark;
use LWP::UserAgent;
use WWW::Curl::Easy;

my $count = 500;

timethese( $count , {
    'curl' => sub {
        open(my $content_fh, '>', \my $content);
        open(my $header_fh, '>', \my $header);
        my $curl = WWW::Curl::Easy->new();
        $curl->setopt( CURLOPT_WRITEDATA, $content_fh);
        $curl->setopt( CURLOPT_WRITEHEADER, $header_fh);
        $curl->setopt( CURLOPT_URL, 'http://localhost/' );
        $curl->perform();
    },
    'lwp' => sub {
        my $ua = LWP::UserAgent->new;
        my $res = $ua->get('http://localhost/');
    }
});
created by blog.nomadscafe.jp

plagger-ircbotをPlagger::Crypt対応させる

対応してなかったので。

commitしていいですかね?

Index: bin/plagger-ircbot
===================================================================
--- bin/plagger-ircbot  (revision 2044)
+++ bin/plagger-ircbot  (working copy)
@@ -10,6 +10,7 @@
 use YAML;
 
 use Plagger::ConfigLoader;
+use Plagger::Crypt;
 
 use POE qw(
     Session
@@ -115,7 +116,7 @@
             Username => $ENV{USER},
             Server   => $config->{server_host},
             Port     => $config->{server_port} || 6667,
-            Password => $config->{server_password} || undef,
+            Password => $config->{server_password} ? Plagger::Crypt->decrypt($config->{server_password}) :  undef,
         }
     );
 }
created by blog.nomadscafe.jp

HTML::Template::Proのベンチマーク

HTML::Templateとの比較

#!/usr/bin/perl

use strict;
use HTML::Template;
use HTML::Template::Pro;
use Benchmark;

my $html = <<EOF;
<TMPL_LOOP NAME=list><TMPL_IF NAME=key><TMPL_VAR NAME=key>,<TMPL_VAR NAME=value><br></TMPL_IF>
</TMPL_LOOP>
EOF

my @list;
map { $list[$_] = { key=>$_, value => rand($_) } } 0..29;

Benchmark::timethese(2000, {
        'HTML::Template' => \&htmltmpl,
        'HTML::Template::Pro' => \&htmltmplpro,
});

sub htmltmpl{
        my $tmpl = HTML::Template->new(
                scalarref => \$html,
                die_on_bad_params=>0
        );
        $tmpl->param('list',\@list);
        $tmpl->output;
}

sub htmltmplpro{
        my $tmpl = HTML::Template::Pro->new(
                scalarref => \$html,
                die_on_bad_params=>0
        );
        $tmpl->param('list',\@list);
        $tmpl->output;
}
結果
Benchmark: timing 2000 iterations of HTML::Template, HTML::Template::Pro...
HTML::Template: 10 wallclock secs (10.29 usr +  0.00 sys = 10.29 CPU) @ 194.36/s (n=2000)
HTML::Template::Pro:  2 wallclock secs ( 1.69 usr +  0.01 sys =  1.70 CPU) @ 1176.47/s (n=2000)

TTとの比較

#!/usr/bin/perl

use strict;
use Template;
use HTML::Template::Pro;
use Benchmark;

my $htpro = <<EOF;
<TMPL_VAR EXPR="comma(num)">
EOF

my $tt = <<EOF;
[% USE Comma %]
[% num | comma %]
EOF

Benchmark::timethese(2000, {
            'TT'                             => \&template,
                'HTML::Template::Pro' => \&htmltmplpro,
                });

sub template {
       my $template = Template->new();
       $template->process(\$tt, {num=>1000}, \my $output);
}

sub htmltmplpro{
        my $tmpl = HTML::Template::Pro->new(
                scalarref => \$htpro,
                die_on_bad_params=>0
        );
        $tmpl->register_function( 'comma', sub {
                local $_ = shift;
                1 while s/((?:\A|[^.0-9])[-+]?\d+)(\d{3})/$1,$2/s;
                return $_;
                } );
        $tmpl->param('num',1000);
        $tmpl->output;
}
結果
Benchmark: timing 2000 iterations of HTML::Template::Pro, TT...
        HTML::Template::Pro:  1 wallclock secs ( 0.44 usr +  0.01 sys =  0.45 CPU) @ 4444.44/s (n=2000)
        TT: 10 wallclock secs ( 9.92 usr +  0.04 sys =  9.96 CPU) @ 200.80/s (n=2000)
created by blog.nomadscafe.jp

はあ、

てすとてす。

created by https://me.yahoo.co.jp/a/sIkrNLoFa7s5R0BMAITm5klPzA--#d0521

てすてす

ぐっぴたぶたぶ

ぐっぴたぶたぶ


ぶひー!

created by https://id.mixi.jp/25661/friends/25661

きねんぱぴこ

はあーい

created by https://id.mixi.jp/105

Crypt::SSLeayでproxyエラーになるときの対策

[client] => [Apache mod_proxy] => [server]

っていう環境で時々つながらない事があるってので数日間悩んでいたんだけど、

Crypt::SSLeayのrtにでてた。


#33954: CONNECT is not robust to fragmentation of HTTP headers


これに対応するパッチがこれ

--- Crypt-SSLeay-0.57/lib/Net/SSL.pm.orig       2008-08-13 12:13:33.000000000 +0900
+++ Crypt-SSLeay-0.57/lib/Net/SSL.pm    2008-08-13 12:13:58.000000000 +0900
@@ -361,8 +361,11 @@
 
     $connect_string .= $CRLF;
     $self->SUPER::send($connect_string);
-    my $header;
-    my $n = $self->SUPER::sysread($header, 8192);
+    my $header='';
+    while ( $header !~ /$CRLF$CRLF/ ) {
+      my $n = $self->SUPER::sysread($header, 8192, length($header));
+    }
+
     my $conn_ok = ($header =~ /HTTP\/\d+\.\d+\s+200\s+/is) ? 1 : 0;
 
     if (not $conn_ok) {

これで解決するといいなと思うんだけど、確認までに時間かかる


もうひとつ問題があって、接続に失敗したときに、SSLのバージョンを変更して再接続をしようとするんだけど、

その時の引数が変。


1回目は

CONNECT example.com HTTP/1.0

なんだけど、2回目がproxyのIPアドレスでCONNECTしようとしてしまう。

CONNECT 192.168.1.1 HTTP/1.0

これはもちろん、エラーになる

原因はNet::SSLの136行目あたりの

            my %args = (%$new_arg, %$arg);

これのnew_argとargが逆なんじゃないかと思うんですが、

みなさまどう思いますでしょうか。

created by blog.nomadscafe.jp

<45678910111213>