5 月 27 2009
3 月 8 2009
好用的小軟體 – Process Explorer 與 Magic Process
Magic Process 是我用了好一段時間,也覺得蠻好用的軟體。
跟 Windows 內建的工作管理員比較起來,Magic Process 可以讓我們知道目前執行的程式,其程式檔案位於何處。
簡而言之,透過 Magic Process 可以檢查執行中程式是否為木馬或病毒(因為程式所在路徑不同)。
然而,最近發現我的 Firefox 瘋狂地佔用 CPU 資源,Magic Process 似乎不夠用,所以在網路上找了一些資料來查原因。
Microsoft TechNet 的 Process Explorer 也可以顯示出目前執行中的程式所在路徑。
而且,Process Explorer 的 process properties 可以顯示出執行中的程式的各個 thread 詳細資料。
類似 Firefox 瘋狂地佔用 CPU 資源這種問題,使用Process Explorer 更容易找出原因。
9 月 3 2008
FreeBSD i386 與 amd64 platform 的差異
除了已知的效能差異(以前用 Ubench 測過的,gaod 長輩也貢獻了一些資訊,都 紀錄在這)、預設支援的記憶體容量之外,這兩天又找出另外一項。
某台機器跑 FreeBSD i386 platform,搭配 PAE 與 SMP。
根據以往的經驗,這種記憶體容量超過 4G 的機器,我會選 amd64 platform。
(至少經手過的幾台機器到現在都很健康…)
近來這台機器的 MySQL daemon process 時常會掛掉…
追蹤 error log 之後,發現這種錯誤訊息:
Out of memory (Needed 16391 bytes)
我把錯誤訊息丟上 Google 後,才發現 FreeBSD i386 platform 版本,其預設之單 process 記憶體容量限制為 512 MB,而 MySQL daemon process 使用超過 512 MB 後就會噴出上述的錯誤訊息,接著就是嗝屁…
我沒碰過這種瓶頸,似乎是 amd64 platform 沒有這種限制。
i386 platform 遭遇到這種瓶頸的解法是在 /boot/loader.conf 裡面丟進類似這三行:
kern.maxdsiz=”2G”
kern.dfldsiz=”2G”
kern.maxssiz=”256M”
(拉高單 process 的記憶體容量限制,變為 2G)
然後 reboot,準備驗收成果…
8 月 30 2008
謹慎使用 MySQL 的 InnoDB storage engine…
幾個月前,我幫人家建置了一套網頁系統,用以觀察網站瀏覽趨勢。
想當然爾,這種系統勢必會對資料庫產生大量 INSERT 或 UPDATE 的 query,而且會保留大量歷史性資料。
為了使系統能快速存取後端資料庫,我將存放 raw data 資料表的 storage engine 設定為 InnoDB。
(因為 InnoDB 支援了 row lock。 )
並搭配定時執行的 script 整理資料,進行統計,並存放在 MyISAM 格式的資料表中。
最近,這套系統的後端資料庫伺服器,mysqld 三不五時會自行 restart,系統狀態也看似正常(根據他們的說法)。
追蹤後,發現 InnoDB 的運作狀態被忽略了…
光是其中一塊放置 raw data 的資料表就存放了三百多萬筆資料,佔用了 3xx MB 的空間,可是 innodb_buffer_pool_size 只有 256 MB,連 mysqldump 都無法完全撈出這塊資料表的內容…
追查程式後,發現原本用以刪除過期 raw data 的那些程式碼片段都被註解掉.. =_=|||
這段故事給我們幾個啟示:
- InnoDB 拿來放 raw data 真的不錯,但是要定時整理,否則維護難度會提高…
- 沒事別雞婆,胡亂更改人家的設計…
8 月 16 2008
用 Postfix 擋偽造來源位址的信件
現在許多廣告信件都是亂丟,配合來源位址的偽造,可能造成主機在發信上有所阻礙。
例如這種狀況:
廣告信偽造的寄件位址是 [email protected],寄給 [email protected]。如果 example-host.com 沒有 no-this-user 這個使用者,那信件會被退到 [email protected],久而久之,example-host.com 可能會被 yahoo.com.tw 擋掉。
之前的文章 只提過 exim 上面的擋法,最近是摸出了 Postfix 的設定方式。
- 讓系統進行檢查,main.cf 要有這些片段:
smtpd_restriction_classes = fakemail_yahoo fakemail_gmail ... # fakemail_yahoo = check_client_access pcre:/usr/local/etc/postfix/fake/yahoo fakemail_gmail = check_client_access pcre:/usr/local/etc/postfix/fake/gmail # smtpd_sender_restrictions = ..., check_sender_access hash:/usr/local/etc/postfix/fake/CHECK, ...
- 製作規則對應檔(/usr/local/etc/postfix/fake/CHECK),內容大致如下(中間的大空格用 tab 隔開):
yahoo.com fakemail_yahoo yahoo.com.tw fakemail_yahoo gmail.com fakemail_gmail ...
- 製作規則檔(以 /usr/local/etc/postfix/fake/yahoo 為例),內容如下(中間的大空格用 tab 隔開):
/(^|\.)yahoo\.com$/ DUNNO /./ REJECT Fake address
- 用 postmap 產生規則對應檔的 hash map,接著讓 postfix 重新讀入設定檔。
對了,如果有 MX server 的話,都得一起上,不然沒用。
跑了一段時間後,效果還真的蠻顯著的。
7 月 18 2008
RoundCube 的郵件中文夾檔問題
這兩天在處理 RoundCube 的郵件中文夾檔問題。
原本覺得情況很詭異,因為 Firefox 都很正常,可是 IE 有這兩種狀況:
- 直接以左鍵點選,中文檔名的附帶夾檔無法下載。
- 以滑鼠中鍵(開新的 Tab),就正常了。
坦白說,RoundCube 的程式架構實在很難摸,所以追了蠻久的..
我幫忙追問題的 RoundCube 版本是 0.1-STABLE 。
最後追到的解法是去修改 program/steps/mail/get.inc , diff -u 生出來的檔案內容是這樣:
--- program/steps/mail/get.inc.orig 2008-07-18 02:01:46.000000000 +0800 +++ program/steps/mail/get.inc 2008-07-18 15:45:37.000000000 +0800 @@ -106,9 +106,19 @@ } else { - header(sprintf("Content-Disposition: %s; filename="%s";", + $HTTP_USER_AGENT = $_SERVER["HTTP_USER_AGENT"]; + + if (strstr($HTTP_USER_AGENT, "compatible; MSIE ") !== false && + strstr($HTTP_USER_AGENT, "Opera") === false) { + header(sprintf("Content-Disposition: %s; filename="%s";", + $_GET["_download"] ? "attachment" : "inline", + $part->filename ? rawurlencode(abbreviate_string($part->filename, 55)) : + rawurlencode("roundcube.$ctype_secondary"))); + } else { + header(sprintf("Content-Disposition: %s; filename="%s";", $_GET["_download"] ? "attachment" : "inline", $part->filename ? abbreviate_string($part->filename, 55) : "roundcube.$ctype_secondary")); + } // turn off output buffering and print part content $IMAP->get_message_part($MESSAGE["UID"], $part->mime_id, $part, true);
關鍵就在… 給 IE 吃的話,要先用 rawurlencode() 處理一遍。
7 月 12 2008
Google Reader 怪怪的?
忘記從什麼時候開始(好像是我的 Firefox 升級成 3.0 ? O_o),Google Reader 常常變成這種畫面:
感覺像是被踢出來了一樣… =_=b
而且,登入時要看運氣,有時得登入個 2~3 次…
相同的瀏覽器(Firefox)視窗,不同標籤頁的 Gmail 都沒事,就 Google Reader 有問題。
真詭異啊~
7 月 5 2008
資料同步與備份
因為 wise 在上一篇文章留了 comment ,所以… 順便分享一些想法跟作法。
根據以前使用 Open WebMail 的經驗,我愈來愈喜歡把資料放在網路上。
把資料放在網路上,最大的好處就是重灌時不需要花費太多時間備份與還原;第二,只要有網路跟電腦,就能隨時隨地存取自己的資料。
於是,我把重要資料送進 SubVersion 系統,把一些文件放在 Wiki 與 BBS,把信件統統轉到 Gmail,把圖片放到 自己架設的相簿系統 。
書籤的方面,我用 del.icio.us Bookmarks。
搭配 del.icio.us 發佈給 IE 用的附加元件,IE 跟 Firefox 都能快速存取我常用的網站。
因為Google Browser Sync 可以同步密碼、COOKIE、書籤,所以在 Firefox 2 時期,我把密碼管理員裡面的密碼跟書籤傳送,並儲存在網路上面。
現在,Google Browser Sync 沒了,我可能得找找 Firefox 的備份軟體了… 囧
6 月 30 2008
Firefox 3 …
約兩個禮拜前,我換上 Firefox 3 。
我在 Firefox 2 使用的附加元件是這些:
- del.icio.us Bookmarks
- Download Statusbar
- DownThemAll!
- dragdropupload
- Fasterfox
- Firebug
- FlashGot
- Forecastfox
- FoxyProxy
- Gmail Manager
- Google Browser Sync
- Google Toolbar
- Greasemonkey
- Image Zoom
- Link Alert
- Live HTTP Headers
- Mouse Grestures
- PDF Download
- RefControl
- Right Encoding
- SafeHistory
- SearchStatus
- Web Developer
- YSlow
- 新同文堂(New Tong Wen Tang)
升級成Firefox 3 之後,某些附加元件不能用(順便分享我的解決辦法)。
- Fasterfox:解法請參考 這篇部落格文章 。
- Firebug:直接在 Add-ons 頁面 裝上新版(目前是 1.2.0b4)。
- Google Browser Sync:停止開發了,bye bye!(哭)
- Right Encoding:解法請參考 這篇部落格文章 。
- SafeHistory:找不到解法…. 也不知道還需不需要… orz
- 新同文堂(New Tong Wen Tang):安裝 0.3.9.1 版 。
此外,我把 Mouse Grestures 拿掉,再加上這些:
因為在 Firefox 3 的網址列輸入位址時,跳出來的快速完成選單變複雜了,不好用,所以我也補上 這個附加元件。
最後,補上小感想跟發現:
- Firefox 3 處理 javascript 的效能提昇了不少。
- Firefox 3 的 about:config 裡面,沒有 browser.cache.memory.capacity 可以玩了…. orz
5 月 29 2009
網頁系統的使用者驗證與 MySQL 的 “SELECT … LIMIT m,n”
幾個小時前,PTT 的 Database 板 又有人問到 MySQL 的 “SELECT … LIMIT m,n” 相關問題。
其實,在大多數的網頁系統中,”SELECT … LIMIT m,n” 應該是一定要用的語法,尤其是在使用者驗證時。
簡單舉例,MySQL 的 “SELECT …” 語法運作可說是拿著籃子去裝東西,若以 LIMIT 語法限制籃子裝東西的數量,MySQL 會在籃子裝滿後就停止動作,並傳回結果。
在網頁系統中,因為使用者帳號都是獨立的,所以,進行使用者登入驗證時,只需要抓出一筆資料來進行比對。
因此,在網頁系統中,我時常用這種語法來進行使用者登入的驗證:
如果找不到資料,代表使用者的帳號/密碼錯誤。
而直接把密碼加入 WHERE 子句,不挑出來用程式比對則是為了杜絕 SQL Injection 導致的密碼外洩。
另外,這樣作也不錯:
By Joe Horn • Database 0 • Tags: MySQL, performance