Archive for category tips

Qmail Tips: 存在しない宛先に届いたスパムメールを一括削除

運用ドメイン名の不特定多数のランダムなメールアドレスにスパムメールが送信されてくることがあります。

MTAがPostfixであれば、不適切な宛先に送信されてきたメールに対しては、即座にエラーを返すので、キューにそのスパムメールが蓄積されることはありません。一方で、MTAとしてQmailを使っている場合には、宛先ドメイン名が正しければ、そのメールが受信され、ローカル配送用キューに格納後に受信者への配送処理が行われます。

そのローカル配送の過程で初めて、その受信者メールボックスが存在するか否かが分かり、存在しなければ、送信者にエラーを返すことになり、そのエラーメールは、リモート配送用キューに格納されます。

大量の存在しない宛先へのメールを受信すると、Qmailが生成するエラーメールによって、リモートキューが一気に膨れ上がります。また、スパムは送信元メールアドレスが詐称されるのが、常ですから、キューのメールは捌けずに長時間滞留し続けることがあります。

そうなると正規ユーザーが当該サーバーから、メール送信をしようとしても、リモートキューのメールが多すぎて、メールが遅延する事象が起こります。

キューには、次のようなエラーメールが溜まることになります。

From: postmaster@mail.example.com
To: info@spammer.example.com
Subject: failure notice

Hi. This is the qmail-send program at mail.example.com.
I'm afraid I wasn't able to deliver your message to the following addresses.
This is a permanent error; I've given up. Sorry it didn't work out.

<hogehoge@mail.example.com>:
Sorry, no mailbox here by that name. (#5.1.1)

これは宛先「hogehoge@mail.example.com」にメールが送られてきたものの、この宛先が存在しないため、送信者である「info@spammer.example.com」に返送しようと生成されたエラーメールのサンプルです。

この「hogehoge」の部分が、ランダムとなっているエラーメールが、リモートキューに大量に溜まるので、それを一括削除することによって、メールの配送遅延を解消させます。エラーメールの一括削除は、次の手順で行います。

キューに溜まっているメール数の確認(Before)

qmHandle が入っていない場合の確認方法。

# find /var/qmail/queue/local -type f | wc -l
10
# find /var/qmail/queue/remote -type f | wc -l
2035

qmHandle が入っている場合は、次の方法で確認できます。
※qmHandle は、qmailに標準添付されないので、別途インストールが必要です。

# qmHandle -s
Messages in local queue: 10
Messages in remote queue: 2035

宛先不明のエラーメールのリストを生成する

# find /var/qmail/queue/mess -type f -exec egrep -l '^Sorry, no mailbox here by that name.' {} \; > /tmp/spam.queue

または

# find /var/qmail/queue/mess -type f -exec egrep -l '^<.*@mail.example.com>:' {} \; > /tmp/spam.queue

エラーメール(スパムメール)の一括削除

エラーメールの抽出が完了したら、Qmailのプロセスを停止してから、そのメールを削除します。次の例では、10通ずつ削除を行っています。

# cat /tmp/spam.queue | xargs -n10 rm

queue-fix によるキューの修復

削除後は、キューの整合性を修復するために queue-fix を実行します。
※queue-fix は、qmailに標準添付されないので、別途インストールが必要です。

# queue-fix -i /var/qmail/queue

キューに溜まっているメール数の確認(After)

キューの修復後に Qmailを起動し、溜まっているメール数を確認します。

# find /var/qmail/queue/local -type f | wc -l
10
# find /var/qmail/queue/remote -type f | wc -l
39

qmHandleがある場合。

# qmHandle  -s
Messages in local queue: 10
Messages in remote queue: 39

リモートキューから、約2,000通のエラーメールが削除されました。

なお、不特定多数の宛先に送信されてくるスパムメールが、一向に止む気配がないなど場合によっては、存在しない宛先に届いたメールを受信直後に削除する方法を取ることもあります。

Qmailの設定によりますが、.qmail-default などの然るべきファイルに /dev/null と書いておくことで、受信メールは削除され、エラーメールを返すことはなくなります。リモートキューにエラーメールが溜まる事象を抑えることができます。

ソフトウェア配布サイト

No Comments

Linux Tips: findで見つけたファイルへのコマンド一括実行

ファイル検索コマンド find を使って、マッチしたファイルやディレクトリに対して、一括して何かコマンドを実行したい場合、オプション(-exec)を使って、それを実現することができます。

以下は、一例ですが、CentOS-5.x(Linux)では、マニュアルの「EXAMPLES」セクションに様々な実行例が紹介されています。

特定パターンのファイルの行数を数える

ファイル名の末尾が「log」または「1桁の数字」で終わるファイルを対象に wc コマンドで行数をカウントします。

$ find /var/log/ -type f \( -name "*log" -or -name "*.[0-9]" \) -exec wc -l {} \;
1643 /var/log/messages.2
368 /var/log/messages.1
2 /var/log/httpd/access_log
2882 /var/log/httpd/error_log

特定パターンのファイルについて、ファイルサイズを調べる

ファイル名の末尾が「log」または「1桁の数字」で終わるファイルを対象に du コマンドでサイズを表示します。

$ find /var/log/ -type f \( -name "*log" -or -name "*.[0-9]" \) -exec du -h {} \;
128K    /var/log/messages.2
28K     /var/log/messages.1
4.0K    /var/log/httpd/access_log
344K    /var/log/httpd/error_log

特定パターンのファイルを一括して圧縮

Linuxのログ世代管理ツール「logrotate」は、デフォルトでログを圧縮しない設定(nocompress)になっており、それを圧縮する設定(compress)に変えたいケースがあります。その場合、既存のログファイルを次のコマンドを使って一括して圧縮することができます。

該当ファイルの一覧表示。

$ find /var/log -type f -name "*.[0-9]"
/var/log/messages.1
/var/log/messages.2
/var/log/httpd/access_log.1
/var/log/httpd/access_log.2
/var/log/httpd/error_log.1
/var/log/httpd/error_log.2

圧縮処理の実行。

$ find /var/log -type f -name "*.[0-9]" -exec gzip {} \;

実行結果の確認。

$ find /var/log -type f -name "*.gz"
/var/log/messages.1.gz
/var/log/messages.2.gz
/var/log/httpd/access_log.1.gz
/var/log/httpd/access_log.2.gz
/var/log/httpd/error_log.1.gz
/var/log/httpd/error_log.2.gz

ファイルの所有者を一括して rootに変更する

特定ユーザー(root)が所有していないファイルの所有者を一括で変更します。

該当ファイルの一覧表示。

$ find log/ ! -user root -name "*.[0-9]" -ls
2619934  332 -rw-rw-r--   1 zabbix   zabbix     333562  6月  1 04:02 log/zabbix/zabbix_agentd.log.1
2619915   20 -rw-r-----   1 nginx    adm         18720  6月  7 04:02 log/nginx/access.log.2
2619919    4 -rw-r-----   1 nginx    adm           264  6月  6 14:57 log/nginx/error.log.1
2619918   76 -rw-r-----   1 nginx    adm         72575  6月  7 04:02 log/nginx/error.log.2
2619921   40 -rw-r-----   1 nginx    adm         37950  6月  6 04:02 log/nginx/access.log.3
2619849   20 -rw-r-----   1 nginx    adm         18853  6月  7 03:59 log/nginx/access.log.1

所有者の一括変更。

$ find log/ ! -user root -name "*.[0-9]" -exec chown root:root {} \;

実行結果の確認。

$ find log/zabbix log/nginx -name "*.[0-9]" -ls
2619934  332 -rw-rw-r--   1 root     root       333562  6月  1 04:02 log/zabbix/zabbix_agentd.log.1
2619915   20 -rw-r-----   1 root     root        18720  6月  7 04:02 log/nginx/access.log.2
2619919    4 -rw-r-----   1 root     root          264  6月  6 14:57 log/nginx/error.log.1
2619918   76 -rw-r-----   1 root     root        72575  6月  7 04:02 log/nginx/error.log.2
2619921   40 -rw-r-----   1 root     root        37950  6月  6 04:02 log/nginx/access.log.3
2619849   20 -rw-r-----   1 root     root        18853  6月  7 03:59 log/nginx/access.log.1

特定パターンのファイルについて、パーミッションを一括変更する

パーミッションが 600 ではないファイルを一括して、パーミッションを 600 に一括変更します。

該当ファイルの一覧表示。

find ./log -type f ! -perm 600 -ls
2619933   28 -rw-r--r--   1 root     logcheck    26925  6月  6 22:46 ./log/messages
2619906    8 -rw-r--r--   1 root     logcheck     7393  6月  2 04:02 ./log/messages.1.gz
2619923   24 -rw-r--r--   1 root     root        22166  5月 27 19:39 ./log/messages.2.gz
2619914    8 -rw-r--r--   1 nginx    adm          6325  6月  7 11:59 ./log/nginx/access.log
2619917    4 -rw-r--r--   1 nginx    adm           231  6月  7 07:48 ./log/nginx/error.log

パーミッションの一括変更。

$ find ./log -type f ! -perm 600 -exec chmod 600 {} \;

実行結果の確認。

$ ls -l ./log/messages* ./log/nginx/*
-rw------- 1 root  logcheck 26925  6月  6 22:46 ./log/messages
-rw------- 1 root  logcheck  7393  6月  2 04:02 ./log/messages.1.gz
-rw------- 1 root  root     22166  5月 27 19:39 ./log/messages.2.gz
-rw------- 1 nginx adm       6325  6月  7 11:59 ./log/nginx/access.log
-rw------- 1 nginx adm        231  6月  7 07:48 ./log/nginx/error.log

このように find コマンドのオプション(-exec)を使うことで、効率的に処理を行うことができます。
検索したいディレクトリの階層数(-maxdepth)などのオプションと組み合わせるのも有効です。

No Comments

ストリートビューの[x]が押しにくい

iPad用の地図ページを作成していて思ったのですが、ストリートビューモードが使いにくいです。
[x](閉じる)が反応しない。。
仕方ないので地図の外にリンクを作りました。

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>

<script>
var LatLng = new google.maps.LatLng(35.3353548, 134.1196615);
var map = new google.maps.Map(document.getElementById(‘gmaps’), {
zoom: 10,
center: LatLng,
});
var panorama = map.getStreetView();
google.maps.event.addListener(panorama, “visible_changed”, function () {
if (panorama.getVisible()){
$(‘#StreetView’).show();
} else {
$(‘#StreetView’).hide();
}
});

function StreetViewClose(){
var panorama = map.getStreetView();
panorama.setVisible();
}
</script>
<div id=”StreetView”><font size=+2><a href=”javascript:StreetViewClose()”>地図に戻る</a></font></div>

No Comments

twitter公式ウィジェットのtweet検索時に日本語のつぶやきのみ検索させる方法

twitterのサイト上では詳細検索オプションを使用することによって検索対象の言語や地域などを指定することが出来ます。

twitterをつぶやいているもののうち地域:日本周辺のつぶやきを抽出

twitter near:JP

しかしこのキーワードを直接ウィジェットのsearchのパラメータとしてセットしても動作しません。

試行錯誤した結果、以下の方法で日本語tweetのみ抽出することが出来ました。

  • widget.jsをダウンロード
  • テキストエディタでwidget.jsを開き以下の部分を検索
    • ※可読性を上げるためにセミコロン; を ;n など改行コード付きに置換した場合、291行目あたりになります

this.url=this._base+this.format+”?q=”+this.search+”

  • 検索した部分に対して “&lang=ja” を追記

this.url=this._base+this.format+”?q=”+this.search+”&lang=ja

  • 編集したwidget.jsを自サイトにアップロード
  • jsファイルの読み込み先をhttp://widgets.twimg.com/j/2/widget.jsから先程アップロードしたURLに変更

ちなみに、lang=jaではなくlocale=jaとした場合は日本国内でのつぶやきが対象となります。

No Comments

mbedについて語りました。

○ツインモーターはんだづけ完了、動作テスト

○wiiリモコンとmbedをBluetoothで接続し、ツインモーターを制御

No Comments

iPhoneでWebサイトの表示が小さい場合の対処法

先日のiPhone自動文字縮小について記述しましたが、今回iPhone向けサイトを構築していて、シミュレータなどと比較すると非常に画像サイズが小さく、縮小されて表示されてしまうという現象となりました。

どうも、iPhoneはデフォルト横幅960pixとしてレンダリングし、それをiPhoneの解像度にあわせて縮小表示するようです。

これを実際のpixelにあわせて表示させるためにはmetaタグにて viewportの指定を行う必要があります。

iPhone3 iPhone3GSの解像度ぴったりにあわせる場合には

<meta name=”viewport” content=”width=320″ />

と指定することによって、サイトを横幅320pixとしてレンダリングして表示されます。

これでも文字が小さいと感じる場合は前回のエントリの-webkit-text-size-adjust とあわせると良いでしょう。

No Comments

iPhoneでWebサイトを表示した場合の文字サイズの調整

iPhoneのsafariではWebサイトを最適に表示するために文字サイズを自動調整する機能を持っています。

しかし、携帯向けのサイトと共通のHTMLで表示した場合に予想外にサイズが小さくなり文字が読みづらくなってしまう場合があります。

この場合、-webkit-text-size-adjust という属性を設定し文字サイズの自動調整をOFFまたは倍率固定することで回避できます。

例:

<html style=”-webkit-text-size-adjust:none;”>

↑自動調整をOFFにする

<html style=”-webkit-text-size-adjust:150%;”>

↑文字サイズを1.5倍にする

No Comments

QステアをArduinoから操作

今回は、タカラトミーのQ STEERをArduinoから操作するハックになります。

先週末、日本橋にある共立電子産業株式会社 3階のセンサー売り場にて赤外線のパーツ類を購入しました。

そんなわけで日曜大工エンジニアです。

○赤外線LED
東芝製 TLN115A(大) 60円
東芝製 TLN119(小) 80円

○赤外線リモコン受信モジュール
EVERLIGHT製 IRM-3638N3 210円

赤外線LED 赤外線リモコン受信モジュール
左からOUTPUT、GND、vcc(2.5-5.5V)
赤外線受信用回路
赤外線受信用回路

赤外線解析用コードは、ArduinoのサイトからInfrared receiver modulesのコードを利用して解析しました。

○キャプチャ値
データーの0と1が点灯、消灯の間隔。
点灯時は常に点灯しているのではなく、ON、OFFを繰り返します。
この繰り返しの間隔次第で変調信号として機能してます。
今回は38khzの変調信号での利用となります。

—- ここから
0    0
1796    0
1796    1
2168    1
2168    0
2648    0
2648    1
3016    1
…. 略
157372    0
158284    0
158284    1
—- ここまで
Qステア赤外線解析のサイトに書かれているのとほぼ同じ値が返ってきてます。

他には、1回の操作で2回同じ信号が送信されており、2回目の信号を送る間隔はch毎に異なっています。
Ach 間隔 7516
Bch 間隔 21860
Cch 間隔 36212
Dch 間隔 50568

チャネル毎に操作する場合は必要と考えれます。

○Ach の前進用サンプルコード
キャプチャした値の点灯間隔をサンプルコードに設定

#define LED 13
unsigned long us = micros();

void setup(){

pinMode(LED , OUTPUT);

}

void loop(){

digitalWrite(LED, LOW);

delay(1000);

int testdata[] = {1796 ,372 ,480 ,368 ,480 ,368 ,480 ,368 ,480 ,372 ,480 ,364 ,912 ,7516 ,1744 ,396 ,480 ,372 ,476 ,368 ,484 ,364 ,484 ,364 ,484 ,368 ,912 ,93576 ,1792 ,372 ,452 ,400 ,480 ,368 ,476 ,368 ,480 ,372 ,480 ,368 ,908 ,7512 ,1772 ,368 ,480 ,372 ,476 ,368 ,480 ,368 ,484 ,364 ,484 ,368 ,908 ,15680 ,1800 ,368 ,456 ,392 ,480 ,368 ,912 };

for (int cnt = 0; cnt < 500; cnt++) {

unsigned long len = testdata[cnt];

if (len == 0) break;

unsigned long us = micros();

do {

digitalWrite(LED, 1 – (cnt&1)); // iが偶数なら赤外線ON、奇数なら0のOFFのまま

delayMicroseconds(8); // キャリア周波数38kHzでON/OFFするよう時間調整

digitalWrite(LED, 0);

delayMicroseconds(7);

} while (long(us + len – micros()) > 0);

}

}

以上が今回のハックの内容となります。

前回と違い非常に安価にラジコンが製作出来ます。

また、赤外線は様々な用途での利用が考えれます。

今後も発想次第で色々作れそうです。

, , , , , , ,

No Comments

その後のラジコン

すっかりブログを書くのを忘れてました。

本日返信がついたので思い出した次第です。

あれから、ラジコンはサーバーに繋いだXBeeを介し、flashやjava applet から操作が可能となりました。

構成図はこんな感じです。先日社内のプレゼンで使った資料の流用になります。

ハード構成図

ネットワーク構成図

Flashから操作できる=Wiiのブラウザからも操作が出来る!。。はずです。

カメラを搭載していないので遠隔から操作は出来ません。今後の課題ですね。

Linuxを搭載するように考えてましたが、消費電力が大きいのと、組み込みLinuxは高価なこともあり、搭載は諦めました。

今後は社内のサービスに何らかの形で技術提供できればと考えております。

, , , , , ,

5 Comments

会社で走らせました

今日は会社にラジコンを持ち込みました。

人生において会社のデスクにラジコン置く機会は幾つあるだろう。。

今回はLinux抜きでXBeeで通信するalpha版です。

beta版ではネットワークを通じサーバーを通じて操作。

正式版ではお茶の間のWiiから操作を目指します(いつになることか

Linux版は現在調整中です。走行するには解決しないといけない問題が幾つかあります。

操縦はWiiリモコンのBlueToothをMacのBlueToothに繋いでます。

MacからラジコンへはXBeeでシリアル通信をしてます。

ラジコンの実装としては、Arduinoにラジコンのバッテリーを繋ぎ、5Vを制御用、VINをモーター用に電源を回しました。

今回、モータードライバー(TB6612FNG)を使い前進後進を可能にしました。

TB6612FNGはネットに解説ページが無くて配線に悩みましたが、解れば非常に扱いやすい子です。

では、会社で撮った動画をどうぞ!!※撮影禁止区域は映っていないはず。。

趣味で作ったラジコンを会社に持ち込んだりする、こんな私のいるソリューション部ですが、現在人材募集中です。たぶん10月いっぱい。

注) ラジコンは作りません

我こそはと思う方はお問い合わせください。なお、WEB開発経験のある経験者でお願いします。

TB6612FNGり

, , , , , , ,

No Comments