Category: Programming

  • File type validation with Javascript

    前些時候寫的簡單版測試程式,在表單送出前用 JavaScript 檢查檔案副檔名。當然這只是第一步驗證,在 PHP 端還是要對 Content Type 做一次檢查。 <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> <title>File Type Validation in JavaScript. ver 0.1</title> </head> <body> <form method=”post” enctype=”multipart/form-data” onsubmit=”return checkAllFile();”;> <input class=”file-selector” type=”file” name=”userfile1″ size=”20″/></br> <input class=”file-selector” type=”file” name=”userfile2″ size=”20″/></br> <input class=”file-selector” type=”file” name=”userfile3″ size=”20″/></br> <input class=”file-selector” type=”file” name=”userfile4″ size=”20″/></br> <input class=”file-selector” type=”file” name=”userfile5″ size=”20″/></br> <input…

  • Sharpen an image using PHP and GD

    同事正在開發一個購物平台,店家可以上傳商品照片,由系統自動縮圖到適合版面的大小,不過 resize 後圖片品質明顯下降,於是同事問我有沒有解法。同事問我並不是因為我比較強,只是因為我的位子在他旁邊。 跟同事討論了一下,試用了 imagecopyresized 和 imagecopyresampled 兩個函式來縮圖,前者的細節比較好,但部份線條出現明顯的變形,後者圖形正確,但看起來比較模糊。所以先用後者縮圖,再想辦法銳化圖片。 印象中 PHP GD Library 並沒有直接提供 sharpen (銳化) 相關的函式,但是 Google 一下,發現有 imageconvolution 濾鏡可以用,真是有趣,沒想到可以自訂濾鏡,以前在學校修過影像處理課程的回憶…. 都忘光光了。還好不難找到幾組範例。 <?php // create the image resource from a file $i = imagecreatefromjpeg(‘otter.jpg’); // define the sharpen matrix $sharpen = array( array(0.0, -1.0, 0.0), array(-1.0, 5.0, -1.0), array(0.0, -1.0, 0.0) ); // calculate the sharpen…

  • CodeIgniter: How to get current page with pagination library

    CodeIgniter 內建了一套功能完整的分頁函式庫,不過有時候需要知道現在是第幾頁時,卻不知道從何取得。 雖然在文件上沒有寫,不過實際上有個內部變數在紀錄目前的頁數,只要使用 $this->pagination->cur_page 就能取得目前的頁數。 <?php echo ‘您正在閱讀第  ‘.$this->pagination->cur_page.’ 頁,共 ‘.ceil(($this->pagination->total_rows/$this->pagination->per_page)). ‘ 頁。’; ?>

  • Regular expression which matches a pattern, or is an empty string

    之前介紹過在 jQuery Validation Plugin 使用正規表達式 (Regular Expression) 的方法。 在某個專案中如常地用這個方法做表單欄位檢查,不過客戶提了一個需求,希望該欄位不是必填,但使用者有填資料時要驗證其內容。 原本的驗證條件是這樣的… regex : “[0-9]{4}-[0-9]{6}” 也就是使用者一定要輸入正確的手機號碼,如 0919-123456。要變成選填的話… 想了一下,改成下面這樣就可以了。 regex : “([0-9]{4}-[0-9]{6})?” 前後加上括號,然後用最未端的 問號 來表示 前面這串括號裡的文字可以不出現或出現一次。

  • 傳說中的 JavaScript parseInt('08')

    跟大部份的公司一樣,我服務的公司上下班也要打卡,但是身為軟體與網路服務公司,上下班時間是相對自由的,打卡只是計算週工時的依據,沒有遲到早退的罰則,每個月上交卡片的時候要先把週工時算好再給老闆過目。身為懶惰的工程師,自己寫了一個週工時計算程式也是理所當然的。(笑)

  • Bookmark: Google HTML/CSS Style Guide

    這是 Google 的 HTML / CSS 編寫指南,用以解決大型專案或多人開發情境下程式碼風格混亂的現象。內容淺顯易懂,部份寫法是針對 HTML5 最佳化。   updated on 2017/02/03 : 原連結已失效,更新為 https://google.github.io/styleguide/htmlcssguide.xml Google HTML/CSS Style Guide  

  • Bookmark: Learning Object-C by Cocoa Dev Central

    學習 Apple APP 開發會經歷好幾個階段,像是如何使用 XCode 開發工具,如何撰寫 Object-C,以及如何使用 Cocoa。在學習 Object-C 的過程中逛到這個專門提供 iOS 程式開發教學的網站 Cocoa Dev Central,文章簡單易懂,排版也非常容易閱讀。其中關於 Object-C 的章節是我最近在閱讀的。 http://cocoadevcentral.com/d/learn_objectivec/

  • PHP: Constrains a value to not exceed a maximum and minimum value

    幾年前在寫 Processing (P55) 的時候,有個方便的 function 叫 constrain。用法是 constrain(value, min, max) 例如 float mx = constrain(mouseX, 30, 70); 當 mouseX 大於 70 時就回傳 70,小於 30 時就回傳 30,將值限制在 30 ~ 70 這個區間。因為 Processing 大都是拿來寫互動、視覺方面的程式,所以用到此功能的頻率頗高。後來轉換跑道寫其他語言時,發現好像都沒有這個方便的函式。 最近又有 constrain 的需求,想起幾年前見過有人用 min, max 來代替,寫法如下。 <?php function constrain($value, $min, $max){ return max( min( $value, $max), $min); } echo constrain(29.3, 30, 60); ?>

  • Bookmark: PHP Markdown

    Bookmark: PHP Markdown

    PHP Markdown 是一款以 PHP 為基礎的 Markdown 語言轉換器。Markdown 是一種輕量級的標記語言,透過簡單易懂的語法來編寫文件,主要用於技術性文件,Markdown 轉換有多種語言的實作,這款便是以 PHP 來做轉換。 http://michelf.com/projects/php-markdown/ 這個套件分為標準和 Extra 版,後者多了更多功能。不過就實務上來說,筆者還在尋找 JavaScript 版本的 Markdown Engine,這樣才能做到所見所得的即時轉換。

  • Bookmark: Pixastic, a JavaScript Image Processing Library

    Pixastic 是一款 JavaScript 影像處理函式庫,藉由 HTML5 對 Canvas 的像素操作能力來達到影像處理的機制。相當適合拿來做轉場特效,例如這個 HTML5 Canvas Slideshow 範例。 http://www.pixastic.com/lib/

  • Bookmark: PHP QR Code

    用 PHP GD2 產生 QR Code 的 Library,簡單易用,有多種參數可以設置。採用 LGPL 授權,使用上也比較有彈性。 http://phpqrcode.sourceforge.net/

  • Bookmark: Google QR Code Tool

    在搜尋 QR Code 資料時看到的,簡單易用的 QR Code 產生工具。 http://code.google.com/apis/chart/infographics/docs/qr_codes.html

  • PHP: Reading $_GET variable

    在 PHP 環境下要取得 GET 變數的內容只要用 $_GET 就可以取得,不過在 CodeIgniter Framework 或其他特殊環境下,$_GET 預設是被關掉的時候,想要正常使用 GET (如 AJAX) 時就得費一點點工夫了。 <?php $url_segs = parse_url($_SERVER[‘REQUEST_URI’]); parse_str($url_segs[‘query’], $_GET); // urldecode automatically print_r($_GET); // 印出 $_GET 內容 ?> 完工,就醬。  updated Feb 1, 2012 後來才注意到 CI 的 config.php 大約在 157 行的地方有一行設定 $config[‘allow_get_array’]        = TRUE; 預設打開了 $_GET,不需要用上述的方法,改用 $this->input->get() 即可取得 $_GET 內容。

  • PHP: Fibonacci Sequence

    Finbonacci Sequence (費氏數列、費伯納數列) 對於寫程式的人來說應該不陌生。數學上的費氏數列是以遞迴方式定義的,如下 F0 = 0, F1 = 1 時,Fn = Fn-1 + Fn-2 用文字來說,就是費氏數列由 0 和 1 開始,之後的費氏數列就由之前的兩數相加。前幾個數字是 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377….. 用遞迴方式的標準寫法是…

  • PHP: Using explode() with seperator "\n"

    有個以 PHP 開發的案子在測試階段回報有 bug,雖然兇手不是我,但還是去了解一下。原來的程式是讓使用者輸入多個 Youtube 影片網址,然後由程式取出每一支影片的 uid,封裝成陣列後回傳。之後的程式會取出 uid,然後在網站上 show 出 Youtube 影片。不過當使用者輸出多支影片的網址後,只有最後一支影片會出現,前面的都錯誤了。 原程式是這樣寫的… <?php //使用者輸入的影片網址. http://後面空一格是避免Wordpress把影片顯示出來 $youtube = <<<EOF http:// www.youtube.com/watch?v=SAIEamakLoY http:// www.youtube.com/watch?v=MhVp9gcxLJY http:// www.youtube.com/watch?v=OxzucwjFEEs EOF; function get_youtube_hash($youtube){ $hash = array(); $youtube = explode(“\n”, $youtube); foreach($youtube as $y){ $youtube_qs = parse_url($y, PHP_URL_QUERY); $youtube_qv = explode(‘&’, $youtube_qs); foreach($youtube_qv as $key => $value){ list($k, $v) = explode(‘=’,…

  • jQuery: Check if Element is Visible or Hidden

    用 jQuery 編寫網頁效果時經常需要檢查網頁元素 (element) 的狀態,像是可見 ( visible ) 或是隱藏 ( hidden )。 常見的寫法是 if( $(element).css(‘display’) == ‘block’ ) 或是  if( $(element).css(‘display’) == ‘hidden’ ) 不過我一直覺得這兩種寫法很累贅,又萬一元素的顯示狀態不是 block,而是 inline-block 或是別的呢?在翻閱 jQuery 文件時想到一個更便捷的用法,用 is 來檢查元素狀態即可。 $(element).is(“:visible”) 回傳值是 true or false,更方便。 if( $(‘#foo’).is(‘:visible’) ) { // it’s not hidden, do something } else { // it’s hidden so do…

  • How to Convert String to Slug

    在這個 SEO 當道的年代,簡單易懂的現代網址已經是基本常識了。根據 W3C 的網址規定,合法字元僅有 A – Z, a – z, 0 – 9, -, ., _, ~, :, /, ?, #, [, ], @, !, $, &, ‘, (, ), *, +, ,, ;  = ,而且橫線 ( – ) 之後都是有特別意義的保留字,所以過去常看到亂七八糟的亂碼網址,像是本文的標題不處理的話就變…. How%20to%40%20Convert%20String%20to%20Slug 雖然對電腦來說沒什麼差別,但是對人類來說卻是難以理解、難以記憶的無意義片段。

  • CSS: How To Use @font-face

    過去在開發網站時,字體的選擇一直都很保守,因為每個瀏覽器與作業系統對字型的支援很有限,幾乎就那幾種安全字型可以用。不過自從 CSS 多了 @font-face 這個指令後,事情開始有了些微的變化。@font-face 允許設計師在 CSS 指定特殊別的字型,瀏覽器會根據設定去下載這個字型來顯示,就像 background-image: url(‘link/to/image’); 一樣,瀏覽器會下載背景圖來顯示。

  • Email Address Validation Using Regular Expression

    寫驗證規則最常碰到的就是 email 檢查,每次寫 Regular Expression 都要重新思考一下規則,覺得這樣太浪費時間了,直接寫個筆記給未來的自己複製貼上。 <?php // 隨便寫幾個 email 來驗證規則 $mails = “someone@gmail.com, _apple@apple.com, ex@ex, some-body@gmail.com, NEXTstep@pchome.com.tw, test@nf.NL”; $mails = str_replace(‘ ‘, ”, strtolower($mails)); // 轉成小寫並去除空白字元 $mails = explode(“,”,$mails); // 依逗號切斷,並存入陣列 $valid_mails = array(); foreach($mails as $mail){ if(preg_match(“/^[a-z]+[\w\d\.\-_]*@[\w\d-]+\.[\w\.]+[a-z]$/”, $mail)){ array_push($valid_mails, $mail); // 可以直接塞進 PHPMailer,省去 $valid_mails 變數 $phpmailer->mail->AddBCC($mail, ”); } } print_r($valid_mails); ?> 輸出結果如下,不合法的 email…

  • Configuring the PHP Environment With php.ini in Bluehost

    Bluehost 允許網站管理者修改 php.ini,這是相當方便的功能。我開發了一個簡單的圖片空間網站 pic.qoding.us,在上傳檔案和處理縮圖上碰到了記憶體不足的問題,這時候就要靠修改 php.ini 來解決。