Deprecated: Function set_magic_quotes_runtime() is deprecated in /var/www/html/blog.chiyu.idv.tw/wp-settings.php on line 27 Boday & Ivy Note

Firefox 效能最佳化(效能調校)

八月 19th, 2010 by boday No comments »

現在知道一個很簡單的做法, 只要做下述的設定, 在頁面 load 完後, 只要將視窗最小化, 即馬上會看到 Firefox 的記憶體使用量急速下降, 然後會再慢慢增加一點點回來, 但是整體上會少很多, (ex: 100 Mb 可能會降到 10~50Mb 間), 而再最大化, 也不會有變慢或記憶體增加的狀況(當然是在你不再開新頁的狀況), 算是很簡單又實用的小技巧, 可以參考看看~(主要用處在於你覺得電腦開始變慢, 只要最小化一下 Firefox, 即可有明顯的電腦加速效果)

about:config
config.trim_on_minimize => True
Firefox 重開
解說: config:trim_on_minimize: 在視窗縮小時會自動釋放記憶體, 可解決它吃記憶體的問題.

如果找不到此參數, 只要按滑鼠右鍵, 新增 -> 真假值 -> 再把這字串打進去 -> 再選 True 即可完成.

MemcacheQ安裝與使用

八月 16th, 2010 by boday No comments »

memcacheQ是一個單純的分佈式消息隊列服務。 它的安裝依賴於BerkeleyDB 和libevent,所以要先安裝這BerkeleyDB和libevent

  1. 安裝BerkeleyDB:
    wget http://download.oracle.com/otn/berkeley-db/db-5.0.26.tar.gz
    cd build_unix
    ../dist/configure
    make
    sudo make install
  2. libevent (需要1.4.x 或更高):
    下載軟件包:http://monkey.org/~provos/libevent/
    wget http://monkey.org/~provos/libevent-1.4.14b-stable.tar.gz
    tar zxvf libevent-1.4.14b-stable.tar.gz
    cd libevent-1.4.14b-stable
    ./configure & make & make install
  3. 安裝memcacheQ:
    下載軟件包:http://code.google.com/p/memcacheq/downloads/list

    wget http://memcacheq.googlecode.com/files/memcacheq-0.2.0.tar.gz
    tar zxvf memcacheq-0.2.0.tar.gz
    cd memcacheq-0.2.0
    ./configure –with-bdb=/usr/local/BerkeleyDB.5.0 –with-libevent=/usr/local/lib –enable-threads
    make
    sudo make install
  4. 設定Lib對應路徑:
    vim /etc/ld.so.conf 
       /usr/lib64
       /usr/local/lib
       /usr/local/BerkeleyDB.5.0/lib
    /sbin/ldconfig
  5. 啟動memcacheQ:
    使用memcacheq -h 的命令來查看命令行選項
    啟動memcacheq:memcacheq -d -r -H /data1/memcacheq -N -R -v -L 1024 -B 1024 > /data1/mq_error.log 2>

memcache_engine + memcachedb

八月 3rd, 2010 by boday No comments »

memcache_engine + memcachedb = 高性能分佈式內存數據庫
關鍵字: memcachedb
memcachedb是一個由新浪網的開發人員開放出來的開源項目,給memcached分佈式緩存服務器添加了Berkeley DB的持久化存儲機制和異步主輔複製機制,讓memcached具備了事務恢復能力、持久化能力和分佈式複制能力,非常適合於需要超高性能讀寫速度,但是不需要嚴格事務約束,能夠被持久化保存的應用場景,例如memcachedb被應用在新浪博客上面。
memcachedb給memcached添加了一些數據庫才具備的特性,但是我們還不能說memcachedb已經是一個數據庫了,這是因為memcached不支持內存對象的遍歷操作,當然更加不能支持複雜的查詢操作,只能支持根據已知的key去查詢對應的value。 因此如果想把memcachedb當成一個高性能的分佈式內存數據庫來使用的話,查詢的問題就沒有辦法解決,只能在應用程序裡面配合其他方案做一些折衷。
然而memcached的另外一個開源項目完美的填補了這一個缺陷,就是memcache_engine。
memcache_engine是一個MySQL數據庫的存儲引擎,目前只支持MySQL5.1數據庫,他能夠把memcachedb作為MySQL數據庫的一個存儲引擎和MySQL集成起來,讓用戶通過標準的SQL查詢語句訪問memcachedb中存放的數據,請看如下示例:
Sql代碼

CREATE TABLE `a` (  
	`a` int(11) NOT NULL DEFAULT '0',
	`b` int(11) DEFAULT NULL,
	`c` int(11) DEFAULT NULL,
	PRIMARY KEY (`a`)
	) ENGINE=MEMCACHE DEFAULT CHARSET=utf-8
CONNECTION='localhost:6666\;localhost:6688';

創建表a,存放在分佈式memcached server:localhost:6666和localhost:6688當中。 然後我們就可以使用標準的SQL語句隨意的進行CRUD操作去使用memcachedb了,這實在是太酷了! 有了memcache_engine,我們就可以用SQL去訪問memcached,有了memcachedb,我們就不必擔心數據丟失問題,事務恢復問題了,簡直是絕配,讓memcached真正成為了一個高性能的分佈式數據庫系統了。 目前memcache_engine項目還是早期試驗階段,讓我們期待memcache_engine項目早日發布正式版本吧!
順便多說幾句:最近一年來,特別是最近一個月以來,圍繞memcached的開源項目發展的非常非常活躍:
1、最近剛剛發布了memcached的新的高性能C客戶端接口: libmemcached
2、由於有了libmemcached,該組織又發布了memcache_engine存儲引擎,cool!
3、由於libmemcached的發布,不到一周時間,ruby的兩個嶄新的memcache client就問世了,他們是Caffeine和New memcache-client,讓ruby訪問memcached的速度大幅度提高,請看:libmemcached發布了, ruby訪問memcached提速20倍
4、memcachedb發布了,這是中國的互聯網公司貢獻的開源項目
以上幾個項目都是在2008年1月發布的,真的不是一般的繁榮阿。 再加上之前發布的新的支持異步訪問的Java Memcached API和C#接口,可以說除了Python,其他主流非主流編程語言都可以使用memcached了。 其實即便是Python還沒有公佈出來的開源接口,我們也知道國內的web2.0網站豆瓣就是使用Python訪問memcached,並且支持了極大的訪問量,因此目前圍繞memcached的開源項目發展的情況非常的繁榮。
memcached最近兩年這麼受歡迎,其實和互聯網web2.0的流行有很大的關係,web2.0網站通常需要個性化頁面,依賴於頁面局部和數據細顆粒度的緩存來提升性能,並且web2. 0網站流量都很大,因此memcached這種高性能分佈式緩存服務器就大行其道了。
當然我覺得最具有革命意義的還是memcache_engine和memcachedb這兩個項目的發布,他們能夠讓memcached的用途不僅僅限於緩存服務器而已,而是能夠真正充當分佈式數據庫來使用了,這無異是諸多大流量web2.0網站和開發人員的福音阿。

PHP & JS 可逆加密函數

七月 27th, 2010 by boday No comments »

原文:

RC4 in JavaScript and PHP
RC4 (Rivest Cipher 4) is a symmertic cryptoghraphy algorithm and is one of the most used encryption algorithms
in the world because of its simplicity and speed. it is used in popular protocols such as SSL and WEP.
Although, RC4 falls short of the high standards of security, some systems based on RC4 are secure enough for practical use.
I have written this algorithm in both php and js. Therefor it will be possible to transfer information between the client and the server in a secure manner.
but it may not be useful in practice, due to the unsecure transfer of secret key. It would be useful in conjunction with other algorithms like RSA,
however, it may be used for other purposes rather than securing data transmissions.
RC4 is a Vernam cipher, which means that it generates a keystream that, for encryption, is combined with the plaintext using XOR.
As with any Vernam cipher decryption is performed the same way.

RC4 in JavaScript and PHPRC4 (Rivest Cipher 4) is a symmertic cryptoghraphy algorithm and is one of the most used encryption algorithmsin the world because of its simplicity and speed. it is used in popular protocols such as SSL and WEP.Although, RC4 falls short of the high standards of security, some systems based on RC4 are secure enough for practical use.
I have written this algorithm in both php and js. Therefor it will be possible to transfer information between the client and the server in a secure manner.but it may not be useful in practice, due to the unsecure transfer of secret key. It would be useful in conjunction with other algorithms like RSA,however, it may be used for other purposes rather than securing data transmissions.
RC4 is a Vernam cipher, which means that it generates a keystream that, for encryption, is combined with the plaintext using XOR.As with any Vernam cipher decryption is performed the same way.

下載連結:
JavaScript Code 內容
/* RC4 symmetric cipher encryption/decryption
 * Copyright (c) 2006 by Ali Farhadi.
 * released under the terms of the Gnu Public License.
 * see the GPL for details.
 *
 * Email: ali[at]farhadi[dot]ir
 * Website: http://farhadi.ir/
 */
 
/**
 * Encrypt given plain text using the key with RC4 algorithm.
 * All parameters and return value are in binary format.
 *
 * @param string key - secret key for encryption
 * @param string pt - plain text to be encrypted
 * @return string
 */
function rc4Encrypt(key, pt) {
	s = new Array();
	for (var i=0; i<256; i++) {
		s[i] = i;
	}
	var j = 0;
	var x;
	for (i=0; i<256; i++) {
		j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
		x = s[i];
		s[i] = s[j];
		s[j] = x;
	}
	i = 0;
	j = 0;
	var ct = '';
	for (var y=0; y<pt .length; y++) {
		i = (i + 1) % 256;
		j = (j + s[i]) % 256;
		x = s[i];
		s[i] = s[j];
		s[j] = x;
		ct += String.fromCharCode(pt.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);
	}
	return ct;
}
 
/**
 * Decrypt given cipher text using the key with RC4 algorithm.
 * All parameters and return value are in binary format.
 *
 * @param string key - secret key for decryption
 * @param string ct - cipher text to be decrypted
 * @return string
*/
function rc4Decrypt(key, ct) {
	return rc4Encrypt(key, ct);
}
PHP Code 內容
< ?php
/* RC4 symmetric cipher encryption/decryption
 * Copyright (c) 2006 by Ali Farhadi.
 * released under the terms of the Gnu Public License.
 * see the GPL for details.
 *
 * Email: ali[at]farhadi[dot]ir
 * Website: http://farhadi.ir/
 */
 
/**
 * Encrypt given plain text using the key with RC4 algorithm.
 * All parameters and return value are in binary format.
 *
 * @param string key - secret key for encryption
 * @param string pt - plain text to be encrypted
 * @return string
 */
function rc4Encrypt($key, $pt) {
	$s = array();
	for ($i=0; $i&lt;256; $i++) {
		$s[$i] = $i;
	}
	$j = 0;
	$x;
	for ($i=0; $i&lt;256; $i++) {
		$j = ($j + $s[$i] + ord($key[$i % strlen($key)])) % 256;
		$x = $s[$i];
		$s[$i] = $s[$j];
		$s[$j] = $x;
	}
	$i = 0;
	$j = 0;
	$ct = '';
	$y;
	for ($y=0; $y<strlen($pt); $y++) {
		$i = ($i + 1) % 256;
		$j = ($j + $s[$i]) % 256;
		$x = $s[$i];
		$s[$i] = $s[$j];
		$s[$j] = $x;
		$ct .= $pt[$y] ^ chr($s[($s[$i] + $s[$j]) % 256]);
	}
	return $ct;
}
 
/**
 * Decrypt given cipher text using the key with RC4 algorithm.
 * All parameters and return value are in binary format.
 *
 * @param string key - secret key for decryption
 * @param string ct - cipher text to be decrypted
 * @return string
*/
function rc4Decrypt($key, $ct) {
	return rc4Encrypt($key, $ct);
}
?>

提高PHP編程效率引入緩存機制提升性能

七月 26th, 2010 by boday No comments »

提高PHP編程效率引入緩存機制提升性能

  1. 用單引號代替雙引號來包含字符串,這樣做會更快一些。 因為PHP會在雙引號包圍的字符串中搜尋變量,單引號則不會,注意:只有echo能這麼做,它是一種可以把多個字符串當作參數的“函數”(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)。
  2. 如果能將類的方法定義成static,就盡量定義成static,它的速度會提升將近4倍。
  3. $row['id'] 的速度是$row[id]的7倍。
  4. echo 比print 快,並且使用echo的多重參數(譯註:指用逗號而不是句點)代替字符串連接,比如echo $str1,$str2。
  5. 在執行for循環之前確定最大循環數,不要每循環一次都計算最大值,最好運用foreach代替。
  6. 註銷那些不用的變量尤其是大數組,以便釋放內存。
  7. 盡量避免使用__get,__set,__autoload。
  8. require_once()代價昂貴。
  9. include文件時盡量使用絕對路徑,因為它避免了PHP去include_path裡查找文件的速度,解析操作系統路徑所需的時間會更少。
  10. 如果你想知道腳本開始執行(譯註:即服務器端收到客戶端請求)的時刻,使用$_SERVER['REQUEST_TIME']要好於time()。
  11. 函數代替正則表達式完成相同功能。
  12. str_replace函數比preg_replace函數快,但strtr函數的效率是str_replace函數的四倍。
  13. 如果一個字符串替換函數,可接受數組或字符作為參數,並且參數長度不太長,那麼可以考慮額外寫一段替換代碼,使得每次傳遞參數是一個字符,而不是只寫一行代碼接受數組作為查詢和替換的參數。
  14. 使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句。
  15. 用@屏蔽錯誤消息的做法非常低效,極其低效。
  16. 打開apache的mod_deflate模塊,可以提高網頁的瀏覽速度。
  17. 數據庫連接當使用完畢時應關掉,不要用長連接。
  18. 錯誤消息代價昂貴。
  19. 在方法中遞增局部變量,速度是最快的。 幾乎與在函數中調用局部變量的速度相當。
  20. 遞增一個全局變量要比遞增一個局部變量慢2倍。
  21. 遞增一個對象屬性(如:$this->prop++)要比遞增一個局部變量慢3倍。
  22. 遞增一個未預定義的局部變量要比遞增一個預定義的局部變量慢9至10倍。
  23. 僅定義一個局部變量而沒在函數中調用它,同樣會減慢速度(其程度相當於遞增一個局部變量)。 PHP大概會檢查看是否存在全局變量。
  24. 方法調用看來與類中定義的方法的數量無關,因為我(在測試方法之前和之後都)添加了10個方法,但性能上沒有變化。
  25. 派生類中的方法運行起來要快於在基類中定義的同樣的方法。
  26. 調用帶有一個參數的空函數,其花費的時間相當於執行7至8次的局部變量遞增操作。 類似的方法調用所花費的時間接近於15次的局部變量遞增操作。
  27. Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。 盡量多用靜態HTML頁面,少用腳本。
  28. 除非腳本可以緩存,否則每次調用時都會重新編譯一次。 引入一套PHP緩存機制通常可以提升25%至100%的性能,以免除編譯開銷。
  29. 盡量做緩存,可使用memcached。 memcached是一款高性能的內存對象緩存系統,可用來加速動態Web應用程序,減輕數據庫負載。 對運算碼(OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯。
  30. 當操作字符串並需要檢驗其長度是否滿足某種要求時,你想當然地會使用strlen()函數。 此函數執行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數據結構,用於存儲PHP變量)中存儲的已知字符串長度。 但是,由於strlen()是函數,多多少少會有些慢,因為函數調用會經過諸多步驟,如字母小寫化(譯註:指函數名小寫化,PHP不區分函數名大小寫)、哈希查找,會跟隨被調用的函數一起執行。 在某些情況下,你可以使用isset() 技巧加速執行你的代碼。
    (舉例如下)
    if (strlen($foo) < 5) { echo “Foo is too short”$ }
    (與下面的技巧做比較)
    if (!isset($foo{5})) { echo “Foo is too short”$ }
    調用isset()恰巧比strlen()快,因為與後者不同的是,isset()作為一種語言結構,意味著它的執行不需要函數查找和字母小寫化。 也就是說,實際上在檢驗字符串長度的頂層代碼中你沒有花太多開銷。
  31. 當執行變量$i的遞增或遞減時,$i++會比++$i慢一些。 這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或Java代碼並指望它們能立即變快,沒用的。 ++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。 後置遞增實際上會產生一個臨時變量,這個臨時變量隨後被遞增。 而前置遞增直接在原值上遞增。 這是最優化處理的一種,正如Zend的PHP優化器所作的那樣。 牢記這個優化處理不失為一個好主意,因為並不是所有的指令優化器都會做同樣的優化處理,並且存在大量沒有裝配指令優化器的互聯網服務提供商(ISPs)和服務器。
  32. 並不是事必面向對象(OOP),面向對象往往開銷很大,每個方法和對象調用都會消耗很多內存。
  33. 並非要用類實現所有的數據結構,數組也很有用。
  34. 不要把方法細分得過多,仔細想想你真正打算重用的是哪些代碼?
  35. 當你需要時,你總能把代碼分解成方法。
  36. 盡量採用大量的PHP內置函數。
  37. 如果在代碼中存在大量耗時的函數,你可以考慮用C擴展的方式實現它們。
  38. 評估檢驗(profile)你的代碼。 檢驗器會告訴你,代碼的哪些部分消耗了多少時間。 Xdebug調試器包含了檢驗程序,評估檢驗總體上可以顯示出代碼的瓶頸。
  39. mod_zip可作為Apache模塊,用來即時壓縮你的數據,並可讓數據傳輸量降低80%。
  40. 在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情況下,盡量用file_get_contents,因為他的效率高得多! 但是要注意file_get_contents在打開一個URL文件時候的PHP版本問題;
  41. 盡量的少進行文件操作,雖然PHP的文件操作效率也不低的;
  42. 優化Select SQL語句,在可能的情況下盡量少的進行Insert、Update操作
  43. 盡可能的使用PHP內部函數(但是我卻為了找個PHP裡面不存在的函數,浪費了本可以寫出一個自定義函數的時間,經驗問題啊!);
  44. 循環內部不要聲明變量,尤其是大變量:對象(這好像不只是PHP裡面要注意的問題吧?);
  45. 多維數組盡量不要循環嵌套賦值;
  46. 在可以用PHP內部字符串操作函數的情況下,不要用正則表達式;
  47. foreach效率更高,盡量用foreach代替while和for循環(除非變數是 純Array )
  48. 用單引號替代雙引號引用字符串;
  49. “用i+=1代替i=i+1。符合c/c++的習慣,效率還高”;
  50. 對global變量,應該用完就unset()掉;

Linux: umount 時 出現 “Device is busy” 的解法

七月 22nd, 2010 by boday No comments »

使用 fuser 的指令

那要怎麼找出是哪個程式掛在那個目錄上, 可以使用 fuser – identify processes using files or sockets

假設現在 mount 起來的目錄是 /media/share

  • 查詢: fuser -m /media/share
  • 顯示: /media/share: 25023c

就代表是 process 25023(pid) 有使用到此目錄, 後面 c 代表的意思可參考下述:

  • c: current directory.
  • e: executable being run.
  • f: open file. f is omitted in default display mode.
  • F: open file for writing. F is omitted in default display mode.
  • r: root directory.
  • m: mmap’ed file or shared library.

要把這個資源釋放的話, 可以有下述做法:

  • kill -9 25023 # ps aux | grep 25023 應該就會看到它
  • fuser -m -v -i -k /media/share # 會問你是不是要把 25023 這個 kill 掉, 選 y 就會 kill 掉

資訊來源:

Linux: umount 時 出現 “Device is busy” 的解法
[轉貼]解决 umount時出現的 “Device is busy”

CentOS 5.x-初始環境設定

七月 14th, 2010 by boday No comments »

內容

  1. 前言
  2. 實作環境
  3. 安裝及設定
    1. 設定 IP Address
      1. 方式一、文字對話模式安裝
      2. 方式二、修改檔案
    2. 關閉 SELinux
    3. 新增使用者、搬移家目錄、設定使用的 shell
    4. 建立 tcsh shell 環境設定檔 (~/.cshrc)
    5. 建立 VIM 環境設定檔 (~/.vimrc)
    6. 設定 sudo、封鎖 root 密碼
    7. 設定 hostname
    8. 設定本地時間及每天自動校對時間
    9. 查看機器 Listen 哪些 Port
    10. 查看機器啟動哪些 Service
    11. RunLevel
    12. 設定 yum mirror sites 為台灣地區
    13. 安裝 RPMforge
    14. rpm 基本指令
    15. 關閉不需要的服務
    16. 關閉多餘的 tty
    17. 更新 Locate DB
  4. 參考
  5. Me FAQ

前言

以下前言內容擷於 [CentOS - Wikipedia]

CentOS(Community ENTerprise Operating System)是 Linux發行版之一,它是來自於 Red Hat Enterprise Linux 依照開放原始碼規定釋出的原始碼所編譯而成。由於出自同樣的原始碼,因此有些要求高度穩定性的伺服器以 CentOS 替代商業版的 Red Hat Enterprise Linux 使用。兩者的不同,在於 CentOS 並不包含封閉原始碼軟體,簡單說就是不用錢的 RHEL 不過享受自由當然也得不到商業支援了。

實作環境

  • CentOS 5.x
    • CentOS 5.2 64 bit (Linux 2.6.18-92.el5)
    • CentOS 5.1 32 bit (Linux 2.6.18-53.el5)

安裝及設定

以下相關設定為個人在安裝 CentOS 之後常用的一些設定,至於如何安裝 CentOS? 由於網路上文件夠多了所以就不重新造輪子了,要注意的大概就是 /var 不要切太小因為使用 yum update 時暫存資料都放在 /var/cache/yum,其它都差不多…那就開始吧。

設定 IP Address

選擇下列其中之一方式設定後,重新啟動網卡服務 (看要打字少還是字多的吧)

 #/etc/rc.d/init.d/network restart   //方式一
 #service network restart            //方式二 (service => /etc/rc.d/init.d/)

方式一、文字對話模式安裝

 #system-config-network

方式二、修改檔案

 #cat /etc/sysconfig/network-scripts/ifcfg-eth0
 DEVICE=eth0                         //網路卡名稱
 BOOTPROTO=static                    //BOOTP協定
 BROADCAST=192.168.202.255           //廣播 IP Address
 HWADDR=00:15:C5:E5:99:B1            //MAC Address
 IPADDR=192.168.202.100              //IP Address
 NETMASK=255.255.254.0               //Netmask (遮罩)
 NETWORK=192.168.202.0               //網段
 ONBOOT=yes                          //開機自動啟動

關閉 SELinux

Linux 核心是 2.6 以上的就會自動載入 SELinux,但因為才剛開始玩 CentOS 對它還不熟為了減少挫折就先關了吧,等以後熟點再說,關於 SELinux 是什可以參考這三篇詳細的說明。

關閉 SELinux 設定值

 #vi /etc/sysconfig/selinux
 SELINUX=enforcing                            //預設值 (阻擋不安全的有取行為)
 SELINUX=disabled                             //修改後 (關閉 SELinux 功能)

如何查看目前系統的 SELinux 狀態?

 #sestatus
 SELinux status:                 enabled      //可知目前系統啟用 SELinux
 SELinuxfs mount:                /selinux
 Current mode:                   permissive
 Mode from config file:          disabled
 Policy version:                 21
 Policy from config file:        targeted

以下訊息可知目前系統已關閉 SELinux 功能

 #sestatus
 SELinux status:                 disabled

新增使用者、搬移家目錄、設定使用的 shell

我習慣把 user 放在同一個資料夾下(/home/user),而 CentOS 的 adduser 指令預設會把使用者家目錄建立在 /home 下 (也就是 /home/weithenn)。

 #mkdir /home/user                          //建立放置所有使用者家目錄的資料夾
 #adduser -d /home/user/weithenn weithenn   //指定家目錄位置、新增使用者名稱 weithenn
 #passwd weithenn                           //設定使用者 weithenn 密碼
 Changing password for user weithenn.
 New UNIX password:                         //輸入密碼
 Retype new UNIX password:                  //再輸入一次密碼以確認
 passwd: all authentication tokens updated successfully.

CentOS 預設支援的 Shell 如下,而我個人是喜歡使用 tcsh shell

 #cat /etc/shells
 /bin/sh
 /bin/bash
 /sbin/nologin
 /bin/tcsh
 /bin/csh
 /bin/ksh

修改使用者家目錄路徑及 shell

 #vipw
 weithenn:x:500:500::/home/weithenn:/bin/bash             //預設值
 weithenn:x:500:500::/home/user/weithenn:/bin/tcsh        //修改後

建立 tcsh shell 環境設定檔 (~/.cshrc)

設定 ~/.cshrc (/home/user/weithenn/.cshrc) 以便登入時載入相關環境設定 (tcsh shell 環境設定檔),內容如下

 set path = (/usr/kerberos/sbin /usr/kerberos/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin $HOME/bin)
 if ($?prompt) then
        # An interactive shell -- set some stuff up
        if ( ! $?WINDOW ) then
                set prompt = '[%B%m%b] %B%~%b %# '
        else
                set prompt = "[%B%m:$WINDOW%b] %B%~%b %# "
                if ( ! $?SUDO_USER ) then
                        eval "`tset -s $TERM`"
                endif
        endif
 endif
 setenv LANG en_US.UTF-8
 setenv LC_ALL en_US.UTF-8
 setenv LESSCHARSET latin1
 setenv LC_TIME C
 setenv EDITOR vim
 alias  ls        ls --color=tty
 alias  h         history 25
 alias  j         jobs -l
 alias  la        ls -a --color=tty
 alias  lf        ls -FA --color=tty
 alias  ll        ls -lA --color=tty

建立 VIM 環境設定檔 (~/.vimrc)

設定 ~/.vimrc (/home/user/weithenn/.vimrc) 以便使用 vim 時載入相關環境設定,內容如下

 set fileencoding=taiwan
 set guifontset=8x16,kc15f,-*-16-*-big5-0
 set cindent
 set enc=taiwan
 set fileencoding=taiwan
 set hls
 set nocompatible
 set sw=2
 syntax on
 highlight Comment ctermfg=darkcyan
 highlight Search term=reverse ctermbg=4 ctermfg=7

設定 sudo、封鎖 root 密碼

設定 sudo 才知道哪些人用 root 權限做了哪些事,若不喜歡用 sudo 還有許多其它方式來禁止 root 存取的方式,詳細方式可參考 [Red Hat Enterprise Linux 4: 安全性設定手冊 第 4章. 工作站的保全]

 #which sudo visudo                 //確定 sudo 是否安裝
 /usr/bin/sudo
 /usr/sbin/visudo

設定 visudo 不用再鍵入密碼就可變成 root 並開啟 sudo log 功能,修改完 visudo 後若有人執行 sudo command 則 /var/log/sudo.log 會自動建立。

 #visudo
 ## Same thing without a password
 # %wheel        ALL=(ALL)       NOPASSWD: ALL         //預設值
 %wheel ALL=(ALL)       NOPASSWD: ALL                  //修改後
 #Sudo log                                             //並加入如下二行
 Host_Alias SERVER = 192.168.202.100                   //指定本機 IP
 Defaults@SERVER log_year, logfile=/var/log/sudo.log   //指定 log 格式及路徑

設定 sudo log 二種格式 (log_host、log_year)寫入 /var/log/sudo.log 內容的差異

 Dec 27 18:08:27 2007 : weithenn : TTY=pts/2 ; PWD=/home/user/weithenn ;    USER=root ; COMMAND=/usr/sbin/ntsysv                   //使用 log_year
 Dec 27 18:13:27 : weithenn : HOST=centos-jiakai : TTY=pts/2 ;    PWD=/home/user/weithenn ; USER=root ; COMMAND=/usr/sbin/visudo   //使用 log_host

將使用者 weithenn 加入 wheel 群組,也就是只有 weithenn 才能變成 root

 #vi /etc/group
 wheel:x:10:root                                       //預設值
 wheel:x:10:root,weithenn                              //修改後

封鎖 root 密碼,因為我不喜歡再記 root 的密碼且放著也覺得不好所以就把 root password 給封了吧,方式就是修改 /etc/shadow 的第二欄位將內容改成 * 即可。

 #vipw
 root:$1$qa1xL66K$DSp11kLKJZOx05FZsEFle0:13874:0:99999:7:::    //預設值
 root:*:13874:0:99999:7:::                                     //修改後

設定 hostname

若安裝時 hostname 沒設定好就設定一下吧。

 #vi /etc/sysconfig/network
 NETWORKING=yes
 NETWORKING_IPV6=no
 HOSTNAME=centos-test.weithenn.org                             //設定 hostname

設定本地時間及每天自動校對時間

若安裝設定時區時不小心選到 UTC 的話就改回成 CST Taipei 吧。

 #cp /usr/share/zoneinfo/Asia/Taipei /etc/localtime
 #date
 Thu Dec 27 17:07:29 CST 2007

若區網內沒架設 NTP 就寫個簡單的 shell 去每天對時吧,把 script (此例叫 ntpdate.sh) 放在 /etc/cron.daily 並給予 755 的權限就會每天自動對時了。

 #vi /etc/cron.daily/ntpdate.sh                                //建立對時 script 名稱為 ntpdate.sh 內容如下
 #!/bin/sh
 ntpdate -s watch.stdtime.gov.tw
 #chmod 755 /etc/cron.daily/ntpdate.sh                         //給予 755 權限讓系統能自動執行

若系統沒有 /usr/sbin/ntpdate 這個執行檔,當您執行 /etc/cron.daily/ntpdate.sh 時系統會提示說找不到 ntpdate 指令 (ntpdate: command not found.),這時請利用 yum 安裝 ntp 套件吧。

 #yum -y install ntp

查看機器 Listen 哪些 Port

查看機器到底 Listen 哪些 Port (FreeBSD 的話就用 sockstat 吧!!)

顯示服務名稱

 #netstat -tl
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address               Foreign Address             State
 tcp        0      0 *:ssh                       *:*                         LISTEN

顯示 Port Number

 #netstat -tnl
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address               Foreign Address             State
 tcp        0      0 :::22                       :::*                        LISTEN

查看機器啟動哪些 Service

可利用 ntsysv or chkconfig 來設定系統開機時是否啟動指定服務

 chkconfig --list [name]                 //顯示指定服務 runlevel 情形
 chkconfig --add <name>                  //新增指定服務
 chkconfig --del <name>                  //刪除指定服務
 chkconfig [--level <levels>] <name> <on|off|reset|resetpriorities>

RunLevel

若是使用文字介面來安裝那預設就會使用文字介面來開機 (init 3),若使用圖形介面安裝 (Gnome or KDE) 則預設就會使用圖形介面來開機 (init 5)。有關 RunLevel 可參考下列二篇文章

修改系統 RunLevel

 #vi /etc/inittab
 # Default runlevel. The runlevels used by RHS are:
 #   0 - halt (Do NOT set initdefault to this)                                   //關機
 #   1 - Single user mode                                                        //單人模式
 #   2 - Multiuser, without NFS (The same as 3, if you do not have networking)   //多人模式,無 NFS 功能 (同 init 3 若你不需要網路的話)
 #   3 - Full multiuser mode                                                     //多人模式 (文字介面)
 #   4 - unused
 #   5 - X11                                                                     //多人模式 (視窗介面)
 #   6 - reboot (Do NOT set initdefault to this)                                 //重開機
 #
 id:3:initdefault:                                                               //3 文字模式,5 X-WIN

設定 yum mirror sites 為台灣地區

Yum (Yellow dog Updater, Modified) 為 Fedora 及 CentOS 用來管理 RPM 安裝,可解決套件相依性問題。詳細內容可參考[Yellow Dog Updater Modified - Wikipedia]

CentOS 預設 Mirror Site 一定是找國外的,所以我們把站台設回國內 Taiwan Mirror Site 這樣使用 YUM 安裝、更新套件上速度都會加快不少。

 #cd /etc/yum.repos.d
 #cp CentOS-Base.repo CentOS-Base.repo.bak
 #sed 's,mirror.centos.org/centos,ftp.cse.yzu.edu.tw/pub/CentOS,g' CentOS-Base.repo.bak > CentOS-Base.repo    //元智大學
 or
 #sed 's,mirror.centos.org/centos,ftp.cs.pu.edu.tw/Linux/CentOS,g' CentOS-Base.repo.bak > CentOS-Base.repo    //靜宜大學
 or
 #sed 's,mirror.centos.org/centos,ftp.isu.edu.tw/pub/Linux/CentOS,g' CentOS-Base.repo.bak > CentOS-Base.repo  //義守大學

在使用 yum 之前為了避免因為系統時間不準而造成執行 yum 時失敗,建議先以 ntpdate 進行網路對時

 #ntpdate -s watch.stdtime.gov.tw

列出常用的 yum 指令

 yum update           //更新套件 (一個一個問)
 yum update -y        //更新所有套件 (所有回答都回答 Y)
 yum check-update     //列出需要更新的套件清單
 yum upgrade          //升級套件
 yum install aaa      //安裝套件
 yum remove aaa       //移除套件
 yum clean all        //清除安裝時的暫存檔
 yum search aaa       //搜尋套件
 yum list             //列出可安裝的套件清單
 yum info aaa         //列出套件訊息
 yum grouplist        //列出群組安裝套件清單
 yum groupinstall "GNOME Desktop Environment"   //安裝 Gnome 套件群組
 yum groupupdate      //更新套件群組
 yum groupremove      //移除套件群組
 yum groupinfo        //列出群組安裝套件內含哪些套件
     Mandatory Packages:    //強制安裝套件
     Default Packages:      //預設安裝套件
     Optional Packages:     //建議安裝套件 (自已視需求另外安裝)

安裝 RPMforge

雖然將 yum mirror sites 設定為台灣地區,不過除了必要的套件之外很多都沒有 (ex. lighttpd…),所以我們可以透過設定 [RPMforge] 來增加可安裝的套件數量 (ex. 預設 yum 是沒有 lighttpd 套件的)。

執行安裝 [RPMforge] 套件

 #rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
 Retrieving http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
 warning: /var/tmp/rpm-xfer.k3FbwC: Header V3 DSA signature: NOKEY, key ID 6b8d79e6
 Preparing...                ########################################### [100%]
    1:rpmforge-release       ########################################### [100%]

升級 [RPMforge] 套件後在度使用 yum 搜尋 lighttpd 就可找到。

 #yum search lighttpd | grep lighttpd.i386
 lighttpd.i386                            1.4.18-1.el5.rf        rpmforge

rpm 基本指令

列出常用的 rpm 指令

 rpm -ivh aaa         //安裝 rpm
 rpm -e aaa           //刪除 rpm
 rpm -Uvh aaa         //升級 rpm 套件
 rpm -qa |grep aaa    //查尋該套件版本
 rpm -qi aaa          //列出該套件詳細資訊
 rpm -ql aaa          //列出該套件相關檔案
 rpm -qc aaa          //列出該套件設定檔及啟動檔

關閉不需要的服務

CentOS 為了讓你使用方便所以預設為開啟很多服務,而若我們是把 CentOS 拿來當 Server 在用的話其實有很多服務是用不到的,所以就列一下把不需要的服務關閉一方面減少安全性問題 (有的服務會開 Port),一方面也可以增加系統效能 (因為每個服務都會佔記憶體),以下指令可以知道你的系統預設把多少服務給開啟。

 #chkconfig --list |grep "3:on" |awk '{print $1}' |sort

以我的習慣為例的話,我安裝時就只會選 Desktop KDE (因為公司有用 APC UPS 需要 VNC 連過去設定,且只有 GUI 介面),其它有需要就用 yum 安裝,所以安裝完成後預設會開啟下列服務,至於哪些要停用哪些要啟用就看你的需求吧,以下是我個人的建議 (也是套用我機器上的設定)

預設開啟的服務 建議 說明
acpid 停用 Advanced Configuration and Power Interface 電源進階設定,常用在 Laptop 上
apmd 停用 Adventage Power Management daemon 偵測系統的電池電量,常用在 Laptop 上
atd 停用 /etc/at.allow,/etc/at.deny 我大概都使用 crond 來達成
autofs 停用 自動掛載檔案系統與週邊裝置 (如光碟、USB),常用在 Laptop 上
avahi-daemon 停用 當區網沒有 DNS 服務時會試著尋找提供 zeroconf 協定的主機
bluetooth 停用 Bluetooth 藍芽,常用在 Laptop 上
cpuspeed 停用 控制 CPU 速度主要用來省電,常用在 Laptop 上
cups 停用 Common UNIX Printing System 使系統支援印表機
firstboot 停用 安裝完成後第一次啟動時的服務,設定 auth、firewall、keyboard…
gpm 停用 記錄週邊裝置的檔案資料,例如文字模式下可使用滑鼠
haldaemon 停用 使系統支援 plug and play 裝置
hidd 停用 使系統支援藍芽裝置,例如滑鼠,鍵盤
hplip 停用 使系統支援 HP 相關型號印表機
ip6tables 停用 使系統支援 IPTables Filrewall IPv6
isdn 停用 使系統支援 Integrated Services Digital Network (ISDN) 環境
lm_sensors 停用 使系統支援偵測主機版或硬體,常用在 Laptop 上
messagebus 停用 使系統支援 plug and play 裝置
nfslock 停用 使系統支援 NFS Server 資料一致性功能
pcscd 停用 使系統支援 Smart Card
portmap 停用 使系統支援 NFS Service
rpcgssd 停用 使系統支援 NFSv4 Service
rpcidmapd 停用 使系統支援 NFSv4 Service
yum-updatesd 停用 使系統支援 YUM 自動更新服務 (上線機器還是先確認好再更新)
anacron 視個人需求 執行在 crontab 設定的時間沒有執行到的工作
auditd 視個人需求 稽核系統 /var/log/audit/audit.log,若 auditd 未執行中則稽核訊息會寫入 /var/log/messages (配合 SELinux)
iptables 視個人需求 使系統支援 IPTables Filrewall
irqbalance 視個人需求 使系統支援多個 CPU 環境當系統中斷請求時進行負載平衡的程序,所以單 CPU 的機器就不需要
lvm2-monitor 視個人需求 使系統支援 Logical Volume Manager 邏輯磁區
mcstrans 視個人需求 主要用於配合 SELinux 服務
mdmonitor 視個人需求 使系統支援 RAID 相關程序
microcode_ctl 視個人需求 使系統支援 Intel IA32 CPU 特色,所以 AMD CPU 不需要
netfs 視個人需求 Network File System Mounter 網路掛載系統 (如 NFS、Samba、NCP)
restorecond 視個人需求 使系統支援 SELinux 監控檔案狀態
smartd 視個人需求 使系統支援檢查硬碟狀態 (Hardware RAID 要改設定檔)
sendmail 視個人需求 使系統支援 Sendmail
xfs 視個人需求 使系統支援 X Window 字型
crond 啟動 /etc/cron.* 排程服務
kudzu 啟動 使系統每次開機會都自動執行硬體偵測
network 啟動 使系統支援網卡
readahead_early 啟動 使系統再啟動時預先將相關檔案讀到記憶體內來加快啟動速度
sshd 啟動 使系統支援 SSH Service
syslog 啟動 使系統支援 System Log Service

決定哪些服務要開哪些服務要關就來執行關閉服務及關閉啟動機器時不啟動服務,以下是我個人的需求。

 service acpid stop ; chkconfig acpid off
 service apmd stop ; chkconfig apmd off
 service atd stop ; chkconfig atd off
 service auditd stop ; chkconfig auditd off
 service autofs stop ; chkconfig autofs off
 service avahi-daemon stop ; chkconfig avahi-daemon off
 service bluetooth stop ; chkconfig bluetooth off
 service cpuspeed stop ; chkconfig cpuspeed off
 service cups stop ; chkconfig cups off
 service firstboot stop ; chkconfig firstboot off
 service gpm stop ; chkconfig gpm off
 service haldaemon stop ; chkconfig haldaemon off
 service hidd stop ; chkconfig hidd off
 service hplip stop ; chkconfig hplip off
 service ip6tables stop ; chkconfig ip6tables off
 service isdn stop ; chkconfig isdn off
 service lm_sensors stop ; chkconfig lm_sensors off
 service mcstrans stop ; chkconfig mcstrans off
 service messagebus stop ; chkconfig messagebus off
 service netfs stop ; chkconfig netfs off
 service nfslock stop ; chkconfig nfslock off
 service pcscd stop ; chkconfig pcscd off
 service portmap stop ; chkconfig portmap off
 service restorecond stop ; chkconfig restorecond off
 service rpcgssd stop ; chkconfig rpcgssd off
 service rpcidmapd stop ; chkconfig rpcidmapd off
 service yum-updatesd stop ; chkconfig yum-updatesd off
 service smartd stop ; chkconfig smartd off

關閉多餘的 tty

大部份都使用 putty 來遠端連線到 CentOS 處理,所以 tty (本機 console) 幾乎很少用到而預設會開啟 6 個,修改成只開啟 2 個。

 #vi /etc/inittab
 # Run gettys in standard runlevels
 1:2345:respawn:/sbin/mingetty tty1
 2:2345:respawn:/sbin/mingetty tty2
 #3:2345:respawn:/sbin/mingetty tty3     //mark 掉
 #4:2345:respawn:/sbin/mingetty tty4     //mark 掉
 #5:2345:respawn:/sbin/mingetty tty5     //mark 掉
 #6:2345:respawn:/sbin/mingetty tty6     //mark 掉

更新 Locate DB

因為 Centos 預設僅每天會更新一次 locate db,所以 CentOS 剛安裝好或剛安裝好某些套件時,若使用 locate (例如尋找 apache 設定檔) 的話就會發生如下錯誤訊息.

 #locate httpd.conf
 locate: can not open `/var/lib/mlocate/mlocate.db': No such file or directory

你可以使用指令 updatedb 來手動更新 locate db.

 #updatedb                   //可能要幾分鐘時間
 #locate httpd.conf          //再次搜尋就可找到了 (可配合參數 -i 來忽略大小寫)
 /etc/httpd/conf/httpd.conf
 /usr/share/system-config-httpd/httpd.conf.xsl

參考

[Minimal Services on CentOS 4.4 Mini-HowTo >> anchorite.org]

[迷你CentOS]

[轉載: FEDORA 相關服務 Yahoo!奇摩部落格]

[Services in Fedora Core 6]

[Red Hat Enterprise Linux 4 Update 2 發行公告]

[分享Fedora 7安裝和配置 - Red Hat / Fedora / CentOS - Linux - www.allhabit.com 香港討論區,香港論壇 - Powered by Discuz!]

[Linux守護進程列表 - ◇Linux新手入門 - 開源快訊論壇 - Powered by Discuz!]

[EXT3-fs: error loading journal - LinuxQuestions.org]

Me FAQ

Q1.GRUB Loading Stage 2?

Error Message:

安裝完 CentOS 後開機時出現如下訊息,且主機呈現當機狀態無法進行任何動作?

 GRUB Loading Stage 2

Ans:

簡單說造成此問題的原因為 GRUB 損壞 (或安裝不完全),此時可利用安裝光碟片再次重新安裝 GRUB 即可解決,修復步驟如下

  1. 放入 CentOS DVD 安裝光碟片
  2. 進入救援模式
    1. 請輸入指令 linux rescue
  3. 回答一般問題
    1. 系統要求設定語系、鍵盤、滑鼠及是否啟動網路卡 (依預設值回答即可,網路卡倒是不需要啟動)
  4. 將根目錄切換到光碟片
    1. 請輸入指令 chroot /mnt/sysimage
  5. 重新安裝 GRUB
    1. 請輸入指令 grub-install /dev/hda or /dev/sda (PATA->hda, SATA/SCSI/SAS->sda)
  6. 離開救援模式
    1. 請輸入指令 exit
  7. 重新啟動系統
    1. 請輸入指令 reboot

Q2.EXT3-fs: error loading journal?

Error Message:

無法存取檔案系統,到 Console 端去看一狗票如下錯誤訊息

 EXT3-fs error (device sda1): ext3_readdir: bad entry in directory #1577666: inode out of bounds - offset=0, inode=1572866, rec_len=12, name_len=1

將主機關機後重新開機先進 BIOS 重新檢查 HDD 是正常狀態,但開機準備進入 CentOS 後發生 [Kernel Painc] 訊息大致如下

 JBD: FAiled to read block at offset 10516
 EXT3-fs: error loading journal
 ...略... (總之一堆 mount error)
 Kernel panic - not syncing: Attempted to kill init!

Ans:

此次解決方式為進入救援模式後 fsck 根目錄完成後,主機重新開機就恢復正常了 (運氣好?),簡述此次解決方式如下

  1. 放入 CentOS DVD 安裝光碟片
  2. 進入救援模式
    1. 請輸入指令 linux rescue
  3. 回答一般問題
    1. 系統要求設定語系、鍵盤、滑鼠及是否啟動網路卡 (依預設值回答即可,網路卡倒是不需要啟動)
  4. 進行檔案系統修復
    1. 執行 fsck 指令 (有可能系統會回答 cannot read /etc/fstab,此次狀況也是如此,請嘗試執行下一行的指令)
    2. 執行 fdisk -l 指令來查看 device (了解 HDD 代號)、mount point…資訊,此例主機硬碟代號為 sda
    3. 執行 fsck /dev/sda1 (修復根目錄)
  5. 離開救援模式
    1. 請輸入指令 exit
  6. 重新啟動系統
    1. 請輸入指令 reboot

此例中修復根目錄 (fsck /dev/sda1) 完成重開機後,系統便可正常開機一切也恢復正常。(當然正常開機後在執行 fsck 指令再次掃描所有的 Device 一次,不過若是此主機為重要機器的話還是要記得隨時備份資料及建立 RAID 才是王道哦!! *:)*)

文章來源:http://www.weithenn.org/cgi-bin/wiki.pl?CentOS_5.x-初始環境設定#Heading3

MYSQL 自動更新異動時間欄位

七月 9th, 2010 by boday No comments »

MYSQL 欄位異動 自動更新 方式
在建立表的時候 欄位可以設定為:

CREATE TABLE `BodayTest` (
   `Id` bigint(15) NOT NULL auto_increment COMMENT '主鍵值',
   `Title` bigint(15) default NULL COMMENT '抬頭',
   `CrateTime` datetime default NULL COMMENT '建立時間',
   `UpdateTime` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT '更新時間',
   PRIMARY KEY (`Id`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='註解';

數位時代 – 購物系統

五月 19th, 2010 by ivy No comments »

原本網站因動線不佳,所以需求改版。

JavaScript All 瀏覽器 複製功能

五月 14th, 2010 by boday No comments »

function copyIntoClipboard(text) {

var flashId = ‘flashId-HKxmj5′;

/* Replace this with your clipboard.swf location */
var clipboardSWF = ‘http://appengine.bravo9.com/copy-into-clipboard/clipboard.swf’;

if(!document.getElementById(flashId)) {
var div = document.createElement(‘div’);
div.id = flashId;
document.body.appendChild(div);
}
document.getElementById(flashId).innerHTML = ”;
var content = ‘‘;
document.getElementById(flashId).innerHTML = content;
}