2005年03月10日

●フォントに Verdana が使われている理由

このブログや公開テンプレート(というか「すちゃらかCSS素材集」より頂いた時の設定をそのまま使ってます)のスタイルシートのフォントには

font-family: Verdana, Arial, sans-serif;

という指定がされています。各フォントがカンマで区切られて3つ並んでいるのは、優先順位(最初のフォントがみつからなかった場合、次のフォントを使用)を示しています。
このエントリーでは青字で示している Verdana という、よくみかけながらもその存在についてあまりよく分かっていなかったフォントについて調べてみました。


欧文フォントは主に2種類の書体が用いられます。デザイン関係の方ならご存知と思いますが、1つはセリフ(Serif)体、もう1つはサンセリフ(Sans Serif)体です。「セリフ」とは「活字の始点または終点にあるひげ飾り」という意味で、サンセリフは「セリフがない」という意味です。前者の代表的なフォントは Times New Roman や Century、後者の代表的なフォントには Helvetica やスタイルシートで設定している Arial があります。日本語で言えば明朝体がセリフ、ゴシック体がサンセリフに似ています。違いは下記のページをご覧頂ければ一目瞭然です。

ということで、Verdana はサンセリフに属します。


さて、Verdana についてWebを検索してみたところ以下の記事を発見しました。

このフォントはヒンティング -書体のアウトラインをそのまま少ないピクセル数の文字に変換せずに、できるだけ元の書体に近い、変な形にならないように調整を加える-という技術が使われています。下記のページでヒンティングの仕組みが分かりやすく説明されています。ということで、Verdana はスクリーン上で読むのに非常に適しています。今更ながらこのフォントが使われている理由がよくわかりました。


それとは別に、他によく使われているフォントとしては Tahoma/Trebuchet MS/Comic Sans MS 等があるようで、右上でオブジェと化している stylesheet にフォント切り替え用リンクを追加してみました。それぞれのフォントの特徴や他フォントとの違いが確認できると思います。サイズ等の微調整や状態保持はしておりませんのであしからず。
今のところお遊び用ですがご要望あれば util.js に追加します。

Posted by yujiro at 19:15 | Category : blog | Comments [0] | Trackbacks [0]

2005年03月09日

●PHPモジュール化の仕組みについて(その4:再構築オプション利用方法)

この回ではモジュール化による再構築オプションの有効な利用方法について説明します。


「再構築オプション」は各テンプレート編集画面の右上にあるチェックボックスを指します。このオプションはユーザー・マニュアルテンプレートの編集にある通り、チェックボックスにチェックをつけるとエントリー投稿時等に再構築対象となり、逆にチェックを外すとテンプレート編集画面等から再構築をしない限り情報は更新されません。つまりモジュール化において「再構築オプション」にチェックをする・しないが、再構築時間短縮の重要なポイントになります。


ということでチェックするための目安となる表を作ってみました。


モジュール化対象データ再構築が必要な契機チェック要否
ブログタイトル・バナー・バージョン等管理画面等からの変更時不要
カレンダー次表参照
最近のエントリー
カテゴリーリスト
月別アーカイブリスト
最近のコメントコメント投稿時
最近のトラックバックトラックバック受信時

チェック要否の要・不要は主観的な判断です。タイトル等の恒常的に普遍なモジュールは基本的に再構築対象とせず、「最近のコメント」「最近のトラックバック」のモジュールは「再構築オプション」にチェックをつけておかないとコメントが投稿された時にコメント内容がリアルタイムにページに反映されなくなります。
カレンダー~月別アーカイブリストについての再構築要否については再構築契機を細分化できるので、次表に分けてみました。

データ再構築が必要な契機
カレンダーその日の最初のエントリー投稿時
最近のエントリーエントリー投稿時(更新時は不要)
カテゴリーリスト件数表示:エントリー投稿時
件数非表示:新カテゴリーでのエントリー投稿時
月別アーカイブリスト件数表示:エントリー投稿時
件数非表示:月の最初のエントリー投稿時

カテゴリーリスト・月別アーカイブリストの「件数表示・非表示」の意味は次の通りです。
例えば月別アーカイブリストにエントリー件数を表示していない(=件数非表示)場合、ある月のリンク(月別アーカイブページへのリンク)を月別アーカイブリストに追加するためには、その月の最初のエントリー投稿後に「月別アーカイブリスト」のモジュールを一度だけ再構築すればよく、このモジュールは次月まで再構築する必要はありません。ただしエントリー件数を表示している(=件数表示)場合はエントリー投稿後に再構築しないと件数が反映されません。
カテゴリーリストも同様です。


基本的には、タイトル等のスタティックデータ用モジュールを除いた全てのモジュールに再構築オプションをチェックしておけば利便性が良いのですが、レンタルサーバ等で500エラーが頻発する場合、再構築オプションのチェックを外し、エントリー投稿後に必要なモジュールを個別に再構築するのが良いのではないかと思います。
削除動作については管理メニューから再構築が促されるので省略しています。


それぞれのモジュールを個別のインデックステンプレートとして登録すると、数が増えてメニューや管理が煩雑になるので、いくつかのモジュールをまとめてひとつのインデックステンプレートとするのもよいでしょう。またアーカイブページによってモジュールのレイアウトが異なる場合は、レイアウト用の中間的なモジュールを作ると個別モジュールが再利用できて便利です。


その1:概要
その2:具体的動作とMTIncludeとの違い
その3:変更方法
その4:再構築オプション利用方法

Posted by yujiro at 17:35 | Category : モジュール化 | Comments [2] | Trackbacks [1]

2005年03月08日

●PHPモジュール化の仕組みについて(その3:変更方法)

PHPモジュール化をする場合の具体的な変更方法です。


1.モジュールを引き込む元となるテンプレートの変更
これはメイン・ページや各アーカイブテンプレートが対象になり、以下の作業を行います。

  1. 管理メニューの「テンプレート」をクリック
  2. インデックス・テンプレート欄より該当のテンプレートをクリックし、テンプレート内部のモジュール化したい部分を切り取ってメモ帳などにペースト(切り取った位置を忘れないようにコメントでマークしておくか、先に3を実施)
  3. テンプレートから切り出した部分を

      <?php readfile("filename"); ?>

    に置き換え(filenameについては2、3項を参照)


  4. 出力ファイル名の拡張子を .php に変更
  5. 保存・再構築
  6. .htaccess対処(必要に応じて)
  7. 拡張子が .html で配置されている旧ファイルを削除(必要に応じて)
4.は、例えばメインインデックスの場合
    index.html → index.php
に変更します。これを行わないと 3.でテンプレート内に記述したPHPスクリプトが動作しません。
5~7は2項の部品化が完了してから行ってください。6.はファイル名を変更することで検索エンジンからのアクセスや PageRank 等に影響を及ぼすため、必要に応じて .htaccess によるリダイレクト(~.html でアクセスされたら ~.php を表示)を行います。エントリーがある程度たまっている方は .htaccess を使われることをお勧めします。詳細については別の機会に記述します。


7.は、6.の対処が不要な場合、例えばファイル名が index.html かつURLにファイル名が指定されていない場合等に行います。index.html を削除する理由は、拡張子によってファイルアクセスの優先順位が異なるためです。具体的には、新しく index.php を生成しても index.html が残っていると、サーバは index.html にアクセスします。つまり一般的には .html や .htm が .php より優先されます(サーバの設定に依存します)。
なお index.html を削除する前に URLで http://~/index.php まで指定してファイルの正常性を確認されることをお勧めします。生成に失敗した状態で index.html ファイルを削除するとアクセスが全て index.php に流れてしまうためです。


2.モジュールの作成
次に部品となる方のテンプレートを作成します。

  1. 管理メニューの「テンプレート」をクリック
  2. インデックス・テンプレートの右上にある「新しいインデックス・テンプレートを作る」をクリック
  3. 下記の項目を設定
    テンプレートの名前:任意
    出力ファイル名:任意
    テンプレートの内容:アーカイブテンプレート等から切り出したメニューリスト等のMTタグをペースト
    再構築オプション:チェック
以下は「最近のエントリー」をモジュール化する場合の例です。


テンプレートの名前:最近のコメント
出力ファイル名:recentEntries.html
テンプレートの内容:

<div class="sidetitle" id="entryname">
Recent Entries
</div>

<div class="side"id="entrylist">
<MTEntries lastn="10">
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
</MTEntries>
</div>


「テンプレートの名前」は管理メニュー上で表示するだけのものですので日本語でもOKです。「出力ファイル名」はこのテンプレートが再構築された時、ローカル・サイト・パスに出力されるファイル名です。一応拡張子として「.html」を付与していますが、このファイルに直接URL指定してアクセスする必要がなければ「.txt」でも大丈夫です。なおこのファイル名が1項の元テンプレートに埋め込む filename になります。
「再構築オプション」はモジュール化で重要なキーとなる部分です。ここでは「チェック」にしていますが、具体的な内容は次回詳しく説明したいと思います。


3.パスについて
1項の filename の補足ですが、ファイル名にはパスが必要です。パスは絶対パス(ルートとなるディレクトリからファイルが配置されているディレクトリまで)または相対パス(参照元のファイルがある位置からファイルが配置されているディレクトリまで)で記述します。テンプレートと同じ位置にあればパス名は不要ですが、モジュールは各アーカイブから利用されるのが一般的ですので、一律絶対パスを用いるのが良いでしょう。


4.コメント・プレビュー/コメント・エラーでのインクルードについて
この項目は我楽さんより頂いたご質問の反映ということで急遽追加致しました。これらのテンプレートは実体が存在しない(CGIプログラムによるHTTPレスポンス)ため、設定方法が異なります。また現状ではPHPスクリプトが評価できる方法が不明であるため(環境設定に依存?)、このファイルからインクルードする場合は

<$MTInclude file="filename"$>

を用います。


5.PHPスクリプトをインクルードする場合
上記のサンプルではMTタグが記述され(て実体に展開され)ただけのファイルをインクルードしていますが、PHPスクリプトが記述されたファイルをインクルードする場合もあると思います。
例えば、いくつかのモジュールのインクルードをまとめた

<?php readfile("recentEntries.html"); ?>
<?php readfile("recentComments.html"); ?>
<?php readfile("recentTrackbacks.html"); ?>

という内容の中間的なモジュール hogehoge.php を想定します。この hogehoge.php をさらにメインインデックス等からインクルードする場合には、
<?php include("hogehoge.php"); ?>

と記述します。readfile はファイルを読み込むだけの関数ですが、include はファイルを読み込み、さらにそれをプログラムとして評価するための関数です。拡張子は実験したところ任意の名称で問題ないようですが、単体でPHPスクリプトの動作を確認する場合等を考慮して .php にする方が良いでしょう。
逆に言うと、PHPスクリプトが記述されていないファイルをインクルードする場合は
<?php readfile("~.html"); ?>

で大丈夫ということです。インクルードが何段にもなる場合は、インクルード元に近い方から include 関数を用いて、一番末端だけ readfile 関数または include 関数を使用、という構造になります。


以上です。
当初、「PHPスクリプトでないファイルの拡張子は .html でOKです」というオチにするだけの予定だったのですが、最初のサンプルで、

<?php include("http://~.html"); ?>

としていたところ、その1Ogawa::Memoranda さんから頂いたコメントにある通り「PHPプログラムを含まないのであれば includeで読み込むのは得策ではありません」「サーバーサイドにあるファイルはURL指定する必要はありません」とのことで、記述を変更致しました。勉強不足、失礼致しました。あわせてご指摘感謝致します。
なお他のサーバにあるファイルを読み込む場合は上記のようなURL指定を行います。


ということでミイラ取りがミイラになりました。(つづく)


その1:概要
その2:具体的動作とMTIncludeとの違い
その3:変更方法
その4:再構築オプション利用方法

Posted by yujiro at 15:38 | Category : モジュール化 | Comments [2] | Trackbacks [1]

2005年03月07日

●Movable Type が 2004 Best Product Award 受賞

Movable Type ニュースに出てる通り、Movable Type3.0 がインプレス社の INTERNETmagazine ウェブクリエイション部門 2004 Best Product Award に選ばれたました。お世話になっているプロダクトが選ばれるというのは1ユーザとしても喜ばしいです。おめでとうございます!
Posted by yujiro at 23:58 | Category : blog | Comments [0] | Trackbacks [0]

2005年03月06日

●PHPモジュール化の仕組みについて(その2:具体的動作とMTIncludeとの違い)

それではPHPモジュール化の具体的な動作です。ブログURLというほぼ不変なデータを例に、モジュール化を利用する場合・しない場合の動作の違いを踏まえて説明します。


まずモジュール化をしない場合です。私のサイトで DisplayURL というインデックステンプレートを作り、displayURL.html というファイルを生成するものとします。テンプレートには下記の内容が設定されています。

<html>
 <body>
  <$MTBlogURL$>
 </body>
</html>

このファイルを再構築すると
<html>
 <body>
  http://yujiro.dyndns.org/blog/koikikukan/
 </body>
</html>

となり、MTBlogURL が本来のURLに解釈されたスタティックページ displayURL.html が出来上がります。仮にこのファイルがメインページであれば、MTBlogURL は再構築される度に変換されることになります。


次にモジュール化をした場合の例です。同じく DisplayURL というインデックステンプレートを作り、ファイル名は displayURL.php と設定します(拡張子の理由は後述)。テンプレートには下記の内容を設定します。

<html>
 <body>
  <?php readfile("blogURL.html"); ?> *1
 </body>
</html>

モジュール化の場合にはモジュール、つまり緑色で示した blogURL.html という部品を作っておく必要があります。そのために BlogURL という名称で別のインデックステンプレートを作り、blogURL.html を生成する設定を行います。テンプレートの中身は下記の1行です。
<$MTBlogURL$>

予めこのモジュールを単体で再構築しておくと
http://yujiro.dyndns.org/blog/koikikukan/

という内容のスタティックページ blogURL.html が生成されます。
さて、この状態で先の displayURL.php を再構築しても
<html>
 <body>
  <?php readfile("blogURL.html"); ?>
 </body>
</html>

と、内容は変化しません(この「変化しない」ということが重要)。そしてこの後ブラウザで displayURL.php にアクセスすると、このページのHTMLソースは、
<html>
 <body>
  http://yujiro.dyndns.org/blog/koikikukan/
 </body>
</html>

となり、ブラウザに
http://yujiro.dyndns.org/blog/koikikukan/

が表示され <?php ~ ?> の部分がページ表示時に初めて変化することがお分かりになると思います。つまり displayURL.php の再構築時、MTBlogURL を変換するオーバーヘッドが少なくなるということを示しています。


ここでは MTBlogURL という単純なデータで説明しましたが、これが「最近のエントリー」や「カテゴリーリスト」、「月別アーカイブリスト」等で、しかも各アーカイブページテンプレートに対し前者の形で設定されていると、結構なオーバーヘッドになると考えられます。


上記の説明をまとめると、MTタグは再構築時に解析され・実体に変換されますが、PHPスクリプトはページを表示する時に変換された実体をインクルードします。表に示すと下記のようになります。

MTタグPHPスクリプト
再構築実行
ページ表示実行

再構築によるオーバーヘッドを減少させるためには、赤字で実行される部分をできるだけ青字の部分で実行できるように移行する訳です。


前回のもうひとつのパターン

<$MTInclude module="hogehoge"$>

との違いですが、これはを再構築時にモジュール hogehoge をインクルードしてスタティックページを生成するので、効果は再構築と同様という認識です。


なお、PHPがファイルを「phpプログラムである」と認識させるための条件があります。それはPHPスクリプトが記述されたファイルの拡張子が .php であるということです。*2
もしモジュール化したサンプルの拡張子が .html であれば、ブラウザに表示される際のHTMLソースは

<html>
 <body>
  <?php readfile("blogURL.html"); ?>
 </body>
</html>

となるでしょう(つまり何も変わりません)。(つづく)


その1:概要
その2:具体的動作とMTIncludeとの違い
その3:変更方法
その4:再構築オプション利用方法


*1:<?php ~ ?> は「PHPスクリプト」と呼ばれるもので、PHPはこの部分を「PHPのために書かれたプログラムである」と認識して(ページを表示するちょっと前に)処理を実行します。

*2:ApacheというHTTPサーバで「拡張子 .php であればPHPを実行させる」という設定をするので、厳密に言えば環境依存です(設定によっては .html のままPHPを動作させることも可能です)が、ここでは一般的な作法に基づいて説明しています。

Posted by yujiro at 23:58 | Category : モジュール化 | Comments [4] | Trackbacks [0]

2005年03月05日

●タイムスリップグリコ・思い出のマガジン(その2)

2冊目は「平凡」でした。 この雑誌には「ビバビバ!ニューヒット」というヒットソング集の付録があるようで、それもミニチュア版でついていました。
そしてふと付録の裏を見ると、
Posted by yujiro at 12:12 | Category : mono | Comments [11] | Trackbacks [0]

2005年03月04日

●PHPモジュール化の仕組みについて(その1:概要)

ブログでは「PHPモジュール化」という言葉を耳にされる機会が少なくないと思います。このサイトでもよく用いる言葉で用語集にも掲載していますが、PHPモジュール化についての具体的な説明がなかったので改めて書いてみたいと思います。


用語集の繰り返しですがモジュールは「部品」を指します。よく使われるのはサイドバーメニューのモジュール化です。具体的には「最近のエントリー」や「最近のコメント」等のメニューリストのMTタグ部分をメインインデックスやカテゴリーアーカイブ等のテンプレートから分割して、それらをひとつひとつの部品として新たなテンプレートを作ります。
メインインデックスやカテゴリーアーカイブ・日別アーカイブ・個別エントリーアーカイブには部品となった
メニューリスト本体は存在せず、部品をインクルードするタグ

<? readfile("/blog/koikikukan/hogehoge.html"); ?>

を埋め込みます。


PHPモジュール化のメリットは、部品化による作業効率の向上に加え、再構築時の性能向上、つまり時間短縮が挙げられます。
性能の話の前に再構築について分かる範囲で説明致します。スタティックページ生成の場合、再構築を実行することによってテンプレート上の全てのMTタグがMovable Typeのプログラムで解釈され、HTML文書(スタティックページ)が生成されます。仮に半年分で100の記事があり、それらが10カテゴリーに振り分けられているとすれば、サイト全体の再構築を行った場合、計117(メインページ×1・月別アーカイブ×6・カテゴリーアーカイブ×10・個別エントリーアーカイブ×100)のHTMLページが一気に生成されることになります。


生成される情報の中にはリアルタイムな再構築が不要なデータ(ブログ名等)、あるいはエントリーやコメント投稿時のみ再構築されればよいものもあり、これらについては各アーカイブページの再構築と同時に新たに生成する必要はほとんどありません。
つまりPHPモジュール化とは、再構築を頻繁に行う必要がない情報を部品としてまとめておき、必要な時だけ再構築を実行することで時間短縮する手法と認識しています。ただし劇的な短縮を望むものではありません。


PHPを利用しない「テンプレート・モジュール(管理メニュー「テンプレート」の一番下)」を用いたモジュール化もありますが、これは単に情報を部品として分割するだけなので、性能向上というメリットはありません。もちろん作業効率向上やテンプレート編集時の視認性向上という意味ではPHPモジュール化と同様です。ちなみにテンプレートモジュールを用いる場合のインクルードタグは

<$MTInclude module="hogehoge"$>

となります。両者の違いは次回ご説明致します。(つづく)


その1:概要
その2:具体的動作とMTIncludeとの違い
その3:変更方法
その4:再構築オプション利用方法

Posted by yujiro at 23:55 | Category : モジュール化 | Comments [4] | Trackbacks [0]