技術メモ: 2008年3月アーカイブ
いいめものように、メールを受け取ってアレコレするメールアプリケーションを書くことはよくあるかと思います。
メールサーバとしてpostfixを使うと、こんな具合で実現できます。
#cat /etc/aliases : test:"|/var/mailApp/test.rb"test@example.comでメールを受け取ったら/var/mailApp/test.rbを起動する、という具合です。
それはいいのですけど、この状態でtest.rbでエラーが起きると、メール送信者宛にバウンスメッセージというのが送付されます。
This is the Postfix program at host snares.example.com.
:
The Postfix program
>test@example.com< : Command died with
status 1: "/var/MailApp/mailserver/test.rb". Command output:
/usr/lib/ruby/1.8/logger.rb:518:in `initialize': Permission denied -
/var/MailApp/mailserver/../log/MailServer.log (Errno::EACCES)
from /usr/lib/ruby/1.8/logger.rb:518:in `open' from
/usr/lib/ruby/1.8/logger.rb:518:in `open_logfile' from
/usr/lib/ruby/1.8/logger.rb:487:in `initialize' from
/usr/lib/ruby/1.8/logger.rb:263:in `new' from
/usr/lib/ruby/1.8/logger.rb:263:in `initialize' from
/var/MailApp/mailserver/../common.rb:42:in `new' from
/var/MailApp/mailserver/../common.rb:42 from
!!!エンジニアにとっては背筋の凍り付くような内容です。メールアプリケーションのファイル構成から使っているモジュール、自分がどんなミスをしたかまで送信者に筒抜けになってしまいます。
とりあえず、test.rbの内容をこうしましょう。
begin 元のコード rescue => e exit(-1) end
これで、test.rbがエラーを外にはくことはなくなるので、バウンスメールの内容も、ずいぶん穏当なものになります。
>test@example.com< : Command died with status 255: "/var/MailApp/mailserver/test.rb" Action: failed Status: 5.0.0 Diagnostic-Code: X-Postfix; Command died with status 255: "/var/MailApp/mailserver/test.rb"
ちなみに、posfix 2.3から、バウンスメールの内容をカスタマイズできるようになるらしいです。
Postfix manual - bounce(8)
メールサーバのバージョンアップが待ち遠しいなんて、久しく味わっていない感覚です。
Expression Engine Japanese language pack (日本語版)
早速インストール...
すばらしいです。これはありがたい。ビールでもコーヒーでもおごりますよ!
#といったってどこに住んでいる方かもわからないので^^; とりあえずpaypal donateしておきました。
一応インストールのやり方を説明させて頂くと。
ダウンロードしてきて。
[daisuke@snares ~/tmp] $ wget http://expression-engine.jp/uploads/files/ee_strings_jp.tgzexpressionEngineをインストールしたディレクトリにあるlanguageディレクトリにコピーします。
--10:51:24-- http://expression-engine.jp/uploads/files/ee_strings_jp.tgz
=> `ee_strings_jp.tgz'
Resolving expression-engine.jp... 72.51.37.167
Connecting to expression-engine.jp|72.51.37.167|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 77,973 (76K) [application/x-gzip]
0% [ ] 0 --.--K/s
12% [====> ] 9,851 39.92K/s
57% [=========================> ] 44,603 90.37K/s
100%[=============================================>] 77,973 149.24K/s
10:51:25 (148.85 KB/s) - `ee_strings_jp.tgz' saved [77973/77973]
[daisuke@snares ~/tmp] $ tar xzf ee_strings_jp.tgz
[daisuke@snares ~/tmp] $ ls
ee_strings_jp.tgz japanese
[daisuke@snares ~/tmp] $ cp -r japanese /var/www/html/ee/language/この状態で、EEにログインしてCP Home › My Account › Localization Settings を見ると、Japaneseが選択できるようになっていますので、これを選択してupdateすればできあがりです。
[daisuke@snares ~/tmp] $ ls /var/www/root/html/ee/language/
english index.html japanese
サーバをさわるときは、常に信用できない人間が約一名(自分だ!)いるので、どんな作業でも取り返しがつくようにするのが大切です。
ssh上で行った作業のログをとる - もぎゃろぐ
という具合にしてログをとることで、いざというとき何をしていたか振り返ることができるようになるのですが、設定ファイルに変なことを書いた場合、emacsの修正内容はログに残らないので、まだ若干不安が残ります。
そういえば、masuidriveさんは、「コマンドも含め全てのファイルはSubversionで管理」しているのだそうで。
masuidrive on rails » Blog Archive » masuidrive的プロジェクトの方針
こうしておけば、ファイルに変なこと書いても最悪ロールバックできますので、これは大変いいアイデアだと思います。
具体的にどうやるのか今ひとつわからなかったので躊躇していたのですが、今やってみたら簡単にできたので、ご紹介を。
svnは普通に使いこなせる方が対象ですので、そうでない方は勉強してから試してくださいませ。
Subversionの基礎練習
前提:自分の場合、/usr/local/bin/に自作のミニスクリプトをおいています。ファイル名の後ろに日付をつけたバックアップを用意するbkとか、複数ファイルをいっぺんにcatできるcatsとか。
とりあえず、ホームディレクトリあたりにそういうファイルを一式用意してsvnにインポートします。
[daisuke@snares ~/tmp/mogyalet] $ ls bk cats ddiff [daisuke@snares ~/tmp/mogyalet]$ svn import file:///var/svn/repos/mogyalet -m "initial import" Adding cats Adding bk Adding ddiff
で、/usr/local/bin/に移動してチェックアウトします。
できあがり。bkコマンドをアップデートしたいときには、適当な位置で修正したものをチェックインしたあと、/usr/local/bin/でsudo svn updateとしてやればいいわけです。[daisuke@snares ~/tmp] $ cd /usr/local/bin/ [daisuke@snares /usr/local/bin] $ sudo svn co file:///var/svn/repos/mogyalet ./ A cats A bk A ddiff Checked out revision 2. [daisuke@snares /usr/local/bin] $ ls addcr cats delcr http@ rblsmtpd tcpclient tcpserver argv0 date@ finger@ mconnect recordio tcprules who@ bk ddiff fixcrio mconnect-io tcpcat tcprulescheck
以前この話を聞いたときには
と思ったのですが、今考えると、リポジトリのパスなんて意識するのはチェックアウトするときだけで。疑問なのは、全部のファイルを1モジュールにぶっこむのでしょうか?1コマンド1モジュール? 前者だと取ってくる人がエライことになるので、後者かと思うのですが。そうするとものすごい数のモジュールを 登録することになりますよね。構わないのかなぁ。 あと、適当に名前をつけているとあとで何物かわからないモジュールがたくさんでてきそう。 Re:プロジェクトの始まりはTracから - もぎゃんだいあり。
普段はsvn update しかしないのだから、そんなこと気にする必要がないんですよね。
わからなくなったら、既存のディレクトリに移行してsvn infoで見ることができます。
というわけで、リポジトリ名なんて、file:///var/svn/repos/etc/httpd/conf/とかでいいような気がしてきました。
おまけ:
実行ファイルをsvnに入れるときは、下記を参考に実行ビットつけておくと便利です。
【CGI・Perl】実行可能な属性をファイルに付加する(svn:executable)
2008-05-10 18:44:44追記 設定ファイルも管理する方法は、こちらをご覧くださいませ。[daisuke@snares ~/tmp/mogyalet]$ svn propset svn:executable ON bk cats ddiff property 'svn:executable' set on 'bk' property 'svn:executable' set on 'cats' property 'svn:executable' set on 'ddiff' [daisuke@snares ~/tmp/mogyalet]$ svn commit -m "set executable bits" Sending bk Sending cats Sending ddiff Committed revision 2.
[linux]なんでもsvnで管理する2 - もぎゃろぐ
で、これ一応カスタマイズできるみたいなのですが、その挙動がどうもわかりにくいので、まとめてみました。
カテゴリへのリンクの生成
トップページのサイドバーあたりでカテゴリへのリンクを出したいときは、
{exp:weblog:categories weblog="test" style="linear" }
<a href="{path=main/test}">{category_name}</a>
{/exp:weblog:categories}
という具合にすれば、カテゴリごとに <a href="{path=main/test}">{category_name}</a>
を呼び出してくれます。
Weblog Categories Tag - ExpressionEngine Documentation
通常、これで生成されるリンクは、
http://www.example.com/index.php/main/C1
という具合に、URLの後ろにテンプレートIDがついた物になりますが、
CP Home › Admin › Weblog Administration › Global Weblog Preferences
にある Use Category URL Titles In Links?
をYesにすると、
http://www.example.com//index.php/main/category/Blogging/
というような、カテゴリ名を使ったURLを生成してくれるようになります。
カテゴリページの内容
上記URLで表示されるページはどういう内容になっているのでしょう?
別に特別なテンプレートがあるわけではなくて、
http://www.example.com/index.php/main/
用のテンプレートで生成されます。
ただ、
{exp:weblog:entries}
で取得できるブログの記事は、該当カテゴリの物だけに制限されます。
結果として、{exp:weblog:entries}を使って普通にindexページを生成しておけば、該当カテゴリの記事だけが表示される、というわけです。
一見便利そうなこの仕組みですが、普通のブログツールを使い慣れたデザイナさんが、「カテゴリページのデザインです♪」とか言ってトップページと異なるデザインを持ってきたとたん、破綻します。
つまりトップページと同じテンプレートがカテゴリページにも適応されちゃうので、両方に対応したテンプレートを書かないといけなくなるわけです。
べつにデザイナーさんが悪いわけではなくて、カテゴリーページにはそのカテゴリの概要を書きたいとか、ごく普通の要望だと思います。
{if segment_2 == "category"}
を使って切り分けながら書いていけば、同じテンプレートを使い分けることも不可能ではないですが、本来全然別のページとしてデザインしている物を同じテンプレートにつっこむのはかなり大変です。
で、どうするかというと、いっそindexテンプレートをこんな内容にしてしまいます。
{if segment_2 == "category"}カテゴリページの時は.categoryを呼び出す、そうでないときは.topページを呼び出します。
{embed="main/.category"}
{if:else}
{embed="main/.top"}
{/if}
こうすれば、カテゴリページ用の内容は.categoryに、トップページ用の内容は.topに書くことができて、シンプルなテンプレートにすることができます。
This field contains the title of your weblog entry. Titles can be up to 100 characters in length.
Publish Page - ExpressionEngine Documentation
実際には、日本語35文字を超えたあたりからおかしなことになるようです。
英語圏では十分なのでしょうけど、一文字に2byte3byteを消費するマルチバイト圏を考えると、ちょっと微妙な数字です。
実際、movabletypeでは255byte確保していますし、こんなところケチったって仕方なかろうと思うのですけど。
EEフォーラムを探してみると、同じことを考えている人がいました。
Change title maxlength | ExpressionEngine Community Forums
詳しいやり方を教えて頂いたので、ここでご紹介しておきます。
Be Like Water : Changing the Title Maxlength in Expression Engine
ExpressionEngineのテーブル定義を変更します。
[daisuke@snares /var/www/root/html] $ mysql -u expressionengine -pで、ソースコード側も変更。
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 193 to server version: 4.1.20
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use expressionengine
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_expressionengine |
+----------------------------+
| exp_actions |
:
| exp_weblog_member_groups |
| exp_weblog_titles |
| exp_weblogs |
+----------------------------+
68 rows in set (0.00 sec)
mysql> show create table exp_weblog_titles;
:
`ip_address` varchar(16) NOT NULL default '',
`title` varchar(100) NOT NULL default '',
`url_title` varchar(75) NOT NULL default '',
:
1 row in set (0.00 sec)
mysql> alter table exp_weblog_titles modify title varchar(255);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> show create table exp_weblog_titles;
:
`ip_address` varchar(16) NOT NULL default '',
`title` varchar(255) default NULL,
`url_title` varchar(75) NOT NULL default '',
:
mysql> exit
Bye
[daisuke@snares /var/www/root/html] $
[daisuke@snares /var/www/root/html] $ emacs ee/cp/cp.publish.php以上。とくに再起動とか不要です。
[daisuke@snares /var/www/root/html] $ diff ee/cp/cp.publish.php ee/cp/cp.publish.php~
670c670
< $DSP->input_text('title', $title, '20', '256', 'input', '100%', ($which == 'new' OR $which == 'preview') ? 'onkeyup="liveUrlTitle();"' : '', $convert_ascii)
---
> $DSP->input_text('title', $title, '20', '100', 'input', '100%', ($which == 'new' OR $which == 'preview') ? 'onkeyup="liveUrlTitle();"' : '', $convert_ascii)
動作中のシステムを変更しても大丈夫(変更後は256byteまでの長さが使えるようになります)が、非公式なやり方ですので、どうしても必要なときだけにするのがよいかと思います。
それにしても。
For example, one of my client wanted to write an article in Lao, but it turns out that they needed more than 100 characters for their title.
世界にはラオス語のブログを作る需要なんて存在するんですねぇ。