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

test

test

created by http://tenjin-q12.coara.or.jp/identity/takasugi

平成21年6月28日(日)

今日は雨と天気予報では言っていたが晴れている。

created by http://tenjin-q12.coara.or.jp/identity/abeken

ダブルキャスト エンド10ルート

ダマそうと…

生年月日

名前


ラーメン屋

あっそ…

気をつけないと


主演女優の

どうする?

ナイト様

どうしたんだ!

怒るぞ!

友達が来てて


話題をかえよう

友達だよ

ハイ!!

部長と一緒が


外の空気

顔は見た?

もう少しセリフ


熱いお茶

風呂!?


逃げよう

created by wired-lynx.net

WWW::MobileCarrierJP::DoCoMo::Display。VGAモード対応案

案にもなってない

ちょっと変えた@20090610

diff --git a/lib/WWW/MobileCarrierJP/DoCoMo/Display.pm b/lib/WWW/MobileCarrierJP/DoCoMo/Display.pm
index ae4310f..b5d1510 100644
--- a/lib/WWW/MobileCarrierJP/DoCoMo/Display.pm
+++ b/lib/WWW/MobileCarrierJP/DoCoMo/Display.pm
@@ -13,17 +13,27 @@ sub scrape {
     $html =~ s/(?:\r?\n)+/\n/g;
     $html =~ s/μ/myu/g;
     my $re = _regexp();
+    my $opt_re = _opt_regexp();
+    chomp $opt_re;
     my $map;
     while ( $html =~ /$re/igs ) {
-        my ( $model, $width, $height, $color, $depth ) = ( $1, $2, $3, $4, $5 );
-
-        push @$map, {
+        my ( $model, $width, $height, $opt, $color, $depth ) = ( $1, $2, $3, $4, $5, $6 );
+        my %ret = (
             model    => $model,
             width    => $width,
             height   => $height,
             is_color => $color eq 'カラー',
             depth    => $depth,
-        };
+        );
+
+        my ($vga_width, $vga_height) = ( '', '' );
+        if ( $opt =~ /$opt_re/is ) {
+            $ret{vga_width} = $width;
+            $ret{vga_height} = $height;
+            $ret{width} = $1;
+            $ret{height} = $2;
+        }
+        push @$map, \%ret;
     }
     $map;
 }
@@ -46,11 +56,18 @@ sub _regexp {
 <td><span class="txt">.*?(?:</span></td>)?
 <td><span class="txt">.*?(?:</span></td>)?
 <td><span class="txt">.*?(\d+)×(\d+).*?</span></td>
-<td>.*?</td>
+(<td>.*?</td>)
 <td><span class="txt">(白黒|カラー)(?:.*?)(\d+)(?:色|階調)</span></td>
 RE
 }
 
+sub _opt_regexp {
+    return <<'RE';
+<td><span class="txt">.*?(\d+)×(\d+).*?</span></td>
+<td>.*?</td>
+RE
+}
+
 1;
 __END__
 
diff --git a/t/020_docomo/03_docomo_displaymap.t b/t/020_docomo/03_docomo_displaymap.t
index a7591de..0931d82 100644
--- a/t/020_docomo/03_docomo_displaymap.t
+++ b/t/020_docomo/03_docomo_displaymap.t
@@ -1,6 +1,6 @@
 use strict;
 use warnings;
-use Test::More tests => 6;
+use Test::More tests => 7;
 use WWW::MobileCarrierJP::DoCoMo::Display;
 
 my $dat = WWW::MobileCarrierJP::DoCoMo::Display->scrape;
@@ -25,6 +25,16 @@ ck(
     width    => 240,
 );
 
+ck(
+    depth    => 16777216,
+    height   => 296,
+    is_color => 1,
+    model    => 'SH-05A',
+    width    => 240,
+    vga_width => 480,
+    vga_height => 592,
+);
+
 sub ck {
     my $phone = @_ == 1 ? $_[0] : {@_};
     is_deeply [grep { $phone->{model} eq $_->{model} } @$dat]->[0], $phone;
created by blog.nomadscafe.jp

Cache::Memcached::Fast 0.14を以前のketama algorithmにも対応させる

ketamaの分散を改善するために、全バージョンとアルゴリズムの互換性がなくなったことで有名なCache::Memcache::Fast 0.14ですが以前のアルゴリズムへも対応できるようにpatchつくってみました。


使い方

my $memcached = Cache::Memcached::Fast->new({
    servers => [qw/127.0.0.1:11222 127.0.0.1:11223/],
    old_ketama_algo => 1,
    ketama_points => 150,
});

patch

diff -ur Cache-Memcached-Fast-0.14.orig/Fast.xs Cache-Memcached-Fast-0.14/Fast.xs
--- Cache-Memcached-Fast-0.14.orig/Fast.xs        2009-02-07 20:34:57.000000000 +0900
+++ Cache-Memcached-Fast-0.14/Fast.xs     2009-05-14 15:12:35.000000000 +0900
@@ -207,6 +207,10 @@
 
   memd->servers = newAV();
 
+  ps = hv_fetch(conf, "old_ketama_algo", 15, 0);
+  if (ps && SvOK(*ps))
+    client_set_old_ketama_algo(c, SvTRUE(*ps));
+
   ps = hv_fetch(conf, "ketama_points", 13, 0);
   if (ps && SvOK(*ps))
     {
diff -ur Cache-Memcached-Fast-0.14.orig/lib/Cache/Memcached/Fast.pm Cache-Memcached-Fast-0.14/lib/Cache/Memcached/Fast.pm
--- Cache-Memcached-Fast-0.14.orig/lib/Cache/Memcached/Fast.pm    2009-02-07 20:34:56.000000000 +0900
+++ Cache-Memcached-Fast-0.14/lib/Cache/Memcached/Fast.pm 2009-05-14 13:35:40.000000000 +0900
@@ -508,6 +508,7 @@
     max_failures => 1,
     failure_timeout => 1,
     ketama_points => 1,
+    old_ketama_algo => 1,
     serialize_methods => 1,
     utf8 => 1,
     max_size => 1,
diff -ur Cache-Memcached-Fast-0.14.orig/src/client.c Cache-Memcached-Fast-0.14/src/client.c
--- Cache-Memcached-Fast-0.14.orig/src/client.c   2009-02-07 20:34:57.000000000 +0900
+++ Cache-Memcached-Fast-0.14/src/client.c        2009-05-14 15:13:12.000000000 +0900
@@ -293,6 +293,7 @@
   int failure_timeout;          /* 1 sec.  */
   int close_on_error;
   int nowait;
+  int old_ketama_algo;
   int hash_namespace;
 
   struct array index_list;
@@ -398,6 +399,7 @@
   c->failure_timeout = 10;
   c->close_on_error = 1;
   c->nowait = 0;
+  c->old_ketama_algo = 0;
   c->hash_namespace = 0;
 
   c->generation = 1;            /* Different from initial command state.  */
@@ -512,6 +514,11 @@
   c->nowait = enable;
 }
 
+void
+client_set_old_ketama_algo(struct client *c, int enable)
+{
+    c->old_ketama_algo = enable;
+}
 
 void
 client_set_hash_namespace(struct client *c, int enable)
@@ -542,7 +549,7 @@
     return res;
 
   res = dispatch_add_server(&c->dispatch, host, host_len, port, port_len,
-                            weight, array_size(c->servers));
+                            weight, array_size(c->servers), c->old_ketama_algo);
   if (res == -1)
     return MEMCACHED_FAILURE;
 
diff -ur Cache-Memcached-Fast-0.14.orig/src/client.h Cache-Memcached-Fast-0.14/src/client.h
--- Cache-Memcached-Fast-0.14.orig/src/client.h   2009-02-07 20:34:57.000000000 +0900
+++ Cache-Memcached-Fast-0.14/src/client.h        2009-05-14 16:22:08.000000000 +0900
@@ -155,6 +155,10 @@
 
 extern
 void
+client_set_old_ketama_algo(struct client *c, int enable);
+
+extern
+void
 client_reset(struct client *c, struct result_object *o, int noreply);
 
 extern
diff -ur Cache-Memcached-Fast-0.14.orig/src/dispatch_key.c Cache-Memcached-Fast-0.14/src/dispatch_key.c
--- Cache-Memcached-Fast-0.14.orig/src/dispatch_key.c     2009-02-07 20:34:57.000000000 +0900
+++ Cache-Memcached-Fast-0.14/src/dispatch_key.c  2009-05-14 15:29:36.000000000 +0900
@@ -158,7 +158,7 @@
 ketama_crc32_add_server(struct dispatch_state *state,
                         const char *host, size_t host_len,
                         const char *port, size_t port_len,
-                        double weight, int index)
+                        double weight, int index, int old_ketama_algo)
 {
   static const char delim = '\0';
   unsigned int crc32, point;
@@ -184,10 +184,19 @@
         We want the same result on all platforms, so we hardcode size
         of int as 4 8-bit bytes.
       */
-      buf[0] = point & 0xff;
-      buf[1] = (point >> 8) & 0xff;
-      buf[2] = (point >> 16) & 0xff;
-      buf[3] = (point >> 24) & 0xff;
+      if ( old_ketama_algo ) {
+          point = 0;
+          buf[0] = i & 0xff;
+          buf[1] = (i >> 8) & 0xff;
+          buf[2] = (i >> 16) & 0xff;
+          buf[3] = (i >> 24) & 0xff;
+      }
+      else {
+          buf[0] = point & 0xff;
+          buf[1] = (point >> 8) & 0xff;
+          buf[2] = (point >> 16) & 0xff;
+          buf[3] = (point >> 24) & 0xff;
+      }
 
       point = compute_crc32_add(crc32, buf, 4);
 
@@ -284,11 +293,11 @@
 dispatch_add_server(struct dispatch_state *state,
                     const char *host, size_t host_len,
                     const char *port, size_t port_len,
-                    double weight, int index)
+                    double weight, int index, int old_ketama_algo)
 {
   if (state->ketama_points > 0)
     return ketama_crc32_add_server(state, host, host_len, port, port_len,
-                                   weight, index);
+                                   weight, index, old_ketama_algo);
   else
     return compatible_add_server(state, weight, index);
 }
diff -ur Cache-Memcached-Fast-0.14.orig/src/dispatch_key.h Cache-Memcached-Fast-0.14/src/dispatch_key.h
--- Cache-Memcached-Fast-0.14.orig/src/dispatch_key.h     2009-02-07 20:34:57.000000000 +0900
+++ Cache-Memcached-Fast-0.14/src/dispatch_key.h  2009-05-14 13:45:45.000000000 +0900
@@ -60,7 +60,7 @@
 dispatch_add_server(struct dispatch_state *state,
                     const char *host, size_t host_len,
                     const char *port, size_t port_len,
-                    double weight, int index);
+                    double weight, int index, int old_ketama_algo);
 
 extern
 int
created by blog.nomadscafe.jp

Variable::Magic と Tie::Scalar

なんとなくやってみた

package TestTie;

use strict;
use warnings;
require Tie::Scalar;
use vars qw/@ISA/;
@ISA = qw/Tie::StdScalar/;

sub FETCH { 123 }

package main;

use strict;
use warnings;
use Variable::Magic qw/wizard cast/;
use Benchmark;

tie my $tied, 'TestTie', 123;
warn $tied;

my $wiz = wizard get => sub  { ${$_[0]} = 123 };
my $magic;
cast $magic, $wiz;
warn $magic;

Benchmark::cmpthese(3000000, {
    'tie' => sub { my $foo = $tied * 123 },
    'magic' => sub { my $foo = $magic * 123 },
});

結果

% perl tie.pl
123 at tie.pl line 21.
123 at tie.pl line 26.
          Rate   tie magic
tie   426136/s    --  -20%
magic 531915/s   25%    --
created by blog.nomadscafe.jp

Tracのソースビュアーで文字コードを自動判定する

ヤマロぶろぐ : Tracでファイルの文字コードを自動判定 - livedoor Blog(ブログ)Python でエンコーディングを判定する - 傀儡師の館.Python - 楽天ブログ(Blog)あたりを参考にして入れてみた。

chardetだとあまり判定が良くなかったのでpykf使ってみた

--- api.py.orig 2009-05-01 11:41:16.000000000 +0900
+++ api.py      2009-05-01 12:35:32.000000000 +0900
@@ -71,6 +71,21 @@
 from trac.util.text import to_utf8, to_unicode
 from trac.util.translation import _
 
+# For charset detection.
+CHARSET_RE = re.compile(r'coding[=:]\s*(\S+)')
+
+try:
+    # http://archives.sertice.org/devs/linux/cvs/pykf-0.3.4.tgz
+    import pykf
+    pykf.setdefault(pykf.EUC)
+    pykf.setstrict(True)
+    PYKF_ENC = {pykf.UNKNOWN:None, pykf.ASCII:'ASCII', 
+        pykf.SJIS:'SHIFT-JIS',  pykf.EUC:'EUC-JP',
+        pykf.JIS:'ISO-2022-JP', pykf.UTF8:'UTF-8',
+        pykf.UTF16:'utf-16', pykf.UTF16_BE:'utf-16_be',
+        pykf.ERROR:None}
+except ImportError:
+    pass
 
 __all__ = ['get_mimetype', 'is_binary', 'detect_unicode', 'Mimeview',
            'content_to_unicode', 'Context']
@@ -824,6 +839,15 @@
             utf = detect_unicode(content)
             if utf is not None:
                 return utf
+
+            m = CHARSET_RE.search(content, 0, 200)
+            if m:
+                return m.group(1)
+
+            if 'pykf' in globals():
+                encoding = PYKF_ENC[pykf.guess(content)]
+                if encoding != 'None':
+                    return encoding
         return self.default_charset
 
     def get_mimetype(self, filename, content=None):

なにげに初python

created by blog.nomadscafe.jp

Image::JpegCheckのpatch

ちょっと足りない事があるので、

--- Image-JpegCheck-0.02.orig/t/01_simple.t     2009-04-24 13:45:02.000000000 +0900
+++ Image-JpegCheck-0.02/t/01_simple.t  2009-04-24 12:57:56.000000000 +0900
@@ -1,11 +1,13 @@
 use strict;
 use warnings;
-use Test::More tests => 4;
+use Test::More tests => 6;
 use Image::JpegCheck;
 
 is is_jpeg('t/foo.jpg'), 1;
+is is_jpeg('t/bar.jpg'), 1;
 is is_jpeg('t/01_simple.t'), 0;
 test_fh('t/foo.jpg', 1);
+test_fh('t/bar.jpg', 1);
 test_fh('t/01_simple.t', 0);
 
 sub test_fh {
--- Image-JpegCheck-0.02.orig/lib/Image/JpegCheck.pm    2009-04-24 12:48:54.000000000 +0900
+++ Image-JpegCheck-0.02/lib/Image/JpegCheck.pm 2009-04-24 13:40:18.000000000 +0900
@@ -38,8 +38,15 @@
     return 0 if $buf ne MAGICK;
 
     while (1) {
-        read($fh, $buf, 4);
-        ($marker, $code, $len) = unpack("a a n", $buf); # read segment header
+        read($fh, $buf, 2);
+        ($marker, $code) = unpack("a a", $buf); # read segment header
+
+        while ( $code eq SECTION_MARKER && ($marker = $code) ) {
+            read($fh, $buf, 1);
+           ($code) = unpack("a", $buf);
+       }
+       read($fh, $buf, 2);
+       $len = unpack( "n", $buf );
         $code = ord($code);
 
         if ($marker ne SECTION_MARKER) {

XSは修正していません

created by blog.nomadscafe.jp

memcached 1.3.3のgrow_stats_bufのpatch

statsでセグフォる件

--- memcached-1.3.3.orig/memcached.c    2009-04-06 18:24:53.000000000 +0900
+++ memcached-1.3.3/memcached.c 2009-04-06 19:00:39.000000000 +0900
@@ -1335,15 +1335,14 @@
 }
 
 static bool grow_stats_buf(conn *c, size_t needed) {
-    size_t size = c->stats.size - c->stats.offset;
-    size_t nsize = size;
+    size_t nsize = c->stats.size;
     bool rv = true;
 
-    while (nsize < needed) {
-        nsize = nsize << 1;
+    while (nsize < needed + c->stats.offset) {
+        nsize = nsize + 2048;
     }
 
-    if (nsize > size) {
+    if (nsize > c->stats.size) {
         char *ptr = realloc(c->stats.buffer, nsize);
         if (ptr) {
             c->stats.buffer = ptr;
created by blog.nomadscafe.jp

Classメソッド読み出しの速度

まだ古めかしい世界です


classメソッドの読み出しはobjectのそれと比べて遅い

$ perl class.pl 
               Rate class_raw     class    object class_old
class_raw 1449275/s        --       -2%      -18%      -36%
class     1481481/s        2%        --      -16%      -35%
object    1769912/s       22%       19%        --      -22%
class_old 2272727/s       57%       53%       28%        --
$ perl -v
This is perl, v5.8.8 built for i386-linux-thread-multi
#!/usr/bin/perl

use strict;

package Hoge;

sub new { bless {}, shift }
sub hoge { '1' }

package main;

use Benchmark;

my $object = Hoge->new;
my $class = 'Hoge';

Benchmark::cmpthese(2000000, {
    'class' => sub { $class->hoge },
    'class_raw' => sub { Hoge->hoge },
    'class_old' => sub { Hoge::hoge() },
    'object' => sub { $object->hoge },
});
created by blog.nomadscafe.jp

<12345678910>