- 要下載回來編輯的話,最好用像 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 :插廣告用的?
歡迎來到小豬圈!
2008-10-31
修改 Blogger Layout 筆記
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 上。
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 分類
- 以下分類僅供參考,有很多我都還沒用過。參見:Zend Framework: About 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
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)新申請一個帳號,然後…就都申請成功了。
- \(囧)/
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_hashed, 0, 32 );
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 用的一樣…。
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>'; } ?>
- Yahoo! UI Library: Connection Manager The Callback Object and File Upload
- 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 一對喇叭,偶而會出現小聲的“啪”的聲音,但還不確定是不是音樂的問題。
Subscribe to:
Posts (Atom)
Blog Archive
個人常用鏈結
Labels
- .NET (1)
- Accessibility (3)
- ADSL (1)
- Apache (9)
- ASP.NET (1)
- Babyer (1)
- Browser (1)
- Canon MX700 (1)
- CAPTCHA (1)
- CentOS (1)
- CSS (7)
- DB:SQL (1)
- DB:SQLite (2)
- DNS (3)
- English (1)
- EXIF (1)
- filename.ext (1)
- Firefox (4)
- Firewall (1)
- Flash (4)
- Game 遊戲 (28)
- Game:PC (6)
- Game:PS3 (4)
- Game:Xbox360 (3)
- GNU (1)
- Google (6)
- Google:Android (8)
- Google:Blogger (2)
- Google:Chrome (1)
- Google:Code (2)
- GoogleAppEngine (2)
- GoogleMaps (1)
- GPG (1)
- Hinet (1)
- HTML (2)
- HTTP (1)
- i18n (1)
- IE (3)
- Java (2)
- Javascript (2)
- Linux (1)
- Microsoft (2)
- MIME (1)
- MySQL (7)
- NexusOne (2)
- OAuth (1)
- Open source 開放原始碼 (1)
- OpenID (1)
- OS (1)
- OS:Windows (33)
- PHP (49)
- PHP:GTK (2)
- PHP:PEAR (1)
- PHP:PECL (3)
- PHP:ZendFramework (4)
- PostgreSQL (1)
- PPPoE (1)
- RegularExpressions (2)
- Security (11)
- Sphinx (2)
- SQLite (1)
- TCP (1)
- Ubuntu (1)
- UDP (1)
- Usability (2)
- Virtaul PC (1)
- Wii (2)
- XML (1)
- Yahoo (2)
- Yahoo:BBAuth (1)
- Yahoo:YUI (1)
- Youtube (1)
- 不如賣雞排 (2)
- 不願役 (33)
- 中文處理 (1)
- 圖 (5)
- 媒體 (2)
- 影片 (1)
- 影音 (19)
- 思 (8)
- 攝 (9)
- 政 (7)
- 敗 (2)
- 漫畫 (5)
- 生活 (34)
- 硬體設備 (13)
- 網站開發 (16)
- 網路 (8)
- 英文 (3)
- 貓 (2)
- 資安 (1)
- 趣 (29)
- 軟體 (12)
- 遊記 (8)
- 運動 (2)
- 關於我 (1)
- 電影 (10)