2008/04/04


なんかFirefox3 Beta5でGoogle Readerの記事表示部が真っ白け。
原因がFirefox3 Beta5にあるのかGoogle Readerにあるのか分かんないけど、どうやら記事表示部のスタイルシートで'100%'となってる部分が問題みたい。
独自のCSSを当てるか、以下のような限定パッチ用グリモン入れれば直る。
// ==UserScript==
// @name           fix broken 'Google Reader' on Firefox3 beta5 2008/04/04
// @namespace      tag:mattn.jp@gmail.com,2008-03-25:/coderepos.org
// @description    fix broken 'Google Reader' on Firefox3 beta5 2008/04/04
// @include        http://www.google.com/reader/*
// ==/UserScript==

(function(d) {
    apply_fixed_style = function(c) { if (c) { c.style.width = '99.9%'; } }
    apply_fixed_style(d.getElementById('viewer-box-table'));
    apply_fixed_style(d.getElementById('search-item-box-table'));
})(document);

あと、Google Reader Full Feedも動かなくなってる。修正してCodeReposにcommitしておいたので、「動かない!」って人は更新して下さい。
googlereaderfullfeed.user.js
暫定的な処置なので、落ち着いてから再度検討し直します。
Posted at by




たぶん「ポインタ変数はポインタ型」で「配列変数は配列型」というイメージが持てないから。
C/C++のポインタの機能--変数の場所(アドレス) - builder by ZDNet Japan
int *n;
*n = 5; /* ポインタ変数nに値5を代入 */ 
現在は本文が修正されています。

C/C++のポインタの機能--配列との関係 - builder by ZDNet Japan

ポインタ変数と配列との深い関係を表す例を示そう。それは、配列の変数名をそのままポインタ変数名として扱えるということだ。


たぶん int *n;
こう宣言するから *n = 5;
こうしたくなる訳で int* n;
こう宣言すれば、もしくは typedef int * int_ptr
こうしておいて int_ptr n;
こう宣言すれば *n = 5;
こんな事が間違ってる事に気付くかな?
int m[] = {1,2,3,4};
int *n;
n = m;
ここでいうnへのmの代入は、mの先頭アドレスをnが指しているだけなのです。ポインタは「指し棒」!配列はメモリのかたまり!
※最近のC言語の本って「先頭アドレス」って表現あまり見ない気がする。

ちなみに、間違っても char* n, m;
m = "Hello, World";
とか #define char_ptr char *
...
char_ptr n, m;
m = "Hello, World";
しちゃ駄目(typedef使ってね)。

ちなみに...
char *s = "abc";
char s[] = "abc";
の話も前者が「ポインタ型」、後者が「配列型」と考えればいい。
つまり typedef char char4[4];
char4 n = "abcef"; // char[4]型変数をchar[6]で初期化
こうすると、コンパイラによっては警告出力してくれる訳です。
Posted at by



2008/04/03


追記
ゆーすけべーさんのほうで、最終引数をパスではなくオプションハッシュにする対応を入れて頂きました。 これにより以下のパッチを当てなくても動的にメソッドパスを設定出来る様になりました。ゆーすけべーさんにはサンプルも変更に対応して頂き、さらにはパッケージに含んで頂いたようです。
yusukebe++
修正されたソースは
http://coderepos.org/share/browser/lang/perl/WebService-Simple/trunk/example/lingr.pl
より参照下さい。以下、パッチも一応残しておきますが当たりませんのでお気をつけ下さい。サンプルは入れ替えておきました。

便利だなぁ。
ゆーすけべー日記: POX over HTTP のウェブAPIにアクセスするためのモジュール「WebService::Simple」を作ってみた

俗に言う「POX over HTTP」のウェブAPIにアクセスするためのシンプルな(?)Perlモジュール「WebService::Simple」なるものを作ってみました。

ゆーすけべー日記: WebService::Simple でキャッシュできるようにしたよ

dannさんから「WebService::Simpleで(取得したコンテンツを)キャッシュしたいよ!」と言われて、俺もその機能欲しかったので追加しました。

flickrとか簡単に扱えてしかもキャッシュ機能もある。1セッション当たりにサーバへのアクセス数が多いサービスでは重宝するんじゃないかな。で、試そうかと思ったんですが、ベースURLが固定なRESTサービス(methodパラメータとか無い物)って案外無い。どっちかっていうと、URLにメソッドを含んでいる物が多い。そうした場合、メソッド単位でURLを変えなきゃいけない。って事でちょっとだけ改造してみました。
この変更は別の方法で取り込まれました。
Index: lib/WebService/Simple.pm
===================================================================
--- lib/WebService/Simple.pm    (revision 8637)
+++ lib/WebService/Simple.pm    (working copy)
@@ -3,9 +3,9 @@
 use warnings;
 use strict;
 use Carp;
+use URI;
 use URI::Escape;
 use LWP::UserAgent;
-use URI::Escape;
 use WebService::Simple::Response;
 
 our $VERSION = '0.02';
@@ -21,8 +21,8 @@
 }
 
 sub get {
-    my ($self, $request_param) = @_;
-    my $url = $self->_make_url($request_param);
+    my ($self, $request_param, $path) = @_;
+    my $url = $self->_make_url($request_param, $path);
     my $response = $self->_fetch_url($url);
     return $response;
 }
@@ -44,14 +44,21 @@
     return $response;
 }
 sub _make_url{
-    my ($self, $request_param) = @_;
+    my ($self, $request_param, $path) = @_;
     my $base_url = $self->{base_url};
     my $url = $base_url =~ /\?$/ ? $base_url : $base_url . "?";
     my @params;
     push(@params, $self->_hashref_to_str($self->{param}));
     push(@params, $self->_hashref_to_str($request_param));
-    my $str = join("&",@params);
-    return $url . $str;
+    $url .= join("&",@params);
+    if ($path) {
+        # append additional path.
+        my $u = URI->new( $url );
+        $path =~ s!^/!! if $u->path =~ /\/$/;
+        $u->path( $u->path . $path );
+        $url = $u->as_string;
+    }
+    return $url;
 }
 
 sub _hashref_to_str {
やっているのは「get」メソッドのパラメータにoptionalな「path」パラメータを足しただけです。このpathパラメータはbase_urlに指定のパスを付け足します。例えば
http://example.com/rest?test=1 とういベースURLに対して $api->get( {
        value => 123,
    }, '/api/foo/bar' );
とすれば http://example.com/rest/api/foo/bar?test=1&value=123 というアクセスになる様な修正です。
ただ、引数の一番最後で良いのかどうかで悩んでcommitはしていません。

今日はこの改造後のWebService::Simpleを使ってLingrに発言するスクリプトを作ってみました。(こんなにスマートになるよ!という意味で)
このサンプルは上記codereposにある物のコピーです。
use strict;
use warnings;
use WebService::Simple;

my $api_key  = "your_api_key";
my $room_id  = "hO4SmQWTdJ4"; # http://www.lingr.com/room/hO4SmQWTdJ4
my $nickname = "lingr.pl";
my $message  = $ARGV[0] || "Hello, World.";

my $lingr = WebService::Simple->new(
    base_url => 'http://www.lingr.com/',
    param    => { api_key => $api_key, format => 'xml' }
);

# create session, get session
my $response;
$response = $lingr->get( {}, { path => '/api/session/create' } );
my $session = $response->parse_xml->{session};

# enter the room, get ticket
$response = $lingr->get(
    {
        session  => $session,
        id       => $room_id,
        nickname => $nickname,
    },
    { path => '/api/room/enter' }
);
my $ticket = $response->parse_xml->{ticket};

# say 'Hello, World'
$response = $lingr->get(
    {
        session => $session,
        ticket  => $ticket,
        message => $message,
    },
    { path => '/api/room/say' }
);
my $status = $response->parse_xml->{status};

# destroy session
$lingr->get( { session => $session, }, { path => '/api/session/destroy' } );
base_urlが変る事で毎回WebService::Simpleを作らなくても良くなり、スッキリした感じです。
ゆーすけべーさんには、案だけ採用して貰いたい。(私の下手なコードは使わないで下さいという意味)
Posted at by