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>に置き換えたかったので、

[AS]
var foo1:String = “abc\r\ndef”;
var foo2:String = foo1.replace(/\r\n/,”
“);
[/AS]

と、あれ始めしか変換されんぞ・・・・
ああーー

[AS]
var foo1:String = “abc\r\ndef”;
var foo2:String = foo1.replace(/\r\n/g,”
“);
[/AS]

と記述すると、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

が使えると書いてあるではありませんか?

きちんと最後までマニュアルは読まなければいけませんね。

さて、gitの使い方を忘れないうちに、gitの使い方をメモっておきます。

git上で作成したブランチもgit-svnを使えばsvn上にブランチを作れると思っていたが、
どうやら、そうではないらしいので、git-svnを使ってsvnのブランチの使い方をメモしておきます。

1)ブランチを認識するようにワークを作成する

 git svn clone [uri] -T trunk -b branches -t tags

例)
 git svn clone file:///home/foo/svnroot/foo -t trunk -b branches -t tags

2)ブランチを作成する

※ gitのワーク上で作り方はわかりません。
   subversionのワークを使って行ってください。
  
3)作成したブランチ情報でgitのワークを更新

 git svn fetch svn

以下で、作成したブランチが確認できます。
 git branch -r
4)作成したブランチをgitのワークに取得

 git checkout -b [svnのブランチ名] [gitで認識するためのsvnブランチ名]

例)
 git checkout -b branch1 svn-branch1

のようにします。

5)ブランチで変更したソースをmasterにマージする

 git checkout master
 git merge [gitで認識するためのsvnブランチ名]

例)
 git merge svn-branch1

とのことだ。

多少わけあって、git(バージョン管理)を触ることになりました。
決して、仕事で必要なわけではないのですが・・・・

さて、今まで、CVSとSubversionを触ってきて、ことさら不自由は感じていなかったのですが、
いざ、会社という枠組みを外れてコーディングということを考えたときに、確かに集中管理型のバージョン管理ではなく、分散管理型が必要になる理由がよくわかりました。

でも、ほんとに分散管理が必要なひとって少ないんじゃないかな、割合的には。
私も、パッケージ開発やら、ASPサービスやらと、同時に複数のバージョンが動くことがなかったら、バージョン管理っていっても、「タグ」も「ブランチ」も使わないでしょうし。そういう意味で、単発SIなんかは、ほとんどの機能を使わずに済みます。
(それでも、習慣としてつかってしまうのですが・・・)

さらにgitは、コマンドが複雑(というかオプションが多い)ので、覚えられません。

昔、「一太郎」などを買うと、ちっちゃい紙に「コマンド一覧」とかってのがあったけど、あれが必要ですね。

Google CodeがGitではなくMercurialを採用へ

なんてこともあるので、確かに私だけでなくほかの人も複雑だと感じているのだなと。

さて、ここまで「それほどいらない」ということを述べてきましたが、それでも「あー、これは便利だ」という機能がありました。

1)ネットワークにつながっていなくてもバージョン管理が可能。
今の時代、ネットワークにつながっていないなんてと思うかもしれませんが、ノートパソコンを利用していて、従量課金だと思うと常時接続にはしません。
そうすると、自分がどのタスクとどのタスクが終わっていなくて・・・とかコードがまじってしまうので、ひとつひとつ管理ができるのがGood

2)「ワーク」、「ステージ(インデックス)」、「本番」という感じで「コード中」と「本番」の間の状態があって、ここに保存できるのはいいですね。
しかも、git add -p ってやれば、変更中のどの部分をステージにあげるか?ってのができるから、きちんと作った部分とデバッグのためのコードが入り混じっていても、それらを分けることができるのがいい。
これなんかは、「なーるほど」と思わせてくれる機能ですね。

でも、やっぱり、リビジョンが数字じゃないってのはかなり違和感あり。

というか、会話がしづらいし、イメージがつきにくい。

でも、gitはgit-svnというのを使えば、Subversionのリポジトリに対してgitで管理できるのはいいですね。

つまり、中央にSubversionをおき、そのワークとしてgitをつかうってのがいいようなきがしますね。

さて、DataGirdのヘッダをいろいろとカスタマイズしたいなとおもって、その備忘録です。

1)ヘッダを表示しない

単純にDataGridの1列目を項目として2列目を値の入力などのようなプロパティ編集として使いたい場合に、
ヘッダを表示したくないということがある。
この場合には

<mx:DataGrid showHeaders="false" />

ただし、ここで注意しなければいけないのがヘッダの表示がないと、列幅を変える場所がなくなってしまうのです。
普通のセルの縦の区切り線でもサイズを変更できるようにできればいいのですが・・・

なので、私が気をつけているのは・・・

<mx:DataGridColumn headerText="項目名" minWidth="100" width="100" />
<mx:DataGridColumn headerText="値" />

のように1列目は幅を固定します。
ただし、なぜかリサイズとかすると、この設定を無視してサイズが変わるので画面の更新で再度、設定しなおします。
(headerTextは表示されませんが、わかりやすいように値をいれているだけです。)

列の幅の調整については私はこのようにしてにげました。

2)あるヘッダだけソートをさせなくしたい。

セルにチェックボックスや、ボタンなどを表示しているときに、そのヘッダをクリックされてもソートされないようにしたい。

<mx:DataGridColumn sortable="false" />

3)ヘッダにアイコンなどの画像などを表示したい

DataGridColumnに対してheaderRendererを設定してやればよい。

<mx:DataGridColumn id="dgf_priority">
	<mx:headerRenderer>
		<mx:Component>
			<mx:HBox verticalAlign="middle" horizontalGap="0">
				<mx:Image source="@Embed('assets/star_s.png')" />
				<mx:Label text="スター" />
			</mx:HBox>
		</mx:Component>
	</mx:headerRenderer>
</mx:DataGridColumn>

4)ヘッダの高さを取得・変更する

ヘッダの高さは
<mx:DataGridColumn headerHeight=”10″ />
のように設定できます。取得も同じプロパティです。

ソフトウェア&ライブラリ



ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
カレンダー
2009年11月
« 10月   12月 »
 1
2345678
9101112131415
16171819202122
23242526272829
30  

カスタム検索
RSS
Add to Google
にほんブログ村 IT技術ブログへ