當兵時記得有首打油詩
我有兩支槍,長短不一樣,長的打xx,短的打xx.
xx我忘記了.
現在電腦時代,筆者改寫為
我有兩個腦,大小不一樣,大的裝家裡,小的放口袋.
宏達電 Magic 就是放在口袋裡的電腦,
大電腦與小電腦靠雲端運算連接,分工合作,例如演講,使用桌上型電腦建立Google Doc文件,放置於雲端,然後用Magic,瀏覽Doc文件.
2009年6月27日 星期六
宏達電 Magic 不只是一台手機
2009年6月22日 星期一
發布Android 手機程式
口袋裡放著一台2萬元手機,就像帶一台電腦一樣,不能讓他閒著,寫些日常生活程式.去外地要回家時,不曉得幾點有火車,如果手機能告訴我,最近15班列車時刻,該多方便.
mywoo火車時刻表,即時動態查詢最近15班列車,發布於Android Market.
筆者法律科班出身,不能忘本,推出mywoo六法全書,法條存放於Amazon EC2,手機以程式連線,顯現螢幕,不儲存於手機,支援法規名稱查詢,宏達電magic中文輸入使用手寫辨識功能,正確率高,蠻好用,讓你隨時取得法律資訊.
日本與中國用手機上網人數比電腦多,未來手機上網會成主流,程式設計觀念必須調整.
如果你有magic ,至market搜尋 mywoo,即可免費下載程式
2009年6月18日 星期四
宏達電 HTC Magic
新台幣20900元,為了寫Android程式,買了一支HTC Magic,實在太貴了.
中華電信贊助三個月免費上網,及續約12個月5折優待,不無小補.
智慧型手機未來必須降到6000元以內,上網費500元以內,才有機會普及.
程序員必須走在前端,花時間寫免費軟體,讓市場活絡起來.
Android程式必須與Google App Engine ,Amazon EC2結合,才能走向雲端運算.
2009年5月31日 星期日
Google App Engine JDO之 Entity Groups
BigTable為多人,同時,共同使用之網路資料庫,儲存,更新資料時,必須用Transactions,才不會錯誤.
Transactions必須每一筆資料都屬同一Entity Groups,如何設定每筆資料之Entity Groups,方法有三:
1.設定 owened 一對一,一對多時,自動設定為同一Entity Groups
2.用KeyFactory.Builder addChild,用KeyFactory createKey 或 Key getChild,但是必須指定不重複之name.
3.使用datanucleus之Extension
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
@Extension(vendorName="datanucleus",key="gae.parent-pk",value="true")
private Key customerKey;
將 parent key set至customerKey,儲存後自動產生Entity Groups,不必指定不重複之name.
設定Entity Groups時,child 的 PrimaryKey 不能為Long或非 encoded之 String.
2009年5月27日 星期三
Amazon SimpleDB 支援全文檢索
Amazon SimpleDB支援SQL語法中 like '%查詢字%',每個欄位可儲存1024bytes,以UTF-8中文3bytes,可儲存341字,每個SELECT 最多20個欄位,所以可索引6820中文字,方法為將全文儲存於Amazon S3,然後將全文以341字為單位,分割為數個欄位,儲存於Amazon SimpleDB,使用 select * from yourdomain where columnA like '%查詢字%' or columnB like '%查詢字%' ....
Amazon說明此種方式是 expensive operation,很花費查詢時間,Amazon 計費以Machine Hour計算.
筆者以法拍屋拍定資料查詢,速度非常快.
2009年5月25日 星期一
Google App Engine Bigtable 之Indexes
使用Eclipse 編譯GAE Java版,datastore之indexes自動生成,存放於datastore-indexes-auto.xml,當你啟動localhost:8080時,datastore-indexes-auto.xml全部清空,你必須靠瀏覽器一一操作各項功能,才會產生各個kind 所需之indexes,筆者常犯錯誤是啟動localhost,關閉,上傳至Google App Engine,datastore-indexes-auto.xml是空的,所以server 賞你 500 error.
並不是每次上傳均須操作各功能,indexes於Google App Engine 建立一次即可,新增kind查詢功能,上傳時即須注意此點.
2009年5月18日 星期一
Google App Engine Bigtable 一對一
Google Bigtable 大表哥,如果是水,那JDO就是魚.
JDO 支援一對一(owned),範例如下:
public class Employee {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String name;
@Persistent
private Info info;
......
pubic Info getInfo() {
return info;
}
pubic String getName() {
return name;
}
}
public class Info {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key id;
@Persistent
private String city;
@Persistent
private String address;
@Persistent(mappedBy = "info")
private Employee employee;
.......
pubic employee getEmployee() {
return employee;
}
pubic String getAddress() {
return address;
}
}
取出資料時,傳統關聯資料庫是 select a.name,b.address from Employee a join Info b on a.id=b.employeeid,
大表哥使用JDO更簡單,範例如下:
Datastore.java
package guestbook;
public Datastore() {}
public List getGreetings() {
String query = "select from " + Employee.class.getName();
Listgreetings = (List ) pm.newQuery(query).execute();
pm.detachCopyAll(greetings);
pm.close();
return greetings;
}
guestbook.jsp file
<%@ page isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<jsp:useBean id="gbook" class="guestbook.Datastore"/>
<c:forEach var="item" items="${gbook.greetings}">
<p>${item.name}</p>
<p>${item.info.address}</p>
<c:/forEach>
查詢住在台北市員工時,傳統關聯資料庫是 select a.name,b.address from Employee a join Info b on a.id=b.employeeid where b.city='台北市'
大表哥使用JDO不支援join查詢,必須直接查詢 Info,範例如下:
Datastore.java
package guestbook;
public Datastore() {}
public List getGreetings() {
javax.jdo.Query query = pm.newQuery(Info.class);
query.setFilter("city == '台北市'");
Listgreetings = (List ) query.execute();
pm.detachCopyAll(greetings);
pm.close();
return greetings;
}
guestbook.jsp file
<%@ page isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<jsp:useBean id="gbook" class="guestbook.Datastore"/>
<c:forEach var="item" items="${gbook.greetings}">
<p>${item.employee.name}</p>
<p>${item.address}</p>
<c:/forEach>