2010年8月11日 星期三

Gmap 入門 (一)

1. Gmap API 的申請
http://code.google.com/intl/zh-TW/apis/maps/signup.html
你必須要申請API,Google才知道你是誰,當然 Google 也可由此知道誰在偷偷用他的地圖服務,聽 起來很可怕吧,沒有做什麼壞事情就不用想太多。

例如:我申請一組 www.xxx.com
GMap會給我 ABQIAAAAb37BxmszgAN90DlQF2kuXxQK7D9hMb7A52EddnovcMgPuF8behQgpef_nt5fmn

我當然也不可能貼一組可以用的,自己去申請一下吧

2. Gmap提供幾種使用Map的方式
2.1 JavaScript Maps
2.2 Maps API for Flash
2.3 HTTP Service

我自己沒使用過 Flash版的,所以以下我就先不介紹


Google API Reference
http://code.google.com/intl/zh-TW/apis/maps/documentation/javascript/v2/reference.html

Gmap Reverse Geocoding

1. Reverse Geocoding
(反向地理編碼說明 http://code.google.com/intl/zh-TW/apis/maps/documentation/javascript/v2/services.html#ReverseGeocoding)
以上此做法是在Client 去執行的,所以前端要做大量住址反查時,不是一個最佳解法

以下為官網的Sample

var map;
var geocoder;
var address;

function initialize() {
map = new GMap2(document.getElementById("map_canvas"));
map.setCenter(new GLatLng(40.730885,-73.997383), 15);
map.addControl(new GLargeMapControl);
GEvent.addListener(map, "click", getAddress);
geocoder = new GClientGeocoder();
}

function getAddress(overlay, latlng) {
if (latlng != null) {
address = latlng;
geocoder.getLocations(latlng, showAddress);
}
}

function showAddress(response) {
map.clearOverlays();
if (!response || response.Status.code != 200) {
alert("Status Code:" + response.Status.code);
} else {
place = response.Placemark[0];
point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
marker = new GMarker(point);
map.addOverlay(marker);
marker.openInfoWindowHtml(
'orig latlng:' + response.name + '
' +
'latlng:' + place.Point.coordinates[1] + "," + place.Point.coordinates[0] + '
' +
'Status Code:' + response.Status.code + '
' +
'Status Request:' + response.Status.request + '
' +
'Address:' + place.address + '
' +
'Accuracy:' + place.AddressDetails.Accuracy + '
' +
'Country code: ' + place.AddressDetails.Country.CountryNameCode);
}
}

2. Google Maps API Web Services
參考資料:http://code.google.com/intl/zh-TW/apis/maps/documentation/geocoding/

說明:
Google Maps API Web Services
1. http://maps.google.com/maps/api/geocode/json?latlng=22.67744,120.34423&sensor=false®ion=tw&language=zh-TW
2. 可透過HttpClient 將url 送出,可以收到一個 JSON
3. 再透過 JSON去拆解 Google 吐回來的 JSON字串

/**
*
* @author 熊爸天下
*/
public class GmapUtil {

private static final String gmapUrl = "http://maps.google.com/maps/api/geocode/json?";

/**
* 經緯度反查住址
* @param Latitude 東經
* @param longitude 北緯
* @return 回傳住址
* @throws UnsupportedEncodingException
* @throws IOException
*/
public String LatlonToAddress(String Latitude, String longitude) throws UnsupportedEncodingException, IOException {
//ex:http://maps.google.com/maps/api/geocode/json?latlng=22.67744,120.34423&sensor=false®ion=tw&language=zh-TW
StringBuffer url = new StringBuffer();
url.append(gmapUrl);
url.append("latlng=").append(Latitude).append(",").append(longitude);
url.append("&sensor=false®ion=tw&language=zh-TW");

byte[] addr = getJsonObject(url.toString());
return this.getMapAddress(SplitArrayObject(addr));

}

private byte[] getJsonObject(String urlStr) throws UnsupportedEncodingException, IOException {

HttpClient httpClient = new HttpClient();

HttpConnectionManagerParams managerParams = httpClient.getHttpConnectionManager().getParams();
// UTF-8
managerParams.setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
//設定connect時間(單位毫秒)
managerParams.setConnectionTimeout(10000);
//設定connect Timeout時間(單位毫秒)
managerParams.setSoTimeout(20000);

GetMethod method = new GetMethod(urlStr);
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());

int statusCode = 0;

try {
statusCode = httpClient.executeMethod(method);
} catch (IOException ex) {
ex.printStackTrace();
}

byte[] responseBody = null;

if (statusCode != HttpStatus.SC_OK) {
} else {

try {
responseBody = method.getResponseBody();
} catch (IOException e) {
}
method.releaseConnection();
}
return responseBody;

}

public String SplitArrayObject(byte[] responseBody) throws UnsupportedEncodingException {

String json = "";
String address = "";
if (responseBody.length == 0) {
return "";
}
json = new String(responseBody, "UTF-8").trim();
return json;
}





public String getMapAddress(String json) throws UnsupportedEncodingException {

String address = "";
if (!json.equals("") && !json.equals("{}")) {

JSONArray obj = null;
try {
obj = new JSONArray();
obj.add(json);
String rs = obj.getJSONObject(0).getString("results");
JSONArray obj_detail = new JSONArray();
obj_detail.add(rs);
address = obj_detail.getJSONArray(0).getJSONObject(0).getString("formatted_address");
} catch (JSONException e) {
}
}

return address;
}

public static void main(String[] arg) {

GmapUtil gu = new GmapUtil();
try {
System.out.println(gu.LatlonToAddress("22.63434", "120.33406"));
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(GmapUtil.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(GmapUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}


}

2010流年不順

距離上寫網誌也快2年了,最近發生了很多事,今年上半年不管做什麼事情都很不順心。
今天心血來潮,決定回來維護一下自己網誌。

2008年9月8日 星期一

Struts2 入門(一)

struts2 環境配置有空再寫,先來記錄一下實務coding 的部份
這邊是單純的query及insert,使用hibernate來操作DB 的部份。


一、 Java (Action的部份)

package com.blog;

import com.hibernate.hibernateUtil;
import com.opensymphony.xwork2.ActionContext;
import java.util.Map;
import org.hibernate.Session;
import org.hibernate.Transaction;
import orm.User;
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import org.hibernate.Query;

public class blogAction extends ActionSupport {

public String execute() throws Exception {


init();

if (this.action != null && this.action.equals("a")) {

if (this.username != null && this.username != "") {
System.out.println("Ready to do save users");
this.SaveUsers();
}

} else if (this.action != null && this.action.equals("q")) {

System.out.println("Ready to do query users");
queryUser();
}


return "blog_add";
}

//初始化
private void init(){
session = ActionContext.getContext().getSession();
session.clear();
}

// Save Data To Pojo
private void SaveUsers() {

User user = new User();
user.setName(this.username);
user.setAge(age);

Session session = hibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
session.close();

}

//query Data
private void queryUser() {

Session s = hibernateUtil.getSessionFactory().openSession();
Query q = s.createQuery("from User");
List l = q.list();

//set session
//ActionContext.getContext().getSession().put("blog", l);
session.put("blog", l);

// Map s =getSession();
// s.put("blog", age);
// this.setSession(s);
// Map s = ActionContext.getContext().getSession();
// s.put("blogSession", l);


// for(java.util.Iterator it = l.iterator(); it.hasNext();){
// User user = (User)it.next();
//System.out.println("User:"+user.getName());
// System.out.println(it.next());

// }

s.close();

}
private String username;
private int age;
private String action;
private Map session;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getAction() {
return action;
}

public void setAction(String action) {
this.action = action;
}
}

二、 JSP (View的部份)

<%--
Created on : 2008/9/8, 下午 02:33:31
Author : jimmy
--%>
< form action="blog.action" method="post">
< input type="text" name="username" value="" />

< input type="text" name="age" value="" />

< input type="hidden" name="action" value="a">
< input type="submit" value="Add" name="Add" />
< /form>

[session blog]
<!--input type="submit" value="query" name="query" /-->




< %
if( s ession.getAttribute("blog")!=null){
java.util.List blog = (j ava.util.List)session.getAttribute("blog");
if(blog!=null){
for(int i = 0 ; i < blog.size();i++){
out.println("");
orm.User user = (orm.User) blog.get(i);
out.println(""+user.getId()+"");
out.println(""+user.getName()+"");
out.println(""+user.getAge()+"");
out.println(""+"");
out.println("");
} } }
%>
< /table>

2008年9月4日 星期四

SQL常用 語法

參考來源:
http://www.1keydata.com/tw/sql/sql-create-index.html

http://www.tizag.com/mysqlTutorial/mysql-index.php

1. Create index

CREATE INDEX date_index ON bvl_txnlist(txndate_u,txndate_d)
CREATE TABLE bvl_txnlist (
name VARCHAR(50),
employeeID INT, INDEX (employeeID)
)


2. Alter Table

2.1 修改欄位名稱(將txndate 改為 txndate_u)

ALTER table bvl_txnlist change txndate txndate_u char(50)

2.2 修改欄位資料型態(將txndate 資料型態改為 varchar(30))

ALTER table bvl_txnlist modify txndate varchar(30)

2008年8月27日 星期三

Mac無法開機時的處理

資料來源: http://ca96.blogspot.com/2008/04/mac.html

當面臨到無法開機的情況時,首先要判斷的是屬於下列哪一種情況?

1. 空白的藍色或灰色畫面:可能是由磁碟權限、第三方軟體、或偶發的硬體問題所造成的。適用招式:ㄧ、二、三、四

2. 出現 "NO"、壞掉的資料夾或閃動的問號:這是由於 Mac 找不到開機所需的系統,可能是磁碟問題所致。適用招式:三、四

3. 黑色畫面,沒有聲音:你所碰到的可能是電力問題、主機板上的電池壞掉、故障的記憶體或其他的硬體問題


。第一招:以安全模式開機,開機快捷鍵:Shift
Step1: 開機時按住 Shift 鍵不放
Step2: 直到螢幕上出現灰色蘋果標誌及旋轉的齒輪時才放開Shift鍵
Step3: 如果順利啟動,“Safe Boot”字樣應該會在啟動時出現或在顯示於登入視窗中(以安全模式啟動會比一般啟動花更多的時間,因為系統會為開機磁碟進行磁軌檢查。耐著性子吧!若要離開安全模式,將電腦重新開機,並且不要在開機時按任何鍵即可。 )


。第二招:單一使用者模式,開機快捷鍵:Command(蘋果鍵) + S
Step1: 開機時按住 Command + S。如果看到黑底白字的文字模式,別嚇到了,這是正常的
Step2: 在游標後輸入 fsck - fy
Step3: 之後按 return 鍵。如果回覆的訊息是 " File System was Modified ",重複第二步驟直到系統回覆 " No problems were found "
Step4: 輸入 reboot 並按 return 鍵。(之後電腦就會重新開機了,如果順利就會進入系統,如果還是不行,那就試試其他的招式吧!)

其他解決方案:AppleJack(注1)
如果你在你的MAC 出問題之前曾安裝過 AppleJack,那麼過程就會簡單許多
1.輸入"applejack auto restart",之後按 return 鍵
2.稍待個幾分鐘,你的 MAC 將會重新開機並完成所有的修護作業


。第三招:用蘋果 CD/DVD 開機,開機快捷鍵﹕C
Step1: 放入 Mac OS X 安裝光碟(開機時壓住滑鼠不放即可打開光碟托盤[退片])
Step2: 開機時按住 C 鍵,直到灰色蘋果標誌出現在螢幕上才放手
Step3: Mac OS X 10.4.x的使用者:從選單列選擇「工具程式」> 「磁碟工具程式」
Step4: 從左側列出的硬碟圖示中選擇自己的硬碟,然後單點修理工具分頁中的「修復磁碟」。
Step5: 磁碟回報正常後,單點「修復磁碟權限」
Step6: 之後重開機,並在開機時不要按任何按鍵


。第四招:硬碟模式,開機快捷鍵:T
當其他的招式都失效時,硬碟模式可以讓你透過其他電腦來存取你的硬碟。這樣一來你就可以執行一些診斷、維護或者備份重要的工作檔案。
Step1: 開機時按住 T 鍵,直到看見 FireWire 圖示才放開。
Step2: 用一條 FireWire 線將故障的 Mac 接上正常的 Mac。
Step3: 開啟正常 Mac 上的磁碟工具程式 ( 位於應用程式 / 工具程式 )。
Step4: 從左側列出的硬碟圖示中選擇故障的硬碟,然後單點修理工具分頁中的「修復磁碟」。
Step5: 如果在正常 Mac 的桌面上可以看的到故障 Mac 的硬碟圖示,那麼說不定還可以把一些重要的檔案復原或者備份起來。


(注1):AppleJack 是一個專為 MAC OSX 開發的系統維護工具,當無法進入系統的圖形介面而手邊又沒有可開機的光碟時,AppleJack 可以在單一使用者模式下,以選單的方式協助使用者進行障礙排除。

2008年8月11日 星期一

javaMail(一)



Setup


If you use Java 2 Platform,
Enterprise Edition (J2EE) 1.3, you're in luck: it includes JavaMail, so
no additional setup is required. If, however, you're running Java 2
Platform, Standard Edition (J2SE) 1.1.7 and upwards, and you want email
capability for your applications, download and install the following:


資料來源: http://www.javaworld.com/javaworld/jw-10-2001/jw-1026-javamail.html?

Sample

以下的範例,以gmail 為例

package com.mail;

import java.security.Security;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class msgsendsample {

private static final String SMTP_HOST_NAME = "smtp.gmail.com";
private static final String SMTP_PORT = "465";

private static final String emailMsgTxt = "Test Message Contents";
private static final String emailSubjectTxt = "A test from gmail test.....";
private static final String emailFromAddress = "xxxx@gmail.com";
private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
private static final String[] sendTo = {"xxxx@gmail.com","xxxx@yahoo.com.tw"};

msgsendsample() {
}

public void sendMail() throws MessagingException {

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

new msgsendsample().sendSSLMessage(sendTo, emailSubjectTxt,
emailMsgTxt, emailFromAddress);
System.out.println("Sucessfully Sent mail to All Users");

}

public void sendSSLMessage(String recipients[], String subject,
String message, String from) throws MessagingException {
boolean debug = true;

Properties props = new Properties();
props.put("mail.smtp.host", SMTP_HOST_NAME);
props.put("mail.smtp.auth", "true");
props.put("mail.debug", "true");
props.put("mail.smtp.port", SMTP_PORT);
props.put("mail.smtp.socketFactory.port", SMTP_PORT);
props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
props.put("mail.smtp.socketFactory.fallback", "false");



Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {

protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("xxxx", "xxxx"); //Gmail的帳號及密碼
}
});


session.setDebug(debug); // 方便Debug用

Message msg = new MimeMessage(session);
InternetAddress addressFrom = new InternetAddress(from);
msg.setFrom(addressFrom);

InternetAddress[] addressTo = new InternetAddress[recipients.length];
for (int i = 0; i < recipients.length; i++) {
addressTo[i] = new InternetAddress(recipients[i]);
}
msg.setRecipients(Message.RecipientType.TO, addressTo);

// Setting the Subject and Content Type
msg.setSubject(subject);
msg.setContent(message, "text/plain");
Transport.send(msg);
}

public static void main(String args[]) throws Exception {

msgsendsample ms = new msgsendsample();
ms.sendMail();
}


}

p.s 一開始我只下載了javamail 所以在run的過程當中會出現 java.lang.NoClassDefFoundError: javax/activation/DataSource ,後來下載 javaBean Activation Framework加到Lib之後就解決了