perlの最近のブログ記事

2009年9月17日

昨日の晩からいろいろ試してみて、わかったこと

  1. PubSubHubbubは、やっぱり、Atomのほうがよさそう。
  2. AtomのSummryは、サマリーじゃないとだめ
  3. MovableTypeは、概要の文字数を指定すると(日本語の場合)substrの3つめの引数を指定したことになる
  4. perlのsubstrは、負数を指定すると、後ろから絶対値文字削った文字列を返す
  5. そんなわけで、-1を概要の文字数に指定すると、ほぼ全文がsummryに入る
  6. でも、それって、どうよ(笑)
  7. それはそれとして、PubSubHubbubのプラグインは、rebuildへのcallbackなので、XML-RPC経由でPostしたエントリはうまくPublishされない?

そんなこんなで、継続調査だなぁ。と思いつつ、FriendFeedに渡すのをatom.xmlに変更してみた。

2009年9月16日

そもそも、ぱぶさぶはばぶ?

まぁ、それはさておき、TypePadが対応だって。とか思いつつ、MobableTypeでなんかできないかとおもったら、miyagawaさんのコメントにプラグインがあるのを確認したので、いろいろいじってみる。

で、気がついたのは、atomをやりとりするプロところになっているので、RSS2.0ベースになっているMediaRSSを使っているうちのブログ→FriendFeedの部分は、対応できないんじゃないかなぁ......。と、いろいろ考えてみたり。atom.xmlにMediaRSSを混ぜればいいのか?

結局、どうするのがいいんだろうなぁ。

2009年8月19日

friendfeedを使い始めて思うことと、そのFriendFeedのコメントと、それからFlickrを利用したテストMovableTypeのテストの結果、わかったことは

  1. MovableTypeはXML-RPC経由でファイルのアップロードができるが、XML-RPC経由ではそのファイルとブログエントリをひもづけることはできない
  2. FriendFeed的には、Flickrも「Custom RSS/Atomとして、"Include entry description as a comment"にcheckを入れてから登録する」ほうが、いいのかもしれん

ということだな。

ひも付けについては、結局、Pluginを書かないとダメなんだろうけど、それさえ書いてしまえば、あとは、標準機能でなんとかなるような気がする。

てか、MT::Objectとか、そんなものを生でさわるプログラムを書くことになろうとは......。(いや、まだ書いてないんだけどさ......。

2009年8月15日

というか、忙しいからこそと言うか、現実逃避ネタがあれば、どんどん進むわけで......。

先月くらいから、Twitter向け列車運行情報bot(@unko_kanto, @unko_kinki, @unko_info)などを自作したりしておりました。

現在では、元気だった頃の@train_kantoさんと同様の動きができているのではないかと思う。(いまは、echoをやめちゃったからね)

実際のところ、この場所に書くのは、著作権がらみもあって、あまり、よろしくない気がしている。ただ、

上記二カ所から、情報を拾ってきて、組み合わせているので、新聞社の持つという「編集著作権」とやらを主張したい(嘘です)。関係各社さんから何か言われたら、止めます(個人的な利用の範囲まで縮小して継続する可能性はありますが......)

権利的な話はともかく、gooも、livedoorも、同じ、RescueNowさんからの情報なのに、どうして、表示する内容が違うんだろうね。

ちなみに、アイコンについては、もう少し、かわいい絵を募集します。とはいえ、アニメうんこさん的電車の絵として、今のもそれなりに気に入っているので、それ以上のものを(笑)

2009年5月 9日

ふと、思いついて、perlをpkgsrcから最新にしたんです。perlそのものは、5.10.0にしてあったので、どちらかというと、perlに依存するperlのモジュール群をupdateしたかったからだったわけです。

で、sudo make updateとか入力したのが、午前中。終わったのは、もう、夜遅くでした。mk.confにPKG_OPTIONS.emacs=nox11なんて設定してあったのが問題だったらしく、emacs関連がうまくupdateできてなくて、ちょっとはまる。

で、いろんなものがupdateされているので、各種アプリケーションが正しく動いているか確認していたところ、DBIx::Classを使っているアプリ、しかも、joinしている部分が「そんなrelationshipはない」というエラーで落ちまくり。

いろいろ探ってみたところ、どうも、今日のCPANモジュールのuse DBIx::Class;でいうのところの、「半自動」の方法がうまく動いていない。DBから各テーブルのスキーマは取得できているものの、それと別に記述してあるリレーション情報などが正しく組み合わせられてないみたいだ。

いろいろ調べてみたが、うちで利用している各種モジュールの組み合わせの問題なのか、同様の情報が見つかられなかったので、mizzy.org Re: DBICとDBIx::Class::Schema::Loader 僕のいろいろな勘違い 2の「make_schema_at を使う方法」を参考に、既存のものを読み込んで自動生成させることで、DBIx::Class::Schema::Loaderを使う方法ではなくDBIx::Class::Schemaを使うようにすることで、対応。

とりあえず、某ビデオリンク集(笑)、および、某レシピ検索サイトをご利用の方には、サービス停止となりましたことをお詫びします。とはいえ、某ビデオリンク集の動かなかった機能は、一部機能のみなんですけどね。半分はDBIx::ClassじゃなくてClass::DBIのままなので......。

2008年3月25日

そういえば、いいかげん、AmazonのECS 3.0からECS 4.0へ移行しないとだめなんじゃないか?と、その昔作ったmt-amazon.plをいろいろいじり始める。

とはいえ、Net::Amazonというモジュールを使っているのだから、簡単に対応できるだろう。と、いうわけで、最新版をインストール

NetBSDの場合、pkgsrc-wipから、wip/p5-Net-Amazonをインストールすると、必要なものも全部インストールしてくれるので楽ちん。NetBSDじゃないひとは、CPANモジュールを使うと楽ちんですね。

で、いろいろやってみたんだけど、昔と違って、affiliateのリンクが作成されない。というか、そもそも、affiliate_idを指定しても、なにもやってないじゃん……。ってな感じで、あるバージョン以降、そういう風になったみたいだ。

--- /usr/pkg/lib/perl5/vendor_perl/5.8.0/Net/Amazon.pm    2008-01-14 10:03:02.000000000 +0900
+++ extlib/Net/Amazon.pm        2008-03-25 01:13:13.000000000 +0900
@@ -152,6 +152,7 @@
         $url->query_form(
             'Service'        => 'AWSECommerceService',
             'AWSAccessKeyId' => $self->{token},
+            'AssociateTag'   => $self->{affiliate_id},
             'Version'        => $WSDL_DATE,
             map { $_, $params{$_} } sort keys %params,
         );

ってな、パッチを当ててやればいいわけですが、これだと、affiliate_idを指定しなかったときにちゃんと動かなくなるので、もうすこし、マトモに対応してあげる必要がありそうww。

でも、もう、めんどうだから、これでいいや的。

ただ、mt-amazon自身は、mt-という接頭語をつけるのは、よろしくない。と、sixapartが言っていることと、設定を画面上から行うようにした方がいいんじゃないか?という理由で、もう少し、いじるとするかな。

今の状態が、欲しいという人は、送ることは出来ますが、おそらく、必要なモジュールを大量にインストールするのが面倒になるような気がします。

【追記】

あー、うそだうそだ。

    use Net::Amazon;
    use Net::Amazon::Request::Artist;
    use Data::Dumper;

die "usage: $0 artist\n(use Zwan as an example)\n" unless defined $ARGV[0];
my $ua = Net::Amazon->new( token => 'YOUR_AMZN_TOKEN', );
my $req = Net::Amazon::Request::Artist->new( artist => $ARGV[0], AssociateTag => [your associate id], );
# Response is of type Net::Amazon::Artist::Response my $resp = $ua->request($req);
if($resp->is_success()) { print $resp->as_string, "\n"; } else { print $resp->message(), "\n"; }

ってな感じで使えばいいだけじゃないか……。すまぬ。単純に以前と同じようには使えない。というだけだったのね……

2007年11月27日

今さらですが……

[% hoge | uri %]

って書くと、hogeの内容をuriエンコードして出力するのね……。

知らなかった……プログラム側で変更するルーチンをわざわざ用意してたよ……orz

2007年7月 5日

テーブルのupdateトリガーに、そのテーブルのupdateをするルーチンを書くと、ひどいことになるくらい、気づきましょう>俺

まぁ、実際には、perlのClass::DBIの話ですが……。

2007年6月 1日

すごい悩んだことに限って、実際、たいしたことじゃなくて、後から考えてみると、なんであのときわからなかったんだろう。などということは、よくあるわけですが……

あと、Class::DBI::Pagerを使っていて、1ページから最終ページまでじゃなくて、gooooogleみたいに、カレントページの周辺10ページにリンクを張るみたいなコトできないだろうか?と、調べてみたんだけど、よくわからない。

ただ、Changesに書いてある、Data::Page::Navigationってのが、それっぽくて、しかも、supportと書いてあるけれど、イマイチ使い方がよくわからないな。

ようするに、

使い方は、

use Data::Page::Navigation;

とuseするだけです。

らしい。なんてことだ……。ソースを見て、使い方がわかるくらいにならないとダメ。ってことかも。

2007年5月27日

いや、perlが5.8になってから、utf-8フラグがらみで、面倒なことばっかりだな。と、正直思ってたんです。

でも、考えを改めてもいい。正直そう思った。

たとえば、「スペースで区切って、複数のワードを入力する」というインターフェースがあった場合、「スペース」がすべていわゆる半角スペースであると仮定すれば、splitでわけるだけですよね。インターフェースの都合上、いわゆる全角スペースが混じってしまう可能性があるとすると、その全角のスペースを一旦半角スペースに変換してからsplitしないとだめになるわけですよ。

ところが、split( /[\x{0020}\x{3000}]/, $input )ってやるだけで、$inputがUTF8フラグ付なら、一発でわけることができるわけですね。ちゃんと「バイト列」ではなくて「文字列」として扱ってつわけですな。

でも、逆に、面倒なのが、バイト列として扱うときの操作。たとえば、urlで許されない文字をaタグなんかにつかうときにつかう、%xx%xxというあれですね。

sub my_encode{
  my $tmp = shift;
  $tmp = Encode::encode('utf8',$tmp);
  $tmp =~ s/([^\w])/'%'.unpack("H2", $1)/ego;
  $tmp =~ tr/ /+/;
  $tmp = Encode::decode('utf8',$tmp);
  return $tmp;
}

ってな感じに、文字列ではなくバイト列として扱うように、UTF8フラグを外してから変換してUTF8フラグを立てるという処理にしなくてはいけません。文字列のままだと[^\w]が1バイトとは限らないので、unpackのH2の2がダメになってしまうからですね。

これもはまりました。それにしても、「はまる」ということすら、楽しくなってくるというのが、プログラムを書く楽しみと言えるのでしょうか。山登りみたいなもんですかね……

2007年5月25日

Class::DBIは、いろんな意味で最高なのですが、many_to_manyのリレーションを作るどうやればいいんだろうなぁ。と、いろいろ検索して、見つけたのが、ξ;゜ー゜)ξ { 遅レス。 - Class::DBI(CDBI)で多対多(many_to_many)

そういえば、大昔、というか、前の(?)会社の時に、先輩が、そういう風にテーブルを作っていたなぁ、と懐かしくなったりしつつ、いろいろ利用。ところが、なんかうまくいかないです。

結論から言うと、Complex many to many - ClassDBIのように、中間テーブルには、idカラムというか、「複合ではないプライマリキー」が必要でした。

リンク先の例にならうと、

CREATE TABLE Users (
    code    varchar(8)   primary key,
    passwd  varchar(255) not null
);

CREATE TABLE CourseUsers ( id varchar(8) primary key, user_code varchar(8) not null, course_code varchar(255) not null, unique (user_code, course_code) );
CREATE TABLE Courses ( code varchar(5) primary key, name varchar(255) not null );
package MyApp::Model::CDBI; use strict; use base 'Class::DBI::SQLite'; __PACKAGE__->set_db('Main', 'dbi:SQLite:dbname=/path/to/dbfile');
package MyApp::Model::CDBI::Users; use strict; use base 'MyApp::Model::CDBI';
__PACKAGE__->set_up_table('Users'); __PACKAGE__->has_many(courses => ["MyApp::Model::CDBI::CourseUsers" => 'course_code'], 'user_code');
package MyApp::Model::CDBI::CourseUsers; use strict; use base 'MyApp::Model::CDBI';
__PACKAGE__->set_up_table('CourseUsers'); __PACKAGE__->has_a(course_code => "MyApp::Model::CDBI::Courses"); __PACKAGE__->has_a(user_code => "MyApp::Model::CDBI::Users"); sub courses { shift->user->courses } sub users { shift->course->users }
package MyApp::Model::CDBI::Courses; use strict; use base 'MyApp::Model::CDBI';
__PACKAGE__->set_up_table('Courses'); __PACKAGE__->has_many(users => ["MyApp::Model::CDBI::CourseUsers" => 'user_code'], 'course_code');

たぶん、こんな感じ。

なんというか、結局のところ、本家の情報を英語だからといって避けたりしないでちゃんと読め。ってことなんだろうなぁ……

2007年5月23日

WWW::Mechanizeを利用して、ちょっとしたものを作成していたんですが、なぜが文字が化けてしまって、おかしいなぁ。この化け方って、どう考えても、utf-8に変換するときの問題だよな……。と思って探したら、WWW::Mechanize中に、こんなコードが……

# Try to decode the content. Undef will be returned if there's nothing to decompress.
# See docs in HTTP::Message for details. Do we need to expose the options there?
my $content = $res->decoded_content;
   $content = $res->content if (not defined $content);

decoded_contentは、HTTP::Messageにあって、

if ($ct && $ct =~ m,^text/,,) {
    my $charset = $opt{charset} || $ct_param{charset} || $opt{default_charset} || "ISO-8859-1";
    $charset = lc($charset);
    if ($charset ne "none") {
	require Encode;
	if (do{my $v = $Encode::VERSION; $v =~ s/_//g; $v} < 2.0901 &&
	    !$content_ref_iscopy)
	{
	    # LEAVE_SRC did not work before Encode-2.0901
	    my $copy = $$content_ref;
	    $content_ref = \$copy;
	    $content_ref_iscopy++;
	}
	$content_ref = \Encode::decode($charset, $$content_ref, Encode::FB_CROAK() | Encode::LEAVE_SRC());
    }
}

となっているので、Content-Typeが、text/....だったら、デフォルトはISO-8859-1としてEncode::decode、つまりUTF-8に変換しUTF-8フラグを立てることになるわけですな。そりゃ、文字化けもするよ……。

てか、オプションいるかい?じゃなくて、大至急何とかしろよ。と、思いつつも、ラッパークラスを作って対応。

そういえば、WWW::Mechanizeの1.22(現在のNetBSD pkgsrcの最新)より新しいバージョンはあるのかな?とcpanを探してみたら、最新の1.24では該当コードが削除されていて、開発版の1.29_01では

# Try to decode the content. Undef will be returned if there's nothing to decompress.
# See docs in HTTP::Message for details. Do we need to expose the options there? 
# use charset => 'none' because while we want LWP to handle Content-Encoding for 
# the auto-gzipping with Compress::Zlib we don't want it messing with charset
my $content = $res->decoded_content( charset => 'none' );
   $content = $res->content if (not defined $content);

と、なっていた。たしかに、そうよね……。さて、default_charsetをutf-8として指定するようにラッパークラスを書いてしまった私は、どうすればいいんだろう……。ま、得られた結果をutf-8としてencodeしてやればいいだけ……なの?かな?

あと、Class::DBI::Pagerを使っていて、1ページから最終ページまでじゃなくて、gooooogleみたいに、カレントページの周辺10ページにリンクを張るみたいなコトできないだろうか?と、調べてみたんだけど、よくわからない。

ただ、Changesに書いてある、Data::Page::Navigationってのが、それっぽくて、しかも、supportと書いてあるけれど、イマイチ使い方がよくわからないな。

Class::DBI::Pagerを継承する俺クラスでuse Data::Page::Navigationするってこと?なの?かな?でも、それって、supportなの?わからないね

なんにしても、プログラムを書くということは、たのしいものですな。それにしても、今さらながら、Class::DBIすげー。とか、ほんと、思う。

ウェブページ

Powered by Movable Type 4.3-ja