SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

PerlでデスクトップCGI

デスクトップCGIにinnerHTMLを使ったAjaxを導入する

デスクトップCGIでWebとデスクトップを融合する 第7回


atom2msrdb_read_ajax3.cgiのentry要素出力用CGI(atom2entry.cgi)

動作の概要

 「atom2msrdb_read_ajax3.cgi」が出力するJavaScriptのAjax関数に埋め込まれて起動するCGIです。AtomフィードのURLと記事を特定するデータから、Atomフィードデータベースに問い合わせます。そして、記事のカテゴリ、タイトルと更新日時をtext型のHTMLフォームの形式で出力すると共に、記事の内容あるいは要約を取り出し、HTMLとして出力します。

スクリプト

atom2entry.cgi
#!/Perl5.8/bin/perl.exe
use strict;
use warnings;
use DBI;
use CGI qw(:cgi);
use URI::Escape;
# CGI 最初の部分の出力
print "Content-type: text/html; charset=UTF-8\n\n";
#print "<script language=\"Javascript\">\n<!--\n";
my $atom = param('atom');
my $id = param('id');
my $dbh
   = DBI->connect(
      "DBI:mysql:database=atomfeeds;host=localhost;port=3306",
      "root", "password",
      {'RaiseError' => 1});
my $sth = $dbh->prepare(qq{
  SELECT atom, issued, published, link, title, content, name, 
         modified, created, id, updated, summary, category
    FROM entries 
   WHERE atom = \"$atom\" 
     AND (updated = \"$id\" OR modified = \"$id\" OR title = \"$id\")
});
$sth->execute();

my $updated;
my $content;
my $summary;
while(my $row = $sth->fetchrow_hashref()){
  if($row->{updated}){
    $updated = $row->{updated};
  }elsif($row->{modified}){
    $updated = $row->{modified};
  }
  print qq(<p><input type="text" size="30" value="$row->{category}"> 
           <input type="text" size="80" value="$row->{title}"></p>\n);
  print qq(<p><input type="text" size="40" value="$updated"></p>\n);
  if($row->{content}){
    if($row->{content}
     =~ /(&[a-z0-9]{2};|&#\d+;)/i && $row->{content} !~ /<pre>/i){
      $content = &entities_decode($row->{content});
      if($content
       =~ /(&[a-z0-9]{2};|&#\d+;)/i && $content !~ /<pre>/i){
        print &entities_decode($content);
      }else{
        print $content;
      }
    }else{
      print $row->{content};
    }
  }elsif($row->{summary}){
    if($row->{summary} 
     =~ /(&[a-z0-9]{2};|&#\d+;)/i && $row->{summary} !~ /<pre>/i){
      $summary = &entities_decode($row->{summary});
      if($summary
       =~ /(&[a-z0-9]{2};|&#\d+;)/i && $summary !~ /<pre>/i){
        print &entities_decode($summary);
      }else{
        print $summary;
      }
    }else{
      print $row->{summary};
    }
  }
}
$sth->finish();
$dbh->disconnect();
#print "//-->\n</script>\n";
exit(0);
# マークアップ記号の実体参照デコード
# 文字実体参照と数値文字参照の両方に対応
sub entities_decode{
  my($str) = @_;
  $str =~ s/(&lt;|&#60;|&#x3C;)/</g;
  $str =~ s/(&gt;|&#62;|&#x3E;)/>/g;
  $str =~ s/(&apos;|&#39;|&#x27;)/'/g;
  $str =~ s/(&quot;|&#34;|&#x22;)/"/g;
  $str =~ s/(&amp;|&#38;|&#x26;)/&/g;
  return $str;
}

デスクトップCGIの変更

Atomフィードリスト出力(feeds2.cgi)

 「atom2msrdb_feeds.cgi」はAtomフィードデータベース(atomfeeds)に問い合わせて、フィードのリストを得、AtomリーダーにURLをパラメータとして与えるリンクを生成することができます。しかし、「feeds.cgi」のように新しいAtomフィードを読み取ったり、FirefoxのブックマークによるAtomフィードの管理に対応できません。

 そこで「feeds.cgi」を改造して、Atomフィードを読み取り、各要素をAtomフィードデータベースに入力する「atom2msrdb.cgi」のリンクに加え、Atomフィードデータベースを読むためのリーダーCGIへのリンクを設定できるようにしました。

 今のところ、「feeds2.cgi」はフレームワーク開発用の間に合わせの積み木細工ですが、いずれは、「atom2msrdb_feeds.cgi」の機能も取り込み、RSS/Atomリーダーのインターフェイスとしてまとめていく予定です。

まとめ

 さて、innerHTML/Ajax版のデスクトップCGIフレームワークはいかがでしたでしょうか。本稿のAjax版とiframe版はどのように違うのか、デスクトップCGIフレームワークにおいてAjaxにはメリットはあったでしょうか。

 結論から言うと、現在の使い方ではパフォーマンス的にはほとんどメリットはありません。デザイン的にはiframe版の方が良いかもしれませんが、さまざまな方法を試していくことはもっと進んだ局面で役に立つこともあるかと思います。

 デスクトップCGIフレームワークにおいてはCGIからCGIを呼び出すようなスクリプトを書くことが多く、連鎖的にCGIが起動されます。その度に新たなプロセスを生成していては、パフォーマンス的には不利です。このような場合には、PerlのCGIにおいてはmod_perlを使うとよいはずです。次回は、Windowsでmod_perlを使う方法を取り上げる予定です。

 ほぼ要素技術は出揃ったので、その次のステップではRSS/Atomリーダーのアプリケーションをまとめていきましょう。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
PerlでデスクトップCGI連載記事一覧

もっと読む

この記事の著者

jscripter(ジェイスクリプター)

NIFTY SERVEのFGALEL(エントリーラボ)、FGALTS(テキスト&スクリプト)に参画し、FGALTSでシスオペを務める。現在、TSNETメンバー。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1342 2008/08/19 18:57

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー