2009/12/18

Javascript 的 length 屬性是依據瀏覽器的顯示編碼去計算字數

也就是說,使用者看到幾個字,length 屬性就回傳幾個字。

比方說有個 textarea 欄位(id="msg")裡有輸入「測試abc」,而該 html 頁面是宣告成 charset=big5,而瀏覽器的顯示編碼也是 big5,
因此看起來就是兩個中文字、三個英文字, document.getElementById('msg').value.length 的回傳值也就是 5。
如果自行調整瀏覽器的顯示編碼,改成是 iso-8859-1 或是 utf-8,
原本的兩個中文在這種情況下會變成四個亂碼,看起來就是七個字元,而此時的 document.getElementById('msg').value.length 的回傳值就是 7。

可以點選右側連結實際測試看看:http://weblog.gilbert.tw/public/js.length.html

PS. 不管 html 本身宣告是何種 charset,使用者都可以自行調整瀏覽器的顯示編碼,因此本文的標題才沒寫成 Javascript 的 length 屬性是依據 html 的 charset 去計算字數。

2009/11/29

sshguard - 封鎖可疑攻擊 IP

sshguard 透過監控系統記錄檔,封鎖可疑的 IP 連線。與 SSHBlock 不同之處在於,監控的系統記錄檔不僅限於 ssh,因此雖然名為 sshguard,但實際上也可監控 dovecot, proftpd, ftpd 等服務。此外,sshguard 除了支援 TCP Wrappers 封鎖之外,還支援 unix-like system 常見的防火牆,例如 pf, netfilter/iptables, IPFIREWALL/ipfw, IPFILTER 等等。

sshguard 的 ports 路徑為 security/sshgurad/,若要搭配 pf 使用,則可直接到 security/sshguard-pf/ 目錄下安裝。其他還有 security/sshguard-ipfilter/, security/sshguard-ipfw/,端視欲搭配的防火牆而定。以下以搭配 pf 為例:

在 security/sshguard-pf/ 目錄下執行 make install clean 之後,最後顯示的操作提示:

Sshguard installed successfully.

To activate or configure PF see http://sshguard.sf.net/doc/setup/blockingpf.html

Your /etc/syslog.conf has been added a line for sshguard; uncomment it
and use "/etc/rc.d/syslogd reload" for activating it.

See sshguard(8) and http://sshguard.sourceforge.net for additional info.

因為是使用 pf 進行封鎖,因此需要先建立 sshguard 使用的 table,以便 sshguard 將可疑 IP 加入。pf 的設定方式可參考 sshguard 官方網站中的 Set up PF firewall

2009/11/28

SSHBlock - 阻擋 ssh 暴力攻擊

就像有手機就會接到詐騙電話一樣,只要 server 連上網路,就會有人想 try 密碼。
SSHBlock 是藉由監控 ssh 記錄檔,將惡意的來源 IP 加到 TCP Wrappers 設定檔中以進行封鎖。

SSHBlock 的 ports 路徑為 security/sshblock/ ,其中的套件說明如下:

SSHBlock is a daemon to monitor a syslog log for break-in attempts using
SSH, and to automatically block bad hosts by adding lines to /etc/hosts.allow
(TCP Wrappers). Several thresholds are pre-defined, to be able to block those
trying many attempts within a longer or shorter period.

WWW: http://www.bsdconsulting.no/tools/


下指令 make install clean 安裝之後,出現後續的操作說明:

To enable and use the sshblock daemon, use the following in /etc/rc.conf or
/etc/rc.conf.local:

sshblock_enable="YES"

To set flags/options (optional), add:

sshblock_flags=""

See /usr/local/sbin/sshblock -h for possible command line options.

Use /usr/local/etc/rc.d/sshblock to stop and start it.


sshblock 語法說明如下:

Usage: sshblock [ -b <blockfile> ] [ -l <logfile> ] [ -t <trigger list> ]

Trigger list is a list of seconds:attempts threshold pairs for determining
whether a host should be blocked

Default blockfile: /etc/hosts.allow
Default logfile: /var/log/auth.log


因此利用 ports 安裝完成之後,可以執行以下指令啟動 sshblock

/usr/local/etc/rc.d/sshblock start


若要系統開機時自動啟動 sshblcok,則在 /etc/rc.conf 加入

sshblock_enable="YES"


2009/11/17

FreeBSD PPPoE 撥接指令

家裡 server 的 FTTB 撥接偶而會斷線,需要手動重新啟動。
首先將既有的 ppp 關閉:

killall ppp

再來重新啟動 ppp:

ppp -quiet -ddial -nat pppoe


當然,直接 reboot 也行,只是太暴力了點...

2009/11/16

修改照片日期 - PhotoCap

整理照片時發現數位相機的日期差了一天,拍出來照片的日期全部不對,一張張改實在太累,上網找找有沒有甚麼軟體可以用。

修改日期時間的軟體,一定要具備的功能是「批次修改」與「增量設定」的功能。批次修改就不用多說了,增量設定指的是可以自行設定日期時間要增加或減少多少。比方說我的狀況是時間是對的,但日期差了一天,因此我只要日期的部分多加一天,時間保持原來的時間。

試用了幾套軟體,Exifer、Jhead、PhotoCap 都符合上述需求,但是 Jhead 沒有圖形介面,只能下指令來改,在 Windows 環境下很不方便。而 Exifer 是 2002 年出的軟體,還算堪用。至於 PhotoCap 是台灣人出的軟體,時至今日仍不斷更新,除了 EXIF 的日期資訊可以修改之外,檔案的日期也能修改,甚至還可以依據 EXIF 日期去設定檔案時間,修改日期的功能非常完整!


PhotoCap 修改檔案日期。


PhotoCap 修改 EXIF 日期。


PhotoCap 依據 EXIF 修改檔案日期。

2009/11/10

新竹生鐵牛排 (招牌是寫生鐵餐廳)

周日傍晚女友突然想吃牛排,但是 TASTY 訂不到位子,上網看到這家生鐵牛排還滿多人討論的,於是跑去吃吃看。

怕人多沒位子,六點準時到,結果一個客人都沒有,心想該不會踩到地雷吧!但女友嘴饞,還是硬著頭皮進去看看。點了餐之後,陸續有客人進來,心裡稍微安心點。

既然想吃牛排,當然就點招牌的法式生鐵牛排。上菜之後,發現菜色就跟網友拍的照片一樣,一點兒都沒變。
1. 2006.03.21. http://www.wretch.cc/blog/aelfwyn/5022895
2. 2007.07.26. http://tw.myblog.yahoo.com/whitemark-coffee/article?mid=1118
3. 2008.05.17. http://blog.yam.com/GadgetMania/article/15088885
4. 2009.04.03. http://hrylin.pixnet.net/blog/post/23564935
上面這些網友的照片都可以參考。

牛排的熟度服務生建議是吃五分熟,因為鐵板會加熱,所以越吃會越熟。如果一開始就點七分熟,吃到後來可能會太老。但實際用餐的感想,如果要將蒜蓉白飯和牛排拌在一起吃的話,牛排可以就照想吃的熟度去點。因為白飯也會吸熱,牛排不會越吃越熟。如果不拌飯,可以照想吃的熟度減個兩分就剛剛好。

整體而言餐點都還滿好吃的,但因廚房是開放式的,吃完之後身上會沾上油煙味。至於服務還算可以,價位上和 TASTY 差不多。如果 TASTY 訂不到位置,可以來吃吃看,記得要別穿太好的衣服...

PS. 生鐵牛排就在風城購物中心附近,艾利蛋糕正對面。

2009/11/08

凱捷 KaiJet KJV1920 USB 2.0 外接顯示卡 支援旋轉桌面了!

今年五月的時候,想將兩台 22" LCD 垂直放置,就像下圖中最右側那顆螢幕:

但卻發現 KaiJet KJV1920 USB 外接顯示卡不支援畫面旋轉功能,到凱捷官網去查,也沒看到任何有關畫面旋轉的資訊,只好暫且作罷,等日後有新的驅動時再看看是否會支援。

昨日無意間從購物網站上發現凱捷新出的 KJT1680 有提供旋轉桌面功能,再到凱捷官網一看,KJV1920 也支援旋轉桌面了!
二話不說,馬上裝新的驅動程式:

更新前沒有畫面旋轉的選項。


舊版的 7.5.0.0522.0101 驅動程式。


換成 9.05.1001.3053 新版的驅動程式。


出現畫面旋轉的選項了!

加上旋轉桌面的功能之後,這款 KaiJet KJV1920 外接顯示卡總算是一個完整的產品,值得推薦!

2009/11/05

關閉舊網誌

最近一直收到舊的網誌寄來的垃圾回文,應該是阻擋垃圾回文的機制被破解了。想想從 Nucleus CMS 換成 WordPress 也已經兩年多,舊網誌也該是功成身退的時候了。

於是先將資料備份起來,再把網站關閉,將連線轉到目前的網誌(Nucleus 的管理介面有此功能)。管理者的密碼也改成英數夾雜的亂數,降低被破解的機率。
另外為了保險起見,將回文的功能從程式碼中直接取消掉。
方法是在 libs/COMMENTS.php 的第 133 行,加上 return true;,直接取消寫入資料庫的動作:

function addComment($timestamp, $comment) {
global $CONF, $member, $manager;
#2009.11.04.
return true;
$blogid = getBlogIDFromItemID($this->itemid);

2009/11/03

修冰箱 - 更換計時器

最近家裡的東元冰箱老是有怪聲,不時發出「喀、喀、喀」的聲響。雖然冰箱運作正常,沒有不冷的狀況,但半夜聽到這聲總是不舒服。
將冰箱後方的背板拆開看看,確定聲音是從壓縮機旁邊的盒子裡發出來的,這盒子不曉得是甚麼東西,還是請人來修。
寄件者 修冰箱


冰箱上有原廠的 24 小時維修專線,週六打去報修,週一師傅就來修,速度還挺快的。
師傅一聽狀況,就說是計時器的問題,換一個就好。不過因為已經過了保固期,所以要收 500 元,發票會另外寄過來。

當初報修時客服有告知,如果沒有更換零件,過了保固期會酌收 300 元檢測費,多的 200 元算是材料費倒也合理,就請師傅直接換掉。結果拆拆裝裝不到十分鐘就換好了,速度真快。
寄件者 修冰箱


整體來說,這次報修的感覺相當好:
1. 報修時客服人員的態度良好,還有二十四小時服務專線。
2. 客服人員有告知可能的費用。
3. 到府處理的速度也快,沒有等很久。
4. 師傅態度良好。
5. 價錢合理。

客服電話: 0800-281-200
維修網站: 安欣科技服務(東元集團)
TECO官方網站: http://www.teco.com.tw/index.asp

2009/10/18

Cacti 的備份與還原

OS: FreeBSD 7.0
Cacti 安裝方式: ports 安裝
Cacti 安裝目錄: /usr/local/share/cacti

Cacti 備份
Cacti 會將資料與設定存放在資料庫以及程式目錄下,因此備份時需備份這兩個地方。

一、程式目錄備份
用 tar 備份起來即可:

tar -zcf cacti_YYMMDD.tgz -C /usr/local/share cacti

YYMMDD 是備份日期,請自行輸入。

二、資料庫備份
用 mysqldump 匯出:

mysqldump -h host -u user -ppassword cacti > cacti_YYMMDD.sql

YYMMDD 是備份日期,請自行輸入。注意,-p 與 password 之間沒有空白。


Cacti 還原
如果是照前述的方式備份,還原時只需將程式目錄復原,資料庫重新匯入,最後再檢查 cron 是否設定無誤即可。

一、程式目錄還原

cd /usr/local/share
rm -rf cacti // 移除既有的 cacti 目錄
tar -zxvf cacti_YYMMDD.tgz


二、資料庫復原

mysql -h host -u user -ppassword cacti < cacti_YYMMDD.sql

匯入前請確定 MySQL 已經有 cacti 資料庫。

三、檢查 cron 設定
檢查 /etc/crontab 中是否有以下設定,若無,則自行加上:

*/5 * * * * cacti php /usr/local/share/cacti/poller.php > /dev/null 2>&1

2009/09/19

小心 PHP 的 ceil() 函式

系統環境: FreeBSD 7.0 + PHP 5.2.6

ceil() 函式會回傳比輸入數值大且最接近輸入數值的整數,簡單地講就是無條件進位函式。官方手冊上的範例:

echo ceil(4.3); // 5
echo ceil(9.999); // 10
echo ceil(-3.14); // -3


但是由於電腦精確度的關係,以下範例會得出錯誤的結果:

echo 100*1.1; // 110 正確
echo ceil(100*1.1); // 111 錯誤,怎麼多 1 ???
echo ceil(110); // 110 正確


修正方式: 把 ceil() 輸入參數先轉成字串即可。

function gceil($x) {
return ceil( $x . '' );
// or
// return ceil( (string) $x );
}

echo 100*1.1; // 110 正確
echo ceil(100*1.1); // 111 錯誤
echo gceil(100*1.1); // 110 正確

2009/09/07

Apache + Python @ FreeBSD

要讓 Apache 支援 Python,可以安裝 mod_python。
在 ports 裡有兩個版本,一個是 mod_python 2.7、一個是 mod_python 3.3,這兩種分別適用於不同版本的 Apache:

mod_python 2.7



  • Python 1.5.2, 1.6, 2.0 or 2.1

  • Apache 1.3

  • ports 路徑: /usr/ports/www/mod_python/



mod_python 3.3



  • Python 2.3.4 or later.

  • Apache 2.0.54 or later.

  • ports 路徑: /usr/ports/www/mod_python3/




挑選適合的 mod_python 版本後,到 ports 目錄下執行 make install clean 完成安裝。
安裝後會出現設定的說明:
Also remember to add to your Apache configuration in the appropriate context:

PythonPath "['/path/to/foo', '/path/to/bar']"
AddHandler python-program .py
PythonHandler foobar
PythonDebug On

For more information, see http://www.modpython.org/.

================================================================================
===> Registering installation for mod_python-3.3.1_2


接著修改 httpd.conf,加入以下設定,讓 Apache 支援 Python:

LoadModule python_module libexec/apache22/mod_python.so

(mod_python 安裝之後,在 /usr/local/libexec/apache22/ 目錄下會多了一個 mod_python.so)

然後再依據安裝完之後的說明設定便可,比如說要在目錄 /some/directory/ 下運行 Python,則設定如下:


AddHandler mod_python .py
PythondHandler python
PythonDebug On

2009/08/12

Limiting open port RST response from XXX to 200 packets/sec

還是那台爆量的伺服器,系統出現以下訊息:

Limiting open port RST response from 253 to 200 packets/sec
Limiting open port RST response from 392 to 200 packets/sec
Limiting open port RST response from 924 to 200 packets/sec
Limiting open port RST response from 689 to 200 packets/sec
Limiting open port RST response from 284 to 200 packets/sec
Limiting open port RST response from 398 to 200 packets/sec
Limiting open port RST response from 219 to 200 packets/sec
Limiting open port RST response from 224 to 200 packets/sec
Limiting open port RST response from 223 to 200 packets/sec
Limiting open port RST response from 425 to 200 packets/sec
Limiting open port RST response from 436 to 200 packets/sec
Limiting open port RST response from 600 to 200 packets/sec
Limiting open port RST response from 265 to 200 packets/sec
Limiting open port RST response from 693 to 200 packets/sec
Limiting open port RST response from 263 to 200 packets/sec
Limiting open port RST response from 505 to 200 packets/sec
Limiting open port RST response from 355 to 200 packets/sec
Limiting open port RST response from 225 to 200 packets/sec
Limiting open port RST response from 228 to 200 packets/sec
Limiting open port RST response from 370 to 200 packets/sec
Limiting open port RST response from 344 to 200 packets/sec
Limiting open port RST response from 288 to 200 packets/sec
Limiting open port RST response from 287 to 200 packets/sec
Limiting open port RST response from 359 to 200 packets/sec
Limiting open port RST response from 355 to 200 packets/sec
Limiting open port RST response from 702 to 200 packets/sec
Limiting open port RST response from 299 to 200 packets/sec
Limiting open port RST response from 345 to 200 packets/sec
Limiting open port RST response from 329 to 200 packets/sec
Limiting open port RST response from 332 to 200 packets/sec
Limiting open port RST response from 211 to 200 packets/sec
Limiting open port RST response from 462 to 200 packets/sec
Limiting open port RST response from 295 to 200 packets/sec
Limiting open port RST response from 800 to 200 packets/sec
Limiting open port RST response from 623 to 200 packets/sec
Limiting open port RST response from 416 to 200 packets/sec
Limiting open port RST response from 256 to 200 packets/sec
Limiting open port RST response from 578 to 200 packets/sec
Limiting open port RST response from 443 to 200 packets/sec
Limiting open port RST response from 264 to 200 packets/sec
Limiting open port RST response from 656 to 200 packets/sec
Limiting open port RST response from 649 to 200 packets/sec
Limiting open port RST response from 426 to 200 packets/sec
Limiting open port RST response from 444 to 200 packets/sec
Limiting open port RST response from 334 to 200 packets/sec
Limiting open port RST response from 240 to 200 packets/sec
Limiting open port RST response from 289 to 200 packets/sec
Limiting open port RST response from 236 to 200 packets/sec
Limiting open port RST response from 600 to 200 packets/sec
Limiting open port RST response from 319 to 200 packets/sec
Limiting open port RST response from 286 to 200 packets/sec
Limiting open port RST response from 363 to 200 packets/sec
Limiting open port RST response from 1279 to 200 packets/sec
Limiting open port RST response from 416 to 200 packets/sec
Limiting open port RST response from 688 to 200 packets/sec
Limiting open port RST response from 771 to 200 packets/sec
Limiting open port RST response from 971 to 200 packets/sec
Limiting open port RST response from 603 to 200 packets/sec
Limiting open port RST response from 228 to 200 packets/sec
Limiting open port RST response from 254 to 200 packets/sec
Limiting open port RST response from 326 to 200 packets/sec
Limiting open port RST response from 441 to 200 packets/sec
Limiting open port RST response from 315 to 200 packets/sec
Limiting open port RST response from 357 to 200 packets/sec
Limiting open port RST response from 591 to 200 packets/sec
Limiting open port RST response from 300 to 200 packets/sec
Limiting open port RST response from 325 to 200 packets/sec
Limiting open port RST response from 332 to 200 packets/sec
Limiting open port RST response from 281 to 200 packets/sec
Limiting open port RST response from 302 to 200 packets/sec
Limiting open port RST response from 560 to 200 packets/sec
Limiting open port RST response from 368 to 200 packets/sec
Limiting open port RST response from 459 to 200 packets/sec
Limiting open port RST response from 388 to 200 packets/sec
Limiting open port RST response from 349 to 200 packets/sec

從網上找到一篇好文章,解釋的十分清楚:
Limiting open port RST response from 952 to 200 packets per second

Apache 之謎樣 ServerLimit 指令 (directive)

最近某個客戶網站的流量暴增,需要將 Apache 的 MaxClients 調高以應付暴增的連線數。
調高之後先用 apachectl configtest 測試一下,結果出現以下的訊息:

WARNING: MaxClients of 300 exceeds ServerLimit value of 256 servers,
lowering MaxClients to 256. To increase, please see the ServerLimit
directive.

組態檔裡沒看到 ServerLimit 的說明,但在官方網站上找到了 ServerLimit Directive 的說明,於是在 httpd-mpm.conf 裡先把 ServerLimit 設定成 500 試試看:


StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 300
MaxRequestsPerChild 0
ServerLimit 500 # 新設定


但執行 apachectl configtest 卻還是出現同樣的錯誤訊息?

而後總算在網友的文章Apache 2.0 中 prefork.c 模組與 worker.c 模組的比較中找到端倪:
ServerLimit 要放在 MaxClients 前面!!!
改成下面這樣就可以了:


ServerLimit 500 # ServerLimit 放在 MaxClients 前面!!!
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 300
MaxRequestsPerChild 0



另外,調整之後如果以 apachectl graceful 重開 Apache,ServerLimit 的設定並不會生效,log 檔裡會出現以下的錯誤訊息:

[Wed Aug 11 22:31:41 2009] [warn] WARNING: Attempt to change ServerLimit ignored during restart

如果以 apachectl restart 重開也沒用,一樣會出現前面提過的錯誤訊息:

WARNING: MaxClients of 300 exceeds ServerLimit value of 256 servers,
lowering MaxClients to 256. To increase, please see the ServerLimit
directive.


在前面提過的官網說明中有一段隱晦的說明:

Any attempts to change this directive during a restart will be ignored, but MaxClients can be modified during a restart.

因此要使 ServerLimit 生效,必須先停止 Apache: apachectl stop,再開啟 Apache: apachectl start

2009/08/07

MegaCLI

最近剛接手一台 Dell PowerEdge 1950,這幾天發現系統出現以下訊息:

mfi0: 3637 (302889152s/0x0002/WARN) - Predictive failure: PD 00(e0x20/s0)

上網查了一下,應該是 RAID 中的某一顆硬碟出狀況。

順便也找到在 FreeBSD 下查看 Dell PowerEdge RAID Controller (PERC) 6/i 的套件: MegaCLI
ports 路徑: /usr/ports/sysutils/megacli
到目錄下直接輸入 make install clean 便可完成安裝。

2009/08/03

插座燒掉了...

每次趕程式的時候,硬體都會出狀況...

最近進了兩台新伺服器,一直擔心備援的 UPS 會撐不了多久,沒想到是插座先撐不住了


插頭也爛掉了


後續的處理是直接從電箱拉條絞線給負載用,中間用 no fuse break 連接,不再使用插頭、插座。

2009/07/21

用 portaudit 檢查套件的安全性

安裝路徑: /usr/ports/security/portaudit
使用方式:

portaudit -Fda

這指令會自動抓取最新的弱點資料庫,並比對所有已安裝的套件,並產生需要修補的套件報表。

檢視 ports 安裝時的設定

到 package 的 ports 目錄下,輸入

make showconfig

就可以看到安裝時設定。

如果要清除設定,就輸入

make rmconfig

2009/07/18

Process Explorer - 找出檔案被哪個行程鎖住

在 unix 下可以用 lsof 找出檔案被哪個行程 lock 住,Windows 下可以用 Microsoft 提供的 Process Explorer。
目前最新的版本是 v11.33,可以從此處下載。下載後免安裝,解壓縮後執行就可以了。
執行後按下 Ctrl 和 F,輸入檔案名稱按下 Search 鈕,就可以找到該檔案相關的 process 了。

2009/07/03

Firefox 3.5 釋出囉

最近忙翻了,到今天才發現 Firefox 3.5 已經釋出了~~

官網的公告:http://www.moztw.org/firefox/releases/3.5/
    新功能摘錄如下:
  • 提供超過 70 種語言支援。

  • 支援 HTML5 <video> 和 <audio> 元素,包括對 Ogg Theora 編碼影像和 Vorbis 編碼聲音的原生支援。

  • 增進您控制個人隱私資料的工具,包括私密瀏覽模式。

  • 更好的網頁應用程式效能,使用新的 TraceMonkey JavaScript 引擎。

  • 地理定位功能可以將您的地理位置資訊分享給網站。

  • 原生的 JSON 支援 和 網頁工作執行緒。

  • Gecko 排版引擎的加強,包括預測解析以加速頁面描繪。

  • 支援新的網頁技術,例如:動態下載字型、CSS 媒體型態查詢、新的變形與屬性、JavaScript 查詢選擇器、HTML5 本地端儲存及離線應用程式儲存、<canvas> 文字、ICC 設定檔,以及 SVG 變形特效。


不過現在 Firebug 在 Firefox 3.5 上還不能用,等 Firebug 1.4.0 釋出後再升級吧,否則工作起來很辛苦哩!

2009/06/14

台電 停電報修電話 1911

昨晚停電,從台電官網查到的停電搶修電話 1911
從凌晨十二點陸陸續續打到三點都有人接,應該是 24 小時的,

客服的態度不錯,語氣並無不耐,期間還有接到維修師傅打來問有沒有看到哪邊有火花或異常,以便他們找出故障地點,足見確實有在進行查修。雖然到凌晨五點多才復電,但因中間有問客服何時會好,客服說大約五點左右,最後也準時復電,因此雖有不便,但整體感覺尚稱不錯。

最後附註一下,撥 1911 撥通之後,選完國、台語之後,就直接按 9 找客服比較快。如果傻傻地按 1 去查停電狀況,還要輸入電號(電費單上有,一般人不會去記)才行。

2009/06/09

從 Apache Log 中找出連線前 10 名的 IP

語法如下:
cat httpd-access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -
10

如果要查前 20 名或前 n 名,只要將上述語法中的 10 換成想要的數字便可。

2009/06/08

PUD Linux 無法進入 X window

在 VMware 下跑 PUD Linux,常會進不了 X window,在 PUD 的論壇上有網友提出解決方法,原文請見: pud-0.4.8.iso on vmware server 1.0.4 無法進入 Xwindow

操作方式備註如下:
1. 以 PUD Linux 開機之後,最後會跳回黑底白字的 console 畫面。
2. 此時輸入 sudo vim /etc/X11/xorg.conf 進入編輯畫面。
3. 按鍵盤上的上下鍵,將游標移到第 38 行附近,便可以看到 Option "CorePointer" 字樣。
4. 將游標移到該行的行首,按下鍵盤上的字母「i」,輸入一個「#」字號,以便將該行註解掉。
5. 按下「Esc」鍵,此時游漂會跳到畫面最下方,接著再輸入「wq」兩個英文字母,便可存檔、並離開編輯器。
6. 輸入 startx ,便可進入 X window。

2009/06/02

EditPlus v3.11 釋出



網站上提到的新功能與 bug 修正(連結):

* 'Send PWD after each interval' FTP option.
* Allows custom file filter on the Directory Window.
* 'Save current file' option for user tool setting.
* 'FTP account' option on the Project dialog box.
* 'Directory name' option in the Project dialog box.
* Upload dialog box accepts drag and drop.
* 'Undo/Redo All' commands ('Edit'->'Clipboard').
* 'Delete Empty Lines' command ('Edit'->'Delete').
* 'Delete Duplicated Lines' command ('Edit'->'Delete').
* Supports syntax highlighting of backup files.
* Allows multiple selections on the Output Window.
* 'Import/Export' button on the 'Set Directories' dialog box.
* Adds color option for the Cliptext/directory window.
* Increases user tool button to 20.
* Toolbar button for 'Close Others'.

* Cancel button on the FTP transfer screen works immediately.
* Directory Window did not work with certain file extensions.
* Displays 'Remove Leading Spaces' command in the popup menu too.

最近台幣升值,如果想買 license 的話可以趁現在。

2009/05/29

[摘錄] UNIX 記憶體管理

摘錄自: Unix 系統管理 Essential System Administration 2/e, by Æleen Frisch. Copyright 1998 O'Reilly Media Inc., 957-98213-4-8. 第七章。


  • 要使系統執行順暢,記憶體不但要足夠應付大工作,還要能讓數量龐大的日常小工作能夠同時進行。

  • swapping: 置換, 是把整個行程寫入磁碟中,再將其記憶體釋出。當要繼續執行被置換完畢(swapped-out)的行程時,必須將其重新載入記憶體。

  • pagging: 切頁, 是將行程記憶體內容的某些節區(單位為 page)搬到磁碟上,以釋放部分記憶體給需要的行程使用。

  • page fault: 切頁錯誤, 是指當行程要使用記憶體某部分的內容時,該部分的內容尚未由磁碟讀出並置於記憶體中。

  • 在虛擬記憶體系統上,除非記憶體嚴重不足,否則很少會進做置換的動作。

  • 虛擬記憶體的原理是「並非所有記憶體都會同時使用」,因此系統內部可以把虛擬位址對應到實體記憶體位址;當行程要用到目前不在記憶體內程式碼和資料時,kernel 會把需要的部分從磁碟上載入記憶體(即進行切頁動作),可能還會把該行程其他不需使用的 page 置換掉。

  • 若系統實體記憶體不足以讓所有執行中的行程使用時,切頁就會有問題。在這種情形下,kernel 會動態分配記憶體:若某行程要讀進一個新 page,但沒有可用或可重複使用的 page 時,作業系統會從其他行程偷來一個 page 以供使用。被偷的 page 叫做被切出(page out),其內容會被寫在磁碟上的切頁區。若某行程再度需要該 page,其內容會被切回來(page in),通常會強迫使用其他的 page 空間。在這種情況下,CPU 會花很多時間在處理切頁錯誤上,因此會讓行程執行的很沒有效率。最嚴重的狀況稱之為「thrashing」,系統所有的時間都在處理虛擬記憶體,而不會進行任何實際的工作。



僅節錄個人覺得重要之處,全文請參見原書。

2009/05/19

TeamViewer Portable 使用教學 for 被控端(client 端)

TeamViewer 是很好用的一套遠端連線軟體,官方有提供 Portable 免安裝的版本,下載後不用安裝就可以執行,而且使用時也毋須到官網上註冊,非常方便。(注意:商業用途還是要花錢買版權喔!)

Step 1. 從官方網站下載 TeamViewer Portable 版(免安裝版)。


Step 2. 將下載回來的檔案解壓縮後,執行 TeamViewer.exe。


Step 3. 執行之後,畫面左側的 ID 和 Password 各會出現一串數字,將這兩組數字告訴處理人員,他就能遠端登入。


Step 4. 如果出現 Windows 防火牆警告,請點選「解除封鎖」讓 TeamViewer 能夠穿透防火牆。

2009/05/18

http 與 https 間的 session

由於在加密傳輸的 https:// 網頁中,引入未加密傳輸的 http:// 網頁內容,會出現「安全性資訊」警告。因此在 https:// 網站裡,最好不要引入 http:// 的內容,以免造成使用者不便。

但在目前這個充斥著各種 API 與 Widget 的網路環境中,難免會遇到要在 https:// 網頁中引入 http:// 的狀況。在這種情境下,最好的方式是只在有需要加密傳輸的頁面使用 https://,一般較不重要的頁面仍然使用 http://,降低使用者不便。

而在此種狀況下,最大的問題出在 session 是否能在 https:// 與 http:// 間相互傳遞。因為使用者不會希望在 http:// 登入之後,頁面切換到 https:// 又要再登入一次。幸好,如果是同一台網站伺服器,只要是相同的域名,http:// 與 https:// 互相轉換時會共用相同的 session。

2009/05/17

PHP 設定時區

因為代管主機位在國外,因此需要設定 PHP 執行時的時區

// PHP4
putenv('TZ=Asia/Taipei');

// PHP5
date_default_timezone_set('Asia/Taipei');

// PHP4 && PHP5
if (funcion_exists('date_default_timezone_set')) {
date_default_timezone_set('Asia/Taipei');
}
else {
putenv('TZ=Asia/Taipei');
}


時區識別字 (timezone identifier) 請參考: List of Supported Timezones

2009/05/10

進入 single-user mode 與 修改 root 密碼

由於 Mac OS 是以 UNIX 為基礎去開發的,因此修改 root 密碼如同其他 UNIX-based 的作業系統,只要進入 single-user mode 就可以了。

進入 single-user mode

依據官網上的說明,只要在開機時,按下 Command (Apple) 鍵以及 S 鍵,便可進入 single-user mode。

但如果按下之後出現的是 boot 畫面(下圖一),此時只要輸入 -s (下圖二)一樣可以進入 single-user mode(下圖三)。

圖一


圖二


圖三


修改 root 密碼

進入 single-user mode 之後,如果要修改檔案,必須先將檔案系統掛載起來。
輸入以下指令:

/sbin/mount -uw /



接著輸入:

passwd root


會出現 Changing password fort root. 以及 New password: 字樣,提示使用者現在要修改的是 root 的密碼,並請輸入新密碼。如果不想修改,可以按下 Command + c 跳開。
輸入新密碼之後,會出現 Retype new password: 字樣,請使用者再次輸入新密碼。如果輸入的密碼和第一次輸入時一模一樣的話,便完成 root 的密碼修改。


最後輸入 reboot 讓系統重新開機。

2009/05/06

TDK 16GB 隨身碟入手

最近想玩 Ubuntu Live USB,擔心 8GB 隨身碟容量不夠用,直接買了兩隻 16GB 隨身碟來玩玩看。



TDK 這款在 Mobile01 上的評價還不錯,C/P 值頗高,以下是開箱照以及簡單的測試數據:

2009/05/05

調整 NFS server 數量

NFS Server 預設啟動是開啟四台 server(FreeBSD 預設啟動參數是 -n 4),如果需要將 server 數提高,則需先關閉 NFS Server 再重新啟動。

Step 1. 先查看目前的 NFS server 數量,順便找出 master nfsd 的 PID:
ps aux | grep nfsd

root 614 1.2 0.0 2512 788 ?? S 31Mar09 308:28.23 nfsd: server (nfsd)
root 613 0.0 0.0 2680 1052 ?? Is 31Mar09 0:00.03 nfsd: master (nfsd)
root 615 0.0 0.0 2512 788 ?? I 31Mar09 10:45.56 nfsd: server (nfsd)
root 616 0.0 0.0 2512 788 ?? I 31Mar09 0:29.99 nfsd: server (nfsd)
root 617 0.0 0.0 2512 788 ?? I 31Mar09 0:07.06 nfsd: server (nfsd)

(此例中 master nfsd 的 PID 是 613。)

Step 2. 關閉 nfsd(man nfsd 有提到關閉的方式,重點是這段文字 If you have to kill nfsd just do a ''kill -USR1 < PID of master nfsd>''):

kill -USR1 613

(613 是 ps aux | grep nfsd 的輸出結果中,有 nfsd: master 字樣的 PID。)

Step 3. 一次開啟 8 個 server:

nfsd -u -t -n 8

2009/03/01

MySQL ROUND() function

最近又需要將大批的數值資料進行四捨五入處理,無奈 MySQL 4.0 的 ROUND() 函式不能用,只好另外用 PHP 去處理,這遠比直接下 SQL 指令慢多了。

MySQL 4.0 的 ROUND() 函式不能用的原因是,ROUND(0.5) 預期會是 1,但是實際跑出來的結果卻是 0。
根據官方網站的說明,ROUND() 函式對數值得處理方式,取決於系統 C 函式庫的處理方式,而可能有以下幾種模式:

  1. round to the nearest even number

  2. always up

  3. always down

  4. always toward zero


不幸地,我的系統是採用第一種,對於 0.5 來說,最近的偶數是 0,因此 ROUND(0.5) 之後會得到 1。

官網上也有網友提出解決的方法,ROUND(X,D) 可以用以下公式替換:

TRUNCATE((X+SIGN(X)*(POW(10,(1-D))/18)), D)


到了 MySQL 5.0 之後,ROUND() 的實作方式也有了改進,根據官方網站的說明,ROUND() 對依據第一個輸入參數的型態進行不同的處理:

  • For exact-value numbers, ROUND() uses the “round half up” or “round toward nearest” rule: A value with a fractional part of .5 or greater is rounded up to the next integer if positive or down to the next integer if negative. (In other words, it is rounded away from zero.) A value with a fractional part less than .5 is rounded down to the next integer if positive or up to the next integer if negative.

  • For approximate-value numbers, the result depends on the C library. On many systems, this means that ROUND() uses the "round to nearest even" rule: A value with any fractional part is rounded to the nearest even integer.


如此 ROUND(0.5) 便會得到 1,這才是我想要的結果。

針對手邊現有的 FreeBSD 版本與 MySQL 版本進行測試,得到以下結果:










FreeBSD versionMySQL versionROUND(0.5)ok?
5.2.14.1.110X
5.34.0.240X
6.24.0.270X
6.25.0.451O
7.05.0.51a1O
7.04.0.270X
7.14.0.270X

的確,MySQL 5.0.45 之後的 ROUND() 函式比較好用了!

2009/02/21

jQuery 1.3.2 釋出

剛逛 jQuery 官方,發現又有新版本釋出,剛好解決一個剛剛才在 1.3.1 發現的問題。


$("#table tr:not(:first) td:not(:nth-child(1))").click(function(){});

這段 code 的目的是希望在表格的第一列與第一行以外的儲存格,點擊滑鼠時可以執行特定的函式。但在 jQuery 1.3.1 卻不能運作,而在 jQuery 1.2.6 卻可以。

而後將程式碼改成:

$("#table tr:not(:first) td:not(:first)").click(function(){});

:nth-childe(1) 換成 :first,在 jQuery 1.3.1 又恢復正常。

這個狀況跟 http://dev.jquery.com/ticket/4158 這個問題是一樣的,在 jQuery 1.3.2 已經解決了!

順便附上 jQuery 1.3.2 修正的 bugs: http://dev.jquery.com/report/33

jQuery 1.3.x 不支援 [@attr] 語法

這幾天把 jQuery 從 1.2.6 升級到 1.3.1 之後,就發現程式中有些地方不能正常運作,會跑出 Javascript Error。

費了點工夫才從官網上找到 change log(真難找...),才發現從 jQuery 1.3 開始,selector 的 [@attr] 語法已經被取消了,直接寫成 [attr] 就可以了,不用多加一個 @。

例如:

$('input[@type="checkbox"]).click(function(){});

在 1.2.6 可以正常運作,但在 1.3.x 要改成

$('input[type="checkbox"]).click(function(){});

才可以。

官網的說明: http://docs.jquery.com/Release:jQuery_1.3 (在 UPGRADING 這節的 Changes 那邊)

2009/02/15

Cacti 0.8.7b 出現 Passwords do not match, please retype. 錯誤訊息?

幫新伺服器設定 Cacti 監控系統效能時,不管怎麼輸入都會出現 Passwords do not match, please retype. 的錯誤訊息?

2009/02/11

FreeBSD@VM 開機特別慢?

今天裝一個 FreeBSD 7.1 的 VM 來玩,套件灌好之後重開,卻發現開機時間特別長,跑完 sshd 之後會停一陣子。
從 console.log 裡發現停了約一分鐘,不過看不出是在等甚麼東西?
console.log

Feb 10 20:34:38 f71ird10 kernel: Starting sshd.
Feb 10 20:35:41 f71ird10 kernel: Starting cron.

FreeBSD 7.0 安裝紀錄

整理硬碟時發現之前安裝 FreeBSD 7.0 時的螢幕截圖,整理之後上網以茲紀錄。

FreeBSD 7.0 安裝紀錄