//設定要取得的欄位 Setfields = new HashSet (); fields.add(ProfileField.SEX.fieldName()); //性別 fields.add(ProfileField.NAME.fieldName()); //姓名 fields.add(ProfileField.BIRTHDAY.fieldName()); //生日 fields.add(ProfileField.PIC_SMALL.fieldName()); //大頭照 //取得所有朋友的Uid List friendsUid = client.friends_get().getUid(); //取得使用者資訊 List users = client.users_getInfo(friendsUid, fields).getUser(); for(User user:users) { user.getSex(); //男:male 女:female user.getName(); user.getBirthday(); user.getPicSmall(); //大頭照圖片網址 }
2009年12月30日 星期三
建立Facebook應用程式 Java API (5) - 取得朋友Profile內的資料
2009年12月22日 星期二
建立Facebook應用程式 Java API (4) - 發佈通知及張貼訊息到塗鴨牆
利用Facebook API可以發佈通知給使用者的朋友,也可以貼訊息到使用者的塗鴨牆上。
1. 發佈通知給使用者的朋友
2. 貼訊息到使用者的塗鴨牆上
1. 發佈通知給使用者的朋友
List reciver = new ArrayList(); reciver.add(friendsUID); client.notifications_send(reciver, "msg");
2. 貼訊息到使用者的塗鴨牆上
// 貼訊息到使用者的塗鴨牆上(每個使用者一日限十篇) // 設定張貼的訊息 Attachment attachment = new Attachment(); attachment.setName("Name"); //設定Name的超連結位址 attachment.setHref("http://www.google.com.tw/"); attachment.setCaption("caption"); attachment.setDescription("yahoo description\ntest"); //加入圖片 AttachmentMediaImage attachmentMediaImage = new AttachmentMediaImage("http://www.google.com.tw/intl/en_com/images/logo_plain.png", "http://www.google.com"); attachment.setMedia(attachmentMediaImage); //ActionLink是會出現在'留言 · 讚'後面的超連結(只有發佈到自己的塗鴨牆才會出現) ListactionLiks = new ArrayList (); BundleActionLink bundleActionLink = new BundleActionLink("yahoo", "http://tw.yahoo.com"); actionLiks.add(bundleActionLink); //發佈到塗鴨牆 client.stream_publish("This is a Java API Test.", attachment, actionLiks, null, null);
2009年12月20日 星期日
建立Facebook應用程式 Java API (3) - 利用API取得使用者相關資訊
透過Facebook API可以取得使用者Profile內的資料(除了Email)、使用者所有朋友的Profile資料(如:名子、性別、圖片…)以及和應用程式相關的資料。
String sessionKey = request.getParameter("fb_sig_session_key"); FacebookJaxbRestClient client = new FacebookJaxbRestClient(apiKey, secret, sessionKey); //使用者UID Long userId = client.users_getLoggedInUser(); //使用者的所有friends ListfriendsUID = client.friends_get().getUid(); //使用者friend的分類 List friendLists = client.friends_getLists().getFriendlist(); //有使用此應用程式的friends List appUsers = client.friends_getAppUsers().getUid(); //檢查應用程式是否有發佈訊息到使用者塗鴨牆的權限(也可利用此方法來檢查其它權限) boolean publish = client.users_hasAppPermission(Permission.PUBLISH_STREAM); //使用者授權的連結 String url = Permission.authorizationUrl(apiKey, Permission.PUBLISH_STREAM);
2009年12月15日 星期二
建立Facebook應用程式 Java API (2) - 開始使用Java API
1. 下載Java API
2. 將所需的Jar檔匯入
3. 建立一個Servlet(此Servlet的位址需是Canvas Callback URL)
4. 撰寫此Servlet
a. 藉由fb_sig_session_key參數來判斷該FB使用者是否有加入此應用程式
String sessionKey = request.getParameter("fb_sig_session_key");
b. 若sessionKey為null則表示該FB使用者未加入此應用程式,則將網頁重新導向到要求允許存取頁面
<script type='text/javascript'>
parent.location.href='http://www.facebook.com/login.php?v=1.0&api_key=[your_api_key]&
next=[Canvas Callback URL]&canvas=';
</script>
c. 若sessionKey不為null,則可使用api_key, secret, seessionKey來取得FacebookJaxbRestClient
FacebookJaxbRestClient client = new FacebookJaxbRestClient(api_key, secret, seessionKey);
2. 將所需的Jar檔匯入
3. 建立一個Servlet(此Servlet的位址需是Canvas Callback URL)
4. 撰寫此Servlet
a. 藉由fb_sig_session_key參數來判斷該FB使用者是否有加入此應用程式
String sessionKey = request.getParameter("fb_sig_session_key");
b. 若sessionKey為null則表示該FB使用者未加入此應用程式,則將網頁重新導向到要求允許存取頁面
<script type='text/javascript'>
parent.location.href='http://www.facebook.com/login.php?v=1.0&api_key=[your_api_key]&
next=[Canvas Callback URL]&canvas=';
</script>
c. 若sessionKey不為null,則可使用api_key, secret, seessionKey來取得FacebookJaxbRestClient
FacebookJaxbRestClient client = new FacebookJaxbRestClient(api_key, secret, seessionKey);
2009年12月13日 星期日
建立Facebook應用程式 Java API (1) - 申請應用程式
1. 加入開發人員應用程式
2. 建立一個新的應用程式
3. 輸入應用程式名稱
4. 記住自己應用程式的ID, API key, Secret
5. 選擇畫布(Canvas),並輸入你的Canvas url(需小寫)及你的server的url
6. 應用程式的細節
2. 建立一個新的應用程式
3. 輸入應用程式名稱
4. 記住自己應用程式的ID, API key, Secret
5. 選擇畫布(Canvas),並輸入你的Canvas url(需小寫)及你的server的url
6. 應用程式的細節
2009年12月2日 星期三
Android學習筆記 - 安裝Netbeans 6.7 Android Plugin
1. 選擇Tools -> Plugins
2. 選擇Setting並按下新增
3. 輸入Plugin的URL http://kenai.com/downloads/nbandroid/updates.xml
4. 到Avalible Plugins找到Android並安裝
5. 安裝完成後,新增一個Android的專案
6. 選擇Manage Platforms
7. 新增一個Android Platform
8. 選擇Android SDK的安裝位置
9.選擇要使用的Target
2. 選擇Setting並按下新增
3. 輸入Plugin的URL http://kenai.com/downloads/nbandroid/updates.xml
4. 到Avalible Plugins找到Android並安裝
5. 安裝完成後,新增一個Android的專案
6. 選擇Manage Platforms
7. 新增一個Android Platform
8. 選擇Android SDK的安裝位置
9.選擇要使用的Target
2009年12月1日 星期二
Imperatives and infinitives for giving suggestions
- Be sure (not) to
- Don't forget (not) to
- Make sure (not) to
- Remember (not) to
- Try (not) to
2009年11月30日 星期一
Tomcat自動Reload Servlet
- 修改conf/servler.xml,並在host的tag內加入以下設定。
VMware修改MAC Adress
- 找到目錄下的.vmx檔
- 找到該檔內的二行程式 ethernet0.addressType = "generated"
ethernet0.generatedAddress = "00:00:00:87:65:43"
- 將這二行程式替換成 ethernet0.addressType = "static"
ethernet0.address = "00:00:00:87:65:44"
2009年11月29日 星期日
Tomcat上設定SSL雙向驗證
1. 在Server.xml裡SSL的Connector tag內加入clientAuth="true"這個屬性,此屬性表示所有走SSL的Client都需驗證它的憑證是否為Server所信任的。
2. 若在Server.xml無設定truststoreFile屬性等相關資訊時,則Client只要使用任何正確的憑證即可進入網頁。
3. 若要限定Client的憑證是特定CA所發出的憑證,則需要設定truststoreFile屬性等相關資訊。並將所信任的CA的憑證,利用keytool匯入到truststoreFile(此範例為.keystore)。
<Connector port="4443" minSpareThreads="5" maxSpareThreads="475" enableLookups="true"
disableUploadTimeout="true" acceptCount="500" maxThreads="1000" scheme="https"
secure="true" SSLEnabled="true" keystoreFile="/.keystore"
keystorePass="admin123" sslProtocol="TLS" URIEncoding="UTF-8" clientAuth="true"
truststoreFile="/.keystore" truststorePass="admin123" truststoreType="JKS" />
PS. JKS為Java Key Store,也可以用另一種類型PKCS12disableUploadTimeout="true" acceptCount="500" maxThreads="1000" scheme="https"
secure="true" SSLEnabled="true" keystoreFile="/.keystore"
keystorePass="admin123" sslProtocol="TLS" URIEncoding="UTF-8" clientAuth="true"
truststoreFile="/.keystore" truststorePass="admin123" truststoreType="JKS" />
2. 若在Server.xml無設定truststoreFile屬性等相關資訊時,則Client只要使用任何正確的憑證即可進入網頁。
3. 若要限定Client的憑證是特定CA所發出的憑證,則需要設定truststoreFile屬性等相關資訊。並將所信任的CA的憑證,利用keytool匯入到truststoreFile(此範例為.keystore)。
2009年11月25日 星期三
Cross Site Scripting(OWASP A2)
1. 攻擊手法
利用網站發佈Script,而且這些Script是其它使用者也會看的到,進而達到跨網站攻擊。
攻擊者通常會利用此手法來劫持其它使用者的sessions、或是重新導向到惡意網站。
2.
3. 如何防止XSS
a. 利用在Cookie內設定HttpOnly來減少系統發生XSS的可能性。
因為在Cookie內設定HttpOnly之後此Cookie就無法透過Javascipt去讀取。
利用網站發佈Script,而且這些Script是其它使用者也會看的到,進而達到跨網站攻擊。
攻擊者通常會利用此手法來劫持其它使用者的sessions、或是重新導向到惡意網站。
2.
3. 如何防止XSS
a. 利用在Cookie內設定HttpOnly來減少系統發生XSS的可能性。
因為在Cookie內設定HttpOnly之後此Cookie就無法透過Javascipt去讀取。
A phrasal Verbs
1. A phrasal Verbs:由動詞加介系統所組成的一個動詞,而且很難從它的動詞去猜它的真正的意思。
2. Example:
put sth away:物歸回位
hang sth up:將東西掛上
2. Example:
put sth away:物歸回位
hang sth up:將東西掛上
2009年11月24日 星期二
Unvalidated Redirects and Forwards(OWASP A8)
1. 攻擊手法
攻擊者利用網站未經過驗證的Redirect和Forward進行攻擊。
a. 未經過驗證的Redirect:攻擊者可以利用此弱點欺騙使用者點選連結並重新導向到惡意網址。
Example: http://www.google.com/redirect.jsp?url=hacker.com/malware.exe
b. 未經過驗證的Forward:攻擊者可能會利用此弱點跳過存取控制,直接連結到管理功能頁
面。
Example: http://www.google.com/forward.jsp?fwd=admin.jsp
2. 自我網站檢查
a. 檢查所有可以帶有參數的Redirect和Forward,是否有驗證參數的功能。
3. 如何預防
a. 簡單的避免使用 Redirect和Forward。
b. 若要使用,不要把使用者輸入的參數當作決定目的端的一部分。
c. 若無法避免,則需要驗證使用者輸入的參數。
攻擊者利用網站未經過驗證的Redirect和Forward進行攻擊。
a. 未經過驗證的Redirect:攻擊者可以利用此弱點欺騙使用者點選連結並重新導向到惡意網址。
Example: http://www.google.com/redirect.jsp?url=hacker.com/malware.exe
b. 未經過驗證的Forward:攻擊者可能會利用此弱點跳過存取控制,直接連結到管理功能頁
面。
Example: http://www.google.com/forward.jsp?fwd=admin.jsp
2. 自我網站檢查
a. 檢查所有可以帶有參數的Redirect和Forward,是否有驗證參數的功能。
3. 如何預防
a. 簡單的避免使用 Redirect和Forward。
b. 若要使用,不要把使用者輸入的參數當作決定目的端的一部分。
c. 若無法避免,則需要驗證使用者輸入的參數。
Google App Engine(GAE) - 檔案上傳
1. GAE的檔案上傳需使用Apache的FileUpload的套件
2. 範例程式如下:
2. 範例程式如下:
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterator = upload.getItemIterator(request);
while (iterator.hasNext()) {
FileItemStream item = iterator.next();
//判斷是否為一般Form的文字資料,還是檔案
if (item.isFormField()) {
if (item.getFieldName().equals("icon.name")) {
InputStream i = item.openStream();
byte[] b = new byte[i.available()];
i.read(b);
icon.setName(new String(b));
}
} else {
InputStream i = item.openStream();
byte[] b = new byte[i.available()];
i.read(b);
icon.setFile(new Blob(b));
}
}
FileItemIterator iterator = upload.getItemIterator(request);
while (iterator.hasNext()) {
FileItemStream item = iterator.next();
//判斷是否為一般Form的文字資料,還是檔案
if (item.isFormField()) {
if (item.getFieldName().equals("icon.name")) {
InputStream i = item.openStream();
byte[] b = new byte[i.available()];
i.read(b);
icon.setName(new String(b));
}
} else {
InputStream i = item.openStream();
byte[] b = new byte[i.available()];
i.read(b);
icon.setFile(new Blob(b));
}
}
可數名詞、不可數名詞(Countable, uncountable)
1. 可數名詞(Countable)
a lot of,too many, many, some, a few
2. 不可數名詞(Uncountable)
a lot of, too much, some, a little
a lot of,too many, many, some, a few
2. 不可數名詞(Uncountable)
a lot of, too much, some, a little
2009年11月23日 星期一
Google App Engine 實作
- UrPosition:與朋友分享自己目前的所在位置,可以透過web介面看到所有朋友在Google Map上的位置。
- 單字搜尋:單字搜尋引擎,你可以只要輸入部分的字元即可,例如你想要查詢所有包含"dis"的單字。那你只要輸入dis即可,系統會將所有有包含"dis"的單字都列出來。
- 線上白板:為了方便儲存一些文字訊息所寫出來的一個小程式,你可以提個一個名稱以建立一個新的白板,或是利用已建立的名稱來對這個白板的內容做一個維護。
Necessary & Suggestion
1. Necessary (must, have to, need to)
You must be at least 18 to drink.
2. Not Necessary(don't must, don't have to, don't need to)
You don't have to be 20 to drink.
3. Suggestion(should, ought to, had better)
You should ware some jackets.
You had better ware sunglasses in the US. (strong suggestion)
4. Not Suggestion(Shouldn't, had better not)
You shouldn't take too much money.
5. Not Allow(mustn't)
You mustn't eat food in MRT station.
You must be at least 18 to drink.
2. Not Necessary(don't must, don't have to, don't need to)
You don't have to be 20 to drink.
3. Suggestion(should, ought to, had better)
You should ware some jackets.
You had better ware sunglasses in the US. (strong suggestion)
4. Not Suggestion(Shouldn't, had better not)
You shouldn't take too much money.
5. Not Allow(mustn't)
You mustn't eat food in MRT station.
2009年11月21日 星期六
Java keytool 基本指令介紹
1. 匯入憑證到keystore
keytool –import –alias xxx –file xxx.cer –keystore .keystore
2. 查詢keystore的內容
keytool –list –v –keystore .keystore
3. 刪除keystore內的其中一個憑證
keytool –delete –alias xxx –keystore .keystore
4. 產生金錀對(RSA為非對稱加密的演算法)
keytool -genkey -alias xxx -keyalg RSA -keystore .keystore
5. 產生憑證申請檔
keytool -certreq -alias xxx -file certreq.txt -keystore .keystore
6. 查詢PKCS12類型keystore的內容
keytool –list –v –keystore .keystore -storetype pkcs12
7. 建立一個含有私鑰的keystore
keytool -genkey -alias keyAlias -keyalg RSA -keystore keystore.jks
8. 修改keystore的密碼
keytool -storepasswd -new newPassword -keystore keystore.jks
keytool –import –alias xxx –file xxx.cer –keystore .keystore
2. 查詢keystore的內容
keytool –list –v –keystore .keystore
3. 刪除keystore內的其中一個憑證
keytool –delete –alias xxx –keystore .keystore
4. 產生金錀對(RSA為非對稱加密的演算法)
keytool -genkey -alias xxx -keyalg RSA -keystore .keystore
5. 產生憑證申請檔
keytool -certreq -alias xxx -file certreq.txt -keystore .keystore
6. 查詢PKCS12類型keystore的內容
keytool –list –v –keystore .keystore -storetype pkcs12
7. 建立一個含有私鑰的keystore
keytool -genkey -alias keyAlias -keyalg RSA -keystore keystore.jks
8. 修改keystore的密碼
keytool -storepasswd -new newPassword -keystore keystore.jks
2009年11月20日 星期五
Direct Web Remoting(DWR)簡介
DWR可以在Web Application上直接處理XMLHttpRequest,因此你可以在 有的架構下利用DWR來產生Ajax的
效果。而且DWR非常簡單,只要再web.xml加入DRW的Servlet並新增一個dwr.xml的設定檔。就可以直接在Client端
利用Javascript直接呼叫Server端的Java方法。
以下建構一個簡單的例子,在Client端輸入一串字串,Servler端在收到這一個字串後,回傳Client端輸入的字串並回傳
Server端目前系統時間。
1. 下載dwr.jar檔。
2. 在web.xml加入DRW的Servlet。
3. 在WEB-INF下新增一個dwr.xml的設定檔。
4. 建立AjaxFunctions.class(此類別就是用戶端要呼叫的類別)
5.最後建立呈現在用戶端的網頁()
效果。而且DWR非常簡單,只要再web.xml加入DRW的Servlet並新增一個dwr.xml的設定檔。就可以直接在Client端
利用Javascript直接呼叫Server端的Java方法。
以下建構一個簡單的例子,在Client端輸入一串字串,Servler端在收到這一個字串後,回傳Client端輸入的字串並回傳
Server端目前系統時間。
1. 下載dwr.jar檔。
2. 在web.xml加入DRW的Servlet。
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
3. 在WEB-INF下新增一個dwr.xml的設定檔。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="AjFuns">
<param name="class" value="tw.nicky.dwr.AjaxFunctions"/>
</create>
</allow>
</dwr>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="AjFuns">
<param name="class" value="tw.nicky.dwr.AjaxFunctions"/>
</create>
</allow>
</dwr>
4. 建立AjaxFunctions.class(此類別就是用戶端要呼叫的類別)
package tw.nicky.dwr;
import java.util.Date;
public class AjaxFunctions {
public String getEchoTime(String msg) {
String result = "";
result = result + "your input: "+msg+" ";
result = result + "server time: "+new Date();
return result;
}
}
import java.util.Date;
public class AjaxFunctions {
public String getEchoTime(String msg) {
String result = "";
result = result + "your input: "+msg+" ";
result = result + "server time: "+new Date();
return result;
}
}
5.最後建立呈現在用戶端的網頁()
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>dwr_example</title>
<script type='text/javascript' src='dwr/interface/AjFuns.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript'>
function getEchoTime(){
var msg = document.getElementById("msg").value;
AjFuns.getEchoTime(msg,function(ret){
document.getElementById("results").innerHTML = ret;
});
}
</script>
</head>
<body>
<input type="text" id="msg">
<input type="button" value="確定" onClick="getEchoTime()">
<div id="results">
</div>
</body>
</html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>dwr_example</title>
<script type='text/javascript' src='dwr/interface/AjFuns.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript'>
function getEchoTime(){
var msg = document.getElementById("msg").value;
AjFuns.getEchoTime(msg,function(ret){
document.getElementById("results").innerHTML = ret;
});
}
</script>
</head>
<body>
<input type="text" id="msg">
<input type="button" value="確定" onClick="getEchoTime()">
<div id="results">
</div>
</body>
</html>
2009年11月19日 星期四
Google App Engine(GAE) - 在GAE上使用Struts2
1. 建立一個Listener實作ServletContextListener, HttpSessionListener, HttpSessionAttributeListener
2. 修改web.xml,加入此listener
3. 支援:Tiles、後端驗證、@InputConfig、@SkipValidation
4. 不支援:Struts2 FileUpload
public class InitListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {
public InitListener() {
}
public void contextInitialized(ServletContextEvent sce) {
OgnlRuntime.setSecurityManager(null);
}
}
public InitListener() {
}
public void contextInitialized(ServletContextEvent sce) {
OgnlRuntime.setSecurityManager(null);
}
}
2. 修改web.xml,加入此listener
<listener>
<listener-class>tw.nicky.listener.InitListener</listener-class>
</listener>
<listener-class>tw.nicky.listener.InitListener</listener-class>
</listener>
3. 支援:Tiles、後端驗證、@InputConfig、@SkipValidation
4. 不支援:Struts2 FileUpload
Google App Engine(GAE) - 利用Remote api上傳大量資料到DataStore
1. 安裝Google App Engine(Python) 目前只有python版本支援Remote api。
2. 安裝Python 2.5,目前Google App Engine只支援到2.5版。
3. 建立app.yaml檔。
4. 上傳此app.yaml檔到你的App Engine。(youdir是存放app.yaml的目錄)
C:\Program Files\Google\google_appengine\appcfg.py update yourdir/
5. 撰寫上傳資料的程式。
6. 製作資料CSV檔(資料欄位以半形逗號隔開)。
7. 將資料上傳到App Engine(config_file:上傳資料的程式 filename:資料CSV檔 kind:需與程式內的kind name一致)。
C:\Program Files\Google\google_appengine\appcfg.py upload_data --config_file=Loader.py --filename=PersonData.csv --kind=PersonData
2. 安裝Python 2.5,目前Google App Engine只支援到2.5版。
3. 建立app.yaml檔。
application: app-name #你的app名稱
version: 2 #你的app版本
runtime: python
api_version: 1
handlers:
- url: /remote_api
script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
login: admin
version: 2 #你的app版本
runtime: python
api_version: 1
handlers:
- url: /remote_api
script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
login: admin
4. 上傳此app.yaml檔到你的App Engine。(youdir是存放app.yaml的目錄)
C:\Program Files\Google\google_appengine\appcfg.py update yourdir/
5. 撰寫上傳資料的程式。
from google.appengine.ext import db
from google.appengine.tools import bulkloader
class PersonData(db.Model): #PersonData為kind Name()
id = db.StringProperty()
age = db.StringProperty()
name = db.StringProperty()
address = db.StringProperty()
email = db.StringProperty()
class Loader(bulkloader.Loader):
def __init__(self):
bulkloader.Loader.__init__(self, 'PersonData',
[('id', str),
('age', str),
('name', lambda x: unicode(x, 'utf-8')) #有中文字部分需設定為UTF8編碼
('address', lambda x: unicode(x, 'utf-8'))
('email', str)
])
loaders = [Loader]
from google.appengine.tools import bulkloader
class PersonData(db.Model): #PersonData為kind Name()
id = db.StringProperty()
age = db.StringProperty()
name = db.StringProperty()
address = db.StringProperty()
email = db.StringProperty()
class Loader(bulkloader.Loader):
def __init__(self):
bulkloader.Loader.__init__(self, 'PersonData',
[('id', str),
('age', str),
('name', lambda x: unicode(x, 'utf-8')) #有中文字部分需設定為UTF8編碼
('address', lambda x: unicode(x, 'utf-8'))
('email', str)
])
loaders = [Loader]
6. 製作資料CSV檔(資料欄位以半形逗號隔開)。
1,43,劉的華,台北市信義區,gae@gmail.com
1,41,張學有,台北市信義區,gae@gmail.com
1,41,張學有,台北市信義區,gae@gmail.com
7. 將資料上傳到App Engine(config_file:上傳資料的程式 filename:資料CSV檔 kind:需與程式內的kind name一致)。
C:\Program Files\Google\google_appengine\appcfg.py upload_data --config_file=Loader.py --filename=PersonData.csv --kind=PersonData
as...as的用法
1. as adv./adj. as
Taipei isn't as beautiful as Hualien.
2. as [many, few] count noun as
Hualien hasn't as many cars as Taipei.
Taipei hasn't as few cars as Hualien.
3. as [much, little] noncount noun as
Hualien hasn't as much pollution as Taipei.
Taipei hasn't as little pollution as Hualien.
Taipei isn't as beautiful as Hualien.
2. as [many, few] count noun as
Hualien hasn't as many cars as Taipei.
Taipei hasn't as few cars as Hualien.
3. as [much, little] noncount noun as
Hualien hasn't as much pollution as Taipei.
Taipei hasn't as little pollution as Hualien.
現在完成式(Prsent Perfect)
1. 過去到現在的經驗
* Have you ever been to Japan?
* Have you been to Japan before?
2. 是否已完成
* Have you eaten dinner yet?
* Have you already eaten dinner?
3. 從過去到現在都還是
* How long have you been a student?
* Have you ever been to Japan?
* Have you been to Japan before?
2. 是否已完成
* Have you eaten dinner yet?
* Have you already eaten dinner?
3. 從過去到現在都還是
* How long have you been a student?
2009年11月18日 星期三
Google App Engine(GAE) - Eclipse plugin安裝步驟
1. 執行Eclipse Software Update。
2. 選擇Available Software按下Add Site。
3. 在Location輸入 http://dl.google.com/eclipse/plugin/3.4。
4. 勾選你要安裝的plug in,並按下Install按鈕。
5. 選擇你要安裝的Plugin。
6. 安裝完成之前,工具列會多出三個按鈕分別是建立Goole App Engine專案、建立Google Web Toolkit專案及上傳程式碼到Google App Engine上。
Android學習筆記 - Android相關網站
- Android官方網站
- 台灣Android論壇
- 深入淺出 Android:一個很好的入門文件
- DroidDraw:設計Android版面必備的網站
- Android應用程式集:上面有介紹很多Android的軟體
- Android JavaDoc:就是Android API的JavaDoc在查API的時候很好用
- Android Mobile01討論群組:介紹Android的一些軟體
- Jollen 的 Android 教學
- ysl 的程式天堂 - Android 應用開發 ‧ 研究 ‧ 與諮詢
- 昭佑.天翔
2009年11月17日 星期二
Android學習筆記 - 建立AVD模擬器
1. 到android-sdk安裝目錄下的tools資料夾
2. 利用tools資料夾android指令進行安裝及查看目前的模擬器
3. android指令介紹
a. 查看target列表
android list target
b. 查看avd模擬器列表
android list avd
c. 建立一個模擬器
android create avd --target 1 --name emu1 --sdcard 500M
(target為此模擬器要使用的targetId)
4. adb指令介紹
a. 在模擬器上安裝apk檔
adb install xxx.apk
b. 在模擬器上移除某個apk檔
adb shell rm xxx.apk
c. 查看系統log記錄
adb logcat
2. 利用tools資料夾android指令進行安裝及查看目前的模擬器
3. android指令介紹
a. 查看target列表
android list target
b. 查看avd模擬器列表
android list avd
c. 建立一個模擬器
android create avd --target 1 --name emu1 --sdcard 500M
(target為此模擬器要使用的targetId)
4. adb指令介紹
a. 在模擬器上安裝apk檔
adb install xxx.apk
b. 在模擬器上移除某個apk檔
adb shell rm xxx.apk
c. 查看系統log記錄
adb logcat
訂閱:
文章 (Atom)