網頁

2010年12月9日 星期四

Perl – 純量變數(scalars)

Perl 的最基本的變數型態,可以是文字,也可以是數字,兩者可以互換。
變數名稱可含有數字、文字、以及下畫線"_",但是它們不可以數字開頭。


數值

整數和浮點數,又可以以八進位、十六進位和二進位表示。
$aa = 5;
$bb = 1.22;
$cc = 0523
$dd = 0x1c
$ee = 0b11110011

運算子(Operators)對照表,運算優先順序越往下越低:

-> 方法呼叫、解參考
++ 遞增, -- 遞減
** 乘冪(次方)
! 非,~ 位元運算的 非,\ 參考
=~ 比對相符,!~ 比對不符
* 乘,/ 除, % 求餘數, x 字串倍數
+ 加、- 減, . 字串連接
<< 位元左移,>> 位元右移
< 小於,> 大於,<= 小於或等於,>= 大於或等於,lt 字串小於,gt 字串大於,le 字串小於或等於,ge 字串大於或等於
== 等於,!= 不等於,<=> 數值比較,eq 字串等於,ne 字串不等於,cmp 字串比較
& 位元AND
| 位元OR,^ 位元 XOR
&& AND(且)
|| OR (或)
.. 範圍
? : 三元運算子,例: ($a > $b) ? $a : $b;
= 指定,+=、-=,*= 等等
, 逗號運算子,=> 箭號運算子
not 邏輯的 NOT
and 邏輯的 AND
or  邏輯的 OR
xor 邏輯的 XOR

字串

字串由任意字元組成,必須以單引號或雙引號刮起來。
$str = ‘test’;
$chstr = “中文也可以”;

單引號和雙引號兩個使用區別
1, 單引號無法使用跳脫字元,會完整呈現出來。
2. 單引號無法做變數代換。

Perl 常見的跳脫字元:

\n   換行符號
\r   回行符號
\t   定位 tab 符號
\f   跳頁
\b   退格
\a   鈴聲
\0   八進位數,如:\007
\x   十六進位數,如:\x16
\\   \ 這個符號
\"   " 雙引號

scalars.pl
#!/usr/bin/perl
$str = "test";
print '$str\n';
print "$str\n";

$ scalars.pl
$str\ntest

數值和字串的運算

數值和字串可以一起運算,結果視目的而定。
$v1 = 91;
$v2 = '1';

print $v1 + $v2;
結果:92 (數值)

$v1 = 91;
$v2 = '1';

print $v2 . $v1;
結果:911 (字串)

$v1 = '123';

print $v1 * 1;

結果:123 (數值)


閱讀全文...

Perl: 1. Perl 之旅

前言
最好具備有下列條件:
  1. 已瞭解 HTML 語法並且寫過程式(C, C++, java...)。
  2. 系統已經安裝 Perl 5.x 的環境,Linux 或 Windows 皆可。

Perl 歷史
  • Perl 是一個非常強大的 script language。它的全名是 Practical Extraction and Report Language。
  • 由 Larry Wall 創造出來,在1987年時最早出現在 usenet 的新聞群組 comp.source。
  • Perl is Free Software, available under the Artistic License and the GPL
  • Perl的沿革:
    • 1987/10/18發表Perl 1.0。
    • 1994年發表Perl 5 始具有OOP的作法。
    • 5.8.0 版開始, Perl 具備了Unicode (萬國碼) 支援。
      • 將 Big5 編碼的檔案轉成 Unicode,祗需鍵入下列指令
      • 
        perl -Mencoding=big5,STDOUT,utf8 -pe1 < file.big5 > file.utf8
        
        
      • Perl 內附一支完全以 Perl 寫成的字碼轉換工具程式(piconv),用法如下:
      • 
        piconv -f big5 -t utf8 < file.big5 > file.utf8 
        piconv -f utf8 -t big5 < file.utf8 > file.big5
        
        
    • 2003年發表了Perl 6 。

Perl 概念
Perl 是非常容易使用的程式語言,可以很快就寫完一支 Perl 的程式。因為 Perl 的誕生就是在讓使用者能夠以更方便的方式去撰寫程式碼,不必像寫 C 的時候要考慮很多細節。
Perl 更是一個強大處理文字的工具。正規表示式更是 Perl 傲人的部份,這也就是 Perl 大量被拿來使用作為文字處理的原因之一。

  • Perl是以 C 語言開發而成的描述語言,具跨平台的特性,融合了 C、sed、awk 和 shell 最好的特色。
  • 和 C 不同之處
    • Perl 沒有 main()主函數的概念。
    • Perl 可不需宣告變數,但建議使用 use strict,強制使用變數前要宣告。
    • Perl 變數前置符號為$。
    • Perl 的命令列參數中,$ARGV[0] 是第一個參數,不是程式名稱,程式名稱存在 $0。
    • Perl 的大括弧是不可以省略,但可用倒裝句,例如: last if n > 0 可以不用大括弧。
  • Perl 沒有嚴格的資料型態,區分單複數,單數事物稱為純量,複數事物以串列,陣列,雜湊來表示。
  • Perl 的純量會自動依照運算元的不同來決定是數值資料或是字串資料。
  • Perl 有許多預設變數來幫助程式設計師節省時間,而預設變數名稱非常特別,例如$_, $&, @_, ..,是為了避免與現有的命名相衝突。
  • Perl 的運算式會因為解析純量值或串列值而有不同的意義,此預期稱之為語境(context)。

安裝 Perl 的環境
目前已知的系統有 Unix、Mac、Amiga、Windows...。可以從各大CPAN網站來免費取得Perl。

  • 幾乎所有 unix-like 環境預設都已安裝 Perl 。
  • Windows上的Perl則是以Active Perl(http://www.activeperl.com),下載其免費的 ActivePerl Community Edition 版即可。

使用 Perl
  • 可由下列指令確認現在 Perl 的版本。
  • 
    $ perl -v
    This is perl, v5.8.0 built for i386-linux-thread-multi
    (with 1 registered patch, see perl -V for more detail)
    Copyright 1987-2002, Larry Wall。
    
    

第一支 Perl 程式
PERL File Extension 有明確的規定,請使用 pl 作為副檔名。


#!/usr/bin/perl
# Hello.pl
print "hello world\n";      # print a message


  • 說明:
    • #!/usr/bin/perl
      此行的路徑會隨著實際安裝 Perl 的目錄來改變。用來告訴系統在程式被執行時該如何處理,亦即是告訴系統以 Perl 來執行該程式。這一行對 Win32 版的 Perl 不重要。
    • #符號用來註釋,由#開始直到該行之結尾,中間所有的文字將被忽略,但除了程式的第一行之外。
    • 每一個敘述結尾都需以分號";"來作為結尾。
    • 函數 print用來輸出訊息。

  • 執行 Perl

$ perl Hello.pl
hello world!


  • 或透過 chmod 指令 +x 讓 Hello.pl 變成可以執行的。

$ Hello.pl
hello world! 


  • 檢查語法正確性

$ perl –c Hello.pl
Hello.pl syntax OK


  • 告訴系統於執行該程式前先顯示系統的警告與其他有用的訊息。

$ perl –w Hello.pl


  • 抓蟲

$ perl –d Hello.pl
Loading DB routines from perl5db.pl version 1.19
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(hello.pl:3):     print "Hello World!\n"
  DB<1> q



閱讀全文...

2010年10月14日 星期四

Visual Web Developer 2010 Express use SQLite


首先產生一個 Web Site,方法和以前的版本其實大同小異,最後產出的結果會因版本差異,目錄結構不一樣而已。


SQLite是嵌入式資料庫,被定位成單機用的,所以在ASP.NET Web Site 這種多人連線環境並不支援。所以在開發上並不是很便利,你無法透過編輯器提供的功能來新增DataSource,一切都要自己寫程式碼來進行SQLite的操作。(應該可以透過Regedit去修改Visual Web Developer 2010 Express的機碼,針對Add New Item這部份來新增這項目,方便以後新增DataSource,只是修改機碼有其風險性,這邊就沒去仔細研究了)

要讓 SQLite 能正常運作,有幾個重要步驟如下:
1. 在方案中使用[加入參考],將 System.Data.SQLite 加入方案中,此時 web.config 檔案中會多出一段設定。

<assemblies>
<add assembly="System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=DB937BC2D44FF139"/>
</assemblies>


2. 在方案中的 App_Data 目錄選擇 [加入現有項目],將要使用 SQLite 檔案加進來。

3. 修改 web.config,加入 connectionString 設定

<connectionStrings>
    <add name="SQLiteService" connectionString="Data Source=|DataDirectory|Your.db;Version=3;" providerName="System.Data.SQLite"/>
</connectionStrings>


4. 在網頁(*.cs)新增操作 SQLite 的相關語法。

    protected void Page_Load(object sender, EventArgs e)
    {
        string sqliteFilePath = Server.MapPath("~/App_Data/Your.db");
        using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + sqliteFilePath))
        {
            using (SQLiteCommand comm = conn.CreateCommand())
            {
                conn.Open();

                comm.CommandText = "select * from [YourData]";
                SQLiteDataReader dr = comm.ExecuteReader();
                while (dr.Read())
                {
                    Response.Write("Id " + System.Convert.ToString(dr["Id"]) + "<br />");
                }
            }
        }
    }


從方案中的 [在瀏覽器中檢視]就可以看到實際結果了。

閱讀全文...

2010年10月12日 星期二

Connect to multiple database with Java


這應該是常會遇到的狀況,當要從一個資料庫轉出資料到另一種資料庫時,如果import、export不符合使用,就必須手動來撰寫符合這樣需求的工具了。

Java是透過JDBC來連接資料庫,所以只要找到資料庫適當的driver,並透過Class.forName method來載入和註冊jdbc driver,就可以操作資料庫了。


下面是一個從Oracle轉出資料,再將資料轉入SQLite的例子(使用前請先將相關資料庫資料和SQL語法改成符合你所需的)
。
Oracle2SOLite.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

// http://www.oracle.com/technetwork/indexes/downloads/index.html
// JDBC Driver->ojdbc14.jar
// http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC
// JDBC Driver->sqlite-jdbc-3.7.3.jar

public class Oracle2SQLite {
    public static void main(String[] args) {
        String driver = "oracle.jdbc.driver.OracleDriver";
        String url = "jdbc:oracle:thin:@ip:port:name";
        String user = "user";
        String password = "pwd";
       
        String driver1 = "org.sqlite.JDBC";
        String url1 = "jdbc:sqlite:D:/Work/sample.db";
       
        Connection conn = null;
        Connection connection = null;
        Statement stmt = null;
        Statement statement = null;

        System.out.println("***** Start *****");
        try {
            System.out.println("1. connect to " + url);
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);
            stmt = conn.createStatement();

            System.out.println("2. connect to " + url1);
            Class.forName(driver1);
            connection = DriverManager.getConnection(url1);
            statement = connection.createStatement();
           
            StringBuffer sqlStr = new StringBuffer();
            // 組合相關 Select 語法
            sqlStr.append("SELECT * FROM Sample");

            System.out.println("3. query");
            StringBuffer sqlOut = new StringBuffer();
            ResultSet result = stmt.executeQuery(sqlStr.toString());
            System.out.println("4. insert");
            while(result.next()) {
                sqlOut.delete(0, sqlOut.length());
                // 組合 Insert 語法
                sqlOut.append("INSERT INTO TxnData VALUES('XXX', 'YYY', 'ZZZ')");
               
                statement.executeUpdate(sqlOut.toString());
            }
        }
        catch(ClassNotFoundException e) {
            System.out.println("找不到驅動程式: " + e.getMessage());
            e.printStackTrace();
        }
        catch(SQLException e) {
            e.printStackTrace();
        }
        finally {
            if(stmt != null) {
                try {
                    stmt.close();
                }  
                catch(SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null) {
                try {
                    conn.close();
                }
                catch(SQLException e) {
                    e.printStackTrace();
                }
            }

            if(statement != null) {
                try {
                    statement.close();
                }  
                catch(SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection != null) {
                try {
                    connection.close();
                }
                catch(SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

閱讀全文...

2010年10月6日 星期三

SQLite with Java

一般java都是透過jdbc來連接資料庫,為了連接SQLite,就必須要有SQLite JDBC Driver,但SQLite官方並沒有提供這方面的Driver。

這次採用的是xerial:SQLiteJDBC Driver (第一次使用,會挑上它,是因為感覺還有在維護和更新),請選擇最新版本下載,在 Windows, MAC & Linux 都適用。網站上還提供了說明和 Sample code 方便修改測試。


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class Sample
{
  public static void main(String[] args) throws ClassNotFoundException
  {
    // load the sqlite-JDBC driver using the current class loader
    // 載入與註冊JDBC驅動程式:
// 透過Class類別的forName()來載入,透過DriverManager註冊JDBC驅動程式(驅動程式會自動透過DriverManager.registerDriver()方法註冊)
    Class.forName("org.sqlite.JDBC");
   
    Connection connection = null;
    try
    {
      // create a database connection
      // 設定JDBC URL(即定義連接資料庫的協定:子協定:資料來源識別)並從DriverManager取得Connection
      connection = DriverManager.getConnection("jdbc:sqlite:D:/Study/SQLiteJDBC/sample.db");
      Statement statement = connection.createStatement();
      statement.setQueryTimeout(30);  // set timeout to 30 sec.
     
      statement.executeUpdate("drop table if exists person");
      statement.executeUpdate("create table person (id integer, name string)");
      statement.executeUpdate("insert into person values(1, 'leo')");
      statement.executeUpdate("insert into person values(2, 'yui')");
      ResultSet rs = statement.executeQuery("select * from person");
      while(rs.next())
      {
        // read the result set
        System.out.println("name = " + rs.getString("name"));
        System.out.println("id = " + rs.getInt("id"));
      }
    }
    catch(SQLException e)
    {
      // if the error message is "out of memory",
      // it probably means no database file is found
      System.err.println(e.getMessage());
    }
    finally
    {
      try
      {
        if(connection != null)
          connection.close();
      }
      catch(SQLException e)
      {
        // connection close failed.
        System.err.println(e);
      }
    }
  }
}
 

閱讀全文...

2010年10月1日 星期五

Microsoft Web Platform Installer

本來只是想要安裝一下新環境來試試看,新舊VS的差異。在經歷的下載一大包卻在安裝時失敗後,改用另一種安裝方式,下載一個小安裝檔,真正安裝時會連回微軟下載安裝所需的程式。

以第二種方式順利安裝了 Visual C# Express 2010及 Visual C++ Express 2010後,再要安裝Visual Web Developer 2010 Express時,網頁上卻提醒要先安裝Microsoft Web Platform Installer (WebPI),這是什麼,記得以前不用的,果然曬網太久了,資訊還真的跟不上,@@

WebPI是為了能更快整合 Windows Web 平台,用來簡化IIS、Microsoft .NET Framework、Microsoft SQL Server Express、PHP(居然有這個)的安裝與設定。它會比較電腦裡與網站上的軟體元件,並讓您知道哪些是尚未安裝的元件,或者哪些是您需要更新的元件,也可以透過它來安裝 Asp.NET和PHP程式。

安裝WebPI
可從 http://www.microsoft.com/web/downloads/platform.aspx 下載安裝程式,執行後會依據電腦下載真正的WebPI安裝程式。

安裝好後會自動執行,還會顯示已經安裝好的元件,未安裝的元件只要按一下以包含建議的產品,再按下方的安裝鍵就會開始安裝。










Web Platform包含Web 平台的基本元件。再新功能頁面找到想要安裝的Visual Web Developer 2010 Express。










勾選,按安裝,選擇 我同意











開始下載安裝了,只是過程有點慢,又沒進度顯示,我一度認為它當掉了,@@










過了好久,終於出現安裝完成的頁面了。

閱讀全文...

2010年9月30日 星期四

System.Data.OracleClient 莎喲娜拉


記憶中要讓 ASP.NET 連上 Oracle ,需使用相關的 Providers 和搭配 System.Data.OracleClient,其中一個注意事項是要安裝 Oracle Client 8.1.7以上的版本。Google確認一下記憶,卻意外的發現 ADO.NET Team 已經宣告不建議使用 System.Data.OracleClient 。


主要是因為開發者大部分都使用廠商提供的 Providers ,因為 Oracle 異動的很快,ADO.NET Team 似乎無法快速反應相關新功能,只好放棄專注在其他方面,讓其他專業的來處理這一塊,所以決定將 System.Data.OracleClient 在 .NET 4.0 時標明為 Deprecated (不建議使用)。

找了一下 System.Data.OracleClient 替代方案:
1. ODP.NET:Oracle本身的解決方案,應該也是大部分一直用的方案,重點是免費的(Oracle真的是OpenSource殺手,還我OpenSolaris, OpenOffice)。

閱讀全文...

Create New ASP.NET 2.0 Web Site

本文主要介紹如何在 VS2005 來建立一個新的ASP.NET專案,以供有興趣的朋友參考。

要在VS2005建立一個新的ASP.NET專案,請從選單中 [File]->[New]->[Web Site]來建立一個新網站。












這時專案會有幾個地方需要做選項設定,說明如下:
1. Templates:請選擇 ASP.NET Web Site
2. Location:有 File System、HTTP及FTP這三種。這邊請選擇 HTTP.。
3. Language:可使用的語言有 VB、C#及J#(Express 不支援J#)。
4. Browse:網站位置有四種模式可以選擇:
4.1 File System:VS2005新增的模式,不需要本機電腦安裝IIS,內建了一個『ASP.NET程式開發伺服器』。
4.2 Local IIS:使用本機電腦的IIS伺服器。
4.3 Ftp Site:可連接到具有讀取和寫入權限的FTP伺服器,直接在上面建立和編輯網站。
4.4 Remote Site:讓你將專案建立在另一台遠端有裝IIS的電腦上,但這台電腦必須要有 FrontPage Server Extension。

網站的頁面和資料夾都是儲存在預設的IIS資料夾下,也就是 C:\Inetpub\wwwroot。

依照你環境選擇所需的模式,一般方便測試還是選擇 Local IIS ,再選擇 Create New Web Applicaion(紅色星號位置) ,輸入專案名稱就可以了。


此時VS2005就會產生新專案,如果順利的話就可以編譯(Build Web Site)和執行(View in Browser)了,應該會看到一個全新空白的網頁。

應該很少人會像豬頭的我發現以下情況,我都習慣用預設的去裝軟體,所以在 Windows 7上安裝IIS也是如此,所以在產生新專案時我就發生了無法設定ASP.NET 2.0網站的錯誤,要我手動設定。


 解決方式如下:
從[控制台]->[程式與功能]->[開啟或關閉Windows功能],然後照左圖將選項重新勾選安裝,再重新來產生專案就可以了。


閱讀全文...

2010年9月27日 星期一

ASP.NET 重大資安弱點

由於有資安人員發現了 asp.net 的資安弱點,主要針對 .NET 在實作 AES 加解密演算法問題,讓駭客能在短時間內猜出網站的加密金鑰後入侵你的系統。只要是你的網站是以 asp.net 為基礎的都有這弱點,都會遭此弱點攻擊。

微軟於 2010/9/17 正是公布了 Microsoft Security Advisory (2416728) Vulnerability in ASP.NET Could Allow Information Disclosure 這個弱點,但是目前並沒有完整的解決方法,只提供了緊急應變措施(Workarounds),請參照網頁上的說明對網站進行修正。

主要緊急應變措施如下:
1. 開啟 web.config
2. 修改 <customerrors> mode 與 defaultRedirect 屬性,兩個屬性都要設定
2.1 .NET 3.5 和 之前版本
<configuration>
<location allowOverride="false">
<system.web>
<customErrors mode="On" defaultRedirect="~/ error.html" />
</system.web>
</location>
</configuration>

2.2 .NET 3.5 SP1 和 之後版本
<configuration>
<location allowOverride="false">
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/ErrorPage.aspx" />
</system.web>
</location>
</configuration>

3. 新增一個錯誤訊息網頁,微軟有提供這網頁的寫法。

另有一個網頁可參考, ScottGu's Blog 上面有提供一個工具,可以針對此弱點檢查你的網站。

閱讀全文...

IIS7.0搭配VS2005新增 WEB Site Project 時出現無權限的問題

本想在公司新的nb寫個小網站來查詢統計一下交易資料,沒想到居然出現一個小插曲。

在 Windows 7 是使用 IIS 7 來管理 WEB 網站,當用 VS2005 要新增一個網頁專案時,卻發現 IIS 沒安裝,於是 控制台->程式與功能->開啟或關閉windows功能,將 IIS 裝上,此時沒想太多,就按照預設選項就安裝了,結果就發生了沒權限的問題:說帳號不屬於 administrator group 所以不能存取 IIS metabase。



嗯,很清楚的錯誤訊息,就只好從 控制台->使用者帳戶->管理使用者帳戶 來查證,確認帳號已經屬於 administrator group 。

山不轉路轉,用 Windows 7 的功能,讓程式用 administrator 的身分來執行總行了吧。

結果還是一樣的錯誤訊息, -.-|||

好吧,來檢查 IIS 7到底裝了哪些東西,控制台->程式與功能->開啟或關閉windows功能,發現原來是相容舊版本的 IIS 項目都沒裝,照下圖將 IIS 6 管理相容性的選項都打勾安裝。


裝好後,再來試一次,讓 VS2005 以 administrator 身分執行,在新增網頁專案後,終於可以了。
VS2005 真的夠老了,總會遇到很多想不到的問題,雖然現在有 VS2010 express 這種免費的可以使用,但因為 VS2005 是微軟送的有版權的正式版,所以就一直用下去了,主要操作介面也習慣了。


閱讀全文...

2010年9月14日 星期二

歷經千辛萬苦的HelloWorld

在經歷的 c++ compiler 的編譯失敗,改用回 Visual Studio
沒想到接下來卻是 wxWidgets 千辛萬苦的編譯路程
經過不斷的嘗試,終於 wxWidgets 的 HelloWorld 顯示出來了


wxWidgets 一個和 MFC 非常相像的東西,主要強大在跨平台

閱讀全文...

2010年9月8日 星期三

微軟癮很難戒

Visual Studio 的各個compile都蠻好用的,當有戒掉微軟這念頭時,就想到那還有哪些compile可以用,第一時間就想到GCC。

GCC 是 GNU Compiler Collection (GNU 編譯器總集)的縮寫,為 GNU 計畫中一套多種程式語言編譯器的集合。但是大部分用到 gcc 這東西都是 unix-like 的環境,若要在 windows 中使用 gcc 那就是要用 MinGW 了(另有一個用 Delphi 寫成的 DEV-C++,但是實在對 Delphi 無愛啊)

滿心歡喜的在 MinGW 下載的最新的安裝程式 mingw-get-inst-20100831.exe ,隨著按 下一步  迅速的安裝起來,剛開始還蠻順的,忽然畫面顯示 **** ERROR **** Get Package xxx  ,被澆了一頭冷水,啃,黑箱作業也能失敗喔,package 名字 mingw 命名的,檔案抓取位置 mingw 放的,居然還抓取錯誤,而且還是最新的安裝程式,OMG!

拜請大神 google ,發現很多遇到這樣的問題,又發現新版不穩,3rd party library還沒打算跟進升到最新版的,狂熱的火正在被澆熄。

另一個念頭產生了,手動安裝編譯好了。漂亮,最好是官網的說明可以那麼精簡,精簡到大家要手動編譯時要去 google 搜尋和問動問西的。

光兩天耗在安裝編譯上面,忽然覺得微軟的安裝程式友善多了, Open Source的東西加油好嗎?當你有強大的功能,卻沒有一個友善的帶領大家入門,一切真的只是個空談....

閱讀全文...

2010年9月7日 星期二

微軟癮

想要拋棄微軟,可是很難。
Visual Studio是個不錯的發發工具,便利性實在贏其他工具太多太多,只是裡面的東西都要錢,又常常給一堆我不想要的,包山包海戰術硬塞,最後就是提昇你的硬體,總感覺軟硬體廠商逼迫使用者升級,@@

想新建立一個開發環境,採用Open Source或free的解決方案,前提是這工具要夠長久
O & F系列最常腰斬,或是一段時間就消失了

希望也能用在ibook G4 PowerPC,小白該拿出來跑跑了
閱讀全文...

2010年8月31日 星期二

時間飛逝啊

最近工作一忙,不知不覺又曬網二個月了
閱讀全文...

2010年6月30日 星期三

沈默的新技術 WPF

WPF出來好幾年了,微軟的新一代使用者介面,2006年推出時,實在帶給人很大的震撼,但實在是太早出來了,相關的整合配套措施都還沒好,又包山包海,十足是隻怪獸一樣,另一個明顯的缺點就是畫面上的字,看起來都糊糊的,實在傷害眼睛,WPF 4.0有解決了糊糊的問題,花了四年!!

WPF真的出來的太早了,一堆資源找不著了,光要讓我的VS 2005可以開發WPF的程式,就花了我非常多的時間,微軟的網站早就不提供Visual Studio 2005 extensions for .NET Framework 3.0 (WCF & WPF), November 2006 CTP 下載了,搜尋了好久終於下載成功,只能說微軟的手法太高招,逼迫大家提昇VS。

或許WPF是個大躍進,但在Windows Form出來沒多久,MFC還是一堆人最常用的選擇,本身優良開發的ide沒出現,微軟自己產品也沒看到任何一套使用這新技術,所以周邊的人也沒看到誰在用這東東,它可能又要默默的發展幾年,才會讓人去注意吧。
閱讀全文...

2010年6月11日 星期五

好用的SQLite資料庫管理工具

SQLite Expert Personal 好像的視覺化SQLite資料庫管理工具,請至 http://www.sqliteexpert.com/ 下載,免費的 Personal 版本就灰熊好用。
閱讀全文...

2010年5月28日 星期五

SQLite with Visual Studio 2005

採用 System.Data.SQLite(http://sqlite.phxsoftware.com/) -An open source ADO.NET provider for the SQLite database engine
請至 http://sourceforge.net/projects/sqlite-dotnet2/files/ 下載安裝檔案,我下載的是2010/04/18的版本SQLite-1.0.66.0-setup.exe(下載最新的就對了)。

1. 安裝,重點就是一直按 Next,安裝目錄用預設值,把你現有的開發環境勾起來(我的是Visual Studio 2005),就會自動裝好了。


















































2. 測試
2.1 開啟一個新的 C# Console Application Project
2.2 專案開啟後,首先最重要的一步,就是 Add Reference,將System.Data.SQLite和System.Data.SQLite.Linq加進專案中。
2.3 主要程式碼如下
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SQLite;
using System.IO;

namespace SQLiteTest1
{
    class Program
    {
        public static SQLiteCommand cmd;

        public static void CreateTable()
        {
            string sql = "CREATE TABLE user(" +
                            "id INTEGER PRIMARY KEY, " +
                            "name text, " +
                            "sex int(1) NOT NULL DEFAULT 0 " +
                         ")";
            cmd.CommandText = sql;
            cmd.ExecuteNonQuery();
        }

        public static void DropTable()
        {
            string sql = "DROP TABLE user";
            cmd.CommandText = sql;
            cmd.ExecuteNonQuery();
        }

        public static void AddUser(string name, int sex)
        {
            string sql = " INSERT INTO user (name, sex) " +
                         " VALUES ('" + name + "', " + sex + ") ";
            cmd.CommandText = sql;
            cmd.ExecuteNonQuery();
        }

        public static void ListAllUser()
        {
            SQLiteDataReader sdr;

            string sql = "SELECT * from user";
            cmd.CommandText = sql;
            sdr = cmd.ExecuteReader();

            Console.WriteLine("ID\tNAME\tSEX");
            Console.WriteLine("------------------------------------------------");
            while (sdr.Read())
            {
                Console.WriteLine("{0}\t{1}\t{2}",
                    sdr["id"],
                    sdr["name"],
                    sdr["sex"]);
            }
        }

        static void Main(string[] args)
        {
            SQLiteConnection conn = null;

            try
            {
                string strDatabaseRoot = Directory.GetCurrentDirectory() + "\\SQLiteTest1.db";

                if (!File.Exists(strDatabaseRoot))
                {
                    SQLiteConnection.CreateFile(strDatabaseRoot);
                }

                conn = new SQLiteConnection("Data Source=" + strDatabaseRoot);
                conn.Open();
                cmd = conn.CreateCommand();
                DropTable();
                CreateTable();

                AddUser("Dick", 1);
                AddUser("Mary", 0);
                AddUser("GiGi", 0);
                ListAllUser();

            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                }
            }

            Console.ReadLine();
        }
    }
}

Output:

閱讀全文...

小巧實用的資料庫 SQLite

資料庫一直是程式開發中不可或缺的好幫手,但現在許多有名的資料庫包山包海給你重量型的規格,當然也是重量型的價格。可是當你只是開發一個需要儲存,資料量不大,只需要單機使用,或是沒多人同時使用的需求,你會想搬出 Oracle、DB2和SQL Server嗎?No,此時不需要這種怪獸級的產品,SQLite會是個不錯的選擇。

SQLite(http://www.sqlite.org/index.html) 是一套 Embedded RDBMS,很適合加進應用程式裡頭跑,並且資料庫檔能輕鬆跨平台。一般的SQL92語法都有支援,單一檔案,不需要安裝科學怪獸,只需要寫程式時將他加入一起編譯就好了。

SQLite特性優缺點和支援的平台及程式語言,請拜請 Google 大神一撈或是光臨SQLite網站就有了。容我偷懶,光速逃。
閱讀全文...

2010年5月27日 星期四

C# Tutorial – 7. Control Statements Tutorial

每個程式常常在連續的步驟後,會遇到要停下來,判斷各種情況後,在繼續往下執行。底下是一些常用到的判斷語法。


Control Statements – Seelction
The if Statement
取決於給予的條件,來執行不同的程序,當條件是 true 時,將執行那區塊的程式碼。

syntax:
if () {
    statements;
} else if () {
….
} else {
        statements;
}

if (money > 0) {
        Console.WriteLine(“時間就是金錢({0}),朋友!”, money);
} else {
        Console.WriteLine(“天啊!你真窮。”);
}

當有多種情況需要判別時,就會衍生成下面的樣子

if (xx > 100) {
        statements;
} else if (xx<100 && xx > 50) {
        statements;
} else if (xx<50 && xx>20) {
        statements;
} else {
        statements;
}

The switch Statement
取決於給予的一整組邏輯的值,當符合其特定的參數,其包含的區塊成勢將會被執行。
switch 運算式的值可以為 booleans、enums、integral types和Strings。

syntax:
switch ()
{
case value1:
        statements;
        break;
    case value2:
        statements;
        break;
    …
    default:
        statements;
        break;
}

int myInt;

    myInt = Console.ReadLine();
    // switch with integer type
    switch (myInt)
    {
        case 1:
            Console.WriteLine("Your number is {0}.", myInt);
            break;
        case 2:
            Console.WriteLine("Your number is {0}.", myInt);
            break;
        case 3:
            Console.WriteLine("Your number is {0}.", myInt);
            break;
        default:    // 當都不符合上面條件時,就會執行此區塊
            Console.WriteLine("Your number {0} is not between 1 and 3.", myInt);
            break;
    }

Control Statements – Loops
當要重複執行某些特定的動作,loops是最後達成這任務的。

The for Loop
for loop包含三個部分:起始值、條件判斷和條件增量。
syntax:
for (; ; ) {
;
}

ForLoop.cs
    using System;

    class ForLoop
    {
        public static void Main()
        {
            for (int i=0; i < 20; i++)
            {
                if (i == 10)
                    break;

                if (i % 2 == 0)
                    continue;

                Console.Write("{0} ", i);
            }
            Console.WriteLine();
        }
    }

Output:
1 3 5 7 9

說明:
1.      i的起始值為0;條件式是小於20;i的增量每次加1。
2.      當i等於10的時候就會跳出for loop。
3.      i被2整除時,i直接加1。

The while Loop
while loop就包含一個條件式,當條件一直成立(true)時,就是一直重複執行那段程式。

syntax:
while () {
;
}

WhileLoop.cs
    using System;

    class WhileLoop
    {
        public static void Main()
        {
            int myInt = 0;

            while (myInt < 10)
            {
                Console.Write("{0} ", myInt);
                myInt++;
            }
            Console.WriteLine();
        }
    }

The do Loop
do loop動作和while loop差不多,最明顯的差異在於 do loop最少會執行一次。

syntax:
do
{
;
} while ();

DoWhileLoop.cs
    using System;

    class DoWhileLoop
    {
        public static void Main()
        {
            int myInt = 0;

            do
            {
                Console.Write("{0} ", myInt);
                myInt++;
            } while (myInt < 10);
            Console.WriteLine();
        }
    }

總結:
Selection Control Statements讓你可以用不同的判斷式來執行不同的邏輯分支的程式。
Loop Control Statements 讓你可以輕鬆重複執行同一區塊的程式。
不同的情況選擇適當的 Control Statement 將會使程式更易於閱讀和執行工作,達到事半功倍的效用。

閱讀全文...