2012年3月30日 星期五

都市更新的喜與悲

王家:「家,不賣也不拆」

都市更新計畫,是個立意良善的政策,

透過都市更新的方式,老舊的市容得以美化,建商可獲得相對的利益,

而當地住戶也由於都市更新帶來的地價上漲而獲利,

最終目的是為了達到政府、建商以及當地住戶三者皆贏的結果,

不可諱言,像這樣的理想狀況確實存在,

有人終其一生,辛苦耕耘大半輩子,好不容易在都市買下了一棟房子,

十年、二十年過去了,房子逐漸老舊不堪,卻又無力整修改建,

這時,都市更新計畫及時拉了他一把,甚至從中獲得了一輩子都賺取不到的財富,

就像小時候念的童話故事一般,這真是一個完美的結局。

但事實上,理想與現實的差距卻總是殘酷,就像這次士林王家人所面對的遭遇,

對於王家人的故事,網路上已有許多文章可供參考,我想應該不用我多所贅述,

「都更釘子戶」背後的關鍵奧秘 - 為了守護一個家、一片地和一種樸實生活方式,士林的王家人,從平凡的中產家庭,一步一步變成媒體口中要價兩億的「貪婪釘子戶」、變成了阻礙城市進步的「全民公敵」。

WikiPedia - 士林文林苑都市更新爭議案

當然更有許多人提出了自己的看法,不管是從任何角度看待這件事情,都有他的道理所在。



原本一件立意良善的事情,卻交到了錯誤的人手中來執行,在我們的周遭上演著一次又一次的野蠻遊戲,

人性的貪婪,把都市更新計劃包裝成了外表精美的糖衣毒藥,

當不明究理的人們一窩蜂的爭搶這些看似甜美的糖果時,選擇不吃的人們成了異類,

然而這些糖果是成捆成捆賣的,每個人都必須得吃一些才能全部消化掉,

當絕大部分人都說要買下的時候,那些不願意吃的人們,居然沒有說「不!」的權力,

除此之外還有被污名化的可能,被說成是「想吃更多、是吧?」,

這個看似簡單不過、銀貨兩訖的行為,怎麼會有這種強迫中獎的情形!?

原來,這些糖衣毒藥的買賣是依法有據的,買賣規矩是偉大的 "官阿~" 決議出來的,

當八成以上的人們都說要買的時候,剩下的兩成雖然不願意,卻又莫可奈何、求助無門,

更何況這表面上看起來高達八成的數字,是否就是人們真實的意志,根本還要打上一個大大的問號,

市井小民們都只是平凡人,並不是每個人都懂這些買賣規矩,不想吃不想買還不行,

當知道這些買賣規矩時,強大的公權力往往已經把這些毒藥塞到人們的嘴邊,迫使他們含淚吞下去,

自己的嘴巴居然沒有選擇吃啥下肚的自由,這還真是官商合作的優良示範,

手中握有公權力,卻只會老話一句依法行政,沒有任何解決問題的能力,

那這樣的政府就如同行屍走肉般,絲毫不懂得苦民所苦跟創造自我的價值,

試問,這樣的政府,存在的意義在哪裡?

而下一個被迫含淚吞下這些糖衣毒藥的人,會不會就是你和你的家人?

只想簡簡單單、安安靜靜,過一個屬於「家」的生活,難道就真的這麼困難嗎?


可憐的 ( 王家人 ),離律法知識那麼的遙遠,卻離 ( 文林苑 ) 如此之近。

公視 獨立特派員 - 變奏的都更 1/2

公視 獨立特派員 - 變奏的都更 2/2

2012年3月19日 星期一

無米樂 (Let It Be)


這個夜晚因為好朋友的分享,我發現了一群很棒的人們,讓我感覺很充實,

「無米樂」描寫著台灣農民的故事,拍攝手法極為貼近他們的現實生活。

影片一開始,一對老夫妻的互動就讓我印象極為深刻,

當伯母(崑濱嫂)嘲笑阿伯(崑濱伯)的臉皮厚時,阿伯摸了摸自己的臉皮,然後又捏了捏伯母的臉皮,

就反過來揶揄說妳的臉皮才比較厚,比較有福氣,對話間還常常有一些髒話,

頓時間讓我覺得這個畫面好甜好幸福,真的是好純真的兩個人,哈哈,

在影片內容中,不時穿插一些這對老夫妻鬥嘴的片段,是我覺得最有趣的地方,

比起談話性節目上跟大人物們的訪談,我更愛這種市井小民間的對話,因為他們總是那樣的真實,沒有距離。
(哈,這一切都是台灣國罵的功勞(大誤!))

農民們靠天吃飯的生活,讓他們培養出了樂天知命的態度,

插秧時,若是秧苗比較小株,但是天公伯疼憨人,一場及時雨,就可以讓秧苗們成長得比較順利,

但收割時就恰恰相反,一點雨水都會讓稻穀濕潤,賣出價錢也就不怎麼好看,

如果來了一場大雨,將稻穗壓倒在泥水之中發了芽,那這一季就白做工了,

阿伯說人一生下來就領好了生死牌,他領到的是種田的牌子,而伯母說她領到的是當俾女的牌子,

但兩人並沒有為此而憤恨不平,從他們的對話中,感覺得出他們樂於享受這種生命,

阿伯五十歲那年罹患眼疾,由於治療未果,他的右眼瞎了,

而他的態度竟是反省自己是不是曾經做過什麼不對的事情,才會被老天爺懲罰,

他自認沒做過什麼違背良心的事情,沒有當過賊,也沒幹過什麼不良的勾當,
(只有小時候偷過人家果園的芭樂XD)

最後他得到的結論是,可能以前賣土豆給人的時候,處理得不夠乾淨,土豆間夾帶了一些泥巴,讓人家不好買賣,

所以他決定必須更用心專注在自己的工作上,也更虔誠的信奉神明,

我想如果換作是一般人,應該早就在那邊怨天尤人了吧。

而影片中也提及台灣的農業發展史,是讓我覺得這影片最可貴的地方,

它讓我這一代的人了解到為什麼台灣農業會演變成現在的局面,

從政府實施「三七五減租」、「耕者有其田」、強徵軍糧,以及利用各種名目對農民的剝削,還有最近的加入WTO,

以一個農民的角度,來說明這些動作對於台灣農業造成的影響與衝擊,我想是再恰當不過了,

記得老爸也說過他小時候每天下課回家,書包帽子一丟,就得馬上下田幫忙,

那時候,農民們都捨不得吃稻米,每天都是吃地瓜籤配稀飯,稻米都必須賣掉作為經濟來源,

但是明明就種了很多稻子,為什麼每天只能吃地瓜籤,在看過這個影片後,我終於懂了,

政府不懂農民的生活,不重視農民的感受,加入WTO這種國際組織,

為的只是一時的驕傲,自以為獲得國際社會的一點點肯定就自得意滿,

但根本搞不清楚協議內容是好是壞,就這樣忘卻了台灣農民們的心情與辛勞,犧牲了農民們生存的權利,

當阿伯把辛苦收割而來的稻穀賣到碾米廠,卻因為十塊、二十塊的價差,而必須與店家再三議價,

弄到晚上十一、二點才回到家,阿伯坐在餐桌上吃冷飯菜的畫面,我真的覺得好不值,更是難過,

這明明不是他們的錯,為什麼卻要由他們來承擔,我不懂,我真得不懂了。

因為種稻必須噴灑農藥的關係,有多少農民成為勢利商人們手中的亡魂,

但在阿伯這些農人們的眼中,這片土地上的稻子不能死,人卻沒關係,

阿伯說,種田是一種修養,跟修禪一樣,但是它不需形式化的行為,只需要默默地做好自己的本分就好了,

農人要是對自己的土地沒感情,那就是快死了,因為這塊土地就是養育著我們的,是我們生命的源頭,

腳下的土地不會說話 ,但是巡著巡著、走著走著,你就會懂了,

當阿伯說出這些話時,我真的震驚了,很難想像阿伯竟對自己的生命有這麼深刻的體悟,

就像片名「無米樂」一般,他們總是那樣的樂天知命,靠天吃飯的生活,讓他們學會一個珍貴的生命態度,

就算今天稻米歉收,價格直直落,但他們總是可以一笑置之,因為在他們的內心深處已經獲得了大大的滿足。

2012年3月12日 星期一

KONY 2012


這張臉孔是我最近常常在facebook上看到的臉,但我直到今天才搞清楚他是哪位,

在觀看我的嘴嘴文前,請您先撥空看一下這段影片。


make Joseph Kony be famous

在觀看這部影片前,我壓根不知道 Joseph Kony 是何方妖魔鬼怪,

或者應該說,我只活在我自己所能觸及所能觀看到的世界之中,對於看不見摸不到的世界一無所知,

但 facebook 是個神奇的地方,就如同影片所言,facebook 上的用戶已經比兩百年前的世界人口還要多,

這是一個沒有國界阻隔的世界,世界各地的訊息在其中恣意流動,每個分秒都可能接收到來自世界上某個小角落傳達而來的訊息,
(但還是有某些刻意箝制人民思想的國家...)

任何一個人有意義的舉動,都可能形成一股洪流席捲全世界,聚焦全世界的目光,

在這之中,我們與世界上七億五千萬人分享理念、思想,進而相互聲援、發起行動,

當數以千以萬計的國民在要求政府做某一件事情時,便形成了一種國家利益,

回應它就成了政府不得不面對的問題,這是一條新的人類行為規則,

過去由上而下的訊息傳播方式將被顛覆,facebook 帶來了新的社會溝通方式,

想當然而,它絕對是一種革命,我相信它絕對足以改變這個世界的流動,

觀看這段影片的同時,讓我們不單單在見證歷史,也同時在創造歷史。

2012年3月9日 星期五

Introduction of GCC Compiler

對軟體工程師來說,使用 GCC 編譯程式碼是一項基本的技能,GCC 可說與我們的工作內容密不可分,以下就 GCC 的大致功能做一些簡單的整理:
(主要內容參考自 MAXSOLAR'S LINUX BLOG - Makefile 範例教學)
  • 傳統的編譯方式
  • gcc foo.c -o foo
    可在拆解成如下的動作:
    gcc foo.c -c
    gcc foo.o -o foo
    • 編譯的過程是將原始碼(foo.c)先使用 -c 參數編譯成 Object file(foo.o),然後鏈結一個函式庫成為二進位檔(binary)如下。[-c : Compile]
    • gcc foo1.c $SACLIB/sacio.a -O3 -g -Wall -ansi -o foo1
    • 接下來有更多 Makefile 的參數出現了,一一介紹如下:
      • -c:編譯但不進行鏈結,會產生一個跟原始碼相同名稱但副檔名為.o的目的檔。
      • -O:表示最佳化的程度,-O預設就是-O1,可以指定成-O2或-O3,數字越大表示最佳化程度越好,但是會增加編譯時間。
      • -g:把偵錯資訊也編譯進去,當你有需要使用GDB軟體進行偵錯,必須加入-g使GDB能夠讀取。一般情況下可以不用-g,因為它也會增加binary大小。
      • -Wall:顯示警告訊息,使用這個參數會在編譯時顯示更多的警告訊息。這個參數相當有用,特別是找不到 libs/headers 之類的問題。
      • -ansi:使用相容ANSI標準的編譯方式,ANSI 是 American National Standards Institute,即美國國家標準學會的簡稱。-ansi 可以增加程式的可移植性。
      • $SACLIB:是一個路徑變數名稱,必須被指定正確的值。執行這個命令前必須先確定這個變數是有被指派到正確路徑才行。.a 檔是一個靜態函式(static library),關於靜態跟共享的觀念稍候解釋。
    • 再來更多吧!假設今天要編譯 main 這隻程式,source codes 中有 main.c, foo.c, target.h,並且需要 /usr/local/moreFoo/lib/libpthread.so 這個共享函式,以及 /usr/local/moreFoo/include 裡面的 headers;這麼複雜的情況又該怎麼作呢?
    • gcc main.c foo.c -I /usr/local/moreFoo/include -L /usr/local/moreFoo/lib -lpthread -O3 -ansi -o main
      以上新出現的參數定義如下:
      • -I:需要 include 某些 headers 所在的目錄,通常 include 目錄都放置headers,利用-I使編譯器知道去哪裡找原始碼裡宣告的 header。gcc預設會去尋找headers的目錄大致有:
        • /usr/include
        • /usr/local/include
        • /usr/src/linux-headers-`uname -r`/include
        • /usr/lib/gcc/i486-linux-gnu/UR_GCC_VERSION/include
        • Current Dictionary
        因此,當原始碼內有宣告 #include <fakeFoo.h>,但 fakeFoo.h 並不在上述的資料夾內,就需要利用 -I 引導 gcc 找到它。至於 target.h 因為在當前目錄,因此不必額外宣告。當然,也可以利用多個 -I 來指定多個 headers 的路徑。
      • -l:表示編譯過程需要一個 library。-lpthread 代表需要一個名為 libpthread.so的函式。
      • -L:需要額外鏈結函式庫所在的目錄,有時候程式碼經常會呼叫一些函數(methods, functions 或是 subroutines),而這些函數是使用其他人預先寫好的、已經編譯成函式(例如 libpthread.so )供人使用的話,我們就不必自己從頭寫過。gcc 預設會去找函式的目錄大致有:
        • /lib
        • /usr/lib
        • /lib/modules/`uname -r`/kernel/lib
        • /usr/src/linux-headers-`uname -r`/lib
        • /usr/local/lib
        • Current Dictionary
        因此編譯時,利用-L指定目錄告訴編譯器可以該路徑下尋找 libpthread.so。因此,若使用了-l,則必須確定所使用的 library 有在預設尋找的目錄中,否則就必須利用-L來指定路徑給編譯器。當然,可以利用多個-L來指定多個 libraries路徑。
  • 靜態、共享與動態鏈結函式庫
  • 輪子不必重複發明 -- 人家寫好的方法我們可以直接拿來用。不過很多時候,這些方法可能因為某些因素,希望提供給別人使用卻又不希望公佈原始碼,這時候編譯成 libraries 是最好的選擇。
    • 靜態函式(static libraries)
    • 靜態函式其實就是將一系列 .o 檔打包起來,因此它可以直接視為一個巨大的 .o 檔。打造出一個靜態函式的方法很簡單:
      gcc operator.c -c
      ar crsv liboperator.a operator.o
      或者
      gcc -static operator.c -loperator
      兩種方法皆能產生 liboperator.a。假設這個靜態函式在 /usr/local/foo/lib/ 裡,編譯時要與靜態函式作鏈結也很容易:
      gcc main.c /usr/local/foo/lib/liboperator.a -o main
      把靜態函式當成一般的 .o 檔一起納入 binary,也可以像這樣:
      gcc main.c -L /usr/local/foo/lib -loperator -o main
      靜態函式將所有的功能全部打包在一起,因此 binary 會變得很巨大,但是執行這個程式的所有功能都已滿足,不會再有 libraries 相依性的問題。但是缺點在於當某些libraries的功能有所更新時,這個程式就必須重新編譯,無法享受到即時更新的優點。通常商業軟體以及嵌入式系統等功能異動較少的程式,會傾向使用靜態函式。
    • 共享函式(shared libraries)
    • 共享函式跟靜態函式的觀念剛好相反,程式在執行時必須能夠找到相依的函式,否則執行時會出現錯誤訊息。製作一個共享函式的方法也很簡單:
      gcc -shared operator.c -o liboperator.so
      或是先編譯出目的檔再進行鏈結:
      gcc -c operator.c
      gcc -shared operator.o -o liboperator.so
      產生出 liboperator.so。假設這個共享函式在 /usr/local/foo/lib/ 裡,使用共享函式進行鏈結也很容易:
      gcc main.c /usr/local/foo/lib/liboperator.so -o main
      也可以像這樣:
      gcc main.c -L /usr/local/foo/lib -loperator -o main
      共享函式在程式啟動時期會檢查是否存在。以一個分別鏈結了靜態函式與共享函式的 binary 而言,執行的結果大有差別。以靜態函式鏈結的 main 程式可以順利執行,但是假設系統預設尋找函式庫的路徑裡找不到 liboperator.so,以共享函式鏈結的main程式則會出現錯誤訊息:
      ./main: error while loading shared libraries: liboperator.so: cannot open shared object file: No such file or directory
      這時解決的方法有四種:
      1. 把 liboperator.so 複製或是作一個連結到 /usr/lib 裡。
      2. 修改 /etc/ld.so.conf,把 /usr/local/foo/lib 加進系統 libraries 的搜尋範圍內。
      3. 設定 LD_LIBRARY_PATH 變數,累加該路徑進來:如果你不是系統管理員,前兩個方法根本沒辦法執行。我們只好自己加到 ~/.profile 裡:
      4. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/foo/lib
      5. 改用靜態函式進行鏈結。
      共享函式經常出現在開放原始碼的 linux 世界裡,由於使用所有函式皆是共享的,因此許多程式都可以重複利用既有的功能;有新功能或是 bug 也能簡單的替換掉該函式,所有程式都可以即時享受到這樣的改變,也是最為常見的函式型態。
    • 動態函式(dynamic libraries)
    • 動態函式跟共享函式非常類似,唯一的差別在於程式執行時期並不會去檢查該函式是否存在,而是程式執行到某功能時才進行檢查。這種動態載入的技術最常用在瀏覽器或是大型程式的外掛程式,當有需要用到這個功能時才載入進來。而製作一個動態函式較為麻煩。
      gcc -c -fPIC operator.c
      gcc -shared operator.o -o liboperator.so
      其中的 -fPIC 是產生 position-independent code,也可以用 -fpic,撰寫呼叫動態函式的程式碼也需要傳入相關參數。

2012年3月1日 星期四

CGI Overview (Based on C++)

CGI (Common Gateway Interface) Overview
  • CGI 的角色定位
  • C++ Output
    • 如果我們想要利用 C++ 在畫面上呈現出"Hello World!"的字串,我們通常會用下列的程式碼:
    • 但是如果是想要在瀏覽器上呈現出"Hello World!"的頁面,我們還有更多動作需要做,這時就需要 CGI 的支援。
  • Content-Type Header
    • 每一個 CGI Script 都必須優先輸出以 MIME 形式表示的 Content-Type Header,舉例來說:text/plain 表示純文字內容輸出;text/html 表示一個 HTML 的網頁。實際上的程式碼可能是如下所示:
  • First Simple CGI Script
    • 如上所言,我們可以簡單的寫出一個 CGI Script 如下:
    • 為使它更符合標準的網頁結構,並善用 HTML 所提供的 Tag 來美化它,可將其改為如此。
    • 如此一來,瀏覽器便能正確的解析它的內容。
  • Using HTTPd Environment Variables
    • 當我們在伺服器上利用 HTTPd Server 執行 CGI Script ,HTTPd Server 會利用許多環境變數來存放資料,我們可以用 getenv() 來取用這些環境變數,以下就以取得 Client IP address 的 CGI Script 做示範。
    • 你也可以秀出當前時間或是顯示使用者的瀏覽器類型(利用 HTTP_USER_AGENT 參數)
  • Receiving Data From Form
    • 接下來介紹使用 Http "POST" 的方式進行資料傳遞,CGI Script 可透過 STDIN 取得Data,當 HTTPd 收到資料後會先放在一塊輸入緩衝區,並將資料大小紀錄在CONTENT_LENGTH (環境變數),再以 CGI 程式的 STDIN 指向此塊緩衝區,在 C++ 下最簡單的方法是透過 fread() function 取得資料。
    • 下面用一個 HTML <FORM> 來說明 POST 資料的運作過程:
    • 當使用者送出這個表單,CGI Script 將透過 STDIN 收到以下的資料。
    • value1=test1&value2=test2&value3=test3
    • CGI Script 接收資料並回覆的程式碼內容可能如下:
  • Parsing The Form Data
    • 這裡有兩個關於CGI Library的檔案,接下來我們會使用到它們內部的函式跟功能,它們提供兩個 Classes: CCGI 跟 CCGItem,可以更方便的處理資料。
    • 以下是它們的運作方式:建立一個 CCGI 跟 CCGItem,呼叫 CCGI::Load() 來讀取資料,接著呼叫 CCGI::GetItemCount() 來取得被送出的數量,然後利用 CCGI::GetItem 來取得資料,以一個指標指向已填入相對應 item name & value 的 CCGItem ,呼叫 GetName() 以及 GetValue() 進行資料取用。請參考如下的程式碼:
現在你應該對於 CGI based on C++ 有了基本的認識,接下來你可以嘗試寫更有用且具有互動性的 CGI 程式。