Archive for the ‘ActionScript’ Category
ある文字と、ある文字が違うところを探そうということを、
ロジカルにやろうとすると、実は結構めんどくさい。
一文字、一文字順次見ていき、違うかどうかを見ていっても、
そこそこうまくいくが、ある条件を超えるとうまくいかなかったりする。
でも、すでに世の中に存在するので、うまくやろうと発明する必要はないが、このようなアルゴリズムってどこを探せばいいのかな?と思う。
で、より分かりやすいサイトを見つけたので、メモ。
ここです。
実は、ここにたどり着く前に、いろいろ調べて、アルゴリズムの名前を見つけて、解決できるようになって、自分で必要なくなってから、それをもっとよく知るための情報が見つかるんですよね。
さて、今回は上記サイトを参考(そのまま?)に、ActionScript3用に書き直し、
それをもとに簡単ではありますが、動作を確認できるようにしました。
ソースのダウンロードは、下のFlashのソースViewからできるようになっています。
今回は、airxmailライブラリで、gmailを使ってメールを送信する場合の例です。
gmailを使う場合には以下の2つの点に注意する必要があります。
- SMTPサーバで認証を使用する (SMTP-AUTH)
- STARTTLSの使用
です。
この2つの条件を満たすのも簡単にできます。
ただし、2の条件を満たすために、as3cryptoのライブラリが必要になりますので、別途ダウンロードしてください。
(2010/02/10時点でのサーバ名とポートです。)
sender = new SMTPSender(); sender.setParameter(SMTPSender.HOST,"smtp.gmail.com"); sender.setParameter(SMTPSender.PORT,465); // SMTP-AUTHの使用 sender.setParameter(SMTPSender.AUTH,true); sender.setParameter(SMTPSender.USERNAME,username); sender.setParameter(SMTPSender.PASSWORD,password); // STARTTLSの使用 sender.setParameter(SMTPSender.SOCKET_OBJECT,new com.hurlant.crypto.tls.TLSSocket());
で、接続ができます。
あとは、今までどおりメールの本文を設定していけばOKです。
前回は、HTMLメールを作成したが、今回は、添付ファイル付メールです。
メールの送信の全体の流れは変わりませんので、今回は添付ファイルのメッセージを作成する部分だけ説明します。
ただし、今回もライブラリを新しくなったので、こちらからもっとも新しいバージョンをダウンロードしてください。
前回、setTextBodyにちょっとバグを埋め込んでしまいましたしたので、こちらも修正しました。(詳細)
さて、添付メールの説明です。
といっても非常に簡単です。
var contentType:ContentType = ContentType.MULTIPART_MIXED;
var mimeMsg:MimeMessage = new MimeMessage(contentType);
:
省略
:
var filePart:MimeBinaryPart = new MimeBinaryPart();
filePart.setAttachementFile(File.desktopDirectory.resolvePath("image.jpg"),"添付ファイル.jpg");
mimeMsg.addChildPart(filePart);
sender.send(mimeMsg);
sender.close();
で終了です。
ここで、MimeBinaryPartは、自動的にContent-Typeが、application/octet-streamになります。
また、
filePart.setAttachementFile(file:File,filename:String):void
で、添付ファイルをつけます。
上の例のように、添付するファイルが画像の場合には以下のようにContent-Typeを変更してもいいかもしれません。
var filePart:MimeBinaryPart = new MimeBinaryPart()
filePart.contentType.setMainType("image");
filePart.contentType.setSubType("jpeg");
または、
filePart:MimeImagePart = new MimeImagePart();
とすることで、image/xxxx のようになります。
xxxxの部分は、添付するファイルの拡張子で変わります。
以前公開していた、ZIP圧縮・解凍ライブラリですが、airxmailと同様にGoogle Codeに移動して公開することにしました。
こちらです。
これに伴い、ライブラリ名をairxzipに変更し、パッケージ名も変更しました。
まだまだ準備不足ですが・・・・
また、これ以外にパスワード付きZIPファイルにも一部対応しました。
ただし、ZipCrypto(PKWare crypto)形式の暗号化のみです。
こちらで説明されている、VII. Traditional PKWARE Encryptio という形式のみです。
この形式はWindowsXPなどで使われている暗号形式ですので、まあ、ふつうの人が一般的に目にするレベルでは使えるようになったと思います。
パスワード付きZIPファイルの使い方は以下のようになります。
作成(圧縮)方法
var writer:ZipFileWriter = new ZipFileWriter();
// パスワードの指定
// パスワードの指定がなければ、通常のZIPファイルが作成されます。
writer.setPassword("pass");
writer.open(File.desktopDirectory.resolvePath("crypto_airxzip.zip"));
// Add ByteArrayとして追加する場合
// ファイル名は"sample.txt"とする。
var data:ByteArray = new ByteArray();
data.writeUTFBytes("SAMPLE");
writer.addBytes(data,"sample.txt");
// Add Directory
// 空のディレクトリを追加する
writer.addDirectory("Foo1");
// ローカルにあるファイルを指定する場合
writer.addFile(File.desktopDirectory.resolvePath("image.jpg"),"Foo1/image.jpg");
// close()を忘れずに!!
writer.close();
解凍方法
var reader:ZipFileReader = new ZipFileReader();
var file:File = File.desktopDirectory.resolvePath("crypto_airxzip.zip");
reader.open(file);
reader.setPassword("pass");
var list:Array = reader.getEntries();
for each(var entry:ZipEntry in list){
if(!entry.isDirectory()){
if(entry.getFilename() == "sample.txt"){
try{
var bytes:ByteArray = reader.unzip(entry);
log.debug("sample.txt : " + bytes);
}
catch(e:ZipError){
log.warn(entry.getFilename() + ":" + e.message);
}
}
}
}
AIRで動くことを前提にライブラリを作成していていると、
AIRのラインタイムバージョンが気になることがある。
このきっかけは、flash.net.Socketのtimeoutプロパティを設定しようとしたが、
Flex Builderではきちんとコードヘルプとしてtimeoutプロパティが表示されるのだが、
いざ、実行しようとするとtimeoutプロパティがないとエラーになる。
「なぜ!」と思ってしまったが、PCを引っ越したためにFlex Builderを新規に入れなおしたが、
ここで、Flex BuilderでのAIRが1.5でなくなってしまった。
このSocketのtimeoutはAIR1.5から使えるのだ。
原因がわかった時点で問題となるソースを修正することはできたが、
そもそも、AIRのバージョンってどうやってとるんだ?
という疑問が生じたので調べてみた。
WindowedApplication.nativeApplication.runtimeVersion
で取得できる。
マニュアルはこちら
ちなみに出力結果はこんな感じになる。
1.5.0.7220

