我的網誌已搬家至blog.miaout17.net,本網誌將不再更新

2009年4月30日 星期四

Blogtrans已知問題

似乎因為無名又做了微妙的決定,最近想要搬Blog的人又變多了,我收到不少Blogtrans有關的Bug。

Blogtrans現在有一些已知的問題:
  • 匯入無名備份檔時可能會卡住 (應該是無名匯出格式不知道偷偷做了什麼變動)
  • 匯出至Blogger時留言會不見 (這個以前可以的,應該是Blogger改了讀備份檔的機制)
  • 無法正常處理簡體中文
因為在下最近很忙(背景音樂:不用麻煩了,不用麻煩了,阿宅很忙的),應該會趁這周末的時間(5/1~5/3)修正這些問題。如果E-mail給我沒有回音,可以下周一後再過來看看有沒有更新。

2009年4月26日 星期日

Ruby V.S. Python: Operator +=

剛剛在Godfat的Blog看到這篇文章,比較了Ruby和Python在對於list進行+=運算子操作的差異:

[~/test]# irb
irb(main):001:0> a = b = []
=> []
irb(main):002:0> a += [1]
=> [1]
irb(main):003:0> a
=> [1]
irb(main):004:0> b
=> []
irb(main):005:0>
Python 2.5.1
>>> a = b = []
>>> a += [1]
>>> a
[1]
>>> b
[1]

這個結果同樣的出乎我的意料之外,所以花了些時間研究一下。以下分別討論a=b=[]; a+=[1]在Ruby和Python的運作狀況。

先看看a=b=[]。毫無疑問,不管在Ruby或Python,這個敘述都是「造一個空list,並讓a和b指向同一個list」。如果你被上面的例子迷惑了,試試:

irb(main):001:0> a = b = []
=> []
irb(main):002:0> a << 1
==> [1]
irb(main):003:0> a
=> [1]
irb(main):004:0> b
=> [1]
irb(main):005:0>

再來,先討論Python
Python的a+=[1]等價於a.__iadd__([1])
對呼叫a+=[1]的block,變數a所綁定的物件不會改變
既然a和b所綁定的物件相同,那a和b的內容理所當然也會一樣

再來看看Ruby的a+=[1]
雖然Ruby可以覆載運算子,但+=運算子是不能被覆載的
簡單的試試

Ruby的method可以名為+,可以以=結尾,就是不能名為+=。同理,-=, *=, /=, &&=, ||=之類的也不行。參考Programming Ruby
In common with many other languages, Ruby has a syntactic shortcut: a=a+2 may be written as a+=2.
可以得到結論:a+=[1]只是一個Syntax sugar,可以想像他parse時就變成了a=a+[1],而不是由a去invoke一個名為+=的member function。

差異就在這邊,對呼叫a+=[1]的block來說,a+[1]造出了一個新物件,再綁定到變數a上,所以a和b指向不一樣的東西。

這裡或許值得注意的是,要是Ruby中+=是一個member method,那a+=[1]就很難不影響到b。因為對呼叫a+=[1]的block來說,他只是去呼叫a的一個member method。完成之後a與b還是指向同一個object。像a<<b就是這樣的例子。

另外,這些敘述應該是等價的:
  • Python的a+=[b]
  • Python的a.append(b)
  • Ruby的a<<b
  • Ruby的a.push b
這也造就了Ruby和Python對於a+=b語意本質上的不同。

我個人是Python和Ruby都有在用,在這個小地方上我比較喜歡Python的作法:將+=視為member function,operator的left operand所綁定的目標不會改變。知道這點的話,Python應該是易了解又有一致性。

2009年4月8日 星期三

JustFuck, A x86 Just-In-Time Compiler for Brainfuck

前陣子看到Jserv介紹asmjit的文章,一直想找機會試試看。另外,最近ptt的programming版上的一個thread出現了很多esoteric programming language,讓我想到可以試試寫個Brainfuck JIT Compiler。於是,這個專案就誕生了?

JustFuck, A x86 Just-In-Time Compiler for Brainfuck

我不是故意罵髒話的啊....他的縮寫很自然就這樣啊....(大誤)

一位不知名的鳥類程式設計師評論道:「真是太神奇了,我從未見過腦幹語言運行的如此飛快,嘎嘎。」

因為最近開始學git,所以放github上:Project page。

Source code只有一個檔案,三百行。學習Brainfuck, asmjit, git的實驗品,大概懶得再重構更新了。

2008年10月1日 星期三

Google Chrome在EeePC上的效能調校 (適用於其他SSD硬碟的電腦)

前幾天我寫了一篇Google Chrome瘋狂讀寫硬碟的問題,說明了Google Chrome在EeePC等使用SSD硬碟的電腦上,可能會因為大量的硬碟存取,導致系統緩慢。然而,Google Chrome超快的JavaScript Engine對我來說仍是相當具有吸引力。因此,今天我想進一步探討Chrome在EeePC這種使用SSD硬碟的電腦上要如何調校。

觀察一下Google Chrome的使用者資料目錄,我們會發現有兩個東西占了大部份的空間:
  1. Safe Browsing這個檔案 (我的電腦中目前這個檔案的大小是50MB左右)
    Google Chrome的Safe Browsing功能,會自動從網路上下載惡意網站的黑名單。用Hex Editor打開看看,原來他是SQLite3的格式,使用SQLite3的瀏覽程式就可打開觀查,裡面存放了黑名單的IP資料。或許這就是硬碟瘋狂存取的元兇之一。
  2. Default\Cache資料夾中的檔案
    這個資料夾中則是格式不明的檔案,應該是網頁內容的快取檔案。另外,Google Chrome也對快取的頁面提供了非常迅速的全文檢索功能。因此,我推測這個資料夾中,應該也包函了全文檢索所需要的索引資料。
在上一篇文章中,我已經提到過使用RamDisk加速Google Chrome的方式。然而使用RamDisk時如果要使用Safe Browsing功能,則你有兩個選擇:
  1. 在開/關機時備份Safe Browsing資料,不過這樣必需在開關機時多複製50MB的資料,大幅降低EeePC開關機迅速的優勢。
  2. 在開/關機時不備份Safe Browsing資料,但這樣會造成每次重開Google Chrome時,都需要重新下載Safe Browsing資料,而造成頻寬的浪費
於是,我選擇停用Safe Browsing功能。只要使用網路夠小心,具有相當的網路安全知識,我相信這個功能是沒有那麼必要的。

重新整理一下我的EeePC效能調校步驟:
  1. 安裝RamDisk,假設將RamDisk安裝到磁碟機代號R
  2. 將Chrome的使用者資料路徑移到RamDisk上。
    在Google Chrome的執行捷徑上加上參數:
    --User-data-dir=R:\ChromeUserData
  3. 進到Google Chrome,至選項=>進階選項=>安全性
    取消「啟用釣魚網站及惡意程式防護」
  4. 關閉Google Chrome,至R:\ChromeUserData
    如果已存在名為Safe Browsing開頭的檔案,將其刪除
  5. 在你的硬碟建立一個資料夾,做完RamDisk的資料備份用
    我建立在C:\RamDiskImg (以下都以此資料夾為例)
  6. 建立兩個批次檔,分別在開機及關機時自動執行
    開機批次檔:
    xcopy /s /y /k C:\RamDiskImg\*.* R:\
    關機批次檔:
    set ramDiskImgDir=C:\RamDiskImg
    md %ramDiskImgDir%\ChromeUserData
    xcopy /s /y /k "R:\ChromeUserData\Local State" %ramDiskImgDir%\ChromeUserData\
    xcopy /y /k R:\ChromeUserData\Default\*.* %ramDiskImgDir%\ChromeUserData\Default\
    xcopy /s /y /k "R:\ChromeUserData\Default\Plugin Data\*.*" "%ramDiskImgDir%\ChromeUserData\Default\Plugin Data\"

    (第一行可以代換成你的RamDisk備份目錄)
  7. 接下來設定開關機時自動執行這些批次檔:
    開始=>執行=>鍵入gpedit.msg
    點選電腦設定=>Windows設定=>指令碼 - (啟動/關機)
    分別將開機批次檔、關機批次檔加到啟動/關機的指令碼中
目前我這樣調整,覺得已經相當OK了。執行速度快,開關機時需要製少量資料,可以保留個人設定及Cookie (注意,網頁快取在關機後將不會被保留下來) 。

參考資料:


Update:
現在我在PC上跑Chrome,也會有因為硬碟瘋狂讀寫的現象了,2G Ram+E8400 CPU都慢到不像話。把Safe Browsing關了就一切正常,Google Chrome Help上的Thread也有提到這個問題。我猜測Chrome在Safe Browsing上不知道做了什麼鳥事?每下載一筆IP記錄就用一個Transaction去更新sqlite資料庫嗎?反正先停用Safe Browsing,等待Google修正這個問題吧....

2008年9月30日 星期二

Google Chrome瘋狂讀寫硬碟的問題

在EeePC上面使用了幾天的Google Chrome,我發現一個問題:Chrome程式執行一段時間後,就會開始瘋狂的讀寫硬碟,但CPU使用率仍是0%左右,使系統的整體速度變慢許多 (很明顯是I/O Bound) 。尤其對於EeePC這樣使用固態硬碟的筆電來說,一直讀寫硬碟須要比一般硬碟更多的時間,更會大量減低硬碟的壽命。對於使用一般HDD硬碟的電腦來說,似乎感受不太到這個問題。

在網路上找到這個解決方法:用Ramdisk彻底解决Chrome对硬盘疯狂折磨

簡單摘要一下:
  1. 安裝RamDisk
  2. 將Chrome的使用者資料路徑移到RamDisk上。
    在Google Chrome的執行捷徑上加上參數:
    --User-data-dir=R:\UserData
  3. 如果希望關機要保留使用者資料,就使用一些批次檔在關機/開機時執行備份/回復的動作
至於為什麼Chrome會這樣大量讀寫硬碟,上面的文章倒是沒提到。但我個人猜測:Chrome提供了對頁面快取進行全文檢索的功能,大量的讀寫硬碟應該是在建立全文檢索的索引吧。

2008年9月16日 星期二

Google Chrome 無痕模式實戰心得

Google在九月初閃電推出Chrome這款網頁瀏覽器,第一時間引起許多人爭相報導。。在使用一段時間後,我發現Chorme的一個特色「無痕模式」意外的好用。以下提供我的一些使用心得。

(P.S. IE8也有很相似的InPrivate模式,但我沒有灌IE8,就不多做解說了)

基本用途:不記錄瀏覽歷程

先來看一下什麼是無痕模式,引述Google官方的敘述:
當您想要以私密模式進行瀏覽時,例如,準備令人驚喜的禮物或生日時,Google Chrome 提供無痕瀏覽模式。您在進行無痕式瀏覽時所開啟的網頁不會記錄在您的瀏覽記錄中。 所有新的 Cookie 都會在您關閉無痕視窗後刪除。您可以使用不同的視窗,同時進行正常瀏覽和無痕式瀏覽。
簡單來說就是
  1. 不會留下瀏覽記錄,小孩子上色情網站不怕被爸爸媽媽抓到 (誤)
    咳咳,反正就是做事不留痕蹟,要買禮物送家人當作驚喜的話,不怕被發現就是了。
  2. 進入無痕模式時,不會使用瀏覽器中原本的Cookie,也就是你在所有網站的登入權限都會不見。 (不要懷疑,這是好事不是壞事)
  3. 離開無痕模式時,無痕模式中的Cookie都會被刪掉。不用怕Cookie沒清除乾靜,帳號被其他該電腦的使用者盜用。
要注意,無痕模式並不代表網站不會留下你的閱覽記錄 (如有疑惑,請再次詳閱Chrome FAQ) 。網站仍然會有您造訪的IP記錄。

檢視你的網頁隱私權設定

現在流行的許多Blog、SNS都可以為使用者的內容設定隱私權。舉例來說:Wordpress、Pixnet、無名小站這些BSP,都可以為每篇文章設定密碼,讓有密碼的人才能觀看。

如果你很在意你的隱私,想要試試看你的密碼設定是否正確,最好的方法就是親自試試看。但有一個小問題:你在發表文章的時候,通常是以網誌管理者的權限登入的,不用打密碼就可以看到自己的文章。那麼,要怎樣才能測試其他人看你的文章需不需要密碼呢?
  1. 最簡單的方法:登出後再試試看能不能看文章。簡單有效的方法,缺點是非常麻煩。你可能需要不斷的登入登出。
  2. 雙瀏覽器:
    使用Firefox登入Blog,修改文章並設定密碼。使用IE檢示Blog,因為不同瀏覽器間,並不會分享Cookie,所以IE的狀態會是未登入的使用者。這時你就可以用IE測試看看不打密碼/打錯密碼可不可以看到文章,來判段你的小秘密是否保密到家了。
  3. 無痕模式:
    類似雙瀏覽器的方式,但以Google Chrome代替Firefox,Chrome的無痕視窗代替IE就可以了。利用無痕視窗與一般視窗不共用Cookie的特性,可以輕鬆做到同時使用兩種權限測試你的網站隱私設定。
以前我若對SNS或Blog的隱私設定有疑慮,都是用雙瀏覽器法實驗清楚。自己開兩個帳號,馬上可以了解未登入、已登入使用者、好友分別可以看到自己的什麼資訊。現在這個動作使用無痕模式就可以輕鬆做到了。

以使用者身份預覽Google Sites網頁

Google Sites是Google推出的免費架站服務。但用過的人都會發現目前有一個缺點:以管理者登入時,所有網頁都會增加一些管理界面,導致和使用者瀏覽時的排版有所出入。雖然他本身有Preview Page As Viewer的功能,但是在Preview模式中只要切換頁面,又會變成管理者模式了。

下圖左側是登入的狀況,右側是未登入的狀況。 (點擊以放大)


聰明的讀者應該猜到怎麼做了吧:用一般模式管理文章、調整版面,而用無痕模式預覽即可。



圖片引用自維基共享資源

2008年9月12日 星期五

Blogtrans版本更新 (Rev15)

經過一些測試,目前無名轉Blogger、MT(Pixnet)轉Blogger這兩個功能應該接近穩定了,目前最高記錄是成功匯出839篇文章和1021則留言到Blogger。現在最新版本是Rev15,已經可以在Sourceforge下載。

列一下修掉的Bug:
  • Blogger的文章標籤中不允許某些特殊字元:!,&,<,>,@。 (不知道有沒有漏掉)
    如果匯入Blogger的XML檔,文章分類包函這些字元的話,就會發生可怕的靈異事件。系統會顯示你已經成功的匯入所有文章,而且你也會看到成功匯入成功。
    我目前是在程式中把這些特殊字元去掉。如果你在意標籤的話,也可以自行用文字編輯軟體,先將有問題的標籤全部取代成你想要的文字。
  • MT格式匯入時,日期仍然有Bug,簡單的修正了。
  • Blogger匯出時,之前會把作者印在除錯用的文字界面中。這時如果有不能轉成Big5的Unicode文字,可能會造程匯出失敗。算是個愚蠢的Bug,已修正。
  • 無名小站的XML格式,最近在檔案尾端加上了一些莫名奇妙的東西,而不符合標準XML規格,造成XML解析失敗。目前也已修正。

目前最高記錄是成功匯出839篇文章和1021則留言到Blogger。

我會將一些說明慢慢放到靜態頁面:Blogtrans首頁,遇到問題也歡迎回報。

Update:
跟據網友Pigy的回報,Rev16版修正了留言者的網址都會變成http://www.blogger.com/profile/1的問題。