Archive for 1月, 2010
最近、The GOALを読んでからちょっとだけ、TOCを勉強してみようかなと思いかじっているうちに、ITプロジェクトの管理に関しては本格的に勉強する価値があるのではないか?という気がしてきた。つまり、自分で経験的に知っているというレベルから、人に説明するうえで体系的な知識として使えるのでは?という意味です。
現場でITプロジェクト管理をやっていると、まず、政治的関係者は、PMBOKなどの言葉や、また、工学的な理論などよりも、マーケティングやら販売手法やらを考えている人たちの言葉に近いほうを形式的に学んだほうがいいような気がする。
というのも、PMBOKなどをかじる機会があったが、あまりに規模がでかすぎるという気がした。
何々、何々をするべき・・・
ってあるが、ITプロジェクトでは数百万から2,3千万程度の案件では、実際の実働部隊は二人くらいで、それ以外すべて管理者なんてことだってあり得る。ほとんどは、管理者の管理に翻弄され、実動する人たちに何も伝えられないって場合があるのではないだろうか?
で、実際には、実動する二人が勝手につくってしまってある程度できてから、やっとまともな話ができる状態になる。
そんなのが普通というときに、だいそれた「PMBOK」やら高度情報処理試験での「プロジェクトマネージャ」の理屈・知識は本当に通用するのだろうか?
あまりに、正論すぎる気がする。
(知らないより、知っていたほうがいいのはよくわかるし、それに、よく理解していれば使えるのもよくわかる。でも、小さい(予算が少ない)案件ほど、かなりの変則的応用を求められると思うので、小さい案件で基本を学び、徐々におおきくってプロジェクト管理の手法の学習としては無理があるのではないだろうか?関係者の調整力を学んでいくっては有効だが・・・
それに、学問が正論じゃなきゃ意味がないだろ!っていう気もする。)
それよりも、ほとんどうまくいかなく、問題と間違いだらけという前提から始めることができる「制約理論」ってのは、かなり現実にフィットしている気がする。
たとえば、「スケジュールというのを意思として決める」というより、制約として上から落ちてくるってのが普通だと思うし、使う技術・環境なんかも、選択するっていうよりも、今いるメンバーやハードで何が、どこまでできるか?っていう制約って考えるということになる。
たとえば、何かを変更したときに、カッコよく言えば「変更管理」っていうが、要は間違いに気付いただけだったりする。しかし、それを知る手法がわからないとか・・・
それに、たいてい失敗しているプロジェクトをみると、崇高な感じのドキュメントやら、過剰に投資した環境が多々見られる。なんでこんなになってるんだー。ってみると、コンサルタントなどを通して形式的には正しい方法をとっていたり・・・
という意味では、こんな時代に必要なのは、「失敗しないためのプロジェクト管理」ではなく、失敗の中から「成功させる」を生み出す理論のほうが大切なのではないだろうか?
そう考えれば、人は自由な選択と意思から計画的に生み出すものよりも、多々ある制約から生み出すものの方がよりいいものが生まれると思ってしまうのは私だけだろうか?
私も過去、自分がある制約からやりたいことができず、んー「まあ、これで今のところはいいか!?時間があるときにきちんと作りなおそう」と言って割り切って機能を実装したものが、ほかの会社ではその機能をみて、どうやってそれを実装しようかと試行錯誤していたということを聞いた。
それは、まさに制約から偶然生まれた「そういう事」だったのかも知れない。
次回は、「制約理論」と「サーバ管理」の関係を書いてみたと思う。
以前公開していた、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);
}
}
}
}
最近ノートパソコンを使って作業をすることも多くなり、
自宅にあるデータを外出先からみたいという気持も多々あり、
また、複数あるPCで共有するデータをNASのようなところにおいておきたい。
ダウンロードしたフリーのソフトなどは、たびたびダウンロードするようなこともしたくないし、
なにより、また、探すのが面倒だ。
でも、「新たな機器を増やしたくないなー」と思っていたので、仕方がなくUSBメモリで共有していた。
そこへ、部屋の模様替えに伴い、ブロードバンドルータから線がながーくでてしまうことになり、
また、Wiiとかにも接続したいしと・・・いろいろ調べるよりも新しくしてしまう方が楽かなということで、
思い切って数年ぶりに買い替えることにした。
予算は1万円程度。
さらに、上の用途を満たすために、
「VPN機能(外出先から自宅へのアクセス)」
「NAS機能(ネットワークストレージ機能)」
をみたしているものにした。
いやー、ほんの数年前までこんなことは簡単に、かつ安価にできなかった気がするが、進歩は早いものです。
そして、実際に買ったのはこれです。
BICで9800円のポイント20%付きで買いました。
そして、後で、このポイントを使って8GのUSBメモリを買いました。
さらにこのルータはWOL(Wake On LAN)というLANを通してPCに電源を入れることもできます。
したがって、必要になったら電源を入れるということもできるのです。
このあたりもルータですべてできてしまうのはいいですね。
家庭的にはルータに常に電源がはいっているのは許せますが、
多少なりともPCなどうるさい機器が使わないときに電気が入っているのは嫌ですから・・・・
ただし、IPが動的の場合、DynamicDNSのサービスを使わないと実質的にはできないのでご注意を。
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
今回は、前回で簡単なテキストメールを送るところまで説明しましたが、
マルチパート(HTML)メールを送ります。
単純なテキストメールを送るだけなら、それほどライブラリなど使わずに単純にがりがりと書いてしまった方が楽ではありますが、
マルチパートとなると、Boundaryなどが出てきてそれなりに面倒ですので、やっと、ライブラリを使った方がいいかなという感じが出てきます。
ただし、前回からライブラリが新しくなったので、こちらからもっとも新しいバージョンをダウンロードしてください。
さて、マルチパートの作成ですが、
var contentType:ContentType = ContentType.MULTIPART_ALTERNATIVE;
var mimeMsg:MimeMessage = new MimeMessage(contentType);
var from:INetAddress = new INetAddress();
from.personal = "Sample User";
from.address = this.fromEmail;
mimeMsg.setFrom(from);
var toAddr:INetAddress = new INetAddress(this.toEmail,"Customer");
mimeMsg.addRcpt(RecipientType.TO,toAddr);
// set mail subject
mimeMsg.setSubject("これは日本語メールです");
mimeMsg.setTextBody("this is multipart message");
// TextPart
var partText:MimeTextPart = mimeMsg.createTextPart();
partText.setText("これは通常の本文");
// HtmlPart
var partHtml:MimeTextPart = mimeMsg.createTextPart();
partHtml.setHtmlText("<html><body><b>ここにはHTMLの本文</b></body></html>");
sender.send(mimeMsg);
sender.close();
とこんな感じです。
ここで前回とちがって注意すべきところが3点ほどあります。
マルチパートであることを伝える
var contentType:ContentType = ContentType.MULTIPART_ALTERNATIVE; var mimeMsg:MimeMessage = new MimeMessage(contentType);
前回までは、コンストラクタに引数がなかったのですが、引数がない場合には、text/plainに自動的になってしまいます。
従って、ここでは、multipart/alternativeのパートを作成します。
子供のパートを作成する
var partText:MimeTextPart = mimeMsg.createTextPart();
これで、子供のパート(text/xxxxx)として追加します。
テキストもしくはHTMLを本文に設定する。
MimeTextPartには、
- setText
- setHtmlText
の2つの本文設定メソッドがあります。
つまり、setTextを使ったときには、text/plain
setHtmlTextを使ったときには text/html となるわけです。
次回は、添付ファイルをつけたメールの送信を説明したいと思います。

