2009年7月3日金曜日

Inspiron Mini 12 修理

DELL の対応は思ってたより悪くないw電話の担当者が日本語を母国語としてないようなので,意思疎通に多少の難点はあるけど.

○電話から修理完了までのプロセス
6/12 テクニカルサポートに電話する
6/12 メールがくる
6/12 メールで破損部の画像を送る
6/21 連絡がなかったため,メールで破損部の画像を再送する
6/22 メールで連絡がくる
6/23 破損の経緯をメールで伝える
6/23 電話で連絡がくるがとれなかったw
6/23 引き取り日選択についてのメールがきてたが,みてなかったw
6/23 再度電話がきて,引き取り日を確定する
6/23 引き取り日確定についてのメールがくる
6/27 佐川急便さんに Inspiron Mini 12 の本体のみをそのまま渡す
〜修理期間中2回ほど電話がくる〜
7/3 修理完了

○修理箇所
・左側ヒンジ
・HDD(なぜか壊れていて,40GBから80GBになって返ってきたw)

2009年7月2日木曜日

Cyrus IMAP Server エラー

メールサーバ構築の関係で,FreeBSD 上に Cyrus IMAP Server をインストールしてみたんだけど,起動時にこんなエラーがでた.
Jul  3 01:14:18 lucifer ctl_cyrusdb[67112]: DBERROR: error listing log files: DB_NOTFOUND: No matching key/data pair found
Jul 3 01:14:18 lucifer ctl_cyrusdb[67112]: DBERROR: archive /var/imap/db: cyrusdb error

Ports の mail/cyrus-imapd23 と mail/cyrus-imapd22 でこの現象がでた.mail/cyrus-imapd2 は問題なかった.

ソースをちょこっと追ってみたんだけど,動作を完全に理解できなかったのであきらめた.ctl_cyrusdb が定期的に実行されて,checkpoint をつくるらしいんだけど,そこでどうやらエラーを吐いてる.エラーを吐かなくするパッチは簡単につくれるんだけど,なぜエラーになってるのかを完全に追いきれなかったし,このエラーによって生じている問題自体が不明なんだよね…….

追記(2009年7月17日):
コメントを頂いたおかげで解決♪ユーザ作成(メールも1通送信してみた.)すればエラーはでなくなる.運用してみれば解決するというなんとも単純な僕のミスでした.UW-IMAP から Cyrus IMAP Server に移行しようかなぁ…….

2009年6月25日木曜日

FreeBSD でサーバ構築 #14 リレー設定

林檎生活100: FreeBSD でサーバ構築 #13 ドメイン名のメールの受信の続き.今回は,メールクライアントからこのメールサーバをメール送信サーバ(SMTP サーバ)として使用できるように,リレーの設定をする.(次回説明する SMTP-AUTH を使用する場合は,今回の設定は必要ない.)

さて,メールクライアントからメール送信サーバとして使用できるようにするにはどうすればいいのか.逆に言えば,なぜメール送信サーバとして使用できないのかをまず考えよう.

SMTP サーバは,メールを受け取ると基本的には次の2つの処理をする.

1. ローカル配信
2. 転送(リレー)

1のローカル配信は,自ホスト宛のメールということで,どこから送られてきても基本的には受信してローカル配信をする.(メールアドレスさえ知っていれば,誰からのメールでもとりあえず届くよね.)2の転送は,自ホスト宛ではないメールを MX レコードを引いたりして,別のメールサーバに転送するということだ.これをどこから送られてきても処理していたら,問題になってしまうので,転送は制限されている.それゆえ,デフォルトでは,メールクライアントからメール送信サーバとして扱えないようになっている.

なぜ問題になるのか.それは,スパムメールの中継サーバに悪用される可能性があるからだ.(悪用される可能性と書いたけど,誰からのメールでも転送する(オープンリレー)状態で放置しておいたら,スパムを転送しようとしてオープンリレーのサーバを探しているクローラに発見されて悪用される.)なので,FreeBSD の Sendmail では,localhost 以外からのメールを転送はしないようにリレー設定されている.

では,ある特定のホストやユーザからのメールを転送するように設定しようと思う.普通に考えれば,ユーザ認証すればいいんじゃない?と思うところだけど,SMTP はスパムメールという概念すらなかったころの古いプロトコルなのでユーザ認証の仕組みがないんだよね.(ユーザ認証が使えるようにする設定は,次回やろうと思ってはいるんだけどね.)なので今回は,メールは自宅からしか使わないことを前提に,LAN 内のホストからの転送を許可するように設定してみる.

1. /etc/mail/access の変更
リレーを許可するホストを指定するには,/etc/mail/access ファイルに次のような行を追加する.これは,接続したホストの IP アドレスが 192.168.1.xxx であればリレーを許可するというものだ.LAN 内のホストの IP アドレスが 192.168.1.xxx である場合は,この設定でメールクライアントからメール送信サーバとして扱えるようになる.
Connect:192.168.1       RELAY

2. アクセスデータベースを再構築する.
# cd /etc/mail
# make maps

以上で設定完了だ.メールクライアントにこのメールサーバを設定するとリレーが可能になっているはずだ.今回は SMTP サーバと会話してみよう.(ちょくせつ SMTP コマンドを発行するということ.)Mac OS X などサーバではないクライアントから次のようにコマンドを打ってみよう.(適宜ホスト名などは,自分の環境に置き換えてほしい.)
$ telnet 接続先ホスト IP smtp
Trying 接続先ホスト IP...
Connected to 接続先ホスト IP.
Escape character is '^]'.
220 接続先ホスト名 ESMTP Sendmail 8.14.3/8.14.3; Fri, 26 Jun 2009 08:38:17 +0900 (JST)
HELO 接続元ホスト名
250 接続先ホスト名 Hello [接続元ホスト IP], pleased to meet you
MAIL From: 送信元メールアドレス
250 2.1.0 送信元メールアドレス... Sender ok
RCPT To: 送信先メールアドレス
250 2.1.5 送信先メールアドレス... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
To: 送信先メールアドレス
Subject: This is test mail.
This is test mail from Mac OS X.
.
250 2.0.0 n5PNcHsY002853 Message accepted for delivery
QUIT
221 2.0.0 lucifer.legna.org closing connection
Connection closed by foreign host.
$

接続元ホスト IP:192.168.1.7
接続先ホスト IP:192.168.1.255
接続元ホスト名:michael.legna.org(適当で OK.)
接続先ホスト名:lucifer.legna.org
送信元メールアドレス:takuya__at__legna.org
送信先メールアドレス:example__at__example.com

というかんじだ.送信できることを確認してほしい.時間があれば,access の内容を書き換えて実験してみてほしい.また,WAN 側から悪用されるようなリレーが働いていないかどうか,次のサイトにアクセスして調べてみよう.Address to test: の項目に接続先ホスト名 (lucifer.legna.org) を入力し,Test for relay をクリックするだけだ.出力の最後に Relay test result の項があり,All tests performed, no relays accepted. となっていれば WAN 側から悪用されることはないはずだ.

Abuse.net: Mail relay testing



というかんじ.リレーの話を理解してもらえたかな.SMTP がシンプルゆえの設定というかんじ.次回は,Sendmail に SMTP 認証する機能を付加したいと思う.いくつかインストールしなければならないプログラムがあるし,Sendmail をリビリルドしなきゃならないし,かなり面倒くさいかんじなんだよなぁ…….まあ,LAN 内からしか使わないっていう人は,次の回の設定はいらないね.

参考文献:
sendmail 第3版〈VOLUME1〉運用編
sendmail 第3版〈VOLUME2〉設定編
sendmailクックブック―設定と運用のためのレシピ集

FreeBSD でサーバ構築 #13 ドメイン名のメールの受信

林檎生活100: FreeBSD でサーバ構築 #12 メールの受信の続き.今回は,ホスト名 (takuya__at__lucifer.legna.org) ではなく,ドメイン名 (takuya__at__legna.org) のメールを受信できるように設定しよう.

まず何をやらなければならないかを考える.変わったのはメールアドレスのホスト名をドメイン名だけにしたことだ.つまり,ドメイン名 (legna.org) からメールサーバのホスト名 (lucifer.legna.org) を引けるようになる必要がある.つまり,MX レコードにこれを設定する必要がある.そして,Sendmail は,rc.conf に設定されているホスト名 (hostname="lucifer.legna.org") のメールをローカル配信するものとして処理するが,ドメイン名 (legna.org) のメールをローカル配信するものとしては処理しない.よって,ドメイン名のメールをローカル配信するものとしては処理するように設定する必要がある.

それでは,この2点について設定していこう.

1. MX レコードの記述
MX レコードの記述は,次のようにそのまま書ける.(起点名が legna.org だから省略して空白になる.)シリアル番号を増加させることと,named を再起動させることを忘れないように.
          MX 10 lucifer.legna.org.

2. ローカル配信するメールのホスト名の設定
/etc/mail/local-host-names というファイルに,次の内容を記述し,Sendmail を再起動する.このファイルに記述されたホスト名宛のメールについては,ローカル配信するものとして処理するようになる.
legna.org

設定はこれだけ.これで,takuya__at__legna.org というメールアドレスのメールを受信できるようになるので,実際にメールを送って試してみてね.

ローカル配信するメールのホスト名の設定にはいくつか方法があるのだけど,今回は,設定ファイルをビルドする必要がなく,Sendmail を再起動するだけで実現できるこの方法をとることにした.僕としては,この方法がオススメ.

さて,次回は,メールクライアント(Max OS X の Mail や Thunderbird など.) から送信サーバ(SMTP サーバ)として扱えるように設定する.その際に,メールのリレーについての話もする予定.お楽しみに♪

参考文献:
sendmail 第3版〈VOLUME1〉運用編
sendmail 第3版〈VOLUME2〉設定編
sendmailクックブック―設定と運用のためのレシピ集

2009年6月24日水曜日

C 言語の話#4 リスト

リストを林檎生活100: C 言語の話#3 オブジェクト指向プログラミング?のように実装.まあ,スタック的操作しか実装してないけどwイテレータもやればできるもんだね.
/* main.c */
#include <stdio.h>
#include <string.h>
#include "book.h"
#include "list.h"

int main(void)
{
List *books;
Book *book;
Iterator *it;

books = newList();

books->push(books, newBook("伝奇集", "J.L. ボルヘス"));
books->push(books, newBook("ぼく、オタリーマン。", "よしたに"));
books->push(books, newBook("ブタのいどころ", "小泉吉宏"));

it = newIterator(books);
while (it->hasNext(it)) {
book = it->next(it);
printf("%s\t%s\n", book->getTitle(book), book->getAuthor(book));
}
deleteIterator(it);

while ((book = books->pop(books)) != NULL)
deleteBook(book);

deleteList(books);

return 0;
}
/* list.h */
#ifndef __LIST_H__
#define __LIST_H__

typedef struct _List List;
typedef struct _Iterator Iterator;
typedef struct _Element Element;

struct _List {
Element *first;
int ((*push)(List *list, void *data));
void *((*pop)(List *list));
};

struct _Iterator {
Element *e;
int ((*hasNext)(const Iterator *it));
void *((*next)(Iterator *it));
};

List *newList(void);
void deleteList(List *list);

Iterator *newIterator(List *list);
void deleteIterator(Iterator *it);

#endif /* __LIST_H__ */
/* list.c */
#include
#include
#include "list.h"

struct _Element {
Element *next;
void *data;
};

int list_push(List *list, void *data);
void *list_pop(List *list);

int iterator_hasNext(const Iterator *it);
void *iterator_next(Iterator *it);

Element *newElement(Element *e, void *data);
void deleteElement(Element *e);

List *newList(void)
{
List *list;

list = (List *)malloc(sizeof(List));
if (list == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

list->first = NULL;

list->push = list_push;
list->pop = list_pop;

return list;
}

void deleteList(List *list)
{
free(list);
}

int list_push(List *list, void *data)
{
Element *e;

e = newElement(list->first, data);
if (e == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return -1;
}

list->first = e;

return 0;
}

void *list_pop(List *list)
{
Element *e;
void *data;

if (list->first == NULL)
return NULL;

e = list->first;
data = e->data;
list->first = e->next;

deleteElement(e);

return data;
}

Iterator *newIterator(List *list)
{
Iterator *it;

it = (Iterator *)malloc(sizeof(Iterator));
if (it == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

it->e = list->first;

it->hasNext = iterator_hasNext;
it->next = iterator_next;

return it;
}

void deleteIterator(Iterator *it)
{
free(it);
}

int iterator_hasNext(const Iterator *it)
{
return it->e != NULL ? 1 : 0;
}

void *iterator_next(Iterator *it)
{
void *data;

if (!iterator_hasNext(it))
return NULL;

data = it->e->data;
it->e = it->e->next;

return data;
}

Element *newElement(Element *next, void *data)
{
Element *e;

e = (Element *)malloc(sizeof(Element));
if (e == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

e->next = next;
e->data = data;

return e;
}

void deleteElement(Element *e)
{
free(e);
}

2009年6月23日火曜日

Mac OS X の Vim 文字コード

Vim ユーザといいながらも,文字コードまわりを理解していなかった(ダメ

Peace Pipe: Mac 環境構築 その6 - vim の文字コード設定 [mac]

このページが非常に参考になった.

EMOBILE + Interlink マイ IP サービス

FreeBSD でこれを実現すれば,回線引かなくてもサーバ立ち上げることができそう.

今年度中に実験したいなぁ.

参考文献:
EMOBILE
Interlink: マイ IP サービス