讀彭明輝 blog 雜記

寫 blog 寫到一半去彭明輝的 blog 找資料,結果就接連讀了好幾篇文章(結果資料還是沒找到)。

很喜歡他的文章,總是可以顯現出他深刻的思考方式,不快速的表達自己的想法,但是提出的想法,總是…很有見識、深度(我不是很會描述),能給我啓發。

他說他高中就能不看註釋直接閱讀唐宋文,甚至一點秦漢文。大學的時候翹課讀哲學書籍。

不過,千萬不要以為聽懂他的課程內容就表示你懂得 Immanuel Kant 或 John Stewart Mill 的思想。Michael Sandel 很擅長在他設計的脈絡下引導學生去發現判斷對錯的各種角度(angle),也擅長把複雜而深奧的思想用簡潔的方式摘要成易懂的陳述,但是他在課堂上的介紹 都只能叫做「精簡版的二手傳播」。妳如果試著去讀  Immanuel Kant 或 John Stewart Mill 的原著(或全譯本),一定會發現讀不懂;如果妳硬著頭皮把原著(或全譯本)熟讀兩三次,我相信你一定有機會發現 Immanuel Kant 或 John Stewart Mill 的思想遠比 Michael Sandel 的介紹更精彩、深刻而富啟發性。

不僅哲學如此,社會學、人類學和其他人文、社會科學類的經典都有這樣的特性:原著(或全譯本)遠比二手傳播更精彩,更難讀懂;但是即使只讀懂原著(或全譯 本)的十分之一,往往收穫還是遠遠超過讀懂一整本的二手傳播。我自己的讀書經驗告訴我:二手傳播之所以易懂,是因為他們把原著難懂的部分都截去(隱藏起 來),只講易懂的;但是原著之所以精彩,卻正好就是因為難懂的部分。

我試着讀過康德的純粹理性批判,英文版的我看了幾頁完全不懂,網路上僅有的中譯本是文言文的,對我來說比英文還難懂。讀了他的文章又讓我想再試試看…

我想到了,或許可以從馬克思開始?

反省了一下,自己讀的書嚴重偏食啊,幾乎都是跟電腦有關的技術書。要有更深刻的思考,我得多讀一些哲學、社會學的書啊。

剛剛原本有點後悔自己國中高中文言文沒有學好,但是想一想,依照我自己的理念,既然我是現在才意識到文言文的重要性,那至少就現在開始就好,因爲在意識到學文言文的目的之前,恐怕就不是依照自己的意願去學的,也往往因此無法貫通理解(有人跟我說過國文不能用理解的)體會這門學問的核心。

原本應該是要寫另一篇 blog post 的,沒想到竟然就花了一個小時寫了這一短篇。

就連這一短篇也要花一個小時,寫得時候還頓頓的,覺得自己的中文文字表達能力並不是很好…抑或這是中文本身的限制,甚至是文字本身的限制?

我不喜歡將我寫的這些東西稱爲「文章」,因爲我覺得那個詞有一種「作文」的感覺(就是國文課要寫的那種),國文課的作文的目的不是爲了傳遞什麼實質的思想,以學生來說當然就是能拿高分爲主,以老師來說就是「提升學生的中文文字表達能力」吧?雖然我懷疑它的效果。

為什麼我們都應該離開 Facebook

Facebook 會追蹤你在網路上的活動

關於 Facebook 隱私權的負面新聞已經太多太多了,三天兩頭就有一篇,但是真的看到、真的在乎的人其實不多。

Facebook 為了讓廣告商能夠更精準的瞄準所要的客戶群,所以會儘可能收集使用者的資料。

很多網站上面會嵌入一些特殊的元素(如隱形的 <iframe>, 1平方像素的圖片等等),當使用者瀏覽這些網站的時候,瀏覽器也會載入這些元素(瀏覽器會將這些元素視為網頁內容的一部分),這些元素的來源是放在 Facebook 或 Facebook 合作公司的伺服器上,當瀏覽器從這些地方載入這些元素,伺服器上面就會記錄來源IP、瀏覽器版本、作業系統等等的資訊。

當你瀏覽有嵌入 Facebook 功能的網頁,也就是那些網頁上面有「讚」、「留言」按鈕,Facebook 知道你曾經看過這些頁面。

也有人發現就算你已經登出 Facebook ,它依然可以追蹤你(追蹤你瀏覽了哪些網頁,並與你的 Facebook 帳號產生關聯)。雖然後來 Facebook 有「修正」這個「問題」,但是他們依然會匿名的收集「網站效能資料」等等(這些資料不會與 Facebook 帳號產生關聯)。

我最近有一個親身經歷,我瀏覽了 Zimbra 的網頁 ,幾小時之後我就看到我的 Facebook 頁面出現了 Zimbra 的廣告。

參考資料:

Facebook 會掃描你私訊的內容

Facebook 也承認他們有這樣做。當你送出一個包含網頁連結的私訊,Facebook 就會將那個網頁的 Like 數 +1 。

曾經有一個 bug 會讓 Like 數一次 +2 。

來源:http://thenextweb.com/facebook/2012/10/04/facebook-confirms-it-is-scanning-your-private-messages-for-links-so-it-can-increase-like-counters/

你的資料會被鎖在 Facebook

你沒有辦法完全公開你在 Facebook 所發的動態,就算發動態的時候選擇「公開」。這個「公開」應該不是大部分人想像的「公開」:「公開」的意思是,對於所有 Facebook 使用者和應用程式而言是能夠讀取的,但是未登入的人就不行。也就是說,搜尋引擎裡面沒有辦法搜尋到你想要公開的動態。

你和朋友在 Facebook 上面所產生的資料沒有辦法被完整的備份。儘管 Facebook 有提供下載帳戶資料的功能,你能夠下載到的資料只是你能夠在Facebook 上面看到的資料的一部分(我覺得能看到的資料也只是 Facebook 所收集的資料的冰山一角),像是朋友 A 對你的動態按讚、你按了某個人的讚,這些東西是不包含在備份當中的。

試想有一天 Facebook 倒了,這些資訊、這麼多人所創造出來的人類智慧結晶,就會跟着 Facebook 一起沉下去了。

為了賺錢不擇手段

雖然說全世界為了賺錢不擇手段的公司還有很多。

為了自身利益而阻擋某些資訊的流通

如果你在 Facebook 分享這個網頁,它會拒絕你,因為「這個網頁可能不安全」。事實上這個是 F.B. Purity 的網站,F.B. Purity 是一個瀏覽器附加元件,可以讓你隱藏應用程式的訊息、隱藏投票等等。

從 2012/12/9 起,Facebook 使用者失去了投票反對使用條款變更的權利

在原本的 Facebook 使用條款當中規定 Facebook 如果要修改網站管理條款和隱私權政策 (Site Governance and Privacy Policy) ,必須要舉行線上投票,如果投票率超過全數使用者的 30%, 而且其中超過 50% 的人反對的話,Facebook 就不得修改。

在2012年12月初,Facebook 舉行了一次投票,這次所要修改的條款內容主要是允許 Facebook 未來修改條款內容時不再需要舉辦投票,最後約有 619000 人投票,但是比起 Facebook 總使用者數8億人的百分之三十小太多了。於是最後,條款還是被成功修改了。

參考資料:

我離開 Facebook 的話,我還有哪裡可以去?

我推薦 Diaspora, Diaspora 是一個開放原始碼、分散式的社交網路。他的運作類似電子郵件系統,任何人都可以架一個 Diaspora 伺服器(稱作 pod),每一個 pod 之間都是透過固定的協定溝通,不同 pod 的使用者之間一樣可以互相按讚、留言、私訊等等。

自己架伺服器的好處是,資料就在你自己的伺服器上面,你想要公開、銷燬,完全任你處分。

但是一般人沒有能力、時間自己架伺服器怎麼辦?你可以自己選擇一個你所信任的 pod 來加入(加入那個 pod 允許加入的話)。而且如果你不滿意這個 pod 或是不再信任這個 pod 維護者,你隨時可以將資料完整匯出,然後匯入到另一個 pod 上面。

Diaspora 的 pod 目前有很多(不過亞洲的似乎還很少),我目前在 diasp.de ,或許未來會自己架一個。

另外,Google+ 也是一個比 Facebook 好的平臺,你可以匯出比較多資料,也可以選擇真正公開你的動態。但是 Google+ 的依舊是由大公司來營運,也不透明。Google+ 算是一顆「比較不爛的蘋果」。

結語

社交網路最重要的地方依舊是人,其他社交網路沒辦法贏 Facebook 的還是這一點,我寫這一篇是為了讓更多在乎隱私、在乎資料、在乎 Internet 發展的人知道 Facebook 的壞處,還有替代方案。或許就會有比較多人去加入 Diaspora 或是 Google+ ,然後再吸引更多人。

authentication failed: Failed to create SASL client context: -1 (generic failure)

今天遇到這個問題
root@cnmc-kvm-test:/etc/libvirt# virsh -c qemu+tcp://192.168.1.5/system nodeinfo
libvir: RPC 錯誤 : authentication failed: Failed to create SASL client context: -1 (generic failure)
錯誤: authentication failed: Failed to create SASL client context: -1 (generic failure)
錯誤: 無法連上 hypervisor

問題似乎不在 client ,因爲 server 也有問題:
root@cnmc-kvm-test:/etc/sasl2# sasl-sample-server
sasl-sample-server: Allocating sasl connection state: generic failure

看了 archive.cyrus-sasl 上的討論,他說他看到 DNS 活動就在錯誤發生之前。我就靈機一動,因爲這臺 server 沒有 FQDN ,會不會是 DNS 的問題,於是我把 hostname 手動加到 /etc/hosts 當中:

192.168.1.5 cnmc-kvm-test

結果果真就好了!

得到的教訓是以後只要是 server ,DNS 都要先設定好…

Firefox extension 偵測新 URL 的載入

我想要寫出能夠偵測新頁面載入,並依 URL 附加特定 content script 的功能,目前試過用 page-modtabs 實做。

這是 page-mod
var data = require("self").data;
var pageMod = require("page-mod");
pageMod.PageMod({
include: /https?:\/\/www\.example\.com\/.+\/?$/,
contentScriptFile: [data.url("jquery-1.8.3.min.js"), data.url("read_aha.js")],
onAttach: function (worker) {
worker.port.on("testing", function (m) {
console.log(m);
});
}
});

這是 tabs
var data = require("self").data;
var tabs = require("tabs");
var { MatchPattern } = require("match-pattern");
var home_pattern = new MatchPattern(/https?:\/\/www\.example\.com\/?$/);
tabs.on('ready', function(tab) {
if ( home_pattern.test(tab.url) ) {
console.log('home_pattern matches!');
var worker = tab.attach({
contentScriptFile: [data.url("jquery-1.8.3.min.js"), data.url("read_aha.js")],
onMessage: function(msg) {
console.log(msg);
}
});
worker.port.on("testing", function(msg) {
console.log(msg);
});
}
});

兩個實做的功能相近,但是卻有不同的彈性與問題。

page-mod 的話,每一次 Firefox 送出新的 HTTP Request 就會進行比對,要是目標與 include 指定的 pattern 相符,就會觸發,載入 content script 。page-mod 麻煩的點在於,有時候請求的 URL 會包含一長串的 HTTP GET 參數,導致要設計 regular expression 的時候增加了很多複雜度。相對的,有一些網站頁面載入之後會自動移除那些 GET 參數,若是只需要偵測網址列 URL 的改變,那就簡單多了。

tabs 的話,則是偵測每一個分頁的網址列 URL 是否符合 pattern ,若符合才載入 content script 。但是我遇到很麻煩的問題是,對於使用者在網址列按 Enter 或重新整理的情況下,會觸發 pattern 檢查,但是若是使用者在頁面當中點了超連結,進入一個新的頁面,縱使網址列的 URL 已經改變,依然不會觸發檢查,因此 content script 永遠不可能被啓動。看起來用 tabs 的另一個好處是,相較於 page-modtabs 在檢查 pattern 時,可以引入其他的檢查條件,就在 if ( home_pattern.test(tab.url) ) 加上其他條件即可,我覺得未來我蠻有可能會用到其他檢查條件。

Stack Overflow 上面有人提到這個問題,乍看之下好像是無解,但是後來我查到用更低階的 XPCOM API 應該是可以做出這個功能,但是我還沒試。

Firefox Add-on SDK content script include

做個小筆記。

像是這樣:

pageMod.PageMod({
include: /https?:\/\/www\.example\.com\/.+\/?$/,
contentScriptFile: [data.url("jquery-1.8.3.min.js"), data.url("read_aha.js")],
onAttach: function (worker) {
worker.port.on("testing", function (m) {
console.log(m);
});
}
});

什麼時候會 include 這個 content script 呢?實驗發現

  • 當分頁 URL 符合這個 regex 的時候
  • 以下這些不會:
    • <link href="xxx.css">
    • XMLHttpRequest
  • 但是 <iframe> 會!

把 Bitcasa (Linux) 快取放到 Ramdisk 來加速

在 Ubuntu 底下用 Bitcasa 的時候,時常會遇到整個系統變得沒有回應或是回應變慢的問題。應該是因爲網路 I/O 比較慢,還有硬碟快取的問題。

網路速度是很難改變的,於是我開始研究硬碟快取的問題。

系統監控 可以觀察到,Bitcasa 把 cache 存在 ~/.bitcasa/caches ,然後預設它會自己調整 cache 的大小。

使用 Bitcasa 上傳時,我注意到硬碟 IO 幾乎整個被吃滿,所以很容易導致其他應用程式沒有回應(在等待硬碟 IO),而且把硬碟當快取這樣讀寫似乎也有點傷硬碟。另外在網路活動方面看到它是一個脈衝一個脈衝的傳資料,我猜測這應該也是在等待硬碟 IO 的關係。

我試過在 系統監控 裏面把 Bitcasa 程序的優先度調低,但是效果並不顯著,後來我靈機一動,何不把快取放到 Ramdisk

於是:

$ sudo mount -t tmpfs -o size=4G,mode=0777 tmpfs /home/pellaeon/.bitcasa/caches

(在這之前我還有把原本 .bitcasa/caches 底下的東西清掉,反正原本的快取用不到了,也很佔空間)

把 Bitcasa 打開,現在變超快!bottleneck 從硬碟 IO 變成網路 IO ,先前遇到的網路 IO 斷斷續續的問題現在也消失了,然後現在硬碟 IO 幾乎只剩讀取原本要上傳檔案的部分而已。其他應用程式也不會一直當了。另外還有保護硬碟、重開機自動清快取(重開機之後 ramdisk 的資料會消失,於是快取就不會佔掉硬碟一大塊空間了)的功效,真是超級一舉多得!。