タグ

ブックマーク / blog.nekokak.org (21)

  • Test::Function - blog.nekokak.org

    名前は適当なんだけどねっ local $Test::Builder::Level = $Test::Builder::Level + 1 するのに飽きたので Test::Level 書いた @xaicronとこの件についていつもイケテナイよなぁってはなしてたら @xaicron便利系を実際に実装してるのみてついカッとなって書いてみた。 https://github.com/nekokak/p5-test-function use strict; use warnings; use Test::More; use Test::Function; sub test_foo : test_foo { ok 0; } sub test_nest2 : test_nest2 { ok 0; } sub test_nest1 : test_nest1 { ok 0; test_nest2(); } t

    kwry
    kwry 2011/09/19
  • SELECT FOR UPDATEする上での注意点 - blog.nekokak.org

    MySQLで行ロックかけてトランザクションを効かせたい場合、SELECT FOR UPDATEを使うわけですが、 以下のようなクエリを発行しちゃうと行ロックではなくテーブルロック風味に扱われるので注意。 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from user order by id DESC limit 1 for update; +----+---------+ | id | name | +----+---------+ | 4 | xaicron | +----+---------+ 1 row in set (0.00 sec)このクエリを実行中に別のセッションから同じことを実行するとロック待ち状態になり 最悪デッドロックで死亡します。 ERROR 1205 (HY000): Lock

  • Redisのめものもめ - blog.nekokak.org

    めものもめなので適当です。 replicationと耐障害性について 例えば 192.168.1.10:6379 で起動しているredisがあるとする。これをmasterとする。 別サーバでreplicationを受けるサーバを容易 192.168.1.11:6379 で起動したとする。これをslaveとする。 redis-cliコマンドでslaveのredisに接続し。 redis> slaveof 192.168.1.10 6379と実行するとon the flyでslaveになることが出来る。 データ量によりどの程度レプリケーションにラグができるかは未検証 次にmasterが死亡したとする。ぷぎゃー。 取り急ぎアプリケーションの参照先をslaveに変更し、 redis-cliでslaveに接続 redis> slaveof no oneと実行することでreplicationをon

    kwry
    kwry 2011/06/12
  • OreOre::Cache

    入社して一ヶ月がたちました!僕は元気です! memcachedとかつかわずlocalにカジュアルにキャッシュしたい時は まぁなんかこんなんで全然処理速度かわるからOreOre::Cacheもありじゃないすかねぇ。 キャッシュするデータ量とかによってon memoryにもつのかとか変わってくるとは思いますが。 #! /usr/bin/perl use strict; use warnings; use Cache::FileCache; use Cache::MemoryCache; use Benchmark qw/timethese/; my $memory_cache = Cache::MemoryCache->new( +{ namespace => 'test_file:', default_expires_in => 1, } ); my $file_cache = Cache:

  • Re:Teng::Schema::DeclareにPlugin機構があったらいいのにって妄想してた

    http://d.hatena.ne.jp/shiba_yu36/20110317/1300375840 TengではSchemaAPIがあるのでinflate/deflateをSchema定義時以外に 挿し込むことも可能です。 ちょっと長いですがサンプルスクリプト。 use strict; use warnings; use Test::More; { package Mock; use parent 'Teng'; package Mock::Schema; use Teng::Schema::Declare; table { name 'mock'; pk 'id'; columns qw/ id name /; }; package Mock::Name; use overload '""' => sub { $_[0]->as_inflate }, fallback => 1 ;

    kwry
    kwry 2011/03/22
  • Cache::Memcached::Fastの高速化

    一番簡単に高速化するには シリアライザをData::MesagePackにするとよいかもしれない。 #! /usr/bin/perl use strict; use warnings; use Cache::Memcached::Fast; use Data::MessagePack; use Benchmark qw/timethese/; my $normal = Cache::Memcached::Fast->new({ servers => ['127.0.0.1:11211'], serialize_methods => [ \&Storable::freeze, \&Storable::thaw ], }); my $msgpack = Cache::Memcached::Fast->new({ servers => ['127.0.0.1:11211'], serialize

  • Tengでのコネクション管理について

    現在Tengでのコネクション管理方法を模索中です。 旧来までのSkinny方式のメリットは connect_infoがある場合はTeng側で コネクションの接続管理(再接続等)、 トランザクション管理(コネクションとトランザクションは同時に意識して管理する必要がある) がある程度可能な所でしょう。 ただ、問題もあります。 Skinny/Tengではnewする時などに外部で生成したdbhを受け取り それを使う事が可能なのですが、connect_infoが不明なため、 Skinny/Teng側ではreconnectしようがないので、若干挙動が分かりにくくなる所でしょう。 (dbhからconnect_infoを取れないのは検証済み..いや、取れるよ!って場合は教えてください!) またコネクションの再接続は切れてるから接続し直せば良いというものでもありません。 トランザクション中だったり、on m

    kwry
    kwry 2011/02/28
  • swfmill-0.3.1をdebian lennyへ

    FlashLite1.1をごにょごにょする必要があるので swfmillをサクっとインストールしようとおもったのですが、 debian の aptから取れるバージョンは0.2.12-2で cp932のファイルを云々するパッチが当たっていないはずなので (参考:http://dsas.blog.klab.org/archives/51174693.html家からソースコードを引っ張ってきて自前コンパイルした時の手順まとめ。 wget http://swfmill.org/releases/swfmill-0.3.1.tar.gz tar zxvf ./swfmill-0.3.1.tar.gz cd ./swfmill-0.3.1 wget http://patch-tracker.debian.org/patch/series/dl/swfmill/0.3.1-1/missing_fi

  • released Jonk-0.01

    http://search.cpan.org/~nekokak/Jonk-0.01/ 先ほどリリースしたのでお知らせしておきます。 http://blog.nekokak.org/show?guid=tFbq8B723xGnPyxB1pTnqQ こちらで紹介したインタフェースから若干のインタフェースの変更がありますが、 基的な方針に変更はありません。 use DBI; my $dbh = DBI->connect(...); # enqueue job { use Jonk::Client; my $jonk = Jonk::Client->new($dbh); $jonk->enqueue('MyWorker', 'arg'); } # dequeue job { use Jonk::Worker; my $jonk = Jonk::Worker->new($dbh, {funct

  • wantarrayの使い方

    wantarrayは普段からまぁつかうのですが、 void contextの時の挙動が制御できるってしらなかったのでエントリー。 #! perl use strict; use warnings; sub foo { unless (defined wantarray) { warn 'void context'; return; } if (defined wantarray) { warn 'defined wantarray'; if (wantarray) { warn 'list context'; return; } else { warn 'scalar context'; return; } } } foo(); my $foo = foo(); my @foo = foo();こんなコードがあるとすると、実行結果は void context defined wantarr

  • DBIx::TransactionManager

    というのを書きました。 https://github.com/nekokak/p5-DBIx-TransactionManager まぁ、DBIx::Skinnyで使っているトランザクションの仕組みを別モジュールに切り出した感じです。 use DBI; use DBIx::TransactionManager; my $dbh = DBI->connect('dbi:SQLite:'); my $tm = DBIx::TransactionManager->new($dbh); { my $txn = $tm->txn_scope; $dbh->do("insert into foo (id, var) values (1,'baz')"); { my $txn2 = $tm->txn_scope; $dbh->do("insert into foo (id, var) values (

  • RDBMSのsavepointについて

    大体のRDBMSでsavepointという機能が実装さておるわけですが、 正直savepointを今までつかったことありませんでした。 savepointについては http://dev.mysql.com/doc/refman/5.1/ja/savepoints.html http://msdn.microsoft.com/ja-jp/library/ms378414%28SQL.90%29.aspx などを見るとよいでしょう。 簡単に言うと、トランザクションの途中でエラーになった場合、 savepointでマークした場所にまでrollbackで戻れるってかんじすね。 で、使いどころとしては 複数のプロセスが同テーブルをinsertしたりするときにユニーク制約がかかってdupで落ちる時なんかに 使ったりするのかなーと思っているのですが、 もっと有効な使い方があるんじゃないかなとおもってい

  • プロジェクト開発におけるテスト用DBの(使い|作り)方

    昔書いたような気がしてたけど書いてなかったので。 モジュールをつくっていてDB回りのテストを書きたい場合は Test::mysqldやTest::postgresql を使うこと。 CPANなんかに上げるモジュールではなく、お仕事プロジェクトのコードを書いていて DB回りのテストを書きたいケースについてです。 私はMySQLを利用しているので、Test::mysqldをつかってもよいのですが、 起動コストがそれなりにかかるのと、ローカルの開発環境には既にMySQLは立ち上がっている前提があるので、 既に立ち上がっているMySQLをそのまま利用する方法をとっています。 そこでテスト用のユーティリティクラスを紹介してみます。 package t::Utils; use strict; use warnings; use utf8; use lib './t/'; use Test::Fixtu

  • Smart::Argsの素晴らしいところ

    Sub::Argsというものを作っていながら、 Smart::Argsを紹介します。 一言でいうとSmart::Argsの良さは型チェックができるとかそんなことではなく、 argumentsをhashと同じキー名の変数でうけとれることでしょう。 サンプルコード use strict; use warnings; package Your::Class; use Smart::Args; sub foo { args my $self, my $fh, my $bucket => {optional => 1}, my $ext => {optional => 1}, ; } package main; foo(fh => $fh, bucket => $bucket, ext => $ext); # or foo({fh => $fh, bucket => $bucket, ext =>

  • 本番DBと開発DB(stg)のtable構成の差分をチェック

    MySQL用なんですけどー。 zsh限定なんですけどー。 diff =(mysql -uuser -ppass proj -e 'show create table bar\G') =(ssh db 'mysql -uuser -ppass proj -e "show create table bar\G"');こんなコマンドを打ち込めば、 6d5 < `mobile_id` varchar(255) NOT NULL default '', 13,14c12 < KEY `member_id` (`member_id`), < KEY `mobile_id_idx` (`mobile_id`) --- > KEY `member_id` (`member_id`)的な差分が見れます。 シェル組んでプロジェクトの全テーブルをチェックできるようにすりゃいいかなーってかんじです。 参考)h

    kwry
    kwry 2011/01/01
  • メモリ使用量の確認

    サーバのメモリが思った以上に消費していたのでサックリ調べてたのですが 各プロセスのメモリ使用状況の調べ方としては ps aux --sort=-rss | head -40とやるとRSSのサイズでソートしてくれるのでheadとかでみてやればメモリ使用量が多い順に参照可能。 ただたんにps auxしただけだと見るのがしんどい。 topでもshift+Mで同じ感じでみれるのでそれでも良い。 (cを入力してプロセスの詳細を表示するとなおよい) あとはCoWに乗ってるかを調べたが、 http://d.hatena.ne.jp/naoya/20080212/1202830671 naoyaさんが紹介されている方法そのまんまでよいでしょう。 sudoして実行すること。 Cowはアプリの質にもよるが基的にはライブラリが共有メモリに乗ってればいいから アプリの質をみつつsharedなパーセントを調整出

  • Devel::KYTProfをもっと便利に

    Devel::KYTProfに3つ程パッチを送ったら取り込んでいただけたのでその機能の部分だけでもご紹介。 http://github.com/onishi/perl5-devel-kytprof 1:カラースキームの指定 use Devel::KYTProf; Devel::KYTProf->color_info('magenta');とかすると、表示される文字の色を変える事ができます。 人によってターミナルの背景色がちがったりするので、環境に合わせて指定できるようになりました。 2:Cache::Memcached::Fast使用時のキー表示 Devel::KYTProfでは自動でCache::Memcached::Fastをhookして、 勝手にプロファイルをとってくれるのですが、memcachedの肝となるキャッシュキーを表示できてなかったので 表示するようにしました。 これでど

  • MySQLで多段slave

    いまデータベースサーバを物理的に交換する必要が発生してしまい メンテナンス準備をしています。 現在の構成としては db1.local(master) db2.local(slave) という構成なのですが、なるべくダウンタイムを短くしたいのが世の常でしょう。 そこで稼働中のサーバを止めずに準備をします。 目指す最終型はこんなの db1.local(master) db2.local(db1.localのslave) db3.local(db1.localのslave & master) db4.local(db3.localのslave) こんな構成にしておけば一瞬メンテナンス画面にして、DBへのアクセスを遮断 db3.localのslaveがmasterに追いついた時点でアプリケーションのDB接続先をdb3.localにして 運用という形にできるかなと。 メンテ中にファイルコピーとか

  • メモリ関連

    あるプロセスをみたらメモリを想定以上につかっていたので調べてる。 OS は64bit debian lennyです。 psの結果: [nekokak@web1]$ ps aux # ...抜粋 PID %CPU %MEM VSZ RSS 14387 0.1 1.1 166548 44332 14388 0.0 0.9 166548 36848 14389 0.0 0.9 166548 36848 14390 0.0 0.9 166548 36848 14391 0.0 0.9 166548 36848 14392 0.0 0.9 166548 368481プロセス35MBオーバーって。。 CoWの状態 [nekokak@web1]$ sudo perl ./cow.pl 14387 14388 14389 14390 14392 PID RSS SHARED 14387 44236 413

  • Kamui::Container

    Kamuiには Object::Containerを再実装してゴニョゴニョしたKamui::Containerというモジュールがあります。 このKamui::Contaierは基Object::Containerと同じ挙動をするわけなのですが、 何点か違う箇所があります。 Object::Containerの場合 package MyContainer; use Object::Container -base; ... 1; # in your script: use MyContainer 'obj'; obj->register( mech => sub { WWW::Mechanize->new }); obj->get('mech'); obj('mech'); # shortcut to obj->get('mech')こんな感じでつかったりします。 use MyContain

    kwry
    kwry 2010/09/27