月めくりカレンダー(改)完成版

先日、中途半端な段階でエントリーを書いたが、ヤマギ氏(EB)からのアドバイスもあってなんとか完成。
右サイドバー(→)に実装してみますた。
どんぐりころころさんの「月めくりカレンダーVer.UP版」を参考に、個別アーカイブをphp化している場合に対応させたのが改造点。
改造方法は以下のとおり。

どんぐりころころさんの以下の部分をカスタマイズ。

// 日付別アーカイブファイルが存在すれば、リンクさせる。 //
// 注意:Web上の論理パス //
$filename = “/archives/”.date(“Y”,$t).”/”.date(“m”, $t).”/”.date(“d”,$t).”/”;
// 注意:フルパスでの記述。レンタルサーバなどで //
//    バーチャルホストの場合は注意。 //
$full_filename = “/hogehoge/user1/web”.$filename.”index.html”;
// ファイル検査 //
if (file_exists($full_filename)) {
print (“<A href=\””);
print $filename;
print(“\” target=\”_top\”>”);
print date(“j”, $t);
print(“</A>”);
} else {
print date(“j”, $t);
}

これを次のようにする。

//月・日を二桁表示にする
$mon = sprintf(“%02d”,$month);
$cd = sprintf(“%02d”,date(“j”, $t));
$fulldir =”サーバー上の絶対パス/”.$year.”/”.$mon.”/”;
$dir = “webのホームからの相対パス/”.$year.”/”.$mon.”/”;
//ファイルの検査
$files=glob($fulldir.$cd.”_*.php”);
//当該日にエントリーがあった場合
if($files) {
foreach($files as $list) {
print (“<A href=\””);
print ( $dir.basename($list));
print(“\” target=\”_top\”>”);
print date(“j”, $t);
print(“</A>”);
break;
}
} else {
print date(“j”, $t);
}

最初に書いたのよりも、だいぶすっきりしたような気がw
あ、実装品では、今日の日付を赤で表示するようにしてありマス



月めくりカレンダー

ひさびさにmovable typeのカスタマイズ。
と言っても、こちらのブログではなくてTrackback Albirexの方なんだけど(^^;;
「月めくりカレンダー」を、まったく新しいタイプのものにしてみた。
参考にしたのはこちらのサイト
どんぐりころころ
<MTCalendar>タグを使わないでカレンダーを描画しているので、エントリーのあるなしにかかわらずに表示できるし、祝日・振替休日などにも対応しているところがgood。
しかし一方で、<MTCalendar>タグを使わずに個別エントリーへのリンクを貼るので、ちょっとした工夫が必要。ここがカスタマイズの重要ポイントになる。リンク部分にカーソルを合わせたときにエントリーのタイトル表示が出来ないのも、ちょっと残念なところ。

オリジナルのスクリプトの以下の部分が、カスタマイズの対象。

// 日付別アーカイブファイルが存在すれば、リンクさせる。 //
// 注意:Web上の論理パス //
$filename = “/archives/”.date(“Y”,$t).”/”.date(“m”, $t).”/”.date(“d”,$t).”/”;
// 注意:フルパスでの記述。レンタルサーバなどで //
//    バーチャルホストの場合は注意。 //
$full_filename = “/hogehoge/user1/web”.$filename.”index.html”;
// ファイル検査 //
if (file_exists($full_filename)) {
print (“<A href=\””);
print $filename;
print(“\” target=\”_top\”>”);
print date(“j”, $t);
print(“</A>”);
} else {
print date(“j”, $t);
}

「Trackback Albirex」の場合、個別アーカイブをphp化している関係上、名前付の規則はこのようにしてある。
<$MTArchiveDate format="%Y/%m/%d_%H%M"$>.php
つまり個別アーカイブは、「アーカイブ/年/月/」というフォルダ内に「日_時分.php」という名前のファイルで保存されている。したがって、カレンダー側から直接ファイル名を指定してファイルの存在を検査することは不可能(カレンダー側から引数としてひろえるのは「年月日」の数字だけだから)。
そこで、このようにファイルを検索してやることにした。
まずカレンダーの描画に入る前に、表示対象月のフォルダ内にあるアーカイブファイルのファイル名を読みとって配列に格納する。

<?php
$mon = sprintf(“%02d”,$month);
$dir = “アーカイブフォルダへのパス/”.$year.”/”.$mon;
//当該月のディレクトリが存在したらファイルのリストを配列に格納する
if(file_exists($dir)) {
$dh = opendir($dir);
while (false !== ($filename = readdir($dh))) {
$files[] = $filename;
}
closedir($dh);
sort($files);
}
?>

カレンダーの各日付を描画する際に、配列に格納されたファイル名「日_時分.php」の「日」部分を取り出してマッチングさせ、一致するものがあったら「エントリーあり」と判断して、そのファイルにリンクする。

if($files){
//当該月にエントリがある場合
$lir =”アーカイブフォルダ/”.$year.”/”.$mon;
//当該日を二桁表示にする
$cd = sprintf(“%02d”,date(“j”, $t));
$flag=0;
//配列から日付部分のみを取り出し、当該日とマッチするものがあればリンクする
foreach($files as $list) {
if ($cd == substr($list,0,2)) {
print (“<A href=\””);
print $lir . “/” . $list;
print(“\” target=\”_top\”>”);
print date(“j”, $t);
print(“</A>”);
$flag=1;
//同一日に複数エントリーがあったら一つ目にリンクしてループを抜ける
break;
}
}
//マッチするものがなければ数字のみ表示
if($flag == 0) { print date(“j”, $t); }
}
//エントリがない場合
  else {
print date(“j”, $t);
}

実はphpについては全くの素人なので、見よう見まねでスクリプトを書いてみた。
配列への格納と取り出しがcgiの書き方とは違うようで、なかなかうまくいかず四苦八苦。
とりあえず動くようには出来たわけだけど、もうすこしスッキリ書けるように勉強します。
【追記】
完成版は→こちらです



超録

CDドライブが故障したまんま(苦笑)とか、いくつかの要因が重なって、これまでPCでオーディオ関係を扱うことがなかったのだけれど、このたび必要に迫られて「♪超録 – パソコン長時間録音機 フリーウェア版」なるソフトを導入してみた。
ラジオやテープ、MDなんかの音源をライン入力してPCのHDDに録音するというソフトなんだけど、ビットレートだのファイル形式だのの知識が無いに等しい状態でも、あっというまに録音できたよ!

まず上記ページからソフトをダウンロードしたら、ダブルクリックでインストーラーを立ち上げてインストール。その後にREADME.TXTにしたがってエンコードライブラリを二つほどダウンロードしてインストール。これにて準備は終了。
マニュアルのページは「現在作成中」とのこと。ヘルプ画面もないので、野生の勘を頼りに使ってみる。
試しにインターネットラジオをHDDに録音してみる。おー、できますがな。
次に、MDプレーヤーとPCをオーディオケーブルで繋いで録音してみる。おー、できますw
CDドライブが故障しているので、CDプレーヤーとPCを繋いで録音してみる。できますできますww
他のソフトを使ったことがないので、使いやすさや機能など、もっといいものがあるのかもしれないけど、とりあえずこれは便利そうですよ。
同じところからAudio LASERなる音楽CD作成ソフトもでている。これもずいぶんと使いやすそう。
ただ、どうだろう。これからはiPodとかUSBフラッシュメモリとかが主流になっていくんだろうから、CD作成ソフトって必要なのかな・・・?よくわからん。



msnからのトラックバック3

Trackback Albirexで適用しているmsnからのトラックバック対策。見ばえの関係からデータベースをいちいち手直しして対応していたのだけれど、いくらなんでもそれでは大変。最終的に、Trackback.pmを直接いじってみることにした。

mt\lib\MT\App\Trackback.pmをエディタで開く。
231行目あたりにある以下の部分に、青文字の行を追加する。

no_utf8($tb_id, $title, $excerpt, $url, $blog_name);
# guess encoding as possible
$enc = MT::I18N::guess_encoding($excerpt.$title.$blog_name) unless $enc;
($title, $excerpt, $blog_name) = map {MT::I18N::encode_text($_,$enc,undef)} ($title, $excerpt, $blog_name);
#msn対策
if($blog_name eq ‘◆◆◆◆’){ $blog_name = ‘◇◇◇◇’; }

return $app->_response(Error=> $app->translate(“Need a Source URL (url).”))
unless $url;

この時、◆◆◆◆にはmsnのブログの「id」を、◇◇◇◇には正式なブログ名を記入する。
例えば
  if($blog_name eq ‘footballhour’){ $blog_name = ‘hamaのサッカー日記’; }
のように記入する。
トラックバックを送ってくるmsnブログが複数ある場合には、「if」以下の文を必要なだけ作成して付け加えていけばよい。
スマートなやり方ではないけれど、データベースを直接いじるよりは楽だし、不安も少ないので。



msnからのトラックバック2

数日前、msnのブログからのトラックバックではブログ名が取得できない、と書いたのだけれど、現在の動作状況を見てみると、とくにプログラムをいじらなくても(ブログ名の代わりに)ブログ作成者の「id」が取得できているようだ。msn側の仕様の変更なのか?あるいはこちらがMySQLに移行したことと関係があるのか(ないとは思うが)?
とにかく、ふたたびスクリプトの変更をしなくては。

前回紹介したのは、このようなスクリプト。

<MTPings>
<p id=”p<$MTPingID$>”>
& raquo; <a href=”<$MTPingURL$>”>
<?
$title = “<$MTPingTitle$>”;
if(preg_match(“/^http:\/\/spaces\.msn\.com/”, $title)){
$string = “<$MTPingURL$>”;
$list = explode (“/”, $string);
print “<$MTPingExcerpt$></a> from $list[4]”;
}
else { print “<$MTPingTitle$></a> from “; }
?>

<$MTPingBlogName$><br />
<$MTPingExcerpt$> <a href=”<$MTPingURL$>”>[続きを読む]</a> 
</p>
<p class=”posted”>トラックバック時刻: <$MTPingDate$></p>
</MTPings>

msnからのトラックバックだと、先週までは<$MTPingBlogName$>が空欄になっていたので、その代わりとして<$MTPingURL$>からmsnのメンバー名を取り出して($list[4])代入していたのだけれど、どうも<$MTPingBlogName$>でメンバー名が取得できるようになったようで、このスクリプトのままではトラックバック元のサイト名が「from everyday-albiday everyday-albiday」のように二重に表示されてしまう。そこで、

<MTPings>
<p id=”p<$MTPingID$>”>
& raquo; <a href=”<$MTPingURL$>”>
<?
$title = “<$MTPingTitle$>”;
if(preg_match(“/^http:\/\/spaces\.msn\.com/”, $title)){
$string = “<$MTPingURL$>”;
$list = explode (“/”, $string);
print “<$MTPingExcerpt$></a> from $list[4]“;
else { print “<$MTPingTitle$></a> from “; }
?>

<$MTPingBlogName$><br />
<$MTPingExcerpt$> <a href=”<$MTPingURL$>”>[続きを読む]</a> 
</p>
<p class=”posted”>トラックバック時刻: <$MTPingDate$></p>
</MTPings>

訂正線を引いた部分を削除する。これで「from everyday-albiday」のように表示されるようになる。
ただし、少なくとも4月6日以前のデータでは<$MTPingBlogName$>は空欄になっている。件数も少なかったので、古いPingデータはMySQLのデータを直接書き換えて対応してみた。



« 前のページ次のページ »

  •  

    ブログパーツの貼り付け方はこちらへ
  • 月別アーカイブ

  • あいさつ掲示板

  • メタ情報