Archive for the ‘開発’ Category
以前、「指定したドメインのメールを受け取る」という話で、
個別に指定したドメインは自分で受け取ってしまうということをやったが、
これの応用版として、「指定したドメイン以外はすべて自分で受け取る」
これは、よく大量メールの配信テストなどをしているときに、適当にメールアドレスを作って、
仮に、本当にそのドメインがあったとしても、外にメールが飛ばないということができる。
このような完全一致ではなく、あるパターンに一致したときには・・・となると、
設定に正規表現を使う方がよりスムーズだ。
そのために、Postfixで正規表現が使えるかを確認しよう。
確認方法
#postconf -m btree cidr environ hash ldap nis pcre proxy regexp static unix
のように、regexpやpcreが表示されれば問題ない。
(これからの例はregexpなので、pcreを使う場合の正規表現は別の形になるかもしれない。)
では、具体的に、あるメールアドレスがPostfixはどのように処理されるのだろうか?
http://www.postfix-jp.info/trans-2.2/jhtml/transport.5.html
を見ると、どのようにメールの配信方法が決定されるかがわかる。
以前は、このmydestinationを使ってしまったので、
非常に簡単にまた、直観的に設定できた。
今回は、virtual_mailbox_domainsを使って、
その設定に正規表現を使うようにする。
まず、正規表現を使う場所を決める。
つまり、どの処理から分岐をするか?ということだ。
そこには、そのまま、virtual_mailbox_domains に、 virtual_mailbox_mapsを使うことにした。
まず、以下のファイルを作成する。
/etc/postfix/virtual_mailbox_maps.regexp
/(.*)/!/(coltware.com)$/ /dummy/Maildir/
(ファイル名にルールはありません。)
これで、coltware.comというサーバ以外のサーバは、/dummy/Maildir/というディレクトリにMaildir形式で保存される。
自分サーバ向けは、mydestinationで指定されているので、このように、すべてに一致(.*)で、
かつ(coltware.com)以外ということにした。
本当に設定する前に、正しく正規表現が動くのかテストしましょう。
postmap -q "テストする文字列" regexp:/etc/postfix/virtual_mailbox_maps.regexp
で、結果(/dummy/Maildir/の文字列)が返ってきます。
もちろん、coltware.comのドメインの場合には、何も帰ってきません。
では実際の設定です。
virtual_mailbox_base = / virtual_mailbox_maps = regexp:/etc/postfix/virtual_mailbox_maps.regexp virtual_mailbox_domains = $virtual_mailbox_maps virtual_uid_maps = static:89 virtual_gid_maps = static:89
ここで、virtual_mailbox_baseは、先ほど、/dummy/Maildir/と指定したときに前に、このパスがつくのだが、
私は設定時に今後も完全にパスを指定したかったので”/”としました。
また、
virtual_uid_maps = static:89 virtual_gid_maps = static:89
は、メールファイルが保存されるときの、uidとgidなので、好きなuid,gidを設定してください。
で、この後に、postfixを再起動してください。
とこのようにすることで、自宅内にたてたテストメール配信サーバも、間違っても自分のサーバにしか飛ばないというわけです。
また、いろいろと正規表現をカスタマイズしていくことで、いろいろと出来てきます。
また、今回は、virtual_mailbox_domainsを使いましたが、あるドメインの配信先をsmtpからlocalに変えるという概念のほうが、よりわかりやすいので、transport_mapsを使ってもいいのですが、自分宛にメールが送られてから、そのメールをどのようにするか?
という設定を含めると、自分的には面倒なので使いませんでした。
余談:
これは本文とはまったく関係がないのですが、クラウドなどでよりサーバの設計はアプリケーションエンジニアのほうに仕事が移ってくるでしょう。
それに、このような要件は、サーバ構築で発生するわけではなく、機能定義で出てきます。
したがって、アプリケーションエンジニアがミドルウェアがどの程度までできるか?ということを把握することは非常に大切です。
また、これらの要件がまっさらから作ろうとすると非常に多くのコストがかかってしまいます。
クラウド時代の到達とともに、アプリケーションエンジニアが、サーバ構成・システム構成から設計できることは、スピードとコストを最大限にするためにも、今後ますます重要になってくるのではないでしょうか?
さて、いきなり、反論も出るかとも思うが、私が思うのは、個人の消費と比較してだ。
私事ながら、数年前にマンションを買った。
マンション。それは、個人にとって大きな買い物だ。
だから、いろいろ調べたし、ほかの物件なども見た。
それにも、まして、勢いも必要だ。
でも、それでも、ある部分自分の判断を信じない部分もある。
それが、専門的な評価部分だ。
柱がどうだとか、耐震構造がどうだとか?
あとは、部屋の受け渡しでのチェック。
これは、素人目でもおかしいというところもあるだろうが、
やはり、プロの目から、仕上がりをきちんとチェックしてもらうことにした。
トイレなどの水回りの配管なども調べてくれるからだ。
こういった部分は、おかしなものを見せられ、そして説明を受けたら、おかしいとわかるが、
ただみて、それがおかしいのか、おかしくないのか?はよくわからない。
もちろん、業者はすべて、それが安全とか、問題ないということを言ってくる。
でも、結局は他との比較論であったり、コストとの相対論であったりする部分もあるので、
すべてが完璧とはいかないし、求めてもいない。
なので、やはり、プロのチェックが必要になり、お願いしたのだ。
このように、個人の消費でさえ大きなものは、そのように、消費者の立場のチェックはもとより、
プロの目から、提供者の立場(論理)からのチェックもしているのだ。
もちろん、そのためのコストも別に支払っている。
いわば、判断に対する保険料だ。
では、システムの発注の場合どうだろうか?
システムの発注者と、受注者の間にプロの目をいれないのはなぜだろうか?
「信じている」というとは、ここでいう、心理的なことを言っているのではなく、
契約的というか、手続き的というかの問題であるが、結果的に「信じている」と思う。
仮に、RFPの作成時と納品時を抑えられたら、防げるようなこともたくさんあることも見てきた。
なんで、こんなことも考えられていないの?というシステムが多すぎるからだ。
よくよく聞いたら、そんなことをお願いしていないとか、必要だと認識がなかったとか・・・
いい加減に結果が納品されてきたが、そこを説明された時に納得してしまったとか・・・
たとえば、自動車を個別に開発を仮に依頼するとしたら、仮にお客さんがブレーキの機能を求めなかっとしても、
絶対ブレーキの値段を入れてくるだろう。
ただ、システムの場合には、ブレーキがない時に、それをおかしいといってくれるかどうかは微妙だ。
ブレーキの機能が顧客側の運用側にある場合もあるので、システム提供側はそこまで教えてもらえなければ、
いらぬお節介をするかどうかになってしまうからだ。
でも、そのために、その後、膨大なコストをどちらかが背負うことになったり場合がよくある。
システムの発注と受注の間にも、そのようなシステムのプロの第3者の目が入ったほうがいいと思ったりするのだが、
どうしてそのようなサービスがないのだろうか?
顧客側に立った、システムのプロの目であれば、顧客も意見を言いやすいだろうし、
受注側も、自分たちに有利なようにごまかしているわけでなく、
本当にあるべき姿というのを言いやすくもなるだろうし・・・・
こういった、サービスが見つからないのはなぜなんでしょうか?
契約金のn%で請け負います。ってのがあってもいい気がするのですが・・・
と、たまに知人からの相談を受けていると、こういうのがきちんとサービスとしてあったほうが、
双方のメリットがあり、業界全体がよくなるのではないかと思うのでした・・・・
mod_chxjは、現在、端末の識別設定をXMLで行います。
補足)mod_chxjとは、ドコモ向けにに書かれたhtmlをサーバ側で自動的に各キャリアごとにhtmlの変換やら、画像サイズの変換やらをやってくれるApacheのモジュールです。
まあ、XMLというフォーマット自体もちょっと面倒といえば面倒なのだが、
それ以上に、端末の識別が正規表現というのが非常にめんどくさい。
かといって、CSVやTSVから端末IDからすべて設定というのも、オープンソースという性質から考えてちょっと不親切ですよね。
(だって、端末情報を含めてきちんと提供できるわけでもないわけですから・・・)
特に最近は、「3Gの端末で、とりわけひどい状況にならなければいいんじゃないの!」
という感じで携帯サイトを運用したいと考えれば、1つ1つの端末に対する設定ということをしなくてもいいという判断もあり得ます。
であれば、正規表現でいいのだが、それだと、例外が面倒です。
もちろん正規表現は非常にパワフルなので、できることはできるのだが、例外くらい個別に指定できる方が直感的に理解しやすい。
たとえば、DoCoMo/2.0の端末はほぼ、XHTMLのフォーマットが使えるらしい。
ただしDoCoMo/2.0にも関わらず、D2101V、P2101V、SH2101V、T2101V、N2001、N2002、P2002の端末がXHTMLはだめらしい。
と、ここでふつうにやりたくなるのは、パターンでDoCoMo/2.0の端末はすべてXHTMLでフォーマット。
D210V、・・・・は、個別に例外で除外。つまり、ほかのフォーマットを適用。
ということをしようとすれば、何らかのパターン表現のフォーマット+個別指定のフォーマットというのが理解しやすいいうことになる。
ということで、mod_chxjにTSVから端末情報を読み取り、上書きできるようなパッチを作成し、オリジナルに返しました。
(まだ、反映はされていませんが・・また、以前述べたよう(下記、関連する記事を参照)にこれ以外にも、XHTML関連のCSS対応も返しているので、こちらと合わせて、
だいたい私的に、XHTML端末のサイトを運用するのに、mod_chxjでカバーできるようになったとおもう。)
最近、端末性能が良くなって、以前ほど、画像サイズだ、なんだと気にしなくてもよくなってきたので、
ルーズな運用用途のニーズもあるのではないでしょうか?
まあ、そんな運用にも耐えやすいのは、オープンソースという特性ならではでないでしょうか。
でも、きちんとサービスを継続していくと、結局、個別の指定も必要になってしまうんだけどね。
そこまでの過程としても、いいだろうし・・・・
ということで、結局、個別の指定が必要なんだよねとなってしまったサイトにも、メリットがあるように、
さらに、ちょっとしたおまけとして、TSVでは任意の項目を定義できるようにしました。
mod_chxjで管理していない端末情報をリクエストヘッダに設定するようにしましたので、
使い方によっては、もっと応用できると思います。
オリジナルに反映される頃には、具体的な指定方法とか、使い方を記述できたらと思います。
さて、今回は前回の宣言どおり、configure;make;などの流れです。
これらのツールを autoconf と automakeといいます。
といっても、私も意味がわからないので、とりあえずは、以下を参考にしました。
http://www.02.246.ne.jp/~torutk/cxx/automake/automake.html
autoconfや、automakeで検索すると参考になるようなサイトはそれほどないので、それぞれ見てみるのもいいと思います。
最初は意味を理解して処理をしているのではなく、手順として処理をしているので、
ディレクトリ構造のちょっとした違いだけでもはまってしまいます。(しまいました。)
これらを参考に私も、ほぼ同じように作ってみました。
用意したのは、
/Makefile.am
/src
+-- part1.c
+-- Makefile.am
par1.cの内容
#include <stdio .h>
#include <stdlib .h>
int main(int argc, char const *const *argv, char const *const *env)
{
printf("Hello \n");
}
と例の単なるHelloを表示するだけのプログラムです。
しかし、処理のいたるところでワーニングが出まくります。
無視していいとは書いてありますが、記載ている内容と行っているないように違いがなければ無視していいかもしれませんが、
なんせ、ただ真似ているだけの身として、結果としてうまくいかなかったときに、ただやみくもに探しては時間がかかります。
そこで、もう一度、gccなどを使って、プログラム自体に間違うがないということを確認する上でも、コンパイルだけでもできるようにしておきましょう。
gcc -o part1 part1.c
と、実行してください。-o で出力するファイル名が指定できます。
いやー、恥ずかしながら、私はこのレベルから調べ始めなおしました。
さて、今回の復習。
1)プロジェクトのTOPディレクトリに Makefile.am を用意し、ソースのパスを指定する。
2)ソースディレクトリにMakefile.amを用意する。
3)autoscanを実施し、その結果(configure.scan)からconfigure.ac を作成する
このファイルを編集し、utomakeを使うための記述を行う。
私の場合には、以下の2行を編集・追加を行いました。そのほかは、変わりありません。
AC_INIT(part1, 1.0,[coltware@localhost] ) AM_INIT_AUTOMAKE([foreign])
4)以下のように処理を行う。
aclocal autoheader automake -a -c autoconf
の順に処理を行う。
これで、configureの作成完了。あとは、いつもの通り。
さて、ここまでは、ほぼ、このプロジェクトのみで依存関係が完結しているために、
簡単でしたが次回からは、ここに、aprというApacheで使われている基本的なライブラリを使うあたりまで説明したいと思います。
そして、libxml2とtidyなどを使っていきたいと思っています。
年末くらいから、mod_chxjというApacheのモジュールを触っており、そこで、C言語をとりまく環境とでもいうのだろうか?
こういった部分がよくわからなく、非常にこまった(現在も困っている)。
たとえば、オープンソースを使ってコンパイルとかリンクするにはどうしたらいいの?とかだ。
今はすでに先人がMakefileを作ってくれているので、このあたりをまったく考えなくてもいいのだが・・・やはり、新たにゼロからと考えると、どこから入ればいいのかわからない。
そもそも、私は今、C言語をsyntaxとして触ってはいるが、C言語という環境をつかう経験がない。
したがって、見よう見まねで、見たことがあることは同じようにできるが、ちょっと深ーくなるとどこから触っていいものやら・・・・
そもそも、学生時代にC言語を勉強して、自分で卒論のために書くことにしたときにどうしても、ヘッダファイルだ、リンクだ・・・なんだかんだと環境がめんどくさく、C++Builderや、Javaに乗り換えてしまったのが、今頃になってあだになるとは・・・
個人的には、結構多くの方が、C言語というsyntaxではなく、文化とでもいうのだろう?それに抵抗を感じるのだ。
Linuxを使ってJavaやPHPなどでプログラムをしている。ミドルウェアなども関連して使っている。
Cのソースにちょっと見て、そこの動きがどうなっているのかぐらいはやってもいい。でも、こと環境面までかんがえると・・・と、そういう部分に距離感を感じ、足を踏み込めないということもあるのではなかろうか?
そこで、真面目にC言語の環境というのを基本から勉強することにした。
ただし、一般の本屋さんでふつーに並んでいることをここで書く気にはなれないので、
今まで、
configure
make
make install
と呪文のようにやっているが、自分でつくるプログラムもこれと同じようにできないとともっている。
これがわかれば、たとえ自分でC言語を使わないまでも、オープンソースのインストールなどでつまずいても、自分で糸口がつかみやすいのではないだろうか?
それに、もともと、こういった部分を自分で1つ1つ解決していくのが面倒なのも、C言語からはなれた理由なので、これを自動化することができれば、より自分にとっても身近になるはずだ。
それと、やはり、「郷に入れば郷に従え」で、私もC言語を使ったプログラムはこれでいけるとおもっているので、これに従うほうがいろいろと便利だろう。
ということで、今後、この
configure; make; make install
を見ていく。
ただ、具体的なアプリも作りたいので、やはりApacheのモジュールを例題として考えていこうと思う。
またそこで使う(使いたいと思っている)、aprやlibxml、DB(sqlite,mysql)など具体的に構築する上での環境構築方法を載せられたらと思う。
といっても、今時点、本当によくわからないので、いろいろと間違いや勘違いがふくまれていくとは思いますが・・・・

