網頁

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


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

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.NETOracle本身的解決方案,應該也是大部分一直用的方案,重點是免費的(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.SQLiteSystem.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 運算式的值可以為 booleansenumsintegral typesStrings

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;條件式是小於20i的增量每次加1
2.      i等於10的時候就會跳出for loop
3.      i2整除時,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 將會使程式更易於閱讀和執行工作,達到事半功倍的效用。

閱讀全文...