スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[AIR] Techmemo -- 階層型のメモ帳アプリ作成

皆さんはブラウザのブックマークを使っているだろうか。
当然だれでも使っていると思う。

しかしながら、登録したブックマークの大半は再度アクセスすることはないのでは。とりあえず重要そうだからということでブックマークに入れておく。しかし頻繁に訪れるサイトを除き、たいていはブックマークから探すよりも検索エンジンでサイトを探したほうが手っ取り早い。ブックマークはリンク切れされている場合もあるし、深々と階層を作って分類した場合、探すのに手間がかかる。特に技術系の情報は大量になる傾向があるため、分類も厄介になる。

ただ検索エンジンの方も厄介で、うまく欲しい情報が得られない場合もある。探しに探した挙句、ようやく見つかる。このサイトを後になってから検索エンジンで探そうとしたら大変な目に遭う。確かこのワードで検索してこのサイトに行って、このリンクをたどって。。。
なのでブックマークに入れておけばいいが、これまた大量のブックマークに埋もれてしまう。

なので、貴重な情報でかつ探しにくいものは、整理した形でメモしておくのが良い。
HTML関連の情報はたいてい「とほほ」のサイトですぐに見つかるので、Googleでとほほと入れて検索して、メニューに沿って情報を探しに行く。
こういうのはメモする必要がないが、細かいものはやはり手元にあるといい。
有用なのが、コマンド系のもの。こういうのはメモに入れておくと、後で役に立つ。
それからあとで書くであろう、ソースコードの断片。出所が欲しくなればコピペしてきたやつで検索すればよし。

で、こういうメモは、単一のテキストファイルよりも、階層型のメモが便利だ。
私は、WZMemoやECONoteを使ってきたが、PCに依存するのが難点だ。別のPCではその情報が利用できない。
ではWebを使えばいいのだが、難点もある。その手のメモ帳も確かあったかもしれないし、スレッドを使った掲示板を個人用にして使うという手もある。マインドマップのWebアプリはいまいち。AJAXの速度は上がってきたとはいえ、まだまだ遅いし、そもそもいちいちブラウザ上でアクセスしてというのは面倒くさいし、オフラインで使えない。

そこで目に付けたのがAIR。
ローカルにファイルを持ちつつ、バックグラウンドでサーバと同期を取る。

ということで作ってみた。
階層構造をどう表現するかと言うと、WZMemoやEcoNoteは1ファイルの中で区切り文字を入れてやっているが、私は、

xxx.yyy.zzz

とファイル名を.で分割し、それぞれをノードとした。
例えば、

Linux.Command.vi
Linux.Command.awk
Linux.Install

とすると、

Linux - Command - vi
- awk
- Install

というかたちで階層化される。
つまり各ノードがすべて1ファイルとなる。

左側にツリー表示、右側にTextInputを置く形になる。
そしてなんらか文字が入力されたら、バックグラウンドで自動的にローカルに保存し、サーバーにファイルを転送する。削除したらローカルとサーバのファイルが削除される。ローカルはゴミ箱移動。

そして起動時にサーバとローカルの同期処理を行なう。

最初からオフラインでしか使わない場合は、最初の起動時にサーバの設定をするが、そこで出鱈目な文字を入れておけば、一度だけエラーが出て、後はオフラインとして動作する。

インストール
ダウンロードはこちらから。
ソースつきは、こちらから。

サーバ用のスクリプトは、rubyで書いている。
こちらからダウンロードし、サーバ上に配置し、実行権限を与え、.htaccessや.htpasswdを適宜編集し、また、ファイル保存先をcommon.rbの中で設定し、スクリプトを展開した場所にmemoという名で、ファイル保存先へのシンボリックリンクを作成する。

サーバを用意せず、拙サーバを使う場合は、サンプルとしてテストユーザを用意しているので、アプリの起動時に、サーバ設定画面が表示されるので、以下を設定する。
url=http://www.happiese.com/cgi-bin/techmemo/
userId=test
password=vfr4

著作権は持っていますが、ソースは公開しているので改変して構いません。ただ直したものを私宛に送ってください。


(以下、細かい話)

・同期
最初はファイル名とタイムスタンプで比較し、タイムスタンプが新しい方を正とすると考えた。そしてダウンロード、アップロード時にタイムスタンプを合わせるようにしようとした。だが、AIRではファイルにタイムスタンプを設定するメソッドは用意されていなかった。なので、ダウンロードの際はダウンロード時のタイムスタンプで書かれるしかない。
別途DBに保存するなどを考えたが、結局、名前とサイズを比較し、違っている場合に、新しい方を正とするやり方にした。別の端末で変更した場合、サーバのタイムスタンプは新しくなるので、これでおそらく大丈夫。

どちらにせよ、複数の端末で同時に更新することは考えていない。あくまでも個人用。個人が同時に複数のPCを操作する場合は、片方をオフラインモードにするなど工夫する。

・日本語の扱い
日本語の扱いだが、テキストには当然日本語は入れられる。だがノード、ファイル名の方はどうか。これも工夫して、サーバ側でURLエンコードしたファイル名を変換して保存するということにした。

・自動保存
編集と同時に自動的に保存し、アップロードする仕組みだが、ファイルへの保存は1字1句でもほとんど問題がない。しかし、サーバへ1字1字アップロードを実行するのは負荷がかかる。ということで、タイマーイベントを使い、変更されたファイルを定期的にアップロードするようにした。

・アップロード
最初マルチパートを使ったファイルアップロードを考えたが、FileやFileReferenceがクッキーなどHTTPヘッダをサポートしていないため、アップロード時にBASIC認証の情報をヘッダに付与できない。HTTPServiceではヘッダを付加できるがアップロードはできなさそう。ちなみにサーバ側はBASIC認証を使った。
そこで、中身はテキストに過ぎないので、普通にPOSTのパラメータとして、他のパラメータと一緒にHTTPServiceを使って送ることにした。そもそもファイルアップロードと言っても、HTTPのBODYにマルチパートで区切って、ファイルの内容を送っているだけなので、テキストの場合かえって普通のPOSTで送ったほうが単純で良い。

・文字コード
File.systemCharsetを使っているので、異なるOS間での共有は考えていない。ちょっとソースを変えればいいだけの話だが、文字コードがらみは結構厄介だったりする。


○以下、AIRの感想

意外と情報も多くなく、2chのスレッドも閑散としている。なので、安直に業務で、AIRで開発します、なんていうと嵌ること間違いなし。


・階層構造、ツリーへのバインド
XMLクラスが用意されているが、DOMとはかなり違う。既存のXMLを扱うにはいいかもしれないが、ゼロからXMLを構築するのは面倒。いちいちnode = "bbb"などとしないといけない。
なのでTreeのデータプロバイダには、XMLは使わず、配列が使えるので配列を使うことにした。

var root:ArrayCollection = new ArrayCollection();
var obj:Object = new Object();
obj.name = "aaa";
obj.path = "aaa";
obj.children = new ArrayCollection();
root.addItem(obj);

ノードは、Objectでよいが、そのノードが子供を持つとき、Arrayのchildren要素を持つ必要がある。

ちなみに、配列を操作するならArrayよりArrayCollectionの方がいい。ツリーにバインドするときもましになる。ノードの追加・削除は反映されるが、ノード名の変更は、どうしても反映してくれない。一度ツリーを閉じて広げる必要がある。これはJava Swingでも同じことを経験したが。

また、ツリーの扱いはFlexでも厄介で、ノードを右クリックしても選択状態にならないので、別のイベントで選択状態にするロジックを追加する必要がある。


・ノンブロッキングvsブロッキング
FLEXもそうだが、基本的にFlash系は、様々な処理が非同期で行なわれるので、同期で処理を行ないたい場合結構面倒になる。サーバへのアクセスやファイルIOは、その処理が成功したかしないか待たずに次の処理に進んでしまう。そしてその処理が終わった場合、成功・失敗に応じて、ハンドラメソッドを呼ぶ仕組みになっている。
Javaなら一部GUIイベント系を除き、同期で処理が進み、非同期でやりたい場合は別スレッドを作るというかたちになるので、この方がわかりやすい。
なので、何が非同期になるかというのは押さえておかないといけない。

最初ファイルのダウンロードの処理をループでまわしていたが、それだとダウンロードが全部終わらないうちに、起動してしまうので、全部がそろうまで、各スレッドをwaitさせるようにしたかったが、どうもうまくいかない。標準ではwaitやsleepは用意されていないので、Web上で見つけたwaitロジックを使ってみたが駄目。なので、一つ一つ終わったら、ハンドラが次を呼び出す形にした。
このとき、ファイルの書き出しメソッドは別のUtilクラスに入れていたので、引数にハンドラのFunction自体を渡してコールバックさせるようにする必要があった。ハンドラは他クラスのメソッドでも問題なく行けた。

ちなみに、ファイルの書き出しの完了のイベントは、Event.COMPLETEではなく、Event.CLOSEで、これをハンドラの引数にもっていないと呼び出しされない。

・プロキシ
プロキシ越しのアクセスをサポートする必要があるため、HTTPServiceのuseProxyをtrueにする必要があると思い、ここで嵌った。

[MessagingError message='Destination 'DefaultHTTP' either does not exist or the destination has no channels defined (and the application does not define any default channels.)'"

というエラーが出る。同様の現象は結構あるみたいだが、解決策が見当たらない。しばらくして勘違いに気づいた。そもそもFlexではこのオプションを使わなくてもブラウザ(IE)の設定でつながる。AIRにしてもそうだ。このオプションはBlazeDSを使うためのもので、AIRの通信は、IEの設定をそのまま使うので、特にこの対応をする必要がなかったのだ。

・メニュー
メニューの表示に苦労した。どこのサイトもNativeWindowを使うまでは書いているが、そのオブジェクトの取得の仕方がわからない。ビルトインオブジェクトもなにかわからない。
結局、
stage.nativeWindow.menu = rootMenu;
とすればよいことがわかった。

・変数名
ブロックが違うのに、同じメソッド内で同じ変数を宣言すると警告が出る。
Javaなら、for文が別のところで繰り返されるとき、iを再宣言するのはあること。
面倒なので、変数使いまわしか、安直にxxx2などととした。単にメソッドが長すぎたので分割すればいいだけのことだったが。

・ログ
障害があったときのため、運用時にもログを吐きたかったが、traceでは、デバッグ用のFlash Playerを使わないといけない。このやり方はナンセンスなので、Loggerを使うのが妥当だろう。面倒なので調べていないし実装もしていない。


○現状の課題
・十分異常系に対応しているとは言えない。
・ノードの移動ができない。これは確実に欲しい機能。
・子があるノード名の変更
・ノード名変更時に即ツリーに反映
・オフラインで最初から起動する
・クラス分割や命名、共通化、不要な記述などリファクタリングの余地あり。
・ノード追加時の空白のトリムをしていない。空白のファイルも作られる。
・alreadyExistsメソッドが逆の意味

すぐ直せるのもあるが、ビルドしairにするのが面倒なのでもう作業はしない。
学割のおかげで、Flex Builder 3を無償で入手できたのはよかったが、何しろやたらとリソースを食う。我が非力レガシーマシンでは結構きつい。昔はコレでもeclipseで普通に開発できたのだが。

なので、しばしばBuilderは使わず、エディタで編集して、SDKでコマンドラインでビルドしたりした。eclipseベースだが、最新のeclipseほどリファクタリングやソース補助が充実していないので実はこれでもよかったりする。
ただどちらにしてもビルドの時間はかかりすぎ。

デルのPCが安売りしていたのに、迷っている間に期限を過ぎてしまい、買い逃してしまった。今買うと高いので、悔しくてなかなか手が出ない。

ということで、これ以上は直さないので、誰か直してください。
スポンサーサイト

テーマ : ソフトウェア開発
ジャンル : コンピュータ

オールインFX再び

一年前の4月頭に、オールインFXについてブログを書いた。
オールインFX

300以上の拍手を頂き、アクセス数では、私のブログの検索キーワードの大半を占めている。Googleで検索すると、このブログが一番に表示されることもしばしば。
以前は、オールイン自身のサイトが表示されたが、オールイン自体がFXを表に出さなくなったせいで、私のブログが注目されるようになってしまった。

といっても、それ以後関わりを持っていず、いつマスコミに出るかと待ちに待っていたのだがなかなか表に出ず、北海道の金融庁が勧告した程度にとどまったままだった。オールインも表はよくわからない、ショッピングモールなどでカモフラージュして、本業であるFXについてはアンダーグラウンドに潜らせてしまい、公式には募集していなかったので、表沙汰にはならなかった。なので待ちくたびれて、私としては関心を失ってしまった。

勧誘が公にされていないにもかかわらず、検索キーワードで、最近でも月600以上ものアクセスがあるのが不思議だった。

どうもようやく、世の中にもその問題が注目されてきたようで、昨年からお金を引き出せない、遅延しているということで被害者が出たしたそうだ。システム連動が遅れて引き出せないという理由で時間稼ぎをしているようで。
こうなることは最初からわかっていたことではあるが。

ちなみに、月利20%の運用益があるなら、1000万投じて、71ヶ月(6年)で4兆を超え、ビルゲイツと肩を並べることができるわけだ。まあ、ゲイツの資産をすべてFXに投入したら為替相場はえらいことになるが。(逆にゲイツも短期間で世界一になったのだからそのレバレッジは驚異的だが)。
そこまで行かなくても、会員から金を集めずに、十分社会貢献できる費用はたまるわけだから、それからやりゃいいんじゃない、森さん。


まあ、しかし、いよいよか、と思う。

オールインのサイトは様変わりしてしまったが、元のを全部ダウンロードしていたので、貴重な資料が残った。残念ながらpdfの資料は、ただのallin.jpだったために、クローラが取り込んでいなかった。この辺はちゃんとチェックしておくべきだった。
一方、幼稚なG.T.IPOINTについては、そのままだ。

自転車操業を続けている以上、いずれ問題が発覚するのは時間の問題だったことぐらいは、詐欺師たちもわかっているだろう。マルチを最初にやった人間はそれがずっと続くと考えただろうが、後でやった人間はどこかで破綻することぐらいわかっていただろう。円天の連中は、妄想に取り付かれていたからずっと続けられると考えていたかもしれないが。
闇の中で巧妙に逃げ回る振込み詐欺師たちと違って、オールインの連中は名前を堂々と出している。
彼らはどうやって出口を見つけるのだろうか。

運用失敗と見せかけ元本割のリスクはあったものとして会員に責任なすりつけ、海外での運用ということで捜査もしにくくし、そしてまだ整っていない電子マネーの法制度の穴、こういった状況が予想されるが、どうやって被害者・マスコミ・警察は追及していくのか、成注といきたい。

プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。