CGI::Application::DispatchでURL操作

Perl, dev No Comments »

CGI::Application::Dispatchで下記のようなURLを実装する方法。

http://yourdomain.com/app.cgi/[param1]/[param2]

(mod_rewriteは使わない)

app.cgi

#!/usr/bin/perl
use strict;
use warnings;
use lib qw (./lib);
use CGI::Carp qw (fatalsToBrowser);
use CGI::Application::Dispatch;

CGI::Application::Dispatch->dispatch(
    prefix  => 'WebApp',
    table   => [
        ''               => { app => 'Index', rm => 'index' },
        ':param1/:parm2' => { app => 'Index', rm => 'hoge' },
    ]
);

lib/WebApp/Index.pm (¥マークほんとは半角)

package WebApp::Index;
use strict;
use warnings;
use lib qw (./lib);
use base qw (WebApp);

sub setup {
    my $self = shift;
    $self->start_mode('index');
    $self->run_mode(
        index => 'do_index',
        hoge  => 'do_hoge',
    );
}

sub do_index {
    return "TopPage";
}

sub do_hoge {
    my $self = shift;
    my $p1 = $self->param('param1');
    my $p2 = $self->param('param2');
    return "¥$p1 is $p1. And ¥$p2 is $p2.";
}

1;

lib/WebApp.pm

package WebApp;
use strict;
use warnings;
use lib qw (./lib);
use base qw (CGI::Application);

sub cgiapp_prerun {
    my $self = shift;
    $self->header_props( -charset => 'utf-8' );
}

1;

こんな感じで動いた。無駄な記述もあるのかもしれんけど、とりあえず動いた。

http://yourdomain.com/app.cgi

で「TopPage」が表示されて

http://yourdomain.com/app.cgi/fuga/dodo

だと「$p1 is fuga. And $p2 is dodo.」が表示される。

プルダウンメニューにonfocus

dev No Comments »
<select onfocus="fugafuga()">・・・</select>

として文字の色を変更したりしようとしてたんだけど
IEで2度クリックしないとプルダウンが開かないような状況になった。

ひとまず下記のように書き換えてみた。

<select onmousedowm="fugafuga()">・・・</select>

今のところ支障なし。

WinSCPのエラー回避法

dev No Comments »

パスワードを入力後、

Error skipping startup message. Your shell is probably incompatible with the application (BASH is recommended).
Connection has been unexpectedly closed. Server sent command exit status 0.

というメッセージ。
ProtocolをSCPからSFTPに変えると繋がった。よかった。

Movable Typeで投稿者名が表示されない

cms, dev No Comments »

今日、MTの調査してたらこんなのがあった。いつかはまるかも。メモメモ。

Movable Type 3.3以前のバージョンでは、投稿者のログイン名を表示していました。しかし、セキュリティ上の理由から、Movable Type 3.3では、表示名を表示するようになりました。投稿者のプロフィールに表示名を設定していない場合は、何も表示されません。

Movable Type 3.3 マニュアル: テンプレート・タグ リファレンス

JavaScriptでclass属性を操作

dev No Comments »
function changeClass(name) {
  var d=document.getElementById('test');
  d.setAttribute("class",name);
  d.setAttribute("className",name); //for IE
}

IEはsetAttribute("class",name);が効かない。。

参照
JavaScript++かも日記: 【クロスブラウザ】IEのgetAttribute / setAttribute で class 、style NG
IE の getAttribute / setAttribute: Days on the Moon

PHPでRSS FEEDを解析

dev No Comments »

fff外部ブログサイトのRSS FEEDをPHPで解析してサイトに表示、リンクさせる方法。サンプル探してみたらこんなのがありました。

MagpieRSSは、GPLで開発されているRSSを解析するライブラリ、いわゆるRSSパーサです。PHPでリモートからRSSを取得して解析、キャッシュを行います。

  1. 言われるままにダウンロード(こちらから→SourceForge.net: Files)して解凍
  2. 解凍したフォルダにsample.phpとして下記の内容でファイルを作成
    <!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>sample</title>
    </head>
    <body>
    <?php
    require_once('./rss_fetch.inc');
    define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
    $url = 'http://yourdomain.com/rssfile.rdf';
    $rss = fetch_rss($url);
    $title = $rss->channel['title'];
    echo "<h1>$title</h1>n";
    echo "<ul>n";
    foreach ($rss->items as $item ) {
    $title = $item['title'];
    $link = $item['link'];
    $pubdate = $item['dc']['date'];
    echo "<li><a xhref=\"$link\">$title ($pubdate)</a></li>n";
    }
    echo "</ul>n";
    ?>
    </body>
    </html>
    
  3. ブラウザで確認したら、日付がうまくとれてないみたい(今回読み込むFEEDはFC2ブログのもの)。rss_util.incをちょっと改造(28行目)すると日付も表示できた(sample1 - てんぽさんのFEED読ませてもらってます)。
    変更前
    $pat = "/(d{4})-(d{2})-(d{2})T(d{2}):(d{2})(:(d{2}))?(?:([-+])(d{2}):?(d{2})|(Z))?/";
    変更後
    $pat = "/(d{4})-(d{2})-(d{2})T(d{2}):(d{2}):(d{2})+(d{2}):(Z)/";

改造後のrss_util.incはこちら。

この改造は何かを失ってる気がする。そして、紆余曲折あってinit.incで

  • FEEDのURL
  • HTMLのフォーマット(dl or ul)
  • 表示件数
  • リンクのタイプ(外部リンクやら~)
  • 日付のフォーマット
  • ブログタイトルをどのタグで囲うか

を設定できるように改造。

$url
(FEEDのURLを指定)
$soe
(表示したいエントリーの数を指定)
$dateformat
typeA
2007.03.23
typeB
2007.03.23-12:02
$htmlformat
"dl" or "ul"
$linkformat
normal
<a xhref="link" mce_href="link"   title="title">
wo
<a xhref="link" mce_href="link"   title="title" onclick="window.open(this.href,''); return false;">
external
<a xhref="link" mce_href="link"   title="title" rel="external">
$tmark
"h1" or "h2" or ... "p" or ...

htmlformatter.incdateformatter.incを同じ階層に置いてこのような使い方。

sample2.php
<!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>sample</title>
</head>
<body>
<?php
require_once('./init.inc');
require_once('./rss_fetch.inc');
require_once('./dateformatter.inc');
require_once('./htmlformatter.inc');
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
$rss = fetch_rss($url);
$title = $rss->channel['title'];
$siteurl = $rss->channel['link'];
$sitename = formattitle($title,$siteurl,$tmark,$linkformat);
$entrylist = formathtml($htmlformat,$linkformat,$dateformat,$rss,$soe);
echo ("<div id=\"entrylist\">".$entrylist.$sitename."</div>");
?>
</body>
</html>
init.inc
<?php
$url = "http://mb.blog7.fc2.com/?xml";
$soe = 3;
$dateformat = "typeA";
$htmlformat = "ul";
$linkformat = "wo";
$tmark = "p";
?>

sample2が動いてるところ

なんとなくイモくさいコードだけどまーいいか。

Powered by WordPress | WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in