2010-02-22

ActionScript3.0でのXML操作  [by miyachi]

Flashに組み込むActionScript3.0でXMLの扱いを勉強。なんと文字列としてでは無く直接代入が出来ることに感動。例えば以下。

 var xml:XML = <data>coffee</data>;

でもふと困った。例えば上例だと coffee としている箇所を文字列変数を使いたい場合どうすれば? ヘルプを見ても良く分からなかったけど検索して発見。ちょっと見つけにくかったのでここにも書いておきましょう。

結論から言えば波括弧 { } で括れば変数の値をそのまま使ってくれるそうです。例えば以下。

 var drink:String = "tea";
 var xml:XML = <data>{drink}</data>;

これは楽だ。あと当然ながらノードや要素のリプレース等も出来るが独自すぎてDOM等に慣れていると逆に分かり難い面も。何にせよActionScriptは独自の世界だなぁ。

[追記]
ActionScript3.0からURLRequestとURLLoaderを使ってHTTP通信のプログラミング。登録コマンドを送って再読み込みコマンド…あれ?反映されていない?ブラウザからチェックしてみると登録されている。?????

暫く何が悪いか分からず時間を無駄にしてしまいました。調べてみるとどうやら強力にキャッシュされてしまいサーバに接続しないで古い内容が戻って来ているらしい。これを避けるにはなんとURLの最後に乱数を付けて毎回異なるURLにアクセスしていると思わせる方法が一般的のようです。

と言うことで以下のように現在時刻のミリ秒をダミーとして引数に与える事で解決。

 var urlReq:URLRequest = new URLRequest();
 urlReq.url = url + "?dummy_number=" + new Date().getTime();

え~い時間を返せ(^^; ActionScript3.0はなかなか手強い。
2010-02-22 10:52:18 - miyachi - - [プログラミング] -

2010-02-17

環境変数をJavaScriptで取得する  [by miyachi]

訳あってJavaScriptからサーバの環境変数を取得する必要がありました。こんなの簡単だろう…と思ったら、単純には取得できないらしい…orz 理屈から言えばJavaScriptはクライアント側で動作するのでサーバの環境変数は取れないらしい。ネットで調べると結構皆さん苦労されているようでした。

他の方法も考えられないでは無いのですが出来ればJavaScriptで取得したいと思って色々検討した結果、以下の手順を思いつきました。

 1) PHPで環境変数を取得してPHPの変数に格納
 2) JavaScriptからPHPの変数を取得

PHPはサーバ側で動作することもあって環境変数は全く問題無く取得できます。JavaScriptからPHP変数の値が取得できれば出来るはずです。でとりあえず動作したのでここに書いておきます。htmlの中に以下のようにPHPとJavaScriptを記述して実現しました。

<?php
$addr = $_SERVER['REMOTE_ADDR'];
?>
<script type="text/javascript">
jaddr = "<?= $addr ?>";
document.write("address = " + jaddr);
</script>

ここでは環境変数REMOTE_ADDRを取得しています。なおPHPが先でJavaScriptを後に記述しないと順番があるのでうまく動作しません。まあ釈然としない部分はあると思いますがまずは目的クリアの為にはこういう方法もあると言うことでご参考まで。
2010-02-17 17:13:56 - miyachi - - [プログラミング] -

2010-02-09

WindowsでのSSLクライアント認証プログラム  [by miyachi]

先日事情があってWindows上でのSSLクライアント認証のプログラミングの調査をしました。良く考えたら数年前に使ったことがあったのを忘れていました。健忘録として書いておきます。

SSLのサーバ認証は皆さん https で始まるサイトを利用する事で使っていると思います。クライアント認証はサーバ側が逆にクライアントを認証して接続の可否を決める仕組みです。X.509形式証明書と秘密鍵を使いますのでPKI的な素養が必要ですがPKIとは言えませんね。

と言うことでプログラミングで考えるとクライアント側からサーバへのhttp通信になります。良く使われているレガシーな通信APIとしてはWinInetがあります。Win32からhttp等の通信をするならWinInetが一般的です。msxml等からも使われています。ところがWinInetはSSLサーバ認証は対応していますがSSLクライアント認証には対応していません。SSLクライアント認証に対応するにはWinInetの後継であるWinHTTP英文)を使うとなっています。

でも何だかWinHTTPを生で使うのは面倒そうです。と言うことで.NET FrameworkのクラスであるHttpWebRequestHttpWebResponseを使う事をお勧めします。HttpWebRequestとHttpWebResponseを使ったクライアント認証の説明とサンプルのページもあります。私の場合はこのページだけでうまく使うことができました。

少し面倒なのが X509Certificate クラスで接続に利用するクライアント証明書を用意するところでしょうか。先のサンプルページでは「.cer ファイルが必要」となっていますがこれはWindows証明書ストアから取得した方が間違いがありません。X509Certificate2クラスの関連クラスを利用すればGUIによる証明書選択も可能になりますし必要な証明書を取り出す事も可能です。
2010-02-09 17:56:18 - miyachi - - [プログラミング] -