検索結果のページ分割(3.3x 版)

MTPaginate プラグインを利用することで、テキスト検索・タグ検索のページ分割が可能ですが、Movable Type 3.3x ではメインページや他のアーカイブと同じような設定では、例えばデフォルトテンプレートでは 2カラム表示が崩れるという問題が発覚しました。*1

ということで、3.3x 版の検索結果のページ分割方法について改めて説明致します。

なお、テンプレートの修正内容が複雑なため、今回は理由を説明しながらタグの設定を行っていきます。作業をスキップしたい方は1項、2項を実施した後、5項のタグをそのまま検索結果ページの該当部分と置き換えてください。

1.プラグインファイルのダウンロード

プラグイン配布サイト

MT ExtensionsMTPaginate

よりプラグインをダウンロードします(ページ上方にある「Download」をクリック)。

2.プラグインファイルのアップロード

ダウンロードしたファイルを解凍し、その中の MTPaginate ディレクトリを下記のディレクトリ構成になるように plugins ディレクトリに丸ごとアップロードします。

plugins/MTPaginate/lib/MTPaginate.pm
plugins/MTPaginate/MTPaginate.pl

3.ページ分割用タグを挿入

検索結果テンプレートを修正していきます。
最初に、ページ分割用のタグ

  • MTPaginate
  • MTPaginateContent
  • MTPaginateSectionBreak

と、ナビゲーション表示の

  • MTPaginateIfMultiplePages
  • MTPaginateIfPreviousPage_
  • MTPaginateNavigator
  • MTPaginateIfNextPage_

を追加します(青色部分)。挿入位置は他の既存タグを参考にしてください。基本的には

  • <MTSearchResults> の前
  • </MTSearchResults> の前後

の辺りです。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
            <MTBlogResultHeader>
                <h3 class="search-results-header">
                <MTIfStraightSearch>
                    ブログ: <$MTBlogName$> での検索結果
                </MTIfStraightSearch>
                <MTIfTagSearch>
                    <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
                    </MTIfTagSearch>
                </h3>
                <div class="search-results-container">
            </MTBlogResultHeader>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <MTBlogResultFooter>
                </div>
            </MTBlogResultFooter>
 
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

MTPaginateContentmax_sections 属性(赤色部分)の「3」が1ページの表示件数です。この部分はお好みの値に変更してください。

ナビゲーションを後方に表示したい場合は、<MTPaginateIfMultiplePages>~</MTPaginateIfMultiplePages></MTPaginate> の直前に追加してください。

4.検索結果ヘッダおよび検索結果フッタ用タグを削除

MTSearchResults の中に記述された検索結果ヘッダおよび検索結果フッタ用タグ

  • MTBlogResultHeader
  • MTBlogResultFooter

を削除します(赤色部分)。タグで括られた内容は後で利用しますので、メモ帳にでもペーストしておいてください。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
            <MTBlogResultHeader>
                <h3 class="search-results-header">
                <MTIfStraightSearch>
                    ブログ: <$MTBlogName$> での検索結果
                </MTIfStraightSearch>
                <MTIfTagSearch>
                    <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
                    </MTIfTagSearch>
                </h3>
                <div class="search-results-container">
            </MTBlogResultHeader>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <MTBlogResultFooter>
                </div>
            </MTBlogResultFooter>
 
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

この2つのタグは、検索結果全体の最初と最後に1度しか実行されません。ページ分割処理に含めると、1ページ目の最初と最後のページの最後にしか適用されないため、削除します。

5.検索結果ヘッダと検索結果フッタを移動

4項で削除した検索結果ヘッダと検索結果フッタの内容を MTPaginateContent の外側に設定します(青色部分)。注:</MTPaginateContent> の下にもあります。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
 
    <h3 class="search-results-header">
    <MTIfStraightSearch>
        ブログ: <$MTBlogName$> での検索結果
    </MTIfStraightSearch>
    <MTIfTagSearch>
        <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
        </MTIfTagSearch>
    </h3>
    <div class="search-results-container">
 
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
 
    </div>
 
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

MTPaginateContent の外側に設定することで、検索結果ヘッダと検索結果フッタがページ分割に依存せず常に表示されるようになります。

6.検索結果ヘッダと検索結果フッタに MTSearchResults を適用

5項で設定した検索結果ヘッダと検索結果フッタを MTSearchResults で括ります。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
 
    <MTSearchResults>
        <h3 class="search-results-header">
        <MTIfStraightSearch>
            ブログ: <$MTBlogName$> での検索結果
        </MTIfStraightSearch>
        <MTIfTagSearch>
            <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
            </MTIfTagSearch>
        </h3>
        <div class="search-results-container">
    </MTSearchResults>
 
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
 
    <MTSearchResults>
        </div>
    </MTSearchResults>
 
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

MTSearchResults で括らないと、検索文字列がヒットしなかった場合や、検索文字列が設定されていない場合にも検索結果ヘッダと検索結果フッタが表示されてしまうためです。

7.検索結果ヘッダと検索結果フッタに Counter プラグインを適用

6項で設定した検索結果ヘッダと検索結果フッタを、さらに Counter プラグインのタグを追加します(青色部分)。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
 
    <MTCounter>
    <MTSearchResults>
        <$MTCounterPlus$>
        <MTCounterIfEqual value="1">
            <h3 class="search-results-header">
            <MTIfStraightSearch>
                ブログ: <$MTBlogName$> での検索結果
            </MTIfStraightSearch>
            <MTIfTagSearch>
                <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
                </MTIfTagSearch>
            </h3>
            <div class="search-results-container">
        </MTCounterIfEqual>
    </MTSearchResults>
    </MTCounter>
 
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
 
    <MTCounter>
    <MTSearchResults>
        <$MTCounterPlus$>
        <MTCounterIfEqual value="1">
            </div>
        </MTCounterIfEqual>
    </MTSearchResults>
    </MTCounter>
 
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

MTSearchResults はループ処理用のタグで、上記までの設定ではヒットした回数分タグの内容が繰り返して表示されるためです。

Counter プラグインについては「Counter プラグイン」を参照してインストールまで行ってください。
カウンタ系のプラグインは他にも出回ってますので、そちらを利用しても構いません。

これでページ分割の設定は完了です。

8.その他

  • ナビゲーションを後方に設定した場合は下マージンが若干少ないので適宜追加してください。
  • 検索で「現在検索中です。検索が終わるまでお待ちください。」というメッセージが表示されて困る方は「Movable Type の検索でエラーになる問題について」を参照願います。

*1:以前の検索結果ページは 1カラムであったため、たまたま正常に動作しているようにみえていただけかもしれません。

Comments [0] | Trackbacks [0]

BlognPlus(ぶろぐん+)スキン

May 30,2007 2:25 AM
Category:[テンプレート]
Tag:[, ]
Permalink

ぶろぐん・3カラムテンプレートBlognPlus(ぶろぐん+)用のスキン(テンプレート)を作りました。サンプルのスクリーンショットは3カラムですが、2カラム・1カラムも用意しております。カラムレイアウトの設定方法につきましては本エントリーを参照ください。

1.動作確認環境

動作確認は下記の環境で行っています。

  • OS:Windows2000/XP
  • ブラウザ:IE6/IE7/Firefox2/Opera9

Mac環境はありませんので Safari での確認はできておりません。予めご容赦ください。

2.利用規定

ご利用の前にテンプレートのページを必ずご覧くださいますよう、よろしくお願い致します

3.カラムレイアウト変更方法

このテンプレートではカラムレイアウトのバリエーションとして、

  • 3カラム(カラム幅固定)
  • 3カラムリキッドレイアウト(中央カラム幅可変)
  • 2カラム(右サイドバー:カラム幅固定)
  • 2カラム(左サイドバー:カラム幅固定)
  • 2カラムリキッドレイアウト(右サイドバー:左カラム幅可変)
  • 2カラムリキッドレイアウト(左サイドバー:右カラム幅可変)
  • 1カラム(カラム幅固定)
  • 1カラムリキッドレイアウト(カラム幅可変)

の計8種類を用意しています(それぞれのサンプルはちょっと下にある画像をご覧ください)。

カラムレイアウトは、HTMLテンプレートの body 要素の class 属性を書き換えることで変更することができます(カラム数を変更する場合はHTMLテンプレートの修正が必要ですがこれについては後述します)。例えば、3カラムレイアウトから2カラム・リキッドレイアウト(右サイドバー)に変更したい場合は、HTMLテンプレートの

<body class="layout-three-column">

の赤色部分を

<body class="layout-two-column-liquid-right">

と、青色の内容に変更します。このテクニックは Designing with Web Standards でも紹介されています。

個別エントリー用HTMLありのテンプレートをお使いの場合、ベースHTMLと個別エントリー用HTMLで異なるレイアウトを設定することができます。例えばベースHTMLで3カラム、個別エントリー用HTMLで1カラムという設定も可能です。

以下にそれぞれのレイアウトに対する class 属性値を示します。なおサンプル画像は Movable Type のものを流用しておりますので予めご了承ください。

<body class="layout-three-column">

Seesaaブログ・3カラムテンプレート3カラム

<body class="layout-three-column-liquid">

Seesaaブログ・3カラムテンプレート・リキッドレイアウト3カラム・リキッドレイアウト

<body class="layout-two-column-left">

Seesaaブログ・2カラムテンプレート(左サイドバー)2カラム(左サイドバー)

<body class="layout-two-column-liquid-left">

Seesaaブログ・2カラムテンプレート・リキッドレイアウト(左サイドバー)2カラム・リキッドレイアウト(左サイドバー)

<body class="layout-two-column-right">

Seesaaブログ・2カラムテンプレート(右サイドバー)2カラム(右サイドバー)

<body class="layout-two-column-liquid-right">

Seesaaブログ・2カラムテンプレート・リキッドレイアウト(右サイドバー)2カラム・リキッドレイアウト(右サイドバー)

<body class="layout-one-column">

Seesaaブログ・1カラムテンプレート1カラム

<body class="layout-one-column-liquid">

Seesaaブログ・1カラムテンプレート・リキッドレイアウト1カラム・リキッドレイアウト注:左右のマージンをなくすことも可能です。

公開テンプレートは一番上の3カラムレイアウトで配布しております。

カラム数を変更、例えば3カラムから2カラム(左サイドバー)に変更した場合、管理メニューの「デザイン」→「コンテンツ」で右サイドバーに表示するものがなくなれば自動的に2カラム表示になります。
非表示にするサイドバーにコンテンツが残っている場合は、

<!-- 右カラム開始 -->
<div id="links-right-box">
<dl id="links-right">
         :
</dl><!-- /links-right -->
</div><!-- /links-right-box -->
<!-- 右カラム終了 -->

を丸ごと削除してください。1カラムに変更される場合は左右両方のカラムをごっそり削除してください(いずれもサイドバーの復活が面倒なのでお勧めできません)。

4.1カラムレイアウトについて

1カラムレイアウトはポータル的な要素を排除して、個人の日記サイトとして気軽に書けるデザインにしています(言い換えると単にサイドバーをとっぱらっただけです)がアーカイブページ等のリンクは考慮しておりませんのでご注意ください。

5.クレジットバナーについて

当サイトのクレジットバナーはデフォルトで右サイドバー下に表示するようにしています。バナー画像は別のサイトから取得するようにしていますが、テンプレートのページよりダウンロードしてお使いくださっても結構です(src 属性は適宜修正してください)。なお右カラムを削除される場合は、下記のタグを左サイドバーに挿入してください。

<dd class="powered">
<ul><li>Powered by<br />
<a href="http://www.blogn.org/" target="_blank"><img src="images/blogn3.gif" alt="BLOGNPLUS(ぶろぐん+)" border="0" /></a></li>
<li><a href="http://www.koikikukan.com/"><img src="http://blog42.fc2.com/k/koikikukan/file/banner.gif" alt="小粋空間" width="128" height="22" /></a><p><br /></p></li></ul>
</dd>

6.その他

基本的な動作は確認したつもりですが、ぶろぐんの機能を全て把握できていない状態ですので、不具合等ございましたらご連絡ください。

7.テンプレート

HTML

スタイルシート
Comments [4] | Trackbacks [0]

ブログを続けるための3つのポイント

May 29,2007 2:17 AM
Category:[blog]
Tag:[, ]
Permalink

このサイトもとりあえず3年続いたので、続かなくなる前に(笑)ブログを続けるためのノウハウを書いてみることにしました。3年の経験にもとづいているので、まあまあの信憑性かもしれません。

ブログを始めた時は「楽しい」という気持ちが強いので「続かない」というケースは少ないと思いますが、書き始めてしばらく経ち、続けることへの意欲がなくなりかけてきた頃に思い起こしてもらえると有難いです。

続けるための観点は人によって違うと思います。ここでは経験上「こうしておけば続けやすい」というものをまとめてみました。「3つのポイント」というタイトルは、たまたま思いついたのが3つだった、というだけです。思いついたらまたエントリーします。

またアクセスを増やす方法については言及していませんので、「アクセスが増えないので続かない」という対処について触れてません。アクセスについては別の機会にエントリーします。

1.続けることに対する目標を作る

「ブログをX日続ける」という目標を作りましょう。

「続ける」ということは日々の積み重ねの結果ですので「目標にするのはちょっと…」と思われるかもしれませんが、「日々積み重ねる」ということは継続するという行為のミクロな視点である訳なので、個人的には違和感ありません。

それはさておき、目標はいきなり「3年」とか、そんな大きな目標は立てる必要はありません。例えば「1週間」という目標を立てます。そうすることで、直近のスケジュールをどうすれば良いかという、具体的な行動が起こせるきっかけになります。

私の場合、まず日曜の夜に5日?1週間分のおぼろげなエントリー予定を立てるようにしています。とりあえず週末はダジャレの日が1回あるので(笑)、それを除いた残りの日のエントリーのスケジュールを考えます。これまでの下書きの公開や、頂いたご質問の情報展開、新ネタ等。
アクセスは週明けが多いので、読んで欲しい記事はできるだけ月・火に出すようにしています。

そして週の間にまた別のネタが見つかるかもしれません。それは緊急性の高い情報であれば優先して投稿し、スケジュールから外れたエントリー予定だった分は次週回しにします。最近はこういうサイクルでやりくりしています。

話を戻して、「10年続ける」といった壮大な目標でも構わないのですが、大きい目標に対しては必ず「小さい目標」も同時にたてて、それを繰り返すようにしましょう。あるマラソン選手(誰か失念)も「42.195km走る切るために『次の電柱まで』を繰り返して走っている」と言ってました。
小さいことの積み重ねが大きな結果に結びつきます。

それから、目標を達成する直前に次の目標を立てることも大事です。例えば「3年続けました!」という達成感で満足してしまうと、そこで立ち止まってしまう可能性があります。
目標達成目前のところで次の目標を決めておけば、達成感を味わいながら、同時に次の目標に向かって心の準備も整っているという訳です。

2.ネタはできるだけ溜めておく

私の場合、2年経った頃、「今日は何を書こう?」という、いわゆるネタ切れの状態がよくおきました。前の日のエントリーに注力し過ぎて、次の日に時間的余裕がない場合がそうです。

そういう訳で3年目から、とにかく思いついたネタは極力メモすることにしました。例えばカスタマイズ記事であれば、グダグダなタグまたはソースコードでもとりあえず本文に貼り付けておき、未公開状態のエントリーとして保存しておきます。
ダジャレも同じで、どんなくだらないものでも忘れないうちに書き留めておきます。

そうこうするうちに、ピンキリの内容ながらかなりの量の未公開エントリーが溜まりまして、ネタ切れで悩むというストレスからはほぼ解放されました。

また予めエントリーを書く時間がとれないことが分かっている時は、公開できる状態までエントリーをまとめて書き溜めておき、指定日投稿をしています。最大で5日分書いたこともあります。
飲み会等で、その日の晩はパソコンに向かう状態ではない、という時も事前にエントリーを書くようにしています。

タイムリー性が問われる記事についてはこのテクニックを適用できませんが、例えば日常の出来事などは、その日に起こったことをまとめて投稿せず、小出しにする手もあります。また投稿日をずらせば、後から投稿する分については推敲することが可能です。

今更ですが今年の3月頃、風邪をひいて39度の高熱で寝込んでいたことがありました。その時は事前の準備をしていなかったため、その時だけはさすがに参りました(それでもエントリーしましたが)。「備えあれば憂いなし」です。

3.マイナス要因はうまく対処する

楽しく続けているブログも、コメントやソーシャルブックマークに誹謗・中傷が起きると、正直凹みます。あるエントリーに対して100件がプラス評価でも、1件のマイナス評価で全てを覆しかねません。それが原因でエントリーする意欲がなくなってしまうのが一番良くないことです。
ちなみに、「アドバイス」的な内容はマイナス評価とは別物なので、その点は誤解なきようお願い致します。

対処法は、エントリーの内容にもよるので一意の解ではありませんが、仮にマイナスな評価が多数ではなく一部であれば、その評価に対して過敏に反応しない、あるいは大人の対応をすること。逆に多数の場合は記事の内容が誤っている可能性があるので、冷静に受け止め、相当の対応をすることが最善策と思います。

いずれにしても、そのことによるストレスはブログ上ではなく、リアルの世界でお酒でも飲んで発散しましょう。

またこういう時も、投稿するだけの状態になっているエントリーが用意されていれば「今日は書く気分にならない」という精神状態でも、表向きにブログは粛々と続けることができます。

Comments [2] | Trackbacks [0]

「最近のエントリー」に経過日数を表示する

「最近のエントリー」の各エントリーの右側に「X日前」という経過日数をするカスタマイズです。

経過日数を表示したエントリーリスト

指定した経過日数を超えたエントリーに対し、任意のテキストをエントリーリスト横に表示することができます。JavaScript で書きましたのでテンプレートにタグを追加するだけで動作します。また JavaScript OFF の場合は何も表示されないようにしています。

動作はエントリーの投稿時間を span で予め埋め込んでおき、CSSで非表示にします。そして JavaScript でその投稿時間を取得し、現在時刻との差を計算し、テキストに置き換えて表示するという仕組みです。

Windows2000/XPのIE6/7・Firefox2.0・Opera9.0で動作確認しています。また XHTML1.0 valid です。

なお、本カスタマイズは以前ご要望を頂いていたもので、公開が大変遅くなりましたこと、この場をお借りしてお詫び申しあげます。

1.テンプレートの修正

「最近のエントリー」にテキストを表示したいテンプレートに、span 要素(青色部分)を追加します。

<div class="module-archives module">
   <h2 class="module-header">最近のエントリー</h2>
   <div class="module-content">
      <ul class="module-list">
      <MTEntries lastn="10">
         <li class="module-list-item"><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a> <span class="new"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></span></li>
      </MTEntries>
      </ul>
      <a href="<$MTBlogURL$>atom.xml">このブログのフィードを取得</a><br />
      [<a href="http://www.sixapart.jp/about/feeds">フィードとは</a>]
   </div>
</div>

2.スクリプトの追加

1項と同じテンプレートについて、body 要素の終了タグの直前に、下記のスクリプトを追加します。

<script type="text/javascript">
//<![CDATA[
// passage day
var pass = 1;
 
// display content
var content = '日前';
  
var currentDate = new Date(); 
var spans = document.getElementsByTagName('span');
for (i = 0, len = spans.length; len > i; i++) {
    if (spans[i].getAttribute('class') == 'new' ||
       spans[i].getAttribute('className') == 'new') {
        time = spans[i].childNodes[0].nodeValue.split(":");
        var entryDate = new Date(time[0], time[1]-1, time[2], time[3], time[4], time[5]); 
        var now = (entryDate.getTime() - currentDate.getTime())/(60*60*1000); 
        now = Math.ceil(now/24);
        if (-now > (pass - 1)) {
            spans[i].innerHTML = -now + content;
            spans[i].style.display = 'inline';
        }
    }
}
//]]>
</script>

3.CSS設定

スタイルシートに下記の設定を追加します。

span.new {
    display: none;
    color: red;
}

最初の display プロパティで1項の要素に設定したタイムスタンプを非表示にします。その下の color プロパティは、「X日前」という文字が表示された場合に適用される設定です。

4.表示開始日数を変更する

表示開始日数を変更するには、

// passage time
var pass = 1;

の赤色部分の値を変更してください。

デフォルトの「1」は、投稿後1日経過分からのエントリーが表示対象となります。「10」にすると10日経過したものから表示対象になります。
数字は必ず半角文字で設定してください。

5.表示文字列を変更する

表示内容を変更するには、

// display content
var content = '日前';

の赤色部分を変更してください。

Comments [0] | Trackbacks [0]

検索結果画面のページ分割が正常に動作しない不具合を解消する

May 27,2007 1:23 AM
Category:[検索]
Tag:[, , ]
Permalink

Movable Type では MTPaginate を利用して、各アーカイブをページ分割することが可能ですが、MTPaginate は検索結果画面のページ分割も可能です。

ですが、デフォルトテンプレートの検索結果画面にある検索フォームから検索を実行した場合、その後のページ分割機能が有効にならない、というご質問を頂きました。ご本人は既にお分かりのようでしたが、折角なので情報展開しておきます。

1.問題

下記のような検索結果画面の状態から、ページ送りのリンク(赤枠部分)をクリックすると、

下のように、検索文字列が何も設定されていない状態で検索した結果画面になります。

2.対処方法

検索結果テンプレートの form の method 属性、

<form method="post" action="<$MTCGIPath$><$MTSearchScript$>" id="search-form">

<form method="get" action="<$MTCGIPath$><$MTSearchScript$>" id="search-form">

に変更するだけです。これで正常にページ送りができるようになります。

なおメインページの検索フォームは get になっていますので、修正の必要はありません。

3.原因

フォームの method 属性が get の場合は、フォームデータを URL の後ろにクエリー(URLエンコードしたデータ)として送信します。つまり post になっていたため、ページ送り時に検索文字列やブログID等、必要な情報が全て欠落していた、というのがこの問題の原因です。

GET と POST については下記のページが参考になるでしょう。

4.その他

ということで、GET メソッドを用いれば問題は解消しますが、フォームデータを URL として表示させたくない場合は post にしてください(ページ分割が機能しないとう制約が残りますが)。

また、Movable Type の検索はどちらの method 属性も対応しているということが分かりました。

Comments [0] | Trackbacks [0]

いつまで経っても

May 26,2007 12:22 AM
Category:[ダジャレ]
Tag:[]
Permalink

慣れない

Comments [0] | Trackbacks [0]

図解・トラックバック処理

May 25,2007 2:10 AM
Category:[blog]
Tag:[]
Permalink

「トラックバック」とは Web サイト間のピアツーピア通信/通知のためのフレームワークです。

もう少し分かりやすく説明すると、

リンク元サイトに「このような記事からリンクを張った」という情報を通知する仕組み

です(これも分かりにくいですが)。
ちなみに「トラックバック Ping」とは「トラックバック Ping URL に対する HTTP POST リクエスト」です。

それはともかく、ブログを始めた時に最初に戸惑うのがこの「トラックバック」で、実際にトラックバック機能を利用して一番不思議に思われる事象が、

「エラーになったのに相手のブログにちゃんと送信されている」

ことではないでしょうか。

その結果、誤解してトラックバックを重複送信したり、Movable Type では送信失敗したトラックバックURLを再送信用に保存するため、それに気づかず記事を再保存すると、誤って送信するといったケースが絶えません。*1

このエントリーでは、そのようなケースを引き起こす原因を理解できるよう、トラックバックの動作について図解します。

1.トラックバック処理(正常)


ブログAからブログBにトラックバックを送信すると、ブログBはトラックバック受信処理を開始します。送信したブログAはタイマを起動して、ブログBからの完了通知を待ちます。
ブログBが受信処理を終えるとブログAに完了通知を送信します。ブログAがタイマ起動中に完了通知を受信するとタイマを解除し、ブログAは「トラックバックを正常に送信した」と判断します。

2.トラックバック処理(異常)


ブログAからブログBにトラックバックを送信して、何らかの原因でブログBにトラックバックが到達しなかった場合、ブログAが起動したタイマがタイムアウトし、その契機にブログAは「トラックバックを正常に送信できなかった」と判断します。このケースではブログBは何も受信していません。

3.トラックバック処理(準正常1)


このケースは、ブログAからブログBにトラックバックを送信して、1と同様にブログBでトラックバック受信処理を開始、完了通知を送信したにもかかわらず。何らかの原因でブログAに完了通知が到達しなかった場合です。
ブログAが起動したタイマがタイムアウトし、その契機にブログAは「トラックバックを正常に送信できなかった」と判断します。ただしこのケースでは、ブログAには「エラー」と見えるにも関わらずブログBはトラックバックを正常に受信しています。

4.トラックバック処理(準正常2)


3のケースとほぼ同じですが、ブログBの処理が遅延してブログAのタイムアウトにひっかかってしまう場合です。「エラーになったのに相手のブログに送信されている」というのは、このケースが一番多いのではないでしょうか。

その他、トラックバック先のファイルが見つからない、ブログBで受信してエラーレスポンスを返却した等のケースが考えられます。

なお説明では便宜上、「正常・異常・準正常」と分けていますが、個人的な解釈に基づいています。


*1:ただし自ブログで「トラックバック成功」と認識させるには、重複送信する手しかありません(ブログによって動作は異なるかもしれません)

Comments [0] | Trackbacks [0]

HighSlide JS と prototype.js の競合を解消する

May 24,2007 1:50 AM
Category:[JavaScript]
Tag:[, ]
Permalink

サムネイル画像を拡大させる HighSlide JS(関連記事「Highslide JS でサムネイル画像を拡大表示する」)には、

  • ブラウザのウィンドウサイズに収まるように拡大(右下のアイコンをクリックすると 100% 表示)

という機能があり、この場合、拡大した画像の右下に最大化するアイコンが表示されます。

拡大した画像

このアイコンをクリックすると、ブラウザのウィンドウサイズに関わらず画像が最大化されます。最大化された画像は最大化前と同じようにドラッグや縮小することができます。

1.問題点

この最大化をすると別のページにジャンプをして元画像が表示されてしまうケースがあります。

2.原因

Highslide JS と prototype.js を同時に利用している場合、prototype.js が Array に対して拡張を行っているため、Highslide JS で使用している配列が汚染され、

for (var i in array) {
    :
}

の処理で余計なものが含まれてしまうようです。
これが原因で最大化処理に不具合が発生します。

具体的には、highslide.js の下記の部分が汚染されている模様です。

// reposition overlays
for (x in this.overlays) {
	hs.purge(this.overlays[x]);
	this.overlays[x].parentNode.removeChild(this.overlays[x]);
}

3.対処方法

for 文を

for (var i = 0; i  < array.length; i++) {
    :
}

に変更すると解消するらしいので、問題となる処理が含まれる関数のみをオーバーライドしてみました。

まず、下記の内容を丸コピーし、highslide-custom.js という名称で highslide.js と同じディレクトリに保存してください。

HsExpander.prototype.doFullExpand = function () {
    try {
        hs.purge(this.fullExpandIcon);
        this.fullExpandIcon.parentNode.removeChild(this.fullExpandIcon);
        this.focus();
        this.x.min = parseInt(this.wrapper.style.left) - (this.fullExpandWidth - this.content.width) / 2;
        if (this.x.min < hs.marginLeft) this.x.min = hs.marginLeft;        
        this.wrapper.style.left = this.x.min +'px';
        var borderOffset = this.wrapper.offsetWidth - this.content.width;        
        this.content.width = this.fullExpandWidth;
        this.content.height = this.fullExpandHeight;
        this.x.span = this.content.width;
        this.wrapper.style.width = (this.x.span + borderOffset) +'px';
        this.y.span = this.wrapper.offsetHeight - 2 * this.offsetBorderH;
        this.positionOutline(this.x.min, this.y.min, this.x.span, this.y.span);
        // reposition overlays
        for (x = 0; x < this.overlays.length; x++) {
            hs.purge(this.overlays[x]);
            this.overlays[x].parentNode.removeChild(this.overlays[x]);
        }        
        if (hs.showCredits) this.writeCredits();
        this.createCustomOverlays();
        this.redoShowHide();
    } catch (e) {
        window.location.href = hs.expanders[this.key].content.src;
    }
};

そして、ご利用のサーバにアップロードして、テンプレートに下記の青色の行を追加してください。

           :
<script type="text/javascript" src="highslide/highslide.js"></script>
<script type="text/javascript" src="highslide/highslide-custom.js"></script>
           :

この1行は、元の highslide.js を読み込む script 要素の後に記述してください。
また、src 属性部分の記述は例ですので、ご利用になっている highslide を読み込んでいる script 要素の src 属性に合わせてしてください。
例は highslide というディレクトリ配下にある場合を想定しています。

4.注意事項

IE6/iE7 では2回目以降の拡大処理がスムーズに動作しない事象が確認されています(Firefox / Opera は OK)。
またこの対処はサンプルを作って実験したものですので、動作しない場合があるかもしれません。適正な対処方法がありましたらご教示ください。

Comments [2] | Trackbacks [1]

Movable Type でコメント投稿・トラックバックが重くなる事象を解消する

Movable Type 3.2 / 3.3 で、コメント投稿および、トラックバック送信のレスポンスが遅くなる事象が発生しています。原因は、標準プラグイン「SpamLookup」がデフォルトで参照しているサーバーのひとつ、「opm.blitzed.org」が停止したためです。

Six Apart - Movable Type サポート: コメントの投稿が急に遅くなりました

標準プラグイン「SpamLookup」がデフォルトで参照しているサーバーのひとつ、「opm.blitzed.org」が停止したため、コメントの投稿の際、非常に長い時間がかかったり、タイムアウトとなる現象が発生しています。

具体的には、コメント投稿や、他のブログから Movable Type のブログにトラックバックを送信した際、このサーバに対し、受信したコメントやトラックバックがブラックリストに含まれているかどうか問い合わせるのですが、サーバーからの応答がない(アクセスできない)ため、処理遅延が発生し、結果的にコメント・トラックバック処理が遅延します。

上記の引用記事に修正方法が掲載されていますが、当サイトでも修正手順を下記に記しておきます。

修正手順

管理画面にログインして、右側にあるメニューより「プラグイン」をクリック。

プラグイン一覧の後方にある「SpamLookup - Lookups」の右側にある「設定を表示」をクリック。

設定画面に切り替わるので、一番上の「アドレスのチェック」欄の「ブラックリスト」に記載された「opm.blitzed.org」と、その前にあるカンマを削除。

削除するとこのようになります。

削除したら、少し下にある「変更を保存」をクリック。再構築する必要はありません。

以上です。なお、

ブログごとにSpamLookupの設定を変更している場合は、上記手順での修正がそれぞれのブログに反映されません。念のため、各ブログの「設定」>>「プラグイン」から、変更が反映されているかを確認してください。 また、ブログの設定に変更が反映されていない場合には、各ブログについても上記手順での修正を行ってください。

とのことです。