2015年7月12日 星期日

使用Google App Engine 處理前端ajax request

最近在學用GAE寫一個簡單的服務,結果一直鬼打牆,這時候就要來跟我念一遍:前.端.超.難.

這次是用了google app engine來處理ajax post,送一些base64 encode後的字串把資料送到server去,用的是ajax 來達成,ajax 其實跟一般的post, get沒什麼兩樣,只是它不需要重新整理網頁,可以做到網頁內容即時的變換。

使用時先產生一個XMLHttpRequest物件,如果是IE5跟IE6就直接放棄支援(其實要用舊語法,不過…算了管它去死),並用它開啟一個GET, POST的要求,指定server 的URL跟是否同步傳送,並用send()發送
還可以用setReqeustHeader來指定post 的內容,總之有許多的設定可以選用,我用的就很直接,一個非同步的post 把資料送去server 就是
xmlhttp = new XMLHttpRequest()
xmlhttp.open(“POST”, “upload?data=” + data, true);
xmlhttp.send();

建立python handler,其實就是post handler,GAE已經把post分解為request物件,直接取裡面的內容就好了:
class UploadHandler(webapp2.RequestHandler):
    def post(self):
        data = self.request.get("data")

註:後來發現這裡的內容有錯,這樣寫會動沒錯,但因為data 仍然在open() 的URL 裡面,為GET method,會視瀏覽器遇到幾KB 的長度限制,data 很長的話應該要放在send() 裡面,才是POST method ,理論上的長度上限是 GB 等級。
上面應該要改成:
xmlhttp = new XMLHttpRequest()
xmlhttp.open(“POST”, “upload", true);
xmlhttp.send(data);

class UploadHandler(webapp2.RequestHandler):
    def post(self):
        data = self.request.body

如果要回應什麼東西給ajax,用return送回去就是了,並在routing rule 建立對應的規則:
app = webapp2.WSGIApplication([
('upload', UploadHandler),
], debug=True)

這樣一個極簡單的ajax post handler就完成了,雖然說我python後端無法解開前端javascript編碼的base64字串,不知道又是哪裡有問題,反正前端超難我什麼都不會

其他ajax請見w3schools
http://www.w3schools.com/ajax/default.asp

本文感謝世恩大神的指導。

2015年6月27日 星期六

從MoPtt事件認識自由軟體

前些陣子發生了現稱的MoPtt事件,大抵就是手機Ptt瀏覽器MoPtt會過濾掉對手JPtt的簽名檔'Sent from JPTT on',也有鄉民把MoPtt的Java 嘔吐物打開來檢視,發現的確有過濾的程式碼,只要是該文字開頭該行(還是該文?)就會直接消失:
if (!flag && !s.trim().startsWith("Sent from JPTT on")) goto _L5;
else goto _L4
_L4:
return;
_L5:

其實這件事整體來看沒什麼大不了的,會鬧大比較像是MoPtt作者危機處理的問題,大部分人擔心的,都是所謂的「見微知著」:如果今天可以屏蔽一行,明天能不能屏蔽特定詞彙?

我們可以從這個事件來認識一下所謂的自由軟體(Free Software)的理念。

自由軟體是Richard Stallman 這位Hacker所創立(我還記得在黑客列傳:電腦革命俠客誌他被列在最後一章:最後的真正黑客),最重要的GPL授權,大抵上保障了每個使用者可以自由取得軟體和它的原始碼、複製、修改、再發行的權利

現今大部分的軟體都是直接包裝執行檔,這樣的情況是可以隱藏一些實作的細節。
例如,如果我們天天使用的M$ word,裡面其實有一個監控子程式,會在存檔的時候把你打的文件保留下來,在你連網的時候傳送給政府?或者你的瀏覽器會像中國的防火長城一樣擋掉關鍵字,把你的瀏覽歷史記錄下來送給警察局?

古老一點的信件審查,我們可以透過朋友轉送;禁止公開演講我們可以選擇私下演講;可是軟體不同,它已經深入我們的生活,軟體本身隱誨、編譯過後的特性又讓逆向工程、替代方案、注意到被監控不像實體生活這般簡易,這次的MoPtt事件也是在偶然之間被糾出才會爆發,事實上這樣的行為持續了多久根本未知。
為了防止這樣的權利被軟體工程師壟斷,編輯、編譯軟體的權利應該釋放到每一位大眾的手中,所謂「陽光是最好的消毒劑」,軟體的實作應該公開在所有人面前,使用者可依自己的需要去編譯自己合用的軟體,如果MoPtt會擋掉特定詞彙,我們應該要有能力修改它,弄一個YAMoPtt(應該有人知道這什麼梗XD)
這也是為何Richard Stallman開始了gcc計劃,讓每個人都有自由的編譯器可以使用

我的同學盈志大神對這個事件的看法是這樣的:「這種程度的言論過濾我認為是可以接受的,這就跟某些電視台不報其他家電視台的新聞一樣沒什麼大不了的,況且又不是完全沒有其他的程式可以看ptt……如果只是商業利益考量我認為完全沒問題」
我的看法正好相反,這樣的行為其實跟過去報紙審查或是把書本關鍵頁面塗黑其實是類似的,而且更加可怕,以前你會看到書本是黑的,你會知道有某些東西不見了,軟體的審查卻是無影無蹤,除非,軟體自由開放大家檢驗。
誠然我們有其它軟體可以選擇,但難道我們可以說老三台時代的人們都有選擇,所以他們都有言論自由?又如何去定義「只是商業利益考量」呢?想要進入中國市場而擋掉特定文章算不算「只是商業利益考量」?我支持所謂「防微杜漸」說,自由該是努力守護的目標,而非苟且接受已有的現實,如果我們要一個理想的自由社會,我們就需要能夠讓人人守護自由的環境,無從妥協。
一個對照組就是我同學qcl做了它的qclean 插件,它會擋掉Facebook廣告,但它會公告周知實作方式:
https://github.com/qcl/QCLean
這確保了,雖然被屏蔽,我們還是能夠選擇的自由。就如在NSA事件爆發時,有人資疑windows跟openBSD裡面可能藏了FBI的後門,FreeBSD的原始碼立即被開發者們檢視,但windows的使用者卻無從選擇,他們的言論自由可能正受威脅,如果我們無法接受書籍審查、任意登門搜察,就應無法接受非自由軟體。

有了自由軟體,才能往下談資安、隱私、自由,其餘都是免談。

這也是我為何認為自由軟體的理念其實比開放原始碼更為崇高、範圍更廣,它的目的是要確保未來,每個人可以保有珍貴的言論、隱私 ,人類的歷史以成千上萬的人命作祭品召喚了言論自由,不該斷在軟體的執行檔下,如果想要進一步了解自由軟體,歡迎到自由軟體基金會和Gnu官方頁面,我一時之間找不到相關中文文件:
http://www.fsf.org/
或者可以參考洪朝貴教授的網站http://people.ofset.org/~ckhung/a/c_83.php
有更多深入的內容。

MoPtt事件相關記錄:
http://zh.pttpedia.wikia.com/wiki/MoPTT%E5%B1%8F%E8%94%BDJPTT%E7%B0%BD%E5%90%8D%E6%AA%94%E4%BA%8B%E4%BB%B6%E8%88%87Mo%E4%B9%8B%E4%BA%82

2015年6月16日 星期二

駭客與畫家:電腦世紀的大觀念

這本書是當兵前傳說中的 jserv 大神送的,雖然說當兵有很多零碎時間,但能利用的時間不太多,19 天也才差不多看完這本書。
作者paul graham 是位程式設計師,創立了第一個提供網頁端服務的新創公司viaweb ,後來被Yahoo 收購轉變成yahoo store,他同時是Y combinator 的共同創辦人

內容沒什麼主軸,序言也自承各章間沒有關係,比較像作者寫的散文集,介紹他的想法、viaweb 的運作…,可以從字裡行間看出作者對網際網路獨到的眼光,例如本書寫在2004 裡,可是它仍精準的預見了網路應用程式的興起:「『我的電腦』這程概念正在遠去…我們應該能透過任何電腦取得我們的資料」、「用戶端不應該儲存資料,應該像是電話一樣…資料和應用程式都不需保存於用戶端」、「如果微軟的應用程式只能用在某些用戶端,競爭者將能藉由提供其他用戶端所需的版本而取勝」
對照現今的dropbox, chromebook, 行動裝置,幾乎都預測到現今的科技走向,作者也用viaweb 的營運來解釋網站型應用程式的特性,包括滾動式的出貨更新、極低的營運成本、小程式的組合而非單一大程式、為了在競爭中取勝而被迫無時無刻工作,如果是相關領域的人一定會看得猛點頭。

後面有一大部分則用來抒發作者對於「程式」這樣東西的看法,作者本身就是程式語言設計師,專精的語言是Lisp(他甚至設計了一個Lisp 的方言),書中對Lisp 的先進特性著墨許多,他覺得學Lisp就算用不上,也能鍛鍊自己對程式的想法,或許之後應該利用下部隊的閒暇時間來學習一下傳說中的危險剃刀。

依作者的看法,他認為理想的語言應該有下面這幾個特性:
  • 可以很快用很短的原始碼完成雛型產品,不需慢慢堆出成品
  • 可以快速分析原始碼,找到需要最佳化的焦點
  • 夠直覺,可以輕易上手,不需要長篇大論的使用說明
  • 核心夠小而且強大,不對使用者作出額外限制

當然不用說Lisp 應該是作者理想語言的首選;以我個人的觀點,我認為python 是目前最符合這樣描述的語言,但新的語言不斷出世,時時刻刻都要保持學習的心情,就像作者警告的:你學會一種語言,你會用那種語言在思考,於是你只會覺得其他語言只是「多了一些不一樣的語法,可以達到相同功能」的語言,卻會忽視了其他語言的強大之處。

整體來說,這本書還是可以看,不過我覺得不太需要太過認真,選幾章看起來有趣的章節讀就好了,不過話說回來這本書好像已經絕版了,只能看網路上的電子全文了:

相關資料:
paul graham 的個人網頁
viaweb條目:

噢,附帶一提,這本書裡面錯字其實不少,而且依據錯字錯的方式,我認為翻譯的人可能是用嘸蝦米輸入法,像是運算(ZMR)變成運些(ZFR),決定(NEZ)變成決正(EZ)


2015年5月13日 星期三

Rust Cargo

佈署是現代程式設計遇到的一個問題,雖然網路的出現讓大家可以快速的流通成品,同時也帶來各種版本混亂。
這個問題在C/C++ 上不嚴重,主因C/C++的跟底層黏著度高,演化速度也慢,都是透過作業系統的套件更新。相對的我們可以看到無論python 的pip、Ruby的RubyGems、Golang 支援從github 取得project、NodeJS的npm,都是要建立一個統一的套件佈署管道,方便設計師開發。

今天要提的,就是Rust 的解決方案: Cargo,用來管理rust project,當然如果不用cargo,就算像之前的嵌入式系統一樣,直接寫一個rust檔案並用Makefile + rustc 編譯也是沒有問題的。

安裝好cargo使用cargo new即可生成一個新的rust project資料;跟先前提到的一樣,Cargo new 時即會生成一個git repository和它的.gitignore,方便套件版本控制。
project的資料會使用Cargo.toml這個檔案來管理,toml 是一款極簡的設定格式,相關文件格式可見:
https://github.com/toml-lang/toml

Cargo.toml 裡面會定義這個package 的資料:
[package]
name = "package name"
version = "0.1.0"
authors = ["author <author@xxxxx.com>"]

Cargo 有一系列可用的指令,用cargo --help 就可以看到
build Compile the current project
clean Remove the target directory
doc Build this project's and its dependencies' documentation
new Create a new cargo project
run Build and execute src/main.rs
test Run the tests
bench Run the benchmarks
update Update dependencies listed in Cargo.lock

一般最常用的組合,大概就是new, build, run三個基本指令,用來初始、編譯、執行,預設會用src/main.rs當作預設的編譯目標,並建構在target資料夾內,下面是其他的功能:

相依套件:

如果要用到其他的套件,把相依的套件名字填入Cargo.toml裡面:
[dependencies]
package “package version”

[dependencies.package]
git = “url”

[dependencies.package]
path = “path”

並在原始碼用extern指定它即可:
//main.rs
extern package
use package::{};

Cargo build 的時候會自動去檢查相依性套件,從它的git repository裡面簽出最新的master版本放到家目錄的.cargo 中,並用它進行建構;簽出的版本會寫進Cargo.lock,如果把Cargo.lock 傳給別人,他們就只之後就能用這個版本建構,如果要更新Cargo.lock 的話,就要用cargo update 來更新相依的套件,或用cargo update -p package指定更新某套件。

使用本地套件:

如果需要修相依套件裡面的bug,cargo 可以指定用本地的套件,而非簽出在.cargo 裡面的套件,只要在project 往上到根目錄的任一個地方,產生一個.cargo 的目錄,並在裡面建立config 檔,標示local project 的Cargo.toml 所在:
paths = ['path to local project']

測試:

cargo test 會執行在src 跟tests 裡面的測試,也就是有#[test] attribute 的,算是一個不錯小工具。

如果拿servo 當例子:
https://github.com/servo/servo/blob/master/components/servo/Cargo.toml
一開始先定義package:
[package]
name = "servo"
version = "0.0.1"
authors = ["The Servo Project Developers"]

servo要編出的library
[lib]
name = "servo"
path = "lib.rs"
crate-type = ["rlib"]

下面有一大排dependency,都是servo project 內的子專案,所以都是用相對路徑的方式來定義,而這些子專案的Cargo.toml內又會定義相依套件,例如外部相依大部分定義在util 裡面,這就會用git 的方式來引用:
[dependencies.azure]
git = "https://github.com/servo/rust-azure"

有一次有寫到一個issue 就是要更動相依的rust-mozjs的套件,再更新servo 內Cargo.lock 檔,相關的更動可見:
https://github.com/servo/mozjs/pull/29
https://github.com/servo/servo/pull/4998

參考資料:

相關的cargo內容可見:
http://doc.crates.io/guide.html

可取用的rust 的套件庫以在這裡找到:
https://crates.io/

2015年5月10日 星期日

二十一世紀資本論

這本書是先前作者皮凱提來台演講時,隨演講票一起買的,花了一段時間把它讀完,在這裡寫一下有關它的心得,其實先前朱敬一已經有寫過這本書的導論了,推薦大家看一看。
http://www.storm.mg/article/23089

第一部分很大的篇幅,剖析法國、英國、美國、德國等歐洲國家的歷史資料,分析各國的資本歷史,解釋各種資本的消長;並說明有史以來,低度成長、低通膨與不會流動的社會才是常態,極小部分人可能因為獨門技術或是透過原有資本投資,向上晉升到富有階級,但對大多數人來說是極不可能的事,靠著繼承而來的資本可以勝過其他人一輩子工作的所得,書中也引用不少19世紀的小說,來做為作者想法的佐證。而後隨之而來的兩次大戰大抵將原有的資本階級消滅迨盡,戰後科學技術高度成長帶來勞務所得的高成長,作者也詳加解釋其中各種要素間的消長。

第二部分進入分配不均的討論,解釋作者最主要的想法:就是長期來看資本所得會超過勞務所得,導致持有資本的人財富累積的速度快於無資本的人,舉例而言,擁有兩棟房子的人(資本持有者),可以選擇將一棟房子出租賺取報酬。
這些話口說無憑,作者最大的貢獻,就是援引歐洲-特別是法國-的歷史資料:人口普查、報稅資料來佐證他的想法,即便富豪的所得資料缺乏統計,作者仍會試圖引用富士比雜誌的統計,全球財富報告的統計去估值,並一一說明不同的統計的缺陷。
至於為何分析的多半是法國等歐陸國家,純粹是因為歐陸國家的稅收和人口財產統計開始得比較早,近來作者開始和其他國家的學者合作,試圖將它的收入統計拓展到其他國家。

這部分說明他用的統計模型,給予討論基準,並說明資本的分配不均與勞務的分配不均,檢視高所得族群投資報酬率差距;並比較個人才能和財富繼承的財富流量,警示現今富有國家的財富繼承已經接近十九世紀的水準,必須要有手段來解決資本趨異的問題。

最後一個部分,作者試圖提出他對於資本不斷趨異的解法:針對資本的累進稅率。

資本會生出資本這件事,不是什麼經濟制度的缺陷,正好相反,透過租金、股利、地產增值來賺錢,是資本完全自由流通的結果,資本制度完全無法解決這樣的問題。

面對所得重分配的要求,必須要有政府機關的介入,而和強制性的通膨、長期的通貨緊縮、利用移民進行資本重分配比起來,累進稅率會是比較符合公平正義、能夠精確針對資本階級,又能將重分配的過程置於民主討論和監督的解法。
這樣的政策需要國際間的通力合作,才能確實的打擊資本利得的成長,就我看來,作者有些一廂情願,期待國際間突然攜手合作,難度大概近於登天,更何況資本階級還能運用對政治的影響力來反對這類政策的推行,只要國際間有了些許缺口就會使整體成效不彰,但或許,當國際間受夠了通膨造成的熱錢流竄與不斷拉開的貧富差距,公共債務的不斷膨脹,會真的坐下來好好檢視資本累進稅的可能性?

個人是覺得這本書詳細歸詳細,知識密度卻略嫌不足,或許是求謹慎,作者詳實的介紹每筆資料的來由,每一個模型的假設,在開頭的歷史資料中,美國黑奴是否應該算在「資本」當中,他用了相當篇幅解釋奴隸被歸為「資本」或「勞力」時,會出現什麼不同的結果,但這幾個百分點的差距對讀者來說沒什麼意義。
但撇開理論細節和背後的數學不提,這本書仍然值得一看,可以把他的前半部當成經濟史來看,可以看到一些有趣的觀點;從最後一部分的資本利得稅的建言,也能學習到各種政策工具的影響和優劣,中央銀行在政治上的定位,現今金融監理制度的缺陷;反正遇到太多詳細的解釋,跳過去就是。

這本書只是在財富重分配上開了一個頭,相關的議題還有待更多的討論,對裡頭的論點也不必照單全收;資本與勞務間的論戰不會就此塵埃落定,甚至根本不可能塵埃落定,本書終將是一場長期論戰中的第一棒,但正如作者所說:「社會科學研究者就像所有的知識分子和公民一樣,應該參與公共論辯……必須做出抉擇,並針對特定制度與政策表明立場,無論是關於社會國家、賦稅制度或公共債務的問題」

為政治提供建言,是學者的責任,因為社會科學說到底都是政治,我想不止經濟學如此,任何學科都是;從這裡,我看得到一位身為知識份子,在他的專業上樹立的典範。