標籤

Java (11) GWT (7) Scala (2) Google API (1) Python (1)

2011年6月7日 星期二

Google Data API筆記

Query 參數筆記

1.實驗性的功能:fields

http://www.example.com/feeds?fields=link,entry(@gd:etag,id,updated,link[@rel='edit']))
 2.max-results
max-results可以決定回傳的結果數量,重點是配合start-index一起使用
start-index=1&max-results=10
start-index=11&max-results=10
使用這樣的方式來達到page的功能,但是官方有特別註記,這樣的使用方式不一定會相等於
start-index=1&max-results=20
 3.updated-min、updated-max
upper bound是不包含在內
也就是說不用寫 23:59:59這種蠢必的query了
p.s如果updated-min太小,有可能會導致 HTTP 410(Gone)的錯誤


4.published-min、published-max
可以取得entry publication date,lower bound與upper bound的條件跟updated一樣


5.q
全文搜尋
q=term1 term2 term3 <-空白記得使用url encoded處理
q="exact phrase"
q=-term <-這個是除外的意思
 6.prettyprint
決定回傳回來的xml是否要排版

2011年4月25日 星期一

用Java取得Google Tasks資訊(1.1)

由於Google一直遲遲沒有推出Google Tasks的API,也沒有正式的官方文件教導該如何取得Google Tasks的資訊,因此只好到處搜尋作法東拼西湊。
這篇主要參考了幾個來源:


首先,niggo372的原始碼是Android上的原始碼,由於Android本身有AccountManager可以取得手機上Google帳號的AuthToken,因此不需要做登入驗證的動作。但一般Java應用程式就必須先連線至Google ClientLogin輸入使用者的帳號密碼換取一個AuthToken。這個就是第二篇文章的重點。第三篇文章算是大集合,詳細的分析了Google Tasks接受Request的參數內容與格式。以下為使用Scala的範例內容

2011年2月16日 星期三

當不想用var與while的時候-Tail Recursion

最近迷上了Scala,只要有關於自己要使用的程式目前都是用Scala來寫(沒辦法,因為目前身邊沒有人跟我一樣用Scala),因此打算開始來記錄一下筆記。
以前在使用Java的時候最常做的就是使用

String line = "";
while((line = reader.getLine())!=null)
{
System.out.println(line);
}


或其他去尋訪Container內所有的元素的程式碼,如果換到Scala來寫,就必須使用var定義一個變數來配合While操作。可是用Scala我就不想用var了阿,也不想用while了。但是用遞迴又怕會造成效能上的負擔。這個時候就是銀河美少年Tail Recursion颯爽登場的時候了(<ゝω・)綺羅星☆

def printLine() {
val line = reader.getLineif(line != null) {
println(line) printLine
}
}


好吧,寫到這邊我也覺得這個例子沒有比較好 Orz … 那來真的有在用的好了

private def fromInputToOutput(in: InputStream, out: OutputStream) = {
val buffer = new Array[Byte](8192) def transfer() {
val read = in.read(buffer) if (read >= 0) {
out.write(buffer, 0, read) transfer
}
} transfer
}

上面的程式碼是從這參考來的

跟Java比較好吧雖然可讀性不一定比較好(有很大的部份是因為我現在能力還不夠好啦 QQ)但是這樣開始比較有Functional Programming的味道了 … 而遞迴最常被討論的效能問題,Compiler會替我們處理。Compiler在確認(以上例來說)他確認transfer的遞迴呼叫是整個Function最後一個動作時,他就會直接重設Function的變數然後再跳至Function開始的部份執行,因此並不會有一般遞迴一直產生新的Function而造成Stack overflow的問題。但是在"Programming in Scala”一書中有提到,Scala受限於JVM指令的關係,能最佳化的程度有限。以下幾種情況Scala的Compiler沒有辦法進行Tail Recursion的最佳化

1.遞迴是間接的情況


def isEven(x: Int): Boolean = {
if (x == 0) trueelseisOdd(x - 1)
}

def isOdd(x: Int): Boolean =
{
if (x == 0) falseelseisEven(x - 1)
}



2.所呼叫的是一個函式變數

以上這些情況都沒有辦法進行最佳化~

val funValue = nestedFun _
def nestedFun(x: Int) {
if (x != 0) {
println(x) funValue (x - 1)
}
}
筆記就到這邊,這篇最主要是我都會忘記有Tail Recursion可以用。
最後(<ゝω・)綺羅星☆

2010年11月4日 星期四

GWT 2.1-RequestFactory(4) 使用RequestFactory

看標題終於有要進入正題的感覺了

現在我們手上已經有了

  1. 資料物件Entity與EntityProxy
  2. 管理資料物件的RequestContext

接下來我們就要用RequestFactory將他們混在一起做撒尿牛丸了

2010年11月2日 星期二

GWT 2.1 RequestFactory(3) RequestContext

終於拖到第三篇了,今天都是一直在回答問題弄的我好想睡覺。

我們現在有了代表Server端與Client端的資料物件Entity與EntityProxy之後,現在就需要實作代表Server與Client端操作Entity與EntityProxy的管理物件。

跟Entity與EntityProxy的關係一樣,Server端不需要繼承任何物件,他只要提供存取Entity的方法就可以了,並且這些方法要以Static的方式宣告。因為被強迫在Entity裡面要放一個findEntity(Long id)的Method,所以一不做二不休,我連這些管理方法都直接放在Entity物件中了。但是這個我有實驗過,如果你想將這些Method放到其他物件是可以的,不一定都要跟Google的範例一樣放到Entity物件中。

2010年11月1日 星期一

GWT 2.1 – RequestFactory(2) Entity與EntityProxy

夜深了,我想騙一下自己寫點東西就結束好了

今天要介紹的是RequestFactory中的Entity與EntityProxy,Entity其實就是我們的資料物件,而Entity是Server用的,EntityProxy則是Client用的。GWT在這邊提供最貼心的服務就是你不需要去實做EntityProxy的Code,他會自動幫你產生,你唯一要做的事情就是定義EntityProxy的介面,並且作一些轉換。

這樣最大的好處在於你的Entity並不需要可以被GWT給編譯,也就是他不需要轉換成JavaScript的程式碼,所以你可以不需要將Entity放在Shared中,也不用擔心Serialize的問題。但是有的缺點就是當你EntityProxy得介面實做有錯誤的時候,執行時(我是使用Eclipse GWT Plugin)的錯誤訊息提示很不清楚,推薦作法是實際去用GWT Compiler編譯一遍,他會跟你說他在自動產生程式碼的時候遇到困難,而且訊息就很好閱讀。

2010年10月31日 星期日

GWT 2.1 RequestFactory(1)環境設定與使用流程

GWT 2.1終於正式Release了!!從之前一開始問題超多的2.1 M1一直到之前的2.1 RC1,現在終於可以正式使用2.1的新功能了~!!!

這次的筆記內容主要就是紀錄RequestFactory的使用方式與注意事項。

  1. RequestFactory的教學文件
  2. RequestFactory的官方範例

上面這兩個連結就是學習RequestFactory的最好教材,尤其是官方的範例。因為教學文件有些設定部份並沒有寫得很清楚,範例程式碼也不是有將全部列出,因此有很多東西都需要從原始碼裡面才看得到的!!(之前為了這找Bug看原始碼看到快吐 …)