FrontPage | 一覧 | 検索 | 更新履歴(RSS) | 新規作成
はてなブックマークに追加 はてなブックマークを表示

hns - hns for XREA.com 導入

差分表示


*hns for XREA.com 導入

2004-08-12 導入。
対象はもちろん、[[ウクレレ日記 http://kimux.org/ukulele/]]。
詳細は省略(後日?)。

*Script Error 対応

**症状

かなりの確率で、正常に表示されずに "Script Error" となる。
Mozilla 系ブラウザだとリロードのたびに、正常→Script Error→正常→Script Error を繰り返す。MacOS X でも Windows でも。
Safari だと、最初に表示させるときに Script Error となることが多い。リロードすれば正常に表示される(ことが多い)。

**関連情報源

どうも、ブラウザ(クライアント)側のディスク・キャッシュが悪さをしているらしい。

- [[hns-lite が妙な挙動をします。 http://sb.xrea.com/archive/index.php/t-5144.html]] (XREA SUPPORT BOARD)
- [[IEでのキャッシュ無効化 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13102&forum=12&start=8&10]] (@IT 会議室)

**対応(回避策)

上記を参考に、HNS.pm の一部を下記のように修正。

    ################################################################
    # if group member comes, set no-cache header
    unless (defined %GRP_DB) {
        tie %GRP_DB, 'SimpleDB::Hash',
        "$HNS::System::DiaryDir/conf/group.txt", 1;
    }
    my $id = $HNS::Status->id;
    $no_cache = 0;
    $id = "XXXXXXXXXXXXXXXXX" if length($id) < 17;
    foreach my $idg (keys %GRP_DB) {
        if ($GRP_DB{$idg} =~ /$id/) {
            $no_cache = 1;
            last;
        }
    }

	### 無条件 no_cache (Script Error 対策) by kimux 2004-08-13
	$no_cache = 1;
	
    ################################################################
    # Header
    # HTTP header;
    if ($ENV{'SCRIPT_NAME'}){
	my $echo_lm = strftime("%a, %d %b %Y %H:%M:%S %Z",
			       gmtime($last_modified));
	
	print "Content-Type: text/html; charset=EUC-JP?r?n";
        if ($no_cache) {
 ### kimux 2004-08-13
            # for HTTP/1.0
            print "Pragma: no-cache?r?n";
            # for HTTP/1.1 (must-revalidate only for IE)
            print "Cache-Control: no-cache, no-store, must-revalidate?r?n";
            print "Expires: 0?r?n";
 ###
        }
	print "Last-Modified: $echo_lm?r?n";
	$HNS::Status->PrintCookieHeader
	    if ($HNS::System::RefererLog eq 'ON' &&
		$HNS::System::CookieFlag eq 'ON' &&
		!$HNS::Status->is_robot);
	print "?r?n";
    }
    # <header>
    print $HNS::ExtHTML::DOCTYPE;
    if ($HNS::System::Lang) {
        print qq(<html lang="$HNS::System::Lang">?n<head>?n);
    }
    else {
        print qq(<html>?n<head>?n);
    }
    print qq(<meta http-equiv="content-type" content="text/html; charset=EUC-JP">?n)
	if !($HNS::System::LessOutput);
	
 ### kimux 2004-08-13
    if ($no_cache) {
        print qq(<meta http-equiv="Pragma" content="no-cache">?n);
        print qq(<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">?n);
        print qq(<meta http-equiv="expires" content="0">?n);
    }


* RSS

[[HNSにRSSを http://mylog.ishinao.net/id/209]] (ishinoa.net/mylog) を見つけて、
cvs-current からソースを取ってきて
http://kimux.org/ukulele/rss.cgi
を設置。Perl のパス設定を #!/usr/local/bin/perl にしただけ。(2004-08-17)


* テーマ (theme.pl)

テーマを記述するファイル theme.pl をいじくってみる。ベースは japanese 。
オリジナルと diff -Naur したパッチ
[[theme.patch.gz http://kimux.org/ukulele/images/2004/theme.patch.gz]]
と、下記には全文引用。(2004-09-05)


 ################################################################
 # japanese theme
 # $Id: theme.ph,v 1.78 2002/03/13 08:12:50 togawa Exp $
 
 ################################################################
 # User variable
 #  parameter %value is expanded to value of the user variable.
 #  you can use other value of user variable by noting as "%user{BASHO}".
 package HNS::Hnf::UserVar;
 $Templates{'TENKI'}  = "[天気:%value]";
 $Templates{'BASHO'}  = "(%value)";
 $Templates{'TAION'}  = " 体温:%value度";
 $Templates{'TAIJU'}  = " 体重:%value" . "Kg";
 $Templates{'SUIMIN'} = " 睡眠:%value時間";
 $Templates{'BGM'}    = " BGM:%value";
 $Templates{'HOSU'}   = " %value歩";
 $Templates{'HON'}    = " 読書:%value";
 $Templates{'KITAKU'} = " 帰宅時間:%value";
 $Templates{'WALK'}   = " 散歩:%value";
 $Templates{'RUN'}    = " ジョギング:%value";
 $Templates{'YOTEI'}  = "<p>%value</p>";
 
 ################################################################
 # Mark
 package HNS::Hnf::Command::MARK;
 # image size is automatically set
 $List{"(^^)"}    = "icons/usaniko.png";
 $List{"(-_-)"}   = "icons/usamesen.png";
 $List{"(^^;"}    = "icons/usaase.png";
 $List{"(;_;)"}   = "icons/usauru.png";
 $List{"(T_T)"}   = "icons/usauru2.png";
 $List{"v(^^)"}   = "icons/usav.png";
 $List{"m(__)m"}  = "icons/usapeko.png";
 $List{"!!"}      = "icons/usadoki.png";
 $List{"??"}      = "icons/usahatena.png";
 $List{"!?"}      = "icons/usanaze.png";
 $List{"(笑)"}    = "icons/usasho.png";
 $List{":-)"}     = "icons/usasmile2.png";
 $List{":-("}     = "icons/usaheno2.png";
 $List{":-P"}     = "icons/usabe2.png";
 $List{"φ(._.)"} = "icons/usamemo.png";
 
 ################################################################
 # Language
 package HNS::System;
 $Lang = "ja";
 
 ################################################################
 # CategoryList
 package HNS::CategoryList;
 $CatDir = "cat";
 
 $TitleLabel = "タイトル一覧";
 $SubmitLabel = "表示!";
 $Template = qq(<img src="%src" width="%width" height="%height" alt="">%value<br>?n);
 $Categorize = "カテゴリ分類";
 
 ################################################################
 # Extend HTML
 #
 #  CSS をいじる!! 2004-09-05 kimux
 #
 package HNS::ExtHTML;
 $DOCTYPE = qq(<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 	"http://www.w3.org/TR/REC-html40/loose.dtd">?n);
 #$Head = undef;
 $Head{dynamic} = qq(<meta http-equiv="Content-Style-Type" content="text/css">
 <style type="text/css"><!--
  body { background: white }
 
  div.ukulele-top {
   margin-left: 10em;
   margin-right: 5em;
   margin-top: 0em;
   margin-bottom: 0em
  }
 
  h3.new { margin-left: 1em }
  h4.comment { margin-left: 3em }
  div.uservar { font-weight: bold; }
  div.section { margin-left: 5em; margin-right: 5em; margin-top: 0 }
  div.sub { margin-left: 1em; margin-top: 0 }
  div.list { margin-left: 1em }
  div.fn { margin-left: 1em; margin-top: 0 }
  div.url { margin-bottom: 0 }
  div.boardlink { margin-left: 5em; margin-right: 4em; margin-top: 0 }
  dl.comments, ul.comments { 
   margin-left: 6em; margin-right: 6em;
   padding:      0.5em;
   border-style: solid;
   border-width: 1px
  }
  pre { 
   white-space:  pre;
   padding:      0.5em;
   border-color: #ffeeb0;
   border-style: outset;
   border-width: 4px
  }
  a.hide:link { color: black; text-decoration: none }
  span.bold-red { color: red; font-weight: bold }
  div.bold-red { color: red; font-weight: bold }
  span.newmark { color: red; font-size: smaller }
  span.date { font-size: smaller }
 --></style>
 );
 $Head{static} = qq(<!--#exec cmd="./logging.pl"-->?n) . $Head{dynamic};
 
 #$BodyVal = undef;
 ##$BodyVal = "bgcolor=#ffffcc";
 #$DynamicPrintFunc = undef;
 ##$DynamicPrintFunc = ?&PrintTime;
 ##sub PrintTime
 ##{
 ##    print qq(<div align="center">time is);
 ##    print join(':', reverse ((localtime)[0..2]));
 ##    print qq(</div>);
 ##}
 ################################################################
 package HNS::Collection;
 # %num : number of showing diarys
 $FootMessages{'HasContent'} = "以上、%num 日分です。?n";
 $FootMessages{'NoContent'} = "該当するものはありません。?n";
 
 
 ################################################################
 # PIM
 # Schedule
 package HNS::PIM::Schedule;
 @WeekString = ('<font color="red">日</font>', '月', '火', '水', '木', '金', '<font color="blue">土</font>');
 @ABCString = ('上', '中', '下');
 $Unfixed = '??';
 $ContentTemplate = qq(<li><strong>%month/%day%week</strong> %content</li>?n);
 $BeginTemplate = "<ul>";
 $EndTemplate = "</ul>";
 
 # TODO
 package HNS::PIM::Todo;
 $ContentTemplate = "<li><strong>%priority</strong> %content</li>?n";
 $BeginTemplate = "<ul>";
 $EndTemplate = "</ul>";
 
 ################################################################
 # Calendar
 package HNS::Calendar::Table;
 @WeekString = ('<font color="red">日</font>', '月', '火', '水', '木', '金', '<font color="blue">土</font>');
 $TableBorder = 0;
 $NextTemplate{dynamic} = qq(<a href="$HNS::System::MyDiaryURI?%year%month">来月</a>);
 $PrevTemplate{dynamic} = qq(<a href="$HNS::System::MyDiaryURI?%year%month">先月</a>);
 # 2004-09-05 kimux
 # $ThisTemplate{dynamic} = qq(<a href="$HNS::System::MyDiaryURI?%year%month">%year年%month月</a>);
 $ThisTemplate{dynamic} = qq(<a href="$HNS::System::MyDiaryURI?%year%month">%year/%month</a>);
 $NextTemplate{static} = qq(<a href="./%year%month.html">来月</a>);
 $PrevTemplate{static} = qq(<a href="./%year%month.html">先月</a>);
 # 2004-09-05 kimux
 # $ThisTemplate{static} = qq(<a href="./%year%month.html">%year年%month月</a>);
 $ThisTemplate{static} = qq(<a href="./%year%month.html">%year/%month</a>);
 $DayCurrentTemplate = qq(<a href="%ruri#%{ymd}0">%calendar_day</a>);
 $DayNonCurrentTemplate = qq(<a href="%href">%calendar_day</a>);
 
 package HNS::Calendar::NoTable;
 $NextTemplate{dynamic} = qq(<a href="$HNS::System::MyDiaryURI?%year%month">&gt;&gt;</a>);
 $PrevTemplate{dynamic} = qq(<a href="$HNS::System::MyDiaryURI?%year%month">&lt;&lt;</a>);
 $ThisTemplate{dynamic} = qq(<a href="$HNS::System::MyDiaryURI?%year%month">%year/%month</a>);
 $NextTemplate{static} = qq(<a href="./%year%month.html">&gt;&gt;</a>);
 $PrevTemplate{static} = qq(<a href="./%year%month.html">&lt;&lt;</a>);
 $ThisTemplate{static} = qq(<a href="./%year%month.html">%year/%month</a>);
 $DayCurrentTemplate = qq(<a href="%ruri#%{ymd}0">%calendar_day</a>);
 $DayNonCurrentTemplate = qq(<a href="%href">%calendar_day</a>);
 
 ################################################################
 # DateSelect
 package HNS::DateSelect;
 $YearTemplate = "%year年";
 $MonthTemplate = "%month月";
 $DayTemplate = "%start_day〜%end_day日";
 $AllLabel = "全て";
 
 ################################################################
 # Direct Ctalendar
 package HNS::Calendar::Direct;
 $SubmitLabel = "Go!";
 
 ################################################################
 # Style
 package HNS::Style;
 $Templates{Table}->{pim} = qq(
 <table summary="pim">
 <tr>
  <th align="left">TODO</th>
  <th align="left">Link</th>
 </tr>
 <tr>
  <td width="50%" valign="top">
  %todo
  </td>
  <td valign="top">
  %link
  </td>
 </tr>
 </table>
 );
 
 # 予定は抜いた 2004-09-05 kimux
 # <th align="left">予定</th>
 # <td valign="top">
 # %schedule
 # </td>
 
 # カレンダーとPIMを横に並べる 2004-09-05 kimux
 #
 $Templates{Table}->{head_style}->{dynamic} = qq(
 <div class="ukulele-top">
 <h1>
 <img src="images/2004/ukulele-i.jpeg" 
  align="right" width="200" height="100" alt="*">
 ウクレレ日記</h1>
 ♪きむらかずし kimu(at)st.rim.or.jp
 <br>
 %direct_calendar
 <br clear="all">
 </div>
 
 <table summary="calendar">
 <tr>
 <td rowspan="2" valign="top">
 %calendar
 </td>
 </tr>
 <tr>
 <td valign="top">
 %pim
 </td>
 </tr>
 </table>
 
 <hr>
 );
 
 $Templates{Table}->{head_style}->{static} = qq( 
 %pim
 <hr>
 %calendar
 <hr>
 );
 
 $Templates{Table}->{foot_style} = "?n<hr>?n%category_list";
 
 $Templates{Table}->{head_recent_style} = $Templates{Table}->{head_style};
 $Templates{Table}->{foot_recent_style} = $Templates{Table}->{foot_style};
 
 # template for no table browser
 $Templates{NoTable} = {
     pim => qq(<hr>?n%schedule %todo %link),
     head_style => qq(%pim?n<hr>?n%unagi?n<hr>?n%calendar
 		      %direct_calendar?n<hr>?n),
     foot_style=> "<hr>?n%category_list"
     };
 
 $Templates{NoTable}->{head_recent_style} = $Templates{NoTable}->{head_style};
 $Templates{NoTable}->{foot_recent_style} = $Templates{NoTable}->{foot_style};
 
 # unagi template
 $UnagiTemplate = qq( 
 <a href="%namazu_url">Namazu</a> for hns による簡易全文検索<br>
 詳しくは <a href="%unagi_url">詳細指定/ヘルプ</a>を参照して下さい
 <form method="GET" action="%unagi_url">
 <strong>検索式:</strong>
 <input type="TEXT" name="key" size="30" value="%keyword">
 <input type="SUBMIT" name="submit" value="Search!">
 <input type="HIDDEN" name="whence" value="0">
 </form>
 );
 
 $NoUnagiTemplate = qq(
 <a href="http://www.h14m.org/"><img src="./icons/hns-logo.png" width="200" height="40" align="right" alt="HNS logo"></a>
 );
 
 
 
 ################################################################
 # Warning
 package HNS::Hnf::Warning;
 $Head = "<br><font color=?"red?">?[- 日記システム警告:";
 $Foot = "-?]</font><br>?n";
 
 # parameters:
 #  %c : the command name
 #  %p : command name of inserted position
 #
 $Messages{'IllegalHeader'} = "ヘッダ部が不正です";
 $Messages{'UndefinedUserVar'} = "定義されていないユーザ変数が使われています";
 $Messages{'Reserved'} = "コマンド %c は予約されています。";
 $Messages{'NoMatch'} = "コマンド %p の中にコマンド %c を含めることはできません。コマンド /%p が抜けている可能性があります。";
 $Messages{'NotDefined'} = "コマンド %c の引数として %t は定義されていません。";
 
 ################################################################
 # Version Message
 # paramter:
 #  %homepage
 #  %public_version
 #  %current_version
 
 package HNS;
 # これは空っぽに。 2004-09-05 kimux
 # $VersionMessages{'Public'} = q(<hr>
 #<div>hns - 日記自動生成システム - Version %public</div>);
 $VersionMessages{'Public'} = q();
 
 
 $VersionMessages{'NonPublic'}->{dynamic} = qq(<hr>
 <div>
 <font color="red">注意:</font> 
 今現在使用されているこの日記自動生成システムは 
 Version %current です。<br>
 公開されている日記自動生成システムは 
 Version %public です。
 </div>
 );
 
 $VersionMessages{'NonPublic'}->{static} = qq(<hr>
 <div>
 <font color="red">注意:</font> 
 この日記は日記自動生成システム Version %current で生成されました。<br>
 公開されている日記自動生成システムは Version %public です。
 </div>
 );
 
 ################################################################
 # Template
 # usable parameter (%[A-Za-z0-9_]) is:
 #  date:
 #   %year, %month, %day	: year, month, day
 #   %high		: int(day/10)
 #   %abc		: day 1-10 -> a, 11-20 -> b, 21-31 -> c
 #  counter:
 #   %new, %sub, %fn	: counter of NEW, SUB, FN
 #   %mark		: for GRP mark, if not in GRP the same as %new
 
 package HNS::Diary::Template;
 $BaseTemplate{dynamic} = "$HNS::System::MyDiaryURI?%year%month%abc";
 #$BaseTemplate{dynamic} = "$HNS::System::MyDiaryURI?%year%month%day"; # 1日分のみ
 $BaseTemplate{static} = "./%year%month.html";		# 静的生成
 $HrefTemplate{dynamic} = "%base&amp;to=%name#%name";
 #$HrefTemplate{dynamic} = "%base#%name";		# to= を付けない
 $HrefTemplate{static} = "%base?to=%name#%name";		# 静的生成
 
 package HNS::Diary;
 ################
 # diary limited parameter:
 #   %week		: week string
 #
 #  user-variable
 #   %user{VARNAME}	: string as which user-var-format is expanded using
 #			  value of user-variable VARNAME.
 @WeekString = ('<font color="red">日</font>', '月', '火', '水', '木', '金', '<font color="blue">土</font>');
 
 $Head{dynamic} = qq(
 <h2><a class="hide" href="%href" name="%name">%year年%month月%day日(%week)</a>
 [<a href="$HNS::System::MyDiaryURI?%month%day">n年日記</a>]</h2>
 );
 $Head{static} = qq(
 <h2><a class="hide" href="%href" name="%name">%year年%month月%day日(%week)</a></h2>
 );
 
 $UserVar = qq(<div class="uservar">
  %user{TENKI}%user{BASHO}%user{TAIJU}%user{TAION}%user{SUIMIN}%user{BGM}
  %user{HOSU}%user{HON}%user{KITAKU}%user{WALK}%user{RUN}%user{YOTEI}
 </div>);
 
 # Schedule as User Val
 $YoteiVal = "<li>%value</li>";
 $YoteiHead = "予定?n<ul>";
 $YoteiFoot = "</ul>";
 
 $Foot = qq(<hr>?n);
 
 package HNS::Hnf::Command::ConvUrl;
 $HrefTemplate = "%base#%name";
 $Template{mydiary} = "%href";
 
 $Template{ISBN} = "http://www.bk1.co.jp/cgi-bin/srch/srch_result_book.cgi?idx=3&amp;isbn=%param";
 #$Template{ISBN} = "http://www.isize.com/book/cgi-bin/isbn.cgi?isbn=%param";
 #$Template{ISBN} = "http://www.eshopping.ne.jp/bks.svl?CID=BKS504&amp;access_method=isbn_cd&amp;input_data=%param";
 #$Template{ISBN} = "http://www1.honyasan.co.jp/washo/book.cfm?PRODUCT_CD=%param";
 
 $Template{CD} = "http://www.hmv.co.jp/search/title.asp?category=CATALOGUENO&amp;keyword=%param";
 #$Template{CD} = "http://www.towerrecords.co.jp/tower/towercdj.nsf/SearchProductID/%param";
 
 $Template{"hns-dev"} = sub { sprintf("http://www.h14m.org/ml/hns-dev/msg%05d.html", $_[0] - 1) };
 $Template{"hns-users"} = sub { sprintf("http://www.h14m.org/ml/hns-users/msg%05d.html", $_[0] - 1) };
 
 package HNS::Hnf::Command::CAT;
 $Template{dynamic} = qq([<a href="./title.cgi?CAT=%enc_var">%var</a>]);
 $ImgTemplate{dynamic} = qq(<a href="./title.cgi?CAT=%enc_var">%img</a>);
 $Template{static} = qq([<a href="./tc%year%month.html#%enc_var">%var</a>]);
 $ImgTemplate{static} = qq(<a href="./tc%year%month.html#%enc_var">%img</a>);
 
 package HNS::Hnf::Command::NEW;
 $Template = qq(
 <h3 class="new"><a class="hide" name="%name" title="%name" href="%href">#%mark</a>
 %cat %content</h3>
 <div class="section">?n);
 $EndTemplate = "</div>%boarddata %boardlink<!-- end of NEW -->?n";
 
 package HNS::Hnf::Command::LNEW;
 $Template = qq(
 <h3 class="new"><a class="hide" name="%name" title="%name" 
 href="%href">#%mark</a>
 %cat <a href="%1">%content</a></h3>
 <div class="section">?n);
 $EndTemplate = "</div>%boarddata %boardlink<!-- end of LNEW -->?n";
 
 package HNS::Hnf::Command::RLNEW;
 $Template = qq(
 <h3 class="new"><a class="hide" name="%name" title="%name" href="%href">#%mark</a>
 %cat <a href="%url%2">%content</a></h3>
 <div class="section">?n);
 $EndTemplate = "</div>%boarddata %boardlink<!-- end of RLNEW -->?n";
 
 package HNS::Hnf::Command::SUB;
 $Template = qq(
 <h4><a class="hide" name="%name" title="%name" href="%href">@</a>
 %content:</h4> 
 <div class="sub">
 );
 $EndTemplate = "</div><!-- end of SUB -->?n";
 
 package HNS::Hnf::Command::LSUB;
 $Template = qq(
 <h4><a class="hide" name="%name" title="%name" href="%href">@</a>
 <a href="%1">%content</a>:</h4> 
 <div class="sub">
 );
 $EndTemplate = "</div><!-- end of LSUB -->?n";
 $NumAttr = 1;
 
 package HNS::Hnf::Command::RLSUB;
 $Template = qq(
 <h4><a class="hide" name="%name" title="%name" href="%href">@</a>
 <a href="%url%2">%content</a>:</h4> 
 <div class="sub">
 );
 $EndTemplate = "</div><!-- end of RLSUB -->?n";
 $NumAttr = 2;
 
 ################################################################
 # Inline Elements
 # these element has no content commands,
 # so $EndTemplate, $AllowCommands has no means.
 
 package HNS::Hnf::Command::LINK;
 $Template = qq(<a href="%1">%content</a>?n);
 $NumAttr = 1;
 
 package HNS::Hnf::Command::RLINK;
 $Template = qq(<a href="%url%2">%content</a>?n);
 $NumAttr = 2;
 # overriden AsHTML
 
 package HNS::Hnf::Command::URL;
 $Template = qq(<div class="url">
 <img alt="*" src="./icons/mark01.png" width="16" height="16">
 <a href="%1">%content (%1)</a>
 </div>?n);
 $NumAttr = 1;
 
 package HNS::Hnf::Command::STRIKE;
 $Template = qq(<strike>%content</strike>?n);
 
 package HNS::Hnf::Command::LSTRIKE;
 $Template = qq(<strike><a href="%1">%content</a></strike>?n);
 $NumAttr = 1;
 
 package HNS::Hnf::Command::STRONG;
 $Template = qq(<strong>%content</strong>?n);
 
 package HNS::Hnf::Command::FONT;
 $Template = qq(<font %1="%2">%content</font>?n);
 $NumAttr = 2;
 
 package HNS::Hnf::Command::IMG;
 $Template = 
     qq(<img %align src="%2" alt="%content" width="%width" height="%height">?n);
 $NumAttr = 2;
 # overriden AsHTML
 
 package HNS::Hnf::Command::MARK;
 $Template = qq(<img src="%src" alt="%1" width="%width" height="%height">?n);
 $NumAttr = 1;
 # overriden AsHTML
 
 package HNS::Hnf::Command::ALIAS;
 $Template = "%term";
 # overriden AsHTML
 
 ################################################################
 # Block Commands
 package HNS::Hnf::Command::PRE;
 $Template = "<pre>?n";
 $EndTemplate = "</pre>?n";
 
 package HNS::Hnf::Command::CITE;
 $Template = "<blockquote>?n";
 $EndTemplate = "</blockquote>?n";
 
 package HNS::Hnf::Command::UL;
 $Template = "<ul>?n";
 $EndTemplate = qq(</ul>?n);
 
 package HNS::Hnf::Command::OL;
 $Template = "<ol>?n";
 $EndTemplate = qq(</ol>?n);
 
 package HNS::Hnf::Command::LI;
 $Template = q(<li>%content );
 $EndTemplate = "</li>?n";
 
 package HNS::Hnf::Command::HR;
 $Template = q(<hr>?n);
 
 package HNS::Hnf::Command::FN;
 $Template = 
     qq(<a href="$ENV{'REQUEST_URI'}#%name"><small>*%fn</small></a>?n);
 
 $HeaderTemplate = qq(<hr class="section" width="40%" align="left">
 <div class="fn">?n);
 $FooterTemplate = qq(</div>?n);
 
 $ContentTemplate = qq(
 <a class="hide" name="%name" href="%href"><small>*%fn</small></a>: %content<br>
 );
 
 package HNS::Tools::Title;
 $CatTemplate{dynamic} =
   qq(<h3>%img<a href="title.cgi?%{arg}CAT=%enc_var">%var</a></h3>?n);
 $CatLinkTemplate{dynamic} =
   qq([<a href="title.cgi?%{arg}CAT=%enc_var">%var</a>]);
 $CatTemplate{static} =
   qq(<h3>%img<a href="#%enc_var" name="%enc_var">%var</a></h3>?n);
 $CatLinkTemplate{static} =
   qq(<a href="tc%year%month.html#%enc_var">%var</a>);
 $HeadTitle = qq(<title>$HNS::System::Title Title List</title>?n);
 $Header = qq(<h1><a href="$HNS::System::MyDiaryURI">$HNS::System::Title</a> Title List</h1>?n);
 $BacktoDiary = qq(<div align="right"><a href="$HNS::System::MyDiaryURI">Back to Diary</a></div>?n);
 
 package HNS::Tools::Title::Hnf;
 $BaseTemplate{dynamic} = "$HNS::System::MyDiaryURI?%year%month%abc";
 $BaseTemplate{static} = "./%year%month.html";
 
 package HNS::Tools::HeadLine;
 $Max = $HNS::System::DefaultMax * 3;
 $HeadTitle = qq(<title>$HNS::System::Title HeadLine</title>?n);
 $Header = "";
 $BacktoDiary = "";
 $BaseTemplate{dynamic} = "$HNS::System::MyDiaryURI?%year%month%abc";
 $BaseTemplate{static} = "./%year%month.html";
 $RecentBaseTemplate{dynamic} = "$HNS::System::MyDiaryURI";
 $RecentBaseTemplate{static} = "./recent.html";
 $DayTemplate = qq(<a href="%href" class="hide">%year年%month月%day日</a>);
 
 package HNS::Tools::HeadLine::New;
 $Template = qq(<b>・</b><a href="%href" title="%para">%content</a>);
 
 ################################################################
 # Link to board.cgi
 
 package Board;
 $ReadStr = 'コメントを読む(%num)';
 $SepStr = '|';
 $WriteStr = 'コメントする';
 $LinkStr = '<div class="boardlink" align="right">[ %readstr %sepstr %writestr ]</div>';
 $HeadStr = '<h4 class="comment">この記事へのコメント</h4>';
 
 ################################################################
 1;

* セキュリティ・アップデート
2005-09-01 に、
[[2.19.6 http://kimux.org/ukulele/?200509a#200509011]]を上書きインストール。
テーマが元に戻ってしまった。
webif.cgi で書き込んでも無視されててしまう(エラーは特に出ない)。

* YouTube を埋め込むハック
2007-02-11

http://kimux.org/ukulele/?200702b&to=200702112#200702112

やり方:conf/alias.txt に以下の定義を入れておく。

 yt-1 <object width="320" height="240"> <param name="movie" value="http://www.youtube.com/v/
 yt-2 "> </param> <embed src="http://www.youtube.com/v/
 yt-3 " type="application/x-shockwave-flash" width="320" height="240"> </embed> </object>

日記ファイルに下記のように書く。

 ALIAS yt-1
 jjsBFY1V3mw
 ALIAS yt-2
 jjsBFY1V3mw
 ALIAS yt-3

* Amazon 個別リンクを埋め込むハック
2008-04-05

http://kimux.org/ukulele/?200804a&to=200804052#200804052

hns で Amazon.co.jp アソシエイト・プログラムの個別リンクを貼付けるテスト。
alias.txt で下記を定義しておく。align="left" は勝手に入れた。

 amazon-asin-1 <iframe align="left" src="http://rcm-jp.amazon.co.jp/e/cm?t=<あなたのタグ>&asins=

 amazon-asin-2 &o=9&p=8&l=as1&fc1=000000&IS2=1&lt1=_top&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr&nou=1" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

でもって、日記の記述では、下記のように asin コードを挟む。

 ALIAS amazon-asin-1
 B000F9UDU8
 ALIAS amazon-asin-2