網頁

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)

閱讀全文...