Cloud 系OS まとめ
youOS http://www.youos.com/
MIT卒業生4人が作ったウェブOS。2006年の時点で既に登場していたが現在は終了している様子。2006年でこの思想を形にしているという事に驚く。このアプリの登場がウェブOS開発のスタートなんだろうか。
eyeOS http://eyeos.org/index.php?p=whatiseyeos_tryitnow
バージョンとして stable の 1.x と、beta の 2.0 が存在する。1.x の方はyouOSと類似していてデスクトップと同様な形をまねている。2.x の方はウェブOSとして新しい形を表現しようとしたのか、iGoogleのようなブロック単位のドラッグアンドドロップの移動がベースになっている。とても完成度が高い。
youtube http://www.youtube.com/watch?v=G7KEVAyMDkE&feature=fvst
iCloud http://os.icloud.com/
最近知ったOSで、こちらの完成度もとても高い。デザイン性の高さを売りにしているだけあって、個々のアプリの作りこみも相当なもの。ロードやアプリが重いのが欠点だが、とても可能性を感じるOS。
Pip.io http://pip.io/
ウェブOSというか、ソーシャルをOSの上に乗せてみた感じのもの。ソーシャルを中心に人々の行動が行われるという事で作ったのか。とても興味深い。デザインも良い。
その他の関連サービス
CorneliOs http://www.cornelios.org/
G.ho.st http://g.ho.st/
Xcerion http://www.xcerion.com/
Jolicloud http://www.jolicloud.com/
Tonido http://www.tonido.com
KIDO'Z http://kidoz.net/
Cloudo http://www.cloudo.com/
jooce http://jooce.com/
Craythur http://www.craythur.com/
画像つくってる
VMwareのNAT接続も出来たので、外で開発したりも出来るようになった。
NAT接続の方法は後でメモがてらアップしておこう。既に忘れてるという噂が脳内を全力疾走しておるがね。
デザイン期間という事で色々ペタペタしてるけど、結構画像作れるもんだな。
天気パーツの天候画像とか、スマートフォンっぽい画像がほしくて自分で作ってみたけど結構作れちゃうもんだな。ネットに感謝だ。
結構それっぽくなってるような・・・・ん、いんじゃないかな!
左が 晴れ時々曇り で、右がとりあえず雨っぽい感じを試してみたやつで・・・
んー、水滴の感じがもっとうまく出せればな。量を増やせばいいのかな?色々やるしかないか。
でも、、背景黒じゃないんだよねー・・・雰囲気変わっちゃうかな・・・
とりあえず明後日までに天気パーツをかたずけて、finderのデザインをやらないと。
あ、あと動画作りの調査とかしないと。youtubeに高画質でアップする方法とか、多分アップしてテストしまくらないとダメかな。。
やばいーっ。やばいー。
肩いたいー
ねる
新しいノートを購入したので、開発環境を移動させた(開発環境=VMware)。
持ち運ぼうと思ったらホストから仮想環境への直接アクセスができない。んん?
ブリッジ接続してるから当然か。これはNATにしてやればいいのかな?あれこれ悩んでると開発時間が削られそうだ、週末にやってみよう。
なんだか本当に自分用メモになってきた・・
とりあえず、いま開発中のものは今月いっぱいでプログラム的なものは一旦切り上げて、来月からはデザインや画像作成に入りたい。というか入らないと多分間に合わない。機能とか全然足りてないけど。。
予定をメモしておこう。
5月 : 機能開発の一旦終了
6月 : 画像・デザインの対応
7月 : レンタルサーバ確保と構築
8月 : 動画作る
9月 : 微修正?
10月〜 機能開発再開
いや、やばいな。
レンタルサーバ確保と構築がハマりそう。見積もれない。。
いざとなったら会社の人を雇うか。とりあえず、、有給使おう。
もっと技術力がほしいな。特にサーバ周りだな。
環境構築をサクサクできるくらいには早くなろう。な?自分。
もう一人自分がほしい。
そしてぶん殴りたい。
タイムスタンプの管理について
タイムスタンプ
通常テーブルにはシステム領域として、作成日、更新日、作成者、更新者、論理削除フラグ、あたりを保有するかと思う。MySQL は 時間を扱う型に TIMESTAMP 型を持っていて、時間をこちらで入れる必要がなく、勝手に更新してくれる。なので初めて MySQL をやる人は結構頭を傾げるんじゃないだろうか。しかも、更新してくれるのは、テーブルの中で初めて出てくる TIMESTAMP 型のカラムだけ。何だそれは。。
つまり INS_YMD, UPD_YMD の並びで TIMESTAMP を定義したら、更新の度に INS_YMD が勝手に書き変わる。だから UPD_YMD, INS_YMD の並びにして定義するのが方法の1つらしい。
UNIX_TIMESTAMP
そもそも UNIX のタイムスタンプで管理した方が楽なのかもしれない。と思って調べたら。いい情報を見つけた。
MySQLで DATETIME型のデータを高速に検索する方法
つまり UNIX_TIMESTAMP を利用する事で、DATETIME型より3倍〜4倍高速化をする事が出来るらしい。デメリットとしては人が直感的に理解しづらい事。おkおk、そんなのいいです。
表示の場合
UNIX_TIMESTAMP() で insert したデータを実際に表示する時のフォーマット化は、FROM_UNIXTIME() を利用する。日付フォーマットは MySQL リファレンス を参照。
例) FROM_UNIXTIME( UPD_YMD, '%Y/%m/%d %H:%i:%s')
※ UPD_YMD に UNIX_TIMESTAMP が入っているとする
システム領域を必要しないであろうテーブルにも、考えなしで付けたりしてるけど、個人的には要らないなら付けたくない。やっぱり付けとくのがあるべき姿なのかな。。レコード数でかいと結構喰うと思うけど。。
jQuery droppable の複数要素が重なった場合の問題
第5回ジオメディアサミット
東大駒場キャンパスで開催された「第5回ジオメディアサミット」行ってきた。特に地域情報とかソーシャルのサービスを担当している訳じゃないんですけど、誘われて面白そうだったので。色々試作サービスも見せてくれて楽しかった。古地図アプリ多分買うな。
本題の jQuery
今製作中のもので派手にハマッたので、今後バージョン上がった時に対応が必要になるかもしれないのでメモをしておく。対象箇所は jQuery UI の droppable 系(jquery-1.4.2 + jquery-ui-1.8)。
はじまり
jQuery UI で、指定要素に doroppable を指定してドロップ領域を作成する。ここまでは問題なし。問題なしどころか実装が簡単すぎて涙がでそう。一般的なアプリならここで終わるので特に問題はない。問題となるのは異なるドロップ領域がレイヤーとして重なっている場合。
こちらの想定としては、オレンジ色の部分にドロップしたらオレンジへのドロップ、青い部分にドロップしたら青い部分へのドロップとしたいし、それが普通だと思うんだけど、jQuery.ui.droppable は内部的に硬いやり方をしていて、交差した黒い部分へドロップすると、オレンジ色へのドロップと認識されてしまう(※オレンジ、青の順に作成した場合)。なんだ、と。
理由
3日前に書いた自分のコードでさえ見たくないのに、ましてや jQuery のライブラリとか見たくないんですけどオーラ全開でソースを見てみた訳で、、、結論から言うと確認した範囲で以下の流れで処理されるようだった。
っざけんな!!!
大切な事なのでもう一度、っざけんな!!!
つまり、複数のレイヤが画面上の同じ領域を含んでいて、そこに drop した場合、droppable でドロップ領域化したのが早い方のレイヤに drop が持ってかれるって事みたい。設計時の考慮漏れ?それとも別のやり方があって自分の認識不足?結構調べたけどそれらしい情報は見つけられなかった。
対応策
jQuery UI の 該当箇所を修正する。
custom 版を使っていたのでそれを元に書くけど、修正場所は $.ui.ddmanager だけでよさそう。droppables.default が droppable オブジェクトの格納配列で、対象要素の情報も含まれている。で、さらに修正ポイントを絞ると、$.ui.ddmanager._drop の関数。
drop: function(draggable, event) { var dropped = false; $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { if(!this.options) return; if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) dropped = dropped || this._drop.call(this, event); if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { this.isout = 1; this.isover = 0; this._deactivate.call(this, event); } }); return dropped;
これを以下の様に修正した。
drop: function(draggable, event) { var dropped = false ,max_z = -1 ,_that, z, trgt, pos ; $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { if (!this.options) return; if ( !this.options.disabled && this.visible ) { // get z-index trgt = this.element; z = ( ( trgt.css('zIndex') == 'auto' ) ? 0 : trgt.css('zIndex') ) || 0; // 最大z-indexのものを処理対象にする if ( z > max_z ){ // 対象要素の位置 pos = trgt.offset(); // ドロップ位置に要素が重なっている場合処理 if ( pos.left <= event.pageX && event.pageX <= parseInt(pos.left) + parseInt(trgt.width()) && pos.top <= event.pageY && event.pageY <= parseInt(pos.top) + parseInt(trgt.height()) ) { _that = this; max_z = z; } } } if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { this.isout = 1; this.isover = 0; this._deactivate.call(this, event); } }); return (_that) ? _that._drop.call(_that, event) : false; }
汚いコードだけど。。基本的に ui のコードに直接修正はやらない方が良いので、自分のコードでオーバーライドした方が良いです。修正ポイントとしては、配列に入った要素の中で最大のz-indexを持っていて、drop 場所を要素領域内に含む要素を処理対象としています($.ui.intersect ここら辺とかを上手く使えばもっと良かったのかな)。
まとめ
jQuery とその周辺ライブラリの威力は大きくて、これまで独自に作ってきたものを桁違いのコストで置き換える事が出来るのは周知の事実。でもやっぱりライブラリ。細かい事を突き詰めると結局自分で手を入れる必要が発生する事もある。ライブラリに依存しきってしまってる人は悲惨だな。