[ MovableType ] アップデート

MTのアップデート、すっかり放置気味だなぁ。
リリース時期に時間を取られる作業が立て込んでいたので後回しにしたのだけど、なんとなくタイミングを逃した感じ。

投稿者 Kobito : 00:42 | コメント (0) | トラックバック

[ MovableType ] 3.2にアップグレード

遅ればせながらMTを3.2にアップグレードしてみた。

リリース直後にアップグレードせずに放置してしまっていたのだが、そのうちにRelease-2が出たので、結果として手間が省けた...という事にしておこう。

投稿者 Kobito : 03:23 | コメント (0) | トラックバック

[ 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


行った手順は以下の通り。もっとスマートなやり方があると思うが、そこは気にしない方向で。

  1. Apacheを停止
    作業中にコメントやトラックバックを送られても困るので、念のため停止してみた。
  2. MySQLを停止
    これは当然。
  3. myisamchkを実行
    こんな感じ
    /usr/local/bin/myisamchk -R 1 /MT用DBディレクトリ/mt_author
    で、全テーブルを処理。
    指定するインデックスは1(PRIMARY)で良いと思う。
  4. MySQLを起動
  5. Apacheを起動

ベンチマークを取っていないので具体的な効果を数値化できないが、なんとなく早くなった気はする。

投稿者 Kobito : 18:07 | コメント (3) | トラックバック

[ MovableType ] Movable Type 3.2 日本語版

ベータ期間が短かった気がしないでもないが、それだけ成熟しているという事なのか。
Movable Type 3.2 日本語版の提供を開始

今版のウリは「SPAMフィルター」らしいが....

早速ダウンロードしてみたが、ディレクトリ構成が微妙に変わってる...
mt-static/docs/mtmanual_upgrade.htmlを見てみると、定義ファイルも今版から変更になるようだ。
(mt-static/docs/mtupgrade.htmlの内容は古いようなので、注意)

うーん。
ちょっとためらうなぁ。
週末にでも時間を作ってゆっくり作業することにして、今日は見送りにする。

投稿者 Kobito : 01:44 | コメント (0) | トラックバック

[ MovableType ] Movable Type 3.2日本語版の公開ベータテストを開始

ということらしいが、残念ながらヒトバシラしている暇はなさそう。
おとなしく正規版を待ちますか。

投稿者 Kobito : 23:21 | コメント (0) | トラックバック

[ MovableType ] mod_perl化...かな

同じサーバ上で動かしてるヨメのMTの再構築がえらく重い。
エントリ数がやたら多いせいだとは思うが、これではあまりにも可哀想なので高速化してやりたい。
手っ取り早く効果を出すとしたら...mod_perlかなぁ。

と思ってgoogleってみると、Apache2+mod_perl2では動かない、みたいな記事しか見つからない。
記事が古いことに期待して試行錯誤してみたが、先達と同じ道を歩んだだけっぽい。

ここで思い立って本家のマニュアルを見てみると...

Run Movable Type under mod_perl 1.x.
なんて書いてある。
最新の3.2のマニュアルに入れ替わってない...なんてことはないだろうし、現状では諦めるしかなさそうだ。

さて、どうしようかな。
DAVとか、Apache2向きのことは何もしてないので、1.3に切り替えるというのも手だが。
すこし考えてみることにする。

投稿者 Kobito : 01:34 | コメント (0) | トラックバック

[ MovableType ] コメントスパム

おや、何かコメントが...と思ったら、内容にまったく関係ない英文が。
これがコメントスパムってやつですか。
ちょっと嬉しかったり。

...だって、コメントスパムとかトラバスパムへの対策ってよく見るってことは、結構来るってことでしょ。
なのに、1つも来ないので寂しかったのよ。

手で削除したけど、数が増えたら対策を考ることにしますか。

投稿者 Kobito : 13:34 | コメント (0) | トラックバック

[ MovableType ] Movable Type 3.17日本語版を6月9日に提供開始

なんだそうだけど、3.16飛んじゃうのね。

第三者による不正アクセスの件は、どう対処されてるのか修正履歴からは分からなかった。
入れてみるしか無いってことか。

投稿者 Kobito : 02:42 | コメント (0) | トラックバック

[ MovableType ] MTに第三者による不正アクセスを許す危険性

movabletype.jpで、「【重要】 第三者による不正アクセスを許す危険性の対策について」として、脆弱性についての対応法が公開されました。

とは言っても、
本件は、Movable Type の運用環境を整備することで、第三者による不正アクセスの危険性をかなり軽減することができます。
などと書いてあって、かなり、というトコが泣かせるわけですが、早速公開された対策に目を通してみました。 ....よくわかりません。
対策させる気が有るのでしょうか。

投稿者 Kobito : 02:13 | コメント (0) | トラックバック

[ MovableType ] AWStats

Apacheのアクセスログ解析のため、AWStatsを導入してみる。
選択理由は....特に無い。

以下、導入メモ。
とりあえず動かすところまで。

  1. portsからインストール。
    portinstall www/awstats
  2. 公開ディレクトリ(DocumentRoot)が /usr/local/www/ で無い場合は、AWStatsのディレクトリを公開ディレクトリ配下に配置。
    mv /usr/local/www/awstats (配置先)
  3. インストール時に表示されたメッセージに従い、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>
  4. AWStatsの定義ファイルを作成する。
    サンプルファイルである awstats.model.conf が、なぜかawstatsディレクトリ配下のcgi-bin配下に置かれているので、コピーする。
    # 有りそうな場所を探し回ってしまった ^^;
    ここではVirtualHostを考慮しないことにし、デフォルトの定義ファイル名である awstats.conf とする。
  5. awstats.confを編集する。
    ■運用するための最低限の設定
    • 対象のアクセスログの指定
      デフォルト)
      LogFile="/var/log/httpd/mylog.log"
      変更例)
      LogFile="/var/log/httpd-access.log"
    • 自サイトのドメインの指定
      デフォルト)
      SiteDomain=""
    • 変更例)
      SiteDomain="kobito.dnsalias.com"
  6. ■環境に依存
    • インデックスファイルのファイル名
      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$]"
  7. AWStatsを実行し、解析してみる。
    cd awstats/cgi-bin
    ./awstats.pl -update -config=awstats.conf

投稿者 Kobito : 23:03 | コメント (0) | トラックバック

[ MovableType ] 先人に学ぶ〜カテゴリの表示順を任意に設定する〜

カテゴリの表示順が文字コード順になってしまい面白くないので、任意の順序に並びかえる。

参考にしたのはウェブログ(blog) 活用フォーラムさんのカテゴリーを自分の並べたい順番にする

  1. カテゴリ名を変更する。
    カテゴリ名の前に数字を付け、表示順序を決定する。
    1. メイン・メニュー > (BLOG名) > カテゴリ を開く。
    2. カテゴリを選択する。
    3. 「カテゴリーのタイトル」を編集し、数字付きに変更する。
      例)
      日記 → 001-nikki
    4. 「カテゴリーの説明」に、表示したいカテゴリ名を入力する。
    5. 「保存」ボタンを押す。
  2. テンプレートを変更する。
    全てのテンプレート中の <MTCategoryLabel> を <$MTCategoryDescription$> に変更する。
    1. メイン・メニュー > (BLOG名) > テンプレート を開く。
    2. 「メインページ」など <MTCategoryLabel> を使用するテンプレートを編集する。
    加えて、「カテゴリ・アーカイブ」のみ、 <title> タグ内の <$MTArchiveTitle$> も <$MTCategoryDescription$> に変更する。
  3. 再構築する。

投稿者 Kobito : 01:19 | コメント (0) | トラックバック

[ MovableType ] エントリを部分的に折りたたむ(v0.3)

エントリを部分的に折りたたむのスクリプトを微改造。

折りたたみ範囲が大きい場合に、一旦表示されてしまうのが気になったので、StyleSheet側の編集との合わせ技で制御する。

  1. 折りたたみ制御用のclassを初期状態で非表示にするため、スタイルシートに以下を追加。
    .TextCollapse { display: none; }
  2. 以下のJavaScriptをサーバに配置。
    textcollapse-0.3.js

設置方法などは改造前と同じ。

投稿者 Kobito : 21:46 | コメント (1) | トラックバック

[ MovableType ] 見かけをいじってみた

見かけはデフォルトのままでも良いかなとも思っていたけど、ふと思い立っていじってみることに。

小粋空間さんのこのページのテンプレートが、「MTで3カラムといえば」みたいな感じだったので試してみたけど、StyleSheetがMTデフォルトとはかなり違ってて後々のメンテに不安を感じた(*)ので、元に戻してやり直してみた。
取りあえずはメインページだけだけど、ページのモジュール化も込みで少しずついじっていくつもり。

(*)好みと考え方の問題。MTのバージョンアップへの追従とか、カスタマイズ系の記事がMTのデフォルトを前提にしている事とかを考えると、「MTだけに追従する」か「MTと小粋空間さんの両方に追従する」か「小粋空間さんだけに追従する」では、「MTだけに追従する」方が自分的にラクそうに思える。

投稿者 Kobito : 16:26 | コメント (0) | トラックバック

[ MovableType ] 先人に学ぶ~カレンダーを月めくりに~

Googleすると、きままにポロポロさんのこのページがわりと参照されてるっぽいけど、iframeってトコに抵抗が。
仕方が無いのでPHPかJavaScriptで何とか...と思ったら、きままにポロポロさんが参考にしたdiving to ...さんがAjax版を用意されていた。
らっきー、ということで手を合わせて「頂きます」。

以下、設置メモ。

  1. 月別のアーカイブテンプレートを作成。
    カレンダー部の実ファイルになるテンプレートを作成する。

    [手順]
    1. メイン・メニュー > (BLOG名) > テンプレート を開く。
    2. 「新しいアーカイブ・テンプレートを作る」をクリック。
    3. 「テンプレートの名前」は参照元に習って"AjaxCalendar"と入力。
    4. 「このテンプレートにリンクするファイル」は空欄のまま。
    5. 「テンプレートの中身」はは以下を記述。
      ただし、カレンダーからのリンク先を日別のアーカイブにするなど、カレンダー部分のテンプレートを編集している場合は、同様の修正を行うこと。


      <table summary="投稿されたエントリーへのリンク付き月間カレンダー">
      <caption>
      <MTArchivePrevious>
      <a href="#" onclick="calendarInit('<MTArchiveDate format="%Y">',
      '<MTArchiveDate format="%m">');">&laquo;</a>
      </MTArchivePrevious>

      <$MTArchiveDate format="%Y / %m"$>

      <MTArchiveNext>
      <a href="#" onclick="calendarInit('<MTArchiveDate format="%Y">',
      '<MTArchiveDate format="%m">');">&raquo;</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>&nbsp;</MTCalendarIfBlank></td><MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
      </MTCalendar>

      </table>

  2. 作成したテンプレートをアーカイブに関連付ける。

    [手順]
    1. メイン・メニュー > (BLOG名) > 設定 > アーカイブ を開く。
    2. 「新しく、テンプレートとアーカイブを関連付ける。」の「アーカイブの種類」に"月別"を選択。
    3. 同じく「テンプレート」に"AjaxCalendar"を選択。
    4. 「追加」ボタンを押す。

  3. 上で関連付けしたアーカイブとして出力されるカレンダーモジュールの出力先・ファイル名を指定する。
    参照元の説明にはこの手順がないので、(デフォルトで作成される)月ごとのアーカイブファイルとして作成してしまう。
    従来の月ごとのアーカイブが不要であればこの手順は飛ばしても良い。

    [手順]
    1. メイン・メニュー > (BLOG名) > 設定 > アーカイブ を開く。
    2. 「アーカイブ」の"AjaxCalendar"テンプレートの「アーカイブ・ファイルのテンプレート」に任意の出力先・ファイル名を指定。
      例)archiveディレクトリ配下の年月のパスにファイル名を"calendar.html"として出力する場合
      <$MTArchiveDate format="%Y/%m/"$>calendar.html
    3. 「変更を保存」ボタンを押す。

  4. カレンダーを操作するJavaScriptファイルを配置する。
    ここでは、MovableTypeのインストール先(WebからはWeblogのトップに見えるディレクトリ)に"ajaxcalendar2.js"として配置することにする。

    [手順]
    1. 以下の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;
      }


    2. 編集したJavaScriptを"ajaxcalendar2.js"として、FTPするなりして配置する。ファイルのパーミッションはWebサーバが触れれば良い(実行権は不要)。

  5. カレンダーを表示するテンプレートを、月めくり対応に編集する。

    [手順]
    1. メイン・メニュー > (BLOG名) > テンプレート を開く。
    2. 「メインページ」など、カレンダーを表示したい全てのテンプレートのHTMLのヘッダ部分に以下を追加。
      <script type="text/javascript" src="<$MTBlogURL$>ajaxcalendar2.js"></script>
      上記例はJavaScriptファイルの入力元としてMovableTypeのインストール先を絶対指定しているので、必要に応じて上記の"<$MTBlogURL$>"をJavaScriptファイルの配置位置に変更する。
    3. 上で対象にしたカレンダーを表示したい全てのテンプレートの<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>
    4. 上で対象にしたカレンダーを表示したい全てのテンプレートのカレンダーを表示したい部分を、以下の例のように<div id="calendar">タグと</div>タグでくくる。
      なお、「メインページ」テンプレートのカレンダー部分は、デフォルトで<div id="calendar">でくくられているようなので、既にそうなっていたらこの手順は飛ばす。
      また、ここで紹介する方法に対応していないブラウザのために、もともとあるカレンダー部分は削除せず残しておく。
      <div id="calendar">
      (カレンダー部分)
      </div>

  6. 再構築する。

かっこいいんだけど、ブラウザの[戻る]ボタンで、めくったカレンダーが元に戻っちゃうのが難点かも。

投稿者 Kobito : 02:21 | コメント (2) | トラックバック

[ 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;
}


設置方法などは改造前と同じ。

投稿者 Kobito : 00:10 | コメント (1) | トラックバック

[ MovableType ] 先人に学ぶ~タイトルの横にカテゴリを表示する~

タイトルの横にカテゴリを表示する。

参考にしたのは、CHEEBOWさんのTechnow Weblogタイトルの横にカテゴリを表示する

テンプレートの以下を
<$MTEntryTitle$>
下記のように修正する。
<$MTEntryTitle$>[ <MTEntryCategories glue=", "><$MTCategoryLabel$></MTEntryCategories> ]

投稿者 Kobito : 23:35 | トラックバック

[ MovableType ] 先人に学ぶ~カレンダーからのリンク先を日別のアーカイブにする~

同じ日に複数のエントリを投稿した場合、カレンダーのリンクからではまとめて見ることが出来ないので、日別のアーカイブを生成するようにする。

参考にしたのは、CHEEBOWさんのTechnow Weblogカレンダーからのリンク先を日別のアーカイブにする

  1. ウェブログの設定->アーカイブの設定と辿り、「日別」の横のチェックボックスをチェックし、一旦「変更を保存」する。
  2. メインページのテンプレートを編集し、カレンダー部分にある以下を
    <a href="<$MTEntryPermalink$>"><$MTCalendarDay$></a>
    下記のように修正する。
    <a href="<$MTEntryLink archive_type="Daily"$>"><$MTCalendarDay$></a>
  3. すべてを再構築する。

投稿者 Kobito : 10:34

[ 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;
}


設置手順。



  1. 上記JavaScriptを"textcollapse.js"として、サーバのMovableTypeディレクトリにアップする。

  2. テンプレートを編集し、折りたたみを有効にする。
    対象のテンプレートは以下など、<$MTEntryBody$>を含むもの。
     メイン・メニュー > (BLOG名) > テンプレート > メインページ
     メイン・メニュー > (BLOG名) > テンプレート > アーカイブページ
     メイン・メニュー > (BLOG名) > テンプレート > 日付アーカイブ

    • テンプレートのHTMLヘッダ部分(<head>~</head>の間)に以下を挿入。

      <script type="text/javascript" language="JavaScript" src="<$MTBlogURL$>textcollapse.js"></script>

    • テンプレートの末尾あたり(エントリよりも確実に下になる部分)に以下を挿入。

      <script type="text/javascript">
      <!--
      initTextCollapse();
      // -->
      </script>




IE6とFirefox1.0(Windows)では取りあえず動作しているが、NS4.x系やOpera、Mac上のブラウザでの動作は未確認。

2005/04/29追記
このページで、このスクリプトを更新しています。

投稿者 Kobito : 01:57 | コメント (1) | トラックバック

[ MovableType ] 先人に学ぶ~Permalinkの形式を日時に変更する~

MovableTypeは、各エントリのリンク先URLをデフォルトではエントリ番号とするらしい。
特にサイトを移転する予定は無いが、エントリデータの移出入でリンクが切れるのは望ましくないので、Permalinkの形式を変更する。

参考にしたのは、ChitatopopsさんのPermalinkを変更

参考ページでは日付とエントリのキーワードからPermalinkを求めていたが、キーワード付けるのが面倒なので日時のみに。

メイン・メニュー > (BLOG名) > 設定 > アーカイブ
「アーカイブ」の"個別エントリーアーカイブ"テンプレートの「アーカイブ・ファイルのテンプレート」に以下を指定。

<$MTArchiveDate format="%Y/%m/%d_%H%M%S"$>.php

投稿者 Kobito : 04:21 | コメント (1) | トラックバック

[ MovableType ] 先人に学ぶ~個別エントリ本文のモジュール化~

特に再構築などが軽くなるわけでは無さそうだけど、HDDの有効利用のためにエントリの本文をモジュール化してみる。

参考にしたのは、Boycott Street 221Bさんのリビルドなんて怖くない

個別エントリモジュール用のテンプレートを作成する。

  1. メイン・メニュー > (BLOG名) > テンプレート を開く。
  2. 「新しいアーカイブ・テンプレートを作る」をクリック。
  3. 「テンプレートの名前」に"Entry Body"と入力。
  4. 「このテンプレートにリンクするファイル」は空欄のまま。
  5. 「テンプレートの中身」はは以下のみを記述。
    <$MTEntryBody$>
  6. 「保存」ボタンを押す。

作成したテンプレートをアーカイブに関連付ける。

  1. メイン・メニュー > (BLOG名) > 設定 > アーカイブ を開く。
  2. 「新しく、テンプレートとアーカイブを関連付ける。」の「アーカイブの種類」に"個別"を選択。
  3. 同じく「テンプレート」に"Entry Body"を選択。
  4. 「追加」ボタンを押す。

個別エントリモジュールファイルの出力先・ファイル名を指定する。

  1. メイン・メニュー > (BLOG名) > 設定 > アーカイブ を開く。
  2. 「アーカイブ」の"Entry Body"テンプレートの「アーカイブ・ファイルのテンプレート」に任意の出力先・ファイル名を指定。
  3. 例)年月のパスに日時分秒のファイル名とする場合
    <$MTArchiveDate format="%Y/%m/parts/%d_%H%M%S"$>_body.php
  4. 同じく「テンプレート」に"Entry Body"を選択。
  5. 「変更を保存」ボタンを押す。

既存のテンプレートを、個別エントリモジュールファイルを読み込むように編集する。

  1. メイン・メニュー > (BLOG名) > テンプレート を開く。
  2. 「個別エントリーアーカイブ」「カテゴリー・アーカイブ」「日付アーカイブ」「メインページ」など、<$MTEntryBody$>を使用している全てのテンプレートの、<$MTEntryBody$>部分を以下に置き換える。
    <? include"/userID/public_html/module/archive/<$MTArchiveDate format="%Y/%m/parts/%d_%H%M%S"$>_body.php";?>
    上記のincludeを「MovableTypeの/archive/のパス」および先に指定した「個別エントリモジュールファイルの出力先・ファイル名」とすることで、該当するファイルがPHPにより読み込まれる。
  3. すべてを再構築する。

投稿者 Kobito : 03:42 | コメント (0) | トラックバック

[ MovableType ] 先人に学ぶ~PHP化~

MTPagenateプラグインを使用するためにはPHP化が前提、との事なのでPHP化。

参考にしたのは、Zakimi::Blogさんの Movable TypeのPHP化

要は「MovableTypeが生成するhtmlファイルの拡張子を.htmlから.phpに変更するだけ」らしい。

  1. まずは、トップページとアーカイブページをphpに。
    [手順]
    メイン・メニュー > (BLOG名) > テンプレート を開き、インデックス・テンプレートの「メインページ」と「アーカイブページ」の拡張子を、それぞれphpに変更。
  2. 続いて、個別エントリもphpに。
    [手順]
    メイン・メニュー > (BLOG名) > 設定 > 設定 を開き、「アーカイブ・ファイルの拡張子」をphpに変更。
  3. サイトの再構築を行えば完了。

投稿者 Kobito : 03:26 | コメント (1) | トラックバック

[ MovableType ] MobavleType導入

MovableTypeを運用してみる事にした。

投稿者 Kobito : 02:02