OpenIDでテキストを共有できます
- 新規作成
- OpenIDで認証してエントリーを新規作成します
- 共有
- エントリーにはOpenIDで閲覧と編集に制限かけることができます
- 変更履歴
- 編集履歴もあるので、コラボレーションにも活用できます
新着エントリー
test
test
平成21年6月28日(日)
今日は雨と天気予報では言っていたが晴れている。
ダブルキャスト エンド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