Techの最近のブログ記事

2013年1月16日

not an error

SQLite に DBIx::Skinny を使っていて、こんなエラーに遭遇した:

DBD::SQLite::st fetchrow_hashref failed: not an error
abort due to ROLLBACK at ...DBIx/Skinny/Iterator.pm line 30.

"not an error" ってなんだよ? というのが最初の感想。

擬似的なコードで表すと、このような使い方をしている箇所だった:

my $itr = $model->search('table', $cond);
while( my $item = $itr->next ){
    ...
    ...
}

while の中ではいろいろ処理をしていて、リストアイテム $item ひとつあたりにつき(1ループにつき)、幾百レコードの規模の、ほかのテーブルのレコードの更新の繰り返しをしているのだった。 $item リスト自体は小さくて、 10 個程度。 while が 10 回まわる程度。

なんてことは無いように見えるけれど、数個目の $item に関係する、 while 内部で行われる沢山のレコードの更新の途中で、冒頭のエラーが出て止まってしまった。のだった。

続きを読む: not an error

2012年7月 9日

My BackPAN Search

BackPAN のサイトは Author 名を頼りに、ディレクトリを掘って行く形になっていて、これが結構骨がいります。素朴に思う、なんで検索インタフェースがないのだろうか。

BackPAN について日本語のサイトを検索すると、 perl-users の記事が見つかるというかそれしか無いんですが、それによれば、検索するためのモジュールがある模様。

しかし実際に試してみたところ、検索する以前に、インデックスが作成される時に NOT NULL 制約違反で終了してしまう。モジュールがバグっている?

それからいろいろ調べてみると、 perl-users の記事で用いているモジュール Parse::BACKPAN::Packages が、いまはもう DEPRECATED となっていて、かわりに、モジュール BackPAN::Index を使え、となっていたのでした。 perl-users の記事は 2009 年の暮れのものでしたから、情報が古いと言えば古いけれど、古いモジュールを探す BackPAN が、古いモジュールでは使えないって言うのが妙に思いました。インデックスの元となる情報のほうに変化があった模様ですが、詳しい事は知りません。

さて、ところでこの BackPAN::Index では DBIx::Class を使っているせいか、依存モジュールの数がハンパ無いので、ビルドしようとした人は覚悟が必要です。

そのかわりと言っては何ですけど、じぶんがじぶん用にサイトを作ったので、もしよければこちらから検索してみて下さい。 cache_ttl はいまのところ1日としています。

2012年6月18日

Useless use of \E

IO::All が warnings を出すようになってしまっていてうるさいので、探してみたところ、情報が見つかった。

perldelta によると Perl 5.16.0 から加わった新しい警告、とのことのようだ。つまり今までと変わりないから大丈夫、ってことで、いいよね(?)。

Useless use of \E

           "\E" does nothing unless preceded by "\Q", "\L" or "\U".

2012年5月22日

GPX を Google Maps で見るための HTML

Google Maps API を用いた HTML ページ。地図に、 GPX データを取り込みトラックやウェイポイントをオーバレイ。簡単に、 GPX データを視覚化したい時に、我ながら重宝してます。

以前作って使っていたものが、廃止予定の API v2 であったのと、それが最近の Firefox で使えなくなっていたのとで、最小限の機能だけで API v3 で書き直した。──といっても書き直したのは 2009/11 らしい。それからずっと放置していたものを、このたび設置したのでした。

Web サーバに載せる必要はなくて、デスクトップに置いたものを開けば良いようになっています。

続きを読む: GPX を Google Maps で見るための HTML

2012年4月26日

NicoAPI.Mylist のメソッド類を追加

NicoAPI.Mylist のメソッド類を追加。それと、サンプルスクリプトも追加したので、使い方がわかりやすく、というかじぶんが思い出しやすくなったかな。

https://github.com/hiroaki/Net-NicoVideo

POD はとうとう日本語に... 。じょじょに直していければいいと思ってます。

2012年4月12日

マイリスト・グループ

昨日に引き続き Net::NicoVideo の話。マイリストの作成ぐらいできるようにしてみよう、ということで、手始めに mylistgroup というオブジェクトを追加した。これは、ログインしたユーザのマイリスト・グループ、つまり作成したマイリストの、タイトルとか ID の情報。

以下はその使い方... 昨日のと同じような具合に。

#!/usr/bin/env perl

use 5.12.0;
use warnings;
use Net::NicoVideo;

my $nnv = Net::NicoVideo->new({
    email => 'your-nicovideo@email.adress',
    password => 'and-password',
    });

my $mylistgroup = $nnv->fetch_mylistgroup;

say 'status: '. $mylistgroup->status;
unless( $mylistgroup->is_status_ok ){

    say $mylistgroup->error_description;

}else{

    for my $mylist ( @{$mylistgroup->mylistgroup} ){
        say '-----';
        say $mylist->{id};
        say $mylist->{name};
        say $mylist->{description};
    }

}

マイリスト・グループには複数のマイリストがあるので、その配列を得る。要素のマイリスト自体をクラスに定義するべきだけど、 RSS で取得するほうのマイリストで名前を使ってしまっていた。とりあえずハッシュで持ってるけれど、修正するです。

2012年4月11日

動画のコメントを得る

目下のところ「野良モジュール」である Net::NicoVideo の話で、ニコニコ動画の、指定した動画のコメントを取得するメソッドを、追加した。

下のは使い方のサンプルで、オプション -c で件数、デフォルトは 250 らしい?  -f をたてると、投稿者コメントに限定する(らしい。未確認... )

#!/usr/bin/env perl

use 5.12.0;
use warnings;
use Net::NicoVideo;

use Getopt::Std;
my $opts = { c => 250 };
getopts('c:f',$opts);

my $video_id = $ARGV[0] or die "usage: $0 [-c num] [-f] video_id \n";

my $nnv = Net::NicoVideo->new({
    email       => 'your@mail.address',
    password    => 'and-password',
    });

my $thread = $nnv->fetch_thread( $video_id, {
    chats => $opts->{c},
    fork => $opts->{f},
    });

say $thread->count;

for my $comm ( $thread->get_comments ){
    say $comm->value;
}

これに限らず、総じてメソッド名や API すらも変えるかもしれない。まだアルファ版。だけど、いまのところでもダウンロードや動画情報管理には、けっこう使える、かな。

しかしニコニコ動画はどれだけ機能があるんだろ。 "Net" を冠したモジュールにするからには、機能を網羅してからアルファを取ろうと思っていたけれど、じぶんではほとんど使わない上にちょっと範囲が広すぎるから、やりきれない。さて、どうしたものやら。

2012年4月 1日

new Date(W3CDTF)

W3CDTF をまともに使える JavaScritp ライブラリがないかなと思っていたら、 いつのまにか組み込みのクラス Date が W3CDTF を受け付けるようになっていた。 ( Safari 5.1.5 と FireFox 11.0 )

> new Date('2012-04-01T12:23:34+09:00')
Sun Apr 01 2012 12:23:34 GMT+0900 (JST)
> new Date('2012-04-01T12:23:34Z')
Sun Apr 01 2012 21:23:34 GMT+0900 (JST)

時刻、タイムゾーンは必須の模様。

> new Date('2012-04-01')
Invalid Date
> new Date('2012-04-01T12:23:34')
Invalid Date

ちなみに Mozilla では受け付けたけれど、タイムゾーン省略時はローカルのタイムゾーンで解釈された。

> new Date('2012-04-01')
Sun Apr 01 2012 09:00:00 GMT+0900 (JST)
> new Date('2012-04-01T12:23:34')
Sun Apr 01 2012 12:23:34 GMT+0900 (JST)

ミリ秒も扱っています。

> new Date('2012-04-01T12:23:34.456Z').getMilliseconds()
456

ターゲットが限定的なサイトだったら組み込み Date で間に合うと。でも公にひろく使ってもらいたいサイトだったら、 Yusuke Kawasaki 氏のライブラリを使っておいた方がよいかな。

[JSAN] Date.W3CDTF - ISO-8601日時フォーマット対応JavaScriptクラス
http://www.kawa.net/works/js/date/w3cdtf.html

2012年3月25日

SWF-ForcibleConverter

ニコニコ動画で提供される数多の動画の中には、 SWF のものがあって、 SWF のあるバージョンを持ったそのファイルが吾が Safari で観られない場合がある。詳しく言えばそのプラグイン QuickTime 7 ってことになるのかな。 Flash のバージョンかな? ともかく、観られない。試しに VLC クライアントに読み込ませてみたら、アプリケーションがクラッシュしてしまった。

この問題は Flash 界隈の事情に明るければそこそこ知られた現象らしいけれど、その解決策に、いまひとつハッキリしたものが見つけられなかった。

そんな中、あるとき、ふと、NNDD では「 SWF を変換しています... 」って出ることがあるなと気がついて、そこにヒントがあるだろうと思い、そのソースを旅して見つけたのが ForcibleLoader というライブラリ。

http://www.libspark.org/wiki/yossy/ForcibleLoader

これはどうやら、無理矢理に別バージョンとして読み込むといった少々乱暴なものらしい。けれど、これしかないなと思い詰めた。

── AS3 に馴染みはないけれど、さいわいにあまり長くなかったので、がんばって馴染みのある Perl へ。そして誰かにメンテしてもらいたい腹積りでもって Github へ上げた。

https://github.com/hiroaki/SWF-ForcibleConverter

こうして、その動画は観られるようになったけれど、その動画くらいしか試してないし、そもそもテストデータとなる「観られない」 SWF の作り方が解らない。 SWF の仕様が解っていないから、ほんとにこれでいいんだろかと思う。でも、そもそも観られなかったのだから、いいんじゃない?──そう考えれば、やるだけやった甲斐はあったんじゃないかと、そう思うことができた。

ちなみにテストデータは DATEKEN 氏のスタイリッシュな名曲。

http://www.nicovideo.jp/watch/nm8325511

2012年3月11日

order by で大文字小文字を無視する

DBIx::Skinny と SQLite3 との組み合わせでの話。DBIx::Skinny で ORDER BY をかけたいときは、次のように( resultset を使う場合):

$rs->order({ column => 'column', desc => 'asc' });

大文字小文字を区別しないでいいのにな、と思って SQLite のドキュメントを見てみたら、 collate type を指示するとのことで、これについては DBD::SQLite にも言及があった。

$rs->order({ column => 'column', desc => 'collate nocase asc' });

ASC (DESC) の前に書くのがポイントかな。最初うしろに書いて結果が得られずに悩んでしまった。

さて、 resultset は DBIx::Skinny::SQL のメソッド as_aggregate に行き着き、クエリーとして組み立てられる。その部分を引用すると、このようになっている。 $elements は order にセットしたハッシュ:

sub as_aggregate {
    ...
    ...
    return uc($set)
           . ' BY '
           . join(', ', map { $_->{column} . ($_->{desc} ? (' ' . $_->{desc}) : '') } @$elements)
           . "\n";
}

つまり何が言いたいかというと、この実装が変わったりすると駄目になるリスクがある。

DBIx::Skinny は生の SQL を書くシーンを想定している設計思想なので、こんなところに注目しないで、潔く生の SQL を書いて使った方がいいのかもしれない。

OpenID対応しています OpenIDについて

このアーカイブについて

このページには、過去に書かれたブログ記事のうちTechカテゴリに属しているものが含まれています。

前のカテゴリはプレイリストです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。