Tuesday, August 31, 2010

Sorting algorithm - Quicksort

Quicksort堪稱最知名實用性又高的排序演算法,操作方式稍微比較複雜一點:先從數列中隨機選取一個基準值(pivot),通常會直接選用數列最末值,或是隨機選取後再將pivot放在數列最末端,接著由左至右和pivot作比較,凡是比pivot小的值就依序放在左側,直到做完一輪就可將數列區分為{<pivot, pivot, >pivot},即決定了pivot所在的最終位置,然後再按照此方式繼續處理被分割的小區塊直到結束。此演算法又被稱之為partition-exchange sort。

Quicksort algorithm

由於其分割簡化數列長度的概念降低了系統運行的複雜度,因此可用更有效率的方式完成排序,是較為實用的選擇,底下這段影片也許就是最好的證明。

<Complexity performance>
  • Worst case: O(n2) 
  • Best case: O(n*logn) 
  • Average case: O(n*logn)


影片的最後有一段Bubble sort與Quicksort間的競賽,好奇誰會獲勝嗎?


<參考資料來源>
Wikipedia - Quicksort

Monday, August 30, 2010

Sorting algorithm - Insertion sort

介紹另一種和Bubble sort複雜度一樣,但實行上較有效率的一套排序演算法,稱為Insertion sort,如其名,它的排序概念是將陣列中每個元件按照大小依序放入已排序的陣列中,不斷執行後就可完成整個數列的排序,是一般人玩撲克牌「大老二」或「接龍」等遊戲時常用的排序法。

Insertion sort algorithm

<Complexity performance>
  • Worst case: O(n2)
  • Best case: O(n)
  • Average case: O(n2)


<參考資料來源>
Wikipedia - Insertion sort

Sorting algorithm - Bubble sort

Bubble sort是最簡單好懂的排序方式,雖然頂多被拿來當範例教學而非實用,但對於新手入門瞭解排序演算法是個不錯的開始,排序的觀念很簡單,就是「兩相比較,前者大於後者時互換位置」(以排序成遞增為例)。

Bubble sort algorithm

圖解是很好的說明方式,因為由左而右兩相比較的關係,每做完一次循環,都可以將未排序數列中的最大值移到最右側,但是相對較小值則只會往左一格,造成如圖中「龜兔賽跑」的情形,這就是為什麼Bubble sort利於理解卻不夠有效率的原因。

<Complexity performance>
  • Worst case: O(n2)
  • Best case: O(n)
  • Average case: O(n2)


<參考資料來源>
Wikipedia - Bubble sort

Sunday, August 29, 2010

PHPMailer - Send e-mail using Gmail SMTP server from PHP

PHP需透過SMTP(Simple Mail Transfer Protocol)外寄伺服器發送郵件,為了避免本地端的SMTP server被擋信,於是乎我很自然地想到利用Gmail的SMTP server來完成此任務。然而我沒有找到直接修改"php.ini"檔的好辦法,卻發現了這款程式:

解壓縮後在"\PHPMailer\docs\use_gmail.txt"可找到這份範例程式碼,有幾個地方需要注意:
  • Gmail SMTP server相關設定如下,請修改使用者名稱與密碼:
<?php
require("PHPMailer/class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = "ssl";
$mail->Host = "smtp.gmail.com";
$mail->Port = 465;
$mail->Username = "Username@gmail.com";
$mail->Password = "Password";

    • 其餘郵件相關的設定比較簡單易懂:
    $mail->From = $Sender_email;
    $mail->FromName = $Sender_name;
    $mail->AddAddress($Receiver_email,$Receiver_name);
    $mail->AddReplyTo($Sender_email,$Sender_name);
    $mail->Subject = "My Subject";
    $mail->Body = "HTML Body";
    
      • 最後確認以HTML發送即可:
      $mail->IsHTML(true);
      if(!$mail->Send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
      } else {
        echo "Message has been sent!";
      ?>
      

        有了此範例就可以輕鬆做出客服留言頁面,只要把表單中的資料取出傳送即可。或者也可以參考PHPMailer-FE這款程式製作。值得一提的是,上述操作使用英文介面沒有問題,但遇到中文寄件者或是主旨時就會變成亂碼無法判讀,解決辦法其實也很簡單,只要補上一行程式碼,將編碼方式設定為UTF-8即可。
        $mail->CharSet = "UTF-8";
        


        <參考資料來源>
        TECH MEAL - [GMAIL] - [PHP] - Send email using PHP with Gmail
        梅問題教學網 - PHP教學-利用Gmail的SMTP製作線上客服系統
        我的網頁設計 - 實作PHPMailer郵件函式庫
        Stack Overflow - Send email using GMail SMTP server from PHP page

        phpMyAdmin - (Cannot start session without errors...)

        安裝完PHP,MySQL以及phpMyAdmin後,輸入正確的帳號密碼卻無法登入phpMyAdmin嗎?

        顯示的錯誤訊息為:"Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly",使用不同的瀏覽器試試看,我之前遇到問題時用Chrome會一直跳回登入頁面,用IE則會出現錯誤訊息。

        解決辦法為更改PHP之配置設定檔"php.ini",修改前請先停止Apache伺服器的運作,
        1. 找到並修改:"session.auto_start = 1"
        2. 若安裝路徑為"C:\PHP",新增資料夾"C:\PHP\tmp"
        3. 修改設定路徑為:session.save_path="C:\PHP\tmp"
        4. 重新啟動伺服器即可正常登入
        session.auto_start = 1
        session.save_path = "C:\PHP\tmp"
        

        WAMP Server Setup

        這裡將會整理一些架設網站相關的訊息,執行環境為WAMP(Windows+Apache+MySQL+PHP),Apache為網站伺服器軟體,PHP(Hypertext Preprocessor)為伺服器端網頁程式語言,與資料庫系統MySQL一併使用可方便地建立起互動式網站環境。

        目前我安裝的版本是:

        MySQL資料庫的操作原本需要透過命令提示字元下指令管理,因此有人貼心地使用PHP開發了一套Web介面的MySQL資料庫管理程式,也就是phpMyAdmin,讓使用者可以更直覺地管理資料庫的內容。

        有了這些軟體,就能朝架設出功能齊全的動態網站繼續邁進啦。