2009-04-29 21:34

Web 文件類型壓縮及註解清除器

大部分的 Web 文件壓縮,都是將不要的空白文字或不必要的註解清除,以換取檔案的大小。

之前找尋不到合適的工具,索性就自己寫一個工具,這次將之前的HTML & Smarty、JavaScript、CSS 及 PHP 註解清除器做一個整合,並且做一些使用上的教學。

修改特點:
  • 整合之前的文件類型至一個工具上
  • 只針對 html , htm , css , js 及 php 副檔名的文件做處理
  • 增加參數選擇

web_clear 參數說明

web_clear [-hvc] (filename)
[-h | -?] : 顯示參數說明
[-v] : 顯示被執行的檔案列表
[-c] : 單純只清除註解
(filename) : 檔案路徑或目錄路徑


Windows 下的操作


可以透過拖移文件或資料夾的方式執行此工具。

也可以透過命令列或批次檔去執行
  1. @ECHO off 
  2.  
  3. web_clear.exe -v "Z:\Web" Z:\WebServer\1.html Z:\WebServer\1.css  
  4.  
  5. PAUSE  


Linux 下的操作

透過命令列或 Shell 去執行
  1. #!/bin/bash 
  2.  
  3. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 
  4. export PATH 
  5.  
  6. ./web_clear -v /home/test/index.php 
  7.  
  8. # 也可以配合 find 去執行 
  9. #./web_clear -v `find /home/test -name '*.css' -or -name '*.js'` 
  10.  
  11. exit 0 


檔案下載:

web_clear.tar.gz

  1. web_clear 
  2. |-- linux 
  3. |   |-- source 
  4. |   |   |-- web_clear.c 
  5. |   |   `-- web_clear.l 
  6. |   | 
  7. |   |-- clear_file.sh 
  8. |   `-- web_clear 
  9. | 
  10. `-- windows 
  11.    |-- source 
  12.    |   |-- web_clear.c 
  13.    |   `-- web_clear.l 
  14.    | 
  15.    |-- clear_file.bat 
  16.    `-- web_clear.exe 
  17.  
  18. 4 directories, 8 files 
2009-04-29 17:22

[PHP] 線上編碼文件轉換器

這是利用 iconv 及 curl 去做線上文件編碼轉換,之前為了讓桌面行事曆能夠讀取 Google Calendar 而做的轉換器。

  1. <?php  
  2. // 設定最長執行的秒數 
  3. ini_set ("expect.timeout", 30); 
  4. set_time_limit(30); 
  5.  
  6. if($_GET['url']){ 
  7.    // 設定原始編碼及目標編碼 
  8.    $source=($_GET['source'])? $_GET['source']: 'UTF-8'; 
  9.    $target=($_GET['target'])? $_GET['target']: 'BIG5'; 
  10.  
  11.    // 取得 URL 
  12.    $url=$_GET['url']; 
  13.  
  14.    // 初始化 CURL 
  15.    $ch = curl_init(); 
  16.  
  17.    // 設定 URL  
  18.    curl_setopt($ch, CURLOPT_URL, $url);  
  19.    // 讓 curl_exec() 獲取的信息以資料流的形式返回,而不是直接輸出。 
  20.    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
  21.    // 在發起連接前等待的時間,如果設置為0,則不等待 
  22.    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0); 
  23.    // 設定 CURL 最長執行的秒數 
  24.    curl_setopt ($ch, CURLOPT_TIMEOUT, 30); 
  25.  
  26.    // 嘗試取得文件內容 
  27.    $store = curl_exec ($ch); 
  28.  
  29.    // 檢查文件是否正確取得 
  30.    if (!curl_errno($ch)){ 
  31.        // 編碼轉換 
  32.        echo iconv($source,$target, $store); 
  33.        exit; 
  34.    } 
  35. } 
  36. ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
  37. <html> 
  38. <head> 
  39.    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
  40.    <title>線上編碼文件轉換器</title> 
  41. </head> 
  42. <body style="width:28em;margin:5% auto;text-align:center;"> 
  43.  <form method="get" action=""> 
  44.    <fieldset> 
  45.      <legend>線上編碼文件轉換器</legend> 
  46.      <label>URL : <input type="text" name="url" size="48" /></label> 
  47.      <p> 
  48.        <input type="text" name="source" size="12" value="UTF-8" />  
  49.        -&gt; 轉換至  -&gt; 
  50.        <input type="text" name="target" size="12" value="BIG5" /> 
  51.      </p> 
  52.      <p><input type="submit" value="開始轉換"/></p> 
  53.    </fieldset> 
  54.  </form> 
  55. </body> 
  56. </html> 


參考文章:
PHP程式學習筆記本(PHP.Javascript.Mysql.cakephp.Jquery.Smarty): php.curl詳解
2009-04-29 03:30

[PHP] 透過靜態成員函數建立物件

PHP5 對物件建立的架構還不是很完善
有些物件的操作方式是不允許的
  • 在新增物件時不能直接呼叫成員函數
  • 要透過函數才能建立匿名函數

  1. <?php 
  2. class DataCheck { 
  3.    // 成員變數 
  4.    public $value=null; 
  5.  
  6.    // 建構子 
  7.    public function __construct($value) { 
  8.        $this->value=$value; 
  9.        return $this; 
  10.    } 
  11.  
  12.    // 成員函數 
  13.    public function getValue() { 
  14.        return $this->value; 
  15.    }     
  16. } 
  17.  
  18.  
  19. // PHP 物件的使用方式 
  20. $a = new DataCheck("test");  
  21. $v = $a->getValue(); 
  22.  
  23.  
  24. // 一般物件的使用方式 
  25. $v = new DataCheck("test")->getValue(); //Error 
  26. /* 但這樣做在 PHP5 中是不可行 
  27. * PHP5 對物件的架構還不是很完善 
  28. * 為了達到這樣的使用方式 
  29. * 建議使用物件中的靜態成員函數去達成 
  30. * 會比在 new 外加一個 () 要好多了 
  31. * 也可以在生成物件前做一些前置處理 
  32. * */ 
  33.  
  34.  
  35. /**######################################################*/ 
  36. class DataCheck { 
  37.    // 靜態函數建立物件 
  38.    public static function Value($value) { 
  39.        return (new DataCheck($value)); 
  40.    } 
  41.  
  42.    // 成員變數 
  43.    public $value=null; 
  44.  
  45.    // 建構子 
  46.    public function __construct($value) { 
  47.        $this->value=$value; 
  48.        return $this; 
  49.    } 
  50.  
  51.    // 成員函數 
  52.    public function getValue() { 
  53.        return $this->value; 
  54.    }     
  55. } 
  56.  
  57.  
  58. // 利用靜態函數建立物件 
  59. $v = DataCheck::Value("test")->getValue(); 
  60. /* 這樣就可以達成我們期望的方式 
  61. * 但最好還是希望 PHP 能夠對物件有更好的架構出現 
  62. * */ 
2009-04-29 02:41

[PHP] 驗證碼2

根據之前寫的[PHP] 驗證碼做了一些修正
  • 增加圖片類型的選擇
  • 隨機文字色彩
  • 隨機底部線條
  • 根據文字大小產生相對應的圖片
  1. <?php 
  2. /*定义header,声明图片文件,最好是png,无版权之扰; */  
  3. /*生成新的四位整数验证码 */ 
  4. header('Content-type:image/png'); 
  5. header('Content-Disposition:filename=image_code.png'); 
  6. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
  7. header('Cache-Control: no-store, no-cache, must-revalidate'); 
  8. header('Cache-Control: post-check=0, pre-check=0', false); 
  9. header('Pragma: no-cache'); 
  10.  
  11.  
  12. /* 字形檔的路徑 */ 
  13. $TTF="/var/lib/defoma/fontconfig.d/D/DejaVu-Serif-Bold.ttf"; 
  14.  
  15. /* 開啟 SESSION */ 
  16. if (!isset($_SESSION)) { session_start(); } 
  17.  
  18. /* 設定亂數種子 */ 
  19. mt_srand((double)microtime()*1000000); 
  20.  
  21.  
  22. /* 類型選擇 */ 
  23. switch ($_GET['t']) { 
  24. case 'post': 
  25.    //定義用來顯是在圖片上的文字 
  26.    $codeBase='ABCDEFGHJKLMNPRSTUVWXYZ23456789'; 
  27.  
  28.    $codeLength=5; //定義循環隨機抽取的位數 
  29.    $codeName='checkPostCode'; // 認證碼名稱  
  30.    $textSize=18; // 字體大小(點) 
  31.    $proportion=0.2; //字寬加乘比例 
  32.    break; 
  33.  
  34. case 'min_post': 
  35.    //定義用來顯是在圖片上的文字 
  36.    $codeBase='ABCDEFGHJKLMNPRSTUVWXYZ23456789'; 
  37.  
  38.    $codeLength=5; // 定義循環隨機抽取的位數 
  39.    $codeName='checkMinPostCode'; // 認證碼名稱  
  40.    $textSize=18; // 字體大小(點) 
  41.    $proportion=0.2; // 字寬加乘比例 
  42.    break; 
  43.  
  44. case 'shoutbox': 
  45.    //定義用來顯是在圖片上的文字 
  46.    $codeBase='1234567890'; 
  47.  
  48.    $codeLength=3; // 定義循環隨機抽取的位數  
  49.    $codeName='checkShoutCode'; // 認證碼名稱  
  50.    $imageX=60; $imageY=24; // 圖片的長寬 
  51.    $textSize=18; // 字體大小(點) 
  52.    $proportion=0.2; // 字寬加乘比例 
  53.    break; 
  54.  
  55. case 'comm': 
  56. default: 
  57.    //定義用來顯是在圖片上的文字 
  58.    $codeBase='1234567890';  
  59.  
  60.    $codeLength=3; // 定義循環隨機抽取的位數  
  61.    $codeName='checkMsgCode'; // 認證碼名稱  
  62.    $textSize=18; // 字體大小(點)  
  63.    $proportion=0.2; // 字寬加乘比例 
  64.    break; 
  65. } 
  66.  
  67. // 圖片的高度 
  68. $imageY=intval($textSize*(1+$proportion));  
  69. // 圖片的寬度 
  70. $imageX=$imageY*$codeLength;  
  71.  
  72.  
  73. /*建立圖片物件 */ 
  74. $im = @imagecreatetruecolor($imageX, $imageY) or die('Image Error'); 
  75.  
  76. /* 設定底色 */ 
  77. imagefill($im,0,0,  
  78.    imagecolorallocate($im, 255,255,255) 
  79. );  
  80.  
  81.  
  82. /* 建立筆刷 */ 
  83. $s=intval($textSize/8); 
  84. $brush = imagecreate($s,$s); 
  85. imagesetbrush($im,$brush); 
  86.  
  87. /*底色干擾線條 */ 
  88. $l=$codeLength*7; 
  89. for($i=0;$i<$l;$i++){  
  90.    imagefill($brush,0,0,imagecolorallocate( 
  91.        $brush, rand(127,255),rand(127,255),rand(127,255) 
  92.    )); 
  93.    imageline( 
  94.        $im, 
  95.        rand(0,$imageX), 
  96.        rand(0,$imageY), 
  97.        rand($imageY,$imageX), 
  98.        rand(0,$imageY), 
  99.        IMG_COLOR_BRUSHED 
  100.    ); 
  101. }  
  102.  
  103.  
  104. /*得到字串的長度;减1是因为截取字符是从0开始起算;*/ 
  105. $l = strlen($codeBase)-1;  
  106. $widgetSize=$imageX/$codeLength; 
  107. $codeStr = '';  
  108.  
  109. /*循環隨機抽取前面定義的文字*/  
  110. for($i=0;$i<$codeLength;$i++){  
  111.    /*每次随机抽取一位数字;从第一个字到该字串最大长度, */ 
  112.    $num=rand(0,$l);  
  113.    $codeStr.= $codeBase[$num];  
  114.  
  115.    /*利用true type字型來產生圖片 */ 
  116.    $Color = imagecolorallocate( //  文字顏色 
  117.        $im,rand(0,60),rand(0,60),rand(0,60) 
  118.    ); 
  119.    imagettftext( 
  120.        $im,  
  121.        $textSize,  
  122.        rand(-25,25),  
  123.        $widgetSize*($i+$proportion),  
  124.        $textSize,  
  125.        $Color,  
  126.        $TTF,  
  127.        $codeBase[$num] 
  128.    ); 
  129.  
  130.    /* 
  131.    imagettftext (int im, int size, int angle, 
  132.    int x, int y, int col, 
  133.    string fontfile, string text) 
  134.  
  135.    im 圖片物件 
  136.    size 文字大小 
  137.    angle 0度將會由左到右讀取文字,而更高的值表示逆時鐘旋轉 
  138.    x y 文字起始座標 
  139.    col 顏色物件 
  140.    fontfile 字形路徑,為主機實體目錄的絕對路徑,可自行設定想要的字型 
  141.    text 寫入的文字字串 
  142.    */ 
  143. } 
  144.  
  145.  
  146. /* 建立筆刷 */ 
  147. $s=intval($textSize/9); 
  148. $brush = imagecreate($s,$s); 
  149. imagesetbrush($im,$brush); 
  150.  
  151. /* 文字干擾像素 */ 
  152. $l=$codeLength*13; 
  153. for($i=0;$i<$l;$i++){ 
  154.    imagefill($brush,0,0,imagecolorallocate( 
  155.        $brush,rand(40,100),rand(40,100),rand(40,100) 
  156.    )); 
  157.    imagesetpixel( 
  158.        $im, 
  159.        rand(0,$imageX), 
  160.        rand(0,$imageY), 
  161.        IMG_COLOR_BRUSHED 
  162.    ); 
  163. } 
  164.  
  165.  
  166. /*用session来做验证也不错;注册session,名称为checkMsgCode, */ 
  167. /*其它页面只要包含了该图片 */ 
  168. /*即可以通过$_SESSION['checkMsgCode']来调用 */ 
  169. session_register($codeName); 
  170. $_SESSION[$codeName] = $codeStr; 
  171.  
  172. imagepng($im); 
  173. imagedestroy($im); 


輸出結果:
2009-04-29 02:11

手動調整 ffdshow 中的影像解碼器

之前安裝 K-Lite Codec Pack 來作為我主要的播放器
可是有些影片的影像解碼上會有不正常的問題
在影像上會出現奇怪的線條跟殘影

最後找到問題的所在點
那就是解碼器的版本問題造成的

最簡單的方法就是關閉 ffdshow 中的預設解碼器


像我最常出現問題的就是 DivX
在 ffdshow 中將 "DivX 4/5/6" 的選項設成 disabled
按下 OK 後再重新播放影片就可以了

當然建議再安裝 K-Lite Codec Pack 時
最好選擇安裝全部的解碼格式
這樣在調整 ffdshow 時才有意義
2009-04-28 23:45

[PHP] Smarty 繼承改寫(範例)

  1. <?php  
  2.  
  3. // 繼承 Smarty 
  4. class SmartyTpl extends Smarty { 
  5.    // 建構子 
  6.    function  __construct( $dir = '' ){ 
  7.        if( $dir ){ $dir .= '/'; } 
  8.  
  9.        $this->template_dir = $_SERVER['DOCUMENT_ROOT'].$dir."view/"; 
  10.        $this->compile_dir  = $_SERVER['DOCUMENT_ROOT'].$dir."cache/tpl_c/"; 
  11.        $this->cache_dir    = $_SERVER['DOCUMENT_ROOT'].$dir."cache/html/"; 
  12.  
  13.        $this->left_delimiter='<%'; 
  14.        $this->right_delimiter='%>'; 
  15.    } 
  16.  
  17.    // 改寫 assign 
  18.    function assign( $tpl_var, $value=null ){ 
  19.        // 呼叫父類別的方法 
  20.        parent::assign( $tpl_var, $value ); 
  21.        // 回傳 this 讓方法可以疊加呼叫 
  22.        return $this; 
  23.    } 
  24.  
  25.    // 改寫 assign_by_ref 
  26.    function assign_by_ref( $tpl_var, &$value ){ 
  27.        // 呼叫父類別的方法 
  28.        parent::assign_by_ref( $tpl_var, $value ); 
  29.        // 回傳 this 讓方法可以疊加呼叫 
  30.        return $this; 
  31.    } 
  32.  
  33. } 


參考來源:
Smarty
Smarty中文手册,Smarty教程,Smarty模板的入门教材(PHP技术)
2009-04-28 17:56

[C語言] 高斯消去法-特約化矩陣(RREF)

  1. #include<stdio.h> 
  2. #include<stdlib.h> 
  3.  
  4. /*高斯消去法 - 特約化矩陣*/ 
  5. double **matrix_rref(double **matrix, int m, int n){ 
  6.    double zero=0.00000001; 
  7.    double temp; 
  8.  
  9.    int x=0,y=0,j,i; 
  10.    while(x<n && y<m){ 
  11.        // 如果列首為零,則找尋可以互換的列 
  12.        while(x<n && matrix[y][x]<zero && matrix[y][x]>(-zero)){ 
  13.            j=y+1; 
  14.            while(j<m && matrix[j][x]<zero && matrix[j][x]>(-zero)){j++;} 
  15.  
  16.            // 此行都為零,移至下一行 
  17.            if(j >= m){ x++; continue; } 
  18.  
  19.            // 找到列首不為零的列,兩列互換 
  20.            for(i=x; i<n; i++){ 
  21.                temp=matrix[j][i]; 
  22.                matrix[j][i]=matrix[y][i]; 
  23.                matrix[y][i]=temp; 
  24.            } 
  25.            // 互換結束跳出迴圈 
  26.            break; 
  27.        } 
  28.        if(x>=n){ break; } 
  29.  
  30.        // 所有列值都除以列首,列首為(1)處理 
  31.        for(i=n-1; i>x; i--){ 
  32.            matrix[y][i]/=matrix[y][x]; 
  33.        } 
  34.        matrix[y][x]=1; 
  35.  
  36.        // 消去上下列 
  37.        for(j=0; j<m; j++){ 
  38.            // 跳過選取的列 
  39.            if(j == y){ continue; } 
  40.  
  41.            // 選取的列消去其他列 
  42.            for(i=n-1; i>=x; i--){ 
  43.                matrix[j][i]-=matrix[y][i]*matrix[j][x]; 
  44.            } 
  45.        } 
  46.  
  47.        x++;  y++; 
  48.    } 
  49.    return matrix; 
  50. } 
  51.  
  52.  
  53.  
  54. /* 
  55. input.txt 
  56. 4 5 
  57. 1 2 3 7 55 
  58. 1 3 2 4 76 
  59. 3 2 1 6 43 
  60. 4 6 5 3 34 
  61. */ 
  62.  
  63. /*主程式*/ 
  64. int main(){ 
  65.    int m,n,i,j; 
  66.    FILE *in; 
  67.    // 開啟檔案 
  68.    in=fopen("input.txt","r"); 
  69.  
  70.    // 讀取 m,n 值 
  71.    fscanf(in,"%d\n",&m); 
  72.    fscanf(in,"%d\n",&n); 
  73.  
  74.    // 利用 malloc 配置二維空間 。 
  75.    double **mar= (double**) malloc(m * sizeof(double*)); 
  76.    for (i=0; i<m; i++){ 
  77.        mar[i] = (double*) malloc(n * sizeof(double)); 
  78.    } 
  79.  
  80.    // 讀取矩陣 
  81.    for(i=0;i<m;i++){ 
  82.        for(j=0;j<n;j++){ 
  83.            fscanf(in,"%lf",&mar[i][j]); 
  84.        } 
  85.    } 
  86.  
  87.    // 高斯消去法 
  88.    mar=matrix_rref(mar,m,n); 
  89.  
  90.    // 列印結果 
  91.    for(i=0;i<m;i++){ 
  92.        for(j=0;j<n;j++){ 
  93.            printf("%.2lf ",mar[i][j]); 
  94.        } 
  95.        printf("\n"); 
  96.    } 
  97.  
  98.    _getch(); 
  99.  
  100.    return 0; 
  101. } 
2009-04-28 14:19

Eclipse 外部工具的設定方法

最近再使用 Eclipse 寫 Lex,原本為了執行 flex 的編譯有點不順手,後來發現可以使用外部工具去執行這個動作,讓整個編輯過程都很快樂。


點選外部工具,並建立一個新的外部工具。


在位址匡選擇上外部工具的位址。
工作目錄設成專案目錄:${project_loc}
引數設定是給予命令列上的參數:-FLi8 -o${project_name}.c ${project_name}.l


再重新整理的頁籤中勾選執行完後要如何重新整理,在這裡可以讓 C語言 的專案自動重新編譯。


Eclipse 提供的變數:
  • ${container_loc}
    傳回資源儲存器的絕對檔案系統路徑。當沒有指定引數或資源是由工作區相對路徑來識別時,目標資源就是所選的資源。
    value= E:\Program\file-test

  • ${container_name}
    傳回資源儲存器的名稱。當沒有指定引數或資源是由工作區相對路徑來識別時,目標資源就是所選的資源。
    value= file-test

  • ${container_path}
    傳回資源儲存器的工作區相對路徑。當沒有指定引數或資源是由工作區相對路徑來識別時,目標資源就是所選的資源。
    value= \file-test

  • ${eclipse_home}
    執行中平台的基本程式安裝位置
    value= /C:/Program Files/eclipse-gcc/

  • ${file_prompt:圖片檔案}
    傳回選取檔案的對話框所選擇之檔案的絕對檔案系統路徑。當提供一個引數時,它用來作為對話框標題的提示要點。當提供第二個引數時,它用來作為選取檔案的對話框的起始值。第一和第二個引數必須用 ':' 分開。


  • ${folder_prompt}
    傳回選取目錄的對話框所選擇之目錄的絕對檔案系統路徑。當提供一個引數時,它用來作為對話框標題的提示要點。當提供第二個引數時,它用來作為選取目錄的對話框的起始值。第一和第二個引數必須用 ':' 分開。


  • ${project_loc}
    傳回資源專案的絕對檔案系統路徑。當沒有指定引數或資源是由工作區相對路徑來識別時,目標資源就是所選的資源。
    value= E:\Program\file-test

  • ${project_name}
    傳回資源專案的名稱。當沒有指定引數或資源是由工作區相對路徑來識別時,目標資源就是所選的資源。
    value= file-test

  • ${project_path}
    傳回資源專案的工作區相對路徑。當沒有指定引數或資源是由工作區相對路徑來識別時,目標資源就是所選的資源。
    value= \file-test

  • ${resource_loc}
    傳回資源的絕對檔案系統路徑。當沒有指定引數或資源是由工作區相對路徑來識別時,目標資源就是所選的資源。
    value= E:\Program\file-test\file-test.c

  • ${resource_name}
    傳回資源的名稱。當沒有指定引數或資源是由工作區相對路徑來識別時,目標資源就是所選的資源。
    value= file-test.c

  • ${resource_path}
    傳回資源的工作區相對路徑。當沒有指定引數或資源是由工作區相對路徑來識別時,目標資源就是所選的資源。
    value= \file-test\file-test.c

  • ${selected_text}
    傳回作用中的編輯器目前選取的文字。
    value= for(i=0;i<length;i++)

  • ${string_prompt}
    傳回輸入提示對話框的文字值。當提供一個引數時,它用來作為輸入對話框中的提示要點。當提供第二個引數時,它用來作為輸入對話框中的起始值。第一和第二個引數必須用 ':' 分開。

  • ${workspace_loc}
    傳回工作區根目錄的絕對檔案系統路徑。當指定引數時,會傳回工作區相對路徑所識別的資源的絕對檔案系統路徑。
    value= E:\Program


參考來源:
Eclipse+CDT+MinGW 安裝手冊
2009-04-26 17:40

[PHP] PDO 資料庫操作方法(快速範例)

  1. <?php 
  2.  
  3. /*--[PDO::query]-----------------------------------*/ 
  4. // 建立查詢連結 
  5. $stmt = $DB_Link->query(sprintf(" 
  6.    SELECT id, colour FROM test_table WHERE name=%s 
  7. ",$name)); 
  8.  
  9. // 設定查詢結果的資料格式,之後可以省去 fetch 時的格式設定 
  10. $stmt->->setFetchMode(PDO::FETCH_ASSOC); 
  11.  
  12. // 取得查詢結果的列數 
  13. $count = $stmt->rowCount (); 
  14. /* PDOStatement::rowCount()主要是用於 PDO::query()和PDO::prepare()進行DELETE、INSERT、UPDATE操作影響的結果集,對PDO::exec()方法 和SELECT操作無效。 */ 
  15.  
  16. // 取得一列的查詢結果 
  17. $row = $stmt->fetch(PDO::FETCH_ASSOC); 
  18.  
  19. // 利用迴圈對每一列做處理 
  20. $dataArray = array(); // 結果儲存陣列 
  21. while ($row = $stmt->fetch(PDO::FETCH_ASSOC) { 
  22.    // 資料處理 
  23.    $row['colour'] = $row['colour']? $row['colour'] : '#000'; 
  24.    // 加儲存陣列 
  25.    array_push($dataArray,$row); 
  26. } 
  27.  
  28. // 取得一列單一欄位的查詢結果 
  29. $column = $stmt->fetchColumn(); // id 
  30. $column = $stmt->fetchColumn(1); // colour 
  31. /* 當查詢結果之有一個時很好用(SELECT COUNT(*) FROM test_table) */ 
  32.  
  33. // 取得所有的查詢結果列 
  34. $dataArray = $stmt->fetchAll (PDO::FETCH_ASSOC); 
  35.  
  36.  
  37. /* PDO::fetch , PDO::fetchAll 選項參數 
  38. PDO::FETCH_LAZY 
  39.    將每一行結果作為一個對象返回 
  40.  
  41. PDO::FETCH_ASSOC 
  42.    僅返回以鍵值作為下標的查詢的結果集,名稱相同的數據只返回一個 
  43.  
  44. PDO::FETCH_NAMED 
  45.    僅返回以鍵值作為下標的查詢的結果集,名稱相同的數據以數組形式返回 
  46.  
  47. PDO::FETCH_NUM 
  48.    僅返回以數字作為下標的查詢的結果集 
  49.  
  50. PDO::FETCH_BOTH 
  51.    同時返回以鍵值和數字作為下標的查詢的結果集(預設) 
  52.  
  53. PDO::FETCH_OBJ 
  54.    按照對象的形式,類似於以前的 mysql_fetch_object() 
  55.  
  56. PDO::FETCH_BOUND 
  57.    將PDOStatement::bindParam()和PDOStatement::bindColumn()所綁定的值作為變量名賦值後返回 
  58.  
  59. PDO::FETCH_COLUMN 
  60.    將返回結果每一列全部集中在一個欄位 
  61.  
  62. PDO::FETCH_CLASS 
  63.    以 Class 的形式返回結果集 
  64.  
  65. PDO::FETCH_INTO 
  66.    將數據合併入一個存在的類中進行返回 
  67.  
  68. PDO::FETCH_FUNC 
  69. PDO::FETCH_GROUP 
  70. PDO::FETCH_UNIQUE 
  71. PDO::FETCH_KEY_PAIR 
  72.    以首個鍵值下表,後面數字下表的形式返回結果集 
  73.  
  74. PDO::FETCH_CLASSTYPE 
  75. PDO::FETCH_SERIALIZE 
  76.    表示將數據合併入一個存在的類中并序列化返回 
  77.  
  78. PDO::FETCH_PROPS_LATE 
  79.    Available since PHP 5.2.0 
  80. */ 
  81.  
  82.  
  83.  
  84. /*--[PDO::exec]-----------------------------------*/ 
  85. $colour="'red'"; 
  86.  
  87. // 建立新增請求 
  88. $count = $DB_Link->exec(sprintf(" 
  89.    INSERT INTO test_table(colour) VALUES(%s) 
  90. ",$colour)); 
  91. // 取得上次 Insert 時產生的 AUTO_INCREMENT Id 
  92. $id = $DB_Link->lastInsertId(); 
  93.  
  94. // 建立更新請求 
  95. $count = $DB_Link->exec(sprintf(" 
  96.    UPDATE test_table SET colour = %s WHERE id=1 
  97. ",$colour)); 
  98.  
  99. // 建立刪除請求 
  100. $count = $DB_Link->exec(sprintf(" 
  101.    DELETE FROM test_table WHERE colour = %s LIMIT 10 
  102. ",$colour)); 
  103. /* 
  104.  PDO::exec 會回傳所影響的列數 
  105.  但如果 DELETE 到資料表為空時將回傳 0,而不是所刪除的列數 
  106. */ 


參考來源:
PHP: PDO::lastInsertId - Manual
PHP: PDOStatement->fetchColumn - Manual
PHP: PDO::exec - Manual
PHP: PDO::query - Manual

PDO (PHP Data Object) 簡易教學 @ wEd2.5
PHP的PDO类教程_PHP技巧
pdo使用简例 - 板子博客
2009-04-26 06:42

[PHP] PDO 資料庫連接設定(快速範例)

  1. <?php 
  2. $hostname = "localhost"; 
  3. $database = "test_db"; 
  4. $username = "root"; 
  5. $password = "0000"; 
  6.  
  7.  
  8. /* DSN :   
  9. mysql:host=localhost;port=3307;dbname=testdb;unix_socket=/tmp/mysql.sock; 
  10.  
  11. pgsql:host=localhost port=5432 dbname=testdb user=bruce password=mypass; 
  12.  
  13. mssql:host=localhost;dbname=testdb 
  14. sybase:host=localhost;dbname=testdb 
  15. dblib:host=localhost;dbname=testdb 
  16.  
  17. odbc:DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME=localhost;PORT=50000;DATABASE=SAMPLE;PROTOCOL=TCPIP;UID=db2inst1;PWD=ibmdb2; 
  18. odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\db.mdb;Uid=Admin; 
  19.  
  20. ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=testdb;HOSTNAME=11.22.33.444;PORT=56789;PROTOCOL=TCPIP; 
  21.  
  22. oci:dbname=192.168.10.145/orcl;charset=CL8MSWIN1251 
  23.  
  24. sqlite:/opt/databases/mydb.sq3 
  25. sqlite::memory: 
  26. sqlite2:/opt/databases/mydb.sq2 
  27. sqlite2::memory: 
  28. */ 
  29.  
  30. $dsn="mysql:host=$hostname;dbname=$database"; 
  31. try { 
  32.    $DB_Link = new PDO($dsn, $username,$password 
  33.        /*,array( 
  34.            PDO::ATTR_PERSISTENT => true,  // 開啟 DB 長連接 
  35.            PDO::MYSQL_ATTR_INIT_COMMAND =>  // MySQL 前置設定 
  36.             "SET NAMES 'utf8'; SET group_concat_max_len=65536;", 
  37.            PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>false // MySQL 查詢緩衝區 
  38.        )*/ 
  39.    );  
  40. } catch (PDOException $e) { 
  41.    // 資料庫連結失敗 
  42.    $e->errorInfo ; // 錯誤明細 
  43.    $e->getMessage(); // 返回異常資訊 
  44.    $e->getPrevious(); // 返回前一個異常 
  45.    $e->getCode(); // 返回異常程式碼 
  46.    $e->getFile(); // 返回發生異常的檔案名 
  47.    $e->getLine(); // 返回發生異常的程式碼行號 
  48.    $e->getTrace(); // backtrace() 陣列 
  49.    $e->getTraceAsString(); // 已格成化成字串的 getTrace() 資訊     
  50.  
  51.    // 錯誤處理... 
  52. } 
  53.  
  54. /* 
  55. PDO::ATTR_CASE: 返回的資料欄位名稱設定 
  56.    PDO::CASE_LOWER: 欄位名稱全部轉換成小寫 
  57.    PDO::CASE_NATURAL: 使用原始欄位名稱(預設) 
  58.    PDO:: CASE_UPPER: 欄位名稱全部轉換成大寫 
  59. */ 
  60. //$DB_Link->setAttribute(PDO::ATTR_CASE,PDO::CASE_NATURAL); 
  61.  
  62.  
  63. /* 
  64. PDO::ATTR_ERRMODE: 錯誤報告 
  65.    PDO::ERRMODE_SILENT: 不顯示錯誤信息,只顯示錯誤碼。 
  66.    PDO::ERRMODE_WARNING: 顯示警告跟錯誤。 
  67.    PDO::ERRMODE_EXCEPTION: 拋出異常。 
  68. */ 
  69. $DB_Link->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 
  70.  
  71.  
  72. /* 
  73. PDO::ATTR_ORACLE_NULLS : 轉換無效的空字串 
  74.    PDO::NULL_NATURAL: 不轉換(預設)。 
  75.    PDO::NULL_EMPTY_STRING: 空字串轉換為 NULL。 
  76.    PDO::NULL_TO_STRING: NULL 轉換為空字串。 
  77. */ 
  78. //$DB_Link->setAttribute(PDO::ATTR_ORACLE_NULLS,PDO::NULL_NATURAL); 
  79.  
  80. /* 
  81. PDO::ATTR_STRINGIFY_FETCHES: 
  82.    Convert numeric values to strings when fetching. Requires bool.  
  83. */ 
  84. //$DB_Link->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); 
  85.  
  86.  
  87. /* 
  88. PDO::ATTR_STATEMENT_CLASS: 變更預設 PDOStatement Class 
  89. */ 
  90. //class DBStatement extends PDOStatement {} 
  91. //$DB_Link->setAttribute(PDO::ATTR_STATEMENT_CLASS, 
  92. //     array('DBStatement', array($DB_Link)) 
  93. //); 
  94.  
  95.  
  96. /* 
  97. PDO::ATTR_AUTOCOMMIT: 自動啟動交易處理 
  98.    在設置成true的時候,PDO會自動嘗試停止接受委託,開始執行 
  99. */ 
  100. //$DB_Link->setAttribute(PDO::ATTR_AUTOCOMMIT,true); 
  101.  
  102.  
  103.  
  104. // 設定存取的編碼方式 
  105. $DB_Link->exec("SET NAMES 'utf8';"); 
  106.  
  107. // 設定 GROUP_CONCAT 的最大長度 
  108. $DB_Link->exec("SET group_concat_max_len=65536;"); 
  109.  
  110. // 關閉查詢快取 
  111. //$DB_Link->exec("SET SESSION query_cache_type=OFF;"); 




參考來源:
PHP: PDO Drivers - Manual
PHP: PDO::__construct - Manual
PHP: PDOException - Manual
PHP: PDO::setAttribute - Manual

牛刀小小試 PHP5中PDO的簡單使用
2009-04-25 16:58

[LEX] 使用命令列參數開啟檔案

  1. /*[flex] 的指令參數 
  2. * ( flex -FLi8 %f ) 
  3. * -l 最大兼容性法則 
  4. * -i 不區分大小寫 
  5. * -f 產生不壓縮的完整表格,效率快,所需空間大 
  6. * -F 最佳效率與空間優化 
  7. * -L 在產生的程式碼中不加入 #line 
  8. * -7 使用 7 bit 掃瞄文字(預設) 
  9. * -8 使用 8 bit 掃瞄文字 
  10. * 
  11. * -+ 產生 C++ 掃瞄 Class 
  12. * 
  13. * -oOutputName 指定輸出檔案名稱 
  14. * 
  15. * -h 參數說明 
  16. * -V 版本顯示 
  17. * -T 顯示追蹤記錄 
  18. *  */ 
  19.  
  20.  
  21.    /* [定義段落] */ 
  22. %{ 
  23. #include <stdio.h> 
  24.  
  25. %} 
  26.  
  27.    /* 告知沒有自訂的 unput() */ 
  28. %option nounput 
  29.  
  30.    /* 初始狀態 */ 
  31. %s START 
  32.    /* 多行註解狀態 */ 
  33. %s COMMENTS 
  34.  
  35.    /* 換行符號 */ 
  36. EN [\r\n] 
  37.    /* 換行符號及空白字元 */ 
  38. SP [ \t\r\n]  // 
  39.    /* 單引號字串 */ 
  40. //STR1 (\'([^\'\r\n]|"\\\'")*\') 
  41.    /* 雙引號字串 */ 
  42. //STR2 (\"([^\"\r\n]|"\\\"")*\") 
  43.  
  44.  
  45. %%  /* [規則段落] */ 
  46.  
  47.    /* 多行註解模式 */ 
  48. <COMMENTS>"*/"{SP}*     { BEGIN START; } 
  49. <COMMENTS>.|{SP}        ; 
  50.  
  51.    /* 初始模式 */ 
  52. <START>"/*"             { BEGIN COMMENTS; } 
  53. <START>"//".*{EN}+      ; 
  54. <START>.                {fprintf(yyout,"%s",yytext);} 
  55.  
  56.  
  57. %%  /* [自訂函數段落] */ 
  58.  
  59. /* 程式執行方式與檔案參數 
  60. * 程式.exe 文件1.txt 文件2.txt 文件3.txt 
  61. * 或使用文件拖放至程式上 
  62. * */ 
  63. char **fileList; 
  64. unsigned currentFile = 0; 
  65. unsigned nFiles; 
  66.  
  67. int main(int argc,char **argv){ 
  68.    // 沒有檔案 
  69.    if(argc<2){ 
  70.        printf("沒有給予檔案參數");return 0; 
  71.  
  72.    }else{ 
  73.        // 取得檔案參數 
  74.        fileList = argv+1; 
  75.        nFiles = argc-1; 
  76.  
  77.        // 嘗試開啟第一個檔案 
  78.        yywrap(); 
  79.    } 
  80.  
  81.    // 執行文字解析器 
  82.    yylex(); 
  83.    /* 文字解析器會在檔案結束時 
  84.     * 自動呼叫 yywrap() 開啟下一個檔案 
  85.     * */ 
  86.  
  87.    return 0; 
  88. } 
  89.  
  90. /* 當沒自訂的 yywrap() 時 
  91. * 記得在前加上 "%option noyywrap" 
  92. * */ 
  93. int yywrap(){ 
  94.    // 關閉上次開啟的檔案 
  95.    if ((currentFile > 0) && (nFiles >= 1) && (currentFile <= nFiles)) { 
  96.        // 關閉輸入與輸出的文件 
  97.        fclose(yyin); fclose(yyout); 
  98.  
  99.        // 將暫存檔覆蓋原始輸入文件 
  100.        remove(fileList[currentFile-1]); 
  101.        rename("temp",fileList[currentFile-1]); 
  102.    } 
  103.  
  104.    FILE *fileIn = NULL; 
  105.    while ((currentFile < nFiles)) { 
  106.        // 檢查副檔名 
  107.        if(strstr(fileList[currentFile],".txt")!= NULL){ 
  108.            // 設定初始狀態 
  109.            BEGIN START; 
  110.        }else{ 
  111.            // 跳過不符合的檔案 
  112.            continue; 
  113.        } 
  114.  
  115.  
  116.        // 嘗試開啟檔案 
  117.        fileIn = fopen(fileList[currentFile++], "r"); 
  118.        if (fileIn != NULL) { 
  119.            // 指定輸入與輸出的文件指標 
  120.            yyin = fileIn; 
  121.            yyout = fopen("temp","w"); 
  122.  
  123.            // 成功開啟檔案跳出迴圈 
  124.            break; 
  125.        } 
  126.        printf("無法開啟檔案: %s\n",fileList[currentFile-1]); 
  127.    } 
  128.    // 回傳狀態 ( 0:成功開啟 , 1:開啟失敗 ) 
  129.    return (fileIn ? 0 : 1); 
  130. } 

相關連結:Yacc 与 Lex 快速入门
2009-04-25 03:21

[C語言] 快速排序法(quick sort)

  1. #include<stdio.h> 
  2.  
  3. /** quick_sort [快速排序法] 
  4. * @param {array} array 
  5. * @param {int} low 
  6. * @param {int} high 
  7. */ 
  8. int quick_sort(int *array,int low,int high) { 
  9.    int pivot_point,pivot_item,i,j,temp; 
  10.    // 指標交界結束排序 
  11.    if(high<=low){return 1;} 
  12.  
  13.    // 紀錄樞紐值 
  14.    pivot_item = array[low]; 
  15.    j=low; 
  16.  
  17.    // 尋找比樞紐小的數 
  18.    for(i=low+1; i<=high; i++) { 
  19.        // 跳過等於或大於的數 
  20.        if(array[i]>=pivot_item){continue;} 
  21.  
  22.        j++; 
  23.        // 交換 array[i] , array[j] 
  24.        temp = array[i]; 
  25.        array[i] = array[j]; 
  26.        array[j] = temp; 
  27.    } 
  28.  
  29.    // 將樞紐位址移到中間 
  30.    pivot_point=j; 
  31.    // 交換 array[low] , array[pivot_point] 
  32.    temp = array[low]; 
  33.    array[low] = array[pivot_point]; 
  34.    array[pivot_point] = temp; 
  35.  
  36.    // 遞迴處理左側區段 
  37.    quick_sort(array,low,pivot_point-1); 
  38.    // 遞迴處理右側區段 
  39.    quick_sort(array,pivot_point+1,high); 
  40.  
  41.    return 1; 
  42. } 
  43.  
  44.  
  45. /*主程式*/ 
  46. int main(){ 
  47.    int a[]={12,42,54,3,5,32,61,24,31}; 
  48.  
  49.    quick_sort(a,0,8); 
  50.  
  51.    int i; 
  52.    for(i=0; i<=8; i++) { 
  53.        printf("%d\n",a[i]); 
  54.    } 
  55.  
  56.    _getch(); 
  57.    return 0; 
  58. } 
2009-04-25 02:56

[C語言] 連結串列(link list)

  1. /* link list (連結串列) */ 
  2. #include<stdio.h> 
  3. #include<string.h> 
  4. #include<stdlib.h> 
  5.  
  6. /* 定義結構型態 */ 
  7. typedef struct link_node{ 
  8.    int data; 
  9.    struct link_node *link; 
  10. } LINK_NODE; 
  11.  
  12.  
  13.  
  14. /* 產生新節點 */ 
  15. LINK_NODE *new_node(int data){ 
  16.    LINK_NODE *node; 
  17.    node=(LINK_NODE *) malloc(sizeof(LINK_NODE));/*<stdlib.h>*/ 
  18.  
  19.    // 記憶體不足 
  20.    if(node == NULL){ return NULL;} 
  21.  
  22.    node->data=data;   
  23.    node->link=NULL;      
  24.    return node; 
  25. } 
  26.  
  27.  
  28. /* 加入新的資料於最後 */ 
  29. LINK_NODE *push_node(LINK_NODE *list, int data){ 
  30.    /*產生新節點*/ 
  31.    LINK_NODE *node=new_node(data);   
  32.  
  33.    // 加入第一個新節點 
  34.    if(list==NULL){     
  35.        list=node; 
  36.    }else{ 
  37.        LINK_NODE *p=list;   
  38.        // 取得最後一個節點 
  39.        while(p->link!=NULL){p=p->link;} 
  40.        p->link=node; 
  41.    }    
  42.    return list; 
  43. } 
  44.  
  45.  
  46. /* 排序插入新節點 */ 
  47. LINK_NODE *sort_insert(LINK_NODE *list,int data){ 
  48.    // 加入第一筆資料 
  49.  
  50.    // 產生新節點 
  51.    LINK_NODE *node=new_node(data);     
  52.    if(list==NULL){ list=node; return list; }   
  53.  
  54.    // 尋找大於資料(data)的位址 
  55.    LINK_NODE *r=list,*q=list;     
  56.    while(r!=NULL && r->data<data){ q=r; r=r->link; } 
  57.  
  58.    if(r==list){ // 首節點 
  59.        node->link=list; list=node;  
  60.    }else{ // 加入新節點於中間 
  61.        node->link=q->link;  
  62.        q->link=node;  
  63.    }     
  64.    return list;  
  65. } 
  66.  
  67.  
  68. /* 計算串列長度 */ 
  69. int get_length(LINK_NODE *list){ 
  70.    LINK_NODE *p=list; 
  71.    int count=0;   
  72.    while(p!=NULL){     
  73.        count++;   
  74.        p=p->link;   
  75.    } 
  76.  
  77.    return count; 
  78. } 
  79.  
  80.  
  81. /* 搜尋資料(data)的節點位子 */ 
  82. LINK_NODE *search_node(LINK_NODE *list, int data){ 
  83.    LINK_NODE *p=list;   
  84.    while(p!=NULL && p->data!=data){ p=p->link; } 
  85.    return p ; 
  86. } 
  87.  
  88.  
  89. /* 印出所有串列的所有資料 */ 
  90. int display(LINK_NODE *list){ 
  91.    LINK_NODE *p=list; 
  92.    while(p!=NULL){  
  93.        printf("%d\n",p->data);/*<stdio.h>*/ 
  94.        p=p->link;   
  95.    } 
  96.    return 1; 
  97. } 
  98.  
  99.  
  100.  
  101.  
  102. /*主程式*/ 
  103. int main(){ 
  104.    LINK_NODE *list=NULL; 
  105.  
  106.    list=sort_insert(list,4); 
  107.    list=sort_insert(list,2); 
  108.    list=sort_insert(list,7); 
  109.    list=sort_insert(list,9); 
  110.    list=sort_insert(list,14); 
  111.    display(list); 
  112.  
  113.    printf("--------------------------\n"); 
  114.  
  115.    list=push_node(list,4); 
  116.    list=push_node(list,2); 
  117.    list=push_node(list,7); 
  118.    list=push_node(list,9); 
  119.    list=push_node(list,14); 
  120.    display(list); 
  121.  
  122.    _getch();   
  123.    return 0; 
  124. } 
2009-04-25 01:47

[C語言] 字串取代(str_replace)

strlen , strcpy , strstr , strcat , malloc
  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <stdlib.h> 
  4.  
  5. /* str_replace [字串取代] 
  6. * @param {char*} source 原始的文字 
  7. * @param {char*} find 搜尋的文字   
  8. * @param {char*} rep 替換的文字 
  9. * */ 
  10. char *str_replace (char *source, char *find,  char *rep){ 
  11.    // 搜尋文字的長度 
  12.    int find_L=strlen(find); 
  13.    // 替換文字的長度 
  14.    int rep_L=strlen(rep); 
  15.    // 結果文字的長度 
  16.    int length=strlen(source)+1; 
  17.    // 定位偏移量 
  18.    int gap=0; 
  19.  
  20.    // 建立結果文字,並複製文字 
  21.    char *result = (char*)malloc(sizeof(char) * length); 
  22.    strcpy(result, source);     
  23.  
  24.    // 尚未被取代的字串 
  25.    char *former=source; 
  26.    // 搜尋文字出現的起始位址指標 
  27.    char *location= strstr(former, find); 
  28.  
  29.    // 漸進搜尋欲替換的文字 
  30.    while(location!=NULL){ 
  31.        // 增加定位偏移量 
  32.        gap+=(location - former); 
  33.        // 將結束符號定在搜尋到的位址上 
  34.        result[gap]='\0'; 
  35.  
  36.        // 計算新的長度 
  37.        length+=(rep_L-find_L); 
  38.        // 變更記憶體空間 
  39.        result = (char*)realloc(result, length * sizeof(char)); 
  40.        // 替換的文字串接在結果後面 
  41.        strcat(result, rep); 
  42.        // 更新定位偏移量 
  43.        gap+=rep_L; 
  44.  
  45.        // 更新尚未被取代的字串的位址 
  46.        former=location+find_L; 
  47.        // 將尚未被取代的文字串接在結果後面 
  48.        strcat(result, former); 
  49.  
  50.        // 搜尋文字出現的起始位址指標 
  51.        location= strstr(former, find); 
  52.    }     
  53.  
  54.    return result; 
  55.  
  56. } 
  57.  
  58.  
  59. int main(){ 
  60.    char* str1 = "this is a string of characters"; 
  61.    char* str2 = str_replace(str1, "is","FFF"); 
  62.  
  63.    printf( "str1: '%s'\n", str1 ); 
  64.    printf( "str2: '%s'\n", str2 ); 
  65.  
  66.    _getch();     
  67.    return 0; 
  68. } 


參考來源:
Standard C String and Character [C++ Reference]
2009-04-24 22:15

[C語言] 取得目錄名稱路徑(dirname)

dirname
  1. #include <libgen.h> 
  2.  
  3. int main(){ 
  4.    char W_path1[] = "E:\\test" ; 
  5.    char W_path2[] = "E:\\Program\\clear\\ape-06\\Debug" ; 
  6.    char W_path3[] = "E:\\Program\\clear\\.metadata\\.plugins\\org" ; 
  7.  
  8.    dirname(W_path1); 
  9.    printf("%s\n",W_path1); 
  10.    // E:\ 
  11.  
  12.    dirname(W_path2); 
  13.    printf("%s\n",W_path2); 
  14.    // E:\Program\clear\ape-06 
  15.  
  16.    dirname(W_path3); 
  17.    printf("%s\n",W_path3); 
  18.    // E:\Program\clear\.metadata\.plugins 
  19.  
  20.    char L_path1[] = "/test" ; 
  21.    char L_path2[] = "/Program/clear/ape-06/Debug" ; 
  22.    char L_path3[] = "/Program/clear/.metadata/.plugins/org" ; 
  23.  
  24.    dirname(L_path1); 
  25.    printf("%s\n",L_path1); 
  26.    // / 
  27.  
  28.    dirname(L_path2); 
  29.    printf("%s\n",L_path2); 
  30.    // /Program/clear/ape-06 
  31.  
  32.    dirname(L_path3); 
  33.    printf("%s\n",L_path3); 
  34.    // /Program/clear/.metadata/.plugins 
  35.  
  36.  
  37.    _getch();     
  38.    return 0; 
  39. } 


參考來源:
<libgen.h>
2009-04-24 21:44

[C語言] 遞迴掃瞄目錄下所有文件(dir_recursive)

opendir , readdir , closedir
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <string.h> 
  4.  
  5. #include <sys/types.h> 
  6. #include <dirent.h> 
  7.  
  8.  
  9. /* dir_recursive [遞迴掃瞄目錄下所有文件] 
  10. * 掃瞄 path 下所有的文件,並輸出至 output 的文件中 
  11. * output 必須為可寫入的文件 
  12. * */ 
  13. int dir_recursive(char *path, FILE *output){ 
  14.    char glue='\\'; // Windows 的分隔符號 
  15.    //char glue='/'; // Linux 的分隔符號 
  16.  
  17.    // 嘗試開啟目錄 
  18.    DIR * dp = opendir(path); 
  19.  
  20.    if (!dp){     
  21.        // 不是目錄,輸出至檔案     
  22.           fprintf(output,"%s\n",path); 
  23.           return 1; 
  24.    } 
  25.  
  26.    struct dirent *filename;     
  27.    while((filename=readdir(dp))){ 
  28.        // 跳過當前及母目錄 
  29.        if(!strcmp(filename->d_name,"..") || !strcmp(filename->d_name,".")){ 
  30.            continue; 
  31.        } 
  32.  
  33.        // 計算新的路徑字串所需的長度 
  34.        int pathLength=strlen(path)+strlen(filename->d_name)+2; 
  35.        // 產生新的陣列空間 
  36.        char *pathStr = (char*)malloc(sizeof(char) * pathLength); 
  37.        // 複製當前目錄路徑至新的陣列空間 
  38.        strcpy(pathStr, path); 
  39.  
  40.        // 檢查目錄分隔符號 
  41.        int i=strlen(pathStr); 
  42.        if(pathStr[i-1]!=glue){ 
  43.            pathStr[i]=glue; 
  44.            pathStr[i+1]='\0'; 
  45.        } 
  46.  
  47.        // 串接次目錄名稱或檔案名稱至新的陣列空間 
  48.        strcat(pathStr, filename->d_name); 
  49.  
  50.        // 遞迴呼叫目錄掃瞄 
  51.        dir_recursive(pathStr,output); 
  52.  
  53.    } 
  54.  
  55.    // 關閉目錄 
  56.    closedir(dp); 
  57.  
  58.    return 1; 
  59. } 
  60.  
  61.  
  62.  
  63. int main(){ 
  64.    // 建立輸出的文件檔 
  65.    FILE *fileOut = fopen("output.txt", "w"); 
  66.  
  67.    // 掃瞄 E:\test 下所有的文件 
  68.    dir_recursive("E:\\test",fileOut);  
  69.  
  70.    return 0; 
  71. } 


參考來源:
[原创]LINUX下用C语言历遍目录 C语言列出目录_小徐博客 学无止境 minix and linux
2009-04-24 20:09

[C語言] 字串相加(string_concat)

strlen , strcpy , strcat
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <string.h> 
  4.  
  5. /* string_concat [字串相加] 
  6. * 將 str1 與 str2 相加,並返回新的字串 
  7. * */ 
  8. char *string_concat(char *str1, char *str2) { 
  9.    // 計算所需的陣列長度 
  10.    int length=strlen(str1)+strlen(str2)+1; 
  11.  
  12.    // 產生新的陣列空間 
  13.    char *result = (char*)malloc(sizeof(char) * length); 
  14.  
  15.    // 複製第一個字串至新的陣列空間 
  16.    strcpy(result, str1); 
  17.    // 串接第二個字串至新的陣列空間 
  18.    strcat(result, str2); 
  19.  
  20.    return result; 
  21. } 
  22.  
  23.  
  24. int main(){ 
  25.    char *a="123456"; 
  26.    char *b="abcde"; 
  27.    char *c=string_concat(a,b); 
  28.    printf("%s\n",c); 
  29.  
  30.    _getch(); 
  31.    return 0; 
  32. } 


參考來源:
Standard C String and Character [C++ Reference]
2009-04-24 19:10

[C語言] 檔案讀寫

fclose , feof , fopen , fprintf , fscanf , printf , remove , rename , rewind , scanf , ftell , fseek
  1. #include <stdio.h> 
  2.  
  3. int main(){ 
  4.    FILE *fileIn; 
  5.    FILE *fileOut; 
  6.  
  7.    fileIn = fopen("input.txt", "r"); 
  8.    if(fileIn == NULL){printf("檔案不存在\n"); return 0;} 
  9.  
  10.    fileOut = fopen("output.txt", "w"); 
  11.    /* Mod: 
  12.    * "r" : 開啟檔案,以純文字方式[讀取]。 
  13.    * "w" : 開啟或建立檔案,以純文字方式[寫入],會複寫原先的資料。 
  14.    * "a" : 開啟或建立檔案,以純文字方式[寫入],並將檔案指標移到最後。 
  15.    * "rb" : 同 "r" 但以二進位(binary)方式[讀取]。 
  16.    * "wb" : 同 "w" 但以二進位(binary)方式[寫入]。 
  17.    * "ab" : 同 "a" 但以二進位(binary)方式[寫入]。 
  18.    * "r+" : 同 "r" 但同時具有[讀取/寫入]的權力 
  19.    * "w+" : 同 "w" 但同時具有[讀取/寫入]的權力 
  20.    * "a+" : 同 "a" 但同時具有[讀取/寫入]的權力 
  21.    * "rb+" : 同 "rb" 但同時具有[讀取/寫入]的權力 
  22.    * "wb+" : 同 "wb" 但同時具有[讀取/寫入]的權力 
  23.    * "ab+" : 同 "ab" 但同時具有[讀取/寫入]的權力。 
  24.    */ 
  25.  
  26.  
  27.    int    a1; 
  28.    float  a2; 
  29.    char   a3; 
  30.    char   a4[100]; 
  31.  
  32.    while(!feof(fileIn)){// 當讀取結束時會回傳 true 
  33.        // 依格式讀取一列文字,所有的變數都要取址,除了字元陣列 
  34.        fscanf(fileIn,"%d %f %c %s",&a1,&a2,&a3,a4); 
  35.  
  36.        // 依格式將資料輸出至螢幕上 
  37.        printf("%d %f %c %s\n",a1,a2,a3,a4); 
  38.  
  39.        // 依格式寫入一列文字 
  40.        fprintf(fileOut,"%d %f %c %s\n",a1,a2,a3,a4); 
  41.  
  42.        /* %c : 一個字元(char)格式 
  43.        * %s : 一個字串格式 
  44.        * 
  45.        * %i : 一個整數(int)格式 
  46.        * %d : 一個十進位整數(int)格式 
  47.        * %u : 一個十進位無符號整數(unsigned)格式 
  48.        * 
  49.        * %e, %f, %g : 一個浮點數(float)格式 
  50.        * %lf: 一個浮點數(double)格式 
  51.        * 
  52.        * %o : 八進位(02732)格式 
  53.        * %x : 十六進位(0x27fa)格式 
  54.        * %% : 跳脫成 % 
  55.        * */ 
  56.  
  57.    } 
  58.  
  59.    // 輸出當前的檔案指標位址 
  60.    printf("offset = %ld\n", ftell(fileIn) ); 
  61.  
  62.    // 將檔案指標返回至最上面,失敗則回傳 0 
  63.    // 會清除錯誤並將 EOF 標示清除 
  64.    // 當需要重新讀取時可利用此函數 
  65.    rewind(fileIn); 
  66.  
  67.    // 將移動檔案指標從開始處偏移 5 個字元,成功則回傳 0 
  68.    // 會將 EOF 標示清除 
  69.    fseek(fileIn,5,SEEK_SET); 
  70.    /* int fseek( FILE *stream, long offset, int origin ); 
  71.    * stream : 檔案指標 
  72.    * offset : 偏移量,可為正負數 
  73.    * origin : 偏移的依據位址 
  74.    *   SEEK_SET 0  檔案起始位址 
  75.    *   SEEK_CUR  1  當前位址 
  76.    *   SEEK_END  2  檔案結束位址 
  77.    * */ 
  78.  
  79.  
  80.    // 關閉檔案指標 
  81.    fclose(fileIn); 
  82.    fclose(fileOut); 
  83.  
  84.    // 將檔案 "input.txt" 移除 
  85.    remove("input.txt"); 
  86.  
  87.    // 將 "output.txt" 的檔案名稱變更為 "input.txt" 
  88.    rename("output.txt","input.txt"); 
  89.  
  90.  
  91.    // 按任意鍵結束 
  92.    _getch(); 
  93.    return 0; 
  94. } 


參考來源:
Standard C I/O [C++ Reference]
printf() 與 scanf()
2009-04-24 16:11

[C語言] 動態記憶體配置(malloc)

malloc , calloc , realloc , free
  1. #include <stdlib.h> 
  2.  
  3. int main(){ 
  4.  
  5. /*一維陣列*/ 
  6.    int size1=1000; 
  7.    int *array1; 
  8.  
  9.    // 利用 malloc 配置空間 。 
  10.    array1 = (int*) malloc(size1 * sizeof(int)); 
  11.  
  12.    // 利用 calloc 配置空間,會初始為 0 。 
  13.    array1 = (int*) calloc(size1 , sizeof(int)); 
  14.  
  15.    // 利用 realloc 將原本的空間調整成兩倍,並且複製原本的內容, 
  16.    // 但不保證是原本的空間位址。  
  17.    array1 = (int*) realloc(array1, 2 * size1 * sizeof(int)); 
  18.  
  19.  
  20.    // 釋放記憶體空間。 
  21.    free(array1); 
  22.  
  23.  
  24. /*二維陣列*/ 
  25.    int i; 
  26.    int size_x=100; 
  27.    int size_y=100; 
  28.    int **array2; 
  29.  
  30.    // 利用 malloc 配置二維空間 。 
  31.    array2 = (int**) malloc(size_x * sizeof(int*)); 
  32.    for (i=0; i<size_x; i++){ 
  33.        array2[i] = (int*) malloc(size_y * sizeof(int)); 
  34.    } 
  35.  
  36.  
  37.    // 釋放記憶體空間 
  38.    for (i=0; i<size_x; i++){ 
  39.        free(array2[i]); 
  40.    } 
  41.    free(array2); 
  42.  
  43.    return 0;  
  44. } 


參考來源:
Standard C Memory [C++ Reference]
2009-04-24 12:31

Dos 下的目錄顯示(DIR)

顯示檔案清單以列出目錄中的檔案及子目錄。
  1. DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N] 
  2.  [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4] 

[drive:][path][filename]
 指定要顯示的磁碟機、目錄或檔案。

/?顯示參數說明。

/A依照指定的檔案屬性來顯示檔案。
attributesD 目錄
R 唯讀檔
H 隱藏檔
A 保存檔
S 系統檔案
- 無意義

/B使用單純格式 (沒有標頭資訊或摘要)。

/C顯示檔案大小千位數分隔符號。這是預設值。 使用 /-C 來停用分隔符號的顯示。

/D與寬的列表格式相同,但是依照欄來排序。

/L使用小寫顯示。

/N使用新的長列表格式,檔名會顯示在最右方。

/O依照指定的排序順序來列出檔案。
sortorderN 依名稱 (英文字母)
S 依大小 (最小的在前)
E 依副檔名 (英文字母)
D 依照日期與時間 (日期較早的在前)
G 先列出子目錄 - 表示相反的順序

/P當資料填滿整個螢幕時暫停顯示。

/Q顯示檔案擁有者。

/S顯示指定目錄及所有子目錄中的檔案。

/T指定用來顯示或排序的時間欄位
timefieldC 建立
A 上次檔案存取時間
W 上次寫入檔案時間

/W使用寬的列表格式。

/X顯示對非 8.3 格式的檔案產生的短檔名。這個格式和 /N 相同,但是短檔名會插入在長檔名之前。 如果沒有長檔名存在,該處會顯示空白。

/4顯示四位數的年份

參數可能會在 DIRCMD 環境變數預先設定。您可以在任何參數使用連字號字首(-)來覆蓋預先的設定--例如: /-W。


操作範例:
  1. # 列出所有 D:\test 下的檔案與目錄 
  2. DIR D:\test /S /B 
  3. # print: 
  4. # D:\test\001.jpg 
  5. # D:\test\002.jpg 
  6. # D:\test\003.jpg 
  7. # D:\test\pics 
  8. # D:\test\pics\001.jpg 
  9. # D:\test\pics\002.jpg 
  10.  
  11.  
  12. # 列出當前目錄下的檔案與目錄,並將結果輸出至 D:\test\dir.txt 
  13. DIR /S /B >D:\test\dir.txt 
  14.  
  15. # 將列出的結果加入至 D:\test\dir.txt 檔案後面 
  16. DIR /S /B >>D:\test\dir.txt 
  17.  
  18.  
  19. # 找出 D:\test 下的副檔名為 jpg 的檔案 
  20. DIR D:\test /S /B |FIND /I ".jpg" 
  21. # print: 
  22. # D:\test\001.jpg 
  23. # D:\test\002.jpg 
  24. # D:\test\003.jpg 
  25. # D:\test\pics\001.jpg 
  26. # D:\test\pics\002.jpg 
2009-04-23 20:51

PhotoShop 實用教學-動作與批次處理

在 PhotoShop 中有個很實用的功能,那就是動作紀錄與批次處理,可能你對這個軟體不是很熟悉,但這個功能可以方便你在處理大量圖片,我最喜歡的就是這個功能完全的客製化,只要你會的功能通通都可以錄製個人的批次處理,好處就是只要這套軟體就可以處理很多事。


PhotoShop 實用教學-動作與批次處理
廢話那麼多,我用一個為圖片加上個人標註的範例來說明好了。


PhotoShop 實用教學-動作與批次處理
首先開啟一個圖檔,並點選動作視窗。


PhotoShop 實用教學-動作與批次處理
按下動作視窗中的建立新增動作


PhotoShop 實用教學-動作與批次處理
取一個適合的名稱,以免以後忘記當初做的事。
這裡還可以為此動作設立快捷鍵,在平時編輯圖片上也是蠻方便的。


PhotoShop 實用教學-動作與批次處理
這裡要注意錄製的按鈕是否按下,在一開始都會預設啟動,為了保險起見來是注意一下,以免等一下都白做了。


PhotoShop 實用教學-動作與批次處理
一開始先選取影像尺寸調整圖片的解析度,這也是最重要的事。
因為在不同的解析度下,編輯單位會大大的受影響,免得最後做出來的動作不通用,為了方便通用性,建議先規定圖片的大小跟解析度。


PhotoShop 實用教學-動作與批次處理
這裡建議固定寬度與高度,只調整圖片的解析度至網頁用的 72 dpi


PhotoShop 實用教學-動作與批次處理
為產生上下所需要的高度,選擇調整版面尺寸


PhotoShop 實用教學-動作與批次處理
以相對方式為上下各增加 30 px,這裡的高度就依個人需要而定了,沒有特別限制,最後會為寬高都增加至 40 px。


PhotoShop 實用教學-動作與批次處理
選擇文字工具。


PhotoShop 實用教學-動作與批次處理
這裡要特別注意,文字定位是採用 % 來計算的,盡可能讓文字的 X Y 值壓在最邊界上,為了通用性的考量,我想沒有人願意接受非預期的效果,所以這裡要特別注意。


PhotoShop 實用教學-動作與批次處理
你可以在動作紀錄中發現文字處理上所記錄的事項,這裡很明顯的看到文字的定位單位(%)


PhotoShop 實用教學-動作與批次處理
再來選取版面尺寸增加剩下的高度與寬度。


PhotoShop 實用教學-動作與批次處理
為寬度增加 40 px 及高度 10 px。


PhotoShop 實用教學-動作與批次處理
最後做一的影像平面化


PhotoShop 實用教學-動作與批次處理
最後點選停止紀錄
到這裡動作的錄製就算完成了,你可以嘗試的按下旁邊的播放扭,就可以發覺剛剛錄製的效果了。


PhotoShop 實用教學-動作與批次處理
接下就要將錄製好的動作轉存批次處理的程序檔
在上一個選項批次處理可以快速的將錄製的動作直接使用,但為了讓批次處理可以更方便,也為了讓這個動作可以好好的保存,我建議製作成程序檔,雖然程序檔不可以再改寫及察看。


PhotoShop 實用教學-動作與批次處理
選擇程序檔(.exe)要存放的位置,當然最好還是取一個好一點的名稱,要不然到時候又忘記是做什麼用的,那今天的努力又白費了。


PhotoShop 實用教學-動作與批次處理
選擇剛剛錄製好的動作,當然你也可以選擇其他預設的動作。


PhotoShop 實用教學-動作與批次處理
選擇儲存的方式,這裡我選擇直接覆蓋原始圖片的方式,當然也可以另存至其他目錄。
這裡要記得勾選上面兩個選項,『包括全部的次當案夾』可以讓選取目錄下所有的圖檔,都套用此批次處理,這樣在批次套用上會很方便,『抑制色彩描述警告』如果你不想再批次處理的過程中,一直點選討厭的對話匡的話,最好勾選此選項。


PhotoShop 實用教學-動作與批次處理
你可以利用文件管理,將圖檔或目錄拖放至程序上,接下來就會套用批次處理中動作記錄。


當然也可以使用命令列去執行套用的動作,建議使用目錄當作參數,在處理大量圖片的時候會比較簡短。
  1. E:\>著作權標示.exe E:\photo-test\001.jpg E:\photo-test\002.jpg 
  2.  
  3. E:\>著作權標示.exe E:\photo-test\ss 
2009-04-17 20:10

利用 switch 該善程式碼的閱讀性

一個簡單的網頁 Script 架構,不外乎一個進入點及一個輸出點,由上到下一個很單純的流程。

在資料驗證上也是一個接一個,但卻數量多的時候,卻會讓整體流程看起來很複雜,很不直覺。

一個基本 switch 的撰寫方法,用在代替有結構的 IF 時還蠻放便的。
  1. <?php 
  2. switch ($_GET['type']) { 
  3.  // 當 $_GET['type']=="apple" 時進入程式片段  
  4.  case "apple":  
  5.    //程式片段... 
  6.    break; 
  7.  
  8.  // 當 $_GET['type']=="bar" 時進入程式片段  
  9.  case "bar": 
  10.    //程式片段... 
  11.    break; 
  12.  
  13.  // 當以上都不符合,預設進入程式片段  
  14.  default : 
  15.    //程式片段... 
  16.    break; 
  17. } 
  18. ?> 


這個例子,將判斷式移到 case 上,讓原本的 switch 更加彈性,但這不是主要目的,在 switch 裡主要的好處是可以利用 break 跳出流程,這樣的用法跟 function 很像,利用跳出的方式結束剩下的程序,在區塊中檢查到錯誤的數入參數時,直接丟出訊息並讓輸出程序去處理顯示的問題。
  1. <?php 
  2. switch (true){ 
  3.  case ($_GET['type']=='view'): 
  4.    //其他判斷或動作... 
  5.    break; 
  6.  
  7.  case ($_GET['action']=='delete'): 
  8.    //其他判斷或動作... 
  9.    break; 
  10.  
  11.  case ($_GET['action']=='add'): 
  12.    //標題檢查 
  13.    $title=trim($_GET['title']);/*去除頭尾空白*/ 
  14.    $title=htmlspecialchars($title,ENT_QUOTES);/*HTML 跳脫*/ 
  15.    $title=mb_substr($title, 0, 100);/*100字剪裁*/ 
  16.    if(!$title){ //利用 if 判斷,錯誤則跳出 switch 
  17.        // 列出錯誤訊息 
  18.        break; 
  19.    } 
  20.  
  21.    //訊息檢查 
  22.    $msg=trim($_GET['msg']);/*去除頭尾空白*/ 
  23.    $msg=htmlspecialchars($msg,ENT_QUOTES);/*HTML 跳脫*/ 
  24.    $msg=mb_substr($msg, 0, 1000);/*1000字剪裁*/ 
  25.    if(!$msg)){ //利用 if 判斷,錯誤則跳出 switch 
  26.        // 列出錯誤訊息 
  27.        break; 
  28.    } 
  29.  
  30.    //其他判斷或動作... 
  31.    break; 
  32.  
  33.  default : 
  34.    // 列出錯誤訊息 
  35.    break; 
  36. }  
  37. ?> 


再看看如果用 IF 去處理輸入驗證時,必須將所有資料先做處理,後面再一個一個去判斷,在閱讀上很不直覺,如果中間有大量的輸入參數要處理時,會讓人找很久。
  1. <?php 
  2. if($_GET['type']=='view'){ 
  3.    //其他判斷或動作... 
  4.  
  5. }elseif($_GET['action']=='delete'){ 
  6.    //其他判斷或動作... 
  7.  
  8. }elseif($_GET['action']=='add'){ 
  9.    //標題檢查 
  10.    $title=trim($_GET['title']);/*去除頭尾空白*/ 
  11.    $title=htmlspecialchars($title,ENT_QUOTES);/*HTML 跳脫*/ 
  12.    $title = mb_substr($title, 0, 100);/*100字剪裁*/ 
  13.  
  14.    //訊息檢查 
  15.    $msg=trim($_GET['msg']);/*去除頭尾空白*/ 
  16.    $msg=htmlspecialchars($msg,ENT_QUOTES);/*HTML 跳脫*/ 
  17.    $msg = mb_substr($msg, 0, 1000);/*1000字剪裁*/ 
  18.  
  19.    if(!$title){ 
  20.        // 列出錯誤訊息 
  21.    }elseif(!$msg){ 
  22.        // 列出錯誤訊息 
  23.    }else{ 
  24.        //其他判斷或動作... 
  25.    } 
  26.  
  27.    break; 
  28. }else{ 
  29.    // 列出錯誤訊息 
  30. } 
  31. ?> 


參考來源:
PHP: switch - Manual
2009-04-16 15:08

[Web] Cookie 小觀念的補述

今天看到網站製作學習誌中提到 COOKIE 的問題
引用來源:[Web] Cookie 小觀念

setcookie('test', 'abc');
var_dump($_COOKIE);

如果你回答的是空陣列的話,那就表示你瞭解 Cookie 的作用了。


除了這個問題之外
其實在 COOKIE 簡單的操作上
有一些問題也常常被忽視

在過去的文章中也有提到我遇到的問題
cookie 路徑問題
apache 301 Redirect 永久重新導向

例如:
  1. http://domain.com/ 
  2. http://www.domain.com/ 
  3. http://www.domain.com/dir 


這三種都是 COOKIE 有可能的儲存路徑
這常常讓 COOKIE 的存取上造成問題
上層路徑的程式無法取得下層路徑的 COOKIE
而下層路徑在 COOKIE 寫入上卻會不小心造成雙份的問題
2009-04-15 16:11

寬度(width)不要與其他屬性同時設定[CSS]

這是一個很基礎的 CSS 設計觀念,在設有寬度(width)的 Box 上,別加入 border , padding 及 margin 這三個屬性,這對於維護及變更上有相當的好處。

這下面就是全部都設在同一個 Box 上的例子,雖然所需要的語法很少,但在固定寬度的情況下,當要變更其他一個屬性時,勢必要重新設定寬度的大小,是非常不明智的作法,有嘗到苦果的朋友,想必就會瞭解。
  1. .widget{ 
  2.    width:200px; 
  3.    border:2px solid #000; 
  4.    padding:3px; 
  5.    margin:5px; 
  6. } 
  1. <div class="widget">text text</div> 


最好的方式就是將寬度的屬性獨立成單一的 Box,其他屬性則設定在內層 Box 上,雖然需要較多的語法,但在未來的修改變動上會比較直覺,除了排版上的設定,其他 Box 盡可能使用相對寬度(%)的設定,在對整體欄寬做調整時會比較快樂。
  1. .widget{ 
  2.    width:200px; 
  3. } 
  4. .widget div{ 
  5.    border:2px solid #000; 
  6.    padding:3px; 
  7.    margin:5px; 
  8. } 
  1. <div class="widget"> 
  2.    <div>text text</div> 
  3. </div> 
2009-04-14 16:48

改寫 dp.SyntaxHighlighter 中 CSS 的 Highlighter 方式

最近掙扎了很久,考慮要不要用 dp.SyntaxHighlighter 來處理 Blog 中程式碼的 Highlighter,因為之前用的 Iris Syntax Highlighter 已經收起來了,而且在文章撰寫上十分不方便也不直覺,所以花了一點心思改成 dp.SyntaxHighlighter 的模式,但 1.5.1 版還蠻陽春的,花了一點時間做語法增強及檔案瘦身,希望這個套件可以用久一點。

原本 dp.SyntaxHighlighter 中 CSS 的 Highlighter 是用 keyword 的方式去處理的,未定義的 keyword 將不會有 Highlighter,為了得到更好的效果,又必須增加更多的 keyword,實在是很不划算。

所以我改用解析 Syntax 結構的方式去處理 Highlighter 的動作,雖然還不是很完整,但整體的效果比原生好多了。

  1. /**=[ CSS ]===========================================*/ 
  2. dp.sh.Brushes.CSS = function(){ 
  3.    // 樣式定義 
  4.    this.CssClass = 'dp-css'; 
  5.    this.Style = '.dp-css .value{color:blue;}' + 
  6.                  '.dp-css .important{color:red;font-weight:bold;}'+ 
  7.                  '.dp-css .keyword{color:#7F0055;font-weight:bold;}'+ 
  8.                  '.dp-css .func{color:#F55;font-weight:normal;}'; 
  9. }; 
  10.  
  11. dp.sh.Brushes.CSS.prototype = new dp.sh.Highlighter(); 
  12. dp.sh.Brushes.CSS.Aliases   = ['css']; 
  13.  
  14. dp.sh.Brushes.CSS.prototype.ProcessRegexList = function(){ 
  15.    function push(array, value){ 
  16.        array[array.length] = value; 
  17.    } 
  18.    var match1,match2,regex1,regex2; 
  19.  
  20.    /* 加入註解解析 */ 
  21.    this.GetMatches(dp.sh.RegexLib.MultiLineCComments, 'comments'); 
  22.    /* 加入 !important 解析 */ 
  23.    this.GetMatches(new RegExp('!important', 'g'),'important'); 
  24.  
  25.    /* 解析屬性區塊 */ 
  26.    // 匹配 '{' 至 '}' 之間的文字 
  27.    regex1 = new RegExp('\{[^}]+\}', 'gm'); 
  28.    // 匹配 'xxx:xxx[;\n\(!]' 格式的文字 
  29.    regex2 = new RegExp('([:\\w-\.]+)\\s*:\\s*([^;\n\(!]+)[;\n\(!]', 'gm'); 
  30.    while((match1 = regex1.exec(this.code))){ 
  31.        while((match2 = regex2.exec(match1[0]))){ 
  32.            if(!match2[1]){continue;} 
  33.            // 匹配屬性名稱 
  34.            push(this.matches, new dp.sh.Match( 
  35.                match2[1],  
  36.                match1.index+match2.index,  
  37.                'func' 
  38.            )); 
  39.  
  40.            // 匹配屬性值 
  41.            if(match2[2]){ 
  42.                push(this.matches,new dp.sh.Match( 
  43.                    match2[2],  
  44.                    match1.index+match2.index+match2[0].indexOf(match2[2]),  
  45.                    'value' 
  46.                )); 
  47.            } 
  48.        } 
  49.    } 
  50.  
  51.    /* 解析選擇器區塊 */ 
  52.    // 匹配 'xxx[,\{\n]' 格式的文字 
  53.    regex1 = new RegExp('^([\\s\\w\.#*:+-]+)[,\{\n]', 'gm'); 
  54.    while((match1 = regex1.exec(this.code))){ 
  55.        if(!match1[1]){continue;} 
  56.        push(this.matches, new dp.sh.Match( 
  57.            match1[1],  
  58.            match1.index,  
  59.            'keyword' 
  60.        )); 
  61.    } 
  62. }; 


效果可察看之前的文章:
IE6 對 visibility 負荷過大的問題[CSS]
IE6 中的最大最小寬度和高度
CSS fixed 定位( FF / IE6 )
利用 !important 修正 IE 與 Firefox 的差異
2009-04-13 17:05

網頁常用編碼轉換 (iGoogle)小工具

將一些 JavaScript 中常用的 escape, unescapek, encodeURI, decodeURI, encodeURIComponent, decodeURIComponent 及 HTML 跳脫與反跳脫製作成小工具。
2009-04-13 15:10

IE6 對 visibility 負荷過大的問題[CSS]

IE6 在對大量元件做 visibility 顯示及隱藏
會有負荷量過大的問題出現讓整個瀏覽器變慢
解決的辦法就是用 filter 去代替相同的效果
就會得到很明顯的改善
  1. .Action{ 
  2.    visibility:hidden; 
  3.    _visibility:visible;/* for IE6 */ 
  4.    _filter:alpha(opacity=0);/* for IE6 */ 
  5. } 
  6.  
  7. .Action:hover{ 
  8.    visibility:visible; 
  9.    _filter:alpha(opacity=100);/* for IE6 */ 
  10. } 
2009-04-10 14:10

IE6 在負邊界( margin )上的異常問題[CSS]

當負邊界( margin )加上 float 屬性時 在 IE6 上會出現詭異的邏輯問題 設定的數值會乘於二 也就是 margin:-100px; 會變成 margin:-200px; 解決這個問題只好做特別做修正設定 HTML 與 CSS 設定:
  1. .widget{ 
  2.    padding-left:35px; 
  3. } 
  4. .widget .image{ 
  5.    width:30px; 
  6.    float:left; 
  7.    margin-left:-30px; 
  8.    _margin-left:-15px;/*for IE6*/ 
  9. } 
  1. <div class="widget"> 
  2.   <div class="image"><img /></div> 
  3.   <div>text text</div> 
  4. </div> 
2009-04-09 20:20

[PHP] 解析 URL 字串 parse_url , parse_str

parse_url 會解析一個標準的 URL 字串

  1. <?php 
  2. $urlStr="http://user:passwd@host:80/path?a1=v1&a2=v2#anchor"; 
  3. $url=parse_url($urlStr); 
  4. print_r($url); 
  5. /* output: 
  6. Array 
  7. ( 
  8.    [scheme] => http 
  9.    [host] => host 
  10.    [port] => 80 
  11.    [user] => user 
  12.    [pass] => passwd 
  13.    [path] => /path 
  14.    [query] => a1=v1&a2=v2 
  15.    [fragment] => anchor 
  16. ) 
  17. */ 
  18.  
  19. echo parse_url($url, PHP_URL_SCHEME); 
  20. // prints:  http 
  21.  
  22. echo parse_url($url, PHP_URL_HOST); 
  23. // prints: host 
  24.  
  25. echo parse_url($url, PHP_URL_PORT); 
  26. // prints: 80 
  27.  
  28. echo parse_url($url, PHP_URL_USER); 
  29. // prints: user 
  30.  
  31. echo parse_url($url, PHP_URL_PASS); 
  32. // prints: passwd 
  33.  
  34. echo parse_url($url, PHP_URL_PATH); 
  35. // prints: /path 
  36.  
  37. echo parse_url($url, PHP_URL_QUERY); 
  38. // prints: a1=v1&a2=v2 
  39.  
  40. echo parse_url($url, PHP_URL_FRAGMENT); 
  41. // prints: anchor 
  42.  
  43. ?> 


parse_str 會解析 URL Query 格式的字串
這裡特別注意,別使用下面的第一種方式直接解析 URL 上的 query
這會造成資安上的漏洞,這會讓外部可以直接修改裡面的變數值
  1. <?php 
  2. $url_query = "city=new+york&id=3456&paid%5Bcurrency%5D=euro&paid%5Bamount%5D=345&paid%5Breceipt%5D=fgf" 
  3. parse_str($url_query); 
  4.  
  5. echo $city; 
  6. // prints: new york 
  7.  
  8. echo $id; 
  9. // prints: 3456 
  10.  
  11. print_r($paid); 
  12. /* output: 
  13. Array 
  14. ( 
  15.    [currency] => euro 
  16.    [amount] => 345 
  17.    [receipt] => fgf 
  18. ) 
  19. */ 
  20.  
  21. /* 不建議上面的作法,因為會複寫原本的變數 
  22. * 造成資安上的漏洞 
  23. * */ 
  24.  
  25. parse_str($url_query, $query); 
  26. print_r($query); 
  27. /* output : 
  28. Array 
  29. ( 
  30.    [city] => new york 
  31.    [id] => 3456 
  32.    [paid] => Array 
  33.    ( 
  34.        [currency] => euro 
  35.        [amount] => 345 
  36.        [receipt] => fgf 
  37.    ) 
  38.  
  39. )*/ 
  40. ?> 


參考來源:
Easy way to build GET query strings in php
2009-04-08 22:05

HTML 中 Flash 遮蓋問題的解決方法

flash 在頁面中會顯示在最上層
想要用其他元素覆蓋在上面時
必須做以一下參數設定
但不管有沒有元素覆蓋
最好還是加入這個參數
避免意料之外的版面問題
  1. <object ... > 
  2.    <param name="wmode" value="transparent"/> 
  3.    <!-- ... --> 
  4.    <embed wmode="transparent" ... /> 
  5. </object> 


wmode 的參數值:
  • Window
  • Opaque
  • Transparent


參考來源:
【求助】关于下拉菜单被FLASH遮盖,怎样解决
wmode 三選一