2010年10月15日金曜日

RedHatをシングルモードで起動

研究室の古いサーバ機にRH5.3 ELを入れたら、
haldaemonの起動中に完全フリーズして、一向に起動しなくなってしまった。
調べたところ、haldaemonは必須のデーモンではないらしいので止めてしまうことにする。

シングルモードでの起動はこちらを参考に。

シングルユーザーモードで起動する
http://www.jp.redhat.com/manual/Doc9/rhl-cg-ja-9/s1-rescuemode-booting-single.html

ついでに、いらなさそうな他のデーモンも止めた。

◇不要デーモンの停止(WBEL4)◇初心者のためのLinuxサーバー構築講座☆お便利.com☆:
http://www.obenri.com/_minset_wbel4/daemon_wbel4.html

もーマジで焦りましたよ。

2010年10月14日木曜日

mach-o, but wrong architecture なエラー

PythonからCの実行ファイルを呼び出している最中に突如起こったエラー。
以前コンパイルしたときは起こらなかったのに、半年ぶりにコンパイルしたら発生。
Snow Leopardのアップデートをかけてる内に、何かが変わったらしい。
※ちなみに当家の環境は、OX10.6.4 & Python2.6.1

簡単にググってみた所、やはりアーキテクチャ系(x86_64とかi386とか)の不一致が原因のエラーとのこと。
おかげで便利なコマンドを覚えた。
fileコマンドを使うと、その実行ファイルのアーキテクチャが調べられる。


$ file $(which python)
/usr/bin/python: Mach-O universal binary with 3 architectures
/usr/bin/python (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture i386): Mach-O executable i386
/usr/bin/python (for architecture ppc7400): Mach-O executable ppc

$ file 今回作ってたpythonから呼び出すcの実行ファイル
cnt.so: Mach-O bundle i386


Pythonは一応i386にも対応している。
ただ、メインはx86_64という話を聞きかじったので、ものは試しにx86_64アーキテクチャを明示してコンパイルしてみる。

Makefile中のコンパイルコマンドの中に-arch x86_64を含めておいた。


$(CC) -fPIC -arch x86_64 $(CFLAGS) -I$(PYLIBS) -o $(SOTARGET).o -c $(SOTARGET).c
$(CC) -arch x86_64 -undefined dynamic_lookup -bundle $(SOTARGET).o -o $(SOTARGET).so


で、その結果をfileコマンドで試してみると以下の通り。


$ file cnt.so
cnt.so: Mach-O 64-bit bundle x86_64


実際、これで実行してみると問題なく動作可能。
良かった良かった。

2010年10月2日土曜日

本気の殺意が湧いた瞬間

不良品の代品が、また不良品だったときとか<怒

某K社の指紋認証機能付きHDDなるものを仕事の関係で購入したのですが、

一個目不良品
→ショップに相談
→3日経って届いた二個目も不良品

さすがにこの時点で返品しました。
これは不良品であることが仕様なのかな?
何て挑戦的!

ってか、これに費やした私の時間を返せ<怒

2010年9月27日月曜日

AS3 継承でのオーバーライドの書き方

ファンクションをオーバーライドするには、
オーバーライドすぐ子クラス側にoverride指定子をつけてやる必要がある

------------
親クラス側
(オーバーライドされたいファンクションをpublicで書く)
------------
public class Parent
{
//略
public function getName():String{
//
}
//略
}


------------
子クラス側
(オーバーライドするファンクションのpublicの後にoverrideと書く)
------------
public class Child extends Parent
{
//略
public override function getName():String{
return "My Name!!"
}
//略
}


このように明示的にオーバーライドすることで、
書き手のファンクションの書き間違いが少なくなる、らしい。

2010年9月24日金曜日

説明会という名の檻

説明会という名の檻を作ってしまったことに反省。
事前のフォローが足りなかった。
  • 何故、その相手に向かって説明会を開いたのかを最初に語るべきだったのに、そのフェーズがなかった。
  • 説明会後に、相手がどうなるのか。相手に対する要求を明確化していなかった。
オブザーバーとして参加してくれたM2がすごくフォローしてくれて助かった。
本当にありがたい。

けど一度、リハーサルをしておくべきだったのも事実。
時間をケチったのが敗因。
反省。

2010年9月21日火曜日

MacでPDFのサイズを削減する

ずっとずっと、Acrobat Proffesionalが必要と信じてたのに。。。

MacでPDFのファイルサイズを軽くするには、Previewでいけることを知り、軽くショック。
手順は以下の通り。

  1. Previewで該当PDFを開く
  2. 別名で保存をクリック
  3. Quartzフィルタで「Reduce File Size」を選択
  4. そのまま保存する

2.0MBのファイルが一気に1.3MBになってしまった…!
さらにファイルサイズを下げたいなら、Quartzフィルタを編集すれば良い。
これはMacのColorSyncアプリケーションから操作可能。

  1. アプリケーション >> ユーティリティ >> ColorSyncを開く
  2. ウィンドウ上部に並んだボタンからフィルタをクリック
  3. Reduce File Sizeの右の方にある下向き三角ボタンをクリックし、「複製」を選択
  4. Reduce File Sizeのコピーが作成されるので、そちらの設定を適当にいじる

ここで作成されたQuartzフィルタはやはりPreviewから見ることが出来る。
これを使うと、さらに0.1MBファイルサイズが減った。


ただ、これでファイルサイズを削減した場合、図がちょっとおかしいことになったりするので、保存したPDFは要チェック。

2010年9月20日月曜日

Illustrator で ピクセル画像を作成

研究の関係でちょっと特殊な画像を作る必要が会った。

 * 画像中のある色をしたピクセルを、プログラムで指定した色で置き換える *

多分、もっと良いやり方はあるんだろうけど、とりあえず読み込んだbmp画像から、ピクセルの色を判定して、必要な部分だけ別の色に着色するっていうのがしたい。

そのための画像をIllusteratorで作っていた訳だが、思ったより手間取った。
というのも、以下のような問題が山積しているからだ。

・基本Illusteratorで扱う画像はミリメートル指定なので、ピクセル単位で見るとそこかしこがぼやける。
・アンチエイリアスがかかって余計にぼやける。

とりあえず、調べてみた結果、Illustratorではピクセル単位の画像を作るときは専用の環境設定を行う必要があるらしいことが分かった。
以下に必要事項をリストアップ。

  • ピクセル単位で画像を作成するように環境設定を変更
環境設定 >> 一般 >> キー入力 ->1px

環境設定 >> 一般 >> 単位 -> ピクセル


環境設定 >> 一般 >> スマートガイド >> 整列ガイド -> オフ


ドキュメント設定 >> アートボードの大きさ -> ピクセル単位
  • 表示も変更
表示 >> ピクセルプレビュー
  • 全てのオブジェクトを選択し、サイズ調整などを行うビューで、ピクセル整合にチェックを入れる

あとものすごく重要なのが、bmpで書き出す際に、アンチエイリアスをかけない。
これをしないと、ここまでの作業が確実に無意味。
実はこれに気づくのに時間がかかったというアホが私。。。

2010年9月19日日曜日

MacOS 10.6 で右クリックで新規ファイルを作成する

元々Windowsユーザなので、Macでは右クリックでファイルが作れないという仕様に未だに驚きを覚えてしまう。
なんでApple側はこれに対応しないんだろう。便利なのになー。

とりあえず、最初はNuFileを導入したが、動かず。
どうやらセキュリティの関係で、10.6以降はコンテキストメニューをカスタマイズする類のソフトウェアが使えなくなっているらしい。

代替手段としてAutomaterが使えるという情報をゲットしたが、いまいち使い方が分からず苦心した。
上手く行った方法をメモしておく。
あるパスに置いたテンプレートファイルを、今選択しているディレクトリにコピーするという仕様。

1. Automaterをクリックして立ち上げる。


2. 最初の選択画面で「サービス」を選択する。


3. 右のゾーンにワークフローを作っていく

  3-1. "サービス"が受け取る選択項目を「ファイルまたはフォルダ」にする

  3-2. 検索対象を「Finder.app」にする


  3-3. 左カラムの「ライブラリ >> ユーティリティ >> 変数の値を設定」を右ゾーンにドラッグ&ドロップ。

  変数名は適当に付けてしまう。「コピー先」とか。


  3-4. 左カラムの「ライブラリ >> ファイルとフォルダ >> 指定されたFinder項目を取得」を、右ゾーンにドラッグ&ドロップ

  ここがポイントで、テンプレートにしたいテキストファイルを予め作成して、適当なディレクトリに放り込んでおく。

  テキストファイルなら空でもいいけど、HTMLファイルにゃ自分のテンプレート作っておきたいしねー。

  この取得のワークフローの中の「追加」ボタンを押して、そのテンプレートファイルを選択。


3-5. 左カラムの「ライブラリ >> ファイルとフォルダ >> Finder項目をコピーを選択」を右ゾーンにドラッグ&ドロップ。

  「保存先」として、3-3で付けた変数名を入れる。

  おそらく右ゾーンの下に変数のリストが並んでいるので、
  そこからドラッグ&ドロップすればOK



4. ツールバーの「編集 >> 保存する」をクリックして、作成したワークフローを保存。
  ここで付けたサービス名がコンテキストメニューに出てくる!
  保存先は「/Users/自分のユーザ名/Library/Services」になってる。

  もし、ワークフローを書き換えたければここを開けば良い。


ちなみに出来るとこんな感じ↓↓


以上で終了。
すぐに反映されなければFinder.appを再起動すれば、多分反映されるはず。
ターミナルから、以下のコマンドを打てばFinderの再起動がかかる。
  $ killall Finder

作ったサービスを表示するか否かは、Finderの「Finder >> サービス >> サービス環境設定」から調整できる。
ここの左カラムのサービスを選択すると、右カラムのずっと下の方にファイルとフォルダの項目がある。
そこに作ったサービス名が表示されているはずなので、そいつをのチェックを外せば表示されなくなる!

2010年9月17日金曜日

LaTeX でキャプションの中に脚注をいれる

LaTeXで図や表のタイトルの中に脚注をいれたい場合、通常の ¥footnote{脚注中身...} は使えない。
¥footnotemark と ¥footnotetext{脚注中身...} の組み合わせを使えという情報はあったが、一応コンパイルは通るものの、

! Argument of \@caption has an extra }.

みたいな気持ち悪いWarningがでる。

だから正解はコレ。

¥begin{figure}[htbp]
  ¥centering
  ¥includegraphics[scale=0.8,keepaspectratio]{img/test.eps}
  ¥caption{図のタイトル ¥protect ¥footnotemark}
  ¥label{fig:test}
¥end{figure}
¥footnotetext{ 脚注中身... }

¥protectを¥footnotemarkの前に入れておくと警告が出ずに済む。
すっきりした。

2010年9月9日木曜日

Pythonの関数に辞書型の引数を用いる

いわゆるキーワード引数のこと。タプルを使う場合もあるが、今回は単純に

>>> a = getAge(1985, month = 8)

みたいな使い方について述べる。

関数側の定義は以下のようになる。


nowYear = 2010
nowMonth = 9

def getAge(year, **keys):
"""
年齢を返す
"""
if keys.has_key("month"):
month = keys['month']
else:
month = nowMonth

age = nowYear - year
if month - nowMonth > 0: # まだ生まれ月じゃない
age -= 1
return age



辞書がそのキーワードを持っているかはhas_keyメソッドで確認できる。
これで色々とパラメータを調整できるようになって楽だな。

2010年9月3日金曜日

PILを用いて画像の特定の色を別の色に変換する

Python Image Libraryを用いて色を変換。
これがやりたかった。

画像を開く
>>> img1 = Image.open("test.jpg")

RGB値のバンドを持つ画像オブジェクトに変換
>>> img1.convert("RGB")

画像のピクセルサイズを取得(タプル型)
>>> pixelSizeTuple = img1.size

新しい画像オブジェクトを用意する
ここではアルファ値を持つ、img1と同じサイズの画像を用意
>>> img2 = Image.new('RGBA', img1.size)

各ピクセルからgetpixelメソッドで色情報を取得し、特定の条件に基づいてputpixelメソッドで別の色を入れる。
ここでは、RGBの内、赤と青が220以上の値をとるピクセルを赤で塗り替える。
getpixel(ピクセル位置をタプルで指定)
putpixel(ピクセル位置をタプルで指定, RGBAをタプルで指定)
>>> for i in range(pixelSizeTuple[0]):
>>> for j in range(pixelSizeTuple[1]):
>>> r,g,b = img1.getpixel((i,j))
>>> if r > 220 and b > 220:
>>> img2.putpixel((i,j), (255,0,0,0)) # 真っ赤に!
>>> else:
>>> img2.putpixel((i,j), (r,g,b,0)) # 元の色

画像を保存
>>> img2.save("test_new.jpg")

ちなみに実行時間を計測した結果、100*100ピクセルの画像で
0.06908秒程度。わお。
別の画像では0.066095秒だった。
ちなみにMacBookProでメモリは2GB。
これだったらImageMagick出動しなくても大丈夫そう。

以下、ビフォーアフター。
元画像
生成画像


ちなみに、特定色がピンポイントである場合は、ImageMagickのconvertコマンドの方が早いかもしれない。

convert -fill '置換後の色' -opaque '置換対象の色' 変換前画像ファイル 変換後ファイル名
convert -fuzz 50% -fill '#00ff00' -opaque '#ff0000' icons.png i.png

参考:アグレッシブエンジニア: ImageMagickのconvertコマンドで特定の色を置換する
http://blog.tanarky.com/2009/08/imagemagickconvert_19.html

PILを用いたRGBのバンドの変更

Python Image Libraryで画像をRGBA(Aは透過を示すアルファ値のこと)に分解し、それぞれのバンド別に処理を行う。

画像を開く
>>> img1 = Image.open("../test.png")

RGBAをそれぞれ抽出する
>>> r,g,b,a = img1.split()

特定色のバンドを255諧調で変更 (例えば r2 = r.point(lambda i:255)とかでも良い)
>>> r2 = r.point(lambda i:i*0.1)

マージする
>>> img2 = Image.merge("RGBA", (r2,g,b,a))

保存する
>>> img2.save("../test_new2.png", 'PNG')

以下、ビフォーアフター。

元画像
生成画像

2010年9月2日木曜日

PILを用いた画像の重ね合わせ

Python Image Libraryを使って、少し画像処理をしてみた。
透過画像(png)を読み込んで、透過部分を維持したまま、重ね合わせる。

まずはimport
>>> import Image

画像を開く
>>> img1 = Image.open("../test.png")

重ね合わせる画像(透過png)を用意する。
※ここではimg1を180度回転させただけのもの。
>>> img2 = img1.rotate(180)

alpha値情報を用いた状態に変換しておく
>>> img3 = img2.convert("RGBA")

重ね合わせ。paste(Image型の重ねる画像, img1のどの位置に左上を合わせるか, マスク)
マスクはまだよく分かっていないけど、img3を同じく指定しておけば問題ない
>>> img1.paste(img3, (0,0), img3)

保存
>>> img1.save("../test_new.png", 'PNG')

以下、ビフォーアフター。

元画像


処理後

2010年6月24日木曜日

久しぶりの更新

正味、一年くらい更新してなかった気がする。
あまりに放置プレイしすぎて、新しくブログを
仕切り直してしまおうかとさえ思った位。


さて。
久しぶりに高校時代の友人に会った。
学生身分(微妙に違うけど)の能天気な日々を送る私と違い、
彼女は既に去年就職していて、
某大手建設会社の総合職として働くバリバリのキャリアウーマンだ。

とはいえそちらは完全なる男社会らしく、
今務めている職場では、彼女が初めての女性総合職だという。

おかげで上からは色眼鏡で見られるわ、仕事を教えてもらえないわ、
下からは明らかになめられるわで、相当ストレスが溜まっているとのこと。
まあ、確かに私自身の環境でも、共感を覚える部分はあるが、
もし私が彼女の立場に居たら、いつか上司を殴りそうだ。
まあ、上からの色眼鏡は耐えられるけど、
下の教えても教えても学ばない、というより学ぶ気がしないくせに
ミスを連発するアホはしばき倒したい。切実に。

しかし彼女、いつかぷっつん来そうで怖い。
ホントに切れる前に、「やっだーw」と声色を使いつつ、
相当な力で上司をどつくスキルと地位!をゲットできたら良いんだが。。。

2009年9月21日月曜日

ハチクロ的大脱走 続き

京都を出発して三日目。
昨日は兵庫県赤穂市に宿泊して、
本日一日で岡山県を完走。
現在地は広島県福山市です。

ちょこちょこ土産の品などを買っているので、
だんだんリュックが重くなってきた。。。
足腰の筋肉痛に加えて、今日は肩こりにも悩ませることに。

とりあえず今のところ、進行は順調。
この調子なら明日には実家の西高屋に着くな。

今日もきつかったが、多分明日が一番きつい。
山の中をひたすら走ることになるので、
おそらくアップダウンがかなり激しい。。。

あとちょっと頑張ろう。
さて柔軟して寝よー。

2009年9月19日土曜日

ハチクロ的大脱走 はじめに

本人は修行というか忍耐試しのつもりなんですが、
たぶん他の人から見たら脱走以外の何者にも見えないんだろうなぁと苦慮しつつ
それでもやってしまいました。

実家に帰ります。
自転車で。

ちなみに下宿先は京都の寺田。
実家は広島の東広島市。
総走行距離は350km~400km程度。
一日に80~100Km進めば着くはず。

本当は観光とかしつつまったり帰りたいんですが、
シルバーウィーク内に終わらせなければならないという時間制限があるので
結構タイトなスケジュールになりそうです。

ちなみに現在地は、兵庫県三宮。
既に筋肉痛が始まっております。。。若いってスバラシイ<泣

明日は
さぁ、この文系(体育会系の逆って意味で)の足腰がどこまで保つかな。

2009年7月28日火曜日

案外やっちゃうこと

Firefoxのプロキシ設定「プロキシなしで接続」において
IPでネットワークを指定するときの方法

× 192.168.1.*

○ 192.168.1.0/24

なんかワイルドカードだと上手く動かない。
CIDR(Classless Inter-Domain Routing)じゃないと駄目っぽい。

2009年7月25日土曜日

仰角45度の悪夢

レッツが拗ねました。



この角度じゃないと、モニタが落ちる。。。
デュアルディスプレイの相手先をプライマリに指定して難を逃れようとしたのですが、持ってるモニタが解像度的に問題があるようでプライマリになってくれない。。。

この状態で一体何をしろと言うんだ。
あれか?
韓国行くなってか?

もぉ私が拗ねたいよ……(;_;)

2009年7月23日木曜日

危篤

四年間付き合っていた私のパートナーが危篤状態に陥りました。
いえ、Let's noteなんですけどね。

前々から外傷は酷かったです。
基板が見えちゃったり、キーボードが浮いちゃったり。
けど、多少肥満気味ながらも(HDD残量3GB程度...DVD焼いたら成仏しかけました)頑張って働いてくれてました。

しかし、とうとう躁鬱病も患い始めました。
ええ、顔がいきなり暗くなったり明るくなったり。
あたかも、寿命がきた蛍光灯が明滅を繰り返すがごとく、モニタがプッツンプッツン落ち始めました。

入院させたくとも代理がいないので、離れることも出来ず。。。
かといって、いつ昇天召されるか分からない人をアチコチ連れて行くのも賭けですし。。。


いい加減、新しい相棒を確保せねば;;

2009年7月19日日曜日

AS3 in Amazon ☆ Product Advertising APIのHMAC-SHA256署名への対応

Python側での対応が終わったので、次はFlexアプリケーションにてAmazonの署名リクエストを行うように対応。

私の検索方法が悪かったのか、参考になるWebページがあまり見つからなくて困った(>_<) 結局、一番分かり易い、というかクリティカルなところを解決してくれたのはAmazonのコミュニティだった。
やっぱり大事なんだな、こういうところ。

AS3でHMAC-SHA256署名を行うにあたり、まずは以下のパッケージを導入する必要がある。
as3crypto

zipファイルをダウンロードして解凍。
com以下を作業用ディレクトリにコピペ。

後は、このパッケージのHMAC、SHA256、Base64クラスをインポートして、HMAC-SHA256でハッシュ化した後、Base64エンコードする。
この辺の手順については、RHC2104の仕様とか全然読んでない;;
Pythonの時にお世話になった以下のページを参考にハッシュ化とエンコードを行った。
Amazon Product Advertising APIの署名認証をPythonでやってみる

以下、参考までにAS3のソースを公開。

/*** Import ***/
import com.hurlant.crypto.hash.HMAC;
import com.hurlant.crypto.hash.SHA256;
import com.hurlant.util.Base64;

/*** Field Variables ***/
private var requestUri:String = "ecs.amazonaws.jp"
private var requestPath:String = "/onca/xml"
private var amazonSecretKey:String = "AWSの秘密鍵"

/*** AWS Access Method ***/
private function sendAmazonRequest(var1:int, asin:String):void{
var amazonloader:URLLoader = new URLLoader()

// タイムスタンプの作成:ISOフォーマット、UTC(世界標準時)
// make Timestamp: ISO format, UTC
var timestamp:String = makeTimeStamp()

// バイトコード順にソートしつつ、クエリを連結
// クエリをそれぞれescape関数でURLエンコードしておく(×escapeMultiByte)
// sort query by the byte code ascending, and join them
// query is urlencoded by 'escape' method (not escapeMultiByte)
var query:String = "AWSAccessKeyId=Amazonへのアクセスキー&"
+ "ItemId=" + asin + "&"
+ "Operation=ItemLookup&"
+ "ResponseGroup=" + escape("Medium,Images,EditorialReview,Reviews") + "&"
+ "Service=AWSECommerceService&"
+ "Timestamp=" + escape(timestamp) + "&"
+ "Version=" + "2008-08-19";

// 署名の生成
// make Signature
var signatureText:String = ["GET", requestUri, requestPath, query].join("\n") // 署名する文書 Document for signature
var signature:String = makeSignature(signatureText, amazonSecretKey)

// URLエンコードした署名をクエリの最後に追加
// リクエストURLの完成
// add urlencoded Signature to query tail
// complete request Url
query += "&Signature=" + signature.replace(/\+/g,'%2B').replace('=', '%3D')
var requestUrl:String = "http://" + requestUri + requestPath + "?" + query

// amazonへアクセス(onAmazonRequestCompleteにてダウンロード完了後の処理を行う)
// access to Amazon (after download complete, onAmazonRequestComplete() executed)
amazonloader.addEventListener(Event.COMPLETE, onAmazonRequestComplete(var1, amazonloader));
amazonloader.load(new URLRequest());
}


private function makeTimeStamp():String{
// ISOフォーマットでタイムスタンプを生成 YYYY-MM-DDTHH:mm:ss
// 世界標準時(UTC)を採用
var timestamp:String = timeStamper.getUTCFullYear() + "-"
+ to2size(timeStamper.getUTCMonth() + 1) + "-"
+ to2size(timeStamper.getUTCDate()) + "T"
+ to2size(timeStamper.getUTCHours()) + ":"
+ to2size(timeStamper.getUTCMinutes()) + ":"
+ to2size(timeStamper.getUTCSeconds())
return timestamp
}

private function to2size( data:Number ):String{
// 日付や時分秒が10未満の場合、2桁となるよう左に0を挿入
var strData:String = data.toString() // 返却する文字列
if (data < 10) {
strData = "0" + strData
}
return strData
}

private function makeSignature(signatureText:String, key:String):String{
// HMAC-SHA256署名の作成
// 署名する文書と、ハッシュキーを引数として受取り、String型の署名データを返す
// generate HMAC-SHA256 signature
// accept "document for signature(String)" and "signature key(String)" as variables
// return signature(String)

//HMAC-SHA256署名を行うクラス
var hmac256:HMAC = new HMAC(new SHA256());

// 署名する文書のバイトデータ ByteArray for signatured document
var signatureTextBytes:ByteArray = new ByteArray();
signatureTextBytes.writeUTFBytes(signatureText)
// 署名用のハッシュキーのバイトデータ ByteArray for signature key (AWS secret key)
var keyBytes:ByteArray = new ByteArray();
keyBytes.writeUTFBytes(key)

// HMAC-SHA256署名を行い、ダイジェストを生成
// generate Digest (HMAC-SHA256)
var digest256:ByteArray = hmac256.compute(keyBytes, signatureTextBytes);

// ダイジェストをBase64でString型にエンコード
// encode Digest(ByteArray) to String by Base64encoding
var signature:String = Base64.encodeByteArray(digest256)

return signature
}


BeteArrayをnewしてから、writeUTFBytesで中身を書き込むのが味噌。
as3cryptoのテストコードではHexというクラスをnewして、Hex.toArray("署名したいドキュメント")でByteArray型の値を生成していたんだけど、こちらを使うとSignatureが不正になってしまった。

SignatureのURLエンコードはreplaceメソッドで手作業。。。
最初はescape関数を使ってたんだけど、+が上手く%2Bに変換されないんだよね。
エラー続発につき、とりあえず+と=だけ変換するように改良。

ちなみに、ダウンロード終了後に呼び出すイベントハンドラ、onAmazonRequestCompleteメソッドには複数の引数を与えてる。


amazonloader.addEventListener(Event.COMPLETE, onAmazonRequestComplete(var1, amazonloader));


これは、以下のように、イベントハンドラの中で、さらにfunctionをreturnすることで可能となる。


// AmazonのXMLのNamespaceをnewしておく。リクエスト時の"Version"との一致が必須
// make Amazon XML Namespace instance. Namespace Version needs to be as same as "Version" at request
private var ns:Namespace = new Namespace("http://webservices.amazon.com/AWSECommerceService/2008-08-19");

// ダウンロード終了イベントを受け取るメソッド
// Method accepting download complete event
private function onAmazonRequestComplete(var1:int, amazonloader:URLLoader):Function{
// 実際にイベントを処理するfunctionを返す
// return function which handles Event actually
return function(e:Event):void{
default xml namespace = ns;
var response : XML = new XML(amazonloader.data);

// 以下、XML操作...
// And read and write XML...
}
}


難産だった。。。