2008年12月29日月曜日

AdobeAIRで処理が全て完了してからアプリを終了する

AdobeAIR(Flex3+ActionScript3)で作成しているアプリASlimTimerで大改修(?)をしていました。

AdobeAIRで作成すると、サーバとのアクセス処理(URLLoader)は非同期で実行されるので処理中に画面をポチッと終了...ってされると、中途半端な所で終わっちゃったりします。
ASlimTimerはSlimTimerのサービスを使っているのですが、最近SlimTimerのアクセスが凄く重かったりもして、余計にマズい状態になりやすくなってたりして。。

そこで、今までは オンライン状態だったら
”SlimTimerのサービスにアクセスする”とだけしていた処理を、
  1. ローカルDBに保存する
  2. SlimTimerのサービスにアクセスする
  3. サービスから正常完了のレスポンスがあった場合にはDBから情報を削除する
という処理に変更し、さらにSlimTimerのサービスのアクセスを同期処理で順次行なって行くようにしてみました。
これによって、SlimTimerのサービスが落ちていた対策とともに、サービスが重かったら待機中に更新を溜め込み、集約できる更新は一つに集約するという仕組みになっています。

どこかのサービスのAPIを使ったマッシュアップものを作る場合には、最初からこぅいぅ観点は必要だったんでしょうねぇ。。。勉強になったわ。

そして、「アプリ終了時にはそれらの処理が完了するまで待ちたい!」ので、ちょっと調べる。

AdobeAIRのメイン画面 WindowedApplication の closing というイベントを使ってできるみたいです。

たとえば、画面の終了をキャンセルさせたい(閉じさせたくない!)場合には、
mxmlの方では、
<mx:WindowedApplication closing="onWindowClosing(event)"

ActionScriptの方では
private function onWindowClosing(event:Event):void {
event.preventDefault();
}

と書くといける(=画面が閉じない) みたい。
preventDefaultというのは、Swingでいう、AWTEvent#consumeと一緒って感じかなぁ。

じゃー終了時に、処理が完了しているかチェックして、
完了していなかったら一定時間待ってから再度チェックして、
完了したと同時に終了させる
という事をさせたい場合には、
private function onWindowClosing(event:Event):void {
event.preventDefault();
var intervalId:uint = setInterval(function():void {
if (!isExecuting()) { //これは自分で実装したチェックの関数
//処理が完了
clearInterval(intervalId); //Intervalをクリア
stage.nativeWindow.close(); //画面を閉じる
}
}, 200); //200ミリ秒毎
}
という感じでできそうです。
setIntervalというのは、flash.utilsのパブリック関数として定義されているものです。
setInterval(closure:Function, delay:Number, ... arguments):uint
ミリ秒単位で指定した間隔ごとに関数を実行します。


WindowedApplicationのクラスの場合、import flash.utils.setInterval; というのは書かなくてもコンパイルが通りますが、これは多分WindowedApplicationのクラスの方でimportされているんでしょうね。
# こぅいぅ所はちょっと分かりにくくなっちゃうから、私的には嫌な所なんですが。

stage.nativeWindow.close(); というのは画面を終了する処理になっています。
stageというのはWindowedApplicationから参照できるプロパティです。stageというのは、以前からFlashをバリバリ使っている方にはおなじみのもののようなのですが、私のように初心者の方はクラスを俯瞰してみた記事画面遷移についてで少し記述しているので、よければどうぞ。

....と思いきや、setIntervalのASDoc見てみると、もぅ推奨されていないみたいですね。flash.utils.Timer を使えと。さよですか。
では、書き直し。
private function onWindowClosing(event:Event):void {
event.preventDefault();
var timer:Timer = new Timer(200, 0);
timer.addEventListener(TimerEvent.TIMER, function(event:TimerEvent):void {
if (!isExecuting()) {
timer.stop();
stage.nativeWindow.close();
}
});
timer.start();
}

こんな感じ。たぶん。
• • •

2008年12月21日日曜日

EffectiveJava第2版を読んだ

EffectiveJava第2版を今読み終えました。
始めは旦那が読み終わったら借りようと思っていたんですが、私も買ってしまいました。...ということで、この本は、我が家に2冊もあったりします(笑)
我が家に2冊も買わせた本はこれで2つ目。

読んだ感想ですが...あー私ってばあまり使う人のことを考えずにコーディングしてたなぁってのが一番かなぁ。
「要求通りに動くもの」というのを作るのはまぁ当たり前ですが、そこから「自分以外の人にも使いやすくする事」というのはこんなに丁寧に考えて作るもんなんだなぁ....と。

私も仕事上で製品開発を一応していたので、「使う人の事を考えて拡張しやすいように」というのは、まぁ普通に考えて作った所はあるんですが、使う為の前提が多かったり...動かしてみないと分からなかったり...リリース後に発生した”これも拡張できるように”という要望を満たすため委譲クラスをポコポコ作るハメになったり...提供インターフェースで提供してなかったので実装クラスを継承してもらうしかなかったり...と色々ありました。

他の人に使ってもらうようなライブラリのクラス構成を考えるのはホント難しいです。

どれだけ やって欲しくない事を 実行時エラーでなく、コンパイルエラーで出せるようにするか...というのが重要だし、その方法/手段というのはアイデア(?)次第で出来る事も多い。
ただ、その方法を自分で始めから探るのは時間もかかるしミスも多い。ましてや仕事上の限られた時間ではそんな時間もとれない。
そこでこぅいぅ本の情報が凄く役に立つんだと思う。私のような低速な脳みそでは特に(笑)
この情報を生かして実践していくのは、もしかしたら何も考える前よりも時間がかかる作業があるかもしれない。人に使ってもらいやすくするというのは時間がかかる作業だし。
でも、こぅいぅ方法を教えてもらった事に感謝しつつ、変なコードを後々の人に残さないようにして行く事が自分の為にも、業界全体にとっても必要なんだ!と感じなくてはなぁ。
なんて思います。

でも、J2SE5になってからenumやアノテーションが使えるようになって楽になった部分が凄くありますよね。
まぁ、私の仕事上では互換性を保つためにそれらを使ってガラっと替える事はできなくて涙流した所は多いですけども(ぐすっ)

コノ本では、オススメしない内容とその理由、代替案...というカンジで書いてあるので、納得もしやすくていいです。使うのが適切な場面というのも明確になりますし。
(でもたまに文面が難しいので大変。。お布団に入ってから見るのはツライ。)

本を読んでから、自分のコードを振り返ると、「あーあそこのコード、まずいよな。直したい」と思いましたぁ。多分読んだ人の殆どが感じたりするんじゃないかなぁ?ということで、Javaをある程度書いてみたって人には超オススメ本。
逆に、Javaをこれから学んでみたいんだけど...方にはオススメしません。

これからはトイレに一冊置いて、復習しますー。

(トイレでゆっくりする時間も大切なのよっ!特に女性は...)

• • •

2008年12月19日金曜日

第?回 千秋楽

現会社の最終出勤日が今日でした。
夜に忘年会&送別会をして家に帰ってきました。

ふと振り返ると、9年目に突入していた現会社の勤務。
結構長くお世話になりました。こんなに長くは考えていなかったんですが(笑)


『起』
入社したての頃は、Java初心者であり...製品開発を作成はじめる所であり...新しい事いっぱいでした。新規開発ってやっぱり楽しいですしねー♪
開発初心者の私に周りの人はとってもイライラしたと思いますが、いやはや、ご迷惑おかけしたと思います。


『承』
しかし、旦那とたった2人だけで東京支社が始まって他の皆さんと接する機会がなくなり寂しい時期がやてきました。
あーだ、こーだ....ってお互い話する機会って必要だと思うんですが、開発グループのメンバーが
・大阪/東京に分かれてしまった事。
・グループ内で担当している箇所が個々人でバシっと分かれてしまっていた事。
で話する機会もなく。。

当時、"どうして東京に行ったのか?"と何人かに聞かれたのですが、会社的に「東京に事務所を作成したいが行く人は社員で...」と考えた時に私たち以外の選択肢が多分なかったからだと思います。その時の社員は役員を外すと4,5人ぐらいしかいなかったと思いますし、入社1年目ぐらいの私達が一番言いやすかったんでしょう。
でも、そういう事が他の方には伝えられてなかったようで、まるで私たちが行きたいと言ったのか?という勘違いをされていた方もいたみたい。
そんな事ないですよー!社長からは「アメリカか、東京かどっちがいい?」という選択肢しかなかったんですから。
ここは、会社側からちゃんと社員全員に相談や説明して欲しかった所でしたね。

そんな状況にて、製品についてもこぅしていこう!というグループの話し合いもなく、淡々と出て来た不具合を修正したり、火のついた案件を片付けて行くような時期が続きました。

こうなると、結果はもぅ見えているようなもんですよね。

今振り返ると、モチベーションも下がっていたな。仕事に対するというよりも、技術に対するモチベーションが。
お金を頂いている訳ですから仕事は頑張りましたよ、当然ながら。でも、それと技術に対するモチベーションってのは違う所ってありますよね。。?


『転』
”私たちマズくないか?”と感じて追いつこうとしたのが、1年と少し前ぐらい。
技術という側面というよりも、
・周りが見えていない(会社の外に出てない)
・昔よりも断然的に本を読む速度、理解速度が落ちている
ような所にヤバっ!
2年前くらいから、会社としての社員としての取り組み姿勢おかしくない?という事でメールやらでわざと動いていた部分もあったんですが、あまり変わらず....つーか、改めて見ると私自身がヤバいやん!みたいな(笑)
とうことで、途中から会社に対する働きかけはもう諦めて、転職も考慮して自分自身をなんとかしよう!ってのが今年一年でした。
あ、諦めて...というのは語弊があるかもしれないですね。何が正しいというのは難しいな...というのも感じたし、引き際というのも肝心だなとも思いまして。

それで今年は結構、怒濤な感じでしたねー。今年はじめにAmaterasのコミッターになったのを皮切りにいろんな勉強会に参加してみたり、AdobeAIRに手を出してみたり。
技術の本だけでなく、プロジェクト管理の本やら、マーケティングの本などにも手を出してみたり、LifeHackを考えてみたり。
製品開発をしていたのに、マーケティングの基礎知識もなんにもない状態だったというのは今思うと、凄い失敗だなぁー。”キャズム”って言葉も知らなかったですし(恥ずかしい)



『結』
で、今年末に現会社を退職を決め今日に至りました。来年からは、新しい会社です。
色々興味が出始めると本当に時間が足りなくて思うような今年いっぱいは迎えられなかったような感じですが、こぅやって消化不良のまま、もっとー!と進んで行ける年が重ねられたらいいなぁ〜なんて思っています。


という事で、MKIの方々大変お世話になりました。
今見ると恥ずかしいソースコードをいっぱい残してしまっているのが、いやぁ...すいません。ビシバシ直したってくださいませ(笑)

んでもって、また鍋パーティしましょーねー!
• • •

2008年12月17日水曜日

Wicketを触ってみた

Wicketをちょっとだけですが触ってみました。
それまでは、随分前に社内勉強会したのと、Wicket勉強会で聞きに行くぐらいしかしていなかったので、始めて触ってみたのと一緒。

感想としては....
サクサク書けていけるから気持ちがいいと言われているのも分かる。
でも、やっぱりHTMLテンプレートの存在が気になってしまう。

「デザインとコードを分ける=デザイナとコーダーが並行作業しやすい」という利点は多分大きいんだろうなぁーと思う。
まぁ、私はデザイナと一緒に仕事はした事がないのですが。。孫請けのような仕事ばっかりだったので。

でも、HTMLテンプレートがあるからサクサク感が損なわれる所もあるよね。
(と思ってしまうのは、私がSwingの開発の方が慣れているからかも)

だからといって、HTMLにはdivタグひとつ置いてコードから全部レイアウトしていくのは、デザイナとコーダーが並行作業という場合にはNGだろうし。

まぁ、ここの所は使う人次第って所なんでしょうが、 GWTよりもWicketの方がHTMLでレイアウトしようねっ!って雰囲気が感じられたよぉ〜なぁ〜〜気がしました。< 無責任発言

そういえば、GWTって結構海外では使われている雰囲気がしますよね。日本で感じるよりももっとのびてくるのかもしれないなぁ。ずっと前にサンプル触ったぐらいだったので、また改めていないとな。そうそう、GWT触ったメモの所のサーバが12月末で契約をキルのでこのドキュメントもなんとかせねば。

Wicketに話は戻って。。
Wicketが大規模案件に採用された場合...個人の属人性をなくすために、やっぱり、こぅいぅ時はPropertyModelを使わないといけない。とか、AbstractReadOnlyModelは使わない事。とかコーディングの決め事が多くなったりするんだろうか。
そんな開発だとちょっとWicketの良さも半減しちゃぃそうですね。

さて、いくつか引っかかった所をメモ。

Wicketを実行すると
java.lang.AbstractMethodError: org.slf4j.impl.Log4jLoggerAdapter.isTraceEnabled()Z
at org.apache.wicket.util.thread.Task$1.run(Task.java:107)
at java.lang.Thread.run(Thread.java:613)
のエラーがコンソールに表示されるっつー問題。

この原因は、org.slf4jのversionで、古いものを使っていたため....でした。
<dependency>
    <groupId><org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.4.2</version>
</dependency>
が正解。

教訓:Wicketが用意してくれている、mvn archetype:create でプロジェクトは作ろうね。手元にあるコードをコピってバージョンだけ変えたりしないように(笑)


<wicket:link>で、パッケージが違うものは設定できない?!
aqubi.samples.wicket.page.LabelPage.html
aqubi.samples.wicket.page.extension.ModalWindowPage.html
と、同一パッケージでないページをwicket:linkを使って表示させようと思い、
    <wicket:link>
        <a href="LabelPage.html">Label</a>
        <a href="extension/ModalWindowPage.html">ModalWindow</a>
    </wicket:link>
なぁ〜んてしてみたけどダメ。

ですが、実は1.4-M3から出来るようになっているらしい!!1.3.5で試していたからなぁ〜〜

1.4-rcでやってみたら無事に動いた。
ちなみにフルパスを書いてあげれば、このリンクの部分は使い回しできましたよ。
    <wicket:link>
        <a href="/aqubi/samples/wicket/page/LabelPage.html">Label</a>
        <a href="/aqubi/samples/wicket/page/extension/ModalWindowPage.html">ModalWindow</a>
    </wicket:link>
...とこんな感じ。

教訓:そりゃ最新バージョンの方が機能が増えたりバグが減っているわ。試してみるぐらいなら最新の方がハマるような場面が少ない(...事もある)


触ってみたコードは前のエントリーで書いたGitHubで登録してみました。
単純にコンポーネント並べただけのようなものなので、全くもって体したものではございませんが,public公開にしているのでよければ、
http://github.com/aqubi/wicket-sampleどうぞっ!

...他の人が上手くこのリポジトリから取得できるのかどうかはまだ分からず。
もし取得してみた方がいらしたら、どうだったか情報を教えてもらえると嬉しいです!
• • •

2008年12月16日火曜日

Spark67 EdgeActionScriptLibraries

Spark67 EdgeActionScriptLibrariesというイベントに行って来ました!

内容はSpark ProjectThreadLibraaryと、AIR SAMPOとiPhoneASの紹介でした。

ThreadLibraryは、提供されているThreadというクラスを継承して自分のThreadクラスを作成。
start() を実行すると処理開始。
join() をすると処理が終了するまで待機。
next(function) で次の処理を指定。
...と書いていけるというもの。
エラーが発生した場合には、
error({エラーのクラス}, {callback関数})
みたいなメソッドを書けば...という話だったんですが、どーしても私はこれがひっかかりまして。。。
だって見えたコードには、
join();
next(function);
error({エラーのクラス}, {callback関数})
のような順番で書かれていて....ということは、このタイミングでaddErrorListenerしてる訳はないしなぁ...って思って。(見間違いだったのかしら。。)

あとこのerrorのメソッドのスコープはどれなんだろう?実行メソッド内?実行クラス内全部?とか。

そこで想像したのは、このThread開始時に、主要なエラーListenerはLoaderなどに勝手に追加されていて、発生したエラーのものはStackされつつ実行されている。そして処理が全て完了した時にerrorで指定した該当エラークラスを返してくれるのかなぁ?なんて思って。

それで、質問させてもらいました。「エラーは内部ではStackされていっているのか?」と。
そうしたら返答は「エラーは親へと伝播していって、最後の親のエラーが保存される。try catchを想像してもらったら分かりやすいと思う」という話。
んー私には疑問の解決はできなかったのですが、時間も差し迫っているようだったので、「例えば、2つのImageLoaderの処理を動かして、両方ともエラーが発生した場合はどちらのエラーが?」という質問にしたら、「前に動かしたエラーの方」と答えて頂きました。

んー、なんかしっくり理解はいってなかったので、家かえってThread.asのコードをさっと眺めてみました。
コードをみると....
  • errorというメソッドの中では、結局はaddErrorHandlerというメソッドが呼ばれていること。
  • addErrorHandlerというメソッドの中では、対象エラークラスの名前をKeyにErrorHandlerが作られていること。
  • Thread.asにエラーオブジェクトを格納する変数が private var _error:Object;となっていること。
  • エラーはtry-catch(e:Object)で取得していること
  • Threadの子クラスであるURLLoaderThreadではioErrorHandlerでエラーチャッチした際、最後にthrow new IOError(e.text);をしていること

これでなんとなく理解。質問の仕方も悪かったよね、すいません。
エラーについてそこそこ発生しやすいとか、処理は全部実行するけど、エラーは全部しっかり対策せねばあかん!ゆーときにはこぅいぅライブラリよりも、Threadに親子関係持たせないシンプルなもので分かりやすく処理するようなものを選んだ方がいいんでしょうね。
使う人も分けワカンナくなっちゃうだろうし。

私も同期的にタスクを動かすようなExecutorをAIRアプリ内部で作ってたりしたんですが(簡単なもの)、エラー処理がイマイチで修正せねばあかんのよねぇ〜

そうそう、ソース見せてもらいましたが、ASDocも細かく書いてあるし、コード内のコメントも凄く多い!凄いなぁ〜〜 見習わなければいけません!



iPhoneASはiPhoneアプリをASで書けちゃうライブラリ。
マルチタップや加速度センサーについてもあれこれ触れるみたいなので、なんか楽しそうです。
とはいえ、まずは通信する環境の用意が必要。
iPhoneとはOSCで通信するらしいのですが、FlashではOSC(UDPプロトコル)を利用できない。
XMLSocketでの通信だったら大丈夫なので、OSCとXMLSocketのゲートウェイ的な役目をしてくれるfloscというサーバを使う。
iPhone側にはOSCemoteというアプリがAppStoreにあるので600円で購入。

これで環境が整ったので、iPhoneASを使ってコーディング!
マルチタップや加速度のイベントがaddListenerできる形になっていて、必要な情報..例えばx位置、y位置とか)を渡してくれます。
なので、環境さえ作れたらサクサクっと触れそうな感じ♪

あともうひとつデモしてくれた、WiiFitのウィーボを歩くことでGoogleMapのストリートビューを見るというもの。
なんかの記事でみた記憶がありますが、こんなにマジカでみれるとはっ!
ウィーボとはBlueToothで繋いでいるらしい。
ストリートビューはAIRのHTMLLoaderで見てみたら見れたし、jsもcallできたし...ということでHTMLを読み込むことで表示しているらしい。
んで、StreetViewというライブラリを使ってコーディングっ!



さて、今回のイベントは有料イベント。3,200円。
先日もこの67(ロクナナ)のイベントに行って来たんだけど、正直有料ではもぅいかないなぁという感。
内容が...というよりも、時間と3,200円のお金とを考えると、技術的な事であればソースコード呼んだ方が早いし試す時間もできるしね。
オーガナイザーの大重さんは、「参加者がついて行ってないんじゃないか?」という心配していてまぁそれはあると思うんだけど、逆に、「物足りい人がいるんじゃないか?」という心配はないんかなぁ??
そういう人のために、もっと突っ込んだ質問してみてもいいんじゃないの?と思いました。
それはついて行けない人がいなくてもしょうがないという感じで。そうでないと、それなりに知っている人はお金払ってまでいくような気分にはなれないんじゃないかなぁ?

あと、CSSNiteビギナーズの時と比べると主催者側のやる気がイマイチ感じられない気もして。
比べちゃ悪いんですが、始めていった有料のイベントがCSSNiteビギナーズだったもので。
CSSNiteビギナーズは開催前には、気になっている質問したいアンケートを取ってその内容を講演者に質問してみたり、連動書籍としてイベントに向けた本を作成して発売前に配布したり、開催前にその本のPDFを事前勉強用に配布してくれたり、開催後もアンケートの集計結果を流してくれたり、フォローアップメールがあったり...とさすが有料イベントだなぁーと関心しちゃったんですよね。

さて、これで私の有給期間を使ってのセミナー参加は終わりです。。
来年再就職したら、土日のイベントがメインになるだろうなー。
• • •

2008年12月15日月曜日

お茶の水まで散歩

今日はなんか疲れていて遅くに目覚め。
でもなんにも動かないのも体によくないので、小川町、お茶の水の方まで散歩してきました。
外に出てみると思った以上に寒くて、折れそうになった心を必死に抑えつつ(笑)

このアプリはiTrailというiPhone用のアプリです。
通った道を記録してくれるので、散歩する時にはこれを使ってます。....旦那が。
あとは、途中で写した写真が経路上に載ってくれると嬉しいんですがね〜

途中で通った東京ガーデンパレスというホテルで、1月1日〜1月4日までランチバイキング 大人2,500円でやっているそうです。
お正月にはゆっくりいってみようかなぁー。
• • •

2008年12月14日日曜日

鍋パーティー

昨日、会社の同僚&その相方を呼んで8人で鍋パーティをしました。
場所は我が家。どうやら8人は全然OKっぽいです。机さえなんとかすれば10人いけるかも?!

勝手に冷蔵庫を空けて氷やビールとってきたり、ご飯ジャーから雑炊用のご飯持って来たりと、自分の家のように好き勝手やってもらえて助かりました。我が家にはそぅいぅ人が向いています♪

こういう自宅イベントは何回かやっているんですが、大好きです。
飲みの席というのは好きな方なんですが、なんせ私はお酒が飲めなくて食べる専門なんですが、お店を選ぶのって難しい。
でも自宅の場合は飲む人は勝手に飲み、食べる人はどんどん食って...って感じで自分が好きな様にできるので嬉しい。
時間を気にせず色んなおしゃべりできるし、普段では考えられない量の食料調達も楽しい。
んでもって、外食に比べて値段は半分以下ぐらいにはなります。

最後は本寝しちゃった人がいたりとグダグダでしたが楽しかったです。
今の会社は今年いっぱいで終わりなのですが、こういう楽しい会はまたやりたいなぁ。

そうそう、引越祝いでクリスマスツリーを貰いました!こぅいぅ手みやげってなんか大人っぽいですよねっ
• • •

2008年12月9日火曜日

Flex3.2+MacOSXでTextAreaにコピペで文字を貼付けると改行が入らない

Flex3.2(AIR1.5) + MacOSXでTextAreaにクリップボード経由でコピペで文字を貼付けると改行が入らないみたいで、悩んでます。

Flex3.2を使いMacOSXにてテキストエディタで改行を含んだ文字をコピー。
mx:TextArea上でペーストすると、見た目上は改行が入って貼付けされる。
でも、TextArea#textの文字列を見てみると、改行文字自体が入っていない。

現象としては、Flex3.2から発生していて、Windowsでは発生しないみたい。

・TextAreaの見た目上は改行されているが、TextArea#textの文字列には改行がない。
・Flex3.1(AIR1.0)であれば問題なし(=TextArea#textの文字列には改行が入っている)
・WindowsXPでは、問題なし
・コピペでなく、TextArea上でEnterキーで改行入れると問題なし
・テキストエディタからドラッグ&ドロップでコピーすると問題なし

改行文字が入っていない...というのは以下で試しました。

TextAreaにて "a" + 改行 + "b" をクリップボード経由で貼付けして、
var value:String = textArea.text;
for (var i:int = 0; i < value.length; i++) {
   trace(i + ":" + value.charCodeAt(i));
}
って感じで文字コードをみると、結果は
0:97
1:98
ってなります。

問題ないパターンの時には
0:97
1:13
2:98
と、13(CR)が含まれているんですけども。。

テキストエディタをCotEditorを使って、改行コードを CR, LF, CR+LF で試してみても現象は同じ。

TextAreaの見た目上では改行が入っているので、DELETEキーで改行部分を削除してみると、見た目上は改行が消える動きをする。
んー、ということは、TextArea#textのメソッドで何かやってるんやろうか。

これが解決できないと、文字列を改行で区切って文字列操作することが出来ないっ 困った。
...ということで、まだハマり中。何かご存知の方いらしたら教えてください。。
• • •

2008年12月8日月曜日

上野公園までお散歩



今日は天気もとても良かったので、上野公園まで散歩してきました。
経路はこんな感じ。

iPhoneを使い始めてから、散歩がとても楽しくなりました。
GoogleMap+GPSで迷子にもならないし、こぅいぅ経路を残してくれるアプリもあるんですね。

上野公園は始めて行ったのですが、鳥が凄い多い! 見てるだけで楽しくなりますねぇ〜
銀杏はちょうど季節だったので、黄色い絨毯が綺麗でした。あと、ぎんなん臭いにおいとwww
不忍池には枯れた草?木?がいっぱい生えてましたが、あれは蓮なのかな。あんな大量の蓮の花が咲いたらさぞかし圧巻でしょうねぇ。今度はぜひその季節に行ってみたいです。
• • •

2008年12月5日金曜日

頭で認識する前に反射的に体が動くということ

小学校の頃、そろばん塾に通っていました。

そろばんの腕前はお世辞にも良くなかった。正直、中の下くらいだったと思う。
周りのみんなが通い始めたから私も!という感じで通い始めたので、経験数もそんなに多くない。
でもなぜか、読み上げ算というのは得意だった。
そろばんなんてしない若い人には読み上げ算というのは分からないかもしれないですね。
読み上げ算というのは、先生が問題を読み上げて行って、最後に "ねがいましてはっ!"といったら計算が出来た人から手をあげるっていうもの。
そんな読み上げ算だけは、一番に手を挙げる事が凄く多い。

その原因は自分でも当時は良くわからなかったんですけども、先生が「aqubiさんは凄いねー」と言った一言、「どうしてaqubiが早いんだ?」という無言の目線を感じた途端、意識してしまって早く手が上げれなくなりました。

手を挙げるのが早かった理由というのは、そろばんが早いんじゃーなくて、"ねがいましてはっ!"というタイミングをチャッチして手を挙げるまでの速度が早かっただけだったんですよね。

意識する前は、何も考えずに反射的に手を挙げていたんですが、意識し始めてからは、頭で終わりだと認識してから手を挙げるようになってしまったため遅くなったんです。
そう分かってからは、常に意識するようになってしまって、もうそんなに早くは出来なくなってしまったんですよね。

これと似てるんかなぁ?って思う事はその後も多々ありました。

例えば。。。
部活でやってたブラスバンドの練習の時。
もう凄く眠くってウトウト状態だったんですよ。しかもパートが、パーカッション(打楽器)なので、出番がなかなか来ない。
ウトウト...ウトウト...はっ!と気づいた時には私の出番の所は過ぎ去っている事があったんですが、周りに聞いてみるとしっかり叩いてたっていうんですよね。寝てたはずなのに。

スロットを打っている時。
昔の4号機の時代では、ビタ押しすることによってメリットが出るような機種ってあったんですよ。
メリットは、メダルの獲得枚数が増える、演出が変わるなど色々ですが。
普通に何も考えずにバシバシ打っている時には、それなりにビタで来ていても、「ここでビタしないと!」と意識して構えてしまうとなかなか出来なくなっちゃぅ。
8回連続ビタが必要な場面なんて、もぅダメ。プレッシャーにも負けてww
でも、ある時これまでにないくらいビタが成功した時があったんですが、それもまた眠くてぼーっと打ってる時だったんですよね。
うーん、これはプレッシャーってやつだけかもしれないけど。

信号待ちをしている時。
青になったら歩き出すんですが、これも周りの人と比べて歩き始めるタイミングが早いのに気づいてしまった途端、意識してしまい今はみんなと普通のタイミングに。

プログラムを書いている時。
Sysまでうつと、勝手に System.out.println まで打っちゃう。

頭で考える前に体が反応するという事は、何度も経験してから身に付く事で、凄く早く処理が出来る状態。
今思うと、そろばん塾の周りの人の方がもっと多く経験しているはずなのですが、私の方が早かったという事は、人によってその状態になる回数、期間は違うという事もあるのかもしれない。

頭で認識したと感じる時は、目で見た事を頭で認識/理解して記憶するという経路を辿ってるんかなって思いますが、経験が多いと理解や記憶の部分を所をすっとばすことによって体の処理速度が上がるような感じ。

でも意識すると、その"すっとばし"ができないんですよね。多分。

人間って不思議だなぁ。上手く出来てるなぁ。というお話でした。
• • •

2008年12月4日木曜日

MacOSXにGit,GitHub,JGitをインストール

MacOSXにGit,JGitをインストールして、GitHubを使ってみました。
特にJGit...イマイチ良くわからず適当にやっているので、間違っているかもしれないが、一応記事でまとめてみたので、よければどーぞ。

aqubi+shin1 Git
・Gitをインストールする
・GitHubを使える状態にする
・JGitのEclipsePluginを入れる
の3部構成でっす。

wicketでサンプルアプリを作ろう!...あ、リポジトリは何処にしよう...GitHubっつーのにしてみる?Gitも使ってみたいし。

というのから始まったのですが、この寄り道でなんだか時間食っちまったよー。
• • •

2008年12月3日水曜日

SunTechDays 12/3に行って来た

SunTechDays 2008 in Tokyoに昨日に引き続き2日目に行ってきました。

ということで、本日の勝利品〜!

セッション毎に投げられるTシャツ一枚と、帰りにもらったdukeキーホルダー(LEDライト付き)と、VertialBoxという名の(多分)ティッシュ。

ずっとセッションに入っているのに、なかなかセッション毎に投げられるモノをGETできなくてですねぇ... でも本日も一つGETできて良かったです。

さて、2日目はやっぱり1日目に比べると人は少なめでしたね。
なんだか、日本のエンジニアはあんまり熱心じゃないみたいに思われちゃたんじゃないだろうか?となんとなく心配してみたり。。。
逆に言うと、海外では平日でやってもエンジニアが集まるんですかねー。海外のエンジニアの方が自分のスケジュールを自分で決めるぐらいの位置の人が多い...とか?

あと、セッション中に挙手を求める質問とかあるんですが、同時通訳を挿んでるからタイミングが客席の反応は結構遅れるんですよ。
「なんか、ぱらぱらと時間差で手が上がりましたねー」って苦笑いしている講師がいたけど、同時通訳だって事気づいてよー!
しかし、同時通訳って大変ですよね。英語と日本語って文章の出だしの単語が違うから、通訳も文の最後まで聞かないと日本語に変換しにくそうで..
しかも、セッションの時間が少なくなって講師が早口で飛ばしている場合なんて..そりゃもぉ大変でしょぅ。
あ、そういえば、普通に翻訳していた後に、"ちょっと落ち着けや.."と言う声が聞こえてプチっと一瞬翻訳が途切れた気がしたんですがww
あれは講師が言っていた翻訳だったんでしょうか? それとも翻訳者の本音?!?!
終わり頃になると、翻訳者のため息が聞こえたりもして...ちょっと笑っちゃいました。

では今回も各セッションを簡単に。

1-G-1
基調講演
予定していたMatt Thompsonがキャンセルということで、Solaris CTO の James Hughesの講演でした。内容は、Hardware,OS,Programのトレンド。
2004年〜 クロック数が横ばいで成長していないのをみて、ムーアの法則の時代が終わった?という人がいるけどそれは違う。
MultiThread,MultiCoreが進化している時代であって、ムーアの法則はまだ生き続けてる。
つまり、ThreadCount数が高くなっていく傾向がTrendであり、この先数年はこのまま成長して行くだろう。
そんな中、プログラマーはこの事を意識せずに アプリケーションを作成する=パラレル化できないようなアプリケーションを作成する のは良いはずがない。
アプリケーションで全くスケールできない というものは私が見た限りない。
...という話でした。
中で、Goldilocks Application という単語が出て来たんですが、このGoldilocksという言葉の横に3匹の熊の挿絵があって、「日本の方はこの話をご存知とお聞きしたので...」とスルーされてしまいました。皆知っているんですかねぇ?私は恥ずかしながら知らないんですが。
というので、ちょっと検索してみました。
多分本はコレ。
内容としては、Goldilocks(ゴルディロックス)の女の子が留守にしている熊の親子の家に迷い込んで、スープを飲んでみたら、お父さんのスープは、熱すぎて飲めず、お母さんのスープは、ぬるすぎて、子供のスープが丁度よく。美味しい。椅子やベットも子供のものが丁度いい。 ってものらしいです。つまり、「ちょうどいいってのがいい」って話。
どうやら、経済用語にもなっているらしく、有名なんですね。。おやまぁ。

インフレ(熱すぎる)ではなく、デフレ(冷たい)のではなく、適正(丁度いい)
ところをGloldilocks って言うらしいですよ。


2-j-1
Sun SPOTs:Toy for Geeks
Roger Meike
Sun SPOTsというのは、無線センサーデバイスです。
こういうセンサーを使って好きなものを作成するのって憧れません?私は憧れるんですよねー。自分で作成できるものがPCを抜け出せるのはいい!昔から好きなんですよ、工作がww
で、このSunSPOTsはJavaを知っていれば出来るそうで!すっごく楽しそうです。
自動車を運転するゲームをWiiみたいに端末を動かすことによって動かしたり、webcamでペットの犬を見て声かけて来てくれたら餌を与えるようなものを作ってみたり、Twitterへメッセージ投稿してみたり。
また、真面目なプロジェクトもいくつもやっているようで、塩田でダメになった土地をもとに戻すようなものも現在進行中だそうです。

サブタイトルの Toy for Geeks ってまさしくそう! んで気になって値段を見てみたら、Sun SPOT Java 開発キットベースステーション x1、ワイヤレスセンサーデバイス x2 つまり3台ついて 76,500 円 。
そうかぁ...おもちゃにしたら高いけど、買えなくもない微妙な値段www

なにはともあれ、この講演者がカッコいい! 思わず検索したけど、このRogerって人じゃないと思うんだけど。。若かったし、黒髪だったし。。
女性必見!って書こうとしたんだけど名前分からないよぉ。。ヤラレタ。


2-j-2
Lightning Talks
「Javaの世界で有名な方ばかり集まってます!」いう司会のもと始まりましたが、顔ぶれみると確かに知っている名前ばかり。
というか、JavaExpert#03に記事だしてるjava-jaの人が集まった!?
というか、それならば事前にこのメンバーの名前をセッションの予定に入れておけばいいのにー。もっと人集まっただろうに。
あ、YoshioriさんがMavenコマンドでJythonを使うプラグインを紹介されてましたよ。

2-j-3
AMD Technical Session:Achieving Better Performance For Your Java Application
AMD社の方のセッションでした。
なぜハードのメーカのAMDが?というのは、CodeAnalystというものは、そのEclipseのプラグインとかをオープンソースで提供しているからのようです。http://developer.amd.comから見れるようですよ。知らなかったですよ、存在も。

ハードの機能を最大限に引き出すソフトの開発は...って視点からの話でした。

ハードが弱い私として認識したのは、
・チューニングとか考えるんだったら、とりあえず最新のJDKを使っとけ!良く知らずにあれこれ触らない方がいい。特に、J2SE1.6以降ね
・深く知らない人がスレッドプールやキューを自作しちゃダメ。パフォーマンスに影響がでるから。
・ベンチマークの結果は、自分のアプリと関連のある内容の結果で無いと全く意味無し。
・適切なデータ構造を選択すること。Elementが固定数ならArrayとか。
・ParallelArray...JDK7より入った。基調講演の話も踏まえると使って慣れといた方が良さそう。
かな。


2-j-4
Developping Web Applications using Comet and Ajax
Cometについて...でした。私は思いっきり「コメット」と読んでますが、講師の人は 米!って感じの発音。
Cometは一番最初のトリガーはクライアントからになる。まぁ、プログラムテクニックの一つ。

クライアントからみて、非同期に勝手に動作してくれるように見えるものとしては、大きく分けて3つある。
  1. Ajax
    Ajaxで一定間隔でサーバに最新の情報をとりに行く。
    この場合のデメリットは、無駄に通信が発生してしまうこと、取得データはリアルタイムに最新にはならない。

  2. AjaxPush(Long Polling)
    一番最初のクライアントのアクセス時に非同期アクセスを行い、常にコネクションを張りっぱなしにしておく。データが更新されたらサーバからクライアントに送る。これにより、常に最新の状態になる。

  3. AjaxPush(Streaming)
    1GBなどの大量のデータをダウンロードする時には、少しずつ返す...時のパターン。
    Long Pollingと同じように常にコネクションを張りっぱなしの状態で使用。


下の2つがComet.

スケーリングできるのか?という問いには、NewIOのnon-blocking sockets.
Cometは、Tomcat/GlassFishで使える。
GrassFishでは Grizzly(グリズリー) comet Frameworkというものを使用する。

LongPollingを実装するためのベストプラクティスとしては、最初のアクセス=LongPollingを開始するアクセスは doGet で行ない、それ以降の処理は doPostで行なう。


2-j-5
Improving JavaPerformance
SunのJavaでのパフォーマンスチューニングをする時のお話でした。
JVMのオプションとして、StandardOptionの他に -X Option, -XX Optionがありますが、その中でチューニングの際に使えるものの説明でした。
ちなみに、-XX Optionは、JDK1.4の時には159個だったらしいんですが、J2SE6で410個、J2SE7では480個と、爆発的な追加が行なわれているようです。
説明中も大量のOptionが出て来て、ここに書ききれるような感じじゃないくらいww
中にはJ2SE5やJ2SE6では標準で設定されているようなものもあって、こぅいぅのを検討する前に最新のJDK使った方がまぁ安心だねって感じ。

ちょっとメモしたのを書いておきます。
(間違っていたら指摘してください〜 ちょっと自信なし)

MultiCore,MultiThreadで同じデータを扱う時に、各スレッドで同じポインタを参照していると競合して遅くなる場合がある。そこで別々のポインタにさせるのは
-XX:+UseTLAB。
Eden領域でのサイズ指定は
-XX:ResizeTLAB
-XX:TLABSize

Young領域
-XX:+UseSerialGC ... SerialCollectorを使う時。よほどでない限りこれで十分。
-XX:+UseParNewGC ... ParallelCopyCollector。並列でCopy作業してくれる。Java5以降はデフォルトで設定あり。
-XX:ParallelGCThread={n}...GCをするCPUの数。デフォルトではそのマシンのCPUの数。

Old領域
-XX:+UseParallelOldGC...ParallelCompactingCollector。Java5Update10で導入
Compactingはバラバラの位置にあるのを一つにまとめること。一つにすると、速度も早くなるし不具合も出にくくなる。でも一カ所にまとめるにはCopy作業が必要で、これはこれでコストはかかる。

-XX:+DisableExplicitGC...GCの実行を止める。


最後の方はもぅ集中力が保てなくて、メモるのを挫折。無念。
明日はいかないので、SunTechDaysは今日で終了。面白かったけど疲れたー。
普段こんなに講義を聞き続けることなんかなかったからなぁ。
• • •

2008年12月2日火曜日

SunTechDays 12/2に行って来た

SunTechDaysに行ってきました。
ほくほくの勝利品は以下。



基調講演に間に合うように会場について、dukeの時計をGET!
セッション毎に投げられるdukeのぬいぐるみとTシャツは...幸運なことにぬいぐるみをGET!
あとは、セッション終了後にくれた dukeどらやき(ほんのりとdukeの姿が焼き印されてる) と、最後のアンケートに答えて貰ったカバンです。
いやぁ〜dukeぬいぐるみ嬉しいっすっ!

喜びのあまり戦利品が先走ってしまいましたが、感想をば。

まずは来ていた人ですが...おじさま方が多かったように思います。
技術者向けのイベントにしたかったようなのですが、それだったら、そもそも平日にやる時点でズレてますよね。
私も、有給消化期間じゃなかったら行ってなかったでしょうしぃ。
おじさま方が多いイベント=開発者が少ないイベント は、女性の人も増える傾向があるような気がするんですが...今回もそこそこいたかな。30人くらいは...?

イベントの内容自体もなんか中途半端になっちゃってる感がありました。
開発者と、管理のおじさまと...両方とも分かるようなセッションにしたのか?という感じ。
難しいのは分かるけど、ちゃんと絞ってくれたほうが嬉しいんですけどもね。

さて。

まずは基調講演。
DemoShowcaseとしてJavaFXのライブコーディングや、3D眼鏡を使った3D体験、スクリーンを移動してもプロジェクターがスクリーンを追っていって常に投影してくれる(Wiiリモコンのセンサーを使ったもの)..とかがありました。
んでもって、Sun Country Manager Introductionでは、なんか出張中とかでビデオを見させられた。あらら。力入ってないのかしら?
んで、KeynoteではGosling登場。でも、あんまり元気がなかったように思うのは気のせい?
Gosは最後にねこび〜んのTシャツを貰い、emacsはSTOP!ゆーって去って行きました(笑)

各セッションの内容をかいつまんで。

1-M-1
JavaSE6 Update10 and Development
荻布 真也

JavaKernelでインストール時間の短縮を行なっている
始めのインストールはCore部分のみをDownloadして、アプリ起動。
それ以外のものはバックグラウンドでDownload/Installする。
これによって14Mが5Mになった。

DeploymentToolkit
JREの検出を行い必要に応じてインストールをしてくれる。
アプレットはブラウザプロセス内でのJVMではなく、別VMとして起動。
そのおかげで、1つのHTMLに複数のJVMを起動するようなものも作れちゃう。
アプレットをD&Dでブラウザの外に移動しても単体の画面として動作する。この状態でブラウザを落としてもOK!

組み込みJNLP
<applet>
<param name="jnlp-href"
value="my-applet.jnlp">
みたいな感じで、アプレットでJNLPのパスを書いて、詳細はJWSのJNLPファイルで記述ができる。
これらのおかげでアプレットの制限も少なくなり、Vistaの保護モードのIEでの制限の問題も解決し、JavaFXも動かせる。署名なしでもcrossdomain.xmlを公開しているWEBサービスも使える。

今後は、ビデオ/オーディオなどオーディオサポートを行なって行く。


1-J-2
Java Persistence APIs
Chuk-Munn Lee

fetchのlazyとeagerの説明と使いどころ。両方の良い所どり?のLEFT JOIN FETCHをおすすめしてた。

MERGEの話。親子だけでなく、孫、ひ孫...と続いて行くような階層構造の場合には、何処までMERGEにするかはバランスが重要。全部やろうとせず、手動でやる方が良い場合もある。

継承の話。
SINGLE_TABLE...一つのテーブルにまとめちゃう方法。Fetchも早くなるが、使わない項目では内容が空になってしまうのと、量が多いと、どでかいテーブルになっちゃう。ということで、必要に応じて使うべし。
JOINED...各テーブルに親のIDを持たせる方法。つまり正規化した方法。たくさんの継承、データがある時は処理コストがかかってしまうし、Queryが複雑になってしまうデメリットはあり。
TABLE_PER_CLASS...JPA1.0では正式対応ではない。。

EntityManagerの話。
スレッドセーフではないので、例えばServletのクラス変数としてEntityManagerを保持しておくのはダメよ。Factoryはいいけど。
doPostとかのメソッド内でEntityManagerを作成して、終わったら廃棄するべし。

Versionとロックの話。
@Versionでバージョン管理下になる。
em.lock(d1, WRITER);
em.flash();
をすれば、データは変更してなくてもバージョン番号を上げれる。
BulkUpdate...早いけど、Versionが効かない。だから、やるなら誰も触らない夜中にしな!
FashModeをCOMMITにすれば、コミットしたデータのみ取得できるよ。

SQLは値を式に埋め込まず、パラメータ化しようね。


1-J-3
Ajax and Frameworks
Joey Shen

jQuery,Dojoなどのライブラリの話。ということで省略。。(笑)


1-M-4
RIA using JavaFX
Sridhar Reddy

12/4(2日後)にリリース。
来年の春にはモバイル、来年の夏にはTVについて対応して行く予定。
デザイン系ソフトでよくある、合体、ぼかし、ミラーリング、Glow、Lightingなどの効果や動画作成時につかうKeyFrameやTimelineの説明....という事について説明が多く割かれていました。
冒頭に、デザイナーの方でも使える...とか、デザイニングソフトのように...とかって言葉が出て来たのですが、そっちの方に力を入れて行きたいって感じがひしひしと伝わってきました。


1-J-5
Social Computing using Zembly and SocialSite
Joey Shen

zemblyについての紹介でした。
このサービス、正直私は全然知らなかったです。
内容は、FaceBook,OpenSocial,Gadget,iPhoneなどのSocialApplicationを作成するための環境とホスティングサービスのようです。
WEBベースでIDEがあるようでコード補完もしてくれるらしい。
他の人のアプリをコピーして自分なりのカスタマイズをする...でみんなで開発しよー!って感じみたい。


1-J-6
NetBeans New and Cool
片貝 正紀

NetBeans6.5の新機能
・PHPサポート
・JSライブラリのデバッグ(IE,FireFox)
・DBエクスプローラー、SQLクエリ
  DBエクスプローラーのTABLEのSwingのJTable上にドラッグすると、
  JTableの列にテーブルの項目が設定され、Entityクラスが自動作成される。
・Eclipseプロジェクトインポート機能
・保存時にコンパイル、自動配備

最後におなじみの方々の写真が一同に!




さて、明日は15時くらいからいってきます〜。
• • •