2010年1月27日 星期三

Windows 7 - 自動登入

從「開始」→「執行」,然後在開啟欄位的地方輸入「netplwiz」,接著會跳出使用者帳戶的視窗。

先選擇要使用自動登入的使用者,然後把「必須輸入使用者名稱和密碼」的選項取消,接下來按確定,輸入完密碼後再按確定。

下次登入系統的時候就不用再輸入密碼了。

如果有更改到使用者設定,可能會需要再重新執行一次這個步驟。

2010年1月7日 星期四

JDBC - 驅動程式

如果是在Tomcat中,JSP或Sevlet需要存取資料庫,可將JDBC驅動程式用系統參數指定所在目錄,或者將JDBC驅動程式放置在web-app/lib目錄底下,web-app是自己建立的網頁服務應用程式所在目錄。

如果是一般java應用程式,利用socket建立連線要存取資料庫,可將JDBC驅動程式用系統參數指定所在目錄,或者放置在jdk的安裝路徑下的lib目錄。在執行的時候,如果發現類別找不到的例外狀況,只要將JDBC驅動程式複製一份,放在jre的安裝路徑下的lib\ext目錄,就可以解決問題。

2010年1月6日 星期三

Tomcat - 環境配置

最近想試試看用JSP來連結MySQL,
在Tomcat的環境配置上就遇到好多問題。

首先要有JDBC驅動程式。
去MySQL官方網站下載Connector-J驅動程式(例如mysql-connector-java-5.1.10-bin.jar),把驅動程式檔案放置到系統環境變數讀得到的地方(例如Tomcat目錄下的lib資料夾,設置系統環境變數CLASSPATH到lib目錄)。

再來是設定Tomcat的組態檔。
在Tomcat目錄下的conf目錄中,有一個server.xml,裡面的參數配置大致列為如下:

<Host name="localhost" appBase="webapps" 
   unpackwars="true" autoDeploy="false" 
   xmlValidation="false" xmlNamespaceAware="false"> 
  <Context path="" docBase="/Test" 
      debug="1" reloadable="true" 
      crossContext="true">
    <Resource name="jdbc/Test" auth="Container" 
         type="javax.sql.DataSource" 
         maxactive="100" maxidle="30" maxwait="-1"
         username="userid" password="passwd" 
         driverClassName="com.mysql.jdbc.Driver"
         url="jdbc:mysql://localhost/DBName?autoReconnect=true">
  </Context>
</Host>

其中Test可以改為自己所建置的Web-app目錄(Tomcat的預設目錄是ROOT),userid為資料庫的登入帳號,passwd為資料庫的登入密碼,DBName為資料庫名稱(在此假設資料庫的設定皆已完成)。因為是在本機端測試,所以localhost就不更動;若在遠端測試,可將localhost改為host主機名稱或者IP位址。

另外需要在Web-app目錄下的WEB-INF目錄哩,新增或設定web.xml內容為如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <resource-ref>
    <description>DataBase Connection</description>
    <res-ref-name>jdbc/Test</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>
encoding的UTF-8可以改為自己網頁的預設編碼。Test改為上面所設定的目錄。
最後就是測試看能不能連資料庫。

<%@ page import="java.util.*,javax.naming.*,
                 java.sql.*,javax.sql.*"
         contentType="text/html; charset=UTF-8" %>
<%
  Context initialContext = new InitialContext();
  Context context = (Context) initialContext.lookup("java:comp/env");
  DataSource dataSource = (DataSource)context.lookup("jdbc/Test");
  Connection connection = dataSource.getConnection();
  Statement statement = connection.createStatement();
  out.println("連接成功!");
  connection.close();
%>
有看到連接成功的字出現,就代表環境配置成功,接下來可以開始撰寫真正的JSP應用服務程式。

2009年12月23日 星期三

程式語言

現有好多種程式語言,
每種程式語言都有特色。

寫組合語言可以用8051、8086、SIC/XE;
寫應用工具可以用C/C++、C#、Java(J2SE)、Visual Basic、Matlab;
寫網頁可以用HTML、CSS、JavaScript、VBScript、Flash;
寫資料庫可以用MySQL、Oracle、JDBC、ODBC;
寫動態介面可以用PHP、ASP、JSP(J2EE)、Python;
寫手機可以用Java(J2ME);
寫硬體可以用Verilog、VHDL;
寫圖形處理可以用OpenGL、JOGL;
另外還有XML可攜帶資料傳輸。

還有很多程式語言及其所屬的開發工具沒列出來。

要學的東西還很多,
不過學有專攻,
沒有那麼多時間和精力都學。

程式語言只是工具,
要如何用工具去寫出道具,
這才是技術。

2009年12月12日 星期六

Ubuntu - ATI Catalyst 9.11 安裝

作業系統:Ubuntu 9.10 64bit
顯示卡:ATI Radeon HD 5770
顯示卡驅動:ATI Catalyst 9.11

最近ATI出了9.11版的Catalyst驅動程式,下載網址:Download Drivers

下載完的檔名為ati-driver-installer-9-11-x86.x86_64.run (這是64位元版本)。安裝時需要輸入指令:
sudo sh ati-driver-installer-9-11-x86.x86_64.run --buildpkg Ubuntu/karmic
sudo dpkg -i *.deb
sudo apt-get -f install
sudo aticonfig --initial -f

2009年12月2日 星期三

C# - 多執行緒(thread)+視窗元件(form)+委派(delegate)=發生問題

在寫C#的視窗應用程式,若使用多執行緒,並用委派和事件的方式使用到視窗元件,會碰到視窗元件的資料完整性問題,例如要輸出文字到文字方塊上。此時可以在被呼叫的方法裡加上判斷條件,防範此問題。

範例的委派宣告為:
public delegate void PrintDelegate(string message);

方法應定義在擁有視窗元件的類別中:
public void PrintFuction(string str){
  if(textBox.InvokeRequired){
    this.Invoke(new PrintDelegate(str), new object[] { str });
  }else{
    textBox.Text += str;
  }
}

C# - 委派(delegate)與事件(event)

C++有函數指標,可以傳遞方法,C#則有委派可以用。

下面有範例,方法定義在類別ExecuteClass中,要呼叫方法的類別是CallClass。
public class ExecuteClass{
  public void PrintFuction(string str){
    Console.Write(str); //輸出字串
  }
}

public class CallClass{
  public delegate void PrintDelegate(string message); //宣告委派型別
  public event PrintDelegate PrintEvent; //宣告事件
  public void CallFuction(string message){
    PrintEvent(message); //呼叫委派方法
  }
}

public class MainClass{
  public static void main(){
    ExecuteClass execute = new ExecuteClass();
    CallClass call = new CallClass();
    call.PrintEvent += execute.PrintFuction; //對事件註冊方法
    call.CallFuction("呼叫成功!");
  }
}