Archive for 11月, 2009
最近、Flexをちょっとおやすみがちで、mod_chxjというオープンソースをいじくっている。
携帯向けコンテンツ変換というと、商用ではまあまああるが、あまり使い勝手がいいとはいえない。
(といっても一社のしかつかっていないが・・・)
私はもともと、携帯のASPをやっていたので、エディタがキャリア別にコンテンツ(HTML)を書き換えるようにそもそも、
作っていたのであまり縁がなかったが、出来上がってしまったHTML(CHTML等)をそれぞれのキャリア別を変換してくれる
mod_chxjを知って、なかなか使い勝手がいいなーと思いました。
ただ、現在の携帯はXHTMLが主流になりつつあり、昔問題となっていた画像の問題もそれほど大きくならなくなってきた。
まあ、最近では気にせず、携帯コンテンツが作れるようになってきたなー
と思っていたら、このXHTMLというものかなり曲者。
とくに、ドコモのやつはかなりの・・・やっかいもの。
残念なのが、mod_chxjはXHTMLに対応していない。。。。
と、ここでmod_chxjを改良し、XHTMLの対応を行うことにした。
改良したものは、ぼちぼちとオリジナルに返しているので、
これでXHTMLが完了すれば、結構つかえると思いますよ。
もし興味があれば使ってみてください。
mod_chxjのサイトはこちらから
最近、ちょっと自分でも気に入っているのが、ドコモの絵文字の色を自動的につける。
ドコモって、divタグとかでフォントの色が指定してあると、絵文字の色も変えやがる。
それで、絵文字を強制的に色をつけるようにfont/spanでくくってしまうという機能。
絵文字が並ぶと面倒なので、自分的には結構重宝。
flexのDataGridを使ってデータ一覧を表示したが、なぜか、マウスのカーソル通り、背景が反転しない。
もしや、DataProviderを自作しているためか?
でも、同じオブジェクトを使いまわしているところはないし・・・
ん・・・
何かデータにゴミがあるとおかしくなるのか?
と、データのプロパティを1つ1つ調べていくと、
uid
というフィールドがおかしいというところまでは力技で突き止めた。
んー、このフィールド名ではなく、別のフィールド名(messageId)という名前に変更したところ、
きちんと動くようになった・・・・
ちなみに、ほかでも同じような状況になったことがあるのだが、uidをダブらないようにしたらこの状況は起きていないので、
明らかに、このフィールドが作用している・・・
もしや、これは使えないフィールドというものが存在するかも。。。。。
私の場合、SQLiteを使ってデータを保存して、このフィールド名にuidというものを使ってしまった。
このように、DBという制約に頭がいってしまい、
uidというフィールドがFlexのframeworkレベルまで影響を及ぼすということを認識していなかった。
多少調べてみたら、
http://livedocs.adobe.com/flex/3_jp/langref/mx/controls/listClasses/BaseListData.html
というところが関係しそうな気がする。
さらに調べてみると、そのuidは、
http://livedocs.adobe.com/flex/3_jp/langref/mx/utils/UIDUtil.html#getUID()
で、itemのuidフィールドを見てそこからuidを取得しているから
uidというフィールドに一意にならないデータとして使ってはならないということだ。
私の場合、メールのmessage-idをuidとして保存していたのだが、意味としては重複してはならないが、
データとして結果として重複する場合があるので、まあ、それはそれでいいかとしていたが、
やはり、名前を変えることにした。
通常、uidというフィールドにユニークでない値をつかうということは少ないと思うが、
レアなケースだけにすぐに原因も見つけられなかった。
まあ、これでもう少し、
DataGridの中身が理解できたので、それはそれでいい経験ということで納得しよう。
gitでは、ちょっとした開発やバグフィックスなどbranchを使用して開発する。
このために、頻繁にマージしたくなる。
ただし、ここであえて「マージ」と記述したのは、”git merge”のことではなく、
変更した内容を反映させたいという意味で「マージ」だ。
そのマージする際の、いろいろな手順にを覚書として記録しておく。
1)ブランチのコミットした内容も含めてマージする
git merge [ブランチ名]
2)ブランチの修正した内容すべての変更を取り込む
つまり、1)でやったこととほぼ同様だが、コミットはしない。
git merge --squash [ブランチ名]
これで、ブランチ上で行ったすべての変更が1つになって取り込まれる。
しかしながら、これでは、せっかく何度もブランチ上で育てたログが無駄になってしまう。
ログとソースをきれいにした状態で再作成したい場合にはこれではこまるので、
次の方法をとる。
3)パッチファイルを作成して、自由な単位でマージする
git format-patch -o dir_p mater..[ブランチ名]
たとえば
git format-patch -o p1 master..fix4 p1/0001-7.3.patch p1/0002-7.4.patch
こんな感じに出力されます。
次に、そのパッチを当てるのですが、当て方が2種類。
こちらも、ログ情報なども含めて自動的にコミットするか?
または、修正の内容だけを反映して、後で自分でコミットするか?
です。
パッチをあててコミットも自動で行う
git am [パッチファイル]
で先ほどの出力例を使って実行すると・・・
git am p1/0001-7.3.patch Applying: 7.3
修正の内容だけを反映する
git apply [パッチファイル]
git apply p1/0002-7.4.patch
これらの方法を使って、後で管理しやすいように修正の単位とログをきれいにできるので、
結構使うといいのではないでしょうか?
AIRのバージョン2のテストバージョンがリリースされたらしい。
さて、ここで私が注目しているのは、ネットワーク機能だ。
というのも、メールクライアントを作っているので、ネットワークに関する機能UPはうれしい。
今まで、あーこれはできないのかーとか思ったりもしたので・・・
では、どのようなネットワーク機能ができるのかといえば、
1)サーバソケット機能
この機能を使えば、AIRで立ち上げているアプリを中心に、その他のサービスをつなげることができる。
様々なデバイスと連携する場合などに役に立つのではないだろうか?
また、ローカルにHTTPのサーバを構築することも可能になりアイデア次第では、WEBとアプリのコラボがより柔軟につくれるのではないだろうか?
2)UDPソケット
あまり、UDPなんて馴染みがないと思うが、UDPはUDPでいいところもある。
また、DNSから名前参照をしようと思ったら、UDPは必須だ。
(と思ったら、口述しますが、DNS lookup機能が付いたようです。)
また、私は、Syslogをデバッグ用のログ出力として作ったがTCPをサポートしているsyslog(syslog-ng等)のみだったが、
UDPが使えれば、syslogのシステムを選ぶこともない。
こんなsyslog機能なんて必要ないようにも思えるが、たとえばアプリで参照したデータログをsyslogで飛ばせば、
データ参照の証拠としてもログもLAN内で残すようなことも可能だ。
さらにsyslogのノウハウも使えるので、セキュリティを重視するサービスをやるのであればこれも一つの選択肢ではないだろうか?
3)TLS/SSL sockets
これは、as3cryptというライブラリで実現可能であったが、それでも標準でサポートされるようになったのはうれしい。
4)DNS lookup
UDPのところで述べたが、DNSで名前をひける。
Socketを使って直接接続するようなサービスがとも思ったが勝手に名前解決をして接続できるので、
あまり、使いどころが思い浮かばない。
純粋に、名前解決等アプリ?直接メールを送る?とか・・・・
5)ネットワークインターフェース情報
これをどうするか?を考えていましたが、やっとです。
ここを見る限りでは、
hardwareAddressとは、MACアドレスのことではないでしょうか?
また、クライアントのIPアドレス(サーバから見たIPではなく)もとれるようです。
これで、事実上の端末識別IDのようなものが作れるのではないでしょうか?
ちなみに、正式リリースは
AIR 2の正式版も2010年前半に予定されている
ようです。
私のメールクライアントもこれぐらいにはできてればいいなー。
SMTPとPOP3はほぼ出来上がっているから、後は画面なんだけど・・・・
ちょっと混乱してしまったので・・・記録。
このあたりは別の言語(というかライブラリ)を使っていると、
いろいろ混じってしまって、さらにIDEを過信してしまいはまってしまいます。
ある文字を別の文字に置き換えたいなと。
具体的には
改行コードを<br>に置き換えたかったので、
var foo1:String = "abc\r\ndef"; var foo2:String = foo1.replace(/\r\n/,"<br />");
と、あれ始めしか変換されんぞ・・・・
ああーー
var foo1:String = "abc\r\ndef"; var foo2:String = foo1.replace(/\r\n/g,"<br />");
と記述すると、Flex Builderが/\r\n/g のように色がついています。
んー、gの部分は色が変わっていないから、だめなのかー
と早とちり。
Stringのマニュアルを読んでみることに・・・・
以下抜粋(http://livedocs.adobe.com/flex/3_jp/langref/String.html):
replace(pattern:*, repl:Object):String
指定された pattern をストリングと照合し、新しいストリングを返します。
この新しいストリングでは、pattern と最初に一致した部分が repl で指定された内容に置き換えられます。
ここで、「最初に一致した部分」という説明とFlex Builderの色が変わらない現象に、勝手に勘違いをしてしまいました。
詳細を見れば、きちんとパターンに
/\r\n/g
が使えると書いてあるではありませんか?
きちんと最後までマニュアルは読まなければいけませんね。

