2011年5月15日日曜日

ExtJS-111 ATNDの受付のその後(まとめ)


長々とまとめ。またしばらく触らんだろうからね。

まずお世話になった、なってるリンクは山ほどあるのですが、
http://extjs.blog.sus4.co.jp/
http://www.sunvisor.net/extjs/06
http://extdocs.xenophy.com/
今回は主にこちらにお世話になりました。

あと@naotoriさんのカーセンサーのサンプル。どこに行っちゃったんだろ。。
探せない。。

レイアウトについてはレイアウト迷子になってたときに、
@martini3ozさんにお世話になりました。
こちらはスッと頭に入ってきて良かった。
ツイッターというサービスに感謝。
http://www.sunvisor.net/extjs/06

あと、PDで小堤さんが何気なく
itemsをババっと書いて、layoutをちょこちょこ変えて
例を見せてくれたので「ああ、そうか、そんな感じで変えて試せばいいんだな」って。

みんなPerfectDay行けばいいのに(また言ってる)。

さていろいろ過去の分も含めておさらいを。
(writerについてもまとめておかなきゃ。もう忘れてる。。。)

■CDNについて
ExtJsを提供してくれているのはchacheflyです。ほかは知りませんし、
CDNについてもずいぶん前の勉強会ですが、Extjs勉強会を通してはじめて知りました。

■継承(Ext.util.Observable継承)
    ・constructor
        ・addEvents
        ・on / ・mon
        ・superclass.constructor.apply(me,arguments);  
    な順で。
     

    ex)
    AtndReception.AtndService = Ext.extend(Ext.util.Observable, {
        constructor: function (){
            var me = this;
            //イベント作成(通知用のIF)
            me.addEvents({'eventsearch':true         //イベント検索
                         ,'seteventfee':true         //イベント会費設定
                         ,'usersearch':true          //ユーザ検索
                         ,'showinfo':true            //詳細情報表示
                         ,'updateinfo':true          //情報情報更新      
                         ,'attendance':true          //受付
                         ,'absence':true});          //受付解除
            AtndReception.AtndService.superclass.constructor.apply(me,arguments);                  
            me.init();
        }
    …


■継承(コンポーネント)
    //コンポーネントの初期化
    ・initComponent(construct時にコールされる)
        ・addEvents(イベントの追加)
        ・superclass.initComponent.call(me);
    な順で。

    ex)
    initComponent: function () {
        var me = this;
        AtndReception.EventGrid.superclass.initComponent.apply(me, arguments);
        me.addEvents('beforesearch',
                    'aftersearch');
    },

    ・initEvents(render時にコールされる)
        ・superclass.initEvents.call(me);
        ・on(ハンドラの設定)
        ・mon
        な順で。

    ex)
    initEvents: function () {
        var me = this;
        AtndReception.EventGrid.superclass.initEvents.apply(me, arguments);
        me.on('rowdblclick', function (grid, rowIndex, e) {
            var me = this;
            //イベント会費ダイアログ作成
            me.observer.fireEvent('preseteventfee',me.store.getAt(rowIndex).data);
            me.observer.fireEvent('usersearch',me.store.getAt(rowIndex).data);
        });          
    },
       

■グリッド設定
    ・store設定
        ・proxy設定

            ex)今回DはWebサービスを使用するため同一ドメインポリシに
                引っかかるためScriptTagProxyを使用します。
                APIのパラメタの仕様に合わせて補正する必要があります。
         
            proxy: new Ext.data.ScriptTagProxy({
                url: 'http://api.atnd.org/events/'
            })
            //ロード前のイベントでatndAPIの仕様に合わせて補正する
            me.on('beforeload', function (o, p) {
                p.params.start++;//Atndは1オリジン
                p.params.count = p.params.limit;//パラメタの変更
            });
            //ロード後のイベントで補正したパラメタ情報の書き戻し
            me.on('load', function (o, r, p) {
                p.params.start--;
            });
                 

        ・reader設定
            フィールドを設定する。
            nameがcolModelのdataIndex値と連結、サーバからの返却キー名がnameと違えば
            mappingで結びつける。
         

            ex)
            reader: new Ext.data.JsonReader({  
                fields: [{
                    name: 'event_id',//こっちはExtJsの世界の通り名だよー
                    mapping: 'event_id'//こっちはサーバからの返却名だよー
                }
                     

    ・colModel設定
        dataIndexはbindするレコードのフィールド名
        (=Readerに設定しているfieldsのname。readerは内部でレコード生成する際に
            このfieldを引数に生成するからおなじこと。)
     
        ex)
        colModel: new Ext.grid.ColumnModel([{
            header: 'イベントID',
            dataIndex: 'event_id'//fields:のnameね。
        }
     
    ・tbar(top)設定(検索用のパネルとか設定してみるよ)
    ・bbar(buttom)設定(集計結果とかステータスとか設定してみるよ)


■フォームの出し入れ
    フォームはformPanelから使用することが多いと思う。
    formPanelに内包されているフォームに対して設定したり取得したり。
    http://extjs.blog.sus4.co.jp/2010/04/22/extjs-tutorial-form-baseic/

    取得:
    ex)
        return me.getComponent('setFeePanel').getForm().getValues();
 
    設定
    ex)
        me.getComponent('setFeePanel').getForm().setValues(config);

■レイアウトのスプリットバー
    スプリットバーの移動は
    スプリットバーのエレメントを移動させて(このアニメーションは未検証のままのこしちゃったけど)
    'beforeapply'を発火でやってみた。
    split.el.move(dir, movesize , {duration: 0.25, easing: 'easeBoth', callback: function (el) {
        var me = this;
        //alert('moved!!');                              
    }, scope: me});
    split.fireEvent('beforeapply', me, dir=== 'bottom' ? panel.getHeight() - movesize : panel.height);

■イベントの管理について
コンポーネント同士がお互いのイベントにハンドラ設定してくと
混乱するけど、止む終えないケースはある。この辺はまったくもってよく
わかってないので@kotsutsumiさんや@Mt_blue81さんや、@djodjojpさんから
ヒントを貰い、
今のところは、、、
Application(オブザーバ:Observable継承) → Service(オブザーバ:Observable継承)→Component(Component)
として、
Serviceには機能要件レベルの実装を行い、イベントの追加、ハンドラとして設定
Componentでは、生成時にServiceオブジェクトを渡しておいて、
機能要件レベルの挙動が発生した際はServiceのイベントを発火させることにした。
サービスの主要なものはサービスに集約したかったから。
また、コンポーネント間での小細工や、連動処理はコンポーネント同士で結びついて
良いことにした。
これは
1:一挙動により下位層が一斉に動き出すケース
2:一挙動により上位層が動き出すケース
3:一挙動により同位層が動き出すケース
があったとき、
2,3のケースが多いかなと思ったから。
なんかイイ方法というかベストプラクティスが欲しいよー。

■総括
新しい発見と良い復習になったと思います。
フォームの細かい制御とかその辺はちゃんと作るとき躓くだろうから
その時にでも。そのまえに実践開発ガイド出るのを期待して。
マジですげー手元においておきたい気分です。

早く出ないなぁ。

■これから
次はSenchaに行ってからExtJs4。
でまた階層Gridに戻ろう。

2011年5月12日木曜日

ExtJS-110 ATNDの受付のその後(jsdoit)

どうして公開したらいいかわからんので
ひとまず昨晩jsdoitにアップした。

んだけど、idが気に入らないので
再びアップした。

んだけど、ワンファイルコードで見にくいから
分割したんだけど、アップの仕方がわからないので

結局そのまま放置した。

http://jsdo.it/froggugugugu/tFYj/fullscreen

ひとまず、
ExtJs3はこれで一旦離れよう。
(以前やってた階層グリッドはちょっと寝かしておこう)


SenchaTouchを開始しよう。
@kotsutsumiさん主催のPerfectday(最近ついていけてない)
でExt4について教えてもらったことが今度はSenchaTouchで
生かせればうれしい限りなんだけど。

ほんと、プログラムがかけない体になってきたよ。。。


2011年4月14日木曜日

ExtJS-109 ATNDの受付のその後(一旦おあずけメモ)

春になりました。
桜も咲きました。
資格の季節です。

去年は1ヶ月1個取るぞーって意気込んで序盤はうまくいったんだけど
職場の異動でやる気ぱたっと無くなって頓挫。。。

一年経過しましたのでそろそろ始めます。ので
おもちゃつくるぞーっていってやり始めた
ATNDの受付は一旦おあずけ。

今年度は4つ取れりゃイイネ。
という具合で取り組もう。



再開の時のためにメモを残しておく(すぐに再開するだろうけど)。

・会費、懇親会費オブジェクトをObservableから継承したオブジェクトを作って
値の再設定に伴う各種表示、料金再計算をリスナとして登録すること。
・ATNDっぽい配色に。あとATNDのロゴも入れて提供も入れること(テーマってどうすんだろ)
・フォームのサイズ、レイアウトの微調整
・入力チェック、オリジナルバリデータの設定
・日時入力あたりのrender設定
・Grid内部のrender作成と設定

ひとまず勉強。勉強。

2011年3月27日日曜日

ExtJS-108 ATNDの受付のその後(BorderレイアウトのSplitBarの移動)

子供と寝てしまい、午前一時半からの調査と実装。
勘違いとなれないレイアウト周りで超はまりました。
以前、コードリーディングした際に勉強してたはずなのに度忘れしてました。

やりたいイメージは、

①イベント検索 ボタンでイベント領域を広げておきたい。




②イベントのユーザリストへDD時にユーザ領域を広げたい















です。


領域は可変にしておきたい。
でもいちいちSplitBarを選択して調整したくない。
で、Grid間のDDを有効にしたいから
collapseだとこまる。

なのです。


ちなみにこの後は、




参加リストからDDするとダイアログが出てて
受付します。
















繰り返しになりますが、
SplitBarは可変にしておきたいし、collapseだとグリッド間のDDが使えない。
で、
結果から言うと


borerlayoutのonSplitMoveを稼動させてやる。




に落ち着きました。

コードの抜粋(ビューポートに追加実装しちゃってます)。


/**
 * 下部スプリットバー移動サイズ計算
 */
calcSouthSplitMoveSize: function(dir){

    var me = this,
        split = me.layout.south.split,
        panel = me.layout.south.panel,
        result;
      
    if (dir === 'bottom'){
      
        result = panel.getHeight() - me.layout.south.minHeight;
  
    } else if (dir === 'top'){
  
        result = me.layout.south.height - panel.getHeight();
  
    }
  
    return result;

},

/**
 * イベントリージョン拡大
 */
openEventRegion: function(){

    var me = this;
  
    me.resizeRegion('bottom');

},

/**
 * 受付リージョン拡大
 */
openReceptionRegion: function(){
  
    var me = this;
  
    me.resizeRegion('top');

},

/**
 * リージョンサイズ指定
 */
resizeRegion: function(dir){

    var me = this,
    split = me.layout.south.split,
    panel = me.layout.south.panel,
    movesize = me.calcSouthSplitMoveSize(dir);
  
    split.el.move(dir, movesize , {duration: 0.25, easing: 'easeBoth', callback: function(el) {
        var me = this;
        //alert('moved!!');                              
    }, scope: me});
    split.fireEvent('beforeapply', me, dir=== 'bottom' ? panel.getHeight() - movesize : panel.height);
  
}







ハマリからの脱出経路。


■ビューポートのExt.layout.BorderLayout.SplitRegionが生成されるくみは
BorderLayout.jsの117行目あたりを。(center以外かつ、split=tureで生成)

■Ext.layout.BorderLayout.SplitRegionがSplitBarを生成する部分は、
おなじく、BorderLayout.jsの1071行目あたりから。
1076行目でリスナ設定されているね。

■Ext.SplitBarの移動については、
Ext.SplitBar.jsの202行目あたりからDDの終焉の実装部。

■ここまでくればSplitBarオブジェクトとPanelオブジェクトが触れればゴール。



※はまってしまったところは、
SplitRegionのことをてっきりSplitBarだと思ってたことと、
その誤解が解けたあと、
SplitBarはSplitRegionにくっついていると思ってしまったこと。
(これは以前コードリーディング発表時にレイアウトまわりみたとき見てたはずなのに)

と、ソース見ないと通常の倍はかかる気がする。


結論:だからはじめからソースを見りゃいいんだよ。


あとは107で決めた機能拡張したらゴール。あと二回かな。。
そしたら念願のSenchaTouch!!


※今回のこのレイアウトについては完全な予定外実装。


2011年3月22日火曜日

ExtJS-107 ATNDの受付のその後

2月にちょいと作ってたやつを三連休のスキマ時間で
仕上げてしまおうとおもったけど、なかなかそう上手く時間は取れず。。

一応
・ViewPortによる設定と
・twitter_imgフィールドをimgタグに入れる

ってのだけはやっておいた。
twitter_連携してない人の画像は出来ればnoimageとかそういう類の
やつがいいんだろうけど、ひとまずchasheflyでやってるし
default配下の画像にした。

あとは
・懇親会費の設定ダイアログ、今は固定1000円だし。
・懇親会費じゃない主会費ってのもあるね。
・項目とかグダグダなのでUI周りを整える
って位をつけて
早くSenchaに行きたい。
でも相変わらず牛歩。














寝よう。

2011年3月19日土曜日

最近忙しい

NextJsもあれ以来全く触れてないし、
ExtJsも昨日久々にプログラムをかけた。

三連休でひとまずブログを一度更新することを目標にしよう。
てか一ヶ月以上ほったらかしだったんだ。。どうりで忘れるわけだ。

しっかし、年度末ってのはいろいろ重なるね。
今日は長女の7才の誕生日。
疲れた顔なんてしてられんな。。


2011年3月1日火曜日

NextJS-1環境だけはひとまずつくろう


ExtJS106のプログラムはほうっておいて
Win環境にnextjs環境をサクーって作りたかったんだ。
そしたらkotsutsumiさんが、VMWareいれてcentosいれりゃいいじゃんよーって
お勧めしてくれたんでそうしたよ。

またいつか、絶対に環境壊すと思うのでメモメモ。

1:VMware インストール

2:centOSのディスクイメージゲト
    CentOS5MinimalVirtualAppliance-1.3.7zをダウンロード
    (今はリンク切れ起こしてる。。)

3:centOS起動

4:ユーザ追加
    useradd ユーザ名
    passwd ユーザ名

5:sudoユーザ追加
   vim /etc/sudoers
  
   root ALL=(ALL) ALL
  
  の下に
  
  ユーザ名 ALL=(ALL) ALL
  
  を追加する
6:ログアウト

   logout
  
7:ログイン

   ユーザ名でログイン

8:node インストール(今は4.0.1が最新だった)

   sudo yum install build-essential libssl-dev curl
   mkdir tmp
   cd tmp
   wget http://nodejs.org/dist/node-v0.4.1.tar.gz
   tar -xvzf node-v0.4.1.tar.gz
   cd node-v0.4.1

※ここでgcc 入ってないことがわかる。

   sudo yum install gcc-c++


※openssl-develもない。


   sudo yum install openssl-devel

   ./configure --prefix=~/local
   make
   sudo make install

8:PATHを通す
   ~/.bash_profileを編集

   $PATHに~/local/binを追加する

   一度ログアウト後にパスが通っているか確認するよ。

   echo $PATH

9:node用のポート開放(nodejsのexample実行するのにあけただけ)
  →これ以降の手順ではnodejsのexample確認はしないので別にいらない。

   /etc/sysconfig/iptablesを編集

   -A INPUT -p tcp --dport 8142 -j ACCEPT

   を追記。

10:npm インストール

   cat >>~/.npmrc <<NPMRC</ppp>
   root = $HOME/.node_libraries
   binroot = $HOME/bin
   manroot = $HOME/share/man
   NPMRC

   vim ~/.bashrc

   export NODE_PATH=$HOME/.node_libraries:$PATH
   export PATH=$HOME/bin:$PATH
   export MANPATH=$HOME/share/man:$MANPATH

   を追記

   curl http://npmjs.org/install.sh | sh

   を実行

11:作業用にXwindows入れておく。(コレはいらない人はいらないよね)
   rootで

   yum groupinstall "X Window System" "GNOME Desktop Environment"


12:nextjs インストール(他のパッケージもね)

   npm install NX connect formidable mysql socket.io

13:mongodbのインストール(てかなんで12でやらんかった俺。)

   npm install mongodb

14:Win環境とcentOSで共有を張っておきたい。

   nodejs用のファイル記述するのにwin環境上で書いて
   そのままcentosに切り替えて動かしたい。
   ってことでsambaいれればいいの?ってつぶやいたら
   @martini3ozさんが教えてくれました。VMWareで共有できるよーて。

   VMwareの設定で共有張ったら再起動!
   で、

   /mnt/hgfs/共有名

   でほうら見えた。
   これでWin上での開発が楽チンになるってことです。

16:ひとまずnextjsのサンプルを環境にDL

   共有貼ったフォルダにNextJsの環境を放りこんでおこう。
   examplesがまず欲しいからね。

17:サンプルの実行
   で、ひとまず、ifconfigでIP見て、
   nextjsのサンプルを動かすってことで、
   nextjs配下のexamples配下のwebsocketに移動して

   node server.js

   を実行。

   winのブラウザで

   http://192.168.150.128:3000/にアクセス。

   チャットが動いた事を確認。

















めでたし。



■下記、お世話になったサイトです。サイト管理者様。ほんとに感謝です。ありがとうございました。 
NextJS
http://www.nextjs.net/

nodejs
http://nodejs.jp/nodejs.org_ja/

自分の感受性くらい
http://d.hatena.ne.jp/t_43z/20101013/1286957802

にゃほ~
http://yp.xenophy.com/?p=75

あさのののーと
http://yuki.xenophy.com/?p=188

junji_furuyaのブログ
http://d.hatena.ne.jp/junji_furuya0/20101028/1288222330

地方で活動するweb制作者の日々を綴るblog
http://blog.livedoor.jp/loopus/archives/50161232.html

WebOS Goodies
http://webos-goodies.jp/archives/50481076.html

node + ejs + Socket.io のサンプル

まずい。。 一年間、一回も更新してない!!! つまり、、 趣味の時間がほぼ皆無ということの現れです。 業務と子育てに追われた一年でしたね。。。。。 危なく年をこすところだった。あぶない。なぶあい。 話を変えて。 今月初旬に 社内でちょっとしたプレゼンをする事に...