歡迎來到小豬圈!

2008-10-31

修改 Blogger Layout 筆記

  • 要下載回來編輯的話,最好用像 Notepad++ 這種有收合語法功能的編輯器。
  • 基本上就是 XHTML ,再加上 Google 另外定義的 Namespace "http://www.google.com/2005/gml/" (GML?)。
  • 主要的標籤有:(參見 Widget Tags for Layouts)
    • <b:skin> 除多了變數功能外,幾乎同等於 <style> 。
    • <b:section> 分區用。
    • <b:widget>
    • <b:includable> 、 <b:include>
    • <b:if> 、 <b:loop>
  • 其中 <b:section> 的子系只允許是 <b:widget> ,而 <b:widget> 的子系只允許是 <b:includable> 。
  • 預先定義的 <b:section> 有 header 、 main 、 sidebar 、 footer 四個區塊。
  • <b:widget> 要有一個 id 是 main 的 <b:includable> ,若是其它的 id 的話則預設是不會顯示的( header 似乎是例外),但可以用 <b:include> 加入其中。
  • 有些 data 項目沒有在 Layouts Data Tags 列出。
    • navMessage :用來顯示 Showing posts with label PHP. Show all posts 之類的訊息。
    • adStart :插廣告用的?
  1. Scribe's N.E.W. Studio://Blogger: 比程式語言還難的 Blogger Layout GML

2008-10-29

Zend_Log 與 FireBug+FirePHP

  • 一個 Zend_Log 可以註冊好幾個 Zend_Log_Writer ,意即一個訊息可以送多個地方記錄。
  • Zend_Log 將訊息透過 HTTP Header (Zend_Wildfire) 傳到 Firebug + FirePHP 的 Console 畫面上,記得要啟用 Firebug 的 Console 和 Net 介面。
  • 另一個和 FireBug 相關的元件是 Zend_Db_Profiler_Firebug ,利用一樣的原理將對資料庫的查詢資訊,傳到 FireBug 上。
  1. Firebug - Web Development Evolved
  2. FirePHP - Firebug Extension for AJAX Development

Zend_Translate 與 Poedit

  • 在用 Zend_Translate 和 Poedit (1.4.2) 時遇到一個問題,就是 xgettext 不吃 *.phtml 而把它當成 C 來處理,解決方法如下:(參見:using poEdit - Zend Framework Forum)

  • 圖為 Poedit 的 File » Preferences » Parsers » PHP » Edit 截圖。
  • 在 extension 增加 *.phtml ,注意分號後面不能有空格。
  • 在 parser command 後加上 -L php 即可,如:xgettext --force-po -o %o %C %K %F -L php
  • 在 Poedit 的 Catalog » Setting » Keywords 增加 translate 一項。
  • 在 Zend_View_Helper_Translate 裡沒有對應 Zend_Translate_Adapter::_ (底線,就如同 gettext 的底線函式) 這個用來省幾個字的方法。
  • 真的要用底線也是有啦,只是省不到字就是了:
    
    <?php
    
    echo $this->translate('something');
    echo 
    $this->translate()->_('something');
    ?>
  • 做為 message id 的字串要應該考慮大小寫及前後空格與符號等,就想原文是如何就是了。

2008-10-28

Zend Framework Components 分類

  • core
    • Zend_Loader 「載入元件」的元件,提供個別載入或 autoload 的方法。
    • Zend_Version
  • 使用者認證/授權
    • Zend_Acl
    • Zend_Auth
    • Zend_Captcha
    • Zend_InfoCard
    • Zend_Ldap
    • Zend_OpenId
    • Zend_Service_ReCaptcha
  • 儲存/快取/暫存資料
    • Zend_Cache
    • Zend_Config
    • Zend_Db
    • Zend_Memory
    • Zend_Registry
    • Zend_Session
  • 跟 MVC 有關的
    • Zend_Controller
    • Zend_Layout
    • Zend_Paginator
    • Zend_View
  • i18n
    • Zend_Currency
    • Zend_Date
    • Zend_Locale
    • Zend_Measure
    • Zend_Translate
  • debug
    • Zend_Debug
    • Zend_Exception
    • Zend_Log
    • Zend_Test
  • XML Manipulation
    • Zend_Dom
    • Zend_Feed
  • 處理表單及使用者輸入資料
    • Zend_File
    • Zend_Filter
    • Zend_Filter_Input
    • Zend_Form
    • Zend_Validate
  • 網路服務
    • Zend_Gdata
    • Zend_Service_Akismet
    • Zend_Service_Amazon
    • Zend_Service_Audioscrobbler
    • Zend_Service_Delicious
    • Zend_Service_Flickr
    • Zend_Service_Nirvanix
    • Zend_Service_Simpy
    • Zend_Service_SlideShare
    • Zend_Service_StrikeIron
    • Zend_Service_Technorati
    • Zend_Service_Yahoo
  • 跟寄 E-Mail 有關的
    • Zend_Mail
    • Zend_Mime
  • Web Services
    • Zend_Soap
    • Zend_XmlRpc
    • Zend_Console_Getopt
    • Zend_Dojo
    • Zend_Http
    • Zend_Json
    • Zend_Pdf
    • Zend_Rest
    • Zend_Search_Lucene
    • Zend_Server_Reflection
    • Zend_Text
    • Zend_Timesync
    • Zend_Uri
    • Zend_Wildfire

關於 PHP 的 closing tag

  • PHP 的 closing tag (即“?>”)是可以省略的,雖然有寫在 PHP: Instruction separation - Manual 這一篇的 Note 裡,但我一直到最近才知道。
  • 省略 closing tag 可以在 include 文件時,避免因文未多餘的字元而無法送出 header 的情況。

2008-10-26

戰爭機器二

  • 連著兩天玩了共約十一個小時,爽!劇情還滿充實的,不會有一下就結束的感覺。現在就等第三集了。
  • 只有在殺人冰雹和大嘴魚那裡卡了幾次。殺人冰雹那會有幾條「看起來」好像可以過的路,實際上卻只有眼前最短的路才是對的。而大嘴魚那裡則是不要害怕,往嘴裡衝就是了。
  • 持久戰模式我們只能撐到第八波而已…被巴假的啊。(淚)
  • 你說這個時候還遊戲都還沒上市?就當我是在做夢吧。
  • 戰爭機器 2》遊戲搶先偷跑?數十張遊戲內容實際圖片! - SOC 電子競技職業聯盟

2008-10-21

詭異的 Zend_Mail

  • 目前測試成果之一,是可以用 Gmail SMTP 寄信。
  • 中文(正確來說是需要編碼的非 ASCII 字元)無法正常顯示。除了太長以外,還有中文字被截開的問題。得改寫 Zend_Mail::_encodeHeader 、 Zend_Mime::encodeQuotedPrintable 。我改寫的版本在 Gmail 測試成功,不過寫太醜了就不放上來了。
  • 後來查了一下才知道,原來這問題之前就有了… Zend_Mail中文標題亂碼問題 - IT邦幫忙::IT知識分享社群。我現在用的是 1.6.1 版,依然有這個問題。
  • Subject header 的格式範例:
    Subject: =?UTF-8?Q?=11=22=33=44=55=66=77=88=99=AA=BB=CC=DD=EE=FF?=
     =?UTF-8?Q?=11=22=33=44=55=66=77=88=99=AA=BB=CC=DD=EE=FF?=
    (超過 78 個字元“應該”換行)
  • 若只送出 BodyText 或 BodyHtml 其中一種,則不會送出 Content-Type 和 Content-Transfer-Encoding 的 header 。
  • 文件第 29.5. HTML E-Mail 一節提到:同時送出 BodyText 跟 BodyHtml 會自動換成 multipart/alternative 並沒有發生。解決標題問題後,這功能也恢愎正常。
  • Zend_Mail::_storeHeader 裡有一行奇怪的 comment : // ?? $value = strtr($value,"\r\n\t",'???');

2008-10-17

再加上 PostgreSQL

  • 裝完 PostgreSQL 後,重新啟動 Apache 時,出現了無法載入 php_pgsql.dll 、 php_pdo_pgsql.dll 的錯誤訊息(執行環境 Windows XP SP3 / Apache 2.2.8 / PHP 5.2.6 / PostgreSQL 8.3.4)。在 PATH 中加入 PostgreSQL\8.3\bin 路徑後重開機即可。
  • 管理工具 phpPgAdmin
  • 在 PostgreSQL 裡要達成 AUTO INCREMENT 的功能,要另外 CREATE SEQUENCE 或指定欄位資料型態為 SERIAL (意思是一樣的,不過改由 PostgreSQL 代勞)。

SQLite

  • 為了測試 PDO 的通用性,以及尋找 MySQL 的替代品,選了 SQLite 試用中(下一個候選是 PostgreSQL)。
  • 和 Microsoft Access 一樣無需架設伺服器,檔案式的資料庫。
  • SQLite 是無資料類型“ Typeless ”這點還滿特別的,你依然可以宣告資料類型,但資料庫內部都當成 ASCII 文字處理, SQLite 3 再從 TEXT 分出 INTEGER 、 REAL 和 BLOB 。參見: Datatypes In SQLite / Datatypes In SQLite Version 3
  • 一個 SQLite 管理工具 SQLite Manager :: Firefox Add-ons
  • 從 MySQL 換過來第一個遇到問題的是 CREATE TABLE 語法,主鍵固定是用“ INTEGER PRIMARY KEY AUTOINCREMENT ”。

2008-10-15

離家兩萬釐 紅單一張

  • 下午出門買貓糧時,離在家最近的紅綠燈被抓了一張闖紅燈。感謝 2127、2134 兩位警官為國庫增加新臺幣壹千捌百元整的收入。

2008-10-13

Apache 子網域對應

  • 以下是使用 Apache HTTP Server 的 mod_vhost_alias 模組。
  • 假設擁有的網域和 IP 是: example.com 與 256.256.256.256 。
  • 在 DNS 新增一筆泛解“*”: * IN A 256.256.256.256
  • 泛解“*”是標準語法,而且不會覆蓋已設定的域名。參見 Wildcard DNS record - Wikipedia, the free encyclopedia
  • 意思是指 example.com 的子網域 (像 www.example.com 或 ftp.example.com 之類的) 全部對應到 256.256.256.256 。
  • 在 Apache httpd.conf 加入:
    LoadModule vhost_alias_module modules/mod_vhost_alias.so
    UseCanonicalName Off
    VirtualDocumentRoot "C:/web/%-1/%-2/%-3"
    
  • 上述設定會使 www.example.com 對應到 C:/web/com/example/www ,或 abc.example.com 對應到 C:/web/com/example/abc …之類的效果,這樣新增子網域只要增加子目錄即可,不需重開 Server。
  • Apache 還有其它對應網域/網址的方法。參見 Mapping URLs to Filesystem Locations - Apache HTTP Server

2008-10-10

申請 Yahoo BBAuth 的 App ID 遇到的問題

  • 申請步驟一直到 Check Domain 都沒有問題,但按下 Check Domain 後卻導向 Yahoo 登入頁面,登入後又被導到“申請 App ID ”的頁面,然後就鬼打牆一直重覆申請、 Check Domain 、登入的動作,試了兩天都一樣。
  • 另外,今天想試用 Yahoo OpenID 時,也傳回錯誤訊息。
  • 兩個事件的相同之處,只有從英文網站導回中文的登入頁面,所以我試著在主站(www.yahoo.com)新申請一個帳號,然後…就都申請成功了。
  • \(囧)/
  1. Yahoo! OpenID (beta)
  2. Browser-Based Authentication (BBAuth) - YDN

2008-10-08

OAuth

  • OAuth 是一個關於提供第三方“授權”(authorization)的開放協定,參見:OAuth Core 1.0 Spec函式庫
  • 對於一般使用者而言,可以使用已經擁有的帳號(及其服務)。
  • 對於開發者而言,可以有開放、統一的授權協定,整合網路服務。但因為授權後取得的是一組代號(Access token)而不是帳號,所以有識別使用者的問題,見:Racklin's 阿土伯程式大觀園: 另人遺憾的 Google AuthSub API 有感
  • Google Account Authentication API 已經可以使用了 OAuth,原有的 AuthSub 改為輔助,只是在 PHP 上還沒跟 Zend Framework GData 銜接上。
  • Yahoo OAuth 目前還在 preview 的階段。
  • 以下是一些 OAuth 名詞定義:
  • User:即一般使用者。
  • Consumer:第三方應用服務。
  • Service Provider:服務供應者,像 Google 和 Yahoo 之類。
  • Consumer Key/Secret:Service Provider 提供給 Consumer 做為簽證使用。
  • Request Token:向 Service Provider 請求認證 Consumer 和向使用者要求授權的一組代號。
  • Access Token:經過認證授權後,實際用來存取 Service Provider 服務的一組代號。

2008-10-07

關於密碼儲存

  • 使用者傳來的密碼絕不可以直接(以明文)儲存!避免有心人士取得密碼表後直接利用。
  • 一個常見的做法是利用雜湊(Hash)函數,將密碼編碼後儲存。
  • 例: mypassword 這段字用 md5() 編碼的結果是 34819d7beeabb9260a5c854bc85b3e44 。
    
    <?php
    
    // Outputs: 34819d7beeabb9260a5c854bc85b3e44 
    echo md5('mypassword');
    ?>
  • 但是,這樣我就知道 34819d7beeabb9260a5c854bc85b3e44 就是 mypassword 用 md5() 計算的雜湊值啦!
  • 所以有心人士可以事先將所有可能用來當密碼的字串,用 md5() 或其它雜湊函數先行編碼、記錄下來(就是所謂的 Rainbow Tables),取得密碼表後,只要一比對就可以知道密碼。
  • 一個應對的方法就是加鹽(salt, see:Rainbow table - Wikipedia, the free encyclopedia),意思是將密碼加上一段字串後,再計算雜湊值。
  • 例:
    
    <?php
    
    // Outputs: f5c8bdfe11ef33040331747636877629 
    echo md5('salt' 'mypassword');
    ?>
  • 加了 salt 後,即使有心人士比對出原文,也不能直接拿來使用,還得找出 salt 才行。可針對使用 Rainbow Tables 的情況,加長 salt 的長度或使用特殊字元(鍵盤上無法直接打出來的),增加被找到的難度與所需時間。
  • 在擁有大量密碼情況下,常有重覆的雜湊值出現的情況,除了碰撞外,有可能是不同的使用者使用了相同的密碼,或是像 123456 之類的隨意輸入的密碼,有心人士可能會刻意針對這些值(使用者)。
  • 這時可以利用隨機函數產生 salt ,這樣即使用同樣的密碼,每次計算出來的雜湊值都不一樣。
    
    <?php
    
      $salt 
    md5(mt_rand());
      echo 
    $salt md5($salt 'password');
    ?>
  • 以下為簡單的範例:
  • 
    <?php
    
    function hash_pwd($pwd$salt false){
      if (!
    $salt) {
        
    $salt md5(mt_rand());
      }
      return 
    $salt md5($salt $pwd);
    }

    function 
    compare_pwd($pwd$pwd_hashed){
      
    $salt substr$pwd_hashed032 );
      return 
    $pwd_hashed === hash_pwd($pwd$salt);
    }

    $user_pwd 'password';
    $user_pwd_hashed hash_pwd($user_pwd);

    var_dump$user_pwd_hashed );
    var_dump(compare_pwd($user_pwd$user_pwd_hashed));
    ?>
  • 若使用 PHP 5.1.2 以上版本,建議改用內建的 hash() 函數,並換成其它較複雜的雜湊演算法,如 WHIRLPOOL。
  • 對一般使用網站服務的使用者,要知道網站有沒有用雜湊函數之類的方法儲存你的密碼,只要使用網站提供的“忘記密碼”的服務,一般來說,網站會自動重設一組隨機密碼讓你使用,但若是網站會傳回你原本的密碼的話…。
  • 在每個網站服務最好都使用不同的帳號、密碼,避免在某個網站被破,其它服務也遭殃。例如在某網站註冊時填的帳號、密碼和 E-mail,“剛好”都跟該 E-mail 用的一樣…。
  1. Rainbow Hash Table 與密碼破解 | 資安之眼
  2. Blog.XDite.net » 淺談 BBS 資料的安全性

2008-10-05

YUI 非同步的傳案上傳

  • 使用 YUI Connection Manager 實作。
  • 觸發事件不用 button.onClick 而用 form.onSubmit,其中一個考量是避免遺漏使用者以「按下 Enter 」的方式送出表單。
  • 在關閉 Javascript 的情況下,也能一般的方式送出表單內容。
  • 同時使用 POST 與 GET (自行在 URL 後附加參數),來判斷資料是由 AJAX 還是一般方式送出(瀏覽器有無支援 Javascript)。前者可以送出 JSON 編碼的資料方便用 Javascript 處理,而後者就出一般的網頁。
  • async_file_upload.htm
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta http-equiv="Content-Language" content="zh-TW">
        <title>Asynchronous File Upload With YUI 非同步檔案上傳</title>
        <script type="text/javascript" src="http://yui.yahooapis.com/2.6.0/build/yahoo-dom-event/yahoo-dom-event.js"></script> 
        <script type="text/javascript" src="http://yui.yahooapis.com/2.6.0/build/connection/connection-min.js"></script> 
        <script type="text/javascript" src="http://yui.yahooapis.com/2.6.0/build/json/json-min.js"></script> 
        <script type="text/javascript">
          function doSubmit(objForm){
            // 第二個參數設成 true 允許檔案上傳
            YAHOO.util.Connect.setForm(objForm, true);
            var callback = {
              upload: function(o) {
                var result = YAHOO.lang.JSON.parse(o.responseText);
                document.getElementById('log').innerHTML =
                  'name: ' + result.name + '<br>\n' +
                  'type: ' + result.type + '<br>\n' +
                  'size: ' + result.size + '<br>\n' +
                  'tmp_name: ' + result.tmp_name + '<br/>\n' +
                  'error: ' + result.error + '<br>\n';
              }
            };
            // 同時使用 POST 與 GET (async) 判斷資料是由 AJAX 或表單直接送出 
            YAHOO.util.Connect.asyncRequest('POST', objForm.action + '?async=1', callback);
            // 這裡傳回 false 並不能阻止 submit (原因未知)
            return false;
          }
        </script>
      </head>
      <body>
        <!-- 在 onSubmit 呼叫 doSubmit 後再傳回 false 避免以一般方式送出表單  -->
        <form id="form_1" action="async_file_upload_action.php" enctype="multipart/form-data" method="post" onsubmit="doSubmit(this); return false;" >
        <div>
          <input type="file" id="input_file_1" name="input_file_1">
          <input type="submit" id="input_submit_1" name="input_submit_1">
        </div>
        </form>
        <pre id="log"></pre>
      </body>
    </html>
    
  • async_file_upload_action.php:
    <?php
      if (isset($_GET['async'])) {
        echo json_encode($_FILES['input_file_1']);
      } else {
        echo '<pre>', print_r($_FILES, true), '</pre>';
      }  
    ?>
    
  1. Yahoo! UI Library: Connection Manager The Callback Object and File Upload
  2. Asynchronous File Upload - YUI's Approach | Code Central

2008-10-02

reCAPTCHA


  • 圖為 reCAPTCHA 的實例圖。
  • PHP CAPTCHA Library for reCAPTCHA 下載 API 和範例。
  • 申請一組金鑰,這裡除了要申請該站的帳號外,還要填入你要使用 reCAPTCHA 的域名。
  • 在範例 (example-captcha.php) 中填入該組金鑰後就可以直接測試了,填入正確的答案的話會傳回“You got it!”。
  • 如果有使用 NoScript 的話,要允許該網頁本身和 http://api.recaptcha.net 執行 Script。
  • reCAPTCHA 在瀏覽器不支援 script 的情況下也可以運作,只是要多一道傳回運算值的步驟,還有,要支援 iframe 才行(也有可能被 NoScript 擋掉)。
  • reCAPTCHA 除了提供一般常見的文字(圖形)測試外,還提供的語音測試(目標是辨識一串數字),但還滿難聽的出來就是了。
  • reCAPTCHA Mailhide 是把網頁上顯示的 E-mail ,取代成連往 CAPTCHA 測試的鏈結,測試成功後再秀出完整的 E-mail,目地是要避免被網路 bot 收集。
  • 範例:exam...@example.com。
  • reCAPTCHA Mailhide 需要載入 mcrypt 模組,在此之前得先把 PHP 附的 libmcrypt.dll 複製到 %WINDIR%\system32 裡。

2008-10-01

KENWOOD UD-700 組合音響

  • 幾星期前,陸續從 Benson 那搬回來的一組音響,今天第一次試用,產品型號應該是 KENWOOD UD-700。雖然有點舊,但是,是免費的就算有賺到啦!
  • A-A7 擴大機兼 AM/FM 收音機,曾在搬動後出現“PROTECT”訊息,說明書上寫是有線路短路,結果用吹風機吹吹就好了。
  • GE-A7 等化器 EQUALIZER,機背的接頭氧化的很嚴重。
  • X-A9 雙錄音帶播放機,其中一匣播出的聲音變的很低沉、小聲,另一匣則正常。
  • DP-A9 CD播放機,常讀不到片,更誇張的是,剛播完的片子就讀不到了。
  • LS-A7 一對喇叭,偶而會出現小聲的“啪”的聲音,但還不確定是不是音樂的問題。

標籤分類

Blog Archive

Labels

Google Analytics Tracking Code

About Me

My photo
Keelung, R.O.C, Taiwan
一個不學無術、混吃等死的傢伙…