2010年12月30日 星期四

Java send mail by Google App Engine

在 Google App Engine 中 有 內建 寄收信的功能,所以也可以利用 GAE 的內建函式達成寄收信的功能。

以下是我參考GAE 修改的code, 是一個servlet 所以還要記得設定web.xml 這裡就不多說了

注意這裡 setFrom 要用GAE 開發者的gmail 不然是會寄不出去也不會有錯誤訊息



import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



@SuppressWarnings("serial")
public class SendMail extends HttpServlet{

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
req.setCharacterEncoding("UTF-8");


Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);

String msgBody = "Hello ";

try {
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("Admin@gmail.com"));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress("xxx@gmail.com", "Mr. User"));
msg.setSubject("Your Example.com account has been activated");
msg.setText(msgBody);
Transport.send(msg);

} catch (AddressException e) {
// ...
} catch (MessagingException e) {
// ...
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("Message sent.");
resp.setContentType("text/plain");
resp.getWriter().println("Message sent.");
}

}






附註 InternetAddress函式 說明


new InternetAddress("email","想要給的名稱");







詳細可以參考 GAE 的說明

Java send mail

若要利用 java 來寄收信的話, 可以先下載 java mail api , 之後記得吧 javamail-1.x.x.jar 加入參考就是。

下面我從 郵件技術資訊網 轉錄一支 send mail 的 範例 code

紅色部份記得修改


package lius.javamail.ssl;

import java.security.Security;
import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* 使用Gmail发送邮件
* @author Winter Lau
*/
public class GmailSender {

public static void main(String[] args) throws AddressException, MessagingException {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
// Get a Properties object
Properties props = System.getProperties();
props.setProperty("mail.smtp.host", "smtp.gmail.com");
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");
final String username = "Gmail帳號";
final String password = "Gmail信箱密碼";
Session session = Session.getDefaultInstance(props, new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}});

// -- Create a new message --
Message msg = new MimeMessage(session);

// -- Set the FROM and TO fields --
msg.setFrom(new InternetAddress(username + "@gmail.com"));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("收件人地址",false));
msg.setSubject("Hello");
msg.setText("How are you");
msg.setSentDate(new Date());
Transport.send(msg);

System.out.println("Message sent.");
}
}

轉貼 網頁圖表產生套件

查資料中找到幾個介紹關於網頁圖表的套件,
如下

  1. PHP 程式 學習 筆記本, 介紹幾個漂亮的圖表生成插件
  2. JavaScript Chart 函式庫整理
  3. 1stwebdesigner 5 Top jQuery Chart Libraries for Interactive Charts
  4. 前端觀察,6個jQuery圖表Web應用擴展
有些會有重複介紹到,目前個人我感覺比較會用的是下面兩個

  1. Google chart, 設定好要畫得資料就可以透過AJAX 傳回
  2. FusionCharts Free, 利用flash 畫圖的套件,還有jquery 的 plugin 版本,另外有付費的版本,不過free 版就很夠用了

2010年12月29日 星期三

轉貼 javaBean

  • 何謂JavaBean:一個可重覆使用且跨平台的套件(Package)(在JSP 2.0,使用Bean一定要加入package name)
  • JavaBean的特點:(1)是public類別
    (2)必須有一個無傳入參數的建構子(constructor)
    (3)設定或取得屬性時必須使用setXXX()和getXXX()的方法,意即在JavaBean內要有public getXXX()和
    public setXXX()的method
  • 如何使用JavaBean:(1)將原始碼編譯成.class,並放在application目錄下WEB-INFO/classes子目錄中(以下面的範例,
    BeanSample.class應放於WEB-INFO/classes/tw/edu/dwu/jspclass的子目錄下)
    (2)在JSP的網頁檔內以標籤存取JavaBean

轉貼自 http://hyh.mis.tsu.edu.tw/jsp/bean.htm



這裡也有相關的介紹
http://caterpillar.onlyfun.net/Gossip/ServletJSP/UseBeanSetPropertyGetProperty.html

2010年12月23日 星期四

轉錄 jQuery alert dialog

介紹一下 jQuery 的 外掛,可以自訂 alert 等提示的樣式(修改CSS),介紹網站在下面

http://labs.abeautifulsite.net/projects/js/jquery/alerts/demo/

2010年12月21日 星期二

javascript 動態增減減表格

雖然有查到許多資料像 document.getElementById("").RemoveChild() 的方式,不過是了半天是不出來,所以就用簡單的方式 修改 element 裡的 innerhtml 來達成我的目標


code 如下


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />



<title>Sample</title>

<script type="text/javascript">


var ItemCount=0;

var temp=new Array();


/*
Add Item field

*/

function addItem()
{

eval("document.getElementById('addButton"+ItemCount+"').style.visibility = \"hidden\";");
if(ItemCount!=0)
eval("document.getElementById('deleteButton"+ItemCount+"').style.visibility = \"hidden\";");



temp[ItemCount] = document.getElementById('ItemList').innerHTML;
ItemCount++;

document.getElementById('ItemList').innerHTML +=
"<br> <br> Item Id : <input name=\"ItemId"+ ItemCount +"\" type=\"text\" /> " +

"Item Aliases : <input name=\"ItemAliases"+ItemCount +"\" type=\"text\" /> " +

//<button id="addButton0" onclick="addItem()">ADD </button>

"<button id=\"addButton"+ ItemCount+ "\" onclick=\"addItem()\"> ADD</button>" +

"&nbsp; <button id=\"deleteButton"+ ItemCount+ "\" onclick=\"deleteItem()\"> delete</button>"


;



}


function deleteItem(){


ItemCount--;
document.getElementById('ItemList').innerHTML = temp[ItemCount];
// Set null
temp[ItemCount]=null;
//alert(ItemCount);
eval("document.getElementById('addButton"+ItemCount+"').style.visibility = \"visible\";");
if(ItemCount!=0)
eval("document.getElementById('deleteButton"+ItemCount+"').style.visibility =\"visible\";");

}




</script>


</head>
<body>



<div id="ItemList">
Item Id : <input name="ItemId0" type="text" />
Item Aliases : <input name="ItemAliases0" type="text" />

<button id="addButton0" onclick="addItem()">ADD </button>


</div>


</body>
</html>








我的範例, 裡面點 open 可以直接看
https://docs.google.com/leaf?id=0B_JOf_Tyv_f6ODI5M2QyZTgtNGU2ZC00NmQzLWIwMjktMWNmMDQxZjRkZjdm&sort=name&layout=list&num=50

2010年12月10日 星期五

轉錄 javascript Http post function

轉錄自
http://stackoverflow.com/questions/133925/javascript-post-request-like-a-form-submit

在 javascript 中 透過 function 的方式 來達成 http post 的功能

code 如下

輸入三個變數, url :目標的網址、nams : 參數名稱、 values : 參數值 ; 這裡參數名稱和值是一對一的關係 ,若包成一個物件的話會更完美,不過在此先用簡單的方式






function postToURL(url, names ,values )
{
var form = document.createElement('form');
form.action = url;
form.method = 'POST';



for (var i=0; i< names.length; i++)
{
var child = document.createElement('input');
child.type = "hidden";
child.name =names[i];
child.value = values[i];

form.appendChild(child);

}

document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
}

2010年12月7日 星期二

轉錄 javascript 檢查 form 表單是否填寫

轉錄兩個範例

1. 使用JavaScript來判斷form表單是否有填寫!


2. 由表单中onsubmit="return false;"想到的



以下是我的註釋:

範例1. 利用 click function 後檢查完才執行 form 的 submit() 函式


範例2. 在form 中加入 onsubmit 的檢查函式 ,記得要用 onsubmit =" retrun check()" 才有檢查的作用


還有 若網頁東西太多 ,我的用法是 將 form 取一個 id 在用 document.getElementById('formId'); 的方式取出在呼叫form 裡面的變數和函式

2010年12月3日 星期五

轉錄 servlet 使用 session

Session 的定義如下(轉自 wiki ):
在電腦科學領域來說,尤其是在網路領域,會話(session)是一種持久網路協定,在使用者(或使用者代理)端和伺服器端之間建立關聯,從而起到交換資料包的作用機制,session在網路協定(例如telnet或FTP)中是非常重要的部分。

簡單的說就是使用者連線到伺服器上的一個協定紀錄,會儲存到伺服器上。


要在 servlet 使用 session 的話 必須 import javax.servlet.http.HttpSession;

語法如下

// create a session if one does not exist
// 需要使用 true 當作 getSession() 的參數
HttpSession session = req.getSession(true);



之後就可以照依般sesaion 的用法,可以參考 servlet 入門



若要在 google app engine 上使用的 話

在 ..\war\WEB-INF\appengine-web.xml 中
要加入下面這段 XML
<sessions-enabled>true</sessions-enabled>

才可以使用

2010年11月26日 星期五

轉錄 Google Map Api -GDownloadUrl 函式

轉路來源 Maps API Blogs

透過 GDownloadUrl可以讀取 XML 的資料轉成 javascript 所接受的格式,近接使用的話可以吧php 或 jsp 從資料庫撈出來的檔案給 javascript 好結合使用 google map api.

以下是code, 說好是 函式有個Url, 當然要吧XML和html 檔放到webser 上阿,如apache 或 tomcat 上


// Download the data in data.xml and load it on the map.

GDownloadUrl("data.xml", function(data, responseCode) {
// To ensure against HTTP errors that result in null or bad data,
// always check status code is equal to 200 before processing the data
if(responseCode == 200) {
var xml = GXml.parse(data);
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < point =" new" responsecode ="=">





X範例的ML檔


<markers>
<marker lat="37.427770" lng="-122.144841"/>
<marker lat="37.413320" lng="-122.125604"/>
<marker lat="37.433480" lng="-122.139062"/>
<marker lat="37.445427" lng="-122.162307"/>
</markers>

2010年11月22日 星期一

Google mpa api - infowindows 使用

主要流程參考 http://www.svennerberg.com/2009/09/google-maps-api-3-infowindows/


首先,先建立google map


// Creating an option object for the map
var options = {
zoom: 7,
center: new google.maps.LatLng(56.83, 15.16),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
// Initializing the map
var map = new google.maps.Map(document.getElementById('map'), options);
// Creating a marker
var marker = new google.maps.Marker({
position: new google.maps.LatLng(56.8848, 14.7730),
map: map,
title: 'My workplace'
});




宣告 InfoWindow(), 包含顯示的內容在 content 裡面


// Creating an InfoWindow object
var infowindow = new google.maps.InfoWindow({
content: 'Hello world'
});



增加監聽事件,點選標記後就會顯示 infowindow


google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, marker);
});




Google 說明文件:
http://code.google.com/intl/zh-TW/apis/maps/documentation/javascript/overlays.html#InfoWindows

轉貼 SVN client

版本控制在軟體開發算是很重要的一部分,常見的軟體有有SVN 和 CVS.

到官方網站下載,http://tortoisesvn.net/downloads

中文化這裡 32 bit, 64bit

下載完安裝完之後 就可以重新啟動了


-------------------------------
若要在本機使用的話,

1. 先選擇一個資料夾, 假設是 C:\SVN, 好存放變動的紀錄

按滑鼠右鍵選擇「TortoiseSVN」→「Create repository here」

2. 建立一個資料夾 如 C:\testSvn\, 右鍵 svn checkout

url 的地方填入 剛剛做 server 的資料夾 ,如 file:///C:\SVN\



之後就可以使用svn 的功能了



基本上流程我是參考http://demo.tc/Post/591

若要參考server 端的安裝方式 可以看這篇 liang' blog 的文章

Google map api - marker 建立

參考自 http://www.svennerberg.com/2009/07/google-maps-api-3-markers/


在地圖上建立 標記

現在google map 已經不需要使用 API key

所以在header 上加入 如

<script src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1");</script>
<script type="text/javascript">
google.load("maps", "3", {other_params:"sensor=false"});
</script>






建立標記前 , 比須先宣告 map 物件, 記得在html 上給 map 一個 div 標籤


var map = new google.maps.Map(document.getElementById('map'), {
zoom: 7,
center: new google.maps.LatLng(56.83, 15.16),
mapTypeId: google.maps.MapTypeId.ROADMAP
});


建立 標記marker


// Creating a marker and positioning it on the map
var marker = new google.maps.Marker({
position: new google.maps.LatLng(56.8848, 14.7730),
map: map
});



轉貼 jsp 連 mysql

架設好 tomcat 和 mysql 後 , 需要安裝 JDBC Driver 才能讓 tomcat 讀取 mysql,


JDBC driver 安裝擋案可以到 這裡 (http://dev.mysql.com/downloads/connector/j/5.0.html) 下載
下載後 將 mysql-connector-java-5.1.13-bin.jar 這個檔案 放在 tomcat 安裝目錄下的 bin 資料夾裡

當然要重新啟動才會生效





以下是修改後的測試程式,
(從 http://www.roseindia.net/jsp/connect-jsp-mysql.shtml 修改的)
在 mysql 建立 一個 test 資料庫 , 應為這裡沒設密碼 所以帳號密碼就是 "root" ,""






<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>

<html>
<head>
<title>Connection with mysql database</title>
</head>
<body>
<h1>Connection status </h1>
<%
try {
/* Create string of connection url within specified format with machine name,
port number and database name. Here machine name id localhost and
database name is usermaster. */
String connectionURL = "jdbc:mysql://localhost:3306/test";

// declare a connection by using Connection interface
Connection connection = null;

// Load JBBC driver "com.mysql.jdbc.Driver"
Class.forName("com.mysql.jdbc.Driver").newInstance();

/* Create a connection by using getConnection() method that takes parameters of
string type connection url, user name and password to connect to database. */
connection = DriverManager.getConnection(connectionURL, "root", "");

// check weather connection is established or not by isClosed() method
if(!connection.isClosed())
%>
<span ></b>
<%
out.println("Successfully connected to " + "MySQL server using TCP/IP...");
connection.close();
}
catch(Exception ex){
%>
</span>
<span ></b>
<%
out.println("Unable to connect to database.");
}
%>
</span>
</body>
</html>



參考網站
http://wiki.oss.org.tw/index.php/Jsp_database

http://blog.yam.com/carl44/article/14825336

2010年11月19日 星期五

轉貼 Apache 整合 Tomcat

由於想要使用 jsp + mysql 來開發, 但是 tomcat 的路徑有包含 要輸入 port 8080, 覺得很麻煩, 而且想要同時使用 php 和 jsp, 因為 phpmyadmin 還蠻好用的說

過慮了一些資料 節錄下面兩個方法


1. 轉貼自 javaworld 的文章 , http://www.javaworld.com.tw/jute/post/view?bid=9&id=87446&sty=1&tpg=1&age=-1 , javaer 大大的做法


他提到
其實tomcat 5.x版及apache2.x版之後,都已經內建connector了
根據文件的說法,是ready to use的

步驟如下:
1.安裝tomcat及apache
2.打開{apache安裝目錄}\conf\httpd.conf,依底下兩個步驟做設定。完成後,重新啟動apache,使設定生效。
1)在設定載入模組的地方:



LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so


2)在設定模組的地方加入


ProxyRequests On
ProxyVia On

Order deny,allow
Deny from all
Allow from localhost

ProxyPass /img !
ProxyPass / http://localhost:8080/
ProxyPass /first http://localhost:8080/another
ProxyPassReverse / http://localhost:8080/





不過這樣設定的話, 感覺上放在 apache htdoc下的資料夾就無法開啟,因為都指向tomcat 的 wwwroot. 這樣一來 phpmyadmin就開不起來 還要額外設定就要再研究了



2. 建中先生的文章 http://blog.yam.com/u9323523/article/25178591


使用Apache Tomcat Connector來結合兩者, 可以到這裡下載
這裡版本是用
mod_jk-1.2.28-httpd-2.2.X.so,
並將檔案存放至/etc/httpd/conf/modules

在 /etc/httpd/conf.d 目錄下增加 mod_jk.conf 設定檔

------------------------------------------
[mod_jk.conf 檔案內容]
<IfModule mod_jk.c>
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile /var/log/jk.log
JkLogLevel info
JkMount /jsp/* jsp
</IfModule>

-------------------------------------------

在 /etc/httpd/conf.d 目錄下增加 workers.properties 設定檔
[workers.properties 檔案內容]
worker.list=jsp
worker.jsp.type=ajp13
worker.jsp.host=localhost
worker.jsp.port=8009


-----------------------------------------

修改Tomcat 設定檔
[server.xml]
確認 8009 Connector port 是否有開啟
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
關閉8080 server port,將這幾行mark
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

-------------------------------

完成~!

2010年11月17日 星期三

轉錄 - PHP MySQL 安裝教學

基本上可以參考這個網頁

包含

Apache http://wuyy.idv.tw/servercr/apache22.htm
PHP http://wuyy.idv.tw/servercr/phpprogram.htm
MySql http://wuyy.idv.tw/servercr/mysqldb.htm
PhpMyAdmin http://wuyy.idv.tw/servercr/phpmyadmin-h.htm

都有詳細的教學


若不想一個個設定的話 可以參考
WAMP

LAMP
這種整合套件




附註

---------------------------------------------------------------
1. MySQL共有三個版本, 一開始還疑惑了一下要裝哪種版本 :
  • 基本安裝 (檔名含有essential)
  • 完整安裝 (win32.zip)
  • 手動安裝版本 (檔名含有noinstall)

基本安裝:是一個旨在滿足多數用戶需求的MSI安裝套件。 * 完整安裝:比基本版包含更多組件,包括一套評測工具。 * 手動安裝:此版本與完整版一樣,但不包含配置嚮導或安裝器,必須手動進行安裝


2. Skype 預設會占用 80 port, 所以要把他這個選項關閉

3. php.ini 要設定擴充庫
  • 可於 php.ini 中的 extension 設定要使用的擴充函式庫,欲使用函式庫只需將前面的『;』移除即可
  • 使用 MySql 資料庫:extension=php_mysql.dll
  • 處理多位元語系:extension=php_mbstring.dll
  • 繪圖處理:extension=php_gd2.dll
在 x64 環境我是額外再開
extension=php_mcrypt.dll , 參考 http://www.jianing.name/blog/post/150/1/2/




2010年10月14日 星期四

轉貼 java 呼叫外部執行程式

以下轉貼至 javaworld - sungo 的文章

執行 exe 是沒問題,但若要在呼叫其他的java 程式我嘗試會沒反應,這點應該是索引位置判別錯誤的關係。
若將java 檔包成可執行檔如 jar 我想可以正常呼叫



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


public class JPing {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
Process process = null;
String line = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
String ip = "127.0.0.1"; //要Ping 的IP位址
try {
process = runtime.exec("ping " + ip);
is = process.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
while ( (line = br.readLine()) != null) {
System.out.println(line);
System.out.flush();
}
is.close();
isr.close();
br.close();
System.out.println("Java 呼叫 ping 程式,執行完畢!");
}
catch (IOException e) {
System.out.println(e);
runtime.exit(0);
}
}//end main method
}//end class


2010年10月13日 星期三

java 動態button 宣告

以下範例 是宣告 按鈕數目多少,之後在 panel 上顯示按鈕

之後 要改成動態的話,可以由外部讀取檔案決定 按鈕的數目及相關的資訊


import javax.swing.SwingUtilities;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Rectangle;
import javax.swing.JOptionPane;
import java.awt.Frame;





public class layout extends JFrame{

/// 宣告要產生 button 的數目
private int _programNum=6;

/// JPanel
private JPanel jContentPane = null;

/// 宣告 JButton 的數目
private JButton[] jButtons = new JButton[_programNum];



/**
* @param args
*/
public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {
public void run() {
layout thisClass = new layout();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}

/**
* This is the default constructor
*/
public layout() {
super();
initialize();
}

/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(348, 224);
this.setContentPane(getJContentPane());
this.setTitle("動態產生 JButton");

/// 打開window 的事件
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent e) {
System.out.println("Open Window");
}
});

}

/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {

if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);

/// 逐次添加 JButton
for(int i=0;i<_programNum;i++)
{

jContentPane.add(GetJButtons(i), null);
}
}
return jContentPane;
}


/**
* This method initializes JButtons [i]
*
* @return javax.swing.JButton
*/
private JButton GetJButtons(final int i) {

/// 宣告
jButtons[i] = new JButton();
/// 設定範圍
jButtons[i].setBounds(new Rectangle(12, 12+i*50, 310, 59));
/// 設定顯示文字
jButtons[i].setText("範例按鈕"+i);
/// 設定提示
jButtons[i].setToolTipText("快點按我!"+i);

/// 設定按鈕
jButtons[i].addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println(" 按了範例按鈕"+i);
Frame frame = new Frame();
JOptionPane.showMessageDialog(frame, "按了範例按鈕"+i);
}
});

return jButtons[i];
}


}


2010年10月12日 星期二

java XML 讀取

轉貼自網路 http://java.chinaitlab.com/XMLBeans/717370_2.html


1)DOM(JAXP Crimson解析器)

DOM是用與平臺和語言無關的方式表示XML文檔的官方W3C標準。DOM是以層次結構組織的節點或資訊片斷的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文檔和構造層次結構,然後才能做任何工作。由於它是基於資訊層次的,因而DOM被認為是基於樹或基於物件的。DOM以及廣義的基於樹的處理具有幾個優點。首先,由於樹在記憶體中是持久的,因此可以修改它以便應用程式能對資料和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。DOM使用起來也要簡單得多。

2)SAX

SAX處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的資料被處理。而且,由於應用程式只是在讀取資料時檢查資料,因此不需要將資料存儲在記憶體中。這對於大型文檔來說是個巨大的優點。事實上,應用程式甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX還比它的替代者DOM快許多。

選擇DOM還是選擇SAX? 對於需要自己編寫代碼來處理XML文檔的開發人員來說, 選擇DOM還是SAX解析模型是一個非常重要的設計決策。 DOM採用建立樹形結構的方式訪問XML文檔,而SAX採用的事件模型。

DOM解析器把XML文檔轉化為一個包含其內容的樹,並可以對樹進行遍曆。用DOM解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然後利用navigation APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由於使用DOM解析器的時候需要處理整個XML文檔,所以對性能和記憶體的要求比較高,尤其是遇到很大的XML檔的時候。由於它的遍曆能力,DOM解析器常用于XML文檔需要頻繁的改變的服務中。

SAX解析器採用了基於事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以啟動一個回調方法,告訴該方法制定的標籤已經找到。SAX對記憶體的要求通常會比較低,因為它讓開發人員自己來決定所要處理的tag.特別是當開發人員只需要處理文檔中所包含的部分資料時,SAX這種擴展能力得到了更好的體現。但用SAX解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同資料。

3)JDOM http://www.jdom.org

JDOM的目的是成為Java特定文檔模型,它簡化與XML的交互並且比使用DOM實現更快。由於是第一個Java特定模型,JDOM一直得到大力推廣和促進。正在考慮通過"Java規範請求JSR-102"將它最終用作"Java標準擴展"。從2000年初就已經開始了JDOM開發。

JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用介面。這在某些方面簡化了API,但是也限制了靈活性。第二,API大量使用了 Collections類,簡化了那些已經熟悉這些類的Java開發者的使用。

JDOM文檔聲明其目的是"使用20%(或更少)的精力解決80%(或更多)Java/XML問題"(根據學習曲線假定為20%)。JDOM對於大多數Java/XML應用程式來說當然是有用的,並且大多數開發者發現API比DOM容易理解得多。JDOM還包括對程式列為的相當廣泛檢查以防止用戶做任何在XML中無意義的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情況下的錯誤)。這也許是比學習DOM或JDOM介面都更有意義的工作。

JDOM自身不包含解析器。它通常使用SAX2解析器來解析和驗證輸入XML文檔(儘管它還可以將以前構造的DOM表示作為輸入)。它包含一些轉換器以將JDOM表示輸出成SAX2事件流、DOM模型或XML文本文檔。JDOM是在Apache許可證變體下發佈的開放源碼。

4)DOM4J http://dom4j.sourceforge.net

雖然DOM4J代表了完全獨立的開發結果,但最初,它是JDOM的一種智慧分支。它合併了許多超出基本XML文檔表示的功能,包括集成的XPath支持、XML Schema支援以及用於大文檔或流化文檔的基於事件的處理。它還提供了構建文檔表示的選項,它通過DOM4J API和標準DOM介面具有並行訪問功能。從2000下半年開始,它就一直處於開發之中。

為支援所有這些功能,DOM4J使用介面和抽象基本類方法。DOM4J大量使用了API中的Collections類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然DOM4J付出了更複雜的API的代價,但是它提供了比JDOM大得多的靈活性。

在添加靈活性、XPath集成和對大文檔處理的目標時,DOM4J的目標與JDOM是一樣的:針對Java開發者的易用性和直觀操作。它還致力於成為比JDOM更完整的解決方案,實現在本質上處理所有Java/XML問題的目標。在完成該目標時,它比JDOM更少強調防止不正確的應用程式列為。

DOM4J是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟體。如今你可以看到越來越多的Java軟體都在使用DOM4J來讀寫XML,特別值得一提的是連Sun的JAXM也在用DOM4J.

2...... 比較

1)DOM4J性能最好,連Sun的JAXM也在用DOM4J.目前許多開源專案中大量採用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J 來讀取XML配置檔。如果不考慮可攜性,那就採用DOM4J.

2)JDOM和DOM在性能測試時表現不佳,在測試10M文檔時記憶體溢出。在小文檔情況下還值得考慮使用DOM和JDOM.雖然JDOM的開發者已經說明他們期望在正式發行版前專注性能問題,但是從性能觀點來看,它確實沒有值得推薦之處。另外,DOM仍是一個非常好的選擇。DOM實現廣泛應用於多種編程語言。它還是許多其他與XML相關的標準的基礎,因為它正式獲得W3C推薦(與基於非標準的Java模型相對),所以在某些類型的專案中可能也需要它(如在JavaScript中使用DOM)。

3)SAX表現較好,這要依賴於它特定的解析方式-事件驅動。一個SAX檢測即將到來的XML流,但並沒有載入到記憶體(當然當XML流被讀入時,會有部分文檔暫時隱藏在記憶體中)。


----------------------------------------------------------

就JDK 而言, DOM 和 SAX 兩個方法不用在額外 import 其他的 library.



以下是我用DOM 讀取的簡單範例



XML 內容, Sample.xml

<?xml version="1.0" encoding="UTF-8"?>
<cmds>
<cmd text="Test1" path="Add" params="3 5"/>
<cmd text="Test2" path="Add" params="7 9"/>
</cmds>


讀取XML 的 function



/**
* GetXMLInfo
*
* 讀取XML 檔案並儲存於陣列 RecordS 之中
*
*/
private String[][] GetXMLInfo()
{

/// the string array to record the XML info 讀取XML 資訊的陣列
String[][] RecordS ;

try{
File f=new File("Sample.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("cmd");

int _cmdLength = nl.getLength();

/// 目前XML 格式設定有3個屬性
int _cmdAttributes=3;

RecordS = new String[_cmdLength][_cmdAttributes];

for (int i=0;i<_cmdLength;i++){

RecordS[i][0]= nl.item(i).getAttributes().getNamedItem("text").getNodeValue();
RecordS[i][1]= nl.item(i).getAttributes().getNamedItem("path").getNodeValue();
RecordS[i][2]= nl.item(i).getAttributes().getNamedItem("params").getNodeValue();

}

//System.out.println("cmd " + RecordS.length);

}
catch(Exception e){
e.printStackTrace();
RecordS = null;
}


return RecordS;
}



2010年9月15日 星期三

GIMP 應用 雲霧效果 與行星背景 圖案 製作

GIMP 是一個免費的影像處理軟體,可以到官方網站下載

我這裡參考了一個教學的blog GIMP基礎功與範例教學

以下是我自己的步驟摘要


1. 建立新的圖片,這裡長寬設為512 ,但不是必要




2. 使用 濾鏡 功能 產生 隨機的地圖或雲狀圖形, 濾鏡->描繪->雲朵-> Solid Noise

注:
Difference Clouds 也是相同效果,但會根據背景圖案而產生不同的顏色,
Solid Noise 產生的都是灰階的圖案




3. 可鋪排打勾,將圖片貼到球形的物件就會密合,
不同的屬性可以產生不同的圖案




4. 選擇漸層的顏色 , 顏色 -> 映射 -> Gradient Map



5. 將顏色打在上面, 顏色-> 映射 ->




6. 顏色改變後的效果



7. 接下來是要產生雲的效果,首先要新增一個圖層叫cloud 好了



8. 顯示圖層, 有眼睛的圖案就表示現在會顯示的圖層,這裡先把底圖顯示關掉,只顯示cloud那層







9. 使用 濾鏡 功能 在 cloud 這圖層 產生 隨機的雲狀圖形, 濾鏡->描繪->雲朵-> Solid Noise





10. 設定透明度, 圖層 -> 透明度 -> 色彩轉為透明




11. 將黑色轉為透明




12. 含有雲效果的圖形

2010年9月7日 星期二

C# Code Snippet 功能

# Code Snippet 就是將定義好得程式碼結構,直接插入在程式中,
舉例來說 , 在程式碼中 , 滑鼠右鍵 , 選擇 Insert Sniooet ,就可以將 do while 等 插入在程式碼中







# 若要自行定義的話 可以使用 像 Snippet Editor 的工具

#可以參考 MS 的定義http://msdn.microsoft.com/en-us/library/9bt0w6h6%28VS.80%29.aspx

2010年8月30日 星期一

轉貼 FileUpload google app engine java(图片上传实例demo)

google appengine 可以用來儲存相當多的資料,不同於文字,若要儲存圖片的話就比較麻煩一些


以下轉貼自 http://mimaiji.appspot.com/article?method=view&id=9001


程式碼簡單分成四個部份

1. 圖片物件 Photo.java



import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Blob;


@PersistenceCapable(identityType = IdentityType.APPLICATION,detachable="true")
public class Photo {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;

@SuppressWarnings("unused")
@Persistent
private String photoID;


@SuppressWarnings("unused")
@Persistent
private Blob photoO;


public Photo(Blob ObjBlob)
{
this.photoO = ObjBlob;
}



public Blob getPhoto() {
return this.photoO;
}

public Long getId() {
return this.id;
}


}






2. 資料存取物件 PhotoDao.java





import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;

public class PhotoDao {
private static PhotoDao _instance = null;

public static PhotoDao getInstance() {
if (_instance == null) {
_instance = new PhotoDao();
}
return _instance;
}

public String insertPhoto(Photo photo) {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(photo);
} finally {
pm.close();
}
return photo.getId().toString();
}


public Photo getById(Long id) {
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery(Photo.class);
query.setFilter("id == idParam");
query.declareParameters("Long idParam");
List photo = null;
try {
photo = (List) query.execute(id);
if (photo.isEmpty()){
return null;
}else{
return (Photo) photo.get(0);
}

} finally {
query.closeAll();
}
}
}





3. PhotoServlet.java, Servlet 的設定,
3-1.這個例子要 import Apache 的 "
commons-fileupload" 和 "commons-io"
3-2. 下載完解壓縮, eciplse 專案中 加入 external jar, 如圖


3-3. 兩個 jar 要放在 \war\lib 中

3-4. code




import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

import com.google.appengine.api.datastore.Blob;

public class PhotoServlet extends HttpServlet{
/*display image*/
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
String id = req.getParameter("id");
Photo photo = PhotoDao.getInstance().getById(Long.parseLong(id));
Blob b = photo.getPhoto();
resp.setContentType("image/jpeg;charset=utf-8");
resp.getOutputStream().write(b.getBytes());
resp.getOutputStream().close();
}
/*upload image and add to datastore*/
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterator = null;
try {
iterator = upload.getItemIterator(req);
} catch (FileUploadException e) {
e.printStackTrace();
}
try {
while (iterator.hasNext()) {
FileItemStream item = iterator.next();
InputStream stream = item.openStream();
if (item.isFormField()) {
// Handle form field
} else {
Blob bImg = new Blob(IOUtils.toByteArray(stream));
Photo photo = new Photo(bImg);
String pid = PhotoDao.getInstance().insertPhoto(photo);
req.setAttribute("Pid", pid);
resp.getWriter().write("Success "+ photo.getId());
}

}
} catch (FileUploadException e) {
e.printStackTrace();
}

}

}





4. 在 web.xml 設定 servelt 的路徑






<servlet>
<servlet-name>PhotoServlet</servlet-name>
<servlet-class>ppp.com.PhotoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PhotoServlet</servlet-name>
<url-pattern>/PhotoServlet</url-pattern>
</servlet-mapping>




附註: 要將資料抓到程式中的話
可以利用 HTTP GET 的方式,來取得圖片的 Stream


例如 C# 為例將資料存成 BitmapImage


private void GetHTTPRequest(string URL)
{
/// try send message to the web, if success show that the connect correct
try
{
/// Create the request obj
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);

/// Set values for the request back
req.Method = "GET";

BitmapImage Bi = new BitmapImage();

Bi.BeginInit();

/// Set Bi source from MemoryStream
Bi.StreamSource = req.GetResponse().GetResponseStream();

Bi.EndInit();

IMG.Source = Bi;

}

catch{
Console.WriteLine("Error");
}
}

WPF 教學網站心得摘要 lesson 25-28

看完 微軟所提供的教學影片 所紀錄下來的心得摘要

網址
http://msdn.microsoft.com/zh-tw/netframework/cc963622.aspx

# 25 3D 繪圖 #3 – 3D材質處理技巧

1. 材質設定的範例,例如漸層、圖片(Imagebrash)


2. 內建3D 模型介紹

a. Sphere3D ,圓球體

b. Cylinder3D,圓柱體

c. Cone3D 圓錐體


# 26 3D 繪圖 #4 – 攝影機運鏡技巧

1. Position,攝影機座標,三維位置,攝影機位置
2. LookDirection,看得方向 ,相對作標
3. Updirection,法向量,三維
4. FieldofView,觀景窗角度,有點像鏡頭遠近
5. FarPlaneDistance, 最遠可視距離,小->近
6. NearPlaneDistance, 最近可視距離


# 27 3D 繪圖 #5 – 那是什麼光? 3D 光源使用技巧

1. 光源類型
a. AmbientLight (環繞光源),環境光
b. DirectionLight(方向性光源),太陽光
c. PointLight (點光源),燭光
d. SpotLight (聚光燈光源),聚光燈,手電筒

2. 常用屬性
a. Position 光源
b. Color 顏色
c. Diretcion 方向(PointLight 沒有這個設定)

3. PointLight 特殊光的範圍
Range 可以設定光可以照到的距離

4. SpotLight 特殊光的範圍
a. InnerConeAngle
b. OuterConeAngle

5. 宣告兩個 ModelView3D 可以同時照兩種光


# 28 3D 繪圖 #6 – 神奇的 3D 動畫

1. 控制攝影機的角度動畫
操作 Viewport3D.camera.PerpectiveCamera
的 position

2. 直接控制 Viewport3D.Transform

範例是 rotation,要設在 定義茶壺的那個Viewport3D,
中的 AxisAngleRoation3D, 旋轉 x軸

3. 若有兩個以上的動畫設定,要使用Transform3DGroup

2010年8月24日 星期二

Eclipse 中文註解

在 Eclipse 中 寫程式的話, 若想是用 中文的註解 就會出現 MS950 ... 的 錯誤訊息。


以下是在 Ecpipse 3.4.2 的設定方法
1. 選擇專案


2. Edit-> SetEncoding


3. 設定格式 為 utf-8




可以參考

http://www.wretch.cc/blog/pon24/13729920

或 google 一下 eclipse ms950 就可以找到相關文章

2010年8月17日 星期二

Facebook api for C# 2 upload image

上一篇的sample 可能有點不太清楚, 經過我實際測試後用 WPF 寫出了一個簡單的例子



摘錄幾段必須的code

1. 加入 reference " Facebook.dll"
下載 http://facebooktoolkit.codeplex.com/releases/view/39727
網頁中的 SDK_Binaries.zip ,
解壓縮後就可以找到


2. DesktopSession 的宣告


_appKey = ""; /// appKey 由自己在facebook 中建立的AP 中取得
_sessionSecret=""; /// sessionSecret 由自己在facebook 中建立的AP 中取得


/// setting the session
session = new DesktopSession(_appKey, _sessionSecret,
null,
true,
new List() { Enums.ExtendedPermissions.read_stream, Enums.ExtendedPermissions.publish_stream });






3. login, 會自己跳出一個 facebook 的登入頁面,若有設定紀錄的話則不會出現填帳號密碼的畫面
, 成功的話 session 中的 UserId SessionKey 會填入值


session.Login();



4. 宣告 api 物件, 將登入訊息 session 傳入, 之後就可以利用 api 物件連結控制存取 facebook 的 資料


Api _api = new Api(session);



5. 範例 取得使用者名稱,取得使用者資訊 user , 這裡以 名稱為例


/// Get user information
user _user = _api.Users.GetInfo();

Console.WriteLine(_user.name);



6. 範例 上傳相片 , 這裡示範兩種方式

a. Upload

/// upload image (AlbumID 相本名稱 , caption 說明 , FileInfo 圖片檔案 )
_api.Photos.Upload("CatonTest", "Upload by Caton Test", _data);


b. UploadAsync
image type 詳細可以看 http://www.java2s.com/Open-Source/CSharp/Network-Clients/Facebook%20Developer%20Toolkit/Facebook/Rest/Photos.cs.htm
的 _mimeTypes



/// _photoRoot 檔案路徑 ex. C:\sample.bmp

/// Get image as byte array
byte[] _image = FileToByteArray(_photoRoot);

/// image type 這裡設image/gif 但我試過用 bmp 檔也可以成功上傳
/// UploadAsync(AlbumID 相本名稱 , caption 說明 , image as byte array, image type , callback function , state )
_api.Photos.UploadAsync("CatonTest", "Upload by Caton Test", _image, "image/gif", AsyncDemoCompleted, null);


UploadAsync 的 callback function

private static void AsyncDemoCompleted(photo photo, Object state, FacebookException e)
{
var actual = photo;
Console.WriteLine("upload async OK~~~~! ");
}



7. 附註

建立相簿的功能可以用 function :
_api.Photos.CreateAlbum

不過目前測試取得相簿清單的函式都會失敗, 清單都是0筆


IList albums = _api.Photos.GetAlbums();

2010年8月16日 星期一

Facebook api for C#

FaceBook 提供了 API 給不同的 程式開發、這裡就來介紹一下 C# WPF 的一些心得


首先要 到這個網站 download API 所需要的檔案

http://facebooktoolkit.codeplex.com/releases/view/39727

裡面有一個 Samples 的 zip 檔, download 下來就可以跑 DEMO 例子


-------------------------------------

在跑 Samples 的例子之前,必須要在 facebook 建立一個 application 並取得 API 金鑰

建立一個 application:
連到 facebook developer



建立新應用程式






取得相關訊息




接者可以打開 samp file 將 API 金鑰 替換即可

sample code 這個 sample 是 FBToolkit.Samples.WPF 的專案




public partial class MainWindow : Window
{
DesktopSession session;
public static BindingManager FacebookService { get; private set; }

public MainWindow()
{

///DesktopSession(string appKey, string sessionSecret, string sessionKey, bool isWPF, List permissions)


session = new DesktopSession(

appKey, null, null, true, new List() { Enums.ExtendedPermissions.read_stream, Enums.ExtendedPermissions.publish_stream });


session.Login();
Api api = new Api(session);

var friends = api.Friends.GetUserObjects();

var service = BindingManager.CreateInstance(session);

ServiceProvider.Initialize(service);

InitializeComponent();

}
}

2010年8月3日 星期二

心得 C# String += 與 StringBuilder().Append

在 C# 中 ,若是作文字相加的功能,在效率上

使用 StringBuilder 比 String 快得多

2010年7月26日 星期一

轉錄 Silverlight 支援多國語言

轉錄自 kevin Yang 的博客


主要是利用 定義 資源 resource 的方式 來 達成多國語言的方法, ex . StringLibrary.resx


有幾點要注意:

1. 定義好得資源(StringLibrary.resx)要裡面的屬性要設為 public
2. 若資源有新增欄位的話,要重新設定程式為public, 系統會自動改為internal
3. XAML檔要引用資源
4. 語法如下 假設是 text 是要多國語言的地方
Text="{Binding TE , Source={StaticResource MyStringLibrary}}
TE 是欄位名稱, MyStringLibrary 是在引用的時候所取得名字
5. 修改 Xap 的 SupportedCultures 屬性

System.Net.Mail.Attachment 附件含有中文所遇到的錯誤

詳細的狀況是這樣:
利用 System.Net.Mail.Attachment 的功能在 c# 程式 中寄信但是附件內容含有繁體或簡體中文就會錯誤!

我的解法是這樣:

先宣告一個 Attachment attchment;

一個 file 叫 新增文字文件.txt

將 新增文字文件.txt 放入附件

如code
attachment = new Attachment( "新增文字文件.txt ");


屬性設為 Name = 新增文字文件.txt ;
屬性設為 NameEncoding = Encoding.UTF8;
不要設定 attachment.ContentDisposition.FileName 的值, 因為這個屬性不支援中文

在我的測試下這樣就可以了

可以參考

http://webcache.googleusercontent.com/search?q=cache:w-S50DVqJycJ:blog.csdn.net/xrascal/archive/2009/07/12/4341062.aspx+attachment.ContentDisposition.FileName&cd=5&hl=zh-TW&ct=clnk&gl=tw

2010年7月12日 星期一

WPF 教學網站心得摘要 lesson 21-24

看完 微軟所提供的教學影片 所紀錄下來的心得摘要

網址
http://msdn.microsoft.com/zh-tw/netframework/cc963622.aspx


#21 控制項的資料繫結技巧 #4 – 階層式資料繫結
1. 引用cs 檔 在xaml
ex. 引用 Demo 的空間 (空間定義在Data.cs)並叫做 src
即code 為 "Demoxmlns:src="clr-namespace:Demo"

2. grid 裡面定資源 命名為 dso 型別是 LeagueList
ex. ObjectDataProvider x:Key="dso" ObjectType="{x:Type src:LeagueList}"

3. 定義 tree view 引用 dso
ex. <TreeViewItem Header="Demo #1"
ItemsSource="{Binding Source={StaticResource dso}}"
/>


4. 利用HierarchicalDataTemplate 來延伸裡面的定義
ex. <HierarchicalDataTemplate
DataType="{x:Type src:League}"
ItemsSource="{Binding Path=Divisions}"
>
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>


5. 同一資源 也可以用不同的地方引用 如 MenuItem


#22 XPS 文件處理



1. XPS 格式 一種文件交換格式,由MS所定義
支援的package :
System.IO.Packaging
System.Windows.Xps.Packaging

2. 除code引用之外,若系統已有支援XPS,則可以使用列印的方式產生

3. Office"12" Open XML Formats 也可以

4. 所有這種格式其實都是一個zip檔,改副檔名為zip後就可以解壓縮

5. 也可以自行定義

6. 在程式中可以用 doncument view 存放xps文件
7. 加入 ReachFramwork 元件 參考, 就可以使用XpsDocument 的物件,在用documentViewer1轉換後才可以在畫面上使用
ex. XpsDocument doc = new XpsDocument(@"C:\demo.xps", FileAccess.Read);
FixedDocumentSequence fds = doc.GetFixedDocumentSequence();
documentViewer1.Document = fds;


8. 呼叫列印對話方塊列印檔案
宣告 PrintDialog,
ex. PrintDialog pd = new PrintDialog();
// 設定列印範圍
pd.PageRangeSelection = PageRangeSelection.AllPages;
// 設定可否改變視窗大小
pd.UserPageRangeEnabled = true;

列印檔案
ex.
XpsDocument doc = new XpsDocument(@"C:\demo.xps", FileAccess.Read);
FixedDocumentSequence fds = doc.GetFixedDocumentSequence();
/// pd.PrintDocument(檔案序列,說明)
pd.PrintDocument(fds.DocumentPaginator, "Demo #1");


9. 加入 system.printing
code
/// 宣告 LocalPrintServer
LocalPrintServer lps = new LocalPrintServer();
/// 宣告 列印序列
PrintQueue pq = lps.DefaultPrintQueue;
/// 加入列印序列 pq.AddJob(序列名稱,檔案位置,是否進行多工緩衝處理)
pq.AddJob("Demo #1", @"C:\demo.xps", false);



# 23 3D 繪圖 #1 – 3D 繪圖概念與 3D WPF 組成元件

1. WPF 要顯示3D 的話要使用 Viewport3D 標籤

2. 元件: 模型、攝影機、光源

3. PerspectiveCamera Position 標籤:
設定
a. Position, 三維作標
b. LookDirection 攝影機的方向
c. UpDirection 法向量, 0,1,0 正常、0,-1,0 上下相反

4. 光源
a. AmbientLight(環繞光源), ex.室內
b. DirectionalLight(方向性光源) ex. 陽光照射
c. PointLight(點光源) ex. 蠟燭光
d. SpotLight(聚光燈光源) ex. 聚光燈

5. Demo 是 y 軸在旋轉

6. 在 ModelVisual3D 設定 模型內容、光源

7. 其他範例, 材質設定、光源設定


#24 3D 繪圖 #2 – 3D 模型顯示與處理

1. 在 Viewport3D 定義
模型 、光源 : ModelVisual3D 元素
攝影機 camera: Viewport3D.Camera


2. MeshGeometry3D 建立 3D 模型

3. GeometryModel3D.Material 定義圖案顏色

4. 模型是在原點 0,0,0

2010年7月9日 星期五

創新思考

基本上看看1~10頁就ok了,由於上課的時候這個題目太大,還沒整理的很好!


2010年7月7日 星期三

會議管理與執行

2010年7月6日 星期二

C#服務重新啟動

在 window 有 很多 Service, 我們可以在 控制台->系統管理工具->服務 中 來設定他的狀態。

若想要從程式端來設定服務, C# 也有提供這種功能

舉例來說 MSDN 上的 smaple code 就是 開啟 Alerter 這個服務



// Check whether the Alerter service is started.

ServiceController sc = new ServiceController();
sc.ServiceName = "Alerter";
Console.WriteLine("The Alerter service status is currently set to {0}",
sc.Status.ToString());

if (sc.Status == ServiceControllerStatus.Stopped)
{
// Start the service if the current status is stopped.

Console.WriteLine("Starting the Alerter service...");
try
{
// Start the service, and wait until its status is "Running".
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running);

// Display the current service status.
Console.WriteLine("The Alerter service status is now set to {0}.",
sc.Status.ToString());
}
catch (InvalidOperationException)
{
Console.WriteLine("Could not start the Alerter service.");
}
}



參考網址 MSDN- Service Start
參考網址 MSDN- Service controler 類別



下面補充 重新啟動 service 的 sample

http://www.csharp-examples.net/restart-windows-service/


雖然這裡範例是有將 stop service 和 start service 放在同一個 function 執行
但 在我撰寫的平台中 會 無法正常 達到重新啟動的效果, 原因是 將 service stop 後 放入 StopPending 但還沒 真正 stop ,
若強行 使用WaitForStatus 到真正結束 會出現 timeout 的 例外
但接者呼叫 start service 會出現 InvalidOperationException 的例外


所以 我使用的方法是將 stop service 和 start service 分別在不同函式呼叫避免掉這個問題

2010年6月21日 星期一

String 轉 short ( 0X...格式 )

要將一般的 紀錄 數字 的 string 轉為short(int16) 可以用以下的方法
在此先假設 這個 string temp 是 10 進位的數字

1. 強制轉型 (short) ex. (short)temp
2. System.Convert ex. System.Convert.ToInt16(temp)
3. Short.Parse() ex. short.Parse(temp)

--------------------------------------------------------------

但 若是 0x...格式的話 如 0x0012

則可以使用

System.Convert.ToInt16(temp,16)


參考網址 MSDN

2010年6月17日 星期四

WPF引用外部封裝的資源檔

在WPF 若要引用 XAML 檔的話 可以使用以下的簡單語法


System.Windows.Application.LoadComponent(System.Uri(@
"XXX.xaml",System.UriKind.Relative))


但是 若要使用 外部封裝的XAML檔的話 這種語法是會讀到主程式的相對路徑





如圖, A 是主程式,B 是引用的外部DLL ,此時呼叫 B 裡面的資源檔的話, 會從A 程式的相對位置找。

所以想要使用 在 B 定義的資源檔的話,code 就要改寫為


System.Windows.Application.LoadComponent( System.Uri(/DllName;component/XXX.xaml,System.UriKind.Relative))



DllName

就是B專案包成Dll的名稱




參考網頁
MSDN

Coding James






轉錄 C# 錄音 by directx

基本上是呼叫 directx 的 directsound 的函式庫來達成錄音的目的


Directx 下載

http://www.microsoft.com/downloads/details.aspx?FamilyID=2da43d38-db71-4c1b-bc6a-9b6652cd92a3&displaylang=en


Sample
http://blog.donews.com/uplook/archive/2005/12/14/657145.aspx

2010年6月7日 星期一

轉錄 C# 讀取 Excel

轉錄自 記憶是苦難的開始


連結字串中的HDR=YES,代表略過第一欄資料



//引用OleDb命名空間
using System.Data.OleDb;

string path = System.Windows.Forms.Application.StartupPath + @"\a.xls " ;
string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + path + ";Extended Properties='Excel 8.0;HDR=YES'";
OleDbConnection objConn = new OleDbConnection(strCon);
string strCom = " SELECT * FROM [Sheet1$] ";
objConn.Open();

OleDbDataAdapter objCmd = new OleDbDataAdapter(strCom, objConn);
DataSet objDS = new DataSet();
objCmd.Fill(objDS);
objConn.Close();

for (int i = 0; i < objDS.Tables[0].Rows.Count;i++ )
{
MessageBox.Show(objDS.Tables[0].Rows[i][1].ToString());
}




----------------------------------------------------
補充 取得行數列數

延伸上面例子的 objDS 物件
row number = objDS.Tables[0].Rows.Count

Column numbers = objDS.Tables[0].Columns.Count

2010年6月4日 星期五

WPF 教學網站心得摘要 lesson 17-20

看完 微軟所提供的教學影片 所紀錄下來的心得摘要

網址
http://msdn.microsoft.com/zh-tw/netframework/cc963622.aspx

#17 WPF 影像播放與畫面處理

1. 在XAML 檔中 新增 MediaElement 即可以設定檔案來源及其它的屬性
2. Triggers 在Grid宣告控制其他屬性
3. 利用event 來實現pause and resume 影片的功能
4. Slibar 的範例 (假設 mediaElement 命名為 mediaElement1)
a. 取得影片長度
mediaElement1.NaturalDuration.TimeSpan.TotalMilliseconds;
b. 取得影片現在播放位置
mediaElement1.Position.TotalMilliseconds;


#18 控制項的資料繫結技巧 #1 – 控制項之間的資料繫結
1. Binding 目標: 任何元素與屬性
2. Binding 來源: CLR 物件,
WPF元素,
ADO.NET,
XML
3. Binding 模型: 一次繫結、單向繫結,雙向繫結

4. 動態Binding : inotufyPropertyChanged、DependencyProperty、PropertyDescriptor

5. 語法範例 { Binding Path = Value, ElementName= Binding物件名稱 }
6. ObjectDataProvider 的使用,把物件宣告在XAML檔

#19 控制項的資料繫結技巧 #2 – 資料樣版的定義與套用

1. 資料樣板的設定 (宣告一個class及在XAML檔中宣告引用)
2. XAML檔 新增NameSpace , 例 xmlns = "clr-namespace:NameSpace名稱"

#20 控制項的資料繫結技巧 #3 – Master-Details 資料繫結

1. 宣告樹狀結構CLASS ,以大聯盟球隊為例,(聯盟->區域->球隊)
2. 在listBox 設定兩個屬性決定,資料來源和樣板
a. 資料來源ItemsSource : EX. ItemsSource="{Binding Path=Divisions/Teams}"
b. 樣板ItemTemplate: EX. ItemTemplate="{DynamicResource myTemplate}"

2010年6月2日 星期三

C# 隱藏 Cursor 和 Stylus

Cursor 隱藏 /顯示
顯示 Cursor
System.Windows.Forms.Cursor.Hide();
顯示 Cursor
System.Windows.Forms.Cursor.Show();

詳細可參閱 MSDN


Stylus 隱 藏 /顯示

轉錄 Coding James 在 WPF中關閉觸控指標(Disable Touch Pointer)




private void DisableTouchStylus(UIElement u)
{
/// disable flicks gesture
Stylus.SetIsFlicksEnabled(u, false);

/// disable press and hold gesture
Stylus.SetIsPressAndHoldEnabled(u, false);

/// disable tap gesture
Stylus.SetIsTapFeedbackEnabled(u, false);

/// disable touch pointer
Stylus.SetIsTouchFeedbackEnabled(u, false);
}



c# BackGroundWorker

BackGroundWorker

簡單的說讓成是在背景後台環境下執行而不影響 UI

這裡敘述還蠻詳細的
http://www.cnblogs.com/scottckt/archive/2008/05/08/1188974.html

C#取得滑鼠座標

在網路上找到兩種方式

1. GetCursorPos

引用 user32.dll 的 GetCursorPos function

sample code


// We need to use unmanaged code
[DllImport("user32.dll")]
// GetCursorPos() makes everything possible
static extern bool GetCursorPos(ref Point lpPoint);



Point 中包含 滑鼠的X,Y 座標

參考網站
http://blog.sina.com.cn/s/blog_53864cba0100ch28.html

不過我試不出來....

2. Mouse.GetPosition

使用 System.Windows.Input 的 mouse.GetPosition 傳入 window 或 panel ...
回傳 滑鼠在該物件的 相對座標 (Point)

code


using System.Windows.Input;

......



// displayArea is a StackPanel and txtBoxMousePosition is
// a TextBox used to display the position of the mouse pointer.
Point position = Mouse.GetPosition(displayArea);
txtBoxMousePosition.Text = "X: " + position.X +
"\n" +
"Y: " + position.Y;



參考網址 http://msdn.microsoft.com/zh-tw/library/system.windows.input.mouse.getposition%28VS.90%29.aspx

開新視窗產生錯誤 XamlParseException

在 WPF 中嘗試由程式呼叫打開新視窗(open new window),不知道為何會產生這個錯誤





後來查了一下,推測應該是資源沒有釋放出來,解覺得方式很簡單,只要引用 msvcr70.dll 的 _fpreset() 函式即可, 若是xp環境下可以不比特別指出這個dll 的位置,但在win7(64位元,32位元沒試過)中必須要明確的引用這個dll的路徑

msvcr70.dll 在 xp 的路徑在 C:\WINDOWS\system32


sample code

FailOpenWindow.xaml.cs (Interaction logic for FailOpenWindow.xaml)



public partial class FailOpenWindow : Window
{

[DllImport("msvcr70.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int _fpreset();

public FailOpenWindow()
{
// Reset the Floating Point (When called from External Application there was an Overflow exception)
_fpreset();

InitializeComponent();
}

}




參考網址 http://social.msdn.microsoft.com/Forums/en/wpf/thread/a31f9c7a-0e15-4a09-a544-bec07f0f152c

2010年5月13日 星期四

轉貼 - 讓WPF 介面能全球化和本地化

轉貼自 狼翔天地
http://jjnnykimo.pixnet.net/blog/post/21885938


作一些簡單的補充

簡單的說,建立一個 lang 的資料夾,存放 ResourceDictionary(WPF) 的格式的xaml檔 來存放不同的語言

接者在
程式啟動後就呼叫讀取存放語言的XAML


注意在 button 那邊要使用
DynamicResource 來 讀取 lang 資料夾中所設定的語言

如 Button 中的 Content="{DynamicResource Cancel }"

使用 DynamicResource 的話當 程式會依據 作業系統中設定的地區語言選項改變來作變更



地區語言選項取得補充:


http://msdn.microsoft.com/zh-cn/library/system.globalization.cultureinfo%28en-us,VS.71%29.aspx (MSDN)

http://www.cnblogs.com/whtydn/archive/2009/10/13/1582279.html (风浪网编程海角 中的整理)


此外
CultureInfo.CurrentCulture.Name 是取得全名

如 台灣是
zh-TW

若要只取語系的話
可以用
CultureInfo.CurrentCulture.TwoLetterISOLanguageName
or
CultureInfo.CurrentCulture.Parent.Name
or
currentCultureInfo.Parent.IetfLanguageTag

三 個方式取得

如台灣的話就會取得
zh






2010年5月5日 星期三

轉錄 同時撥放音效

雖然之前有紀錄 一篇使用System.Media.SoundPlayer 撥放音效的方法

但是 SoundPlayer 的方法 一次只能播放一個聲音檔,若要同時有背景音樂 和音效的 話用 sound player 方法 就不可能實現。



這裡我的方式是將背景音樂用SoundPlayer 播放, 音效的話就使用 WindowsMediaPlayer 的方式播放

WindowsMediaPlayer 要 add reference 在 com 元件中的 windows media player , 順利引用後就會有一個WMPLib 的 name space


簡單的播放 code 如下

WMPLib.WindowsMediaPlayer mplayer = new WMPLib.WindowsMediaPlayer();

mplayer.URL = "聲音檔位置";
mplayer.controls.play();




網路上還有說道其他的方式,如 用 多個thread 放 SoundPlayer ,不過我是沒有試出來就是




/// WindowsMediaPlayer 設定循環撥放的方法
mplayer.settings.setMode("loop", true); 轉自 阿偉蘇的程式記事本



附錄 轉錄四種播放聲音的方法
http://www.sunxin.org/forum/thread/18937.html?page=0

2010年5月4日 星期二

WPF 教學網站心得摘要 lesson 13 - 16

看完 微軟所提供的教學影片 所紀錄下來的心得摘要

網址
http://msdn.microsoft.com/zh-tw/netframework/cc963622.aspx


#13 2D 動畫 #1 – 宣告式動畫使用技巧
1. 如何在xaml檔建立動畫
storyboard 屬性設定
兩個屬性範例
a. autoReverse: 動畫執行完畢接下來會倒者執行, boolean
b. repeatDeavior: 是否重複執行,內建type , 要的話裡面輸入"Forver"
2. Triggers : 觸發事件讓物件的屬性作變化,
example: page.load 事件
3. 範例
a. 放大 : DoubleAnimation
b. 旋轉: DoubleAnimation
c. 顏色變換: ColorAnimation
d. 移動:PointAnimation


#14 2D 動畫 #2 – 事件觸發技術與動畫應用

事件的使用,如滑鼠 click事件
範例包含:
1. start : 最好將 StoryBorad命名 好讓其他功能能呼叫如 Pause, Resume,Stop
2. Pause: PauseStoryboard
3. Resume: ResumeStoryboard
4. Stop: StopStoryboard



#15 2D 動畫 #3 – 使用程式碼控制動畫運行

兩個範例

1. 變更寬度大小: DoubleAnimation
2. 變更顏色: ColorAnimation
3. TimeSpan的宣告方式: (時,分,秒)
4. 呼叫的方式用 BeginAnimation(屬性,物件)
以改變寬度為例 , 屬性 為 Rectangle.WidthProperty ,物件 如 DoubleAnimation
5. 可以用 Storyboard 的方式, add 需要使用animation(xxx.child.add) ,然後在一次呼叫


#16 2D 動畫 #4 – 使用 Path 製作各類型動畫路徑

1. 使用path 定義畫出路徑 (PathGeometry)
2. 範例有 從 xaml 檔 和 外部使用code控制的方法

2010年5月3日 星期一

音效產生編輯軟體

好得應用程式加上音效會有一種畫龍點金的效果,
在此作一些簡單的紀錄一些錄音編輯產生音效的軟體,

1. Audacity(free)
錄音混音都可以

2. SmartSound(有試用版)
音效後製處理

3. ACID(有試用版)
音效後製處理

4. VMPK(free)
模擬鋼琴等樂器產生音效

5. sfxr(free)
產生復古小遊戲的音效

6. Overture 4.0
讀譜和製作樂譜的軟體,好像有點離題

2010年4月23日 星期五

WPF 教學網站心得摘要 lesson 9 - 12

看完 微軟所提供的教學影片 所紀錄下來的心得摘要

網址
http://msdn.microsoft.com/zh-tw/netframework/cc963622.aspx


#9 WPF 樣式與資源 #2 – 使用樣式製作不一樣的 ListBox 外觀

1. 樣式設定,這裡Demo 三種自訂的 list box 樣式(包括 圖片和文字)
a. 下拉式
b. 水平捲軸
c. 並排,像 windows 檢視資料夾中的並排選項

2. 定義類別UserInfo 包含 名字 和 圖片路徑兩種屬性,及相關的get set 方法

3. 撈資料用 Binding

4. Set property 是修改 listBox 裡的 ItemTemplate面填一個grid 包含 一個矩形(抓圖片) 和 一個 Text(抓文字)

#10 如何進行畫面裁切與裁切技術應用技巧

1. 裁切的屬性是 clip ,如 image.clip

2. 裁切的範例
a. 橢圓(EllipseGeometry),要設定 圓心和兩個半徑
b. 不規則型(PathGeometry),不規則型,範例是一個封閉的三角形

3. 在影片上作裁切
a. 格式化文字物件 :FormattedText
b. 挖空影片效果,影片中挖出文字邊框、只顯現文字但文字中心的圖案是影片

# 11 WPF 2D 圖形矩陣轉換特效的應用

1. 轉換特性這裡介紹:
a. 旋轉 (Rotate) ,設定中心點(Center X,Center Y)+角度(Angle)
b. 平移(translate),設定 x軸距離(X)、y軸距離(Y)
c. 比例(Scale),設定 x軸比例(ScaleX)、y軸比例(Scale)ScaleX
d. skew ,在2d做出類3d的效果,設定(Center X,Center Y)

2. 屬性: RenderTransform

3. Timmer 的應用,在C#用 Timmer 來讓圖片動態變更
a. using System.windows.Form
b.使用 TransfromGroup 當有兩個以上的轉換特效要用時
c. 子元數的新增方式: XXX.children.add(), 如 TransfromGroup.children.add()

#12 各類型 WPF 畫布的使用技巧

介紹
1. StackPanel: 圖形會自動堆疊,不會重疊,可以設水平方向或垂直的方向

2. DockPanel: 設定圖形切齊panel 的方向,如切齊左邊,切齊上面等等,每張圖也不會重疊

3. 如何將 canvas畫出的圖 儲存在檔案中
a. inkCanvas 可以在範圍內用滑鼠或觸控裝置畫圖
b. fileStream 的應用


2.

轉錄C# 播放音效

使用 System.Media.SoundPlayer 類別

System.Media.SoundPlayer sp = new System.Media.SoundPlayer();
sp.SoundLocation = @"C:\Wave音效檔\DoReMe.wav"; /// 音效檔位置
sp.Play(); // 撥放

// sp.Stop(); // 停止


轉錄自

http://blog.blueshop.com.tw/HammerChou/archive/2006/12/04/46096.aspx

2010年4月21日 星期三

WPF 教學網站心得摘要 lesson 5 - 8

看完 微軟所提供的教學影片 所紀錄下來的心得摘要

網址
http://msdn.microsoft.com/zh-tw/netframework/cc963622.aspx

#5 神奇的筆刷 #2 – 漸層筆刷

1. 這裡介紹兩種筆刷,LinearGradientBrush和 RadialGradientBrush
2. LinearGradientBrush可以藉由設定 startPoint 和 endpoint 來決定漸層的方向和位置
3. RadialGradientBrush 可藉由設定 GradientOrigion 來決定放射的中心
4. button 的背景也可以使用(background 屬性)
5. GradientStop 屬性設定決定 顏色 和 順序


#6 神奇的筆刷 #3 – 使用 VisualBrush 技術製作螢幕放大鏡

1. 倒影特效
a. VisualBrush 設定 visual 屬性 來設定原圖位置
b. ScaleTransform 屬性 決定放大比例
c. TranslateTramsform 屬性 決定要將哪個屬性顛倒,此範例是y(上下顛倒)
2. 放大鏡範例
a. 要挖一個洞好讓滑鼠事件能夠啟動到目標的 視窗上


#7 千變萬化的 WPF 文字方塊 – 控制項的外觀控制

純文字方塊的倒影
a. 反射純文字方塊
b. 可以把一堆圖形放在 grid 中 一起反射
c. 外框顏色屬性、字體顏色屬性

#8 WPF 樣式與資源 #1 – 如何定義資源與套用樣式

1. 樣式分四種
a. 屬性設定
b. Trigger
c. 動畫
d. 樣板

2. 資源大致分幾種,有上下的關係


3. 定義方式 :設定 Resources 屬性
a. 設定 style 標籤,記得命名 和 設定TargetType ,如這裡的範例是 button
b. Setter 標籤 設定要變更的屬性, property and value
c. 呼叫屬性 binding 的方式 且 { StaticResource + "設定的名稱" }

4. triggers 的應用
  a. IsMouseOver
b. IsPressed