sedを使った改行コードの挿入

久しぶりサーバ管理の話。
私のサイトでは気象庁のサイトに毎日一回自動アクセスして前日の気温などのデータを取得してローカルのDBに保存する仕組みを作っています。
curlをで取得したサイトの出力をテキスト操作して必要なデータを取得するだけなのですが、2月の26日以降日々のデータの更新が進んでいないことを発見。
調査を開始してみると、以前、日々のデータ行には改行が入っていたのですが、26日以降改行が削除されて日々のデータが一行にまとまっていることを発見。
この一行を何らかの方法で1日ごとのデータに分割できれば今のシステムをそのまま使用可能です。
調べてみるとこんな感じで変換可能でした。

sed -e ‘/s/(text)/\n/g’

オプションの-eがポイントでした。でもonlineマニュアルを読んでもこの-eの意味がよくわかりませんでした。

 

 

メールサーバ始動 (復刻ページ)

以前のSerendipityブログの記事で比較的アクセスの多いものをWordpressに移行しています。

最近ちょっとご無沙汰でしたが、メールサーバでメールの送受信可能になりました。

AWSの起動時からsendmailが動作していて、メールの送信はできましたが
受信はできませんでした。
もちろんメールサーバへのルーティングができないので当然ですが、Route53で
メールのドメインも設定できるようになったので挑戦してみました。

まずはメールのルーティングのためにRoute53にMXレコードの追加

nantoka7.com MX 10 54.248.89.83

といった感じでMXレコードとしてドメインとアドレスのマッピングを設定。
ちなみにnslookupでMXレコードの検索も可能。

[root@ip-10-162-38-78 ~]# nslookup -type=mx nantoka7.com
Server: 172.16.0.23
Address: 172.16.0.23#53

Non-authoritative answer:
nantoka7.com mail exchanger = 10 54.248.89.83.

Authoritative answers can be found from:

他のサイトでチェックするとMXレコードはIPアドレスを設定しているのではなく、mail.xxxx.com
のようなドメイン名で設定している例が多いのでそのうち直しましょう。

さらにEC2のSecurity Groupでポート25を開けます。
ちょっと怖いですが、httpと同様に全てのIPアドレスに対してオープンしました。

さらに、sendmailの設定ですが、まず以下のファイルを編集します。

/etc/mail/local-host-name
にメールのドメインを設定します。
nantoka7.com
これでxxxx@nantoka7.comのメールアドレスを受け付けるようになります。

最後に以下のファイルを編集します。
/etc/mail/sendmail.cf

以下の行をコメントに変更します。
O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA

そしてsendmailの再起動
/etc/init.d/sendmail restart

netstatで再起動前後のポート25の状態を確認すると、変更前はlocalhostに対してのみ
ポート25(smtp)がオープンしていますが、変更後には全てのIPアドレスに対してポートが
開かれます。

以上でEC2上のsendmailでメールの送受信が可能になりました。

いつものことですが、動いてしまえば簡単ですね。

Bingのオープニング画面のリンクを自動取得

Bingの日替わり画面の画像を毎日自動的に取得しようというプロジェクト。
ページで使われている画像単体のURLを毎日自動的に取得しようということです。
基本的には以下の流れになります。

curlをつかってwww.bing.comにアクセス。
出力データからjpg,mp4をキーにしてサーチ。
さらに構文をばらばらにして、ファイルへのフルパスを取得。
ついでに、その結果を自動的にhtmlフォーマットでサイトにアップ。

データ取得用のスクリプトはこんな感じになります。

 

このスクリプトにて毎日、日付がついたファイル内に各画像へのフルパスが格納されます。curlの出力からコーテーションをスペースに置き換えています。これでスペースで分割されたデータになり、kshのforで扱いやすくなります。forで各エントリからjpgが含まれたもののみをファイルに格納していきます。同様の方法でmp4の動画のフルパスも取得可能です。
次にここからhtmlのページを作成します。

 二つの関数を階層で使用しています。
jpg.で始まるファイルのリストを作成して、そのファイル内のフルパスを一行ずつ取り出して、そこからhtml上のアンカーストリングを作成します。画面上のアンカー名がファイル名と同一ではちょっと悲しいので、日付ストリングだけになるようにしています。
この2種類のスクリプトを毎日cronで実行すれば毎日クリックするだけでBingの背景画像を楽しむことができるはずです。
パールを使えばもう少しスマートにできるかもしれませんが、依然Kshell人間です。

mobiファイル自動転送プロジェクト

先日のmobiファイルをKindle端末へ直接メールする方法ですが、うまく動作するようになりました。入力画面もRadioボタンを使って、新規に作品が追加された場合も一行追加するだけで対応できるようにしました。
今回、Crayon Syntax HighlighterというWordpressのプラグインをインストールしたので、これを使って、コードも綺麗に表示したいと思います。(今まではCodeの表示に苦労していました….)
全体の流れは
htmlのformでGETの実行
JSPでGETの引数解析とJava Toolの起動
Java ToolによってNative Scriptの起動
Native Scriptによってmailxを起動してメール転送 となります。

htmlのフォームはこんな感じです。

ここではKindle上のアカウント名とKindleアカウントに登録しているメールアドレスを入力してもらいます。mobiファイルはRadioボタンによる選択、サブディレクトリはhiddenで指定します。

JSPでは引数のチェックを行って、正しく引数が設定されている場合のみサーブレットを起動します。

 

Javaのツールのコードです。単純にNativeコマンドの実行を行っています。Windowsで動作しているTomcatでは使えませんが、Linux(Unix)上で動作している場合、Unixのツールを簡単に使えるので個人的には重宝しています。
Linuxを単にTomcatを動作させるプラットフォームと考えるよりも、Unixの遺産を使いこなす環境と考えることも個人的には意味があるのではと思います。

Javaのツールのコード

使うスクリプトが増えてきて、引数の多いものを逐次追加しているのはご愛嬌というところで…..

最後にKshで作ったスクリプトになります。

jspのレベルではURLを直接タイプすれば誰でもメールできますが、結局はkindle.comにしかメールできませんし、添付ファイルも指定ディレクトリのものしか添付できませんので、不正に使用されることは無いと考えています。

試験した感想としては自分の通常使うメールクライアントに添付してkindle.comにメールするほうが端末にファイルが転送される時間が短いです。
おそらく、AWSで絞っているのか、sendmailの設定なのかはわかりませんが、私のサーバからAWS内のメールサーバへのメール転送に時間がかかり、さらにその先の転送スピードも遅いように見えます。AWS内でのデータ転送がトラフィックの関係で遅いのか、あるいは、契約上スループットが抑えられているのかは興味深いところです。添付ファイルのサイズが小さいと転送も速いように感じられます。

Kindleドキュメントをサーバから直接Kindle端末にメールする方法

最近、私生活ネタばかりになってしまいましたが、私のサイトの新しいアイディアをひとつ。
青空文庫の吉川英治の作品をmobiファイル化してサイトにアップしていますが、このmobiファイルはユーザの方がPCなりにダウンロードして、その後、メールやUSB接続でさ最終的にKindleに転送しなければいけません。(注:タブレッドなどでダウンロードした端末でmobiファイルをそのまま読んでいるのであればこの必要はありませんね。)
そこで、サーバからKindle端末にmobiファイルの添付されたメールを直接送れば手間が省けます。
最初はBase64のuuencode…..などを考えたのですが、実は私のAmazon Linuxにはmailxというアプリケーションが動作していました。(mailとタイプすると実はこのアプリが動作している。)このmailxには”-a”オプションでファイルを自動的に添付してくれますので、自分でuuencodeなどを使用する必要はありませんでした。
自分のKindle端末にメールを送る場合には実は事前に登録したメールアドレスから到着したメールのみが自分のアカウントに受信され、その後、Kindle端末に転送されます。ですから、自分のアカウントにmobi添付メールを送る場合には自分の登録アドレスがわかりますが、任意の人に使用してもらうには、そのあたりを考慮しなくてはいけません。ちなみにmailxでは”-r”オプションで送信元(返信先)アドレスが指定できます。
おそらく、このようなサービスを行う場合のスクリプトはこんな感じになると思います。

#!/bin/ksh
rm test$$
touch test$$
mail -a musahi01.mobi -s “Musahi01″ -r $2 $1@kindle.com <test$$
rm test$$

引数1としてKindleユーザのアカウント名、引数2としてKindleユーザの登録メールアドレス。Web画面からこのスクリプトを実行するにはjspなりサーブレットを使うのかなと考えています。

Linux serverのJava Audio System

ご無沙汰してしまいました。
ラジオプロジェクトのパーツとして、WAVファイルを再生してG711 U-lawに変換してRTPで送信するClassを作っていますが、PC上ではとりあえず動作するのですがAWSのLinuxサーバ上で起動すると以下のようなエラーが出てしまいます。
java.lang.IllegalArgumentException: No line matching interface TargetDataLine supporting format PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian is supported.
        at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:476)
        at SendRtp.main(SendRtp.java:30)
まだ、確認はしていないのですが、もしかしたら、Linux server上にはAudio Systemが存在しないのかなと思い始めています。単に音声処理のパッケージなどを入れればいいのかも知れませんが、サーバですので、通常マイクもスピーカも存在しないのでそのようなパッケージも基本存在しないのでしょう。
というわけで、とりあえず、音声ファイルの変換ツールをネットから手に入れて音源をG711u-lawフォーマットに変換。このファイルを単に読み出してRTPのパケットのPayloadに入れて送るだけのClassを作ってみました。音楽で実験してみたのですが、音質の悪いAMラジオのようになってしまいました。音質が悪いのは仕方が無いとしてなぜかプチプチというノイズが入りました。きっとどこか私のプログラムが悪いのでしょう。
それをおいても、ラジオを意識するのであればG711では音質がきつそうです。もう少し広い帯域で実現するほうがよさそうです。それからサーバ側で音声変換ができないのであれば送り元のPC側で実施するというのも一つの方法かも知れません。サーバを電波を出す放送所、送り手のPCを放送スタジオとして、スタジオ側で音質を決めてサーバに送信、サーバ側は音声パケットに関しては単に再放送するだけの仕組みでどうでしょう。

sarコマンドのsteal項目

AWSのminimum構成に色々載せて遊んでいるわけですが、その中の一つにApatcheのアクセスログからアクセス相手のアドレスなどの集計を取っています。本来は新規のログのみの解析を行い統計結果だけを集積していくべきですが、サーバ開始ごろに作った機能でしたのでアクセスログ1行についてMySQLの1レコードを作成して保存。さらに1時間に1回そのログのテーブルからアクセス元のIPアドレスリストを作成するという作業をさせています。SQLでいうとこんな感じ。
createSQL(){
print SELECT distinct IPADDRESS INTO OUTFILE \”/tmp/address1_$$.lst\” FROM accesses ORDER BY IPADDRESS;
}
Kshellの中でセレクト文をtempファイルに作成してそれをmysqlの入力にして実行しています。ここでaccessesテーブルのサイズが現在4万件程度です。
 訂正:CPUの使用率が高かったのはこの部分ではありませんでした。検索結果を元に各項目に対してさらにSQL文を作って大量にバッチ処理をしている部分でした。一つ一つの構文は単純なselect文でしたが500行くらいあったのでそこでCPUの使用率が上昇していたみたいです

このコマンドが非常に時間が掛かっていることに最近気がつきました。5分以上掛かっているかも知れません。topで見てもmyslqdのCPU使用率は高止まりしています。さらにsarの出力をみると、こんな感じでした。
03:40:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
03:50:01 AM     all      0.09      0.09      0.10      1.06      0.02     98.64
04:00:01 AM     all      0.12      0.00      0.07      0.48      0.02     99.32
04:10:01 AM     all      0.07      0.00      0.09      0.25      0.02     99.58
04:20:01 AM     all      7.85      0.00      0.29      4.04     37.44     50.37
04:30:01 AM     all      0.22      0.00      0.28      0.47      0.03     99.00
04:40:01 AM     all      0.06      0.00      0.08      0.12      0.04     99.70
カラムがずれていますが、ここで気がついたのが%stealのところ。4:20のところで37.44という数値になっています。マニュアルにはこうありました。
 %steal
                     Percentage of time spent in involuntary wait by the  vir-
                     tual  CPU  or  CPUs  while  the  hypervisor was servicing
                     another virtual processor.
AWSのサーバはVirtualなので実際にはもっとキャパシティの大きなシステム上に動作している小さなエンティティと考えられます。この小さなVirtualサーバがCPUを使用したくても規定値以上は使用できないため”steal”の数値が上昇しているようです。実サーバで単にCPUの使用率が100%になっているのと基本的には同じことと思いますが、過去の経験ではCPUの使用率が100%になるとサーバ全体の動作に関しても問題が派生することが多いのですが、Virtual環境の場合、より大きな環境のコントロール下での状況なのでもしかしたらよりこの一つのサーバ環境としてはより安定的なのではと感じました。
まあ、SQLのクエリーが遅いことに関してはどちらも同じとは思いますが…..

IMAPが動かない…..dovecotの起動

久しぶりに簡単なことではまってしまいました。
サーバ上のメールアカウントの作業を簡単にするためにWindows Live Mailを使ってIMAPでサーバと通信しています。ところが、本日Live Mailを起動するとサーバ側の状態を取得できないとのエラーが発生。ネットワークの問題かと考えてtcpdumpで調べてみてもパケットは到達しているみたい…..
分かってみれば理由は簡単、IMAPサーバとしてdovecotを使っているのですが、これがサーバの再起動後に自動起動していなかっただけでした。(自分で再起動にしていないだけなのですが….)

[root@ip-10-162-38-78 log]# /etc/init.d/dovecot status
dovecot is stopped
[root@ip-10-162-38-78 log]# /etc/init.d/dovecot start
Starting Dovecot Imap:                                     [  OK  ]
[root@ip-10-162-38-78 log]# ps -ef|grep dovecot
root     30414     1  0 12:32 ?        00:00:00 /usr/sbin/dovecot
dovecot  30416 30414  0 12:32 ?        00:00:00 dovecot/anvil
root     30417 30414  0 12:32 ?        00:00:00 dovecot/log
root     30419 30414  0 12:32 ?        00:00:00 dovecot/config
root     30421 29120  0 12:32 pts/0    00:00:00 grep dovecot

AWSのパッチのスケジュールにあわせて大体一ヶ月に1回くらいサーバの再起動を実施していますが、dovecotを導入したのがちょうど先月の末ごろで2日前のサーバの再起動が導入後初の再起動でした。自動起動にすれば忘れないのですが、それではどんなソフトが動いているかも忘れてしまいますので、この後、再起動の際にはdovecotも再起動するようにしたいと思います。