星期五, 9月 11, 2009

Android中如何檢查第三方Package是否有安裝?

第一個方法:
public static boolean isIntentAvailable(Context context, String action) {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> list =
packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}

第二個方法:

透過Intent.resolveActivity(),PackageManager.resolveActivity()這兩個API來作,作法都大同小異。


Reference: [1] [2]

星期日, 8月 23, 2009

ADC2的作品上傳時間接近尾聲,但是Submission Site竟然還沒出現?!

根據http://code.google.com/intl/zh-TW/android/adc/裡面提及的Timeline

Timeline

  • May 27 - Google I/O: ADC 2 announced
  • July 13: Full Terms and Conditions made available
  • Beginning in August: submission site opens, developers submit apps
  • August 31: submission site closes; ADC2 client/scoring app goes up on Market; users begin reviewing apps
  • October (estimated): first-round judging ends
  • November (estimated): final judging ends, winners announced
照理講submission site應該在8月初就要開啟,但是好像都沒有任何官方的消息與通知。

大家不禁要問問Has ADC submission site opened?

但從這個討論中可以看到,連Google的員工都不清楚啦。

這是準備要開天窗的意思嗎?

星期一, 7月 27, 2009

使用Repo在Windows平台下載Android原始碼

昨天花了一些時間才弄好,將步驟記錄起來

1. 安裝Cygwin [1],要安裝的packages如下:
  • Net -> curl
  • Devel -> git* (git, git-completion, git-gui, gitk)
  • Libs -> libreadline6, libiconv2
  • Editors -> vim
  • Python -> python
2. 啟動Cygwin之後,開始安裝Repo[2]
  • 先在使用者的家目錄新增bin目錄
    $ cd ~
    $ mkdir bin
  • 下載Repo到bin目錄裡
    $ curl http://android.git.kernel.org/repo >~/bin/repo
    $ chmod a+x ~/bin/repo
  • 設定Repo,並新增mydroid目錄準備放檔案
    $ cd ~
    $ mkdir mydroid
    $ cd mydroid
    $ ~/bin/repo init -u git://android.git.kernel.org/platform/manifest.git
    (需要輸入一個已申請Google account的email)

  • 開始抓取所有的Android原始檔
    $ repo sync
抓好後就可以用Windows的檔案總管去瀏覽檔案囉。

延伸閱讀:更多Repo用法[3]或如何使用Eclipse[4]

星期六, 7月 18, 2009

webOS SDK開放下載


還在癡癡等著何時能夠通過webOS SDK的申請時,沒想到昨天已經開放給所有人申請後直接下載囉...而回復之前SDK申請的信函則是稍嫌沒誠意的到今天才收到。

要開始安裝SDK之前要先安裝以下軟體:
環境準備好之後可以開始安裝SDK囉
  1. 首先當然要先準備好webOS SDK [1][2]
  2. 接著先確定VirtualBox沒在跑,然後開始執行SDK安裝程式
  3. 執行模擬器:開始 -> 程式集 -> Palm ->SDK -> Palm Emulator 或者 透過Palm webOS SDK的目錄裡面的捷徑
  4. VirtualBox跑起來之後會跳出兩個對話框提醒滑鼠跟鍵盤整合情況,我是直接按掉進入模擬器畫面 XD
  5. 接著開始把玩模擬器 (溫馨小提示:Home跟End鍵可以解決很多操控上的問題,Esc和Tab鍵也不錯)


到此已可先體驗一下Palm的介面與操控感覺。下一篇再來講如何開始開發程式。

星期二, 7月 07, 2009

裝好Android SDK1.5新增第一個專案就出現錯誤

撐了很久, 一直懶得升級到Android SDK1.5, 沒想到一升級之後新增第一個專案就出現錯誤...

錯誤訊息如下
[2009-07-05 15:13:31 - APITest] no classfiles specified
[2009-07-05 15:13:31 - APITest] Conversion to Dalvik format failed with error 1

解決方法是點擊專案名稱, 按F5即可

星期一, 6月 29, 2009

初探Palm webOS



今天在癮科技上逛了一下, 看到webOS的SDK釋出了, 目前還是申請制, 在申請的同時也順便再多了解一下webOS.

Palm webOS Book from O'Reilly Media [1]

webOS integrates the power of a window-based operating system with the simplicity of a browser. Applications are built using standard web technologies and languages, but have access to device-based services and data.

You can think of webOS applications as native applications, but built from the same standard HTML, CSS and JavaScript that you'd use to develop web applications. Palm has extended the standard web development environment through a JavaScript framework that gives standardized UI widgets, and access to selected device hardware and services.

You will build WebOS applications with common web development tools following typical design and implementation practices for Ajax applications. But your webOS applications are installed and run directly on the device, just as you are used to doing with native applications.

還蠻有趣的開發方式, 開發者要使用web開發工具(HTML/CSS/JavaScript)來開發要安裝才能使用的application, 且可以存取裝置上的服務與資訊.

怎麼辦到的呢? Palm說: 謎底就是Mojo Application Framework. 這個有空再介紹~ 總之不是魔獸世界裡面打食人妖會掉的魔精就是 XD

星期六, 6月 27, 2009

Android Developers Blog: Introducing Android 1.5 NDK, Release 1

最近都在忙RoR Web的事情, 比較少注意Android, 沒想到NDK已經出來囉, 看來是配合Google Android Developer Challenge 2而釋放出來的. 有機會再找時間研究一下囉


Android Developers Blog: Introducing Android 1.5 NDK, Release 1

星期一, 6月 22, 2009

如何使用 SyntaxHighlighter

版面配置 -> 修改HTML, 捲到最後

</body></html>


再把下面這段程式加入上面那段之前
















星期五, 6月 19, 2009

OOPS?! rdiscount is not working on Windows

雖然我所使用的NB是Windows, 但因為我一直是連上server side (Ubuntu)去安裝系統與修改程式, 我的NB上並沒有開發RoR的環境, 因此一直沒發現這個問題, 一直到我們家的工程師試圖要在他的電腦上安裝測試環境才發現這個問題: rdiscount這個gem裝不起來!!!

他把這情況跟我回報, 我本來一直以為是他沒設定好或是有gem安裝順序造成的相依性問題, 但在我試圖幫他安裝卻還是一直出現錯誤, 後來努力一陣搜尋之後才發現:

rdiscount不能在Windows平台上運作?!?!

沒錯... 只要你拿到的程式有使用到這個gem, 那就暫時不要想能在Windows上執行了

細節可以參考下列的討論[1] [2] [3], 最無言的是有人問說rdiscount on Windows不work怎麼辦? 其中一個很OOXX的回覆是 rdiscount 只能在Mac and GNU/Linux systems運作喔, Windows請找替代方案...

那ridscount又是甚麼呢? ridscount是Markdown的一種實作, 簡單來說, 就是讓你想輸出在web page的文字 轉換成不會造成HTML crash的字元的一個小程式.

感覺RoR就是一個Windows不friendly的東西, 我不愛Windows, 但是這種平台支援程度我覺得算是很基本的. 系統環境以Windows為主的公司要使用RoR可千萬要三思. 我想rdiscount應該不會是不支援的唯一特例.

目前我所看到的RoR developers都是使用Mac Book, 且Ruby從TIOBE上看來與Mac OS X的成長正相關, 使用族群的特性也許該特別注意一下囉!

星期一, 6月 15, 2009

RoR中時區處理的問題

問題一開始是出現在一段很簡單也很常需要使用的程式碼, 程式希望撈出該年月所含括的資料. 資料庫裡面存的時間時區是UTC.

我們原先從vendor得到的程式碼如下, 但是運作一直不是很正常, 撈出來的資料總是有問題, 但vendor卻始終認為該程式碼沒有錯誤.

date1 = Date.new(year, month, 1)
date2 = Date.new(year, month, -1)
self.find(:all, :conditions => ["start_at >= ? and start_at <= ?", date1.beginning_of_day, date2.end_of_day] )

要求fix bug未果, 不得以只好自己動手, 台灣的時區是UTC+8, 因此當我們想要撈出所有台灣時區2009/6的資料時, 所需要下的SQL stmt其實是 2009-06-01 00:00:00+0800與2009-06-30 23:59:59+0800等同於2009-05-31 16:00:00+0000與2009-06-30 15:59:59+0000不幸的是, 上面這段程式碼並無法正常的運作.


>> puts Time.zone
>> puts date1.beginning_of_day.zone
>> puts date1.beginning_of_day
>> puts date1.beginning_of_day.to_s(:db)
>> puts date1.beginning_of_day.in_time_zone(Time.zone).zone
>> puts date1.beginning_of_day.in_time_zone(Time.zone)
>> puts date1.beginning_of_day.in_time_zone(Time.zone).to_s(:db)
>> puts Date.parse("2009-6-01T00:00:00+00:00").beginning_of_day.in_time_zone(Time.zone).strftime("%Y-%m-%d %H:%M:%S")


=> (GMT+08:00) Taipei
=> CST
=> 2009/06/01 12:00 AM
=> 2009-06-01 00:00:00
=> CST
=> 2009/06/01 12:00 AM
=> 2009-05-31 16:00:00
=> 2009-06-01 00:00:00

=> (GMT+10:00) Hobart
=> CST
=> 2009/06/01 12:00 AM
=> 2009-06-01 00:00:00
=> EST
=> 2009/06/01 2:00 AM
=> 2009-05-31 16:00:00
=> 2009-06-01 02:00:00

=> (GMT+00:00) UTC
=> CST
=> 2009/06/01 12:00 AM
=> 2009-06-01 00:00:00
=> UTC
=> 2009/05/31 4:00 PM
=> 2009-05-31 16:00:00
=> 2009-05-31 16:00:00

=> (GMT-10:00) Hawaii
=> CST
=> 2009/06/01 12:00 AM
=> 2009-06-01 00:00:00
=> HST
=> 2009/05/31 6:00 AM
=> 2009-05-31 16:00:00
=> 2009-05-31 06:00:00

剛看到Taipei部分的結果, 還以為使用date1.beginning_of_day.in_time_zone(Time.zone).to_s(:db)這段是可以正常運作的, 但是多測了幾個時區之後, 發現還是有問題, 無論設定任何時區, 永遠都得到2009-05-31 16:00:00這樣的值

而唯一會變動的兩個值是date1.beginning_of_day.in_time_zone(Time.zone)和Date.parse("2009-6-01T00:00:00+00:00").beginning_of_day.in_time_zone(Time.zone).strftime("%Y-%m-%d %H:%M:%S"), 但很奇怪的是, 這兩個數值變動的基礎都是先減8小時之後再計算與台灣地區的時差, 即使第二段程式是直接提供一個"2009-6-01T00:00:00+00:00"的時間, 希望能得到一個UTC時間之後再作計算, 但結果依然是失敗的.

後來在網路上好一陣搜尋之後, 才赫然發現這是個bug (or issue?)
https://rails.lighthouseapp.com/projects/8994/tickets/2479-inconsistant-time-zone-handling

文中的例子如下, 可以看出Date有時區處理的問題:


>> Date.today.beginning_of_day
=> Fri Apr 10 00:00:00 -0500 2009
>> Time.zone.now.beginning_of_day
=> Fri, 10 Apr 2009 00:00:00 CDT -05:00
>> Date.today.beginning_of_day == Time.zone.now.beginning_of_day
=> true

>> Person.all :conditions => [ "created_at > ?", Date.today.beginning_of_day ]
=> Generated SQL => SELECT * FROM "people" WHERE (created_at > '2009-04-10 00:00:00')

>> Person.all :conditions => [ "created_at > ?", Time.zone.now.beginning_of_day ]
=> Generated SQL => SELECT * FROM "people" WHERE (created_at > '2009-04-10 05:00:00')


簡單說就是要用Time來取得的時間才會是你要的, 因此將原先的程式修改為下面這樣就搞定啦!


fmTime = Time.zone.local(year, month, 1, 0, 0, 0)
toTime = Time.zone.local(year, month, -1, 23, 59 ,59)
self.find(:all, :conditions => ["start_at >= ? and start_at <= ?", fmTime, toTime] )

>> puts Time.zone
>> puts fmTime.to_s(:db)
>> puts toTime.to_s(:db)


=> (GMT+08:00) Taipei
=> 2009-05-31 16:00:00
=> 2009-06-30 15:59:59

=> (GMT+00:00) UTC
=> 2009-06-01 00:00:00
=> 2009-06-30 23:59:59

=> (GMT-10:00) Hawaii
=> 2009-06-01 10:00:00
=> 2009-07-01 09:59:59

如此終於搞定一個邏輯上很簡單處理的bug... RoR還是讓我很無言...

星期六, 6月 13, 2009

SVN小記

SVN Create Repository

> sudo svnadmin create /opt/svn/test

設定檔修改

/opt/svn/test/conf/svnserver.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz

/opt/svn/test/conf/passwd
[users]
admin = admin
user1 = user1
user2 = user2
test = test

/opt/svn/test/conf/authz
[groups]
Admin = admin
User = user1, user2
Test = test1

[/]
@Admin = rw
@User = r

[/web]
#讓@Test只能讀寫/web下面的東西
@Admin = rw
@User = r
@Test = rw

星期五, 6月 05, 2009

RoR的restful_authentication plugin在IE 8上的問題


今天網站在作測試時, 有人反映IE 8無法正確的導到login畫面, 而會跳出這個畫面, 找到原因是因為IE 8有時會送出空的HTML Accept header而使得程式跑到format.any這個區塊, 因此會造成跟其他瀏覽器不一樣的情況.

一個簡單的修改方法是將lib/authenticated_system.rb中原本這段
def access_denied
respond_to do |format|
format.html do
store_location
redirect_to new_session_path
end
format.any do
request_http_basic_authentication 'Web Password'
end
end
end

改為下面這樣, 因為我們暫時沒有其他的format, 所以使用format.any來作判斷
 def access_denied
respond_to do |format|
format.any do
store_location
redirect_to new_session_path
end
end
end
這樣就可以正確的進入login畫面囉.

星期日, 5月 17, 2009

JUnit 4.x初體驗

JUnit 4.x之後可使用Annotation, 因此已可將程式碼與測試程式碼混雜在同一個.java檔, 也不再需要extends TestCase, 但為了避免混亂, 還是將測試程式碼分開來比較好

建立測試程式的方式也很簡單, 使用Eclipse, 在想要撰寫測試程式碼的.java檔上按右鍵, 然後[New -> Other... -> Java -> JUnit -> JUnit Test Case]


選取JUnit 4, 要放置的路徑, 以及勾選一些希望自動產生的程式碼


勾選一些要測試的method

完成後就可以看到測試程式檔已經產生, 也帶有一些自動產生的method區塊並有著下列的Annotations之一

@BeforeClass => 產生class的實例之前呼叫, 為static method, 同一個測試class只會呼叫一次
@AfterClass => 銷毀class的實例之後呼叫, 為static method, 同一個測試class只會呼叫一次
@Before => 一個測試method會產生一個測試class實例, 因此每個測試method執行都會呼叫一次
@After => 一個測試method會產生一個測試class實例, 因此每個測試method執行都會呼叫一次
@Test => 測試method, 可以不用testXXX()當prefix, 但建議還是使用.

注意: 因為一個測試method會產生一個測試class實例, 因此若有變數需要在不同method之間傳遞, 要先將變數宣告為static才行.

要執行此測試程式的方法有兩個
  1. 在測試程式上按右鍵, [Run As -> JUnit Test]
  2. 在專案上按右鍵, [Run As -> JUnit Test], 這樣會執行這專案內所有的測試程式, 要注意!

星期五, 5月 15, 2009

將JMeter改為英文介面


JMeter若不設定的話, 會使用作業系統的預設語系, 一直看到那殘破不缺的中文, 實在是很令人扼腕, 而且時有時無的翻譯常常會讓人看不出所代表的是甚麼東西...

今天花了不少時間在玩弄JMeter, 雖然可以透過功能列來作語系的設定, 但總是會看到中英文夾雜的狀況, 而且每次重新啟動都要再修改一次, 終於忍不住將它改成啟動時就跑英文介面, Disable=不致能...真的很囧...


修改的方法很簡單.

[bin/jmeter.properties]
language=en

加上這行再重新啟動就可以囉.

慢慢上手後, 覺得真的不錯用, 雖然不像XXXrunner那麼強大, 但作為Web系統的功能測試已很足夠, 也可以做壓力測試, 功能選項中有Remote Start的選項, 雖然還沒研究要如何設定, 不過看來要做強度很大的分散式壓力測試也不是難事.

JMeter samplers include:

  • FTP Request
  • HTTP Request
  • JDBC Request
  • Java object request
  • LDAP Request
  • SOAP/XML-RPC Request
  • WebService (SOAP) Request

星期三, 5月 13, 2009

GWT初體驗

GWT stands for Google Web Toolkit.

最近真的很多初體驗... 目前考慮要不要把Spring也拉進來體驗一番...

言歸正傳, 我想大家都知道關聯性資料庫通常是系統效能的瓶頸, 增加資料庫伺服器數量對於運算能力的增加有限, 更換資料庫更是一場災難, 還好我們可用Hiberante之類的架構來改善這些問題. 但Web UI的部分呢? AJAX解決了不停換頁所造成的頻寬浪費, 但是卻依然遭遇各家瀏覽器對於HTML, JavaScript, CSS支援程度不一的問題, 解決這類問題可說是相當煩人又曠日廢時, 因此更該使用一些框架來增加開發效率, 畢竟很多狀況都有人幫忙測試過了.

雖然我對於HTML, JavaScript, CSS皆有一定的熟悉度, 但我對JavaScript一向不太喜愛, 因此JQuery, Ext, Yahoo UI Library, Rico... 等方案都不在我的選擇之中, Flash/ Flex解決方案也曾接觸過, 但ActionScript很類似JavaScript, 因此也出局.

而GWT透過Java程式來產生JavaScript的方式就很符合我的需求, 相容性交給Google的工程師去傷腦筋, 除了GWT之外, JSF, ZK其實也算某種程度滿足我的需求, 但因為Android是公司的重點目標, 我目前認為GWT與Android的UI開發經驗是可以互通的, 再加上GAE也可使用GWT, 因此選擇GWT.

從安裝SDK到開啟第一個專案, 根據GWT官網上的 Quick Start 基本上沒有問題. 不過後來想自己修修改改的時候就遇到問題了, 枉費我這次有比較努力看一下文件...

  • Module, Endpoint, .gwt.xml, .nocache.js不太好搞懂, 我花了不少時間才覺得掌握了一點, 現在可以在一個html上讀入兩個Modules, 使用兩個Endpoints
  • GWT (client)並不完全支援J2SE與J2EE規格
  • GWT可運用RPC架構來處理事務, server端的程式就不受上述的限制
  • 建立專案時所帶的範例程式碼可以幫助你了解RPC的運用, 而若想快點感受GWT的威力, 我推薦SDK裡面的Mail範例

一個html上讀入兩個Modules, 使用兩個Endpoints的畫面

明天來評估要用GWT直接呼叫Web Services還是要透過RPC來實作.

星期一, 5月 11, 2009

Hibernate設定連接池的問題

設定連接池時, 遇到兩個問題

1. Hibernate並未使用所設定的C3P0連接池, 出現下列訊息
INFO [org.hibernate.connection.DriverManagerConnectionProvider] - Using Hibernate built-in connection pool (not for production use!)

解決方法是在hibernate.cfg.xml裡面加入這行
<property name="connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>


2. 連接池程式無法正確使用Log4J的錯誤訊息
log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog).
log4j:WARN Please initialize the log4j system properly.

雖然說warning不是很要緊, 但是看到這樣的訊息還是讓我很想處理掉這個狀況.

解決方法很簡單, 在log4j.properties裡加入這行

log4j.logger.com.mchange.v2=INFO, A1

P.S. A1是我設定的appender

星期五, 5月 08, 2009

Hibernate初體驗

資料庫一向是我特別有興趣的部分, 但Hibernate卻一直沒好好研究與使用, 除了是對於自己既有技能的依賴, 另外也是不想因為framework而失去某些彈性. 但現在Hibernate支援了JPA(EJB3.0規格中的重點之一), 所以系統若需要分散式架構時也可以很容易的擴充, 另外JPA也可以使用在GAE上, 因此現在學習使用Hibernate可說是非常有利的時機點.

我先閱覽了 良葛格學習筆記, 受益良多, 也對於Hibernate有一個快速的認識 (這幾年來, 我應該是第四次看這個網站上的Hibernate介紹了, 站主真的很用心, 更新的也很快).

不過接下來的實作練習還是吃了不少苦頭, 因為
  • 我不喜歡重頭開始刻程式, 所以看到Hibernate Tool可以從資料庫反轉產生code就覺得非用不可
  • 我並不想認識原來的Hibernate, 也就是還需要*.hbm.xml的寫法
  • Hibernate的JPA實作包括 Annotations 和 EntityManager, 我並不清楚這兩者的關係以及與EJB的關聯性
  • 我也沒搞懂persistence.xml 和 hibernate.cfg.xmlx兩者的關係以及與EJB的關聯性, 連要放哪個目錄下都不知道
  • 一堆相依的libraries也沒搞懂
  • 因為需求的關係, 目前我只想使用Tomcat, 並不想使用JBoss/ Glassfish
  • 我不想使用command line來跑Ant之類的東西, 一心只想使用Eclipse來操作
  • 我甚至也不知道Hibernate可以不在AP server/ Web server跑, 哈哈
  • 我一向沒看完使用者手冊的習慣... 真糟糕的習慣...
綜合以上就讓我吃足了苦頭, 雖然後來都搞清楚了, 也發現在良葛格學習筆記中其實大部分都已說得很清楚, 不過這樣try-error的過程中也算是快速累積經驗吧, 哈哈...

另外試著跑自己想要的SQL statement和子查詢, 結果也是ok的.

初體驗的結論是, 目前看來一切都很不錯. 要繼續深入研究下去囉!

星期二, 5月 05, 2009

GAE初體驗

今天終於拿到GAE for Java的使用許可

因為我們已經全部使用Eclipse當作開發工具, 所以透過 http://code.google.com/appengine/docs/java/tools/eclipse.html 所介紹的步驟來安裝 Google Plugin for Eclipse, 這邊不贅述.

我是使用 Eclipse 3.4 (Ganymede) for J2EE的版本. 安裝好之後工具列上會多三個小圖示


點第一個小圖示可以產生一個新的GAE project.




產生出來的專案可以馬上部屬到申請的GAE空間, 最簡單的方法是按那個長得像小飛機的按鈕.




上傳前必須填一些認證資料.




接著要設定application ID, 其實也就是申請時所設定的 http://xxx.appspot.com/ 的那個xxx. 一個人可以設定10個.




ok, 現在可以上傳了



上傳需要花一點時間, 上傳完成後就可以看看甚麼也沒做就完成的東西啦.


接著就是要找時間玩一下其他支援的功能囉. 開小飛機的初體驗還蠻有趣的 :D

星期一, 5月 04, 2009

關於GAE中用來儲存資料的兩個標準 (JDO, JPA)

話說昨天看了一下GAE的說明得知, 若要在GAE上儲存資料必須要使用JDO或JPA這兩種技術... 但是其實這兩種技術我都不會, 哈哈~ 一直都還在用很老舊的架構 Session Bean <-> DAO <-> JDBC <-> DB, 因為我喜歡使用很華麗的SQL statement來提高資料存取的速度, 曾經我也使用過Entity Bean來開發J2EE的系統, 那根本是場災難... 也造成我一直對於所謂的frameworks有點敬而遠之 (Struts, Webwork, Spring, Hibernate... etc), 且也不希望增加版本更新的困擾 (光Tomcat要不要upgrade都可以讓我考慮好幾天), 因此都只有大概看看文件, 了解一下這些frameworks存在的必要性而已.

Anyway, 在GAE上儲存資料必須要使用JDO或JPA這兩種標準, 所以我今天花了點時間研究一下, Google上是採用 Datanucleus的solution, 但這時還不曉得這個solution是甚麼, 接著上網查到 http://en.wikipedia.org/wiki/Datanucleus中有這一段: DataNucleus Access Platform is the persistence layer behind Google App Engine for Java. 原來這個 plateform同時支援JDO跟JPA兩個標準, 因此想用哪個就用哪個囉.

另外也看到Hibernate主要是JPA的實作, 因此若使用JPA可算是有摸蜆仔兼洗褲的作用. 以後若有機會使用Hibernate的話, 不妨就使用JPA來儲存資料吧.

不過看到以下那一堆unsupported features... 很多features我看不太懂是甚麼意思, 不過不能join不能aggregrate?! 不會吧~~ 那我要資料總筆數怎麼作咧... 還是說有method可以用? 看來只好等空間拿到手再來好好試用一下.

Edit 1: 剛又多研究了一下, 知道資料總筆數要用 datastore.prepare(query).countEntities()來取得, 也就是說, 基本上資料應該已經全部從資料庫給拉出來了, 這樣若有需要作報表系統的話, 效能堪慮阿...

Unsupported Features of JDO

The following features of the JDO interface are not supported by the App Engine implementation:

  • Unowned relationships. You can implement unowned relationships using explicit Key values. JDO's syntax for unowned relationships may be supported in a future release.
  • Owned many-to-many relationships.
  • contains() syntax for query filters on Collection fields. You can test that a multi-valued property (a Collection field) has a value using an equality filter: collection == "value"
  • "Join" queries. You cannot use a field of a child entity in a filter when performing a query on the parent kind. Note that you can test the parent's relationship field directly in query using a key.
  • JDOQL grouping and other aggregate queries.
  • Polymorphic queries. You cannot perform a query of a class to get instances of a subclass. Each class is represented by a separate entity kind in the datastore.
  • IdentityType.DATASTORE for the @PersistenceCapable annotation. Only IdentityType.APPLICATION is supported.
  • There is currently a bug preventing preventing persistent fields on superclasses from being saved to the datastore. This will be fixed in a future release.


Unsupported Features of JPA

The following features of the JPA interface are not supported by the App Engine implementation:

  • Owned many-to-many relationships, and unowned relationships. You can implement unowned relationships using explicit Key values, though type checking is not enforced in the API.
  • "Join" queries. You cannot use a field of a child entity in a filter when performing a query on the parent kind. Note that you can test the parent's relationship field directly in query using a key.
  • Aggregation queries (group by, having, sum, avg, max, min)
  • Polymorphic queries. You cannot perform a query of a class to get instances of a subclass. Each class is represented by a separate entity kind in the datastore.

星期六, 5月 02, 2009

看來挺有搞頭的Google App Engine

今天忙著在GWT, Ext-GWT, ZK中奮鬥,想了解到底哪一個AJAX framework比較適合我們公司使用, 目前看來是使用GWT多少可以與Android上的開發經驗相結合.

但突然想到如何與視覺化介面設計師 (據說是高級系統美工的雅稱)配合的問題, 畢竟這是web系統開發通常最痛苦的地方所在, 在網路上瀏覽資料, 似乎有還不錯的解法, 不過這不是本篇的重點, 重點是突然發現Google App Engine (GAE)這個有趣的東西, GAE剛滿周歲不久 (一年後才發現, 哈哈), 更巧的是最近剛開始開放支援Java, 也可以支援cron (scheduled tasks). 資料儲存則可以用Java Data Objects (JDO) 和 Java Persistence API (JPA), 還有其他的服務如Memcache, Expand URL FetchURL Fetch, Expand Mail, Expand Images, Expand Google Accounts, 感覺功能相當完整, 以前蠻難找到可以作Java hosting的虛擬主機, 免費的更少, GAE看來提供一個很不錯的解決方案.

使用 Android + RESTful + Google Data API + GAE 組合出有價值的服務, 看來不是夢阿!

其實覺得自己的行為還蠻像internet spider的 XD