UAODecode


0 Comments

完全是無聊而寫了這個,我自己也用不到 XD

這個 PHP Class 的功能是將 Big5 中文及 Unicode-At-On 新增字轉換為 UTF-8 或 NCR。本程式移植自 PCMan 2007 ,所以採用 GNU GPL 授權。

下載

使用方法

<?php
    // 輸出 UTF-8
    echo UAODecode::big5_to_utf8('Unicode-At-On 文字');

    // 輸出 NCR
    echo UAODecode::big5_to_ncr('Unicode-At-On 文字');
?>

hsv2rgb()


0 Comments

這個函式的用途是將以 HSV 表示的顏色轉換成 RGB 色碼,演算法來自 Wikipedia ,目前網站的隨日期變色效果就是用此 function 來達成的。

$H 的範圍為 0–360 , $S 的範圍為 0–100 , $V 的範圍為 0–100

function hsv2rgb($H, $S, $V)
{
    if ( $V == 0 )
    {
        $R = 0;
        $G = 0;
        $B = 0;
    }
    else if ( $S == 0 )
    {
        $V = $V / 100;
        $R = $V * 255;
        $G = $V * 255;
        $B = $V * 255;
    }
    else
    {
        //這一段是讓 $H 也能輸入小於 0 或大於 360 的數字,這樣用起來比較方便
        if ( $H > 360 )
        {
            $H = $H % 360;
        }
        else if ( $H < 0 )
        {
            $H = 360 + ( $H % 360 );
        }

        $S = $S / 100;
        $V = $V / 100;
        $Hf = $H / 60;
        $Hi = floor( $Hf );
        $f = $Hf - $Hi;
        $p = $V * ( 1 - $S );
        $q = $V * ( 1 - $S * $f );
        $t = $V * ( 1 - $S * ( 1 - $f ) );

        switch ( $Hi ) {
            case 0:
                $R = $V * 255;
                $G = $t * 255;
                $B = $p * 255;
                break;
            case 1:
                $R = $q * 255;
                $G = $V * 255;
                $B = $p * 255;
                break;
            case 2:
                $R = $p * 255;
                $G = $V * 255;
                $B = $t * 255;
                break;
            case 3:
                $R = $p * 255;
                $G = $q * 255;
                $B = $V * 255;
                break;
            case 4:
                $R = $t * 255;
                $G = $p * 255;
                $B = $V * 255;
                break;
            case 5:
                $R = $V * 255;
                $G = $p * 255;
                $B = $q * 255;
                break;
        }
    }

    return '#' . str_pad(dechex(round($R)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($G)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($B)), 2, "0", STR_PAD_LEFT);
}

在 Windows 安裝 File(1) command


0 Comments

因為 mime_content_type 好像有點 bug ,我花了一段時間 Google 後(雖然大多數的時間是在確認這是個 bug… orz)找到這個方法:安裝 File(1) command

  1. 這裡下載 File(1) command 的 BinariesDependencies
  2. 把 Binaries 中 /bin/ 資料夾中的東西全部放進 C:\WINDOWS\system32 (有些人的電腦可能是 C:\WINNT\system32)。
  3. 把 Dependencies 中 /bin/ 資料夾中的東西全部放進 C:\WINDOWS\system32 。
  4. 點兩下 file.exe 看看,如果提示找不到 pcre3.dll ,就把剛才從 Dependencies 解壓縮出來的 pcre.dll 改名為 pcre3.dll 。
  5. 把 Binaries 中的 /shared/ 資料夾放進 C:\WINDOWS ,連資料夾一起放。
  6. 到命令提示字元(MS-DOS)執行下面兩行:

    file -C -m C:\WINDOWS\share\file\magic
    file -C -m C:\WINDOWS\share\file\magic.mime

  7. 這樣就裝完了,你可以用 file -biN [filename] 測試看看,如果成功的話將會傳回該檔案的 MIME-TYPE 。

裝在上述路徑是因為那是系統預設的 PATH 。如果自己去加入新的 PATH ,裝在別的地方也是可以,第 7 步驟會成功,但接下來要從 PHP 呼叫時就會失敗了,可能有其他地方可以設定,但我懶得研究 XD

接下來 PHP 的部份就簡單了:

function get_mimetype($f) {
    return exec(trim('file -biN '.escapeshellarg($f)));
}

使用方法以下幾種都可以:

echo get_mimetype('example.rar');
echo get_mimetype('C:\www\example.rar');
echo get_mimetype('C:/www/example.rar');

$ezSQL->escape()


0 Comments

ezSQL 是一個非常容易使用的 Database Abstraction Layer , WordPress 的 wpdb 也是用這個改寫而成。最近寫了一個教學用的留言板程式,因為程式本身太簡單,於是順便學習怎麼處理 SQL Injection,才發現它的 escape 是有點問題的,我改寫成下面這樣:

function escape($str) {
    if (!get_magic_quotes_gpc()) {
        return mysql_real_escape_string($str);
        //return addcslashes(mysql_real_escape_string($str), "%_"); //當有LIKE-SEARCH時用這個
    } else {
        return $str;
    }
}

原本的 escape 在沒有開啟 magic quotes 的情況下,將會移除所有的反斜線。

關於上面提到的簡單留言板,如果還有什麼安全漏洞,我還滿想知道的,發現的話請告訴我 XD 原始碼可以在此取得。我本來是想說以 Public Domain 釋出,還可以讓人拿去交作業,不過沒辦法,我用了一個 GPL 、和一個 LGPL 的 Library ,所以就只能以 GPL 釋出了 XD

Update:目前已經知道有 XSS 漏洞,不過懶得修 :p 已知的兩個修掉了,不過我不能肯定還有沒有就是了…

剛才看到 Jeremy Zawodny 的 Database Abstraction Layers Must Die!,他嚴厲的反對 Database Abstraction Layer 和 Template Engine ,我是覺得沒這麼嚴重… 轉移資料庫的痛苦的確大多是在架構環境及轉移資料(當資料龐大時)而不是改寫程式,不過有沒有使用 DAL 都會有這些痛苦,那麼還不如讓寫程式輕鬆一點,我向來都老實承認我用 Database Abstraction Layer 是因為懶惰 XD 至於執行效率方面… 那不是人類能感覺得到的差異… 這麼計較的話,何不連 Compiler 都捨棄?

 1