2006.02.11
MTpaginateというpluginを使って、カテゴリーのページを分割する記事をよく見かける。
私のところでは、カテゴリー別ではまだそんなに大きなページになっていないが、トップページはさすがに大きくなってきたので、トップページのみページ分割することにした。
まず、MTPaginate.plでページ分割するためにはphpが動ける必要があるので、Packageで
php5-5.0.4_2 と php5-extensions-1.0 を入れておく。
apacheのhttpd.confのLoadModuleの記述には下記の行が追加されていると思うが、無ければ追加する。
LoadModule php5_module libexec/apache2/libphp5.so
phpが動いているか否かは次の1行のファイルを作ってcheck.phpとでも名前を付けて保存し、ブラウザからアクセスしてみればよい。
<?php phpinfo(); ?>
phpの設定状況などの表示がなされるはずである。
次に、MTPaginate.zipをダウンロードして解凍したMTPaginate.plを /mt/pluginsディレクトリーに入れる。
準備が整ったのでメインページのテンプレートに以下の赤字部分を追加する。
<MTPaginate>
<MTPaginateIfMultiplePages>
<div class="mpage">
<$MTPaginateNavigator format_all="全部読む "
place_all="after" separator=" | ">
</div>
</MTPaginateIfMultiplePages>
<MTPaginateContent max_sections="10">
<MTEntries lastn="500">
----- 省略 ------
<$MTPaginateSectionBreak$>
</MTEntries>
</MTPaginateContent>
<MTPaginateIfMultiplePages>
<div class="mpage">
<$MTPaginateNavigator format_all="全部読む "
place_all="after" separator=" | ">
</div>
</MTPaginateIfMultiplePages>
</MTPaginate>
<MTEntries lastn=”500″> と </MTEntries> の場所を探してそこを基準にすると良い。
そして、テンプレートの出力ファイル名を index.htmlからindex.phpに変え、メインページの保存と再構築を行う。
最後にブログページ内に .htaccessのファイルを作って以下の1行を書いておく。
Redirect permanent /freebsd/index.html /http://uls.fam.cx/freebsd/index.php
これは従来通りindex.htmlにアクセスがあると、index.phpにリダイレクトするためである。
これで、アクセスすれば分割したページが表示される。 出来栄えはこのブログのトップページを見てください。
2006.02.02
以前に1つのIPで2台のサーバを動かす方法を書いた。
一般的には、IPが1つもしくは2つで同一サーバ上で2つのドメインを扱う例は多いが、ここでは1つのサーバで物理的に2台のサーバへのアクセス方法についての試みの記述である。
ところが、サーバを新しく立ち上げ直したら、mod_proxyのmoduleが無く立ち上げられない事態に遭遇した。また、VirtualHost Directiveの書き方も追加修正が必要であることが分かった。
以下に方法を記すことにした。
当然あると思っていたmod_proxy.soが/usr/local/libexec/apache2に無く、既にstatic linkされているのかと思ったが、それも無い。
しかたが無いのでapache2をソースからコンパイルしてmoduleを得ることにした。
まず、ソースのダウンロードであるがダウンロードサイトのリストを見て適当なところから、httpd-2.0.55.tar.gz をダウンロードする。
次に展開してコンパイルするが、このときconfigureでproxyをsharedで指定してからコンパイルする。
# tar xvzf httpd-2.0.55.tar.gz
# cd httpd-2.0.55
# ./configure --enable-rewrite --enable-proxy=shared
# make
これで、modules/proxy/.libsの中にproxy関係のmoduleが
mod_proxy.so
mod_proxy_ftp.so
mod_proxy_connect.so
mod_proxy_http.so
の4つが出来るで、これを/usr/local/libexec/apache2内にコピーする。
# cd modules/proxy/.libs
# cp *.so /usr/local/libexec/apache2
これで、proxy関係のモジュールが得られたので、httpd.confを編集する。
まず、以下の2行の行頭の#を取り、proxy moduleをロードするようにする。
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
さらに、httpd.confの最後に以下を追加。
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin hogehoge@uls.fam.cx
DocumentRoot /web/data
ServerName uls.flets.cds.ne.jp
ErrorLog /var/log/error_log
ProxyPass / http://192.168.1.6/
ProxyPassReverse / http://192.168.1.6/
</VirtualHost>
これで、apacheを再起動したら、私が使っている本来のドメイン名のuls.fam.cxでメインのサーバにアクセス出来、uls.flets.cds.ne.jpでアクセスすれば192.168.1.6のサーバにアクセス出来る。 出来るはずだった。
しかし、外部のproxy経由でアクセスしてみると、全て192.168.1.6に行ってしまう。
しばし、考えたが結局メインのサーバも以下のように追加で指定して解決した。
<VirtualHost *:80>
ServerAdmin hogehoge@uls.fam.cx
DocumentRoot /web/data
ServerName uls.fam.cx
ErrorLog /var/log/error_log
</VirtualHost>
Web関係だけであるが、簡単な設定でIPアドレスが1つでも2台以上のサーバが使えるので便利で素晴らしい。
2006.01.30
昨日は、かなり強引なやり方でhtml形式でしか送れない携帯電話からのメールをpost2blogに引き渡すためのフィルターを書いたが、今朝目覚めると、なんともゴリゴリのフィルターで気になった. しかもhtml形式のメールの受け口とテキスト形式のメールの受け口を分けるのもどうかと思うようになった。
そこで、?単純なテキスト形式でテキストのみ、?テキスト形式だが画像添付あり、?html形式のメールで文章のみ、?html形式のメールで画像添付有りの4つのケースに分けてそれぞれの構成要素を再構築してpost2blogに引き継ぐフィルターを書いた。
若干解説すると、?、?のテキスト形式の場合は、そのままの状態でpost2blogに引き渡す。
?の場合は文章部分がプレインとhtmlにサブパートとして区切られているので、html部分を捨てプレインテキスト部分をテキスト形式の場合と同じになるよう、サブパートの区切り文字列の定義部分を取り除いた後に、サブの区切文字列をメインの区切り文字列(Headerで定義されたboundary)に置き換えた。
?も?と同じように、文章部分のhtml部を取り除き、画像添付部分はそのまま後ろに付けるようにしたものである。
問題は携帯電話の機種により送信ヘッダーが異なるのではと予想される事であるが、私のvodafone 902Tではヘッダーに
Content-Type: multipart/related;Type="multipart/alternative";
boundary="MMSPart_001_c3c794f7_a927_4812_b13e_b3365844b066"
とあり、multipart/relatedで添付ファイルがあるとの判断をするようにした。 普通のメーラーではmultipart/mixedである。
この辺のところは、携帯電話の機種によって異なると思われるので、個々に合わせて変更の必要があるのだろう。 ともかく文末に新しいフィルターのコードを載せて置く。
使い方は前回のと同じで /etc/aliasesもしくはホームディレクトリーの .forwardと名の付けたファイルに記述して使用する。
/etc/aliasesの場合 :
inputaddress: "| /usr/local/bin/html2text | /usr/local/bin/post2blog"
.forwardの場合 :
"| /usr/local/bin/html2text | /usr/local/bin/post2blog"
これで、一応携帯電話からもOutlook Expressでhtml形式で複数の画像を添付してもうまく動いているようだ。
htmlからtext形式へのコンバート : html2text
2006.01.29
そもそもpost2blogは携帯電話からの投稿が出来る、いわゆるmoblogに適したものだが、持っていた携帯電話のディジカメ機能は画素数が少なくて使っていなかった。
そこで、新しい携帯電話に取り替えた(vodone 902T)のだが、画素数は1.92Mピクセルで、これなら使えると思っていた。
ところが、画像を添付するとMMS(Multi Message Service)とか言って必ずhtml形式のメールになり、post2blogでは処理できない。
これでは、携帯を変えた意味がないので強引にhtml形式のメールをテキスト形式に変換する前処理のスクリプトを書いた。
だいたい、html形式のメールフォーマットなど知らないので、これを調べるところから始めた。
受け取ったメールは以下のようになっていた。
From - Sun Jan 29 16:14:11 2006
・
・
Date: Sun, 29 Jan 2006 16:13:48 +0900
Subject: Fw:テスト
Content-Type: multipart/related;Type="multipart/alternative";
Content-Type: multipart/mixed;
boundary="BoundaryXXYYZZ" ・・・・ ?
From: <hogehoge@t.vodafone.ne.jp>
Message-ID: <200601291148513D5E8>
To: hogehoge@uls.fam.cx
Mime-Version: 1.0
X-UIDL: W:##!58A!!;Z0"!6nK!!
--BoundaryXXYYZZ ・・・・ ?
Content-Type: multipart/alternative;
boundary="BaFpaNPqVXR912gDOAspNg" ・・・・ ?
--BaFpaNPqVXR912gDOAspNg ・・・・ ?
Content-Type: text/plain;charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
テストです
--BaFpaNPqVXR912gDOAspNg ・・・・ ?
Content-Type: text/html;charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
<html>
・
・
</body>
</html>
--BaFpaNPqVXR912gDOAspNg ・・・・ ?
--BoundaryXXYYZZ ・・・・ ?
Content-Location: dce99f2f.jpg
Content-ID: <A0001>
Content-Type: image/jpeg;name="DCF_0003~00.jpg"
Content-Transfer-Encoding: base64
/9j/4QFaRXhpZgAATU0AKgAAAAgACgE
・
・
--BoundaryXXYYZZ
これを見ると、赤字で示した区切り文字列(実際はもっと複雑)がヘッダー部で定義され、この区切り文字列で大きく文章部分と画像部分に分けている。
そして、文章部分をさらに青字で示したサブの区切り文字列でプレーンテキスト部とhtml部に分けているのが分かる。
この構造が分かれば、まずヘッダー部の削除線で消した部分をその次の赤字で示したものに置き換え?〜?ならびにhtml部分である?〜?を取り除いて、?の区切り文字列を赤字の文字列に差し替えてやれば、プレーンテキストフォーマットに変換出来ることが分かる。
そこで、文末に添付したようなフィルターをperlで書き(html2text)、post2blogの前に入れてやる。 すなわち /etc/aliaseに以下のように書き足す。
htmladdress: "| /usr/local/bin/html2text | /usr/local/bin/post2blog"
/etc/aliaseに書き加えたらnewaliasesコマンドで変更を反映させれば、これで準備完了です。
かなり、強引なやり方なので、他の携帯電話やメーラーからhtml形式で送って動作するか否かは分からないが、Outlook Expressでhtml形式で送ったところ、機能した。
なお、添付無しのhtml形式の場合は、上記の?〜?は存在せず、?の区切りは最初から赤字の区切りが同じものが入っているので?以降を強制的に切り捨てて、一応は動作している。
本来は1つの入り口でhtmlでもプレーンテキストでも自動的に見分けて処理できるようにすべきかと思うが、手抜きしてhtml形式のメールの入り口とプレーンテキストの入り口を分けて(/etc/aliasに2つ設けて)対処しています。
htmlからtext形式へのコンバート : html2text
2006.01.25
以前に.htaccessの仕様がapache2.0と2.1以降で異なるので2.0を使うと書いた。
しかし、将来を考えると何時までも古い版数のapacheを使い続けるのも問題なので、色々調べてみた。apacheのサイトのDocumentを読んだが分かり難いので、ここに自分の言葉で書いておくことにした。
ざっと、見たところ基本的な方針はrootになれる人は全てhttpd.confで設定すべきで、rootになれない人のために最低限許すとの考えで貫かれているようだ。
それで、いままで気安くAllowOverride Allなどと書いてたのが許されなくなったようだ。
1. htaccessを許す場合
もし、CGIの実行とユーザ認証をDocument Root内において.htaccessでの指定を許すなら(このケースが多いと思う) Document Rootのディレクティブで
AllowOverride Options AuthConfig
となる。 記述は実行名でなくカテゴリーなのが要注意で、ExecCGIではなくOptionsとなる。 そしてディれクティブ内の
# AddHandler cgi-script .cgi
のコメントアウトの#を除いて有効にする。
2. 全てhttpd.confで設定する場合(こちらが正統)
もし、rootで何時も設定するとの方針ならDocument Rootディレクティブで
Options Indexes FollowSymLinks ExecCGI
AllowOverride None
そして、認証を行うページ(仮にabcdとする)に対して新しいディレクティブを作り次のように記述する。
<Directory "/web/data/abcd"> ・・・・ /web/dataがDocument Rootのケース
AuthType Basic
AuthUserFile 設定ファイル
AuthName "メンバーのグループ名" ・・・これは好きな名前でよい
<Limit POST GET>
require valid-user
</Limit>
</Directory>
となる。