2012年6月15日 星期五

FB JS SDK-顯示粉絲團並檢查按讚

我也是現在才知道~原來在粉絲團按讚就等於加入粉絲團了!!

粉絲團內容+按讚使用like_box,
如果要跟網路上一樣精簡只有讚按紐可以用like_button

官網上這些被列入plugin, 還有預覽跟gen code很貼心!!
http://developers.facebook.com/docs/reference/plugins/like-box/

在送出page前check有沒有加入粉絲團一樣用FB.api...
此頁是接在之前登入APP後做的~ 所以能來到這的user是都已經登入過囉!!

---html/jsp include
<script src="http://connect.facebook.net/zh_TW/all.js"></script>

<div id="like_box" style="margin-top:5px;display:none">
       <div class="fb-like-box" data-href="http://www.facebook.com/tyepb" data-width="300" data-show-faces="true" data-stream="false" data-header="false"></div>      
</div>

---script/js file
FB.init({
    appId: '{APP_ID}', // App ID
    //channelURL: '....................', // Channel File
    status: true, // check login status
    cookie: true, // enable cookies to allow the server to access the session
    oauth: false, // enable OAuth 2.0
    xfbml: true  // parse XFBML
});

 function fan2()  {
    var pid = '{PAGE_ID}';          
    var isFan = false;
    FB.api('/me/likes/'+pid,function(response) {
        //console.log(response);
        if( response.data ) {
            if(response.data)  {
                for(var i = 0 ; i < response.data.length ; i++)  {
                    if(pid == response.data[i].id)  {
                        isFan = true;
                        //console.log('??it is fan!!');
                        //return true;
                    }
                }
            }
            if(isFan)  {
                //do something when user like fans page
            }  else  {
                //do something when user unlike fans page
                return false;
            }
        } else {
            //user not login/or not connect FB APP
            return false;
        }
    });
    return false;
}


FB JS SDK-使用者登入FB APP

不知道是不是閏月的關係~ 最近真是太血淚了Orz..

在Java Base, FB沒有特製的SDK, 就只能用JS SDK
主要有Issue要判斷~ facebook的user是不是某某粉絲團的粉絲~
所以要先弄一個FB APP去access使用者資訊..

而如何讓使用者登入FB APP並同意隱私權授權..
不換頁~ 直接在同一頁登入..
在官網的範例有很不錯的範例~ 我只是把另開改成在原本頁面處理...
FB.api + oauth dialogs
http://developers.facebook.com/docs/reference/dialogs/oauth/

---html/jsp include FB js lib
 <script src="http://connect.facebook.net/zh_TW/all.js"></script>

 ---js script/file
FB.init({
    appId: '{APP_ID}', // App ID
    //channelURL: '....................', // Channel File
    status: true, // check login status
    cookie: true, // enable cookies to allow the server to access the session
    oauth: false, // enable OAuth 2.0
    xfbml: true  // parse XFBML
});

function loginUser() {
    FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {
            //login and permit APP access before
            var uid = response.authResponse.userID;
            var accessToken = response.authResponse.accessToken;
            //do something when user login FB APP ok
            $('#like_box').css('display', 'block'); 
        } else if (response.status === 'not_authorized') {
            //login but not access app
            doLoginApp2();
        } else {
            // the user isn't logged in to Facebook.
            doLoginApp2();           
        }
    }, true);
}


function doLoginApp2()  {
    var appID = '{APP_ID}';
   
    var path = 'https://www.facebook.com/dialog/oauth?';
    //on moblie, display=touch
    var queryParams = ['client_id=' + appID, 'redirect_uri=' + window.location, 'response_type=token', 'display=touch'];
    //on PC web
    //var queryParams = ['client_id=' + appID, 'redirect_uri=' + window.location, 'response_type=token'];
    var query = queryParams.join('&');
    var url = path + query;
       
    window.location = url;
}

2012年6月14日 星期四

NetBeans yWork UML

因應有人要求說程式也要出個物件圖..Class Diagram..
痛恨一力噗死的我就只能用NetBeans..
還好還有個方便的解決方式..yWork..

首先先到yWork官網~ 下載(速度有點慢要有耐心~ 還好等待是有價值的!!)
http://www.yworks.com/en/index.html
選擇UML Doclet, 免費的就有物件圖了..

Step 1. 下載zip包
Step 2. 解壓縮~整個copy到喜歡的地方..
Step 3. 打開NetBeans(我用7.1, 其他IDE或版本設定是不一樣的~可以參照zip裡的usersguide.pdf)
Step 4. NetBeans專案右鍵Properties->Build->Documenting
            Addtional Javadoc Options填入
            -docletpath "{yWorks包絕對路徑}\lib\ydoc.jar" -resourcepath "{yWorks包絕對路徑}\resources" -doclet ydoc.doclets.YStandard -umlautogen
            按下OK儲存
Step 5. NetBeans專案右鍵Generate JavaDoc..
            如果沒有出錯~ 完成後跳出瀏覽器直接link..就含有圖的javadoc了
           
之後就可以去NetBeans專案下找javadoc打包帶走^_^b~

2012年6月6日 星期三

Axis client for .Net web service

這次真是太雖小了Orz..居然用到貌似有bug的前期版本~
問題是~~
SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.
發生的原因應該是在client invoke預設axis他去check 參數傳遞時~ 對於不需要傳參數的判斷會有問題..(明明就是不用~ 但他堅持一定要讀一個來用Orz)

不過因為OOXX機車的原因..所以也不能換lib..
網路上大家好像也沒特別講這個問題要怎麼解...
終於試到一個invoke的方式可以繞過那一段了T_T..要是繞不過去~就要硬刻一個http request了Orz..簡單的說就是用Message來發..這樣子他就不會去check參數了~ 還可以刻一個美美的xml不會有ns:前綴..

使用method如下~

            Call client = new Call(url);
            client.setUseSOAPAction(true);
            String uri = namespace;
            if(uri.endsWith("/"))  {
                uri += op;
            }  else  {
                uri += "/"+op;
            }
            client.setSOAPActionURI(uri);
            if(timeout > 0)  {
                client.setTimeout(timeout);
            }
            client.setOperationName(new QName(namespace,op));
            String xml ="";
            xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
            xml += "<soap:Body>";
            if(params == null || params.size() == 0)  {
                xml += "<"+op+" xmlns=\""+namespace+"\" />";
            }  else  {
                xml += "<"+op+" xmlns=\""+namespace+"\" >";
                for(int i = 0 ; i < params.size() ; i++)  {
                    String[] pair = params.get(i);
                    xml +="<"+pair[0]+">"+pair[1]+"</"+pair[0]+">";
                }
                xml += "</"+op+">";
            }
            xml += "</soap:Body>";
            xml += "</soap:Envelope>";          
          
            Message msg = new Message(xml);
            SOAPEnvelope res = client.invoke(msg);          
           
 
若是使用RPCElement(之前的寫法)~ 則只能處理有帶參數的~節錄如下當參考
在axis裡~好像前綴是拿不掉的(不過至少.net那邊的web service看得懂就好..)~axis2可以偷做手腳拿掉就是..

            Call client = new Call(url);
            client.setUseSOAPAction(true);
            String uri = namespace;
            if(uri.endsWith("/"))  {
                uri += op;
            }  else  {
                uri += "/"+op;
            }
            client.setSOAPActionURI(uri);
            if(timeout > 0)  {
                client.setTimeout(timeout);
            }

            RPCElement req = new RPCElement(op);
            req.setNamespaceURI(namespace);
            req.setAttribute("xmlns", namespace);

            for(int i = 0 ; i < params.size() ; i++)  {
                String[] input = params.get(i);
                if(input.length == 2 && input[0] != null && input[0].length() > 0)  {
                    RPCElement ele = new RPCElement(input[0]);
                    if(input[1] != null)  {
                        ele.addTextNode(input[1]);
                    }
                    req.addChildElement(ele);
                }
            }
            re = (String)client.invoke( req );

2012年6月5日 星期二

unicode to string..\\u

本來看到unicode(\u)字也沒啥好怕的~ 不過突然發現有人做了一件奇怪的事情~ 為了讓網頁json上可以看到unicode的原型..他就把他寫成了\\u的碗糕|||Orz..

想說怎麼讀他的資料一直都是出\uxxxx真是超頭痛的..只好手動做了String parse..
                //str is origin string (\\uXXXX\\uXXXX)
                String str = (String)mpRow.get(converts[a]);
                if(str != null && str.trim().length() > 0 )  {
                    String un = str.trim();
                    StringBuffer sb = new StringBuffer();
                    int idx = un.indexOf("\\u");
                    while(idx >=0 )  {
                        if(idx > 0)  {
                            sb.append(un.substring(0, idx));
                        }
                       
                        String hex = un.substring(idx+2, idx+2+4);                       
                        sb.append( (char)Integer.parseInt(hex, 16) );
                        un = un.substring(idx+2+4);
                        idx = un.indexOf("\\u");
                    }
                    sb.append(un);
                 
                    //convert result of the str
                    String uf8=sb.toString();
                }