再見了! Plone

終於,跟Plone說再見了,原因出在於最後一根稻草,來自主機商的自動訊息,說Plone的資料庫檔案超過500MB,需要執行清理的動作,雖然不是必要的,但是他的資料庫檔案會越來越大,我受不了了,為了Plone我已經升級了主機方案,記憶體還是超過限制,還弄了script去監視Plone記憶體使用量,定期重開,真搞不懂Plone到底是吃什麼長大的,就算不是歐落肥也是很營養的東西,當時就決定要把網站搬到其它CMS去,Joomla最近看起來蠻紅的,評估了一下就決定選擇Joomla,就在剛才處理伺服器的檔案,Plone的資料庫已經成長到了1.5GB….裡頭到底塞了什麼真令人好奇,然而我執行了清理之後只剩18MB,這之間的落差到底是從哪生出來了….Plone真的是怪獸中的怪獸,不過,早該跟這頭怪獸做個了斷

我花了一天的時間寫了一個小爬蟲爬了Plone的文章,然後用Joomla的XML RPC API傳文章上去,最後終於完成了,該是跟Plone說再見的時候了

新的Joomla!

Posted in 中文文章, 網站 | Tagged , , | 2 Comments

第一次遇到Deadlock

凡事都要來個第一次,這兩天遇到一個deadlock,是我第一次遇到deadlock,其實很多deadlock都很明顯可以避免掉,但有些就不明顯,這次遇到的deadlock,是因為正在開發一個DirectShow的應用程式,我使用Python把核心部份寫好包裝成Extension給Python使用來加速開發,不然每次光等編譯就等到睡著

我使用DirectShow 的 Sample Grabber filter來抓取從DirectShow播放出來的音樂,DirectShow的graph會建立一個thread來處理事情,而它使用一個callback來回傳資料,好死不死,我的程式從Python的程式碼的Main thread呼叫graph的stop,但是stop似乎會等callback回傳,再來又好死不死的,callback因為要把資料丟回Python,要求Python的GIL,所謂的GIL就是Python直譯器的lock,整個Python行程只有一個,所以就變成下列情況

Main thread (hold GIL) -> call stop(Wait for callback) -> Callback acquire GIL -> GIL….(Hold by main thread)

囧…

這幾個笨蛋(設計的人比較笨),就這樣一直癡癡地等下去,等到天荒地老都沒有人會理他們,這真是悲慘….,所以在寫multi-threading的程式時一定要特別小心,明顯的deadlock當然是很容易避免,但是像這種文件上沒說清楚,隱涵著lock,又繞了一圈的情況,就很難一開始想到

Posted in 中文文章, 英文, Python | Tagged , | 1 Comment

提升效能 : 資料對齊

程式通常都被要求要先把事情做對,再來要求效能,很多人常把事情倒過來做,我以前也喜歡這樣做,為什麼? 因為想要提升效能需要很多瑣碎的知識,當你知道一樣新的想法可以讓程式更快,就會想迫不急待的把它加到你的程式裡,但是程式執行結果都未必正確的情況下,這樣做只會增加程式的複雜度,結果都不正確了,跑再快又有什麼用? 但是到了真正到了把事情做對之後,就是到了開始恨自己瞭解的東西太少,我開始回想以前那些零碎的知識片段,看見我的程式存取記憶體,還有指標,讓我想起了一個重要的概念,資料對齊,這是一個很重要的概念,當資料的位址或長度不是CPU善長處理的數值時,CPU就需要花更多時間去處理,這也就是為什麼資料需要對齊的原因,會發現這個概念是因為我以前在寫struct寫入檔案時一直遇到一個莫明奇妙的bug,我發現struct的大小比我預料的大,後來才知道是資料對齊,編譯器自動將它填到對齊好的大小,現在我回想起來,找了一下,找到了一篇很不錯的文章,圖文並茂地說明了資料對齊的概念

Data alignment: Straighten up and fly right

當瞭解資料對齊的概念之後,就會明白為什麼buffer的長度常常會取256, 512, 1024等等數字

Posted in 中文文章, 分享 | Tagged | Leave a comment

Google中獎關鍵字測試

一時程式寫不出來,想說來試試Google是不是所有關鍵字都中獎 XD

google

首先看看Google,嘖嘖….Google看來是跟Skynet是一夥的

youtube

Youtube也中獎了,看來Youtube威脅Google霸業讓Google很不爽 XDDD

microsoft

接著試試微軟,看來Google也看微軟不爽很久了 XD

yahoo

沒想道死對頭Yahoo居然沒事!? 看來Google和Yahoo以及Skynet都有一腿!

我本來還想搜尋鮑魚,可是這鮑有毒的梗好像有點太虛了 XD

Posted in 中文文章, 分享 | Tagged , | 3 Comments

Google大暴炸! 這個網站可能會損害您的電腦

剛剛在Google搜尋資料時突然發現,奇怪,怎麼好多網站都出現

這個網站可能會損害您的電腦

仔細看看是所有的網站都變成這樣了= =

googe出問題

googe出問題

仙人打鼓有時錯,連精明一世的Google也有腦殘出槌的一天阿= =

看來現在所有網站都被認為被植入病毒 XD,這麼一來就分不出到底哪個是有毒,哪個是沒毒了,全世界的電腦都中毒了,看來世界末日不遠了 XD 天網 Sky Net 背叛人類啦~

個人猜測是Google自己內部可能程式有問題放上線的可能比較大,例如測試碼沒清掉就上線= =" PTT上次權限大放送似乎就是這種狀況 至於Google到底會不會犯這種低等錯誤 我也不知道 不過被入侵也是有可能XD 總而言之我好期待Google如何解釋這次事件的原因

Posted in 中文文章, 分享, 資訊安全 | Tagged , | Leave a comment

Boost繁體中文文件

在找Boost文件時無意間找到對岸的Boost文件漢化社群,為了自己能方便使用,也為了大家方便,畢竟不是每個人都懂英文,所以我向他們要了一份,然後用自動化簡體轉繁體程式轉換,不過因為文件的編碼沒有統一,所以有些自動翻出來是亂碼,有空的話再解決,有些部份也還沒翻譯,未來應該會慢慢補上

Boost繁體中文文件

Posted in 中文文章, 分享 | Tagged , , | Leave a comment

Meta的意思

很多時候我們會見到一些英文用法,但是這些用法並不是單字,像是Meta,一開始我看見這個字首時都覺得一頭霧水,它那麼的常見,很多地方都出現meta,但是我卻不知道那個字首是什麼意思,很多書也都直接使用沒有任何解釋,直到後來好像在一本書上有解釋,我才瞭解meta的意思

Wiki: Meta

其實Meta這字首只要瞭解意思其實很簡單,他是指連接在後面的字詞,其關聯的的概念是那個字詞本身,這麼說很抽象,我自己也不知道自己在說什麼,我們來看一些例子就很好懂

meta-data 是由 meta + data組成,它的意思就是

關於資料的資料

講明白一點就是內容是用來記錄別的資料的資料,例如長度、類形等等…

再舉一個例子

meta-programming,有人翻做"超程式"還什麼的,不果不管翻什麼,要真的表達清楚是很不容易,這是在C++ template相關的書上看到的,meta-programming的意思就是

用來產生程式碼的程式設計手法

在一本C++ template的書中,它是一種利用template,用參數遞迴、特化樣版等各種方法,來達成編譯時期執行特定動作的技術,從某種程度來講,你寫的程式是用來產生程式碼,所以叫meta-programming,而超程式這個翻譯,瞭解他的意思後就比較容易明白

Posted in 中文文章, 英文 | Tagged , | 3 Comments

為什麼MySQL的InnoDB Select Count(*)這麼慢

在美國租的主機不停的在抓資料,現在已經到了3百萬筆了,對於要知道筆數,最直觀的方式就是使用

Select Count(*) From xxx

但是我發現這樣極奇的慢,我們可能覺得很奇怪,以設計上來看,通常應該都要有個欄位是用來記錄這個資料表有多少筆資料,何以可以慢到這種地步,在上網找一堆資料,終於發現了原因,原來因為InnoDB可能有不通的交易同時發生,每筆交易中,可能會有刪除、新增等等事件發生,所以可以說每筆交易裡看到的筆數都是不一樣的,因此每次select count(*)都要做整張表的掃描,到了百萬的數量級,會這麼慢是理所當然的,替代的做法,可以使用

Show Table Status Like ‘xxx’

裡面有個欄位是行數,不過那個數字會和真的數字有差別,欄位裡的數字比較"髒",但是以大部份的用途,像我們會用到Select Count(*)通常是想知道裡面有幾筆資料,不是很要緊的數字的話,其實差一些也不會怎樣,最經典的應用通常是"我們的網站有xxx個會員",根本沒人會在意那個數字差了一點

這問題的答案我是在這篇文章裡找到的

COUNT(*) for Innodb Tables

我發現那真的是一個很棒的部落格

MySQL Performance Blog

如同上面所寫的

Everything about MySQL Performance

裡面只談MySQL的效能問題,如何提升的做法,作者群似乎是來自一家專門幫忙提升MySQL資料庫效能的公司,遇到MySQL效能的問題這個部落格應該可以找到很好的答案,除此之外他們也有出一本High Performance MySQL, Second Edition的書

Posted in 中文文章, 分享 | Tagged , , , , , | Leave a comment

VC++ 9.0的編譯器鬼打牆錯誤

今天要將一些C++程式弄成Python模組,使用Boost.Python,以bjam編譯時一直跑出一堆鬼打牆的錯誤訊息

這個時候不應有 \Utilities\Bin\x86″;F:\Inprise\vbroker\bin;F:\Borland\CBUILD~1\Bi
n;F:\Borland\CBUILD~1\Projects\Bpl;"F:\Microsoft。

這個時候不應有,到底是什麼鬼東西是這裡不應該有的,我仔細觀察了一下,把bjam呼叫的內容全印出來,可是都找不到有參數是那段一堆路徑,再仔細看看那堆路徑看起來像是Path裡的東西,想一想bjam應該丟參數給compiler而已,於是就懷疑是VC++ 9.0 Express的問題,花了好大的力氣,讓我找到了

這篇文章 :

Serious Visual Studio 2008 install bug that can break your builds

才解決這個問題,原來是安裝的SDK像"C:\Program Files\Microsoft DirectX SDK (June 2006)\Utilities\Bin\x86″有括號,在bat檔裡被錯誤解析的樣子

很多時候其實都希望程式設計相關的錯誤訊息不要中文化,像是這個,"這時候不應該有",放到Google搜尋只會出現一堆不相關的東西,但是原文"was unexpected at this time." 下去找很快就能找到相關的資料,我記得之前在Ubuntu下編譯程式,就有遇到編譯器錯誤訊息輸出被中文化的情況…,真的是鬼打牆,沒翻還好,一翻根本不知道它在說什麼鬼,也沒辦法貼到Google找資料

Posted in 中文文章, 分享, C/C++ | Tagged , , , | Leave a comment

使用IE的同學開學日是16號,使用FireFox則是28號開學

FireFox開學日

FireFox開學日

IE開學日

IE開學日

什麼情況會是使用IE的同學開學日是16號,使用FireFox開學日則是28號呢?

IE一向都很nice的, 這其中一定有什麼誤會

原始碼內容

原始碼內容

看來是用Microsoft Office輸出的網頁,做這行事曆的人可能以為Office裡面看起來齊了就好,也不弄個表格把內容分行開來,有一行字因為太長被折成兩行,MS Office也沒有用css指定不要斷開來,對Office而言產生的html也是IE看起來正確就好,嘖嘖,現在用FireFox的人寒假硬是多出好幾天,使用IE的同學抱歉啦~ 你們的寒假比使用FireFox的人少 XD

Posted in 中文文章, WTF | Tagged , | 2 Comments