MTのアップデート、すっかり放置気味だなぁ。
リリース時期に時間を取られる作業が立て込んでいたので後回しにしたのだけど、なんとなくタイミングを逃した感じ。
2006年09月05日
[ MovableType ] アップデート
2005年11月13日
[ MovableType ] 3.2にアップグレード
遅ればせながらMTを3.2にアップグレードしてみた。
リリース直後にアップグレードせずに放置してしまっていたのだが、そのうちにRelease-2が出たので、結果として手間が省けた...という事にしておこう。
2005年11月12日
[ MovableType ] MySQLテーブルの最適化
自宅サーバの強みで設定を好きにいじれるので、使用するメモリ量などを増やしてみたりはしたのだが、いまいち体感するほど効果がでていない。
搭載メモリが小さいので思い切った設定ができないせいだろう。
仕方が無い。地道にコツコツと性能を稼ぐしかなさそうだ。
なので、まずはDBテーブルの最適化から。
インデックスの最適化は
myisamchk -r /DBの格納パス/*.MYIでいけるのだが、これだけではイマイチ実感が得られない。
MySQLのリファレンスマニュアルによると、myisamchkの-Rオプションを使用すると
インデックスに従ってレコードをソートする。このソートにより、データが整理され、このインデックスでの SELECT や ORDER BY の処理速度が速くなるということなので、手元環境のMT用DBディレクトリ内に存在した以下のテーブルにこれを試してみた。
mt_author, mt_blog, mt_category, mt_comment, mt_entry, mt_fileinfo, mt_ipbanlist, mt_log, mt_notification, mt_permission, mt_placement, mt_plugindata, mt_session, mt_tbping, mt_template, mt_templatemap, mt_trackback
行った手順は以下の通り。もっとスマートなやり方があると思うが、そこは気にしない方向で。
- Apacheを停止
作業中にコメントやトラックバックを送られても困るので、念のため停止してみた。 - MySQLを停止
これは当然。 - myisamchkを実行
こんな感じ/usr/local/bin/myisamchk -R 1 /MT用DBディレクトリ/mt_author
で、全テーブルを処理。
指定するインデックスは1(PRIMARY)で良いと思う。 - MySQLを起動
- Apacheを起動
ベンチマークを取っていないので具体的な効果を数値化できないが、なんとなく早くなった気はする。
2005年09月30日
[ MovableType ] Movable Type 3.2 日本語版
ベータ期間が短かった気がしないでもないが、それだけ成熟しているという事なのか。
Movable Type 3.2 日本語版の提供を開始
今版のウリは「SPAMフィルター」らしいが....
早速ダウンロードしてみたが、ディレクトリ構成が微妙に変わってる...
mt-static/docs/mtmanual_upgrade.htmlを見てみると、定義ファイルも今版から変更になるようだ。
(mt-static/docs/mtupgrade.htmlの内容は古いようなので、注意)
うーん。
ちょっとためらうなぁ。
週末にでも時間を作ってゆっくり作業することにして、今日は見送りにする。
2005年09月11日
[ MovableType ] Movable Type 3.2日本語版の公開ベータテストを開始
2005年09月06日
[ MovableType ] mod_perl化...かな
同じサーバ上で動かしてるヨメのMTの再構築がえらく重い。
エントリ数がやたら多いせいだとは思うが、これではあまりにも可哀想なので高速化してやりたい。
手っ取り早く効果を出すとしたら...mod_perlかなぁ。
と思ってgoogleってみると、Apache2+mod_perl2では動かない、みたいな記事しか見つからない。
記事が古いことに期待して試行錯誤してみたが、先達と同じ道を歩んだだけっぽい。
ここで思い立って本家のマニュアルを見てみると...
Run Movable Type under mod_perl 1.x.なんて書いてある。
最新の3.2のマニュアルに入れ替わってない...なんてことはないだろうし、現状では諦めるしかなさそうだ。
さて、どうしようかな。
DAVとか、Apache2向きのことは何もしてないので、1.3に切り替えるというのも手だが。
すこし考えてみることにする。
2005年06月11日
[ MovableType ] コメントスパム
おや、何かコメントが...と思ったら、内容にまったく関係ない英文が。
これがコメントスパムってやつですか。
ちょっと嬉しかったり。
...だって、コメントスパムとかトラバスパムへの対策ってよく見るってことは、結構来るってことでしょ。
なのに、1つも来ないので寂しかったのよ。
手で削除したけど、数が増えたら対策を考ることにしますか。
2005年06月06日
[ MovableType ] Movable Type 3.17日本語版を6月9日に提供開始
なんだそうだけど、3.16飛んじゃうのね。
第三者による不正アクセスの件は、どう対処されてるのか修正履歴からは分からなかった。
入れてみるしか無いってことか。
2005年05月13日
[ MovableType ] MTに第三者による不正アクセスを許す危険性
とは言っても、
本件は、Movable Type の運用環境を整備することで、第三者による不正アクセスの危険性をかなり軽減することができます。などと書いてあって、かなり、というトコが泣かせるわけですが、早速公開された対策に目を通してみました。
- 盗聴によるパスワードやCookieの漏洩からの不正アクセスを防止する(1)
- 盗聴によるパスワードやCookieの漏洩からの不正アクセスを防止する(2)
- Atom APIを利用した投稿を安全に行うために
- XML-RPCを利用した投稿を安全に行うために
対策させる気が有るのでしょうか。
2005年05月11日
[ MovableType ] AWStats
Apacheのアクセスログ解析のため、AWStatsを導入してみる。
選択理由は....特に無い。
以下、導入メモ。
とりあえず動かすところまで。
- portsからインストール。
portinstall www/awstats
- 公開ディレクトリ(DocumentRoot)が /usr/local/www/ で無い場合は、AWStatsのディレクトリを公開ディレクトリ配下に配置。
mv /usr/local/www/awstats (配置先)
- インストール時に表示されたメッセージに従い、Apacheの定義ファイルhttpd.confに以下を追加。
公開ディレクトリ(DocumentRoot)が /usr/local/www/ で無い場合は、以下の /usr/local/www/ を、上で配置したディレクトリに書き換える。
(メッセージを見落とした場合は、/usr/ports/www/awstats/pkg-messageを参照する)#
# Directives to allow use of AWStats as a CGI
#
Alias /awstatsclasses "/usr/local/www/awstats/classes/"
Alias /awstatscss "/usr/local/www/awstats/css/"
Alias /awstatsicons "/usr/local/www/awstats/icons/"
ScriptAlias /awstats/ "/usr/local/www/awstats/cgi-bin/"
#
# This is to permit URL access to scripts/files in AWStats directory.
#
<Directory "/usr/local/www/awstats/">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>
- AWStatsの定義ファイルを作成する。
サンプルファイルである awstats.model.conf が、なぜかawstatsディレクトリ配下のcgi-bin配下に置かれているので、コピーする。
# 有りそうな場所を探し回ってしまった ^^;
ここではVirtualHostを考慮しないことにし、デフォルトの定義ファイル名である awstats.conf とする。 - awstats.confを編集する。
■運用するための最低限の設定- 対象のアクセスログの指定
デフォルト)
LogFile="/var/log/httpd/mylog.log"
変更例)LogFile="/var/log/httpd-access.log"
- 自サイトのドメインの指定
デフォルト)
SiteDomain=""
変更例)
SiteDomain="kobito.dnsalias.com"
■環境に依存 - 対象のアクセスログの指定
- インデックスファイルのファイル名
httpd.confの DirectoryIndex に index.html 以外を指定している場合に編集する。
デフォルト)
DefaultFile="index.html"
編集例)DefaultFile="index.php index.html"
- 解析対象から除外するホスト
内部からのアクセスは、アクセス解析の趣旨的にはノイズとなるため、除外する。
デフォルト)
SkipHosts=""
編集例)SkipHosts="127.0.0.1 localhost REGEX[^192\.168\.] REGEX[^.*\.local$]"
- 解析対象から除外するファイル
ブラウザが勝手に行うfavicon.icoへのアクセスや、クロウラーのrobots.txtへのアクセスのカウントは、ノイズとなるため、除外する。
デフォルト)
SkipFiles=""
編集例)SkipFiles="robots\.txt favicon\.ico"
- 解析結果ファイルの出力先
デフォルトではスクリプトと同じディレクトリに解析結果ファイルを出力してしまうので、分けてみる。
デフォルト)
DirData="."
編集例)DirData="../data"
- HostAliases の REGEX[myserver\.com$] の部分
デフォルト)
HostAliases="localhost 127.0.0.1 REGEX[myserver\.com$]"
編集例)HostAliases="localhost 127.0.0.1 REGEX[kobito\.dnsalias\.com$]"
- AWStatsを実行し、解析してみる。
cd awstats/cgi-bin
./awstats.pl -update -config=awstats.conf
2005年05月10日
[ MovableType ] 先人に学ぶ〜カテゴリの表示順を任意に設定する〜
カテゴリの表示順が文字コード順になってしまい面白くないので、任意の順序に並びかえる。
参考にしたのはウェブログ(blog) 活用フォーラムさんのカテゴリーを自分の並べたい順番にする
- カテゴリ名を変更する。
カテゴリ名の前に数字を付け、表示順序を決定する。- メイン・メニュー > (BLOG名) > カテゴリ を開く。
- カテゴリを選択する。
- 「カテゴリーのタイトル」を編集し、数字付きに変更する。
例)日記 → 001-nikki
- 「カテゴリーの説明」に、表示したいカテゴリ名を入力する。
- 「保存」ボタンを押す。
- テンプレートを変更する。
全てのテンプレート中の <MTCategoryLabel> を <$MTCategoryDescription$> に変更する。- メイン・メニュー > (BLOG名) > テンプレート を開く。
- 「メインページ」など <MTCategoryLabel> を使用するテンプレートを編集する。
- 再構築する。
2005年05月07日
[ MovableType ] エントリを部分的に折りたたむ(v0.3)
エントリを部分的に折りたたむのスクリプトを微改造。
折りたたみ範囲が大きい場合に、一旦表示されてしまうのが気になったので、StyleSheet側の編集との合わせ技で制御する。
-
折りたたみ制御用のclassを初期状態で非表示にするため、スタイルシートに以下を追加。
.TextCollapse { display: none; }
- 以下のJavaScriptをサーバに配置。
textcollapse-0.3.js
設置方法などは改造前と同じ。
2005年05月06日
[ MovableType ] 見かけをいじってみた
見かけはデフォルトのままでも良いかなとも思っていたけど、ふと思い立っていじってみることに。
小粋空間さんのこのページのテンプレートが、「MTで3カラムといえば」みたいな感じだったので試してみたけど、StyleSheetがMTデフォルトとはかなり違ってて後々のメンテに不安を感じた(*)ので、元に戻してやり直してみた。
取りあえずはメインページだけだけど、ページのモジュール化も込みで少しずついじっていくつもり。
(*)好みと考え方の問題。MTのバージョンアップへの追従とか、カスタマイズ系の記事がMTのデフォルトを前提にしている事とかを考えると、「MTだけに追従する」か「MTと小粋空間さんの両方に追従する」か「小粋空間さんだけに追従する」では、「MTだけに追従する」方が自分的にラクそうに思える。
2005年04月28日
[ MovableType ] 先人に学ぶ~カレンダーを月めくりに~
仕方が無いのでPHPかJavaScriptで何とか...と思ったら、きままにポロポロさんが参考にしたdiving to ...さんがAjax版を用意されていた。
らっきー、ということで手を合わせて「頂きます」。
以下、設置メモ。
- 月別のアーカイブテンプレートを作成。
カレンダー部の実ファイルになるテンプレートを作成する。
[手順]
- メイン・メニュー > (BLOG名) > テンプレート を開く。
- 「新しいアーカイブ・テンプレートを作る」をクリック。
- 「テンプレートの名前」は参照元に習って"AjaxCalendar"と入力。
- 「このテンプレートにリンクするファイル」は空欄のまま。
- 「テンプレートの中身」はは以下を記述。
ただし、カレンダーからのリンク先を日別のアーカイブにするなど、カレンダー部分のテンプレートを編集している場合は、同様の修正を行うこと。
<table summary="投稿されたエントリーへのリンク付き月間カレンダー">
<caption>
<MTArchivePrevious>
<a href="#" onclick="calendarInit('<MTArchiveDate format="%Y">',
'<MTArchiveDate format="%m">');">«</a>
</MTArchivePrevious>
<$MTArchiveDate format="%Y / %m"$>
<MTArchiveNext>
<a href="#" onclick="calendarInit('<MTArchiveDate format="%Y">',
'<MTArchiveDate format="%m">');">»</a>
</MTArchiveNext>
</caption>
<tr>
<th abbr="日曜日">S</th>
<th abbr="月曜日">M</th>
<th abbr="火曜日">T</th>
<th abbr="水曜日">W</th>
<th abbr="木曜日">T</th>
<th abbr="金曜日">F</th>
<th abbr="土曜日">S</th>
</tr>
<MTCalendar month="this">
<MTCalendarWeekHeader><tr></MTCalendarWeekHeader>
<td><MTCalendarIfEntries><MTEntries lastn="1"><a href="<$MTEntryLink archive_type="Daily"$>"><$MTCalendarDay$></a></MTEntries></MTCalendarIfEntries><MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries><MTCalendarIfBlank> </MTCalendarIfBlank></td><MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
</MTCalendar>
</table>
- 作成したテンプレートをアーカイブに関連付ける。
[手順]
- メイン・メニュー > (BLOG名) > 設定 > アーカイブ を開く。
- 「新しく、テンプレートとアーカイブを関連付ける。」の「アーカイブの種類」に"月別"を選択。
- 同じく「テンプレート」に"AjaxCalendar"を選択。
- 「追加」ボタンを押す。
- 上で関連付けしたアーカイブとして出力されるカレンダーモジュールの出力先・ファイル名を指定する。
参照元の説明にはこの手順がないので、(デフォルトで作成される)月ごとのアーカイブファイルとして作成してしまう。
従来の月ごとのアーカイブが不要であればこの手順は飛ばしても良い。
[手順]
- メイン・メニュー > (BLOG名) > 設定 > アーカイブ を開く。
- 「アーカイブ」の"AjaxCalendar"テンプレートの「アーカイブ・ファイルのテンプレート」に任意の出力先・ファイル名を指定。
例)archiveディレクトリ配下の年月のパスにファイル名を"calendar.html"として出力する場合
<$MTArchiveDate format="%Y/%m/"$>calendar.html
- 「変更を保存」ボタンを押す。
- カレンダーを操作するJavaScriptファイルを配置する。
ここでは、MovableTypeのインストール先(WebからはWeblogのトップに見えるディレクトリ)に"ajaxcalendar2.js"として配置することにする。
[手順]
- 以下のJavaScriptの"xmlHttp.open"で対象にしているカレンダーモジュールの入力元を、上で指定したカレンダーモジュールの出力先・ファイル名に編集する。
例)archiveディレクトリ配下の年月のパスにファイル名を"calendar.html"として出力するようにした場合
xmlHttp.open('GET', "/mt/archives/" + year + "_" + month + ".html");
を
xmlHttp.open('GET', "/mt/archives/" + year + "/" + month + "calendar.html"
function showCalendar(xmlHttp) {
return function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
if (xmlHttp.responseText) {
var calendarElement = document.getElementById('calendar')
calendarElement.innerHTML = xmlHttp.responseText;
} else {
alert("failed");
}
}
}
}
function calendarInit(year, month)
{
var xmlHttp = getXmlHttpObject();
xmlHttp.onreadystatechange = new showCalendar(xmlHttp);
xmlHttp.open('GET', "/mt/archives/" + year + "_" + month + ".html");
xmlHttp.send(null);
return false;
}
function getXmlHttpObject() {
var xmlhttp;
/*@cc_on
@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
@else
xmlhttp = false;
@end @*/
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try {
xmlhttp = new XMLHttpRequest();
// xmlhttp.overrideMimeType("text/xml");
} catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
- 編集したJavaScriptを"ajaxcalendar2.js"として、FTPするなりして配置する。ファイルのパーミッションはWebサーバが触れれば良い(実行権は不要)。
- 以下のJavaScriptの"xmlHttp.open"で対象にしているカレンダーモジュールの入力元を、上で指定したカレンダーモジュールの出力先・ファイル名に編集する。
- カレンダーを表示するテンプレートを、月めくり対応に編集する。
[手順]
- メイン・メニュー > (BLOG名) > テンプレート を開く。
- 「メインページ」など、カレンダーを表示したい全てのテンプレートのHTMLのヘッダ部分に以下を追加。
<script type="text/javascript" src="<$MTBlogURL$>ajaxcalendar2.js"></script>
上記例はJavaScriptファイルの入力元としてMovableTypeのインストール先を絶対指定しているので、必要に応じて上記の"<$MTBlogURL$>"をJavaScriptファイルの配置位置に変更する。 - 上で対象にしたカレンダーを表示したい全てのテンプレートの<body>タグを以下に変更。
<body onload="calendarInit('<$MTDate format="%Y"$>', '<$MTDate format="%m"$>');">
すでにbodyタグにonloadを指定している場合は、HTMLのヘッダ部分に以下に追加し、bodyタグのonloadを削除する。<script language="JavaScript">
window.onload=WindowOnLoadHandler;
function WindowOnLoadHandler() {
(もともとonloadで呼び出していた処理)
calendarInit('<$MTDate format="%Y"$>', '<$MTDate format="%m"$>
}
</script>
- 上で対象にしたカレンダーを表示したい全てのテンプレートのカレンダーを表示したい部分を、以下の例のように<div id="calendar">タグと</div>タグでくくる。
なお、「メインページ」テンプレートのカレンダー部分は、デフォルトで<div id="calendar">でくくられているようなので、既にそうなっていたらこの手順は飛ばす。
また、ここで紹介する方法に対応していないブラウザのために、もともとあるカレンダー部分は削除せず残しておく。
<div id="calendar">
(カレンダー部分)
</div>
- 再構築する。
[ MovableType ] エントリを部分的に折りたたむ(v0.2)
エントリを部分的に折りたたむのスクリプトを微改造。
[隠す][表示する]のラベルを個別に指定できるようにしてみた。
デフォルトではこう。
サンプルを兼ねて。
//
// 記事の折りたたみを制御する
// textcollapse.js ver 0.2
//// 折りたたみ対象部分のコンテナになるtag
// 注)'div'以外で動作するかは未検証
gTextCollapseTagName = 'div';
// 折りたたみ対象部分のclass名
gTextCollapseClassName = 'TextCollapse';
// 折りたたみを切替えるスイッチのテキストを指定するAttribute名
gTextCollapseExpandAttrName = 'tcExpandLabel';
gTextCollapseCollapseAttrName = 'tcCollapseLabel';
// 折りたたみを切替えるスイッチ(ラベル)部のclass名
gTextCollapseSw1ClassName = 'TextCollapseLabel'; // 上部
gTextCollapseSw2ClassName = 'TextCollapseLabel'; // 下部
// 折りたたみを切替えるスイッチ(ラベル)部のid名のプレフィックス
gTextCollapseSw1IdPrefix = 'TextCollapseSW1'; // 上部
gTextCollapseSw2IdPrefix = 'TextCollapseSW2'; // 下部
// 折りたたみ部のclass名
gTextCollapseBodyClassName = 'TextCollapseBody';
// 折りたたみ部のid名のプレフィックス
gTextCollapseBodyIdPrefix = 'TextCollapseBody';
// 折りたたみを切替えるスイッチ(ラベル)の表示位置
// 0:上部のみ 1:下部のみ 2:上部下部両方
gTextCollapseSwPosition = 2;
// 折りたたみを切替えるスイッチのデフォルトのテキスト
gTextCollapseExpand = '[詳細を表示]';
gTextCollapseCollapse = '[詳細を隠す]';
//--------------------------------------
// 展開リンク組み立て
//--------------------------------------
function makeTextExpandLink( aIdNum, aLabel )
{
var lnkText = ( ( aLabel ) ? aLabel : gTextCollapseExpand );return ( '<a href="#' + lnkText + '" ' +
'onclick="return( SwitchTextCollapse(' + aIdNum + ') );" ' +
'onkeypress="return( SwitchTextCollapse(' + aIdNum + ') );">' +
lnkText + '</a></span>' );
}//--------------------------------------
// 折りたたみリンク組み立て
//--------------------------------------
function makeTextCollapseLink( aIdNum, aLabel )
{
var lnkText = ( ( aLabel ) ? aLabel : gTextCollapseCollapse );return ( '<a href="#' + lnkText + '" ' +
'onclick="return( SwitchTextCollapse(' + aIdNum + ') );" ' +
'onkeypress="return( SwitchTextCollapse(' + aIdNum + ') );">' +
lnkText + '</a></span>' );
}//--------------------------------------
// 折りたたみの初期化
//--------------------------------------
function initTextCollapse()
{
var tagObjs = this.document.getElementsByTagName( gTextCollapseTagName );
var sw1Text = ''
var sw2Text = ''
var sw1Link = ''
var sw2Link = ''
var sw1Label = ''
var sw2Label = ''
var bdyText = ''for ( var i = 0; i < tagObjs.length; i++ )
{
if ( tagObjs[i].className == gTextCollapseClassName )
{
bdyText = tagObjs[i].innerHTML;
bdyText = bdyText.replace(/^<br>/ig, '' );
bdyText = bdyText.replace(/\r\n$/ig, '' );
bdyText = bdyText.replace(/\r$/ig, '' );
bdyText = bdyText.replace(/\n$/ig, '' );
bdyText = bdyText.replace(/<br>$/ig, '' );sw1Label = tagObjs[i].getAttribute(gTextCollapseExpandAttrName);
sw2Label = tagObjs[i].getAttribute(gTextCollapseCollapseAttrName);sw1Link = makeTextExpandLink ( i, sw1Label );
sw1Text = '<span id="' + gTextCollapseSw1IdPrefix + i + '" ' + 'class="' + gTextCollapseSw1ClassName + '"';
if ( sw1Label )
{
sw1Text += ' ' + gTextCollapseExpandAttrName + '="' + sw1Label + '"';
}
if ( sw2Label )
{
sw1Text += ' ' + gTextCollapseCollapseAttrName + '="' + sw2Label + '"';
}sw1Text += '>' + sw1Link + '</span>';
if ( gTextCollapseSwPosition > 0 )
{
sw2Link = makeTextCollapseLink ( i, sw2Label );sw2Text = '<span id="' + gTextCollapseSw2IdPrefix + i + '" ' + 'class="' + gTextCollapseSw2ClassName + '"';
if ( sw2Label )
{
sw2Text += ' ' + gTextCollapseCollapseAttrName + '="' + sw2Label + '"';
}sw2Text += '>' + sw2Link + '</span>';
}tagObjs[i].innerHTML = sw1Text +
'<div id="' + gTextCollapseBodyIdPrefix + i + '" ' +
'class="' + gTextCollapseBodyClassName + '">' +
bdyText + '</div>' + sw2Text;document.getElementById( gTextCollapseBodyIdPrefix + i ).style.display = "none";
if ( gTextCollapseSwPosition > 0 )
{
document.getElementById( gTextCollapseSw2IdPrefix + i ).style.display = "none";
}
}
}
}//--------------------------------------
// 折りたたみ/展開の切替え
//--------------------------------------
function SwitchTextCollapse( idNum )
{
var objSW1 = document.getElementById( gTextCollapseSw1IdPrefix + idNum );
var objSW2 = document.getElementById( gTextCollapseSw2IdPrefix + idNum );
var objBody = document.getElementById( gTextCollapseBodyIdPrefix + idNum );if ( objBody )
{
if ( objBody.style.display == 'none' )
{
if ( objSW1 )
{
if ( gTextCollapseSwPosition == 1 )
{
objSW1.style.display = "none";
}
else
{
objSW1.innerHTML = makeTextCollapseLink ( idNum,
objSW1.getAttribute(gTextCollapseCollapseAttrName) );
}
}objBody.style.display = "block";
if ( objSW2 )
{
objSW2.style.display = "block";
}
}
else
{
if ( objSW1 )
{
if ( gTextCollapseSwPosition == 1 )
{
objSW1.style.display = "block";
}
else
{
objSW1.innerHTML = makeTextExpandLink ( idNum,
objSW1.getAttribute(gTextCollapseExpandAttrName) );
}
}objBody.style.display = "none";
if ( objSW2 )
{
objSW2.style.display = "none";
}
}
}return false;
}
設置方法などは改造前と同じ。
2005年04月26日
[ MovableType ] 先人に学ぶ~タイトルの横にカテゴリを表示する~
タイトルの横にカテゴリを表示する。
参考にしたのは、CHEEBOWさんのTechnow Weblogのタイトルの横にカテゴリを表示する。
<$MTEntryTitle$>下記のように修正する。
<$MTEntryTitle$>[ <MTEntryCategories glue=", "><$MTCategoryLabel$></MTEntryCategories> ]
2005年04月19日
[ MovableType ] 先人に学ぶ~カレンダーからのリンク先を日別のアーカイブにする~
同じ日に複数のエントリを投稿した場合、カレンダーのリンクからではまとめて見ることが出来ないので、日別のアーカイブを生成するようにする。
参考にしたのは、CHEEBOWさんのTechnow Weblogのカレンダーからのリンク先を日別のアーカイブにする。
- ウェブログの設定->アーカイブの設定と辿り、「日別」の横のチェックボックスをチェックし、一旦「変更を保存」する。
- メインページのテンプレートを編集し、カレンダー部分にある以下を
<a href="<$MTEntryPermalink$>"><$MTCalendarDay$></a>
下記のように修正する。<a href="<$MTEntryLink archive_type="Daily"$>"><$MTCalendarDay$></a>
- すべてを再構築する。
投稿者 Kobito : 10:34
2005年03月09日
[ MovableType ] エントリを部分的に折りたたむ
エントリの追記部分を折りたたむ(デフォルト非表示)方法はあちこちで見たけど、部分的に折りたたむ常套手段は見つけられなかったので作ってみた。
MovableTypeの固有タグで出来ないか試行錯誤した結果、上手く実現できなかったのでJavaScriptで実装。
実装した後でJUGEMカスタマイズ講座さんが「記事の内容」の一部を隠すで同様のScriptを紹介されているのを見つけてしまい、..."MovableType"を検索ワードに入れてなければ自前で実装する前に見つけられたかも...検索が下手なだけで実は方法があるんじゃ...などとブルーになったのは内緒。
「記事の内容」の一部を隠すのScriptにあった「隠す(折りたたむ)リンク位置をカスタマイズ可能にする」ことに考えが及んでなくて、感心しつつ自作Scriptにも実装しちゃったのも内緒。
落ち込んでみても仕方ないし、せっかく作ったものを捨てるのもアレなので、記録の意味もこめて書き込んでおくことにする。
やりたいこと(記事の部分的な折りたたみ)ははっきりしてるので、要件として(あんまり時間はかけてないけど)考えたのは以下の2点。
- 折りたたみ部分の見栄えを他とは変更できるようにしたい
divを折りたたみ部のコンテナとして使用すれば、CSSで制御できて楽。 - エントリ書き込み時に、なるべく手間を掛けたくない
JavaScriptで要素を操作する場合、一意のidが必要だったりするが、トップページやアーカイブページのように同ページ内に複数のエントリが並ぶことを考慮すると「エントリを書き込む際に自力でidを付ける」というのは現実的では無いし、なにより面倒。
ということで、エントリ書き込み時は以下のように折りたたみたい部分を「折りたたみ部」を示すクラス"TextCollapse"を指定したdivでくくるだけにして、面倒なid付けや折りたたみを制御するスイッチはScript任せに出来るようにした。
<div class="TextCollapse">
折りたたみたい部分
</div>
JavaScriptソース。
//
// 記事の折りたたみを制御する
// textcollapse.js ver 0.1
//// 折りたたみ対象部分のコンテナになるtag
// 注)'div'以外で動作するかは未検証
gTextCollapseTagName = 'div';
// 折りたたみ対象部分のclass名
gTextCollapseClassName = 'TextCollapse';
// 折りたたみを切替えるスイッチ(ラベル)部のclass名
gTextCollapseSw1ClassName = 'TextCollapseLabel'; // 上部
gTextCollapseSw2ClassName = 'TextCollapseLabel'; // 下部
// 折りたたみを切替えるスイッチ(ラベル)部のid名のプレフィックス
gTextCollapseSw1IdPrefix = 'TextCollapseSW1'; // 上部
gTextCollapseSw2IdPrefix = 'TextCollapseSW2'; // 下部
// 折りたたみ部のclass名
gTextCollapseBodyClassName = 'TextCollapseBody';
// 折りたたみ部のid名のプレフィックス
gTextCollapseBodyIdPrefix = 'TextCollapseBody';
// 折りたたみを切替えるスイッチ(ラベル)の表示位置
// 0:上部のみ 1:下部のみ 2:上部下部両方
gTextCollapseSwPosition = 2;
// 折りたたみを切替えるスイッチのテキスト
gTextCollapseExpand = '[詳細を表示]';
gTextCollapseCollapse = '[詳細を隠す]';
//--------------------------------------
// 展開リンク組み立て
//--------------------------------------
function makeTextExpandLink( idNum )
{
return ( '<a href="' + gTextCollapseExpand + '" ' +
'onclick="return( SwitchTextCollapse(' + idNum + ') );" ' +
'onkeypress="return( SwitchTextCollapse(' + idNum + ') );">' +
gTextCollapseExpand + '</a></span>' );
}//--------------------------------------
// 折りたたみリンク組み立て
//--------------------------------------
function makeTextCollapseLink( idNum )
{
return ( '<a href="' + gTextCollapseCollapse + '" ' +
'onclick="return( SwitchTextCollapse(' + idNum + ') );" ' +
'onkeypress="return( SwitchTextCollapse(' + idNum + ') );">' +
gTextCollapseCollapse + '</a></span>' );
}//--------------------------------------
// 折りたたみの初期化
//--------------------------------------
function initTextCollapse()
{
var tagObjs = this.document.getElementsByTagName( gTextCollapseTagName );
var sw1Text = ''
var sw2Text = ''
var bdyText = ''for ( var i = 0; i < tagObjs.length; i++ )
{
if ( tagObjs[i].className == gTextCollapseClassName )
{
bdyText = tagObjs[i].innerHTML.replace(/^<br>/ig, '' );
bdyText = bdyText.replace(/^<br \/>/ig, '' );
bdyText = bdyText.replace(/\r\n$/ig, '' );
bdyText = bdyText.replace(/\r$/ig, '' );
bdyText = bdyText.replace(/\n$/ig, '' );
bdyText = bdyText.replace(/<br>$/ig, '' );
bdyText = bdyText.replace(/<br \/>$/ig, '' );sw1Text = '<span id="' + gTextCollapseSw1IdPrefix + i + '" ' +
'class="' + gTextCollapseSw1ClassName + '">' +
makeTextExpandLink ( i ) + '</span>';if ( gTextCollapseSwPosition > 0 )
{
sw2Text = '<span id="' + gTextCollapseSw2IdPrefix + i + '" ' +
'class="' + gTextCollapseSw2ClassName + '">' +
makeTextCollapseLink ( i ) + '</span>';
}tagObjs[i].innerHTML = sw1Text +
'<div id="' + gTextCollapseBodyIdPrefix + i + '" ' +
'class="' + gTextCollapseBodyClassName + '">' +
bdyText + '</div>' + sw2Text;document.getElementById( gTextCollapseBodyIdPrefix + i ).style.display = "none";
if ( gTextCollapseSwPosition > 0 )
{
document.getElementById( gTextCollapseSw2IdPrefix + i ).style.display = "none";
}
}
}
}//--------------------------------------
// 折りたたみ/展開の切替え
//--------------------------------------
function SwitchTextCollapse( idNum )
{
var objSW1 = document.getElementById( gTextCollapseSw1IdPrefix + idNum );
var objSW2 = document.getElementById( gTextCollapseSw2IdPrefix + idNum );
var objBody = document.getElementById( gTextCollapseBodyIdPrefix + idNum );if ( objBody )
{
if ( objBody.style.display == 'none' )
{
if ( objSW1 )
{
if ( gTextCollapseSwPosition == 1 )
{
objSW1.style.display = "none";
}
else
{
objSW1.innerHTML = makeTextCollapseLink ( idNum );
}
}objBody.style.display = "block";
if ( objSW2 )
{
objSW2.style.display = "block";
}
}
else
{
if ( objSW1 )
{
if ( gTextCollapseSwPosition == 1 )
{
objSW1.style.display = "block";
}
else
{
objSW1.innerHTML = makeTextExpandLink ( idNum );
}
}objBody.style.display = "none";
if ( objSW2 )
{
objSW2.style.display = "none";
}
}
}return false;
}
設置手順。
- 上記JavaScriptを"textcollapse.js"として、サーバのMovableTypeディレクトリにアップする。
- テンプレートを編集し、折りたたみを有効にする。
対象のテンプレートは以下など、<$MTEntryBody$>を含むもの。
メイン・メニュー > (BLOG名) > テンプレート > メインページ
メイン・メニュー > (BLOG名) > テンプレート > アーカイブページ
メイン・メニュー > (BLOG名) > テンプレート > 日付アーカイブ
- テンプレートのHTMLヘッダ部分(<head>~</head>の間)に以下を挿入。
<script type="text/javascript" language="JavaScript" src="<$MTBlogURL$>textcollapse.js"></script>
- テンプレートの末尾あたり(エントリよりも確実に下になる部分)に以下を挿入。
<script type="text/javascript">
<!--
initTextCollapse();
// -->
</script>
- テンプレートのHTMLヘッダ部分(<head>~</head>の間)に以下を挿入。
IE6とFirefox1.0(Windows)では取りあえず動作しているが、NS4.x系やOpera、Mac上のブラウザでの動作は未確認。
2005/04/29追記
このページで、このスクリプトを更新しています。
2005年03月08日
[ MovableType ] 先人に学ぶ~Permalinkの形式を日時に変更する~
MovableTypeは、各エントリのリンク先URLをデフォルトではエントリ番号とするらしい。
特にサイトを移転する予定は無いが、エントリデータの移出入でリンクが切れるのは望ましくないので、Permalinkの形式を変更する。
参考にしたのは、ChitatopopsさんのPermalinkを変更
メイン・メニュー > (BLOG名) > 設定 > アーカイブ
「アーカイブ」の"個別エントリーアーカイブ"テンプレートの「アーカイブ・ファイルのテンプレート」に以下を指定。
<$MTArchiveDate format="%Y/%m/%d_%H%M%S"$>.php
[ MovableType ] 先人に学ぶ~個別エントリ本文のモジュール化~
特に再構築などが軽くなるわけでは無さそうだけど、HDDの有効利用のためにエントリの本文をモジュール化してみる。
参考にしたのは、Boycott Street 221Bさんのリビルドなんて怖くない
個別エントリモジュール用のテンプレートを作成する。
- メイン・メニュー > (BLOG名) > テンプレート を開く。
- 「新しいアーカイブ・テンプレートを作る」をクリック。
- 「テンプレートの名前」に"Entry Body"と入力。
- 「このテンプレートにリンクするファイル」は空欄のまま。
- 「テンプレートの中身」はは以下のみを記述。
<$MTEntryBody$>
- 「保存」ボタンを押す。
作成したテンプレートをアーカイブに関連付ける。
- メイン・メニュー > (BLOG名) > 設定 > アーカイブ を開く。
- 「新しく、テンプレートとアーカイブを関連付ける。」の「アーカイブの種類」に"個別"を選択。
- 同じく「テンプレート」に"Entry Body"を選択。
- 「追加」ボタンを押す。
個別エントリモジュールファイルの出力先・ファイル名を指定する。
- メイン・メニュー > (BLOG名) > 設定 > アーカイブ を開く。
- 「アーカイブ」の"Entry Body"テンプレートの「アーカイブ・ファイルのテンプレート」に任意の出力先・ファイル名を指定。 例)年月のパスに日時分秒のファイル名とする場合
- 同じく「テンプレート」に"Entry Body"を選択。
- 「変更を保存」ボタンを押す。
<$MTArchiveDate format="%Y/%m/parts/%d_%H%M%S"$>_body.php
既存のテンプレートを、個別エントリモジュールファイルを読み込むように編集する。
- メイン・メニュー > (BLOG名) > テンプレート を開く。
- 「個別エントリーアーカイブ」「カテゴリー・アーカイブ」「日付アーカイブ」「メインページ」など、<$MTEntryBody$>を使用している全てのテンプレートの、<$MTEntryBody$>部分を以下に置き換える。
<? include"/userID/public_html/module/archive/<$MTArchiveDate format="%Y/%m/parts/%d_%H%M%S"$>_body.php";?>
上記のincludeを「MovableTypeの/archive/のパス」および先に指定した「個別エントリモジュールファイルの出力先・ファイル名」とすることで、該当するファイルがPHPにより読み込まれる。 - すべてを再構築する。
[ MovableType ] 先人に学ぶ~PHP化~
MTPagenateプラグインを使用するためにはPHP化が前提、との事なのでPHP化。
参考にしたのは、Zakimi::Blogさんの Movable TypeのPHP化
要は「MovableTypeが生成するhtmlファイルの拡張子を.htmlから.phpに変更するだけ」らしい。
- まずは、トップページとアーカイブページをphpに。
[手順]
メイン・メニュー > (BLOG名) > テンプレート を開き、インデックス・テンプレートの「メインページ」と「アーカイブページ」の拡張子を、それぞれphpに変更。 - 続いて、個別エントリもphpに。
[手順]
メイン・メニュー > (BLOG名) > 設定 > 設定 を開き、「アーカイブ・ファイルの拡張子」をphpに変更。 - サイトの再構築を行えば完了。
2005年03月05日
[ MovableType ] MobavleType導入
MovableTypeを運用してみる事にした。
投稿者 Kobito : 02:02



