M.C.P.C.

―むり・くり―プラスコミュニケーション


« 2008年2月 | トップページ | 2008年4月 »

2008.03.31

最近気づいた僕のクルマの新機能

僕のクルマは、イギリスのメーカーだったんですけれどもいつの間にか中国の自動車メーカーに売られてしまい、メンテナンスベンダーも松本に逃げていっちゃってシオシオだったりしまして、かれこれ10年ぐらい乗っているのですけれども、今日、今まで気づかなかった機能に気づいてしまいました。

キーレスエントリーであけると、ロックの脇にあるLEDが光る!

いままでそこの円形のくぼみがLEDであることすら気づいていませんでした。だって、光り方が光るというにはあまりにも控えめな光り方だったので。LR44でつけているのじゃろか。

とはいえ、このクルマもいつまで持つのか不安になってきているのも事実。同僚は、暫定税率切れるのでクルマの取得税安くなるでーとか言うけれども……

[日記・コラム・つぶやき] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.03.30

出力の手引きWebがはてなブックマークに対応

出力の手引きWeb はてなブックマーク対応:大日本スクリーン製造株式会社 メディアアンドプレシジョンテクノロジーカンパニー [www.screen.co.jp]

出力の手引きWebでは、ソーシャルブックマークサービスとして最も普及しているものの一つである「はてなブックマーク」に対応しました。

なんと!

むかしうちのblogで提供していたUser JavaScriptは、もう使用しなくていいので、外してください。
http://blog.dtpwiki.jp/dtp/2008/02/trueflowwebuser_98d4.html

[DTP] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.03.29

EDGE Now! ブロガーリストを表組みに変換

EDGE Now! のブロガーリスト、アイコンを選択しないと詳細がわかない仕組みなので、せっかくXMLがでていますので表組で表示します。

設置例:EDGE Now! Bloggers List

Filename: bloggerslist.cgi

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Data::Dumper;
use HTML::Template;
use LWP::Simple;
use URI;
use utf8;
use XML::Simple;
binmode STDOUT => ':utf8';
 
my $tmpl_html = <<'END_OF_HTML';
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC 
  "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
  <head>
    <meta http-equiv="Content-Type"
      content="text/html; charset=UTF-8" />
    <title>EDGE Now! Bloggers List</title>
    <meta http-equiv="content-script-type"
      content="text/javascript" />
    <meta http-equiv="content-style-type"
      content="text/css" />
    
    <link rel="index" href="./" />
    <link rev="made" href="mailto:aab61120@pop12.odn.ne.jp" />
    <link rel="shortcut icon" href="favicon.ico" />
    <link rel="stylesheet" href="default.css" type="text/css" />
    <style type="text/css">
      body {
        text-align: center;
      }
      img {
        border: 0px;
      }
      div#contents {
        width: 700px;
        margin: 0px auto;
        text-align: left;
      }
      table.userlist {
        width: 100%;
        border-collapse: collapse;
      }
      .userlist thead th {
        background-color: #333;
        color: white;
        text-align: center;
      }
      .userlist tbody th {
        background-color: white;
        text-align: center;
      }
      .userlist tbody th {
        background-color: #f8f8f8;
      }
      .userlist tbody .even th {
        background-color: #e0e0e0;
      }
      .userlist tbody .even td {
        background-color: #e8e8e8;
      }
      .posted em {
        background-color: #fff0f0;
        font-weight: bold;
        font-style: normal;
      }
      .posted em a,
      .posted em a:link,
      .posted em a:visited,
      .posted em a:hover,
      .posted em a:active {
        color: #f66; 
        font-weight: bold;
        font-style: normal;
      }
      .posted strong {
        background-color: #fcc;
        font-weight: bold;
        font-style: normal;
        display: inline;
      }
      .posted strong a,
      .posted strong a:link,
      .posted strong a:visited,
      .posted strong a:hover,
      .posted strong a:active {
        color: red;
        font-weight: bold;
        font-style: normal;
        text-decoration: none;
      }
      .posted a,
      .posted a:link,
      .posted a:visited,
      .posted a:hover,
      .posted a:active {
        text-decoration: none;
        color: blue;
      }
    </style>
  </head>
  
  <body>
    <div id="contents">
      <h1>EDGE Now! Bloggers List</h1>
      <p>
        Adobe EDGE Now!のブロガーランキングで表示される
        Bbloggers Listの一覧表示です。
      </p>
      <p>
        <a href="http://edgenow.jp/" target="_blank">EDGE Now!</a>
      </p>
      <p>
        現在の最大id:
        <tmpl_var name="maxid" escape="html">人<br />
        ユーザリストの人数:
        <tmpl_var name="maxcontents" escape="html">人<br />
        退会した人の人数:
        <tmpl_var name="diff" escape="html">人<br />
      </p>
      <p>
        page:
        <tmpl_var name="page" escape="html">
        pager: 
        <tmpl_loop name="loop_pager">
        <tmpl_if name="isnowpage">
          <tmpl_var name="page" escape="html">
        <tmpl_else>
        <a href="bloggerslist.cgi?page=<tmpl_var
          name="page" escape="html">">
          <tmpl_var name="page" escape="html"></a>
        </tmpl_if>
        </tmpl_loop>
      </p>
      <table border="0" cellpadding="0" cellspacing="0"
        summary="EDGE Now! Bloggers List"
        class="userlist">
        <thead>
          <tr>
            <th abbr="id">
              id
            </th>
            <th abbr="blog">
              blog
            </th>
            <th abbr="name" style="width:90px;">
              name
            </th>
            <th abbr="SBMs" style="width:80px;">
              SBMs
            </th>
          </tr>
        </thead>
        <tbody>
          <tmpl_loop name="loop_masks">
          <tr<tmpl_unless
               name="__odd__"> class="even"</tmpl_unless>>
            <th abbr="id">
              <tmpl_var name="id" escape="html">
            </th>
            <td>
              <span style="font-weight: bold;">
                <tmpl_var name="title" escape="html">
              </span>
              <br />
              <a href="<tmpl_var name="url" escape="html">"
                target="_blank">
                <tmpl_var name="url"   escape="html"></a>
            </td>
            <td style="text-align: center;">
              <a href="<tmpl_var name="url" escape="html">"
                style="text-decoration: none;"
                target="_blank">
                <img src="http://edgenow.jp/member/pic/<tmpl_var
                  name="id" escape="html">.gif"
                  alt="<tmpl_var name="name" escape="html">"
                  width="50" height="50" /><br />
                <tmpl_var name="name" escape="html"></a>
            </td>
            <td class="posted">
              <script type="text/javascript" charset="UTF-8"
                src="http://labo.dtpwiki.jp/sbm/check.cgi?url=<tmpl_var
                name="url" escape="html">&amp;mode=js"></script>
            </td>
          </tr>
          </tmpl_loop>
        </tbody>
      </table>
    </div>
  </body>
</html>
END_OF_HTML
 
 
my $itemsparpage = 40;
my $q = CGI->new();
my $page = $q->param('page') || 0;
my $ref  = get_EDGENow(0);
my $maxid       = $ref->{bloggerListList}->[0]->{blogger}->[0]->{id};
   $ref  = get_EDGENow($page);
my $maxcontents = $ref->{module}->{maxcontents}->{count};
my $maxpage     = int ($maxcontents / $itemsparpage);
my $pagelist;
for ( 0 .. $maxpage ) {
  push @$pagelist, { page      => $_,
                     isnowpage => $_ == $page,
 };
} 
 
my $showlist;
foreach my $item ( @{$ref->{bloggerListList}->[0]->{blogger} } ) {
  my $temp_item = { 
                 id    =>$item->{id},
                 url   =>$item->{url}->[0],
                 title =>$item->{title}->[0],
                 name => $item->{name}->[0],
  };
  push @$showlist, $temp_item;
}
my $tmpl = HTML::Template->new( scalarref => \$tmpl_html,
                                die_on_bad_params => 0,
                                loop_context_vars => 1, );
$tmpl->param( 'loop_masks' => $showlist,
              'loop_pager' => $pagelist,
              'maxid'       => $maxid,
              'maxcontents' => $maxcontents,
              'diff'        => $maxid - $maxcontents,
              'page'        => $page,
            );
print $q->header( -type => 'text/html', -charset => 'UTF-8',);
print $tmpl->output();
exit;
 
sub get_EDGENow {
  my $page = shift;
  my $proxy = 'http://edgenow.jp/xml/bloggerList.php';
  my $uri = URI->new( $proxy );
  $uri->query_form(
    page => $page,
  ) if $page;
  my $xml = get( $uri->as_string );
  my $xs = new XML::Simple();
  my $ref = $xs->XMLin( $xml, forcearray => 1 );
  return $ref;
}
 
 
__END__

[Web] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.03.28

EDGE Now!の覆面の中の人暴露

Edge Now!は、サーバからXMLを取得していろいろランキングとか出しているんですけれども、せっかくなんで、SBMのブックマーク件数とのマッシュアップ(笑)をしてみました。

EDGE Now!の覆面の中の人暴露

Edgenownakas
▲マスクRANKとSBMブックマーク件数のコラボレーション

いつものごとくソースおいときますね。

Filename: bloggersranking.cgi

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use HTML::Template;
use LWP::Simple;
use utf8;
use XML::Simple;
binmode STDOUT => ':utf8';
 
my $xml_url = 'http://edgenow.jp/xml/bloggerThis.php';
my $masklist = 
[
  {
    image   => '00832mask.png',
    rank    => 'AAA',
    order   => 1,
    message => '組織の最上部で皆の安全を見守るのがトップである'
              .'自分の仕事なのに今じゃAAが自分の下で組織をを'
              .'見守っているじゃないか',
  },
  {
    image   => '01635mask.png',
    rank    => 'AA',
    order   => 2,
    message => 'このかぶりモンやとさすがに戦えへんわ',
  },
  {
    image   => '02765mask.png',
    rank    => 'A',
    order   => 3,
    message => 'まわりが触れないぐらいの穴なら問題なく通れます',
  },
  {
    image   => '03657mask.png',
    rank    => 'B',
    order   => 4,
    message => 'つので大豆がつまめます 大豆以外もつまめます',
  },
  {
    image   => '04961mask.png',
    rank    => 'C',
    order   => 5,
    message => '俺戦隊系というよりライダー系だよね',
  },
  {
    image   => '05038mask.png',
    rank    => 'D',
    order   => 6,
    message => 'サイバトロンちゃうわ',
  },
  {
    image   => '06092mask.png',
    rank    => 'E',
    order   => 7,
    message => 'カタヌキでオレがでたら諦めてくれ',
  },
  {
    image   => '07811mask.png',
    rank    => 'F',
    order   => 8,
    message => 'このマスクつけていると戦わずに済むわい',
  },
  {
    image   => '08036mask.png',
    rank    => 'G',
    order   => 9,
    message => 'サ○エでございます',
  },
  {
    image   => '09173mask.png',
    rank    => 'H',
    order   => 10,
    message => 'クチまるみえなんだけど?ライダーマンいやだわー',
  },
  {
    image   => '10346mask.png',
    rank    => 'I',
    order   => 11,
    message => 'リーダーやねんけどうちの組織上いっぱいおるんよ',
  },
  {
    image   => '11803mask.png',
    rank    => 'J',
    order   => 12,
    message => '青は4人居るねんて',
  },
  {
    image   => '11803mask.png',
    rank    => 'J',
    order   => 13,
    message => 'しゃーないなー',
  },
  {
    image   => '11803mask.png',
    rank    => 'J',
    order   => 14,
    message => 'ほな麻雀でも',
  },
  {
    image   => '11803mask.png',
    rank    => 'J',
    order   => 15,
    message => 'あかん金無いわ',
  },
  {
    image   => '12384mask.png',
    rank    => 'K',
    order   => 16,
    message => 'まりもっこりいうなー',
  },
  {
    image   => '13124mask.png',
    rank    => 'L',
    order   => 17,
    message => 'またアクタースーツの胸のあたりがきつくなってきたー',
  },
  {
    image   => '14567mask.png',
    rank    => 'M',
    order   => 18,
    message => '粉のままでいいからくれ!はーやーくー',
  },
  {
    image   => '15944mask.png',
    rank    => 'N',
    order   => 19,
  },
  {
    image   => '16534mask.png',
    rank    => 'O',
    order   => 101,
  },
  {
    image   => '17081mask.png',
    rank    => 'P',
    order   => 151,
  },
  {
    image   => '18616mask.png',
    rank    => 'Q',
    order   => 201,
  },
  {
    image   => '19018mask.png',
    rank    => 'R',
    order   => 251,
    message => 'このまえ戦闘員と間違われて死にかけたw',
  },
];
 
 
my $tmpl_html = <<'END_OF_HTML';
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC 
  "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
  <head>
    <meta http-equiv="Content-Type"
      content="text/html; charset=UTF-8" />
    <title>EDGE Now!の覆面の中の人暴露</title>
    <meta http-equiv="content-script-type"
      content="text/javascript" />
    <meta http-equiv="content-style-type"
      content="text/css" />
    
    <link rel="index" href="./" />
    <link rev="made" href="mailto:aab61120@pop12.odn.ne.jp" />
    <link rel="shortcut icon" href="favicon.ico" />
    <link rel="alternate" type="application/rss+xml" title="RSS"
      href="http://labo.dtpwiki.jp/edgenow/index.rdf" />
    <link rel="stylesheet" href="default.css" type="text/css" />
    <style>
      body {
        text-align: center;
      }
      div#contents {
        width: 700px;
        margin: 0px auto;
        text-align: left;
      }
      table {
        border-collapse: collapse;
      }
      thead th {
        background-color: #333;
        color: white;
      }
      tbody th {
        background-color: white;
      }
      tbody .even th,
      tbody .even td {
        background-color: #d0d0d0;
      }
      .posted em {
        background-color: #fff0f0;
        font-weight: bold;
        font-style: normal;
      }
      .posted em a,
      .posted em a:link,
      .posted em a:visited,
      .posted em a:hover,
      .posted em a:active {
        color: #f66; 
        font-weight: bold;
        font-style: normal;
      }
      .posted strong {
        background-color: #fcc;
        font-weight: bold;
        font-style: normal;
        display: inline;
      }
      .posted strong a,
      .posted strong a:link,
      .posted strong a:visited,
      .posted strong a:hover,
      .posted strong a:active {
        color: red;
        font-weight: bold;
        font-style: normal;
        text-decoration: none;
      }
      .posted a,
      .posted a:link,
      .posted a:visited,
      .posted a:hover,
      .posted a:active {
        text-decoration: none;
        color: blue;
      }
    </style>
    </script>
  </head>
  
  <body>
    <div id="contents">
    <h1>EDGE Now!の覆面の中の人暴露</h1>
    <p>
      Adobe EDGE Now!のブロガーランキングで表示される
      覆面の中の人のサイトの実際の人気を暴きます。
    </p>
    <p>
      <a href="http://edgenow.jp/" target="_blank">EDGE Now!</a>
    </p>
    <table border="0" cellpadding="0" cellspacing="0">
      <thead>
        <tr>
          <th>
            RANK
          </th>
          <th>
            MASK
          </th>
          <th style="width: 300px;">
            Message
          </th>
          <th style="width: 90px;">
            中の人の名前
          </th>
          <th style="width: 80px;">
            実際の人気
          </th>
        </tr>
      </thead>
      <tbody>
        <tmpl_loop name="loop_masks">
        <tr<tmpl_unless name="__odd__"> class="even"</tmpl_unless>>
          <th>
            <tmpl_var name="rank" escape="html">
          </th>
          <td>
            <img src="images/<tmpl_var name="image" escape="url">">
          </td>
          <td>
            <tmpl_var name="message" escape="html">
          </td>
          <td style="text-align: center;">
            <a href="<tmpl_var name="url">" target="_blank">
              <img src="http://edgenow.jp/member/pic/<tmpl_var name="id">.gif"
                width="50" height="50" border="0" /><br />
              <tmpl_var name="name" escape="html"></a>
          </td>
          <td class="posted">
            <script type="text/javascript" charset="UTF-8"
              src="http://labo.dtpwiki.jp/sbm/check.cgi?url=<tmpl_var
              name="url">&mode=js"></script>
          </td>
        </tr>
        </tmpl_loop>
      </tbody>
    <table>
    </div>
  </body>
</html>
END_OF_HTML
 
my $xs  = XML::Simple->new();
my $ref = $xs->XMLin( get( $xml_url ), forcearray => 1 );
 
my $showlist;
foreach my $item ( @{$ref->{bloggerListThis}->[0]->{blogger} } ) {
  my $temp_item = shift @$masklist;
  $temp_item = { %$temp_item,
                 id    => $item->{id   },
                 url   => $item->{url  }->[0],
                 title => $item->{title}->[0],
                 name  => $item->{name }->[0],
  };
  push @$showlist, $temp_item;
}
 
my $tmpl = HTML::Template->new(
             scalarref         => \$tmpl_html,
             die_on_bad_params => 0,
             loop_context_vars => 1,
           );
$tmpl->param( 'loop_masks' => $showlist, );
 
my $q = CGI->new();
print $q->header( -type => 'text/html', -charset => 'UTF-8',);
print $tmpl->output();
 
exit;
 
__END__

今回のポイントは、XML::Simpleのforcearray => 1です。吐き出されるXMLのリスト、ランク順に出てきて、つまり順序に依存しているんです。だから、forcearray => 1がついていないハッシュのままだと、ランク順に取得できないのでした。

XMLで出現順序に依存(XML用語でなんていうか知らんが)ていうの結構多いので注意しよう。

[Web] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.03.27

EDGE Now!のニックネーム設定がおかしい

EDGE Now! [edgenow.jp] に登録するとき、ニックネームを入力する欄があり、登録時に入れたニックネームがサービス内で使われるわけですが、プロフィール変更をすると、ニックネームがローマ字の小文字(lower case)になる。

つまり、CLで登録したのに、プロフィール写真を登録しようと思って変更すると、clになってしまう。

日本には大文字を勝手に小文字にする文化ないよ。日本人が作っているんだろうから、しっかりして欲しいなー

[Web] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

EDGE Now!のランキングアイコン一覧がすごすぎる

AdobeのEDGE Now!という皆の力でブックマークを集めようとしているサイトでは、サイト内でブロガーランキングをやっていまして、いいブックマークをたくさん集めてきたなど貢献度によってAAA~Rまでランクがつくみたいです。

さらに、ブログパーツまで用意されています。


▲モチーフは戦隊もの

それで、どんなアイコンがでるのかと思い、調べてみました。

Edgenowiconss
▲縁日状態。プリキュアねえの?

戦隊通り越して雨宮慶太に近づこうとしているかどうか知りませんがものすごい意匠の戦隊がおるんですけれども。

この戦隊のバックグランドが知りたいですね。

[Web] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.03.26

EDGE NOW!今注目されているサイト下のLATEST SITE枠内表示は、はてブでいうところの注目のエントリーなんだろうな

アドビシステムズが始めたEDGE Now! [edgenow.jp] というサイトでは、登録しているブロガーが書いた、各自のブログのエントリに書いてあるURLを集めてきて、リスト表示しているのですが、

Edgenow_latestsite
▲LATEST SITE

僕の英語力は、先週土曜日に6年ぶりに会うことになった東京の友人が実は包茎クリニックに勤めていると知って衝撃を受けつつもともかく待ち合わせ場所に向かったら友人と共に黒人の人が一緒に来ていて緊張しながらへローて言ったら実は彼がコートジボワール系でフランス語でダメじゃん、ていう程度なのですが、LATESTってでかでかと書いていれば最近採集したエントリだと勘違いするわけです。

おかげで、早とちりして、

EDGE Now!の新着サイト表示でtrick7.com blogがえこひいきされている - CLの日記

なんてエントリを書いてしまいました。アー恥ずかし。

結論として、ここは、moreの箇所をクリックするとわかりますが、複数の人がblogのエントリ書いた事を示しているのです。はてブ風に言うとホッテントリ、つまり注目のエントリー、ということなのでした。

そうなると、RSS生成するときに、元のXMLを単純に取得しただけだったら、ホットエントリー注目エントリーのRSS、ていうことになるかな。直しとこう。


(2008-3-26 18.13訂正)

<del>ホッテントリ、つまり</del>

済みません、はてブの方も勘違いしていました……

[Web] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.03.25

様々なオンラインブックマークサービスのブックマーク件数を画像ではなくて数値で取得(高機能版)

先日作った「様々なオンラインブックマークサービスのブックマーク件数を画像ではなくて数値で取得」が無駄にパワーアップしました。

  • 無駄にLast-modifiedとか吐くようになり、ブラウザから無駄に問い合わせこないようにしました。
  • 無駄にブラウザからのヘッダのIf-Modified-Sinceと比較して304を吐くようになり、無駄に転送しないようになりました。
  • 無駄にmod_perl環境でも動きます(Apache2のModPerl::Registryで動いています)。
  • 無駄にJSONまたはJSONPを吐くようになりました。ブログパーツ用。
  • 無駄にJavaScriptのdocument.writeを吐けるようになりました。ブログパーツ用。

負荷が気になる場合は、自分の手持ちのサーバに実装してください。そもそも、SBM問い合わせ部が非同期処理になっていませんのでSBM側のデータ吐き出しが詰まればレスポンスも詰まる仕組みですし……

Filename: check.cgi

#!/usr/bin/perl
use strict;
use warnings;
use Cache::File;
use CGI;
use Digest::MD5;
use HTML::Template;
use JSON::Syck;
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Date;
use utf8;
use Data::Dumper;
use XMLRPC::Lite;
binmode STDOUT => ':utf8';
 
sbm();
 
sub sbm {
  # 初期設定
  our $cachedir = 'cache';
  our $sbms = { 
       hatena =>
       {
         proxy   => 'http://b.hatena.ne.jp/xmlrpc',
         entry   => 'http://b.hatena.ne.jp/entry/',
         method  => 'bookmark.getCount',
         message => 'このエントリーをはてなブックマークで'
                   .'ブックマークしているユーザ数',
       },
       livedoor =>
       {
         proxy   => 'http://rpc.clip.livedoor.com/count',
         entry   => 'http://clip.livedoor.com/page/',
         method  => 'clip.getCount',
         message => 'このエントリーを'
                   .'livedoor Clipでクリップしているユーザ数',
       },
       pingking =>
       {
         proxy   => 'http://api.pingking.jp/xmlrpc/bookmark',
         entry   => 'http://pingking.jp/url/',
         method  => 'getCount',
         message => 'このエントリーを'
                   .'PingKingでブックマークしているユーザ数',
       },
       yahoo =>
       {
         proxy   => 'http://num.bookmarks.yahoo.co.jp/yjnostb.php?urls=',
         regexp  => 'ct="(\d+)"',
         entry   => 'http://bookmarks.yahoo.co.jp/url?url=',
         message => 'このエントリーを'
                   .'Yahooブックマークしているユーザ数',
       },
       delicious =>
       {
         proxy   => 'http://badges.del.icio.us/feeds/json/url/data?url=',
         entry   => 'http://del.icio.us/url/',
         message => 'このエントリーを'
                   .'del.icio.usでブックマークしているユーザ数',
       },
       buzzurl =>
       {
         proxy   => 'http://api.buzzurl.jp/api/counter/v1/json?url=',
         entry   => 'http://buzzurl.jp/entry/',
         message => 'このエントリーを'
                   .'Buzzurlでブックマークしているユーザ数',
       },
       fc2 =>
       {
         proxy   => 'http://bookmark.fc2.com/image/users/',
         regexp  => '/(\d+)\.png',
         entry   => 'http://bookmark.fc2.com/search/detail?url=',
         message => 'このエントリーを'
                   .'FC2ブックマークしているユーザ数',
       },
       pookmark =>
       {
         proxy   => 'http://pookmark.jp/count/',
         regexp  => '/(\d+)$',
         entry   => 'http://pookmark.jp/url/',
         message => 'このエントリーを'
                   .'POOKMARKでブックマークしているユーザ数',
       },
       total =>
       {
         entry   => 'http://labo.dtpwiki.jp/sbm/check.cgi?url=',
         message => 'このエントリーをブックマークしている'
                   .'総ユーザ数',
       }
     };
  
  
  # 開始
  my $q      = CGI->new();
  my $url    = $q->param('url') || 'http://www.yahoo.co.jp/';
  
  # キャッシュ
  my $data   = check_cache( $url );
  my $counts = $data->{counts};
  my $expiry = $data->{expiry};
  my $ctime  = $data->{ctime};
  
  # ブラウザキャッシュと比較
  if ( $q->http('If-Modified-Since') eq time2str($ctime) ) {
    print $q->header(
       -status         => '304 Not Modified',
       'Cache-Control' => "max-age=$expiry",
    );
  }
  elsif ( $q->param('mode') ) {
    if ( $q->param('mode') =~ m|json|i ) {  # JSON出力モード
      show_json( $q, $url, $counts, $expiry, $ctime );
    }
    elsif ( $q->param('mode') =~ m|js|i ) { # js出力モード
      show_js( $q, $url, $counts, $expiry, $ctime );
    }
  }
  else { # モード指定なし:HTML出力モード
    show_html( $q, $url, $counts, $expiry, $ctime );
  }
  exit; # オワタ
  
  
  # JS出力モード
  sub show_js {
    my $q      = shift;
    my $url    = shift;
    my $counts = shift;
    my $expiry = shift;
    my $ctime  = shift;
    print $q->header(
      -type    => 'text/javascript',
      -charset => 'UTF-8',
      -expires => "+${expiry}",
      "Last-modified" => time2str($ctime),
    );
    my $tmpl_html = <<"    END_OF_JS";
      document.write( ''
        + '<img src="http://labo.dtpwiki.jp/'
        + 'sbm/images/total.gif"'
        + ' width="16" height="16" border="0"'
        + ' style="vertical-align: middle;" />'
        + '<tmpl_var name="users">'
      );
    END_OF_JS
    my $tmpl = HTML::Template->new( scalarref => \$tmpl_html );
    (my $users = sbm_html('total', $url, $counts->{total} ) )
      =~ s|[\x0a\x0d]||g;
    $users =~ s|\s\s+| |g;
    $tmpl->param( users => $users );
    print $tmpl->output();
    return;
  }
  
  # JSON出力モード
  sub show_json {
    my $q      = shift;
    my $url    = shift;
    my $counts = shift;
    my $expiry = shift;
    my $ctime  = shift;
    my $json   = $q->param( 'callback' ) =~ m/^[a-zA-Z0-9\.\_\[\]]+$/
                   ? $q->param( 'callback' )
                     . '(' . JSON::Syck::Dump( $counts ) . ');'
                   : JSON::Syck::Dump( $counts );
    print $q->header(
      -type           => 'text/javascript',
      -expires        => "+${expiry}",
      "Last-modified" => time2str($ctime),
    );
    print $json;
  }
  
  # HTML出力モード
  sub show_html {
    my $q      = shift;
    my $url    = shift;
    my $counts = shift;
    my $expiry = shift;
    my $ctime  = shift;
    my $html_hash = { # テンプレート差し込み用HTML項目準備
      yahoo     => sbm_html( 'yahoo'    , $url, $counts->{yahoo    } ),
      hatena    => sbm_html( 'hatena'   , $url, $counts->{hatena   } ),
      delicious => sbm_html( 'delicious', $url, $counts->{delicious} ),
      fc2       => sbm_html( 'fc2'      , $url, $counts->{fc2      } ),
      livedoor  => sbm_html( 'livedoor' , $url, $counts->{livedoor } ),
      pookmark  => sbm_html( 'pookmark' , $url, $counts->{pookmark } ),
      buzzurl   => sbm_html( 'buzzurl'  , $url, $counts->{buzzurl  } ),
      pingking  => sbm_html( 'pingking' , $url, $counts->{pingking } ),
      total     => sbm_html( 'total'    , $url, $counts->{total    } ),
      url       => $url,
    };
    my $tmpl_html = << '    END_OF_HTML';
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC 
  "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="ja" lang="ja">
  <head>
    <meta http-equiv="Content-Type"
      content="text/html; charset=UTF-8" />
    <title>
      各SBMサービス別オンラインブックマーク件数チェック
    </title>
    <meta http-equiv="content-style-type"
      content="text/css" />
    <link rev="made" href="mailto:aab61120@pop12.odn.ne.jp" />
    <link rel="index" href="." />
    <style type="text/css">
      body {
        font-size: 13px;
        *font-size: small;
        *font: x-small;
      }
      * {
        margin: 0; 
        padding: 0;
        line-height: 1.6;
        color: #333;
      }
      body {
        background-color: #fff;
        font-family: 'メイリオ',Meiryo,
                     'MS Pゴシック',sans-serif;
      }
      input {
        font-family: Osaka, 'メイリオ',Meiryo,
                     'MS Pゴシック',sans-serif;
      }
      h1 {
        font-weight: bold;
        font-size: 122%;
        margin-bottom: 20px;
      }
      img {
        border: 0;
        vertical-align: middle;
      }
      .posted em {
        background-color: #fff0f0;
        font-weight: bold;
        font-style: normal;
      }
      .posted em a,
      .posted em a:link,
      .posted em a:visited,
      .posted em a:hover,
      .posted em a:active {
        color: #f66; 
        font-weight: bold;
        font-style: normal;
      }
      .posted strong {
        background-color: #fcc;
        font-weight: bold;
        font-style: normal;
        display: inline;
      }
      .posted strong a,
      .posted strong a:link,
      .posted strong a:visited,
      .posted strong a:hover,
      .posted strong a:active {
        color: red;
        font-weight: bold;
        font-style: normal;
        text-decoration: none;
      }
      .posted a,
      .posted a:link,
      .posted a:visited,
      .posted a:hover,
      .posted a:active {
        text-decoration: none;
        color: blue;
      }
      #content {
        margin: 20px;
      }
      div.posted {
        margin  : 20px;
        font-size: 90%;
        line-height: 19px;
      }
      dt {
        font-weight: bold;
      }
      dd {
        padding-left: 16px;
      }
    </style>
  </head>
  <body>
    <div id="content">
      <h1>
        <a href="./">
          オンラインブックマーク件数チェック</a
        >
      </h1>
      <form action="check.cgi" method="get">
        <p>
          <label for="url">アドレス:</label>
          <input name="url" id="url" style="width: 60%;"
            tabindex="1" accesskey="a"
            value="<tmpl_var name="url" escape="html">" />
          <input type="submit"
            tabindex="2" accesskey="s"
            value="一斉問い合わせ開始"
          />
        </p>
        <div class="posted">
          <img src="images/yahoo.gif"
            alt="yahoo"
            width="16" height="16"
          /><tmpl_var name="yahoo">
          <br />
          <img src="images/hatena.gif"
            alt="hatena"
            width="16" height="16"
          /><tmpl_var name="hatena">
          <br />
          <img src="images/delicious.gif"
            alt="delicious"
            width="16" height="16"
          /><tmpl_var name="delicious">
          <br />
          <img src="images/fc2.gif"
            alt="fc2"
            width="16" height="16"
          /><tmpl_var name="fc2">
          <br />
          <img src="images/livedoor.gif"
            alt="livedoor"
            width="16" height="16"
          /><tmpl_var name="livedoor">
          <br />
          <img src="images/pookmark.gif"
            alt="pookmark"
            width="16" height="16"
          /><tmpl_var name="pookmark">
          <br />
          <img src="images/buzzurl.gif"
            alt="buzzurl"
            width="16" height="16"
          /><tmpl_var name="buzzurl">
          <br />
          <img src="images/pingking.gif"
            alt="pingking"
            width="16" height="16"
          /><tmpl_var name="pingking">
          <hr />
          <img src="images/total.gif"
            alt="total"
            width="16" height="16"
          /><tmpl_var name="total">
        </div>
      </form>
      <hr />
      <p>
        <a href="http://blog.dtpwiki.jp/dtp/2008/03/post_88ba.html"
          target="_blank">ソースプログラムはこちら</a>
      </p>
      <dl>
        <dt>JSON/JSONP</dt>
        <dd>
          <a href="check.cgi?mode=json&callback=jsonp.callback&url=<tmpl_var
          name="url" escape="html">" target="_blank">
          check.cgi?mode=json&callback=jsonp.callback&url=<tmpl_var
            name="url" escape="html"></a></dd>
        <dt>JavaScript(document.write)</dt>
        <dd>
          <a href="check.cgi?mode=js&url=<tmpl_var
          name="url" escape="html">" target="_blank">
            check.cgi?mode=js&url=<tmpl_var
            name="url" escape="html"></a></dd>
      </dl>
    </div>
  </body>
</html>
    END_OF_HTML
    my $tmpl = HTML::Template->new( scalarref => \$tmpl_html );
    $tmpl->param( $html_hash );
    print $q -> header(
      -type    => 'text/html',
      -charset => 'utf-8',
      -expires => "+${expiry}",
      "Last-modified" => time2str($ctime),
    );
    print $tmpl->output();
    return;
  }
  
  # SBMサービスからブックマーク件数取得
  sub get_sbm {
    my $service = shift;
    my $url     = shift;
    if ( $service eq 'yahoo' ) {
      return get_sbm_yahoo( $url );
    }
    elsif ( $service eq 'delicious' ) {
      return get_sbm_delicious( $url );
    }
    elsif ( $service eq 'buzzurl' ) {
      return get_sbm_buzzurl( $url );
    }
    elsif ( ( $service eq 'fc2' )
         || ( $service eq 'pookmark' ) ) {
      return get_sbm_imageicon( $service, $url );
    }
    else {
      return get_sbm_xmlrpc( $service, $url );
    }
  }
  
  # XMLRPCによるブックマーク件数取得
  #(livedoor,hatena,pingking)
  sub get_sbm_xmlrpc {
    our $sbms;
    my $service = shift;
    my $url     = shift;
    my $result  = eval {
      XMLRPC::Lite->proxy(
                    $sbms->{$service}->{proxy},
                    timeout  => 5,
       )->call( $sbms->{$service}->{method}, $url )
        ->result
    };
    if ( $service eq 'pingking' ) {
      return $result->[0]->{ count };
    } else {
      return $result->{ $url } || 0;
    }
  }
  
  # Yahooブックマーク件数取得(REST)
  sub get_sbm_yahoo {
    our $sbms;
    my $url = shift;
    my $content = get( $sbms->{yahoo}->{proxy}.$url );
    my $count = 0;
    if ( $content =~ m|$sbms->{yahoo}->{regexp}| ) {
      $count = $1;
    }
    return $count;
  }
  
  # del.icio.usブックマーク件数
  sub get_sbm_delicious {
    my $url = shift;
    my $data
      = JSON::Syck::Load(
          get( $sbms->{delicious}->{proxy}.$url )
        );
    return $data->[0]->{total_posts} || 0;
  }
  
  # Buzzurlブックマーク件数
  sub get_sbm_buzzurl {
    my $url = shift;
    my $data
      = JSON::Syck::Load(
          get( $sbms->{buzzurl}->{proxy}.$url )
        );
    return $data->[0]->{users} || 0;
  }
  
  # ブックマーク件数イメージ提供サービスから件数取得
  sub get_sbm_imageicon {
    my $servce = shift;
    my $url    = shift;
    my $ua = LWP::UserAgent->new();
    $ua->agent('Mozilla/4.0 (compatible; '
              .'MSIE 6.0; Windows NT 5.1)'
    );
    my $req = HTTP::Request->new(
                'GET',
                $sbms->{$servce}->{proxy}.$url
              );
    my $res = $ua->simple_request($req);
    my $location = $res->header('location');;
    my $count = 0;
    if ( $location =~ m|$sbms->{$servce}->{regexp}| ) {
      $count = 0 + $1;
    }
    return $count;
  }
  
  # ブックマーク User数 HTML生成
  sub sbm_html {
    my $service = shift;
    my $url     = shift;
    my $count   = shift;
    
    my $tag;
    my $users = 'users';
    $users = 'user'   if $count == 1;
    $tag   = 'em'     if $count > 2;
    $tag   = 'strong' if $count > 9;
    my $tag_s = $tag ? "<$tag>" : q();
    my $tag_e = $tag ? "</$tag>": q();
    
    if ( $service eq 'delicious' ) { # del.icio.usの場合
      my $ctx = Digest::MD5->new;
      $ctx->add( $url );
      $url = $ctx->hexdigest; # del.icio.us用MD5生成
    }
    my $tmpl_html = << '    END_OF_HTML';
          
          <tmpl_var name="tag_s">
          <a href="<tmpl_var name="entry"><tmpl_var
            name="url" escape="html">"
            title="<tmpl_var name="message">"
            rel="nofollow" target="_blank">
            <tmpl_var name="count"> <tmpl_var name="users"></a
          ><tmpl_var name="tag_e">
    END_OF_HTML
    
    my $tmpl = HTML::Template->new( scalarref => \$tmpl_html);
    $tmpl->param(
      url     => $url,
      entry   => $sbms->{$service}->{entry},
      message => $sbms->{$service}->{message},
      tag_s   => $tag_s,
      tag_e   => $tag_e,
      count   => $count,
      users   => $users,
    );  
    
    return $tmpl->output();
  }
  
  # キャッシュ問い合わせ
  sub check_cache {
    our $cachedir;
    my $url = shift;
    my $data;
    my $cache = Cache::File->new( 
      cache_root      => $cachedir,
      default_expires => '3600 sec',
    );
    if ( $cache->exists( $url ) ) { # キャッシュ生きてる?
      $data = $cache->thaw( $url );
      $data->{expiry}  = $cache->expiry($url) - time();
      return $data;
    }
    else {                          # キャッシュ無効?
      my $expiry = 50 + int( rand( 50 ) ).'min';
      my $counts = { # SBMサービスからブックマーク件数取得
        yahoo     => get_sbm( 'yahoo',    $url ),
        hatena    => get_sbm( 'hatena',   $url ),
        delicious => get_sbm( 'delicious',$url ),
        fc2       => get_sbm( 'fc2',      $url ),
        livedoor  => get_sbm( 'livedoor', $url ),
        pookmark  => get_sbm( 'pookmark', $url ),
        buzzurl   => get_sbm( 'buzzurl'  ,$url ),
        pingking  => get_sbm( 'pingking', $url ),
      };
      $counts->{total} += $counts->{$_} foreach keys %$counts;
                                       # ブックマーク数合計
      $data = { 
        counts => $counts,
        ctime  => time(),
        expiry => $expiry,
      };
      $cache->freeze( $url, $data, $expiry );
        # キャッシュ書き込み
      return $data;
    }
  }
 
}
__END__

[Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.03.24

thatspingの埋め込み用JavaScriptがMacIE5でエラー

ザッピング - 受動系ソーシャルブックマーキング -
http://thatsping.com/

というのが始まっていました。
ロケスタ社長日記:ソーシャルブックマーキング「ザッピング」をリリースしてみました [blog.livedoor.jp]

ソーシャルブックマークサービスにおいて面倒なタグ付けを、検索エンジンの検索ワードと、対象ページの閲覧時間によって自動的に集計してタグ付けするみたいなんで、早速手もとにある面積の広いblog(このblogではないよ)へつけてみましたが、これMacIE5だとJavaScriptエラーが出よる。

encodeURIComponent()が無いのでエラーが出ているらしい。
手持ちにはMacIE5用decodeURI()ならあるんですけれども、encodeURI()の方は必要なかったんで用意していませんでした。

残念だなー

※このblogもMacIE5でいっぱいエラーがでよるが、これは仕様ですw

[Web] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2008.03.23

Linux用バックアップHDD買ってきた

MacMiniで動いているLinuxサーバ、40GBのSeagateのディスクがどうやら2.5inchのSeagateの初物だったらしくあっという間に壊れたのでその後TOSHIBAだったかどっかの40GBに入れ替えて数年問題なく動いているのですけれども(確か過去のエントリに書いた)、バックアップ体制もとらんとやばいと思ってHDDを買ってきました(UPSはついているんだけれども)。バッファローの2.5inchの120GB USB2.0のポーダブルで耐衝撃性の奴。

MacMiniにつないだらあっけなくマウントしたのですが、バックアップに何を使おうか考えていませんでした。とりあえず、darでも使おうかなーと思ったけれども、PPC用のrpmがないので、tarを引っ張ってきてふつーにbuild。

これからバックアップ方針を決めようってところまでやった。

なにげにいろんなドメインのデータはいっとるのでバックアップ大事ですよね。

[Linux] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

< 最後 « これより前10ä»¶ | 全件