« 前のページ | Home | 次のページ »    [Movabletype ]

2007.01.13

Movabletype関係のperlライブラリー

昨年末にFreeBSDでswap領域を拡張する方法を書いた。
しかし、やはりHDDがあやしく、結局HDDを交換する羽目になった。
そこで、Movabletypeを動かすために、いくつかのperlライブラリーを入れる必要があるが、筆者はmysqlを使っているので、このためにも更にいくつかのperlライブラリーが必要である。
以前にも断片的にかいたが、ここで再度まとめておく。
下記は入れたperlライブラリーである。

(1) p5-Class-DBI-mysql          (/usr/ports/databases)
(2) p5-DBI-DBD                    (/usr/ports/databases)
(3) p5-Image-Info                  (/usr/ports/graphics)
(4) p5-Image-Size                  (/usr/ports/graphics)
(5) p5-SOAP-Lite                  (/usr/ports/net)
(6) p5-Crypt-DSA                 (/usr/ports/security)
(7) p5-POE-Component-Server-XMLRPC     (/usr/ports/devel)

これらをmake install clean で次々に入れる。
p5-SOAP-Liteはnet関係のライブラリーがたくさん含まれているので、post2blogは、
これとImage-Info, Image-Sizeを入れると動作可能となる。
あと、StyleCacherが動かなくて、はまってしまったが、設定は2箇所必要なのです。
 ・メインメニューのページでシステムメニューのところのプラグインをクリックして
  styleCacherを選択して設定
 ・個別エントリーの設定でプラグインでStyleCacherを選択して設定両方に

Theme Root URL: http://uls.fam.cx/mt/mt-static/
Theme Root URL: /web/data/mt/mt-static/themes

とすると、うまく動作した。

2006.02.11

Movabletypeのページ分割

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.01.30

post2blogと携帯電話

昨日は、かなり強引なやり方で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)

そもそも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.03

Berkeley DBからMySQLへ移行(アップデートしました)

以前から、やろうと思っていたBerkeley DBからMySQLへの移行を行いました。
私のところではDBの容量が約6MBであったのが2MBになり、実行速度もだいぶ向上しました。
MySQLはFreeBSDのpackageから入れることを試みたのですが、インストール条件などが指定できないので、portsから入れ直しました。
MySQLのPortsは/usr/ports/databasesにありますが、mysql323, mysql40, mysql50の3つの版数のものが入っています。 Webで調べるとmysql50はまだ問題を抱えているような記述がありましたのでmysql40を入れることにしました。
一度packageで入れると、packageを削除しても完全には消されていなくて、矛盾を生じるので、入れる前にmake deinstallする必要がありました。
それと、DBの作成先はDefaultでは/var/db/mysqlですが、容量の残りがたっぷりの/usr/db/mysqlとすることにしました。 また、文字コードはeucにしたかったので ujisとしました。 最初文字コードをeucと書いたらエラーになりましたが、調べるとeucの指定はujisだと分かりました。
eucなら日本語以外のも中国語のeucもあるし、eucjpでは長いのでujisとしたのだそうです。
なんだか、言い訳じみています。

# mkdir /usr/db
# cd /usr/ports/databases/mysql40-client
# make deinstall
# make WITH_CHARSET=ujis WITH_XCHARSET=all
DB_DIR=/usr/db install clean

だいぶ時間がかかりましたが無事終了して、次にmysql40-serverのインストールです。

# cd ../mysql40-server
# make deinstall
# make WITH_CHARSET=ujis WITH_XCHARSET=all
DB_DIR=/usr/db install clean

インストールオプションはclientと同じですが、同じでないと具合が悪いようです。
次にMovabletypeから使えるように、p5-DBD-mysql40とp5-Class-DBI-mysqlも入れます。
この順序でないと、エラーがでます。 

# cd ../p5-DBD-mysql40
# make install clean
# cd ../p5-Class-DBI-mysql
# make install clean

ここまで、うまく行ったら、Movabletypeのmt.cgiがインストールされているディレクトリーにあるmt-check.cgiをBrowserから起動してDBIとDBDがインストールされていることを確認します。
この確認も取れたら、いよいよDBの作成です。
以下の作業をします。
(1) /usr/local/share/mysql内にあるmy-medium.cnfをmy.cnfの名前で /etcにコピーします。

# cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf

(2) /etc/my.cnf に datadir = /usr/db/mysql の1行を追加

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-locking
datadir = /usr/db/mysql ・・・この行を追加
key_buffer = 16M

(3) /usr/local/binにあるmysql_install_dbを使ってdbを設定します。

# mysql_install_db

(4) /usr/local/etc/rc.d内にあるmysql-server.sh は複雑でうまく動かなかったので、/usr/local/shre/mysql内にある mysql.server を/usr/local/etc/rc.dにコピーしmysql-server.shに名前を変えます。

# cd /usr/local/etc/rc.d
# mv mysql-server.sh mysql-server.org
# cp /usr/local/share/mysql.server ./mysql-server.sh

そして起動

# ./mysql-server.sh start

いよいよ、管理者のパスワードを設定です。

# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 6 to server version: 4.0.17
mysql> set password for root=password('設定するパスワード');
mysql> flush privileges;
mysql> exit
Bye

次にmysqlを再起動し、匿名ユーザーを削除します。
インストール直後、自動で作られていますのでセキュリティの点からも削除します。

# mysql -u root -p
Enter password: 設定したパスワード
mysql> use mysql;
mysql> delete from user where password=' ';
mysql> flush privileges;
mysql> exit
Bye

いよいよ、mysqlを起動してDBを作ります。 DBの名前はmtdbとしました。

# mysql -u root -p
Enter password: パスワード
mysql> create database mtdb;
Query OK, 1 row affected (0.00 sec)
mysql>

続いて、MovableType用のデータベースユーザーを作ります。
ユーザー名を mtuser としましたが、作ったデータベース mtdb に対してのすべての権限を与えます。
パスワードはMovabletypeが使うもので新しく決めて、後ほどmt-config-cgiにも書き込みます。

mysql> use mysql;
mysql> grant all privileges on mtdb.*
to mtuser@localhost identified by 'パスワード';
Query OK, 0 rows affected (0.13 sec)
mysql> flush privileges;
mysql> exit
Bye

以上で完了です。
データベース上のテーブルは、MovableTypeが自動で作ります。
mysqlのコマンドは語句にスペルミスがあったりするとエラーになりますので、文末の”;”まで含めて正確に入れるのが要注意点です。
さて、いよいよDBの移行作業です。
mt.cgiのあるディレクトリーにあるmt-config.cgiのコメントアウトされている下記の部分を編集します。
パスワードはDBの作成でmtuserに与えたパスワードです。

ObjectDriver DBI::mysql
Database mtdb
DBUser mtuser
DBPassword パスワード
DBHost localhost

このとき DataSource ./db の設定はそのまま残しておきます。
そして、Brawserから mt-db2sql.cgi を起動します。
設定が正しければ、画面に延々と数字らしきものが表示され、かなりの時間の経過後に All well doneだったと思うが、うまく行ったメッセージが出て終了します。
ここで、先のmt-config.cgiのDataSource ./dbをコメントアウトする。
実際のdbディレクトリは消してもかまわないが、移行したものが正しく動作することが確認されるまでは、取っておくか、名前を変えて温存した方が無難でしょう。
結構、こまかい作業だが、順を追ってやって行けば移行作業は完了します。

« Previous | Next »