2012年11月15日 星期四

Google Cloud SQL

對於很多用慣retional DB的使用者來說,Google Cloud SQL DB的推出或許是個福音
目前的Cloud SQL以MySQL 5.5為主,提供

-高可靠度與高可用度,自動幫開發者複製資料
-JAVA的JDBC與Python的DB-API供使用
-可直接與Appengine整合

目前Google 提供free trail(至2013 Q1),可在建立instance的時候選擇size D0,輸入所要建立的instance name,這裡建議取短一點以方便後面呼叫(id:instance name)使用


建立好之後,畫面轉至該instance的Dashboard,
而相關table的建立與管理可透過SQL prompt or the command line tool
SQL Prompt為一個web版的sql consloe,下圖示範建立一Database guestbook



另外建立table person並insertㄧ筆資料,最後select所有person得資料如下:

建立好資料庫相關表格後,就可以著手進行與Google App Engine的整合了
官方附了一個簡單的guestbook範例的jsp頁面+servlet code與web.xml的設定供參考

Using Google Cloud SQL with App Engine Java SDK
https://developers.google.com/appengine/docs/java/cloud-sql/developers-guide


連線到DB需依照下列步驟:
1.import google appengine提供的JDBC Driver

import com.google.appengine.api.rdbms.AppEngineDriver;

2.連線到資料庫(jdbc:)

 DriverManager.registerDriver(new AppEngineDriver());
 c = DriverManager.getConnection("jdbc:google:rdbms://instance_name/guestbook");
完成後就可以把專案deploy到Google App Engine上查看結果了



2012年11月6日 星期二

Skype與MSN整合

隨著行動裝置快速進化,以及social media network的快速進化,前任即時通訊軟體霸主MSN,
先是露出疲態,市佔下滑,行動裝置APP Store也一直沒有好用的msn  App,msn彷彿僅剩下告訴朋友我還活著的功能,於是前浪就這樣倒在沙灘上了

想當初微軟msn可是硬生生的幹掉了前代霸主ICQ(淚),就這樣默默的稱霸了10年了,想到以後沒辦法聽到煩人的燈燈聲,也是一種莫名的感傷
Anyway,雖然微軟玩爛了msn,但幸好他有買下了skype來來救援(準備玩爛?)
消息傳了一陣子後,skype blog就出現了這篇:
http://blogs.skype.com/en/2012/11/skypewlm.html
對於兩家帳號都有的使用者,或許有帳號整併的困擾
不過skype很窩心的在登入頁面(https://secure.skype.com/login)

提供使用者選擇以MSN帳號登入

因為我已經有SKYPE帳號,所以點選進入SKYPE Login

最後選擇合併就可以把Skype跟MSN帳號合併了

就這樣帳號就合併了,不過目前群組並沒有跟著匯入.... Bye,MSN...哪天哪個懷舊的MV再見了

2012年6月8日 星期五

跨裝置解決方案 PhoneGap and jQuery Mobile

行動裝置的時代來臨後,開發app的風氣蔓延了起來,但是隨著平台種類的成長,開發人員的噩夢又再度降臨了,Android的話可以使用Java或C,iOS則要學習Object C, Windows Phone當然就C#或VB...傳統的跨平台開發需求就轉化為跨裝置開發,而目前市場的氛圍,似乎希望讓HTML5的Web Solution成為跨裝置開發的依歸
而在目前2012 Q1的當下,HTML5的Spec仍尚未最終定案下,市面上出現了PhoneGap與jQuery Mobile這兩個跨裝置的HTML+CSS Web開發方案
首先介紹:PhoneGap(http://phonegap.com/)
-提供了讓開發者在不同平台上,置放相關的中介套件後,可以Web的方式進行操控,
以Android為例開發者需
1.新增libs資料夾,並將phonegap的jar檔加入
2. 新增/assets下的www資料夾,可於此配置所撰寫的web相關檔案
3.更新 AndroidManifes.xml,加入對於裝置的與使用權限的設定

















以官方提供的demo範例測試,如下圖所示:
基本的相機,電話,簡訊,連絡人資訊,網路皆可於html中操作
而對於個平台詳細支援情形可於http://phonegap.com/about/features查看
而jQuery相對於一般的Web開發人員亦不陌生,可至jQueryMobile下載使用到的js與css,放至專案的assets/www/下,或者使用CDN資源,於html中加入:



如此就可以jQuery來輔助UI的設計,為現階段的跨裝置開發提供一解決方案

2012年5月8日 星期二

[note] WebSocket API

很想來個Web Sockets淺談的標題,但是以目前對他的認知,連淺談都還稱不上,所以就簡單記錄一下

在web 2.0的時代, 我們使用了Ajax來進行非同步的資料處理,而ajax與server溝通的方式還是可以分為
1.一般的方式為client polling,資訊"即時"的情形取決於client的詢問,效率不彰也很耗損資源
2.Comet:Long lived connection,由server來主動push data給client
3.Long pooling:Comet演進而來,client發出request後,server沒有新資料可以回傳,會等待一段比較長的時間,直到server有新資料可以回傳,或timeout為止,維持一條long polling的查詢減少requet的建立與結束,目前如facebook採用此較有效率的動態更新方式
WebSockets的初衷就是提供socket給web server與client browser,讓client與server之間可以維持長時間的連線,並且可以進行Server Push此類比較有效率的溝通方式

但是因為安全因素考量,Firefox跟Opera曾經都disalbe對先前版本的websocket
-Firefox: 4與5的版本(話說天殺的firefox現在幾乎以光速更新版本中)中disable websocket =>(http://hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4/), 現今版本支援追蹤(https://developer.mozilla.org/zh_tw/WebSockets)
-Opera:(Opera 11)

目前熱門的websocket實作技術為
socket IO(http://socket.io/) +NodeJS(http://nodejs.org/)
這兩個的新玩意也要等摸過了才能再繼續補充

而Java方面,apache tomcat 7.0.27也支援了websocket( http://www.tomcatexpert.com/blog/2012/05/01/how-apache-tomcat-implemented-websocket)

在實作上
1.extends WebSocketServlet class
2.implement message listener
3.writing data to client
4.close connection to client


To be continuted.....

2012年4月30日 星期一

[note] mac下使用中研院ipv6 tunnel

話說換了光世代後,看youtube還是不能直接觀看1080p著實令人感到悲劇...很快的就在網路上看到mobile01的討論串,其中除了詳述原因為台灣user連線到youtube並不會連到台灣google機房而是繞出美國...但由於此現象一朝一夕似乎無法改善,所以就參考了win 7 64 bit得相關設定方法,直接使用到中研院提供的ipv6 tunnel,果然之後考試都考一百分,youtube也可以直播1080p了

由於網路分享的是windows得方法,手邊還有台mac嗷嗷待哺,所以就上網google了一下mac的設定方法:
1.安裝Xcode(Lion預設可至app store下載)
2.安裝 MacPorts,可到( https://distfiles.macports.org/MacPorts/)
選擇最新版的.dmg檔安裝
3.開啟終端機sudo port install vpnc
4.sudo port load tuntaposx
5.下載gogoc source file(http://gogo6.com/downloads/gogoc-1_2-RELEASE.tar.gz),解壓縮(任意資料夾)
6.進入解壓縮之後的folder
7.終端機執行make all
8.終端機執行make installdir=/usr/local/gogoc install
9.進入/usr/local/gogoc/bin目錄修改gogoc.conf檔案(sudo vim)

-Server設定為server=anon-taipei.freenet6.net
-DNS設定為dns_server=2001:4860:4860::8888

10.終端機cd到/usr/local/gogoc/bin,輸入 sudo ./gogoc 即可執行

PS.輸入sudo killall gogoc 可結束gogoc,有時server busy會出現connection fail,多try幾次應該就可以
沒有錯誤訊息後,可連線到ipv6.google.com或wwww.v6.facebook.com試試看

update:chrome可輸入about:net-internals enable IPV6


有空再來試試10.6的mac mini再回來update

2012年3月11日 星期日

Android ExpandableListActivity and SimpleCursorTreeAdapter

在Android app的開發中,若想實現點擊listview中的某個item則展開下面的子list,可利用ExpandableListActivity來達到此目的,官方的範例如下: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html 而此list activity對應到的adapter可使用SimpleExpandableListAdapter或者extends BaseExpandableListAdapter作彈性的使用,說明如下:
 
// 使用SimpleExpandableListAdapter顯示ExpandableListView
         
      
        SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
                this,//指定Context
                groups,//第一層集合
                R.layout.groups,//第一層所使用的layout
                new String[] { "group" },//fromto,就是map中的key,指定要顯示的對象
                new int[] { R.id.group }, //顯示在groups中的id
                childs,//第二層集合
                R.layout.child,//第一層所使用的layout
                new String[] { "child" },//fromto,就是map中的key,指定要顯示的對象 
                new int[] { R.id.child });
        setListAdapter(adapter);
而若第一二層都想使用cursor為基礎之資料的話,則可extends SimpleCursorTreeAdapter來實現這個功能,底下附上最近部分片段
 private class MyExpandableListAdapter extends SimpleCursorTreeAdapter {

  public MyExpandableListAdapter(Cursor cursor, Context context,
    int groupLayout, int childLayout, String[] groupFrom,
    int[] groupTo, String[] childrenFrom, int[] childrenTo) {
   super(context, cursor, groupLayout, groupFrom, groupTo,
     childLayout, childrenFrom, childrenTo);
  }

  /*
   *取得第一層之cursor後,return該cursor對應之下一層資料的資料查詢結果
   */
  @Override
  protected Cursor getChildrenCursor(Cursor arg0) {
   String[] queryArgs = new String[1];
   queryArgs[0] = arg0.getString(arg0.getColumnIndex("_id"));
   
   return getOrderByTicket("order_id=?", queryArgs);

  }
 }
實作完自訂的adapter後,則可於使用setListAdapter設定該adapter
//取得第一層之cursor
parentCursor=db.getAll();
//宣告使用的adapter
 MyExpandableListAdapter adapter = 
            new MyExpandableListAdapter(
     parentCursor,//第一層使用之cursor
                                        this,//context
     R.layout.parentLayout,// parent layout
     R.layout.childLyout,// child layout
                                        new String[] { "table_num","customer_count", "price" },//parent cusror column
                                        new int[] {R.id.textView1, R.id.textView2, R.id.textView3 },//parent layout mapping id
     new String[] { "name", "count" },//child cursor column
                                        new int[] {R.id.textView1, R.id.textView2 });//child layout mapping id

    ExpandableListView expListView = getExpandableListView();
//如果不想顯示indicator可將groupindicator設成null  
    expListView.setGroupIndicator(null);
 //指定adapter
   setListAdapter(adapter);

Android SimpleCursorAdapter

最近想作個小工具放到market分享,中途遇到了listview的item要與DB的CRUD結合,
所以對於要如何在listview中取得SQLite中cursor對應的id感到困擾,所幸在survey了
一下相關的問題後,找到了android提供的SimpleCursorAdapter,該adapter的好處在於可以將db查詢回傳的Cursor直接使用,如此可方便開發者在Listview的item click listener中進行物件的操作
SimpleCursorAdapter的建構子如下:
SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)
更多資訊可參考http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html

foodCursor = getFoodCursor();//取得sqlite Cursor
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
this,
 R.layout.mylistview2,//指定的layout
foodCursor,////取得sqlite Cursor
 new String[] { "name", "price", "category" },//所要顯示的db欄位,這裡要顯示的為name,price,category
new int[] { R.id.textView1, R.id.textView2, R.id.textView3 }//對應的layout id
);
而另外一個使用SimpleCursorAdapter的好處在於一般的apadter在更新資料後,往往要搭配dapter的notifyDataSetChanged()通知UI畫面重新更新,而直接使用SimpleCursorAdapter僅需要使用Cursor.requery()即可更新UI,非常的方便

http://developer.android.com/reference/android/widget/CursorAdapter.html