十月 3, 2013
» [tips] [Howto] Support Nvidia Optimus on Ubuntu 12.04 LTS (precise) [No Bumblebee needed]

For laptops which use muxless Nvidia Optimus, there's a new way to support officially on Ubuntu 12.04 LTS.

 #sudo apt-get install nvidia-319-updates nvidia-prime xserver-xorg-lts-raring 

The command will upgrade
 * kernel to 3.8 ,
 * X server RandR to 1.4
 * Install Nvidia driver version 319.

After reboot, it will use nvidia driver by default.
There is no need to upgrade to 13.10 if you prefer 12.04 LTS.

一月 17, 2013
» [tips] g_clear_pointer



因為在tracking一個bug,
所以要backport indicator-power這個package到ubuntu precise.
意外發現了glib在2.33之後支援的一個還滿好用的function:
g_clear_pointer()

簡言之以前的寫法,要把物件刪除再把指標設為NULL:

if (priv->object_path != NULL) {
g_free(priv->object_path);
priv->object_path = NULL;
}
現在只要一行就可以達成了

g_clear_pointer (&priv-;>object_path, g_free);
當然要backport的話作法就是相反~~

十二月 17, 2012
» 在 KVM 中安裝使用 VirtIO 的 Windows 虛擬機

前幾天在聽 JackZ 大哥講課時看到他DEMO了如何在Ubuntu的KVM上安裝支援VirtIO的Windows XP,因此撰寫這篇文章作為紀錄。 VirtIO的相關資訊可以看這裡: http://www.ibm.com/developerworks/cn/linux/l-virtio/ 不過KVM有以下兩個缺點: 1.介面還沒有完全繁體中文化,這個看看有沒有熱心的朋友可以去幫忙翻譯一下。 2.目前不支援像VirtualBox那樣方便的共享資料夾設定。 以下為步驟紀錄。 準備工作: 抓取VirtIO驅動光碟和軟碟: https://github.com/lihuiba/virtio-win.vfd/downloads http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/ 首先在

十二月 2, 2012
» 讓OpenSUSE 11.0 每個虛擬主控台都有背景

日前使用openSUSE 11.0,驚訝於他的tty1有背景。但其他tty就沒有相對應的背景,因此上網找資料想達成這個目的。 以下即為我找到的方法 openSUSE的文字背景,是bootsplash這個程式提供的功能。 這個程式主要提供開機畫面(silent),以及tty背景畫面。 該程式主要設定檔在/etc/splashy/config.xml 主題放在/etc/bootsplash/themes/資料夾中 預設主題為openSUSE,在其中的config資料夾中,存有不同解析度的config檔案。 但這些config檔案載入以後會秀出silent的畫面,也就是會出現開機畫面。 因此我們要對這個檔案作修改,讓它只含有background的設定。 可以先看/proc/splash檔案中的內容,了解splash運作的模式 # cat /proc/splash 以

» 好文一篇:Re: [問卦] 有沒有念資訊一定要討厭windows的八卦

這篇文章看了覺得寫的不錯,因此經過原作者同意後,就轉過來了。 文章代碼(AID): #1BR7wzrt (Gossiping) 作者 Freak1033 (金が信念! XD) 看板 Gossiping 標題 Re: [問卦] 有沒有念資訊一定要討厭windows的八卦 時間 Sat Feb 6 04:25:29 2010 ─────────────────────────────────────── ※ 引述《HollisterCo (海鷗)》之銘言: : 身邊有些朋友念資訊的 : 但是莫名其妙的就會說你怎麼還在用微軟的東西 : 媽的爛死了之類的 你看linux都不會當機 也不會中毒 : 用linux才屌!! 用甚麼GUI 弱者才再用 : 強者都用CLI!!!! : 是不是真的打打指令就比較厲害?????

» 我對自由軟體的一些想法

這是好久以前我在ubuntu-tw論壇跟人貼過的文,覺得很能代表我對自由軟體的看法 和大家分享一下。 ================================================ http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=73340#forumpost73340 #315 回覆: 企業引進Linux取代Windows之評估 雨蒼 2009/4/9 12:15 小弟目前有上MCSE課程,也上過NCLP課程並取得認證。微軟認證也考了兩張。這兩個課程幾乎都聽了兩次。 小弟深深感到,如果我是企業,我真的比較會考慮微軟。為什麼? 1.微軟解決方案非常完整。他們的解決方案可以解決幾乎大部分的需求。甚至針對企業級的架構也有非常耐用的解決方案。 2.當你出問題的時候,微軟可以保證幫你解決。 3.

» XMPP 初探

最近剛好有機會碰到XMPP,把一些學習心得記錄在這邊。 XMPP(Extensible Messageing and Presence Protocol) 是一種IM的通訊協定, 其前身為Jabber,後於IETF標準化為RFC3920。 除了一般通訊協定常有的Server與Client外,XMPP還另外定義了Gateway, 只要通過Gateway,便可以與其他的IM Protocol通話。 XMPP最大的特色在於傳輸的內容。其傳輸的內容為XML;藉由XML的擴充性, 可以達到許多的擴展應用。不過也由於傳輸內容為XML,因此無法提供二進制的資料。 檔案傳輸需藉由外部HTTP。如果不可避免,XMPP協議提供了Base64的方式傳輸帶編碼文件。 XMPP每個用戶在網路上都有個獨特的Jabber ID,簡稱為JID。 JID由id, domain 與 resource3個部份組成。其

九月 18, 2012

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 「黑天鵝效應」讀書心得

書籍請見博客來

簡短摘錄書籍內容

書籍內容分成四部。
  • 第一部從知識論角度來說明人類思想的盲點。
  • 第二部舉證了「預測」本身的荒繆。
  • 第三部針對有數學、科學背景的讀者所準備,提供區分真正的不確定性方法。
  • 第四部簡短分享作者個人面對黑天鵝事件的態度。
作者在前三部所作的陳述,也就是針對歷史的不透明性可從三個面向來解釋:

理解力的幻覺:面對複雜的世界,人類心智卻自以為可以掌握全局。

分析我們是如何思考的,如何因為錯誤的思考方式,讓我們以為「預測」有效。
作者舉了「火雞問題」、「確認偏誤」、「敘事謬誤」、「沉默證據」、 「戲局謬誤」幾個主題來說明人的思考模式不是正確的。

火雞問題

一隻被餵養了 1000 天的火雞在第 1001 天時,必定保持與第 999 天時的信念一般 --- 必定有一善良生物提供牠當天所需的食物,讓牠無憂無慮地再過一天。 然而事實是該善良生物會在第 1001 天將牠變成某人的盤中美食。
從時間序列資料歸納事物發展的模式,並從此模式推導未來的情況是不合理的。 「現在事件」所需的發生條件並不等於「未來事件」所需的發生條件。簡單地講, 我們都知道地震對股市的影響是非常強烈的,且往往是負向影響, 若一高傷害性的地震在 2009 年 1 月 1 日上午 5 點發生, 那麼利用 2008 年 12 月 31 日前所歸納的預測模型可應用在 2009 年 1 月 1 日上嗎? 絕對不行。我們就是無法預測突發事件,像是地震、 SARS、次級房貸…等及其他根本講不出名字的意外。

確認偏誤

一命題在通過百億次驗證後為真,也不表示該命題的確為真; 但該命題卻可以在一次驗證為假後,確認命題為假。
「知道它是錯的」絕對是對的,而「知道它是對的」還是有可能為錯。

敘事謬誤

講故事讓人們得以將真實世界的 4D 模型轉成一個 1D 線性的歷史故事,這有助約化爆炸資訊。
通常一般人認為刪減掉的資訊不過是雜訊而已,但作者認為有些雜訊其實就是隻黑天鵝。

沉默證據

有一種非常老套的騙術,首先是收集電子信箱,愈多愈好,假設收集了 10000 個信箱, 其中一半的信箱,寄給他們的訊息內容是洋基將在5月10日的比賽中打敗紅襪, 另一半則寄給他們紅襪會擊敗洋基,等到比賽結束後,留下預測對的 5000 個信箱, 其中 2500 個人再寄給他們洋基會在5月11日擊敗紅襪,而另一半則寄給他們紅襪打敗洋基。 就這麼經過5個回合後,將有 10000除以32 約 312 個人是一直收到預測準確的信件,這時候, 再寄給他們:「預知下回比賽結果,請先支付一定金額」。如此一來,不管有多少人相信這個騙術, 對寄信人而言,所支付的金額都是純益,因為他根本沒花錢在作賽事預測,是個無本生意。
那曾收到錯誤預測信的 9688 人,每個人都是沉默證據。但對於另外的 312 人來說,他們得不到這種資訊。
這沉默證據的出現也呼應了作者在一開始所說的,沒看過的書比較重要。
事實上,沉默證據到處都有,只是需要花些精神才能發現。我們拿主動型股票投資基金來說, 每年財經雜誌一定會統計過去一年的基金投資績效並排序,而我們常常可以發現這些基金的排名每年都不一樣, 絕少有同一支基金能長時間(十年以上)排在前頭,而那些績效不如大盤的基金對投資人而言,就是一種沉默證據, 它告訴我們,主動投資並不一定有比較好的投資績效。而基金排名只是一種大風吹的遊戲, 所有人都可以坐過第一名,也有機會坐在最後一名,所有股票型主動基金的整體績效約等於大盤績效。

戲局謬誤

在我們學過的數學、企圖解決問題的模型中,必定在假設及邊界條件上簡化了真實世界的複雜度, 因為只有在簡化模型中,我們才能求解答案。
作者希望我們這些書呆子,在應用模型上,不要以為解值可以百分百套用到真實世界中。 要在心中保留一個想法:「這個解答是理想模型中求解的」。

回顧性扭曲:問題總在事後才被檢討。

「預測」根本不準,就算錯了,總可以找到個理由證明。 而通常的藉口就是:「原模型在考慮黑天鵝事件後就能符合未來」。
作者從幾個實證方法來說明「預測」沒有用。

知識傲慢

學得愈多,反而對於未知事物的預測就愈不準確。

意外對計劃的單邊效應

大部份的意外造成計劃成本增加、進度變慢或是品質下降,絕少有意外是幫助降低成本、減少工期及提昇品質。
這原因通常是我們這些書呆子在套模型時,會將無法估量的因子去除,而這些因子多半是對計劃有害的。

預測錯誤的特性

每發生錯誤預測後,真值會離預測值更遠。譬如:一個計劃預期需要七十九天完成,到了第七十九天, 如果計劃尚未完成,那麼預期還需要二十五天才行。但到了第九十天,如果計劃尚未完成, 那就還需要五十八天才能完成。到了第一百天,預期還要八十九天才能完成。 到了第一百一十九天,預期還要一百四十九天才能完成。到了第九百天,如果該計劃還是沒有完工, 你將預期多花一千五百九十天。當你等得越久,你預期要再等待的時間就越長。

不經意的發現

今日大多數人對世界影響巨大的發明認定是電腦、網際網路及雷射。而這三項發明都是不經意的。
因為有太多有用的工具、產品是在意外中誕生的,所以在策略管理理論中,有人堅持一種 r 策略的經營模式, 它的意義是透過對生物系統的學習,將其繁殖後代的策略應用在企業管理中。 以一種「機會主義」式的繁殖策略,採取「多產」的方式,亦即,在有限能量和物質的限制下, 對每一個繁殖後代,只能做很少的能量和物質投資【策略九說,2000】。相對於 K 策略,是將能量與物質其中投資在一個後代上, 容易在波動高、意外多的環境下失敗, r 策略提供了生存在「規模可變性世界」的能力。

三體問題

在太陽系中,如果只有二顆行星,則無論它們的起始位置為何,我們都可以計算出它們在未來某時點的絕對位置, 然而再增加一顆行星後,此行星的初始位置將嚴重地影響它們未來的位置,原因是「不可積性」。 這也證明了機械論的謬誤。
在第二部的最後一章,作者提供了幾個面對黑天鵝事件的技巧:
  1. 分清楚你從事的工作受正面黑天鵝事件還是負向黑天鵝事件的影響。
  2. 不要尋找明確而狹隘的東西。
  3. 抓住任何機會,或任何看起來像機會的東西。
  4. 要小心政府的明確計劃。
  5. 別浪費時間和預測者對抗。

被「柏拉圖化」:事件被權威、飽學之士歸納、簡化了。

真正的不確定性與機率分配的差別: 一個可以計算,一個只能承受。
作者在這個部份大肆批評 Black-Scholes-Merton 方程式,認為他們不過是讓大家能接受這個公式而已, 發明這個公式的人應是 Louis Bachelier 和 Edward O. Thorp,且原創公式並未要求使用高斯模式。 同時他也批評馬可維茲的現代投資組合理論、夏普的 CAPM 是以高斯模式為基礎。
但就這部份以我目前所學尚無法確認究竟誰是正確的。或者是說,在把高斯模式換成冪法則、 碎形機率等更符合現況的機率分配,那麼就皆大歡喜了,我們在學術上的任務不就是把前人研究的缺點加以改進嗎!
這三個面向,也依序擴展成第一部(理解力的幻覺)、第二部(回顧性扭曲)、 第三部(被柏拉圖化)的內文。
作者強調在歷史的不透明性中,我們只能把垃圾資料送進不一定正確的模式中,並得到垃圾預測 [1]
[1]既然從歷史資料,我們無法歸納準則,從而避免錯誤,達到以古為鏡,可以知興替。那麼整個歷史學科還有存在的必要性嗎? 這一點,是我這個歷史門外漢的疑點。
最後在第四部中,說明幾個如何面對「未來不可預測」的方法, 像是儘可能地嘗試,別擔心小失敗。

結論

「預測未來」這件事到底存不存在?
  1. 存在! 則社會依舊照它原本的規則繼續運作,有些人命中結果賺大錢、有些人猜錯下地獄。
  2. 不存在! 那糟了,我們該如何生活? 對「明天太陽依然昇起」這件事沒了信心,那麼我們還須應付下個月的信用卡帳單嗎? 既然如此,工作、讀書、生小孩也就不重要了!
作者說明了黑天鵝事件總會發生,且大幅地改變原來我們對未來的期待, 黑天鵝事件總讓我們預測錯誤 --- 不過這沒有關係。
原本我們處在「預測有效」的世界中,我們總是在錯誤地預測, 而事後,我們依舊正常地生活,有時候會塘塞個錯誤理由,甚或遺忘了當初預測的結果, 在未來事件真的到來時,天真地認為這結果就是我們想要的。
相不相信「無法預測未來」這命題對社會運作不會有影響。該來的總會來,不該來的你也等不到。 唯一的差別是我們的心智能否接受這個事實,接受「無法預測未來」這個事實, 能讓我們把資源配置在「準備」而不是「預測」,這更有效地減緩壞黑天鵝事件(巨大的風險)所造成的損失, 或是面對好黑天鵝事件(巨大的報酬)。不會把頭埋在沙中, 堅決宣誓這個世界是由黑暗及二氧化矽所組成的烏托邦。
目前的現實世界,大部份人都相信事物具備可預測性且預測結果的正確性與歸納準則(計算模式)的吻合度呈正相關。 就此概念,作者花了 400 多頁的內容為我們否證「未來的可預測性」、 駁斥柏拉圖模式不能應付真實世界、 分析黑天鵝事件(真正的不確定性事件)與可預測的機率事件之間的差別。 這部份有點冗長,但從作者整理的資訊看來,有些研究早就成功驗證, 只是待由他來整理、分享與我們而已。
在如何面對「黑天鵝事件」上,他不過以 5 頁蓼蓼帶過,這點令人有點失望。 我在閱讀本書約一半內容時,已完全相信他所提及「未來的不可預測性」, 並急著想要跳過這些更詳細的證明以得知作者避開負向黑天鵝事件及擁抱正向黑天鵝事件的方法。 最後的這 5 頁,除了讓人有著無法痛快的感覺, 卻也間接證明了「未來不可預測性」的確是無法掌握,沒有單一方法、特定手段可以避開/迎向它, 我們所能作的就是在心裡放置著一隻黑天鵝,不讓牠跑出柏拉圖圈。
如果這本書說對了,那麼現在對於那些整日與「預測」有關的工作怎麼辦? 像是證券分析師、市場分析人員、 專案可行性評估人員…。

證券分析師

股價不能預測、公司經理人良心不能預測、政府法規不能預測…,那我們幹麼要買股票! 因為我們必須利用股債組合打敗通貨臌脹率來維持我們的實質購買力。
證券分析師的工作目標是要讓投資人能獲得超額報酬。但是在效率市場的假設下,長期而言, 投資人只能獲得股市的平均報酬。就算是某些分析師真能神準預測股票的漲跌,但看看「沉默證據」後, 你會發現你挑不到那個神準分析師。
這些精研產業、公司的分析師,我是認為他們的存在只是在證明投資人不是理性之人。 如果可以,不應該找證券分析師的工作,因為當投資人變成理性之人後,買的會是指數型基金。 這時,分析師的話就沒人要聽了。因為有大量的證據顯示, 專業投資經理不能打敗購買和持用廣泛股票的指數基金【漫步華爾街,2004】。

市場分析人員、專案可行性評估人員

在產品開發或是專案推動上,不可避免地要作市場調查,或是可行性評估。在這些研究中, 必面臨到某些變數的預測:利率、需求量、物價成本、人力成本、可使用資源量…。那麼在不可預測下, 難道我們就要放棄作調查嗎? 那麼專案是否執行? 就只能靠丟銅板決定,我想老闆們絕對不會接受這種說法。
我認為如果擔任到這方面的職務,就只能硬著頭皮,照著傳統上、其他人大量使用的方法論去作預估。 要不然,生不出企劃書,到時候,銀行也不可能給專案貸款,或是工廠根本無法向上游供應廠商叫料, 這只會增加企業經營成本。
雖然不得已進行預測,但請在心中保留著一份對「企劃書」的質疑,它可是在柏拉圖圈內的成品。
因為意外總會打亂計劃,所以我認為作任何事應該以「存在」為最高目標。凡事不要過份強求, 不要認為作對一件事,整個人生就高枕無憂,如同 r 策略一般,儘量掌握每個小機會。
我們以公司經營績效來看,為了賺取高額利潤,勢必要忍受高額風險,像在產品研發上, 如果要它能賺大錢,勢必研發費用會提高,在面臨幾次研發失敗後,公司資本撐不過虧損, 那就只能關廠走人。
像只作光碟片的 2396 精碟過去也有 359 元的行情,如今不到 1 元。 而產品線豐富的 GE 卻已經存活了 133 年了。另外像台積電目前也打算轉型作太陽能相關產業, 這也說明了單靠一種產品,有可能獲利豐厚,但在趨勢轉變下,該單一產品就會變成最大負擔了。
最後,這本書給我的最大收獲,就是別浪費時間了, 停止「預測」這檔事吧! 直接找尋避險管道,或是配置可消減個別風險的事件組合, 像是買進股票並在高檔買進賣權、購買終身夀險及保持適度運動維持健康。

參考書目

  1. Nassim Nicholas Taleb,2008.05,黑天鵝效應,大塊文化。
  2. 吳思華,2000,策略九說,臉譜出版。
  3. Burton G. Malkiel,2004.05,漫步華爾街,天下文化。
備註:這是本學期「期貨與選擇權」的期末讀書心得報告,原本是用 rst 格式寫成的,交報告時是在 Ubuntu 中用 rst2latex -> latex -> dvipdfmx 轉成 pdf 檔; 而貼到 blog 上,則是用 rst2html 即可。十分方便。原始 rst 格式,請點選這裡下載; pdf 格式請點選這裡下載。

» 轉移至 Nginx

2012 三月全世界的網頁伺服器市佔率圖 from netcraft.com 

上圖可以看出歷久彌新的 Apache 持續雄距首位,有超過 15 年的時間,沒"器"可挑戰它的地位。直至 Nginx 的出現,或許它現在只有 10% ,但從各方評價看來,它絕對是 Apache 有史以來最強大的對手。短短 5 年,它已經爬上第 3 名的位子,從趨勢線上看來,要超越 IIS 也是有很大的機會。

而 Nginx 為什麼短短幾年竄起,絕不是因為『用的人多』。如果是這種原因的話, palm 、 Windows OS 、 x86 CPU 、 PlayStation 到現在會活得好好地,因為它們都曾有超越 50% 的市佔率。

Nginx 被選擇的原因有幾點:
  1. 跨平台: *nix, Mac, Windows 皆可。這那算優點呢!!! 那個網頁伺服器沒跨平台,喔喔~講太早了, IIS 就是不能跨平台,或許這就是它市佔率持續下降的原因,強迫綁 Windows OS ,結果只要 Windows OS 下滑,它就必死無疑了。
  2. 開源的 BSD-like 授權。
  3. 靜態檔案輸出省資源。
  4. 不怕慢速連線。
  5. 比較不怕 DOS 攻擊。
  6. 穩定性高。
簡單講,除了效能,還是效能。而我要的功能, Nginx 都有提供,唯一算得上缺點的,就是因為 Apache 活得比較久,安全性已被磨得比較好了。所以對於我們愛研究的研究生來說,還有什麼理由不切換過去呢? 大概只有「懶」是個原因吧!

目前我們使用 Apache + Django 的方式多是利用 mod_python 的技術。然而這種作法是比較不安全的,把很多事都包給 Apache 去作,那不管是我們程式設計有錯,或是它用的元件有錯,只要出錯那就是管理員等級的錯。不過這個「錯」也不算是 Apache 的錯,是「用 mod_python 」的錯,如果用的是「 mod_fastcgi 」,那安全層級就能拉高了。

所以說來,這次的「升級」是把「 mod_python 」丟掉,改用「 mod_fastcgi 」。那麼我心裡想想,都要換成 Django 自己跑 fcgi mode 了,為什麼不乾脆連前端網頁伺服器也換一下呢! 因為重點已換成 Django 的 fcgi server , Apache 的重點性大減,前端網頁伺服器的功能只剩下靜態檔案輸出、虛擬站台切換、 https 處理等,那我何必跑一個 Huge Apache 呢? Nginx 就是我的新選擇。

安裝很簡單,如果是在 Ubuntu 中,請打:

$ sudo apt-get install nginx

如果是在 Windows 中,請到官網下載 nginx.zip 檔,解開了,就是一個可執行的 nginx 程式。

而我用的方法是下載源始碼自己編譯:

$ wget some_file_link.tgz
$ tar -zxf some_file_link.tgz
$ cd nginx
$ sudo apt-get install libpcre3-dev libssl-dev # 這些是編譯時,須用到的函式庫程式碼
$ sudo apt-get install libxml2-dev libxslt-dev # 這些是編譯時,須用到的函式庫程式碼
$ sudo apt-get install libgd2-xpm-dev libgeoip-dev # 這些是編譯時,須用到的函式庫程式碼
$ ./configure --prefix=/usr/local/nginx --with-debug --with-http_dav_module \
--with-http_addition_module --with-http_geoip_module --with-http_gzip_static_module \
--with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module \
--with-http_ssl_module --with-http_sub_module --with-http_xslt_module \
--with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail \
--with-mail_ssl_module
$ make
$ sudo make install

這樣 Nginx 就安裝完成了。

接下來,我們作 Django 程式的設定,讓它可以跑在 fcgi mode 上,方法很簡單,原本我們在本機開發時,都是用:

$ python2.7 manage.py runserver 127.0.0.1:8080

讓它跑在 http://127.0.0.1:8080/ 上,現在則改用:

$ cd /home/somewhere
$ su - someuser -c "python2.7 manage.py runfcgi host=localhost port=3033 daemonize=true method=threaded workdir=/home/somewhere pidfile=/home/somewhere/fcgi.pid"

這樣 django 會在 127.0.0.1:3033 中,幫我們開一個 someuser 帳號權限的 fcgi server , daemonize=true 則表示指令打完後,它就背景處理了,想要把這個 fcgi server 殺掉,就去看看 /home/somewhere/fcgi.pid 的內容,裡面的編號就是系統行程編號, kill 那個編號就能關 fcgi server 了。

同時殺掉 fcgi server ,再馬上啟動它的指令可參考如下:

$ su - someuser -c "kill `cat /home/somewhere/fcgi.pid` && python2.7 manage.py runfcgi host=localhost port=3033 daemonize=true method=threaded workdir=/home/somewhere pidfile=/home/somewhere/fcgi.pid"

請注意在這個階段,你用瀏覽器去看 http://127.0.0.1:3033/ 是沒反應的,因為它現在跑的是 FastCGI 協定,不是 http 協定。瀏覽器無法跟 Django FastCGI 溝通。

接下來,我們再到 nginx.conf 去設定。Nginx 與 FastCGI Server 互動原理如下:
圖來自陈辉的博客
先由 Nginx 與瀏覽器互動,得到 GET, POST 等變數後,整理成 fastcgi 協定的變數,然後用 Socket 或 Port 方式傳遞給 FastCGI Server ,接下來就是 FastCGI 去驅動程式去處理,完成後拋回。

以下是 nginx.conf 的設定範例:

user www-data; # 子行程用的是 www-data 帳號
worker_processes 4; # 常駐 4 個子行程
pid /var/run/nginx.pid; # 紀錄母行程的編號
http {
    server_tokens off; # 網頁上不顯示伺服器版本編號
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 30;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    gzip on;
    gzip_disable "msie6";
    server {
        listen 80;
        server_name www.whatever-you-want.com.tw;
        root /var/www;
        index index.html;
        access_log /var/log/nginx/TW-access.log;
        error_log /var/log/nginx/TW-error.log;
    }
    server {
        listen 443;
        server_name www.whatever-you-want.com;
        keepalive_timeout 60;
        ssl on;
        ssl_certificate /etc/ssl/hoamon.info/hoamon.info.crt;
        ssl_certificate_key /etc/ssl/hoamon.info/hoamon.info.key;
        location "/" {
            fastcgi_pass_header Authorization;
            fastcgi_intercept_errors off;
            fastcgi_pass 127.0.0.1:3033;
            fastcgi_param PATH_INFO                          $fastcgi_script_name;
            fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
            fastcgi_param  SERVER_SOFTWARE       nginx;
            fastcgi_param  QUERY_STRING                $query_string;
            fastcgi_param  REQUEST_METHOD         $request_method;
            fastcgi_param  CONTENT_TYPE                $content_type;
            fastcgi_param  CONTENT_LENGTH          $content_length;
            fastcgi_param  SCRIPT_FILENAME           $document_root$fastcgi_script_name;
            fastcgi_param  REQUEST_URI                     $request_uri;
            fastcgi_param  DOCUMENT_URI                 $document_uri;
            fastcgi_param  DOCUMENT_ROOT            $document_root;
            fastcgi_param  SERVER_PROTOCOL         $server_protocol;
            fastcgi_param  REMOTE_ADDR                 $remote_addr;
            fastcgi_param  REMOTE_PORT                  $remote_port;
            fastcgi_param  SERVER_ADDR                  $server_addr;
            fastcgi_param  SERVER_PORT                    $server_port;
            fastcgi_param  SERVER_NAME                  $server_name;
        }
        location "/media" {
            autoindex on;
            root /home/somewhere/media;
        }
        access_log  /var/log/nginx/whatever-you-want.access_log;
        error_log   /var/log/nginx/whatever-you-want.error_log;
    }
}

上面有兩個虛擬站台,一個是給 www.whatever-you-want.com.tw ,一個是給 www.whatever-you-want.com 。

www.whatever-you-want.com.tw 只是單純的靜態網站,預設首頁是 http://www.whatever-you-want.com.tw/index.html ,而它的硬碟位置在 /var/www/index.html 。

而使用者若是瀏覽 https://www.whatever-you-want.com/media 的連結,則 Nginx 會給它 /home/somewhere/media 資料夾內的所有檔案。除了 /media/.* 外,其他的連結都會用 3033 port 送到 Django FastCGI Server 處理。

而使用 https 的方法,只須要設定 3 個變數值: ssl , ssl_certificate , ssl_certificate_key 即可。

設定完成後,用指令開啟 Nginx :

$ /usr/local/nginx/sbin/nginx

重新載入:

$ /usr/local/nginx/sbin/nginx -s reload

關閉:

$ /usr/local/nginx/sbin/nginx -s stop

這樣 Nginx 伺服器就建立完成了。

在新架構下,可以由系統管理員獨立控管 Nginx 網頁伺服器的開啟、關閉,而讓程式設計師,自行作 FastCGI Server 的管理,程設師自己作程式更新、套用,避免給予過多的權限。畢竟這兩者的知識領域是有別的,少有人兩邊都作得很好。

=== 以下可能是 *nix(含 Mac) 專用(因為我不知道 Windows 能不能作 unix:socket 的指定) ===

如果我們一台機器有多個 django-base 的虛擬站台,那麼一個 django-base project 就要花一個 port ,這對於系統管理員及程式設計師而言,容易有搞亂的可能性,畢竟 "網址" <=> "port" <=> "django-base project" 的過程當中,是文字對應數字,再對應文字,難以記在人的腦中(也可能是我的記性比不上平均值吧!)。

所以我建議使用 Unix Socket 方式作對應。程式設計師把 socket 開在程式庫的 root 資料夾中,並取名為 django.socket 。再將 django.socket 權限設為 770 ,然後系統管理員把這個 django.socket 擁有群組設為 www-data 。

程式專案在 /home/someproject/ ,設定範例如下:

$ cd /home/someproject && /usr/bin/python2.7 manage.py runfcgi socket=`pwd`/django.socket method=threaded workdir=`pwd` pidfile=`pwd`/pid daemonize=true

上面程式設計師跑起一個 django-base 專案,並將 socket 開在 /home/someproject/django.socket 。

然後系統管理員作權限設定(也可以用 visudo 指給程式設計師作權限設定):

$ sudo chgrp www-data /home/someproject/django.socket
$ sudo chmod 770 /home/someproject/django.socket

系統管理員再把 nginx.conf 原本的 fastcgi_pass 127.0.0.1:3033 設定改如下:

        fastcgi_pass unix:/home/someproject/django.socket;

改成這樣的設定方式,對程式設計師來說,永遠是把 socket 開在同一個專案資料夾中,並命名為 django.socket ,而系統管理員也知道一定是專案資料夾下的 django.socket 。少了數字 port 的對應記憶,減少錯誤的機率。

» AWS 初試

因綠際會讓我有機會去研究 Amazon Web Service 。那是個與 GAE 功能相同,但操作模式不盡相同的雲端服務。

GAE 像是個套裝雲端平台,有些東西它已幫你決定好,要就用,不用就拉倒,當然可以寫 ticket 去建議他們,但不一定會立案。犧性自由的收獲就是得到『自動擴展性』,當你的網站流量大時, GAE 自動開分身,也因為你寫的程式一開始就受 GAE 平台的限制,而這些限制的目的主要就是為了提升擴展性,所以一開始在 GAE 上寫網站很痛苦,但後期維護很輕鬆。

AWS 就像是個高級積木組,你想怎麼兜就怎麼組,在自己架站環境中跑的網站,不用改任何一行程式碼就能移至 AWS 上。但等到你的網站流量大,使用者多時,就得再利用 AWS 提供的系統維護工具來自行維護了。缺點當然是你得多請一組系統管理員,但相較於自己搞機房、架站,利用 AWS 平台可以讓系統管理員工作簡單多了。

對我而言,兩種開發平台各有好處,這我當然兩者都學,唯其資源分配乃先 GAE ,後 AWS 。

AWS 的主力產品就是 Elastic Compute Cloud (EC2) ,一個 EC2 可以想像它就是你的一台電腦,只是放在 Amazon 機房裡。

我們可以開一台 EC2 出來後,在裡面安裝 ubuntu, nginx, django, postgresql 等軟體,讓它跑網頁伺服器。或是裝了 postfix 就能變郵件伺服器,或是裝了 vlc 變影音串流伺服器。簡單講,只要有安裝相對應的軟體, EC2 也能變火箭。

但是 EC2 的硬碟不多,近 10 G 而已,如果你想放很多資料,那就需要 Simple Storage Service(S3) 。而且為了擴展性,你也得用 S3 ,用了 S3 ,當網站熱門到得多開幾台 EC2 出來時,它們才有共同儲存的地方。

當網站只用一台 EC2 時,可以把 MySQL/PostgreSQL/Oracle 資料庫裝在同一個 EC2 裡,但當有多個 EC2 時,怎麼辦?  AWS 有給獨立的資料庫伺服器,除了關聯式資料庫( RDS )外,也有 NoSQL ( DynamoDB )的。把資料庫託給 RDS/DynamoDB 管理,也省得自己作備援、備份、調校等管理工作,而且以 Oracle DB 來看,可以不用購買授權改以每小時租用計費,這相當方便。易言之,在 AWS 上花錢就能換得輕鬆。

整個 AWS 架構是在一個虛擬化的機房內,每開啟一個 EC2 實體,它會得到一個虛擬 IP ,我們可以透過 boto(Python base) 去管理它,也可以直接在 AWS Management Console 頁面管理。

目前 AWS 在美國維吉尼亞、奧勒岡、北加州、愛爾蘭、日本、新加坡、巴西聖保羅都有機房。你想把機器開在那裡,自己決定就行了。

如果要讓 EC2 有公共 IP ,可以到 Elastic IPs 去索取一個實體 IP ,但記得在索取後就要把它綁定到 EC2 實體去,如果要了公共 IP ,但沒有拿去用,是會被 AWS 索取 0.01/hours 的罰款,我就被罰了 0.71 元美金,因為我關了 EC2 實體後,並沒有再去退 IP ,結果那個 IP 就被我佔了 71 個小時。

其他 AWS 產品還有 CloudWatch, CloudFront, CloudCache, SQS, SES, SNS, SWF...,實在很多,請自行到官網了解。

目前 AWS 有免費試用方案,方案為註冊後一年之內使用,而每個月的免費額度如下:

AWS Free Usage Tier (Per Month):

  • 750 hours of Amazon EC2 Linux Micro Instance usage (613 MB of memory and 32-bit and 64-bit platform support) – enough hours to run continuously each month*
  • 750 hours of Amazon EC2 Microsoft Windows Server Micro Instance usage (613 MB of memory and 32-bit and 64-bit platform support) – enough hours to run continuously each month*
  • 750 hours of an Elastic Load Balancer plus 15 GB data processing*
  • 30 GB of Amazon Elastic Block Storage, plus 2 million I/Os and 1 GB of snapshot storage*
  • 5 GB of Amazon S3 standard storage, 20,000 Get Requests, and 2,000 Put Requests*
  • 100 MB of storage, 5 units of write capacity, and 10 units of read capacity for Amazon DynamoDB.**
  • 25 Amazon SimpleDB Machine Hours and 1 GB of Storage**
  • 1,000 Amazon SWF workflow executions can be initiated for free. A total of 10,000 activity tasks, signals, timers and markers, and 30,000 workflow-days can also be used for free**
  • 100,000 Requests of Amazon Simple Queue Service**
  • 100,000 Requests, 100,000 HTTP notifications and 1,000 email notifications for Amazon Simple Notification Service**
  • 10 Amazon Cloudwatch metrics, 10 alarms, and 1,000,000 API requests**
  • 15 GB of bandwidth out aggregated across all AWS services*

我已把未送到 bitbucket.org 的專案及 zotero webdav 丟上 AWS 了。

自己家裡的機器正式結束「網站」的工作,專職作「寫程式機」了。

» Tomcat6 + JSP + JNDI + Oracle 設定

朋友公司最近想要接個案子:『在 AWS 上面架一個 JSP 網站,而且指定資料庫須用 Oracle DB 』。

用 Oracle DB 不是難事,拿信用卡註冊進去就有了,跑一個小時最低收你 0.17 美金(約臺幣 6 元),很多人都付得起。麻煩的是朋友及我都不是熟 JAVA 及 Oracle 的人。因為我們愛用 Open Source (奇怪 JAVA 明明就是 Open Source 呀! 怎麼我直覺不是呢???)。

為此,我找了高中同學 K ,他可是名門正派(資工背景)出身,從 C , Delphi , VisualBasic , JAVA , .Net 一路走來的程式設計師。而且他幫客戶開發時,多半是採用 Oracle 或是 SQL Server 的資料庫。於是一拍即合。

那我要幹麼呢? 也不是作個牽溝仔怎麼簡單的工作就結束了。 K 只熟 Windows ,而那個 AWS EC2 是要跑 Linux 的。所以我的工作就是搞定 Linux 上的 Http 伺服器( Apache or Nginx )、 AP 伺服器( Tomcat6 ) 及 JNDI Container (其實,我一直想不懂這 JAVA 或物件導向的術語)。

在 AWS 上租用 Oracle DB 是即用即付的,所以我想要在本機先測試 Tomcat6, JNDI 設定成功後再送上去。

我的作法是在本機的 VirtualBox Windows 上裝一個 Oracle 11g express (因 Oracle 沒出 Ubuntu 版),再作一個 1521 port 的 forward ,下載 sqlplus, basic 套件,測試連線正常:

$ sqlplus test/test@//localhost/XE

第一個 test 表帳號,第二個表密碼,最後面的 XE 表資料庫實例的名稱,預設是 XE 。能看到 SQL> 提示就表示可連線 Oracle 11g 了。

安裝 Tomcat6 非常簡單,在 Ubuntu 中打上 apt-get install tomcat6 就夠了。接下來去抓 Oracle 的 jdbc driver: ojdbc6.jar ,置入 /usr/share/java 目錄。然後修改 tomcat6 設定檔:

# /etc/tomcat6/catalina.properties
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/*.jar,/usr/share/java/*.jar

# /etc/tomcat6/content.xml

<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/OracleDB" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:XE"
username="test" password="test" maxActive="20" maxIdle="10"
maxWait="-1"/>
</Context>

# /var/lib/tomcat6/webapps/MyApps/WEB-INF/web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/OracleDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>

然後在 /var/lib/tomcat6/webapps/MyApps/ 放入一個 test_oracle.jsp 程式:


<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page language="java" contentType="text/html;charset=UTF8" %>
<%
Connection con = null;
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/OracleDB");
try {
con = ds.getConnection();
if(!con.isClosed()){
out.println("與 Oracle db 有連線!!\n<br/>");
}
con.close();
} catch (SQLException sqle) {
out.println("sqle = "+sqle);
} finally {
con = null;
}
%>

最後到瀏覽器去觀看 http://localhost:8080/MyApps/test_oracle.jsp 網頁,有看到『與 Oracle db 有連線!! 』那就成功了。


四月 29, 2012

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 「作弊的文化」讀後感

---- 聲明開始 ----


要檢討別人前,先自我檢討。

過去我曾在工作上,利用公司列表機印了幾本 PDF 書籍(大概幾千頁吧!),想當然耳,那些 PDF 檔還是違反著作權抓來的。印了近 10 本後就不這麼作了,因為浪費我的時間,印出來後還得整理裝訂,有時候列表機卡紙,也得自己處理,這根本就是打自己巴掌。於是,我直接花錢請印刷店處理,雖然書錢是自己出的,但一樣不脫「違反著作權」這條法令。等到會上 amazon 買書後,就不印了。買原版的書又精美,又對得起作者,何必跟自己良心過不去。當時自己印得不精美的書,後來也是全丟了,真對不起那些樹木。


另外在軟體使用(N 年前)上,也盜了不少的軟體: Matlab, MS Office, Windows 2000, Windows XP, 嘸蝦米輸入法, Dreamweaver, VisualBasic 6...。後來接觸 Open Source 後,一個一個戒掉了,因為要花錢的軟體,沒有比較好用。現在我用 Ubuntu Linux, Python, Netbeans 來工作,偶爾要用 MS office 時,就把裝在 VirtualBox 裡的學校授權 windows xp 打開,然後使用學校授權的 MS office 來看文件。是的,沒錯,中興大學花了一筆微軟授權費讓我可以在受到他人強迫時,不致於違法。


現在算來,我只有「嘸蝦米輸入法」是自己花錢買一套的,至今未買過其他軟體,當然這不含強迫中獎的微軟隨機版 OS ,還好後來的廠商自己也知道這不合理,所以我才買得到無 OS 的 Notebook 。


最後是音樂、電影,過去會用 emule, bittorrent 等作違法下載,但自從有了中華電信 MOD, 網樂通, Youtube 後,就不這麼作了。以前抓電影,還得自己找字幕、種子。用 mod, 網樂通方便多了,不過花個幾十塊而已。而音樂多半就聽我以前 CD 轉來的 OGG ,要不然就是在 youtube 上找 MV 來聽。


用 mod, 網樂通看電影很不錯,但還是有個缺點,電影類型不夠豐富,違法下載已有一堆網址了,但至今我還看不到「全境擴散(Contagion)」有在上映。只能繼續等,要不就是去買它的 DVD ,不過,現在好像也沒得買合法的。別叫我買 amazon 的 DVD ,我自認英聽還不夠好,沒字幕我是看不懂地。


我大學時是很少考試作弊或是抄別人報告的,要不然就不會被當了三十幾個必修學分,像我的結構學考試向來都是拿 6 分的,因為抄一題題目,老師會給 1 分,我乖乖地抄了 6 題。印象中,只有一堂經濟學考試是幫同學作弊,給他看答案,其他應該沒了吧! 如果還有,那就是我記性不好想不起來了。而研究所以後,我開始認真讀書了,不但成績比大學好很多,也不蹺課了。


以上,大概就是我過去作弊的事。


---- 聲明結束 ----


某日幫老婆在中教大圖書館找書時,不小心看到的一本 2006 年出版的書:「作弊的文化」。

以前很喜歡逛書局、圖書館,有興趣的題材當然會翻,但更有趣的是因為工作人員排列習慣不同,常常會發現一些原本我沒機會瞄到,但事後卻發現很令人驚喜的書。雜食是件好事,這在我接觸「指數投資|被動投資」後體會更深。也在塑化劑事件後,對入口食品改採混亂原則。以前我中餐吃飯時可以連吃同一家的陽春麵半年,也不會受不了,當時的想法很簡單,這世界就那麼多家店讓我吃,如果累計起來,這碗陽春麵總共吃了 180 次,那我就連續吃完 180 次後再去煩惱要改吃什麼,省得我每天花心思在思考吃什麼。但現在不這麼作了,我怕連吃某樣食物半年,體內單一毒素太高,一次就畢業了。混著吃,不同毒物的累計量會平均一點。

這本書題材很特別,主要介紹美國氾濫的作弊文化: 學生考試作弊、購買或抄襲他人報告、入學及畢業資格花錢買來、假造學經歷、律師浮報鐘點、會計師協助作假帳、逃漏稅、侵佔公司資產(包含小物件,像是筆、紙)、使用禁藥、以商逼官或是商人去當官人…等現象。

作者提了一些改正措施,不過,我不相信他講得是對的。因為就算他講得對,也無法施行改正來證明措施正確。那當然他也歸納了一些想法來論述為什麼美國人會作弊,這作弊現象是由來已久,還是最近才興起的。同樣地,我也不相信他的歸納,因為我看過「黑天鵝效應」,歸納不見得是有意義的。

那這本書到底對我有沒有價值? 有! 當然有,看這本書,能夠讓我了解美國人作弊的手段有那些,只要作者是誠實以對,是科學訪談來的資料,就能讓我對美國生活有進一步的體會,這就是對我的價值。

學生考試作弊、購買或抄襲他人報告、入學及畢業資格花錢買來、假造學經歷這幾樣也可在臺灣社會體會到,這應該不難想像吧! 而且美國是更氾濫的。因為美國有很多"""高級"""私立學校是可以被「錢」操控的,建議各位可以去看看「女人香」這部電影。

而律師浮報鐘點,可以去看看「黑色豪門企業」這部電影來一窺全貌。

會計師協助作假帳,可以去看看「世界通訊」、「安隆」的倒閉新聞。

在逃漏稅部份幾乎是全民運動。在「蘋果橘子經濟學」中,也提到某一年全美國少了幾百萬個小孩,因為國稅局全面電腦化,可以比對大家的扶養子女是否有重複。

侵佔公司資產(包含小物件,像是筆、紙),我印象中好像有部電影提到職員拿到公司的信用卡後,結果大刷特刷的,忘了是那一部了。

使用禁藥部份請看艾拉馬奎爾麥可強森的故事。

以上作弊的事就請各位自行搜尋資料或是去看本書來深入了解。我想要討論的是「以商逼官或是商人去當官人」這種事。而且想從美國的現象來討論臺灣在這一部份的問題。

商人當官人,在臺灣政壇上,好像只有發生在「縣市首長」及「立委、議員」上,內閣部份就我印象以來,大概都是國營的金融相關事業董事長後來會當到財經首長,像是彭淮南先當中國商銀董事長後轉任中央銀行總裁,陳裕章從第一金董事長作到金管會主委,好像只有陳沖有當過合庫銀、中信證(民營)、永豐金(民營)董事長後再來作金管會主委及行政院副院長,其他的首長多半是先當官人,後才去當商人的,像是顏慶章、邱正雄、林全。就商人來當官人這件事,我覺得中華民國的防火牆作得還不錯。不像美國,一堆財政部長都是從華爾街跑去的,這一點可去看「高盛陰謀」來略知一二。

商人當官人有什麼不對? 如果是靠選舉選上的,那我沒話說,民主時代,選民接受商人當首長,也了解他會有利益衝突但還是讓他選上,這我沒話說,選後是大家一起承擔的。

但如果是指派的,那就大有問題了。因為無法直接監督,卻又得面臨他瓜田李下,所以可以看到 2008 美國次貸後,高盛活得比貝爾斯登、雷曼兄弟、美林、摩根史坦利還好。要不然,你們也可以想像一下,公共工程委員會主委曾任職於某家營造廠,那他監督的了舊公司所承攬的公共工程嗎? 搞不好,有些還是他經手的呢! 所以幸運的是這種事在中華民國不常發生。這值得慶祝。

而「以商逼官」這件事,我覺得臺灣就很嚴重了。當然,還沒有比美國嚴重啦。


上面這部影片,提到「公司」撥出大量的行銷支出去為候選人宣傳,這無非是希望將「有利於公司」的候選人送進政府體制中,在行政、立法方面協助公司經營。

除了送「合宜候選人」進政府體制,另外還有「形塑輿論」以迫使公務員執行政策轉向,因為公務員『買廣告』去宣傳政策是件不容易的事。要『買廣告』去宣傳,通常只能用在『拍馬屁』上。

有幾件類似『形塑輿論』的事,我分享給各位,但也有可能是我錯了,畢竟『形不形塑』都應該是檯面下的事:
  1. 別讓彭淮南總裁變成下一個袁崇煥!
  2. 證券交易所得稅會讓政府抽很多錢,導致沒有利潤。
  3. 立委名額太多是導致國會亂象的主因,所以我們要刪減立委名額。
第一項,中央銀行的作為是不容外界質疑的,它也不受其他首長的管理,那新聞、報紙講新台幣該不該升值、貶值,幹麼? 削總裁威信,看能不能讓高層換個人,如果不能,或許也能逼總裁心死離職。總之,一個獨立性機關建立了,也找了個正確人選進去,那再指三道四都是不對的。

第二項,很多股民在郭宛容事件後,堅信課徵證所稅是件可怕的事,他們不管租稅正義,只在乎股票表面價值。於是,永遠都是在分皮毛,然後讓大戶吃香喝辣。

第三項,刪減立委名額後,可以看見國會的政黨種類急速減少,從2004年2008年的結果看來,2004年泛藍 128 名,泛綠 147 名,其他有 148 名,小黨比例佔有 35 %,而 2008 年泛藍有 114 名,泛綠有 101 名,其他有 16 名,小黨比例佔有 7 %。小黨比例急速萎縮下,失去了政策多樣性。企業要買通立委,也可以花比較少的人力、金錢。這對弱勢團體來說,只有更失去支持聲音,看不來有什麼其他好處。

另外,還有一種是我覺得「大有問題」的「輿論」:「公務員領得錢比人多,事作得比人少」。

醜化公務員後,要幹麼呢? 首先大家都認為他們爛,所以就不介意立委們削他們預算,甚至讓機關合併但員額減少。事變多了,人卻少了,那他們就不能管那麼多事了。他們不能管那麼多事後,則「黑心企業」就爽啦! 沒人力來稽查業務,甚至要打通關節時,需賄賂的人沒那麼多,這對「黑心企業」都是成本下降的好機會。如果我開的是「黑心企業」,「醜化公務員」絕對是一條好策略。

在「作弊的文化」中,它也提到 IRS 被削弱資源,使得他們無法向逃漏稅的有錢人提出訴訟,因為有錢人有能力與 IRS 乾耗。使得他們只好把目標對向一般平凡百姓,這一類人往往無法找到高級稅務律師反辯。諷刺的是 IRS 資源正是被廣大的美國百姓要求刪減的,因為他們極度討厭稅務員。

簡單講,老鼠去說貓的壞話,結果主人相信了,還把貓趕走,那接下來是誰的天下?

但是話說回來,我們如何能分辯什麼是正確的「輿論」。

首先,別相信「廣告」:


這個廣告聽說效果很好。讓很多人下定決心投給那個團隊,不過,仔細想想,這「準備好了」四個字,講也只花了 5 秒鐘。但一個政策執行要花多少時間,像蘇花高從環島路網決策成形、選址、測量、工法決定…也花了幾十年了。你聽到「準備好了」也是花 5 秒鐘,但你該相信嗎? 另一個有「魔力的廣告詞」是「馬上好」,很多人聽到這句話後,就莫明奇妙地把票奉上了。我覺得很可笑。

第二個,要分得清那個是「廣告」:

看雜誌時,出版商常常把廣告作成報導本文,如果你沒能力分得出來,那如何知道那個是忠實報導,那個是自吹自擂。不過,像這類會把「廣告」及「本文」混合的出版商,最好把它們的讀物當作資源回收物,看過即忘。

第三個,少看新聞及雜誌,多看點書(也就是第一手資料,像是候選人政策白皮書):

了解政治或是選擇正確人選,從新聞、雜誌上獲得的幫助不大。多看點書來了解你想要的理想世界是什麼,這樣你才有學識去要求候選人作到。然後要看候選人政策白皮書,這樣你才知道,這個候選人到底想要作什麼,你也才有得選擇,別去聽新聞記者的轉述,二手資料常常是錯的。

最後我的結論是「了解作弊的手段是有助不作弊的人贏得比賽的法門」,所以不管你想不想、愛不愛,都得了解「作弊的方法」。

二月 17, 2012
» [tips] access gnome-keyring in cron

It seems program execute in your crontab doesn't have the luxury to use the gnome-keyring daemon to get the permission it should had. In order to let your program access gnome-keyring, you need to reuse a environment variable in your desktop session called DBUS_SESSION_BUS_ADDRESS in your cron environment also.The quickest way to do it is to add these line:


. ~/.dbus/session-bus/*-0
export DBUS_SESSION_BUS_ADDRESS


in your cron script (it assume you logged in under X display 0)

八月 4, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» Connect MS SQL Server with python-pymssql

Two years ago, i writed a blog: "How to connect MS SQL Server with Python in the Linux OS?". I used freetds + python-sybase in this Howto. Now i have to upgrade the linux server to x86_64 architecture(original in i386), then the old python-sybase package have always been failured. The newest version released at 2010 DEC, but i tried all the 39, 38, 36 versions that no one can compile accurately.

Fortunately, my underclassman talked to me about python-pymssql. And it has been packaged in the Ubuntu, so i just use the magic command:

$ sudo apt-get install python-pymssql

My Linux server takes the power back!!!

The usage likes python-sybase, below is the example:


1 #!/usr/bin/env python
2 import sys, datetime, pymssql
3 from types import IntType
4
5 DB = {
6 'ip': '127.0.0.1',
7 'port': '1433',
8 'user': 'user',
9 'password': 'password',
10 'database': 'database',
11 }
12
13 try:
14 Database = pymssql.connect(host=':'.join([DB['ip'], DB['port']]), user=DB['user'], password=DB['password'], database=DB['database'], as_dict=True)
15 except pymssql.OperationalError, msg:
16 print "Could not Connection SQL Server"
17 sys.exit()
18 else:
19 DBCursor = Database.cursor()
20
21 sql = "select * from data_table"
22 print('sql: %s' % sql)
23 DBCursor.execute(sql)
24
25 while 1:
26 row = DBCursor.fetchone()
27 if not row: break
28
29 for k, v in row.items():
30 if type(k) == IntType: continue
31
32 if k.lower() in ('some_date_field', ):
33 # change field type
34 if type(v) == datetime.date:
35 value = v
36 else:
37 try:
38 value = datetime.date(*time.strptime(v, '%Y/%m/%d')[:3])
39 except:
40 value = None
41 else:
42 value = unicode(str(v), 'cp950')
43
44 print('%s => %s'%(k, v))

六月 20, 2011
» 在 Windows、Linux,以及 Mac 上安裝 pip - Python 套件管理程式

這篇是寫給沒用過 virtualenv 與 pip 的 Python 套件管理攻略。

PycTW 2011 上應該沒時間講這種事,還是先在這邊還攻略債吧。

步驟

先講一下原則上的建議安裝方式(同 pip 官方文件上的建議):利用 virtualenv 內建的 pip

  1. 下載 virtualenv.py
  2. python virtualenv.py [新專案環境目錄名]
  3. 進入 virtualenv 環境(在這個環境下安裝的東西不會影響到整個系統)
  4. 開始使用 pip 安裝套件

 

Linux 或 Mac 上的指令參考

$ curl -O https://raw.github.com/pypa/virtualenv/master/virtualenv.py
$ python virtualenv.py my_new_env
$ . my_new_env/bin/activate
(my_new_env)$ pip install ...

通常這樣就完成了 Linux 與 Mac 上的攻略。

 

Windows 上的指令參考

  1. 儲存那個網頁,命名檔案為 virtualenv.py
  2. 打開 terminal(cmd.exe 之類的),cd 到你要放專案資料夾的地方 (例: cd C:\Users\Keith )
  3. python virtualenv.py my_new_env
  4. my_new_env\Scripts\activate.bat
  5. pip install …

 2013-06-24 Update:

Windows 的 virtualenv 可能會遇到一些安裝 PIL 的問題,所以你可能會想要跳過 virtualenv 直接安裝 setuptools (小註:已於 0.7 版合併了 distribute)與 pip:

下載 https://raw.github.com/pypa/pip/master/contrib/get-pip.py

執行 pyhton get-pip.py

附錄

如何使用 pip 安裝一個名為 xxx(bottle, nose, Requests, SQLAlchemy, Pyramid, … 等等) 的套件?

pip install xxx

移除套件? pip uninstall xxx

» 在 Windows、Linux,以及 Mac 上安裝 pip - Python 套件管理程式

這篇是寫給沒用過 virtualenv 與 pip 的 Python 套件管理攻略。

PycTW 2011 上應該沒時間講這種事,還是先在這邊還攻略債吧。

步驟

先講一下原則上的建議安裝方式(同 pip 官方文件上的建議):利用 virtualenv 內建的 pip

  1. 下載 virtualenv.py
  2. python virtualenv.py [新專案環境目錄名]
  3. 進入 virtualenv 環境(在這個環境下安裝的東西不會影響到整個系統)
  4. 開始使用 pip 安裝套件

 

Linux 或 Mac 上的指令參考

$ curl -O https://raw.github.com/pypa/virtualenv/master/virtualenv.py
$ python virtualenv.py my_new_env
$ . my_new_env/bin/activate
(my_new_env)$ pip install ...

通常這樣就完成了 Linux 與 Mac 上的攻略。

 

Windows 上的指令參考

  1. 儲存那個網頁,命名檔案為 virtualenv.py
  2. 打開 terminal(cmd.exe 之類的),cd 到你要放專案資料夾的地方 (例: cd C:\Users\Keith )
  3. python virtualenv.py my_new_env
  4. my_new_env\Scripts\activate.bat
  5. pip install …

 2013-06-24 Update:

Windows 的 virtualenv 可能會遇到一些安裝 PIL 的問題,所以你可能會想要跳過 virtualenv 直接安裝 setuptools (小註:已於 0.7 版合併了 distribute)與 pip:

下載 https://raw.github.com/pypa/pip/master/contrib/get-pip.py

執行 pyhton get-pip.py

附錄

如何使用 pip 安裝一個名為 xxx(bottle, nose, Requests, SQLAlchemy, Pyramid, … 等等) 的套件?

pip install xxx

移除套件? pip uninstall xxx

六月 11, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» Install Python2.5 on Ubuntu 11.04 x86_64 for Google App Engine

之前所提的「Install Python2.5 on Ubuntu 10.04 i386 for Google App Engine」,主要是在 i386 Ubuntu 的安裝方式。我這一次換了電腦,也裝了 Ubuntu 11.04 amd64 的版本,所以安裝方式有些許不同:

1. 系統內建的 sqlite 函式庫無法連結。
2. 某些 .so 檔不再放在 /usr/lib ,而是在 /usr/lib32, /usr/lib64, /usr/lib/x86_64-linux-gnu 等地。

另外在安裝 python2.5 時,也想順便套上 readline 及 ipython 。以下是安裝過程:

先裝上 Ubuntu 內建的函式庫:

$ apt-get install liblcms1-dev zlib1g-dev libfreetype6-dev libjpeg62-dev libsqlite3-dev libssl-dev tk-dev libreadline-dev

安裝 sqlite3:

$ cd sqlite-autoconf-3070603/
$ ./configure --prefix=/usr/local/sqlite3 --enable-readline --enable-threadsafe --enable-dynamic-extensions
$ make && sudo make install

安裝 Python2.5.6:

$ cd Python2.5.6/
$ ./configure --prefix=/usr/local/python25 --with-zlib -with-zlib-library=/usr/lib/x86_64-linux-gnu --with-zlib-include=/usr/include --with-tk --with-tk-library=/usr/lib32 --with-tk-include=/usr/include --with-tcl --with-tcl-library=/usr/lib32 --with-tcl-include=/usr/include --libdir=/usr/local/sqlite3/lib --includedir=/usr/local/sqlite3/include --with-freetype2 --with-jpeg --with-readline
$ make && sudo make install

安裝 ipython

$ cd ipython/
$ sudo /usr/local/python25/bin/python2.5 setup.py install

安裝 GAE 相依模組 ipaddr:

$ cd ipaddr-2.1.1/
$ sudo /usr/local/python25/bin/python2.5 setup.py install

安裝 GAE 相依模組 python-ssl:

$ cd python-ssl-1.15/
$ cp -rf ../Python2.5.6/Include/* /usr/local/python25/include/ # 需要 Python 源碼
$ sudo /usr/local/python25/bin/python2.5 setup.py install

安裝 PIL:

修改 Imaging-1.1.7/setup.py 中的參數如下:

TCL_ROOT = '/usr/lib32'
JPEG_ROOT = '/usr/lib32'
ZLIB_ROOT = '/usr/lib/x86_64-linux-gnu/'
TIFF_ROOT = '/usr/lib32'
FREETYPE_ROOT = '/usr/lib32'
LCMS_ROOT = '/usr/lib32'

檢查模組是否可使用

$ /usr/local/bin/python2.5 setup.py build_ext -i

測試模組

$ /usr/local/bin/python2.5 selftest.py

看到如下訊息,就代表模組皆有支援

 --- PIL CORE support ok
 --- TKINTER support ok
 --- JPEG support not installed
 --- ZLIB (PNG/ZIP) support not installed
 --- FREETYPE2 support ok
 --- LITTLECMS support ok

再執行

$ sudo /usr/local/python25/bin/python2.5 setup.py install

最後,再把 dev_appserver.py, appcfg.py 中的 #!/usr/bin/env python 改成 #!/usr/bin/env python2.5 即可(也不是必須的,只要你知道執行 GAE server 時是用 python2.5 就夠了)。

完成後就可以在 Ubuntu 11.04+ x86_64 中開發 GAE 程式了。

六月 1, 2011
» [link] Nvidia Optimus on linux 的解決方案 : bumblebee 大黃蜂

https://github.com/MrMEEE/bumblebee

四月份的時候買了一台DELL i5二代的筆電,
用起來還算滿意,
但是就是在linux下居然無法使用Nvidia的顯示卡這點讓我不是很滿意。

當初在買筆電的時候,為了相容Linux還特地挑了一個Nvidia的獨顯,
想說一直以來Nvidia的顯示卡在Linux下都支援良好,
所以也沒特別注意相關的消息,
這次買了才發現,,
只要是使用了Nvidia動態切換內顯和獨顯的Optimus技術的筆電,
在Linux下通通沒辦法驅動Nvidia獨顯,
而只能用Intel的內建顯示,
並且Nvidia的顯卡雖然無法運作,
但還是會在背景吃掉相當多的電力,
一個原本是設計來省電的技術反而耗了更多的電,
實在是非常的諷刺。

原本想說應該BIOS就可以直接切換成Nvidia獨顯,
結果研究了一下才知道Nvidia的輸出會經過Intel顯卡,
所以如果沒有內建硬體的Multiplexer,
想關掉Intel顯卡直接使用Nvidia顯卡是不可能的,
當時只好在網路上找了一個acpi的方法把Nvidia的顯卡先關掉,
但是反過來如果只是要把Nvidia的顯示卡打開卻似乎是辦不到,
實在是萬分苦惱。

然後剛剛發現了這個bumblebee(大黃蜂)專案,
提供了ㄧ個簡單的script就讓Linux支援了Nvidia顯示卡且使用官方的3D驅動,
雖然還沒辦法動態切換, 但是可以手動切換也算是不錯了。

安裝的方法真的是很簡單:
先git clone https://github.com/MrMEEE/bumblebee.git
然後執行其中的install.sh 回答幾個只要選default就可以的問題 之後就安裝完成囉!

平常的時候,預設還是會用Intel的顯卡來執行,
要用Nvidia執行的時候, 則要透過optirun來執行該程式~~

#glxgears

304 frames in 5.0 seconds = 60.604 FPS
301 frames in 5.0 seconds = 60.137 FPS
301 frames in 5.0 seconds = 60.136 FPS
301 frames in 5.0 seconds = 60.137 FPS
301 frames in 5.0 seconds = 60.137 FPS

#optirun glxgears
* Starting Bumblebee X server bumblebee Enabling nVidia Card failed (Error: AE_BAD_PARAMETER).
[ OK ]
3015 frames in 5.0 seconds = 602.973 FPS
3312 frames in 5.0 seconds = 662.366 FPS
2908 frames in 5.0 seconds = 581.591 FPS
2798 frames in 5.0 seconds = 559.551 FPS
3409 frames in 5.0 seconds = 681.679 FPS

雖然是有些錯誤訊息不過還是有成功的跑起來了,
另外再跑了lgfxgears也是由2fps到100fps,果然是快了不少.

四月 27, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» CMClass: 簡述 libsvm(Support Vector Machine library) 使用方法

libsvm乃台大林智仁老師開發的 Open source 工具,其目的為實作 Support Vector Machine 分類器,使用語言主要是 C++ ,目前也有 JAVA 版本,也提供其他語言的 wrapper ,像是 Perl, Python, Ruby, Matlab, Hashkell, Lisp 等。

詳細數學就不介紹了,怕大家睡著(但其實是因為還沒看懂),各位可以看一下下面那段這個影片,大略了解 SVM 分類器如何區別不同資料。



本文章主要介紹的是用 Python 語言去操作 libsvm 函式庫。

先解壓縮 libsvm.tgz 檔,可以看到 python 及 windows 資料夾,如果要在 Linux 中使用的話,請在主目錄中作

$ make lib

這樣會得到 libsvm.so.2 檔,這是 libsvm 的主函式庫,而在 windows 中使用的話,它則是先幫你編譯好這個檔了,可在 windows/ 找到這個 libsvm.dll 檔。

在 Linux 中,請把 python/*py 放到 /usr/local/lib/python2.6/site-packages 中,而 libsvm.so.2 放到 /usr/local/lib/python2.6/ 。

在 windows 中,請把 python/*py 放到 C:\Python26\Lib\site-packages 中,而 libsvm.dll 請放到 C:\Python26\Lib\windows 資料夾中(因為 svmutil.py 寫死了它的相對路徑,所以務必依它的相對位置置放)。

請在 Python shell 中,鍵入下列指令,測試是否安裝成功。

>>> from svmutil import *
>>>

沒錯誤訊息,那就是安裝對了。

使用 svm ,主要就是兩個動作: 訓練及預測。

訓練:

svmutil.svm_train 函式的引數有「類別標籤」、「觀察值」、「參數」。

你的原始資料若是如下:

1. 3, 4, 5, 6 => 第二類
2. 3, 4, 5, 5 => 第一類
3. ....

前面的 #. 表第幾個觀察值,後面逗號分隔的數據為各維度的值,行末則是放置該觀察值為第幾類的說明。請把它轉成

>>> Y = [2, 1, ...]
>>> x = [(3, 4, 5, 6), (3, 4, 5, 5), ...]

類別標籤請獨立放置到一個 list 中,而觀察值維度則依序放置到另一個 list 中。接下來,就能使用 svm_train:

>>> from svmutil import *
>>> model = svm_train(Y, x, '-c 4')

所得到的 model 就是一個經過訓練的分類器。

預測

接下來,我們要拿訓練好的分類器去預測新的觀察值:

>>> p_label, p_acc, p_val = svm_predict([0]*len(new_x), new_x, model)

而 p_label 就是依 new_x 順序所對應的類別標籤 list 。

下圖是我隨機生成的 300 點,圓點為原始的觀察值,而以線相連的連續點則是預測點。



詳細程式碼請參照如下:

 1 #! /usr/bin/python
2 # -*- coding: utf8 -*-
3
4 __author__="hoamon"
5 __date__ =u"$2011/4/12 下午 05:52:31$"
6
7 from math import pi, sin, cos
8 from random import random
9 from matplotlib import pyplot as plt
10 from svmutil import *
11
12 def circleData(centre, radius, down_limit_percent=0, lens=100, range=[0, 100]):
13 points = []
14 while len(points) < lens:
15 _angle = 2 * pi * random()
16 radius_percent = random()
17 if radius_percent < down_limit_percent: continue
18 _radius = radius * radius_percent
19 x = centre[0] + cos(_angle) * _radius
20 y = centre[1] + sin(_angle) * _radius
21 if range[0] <= x <= range[1] and range[0] <= y <= range[1]:
22 points.append((x, y))
23 return points
24
25
26 def test():
27 u""" 製作三群的隨機資料,每群皆 100 個點,點位置的 x, y 限制在 0 ~ 100 之間
28
29 最後利用 matplotlib 繪製出來的圖,"單點"表原始資料,而連續點畫線的部份,
30 該點位的類別則是利用 svm_predict 計算出來的。
31
32 Y = [1, 1, 1, ..., 2, 2, 2, ..., 3, 3, 3, ...]
33 x = [(x1, y1), (x2, y2), ...]
34 """
35 Y = [1] * 100 + [2] * 100 + [3] * 100
36 x1, x2, x3 = (circleData((35, 40), 12),
37 circleData((35, 40), 48, down_limit_percent=0.25),
38 circleData((80, 80), 20)
39 )
40 x = x1 + x2 + x3
41
42 m = svm_train(Y, x, '-c 4')
43
44 #INFO 在 100x100 的畫布上,打出 40000 個點,拿這 4 萬個點去給 m 作預測,算出這 4 萬個點的類別
45 points = [(i*0.5, j*0.5) for j in xrange(0, 200) for i in xrange(0, 200)]
46 p_label, p_acc, p_val = svm_predict([0]*40000, points, m)
47
48 line_1, line_2, line_3, pre_label = [], [], [], p_label[0]
49 for i in xrange(0, 200):
50 for j in xrange(0, 200):
51 index = i * 200 + j
52 now_label = p_label[index]
53 if now_label == 1 :
54 line_1.append(points[index])
55 elif now_label == 2 :
56 line_2.append(points[index])
57 elif now_label == 3 :
58 line_3.append(points[index])
59
60 fig = plt.figure()
61 ax = fig.add_subplot(111)
62 ax.plot([p[0] for p in x1], [p[1] for p in x1], 'ro')
63 ax.plot([p[0] for p in x2], [p[1] for p in x2], 'go')
64 ax.plot([p[0] for p in x3], [p[1] for p in x3], 'bo')
65 ax.plot([p[0] for p in line_1], [p[1] for p in line_1], 'r-', alpha=0.5)
66 ax.plot([p[0] for p in line_3], [p[1] for p in line_3], 'b-', alpha=0.5)
67 ax.set_title('Points of three classes')
68 ax.set_xlabel('x')
69 ax.set_ylabel('y')
70 ax.set_xlim(0, 100)
71 ax.set_ylim(0, 100)
72 plt.show()
73 return m, p_label, p_acc, p_val
74
75
76 if __name__ == "__main__":
77 test()

四月 25, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 使用「公認機構簽核公錀」所發生的不知名問題

How to get a free HTTPS web certification authority by StartSSL.com 一文中,我申請了 A.hoamon.info 的公錀簽核,也正確地跑在 https 上,在使用瀏覽器觀看時,完全沒有問題。然而在 hg 軟體上,卻會發生 SSL: Server certificate verify failed. 的錯誤訊息,從 Mercurial on Windows vs Linux, spot the problem 一文中,作者解釋是 Windows 的 ssl 版本太舊的原因,但照他的解決方案處理,我的 hg 軟體卻是報 URLError. 錯誤。

後來在檢查 apache.conf 時發現,這台機器有三個 https 站台,一個是用 A.hoamn.info 的公錀,另外兩個 B, C 站台卻都是用 whatever.hoamon.info 的公錀。而 B, C 站台的設定檔寫得比 A.hoamon.info 站台還前面。所以試著調動 A.hoamon.info 到 B, C 站台設定的前面,結果 hg 軟體就正常了。

問題是解決了,但我反而混亂了。印象中, https 協定中,公錀是在 IP 層(或表現層,我不確定)就發送至使用者的瀏覽器,既然沒到應用層,則網頁伺服器就不知道該拿那一個虛擬站台的公錀給使用者,於是它總是拿第一個看到的公錀(也就是寫在最前面的),所以這篇教學文章,才會寫到:「…一個 Apache ,也只能架一個 SSL 站,用一個站名。除非妳跑很多份 Apache ,各自跑在不 同的 IP 或不同的 TCP 埠上,才能在同一臺伺服 器上,跑好幾個 SSL 站。」

實際上,在 Windows XP 的 IE, Safari 上觀看 A, B, C 三個站台,也的確都是拿到 A.hoamon.info 的公錀。但在 Chrome, Firefox 上,卻是看到 A 用 A.hoamon.info ,但 B, C 用的是 whatever.hoamon.info 的公錀。


這我頭大了,為什麼跟基本原理不一樣??? 還是因為某些瀏覽器有「重拿公錀的機制」存在???

biggo.com.tw

A Django site.