2008年12月30日 星期二

TortoiseSVN教學

http://www.dev.idv.tw/mediawiki/index.php/TortoseSVN%E4%BD%BF%E7%94%A8%E7%B0%A1%E4%BB%8B

刪除subversion的帳號&密碼

C:\Documents and Settings\user\Application Data\Subversion\auth

把svn.simple,svn.ssl.server,svn.username刪除即可

mysql_connect ERROR

情境:
mysql_connect('IP','mysql_user','mysql_password')去連線
但卻出現connection ERROR,會用mysql_user@PC_HOST_NAME , 去連線

解決:
MySQL Server的WinXP的防火牆關掉即可

2008年12月29日 星期一

[Window]手動安裝PHP+MySQL+Apache+phpMyAdmin

安裝版本

1. Apache2 2.2.11
2. PHP 5.2.8
3. MySQL 5.1.30
4. phpMyAdmin 3.1.1

請準備以上項目的 zip 壓縮版本,而不要用安裝版本(.exe),備齊這些資料就可以開始了。

示範平台:

OS : Windows XP
RAM : 2G


一、Apache
只有非官方的 Apache on Windows (Apache2) 才能直接在 Windows 安裝,安裝步驟如下:
1. 請先安裝 Visual C++ 2005 Redistributable Package
http://www.apachelounge.com/download/vcredist_x86-sp1.exe

2. 將 Apache2 解壓縮到 C:\ (例:C:\Apache2)

3.
開始 > 執行 > 輸入 cmd > 確定
cd\apache2\bin
httpd -k install
httpd -k start
(P.S. httpd -k uninstall 為移除 Apache2 服務)

4. 開啟一個瀏覽器,在網址列輸入 http://localhost 測試,出現「It works!」字樣即為安裝成功。(預設網站資料夾為 C:\Apache2\htdocs)

二、PHP
安裝 PHP
將 PHP 檔案解壓縮到資料夾 C:\php (沒有請新增)
將 c:\php\php5ts.dll、c:\php\libmysql.dll copy 到 C:\Apache2\bin
將 c:\php\php.ini-dist copy 到 C:\Windows 並更名為 php.ini

設定 php.ini
找到 extension_dir = "./" 改成 extension_dir = "C:\php\ext"
找到 ;extension=php_mbstring.dll 改成 extension=php_mbstring.dll
找到 ;extension=php_mysql.dll 改成 extension=php_mysql.dll
找到 ;date.timezone = 改成 date.timezone = "Asia/Taipei"
(如果你不在台灣,請改成你的時區.. )
將 php.ini 存檔後關閉

設定 Apache,以模組方式載入 PHP
開啟 C:\Apache2\conf\httpd.conf

找到 #LoadModule vhost_alias_module modules/mod_vhost_alias.so
在下方加入 LoadModule php5_module "c:/php/php5apache2_2.dll"

找到 AddType application/x-gzip .gz .tgz
在下方加入 AddType application/x-httpd-php .php

找到 DocumentRoot "c:/Apache2/htdocs" ,改成你的網站資料夾
(例 www)DocumentRoot "c:/www"

找到 ,改成你的網站資料夾
(例 www)

找到 DirectoryIndex index.html ,改成
DirectoryIndex index.html index.htm index.php

設定 Apache,開啟 rewrite 模組(不需要者可略過)
找到 #LoadModule rewrite_module modules/mod_rewrite.so
改成 LoadModule rewrite_module modules/mod_rewrite.so

搜尋 AllowOverride None (可找到三個結果)
全部改成 AllowOverride All

重新啟動 Apache
開始 > 執行... > 輸入 cmd > 確定
cd\apache2\bin
httpd -k restart

測試 PHP 環境
請在你的網站資料夾裡新建檔案 c:\www\phpinfo.php ,內容只有一行如下:

<?php phpinfo() ?>


開啟一個瀏覽器,並在網址列輸入 http://localhost/phpinfo.php
如果有出現 php 相關訊息就代表安裝成功了。\

三、MySQL
將 MySQL 檔案解壓縮到 C:\ 並將資料夾 mysql-noinstall-5.1.30-win32 更名為 mysql,
(例C:\mysql)

依下列程序安裝 MySQL 服務
開始 > 搜尋列
輸入 C:\mysql\bin\mysqld -install 按確定

MySQL 講座(懂了就可以跳過,請確認 MySQL 已啟動)
一般在 WindowsNT/2000/XP/Vista,MySQL需要安裝成為一個系統服務。
你可以在以下程序看到 MySQL 服務。
我的電腦上按右鍵選管理
服務及應用程式 > 服務
在 MySQL 上點兩下(如果沒有找到代表你安裝不成功)
啟用類型: 自動.. 服務狀態: 已啟動 才是正常,如果不是請設定成這樣。經過此設定後,MySQL 服務將會在你每次開機後自行啟動。

如果要移除 MySQL 服務,請作以下動作
先停止 MySQL 服務,我的電腦上按右鍵選管理
服務及應用程式 > 服務
在 MySQL 上點兩下
啟用類型: 自動.. 服務狀態: 已停止,設定成這樣。
開始 > 執行
輸入 C:\mysql\bin\mysqld -remove 按確定
需注意,若沒有這個動作自行刪除 MySQL 檔案,這裡的 MySQL 服務就會變成無法移除了!

設定 MySQL 編碼
copy C:\mysql\my-huge.ini 到 C:\WINDOWS\ 之下,更名為 my.ini ,設定 MySQL 預設編碼為 UTF-8 (或其他)

my.ini

[mysqld]
default-character-set=utf8

[client]
default-character-set=utf8



重新啟動 MySQL
我的電腦上按右鍵選管理
服務及應用程式 > 服務
在 MySQL 上按右鍵 > 重新啟動

四、phpMyAdmin
安裝 phpMyAdmin
將 phpMyAdmin 檔案解壓縮到 (你的網站資料夾)\phpmyadmin,
(例C:\www\phpmyadmin)

設定 phpMyAdmin
copy c:\www\phpMyAdmin\config.sample.inc.php 至 c:\www\phpMyAdmin\,並更名為config.inc.php


<?php
$cfg['blowfish_secret'] = 'ba17c1ec07d65003'; // use here a value of your choice

$i=0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
?>


參考網址:http://blog.raienet.com/330

2008年12月23日 星期二

[PHP]現在寫 PHP6-compatible 的一些技巧

Becoming PHP 6 Compatible 這篇裡面提到的五個技巧,現在遵循這些習慣,等到 PHP6 正式推出的時候程式碼才不會改太多:

-不要再依賴 register_globals:register_globals 將 $_GET、$_POST、$_COOKIE 這三個的變數內容直接對應到全域變數。這在目前的 PHP4 與 PHP5 預設都是關閉的,但還是有文件書籍會「建議」你打開。
在 PHP6 中,這個功能將直接消失。不過,還是可以透過 extract() 達到一樣的效果。

-不要使用 magic_quotes:這個功能在目前的 PHP4 與 PHP5 預設是開啟的,但在 PHP6 將會消失 (而非改為關閉),所以,在開發軟體時最好以 magic_quotes 關閉的情況下開發。

-不要使用 $HTTP_POST_VARS 或 $HTTP_GET_VAR,改用 $_POST 及 $_GET。這點可以用編輯器的字串代換很快的換完。就算真的是很多的程式碼,也可以一次換一些。

-使用 preg_*,而不要再用 ereg_*。現在就用 preg_* 是因為執行速度比 ereg_* 快,另外在 PHP6 將會廢掉 ereg_*。不過應該會有人寫出 PECL extensions 放回來。

-直接拿原作者的 code 比較清楚:
$a = & new object(); // Do not do
$a = new object(); // Do this as of PHP 6

上面所提到的改變,會強迫使用者不能再用壞習慣寫程式,對於 PHP 的發展會是相當好的事情。

補充:
-把mb_開頭的函數改回不帶mb_開頭的函數,因為PHP6有了Unicode模組,將會把MBString模組廢掉~

摘自:http://blog.gslin.org/archives/2007/09/25/1318/

2008年12月15日 星期一

[PHP]抓取變數名稱


function varname($var){

return (isset($var))? array_search($var, $GLOBALS) : false;

}

$boogie = 'tonight';

echo varname($boogie);

Photoshop切圖出來的HTML在Firefox中,版型跑掉

情境:
美工同事用Photoshop切圖出來的HTML,套版後,在IE看是正常,
但在Firefox中,版型卻跑掉

解決:
原來是Photoshop切圖會產生一個間距檔「間距.gif」,
把它改成space.gif,Firefox的版型即可恢復正常

2008年12月13日 星期六

Ajax 跨網域問題的解決之道

Ajax 跨網域問題的解決之道
根據 Same Origin Policy 政策的安全性考量,客戶端的程式碼 (通常是 Javascript) 存在著跨網域存取資料的限制,而好死不死剛好 Ajax 就是屬於這一類型的程式碼。但 Web 2.0 又很流行 Mush Up 把各個不同網站的內容混搭在一起,如果這時候你希望能夠使用 Ajax 來取得來不同網域 (domain) 中的資料,就會遭遇到安全性的問題而無法取得跨網域的資料。

要如何解決 Ajax 跨網域存取資料的問題呢? 既然基本的政策不允許,那麼山不轉就人轉吧! 讓我們耍點小技巧。目前想到的方式有兩種:

一、透過 proxy 程式
這裡所謂的 proxy 並不是大家常聽到網路設定裡面的那個 proxy 伺服器。而是:

1. 自行用 "伺服器端的程式語言" 例如 PHP, ASP.NET 寫一個程式去取得跨網域的資料,這樣的程式我們將它稱為 proxy。因為它是伺服器端的程式,所以當然沒有跨網域的問題。而且在這個程式裡面也可以將取得的資料處理成 JSON 方便給 Ajax 使用。
2. 將這個 proxy 程式放到自己的伺服器上,必須和 Ajax 在同一個網域內。
3. Ajax 不要直接去取得跨網域的資料,因為根本取不到。而改為去跟這個 proxy 程式要資料,所以 proxy 程式就是代替 Ajax 跨網域去取得資料的那個中間人或跳板 (知道為什麼要稱它為 proxy 了吧)。

請特別注意的是: 建議一定要在 proxy 的程式碼中做檢查,呼叫它的程式是否來自於同一個網域,否則每個人都可以寫程式來呼叫你的 proxy,伺服器一定被操翻了 (當然你不介意讓大家公開使用的話也無所謂)。例如 PHP 可以用這段程式碼取得呼叫它的程式的網址:

$referrer = getenv('HTTP_REFERER');

這裡也有現成寫好的 proxy 程式可供使用 http://www.ajax-cross-domain.com/ ,它是使用 Perl 寫的。

二、利用 DOM 動態載入外部 JS 檔案
如果你很幸運,剛好跨網域要讀取的網址所傳回的資料就已經是正確的 JSON 格式了。有可能是自己或別人寫好的 Web API,那麼你可以用這個省時省力又有效率的方法:

1. 用 DOM 動態建立一個 <script> 節點
2. 將這個節點的 file 屬性設成為那個 API 的 URL (可以帶參數)。
3. 這時 API 傳回的內容就會當成是一個外部 JS 檔案直接載入進來了。
然後你便能夠在 Javascript 中直接使用載入進來的 JSON 資料。

這種方法只是利用 <script> 標籤而不是 Ajax,所以壓根不會有跨網域的問題,但一樣可以動態載入外部資料。請特別注意的是: 只有在要動態讀取的資料內容已經是正確的 JSON 格式或 Javascript 程式碼時,才能直接透過動態建立<script> 節點來載入資料哦! 否則的話只能用第一種方法。

第二種方法使用 YUI 裡面的 Get Utility 就能馬上幫您做到。


摘自:http://tw.myblog.yahoo.com/class2u-com/article?mid=1869&prev=2450&next=974&l=f&fid=7

2008年12月1日 星期一

有沒有強制換行的CSS

table是按百分比定義的,中文字TD裡能自動折行,但是字母和數字的時候並不會折行,而是在一行顯示下去,有沒有強制折行CSS呢?

對於div,p等塊級元素

正常文字的換行(亞洲文字和非亞洲文字)元素擁有默認的white-space:normal,當定義的寬度之後自動換行
html
程序代碼 程序代碼
正常文字的換行(亞洲文字和非亞洲文字)元素擁有默認的white-space:normal,當定義

css
#wrap{white-space:normal; width:200px; }


1.(IE瀏覽器)連續的英文字符和阿拉伯數字,使用word-wrap : break-word ;或者word-break:break-all;實現強制斷行

#wrap{word-break:break-all; width:200px;}
或者
#wrap{word-wrap:break-word; width:200px;}

程序代碼 程序代碼
abcdefghijklmnabcdefghijklmnabcdefghijklmn111111111



效果:可以實現換行

2.(Firefox瀏覽器)連續的英文字符和阿拉伯數字的斷行,Firefox的所有版本的沒有解決這個問題,我們只有讓超出邊界的字符隱藏或者,給容器添加滾動條

程序代碼 程序代碼
#wrap{word-break:break-all; width:200px; overflow:auto;}
abcdefghijklmnabcdefghijklmnabcdefghijklmn111111111



效果:容器正常,內容隱藏

對於table

1. (IE瀏覽器)使用 table-layout:fixed;強制table的寬度,多餘內容隱藏

程序代碼 程序代碼




abcdefghigklmnopqrstuvwxyz1234567890ssssssssssssss



效果:隱藏多餘內容

2.(IE瀏覽器)使用 table-layout:fixed;強制table的寬度,內層td,th採用word-break : break-all;或者word-wrap : break-word ;換行

程序代碼 程序代碼





abcdefghigklmnopqrstuvwxyz 1234567890
abcdefghigklmnopqrstuvwxyz 1234567890



效果:可以換行

3. (IE瀏覽器)在td,th中嵌套div,p等採用上面提到的div,p的換行方法

4. (Firefox瀏覽器)使用 table-layout:fixed;強制table的寬度,內層td,th採用word-break : break-all;或者word-wrap : break-word ;換行,使用overflow:hidden;隱藏超出內容,這裡overflow:auto;無法起作用

程序代碼 程序代碼





abcdefghigklmnopqrstuvwxyz1234567890abcdefghigklmnopqrstuvwxyz1234567890



效果:隱藏多於內容

摘自:http://220.135.241.51/blog/article.asp?id=1976

2008年11月22日 星期六

律動時尚倒閉 2千人受害

北市「律動時尚公司」與板橋分店「耀動時尚」先後無預警歇業,造成近2千名會員求償無門,痛批是亞力山大事件翻版;台北縣消保官昨天協調業者,開門讓會員進入領取私人物品,下周一將把負責人胡雅玲、李曉芬依詐欺罪嫌函送法辦。


消保官周繼雄、黃耀南指出,由胡雅玲和李曉芬分別擔任負責人的律動古亭館、耀動板橋館是關係企業,提供會員瑜珈、舞蹈、有氧運動等服務;古亭館9月因周轉不靈,向經濟部申請停止營業,將會員轉介至板橋館,但板橋館也在10月底以內部設整修為由,無預警停業,部分會員日前組成自救會,向縣府申訴。


消保官昨天協調業者開門,讓會員領回寄放在板橋館內的私人物品,但李曉芬並未出面,引發會員不滿,要求受李委託的2名友人影印繳款及消費資料,作為日後求償依據。


會員潘小姐說,她在今年1月入會後,一次儲值2年期共1萬8000元,目前還有約7000元未使用,但許多金卡會員沒上幾次課,耀動就無預警關門,損失相當慘重。


會員何小姐不滿指出,板橋館關門前一天還在招收會員,隔天就以簡訊通知會員,說因更換冷氣等設備暫停營業,12月1日才會重新營業,讓會員措手不及,痛批「這根本就是『亞力山大』的翻版!」


周繼雄計估兩館受害會員近2千人,呼籲尚未加入自救會的會員與消保官聯繫登記,縣府將協助向業者集體求償,聯繫電話為29603456轉分機4762、4763。

2008年11月17日 星期一

[JavaScript] 複製物件

前幾天遇到了一個 JavaScript 的小問題,就是物件的複製。

這個問題主要是我先設定了一個全域變數,然後在函式裡去重新定義一個變數,並將全域變數的內容指定給新變數。

我以為這樣就是「複製了 JavaScript 的物件」,但事實上是錯的。

我特地上網找了一下,發現 JavaScript 本身並沒有提供比較方便的 clone 機制,這時我的腦筋就動到 jQuery 上了。

不過這裡我可不是說 jQuery 的 clone 方法,而是 extend 方法。

先來看看例子好了:






在上面的程式中,請將重點放在我強調的部份。

這裡我先定義一個自訂物件 o1 ,然後我將 o2 指定為 o1 ;在 JavaScript 的意義裡, o2 就會是 o1 的「別名」,兩個都指到同一個物件。

因此接下來我對 o2 進行任何操作,都會影響到 o1 ;也就是說如果我們要複製 o1 的話,就不能用等號 (=) 。

jQuery 的 extend 方法可以幫我們這個忙。

原因是 extend 會將第二個參數裡的物件成員,一項一項地複製到第一個參數上。因此我們可以用它來解決 JavaScript 複製物件的問題。

在 o1 複製到 o3 中,很重要的一個關鍵就是我們需要把 $.extend 的第一個參數設為空物件;這是因為 $.extend 會回傳第一個參數,我們就省掉先行定義 o3 為空物件的動作了。

接下來我們不論怎麼對 o3 進行處理,也不會影響到 o1 ;換句話說,我們已經成功達成 clone JavaScript Object 的目標啦。

摘自:http://blog.roodo.com/jaceju/archives/7611083.html

2008年11月12日 星期三

IE 裡 XMLHttpRequest 的 cache

在 IE 裡使用 XMLHttpRequest 時會被 cache (沒有遵守 Cache-Control 的 no-cache 參數),這個問題不會太大 (因為很好解,解法也不會破壞其他遵守規定的 Browser),解法是在 Cache-Control 外多送出幾組 header:

Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Expires: Mon, 1 Mon 1990 00:00:00 GMT
Last-Modified: 現在的時間


header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ("Pragma: no-cache");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');


摘自:http://blog.gslin.com/2007/03/ie-xmlhttprequest-cache.html

2008年10月22日 星期三

Xoops簡介

簡介:
XOOPS 是一個高度可擴充、具物件導向、且易於使用的動態網站內容管理系統(CMS),採用 PHP 語言來設計。XOOPS 十分適合用於發展小型至大型的動態社群網站、內部 Intranet 網站、入口網站、並且可用來做為 WEB LOG 使用。


優點:
1. 免費與完全開放原始碼
2. 完整的中文支援
3. 數量龐大的外掛功能

綜合分析:
此版本為PHPNuke所分離出來的,免除了PHPNuke的程式碼混亂的情形,是早期的CMS產品.
台灣這邊有浪游者在做中文支援,但是因為其封閉的管理作風,導致於xoop的使用者紛紛獨立成立網站作中文支援.目前因為浪游者和國外官方因為理念不合,所以將獨立出來開發XoopCube.
所以建議使用者,請自行了解其差異點後選擇.

2008年10月15日 星期三

無名小站的 XSS 安全漏洞

前言
布丁大長輩 在 Year.new(2006) 這篇幹剿無名小站的 XSS 安全漏洞,沒有講的很明白,加上我這陣子沒在實驗室遇到 wkwu (是的,我跟他是同一個指導教授),所以一直沒有跟他說這個在國外已經「開發」好一陣子的安全漏洞。

Javascript 是在使用者端 (Browser) 跑的程式,理論上來說,讓使用者輸入自己的 Javascript 並不會有什麼問題,但實際上自從 XMLHttpRequest() 被大量應用後 (一開始發展 AJAX 所使用的核心技術之一),有些人就發現 XMLHttpRequest() 是可以拿來當作攻擊的工具。

舉例說明
舉個例子說明會比較清楚。以目前最大的 無名小站 為例,「修改個人資料」的頁面是在 http://www.wretch.cc/user/modify.php?admin_user=1 這個位置,會以 POST 的方式送給 http://upload.wretch.cc/user/do_modify.php,那麼我就可以在文章裡面嵌入一段 Javascript:(修改自 Use the XMLHttpRequest Object to Post Data)

var objHTTP, strResult;
objHTTP = new ActiveXObject('Microsoft.XMLHTTP');
objHTTP.Open('POST',
"http://upload.wretch.cc/user/do_modify.php",false);
objHTTP.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
objHTTP.send("依照 form 的內容填入一些東西");
strResult=objHTTP.responseText;上面的程式碼是 IE Only 的程式碼,但是要弄 IE & Firefox 並存的程式碼其實只是加個 if 判斷句後改用 new XMLHttpRequest 而已…

原因
問題來了:為什麼這樣做有效?那我隨便用 WWW::Mechanize 丟個東西進去 server 不就炸了?

答案是:使用 XMLHttpRequest() 連線時,會送出使用者的 Cookie,於是 server 端會以這個 Cookie 的擁有人去做 Javascript 要做的事情!接下來就 !@#$%^…

再一個例子
你會說我只是隨便講講?其實這件事情在兩個月前已經在 MySpace.com 上發生過了,而且還寫成 worm 自動感染:Cross-Site Scripting Worm Floods MySpace (Slashdot)。

Google 應對的方法
回過頭來提 Google 對 XSS 的應對 這篇所提到的例子。

假設有個人在他自己的網站上 (假設是 www.example.com) 放個 Javascript,用 XMLHttpRequest() 連 mail.google.com (Gmail) 的某些 function,幫使用者刪除所有的 mail。在平常的時候,會因為 example.com != google.com 而無法產生 XMLHttpRequest Object,但是在「頁庫存檔」的時候就會在同一個 Domain 下!於是 Google 必須避免這種情況:硬把 www.google.com 換成 IP address,這樣就沒問題了。

你可以測試 http://www.google.com/search?q=cache:http://www.google.com/ 這個頁面,會發現 Google 會故意換到 IP address。

Google 的另外一個服務是 Blogger。你會發現 Blogger 可以讓你隨便修改 Template 填入各種 code,於是你就可以對 *.blogspot.com 下面的 site 進行 XSS 攻擊:但實際上 Blogger 的 Control panel 放在 blogger.com,於是根本不怕你利用 Template 惡搞。

結語
最後,Javascript 是邪惡的,平常逛網站請不要打開 Javascript:請安裝 NoScript 以避免被 ox 掉 :p

摘自:http://blog.gslin.org/archives/2006/01/06/288/

2008年10月6日 星期一

jquery radio取值,checkbox取值,select取值,radio選中,checkbox選中,select選中,及其相關

獲取一組radio被選中項的值
var item = $('input[@name=items][@checked]').val();
獲取select被選中項的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二個元素為當前選中值
$('#select_id')[0].selectedIndex = 1;
radio單選組的第二個元素為當前選中值
$('input[@name=items]').get(1).checked = true;

獲取值:

文本框,文本區域:$("#txt").attr("value");
多選框checkbox:$("#checkbox_id").attr("value");
單選組radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();

控制表單元素:
文本框,文本區域:$("#txt").attr("value",'');//清空內容
$("#txt").attr("value",'11');//填充內容

多選框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判斷是否已經打勾

單選組radio: $("input[@type=radio]").attr("checked",'2');//設置value=2的項目為當前選中項
下拉框select: $("#sel").attr("value",'-sel3');//設置value=-sel3的項目為當前選中項
$("11112222").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框


摘自:http://www.cnblogs.com/xlfj521/archive/2008/01/29/1057375.html

2008年9月16日 星期二

[WordPress]ImageManager上傳圖失敗

SOLUTION:
在ImageManager
Options >> ImageManager
將Base image directory:改成正確的路徑

即可

2008年9月15日 星期一

Subversion - Cleanup Failed To Process The Following Paths

SOLUTION I
1) Try and determine what rev your Working Copy is checked out at -
file->properties->subversion should tell you this, but the picture may
be less clear if you have mixed revisions.

2) Check out a new Working Copy at the revision you've just determined

3) Create a patch from your broken Working Copy

4) Apply the patch to your new Working Copy

5) Continue using the new one. Delete the broken copy when you're
confident you no longer need it.

2008年9月12日 星期五

undefined / null in JavaScript

In JavaScript null is an object. undefined is used for things that don't exist. The DOM returns null for almost all cases where it fails to find some structure in the document, but in JavaScript itself undefined is the value used.

null and undefined are not strictly equivalent. If you really want to check for null, do:

if (varname == null) // with casting
if (varname === null) // without casting (i.e. same value, same type)

If you want to check if a variable exist

if (typeof(varname) != 'undefined')

The variable exists but you want to know if there's any value stored in it:

if (varname != undefined)

Check if a member variable exists (independent of whether it has been assigned a value or not) :

if ('varname' in object) // With inheritance
if (object.hasOwnProperty('varname')) // Without inheritance


摘自:http://blog.jails.fr/index.php?post/2007/08/01/undefined-/-null-in-JavaScript

2008年9月11日 星期四

[FreeBSD]如何將帳號加入到sudoers

1. 編輯 /usr/local/etc/sudoers
2. 加上 <帳號> ALL=(ALL) SETENV: ALL

2008年9月2日 星期二

WebSitePulse - 檢查網站是否被大陸封鎖?

相信大家對於中國大陸的防火長城(Great FireWall, 簡稱GFW)一定不陌生,如果網站遭受封鎖,不僅大陸地區的使用者無法進入你的網站之外,損失的流量數也是相當可觀。現在你可以透過WebSitePulse提供的”Website Test behind the Great Firewall of China“來檢測網站是否遭受GFW封鎖。


使用方式很簡單,只要在Enter Test Website處輸入欲檢測的網站網址,如果你希望看到HTTP表頭回應訊息的話,可以勾選Display HTTP Response headers選項。接著選擇要檢測的節點,目前共提供以下幾個網路節點供使用者使用:

上海(Shanghai, China)
北京(Beijing, China)
香港(Hong Kong, China)
西雅圖(Seattle, WA)
德國慕尼黑(Munich, Germany)
澳洲布利斯班(Brisbane, Australia)
選擇後別急著按檢測,看到Verification Code了嗎?請輸入你所看到的數字驗證碼,輸入確認後在送出即可進行檢測。

檢測完成後,如果跳出的狀態是綠色的OK, 那表示大陸地區的使用者可以正確訪問你的網站。


摘自:http://www.freegroup.org/free-website-test-behind-the-great-firewall-of-china

2008年8月29日 星期五

關於eclipse的快速鍵使用

Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)

下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)
Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)
Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)
Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)
Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)
Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)
Alt+Shift+I 合并变量(可能这样说有点不妥Inline)
Alt+Shift+V 移动函数和变量(不怎么常用)
Alt+Shift+Z 重构的后悔药(Undo)

编辑
作用域 功能 快捷键
全局 查找并替换 Ctrl+F
文本编辑器 查找上一个 Ctrl+Shift+K
文本编辑器 查找下一个 Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全局 恢复上一个选择 Alt+Shift+↓
全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 内容辅助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信息 Alt+?
Alt+Shift+?
Ctrl+Shift+Space
Java编辑器 显示工具提示描述 F2
Java编辑器 选择封装元素 Alt+Shift+↑
Java编辑器 选择上一个元素 Alt+Shift+←
Java编辑器 选择下一个元素 Alt+Shift+→
文本编辑器 增量查找 Ctrl+J
文本编辑器 增量逆向查找 Ctrl+Shift+J
全局 粘贴 Ctrl+V
全局 重做 Ctrl+Y


查看
作用域 功能 快捷键
全局 放大 Ctrl+=
全局 缩小 Ctrl+-


窗口
作用域 功能 快捷键
全局 激活编辑器 F12
全局 切换编辑器 Ctrl+Shift+W
全局 上一个编辑器 Ctrl+Shift+F6
全局 上一个视图 Ctrl+Shift+F7
全局 上一个透视图 Ctrl+Shift+F8
全局 下一个编辑器 Ctrl+F6
全局 下一个视图 Ctrl+F7
全局 下一个透视图 Ctrl+F8
文本编辑器 显示标尺上下文菜单 Ctrl+W
全局 显示视图菜单 Ctrl+F10
全局 显示系统菜单 Alt+-


导航
作用域 功能 快捷键
Java编辑器 打开结构 Ctrl+F3
全局 打开类型 Ctrl+Shift+T
全局 打开类型层次结构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R
全局 后退历史记录 Alt+←
全局 前进历史记录 Alt+→
全局 上一个 Ctrl+,
全局 下一个 Ctrl+.
Java编辑器 显示大纲 Ctrl+O
全局 在层次结构中打开类型 Ctrl+Shift+H
全局 转至匹配的括号 Ctrl+Shift+P
全局 转至上一个编辑位置 Ctrl+Q
Java编辑器 转至上一个成员 Ctrl+Shift+↑
Java编辑器 转至下一个成员 Ctrl+Shift+↓
文本编辑器 转至行 Ctrl+L


搜索
作用域 功能 快捷键
全局 出现在文件中 Ctrl+Shift+U
全局 打开搜索对话框 Ctrl+H
全局 工作区中的声明 Ctrl+G
全局 工作区中的引用 Ctrl+Shift+G


文本编辑
作用域 功能 快捷键
文本编辑器 改写切换 Insert
文本编辑器 上滚行 Ctrl+↑
文本编辑器 下滚行 Ctrl+↓


文件
作用域 功能 快捷键
全局 保存 Ctrl+X
Ctrl+S
全局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关闭 Ctrl+Shift+F4
全局 属性 Alt+Enter
全局 新建 Ctrl+N


项目
作用域 功能 快捷键
全局 全部构建 Ctrl+B


源代码
作用域 功能 快捷键
Java编辑器 格式化 Ctrl+Shift+F
Java编辑器 取消注释 Ctrl+\
Java编辑器 注释 Ctrl+/
Java编辑器 添加导入 Ctrl+Shift+M
Java编辑器 组织导入 Ctrl+Shift+O
Java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。
也可以使用Ctrl+1自动修正。


运行
作用域 功能 快捷键
全局 单步返回 F7
全局 单步跳过 F6
全局 单步跳入 F5
全局 单步跳入选择 Ctrl+F5
全局 调试上次启动 F11
全局 继续 F8
全局 使用过滤器单步执行 Shift+F5
全局 添加/去除断点 Ctrl+Shift+B
全局 显示 Ctrl+D
全局 运行上次启动 Ctrl+F11
全局 运行至行 Ctrl+R
全局 执行 Ctrl+U


重构
作用域 功能 快捷键
全局 撤销重构 Alt+Shift+Z
全局 抽取方法 Alt+Shift+M
全局 抽取局部变量 Alt+Shift+L
全局 内联 Alt+Shift+I
全局 移动 Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重做 Alt+Shift+Y

摘自:http://blog.csdn.net/hulefei29/archive/2008/08/09/2789659.aspx

2008年8月27日 星期三

Using a Singleton with Smarty (syntax and usage questions)



$smarty = MySmarty::getInstance();
$smarty->testing(); #does work


class MySmarty
{

public static function getInstance()
{
if (self :: $instance === NULL)
{
self :: $instance = new MySmarty();
include('Smarty.class.php' );

self :: $smarty = New Smarty;
self :: $smarty -> caching = false;
self :: $smarty -> template_dir = $SMARTY_TEMPLATE_PATH."/templates/";
self :: $smarty -> compile_dir = $SMARTY_TEMPLATE_PATH."/templates_c/";
self :: $smarty -> config_dir = $SMARTY_TEMPLATE_PATH."/configs/";
self :: $smarty -> cache_dir = $SMARTY_TEMPLATE_PATH."/cache/";
self :: $smarty -> assign('app_name', 'HTML Email');
self :: $smarty -> compile_check = true;
self :: $smarty -> debugging = false;

}
return self :: $instance;
}

private function __clone()//do not allow clone
{
}

static private $smarty = false;
static private $instance = NULL;



// Example method
public function testing()
{
echo 'Testing!';
}
}


摘自:http://www.phpinsider.com/smarty-forum/viewtopic.php?t=13781&highlight=static

TortoiseSVN: 解決TSVNCache佔用CPU過高的設定

竟然被中文介面誤導了這麼久!如果你偶爾在工作管理員裡發覺TSVNCache.exe突 然耗用許多CPU資源(有時會超過50%),那要趕緊去檢查TortoiseSVN的 設定。原來是這個常駐的Process會定時去掃描受Subversion控 管的檔案是否被修改了,掃描到後,這些被修改的檔案、與其所屬的子目錄、目錄等的覆蓋圖示都一併更新,而就是這個動作不僅佔用約10-50 MB記憶體,也會瞬間衝出超過CPU 50%負載。

圖示覆蓋與狀態欄更新設定
打開TortoiseSVN的 【設定視窗(Settings)→視覺樣式(Look and Feel)→圖示覆蓋(Icon Overlays)】,右邊第一個Radio Group名稱「圖示覆蓋/狀態列」的英文是「Icon Overlays/Status Columns」,其中的Status Columns應譯成狀 態欄才對,它指的是在檔案總管裡把顯示模式切換成詳細資料時, 標題欄位裡的Subversion欄位是否要同步更新狀態。如果你只會在檔案總管裡操作Subversion狀態的話,應該把「僅在檔案總管中顯示圖示覆 蓋」打勾,以免除另存新檔、開啟檔案等對話窗也更新圖示狀態。但我有時會在Total Commander裡操作Subversion,因此就不能勾選。

狀態快取設定
右邊第二個Radio Group名稱譯成「狀態列」,讓人誤解成以為是顯示訊息的狀態列設 定,但其實英文是Status Cache-狀態快取設 定,指的是資料夾與檔案圖示的SVN小圖示的覆蓋狀態的處理模式。Status Cache有3個選項:

Default
預設的快取設定,使用TSVNCache.exe 來定時掃描檔案系統,找到要變動的檔案後發出更新圖示的通知給作業系統

Shell
在Shell extension裡,只針對目前所在資料夾做圖示異動更新;只佔用1MB記憶體,但因只快取一個資料夾,當Working copy內容較多時會花較多時間才能更新完畢

None
不做任何圖示覆蓋快取,因此圖示更新速度較慢

我特別做了測試把狀態改用Shell,重新開機後工作管理員裡就找不到TSVNCache.exe 了,用檔案總管檢視Working copy資料夾時,圖示覆蓋以較緩慢的速度顯示出來。

磁碟機類型
磁碟機類型是指定讀取Subversion檔案狀態的對象,建議選硬碟,以免別的媒體較慢的讀取速度造成TortoiseSVN效 能低落。

在Subversion Forum這篇討論裡也有如下建議:

把A:\*、C:\*、D:\*到Z:\*都加到除外路徑裡,表 示每個磁碟都不做異動掃描
再把工作中的Working copy加入包含路徑,如c:\NewProject\*、 d:\NewWD
再試用觀察一陣子再來確認應該用那樣的設定較好。

摘自:http://blog.roodo.com/emisjerry/archives/3979261.html

2008年8月26日 星期二

Dreamweaver 8支援smarty

現在開發程式與軟體一定要有好的工具,千萬不要呆呆的用記事本來做
一定要找IDE工具,它會把一些常用的東西會幫你用好
這樣開發速度才會快也比較不容易出錯
網頁編輯是用dreamweaver 8,雖然他要錢但還真好用
千萬不要用frontpage來編輯因為它會自做主張幫你加些東西,太聰明也不好
程式語言是用php來開發,php有使用smarty樣板,它是一套很好用的樣版系統,可以讓程式碼與網頁程式分離
網頁在設計時有用到smarty語法,會使整個格式亂掉,當然放在網站就看是沒問題
但在dreamweaver畫面上編輯就變的不方便,還好dreamweaver也有smarty的外掛元件
可以安裝dreamweaver_smartytags這個元件
http://smarty.php.net/contribs/misc/dreamweaver_smartytags.zip
下載之後解壓將smartytags目錄複製放入,安裝dreamweaver目錄\Configuration\ThirdPartyTags\
就可以看到元件,但是重新啟動還是沒有動靜,照理說應該就能用了很奇怪

這是在網路上看到的
好像還要裝一個元件才可以用
安裝smarty_ext這個元件 在這http://www.scottwilburn.com/2006/05/12/smarty/裡面有介紹也可以從該頁下載
這個元件就要用dreamweaver管理擴充功能來安裝
安裝這個再重新啟動就看到smarty的{$xxxx}變成圖片了
可能要安裝二個才能用,那也沒關係啦就一併安裝

2008年8月25日 星期一

解决IE6、IE7、Firefox兼容最简单的CSS Hack

很早就在这里看到过解决方案,与嗷嗷讨论后发现这个方案还是很可靠的。当然,唯一的缺点就是每一个属性都要去Hack,但我在很多实践中,只用‘修正’1-2个属性就可以了。

具体写法很容易:

#someNode
{
position: fixed;
#position: fixed;
_position: fixed;
}

第一排给Firefox以及其他浏览器看
第二排给IE7(可能以后的IE8、IE9也是如此,谁知道呢)看
第三排给IE6以及更老的版本看
最好的应用就是可以让IE6也“支持”position:fixed,而且,配合这个原理,可以做到不引入JavaScript代码(仅用IE6的expression),我这里有一个现成的页面,CSS如下写:


#ff-r
{
position: fixed;
_position: absolute;
right: 15px;
top: 15px;
_top: expression(eval(document.compatMode &&
document.compatMode=='CSS1Compat') ?
documentElement.scrollTop+15 :
document.body.scrollTop +
(document.body.clientHeight
-this.clientHeight));
}


是不是很方便:)


摘自:http://www.awflasher.com/blog/archives/1080

2008年8月19日 星期二

Eclipse JS Encoding

在使用Eclipse 編輯 JS 時 ,不管用哪個外掛編輯器,
再輸入中文字後存檔,在打開時都會發生字體變成亂碼????
這是由於Eclipse一個顯示bug

https://bugs.eclipse.org/bugs/show_bug.cgi?id=90241

原因就是 JS 的文件他是用 US ASCII 寫的,所以預設編碼是 ASCII
在改成UTF-8即可以了,不過改的地方需要注意
Preferences -> General -> Editers 這邊 改Text File encoding (預設是MS850) 是沒用的
需到 Preference -> General -> content type 點選 JavaScript
在 Default Encoding: US ASCII Code 改成 UTF-8 即可

這裡指的是文件編碼,和網頁編碼不一樣喔。檔案編碼常受限編輯器設定關係。

摘自:http://zteman.blogspot.com/2006/09/eclipse-js-encoding.html

2008年8月7日 星期四

[MySQL]mysql --default-character-set=utf8資料匯入問題

[案例]
1.公司的MySQL DBServer編碼為[big5]
2.UrWawa的urwawacom_db.sql檔為[utf8]

[匯入方式]

mysql -u mysql_root --default-character-set=utf8 -p urwawacom_db < urwawacom_db.sql


即可

2008年8月4日 星期一

[CakePHP]findAll / find 使用OR conditions


$this->User->findAll("User.firstname = 'Daniel' OR User.firstname = 'Hugo'");
$this->User->findAll(array('or' => array("User.firstname" => 'Daniel'), array("User.firstname" => 'Hugo')));

2008年8月3日 星期日

測試你的網站在不同瀏覽器的顯示狀況

browsershots.org:Test your web design in different browsers 讓你可以測試你的網頁設計在不同瀏覽器上呈現的樣子,對於網站製作者來說是一個不可多得的好網站!使用方法很簡單,僅須在中間的框框中輸入網址(注意後面必須要有檔名,如 index.htm, index.php 等等),然後點選 Start ,即可選擇您想使用哪些瀏覽器測試,接著等待一段時間後(上方會顯示還須等待多久),重新整理網頁即可看到縮圖

摘自:http://www.freegroup.org/free-online-tools-browsershots

2008年7月26日 星期六

2008年7月22日 星期二

[Apache]htpasswd 指令

Synopsis
htpasswd [ -c ] [ -m ] [ -D ] passwdfile username

htpasswd -b [ -c ] [ -m | -d | -p | -s ] [ -D ] passwdfile username password

htpasswd -n [ -m | -d | -s | -p ] username

htpasswd -nb [ -m | -d | -s | -p ] username password


Options
-b
Use batch mode; i.e., get the password from the command line rather than prompting for it. This option should be used with extreme care, since the password is clearly visible on the command line.
-c
Create the passwdfile. If passwdfile already exists, it is rewritten and truncated. This option cannot be combined with the -n option.
-n
Display the results on standard output rather than updating a file. This is useful for generating password records acceptable to Apache for inclusion in non-text data stores. This option changes the syntax of the command line, since the passwdfile argument (usually the first one) is omitted. It cannot be combined with the -c option.
-m
Use MD5 encryption for passwords. On Windows, Netware and TPF, this is the default.
-d
Use crypt() encryption for passwords. The default on all platforms but Windows, Netware and TPF. Though possibly supported by htpasswd on all platforms, it is not supported by the httpd server on Windows, Netware and TPF.
-s
Use SHA encryption for passwords. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif).
-p
Use plaintext passwords. Though htpasswd will support creation on all platforms, the httpd daemon will only accept plain text passwords on Windows, Netware and TPF.
-D
Delete user. If the username exists in the specified htpasswd file, it will be deleted.
passwdfile
Name of the file to contain the user name and password. If -c is given, this file is created if it does not already exist, or rewritten and truncated if it does exist.
username
The username to create or update in passwdfile. If username does not exist in this file, an entry is added. If it does exist, the password is changed.
password
The plaintext password to be encrypted and stored in the file. Only used with the -b flag.

Exit Status
htpasswd returns a zero status ("true") if the username and password have been successfully added or updated in the passwdfile. htpasswd returns 1 if it encounters some problem accessing files, 2 if there was a syntax problem with the command line, 3 if the password was entered interactively and the verification entry didn't match, 4 if its operation was interrupted, 5 if a value is too long (username, filename, password, or final computed record), 6 if the username contains illegal characters (see the Restrictions section), and 7 if the file is not a valid password file.


Examples
htpasswd /usr/local/etc/apache/.htpasswd-users jsmith

Adds or modifies the password for user jsmith. The user is prompted for the password. If executed on a Windows system, the password will be encrypted using the modified Apache MD5 algorithm; otherwise, the system's crypt() routine will be used. If the file does not exist, htpasswd will do nothing except return an error.

htpasswd -c /home/doe/public_html/.htpasswd jane

Creates a new file and stores a record in it for user jane. The user is prompted for the password. If the file exists and cannot be read, or cannot be written, it is not altered and htpasswd will display a message and return an error status.

htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve

Encrypts the password from the command line (Pwd4Steve) using the MD5 algorithm, and stores it in the specified file.


摘自:http://httpd.apache.org/docs/2.0/programs/htpasswd.html

2008年7月21日 星期一

千萬不要買-Hawk 雷之雕 OFFICE雷射滑鼠



小弟在2008/4/1買了這支滑鼠,
在2008/7/21宣告故障!!

讓我對 逸盛科技 的品管真的是大失所望,
我想各位看倌們應該不曾用過三個月就故障的滑鼠吧!

我只能說,我以後再也不會買Hawk的產品了,
Hawk == 爛!已深深的烙印在我的心中...

PS:我還得自費郵資將這不良品送修!打去問客服,還要被罵!真的是自討苦吃...

但從這一間公司的客服,就可以間接了解這公司的對於品質的要求有多高。

2008年7月19日 星期六

Everyday Best Practices of PHP Development

http://www.slideshare.net/weierophinney/everyday-best-practices-of-php-development

2008年7月16日 星期三

FTP傳輸模式

Ftp傳輸有兩種mode 一種是Active mode 二是Passive mode
要了解這兩個模式的不同﹐先得了解 FTP 的連線是怎樣建立的﹕

1)
在Active 模式下﹕
1﹐FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21
建立連線﹐這是命令通道的建立。
2﹐client 用一個 port 命令告訴 server 另一個高於 1024 的 port 做數據通道。
3﹐然後 server 用 port 20 和剛才 client 所告知的 port 建立數據連線。請注意﹐
這是從 server 到 client 的連線﹐TCP 封包會有一個 SYN 標籤。
4﹐client 會確認數據通道連接﹐這個封包會有一個 ACK 標籤。
5﹐開始數據傳送。

2)
在 passive 模式下﹕
1﹐FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21
建立連線﹐這是命令通道的建立。
2﹐client 送一個 PASV 命令給 server﹐要求建立 passive 模式。
3﹐server 然後像上面所述的正常模式第 2 步驟那樣﹐挑一個高於 1024 的 port 告
訴 client 做數據通道。
4﹐然後 client 用另一個高於 1024 的 port 呼叫剛才 server 告知的 port 來建立
數據通道。此時封包帶 SYN 標籤。
5﹐server 確認後回應一個 ACK 封包。
6﹐開始數據傳送。

通常從 FTP 下載檔案的時候,會使用兩個連接。一個是命令用,另一個是檔案,命令是由本地端設定,資料是由伺服器設定。在一些防火牆或代理伺服器會使兩個連接都在本地端設定。而當本地端送出 PASV command 時,伺服器便必須使用 passive mode 來接收。

如果您發現您的FTP程式可以連上FTP server,卻無法檢視server內的檔案與目錄,請您先確認一下您的FTP程式相關設定是否正確。特別提醒您,您必須勾選FTP程式的passive功能,這樣才可以正常連線。(如果您的FTP本身沒有支援此功能,建議您更新版本即可)。

2008年7月5日 星期六

PHP程式師都應該會用的五個工具

在參與了幾個大型PHP項目,寫了很多PHP代碼以後,我發現很多工具可以提高代碼品質,簡化發佈,使得做為PHP開發人員的生涯變得輕鬆許多。許多這樣的工具可能已經為大家所用。但是,由於一些人甚至沒有注意到這些工具的存在,我會從此開始,好了,不說廢話,下面是我認為所有PHP程式師應該知道的工具列表。

Phing - 一個專案構建系統
Phing 是一個基於Apache ANT 的專案構建系統。它的名字是一個拗口的語句首字母縮寫 - PHing Is Not GNU make 。Phing可以做傳統構建系統比如 GNU make 能做的任何事情,同時沒有陡峭的學習曲線。
在phing(以及其他的構建系統)背後的思想是評估一系列相關性,然後執行一系列PHP類去正確的安裝和配置一個應用系統。構建過程用一個簡單的XML設定檔控制。Out of the box, phing內置可以執行一系列替換(比如:在你的開發版本和產品版本間改變include路徑)、執行SQL語句、移動和複製檔、運行外部腳本等等。通過擴展包含在發行包中的“task”類,你也可以創造自己的定制任務。
對任何需要在超過一台伺服器上部署大型PHP應用的人來世,Phing是一個無價之寶。同時我發現它對簡單的PHP腳本也是很有用的。

Xdebug - 調試和分析工具
Xdebug 是幫助你調試和分析腳本的一個PHP擴展。Xdebug中最有用的特性是在啟動後顯示的新注意資訊、警告資訊和錯誤資訊。如果一個腳本不能正常運行,Xdebug將會輸出關於錯誤資訊的完整堆跟蹤 ,會附帶函數名稱、參數值、原始檔案和行號。這對於厭倦了PHP默認只帶的可憐的錯誤報告功能的程式師是一個值得歡迎的特性。

這個擴展有很多更先進的功能,允許開發人員進行代碼覆蓋率分析,收集分析資訊以及互動式地調試腳本。profiling functionality 功能尤其有用。分析器使用一個普通的輸出檔案格式,允許你使用象 KCacheGrind 這樣的工具快速發現你代碼中的瓶頸。對任何嚴肅的開發人員而言,一個好的分析器是基本工具,它使得你妥善優化你的代碼,同時避免過早優化帶來的危害。

PHPUnit - 單元測試框架
PHPUnit 是一個羽量級的PHP測試框架。它是在PHP5下面的 JUnit 3.8.1 完整移植,是xUnit 測試框架家族的一員(它們基於軟體模式 先鋒 Kent Beck 的設計)。
單元測試是幾個現代敏捷開發方法的基礎,使得PHPUnit成為許多大型PHP項目的關鍵工具。這個工具也可以被前面討論的Xdebug擴展用來生成代碼覆蓋率報告 ,並且可以與phing集成來自動測試。

Propel - ORM(物件關係映射)框架 網頁教學網
Propel是一個PHP5下面的物件關係映射(ORM)框架,它起源於Apache Torque項目。它提供了一個複雜但是易用的資料庫抽象層,使得你可以在PHP中象使用普通類和物件一樣得使用資料庫實體。Propel允許你使用一種簡單的XML格式定義你的資料庫,這個XML檔被用來映射資料庫,生成應用中使用的靜態類。 網頁教學網
Propel被內嵌於流行的Symfony PHP框架 (還有其他的),它使得代碼更靈活、模組化以及可移植。這個項目有The project has 出色的文檔,以及很棒的支持社區。

phpMyAdmin / phpPgAdmin - 基於web的資料庫管理系統
歷史有點長可是還是很有用,phpMyAdmin是對於任何資料庫(對應PostgreSQL和SQLite是phpPgAdmin 和 phpSQLiteAdmin)最有用的管理工具之一。它有助於做每一件事情 - 從為了調試應用去創建和刪除資料庫到做備份。安裝它通常是我在一個LAMP伺服器上面安裝完 Apache, PHP和MySQL後做的第一件事情。如果你使用MySQL,不知何故還沒聽說過它,那麼現在就安裝 。


其他工具
還有很多優秀的工具用以符合各種需要,説明PHP開發者創建一個豐富的開發環境 — 我希望我可以說到所有這些工具。我發現對自己有用的工具有PHP Beautifier, Spyc, Creole和Smarty。我確信還有很多我忘記或者沒聽說過的有用工具。因此,如果你知道某個我遺漏的PHP開發偉大工具,請留言讓我(以及所有人)知道!

摘自:http://www.webjx.com/php/php_2007_11_09_850.html

2008年7月4日 星期五

【轉貼】Subversion權限設定之詳細解說

1   背景假設

廈門央瞬公司是一家電子元器件設備供應商,其中有個ARM部門,專門負責ARM晶片的方案設計、銷售,並在北京、上海各設立了一個辦事處。對於工作日志,原先採用郵件方式發給經理,但是這種方式有個缺點,那就是不具備連續性,要看以前的日誌必須一封一封郵件去查看,很麻煩。於是就想到利用 Subversion, 讓員工在自己電腦上編輯日誌,然後利用svn傳送回來,既方便員工自己編寫日誌,又方便對日誌的歸檔處理,而且提交日誌的時候只需要執行一下 svn update 即可,比發送郵件還要簡單的多。


 



  • svn伺服器相關資訊


    • 伺服器地址: 192.168.0.1

    • 伺服器OS: MS Windows 2000 Server Edition 中文版

    • 代碼庫本地目錄: D:\svn\arm


  • arm部門文檔的目錄結構如下:

  • arm                 部門名稱

  • ├─diary           工作日志目錄

  • │  ├─headquarters    總部工作日志目錄

  • │  ├─beijing         北京辦日誌目錄

  • │  └─shanghai        上海辦日誌目錄

  • ├─ref             公司公共檔參考目錄

  • └─temp            暫存檔案目錄

  • 人員情況


    • morson,公司總經理,其實他不必親自看任何東西,就連部門經理們的每週總結都不一定看。但是為了表示對他的尊敬,以及滿足一下他的權力欲,還是給他開放了“閱讀所有文檔”的許可權





    • michael,arm事業部的部門經理,沒事的時候喜歡弄點兒新技術,用svn來管理日誌,就是他相處來的主意

    • scofield,北京辦人員,老員工,為人油滑難管

    • lincon,上海辦人員,老員工,大老實人一個

    • linda,總部協調員、秘書,文筆不錯,長得也不錯

    • rory,單片機技術員,技術支援


  • 存取權限需求分析


    • 允許總經理讀取所有檔

    • 除部門經理外,所有其他人員,均只能看到本辦事處人員工作日志

    • 不允許匿名訪問

    • ref目錄只允許經理和秘書寫,對其他人唯讀

    • temp目錄人人都可以寫



2   建立代碼庫

在伺服器 D:\svn 目錄下,建立 arm 代碼庫,命令如下:

D:\svn>svnadmin create arm

在客戶機 F:\temp 目錄下,建立好上述目錄結構

用命令 F:\temp>svnimportarmsvn://192.168.0.1/arm 導入結構

【注意點:關於導入時候的細微差別】


 


3   編輯代碼庫基礎設定檔

編輯代碼庫 arm\conf\svnserve.conf 文件,如下:

[general]

password-db = passwd.conf

anon-access = none

auth-access = write

authz-db = authz.conf


 


4   管理用戶帳號

新建代碼庫 arm\conf\passwd.conf 文件,如下:

[users]

morson = ShowMeTheMoney

michael = mysecretpassword

scofield = hellolittilekiller

lincon = asyouknows111

rory = 8809117

linda = IlikeWorldCup2006


 


5   建立目錄存取權限控制檔

新建代碼庫 arm\conf\authz.conf 檔,內容如下:

[groups]

g_vip = morson

g_manager = michael

g_beijing = scofield

g_shanghai = lincon

g_headquarters = rory, linda

g_docs = linda

[arm:/]

@g_manager = rw

* = r

[arm:/diary/headquarters]

@g_manager = rw

@g_headquarters = rw

@g_vip = r

* =

[arm:/diary/beijing]

@g_manager = rw

@g_beijing = rw

@g_vip = r

* =

[arm:/diary/shanghai]

@g_manager = rw

@g_shanghai = rw

@g_vip = r

* =

[arm:/ref]

@g_manager = rw

@g_docs = rw

* = r

[arm:/temp]

* = rw


 


6   測試

在伺服器上,打開一個 DOS Prompt 視窗,輸入如下指令:

svn co svn://127.0.0.1/arm --no-auth-cache --username rory --password 8809117

我們應該得到如下目錄結構:

arm

├─diary

│  └─headquarters

├─ref

└─temp

然後修改ref目錄下任意檔並提交,伺服器將會報錯“Access deni”


 


深入

本章將詳細介紹前一章所涉及的兩個設定檔, svnserve.conf 和 authz.conf,通過對配置逐行的描述,來闡明其中的一些細節含義。

這裡首先要注意一點,任何設定檔的有效配置行,都不允許存在前置空格,否則程式會無法識別。也就是說,如果你直接從本文的純文字格式中拷貝了相關的配置行過去,需要手動將前置的4個空格全部刪除。當然了,如果你覺得一下子要刪除好多行的同樣數目的前置空格是一件苦差使,那麼也許 UltraEdit 的“Column Mode”編輯模式,可以給你很大幫助呢。


 


1   svnserve.conf

arm\conf\svnserve.conf 文件,是 svnserve.exe 這個伺服器進程的設定檔,我們逐行解釋如下。

首先,我們告訴 svnserve.exe,用戶名與密碼放在 passwd.conf 文件下。當然,你可以改成任意的有效檔案名,比如默認的就是 passwd:

password-db = passwd.conf

接下來這兩行的意思,是說只允許經過驗證的用戶,方可存取碼庫。 那麼哪些是“經過驗證的”用戶呢?噢,當然,就是前面說那些在 passwd.conf 檔裡面持有用戶名密碼的傢伙。這兩行的等號後面,目前只允許 read write none 三種值,你如果想實現一些特殊的值,比如說“read-once”之類的,建議你自己動手改原始程式碼,反正它也是自由軟體:

anon-access = none

auth-access = write

接下來就是最關鍵的一句呢,它告訴 svnserve.exe,專案目錄存取權限的相關配置是放在 authz.conf 文件裡:

authz-db = authz.conf

當然,svn 1.3.2 引入本功能的時候,系統預設使用 authz 而不是 authz.conf 作為設定檔。不過由於鄙人是處女座的,有著強烈的完美主義情結,看著 svnserve.conf 有尾碼而 passwd 和 authz 沒有就是不爽,硬是要改了。


 


2   authz.conf 之用戶分組

arm\conf\authz.conf 檔的配置段,可以分為兩類,``[group]`` 是一類,裡面放置著所有使用者分組資訊。其餘以 [arm:/] 開頭的是另外一類,每一段就是對應著專案的一個目錄,其目錄相關許可權,就在此段內設置。

首先,我們將人員分組管理,以便以後由於人員變動而需要重新設置許可權時候,儘量少改動東西。我們一共設置了5個用戶分組,分組名稱統一採用 g_ 首碼,以方便識別。當然了,分組成員之間採用逗號隔開:

[groups]

# 任何想要查看所有文檔的非本部門人士

g_vip = morson

# 經理

g_manager = michael

# 北京辦人員

g_beijing = scofield

# 上海辦人員

g_shanghai = lincon

# 總部一般員工

g_headquarters = rory, linda

# 小秘,撰寫文檔

g_docs = linda

注意到沒有, linda 這個帳號同時存在“總部”和“文檔員”兩個分組裡面,這可不是我老眼昏花寫錯了,是因為 svnserve.exe 允許我這樣設置。它意味著,這個傢伙所擁有的許可權,將會比他的同事 rory 要多一些,這樣的確很方便。具體多了哪些呢?請往下看!


 


3   authz.conf 之專案根目錄

接著,我們對專案根目錄做了限制,該目錄只允許arm事業部的經理才能修改,其他人都只能眼巴巴的看著:

[arm:/]

@g_manager = rw

* = r


 



  • [arm:/] 表示這個目錄結構的相對根節點,或者說是 arm 專案的根目錄

  • 這裡的 @ 表示接下來的是一個組名,不是用戶名。你當然也可以將 @g_manager=rw 這一行替換成 michael=rw ,而表達的意義完全一樣。

  • * 表示“除了上面提到的那些人之外的其餘所有人”,也就是“除了部門經理外的其他所有人”,當然也包括總經理那個怪老頭

  • * = r 則表示“那些人只能讀,不能寫”


 


4   authz.conf 之項目子目錄

然後,我們要給總部人員開放日誌目錄的讀寫許可權:

[arm:/diary/headquarters]

@g_manager = rw

@g_headquarters = rw

@g_vip = r

* =


 



  • 我敢打賭,設計svn的傢伙們,大部分都是在 unix/linux 平臺下工作,所以他們總喜歡使用 / 來標識子目錄,而完全忽視在 MS Windows 下是用 \ 來做同樣的事情。所以這兒,為了表示 arm\diary\headquarters 這個目錄,我們必須使用 [arm:/diary/headquarters] 這樣的格式。

  • 這裡最後一行的 *= 表示,除了經理、總部人員、特別人士之外,任何人都被禁止訪問本目錄。這一行是否可以省略呢?

  • 之所以這兒需要將 @g_vip=r 一句加上,就是因為存在上述這個解釋。如果說你沒有明確地給總經理授予讀的權力,則他會和其他人一樣,被 * 給排除在外。

  • 如果眾位看官中間,有誰玩過防火牆配置的話,可能會感覺上述的配置很熟悉。不過這裡有一點與防火牆配置不一樣,那就是各個配置行之間,沒有 先後順序 一說。也就是說,如果我將本段配置的 *= 這一行挪到最前面,完全不影響整個配置的最終效果。

  • 請注意這兒,我們並沒有給 arm\diary 目錄設置許可權,就直接跳到其子目錄下進行設置了。我當然是故意這樣的,因為我想在這兒引入“繼承”的概念。

  • 許可權具備繼承性 任何子目錄,均可繼承其父目錄的所有權限,除非它自己被明確設置了其他的許可權。也就是說,在 arm 目錄設置許可權後, arm\diary 目錄沒有進行設置,就意味著它的許可權與 arm 目錄一樣,都是只有經理才有權讀寫,其他人只能幹瞪眼。

  • 【 * = 是否可以省略】【用例子引入覆蓋】【單用戶許可權的繼承問題】【父目錄許可權集成與全面覆蓋問題】


 


現在來看看

好了,我們現在掌握了“繼承”的威力,它讓我們節省了不少敲鍵盤的時間。可是現在又有一個問題了,

屬性具備覆蓋性質子目錄若設置了屬性,則完全覆蓋父目錄。


 


5   authz.conf 的其他注意點



  1. 父目錄的 r 許可權,對子目錄 w 許可權的影響


把這個問題專門提出來,是因為在1.3.1及其以前的版本裡面,有個bug,即為了子目錄的寫許可權,專案首目錄必須具備讀許可權。因此現在使用了1.3.2版本,就方便了那些想在一個代碼庫存放多個相互獨立的專案的管理員,來分配許可權了。比如說央舜公司建立一個大的代碼庫用於存放所有員工日誌,叫做 diary,而arm事業部只是其中一個部門,則可以這樣做:

[diary:/]

@g_chief_manager = rw

[diary:/arm]

@g_arm_manager = rw

@g_arm = r

這樣,對於所有arm事業部的人員來說,就可以將 svn://192.168.0.1/diary/arm 這個URL當作根目錄來進行日常操作,而完全不管它其實只是一個子目錄,並且當有少數好奇心比較強的人想試著 checkout 一下 svn://192.168.0.1/diary 的時候,馬上就會得到一個警告“Access deni”,哇,太酷了。



  1. 默認許可權


如果說我對某個目錄不設置任何許可權,會怎樣?馬上動手做個試驗,將:

[diary:/]

@g_chief_manager = rw

改成:

[diary:/]

# @g_chief_manager = rw

這樣就相當於什麼都沒有設置。在我的 svn 1.3.2 版本上,此時是禁止任何訪問。也就是說,如果你想要讓某人訪問某目錄,你一定要顯式指明這一點。這個策略,看起來與防火牆的策略是一致的。



  1. 唯讀許可權帶來的一個小副作用


若設置了:

[arm:/diary]

* = r

則svnserve認為,任何人,都不允許改動diary目錄,包括刪除和改名,和新增。

也就是說,如果你在專案初期創建目錄時候,一不小心寫錯目錄名稱,比如因拼寫錯誤寫成 dairy,以後除非你改動 authz.conf 裡面的這行設置,否則無法利用 svn mv 命令將錯誤的目錄更正。


 


改進


1   對中文目錄的支援

上午上班的時候,Morson 來到 Michael 的桌子前面,說道:“你是否可以將我們的北京辦、上海辦目錄,改成用中文的,看著那些拼音我覺得很難受?” Michael 心想,還好這兩天剛瞭解了一些與 unicode 編碼相關的知識,於是微笑地回答:“當然可以,你明天下午就可以看到中文目錄名稱了。”



  1. 使用 svn mv 指令,將原來的一些目錄改名並 commit 入代碼庫,改名後的目錄結構如下:

  2. arm

  3. ├─工作日志

  4. │  ├─總部人員

  5. │  ├─北京辦

  6. │  └─上海辦

  7. ├─公司公共檔參考目錄

  8. └─暫存檔案存放處

  9. 修改代碼庫的 authz.conf 檔,將相應目錄逐一改名

  10. 使用 UltraEdit 將 authz.conf 檔轉換成不帶 BOM 的 UTF-8 格式


將設定檔轉換成 UTF-8 格式之後,Subversion 就能夠正確識別中文字元了。但是這裡需要注意一點,即必須保證 UTF-8 檔不包含 BOM 。BOM 是 Byte Order Mark 的縮寫,指 UNICODE 檔頭部用於指明高低位元組排列順序的幾個字元,通常是 FFFE ,而將之用 UTF-8 編碼之後,就是 EFBBBF 。由於 UTF-8 檔本身不存在位元組序問題,所以對 UTF-16 等編碼方式有重大意義的 BOM,對於 UTF-8 來說,只有一個作用——表明這個檔是 UTF-8 格式。由於 BOM 會給文本處理帶來很多難題,所以現在很多軟體都要求使用不帶 BOM 的 UTF-8 檔,特別是一些處理文本的軟體,如 PHP、 UNIX 指令檔等,svn 也是如此。

目前常用的一些文本編輯工具中,MS Windows 自帶的“記事本”裡面,“另存為”菜單保存出來的 UTF-8 格式檔,會自動帶上 BOM 。新版本 UltraEdit 提供了選項,允許使用者選擇是否需要 BOM,而老版本的不會添加 BOM。請各位查看一下自己常用的編輯器的說明文件,看看它是否支持這個功能。

利用 UltraEdit ,我們可以將 BOM 去掉。方法是,首先利用“UTF-8 TO ASCII”功能表將檔轉換成本地編碼,通常是GB2312碼,然後再使用“ASCII TO UTF-8(UNICODE Editing)”來轉換到 UTF-8 即可。



摘自:http://www.blogjava.net/coldtear/archive/2006/09/05/67808.aspx

補充:

在上一篇帖子中介紹了Subversion版本控制軟體的安裝方法,另外還轉貼了一篇Subversion許可權控制的文章,出於工作的需要和學習態度的角度,還是希望自己到手來體驗Subversion許可權控制的魅力。

        如果對Subversion安裝有疑問的話,請看作者另一篇帖子:http://www.blogjava.net/coldtear/archive/2006/08/04/61668.aspx,在這篇帖子裡詳細介紹了Subversion的安裝步驟。

        在作者看了轉貼(《Subversion許可權詳解》)文章後,按照文章中的方法進行設置後,出現了一些問題,總是提示沒有許可權這樣的錯誤,錯誤提示為:“錯誤 Authorization failed”,對設定檔進行一些修改後,終於可以實現許可權控制了,這裡將作者碰到問題後的解決辦法寫出來,希望能給和我碰到同樣問題的朋友些幫助。

        如果您按照http://www.blogjava.net/coldtear/archive/2006/09/05/67808.aspx這篇文章設置後,也提示沒有許可權的錯誤,那麼請您按照下面的方法操作。

修改conf\authz檔如下,主要是路徑的修改:

[groups]

g_vip = morson

g_manager = michael

g_beijing = scofield

g_shanghai = lincon

g_headquarters = rory, linda

g_docs = linda

#這裡多加了一個根目錄的許可權控制描述

[/]

@g_manager = rw

* =



#以下部分對路徑做了一些修改

[/arm]

@g_manager = rw

* = r



[/arm/diary/headquarters]

@g_manager = rw

@g_headquarters = rw

@g_vip = r

* =



[/arm/diary/beijing]

@g_manager = rw

@g_beijing = rw

@g_vip = r

* =



[/arm/diary/shanghai]

@g_manager = rw

@g_shanghai = rw

@g_vip = r

* =



[/arm/ref]

@g_manager = rw

@g_docs = rw

* = r



[arm:/temp]

* = rw

經過這樣的修改後,訪問時不會再報沒有許可權的錯誤,可以定制自己的許可權控制了。

Subversion對中文目錄的支援是非常好的,按照文章中的方法,可以很輕鬆的進行中文目錄的許可權控制,

當然,在保存authz檔時一定不要忘記選擇保存為“UTF-8 無BOM”。

Subversion 實務建議

Subversion 實務建議


蔡煥麟

huanlin.tsai at msa.hinet.net

Revision: 1.0  (Mar-18-2005)




實務 1. 備份檔案庫


一旦你使用了 Subversion 來管理版本,檔案庫就成為你開發時最重要的資產之一了,因此最好利用排程工具,定期將檔案庫備份,如果你的檔案庫都放在一個統一的目錄下,例如:d:/svn,就只要完整備份這個目錄就行了。




實務 2. 盡量熟悉命令列工具


儘管你大部分時候都是使用視覺化工具(例如:TortoiseSVN)來執行版本控制的日常工作,熟悉命令列工具仍然非常有用,特別是當你要執行一些批次作業時。




實務 3. 建立測試環境


有些團隊可能是用 nightly build 或 weekly build 的建置方式,然後對新建置的版本進行測試,這種方式可能是由專人負責建置,然後把新版的程式部署到測試機器上。


另一種可能的情況是,測試人員隨時都可以測試最新版的程式,也就是每當程式修改好,check in 到檔案庫之後,測試人員就要能測到最新版的程式。這種需求可以透過在測試機器上建立排程來達到,排程的工作是執行一個批次檔,而這個批次檔裡面就是些 Subversion 的 update 命令。例如:




REM 此批次檔用來更新測試機器的程式檔案

c:
cd\MyProject\BookWeb\BookWeb.war
svn update -N

cd Image
svn update
cd ..

cd Script
svn update
cd ..

cd Jsp
svn update
cd ..

cd WEB-INF\classes
svn update
cd ..\lib
svn update
cd ..




這種方式要注意一個問題,就是測試機器上的應用程式目錄裡面,每個目錄都會有一個隱藏的 .svn 目錄。如果要把測試機器上的檔案部署到用戶端,並且排除 .svn 目錄,就要使用 Subversion 的匯出(export)功能。





實務 4. 只 check in 完成的檔案


程式還有編譯錯誤及警告時,不要 check in 到檔案庫。一方面是基於測試的理由(程式當然是可以運作才放上去測試),另一方面,是因為這樣做可能會對別人造成困擾,因為別的開發人員可能有將整個專案 的程式碼取出,那麼每當他在本機上建置專案時,就會出現一堆編譯錯誤,包括他自己的程式和你的程式的錯誤。如果每個人都在程式還未能通過編譯時就 check in,那麼每次編譯專案產生的錯誤訊息將多到令人無法忍受。




實務 5. 每次 check in 時,輸入摘要事項


每當我們要 check in 檔案時,Subversion 會要求我們輸入一段文字,用來簡單說明這次 check in 做了哪些改變。你可以把重要的備註事項寫進去,以後如果要回頭比對版本,可以幫助你更找到需要的版本。




實務 6. 不要保留沒用的註解


以往沒有版本控制時,我們在修改程式時,常常會把一段程式碼註解掉,以便日後反悔時,可以恢復。但是這類註解掉的程式碼往往會一直留在那裡,直到程式改了好幾個版本,已經沒有利用價值以後,成為程式裡的一堆礙眼的垃圾。


有了版本控制以後,因為可以隨時回到任一個歷史版本,你可以放心的把不要的程式碼刪除,再配合實務 5,以後要恢復歷史版本就很容易了。




實務 7. 不要留下多餘的檔案


以往沒有使用版本控制系統時,我們有時候會自己做一點版本管理,例如修改 Foo.java 之前,先把它複製成一個新的檔案,並且加上序號,例如:Foo_1.java,然後再修改 Foo.java。現在有了版本控制系統,可以不用這樣了,免得多了一堆垃圾檔案。


我曾看過一種情況,就是有人還是習慣用附加編號的方式自己備份舊版的檔案,而且跟新版的檔案放在同一個目錄下,另一方面,他又習慣把程式的檔名用序號來命 名(懶得想個適切的檔名),結果備份的檔名和開發中的檔名都是用序號來命名,有一天某人要清理專案目錄中的垃圾時,就把所有帶序號的檔名都砍了,造成程式 無法編譯或執行。還好我們有時光機器可以回到過去,要不然就麻煩了。




實務 8. 檔名大小寫第一次就決定好


如果你的作業系統不區分檔名的大小寫,例如:Windows,你最好第一次就把檔案名稱的大小寫確定下來。否則如果日後要改檔名,而且新的檔名和舊的檔名只有大小寫的不同,例如:myprg.java 和 MyPrg.java,你在送交和更新時可能會碰到一些麻煩。




實務 9. 指定忽略的檔案


在一個專案裡面,可能有些目錄裡面的某些檔案是你不希望加入檔案庫的,因此你在第一次匯入檔案庫之前,最好先把這些檔案搬移到別處,等到匯入檔案庫之後,在把它們搬回來,並且將這些檔案加入忽略清單。 以 Web 應用程式為例,參考下列步驟:




  1. 先大致建構出網站的雛形,檔案目錄結構大致底定之後,才將檔案匯入檔案庫。




  2. 建立檔案庫,並且準備匯入檔案庫。有一些檔案可能是你不希望進行版本控管的,因為當其他小組成員更新這些檔案之後,可能會造成他的開發環境出問題,例如: 無法編譯或執行程式等。不管是什麼原因,只要你有不想要放入檔案庫的檔案,就在匯入檔案庫之前,先把整個專案的檔案複製一份到一個暫存目錄下(c:\ temp),然後把 c:/temp 中所有不想控管版本的檔案刪除掉,然後再匯入檔案庫。匯入完成後把 c:/temp 底下的檔案全部刪除。




  3. 取出專案。先把整個專案的檔案*搬移*到 c:/temp 底下,接著從檔案庫取出(check out)專案,假設取出至 d:/myprj 目錄下。




  4. 把 c:/temp 底下的所有檔案複製到 d:/myprj,注意所有已經存在的檔案都不要覆蓋掉,亦即只複製新的檔案過去。這些新的檔案並未加入版本控制,你可以把它們加入忽略清單(ignore list)裡面,以後這些檔案就不會被存入檔案庫了。





摘自:http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3200.aspx

2008年6月30日 星期一

[Apache]RewriteRule regular expressions

Text:
. Any single character
[chars] Character class: One of chars
[^chars] Character class: None of chars
text1|text2 Alternative: text1 or text2

Quantifiers:
? 0 or 1 of the preceding text
* 0 or N of the preceding text (N > 0)
+ 1 or N of the preceding text (N > 1)

Grouping:
(text) Grouping of text
(either to set the borders of an alternative or
for making backreferences where the Nth group can
be used on the RHS of a RewriteRule with $N)

Anchors:
^ Start of line anchor
$ End of line anchor

Escaping:
\char escape that particular char
(for instance to specify the chars ".[]()" etc.)

2008年6月29日 星期日

[Debug]jQuery Validation Plugins的minLength無法設custom messages

原來minLength要用小寫的minlength

$("#activeVideoForm").validate({
rules: {
owner_mobile: {
required: true,
number: true,
minLength: 5
}
},
messages: {
owner_mobile: {
required: "*請輸入聯絡手機!",
number: "*請輸入正確的手機號碼!",
minLength: "*請輸入正確的手機號碼!"
}
}
});


$("#activeVideoForm").validate({
rules: {
owner_mobile: {
required: true,
number: true,
minlength: 5
}
},
messages: {
owner_mobile: {
required: "*請輸入聯絡手機!",
number: "*請輸入正確的手機號碼!",
minlength: "*請輸入正確的手機號碼!"
}
}
});

2008年6月26日 星期四

[Javascript]pause, wait, sleep 函數function


/*
* This function will not return until (at least)
* the specified number of milliseconds have passed.
* It does a busy-wait loop.
*/
function pause(numberMillis) {
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true) {
now = new Date();
if (now.getTime() > exitTime)
return;
}
}

2008年6月23日 星期一

[Javascript]PHP to Javascript Project: php.js

This article is part of the 'Porting PHP to Javascript' Project, which aims to decrease the gap between developing for PHP & Javascript.

A lot of people are familiar with PHP's functions, and though Javascript functions are often quite similar, some functions may be missing or addressed differently. The Javascript implementations should be as compliant with the PHP versions as possible, a good indication is that the PHP function manual could also apply to the Javascript version.

Porting crucial PHP functions to Javascript can be fun & useful. Currently some PHP functions have been added, but readers are encouraged to contribute and improve functions by adding comments. Eventually the goal is to save all the functions in one php.js file and make it publicly available for your coding pleasure.

If you choose to contribute, let me know how you want to be credited in the function's comments. You may also want to subscribe to RSS so you receive updates whenever new functions are posted.

download:php.js

2008年6月20日 星期五

[FreeBSD]PHP PEAR安裝

Setp 1.
安裝 Apache + MySQL + PHP 的基本 web 環境:

#cd /usr/ports/database/mysql50-server # 安裝 MySQL 50
#make install clean

#cd /usr/ports/www/apache20 # 安裝 Apache 20
#make install clean

#cd /usr/ports/lang/php5 # 安裝 PHP5
#make install clean # 我只有選擇下列相關套件一併安裝
[X] CLI Build CLI version
[X] CGI Build CGI version
[X] APACHE Build Apache module
[X] FASTCGI Enable fastcgi support (CGI only)
[X] PATHINFO Enable path-info-check support (CGI only)

#cd /usr/ports/lang/php5-extensions # 安裝 PHP5-Extensions
#make config # 安裝前先手動選擇所需要的延伸套件
[X] CTYPE ctype functions
[X] DOM DOM support
[X] GD GD library support
[X] GETTEXT gettext library support
[X] HASH HASH Message Digest Framework
[X] ICONV iconv support
[X] MYSQL MySQL database support
[X] PCRE Perl Compatible Regular Expression support
[X] PDO PHP Data Objects Interface (PDO)
[X] POSIX POSIX-like functions
[X] SESSION session support
[X] SIMPLEXML simplexml support
[X] SQLITE sqlite support
[X] TOKENIZER tokenizer support
[X] XML XML support
[X] XMLREADER XMLReader support
[X] XMLWRITER XMLWriter support
[X] ZLIB ZLIB support

#make install # 因為 Extensions 有選 GD library 所以必須要選擇加裝 T1LIB 及 TRUETYPE 同時 SQLITE 也必須選擇是否開啟 UTF-8 編碼

Options for php5-gd 5.1.6
[X] T1LIB Include T1lib support
[X] TRUETYPE Enable TrueType string function

Options for php5-sqlite 5.1.6 # PHP 下的精簡型文字資料庫 Text Database
[X] UTF8 Enable UTF-8 support

#vi /etc/rc.conf # 編輯 FreeBSD 的開機設定檔,設定 mysql 及 apache 開機自動啟動

mysql_enable="YES"
apache2_enable="YES"

#vi httpd.conf # 編輯 Apache 的設定檔,加入下列幾行:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
DirectoryIndex index.php

#cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini # 編輯 PHP5 的設定檔將複製 php.ini-dist 到 php.ini

#vi php.ini # 如果必須要相容舊語法可將 Off 改為 On
register_globals = On

#apachectl # 重新啟動 apache

#reboot # 重開機讓 MySQL 啟動

Setp 2.

安裝 PEAR 開發環境及基本套件:
#cd /usr/ports/devel/pear # 安裝 PEAR 套件管理指令 ( 這邊只是 PEAR 的套件管理指令,PEAR 的基本套件要等裝完 lynx 才可加裝 )
#make install clean

#vi /usr/local/etc/php.ini # 將 pear 的絕對路徑加到 php.ini 設定檔中

include_path = ".:/usr/local/share/pear"

#cd /usr/ports/www/lynx # 安裝 lynx
#make install clean

#lynx -source http://go-pear.org | php # 安裝 PEAR 的基本套件

Welcome to go-pear!
Go-pear will install the 'pear' command and all the files needed by
it. This command is your tool for PEAR installation and maintenance.
Go-pear also lets you download and install the PEAR packages bundled
with PHP: MDB2.

If you wish to abort, press Control-C now, or press Enter to continue: 按 Enter

HTTP proxy (http://user:password@proxy.myhost.com:port), or Enter for none:: 按 Enter # ( 我無 proxy 所以跳過 )

Below is a suggested file layout for your new PEAR installation. To
change individual locations, type the number in front of the
directory. Type 'all' to change all of them or simply press Enter to
accept these locations.

1. Installation prefix : /usr/local
2. Binaries directory : $prefix/bin
3. PHP code directory ($php_dir) : $prefix/share/pear
4. Documentation base directory : $php_dir/docs
5. Data base directory : $php_dir/data
6. Tests base directory : $php_dir/tests
7. Temporary files directory : $prefix/temp
1-7, 'all' or Enter to continue: 按 Enter

The following PEAR packages are bundled with PHP: MDB2.

Would you like to install these as well? [Y/n] : y

#apachectl restart # 重新啟動 apache

#pear list # 查看 pear 已安裝的套件版本

Installed packages, channel pear.php.net:
==============================
Package Version State
Archive_Tar 1.3.1 stable
Console_Getopt 1.2 stable
MDB2 2.2.2 stable
PEAR 1.4.11 stable
XML_RPC 1.5.0 stable

Setp 3.

安裝套件並且測試安裝結果:
#chown -Rf www:www /usr/local/share/pear # 修改 pear 套件存放目錄權限
#chown www:www /usr/local/share # 修改 pear 套件目錄權限
#pear install Benchmark # 安裝一個套件來測試看看
pear/Benchmark can optionally use PHP extension "bcmath"
downloading Benchmark-1.2.6.tgz ...
Starting to download Benchmark-1.2.6.tgz (7,915 bytes)

.....done: 7,915 bytes
install ok: channel://pear.php.net/Benchmark-1.2.6

#pear list # 再次查看所有已安裝套件
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.3.1 stable
Benchmark 1.2.6 stable
Console_Getopt 1.2 stable
MDB2 2.2.2 stable
PEAR 1.4.11 stable
XML_RPC 1.5.0 stable

#cd /usr/local/share/pear/Benchmark # 查看所安裝的套件目錄
# ls -l # Benchmark 下總共有三個套件
total 30
-rw-r--r-- 1 root www 4658 9 14 17:40 Iterate.php
-rw-r--r-- 1 root www 13323 9 14 17:40 Profiler.php
-rw-r--r-- 1 root www 10095 9 14 17:40 Timer.php

#vi Timer.php # 查半 Timer.php 這個套件如何引用 Timer 裡面有說明

#vi /usr/local/www/data-dist/show.php # 寫個 php 的時間計數小程式來測試

require_once 'Benchmark/Timer.php';

$timer = new Benchmark_Timer();

$timer->start();

echo "Hello World!";

$timer->stop();

$totaltime=$timer->timeElapsed();

echo "
This Page Show Time:".$totaltime."Sec";
?>


http://xxx.xxx.xxx.xxx/show.php # 開個瀏覽器看一下 Timer 計時器是否成功

Hello World!
This Page Show Timer:0.000207185745239Sec

#pear install PEAR_Info

#vi /usr/local/www/data-dist/info.php
require_once 'PEAR/Info.php';
$pear_info = new PEAR_info();
$pear_info ->show();
?>

http://xxx.xxx.xxx.xxx/info.php # 開個瀏覽器可看見PEAR 設定檔及所安裝的套件訊息

To Add .

#pear uninstall Benchmark # 解除安裝套件
#pear help # 查看 pear 指令
<<本文引自四位的freebsd學習技術文件>>

[Browser]“取消”和“停止”流覽器事件 stopEvent

這種做法是從Bret Taylor的blog上面抄來的,原文地址在這裡(好像是,不是也別怪我。)。對於避免ajax應用中不同層的事件干擾很有用的。

先說一下“取消(cancel)”和“停止(stop)”的區別:說白了,停止就是當事件發生後,阻止它自動冒泡到父容器內;而取消則是當冒泡發生到父容器之後停止,也就是不在當前元素中回應。天哪,這東西說起來話長了,代碼說話:

function stopEvent(e) {
if (!e) e = window.event;
if (e.stopPropagation) {
e.stopPropagation();
} else {
e.cancelBubble = true;
}
}

var link = document.getElementById("link");
link.onclick = stopEvent;

以上這一段是阻止父容器事件的

function cancelEvent(e) {
if (!e) e = window.event;
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
}

var link = document.getElementById("link");
link.onclick = function(e) {
cancelEvent(e);
stopEvent(e);
}

以上這一段是阻止子元素事件的

例子位址在這裡:demo

2008年6月17日 星期二

[AppServ]安裝PEAR

第三章

▉ 3-1 PEAR套件(Package)的资讯

▓ 套件简介

PEAR最重要的就是拥有许多的程式库可供开发者免费引用,这些程式库会被包裹成套件,而且每个套件中都会放入一个名为package.xml的档案.这 是PEAR团队的规定,这个档案纪錄著程式库的档案架构,版本编号等资料,有了这个档案,程式库压缩后才有资格称为「套件」,也因为有了这个xml档, PEAR所提供的「套件管理指令」就可以很简单地管理程式库,例如:可以用指令来安装套件、刪除套件、观看套件资讯或套件升级等。


另外.关於套件的安全性方面,使用者若发现套件有问题,可以借由论坛加以讨论或回报给开发团队,他们就会快速的进行修正与改版,也因此每个套件都会有版本编号加以区分改版的过程。

详细內容请参閱〈附錄A.PEAR官方网站介绍〉会有收获的。


注意,若大家按照本文章的范例操作时,如发觉结果与我们介绍的内容有所不相同的地方,请不要觉得奇怪,那是因为PEAR套件更新的速度太快所致,我们所介绍的方法与原意是不会变的,只是过程会随套件的更改而变动。

▓ 如何得知套件的相关资讯

想下载套件或了解套件,读者可以进入PEAR官方网站(网址为http://pear.php.net),首页画面如下:





圈选的超连结是放置套件的所在,点选以后就出现如下的画面:





1号圈圈所在较粗黑的字代表套件的类別,例如:第1类叫做认证类(Authentication)。这个类別目前包含8个套件,这些套件都是用来处理登入与登出或身份认证与权限设定等。

2号圈圈所在较小的字代表套件的名称,如:Auth、Auth HTTP等等。大家可点选各套件名称进入观看更详细的套件资讯或下载套件。

至目前为止,PEAR的套件共有35大类,三百多个套件,开发套件的成员共202人,但这些数字都在持续增加中,若大家将来有一天,也想为PEAR社群的一员贡献一己之力,也可申请成为套件的开发人员。


要使用PEAR程式库,需要有以下几个基本步骤:

1.架设好网页伺服器,例如Apache,並安装好PHP与MySOL。

2.必须安装PEAR的一些基本套件,所谓的「基本套件」 就是所有PEAR套件都需要的套件,例如,除错是每一个套件都需要的,所以基本套件中就包含了除错套件,只有先安装除错的套件,其它的套件才可以顺利进行除错。

3.针对开发者的需求,安装特定的套件。例如,安装完基本套件后.若开发者想在网页中加入计算执行时间的功能,就必须用指令安装Benchmark套件,这个套件不是基本套件,必须由开发者自行安装。

4.在PHP程式中引用套件的程式库档。

以下我们来分別介绍,在Windows作业系统与类Unix作业系统下,如何安装与管理PEAR套件。


3-2 在Windows系列作业系统上PEAR的安装与管理

▓ 安装Apache+PHP+MySQL

如果您尚未建置好PHP的执行环境,建议您安装AppServ这套六合一软体,笔者就是使用AppServ来当作windows的伺服器环境。这个软体可以到http://www.appservnetwork.com/官方网站去下载。

▓ PEAR的安装方法

安装好AppServ后,就可以开始在Windows上安装PEAR的基本套件,安装过程可以分为四个步骤。
第1个步骤:进入http://pear.php.net/go-pear网站

请先连上http://pear.php.net/go-pear的网站,画面如下:





接着,将网页中的文字完全复制起来后,打开系统的附属应用程式中的记事本,将刚刚复制好的文字贴上,贴上后将档案储存于C:AppServ\www,也就 是网站根目录的位置,存挡时请注意,存档类型请选所有档案,副挡名需要为php,档名请自行命名,假设我自定存档名为pear.php,如下图:





如果您不想怎么麻烦,也可以用Dreamweaver之类的网页编辑软件,打开一个空白的PHP档,然后将http://go-pear.org复制的文字贴上并存档。


第2个步骤:安装基本套件

打开浏览器,在网址栏输入“http;//127.0.0.1复制go-pear网站档.php”或“http;//localhost/复制go- pear网站档.php”,其中所谓「复制go-pear网站档.php」就是刚刚复制储存复制文字的档案名称,在本范例中为pear.php,所以我输 入“http;//127.0.0.1/pear.php”,即可出现线上安装PEAR的网页,如下图:






第一个画面是欢迎画面,我不多做介绍了。请按NEXT >>,进行下一步的安装步骤,出现如下的画面:






这一页是用来设定PEAR套件的安装位置,最上端有一个HTTP proxy栏位,若安装者需透过proxy才能连上网路,请将proxy的IP与port号填写在此,若沒有使用proxy,此栏位可保持空白。接著有 l0项安装路径的设定,谙特別注意,其中有3个路径必须修改,分別为:

1.第l项的Install prefix,请将预设的c:AppServ﹨www改为c:AppServ﹨php,因
为我希望被安装的PEAR程式库,不要放入www中与根目錄的网页混杂在一起。

2.第9项的Filename of WebFrontend,请将预设值改为c:AppServ﹨www﹨pear﹨index.php。意思是在www中產生一个名为pear的资料夹,资 料夹內的index.php是系统產生的套件管理介面,这个介面后面会提到(为防后面的操作失败,请先在C:AppServ﹨www中建立一个名为 pear的资料夹)。

3.第10项的php.exe path需改为c:AppServ﹨php﹨php.exe,也就是需指定正确的php.exe档的所在位置。

其余的设定都用预设值就可以了,我在这里简单介绍一下其他设定项的意义:

● 第2项的Binaries Direetory,是将第一项的c:AppServ﹨php指定为PEAR的根目錄,並用变数$prefix来代表。

● 第3项的PHP code Directory,就是PEAR套件被安装后档案所放置的位置。本范例PEAR套件被下载后的档案会被安装在c:AppServ﹨php﹨PEAR中。

● 第4项是如果被安装的套件有內附的說明文件,本范例会放在c:AppServ﹨php﹨PEAR﹨docs中。

● 第5项足如果被安装的套件有內附的范例档,本范例会放在c:AppServ﹨php﹨PEAR﹨data中。

● 第6项是如果被安装的套件有內附的测试档.本范例会放在c:AppServ﹨php﹨PEAR﹨test中。

● 第7项是PEAR的cache档放置的位置,本范例会放在c:AppServ﹨php﹨PEAR﹨cache中。

● 第8项是快取(Cache)档的壽命,本范例快取档的壽命是300秒,也就是300秒后会重新快取。

另外,需注意的一点是网页的阅览者须对这些路径具有写入的权限,否则无法安装。

设定项修改完后,按最小方的install按钮,即可进行安装,画面如下:







当最上方的安装进度达到100%时,恭喜您,您已完成了基本套件的安装。根据我使用ADSL下载速度2M的环境下测试,大約2分钟即安装完毕,若大家的网路连線速度不夠快,或在安装到一半时连線中断,请按浏览器上方的重新整理钮或按F5即可重新安装。

安装完毕之后.请大家别先高兴,PEAR共有三百多个套件,目前为止只是安装了PEAR的基本套件而已,並沒有安装所有的套件,基本套件以外的其他套件则等到开发者需要使用时再逐一安装。

大家可能会问:「那其他套件如何安装? 会不会很麻烦?」大家请放心,这並不麻烦,下一个小单元中将会针对套件的安装与管理做详细的介绍。

安装完基本套件后,进入c:Appserv﹨php中将会发现有一个名为PEAR的资料夹,该资料夹即为套件经下载並解压缩后,程式库所放置的路径所在,如下图:





对大家而言,其中的docs与tests这两个资料夹內会有学习PEAR的好东西喔。有些套件会內附使用教学文件,若使用者安装该套件后,教学文件就会放在docs资料夹中。而有些套件则是內附范例程式,使用者安装套件后,范例程式会出现在tests资料夹中o



▓ PEAR套件的管理

安装完基本套件后,当开发者需要使用基本套件以外的其他套件时,会需要安装套件,若不需要某个套件时,就会想要移除套件,若套件版本过於老旧,则需要升级套件,也就是說开发者需要一套PEAR套件的管理系统。

在Windows作业系统下的套件安装与管理可以有两种方式,一种是使用Web的管理介面,另一种足使用「套件指令」。笔者较为推荐后者,因为执行的速度较快,但若您对指令有畏惧感,也可以用第一种来轻松管理套件。

摘自:http://hi.baidu.com/suek/blog/item/a9a6f303a65b92ee09fa9329.html

補充1:
修改C:\AppServ\www\pear\index.php

$pear_user_config = 'C:\Appserv\php\pear.conf';


補充2:
安裝後,在php.ini最後加上以下設定即可使用

[PEAR]
include_path="c:\AppServ\php\PEAR


補充3:
在c:\AppServ\www\pear\下新增.htaccess

AuthUserFile C:/AppServ/www/pear/.htpasswd
AuthType Basic
AuthName "Web-based PEAR Frontend"
Require valid-user


新增user,如果.htpasswd檔不存在
C:\AppServ\Apache2\bin>htpasswd -c C:\appserv\www\pear\.htpasswd username
新增user,如果.htpasswd檔已存在
C:\AppServ\Apache2\bin>htpasswd C:\appserv\www\pear\.htpasswd username


[DEBUG]
Vista+AppServ環境安裝PEAR時,切記安裝前先自行建立C:\AppServ\php\temp資料夾,否則會有權限不足的問題!

2008年6月16日 星期一

架設大型網站

「架設像Pixnet或者是無名這類網站真的要所費不貲麼?
其實不然.
下面的東西,對一些大Site來說是很基本的道理。只是想讓初學者省去摸索跟試誤的時間。
一些架站的Tips..

1. Storage Server
外面一台專業存儲設備或者是NAS等等都價格昂貴,但有多少錢做多少事情,買個幾台一般的主機,買個幾張RAID卡,RAID卡的價錢,當然就關係著品質。建議購買具有RAID 5的功能之RAID卡,stripe 可以加快讀取速度,硬碟越多顆,讀取速度越快。RAID 5允許在有一顆硬碟fail的情況下可以rebuild資料回來。增加資料安全性。

一般建立使用者,會給予其流水號,建議使用流水號來分目錄,比如說Pixnet,有一位使用者的帳號是far,他的uid是12345,我會將他的圖片放置於userpics/4/5/12345裡面,這樣有什麼好處?好處在於可以把使用者平均的分散在不同的目錄,不同的機器上。像pixnet的範例,依成長的比例,從1台~100台都可以自由運用。 (分的越細當然就可以分更多台)。有人會說每個人用量都不一樣,真的能夠平均麼?可以的。人數越多,就越平均.:)。某site用的是使用者名稱的第一個字母,但是英文字首的命名本來就極不平均,所以要load banlance就越困難,加上他只能最多分到26台。
ㄧ般要讓其他機器可以存取圖檔,我們習慣的作法是開NFS,但是我們建議,盡量不要用NFS,問題太多,效能也不好。能用其他方式取代就取代。

2. DB
Pixnet 使用MySQL 5,自MySQL 4.1之後的sub-select是我很愛用的,真的頗好用。DB在編譯的時候,用不到的功能能關就關,my.cnf 其實有很多東西可以調,看你自己最多的query type是什麼,對於memory的分配就很重要。DB重的是memory,所以能大就盡量大。

tune my.cnf只能有部分的效能增進,要使其到極限,還是要去改寫你的mysql query,使用EXPLAIN來看你的query是不是做太多白工。這部份的效能增進是最大的。

打開log slow query,可以讓你知道哪些query最耗時,想辦法改寫他。

打開mysql cache,這樣mysql會有cache的功能,相同的query就不會再去處理一次,而把上ㄧ次同樣的結果丟出來。時間與CPU都省了下來。

安裝mytop可以幫助你了解可能出問題的query在哪裡。

定期OPTIMIZE TABLE。

能讓php做的,就不要讓mysql去做。與其讓mysql去做非自己專們的運算,不如給php做。
對於常常access且static的資料,比如像是熱門相簿等等,不需要每次都重算。你可以每小時做一次統計,並且將結果丟到一個HEAP的 table,這樣對於這種很常大量access的資料,mysql幾乎只是提取資料,而不需要另外做運算。效能上當然是大大增進。

將ㄧ些會很常大量access的資料,且可以經由其他table運算出來的資料,放到另ㄧ個HEAP table,因為HEAP是把table放置到memory,在server重起後,資料會不見。所以適合可以重新運算即可得到,且被大量使用的資料上。

類似像隨機相簿這種,請不要真的把所有的資料放下去隨機,隨著你的site成長越大,這部份的load也就會越大,你只要讓人家感覺是隨機就好了。每個小時從原始資料中random出夠大的SET(比如說1萬份),當使用者要access時,再從這1萬份裡random取出10份即可。randomㄧ萬份是比random一千萬份的時間是少之又少。Server Load也頓減許多。

要做的是功能,某種層度上它是真的隨機,請不要傻傻的全部去給他隨機。
如果機器算多的話,做一下mysql replication,讓master專門做寫入,讓多台slave做讀取,如此可以做到High Available又可以做到備份的功效。效能增進上更是倍數成長。

3. reverse Proxy
Proxy是很重要的,他是擋在file server前面的東西。大家都知道file server最怕的是硬碟壞軌,而過量的IO也確實會讓file Server的壽命減少。Reverse Proxy的功能就在保護File Server的壽命。我在每台file server上面跑thttpd。然後Reverse Proxy再跟file server的HTTP要檔案。thttpd本身有cache的功能,你可以設定expire time,他會cache在memory中,所以實際上可以減少硬碟的I/O,加上Reverse Proxy又再一次的cache,可以做到雙層cache,做到保護硬碟的功效。

4. Web
如果可以的話,讓網站只有很簡單的吞吐,不要有多餘的功能,如果是用APACHE之類的,module load越少越好,htaccess能關儘量關掉。PHP如果可以就跑fastcgi,現在php cache的soft有很多,像是mmcache,APC,eaccelerator等等。它可以將php complie候cache在memory裡,如此,下一次同樣的request就可以少掉這段的耗費。

如果可以弄成static page就最好弄成static page。靜態頁面的吞吐大過於php產生頁面。

5. 程式
程式方面就沒什麼好說了,這多少是看功力。多試多玩,他就是你的了。

還有,做這種東西,很重要的是"Cache!Cache!Cache!!"

很多Optimize的方法Google其實都有,不要怕花太多時間,就算是一點點小tip,有時也是很實用的。


摘自:http://blog.pixnet.net/far/post/17024

2008年6月12日 星期四

輕鬆修改Windows XP Administrator賬號的密碼

Windows XP控制面板中的“用戶賬戶”,可以讓你修改用戶賬戶的密碼,但是卻不能修改Administrator賬戶的密碼,假如你要把Administrator的密碼改為chunke111,可以這樣操作:

依次選擇“開始→運行”,在彈出的“運行”對話方塊中輸入“cmd”命令,打開命令提示符窗口,在這裡,鍵入命令net user Administrator chunke111回車即可。

如果我們需要清除Administrator賬戶密碼,你可以進入Windows XP系統所在的盤符,刪除系統裝設目錄(Windows\system32\config)下的SAM文件,重新啟動電腦後,Administrator賬戶就沒有密碼了。

2008年6月6日 星期五

[教學]解決PHP上傳圖片2M的限制



PS:memory_limit可以設成 ini_set('memory_limit', '-1');

2008年6月1日 星期日

[Debug]CakePHP的Session無法完整寫入到資料庫DB

原來是因為中文編號的問題,
只要是有中文資料的Session,
在寫入到資料庫的過程式,就會寫入失敗,
變成空的資料。

但是就算在app_model.php中加入

function __construct(){
parent::__construct();
$this->execute("SET NAMES 'big5'");
}


還是一樣無法成功寫入到Session
最後改成這樣子,問題才得已解決

class DATABASE_CONFIG {

var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'project_name',
'prefix' => '',
'encoding' => 'utf8'
);

var $test = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'project_name-test',
'prefix' => '',
'encoding' => 'utf8'
);
}

2008年5月31日 星期六

[Session]延長SESSION失效時間從24分鐘到4小時

延長SESSION失效時間從24分鐘到4小時



UTBlog寫文章,最後提交的關頭,有時候會出現“認證錯誤”資訊,提示再次登陸,再不可能“退回”到剛才編輯的頁面,結果是剛才的心血全部白費,痛哉!

究其原因,是因為php session有一個GC功能,就是Garbage Collector。這個GC啟動的時候,會清除那些已經“超時”的session。它的工作原理是這樣的(以utblog.com為例):



  1. 用戶訪問並登陸網站http://www.utblog.com,這時候後臺會調用session_start來嘗試生成一個會話(如果已經有會話,則相當於一次有效會話請求)

  2. 對於這樣的每一次有效會話請求(Request),apache的php模組會根據session相關的全域變數gc_probability/gc_divisor =>計算出啟動GC的概率,並由此概率來決定在這次請求中是否應該啟動GC。舉例來說,session.gc_probability的缺省值為1,session.gc_divisor的缺省值為100,則啟動“垃圾回收”器的概率是1%,這就意味著在每100次請求中,會有可能清理一次過期會話

  3. 如果GC啟動,則GC會掃描當前會話所在路徑(session.save_path)下的所有會話檔,並根據另外一個全域變數session.gc_maxlifetime的多少來判斷哪些session已經過期(“當前時間”與“會話檔的atime或者mtime”之間的差大於gc_maxlifetime:過期),並刪除這些過期的session

  4. 如果你在一個session啟動後,長時間沒有任何交交互操作(譬如,不停地碼字,沒有提交或者保存為草稿),那麼你的保存在後臺的會話檔將得不到機會被修改或者訪問,在gc_maxlifetime(缺省值1440秒=24分鐘)時間後,它有可能因失效而被清理,這以後你再提交,就會因為會話失效而報錯


由此可見,gc_maxlifetime設置為24分鐘,對於寫某些文章來說還不夠。這是一個原因,另外,session.save_path的缺省路徑在linux上是/tmp,很少有程式會修改這個設置。如果這台伺服器上有多個虛擬主機,那麼,/tmp目錄下會存放許多不同session_name的會話檔。糟糕的是,php的GC不區分會話歸屬,它會根據它取得的gc_maxlifetime來清理這個目錄下的所有過期session檔。

據以上分析,解決方案是:UTBLOG在.htaccess文件內添加了一條語句,將session.gc_maxlifetime的local value擴大為144004小時),同時在後臺將session.save_path設置為/tmp/utblog,這樣,utblog的會話檔就不受其他網站干擾了,而4小時的失效時間,我想,無論如何應該夠用了。

測試下來,一切如我所願。

另,如果直接改動/etc/php.ini當然也可以。如果沒有許可權改動php.ini,也沒有許可權改動apache的conf檔,.htaccess被禁止,那麼直接修改plog的sessionmanager.class.php文件,在session_start行前添加ini_alter("session.gc_maxlifetime", 14400)亦可。plog結構良好,只有這一處調用session_start,所以也只有這一處需要修改。我在本地做過測試,可以工作。

2008年5月30日 星期五

ADODB SET NAMES

$conn->Execute("SET NAMES 'big5'");
or
$conn->Execute("SET NAMES 'utf8'");

2008年5月19日 星期一

[Debug]Freebsd無法開機,出現fsck訊息

今天,
Server無法完成開機動作,
出現的錯誤訊息是
1.請你重新開機
2.到single mode模式(模式代號-4)
3.執行/sbin/fsck -y

即可

[新聞]2008/5/19 債信調升 魯拉:巴西是正經國家

對於西方國家來說,巴西所在的拉丁美洲,曾經是一個糾結在歷史與未來,左派與右派的國度,四位數的通貨膨脹,讓巴西經濟足足停滯23年,沒想到,在左派領袖魯拉上台後,巴西卻搭著原物料上漲的順風車,躍升為新興經濟強國。

 巴西總人口1.9億人,經濟仰賴農產品出口,長年無法擺脫經濟附庸的宿命,屈服於利益團體壓力,一味地追求社福,導致八○年代末出現四位數通膨,巴西尾大不掉的國營事業,仍吃掉巴西歲出36%的比重,國營企業的負擔是中國與印度的二倍。

 和俄國總理普丁的精明與冷酷相比,魯拉並不像是個扭轉國家經濟的領袖,工人出身的他,母親還是個文盲。

 但左派的背景,並沒有成為魯拉拓展國際盟友的障礙,他不僅參加布希的烤肉派對,也能與古巴領導人卡斯楚喝咖啡閒話家常,「巴西在國際社會,沒有任何敵人」巴西資本市場協會經濟學家赫達德(Claudio Haddad)形容,巴西是金磚四國當中,唯一沒有發展核武的強權。

 受惠於黃豆、鐵砂價格走高,魯拉社福支票慢慢獲得兌現,目前有一千一百戶家庭,每月獲得57美元補助。飛雅特汽車拉美區總裁貝里尼(Cledorvino Belini)說,巴西的社福政策,帶動由下而上的需求提升。

 巴西經濟的穩定也讓巴西央行能夠維持巴西里耳幣值的穩固,巴西里耳對美元創下九年新高,通膨獲得壓抑,巴西央行在2006年還能調降利息刺激經濟成長,巴西銀行授信餘額占國民生產毛額比重,從2002年的22%成長到目前的35%,當地車貸期限也延長到99個月,汽車銷售去年成長28%達到240萬台。

 英國衛報指出,巴西舉國上下沉浸在樂觀氣氛,認為巴西已從沉睡中甦醒,「消費者信心的恢復,是帶動需求成長的動力」福特汽車主管說,巴西百萬富豪人數,去年從十三萬增加到十九萬,是全球成長最快的國家之一。

 根據法國市調機構調查,自2005年以來,有超過二千萬名巴西人,月所得超越635美元,晉身中產階級之列,中產階級占人口比重,已從34%成長到46%,事實上,巴西個人電腦銷售量,全球僅次於美國、中國、日本。

 一位巴西餐廳老闆Alexandre Mendes,巴西人現在不必像過去「日子過一天算一天」,擔心下個月又有罷工。

 財富的增加,提升了巴西民族信心,巴西總統魯拉(Luiz Inacio Lula da Silva)最近將美國總統會談內容,跟友人轉述,他說,巴西最近好不容易從26年的經濟成長停滯甦醒過來,美國經濟卻在這個時候攪局,他跟布希說:「現在換我們叫美國人振作了。」

 四月底標準普爾將巴西國債信用評等,調升為投資等級(BBB-),此舉對巴西來說,極具象徵意義,巴西長年的積弱不振,讓法國已故總統戴高樂,直斥巴西是個不正經的國家(“Brazil is not a serious country”)。魯拉說,債信的調升證明,巴西是個政策嚴謹的正經國家。

2008年5月16日 星期五

[Debug]將input type=file的value清空

用以下的語法即可

<input type="file" onclick="this.outerHTML=this.outerHTML;">

2008年5月15日 星期四

[Debug]jQuery 和 Prototype 同時使用,發生衝突

第一種方法是直接使用 jQuery.noConflict():

jQuery.noConflict();
// 將Jquery的 $ 用 jQuery 代替
jQuery(document).ready(function(){
// jQuery code in here
});


第二種方法是賦值給一個簡短的名字:

var $j = jQuery.noConflict();
// 將Jquery的 $ 用 $j 代替
$j(document).ready(function(){
// jQuery code in here
});


第三種方法,通過傳遞$給ready函數參數作為參數,就可以在ready的參數funcion中使用$:

jQuery.noConflict();
jQuery(document).ready(function($){
// jQuery code in here
});


結論: 我比較喜歡用第二種方法,原因是簡單又明瞭 , $j 開頭的就是jquery , $ 開頭的就是 prototype,也不容易跟Prototype搞混

摘自:http://calos-tw.blogspot.com/2008/04/jquery-prototype.html

2008年5月14日 星期三

[Debug]CakePHP MODEL::save()有問題

$this->Member->save($this->data['Member']一直無法寫入到Database

找了好久
後來發現原來是某欄位資料前面多了一個空格@@"


foreach($cols as $key => $col_name){
$this->data['Member'][$col_name] = $data['MemberInvite'][$col_name];
}
改成
foreach($cols as $key => $col_name){
$this->data['Member'][$col_name] = trim($data['MemberInvite'][$col_name]);
}
即可
$this->Member->save($this->data['Member']寫入成功!

2008年5月4日 星期日

[Debug]iGoogle出現的錯誤訊息是Internet Explorer無法開啟網際網路網站

我在igoogle網頁制訂一些好用的工具,不過在選擇一個可隨上下午變化網頁背景變化的工具後,網頁出現故障,到現在都沒辦法登入igoogle網
頁,請問有人可以幫忙解答如何解決嗎?
出現的錯誤訊息是XInternet Explorer無法開啟網際網路網站http://www.google.com.te/ig?hl=zh-
TW&source=iglk 操作已中止


疑難排解: iGoogle 疑難排解基本內容


列印



如果您的 iGoogle 網頁發生問題,您可以嘗試以下這些步驟:


清除您瀏覽器的快取記錄及刪除 cookies



清除您的快取記錄及刪除 cookies 可以解決大部分的問題。如需相關說明,請造訪http://www.google.com/support/bin/answer.py?answer=497 。請注意, 清除您的 cookies 可能會解決您的問題,但同時也會清除您為先前造訪的網站所儲存的設定。



取消瀏覽器的套件



如果您使用任何瀏覽器的套件程式,試著暫時取消這些功能,以免其中某項功能與您的 iGoogle 網頁有所衝突。如需相關說明,我們建議您查閱該瀏覽器的幫助檔案。



重新安裝 Java



可能在您電腦上安裝的 Java 已經損毀了。要重新安裝 Java,請造訪http://www.java.com並按一下接近該頁上方的 [Free Java Download] 按鈕。



重新設定您的 iGoogle 網頁



重新設定您的 iGoogle 網頁會將其還原為預定的設置,同時會刪除所有您已添加的內容。如果您選擇的版本是台灣或香港版,重設也會恢復台灣或香港版 iGoogle 網頁預設的小工具 〈Google 新聞、熱門搜尋排行榜、Google 推薦‧‧‧等 〉。此外,如果您對移除某個小工具有困難,或是某個小工具在您打開 iGoogle 時造成您的瀏覽器自動關閉,您會發現重設您的網頁很有幫助。



要重設您的 iGoogle 網頁,請選擇您喜歡的版本:


如果您只要重設已登入狀態下的 iGoogle 網頁,請按一下 [重設已登入的偏好設定] 或 [Reset signed-in preferences] 按鈕。如果您要同時重設非登入及已登入狀態下的 iGoogle 網頁,請按一下 [重設所有偏好設定] 或 [Reset all preferences] 按鈕。 請注意,上述兩種重設功能只在您已登入的狀態下有效;如果您在重設前需要登入,請選擇台灣用戶登入香港用戶登入



如果您原本已經有 Google.com 的 iGoogle 設定,想手動加入台灣和香港版 iGoogle 的預設小工具,請造訪http://www.google.com/support/bin/answer.py?answer=71569



摘自:http://www.google.com.tw/support/bin/answer.py?answer=69569

2008年4月29日 星期二

[網路]大陸攻擊網站的惡行

大家好:

我是站長 sega。

在此跟各位報告巴哈姆特此時正遭受的威脅:
27日(日)晚上10:00,機房人員來電通知巴哈首頁伺服器當機,原本以為只是一般的當機,沒想到伺服器重開之後,短短幾秒之內,又再度當機,再次重開之後,情況依舊。
後來經過關閉對外連線後查詢系統 log,發現遭受到來自世界各地的 ip,以極大量的速度對伺服器發出網頁要求試圖癱瘓巴哈首頁,伺服器不堪負荷,因此當機。

直到星期一清晨五點左右,攻勢才逐漸趨緩。

28日(一)下午一點,我們接到了一封信件:
-------------------------------------
  寄件者: wuwebshell
  傳送日期: 2008-4-28 下午 01:00
  主旨: 广告联系

  昨天发动对贵公司的攻击,在此深表歉意,也说明贵公司的网络安全的当务之急,本人做私人服务器的,能否到贵站发布广告,请速回mail。谢谢
-------------------------------------
我們終於知道被攻擊的原因。

到了下午2:00~3:00左右,我們發現伺服器又開始遭到強烈的攻擊,同時,在這個時候,我們接到了一通來自大陸的電話,對方表示他們就是攻擊的發動者,他們的目的很簡單,就是希望可以在巴哈下廣告宣傳他們的《魔獸世界》私服,希望透過巴哈創造雙方的最大利益。我們表明立場不會接這樣的廣告,對方說給我們一些時間討論,暫時不會再攻擊我們,電話掛掉不久後,攻擊就停止了。

到了傍晚左右,我們發現攻擊又開始變強,經過了許多努力,還是抵擋不住來自世界各位高達數千台電腦,以每秒數百次的次數攻擊,伺服器再次癱瘓。

這段期間,我們不斷調整系統,同時也尋求各方的協助,包括與友站遊戲基地的人討論,希望能抵擋住這樣的癱瘓攻擊,但是我們失敗了,只能在今天(二)清晨5:00左右攻擊再度變緩時,才勉強讓伺服器運作。

今天上午,我們發現攻擊又開始變強,伺服器再度癱瘓,於是決定告訴大家目前的狀況,讓大家知道現在巴哈姆特的狀況。

對於大陸不法商人的囂張行徑我們感到非常不可思議。
同時也要跟所有巴哈的支持者表達歉意,我們沒有辦法防禦住這樣的攻擊,導致巴哈的首頁持續癱瘓。我們會繼續努力,但是目前束手無策。我相信這會是一場艱苦且漫長的戰役,我不敢去想像最壞的情況會是什麼,但是,請大家給我們最大的支持....

讓我們一起召喚巴哈姆特 !

sega

摘自:http://home.gamer.com.tw/blogDetail.php?owner=sega&sn=2497

2008年4月28日 星期一

[Plugins]jQuery » Select box manipulation

This plugin is available for download via jQuery SVN | ChangeLog


addOption


You can add a single option: $("#myselect").addOption("Value", "Text");, change the text of an existing option: $("#myselect").addOption("Value", "Text Replacement"); or add multiple options using a hash:




var myOptions = {
"Value 1" : "Text 1",
"Value 2" : "Text 2",
"Value 3" : "Text 3"
}
$("#myselect2").addOption(myOptions, false); // use true if you want to select the added options

ajaxAddOption(url[, params, select, fn, args])


Add options via AJAX (page must return valid JSON, sample below):

$("#myselect2").ajaxAddOption("ajaxoptions.js");.




{
"ajax1": "AJAX option 1",
"ajax2": "AJAX option 2",
"ajax3": "AJAX option 3"
}


Parameters



  • url - Page to get options from (must be valid JSON)

  • params (optional) - Any parameters to send with the request

  • select (optional) - Select the added options, default true

  • fn (optional) - call this function with the select object as param after completion

  • args - (optional) array with params to pass to the function afterwards


removeOption(index/value/regex[, selectedOnly])


Remove an option by index: $("#myselect2").removeOption(0); or value:

$("#myselect").removeOption("Value"); or with a regular expression:

$("#myselect").removeOption(/^val/i);
. To remove all options, you can do

$("#myselect").removeOption(/./);


If you supply a second parameter as a boolean (true, false), then only options that have been selected (and matched) will be removed: $("#myselect2").removeOption("Value 2", true);.


sortOptions([ascending])


Sorting is done as follows: $("#myselect2").sortOptions(false); (descending) or

$("#myselect2").sortOptions();
(ascending)


selectOptions(value[, clear])


Select options by value, using a string as the parameter $("#myselect2").selectOptions("Value 1");, or a regular expression $("#myselect2").selectOptions(/^val/i);. You can also clear already selected options: $("#myselect2").selectOptions("Value 2", true);


Originally coded by Mathias Bank, with a modification to allow it to take a regular expression.


copyOptions(to[, which])


You can copy options from one select to another: $("#myselect").copyOptions("#myselect2"); (copy selected options) or $("#myselect").copyOptions("#myselect2", "all"); (copy all options)


containsOption(value[, fn])


Checks if a select box has an option with the supplied value


Parameters



  • value - Which value to check for. Can be a string or regular expression

    e.g. if( $("#myselect").containsOption("val1") ) { ... } or if( $("#myselect").containsOption(/^val/i) ) { ... }

  • fn (optional) - Function to apply if an option with the given value is found. Use this if you don't want to break the chaining

    e.g. $("#myselect").containsOption("val1", copyoption).doSomethingElseWithSelect(); // calls copyoption (user defined function) for any options found, chain is continued


selectedValues()


Returns values which have been selected. $("#myselect2").selectedValues(). Returns an array.



摘自:http://www.texotela.co.uk/code/jquery/select/

如何更改MSN Messenger的密碼?

一定很多人從申請完MSN帳號後,就很少再去改過密碼,但你可能不知道你的密碼很可能在不經意的時後被盜用,或者不小心留在其他電腦中,沒刪掉。事實上,密碼要常常換新的,才不會被盜用唷!

不過,說來也滿好笑的,這是一個相當基本的功能,不過,MSN Messenger卻把他藏得很隱密,一般若不稍微花點時間找一下,還真的不容易發現呢。以下,簡單介紹MSN(現已改名Windows Live Messenger)更改密碼的方法,如果你密碼很久沒改的話,記得快快更新唷!

第1步 首先,開啟「https://accountservices.passport.net/」這網站,直接在「電子郵件地址」、「密碼」等欄位中輸入你用來登入MSN的帳號、密碼,登入網站。

第2步 登入之後,由左邊的目錄區點選【帳號資訊】,再按下【變更密碼】。

第3步 然後便可直接在頁面中設定你用來登入MSN Messenger的新密碼,以後我們可以常常透過這網頁更新我們的密碼,避免被駭客、壞心人盜用MSN唷。

摘自:http://blog.3cbank.com/?p=1521

2008年4月23日 星期三

Apache server 要把全站的 URL 轉向到特定網頁

無法查看此摘要。請 按這裡查看文章。

上班族必看》教你趕走辦公室的時間賊

數一數,如果你的身邊圍繞的小偷越多。你越需要用些聰明方法來抓到它! 本刊集合四大知名企業的Know-How,提供你趕走時間小偷的妙方。

即便你已經做好縝密的管理計畫,但請別忽視身邊有些瑣碎事情,正一點一滴偷走你的時間:
□ 一、純打屁的MSN對話
□ 二、冗長又沒有效率的會議
□ 三、無聊的電子郵件
□ 四、長舌的電話
□ 五、老闆不明確的工作分配
□ 六、遲到的朋友
□ 七、出其不意的訪客
□ 八、總晃到你辦公桌旁長舌的辦公室同事
□ 九、混亂的辦公桌讓找東西變得困難
□ 十、拖延、優柔寡斷,甚至要求完美的個性

數一數,如果你的身邊圍繞的小偷越多。你越需要用些聰明方法來抓到它! 本刊集合四大知名企業的Know-How,提供你趕走時間小偷的妙方。


愛普生: 計算時間成本,終結無效率會議
適用對象:決心要改善效率的企業

開會前做法:
一、問自己,真的有必要開這個會嗎?
二、負責人最好一週前發出會議通知:包含時間、地點、參加人數、主題、議程及與會人員與簡報內容(一分鐘用一張簡報)。

開會時做法:
準備道具:馬表與響鈴
一、跟大家報告開會的時間成本(人數X時間X薪資成本)。
二、要求大家提前入座,準時開始(老闆不到也要開始)。
三、主席追蹤上次開會結論,報告會議目的。每個人報告必須留1/3的時間討論,距離結束前一分鐘按鈴一次,前30秒按鈴第二次,時間到,把簡報螢幕收起來。
四、一定要討論出結果,絕不拖到下一次。會議結果要在結束前複誦一次。
五、開會完後,24小時內發出會議紀錄,指定人員追蹤結論後果。
六、定期追蹤會議品質:評量指標包含簡報事前準備率、出席率、準時與會率、達成決議率與準時結束率。

英特爾: 4D分類法,電郵再多也不怕
適用對象:總是花很多時間處理信件,但收件夾永遠堆積如山的人

做法:
一、處理郵件前,再問自己一次,是否打電話就可一次解決事情。
二、一天集中確認email一、兩次即可,別隨時確認。不能今天解決的也要歸類處理,否則信件只會越積越多。
三、每天工作的第一個小時,千萬別拿來看email,而是該做今天最重要的事。
四、處理來信,用4D法來分類,你要刪除(Delete)、執行(Do)、委任他人(Delegate)或是拖延(Defer)。刪除信件,不用客氣,根據微軟統計,每100封你收的信中,有50%是可以被刪掉的,30%可以被委任,或是該在2分鐘內被處理掉的。
五、一次就把信寫好!寫信要目的明確,標題上就註明這是要求行動的通知,以免對方忽略,你還要再寫一次信提醒。

IBM: 兩招提高執行力 打敗拖延
第一招:香腸切割法
適用對象:不想拖拉,可是計畫很大,總感覺做不完的人
做法:把大計畫切割,就像切香腸般,可以讓你一口一口吃掉。

切割的原則有三:第一,被切割的段落要有相關性。第二,分割時從較小量的段落開始,這樣做完會有成就感,會更有往上挑戰的動力。第三,每個切點要列出期限與休息時間,你會更有動力完成,達到切點,一定要休息。這有獎勵與讓自己思考下一步的好處。

第二招:T字分類法
適用對象:優柔寡斷,總是難下決心的人
做法:拿出一支筆,一張紙,畫出個T型,左邊寫下做此事的好處,右邊寫下壞處,別以為這方法看來很笨,但是,它卻是讓很多聰明人很快下定決心的好方法。



Google: 721法則,克服一心多用難題
適用對象:日常工作很多,又想要把時間分割出來想新idea的人
做法:Google教導所有員工,把7成時間專注在原本的工作上,如何改良新搜尋技術;2成時間花在跟核心工作有關的新事物發想;剩下的1成時間與精力,就花在完全沒有關聯的新案件上。

這樣的系統性規畫,讓你不會總是陷在新舊事物時間分配的兩難中。如此,大家也不會都把時間陷在眼前緊急的事裡,無法思考未來。

摘自:http://www.businessweekly.com.tw/webarticle.php?id=32859&p=1

2008年4月15日 星期二

[公告]無名小站使用html語法限制

[公告]無名小站使用html語法限制(已上線)

無名小站使用html語法規則將有異動
有使用embed語法和javascript的人請一定要注意

主要分成兩點
1.Blog的"資料夾管理"跟"網誌敘述"內的語法仍維持原狀不受影響

2.3/31號中午以後任何可以輸入 html 的地方("網誌資料夾"和"網誌敘述"除外), 像是網誌文章、留言版敘述、名片關於我、名片敘述......等 進行新增或修改,系統都會自動檢查

系統檢查會造成的影響是:

a. 任何形式的 javascript 都會被移除 (包含 <script>, onClick, onMouseOver, ... 等等)

b. embed語法只會允許部分網站通過,允許的網站以會員使用量大,且經過工程人員檢查後無安全疑慮者為主


目前允許的網站有:
img.photobucket.commymedia.yam.comwww.clocklink.com
vlog.xuite.netimages.video.msn.comwww.dailymotion.com
www.tudou.com*.yahoo.comwww.estvideo.com
*.yimg.com*.wretch.ccwww.ijigg.com
*.flickr.comgrm.cdn.hinet.net/xuitewww.ik68.cn
pics.webs-tv.net/imagesgroup.gamebase.com.twwww.kiss.com.tw
myvlog.im.tvad2.bloggerads.netwww.kkbox.com.tw
author.bloggerads.netvideo.google.comwww.miniworld.com.tw
www.youtube.com blog.roodo.comwww.mysteryanimals.jp
blog.xuite.netblog.yam.comwww.postpet.so-net.ne.jp
blog-apart.comevent.shanger.netwww.uranai.to
hercafe.yam.cominfo.kijiji.com.twwww.youmaker.com
media.imeem.compets-jp.net
widget-*.slide.com
petswf.bunnyherolabs.comradio.hinet.netimg*.imageshack.us
www.56.comwww.blogad.com.twi*.photobucket.com
js.tongji.yahoo.com.cn

















如果有想要使用的embed網站,但不在上面
可以向我們建議
我們會盡快研究是否安全,且可以開放給所有會員使用

想要建議白名單的會員,請按這裡

並在該文章內統一留下含白名單資訊的回應

ps 如果之前有用javascript或embed語法,只要您不去修改,系統將不會檢查到

ps 再次強調'網誌資料夾'和'網誌敘述'內語法已不受系統檢查,因此也不需要允許白名單


無名小站感謝您的支持



PS:這裡是公告專區,請勿在此詢問客服問題

如有其他需要幫忙處理的客服問題
請點【這裡】,由客服小天使來為您服務喔~

2008年4月11日 星期五

投資重點整理

天上掉餡餅投資法(摘自:http://www.shukai.biz/2007/11/blog-post_30.html)
第一步就是找標的:我推薦『鋼鐵業最大那隻』,很穩又不太可能倒的股票,你知道嗎?如果你在它12塊的時候買進,漲跌不論,每年光是配股配息就有25%的投資報酬率,如果你拿退休金500萬梭哈,你一年什麼事都不用做就淨賺125萬。如果不想等到12塊,在20塊買進,一年也有個15%,500萬也能賺個75萬,重點是這完全是天上掉餡餅,你什麼事都不用做。

第二步就是等:等到好的價位出現,現在4x塊不是好的投資價位,你該做的不是汲汲營營於賺差價,而是把你的錢守住,等到真正好的價位時再出手。

當然你可能沒有五百萬,取而代之的是用定期定額投資,等這隻股票價格低於30塊就可以開始買,低於25就用力買,低於20就拼命買,低於15就借錢買、押房子、押老婆來買,然後高於30就先不買,這樣五年十年投資下來你也可以過過睡覺睡到自然醒、數錢數到手抽筋的生活。

除了上述那隻以外再推薦一隻『種花電信』,這隻也夠穩,有低檔(50以下)是可以當定存來買的。
55元-佈局
50元-加碼
45元-再加碼
40元-全力加碼

附註台積電、台塑也OK

2008年4月8日 星期二

如何選購狗狗維骨力

以下為犬髖關節狗友會所整理的文章, 是針對產品成份、濃度、劑型、嗜口性、價錢的比較!
*要挑選添加葡萄醣銨 及軟骨膠的!!


赫致關節寶葡萄醣銨 500mg(HCL)未標示純度
軟骨素 NA
包裝售價 60粒裝 50磅以下用600~780元 25~50磅每天4顆 (每天40~52元)
50磅以上用800~1000元 50磅以上每天4顆 (每天53~66元)


維克建骨樂(525大型犬)
葡萄醣銨 NA
軟骨素 525mg 未標示純度
包裝售價 30粒裝 25公斤以上用 1500元 每天1顆 (每天50元)


COSEQUIN DS(國內無代理商)狗友會有代訂
--->許多網友強力推這瓶!(Y拍有在賣哦!)
葡萄醣銨 500mg (HCL) 純度99%
軟骨素 400mg 純度95%
包裝售價 250粒裝 25~50 磅 2900元 每天1顆 (每天11元)
50磅以上用 每天1~2顆 ( 每天11~22元)


SYNOQUIN(舒骼健) ----->目前市面上的主流,但貴死人!
葡萄醣銨 475mg(HCL ) 純度99%
軟骨素 350mg 純度95%
包裝售價 120粒裝 25~50 磅 3800元 每天1顆 (每天31元)
50磅以上用 每天1~2顆 (每天31~62元)


鞏骨立(原名砌骨錠) ---->許多網友不推薦!!
葡萄醣銨 500mg(硫酸鹽) 未標示純度,(硫酸鹽賦型劑純度為59.5%)
軟骨素 250mg 未標示純度
包裝售價 60粒裝 25~50 磅 800元 每天2顆 (每天26元)


骨力勁 ----->長青動物醫院推見!
葡萄醣銨 400mg(硫酸鹽) 未標示純度,(硫酸鹽賦型劑純度為59.5%)
軟骨素 50mg 未標示純度
包裝售價 90粒裝 40~70 磅 1500元 每天3顆 (每天50元)
70磅以上用 每天4顆 (每天66元 )
軟骨素 NA
包裝售價 200克裝 20公斤以上用 800元 每天8公克 (每天32元)


Arthogen(關鍵)
葡萄醣銨 500mg(HCL ) 未標示純度
軟骨素 400mg 未標示純度
包裝售價 120粒裝 25~50 磅 1200元 每天1顆 (每天10元)
50磅以上用 每天1~2顆 (每天10~20元)

2008年4月4日 星期五

進階版定期定額123策略

股市下修 累積資產好時機
定期定額聚財 奉行1.2.3密技

【第一富蘭克林投信】

近期全球股市震盪,投資人是否開始煩惱近期扣款投資的基金出現負報酬?或者對於是否要開始定期定額投資而舉棋不定?

其實市場走勢無人能夠準確預測,現今在通膨隱憂浮現,美國次貸風暴蔓延及油價高漲下,全球股市下修反而提供定期定額投資人累積資產的絕佳時機。根據統計,在2000年投入股市,雖然隨即遭遇科技股泡沫化的大崩盤,但是只要持續扣款,利用低點可以買進更多單位數,扣得愈久可獲得愈高的累積報酬率。因此在全球股市動向不明時,可別因為恐懼而落入「高買低賣」的陷阱!

第一富蘭克林投信建議,投資人應先了解本身扣款的基金的前景,若是單一國家、產業類型基金,先了解景氣是否開始走下坡,或仍有行情可期,以便適時出場還是逢低加碼;而若是全球型的股票基金,那就可以安心些了,一來是投資標的已做好分散,二來穩健的基金可做長期的投資規劃,短期的波動就不須過分擔心。

第一富蘭克林投信指出,無人能預見市場真正低點何在,關於投資,「Time(時間)」永遠比「Timing(時機)」重要,愛因斯坦曾說「複利的威力遠大於原子彈」,足見時間創造的複利效果有多驚人。

第一富蘭克林投信分析,定期定額策略以分批進場方式,能平攤風險與投資成本,尤其已歷經一波修正的股市,提供相對佳的介入時點,遵循「逢低『1』定要加碼」、「至少布局穩健與積極『2』種基金」、「秉持不中斷、不追短、不隨意贖回之『3』不原則」的進階版「定期定額1.2.3」策略,佐以時間與複利雙重調味料,體會財富自主的美妙滋味將是指日可待。

【2008-03-30/經濟日報/B7版/基金致富】

摘自:http://www.wretch.cc/blog/eagle99&article_id=11067160

2008年4月1日 星期二

MySQL分頁優化

MySQL中一般的分頁作法大多利用Limit限制回傳的資料筆數來達成分頁效果
例如下面的代碼
Select * From news limit 0, 100 第一頁
Select * From news limit 100,100 第二頁
Select * From news limit 200,100 第三頁
今天突然來了一個思路
和前作 上下頁查詢優化
的思路略同
定位到id值後再用id值作條件
優化的作法

第一頁
Select * From news Where id >=(Select id From news Order By id limit 0,1) limit 100
第二頁
Select * From news Where id >=(Select id From news Order By id limit 100,1) limit 100
第三頁
Select * From news Where id >=(Select id From news Order By id limit 200,1) limit 100

經測試,一萬條數據以內一般的分頁作法比較快
超過一萬條後優化過的作法優勢就呈現出來
當數據量愈多,優化的分頁查詢速度愈快
所以在第一次查詢總資料筆數後可以增加一個判決
檢查資料量是否超過一萬筆

Select count(*) AS `count` From news //製作分頁的前置作業

if($rows['count'] <10000){
$sql = "Select * From news limit 0, 100 ";
}else{
$sql = "Select * From news Where id >=( Select id From news Order By id limit 0,1) limit 100";
}


摘自:http://jian-zhoung.blogspot.com/2007/11/mysql.html

wibiya widget