Archive for 11月, 2010

久々にプログラミングとはまったく関係がない話です。

さて、表題に書いたように「2次方程式」から問題がつくれますか?という話です。

具体的には

ax2bxc = 0

という物があるときに、そのxを求めよ!というのが、よく高校(あれ中学でしたっけ?)で出される問題です。
この問題には根の公式ってのがあって・・・・

って、非常にそれだけを見ると感が方がややこしいのですが、

考えを変えて、具体的に言えば

x2 -10x + 21 = 0

という2次方程式を使って求める解が導き出せる問題を作成せよ。

とあったらどうでしょうか?
答えは x = 3,7 になるわけですが、この答えを見る前に問題が作れるでしょうか?
私は作れませんでした。

要は、「足して10、かけて21になる」、もっと平たく言えば、「辺の長さを足すと10になり、面積が21になる時のそれぞれの1辺の長さは?」と聞いているわけです。

この方程式を見たときに、そう聞いているのですよ!と教えてもらえれば・・・・
もっとわかりやすかったような気もします。

この問題をxを使って解こうとすると、

つまり x と ( 10 -x ) をかけると 21 だから

x ( 10 – x ) = 21

は、

x2 -10x + 21 = 0

になりますよね。
ってこれだけ見たら、根の公式なんて見なくてもわかるじゃんとなりますよね。

この話は、虚数が生まれたきっかけの話を見ていて思いました。
ちなみに、虚数が生まれたきっかけは「ニュートン(雑誌)」曰く、

x2 -10x + 40 = 0 ( 辺の長さを足すと10になり、面積が40になる時のそれぞれの1辺の長さは?」

から生まれたそうです。なんか解がありそうですが、
この問題、 解なしです。

ただし、この問題を 虚数を使ってとくと解けます。
要は、虚数という数字はこじつけから生まれたもの。

というお話。(もちろん、ニュートンではその後の発展?貢献も記述してありますので、虚数を知る上でもおもしろいです。)

ちなみに、この話おもしろいなーと思って当時のニュートン(たしか2008年ごろ買ったのですが・・・)をとってあるのですが、
虚数だけで特集を組まれているほどなので、よほど人気があったのでしょう。

さらに、さらに全然関係がないのですが、E=mc2

ってこれって、質量とエネルギーの等価性とかっている、要はエネルギーは質量に関係するという話なのですが、 EMCという企業のロゴにこっそり2乗の印があります。
つまり、EMCという企業はエネルギーを増大させるために、どんどん質量を増やすぞ(規模拡大)という意味をこめているのでしょうか?

ちょっと興味がありました。

ある方からairxmailで使っているJobSyncのクラスを公開してくれないか?
とお願いがきており、私としても、別に隠蔽の意図はもっていないので公開することにしました。

いろいろなゴミみたいなソース(作りかけては、AS3ではこういう作り方はそぐわないかなー)というソースがたまってしまっており、
それと一緒にソース管理をしていたので、分けるのが面倒だったので公開しなかっただけなのですが、
まさか、お願いがくるほどairxmailのソースを見てくれたらしく、うれしい限りですね。

という訳で、こちらもgoogle codesに公開しました。
http://code.google.com/p/airxlib/

で見ることができます。
公開で、com.coltware.commons,* から、 com.coltware.airxlib.* にパッケージ名を変更しました。
別にAIRにすべてが依存している訳でもないのですが、AIRに依存している部分だけを取り除いても非常に少ないですし、
私自身がブラウザ上で動くことを想定していない(ほとんどがソケットを使うアプリのため)ので、面倒なのが原因です。

ログのクラスなんかも入れてあります。(FileTarget以外はサンプル実装程度に見てください。まだ、個人的に見ても十分な実績がありません。)

でも、以前公開した、DateUtil(PHPのdate関数のように日付を扱いたい)や、TextDiffクラスなどはAIRでなくても使えるはずです。
TextDiffのサンプルはこちらでも見ることができます。

また、これに従いairxmailもairxlibのパッケージ(のみ)に依存するような形で作り直しております。

このあたりは、IMAP4と一緒にリリースしたいと思っています。

これ以外に、Office Open XML関連のクラスがあるのですが、こちらも実装が中途半端なのですが、今年中に公開してしまおうかなと思っています。
ドキュメントのプロパティ情報のアクセス(更新も含む)や、Excelのデータ更新くらいはできるようになっています。
(もちろん、xlsxなどの頭にxがついているファイルのみです。)

airxmailもimap4の実装がある程度ですができてきました。
そこで、途中ではありますが、swcをダウンロードできるようにしてみました。
(ファイル名にimap4がついている物です。)

まあ、IMAP4のすべては実装できてはいませんが、POP3でメールを読むくらいと同程度以上のことはできると思います。

さて、具体的な使い方ですが非常に簡単な例です。
とりあえず、gmailにアクセスしてみたので、そのときの例です。

オブジェクトの作成
var client:IMAP4Client = new IMAP4Client;
client.host = 'imap.gmail.com';
client.port = 993;
client.socketObject = new SecureSocket();

このあたりは今までのPOP3なんかとも違いがありません。

接続から、メールの取得まで
//  IMAP4のフォルダ処理に対するハンドラをセットします
client.addEventListener(IMAP4Event.IMAP4_FOLDER_RESULT,folderListResult);

//   メッセージのUIDを取得するためのハンドラをセットします
client.addEventListener(IMAP4ListEvent.IMAP4_RESULT_UID_LIST,uidList);

//  メッセージ処理に対するハンドラをセットします
client.addEventListener(IMAP4MessageEvent.IMAP4_MESSAGE,handleMessage);

//  接続処理
client.setAuth(username,password);   // <--  username とpassword は指定されたものを設定してください
client.connect();

//  ログイン処理
client.login();

//  購読しているフォルダ一覧を取得します。(folderListResultが呼ばれます)
client.lsubBlocking();

// ログアウト処理
client.logout();

以上が、ログインして、購読しているフォルダ一覧を取得し、ログアウトをするところです。
もちろん、メッセージを取得する処理はまだ記述されていません。

また、あらかじめフォルダ名を知っている場合、まあ、たいていはINBOXという名前ですが、それがデフォルトであるはずなので、
POP3と共有している場合にはフォルダ一覧を取得する必要はないのでしょうが、このあたりは別で説明します。

あとは、loginが
LOGIN username password
のような方式しかサポートしていません。

現段階でログインできないとしたら、このあたりが原因かもしれません。

フォルダ一覧を取得するハンドラの実装
private function folderListResult(event:IMAP4Event):void{
  var folder:IMAP4Folder = event.result as IMAP4Folder;
  log.info("NAME=>[" + folder.nameUTF8 + "]");
  if(!folder.noselect){
    client.selectMailbox(folder).search(IMAP4Search.dateSentSince("2010/10/01"));
  }
}

この処理を説明すると、取得したフォルダ毎にイベントが呼ばれますので、上記ハンドラが実行される事となります。
ここで、取得したフォルダオブジェクト( IMAP4Folder ) を取得しています。

folder.nameUTF8;

は、フォルダ名が「スター付き」などという場合にエンコードされていますので、それをデコードした値が入ってきます。
デコードする前は

folder.name;

で取得できます。また、ASCIIコードだけで構成されている場合、つまり、現実的には日本語でない場合になるのでしょうが、
その場合には、同じ値になります。

次に、

if(!folder.noselect){
  client.selectMailbox(folder).search(IMAP4Search.dateSentSince("2010/10/01"));
}

は、selectできる(つまり、noselectフラグがないもの)場合に対してメールのUIDを検索しています。
検索条件は、2010/10/01以降に送信された(受信した)メールを対象にしています。

このあたりが、POP3ではできないIMAPならではの多機能な部分です。
ちなみに、全部ほしければ、

client.selectMailbox(folder).search(IMAP4Search.ALL);

になります。

では、INBOXのような初めからわかっている場合ですが、

client.login();
client.selectMailbox("INBOX").search(IMAP4Search.ALL);

のように、LSUBコマンドなどでフォルダを取得処理を記述することなく、そのまま書いてしまえばOKです。
ちなみに、現在では日本語名(をそのまま)では記述する方法はありません。
この場合には必要なエンコードをする必要があります。(エンコード処理の実装は未実装です。)
なので、現時点では例のように一度、サーバから取得してからselectMailbox()すれば、
サーバからのエンコード文字列をそのまま使えますので、問題は回避できると思います。
(自分でエンコードするなり、決めうちで事前にしらべておけば問題ありませんが・・・)

UIDとメッセージ処理に対するハンドラ処理 
private function uidList(event:IMAP4ListEvent):void{
  for(var i:int = 0; i<event.length; i++){
    var id:String = event.getValue(i);
    client.message(id);
  }
}
private function handleMessage(event:IMessageEvent):void{
  var msg:MimeMessage = event.getMimeMessage();
  log.info("SUBJECT : " + msg.subjectUTF8);
}

このあたりはPOP3の時とあまり変わらないような実装にしてあります。
message()処理でメッセージの本文取得を要求しています。
POP3でのretr()とあまり変わりがないと思います。
メッセージを取得して以降は、今までと同様、MimeMessageに対するオブジェクトへの操作となります。

さて、ここまできて、流れで実は一番違うのが、

login();
:
何らかの処理
:
logout();

のように切断に対する処理を一番最初のところで記述できることです。
今まで(現在のSMTP,POP3でのAPI)は、これをやると、何らかの処理が動く前に切断が動いてしまいました。

なので、ループ処理の最後に記述する必要があったのですが、
IMAP4では、ループが何重にもなってしまい(フォルダのループと、メッセージUIDのループ)、いったいいつ切断できるのかの処理が難しくなってしまいました。

なので、処理をブロックするための実装を入れています。
これが、

lsubBlocking();
listBlocking();

になります。
これらの処理はその実行とともに、そこで処理がブロックされ、
その結果のイベント処理の中で発行された命令が挿入されるようになっていますので、
自動的に、logout()処理の前に処理を記述していることと同様になるようにしています。

また、search()処理も同様です。

こんな感じに、非同期処理が生んだ、非同期処理に対して処理しています。
このあたりの仕組みは後でPOP3や、SMTPにも反映はしていく予定です。

現在はこのあたりの処理が、swcとして隠蔽(したくてしている訳でもないのですが・・・)されていますが、
また、このあたりの基本クラスも公開していく予定です。

と、このような感じになっています。
私自身がIMAP4というあまり使いこなせていないプロトコルなので、
ちょっと、実装として中途半端な状態ではありますが、公開してみることにしました。
何か気づいた方がいたら、コメントやメールをいただけると非常に助かります。

今回は、airxmailを使って受信したメールから添付ファイルを取り出す方法です。

メールを受信する方法は、こちらを参照してください。

さて、ここでは、実際にメールを受信したハンドラの部分だけを見ていきます。

private	function messageHandler(e:POP3MessageEvent):void{
	var msg:MimeMessage = e.getMimeMessage();
	//  ここでメッセージに添付された子パートの一覧を取得する
	var attaches:Array = msg.attachmentChildren;
	if(attaches.length > 0){
		for each(var attach:MimeBodyPart in attaches){
			if(attach is MimeBinaryPart){
				var binPart:MimeBinaryPart = attach as MimeImagePart;
				var bytes:ByteArray = attach.bodyByteArray;

				//  v0.6 もしくは r69 以前では getHeader("Content-Disposition"); を使う(バグのため)
				var contentDisposition:MimeHeader = binPart.contentDisposition;

				if(contentDisposition){
					var filename:String = contentDisposition.getParameter("filename");
					filename = MimeUtils.decodeMimeHeader(filename);
					log.debug("Filename => " + filename );

					var file:File =	File.desktopDirectory.resolvePath(filename);
					var fs:FileStream = new	FileStream();
					fs.open(file,FileMode.APPEND);
					fs.writeBytes(bytes);
					fs.close();
				}
			}
		}
	}
}

となります。
ここでは、あくまでも例なので、デスクトップに保存しています。

airxmailも、Version 0.6 にしました。
Ver0.5 からVer0.6 の大きな変更点はSSL/STARTTLSに対する対応です。
あとは、

http://code.google.com/p/airxmail/source/list

を参照してください。

今回、バージョンを作成したのは、どちらかと言えばこれからする変更での区切りをつけるためです。
IMAP4の実装を登録することにしました。

以前から、多少は実装してあったのですが、ソースの変更点やら追加が多くなりそうなので、
やはり、ソース管理に登録してしまわないと管理が面倒になってきたというのがその大きな理由です。

airxmail/ airxzip などのswcをbuildするときに、antファイルを使っているのだが、
FLEX SDKの場所をなんとかいちいち直接指定せずに、自動的にとれないものかなーと思っていたが、

やっと見つけたので、その記録です。
ちなみに、前提としてFlash Builder4 ( Flex Builder 3 ) on Windows で確かめています。

また、私は単にBuildをするだけの目的の時には、Linuxのコマンドだけでも作りたいと思っています。

そんな、利用でもいちいちFLEX SDKの場所の指定をbuild.xmlに記述しないようにします。

では、記述方法です。

<!--  環境変数をenvとして使う -->
<property environment="env" />

<!--  デフォルトの設定 -->
<property name="FLEX_SDK" value="C:\Flex\sdk\3.5.0.12683" />

<condition property="FLEX_HOME" value="${env.FLEX_HOME}">
  <isset property="env.FLEX_HOME" />
</condition>

<!--  Flash Builder 内のANTで実行されているならば、 Flash Builder内のSDKが使われる -->
<condition property="FLEX_HOME" value="${application.home}">
  <isset property="application.home" />
</condition>

のような感じです。
まず初めのFLEX_SDKの指定は、デフォルトの指定です。
次からが、大切です。

<condition property="FLEX_HOME" value="${env.FLEX_HOME}">
  <isset property="env.FLEX_HOME" />
</condition>

これは、環境変数”FLEX_HOME”があるならば、build.xml上のFLEX_HOMEの変数にその値を設定する。
という指定です。
私はWindowsでは環境変数が非常に使いづらいの、環境変数を切り替えるということをしませんが、
Linuxでは環境変数を切り替えるのは簡単です。

export FLEX_HOME=/usr/local/flex4.1; build;

とすればいいだけなのですから・・・・
もちろん、LinuxにFlex SDKのインストールもJava,Antのインストールがすんでいることが前提です。

これで、Linux向けのFLEX_SDKの指定はできたという事です。

そして、最後の部分です。

<!--  Flash Builder 内のANTで実行されているならば、 Flash Builder内のSDKが使われる -->
<condition property="FLEX_HOME" value="${application.home}">
  <isset property="application.home" />
</condition>

どうやら、Builder 内でAntを実行している時には、${applicaiton.home} で
C:\Program Files (x86)\Adobe\Adobe Flash Builder 4\sdks\4.1.0
なんていう値がとれるようです。

ちなみに、ここで注意点ですが、あくまでもAntをBuilder内の
「ワークスペースと同じJREで実行」
で実行をしている場合です。

ここがちょっとした注意点です。
さらになぜか、使っているSDKを変更したときにその変数が見つからないことがあります。
このときに、外部ツールのAntの部分を見て、そこから一度実行をすると変数が設定されています。

(なぜなのか、全くわかりません。この行為の過程でなにか解決されているだけかもしれませんが、
私は、その行為をすると問題なくなりますので、それ以上、深く突っ込んで調べないことにしています。)

ちなみに、Flash Builderにも、Flex BuilderにもAntは入っていません。
導入するときには
こちら
を参考にしてください。
Flex Builder 3の時の記述ですが、基本的にはFlex Builder4でも変わりません。

ちなみに完全なbuildファイルがみたいなーという方はこちらをどうぞ。
airxmailのswcを作るときのbuildファイルになっています。

システム負荷のアプリケーション編について記述しようと思ったが、
その前にMS-Officeでちょっとというか「これでいいのか?」ということに気づいたのと、
2007以降ではキチン(?)と考えられているので記述することにしました。

知っている人は知っているかもしれないのですが、私はVBAなどを使わないので興味も持たなかった領域なので、
見てみる気も起きなかったのですが、
MS-OfficeもOOXというフォーマット形式(つまり、XMLをZIP化したもの)をサポートするようになり、
そのためのAS3(For AIR)で解読するものを作っていました。

OOXはXMLデータ、つまりテキストデータですから容易にいろいろな情報を読むことができます。
試しに今まであったドキュメント(2003以前)を変換して見てみる事に。

するとあるはあるは、「個人情報」。
しかし、これらは別に文章内にあるわけではありません。

これらは、ドキュメントがいろいろなプロパティで保持している情報です。
従って、通常の編集画面からは見えません。
(VBAなどを使えば、今までも見えたのだと思いますが、どこまで見えるかは私はよくわかりません。)

たとえば、ほかの会社のドキュメントがよくできているので、これをコピーして再編集して使い回している。
もしくはほかの人のドキュメントでもいいです。

など多くの人がやっている事だと思います。
しかし、これを単純にやっていると、最初に作成した人と会社の情報を知らないうちに配布していることになるかもしれません。
その他、コメントなどがついているものも危険です。

あーあの人って、XXXって会社にいたのか・・・とか、
XXXって会社のAさんととYYYって会社のBさんって知り合いなんだ・・・とか。
あえて、Officeのドキュメントを配布してお客さんやら、関係者にコメントなどを記述してもらうように運用すれば、
関係者一覧が作れるかもしれません。

しかし、厳密には個人情報の流出なのですが、「個人情報流出」の事故になるのか?は微妙です。
(その時点では気づけなかった予測不可能な事故?それとも、キチンと対策ができていない個人情報流出?)

しかし、気づいた以上は気をつけた方がいいでしょう。
知らないうちに加害者になっていることは非常に怖いですから。

といっても、これがOffice2003以前にはどうやって消すのか方法が見当たりません。
(だから、VBAなどの本をみるとコメントを一括で削除するためのVBAなどがTIPSに載っているのかもしれません。)

ただ、Office2007では、左上のメニュー(なんて言うのでしょうこれ?Officeのロゴのメニューです。)に、
キチンと
「配布準備」
というメニューがあり、これらの事が考慮されているのです。

ms-pub

こんなの気がつけませんよ!
と言いたくなりましたが、今や、私以外の人たちは知っていることなのでしょうか?

いやーMSさんにはやられました。
リボンメニューは嫌いだ!という意見に、「セキュリティはいいのですか?」という売り文句も聞こえそうな気もしてきますが、
考えすぎでしょうか?

ソフトウェア&ライブラリ



ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
カレンダー
2010年11月
« 10月   12月 »
1234567
891011121314
15161718192021
22232425262728
2930  

カスタム検索
RSS
Add to Google
カテゴリ
にほんブログ村 IT技術ブログへ