最初は,いつものミニ手帖で構想を練っていたんだけど・・・。
Nikon D90 + Nikkor 35mm F2D
7日(水)深夜,ようやく,フォトポタ日記の大改造が完了しました。
大改造といっても,外見は何一つ変わっていないので気が付きにくいですが,コメント投稿時の処理レスポンスが向上しました(したはずです・・・)
表向きにはたいした変化ではないのですが,内部的には恐ろしく大変(おいらの知識では・・・)な修正作業となりました。
なにが問題だったのか・・・?
フォトポタ日記の特徴の一つに,記事の左側に大量に並んだ過去記事アイコン(サムネール)があげられます。
既存の商用サービスのブログを見ていると,「過去記事を探検する」のがなかなか難しいと感じることがありました。基本的にページ単位で過去記事をめくって探すしか方法しか無く,一覧でどんな記事があるのかが分かりにくいのが原因ではないかと気づきました。
そこで,せっかく書いたんだから古い記事も見てもらおう,というセコい思いから,カテゴリごとに過去記事をどさっと並べるようにしています。
本ブログの特徴である,ページ左側のアイコン集。ちょっと重いのが難点・・・。
が,この「過去記事アイコン集」を作るのには,サーバーに対してものすごい負担をかけてしまっています。たとえば,「自転車に乗る」カテゴリには200件ほどの記事がありますが,その全ての記事の左側に,200個のアイコンを並べるHTMLコードを作り上げてやる必要があります。
つまり,200×200=400,000回ほど同じ処理をしなければならず,このせいで,サーバに大きな負担をかけ,再構築やコメント投稿では長い時間待たされる一因になっています。
しかも,全部のカテゴリで同じ処理をやっていますので,相当な負担です・・・。
改善しましたよ!
少しでもプログラミングをした人が見れば,「じゃ,アイコン集だけ別のファイルで作っておいて,それを各HTMLファイルから読み込むようにすればいいじゃん」ということに気が付かれるかと思います。ワープロソフトのヘッダやフッタも,一つ作っておいて前ページで共有するということで,同じ仕組みです。
WEBサーバにも同じような機能,つまり,共通に使うファイルを作っておいて,他のファイルから読みだして使う機能があります。
それが,SSI(Server Side Include)です。
以下,もはや誰も興味が無いかもしれませんが,自分への備忘録も兼ねて,今回の改修作業をメモっておきました。
- 全データをバックアップする
- なんかの手違いで(よくやるし)データが喪失すると悲しくしょうがないので,サーバ上で全データをバックアップしました。実はバックアップ作業が一番リスクが高く,コピー元と先を逆にすることがよくあるので,慎重に,慎重に・・・
- カテゴリアーカイブテンプレートを作る
- カテゴリごとにアイコン集を出力するためのテンプレートを作ります。種別はカテゴリアーカイブ,マッピングは各カテゴリのフォルダに「icons.html」みたいなファイル名にしておきました。注意すべきは,すでに標準のカテゴリアーカイブテンプレートが存在しているはずですから,そちらを優先設定にしておく必要があります。
- カテゴリアーカイブテンプレートでアイコン集ファイルを読み込むようにする
- できあがったアイコン集(icons.html)を,各カテゴリファイルでSSIを使って読み込みます。読み込みは,
<!–#include virtual=”/archives/<$MTCategoryBaseName$>/icons.html” –>
という,意味不明な呪文のようなコードで行います。このとき,読み込むファイル名を正確に書かないと,ブラウザの方で(利用者の方で)エラーメッセージがでます。
- 個別記事テンプレートでもアイコン集を読み込むようにする
- フォトポタ日記では,カテゴリ表示も個別表示の時も,同じようにアイコン集が並びます。ですので,個別記事テンプレートでも,カテゴリの時と同じようにSSIでアイコン集をインクルードするようにしておきます。
- サイト全体の拡張子をshtmlに変更する
- なぜだかは全然分からないのですが,SSIを使うためには,ファイルの拡張子をhtmlではなく,shtmlに変更する必要があります。このため,ブログの過去記事フォルダを一回全部削除して,MTの公開設定にある「アーカイブの拡張子」をshtmlにして,サイト全体を再構築します。
- 寝る
- 一日でこんなに一気にできないよ。サラリーマンだし。続きは明日にして一眠り。
- すべての内部参照の拡張子をshtmlに変更する
- これは完全に盲点でした。このブログでは,「この件は過去のこの記事参照♪」みたいな,サイト内での参照をたくさん使っています。これも,なるべく過去記事を見ていただけたらな,という涙ぐましい努力なのですが,すべての記事の拡張子がshtmlに変更になってしまったため,すべての参照箇所で「.html→.shtml」という変換作業を行う必要がでてきました。
- 役立たずのMTの検索・置換機能(ここからが地獄の始まりだ・・・)
- 参照を変更しなければならないのは,自サイト内の参照に限られます。つまり,「http://fotopota.sakuraweb…..html」です。この末尾の「html」だけを「shtml」に変えればいいのです。MTには,全記事を対象とした検索・置換機能が用意されており,さらに正規表現も使えるとのふれこみです。であれば,
検索文:「(fotopota.sakuraweb[^ ]*?).html」
置換文:「$1.shtml」で一発変換できるはずです。が,MTの正規表現は検索文の方にしか使えず,この設定でやってしまうと,全部の参照が「$1shtml」になってしまいます。検索文の方には正規表現が使えるくせに,置換文の方には正規表現(後方参照)が使えないのです・・・。こんなアホ検索機能いらんです!!
- サーバ上で作業してみる
- しょうがないので,ブログのデータ全てをMTのバックアップ機能でXMLファイル形式で出力しました。そして,この中身を,サーバ上のコンソールでsedで変換し,すべての内部参照をhtmlからshtmlに変更しました。そして,全データを復元させて完了です。あ~,しんどかった。と思ったら動かない・・・。MTのバックアップ機能は記事数が500件以上になると不安定かするようで,なんどやっても上手く復元が出来ませんでした。試すこと数十回,これで1日以上かかりました・・・。
- ローカルに落として作業してみる(もはや記事というよりメモ書き・・・)
- もはや,なんの作業をしているのかサッパリ分からなくなってきましたが,サーバ側にSQLiteデータベースの管理ソフト(SQPLiteManager)をインストール。各個別記事テーブル(mt_entry)をローカルPCにエクスポート。で,UTF8を保ったまま,正規表現置換ツール(Devas)を使って,html→shtml変換を実施。テキストエディタ(EmEditor)を使って,5000行前後に分割。細切れになったテーブルデータファイル(中身はSQLのコマンドライン)を,SQPLiteManagerのSQP文実行機能を使って読み込み,mt_entryテーブルを再現。この手法を思いついて実現に至るまで,3日を要しました・・・。
いつしか,ノートはB5サイズに切り替わり・・・。
Nikon D90 + Nikkor 35mm F2D
そして,誰も読めない迷宮状態になっていきました・・・。
Nikon D90 + Nikkor 35mm F2D
というわけで,後半は殴り書きのような書きぶりなってしまいましたが,この3日間の労苦が伝われば幸いであります(^^) いや,しかし,本当に疲れました・・・。
で,速くなったの?
どうなんだろう・・・?
あれから,まだコメントを書き込んでいないので分からないのですが,再構築はべらぼうに高速化しました。
今までは,全データ再構築に30分近くかかっていたのが,なんと,驚きの4分ちょいです。なんとなく,レンサバ会社(さくらインターネット)から,「やたらとサーバに負担をかける困ったちゃん」ブラックリストに載せられるのでは?と危惧していたのですが,こんだけ軽くなれば大丈夫でしょう。
ファイル容量の方も大幅に軽減し,画像データを除いたHTMLファイルだけで比較すると,作業前の62MB→19MBに大幅軽減です。
というわけで,見た目は何一つ変更されていませんが,内部では手に汗握る攻防が繰り広げられたおかげで,今後のフォトポタ日記の余命が少し伸びた気がします。
数日間に渡り,サイトが無くなったり,復活したり,文字化けだらけになったりと色々ご迷惑をお掛け致しました。
さぁ,明日からはいつものとおり,記事書きに専念するとしますか。ふぅ~(^^)
作業中の様子。エディタ,テキストコンバータ,サーバコンソール,データベースコンソール・・・。
- 【2009.10.10追記】
- 過去記事の「改行」が全部無くなっていることが判明し,いちから作業をやり直しましたorz。今度は,FirefoxのSQLite Managerアドオンを使うことで,ローカルPC上で全作業完了です。MovableTypeの全データを格納している,mtdbというSQLiteのデータベースファイルを,ローカルPC上で直接いじることが出来るので,とっっっても便利です。最初からコレにすればよかった・・・。
>amigoさん
こんばんは~
アイコン集をSSIで読み込む,
という改造は簡単~に完成したのですが・・・。
本ブログのファイル拡張子が全部shtmlに変わったため,
過去記事参照用リンクが全部切れてしまいました。
そこからが,地獄の始まりでして・・・(涙)
ちなみに,MTは検索機能がダメダメなことが分かりましたが,
なんと! 頼みの綱のバックアップ&レストア,エクスポート&インポート,
両機能共にダメダメなことも判明しました。
■バックアップ&レストア
レストアすると,もう一個,別のブログが作り上げられます・・・。しかも,記事数が多いと途中で失敗します。「多い」といっても,500件くらいでコケます(涙)
■エクスポート&インポート
標準の記事データのみエクスポートです。おいらのブログでは「関連記事」や「楽天お買い物情報」などの独自データもCustomField機能でくっつけていますが,エクスポートされません・・・
とまぁ,こんな状況です。
これからも,ちゃんとバックアップするには,
DBファイルを自分で(FTPで)ローカルPCに
バックアップしておくことをオススメします~