SMPPの話

しばらくブログを更新していなかったので、何か書いてみよう..ということになったのですが、CommuniGate Proの機能で、日本で一般企業がを使うにはちょっと難しいSMPPに関する話をしてみます。

携帯電話などで送信出来るショートメッセージ(SMS)について、CommuniGate Proでは、その送信を「サポートしている」ことになっています。
SMSは、内部的にはSMPP(Short Message Peer-to-Peer)プロトコルで通信を行います。

2013年6月現在、CommuniGate Proは、SMPP v3.4に対応していて、確かに、仕組み的には送信可能なのです。

ではなぜ、「日本で一般企業が」使うには難しいのでしょうか?

2013年6月現在は、以下のリンクにより、ドコモの網内でのSMSの仕組みに関する情報が見られます。
http://www.nttdocomo.co.jp/binary/pdf/corporate/technology/rd/technical_journal/bn/vol19_3/vol19_3_012jp.pdf
(※いつリンク切れになるか保証の限りではありません)

CommuniGate Proの管理画面の「設定→リアルタイム→SMPP」のところで、SMPPに関する設定が出来るようになっています。
管理画面では、「SMSCアドレス」とSMSCのID/パスワードを入れるようになっています。

SIP電話網における局側のSIPサーバなどでもそうですが、自サーバ以外に何らかの局側のサーバに向けてSMSを送ることで、SMSは届く動きをします。

SMSでは、そのサービスを支えるサーバは、SMSC(Short Message Service Center)です。

SMSでは、届いた/届かないがリアルタイムに掌握できることと引き替えに、相手の端末は着信して即時に鳴動します。
通常のパソコンによるメールならともかく、人が手で打った携帯電話からのメールではなく、スパムのようなものが、次々着信して携帯電話を鳴動したらイヤですよね。
だから、先ほどのPDFにもあるように、SMSCはドコモの網内に置いて、網外との境の位置にSMS-GWを配置して、インターネット方向からの直接のSMPP接続を許さない構成になっています。

現時点で、ドコモでは、SMS-GWの外側からの接続についても、審査され、許可された限られた業者に、HTTPでの接続を許しているのみです。
キャリア同士の接続(NTT-KDDIの接続のようなもの)が、直接SMPPで結ばれているか否か定かではありませんが、国際SMSが通じるくらいだから、そこはSMPPなのでしょう。

もし、CommuniGate Proの管理画面で、SMSCに接続する設定をして、実際にSMSが送れるとするなら、それは、ドコモの網内、もしくはキャリア間接続のために許可されたアドレスからのみ、接続可能なはずです。

よって、この辺のセキュリティがしっかりしていて、簡単にSMSCに対する接続を許可しない日本の現状において、一般企業が、SMPPを設定して、CommuniGate ProでSMSを送るのは困難なのです。

もし、SMSを提供できるキャリアの関係者の方で、CommuniGate ProでのSMSC接続に興味がある方がおられましたら、是非ご一報ください。

メールサーバの処理をわかりやすく説明してみろとの指摘があったので….

メールの仕組みって、RFCに規定されたものを読めば理解出来る..と言いつつ、実は
読んでもいないし、読んでも何を言われているのかさっぱり??..ってことですかね

その前に、ソケット通信とはなんぞや..とか、TCPとUDPの違いは?..などと、事前
知識があってあたりまえってことで、それも説明し出すと聞く方が長くて耐えられ
ない..ってことなんでしょうか?

まぁ、なんか書くだけ書いてみます。当たり前の話で恥ずかしいんですけどね。
メールが、送信側サーバから受信側サーバに送られ、メールボックスにおさまるまで
の話に限定してみます。

まず、受信側のサーバですが、常時25番ポートという入り口を開けて、いつでもメー
ルが受け付けられるように動いています。

送信側サーバは、その入り口に向けて、メールを送ればいいのですが、世界中のどの
メールサーバに送ったらいいのか?というのを、何で判断するか….これを勘違いし
ている人が多いんですね

 「そりゃ、To:とかCc:とかに書いた宛先を見て送るんだろうよ..」
 「それがどこに書いてあるかって? ヘッダに書いてあるじゃんか!」

..って勘違いですね。
ヘッダにBccなんて書いていないのに、なぜ届くか?..と言えば、それが間違いである
のは理解いただけると思います。

実際には、エンベロープと呼ばれる「受信者のメールボックスには入らないけど、
サーバ上では付加されている情報」を見て判断しています。

メール1本のToやCcなどの中に、複数の会社の宛先を入れると、送信側のメールサーバ
は、複数の受信側メールサーバにメールを送ることになりますが、話を簡単にするため
に、そのうちの、1社に送られたものを対象に話を進めます。

受信側メールサーバに送られるメールには、同じ会社のAさん、Bさん、CさんにCcがつ
いていると思ってください。それでも、メールはまだ、その会社内の宛先を複数含む
1つのメールとして送られてきます。

このメールに、他社の社員のDさんにもCcがついていた場合であっても、受信側メール
サーバに到達した時点での、このメールの「エンベロープ」には、もうDさんの情報は
書かれていない状態になっています。送信側で、送り先の受信側サーバに配送を要求
することのないエンベロープ宛先を取り除くからです。

さて、受信側サーバに到着し始めたメール(メールは一瞬で届くわけではなく、メール
のサイズによっては結構な時間をかけて届きます)は、まずエンベロープやヘッダなど
から順に受け付けられ、メール本文や添付ファイルも全部受け取り、それを「メモリ上
ではなくハードディスクなどの不揮発記憶装置に書き込み終えてから」受け取り成功の
アンサを返すことになっています。

これ、厳密に言うと、ほとんどのソフトはそこまで本当に厳密には動いていなくて、
ライトバックキャッシュや、HDDに組み込まれているキャッシュに入りきり、OSに対す
る書き込み系システムコールが成功したら、成功としているんですけどね。

ハードウェアのキャッシュをライトスルーにして、かつ、OSでsyncモードでマウント
したファイルシステムに受信内容を書くのが、もっとも厳密なわけですけど、それを
やるとディスクの物理速度に足を引っ張られて、大幅にパフォーマンスダウンしてし
まうので、そこまではしないのが普通です。

良いRAIDはキャッシュをSRAMバッテリバックアップで持たせ、さらにサーバもUPSで守り、
停電ぐらいでは「書いたはずだが停電したら1ファイル無くなってる」なんてことを防ぐ
ようにするからです。

あ….話が脱線しました。

一般には、受信し終えたときにディスクに書き込まれるファイルは、メールボックスに
直接入るのではなく、一時ファイルとして記録されます。

大きなメールでは、受信完了までに長い時間がかかるため、別のサーバから、別のメー
ルが次々届くことになります。そういうことに対応できるように、メールサーバは、
マルチスレッドやマルチプロセスで並列処理を行い、1つのメールの受信中にも、別の
スレッドが25番ポートへの着信を待ち受け、次々並列処理で受信が行えるようになって
います。

とはいえ、サーバも無限大の能力があるわけではないですから、並列で受信できる数の
上限は定められているか、設定による可変の上限値が与えられています。

これを超えた並列度でメールが送りつけられてくると、「どのスレッドも25番ポートで
待ち受けていない」状態が生じます。すると、その状態で新たに接続しに来た別のサー
バにとっては、接続を受け付けてもらえない状態が生じるようになります。

….あぁ….どんどん脱線する….

そういうのを、ポートによる死活監視を行うタイプのクラスタリングソフトなんかで、
フェイルオーバー型クラスタにしちゃってると、生きているのにフェイルオーバーが
起こる..ってことになるんですが….濃い話なので先に進みます。

さてさて、とりあえずの受信が済み、一時ファイルになったメールは、宛先となる人
全てのメールボックスに格納されなければなりません。

メールボックスへの配送作業は、それ専用の別スレッドで行うソフトが多く、一時ファ
イルを順番に処理できるように工夫されています。

メールボックスに配送する時点で、エンベロープ情報はもう不要になり、取り除かれて
しまいます。

メールボックスは、mbox形式と、maildir形式に大きく二分されますが、1ファイルに
どんどんメールを追記していくmbox形式は、いくらメール数が増えてもファイル数が
増えず、ディレクトリエントリの取得時間が増加することがない反面、壊れると全部の
内容を失う危険もあるわけですが、maildirでは、よっぽどため込まなければ、処理
速度云々の問題までは出ないので、こっちの方が良いかなぁ..と思われます。

で、ここでCGPの「おぉ!」という部分の一つがあるんです。

Ccとか、グループ配信とかで、1つの同じ内容のメールが、多くの人に配送される場合、
CGPでは、maildir形式において、1個しか実体のファイルを配送しないんですね。

他のメールボックスには、あたかも同じファイルがあるかのように見えるような、
「ハードリンク」を貼るだけなんです。で、読み出されてサーバ上から1人が削除を
するたびにハードリンクが減っていき、最後の1人が消した時点で、メールの本体が
実際に削除される….と。

これにより、グループなどの一斉配信系を多用する場合に、ディスク消費量をうんと
少なくできるし、実際に書き込まないのでディスクの物理的動作を軽減することで、
より高速な配送が出来るようになっているんです。

….あぁ….ホントはまだまだ書きたいのに….

これ以上書いても読み切れないでしょうからこの辺で終わりにします。

既に、ここまで読む人は少ないのかなぁ(笑)

バックアップ系新商品裏話

バックアップ系の新商品がリリースできそうな形になってきたので、裏話を書きます。

もともとは、うちの会社のファイルサーバの体制不備が開発の発端です。
基本的に、担当者のPC内部に重要な情報が記録されるとき、ファイルサーバにも置くように徹底することで、PCがコケてもデータは残るというだけのファイルサーバだったのですが、これがイケてません。
ファイルサーバ自身のバックアップがないのは、貧乏な我が社でもあんまりの体制です。

退職者が出て、PCを初期化したりすると、データが2箇所に保存されていなくなってしまうし、そもそもどこにあるのかがわかりにくい。
で、退職者の扱ったデータの所在がわかりにくいのを解決するために生まれたのが、アイデクサーだったわけです。

ということで、今度の新商品は、ファイルサーバの丸ごとバックアップを以下に容易にするかという観点で作られました。ついでに、共有フォルダであれば、一般PCでもバックアップできちゃうようにと..
要は、我が社自身が便利に使いたいのが発端な訳ですね(汗)

さて、我が社では、開発・サポートを主業務とする関係上、グラフィック・音声・映像データなどの膨大な容量をファイルサーバに置くわけではありません。
このご時世のSATA-HDDは、1発で2TBもあるわけですから、なんとなれば、そこに全部収まるわけで、特段の開発をせずとも、バックアップそのものは出来ます。

しかし今後、ある程度の容量拡張が可能で、バックアップされた中身を容易に検索できるのであれば、それに超したことはありません。

そこで今回は、以下のようなものを開発したのです。

・Windowsファイル共有でアクセス可能な場所なら、どこでも、何台でも連続的にバックアップできる。
・バックアップ元PCにエージェント等を入れないでもバックアップできる
・Windowsファイル共有が可能であれば、バックアップ元のOSは問わない
・Webユーザインターフェースで、バックアップ元の登録やバックアップ時刻設定が簡単にできる
・あとからディスクを追加すれば、LVMでどんどん容量追加してバックアップ先の内蔵ディスクを増やせる
  ※今は1発で最大2TBだけど、将来もっと大きなディスクが出てくれば、もっと大きなバックアップが出来る
・LVMを使ったディスク拡張を、ボタン一発で自動実行するインターフェース搭載
・アイデクサーのエンジンを流用し、バックアップ内の検索をかんたんにできる
・バックアップが行われるたびに、自動的に検索インデックスを再作成する
・検索は、アイデクサー同様、ファイル名・フォルダ名・全文検索対応
・検索時に、オフィス系を含むサムネイル表示・サムネイル拡大が出来る
・アイデクサー同様にEXIF検索やPDF検索も搭載
・基本的にモニタ/キーボード無しで運用できるだけのWebインターフェースの充実
・モニタ無し時の利便性の一環で、Beep音で状況に即したメロディーを流す
・バックアップの終了や使用容量の通知をメールで出す
・もちろん、エラー系の通知も日本語で詳しいメールが出る
・通知は、エラー・警告・一般通知のレベルに分けられ、それぞれ通知先アドレスを変えられる

….どうです。てんこ盛りでしょ(笑)

バックアップ元登録時に、そのバックアップ元をマウントする際に使うユーザ名/パスワードを個別登録するんですけど、登録実行ボタンを押すと、実際にマウント可能かどうかを調査してから登録を受け付ける仕組みになっています。

これを作っているときに思ったのですけど、Windowsファイル共有を対象にするなら、nmblookupでアクセス可能な全マシンをリストして、片っ端からアクセスし、ユーザ名をAdministrator固定で、パスワードの総当たりハックを仕掛け、当たったら勝手にバックアップ元に登録しちゃう仕組みにしたら、そこらのPCの共有部分をみーんな勝手にバックアップできるかも..(汗)..とも思ったのですが、犯罪っぽい臭いがするのでやめました(^^;;

本当はMacのAFPを同様に扱えると、さらに良いなぁ..って思いもあるんですけど、まだ、LinuxからAFPで共有ボリュームをマウントしたりクライアントアクセスしたりする手法の確実性が疑問です。

まぁ、mount -t cifs並に便利なmount -t afp の登場とか、smbclientのように使えるafpclientの出現とかは期待できそうにないけど、暇を見て以下を試してみるのも良いかな..とも思っています。

http://alexthepuffin.googlepages.com/home
http://sourceforge.net/projects/afpfs-ng/

FedoraCore8用みたいですが、おそらく、実際に使うときは、CIFSでバックアップした内容との混在を避けなければならないのは間違いなさそうだし、これを今度はafpdでnetatalkから公開したときに、Mac側でまともに見えるものになるのか..と言う点が最低限クリアされなければいけないと考えています。

混在を避けなければならない理由を細かく書けばきりがないのですけど、Macが、UTF-8の扱いを他と違えていることがもっとも気に入らない点ですね。
MacのUTF-8って、内部的には全角ひらがなの「が」を、「か」+「゛を示すコード」で示し、DVDなんかみたいな外部のメディアの場合は「が」のままで許すとか、よくわからない仕組みになっているんですよ。

他の仕事で、Macが作ったファイルでは相当苦労させられているので、やるときは経験を踏まえてしっかり作らなきゃ行けないと思うし、Mac対応は仮に出来たとしてもずっと先かなぁ(^^;;

フリーのFlashオーサリングソフト Suzuka

 動きのあるホームページを作ろうと思うと外せない選択肢がFlashであろう。最近はちょっとしたホームページならFlashを使っていないサイトはないほどに使われている。Flashを使ったサイトを作ろうとしたら一番手ごろなのは、フリー素材。これを扱っているサイトを見てみると自分の要求に合ったようなFlashアニメーションが見つかるかもしれない。しかしいざオリジナルなFlashアニメーションを作ろうと思ったらなかなか大変である。先ず作成するソフト。本家本元はMacromedia社のFlash Mxというソフトなのだが、お値段が58,000円と、お手頃価格というにはちょっと高い。フリーで、またはシェアウェアでも安いFlashを作成できるオーサリングソフトはないかと探したらSuzukaというのがあった。特徴としては、タイムラインベースでFlashが作成でき、またAction Scriptが使えるので、マウスクリックやキー入力に対応するWebアプリケーションも作成できるようである。
 このソフトを使って自分のホームページのトップイメージ画像を作ってみた。アニメーション的には単純なのだが、30分ぐらいで簡単に作れてしまった
Flashオーサリングソフト Suzuka
 ホームページに設置した実際のFlashアニメーションは、下のバナーをクリックしてご覧頂きたい。

 なかなか良く出来たソフトだが、バージョンが0.8.1.0なのでまだまだ完成の域ではないということなのだろうか。今後のバージョンアップに期待したい。

■Suzukaの窓の杜紹介ページ
http://www.forest.impress.co.jp/lib/pic/video/flash/suzuka.html


ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

携帯サイト用のカレンダー作成

 携帯iモード版のグループウェアを作ろうと考えている。グループウェアに最低限必要なものを挙げるとしたら、予定表掲示板といったところだろうか。予定表といったら、カレンダー表示は欠かせない。そこで簡単なカレンダーを表示するPerlスクリプトを書いてみた。
 カレンダー表示で必要な関数は、先ず該当年月日は、何曜日かを求める関数である。


# ——————————————————————————
# Function : get_day_of_week()
# Parameter: $year:西暦, $mon:月, $day:日
# Return : 曜日番号
# Comment : 指定日の曜日番号を取得する
# ——————————————————————————
sub getDayOfWeek {
  my $year = shift; # 年
  my $mon = shift;  # 月
  my $day = shift;  # 日
  
  if ($mon == 1 or $mon == 2) {
    $year–;
    $mon += 12;
  }
  return ($year + int($year / 4) - int($year/100) + int($year / 400)
    + int((13 * $mon + 8) / 5) + $day) % 7;
}


 次に、該当年の何月は、何日あるかを求める関数である。要するに閏年を計算して月の日数を計算する関数である。


# ——————————————————————————
# Function : getMonthEndDate()
# Parameter: $year:西暦
# Return : 当該年の各月の日数テーブル
# Comment : 当該年の各月の日数テーブルを取得
# ——————————————————————————
sub getMonthEndDate {
  my $year = shift; # 年
  my $mon = shift;  # 月
  my @enddatetbl = (31,28,31,30,31,30,31,31,30,31,30,31);
  if ($year =~ m/\D/) {
    return ();
  }
  if ($year % 4 == 0) {
    if ($year % 100 == 0) {
      if ($year % 400 == 0) {
        $enddatetbl[1] = 29;
      }
      else {
        $enddatetbl[1] = 28;
      }
    }
    else {
      $enddatetbl[1] = 29;
    }
  }
  else {
    $enddatetbl[1] = 28;
  }
  return @enddatetbl[$mon - 1];
}


 さらには携帯iモードでは罫線タグ(TR, TD)などは使えない。限られた狭い画面の中に1ヶ月の暦を表示するのはけっこう難しいのだが、これを何とか解決して表示させたのが下のフレーム内のカレンダーである。一応デフォルト表示は今月を、????年??月の左右の不等号をクリックすると、年月を変えることが出来る。

 実は,これはまだまだ完全ではなく、祝祭日の表示はまだ棚上げの状態である。というのも、振替休日はどうするのかとか、年によって日が変わる休日をどうするかとか、けっこう難しい問題が山積しているからである。

 ここまでのPerlのスクリプトが欲しい方は、下のリンクからダウンロードできる。
http://sunao-labo.main.jp/software/calender_i.lzh


ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

Windows 2000 で大容量ハードディスクを正しく認識させる

 自分は、Windows 2000 Professional をいまだに使い続けている。最近大容量ハードディスクに交換しようとして、YahooオークションでMaxtorの250GBのハードディスクを3800円で購入した。品物が届いて、そのハードディスクをUSB接続のIDEアダプタを使ってWindows2000のPCに接続したら、正しく認識してくれない。オークションで手に入れたものなので、ひょっとしてジャンクをつかまされたかとしばらくそのまま放って置いた。
USB接続IDEアダプタ
 しばらくして、そのハードディスクを買ったのを思い出して、今度はWindows XpのPCで試してみたら、なんとちゃんと認識していた。ということはWindows 2000のシステムの方に、ハードディスクの容量の壁があるということだと想像がついた。
 ネットで調べてみると、どうも128GBか、137GB辺りで容量の壁があるようである。Windows 2000 で、Service Pack 4 がインストールされていればいいのかと思っていたら、それだけでは駄目で、下のようなレジストリの修正が必要だった。
■手順
1.スタートメニューから「ファイル名を指定して実行」を入力し、
  「regedit」と入力する。
2.レジストリエディタが起動したら以下のキーを参照する
  HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Atapi\Parameters\
3.右側の画面で右クリックして「新規」-「DWORD値」を選び、
  「新しい値#1」に「EnableBigLba」と入力する。
4.EnableBigLbaキーをダブルクリックして、「値のデータ」に「1」と入力する。

5.マシンを再起動する。
Win2Kで大容量HDDを認識させるレジストリ登録

以上である


ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

「印鑑印影作成ソフト Stamp It!」の通算ダウンロード数

 この間、、印鑑印影作成ソフト Stamp It!をベクターのライブラリ登録したが、公開ファイルリストを請求したら下のようなメールが来た。重複があったり、身内からのアクセスかもしれないが、通算のダウンロード数が16(2009/02/27時点)だった。多いか少ないかはわからないが、とりあえず試用してくれる人がいるのだと思った。
 まだ問い合わせやクレームのメールは無いのだが、ノンビリ見守っていようと思う。

—– ベクターからのメール ——————————————————————————

素直研究所様(ライブラリ作者番号 :PA0?????)

弊社インターネットサイト「Vector」へのご協力ありがとうございます。
ご要望いただきました、公開作品のリストをお送りいたします。

◆作者紹介のページ◆
http://www.vector.co.jp/vpack/browse/person/an040239.html

◆現在公開されているソフト◆

—-<ライブラリ作品番号:PS472706>—-
印鑑印影作成 Stamp It! 1.0
setupstampIt1.00.zip 09/02/19 2,515,800
概要:印鑑印影を作成し、PDFやExcelファイルに押印できる
通算ダウンロード数:16
http://www.vector.co.jp/soft/winnt/util/se472706.html

———————————————————————————————————


ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

自分のサイト「素直研究所」

 私すなおは、しばらくドラゴン・ネットワークス株式会社からは離れることになるので、自分のサイトへのリンクを残しておきます。「離れる」と言っても、多分外からこのブログへ書き込むことはあるかもしれませんが。
 ちなみに自分のサイトは「素直研究所」。グーグルでこのキーワードで検索すると、今のところトップで自分のサイトの楽天ブログが引っかかってきます。そこにも下のようなバナーがありますので、それでもOKです。
私宛のメールもトップページから送信できます。

ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

 Word Pressは<iframe>タグが使えるようである

 Word PressもFC2ブログも<iframe>タグが使えるようである。
ということは、<iframe>タグが使えるので、Google Mapが使えるということである。
下の地図は、ドラゴン・ネットワークス株式会社の周辺地図である。もともとの地図が良くなくて、会社の前の道が無いのは残念であるが、取りあえず使える。


大きな地図で見る
 Google Map APIを使うとJavaScriptなどを使って、もっとカスタマイズできるようである。但し登録してAPIキーを取得する必要がある。
詳しくは下記URL
http://code.google.com/intl/ja/apis/maps/documentation/index.html

Perl言語でiモード版のバスの時刻表を作ってみた

 ちょっと前にPerl言語の学習がてらに那須高原を走るバスの時刻表を整形して表示するプログラムを作成した話をこのブログに載せたが、今度はこの各停留所毎のバスの時刻表を携帯電話のiモードで表示するプログラムを同じくPerlで作ってみた。下のQRコードを携帯電話でスキャンしてインターネットに接続すれば表示できるはずである。

■バス停留所時刻表
東野バス・黒磯那須地区

 iモード版もWeb版も、同じCSVファイルを参照している。停留所名に~発とか、~着という名前が使われていて、それらを切り飛ばして表示しているのと、折り返し運転が1本のレコードになっているので、往路と復路の時刻を分けて表示するのにちと苦労した。これでちょっとはPerl言語が分かってきたような気がしてきた。