C++/STLで日本語メール送信(base64)

地震でここしばらくブログの更新を自粛しておりましたが、自分でできることをやるのが一番ということで、ブログの更新を再開します。   ブログビューワーのリリースを行おうかとおもっとりましたが、その間にADPもアップデートがあったのと、その中で、久しぶりにC++/STLネタができたので、今回はC++/STLネタを披露いたします。 ちなみに、このブログで一番アクセス数が多い記事は、C++/STLでCSVファイルの読み込みで、一時期、自作機向けWindows7のKernel-Power 41病対策のアクセス数が首位に躍り出たのですが、再びCSVが首位に返り咲きました。『おまえらどれだけCSVやねん』と突っ込みたくなるのですが、次の刺客ということで、日本語メール送信を送り込みます。 コードは長くなるので呼び出し部分のみ以下に示します。全ソースのダウンロードは、プラットホーム別に以下のとおりです(ソースの内容自体は同じでプラットフォームに合わせて日本語のエンコードを変えています)。   Windows版(Shift_JIS)
Linux版(utf-8)
 
int main(void)
{
#ifdef _WIN32
        WSADATA	wsaData;
        WSAStartup( 0x0101, &wsaData);
        string	charset = "Shift_JIS ";
#else
        string	charset = "utf-8";
#endif

        string	smtpserver("mail");
        string	to("to_address@example.com");
        string	cc("");
        string	bcc("");
        string     from("from_address@example.com");
        string	subject("サブジェクト");
        string	text("メール本文");

        cout << subject << ":" << text << endl;

        if ( !sendmail( smtpserver, to, cc, bcc, from, subject, text, charset) ) {
                cout << "Error Send Mail.";
                return 1;
        }

#ifdef _WIN32
        WSACleanup();
#endif
        return 0;
}
  各パラメータに値をセットして、sendmail関数を呼び出します。あて先(to,cc等)が複数ある場合はコンマ , で区切ります。サブジェクト(件名)とメールの本文のみ日本語OKです。使用している文字コードをcharsetで指定します。 例では、WindowsがShift_JISで、それ以外がutf-8になっていますが、Windowsでutf-8を使うことも可能です。 (もちろんメールの件名や本文で使用する文字コードをutf-8にする必要があります)。   日本語の取り扱いについてですが、昔、日本語メールと言えば、JISコードに変換して送るという風にやっておったのですが、最近のメーラは適切に処理をすれば(文字コードを指定し、base64等で適切にエンコードする)文字コードを変換する必要がなくそのまま送信できるようです。このプログラムもそのまま送信しています。 ちなみに、このプログラムにはbase64のエンコード・デコードも入っています。詳しくはソースをご覧ください。   コンパイルに際して注意があります。char をunsigned charとしてコンパイルする必要があります。 gccでは、
g++ -funsigned-char sendmail.cpp
のように -funsigned-char オプションを使用してコンパイルします。 Visual Studio 2008の場合は、プロジェクトのプロパティ→構成プロパティ→C/C++→言語→char型を規定でunsigned を はい にします(または/Jオプションを指定します)。   このプログラムは、以下の環境で動作確認しました。  Linux:Centos 5.5  Windows: Visual Studio 2008 professional / Windows 7 ulitimate 64bit (32ビットモードでコンパイル)
2011-03-29 | コメント:2件



電気使用状況データ表示WEBアプリ

3月11日の東北関東大震災、被災者の方には心からお見舞い申し上げます。一日も早い復旧を願っています。   こういうときはITエンジニアはあまり用がないかとも思っておったのですが、『東電が電気使用状況データをCSVで公開 「アプリ作ったら知らせて」と経産省』という記事を読み、少しでもお役にたとうとWEBアプリを私も作成してみました。 以下のようにiframeで差込ができようにシンプルに作りました。ご自由にご使用いただければと思います。  

  当面、データをアップデートします。毎時、5分、15分、25分、35分、45分、55分に東電のサイト(電力の使用状況グラフ(当社サービスエリア内))にデータを取りにいきます。   簡単に説明しますと、取得できた最近の1時間毎の電力消費量(単位が万KW)で表示しています。括弧内の%は、ピーク供給力に対する電力消費量の割合(%)を表示しています。 色ですが、90%以上で赤字になります。80~90%がオレンジ、それ以下が緑色になります。 前日差は、前日の同時刻帯の電力消費量の差分を%で表示します。   表示の内容につきましては無保証です。自己責任でご使用下さい。
2011-03-25 | コメント:0件



e-Taxで個人の確定申告

 確定申告の時期ですが、今年はe-Taxで申告しました。という訳で今回はそのレポート。 いきなり結論ですが、個人の確定申告の場合、e-Taxは便利かと思います。特に良いところは、いちいち手で書かなくてもよく、ほとんど自動で転記してくれるので手間がかかりません。また今年(?)まで、初めてe-Taxで申告する方は、5,000円の税額の控除があります。いくつか準備が必要ですし、こういう話もありますが、準備は1回ですみますし、それを補ってあまるぐらい便利でしたので、今からでも間に合いますのでよろしければご参考にしていただければと思います。 もっとも、今まで確定申告をご自身でやったことない方(税理士等にまかせっきりで内容を確認していないとか初めての確定申告とか)はちょっと厳しいかと思いますのでそのあたりは充分にご検討された方がよろしいかと思います。   ※注意! 私と当局の方とはまったく関係がございません。本ページの記載内容はあくまでも個人が試した結果であり、間違い等がありましても著者は一切責任を取りませんのであらかじめご了承ください。   ■必要(使った)なもの  ・ICカードリーダー(私が使ったもの)  ・住民基本台帳カード  ・電子証明書(住民基本台帳カードにインストールする)   ICカードリーダーは3千円で購入しました。住民基本台帳カードと電子証明書は役所で入手できます。手数料は、それぞれ5百円(計千円)掛かりました。カードと証明書は、即日発行できるところや2週間程度かかるところ、住民基本台帳カードのみ取り扱うところとかありますので役所のホームページで確認した方がよろしいでしょう。今からでしたらぎりぎり間に合うかと思います。    ■環境の構築(事前セットアップ)  詳しくはe-Taxのページを読んで頂くことになりますが、事前にソフトウェアをインストールする必要があります。ちなみに私はWindows7 64bit ulitimateで環境を構築しましたが正常に動作しました。   ■私がはまったところ  詳しい使い方は、e-Taxのページを見ていただければと思いますが、数年間に渡りいろいろバージョンアップを重ねたようで個人の確定申告に関してはだいぶ使いやすくなったかと思います。通常の給与所得者の申告もできますし、青色申告にも対応しています。 一応私はソフトウェア関係のプロですし、確定申告も何回かやっているので要領はわかっているつもりですが、それでもいくつかはまりました。以下、私がはまった点を紹介します。
  • 番号取得時(初回)のリンクと、作成再開のリンクが異なる - 当たり前かもしれませんが、初回のリンクと作成再開のリンクが異なります。この画面の大きなボタンの『作成開始』というのが初回にクリックするボタンで、『作成再開』が2回目以降にクリックするボタンです。ちなみに、2回目以降に使用するというのは入力処理を中断して再開する場合を指し、その際にデータを保存しておく必要があります。  
  • カードリーダー周りのトラブル - カードリーダー周りで2つ程、軽微なトラブルがありました。1つは事前セットアップ後に、プログラムグループの『公的個人認証サービス』から『ICカードリーダライタ設定』を実行しておく必要があるがその説明がFAQにしかないのでカード読み込み時にエラーになる点と、もう1つは、設定後でもカードリーダーが上手く読み込めないことがありその場合に一旦「戻る」をクリックし画面を戻し、もう一度進めると上手くいくことがありました。  
  • ヘルプデスクの担当者について - 2回程電話をしましてあくまでもその範囲内での意見ですが、ヘルプデスクの人に当り外れがあります。確定申告の規則がややこしいので全部を覚えきれないのでしょうが、いい加減と受け取れる回答をする方がいらっしゃいましたのでその場合は、1.『そんなはずはない』と言って上の人に調べてもらう(エスカレーションしてもうらう)か、2.かけ直して知っていそうな方に当たるまでがんばるか、しましょう。  
  • 間違えて申告した場合 - 一旦送付した後に間違いに気づいたのですが、ヘルプデスクに確認しましたところ電子申告自体は何度でもでき、最後に申告したものが有効になるとのことで、そのままもう一度申告しました(データを保存していたので修正して電子申告しました)。  
  とまぁ、こんなところで私と嫁の確定申告が2時間半で終わりました(去年は半日かけました)。  
2011-02-28 | コメント:0件



MVCの議論でみるプログラミングパラダイムに対する距離のとり方

OpenBlocks600の記事で紹介しましたブログビューアーですが、その後、バグ修正やRSS関係の対応をしてから1週間経ち、apacheのエラーログにもエラーが出ていないので、そろそろリリースしようかなと思いソースを眺めていたのですが、あまり教示的なソースでなく『公開すべきか、せざるべきか・・・』と悩んでおったのですが、こういうときは他人はどうしているのかと、最近のWEBアプリの動向でも探ろうかとネットを検索しましたところ、面白い記事を見つけました。   http://satoshi.blogs.com/life/2009/10/rails_mvc.html Ruby on Railsの「えせMVC」の弊害   http://satoshi.blogs.com/life/2009/10/ormappingmvc.html O/Rマッピング技術の進化が皮肉にも助長している「えせMVC症候群」    ブログ主(Satoshi Nakajimaさん)の主張ですが、要するにモデルとコントローラの役割はきちんと分けようねということで、『ビジネスロジックをコントローラに書くのはNG』とのことのようです。 ちなみに私ですが、ちょい書きのアプリだとまぁコントローラでビジネスロジックどころか、SQLを書いたりします。またブログビューアーの構造も思いっきりMVCモデルから逸脱しているので・・・という訳でブログビューアーを書き直そうかなとか思ったのですが、もう少し調べてみようということで、以下、Rubyの作者のまつもとさんの記事を見つけました。   http://itpro.nikkeibp.co.jp/article/COLUMN/20080610/307218/ まつもと直伝 プログラミングのオキテ 第20回 MVCとRuby on Rails   この記事の7ページ目の表2にRailsのMVCということで従来のMVCとの比較がありますが、その表から2パラグラフ目の説明を引用しますと  
 一方,HTTPの性質によってUI部分の複雑さはWebブラウザに任せてしまっているWebアプリケーションでは,相対的にUI層が薄くなります。コントローラ相当はほぼ汎用品で十分ですし,モデルとビューのインタラクションも不要です。ですから,モデルをデータベース層とビジネス・ロジック層に分割して,下層をモデル,上層をコントローラと呼ぶようにしたのでしょう。
   ということで、まつもとさんの説によるとビジネス・ロジック層はコントローラに記述することになるようです。 かの有名なRubyの作者のまつもとさんが、このように言っておられるのでこの勝負は『Railsでは、ビジネス・ロジック層はコントローラに記述する』で軍配が上がりそうですが、実は先のブログ主さん(Satoshi Nakajimaさん)も知る日とぞ知る方で、過去にマイクロソフト社に勤務されておりWindows95の開発では、Windows3.1との互換性を保つために尽力されたらしく、そのあたりの話はこちらで参照できます。また先の主張は、実際にRuby on Railsを使ったプロジェクト通して行き着いたようでしてそれなりに説得力があります。   このように著名なエンジニアの見解が異なる場合、どのように解釈すればよいのか悩ましいところですが、実行速度についてとか明確に白黒つく場合のように客観的に測定できる事実が無い場合、 『どちらでも良い』 というのが私の経験から来る見解になります。 この手の議論はエンジニアを引き付けるものがあり、熱くなったりするのですが、議論してもみのりは少なかったりします。 私も過去にこの手の議論に巻き込まれたことがあるのですが、特に個々のエンジニアが持つバックグランドが異なる場合、あまり前向きな議論にならなかったです。 今はインターネットがあるので様々なエンジニアの見解を比較することができるので、このように『他の人はどう考えているか?』というのをわざわざ議論しなくても解るので改めていい時代になったと思います。   というわけで、まぁブログビューアーは作り直さずに公開したいと思います。
2011-02-22 | コメント:0件



[ADP開発日誌]0.61リリース OpenBlocks600D対応+WOL(Wake On Lan)

以前に、ADPをOpenBlocks600Dに対応させた話を書きましたが、予告(?)どおりADP 0.61のリリースを行います。ブログビューワーの方は後ほどということで・・・必要な方はコメント欄にほしいとリクエストください(気持ち急ぎます)。   OpenBlockS600Dのバイナリ版を実行させる場合は以下のパッケージがインストールされている必要があります。
  • libboost-regex1.35.0
  • openssl
  • unixodbc
場合によっては(ソースからコンパイルされる方は)さらに以下のパッケージが必要です。
  • libboost1.35-dev
  • libssl-dev
  • unixodbc-dev
  ちなみにWindows版のバイナリは、特に依存関係はないので、そのまま実行できます。   0.60でパフォーマンスを上げたのですが、バグがぼろぼろ出まして修正しました。だいぶ品質が向上したかと思います。もっとも、もっと本格的なテストプログラムを記述しないとダメだと思いますが・・・そのノウハウの蓄積は今後に期待ですね・・・。 ただ一部の修正(メモリの管理関係)でパフォーマンスが下がったのでこのあたりはまた変更する必要があります。オープンソース&マイナープロジェクトの良いところはバグを恐れずにガシガシ修正できるところですね、お金を頂戴するプロジェクトではここまで冒険はできません・・・。   また、今回のリリースではwol(Wake On Lan)述語(関数)も追加しています。文字通りWOLパケットを送出する述語です。 何でこんな述語を追加したのかと言いますと、前回の記事のとおり最近モバイル環境を構築したのですが、これに加えてVPNを構築すると外部からイントラ環境にログオンすることができ、そうするとリモートディスクトップで私のマシンにログオンしたくなるのですが、ログオンするためには電源が入っていなければならず、とは言っても何時ログオンするかどうか解らないマシンの電源を入れっぱなしにする訳にもいかない、という訳でWOLで電源を入れることになり述語を追加しました。 WOLを送信するマシンは、LED電球並の消費電力のOpenBlocks600Dにすればよろしいでしょう。外部からはウエブから入るようにします。つまりブログビューアと同様にADPでWEBページをホストします。 というわけで、以下、WOLのコードになります。   wol.awp
#!/bin/adp -
<%;
+keycode("password");	# パスワードを指定
+machines("00-11-22-33-44-55", "machine1");	# MACアドレスとマシン名(適当でよい)を指定
+machines("66-77-88-99-aa-bb", "machine2"); # 複数あるときは同じように複数行にわたって記述する
+baddr("192.168.1.255"); # ブロードキャストアドレスを指定
,query("KEY").keycode, $mac =query("MAC"), wol($mac, =baddr);
%>
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ネットワークブート</title>
</head>
<body>
ネットワークブート
<%,query("MAC",$mac),%><%=$mac%>BOOT中<%;%>
<br>
<form action="wol.awp" method="post" OnSubmit="return confirm('起動しますか?')">
キーコード:<input type="text" name="KEY" value=""><br>
起動マシン:
<select name="MAC">
	<%,machines($mac, $name) ,%>
		<option value="<%=$mac%>"><%=$name%>
	<%,next;%>
</select>
<input type="submit" value="boot">
</form>
</body>
</html>
※2012/05/21 Ver 0.81のリリースにあわせて更新   ファイル名はwol.awpとします。form actionの引数を変えればファイル名自体はなんでも構いません(まぁ解らないようにした方がよい)が、拡張子はawpにする必要があります。 awpとは「Adp Web Page」の略で、ADPでWEBページをホストするモード(AWPモード)の拡張子になります。 Ver0.61では、拡張子がawpまたはcgiのみAWPモードになります。   これをApacheでcgiスクリプトとして、ホストすればOKなのですが、その前にスクリプト使い方の説明を、 先頭の3行目から6行目が設定になります。最低限のセキュリティということで、 パスワードの指定(3行目)と起動対象のマシンのMACアドレスと名前(4,5行目)と 起動対象のマシンがあるブロードキャストアドレスを指定(6行目)になります。   スクリプトの動作環境の設定ですが、PerlやPHPのCGIと同様にセットアップして頂けれたよいのですが、以下、apacheでのセットアップを簡単に説明します。 adpの実行ファイルを、/bin に保存します。/binがダメな方は、上記のスクリプトの1行目でadpのパスを指定します。 apacheのconfファイルですが、DirectoryのOptionsにExecCGIを追加し、AddHandlerで .awpを追加します。 以下、サンプルを載せます。
    <Directory "/var/www/html">
        Options FollowSymLinks ExecCGi +Includes
        DirectoryIndex index.html index.php index.awp
        AddHandler  cgi-script .awp
        AddHandler  cgi-script .cgi
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
Windows+IISでも動作可能です・・・設定方法は・・・まぁがんばってみて下さい。 (ご要望がありましたら設定方法を記載します・・・)
2011-02-18 | コメント:0件
Previous Page | Next Page