モバイルの開発やってるとqrは必須なので適当に作ってみた なんか前にだれかやってた気もするけど。 生成したqrコード画像をbase64して埋め込むだけ。
モバイルの開発やってるとqrは必須なので適当に作ってみた なんか前にだれかやってた気もするけど。 生成したqrコード画像をbase64して埋め込むだけ。
いきなり2009年を振り返ってみようかと思った。 今年はいろいろアウトプットができたきがします。 DBIx::SkinnyもQudoもCPANにupしたし、 Yokohama.pmやYAPC::Asiaでも発表することができました。 Skinnyはいろいろな人に興味をもっていただけたのがとても嬉しかったです。 Skinnyの思想をベースにした他のプロダクトを開発するひともあらわれたりしたのも嬉しかったです。 Skinnyは現在アドベントカレンダーが進行中なので、 興味のある方はそちらをチェックしていただければと思います。 http://perl-users.jp/articles/advent-calendar/2009/dbix-skinny/ Qudoも個人的にはなかなかいい感じで仕上がってるので今後のエンハンスメントも頑張りたいところ。 また、PSGI/Plackが登場したことで作り
Webでファイルアップロードの仕組みって結構つかわれてますが、 大きなファイルをアップロードしている時、プログレスバーとかを 表示したかったりしますが、Perlbalでは簡単にできました。 Perlbalの設定ファイルには↓見たいに設定 肝は CREATE SERVICE uptrack と SET upload_status_listeners = 127.0.0.1:7002, 10.54.0.1:7001 あとは普通のPerlbalの設定と同様 CREATE POOL nekokak_pool POOL nekokak_pool ADD 192.168.200.100:8000 CREATE SERVICE uptrack SET role = upload_tracker SET listen = 127.0.0.1:7002 ENABLE uptrack CREATE SERVI
DBIx::Skinnyにはネイティブにpagingをしてくれる便利機能はありません。 (最近ないないばっかり言ってるな) DBICとかだと$rs->pagerみたいにしてData::Pageのオブジェクトを返してくれるんですが、 Data::Pageのオブジェクトを作る際に、内部でcountを発行しています。 pagingするにはSQLにLIMIT/OFFSETをかけてると、思うのでLIMIT/OFFSETを掛けなかった際の トータルな件数を取るためですね。 結構このcountが馬鹿にならないくらい内部で発行されることがあるのでSkinnyではあえてサポートしなかったです。 あと、独自にSQLを書かせる事をお題目にあげているので、 独自に書かれたSQLを内部でごちゃごちゃしてcount発行するとかヤッテラレナイてのもあります。 ただ、アプリを作ってる時にpagingは必須なのでどうすれば
DBIx::SkinnyにはDODやData::Modelのようにキャッシュを透過的に扱う 便利機能はありません。 無いのでラッパーを書きませう。 毎度の事でデモは http://github.com/nekokak/p5-dbix-skinny-sample/tree/master/cache/ に置いてあります。 ユーザテーブルがあるとします。 CREATE TABLE user ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(255) NOT NULL, UNIQUE(name) ); ユーザの情報をキャッシュからひけなければDBから引っ張って キャッシュしておき、次に使う時はキャッシュデータを使うという典型的なパターンです。 userテーブルの定義などはこのようにします。 今回はinflate/deflateも一緒にやってみ
DBIx::SkinnyはDBIへの薄いラッパーなので ネイティブにDBShardingをサポートはしていません。 また、Shardingに限らずSlaveに勝手につないだりしてくれる便利機能もありません。 ただ、ShardingとかSlaveにつないだりはしたくなる事が有ると思うので、 サンプルコードを書いてみました。 サンプルコードはgithubにあります。 http://github.com/nekokak/p5-dbix-skinny-sample ただ、この記事を書いている時点ではgithubがぶっ壊れてるぽくcloneできません。:( 無料で使わせていただいているので文句は言えませんが。 サンプルコードでは DBIx::ShardManagerをつかってみました。 http://svn.coderepos.org/share/lang/perl/DBIx-ShardManage
昨日のPerlbal::Plugin::Regexcontrolを受けて、 いろいろPerlbalとかさわってみましたが、 結論として、selectorは多段で実行できません。 はじめにやりたいと思ってたことが、 selector Vhostsプラグインでホストの振り分け ↓ selector 拡張子によりサーバを振り分け ↓ reverse_proxy大体こんな感じでできるのかなーーとか思ってたのですが、 無理でした。 Vhostsプラグインで、ホストがマッチした時に実行される、 adopt_base_clientメソッドではroleがweb_serverかreverse_proxyかしか 受け付けてくれないので、多段selectorの夢が破られました。 まあ、もともとの考え方もまずいのかなぁ。 で、仕方ないので次の手。 Perlbal::Plugin::Regexってのを書きました。
追記:Perlbal::Plugin::Includeでなんの問題もなく可能なのでした Perlbalでは/etc/perlbal/perlbal.confに Perlbalの設定をもりもり書くわけですが、 相当数のサービスを1台のPerlbalで管理していると、 1つの設定ファイルがかなり大きくなってしまって 管理しずらいとです。 そこで、PerlbalをながめていたらPerlbal::Plugin::Includeというのがあって、 そらあるわなぁと思い使ってみたところ、問題なく動きました。 ただ、Includeさせるファイルをサイト毎に管理しようとすると 例えば nekokak.intra/perlbal.conf # ...nop CREATE SERVICE http_server SET listen = 0.0.0.0:80 SET role = selector SET p
先日codereposのlang/perlをぶっとばしてしまったのですが、 それを解消すべく特定パス直下はdelできなくするHookをかいてみる。 svnのpre-commitのHookでは REPOS="$1" TXN="$2" /path/to/svn_pre_commit_hook.pl "$TXN" "$REPOS" || exit 1と、書いておく。 svn_pre_commit_hook.plはこんなん #! /usr/bin/perl use strict; use warnings; use SVN::SVNLook; my $TXN = shift; my $REPOS = shift; my $svnlook = SVN::SVNLook->new( repo => $REPOS, cmd => '/usr/bin/svnlook' ); my ($adds, $del
YAPCでの発表の際、どんなプレゼンツールをつかおうかなーと考えていたのですが、 自分でつくるのも面倒になってきたので IngyのSporkを試しに使ってみたら、すげー簡単にできたのでご紹介。 まずはともあれSporkのインストール。 cpan> install Spork私の環境ではKwiki::Cacheがないよーとかおこられたので cpan> install Kwiki::Cacheも入れました。 インストールが終わったら、以下のようにするだけです。 $ mkdir presen; cd presen $ spork -new $ vi config.yaml # author_nameとかcopyrightとかPlugin使う場合はそれを設定 $ vi Spork.slides # プレゼン内容を書く $ spork -make # プレゼンHTMLの生成 $ spork -sta
DBICのresultset_attributesを使うとデフォルトの検索条件とか ソート条件を指定できます。 package Your::Schema::User; use strict; use warnings; use base 'DBIx::Class'; __PACKAGE__->table('user'); __PACKAGE__->resultset_attributes({ order_by => 'id DESC'}); ... 1; こんな感じでresultset_attributesを指定しておいてやると デフォルトでid DESCになってくれる。 例えば $self->model('User')->search( { name => 'nekokak' } )->first;こんなのを実行すると SELECT me.* FROM user me WHERE nam
とかいうのがDBICのCoreに入りました。 使い方は簡単?で use DBIx::Class::ResultClass::HashRefInflator; my $rs = $self->model('Blog'); $rs->result_class('DBIx::Class::ResultClass::HashRefInflator'); my $member = $rs->single({rid => 'HXOK7cI4DA'}); warn Dumper $member; こんな感じでresult_classに設定してやると 結果として $VAR1 = { 'timestamp' => '2007-01-18 17:03:06', 'member_id' => '15', 'created_on' => '2007-01-18 17:03:06', 'id' => '34', '
アプリを作ってると色々ログ系をDBに保存しておきたかったりするのですが、 ログテーブルって結構でかくなってしまう運命です。 DBによってはテーブルサイズがでかくなると検索効率が落ちてしまったり ちょくちょく問題になってしまうのですが、 ログテーブルを年月ごととかで分割すると結構さくさく扱えたりします。 ただ、普通にDBIC使ってると分割したログテーブル毎にスキーマを用意する必要が でてきてしまうです。 例えば access_logってテーブルがあるとして、これを年月で分割して保存させるばやい、 access_log : Proj::Schema::AccessLog access_log_200706 : Proj::Schema::AccessLog200706 access_log_200707 : Proj::Schema::AccessLog200707 access_log_20
前にhttp://d.hatena.ne.jp/nekokak/20070824/1187941930ってのをかきましたが それをモジュール化してみた http://coderepos.org/share/browser/lang/perl/DBIx-Class-ProxyTable とりあえずMySQLとSQLiteでつかえる(はずです 使い方 package Your::Schema; use base 'DBIx::Class::Schema'; __PACKAGE__->load_classes(qw//); package Your::Schema::Log; use base 'DBIx::Class'; __PACKAGE__->load_components(qw/ProxyTable Core/); __PACKAGE__->table('log'); __PACKAGE
danさんがつくってたのをみたのでテストしてみた。 テストは適当ですけど。 個人的にこのモジュールはタイムリーだた。 Lingua::JA::Romajiを使うことが多かったんだけど、変換がすげー適当で、 (日本人が作ってないからってのもおおきいんだろけど) 泣けることがあったのでwktkでテストしてみた。 Lingua::JA::Romajiの何が泣けるかというと、 kanatoromajiで変換したものがromajitokanaでもどせないこと。 双方向変換できないのはいたい。 で、とりあえず超絶簡単にテストしてみた。 use strict; use warnings; use Lingua::JA::Kana; use Test::More qw/no_plan/; for my $kana (keys %Lingua::JA::Kana::Kata2Hepburn) { is $k
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く