Archive for 10月, 2009
シェルを使ってファイルから1行ずつよみこみ、カンマで区切って処理をしたーい。
なんて時に、
while read LINE do // ここでsplitをつかってごにょごにょと・・・・ done < input.txt
ってな感じで、1行を切り分けていた。
ここでごにょごにょと書いたのも、いつもこの部分を忘れてしまい、
あー昔書いたやつをさがして・・・
と見つからず、いろいろと探していたら、もっといいやり方を知った。
まあ、たまにブラウズもいいものだと・・・
では、
while IFS=, read f1 f2 f3 do echo "$f1は1つ目のフィールド" echo "$f2は2つ目のフィールド" done < input.txt
というように、カンマで分割した形で変数にセットしてくれるので、楽だ・・・・
ちなみに、IFSとはInternal field separatorsの略らしい。
さて、昨日発売となったWindows7。開発をしている身としてはいずれバージョンアップするのだから、
今回はすぐにバージョンアップしてしまった。
これを使って、Flex Builderで開発と・・・
特にWindows7だから問題というのは発生しなかったが、
AIRアプリを実行し、Flex Builderのコンソールでログを見ようと、
実行したアプリを上のほうにどかすと・・・・・
ウィンドウが最大化してしまう・・・・・
何度やっても最大化してしまい、ちょうど、
こちらもウィンドウのサイズについてはこちらでいろいろと制御しているので、
それがWindows7になって何か悪さをしているのか・・・・
とかちょっと疑ってしまいました。
ただ、画面が横長で縦の領域が小さいので、ウィンドウを上にずらしているつもりが、
画面上部に移動してしまい、今回の新機能「Windows7のウィンドウの最大化」と間違ってしまっているようです。
んー困った。
横長なので、横に半分はいいが、縦の最大化はやめたい・・・・・
この機能だけ、無効にはできないのでしょうか?
今回はちょっと本の紹介。
携帯電話のタグを記載したマニュアルは最近多いが、
スタイルシートを適用した結果、ドコモ、AU、ソフトバンクでどのように表示されるかを示したリファレンス本である。
非常に細かく記述されており、どのスタイルがドコモ、AU、ソフトバンクで利用できるか、利用できないかの表があり、
また、それぞれのタグでキャリアごとに気をつけなければいけない点も記述されているので、
リファレンスでは見落としがちな注意事項も、きっちりカバーできている。
前半は、一般的な携帯サイトを構築するためのノウハウを記述しているが、後半から実機(とおもわれる)
でのXHTMLの表示ものせてあり、いまどきの携帯サイトをXHTMLで作成するにはぜひ手元に置いておきたい本の一冊だと思われる。
ただ、最初の最初は携帯向けXHTMLの成り立ちなどから記述されており、後半は実際のXHTMLの書き方であり、
ちょっと、前半と後半で読者の対象が異なる気もするが、なんとなくXHTMLのコードを書いていた人には、
基本も学べるのでこれを機に基本を再確認するといいだろう。
補足だが、ドコモ向けのXHTMLの場合、以下からサポートしているスタイル一覧が見れるので、
こちらも併せてみれば、現在ドコモ向けを基準に考えるならば十分だと思う。
flexでは、ResourceManagerという機能を使って文言を別のファイルにして管理が行えます。
したがって、マルチランゲージ対応などもこれを使って行えます。
では、Flex Builderを使ってこのResourceManagerを使って文言を別のファイルにします。
1)Flex Builderのpropertiesファイルに日本語を記述できるようにする。
この設定を忘れると、文字コードがおかしいといわれ保存ができません。
はじめ、Flex Builder日本語版で、propertiesファイルがJavaなどのpropertiesファイルと同じようにしなければ、
日本語を記述できないと勘違いしてしまいましたが、単なるFlex Builderの設定のようです。
(せっかく日本語版なのですから、このあたりのデフォルトもきちんと設定されているとうれしいのですが・・・・)
ウィンドウ>設定 から、一般>コンテンツ・タイプ
で
「テキスト」を開くと、「Javaプロパティー・ファイル」がありますので、そこのデフォルト・エンコーディングを”UTF-8″に変更してください。
2)ソースディレクトリの下に
locale/ja_JP
ディレクトリを作成し、ここに文言ファイルを置きます。
別のディレクトリに配置し、そこをソースディレクトリとして追加してもかまいません。
3)コンパイル時に、ja_JPを使うようにします。
プロジェクトのプロパティで、「Flexコンパイラ」の「追加コンパイラ引数」に以下のように設定します。
-locale ja_JP -allow-source-path-overlap=true -source-path=locale/{locale}
4)実際に文言ファイルを作成します。
ここではファイル名はLBL0001.propertiesにします。
title=これはタイトルです。 desc=ここには説明が入ります。
5)文言ファイルで定義した文言をMXMLで使用する
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
label="{resourceManager.getString('LBL0001','title')}"
>
<mx:Metadata>
[ResourceBundle("LBL0001")]
</mx:Metadata>
</mx>
という感じで利用可能です。
文言だけじゃなく、ちょっとしたシステム設定などにも使えるのではないでしょうか?
かなり以前ですが、HTML_Template_Sigmaを紹介しました(こちら)が、
ここで、HTML_Template_Sigmaがユニークで使えるテクニックとして、
「テンプレートから使われている変数を取得する」
というテクニックがあります。
これを使うと具体的にどのようなことができるかといえば、
テンプレートを変更すると、プログラムの動きを変えるなんてこともできます。
あまり、劇的にやってしまうとテンプレートとプログラムをわける意味がないのですが、
たとえば、一覧表を表示したいときに「フィールドを追加したいなー」とか、どの項目を表示するかは、
実装時には決められない。
なんてことがある。
この時、テンプレートで処理できればなーなどと思ったことはないだろうか?
Smartyなどのテンプレートの場合、テンプレートにどのような出力がされるかはプログラムからはわからない。まあ、このような類のテンプレートの仕組みは私が知る限りは、このHTML_Template_Sigmaしかしらない。
(私はJavaもしくはPHPぐらいしかWEBアプリをつくらないので、それ以外の言語はしらないのだが・・・)
では、HTML_Template_Sigmaでは実際にどのように記述するのだろうか?
たとえば
<table>
<!-- BEGIN LIST -->
<tr>
<td>{fld_id}</td>
<td>{fld_title}</td>
</tr>
<!-- END LIST -->
</table>
のようなテンプレートがある。ここで、表示したい項目は
{fld_id}
{fld_title}
だ。
では、この値をプログラムからはどのように取得するかといえば、
$tmpl = new HTML_Template_Sigma();
: (途中省略)
$vars = $tmpl->getPlaceholderList("LIST");
foreach($key as $vars){
// $row はテーブルなどから取得した値の配列
if(substr($key,0,4) == "fld_"){
$value = $row[$key];
$tmpl->setVariable($key,$value);
}
}
などのようにできる。
わざわざ、”fld_”というprefixをつけたのは、ここはフィールドとして自動的に取得していいよという感じのためだ。
このようなことができるとかなり汎用的なテーブル表示の処理が記述できるようになる。
また、このように変化に対応できるようなテンプレートであることを維持するためには、DBの設計などもシンプルでなければならず、これが結果としてあとあと拡張性がよりたかくできるなど、一石二鳥の面もあるのでおすすめだ。
そもそもなぜ1つのワークで2つのリポジトリにアクセスしたくなったかといえば、
パブリックに公開されているオープンソースなどに対して、独自の変更を加えたくなったからである。
そうなると、独自の変更を管理しながら、オープンソースなどのオリジナルの変更を取り込まなければならない。
そこで思いついたのが、独自の変更の管理がCVSで、オープンソースなどの管理がSubversionというわけである。
初めてバージョン管理(CVS)でソースを管理し始めたのが2000年頃だから、約10年もたってしまったが、その間にいろいろなバージョン管理が普及してきた。
そのおかげで、このような同時に2つのバージョン管理のもとでソースを変更するということができるようになった。
さて、再度やりたいことをまとめると・・・
1)Subversionのリポジトリには変更を加えない。つまりコミットはしない。
2)Subversionのワークでは変更をするが、この変更を管理したい。
3)Subversionのリポジトリ上で何か変更があったら、それを取り込みたい。
ということで、変更の管理をローカルのCVSで管理しようというわけだ。
仮に手元で変更しても、Subversionのマージ機能でできるだけ、最新についていこうというわけだ。
また、もし、マージ不可能になれば、実装方法を変えるか、最新についていかない(いけない)ということだ。
また、この仕組みは別の用途でも使える。
手元のリポジトリ(CVS)で細かい変更を管理し、ある程度まとまった管理を(Subversion)で管理する。という手法だ。
開発をしていると自分が何をしているのかのメモのためでも、1日の終わりにコミットしておきたいなと思うときがある。
それは、プログラムがコンパイルを通らないような状況のときもあるが、ソース管理のやり直し、取り消しなどの機能があると非常に便利で、コミットしておきたくなる。しかし、これが全体に悪影響を及ぼすのでできなかったのが、可能になる。
また、Subversionでは変更管理をするための周辺ツールなども揃っており、これらと連携するためにもある程度、機能単位でまとまってコミットできるとそれらのツールも使いやすいし、後で管理もしやすい。バグ番号などで管理しているならば、それらの単位でコミットできれば、まとまりとして管理できるので後でパッチなどもバグ毎に作りやすい。
この場合には
1)機能として説明できないほど小さいレベルや、1つのファイルでは修正が完了しないような変更はCVSにコミット
2)バグ番号、機能番号としてまとまったレベルまで変更がたまってきたら、それらを一括してSubversionにコミット
ということで、いろいろと応用ができる使い方ができる。
(ただし、csvとsvnで微妙にコマンドが違うので、自分が多少混乱する。)
では、そのための手順は、
1)Subversion のワークを作成
svn co svn://foo/..........
2)このワークをそのまま、cvsにインポートする。
ただし、Subversionの管理ディレクトリはいらないので、cvsignoreなどを使い .svnは無視するようにする。
cvs import .......
3)2で作ったリポジトリのワークを作るためにチェックアウトする。
cvs co [リポジトリ名]
4)3で取り出したソースを、1に上書きする。
SubversionもCVSも単純にディレクトリ直下の既定のディレクトリで管理しているので、これらがあればそれぞれのワークとして機能する。
(tar などを使ってご自由に上書きしてください。)
以上で、完了です。
(かなり、SubversionもCVSも使い方は省略しています。)
あとは、Subversionの変更を取り込むには、svn updateで、CSVの変更を取り込むには同じディレクトリ上で、cvs updateと打てばいいので結構楽です。これ。
また、個人的にはCVSのタグ付の機能がSubversionにはないので、これをCVSのほうで補完できます。
Flexでは、ダイアログをPopUpManagerを使って作成することができる。
また、作成時に画面の中央にダイアログを表示したい場合には
[AS]
private function createDialog():void{
var popup:IFlexDisplayObject = PopupManager.createPoopup([親画面],[Dialogのクラス],true);
PopupManager.centerPopup(popup);
}
[/AS]
のようにすればよい。
ここで、[Dialogのクラス]は、通常MXMLのようなものをさすと思う。
でも、小さい画面で開いていたが、ダイアログが見えないので画面を最大にしたとしても、
このままではダイアログは中央には移動しない。
ここで、親画面のリサイズとともにダイアログも中央の移動してほしい場合には
画面の更新とともに、以下のようなメソッド(関数)を作成しておき実行する。
[AS]
private function updateEnd():void{
if(_curPopup){
PopUpManager.centerPopUp(_curPopup);
}
}
[/AS]
ここで、_curPopupは先の作成時の処理を
[AS]
private var _curPopup:IFlexDisplayObject = null;
private function createDialog():void{
_curPopup = PopupManager.createPoopup([親画面],[Dialogのクラス],true);
PopupManager.centerPopup(_curPopup);
}
[/AS]
のように変えておけばよい。
また、画面の更新時の処理はMXMLであれば、
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" updateComplete="updateEnd()" >
のように、updateCompleteのプロパティ(イベント)を使うのが楽だ。
ちなみに、このイベントは正確にはmx.events.FlexEvent.UPDATE_COMPLETEになるので、AS内であればこのイベントで処理をする。
ArrayCollectionはある条件にしたがって値を絞り込む事ができる。
このとき、オリジナルのデータを削除したりしないので、フィルタを解除したり、条件を変えればまた表示することができる。
したがって、DataGridなどのdataProviderとしてArrayCollectionを使っているときにはとても重宝する機能だろう。
さて、フィルタの設定方法は
[AS]
private function filterSample(item:Object):Boolean{
if(itemデータから表示する場合){
return true;
}
else{
return false;
}
}
private function init():void{
arrayCollection.filter = filterSample;
arrayCollection.refresh();
}
[/AS]
とすればよい。
ただし、使うときや、filterの条件などを変更する場合には、
変更後に、
[AS]
arrayCollection.refresh();
[/AS]
を実行しないといけない。
また、フィルタを使ったときにちょっと気をつけなければいけないのが、データの数(length)だろう。
[AS]
arrayCollection.length
[/AS]
は、フィルタで絞り込まれたデータの数だ。
したがって、この場合のデータ全件は
[AS]
arrayColleciton.source.length
[/AS]
で取得が可能だ。



