[書摘] 哈佛最受歡迎的快樂工作學

20秒定律

如何化知識為行動?你明明知道很多成功人的習慣,為什麼自己卻做不到?真相是,好習慣非常不容易維持。無論他們多麼合乎常理。大家每逢新年的第一天都會向壞習慣宣戰,但到了第十天,又會恢復原型。
每個嘗試飲食控制的人,都有過這種意志不堅的經驗。我們會一再節食,直到突然承受不住,最後只好讓防線全面崩潰。

事實是:意志力需要鍛鍊,而且會越用越少。最後會形成一道無法跨越的障礙,阻止改變與成長。因為我們很容易屈服於舊習慣,走最輕鬆,最舒適的一條路。為什麼當個有效率的人會如此困難?因為有很多事情都不斷打斷你。小小的障礙(20秒的距離)就可以打敗你的意志力。因此你可能會需要清除這20秒的障礙,例如每天晚上想好隔天一整天要做什麼、把慢跑鞋、衣服都擺好,隔天一醒來就可以出門慢跑。把那些容易干擾你,打敗你意志力的障礙先清除掉。

要讓一個員工失去工作熱忱,最快的方法就是告訴他這份工作除了有錢可拿,別無價值可言。

如何處理突如其來的壓力或打擊造成的挫折

小心習得性失助。當我們遭遇失敗或突如其來的打擊時,可能會變得非常無助,索性用放棄作為回應。

當壓力和工作量以措手不及的速度增加,我們最新失去的通常就是掌控感。尤其是當我們試圖一次處理太多事情的時候。當遇到過大的壓力或突然奇來的挫折的時候,小心不要讓反射腦劫持,進入fight or fly的模式。為什麼股東會買高賣低?為什麼泡沫破裂市場會崩解?人人知道恐慌性拋售不是好主意,但是人們還是會這麼做。

當人們處於巨大壓力下,復原最快的人是那種「能夠便是自己感受並將感受訴諸語言的人」,因此,你需要寫下你自己的感受、或是跟值得信賴的好朋友談心,把壓力及無助感宣洩,這是重拾掌控感的第一步。

下一個目標是:辨識哪些東西處於掌控之中,哪些不在你的掌控之中。釐清我們無法改變,必須放手的部份,同時辨認出我們仍然可以努力改變的部份,把心力集中在適當的地方。挑戰潛能極限很重要,但不要一下就做到。不要野心過大,設下不合理的目標,你會很容易就感到沮喪、氣餒和困惑。在結果論成敗的世界裡,我們的耐性越來越少,欲望越來越大,我們想要成為超級業務員,賺取最高的紅利,用有最寬敞的辦公室,而且馬上就要。如果我們砸重金請來一位新的CEO,就期待下一季就能看到營收。如果我們花大錢請來一位新的總教頭,就希望下一場比賽能夠打敗對手。那些不斷告訴人們只有立即、巨大的改變才值得進行的電視實境秀,也沒有帶來多大的幫助。這種孤注一擲的心態幾乎是失敗的保證,令人灰心的常識和難以抵抗的壓力會劫持我們的大腦,啟動無助感的惡性循環。讓目標變得遙不可及。

別寫一本書,先寫一頁。別期望上任六個月就成為優秀的經理人。只要努力把目標設定好就好。甚至「不要一下子太努力」,不要讓微小漸進式的工作,變成看不到終點的巨大挑戰,劃下自己的蘇洛圈,設定簡單務實的目標,一步步穩健踏實的完成。

[書摘]有錢人想的跟你不一樣

必讀指數:★☆☆☆☆(看這篇網誌就好,你不必去讀)

最近一位朋友在看這本書,看完後就把書借我。我花了20分鐘速讀完後,再花兩小時寫這篇網誌。

  

書的封面還清楚的寫著「紐約時報,華爾街日報暢銷書排行榜第一名。」

其說這是一本教你如何像有錢人一樣思考的書,不如說這是一本宗教經典書籍。教主是一名原本默默無名,到處打工想賺錢的平凡人。大學畢業後決定全心追求自己的致富夢想。一心懷抱著美國夢到處找工作,創業十幾次都失敗。最後他終於成功了,當了一間販售體育用品店公司的老闆,賺了一大筆錢。但又因為錯誤投資和大肆揮霍又把錢都花光,只好重新開始。最後他決定把他的經驗告訴更多信徒,開了一間「巔峰潛能訓練公司」。讓大家和有錢人一樣思考,一起變有錢。

讓我們來看一看書摘中的致富法則,了解有錢人到底和我們想得哪裡不一樣。

書摘

如果你不是全心全意、真心想創造財富,那麼你很可能創造不出多大的財富

有錢人與積極的成功人士交往,窮人與消極的人或不成功的人士交往。

有錢人選擇根據結果拿酬勞,窮人選擇根據時間拿酬勞

有錢人想著:「如何兩個都要」;窮人想著:「如何二選一」

有錢人很會管理他們的錢,窮人很會搞掉他們的錢

有錢人讓錢幫他們辛苦工作,窮人辛苦工作賺錢

有錢人就算恐懼也會採取行動,窮人卻會讓恐懼擋住了他們的行動。

有錢人持續學習成長,窮人認為他們已經知道一切。

小記 

說真的……這些東西聽起來非常的……stupid。每句話都像常識一樣。這本書的內容和書名相當契合。每一篇都在講「有錢人和你想得哪裡不一樣」。但這本書只停留在「改變想法」的階段。也就是最容易的階段。在真實世界中,要變有錢是一件非常困難的事情。不然為什麼80%以上的人都只是每天認份工作的平凡人,只有少數人可以成為有錢人呢?

買一本書,花個200元,改變一下想法,這樣就可以變有錢,那真的是太棒了。但好好思考就知道,這種想法是非常天真的。作者在寫這本書時,下了很多著催眠式與暗示的用語,像是每個致富法則的背後都有一些自我催眠的行動,例如「請你把手放在你的心上,說:『我欣賞有錢人,我祝福有錢人,我愛有錢人,我也要變成和他們一樣的有錢人』(p.126)」

說真的,作者會成為有錢人一點都不意外,這種教主等級的催眠技巧不成為有錢人都難。一般來說,每一百個業務員大概只有一個會成為超級業務員,而作者大概就是那一個。

有價值的部份

不過就算是這樣的一本書,還是會有少數有價值的內容。你如果把書中給的心態建議轉成行動建議的話,我認為對生涯可能會有幫助,以下摘錄一些書中我覺得有道理的句子。

  • 窮人喜歡拿固定的月薪或是時薪。他們需要知道,每個月再固定的時間,有一筆固定的金額會進漲,月復一月,藉此獲得安全感。但他們不知道自己要為這份安全敢付出代價,那個代價就是財富。
  • 積極的與成功人士交往、學習他們思考、交換聯絡方式。
  • 有錢人相信自己,相信自己的價值,也相信自己有能力發揮價值。
  • 大部分人沒辦法得到他們想要的東西,最大的原因是他們不知道自己想要什麼。
  • 回收到報酬越大,風險也就越高。因為有錢人願意看見機會,所以他們願意冒險。但願意冒險不代表願意損失。有錢人冒的是經過了計畫的風險,他們做研究,付出必要的努力,再根據具體的資訊和事實做出決定。
  • 瘋子才會認為可以預知未來即將發生的事。神經病才會相信可以為將來可能發生的每一個狀況都做好萬全準備,並保護自己。如果你真的想了解一個行業,去做就是了。你不必在第一天就萬事齊備。從在餐廳掃地洗碗開始做起,學到的會比你在外面研究十年還要多。
  • 進入你將來想進入的領域,不管什麼角色開始,總之先跨出第一步。這是你了解某個行業的最好方式,因為你能站在裡面看到一切。其次,你可以建立人脈。這是你站在圈子外面絕對做不到的。第三,一旦你踏入了領域,很多機會之門就會朝你打開。你就可能會發現一個適合自己的切入點,這是你先前看不到的,甚至你可能會發現你並不真的喜歡這個行業,趁你還沒投入太多以前,你還來得及抽身。
  • 把焦點放在你已經擁有的事物上,而不是想著你沒有的事物。寫下十件你在生命中覺得感激的事物,然後每天大聲唸出來。如果你不感激你現在擁有的一切,你將不會再得到更多。

我認為書中最有價值的部份就是這些了,其中的概念和創業有點相似,因為有些共鳴所以記錄下來。

[書摘]你要如何衡量你的人生

這是一本關於人生哲學的書,作者是Christensen,同時也寫了「創新的兩難」。他是位虔誠的基督教徒,因此造就了這本融合了道德與商業,指引人生的好書。

重點節錄

有時從經驗學習,代價未免太大。你不一定得結過好幾次婚,才知道如何當一個好丈夫或好妻子;你也不必等最小的孩子長大成人,才知道如何做個好父母。

人生很多問題不是用單一理論就可以解決的。

對你的工作生涯而言,你覺得最重要的是什麼?但問題在於,你覺得最重要的不一定等於讓你快樂。

百分之百的堅持要比百分之九十八容易 。

好的理論不會只能運用在一些公司或一些人身上。

**談誘因與動機,人究竟為什麼工作?

動機有兩種要素,分別是「保健因素」和「動機因素」

地位、薪水、穩不穩定、工作環境、公司文化等這種讓你感到安全感的東西,叫做保健因素。具有挑戰性的工作、得到認可、責任與個人成長。你能從工作本身感覺到你的付出是有意義的。叫做動機因素。你會發現,即使不斷改善工作的保健因素,你也不會立刻變得熱愛這份工作,頂多只是不討厭而已。真正能讓我們感到滿足的是「動機因素」。如果依照保健因素來選擇你的工作,未來可能會出現一個龐大的問題。

每一個人壓力都很大,包括要養活自己或養家、達成父母和朋友的期望,有人要求自己樣樣都要比別人強。因此,Christensen的同學、還有很多商學院的畢業生,因此瞄準既高薪又高尚的工作,例如銀行、擔任基金經理人、企管顧問等。

有了一份高薪,安穩的工作之後,房貸不成問題,家人也能過著優渥的生活,但他們當初的夢想呢?他們只能告訴自己:「再等一年吧……」或是「我不知道自己現在還能不能做別的事。」過不了多久,有些人就發現他們已經開始厭惡自己的工作。但他們發現自己根本難以脫身。

為了發掘真正的快樂,你必須持續不斷地尋找有意義的機會,讓你得以學到新的東西,肩負更多的責任。問自己一些問題,「我目前做的工作有意義嗎?這個工作是否能給我成長的機會?我可以學到新東西嗎?我有機會得到認可、獲得成就嗎?我能擔負更多的責任嗎?」

談計畫與變化

不少學生和年輕朋友總是認為生涯必須小心計畫,想好未來五年的每一步。在我們的生活和工作生涯中,不管你是否察覺得到,我們總是一方面按照審慎的策略往前走,另一方面必須應付無可預期的選擇。你不可能坐在家裡靠苦思與冥知道自己想做什麼。你一定要走出去,好好嘗試,才會知道什麼樣的工作最符合你的才能和興趣。找到答案後,再來採取審慎規劃。

人不可能清楚的看見自己的未來,別再浪費時間去尋找能透視未來的水晶球。再說,可能會被未來的假象迷惑、對機會視而不見。你在思量生涯之路要怎麼走時,也該展開視野,容納更多可能。隨時準備迎向機會的挑戰,必要的時候臨機應變,不斷地調整你的策略,直到你找到最適合你的工作。

計畫時,要記得問「哪些假設必須證明為真?」,還有你該如何驗證這些假設?這個問題不只是企業策略要驗證,人生抉擇也要驗證。在你接受一項工作之前,請仔細想一想,如果你想要達成你希望,別人必須做什麼?或與你配合什麼?

外包的悲劇,了解你的能力 

Dell電腦對上Asus,最後一步步一味追求投資報酬率,把自己的核心能力外包給Asus,最後只留下品牌。你得了解未來成功必須具備的能力。無論如何,你必須保有這樣的能力,否則就是把公司的未來交給別人。如果你想成為大公司的執行長,你不能去想「什麼樣的工作是成為執行長的墊腳石」,而必須想「如果要成為成功的執行長,我必須要有哪些經驗,必須克服哪些問題?我必須要學習什麼?」

小心邊際思考,以及隨時保持正確的價值觀

大多數人都以為,生命中出現有關倫理的重大決定時,眼前會出現像是不斷閃爍的霓虹燈警告:「請注意,你將面臨重要決定。」幾乎每一個人都認為,在那時命運的轉捩點,他會做出正確的決定。因為大多數人都認為自己不是隨隨便便,沒有原則的人。

問題是:人生很少如此。你根本看不到任何警告標誌。大多數人每天都會面臨一連串小小的決定,然而經過一段時間後,你會發現,這些決定確有非常深遠的影響。Christensen 本身的專業是破壞性創新,所以他看了很多企業採取了錯誤的策略造成倒閉或放棄市場。這通常是錯誤的邊際思考造成的結果。人生也是如此。

10分鐘學會IPTables

先承認標題殺人,這東西不可能10分鐘學會的哈哈XD。

這篇文章是我在做NA作業後研究的心得與筆記,並盡量寫成易懂的形式,讓人可以在最短的時間內熟悉iptables。

本篇文章的Target是在linux下想要學習iptables的人,我的平台是Ubuntu 13.10。

觀念

練劍前先練心法,首先要先對網路上封包的走向有一定的了解,才能掌握如何使用iptables,先直接看圖。

上面綠色紫色的方塊是Linux Kernel中處理和過濾封包的兩個模組,我們專注的看綠色的IPTables就好。

簡單說,這招圖描述了封包進入主機到離開主機,會經過哪些tables,這些tables裡面會寫規則,進行放行或攔截。

大致上你可以發現封包在主機流通時有五個階段

  • PREROUTING
  • INPUT
  • FORWARD
  • OUTPUT
  • POSTROUTING

而且不是每個封包都會經過這五個階段,從主機內部出來的封包就會從output階段開始、通過主機把主機當router的封包就不會經過INTPUT和OUTPUT,反而會通過FORWARDING。

讓我們先不要管綠色的MANGLE,那是比較複雜的設定,也比較少用到。

簡單說,你可以把你腦海中的「封包流動」觀念抽象成下圖。

本圖來源為http://linux.vbird.org/linuxserver/0250simplefirewall.php#natipshare 鳥哥的文章。

實戰

有了觀念後,接下來進行實戰。

成為router

因為我當初在練習時,是把這台機器當Router,所以我們要把ubuntu的IP_FORWARD打開,這台機器才會成為router並幫忙轉送封包。

如果你只是要當router一下下,那就


echo 1 > /proc/sys/net/ipv4/ip_forward
下次開機就會消失。

你也可以寫到設定檔,讓下次開機繼續當router。
/etc/sysctl.conf:
net.ipv4.ipforward = 1 # 把ip forward功能打開

sysctl -p /etc/sysctl.conf # 使設定檔生效

更詳細關於打開ip
forward功能請參閱這邊

IPTables的觀念

一樣先看圖幫助理解。

圖片來源:http://www.thegeekstuff.com/2011/01/iptables-fundamentals/

可以看到IPTables中,其實規則的設定是這樣子

有n張table,每張table內有m個chain,每個chain裡面有一系列的rule。

圖片來源:http://www.thegeekstuff.com/2011/01/iptables-fundamentals/

上面這張圖是IPTables內建的table和chain。

來記得一些規則

每張table都有各自負責的工作,不要把規則隨意寫到任意table

  • Filter table 負責過濾進入主機或離開主機、還有經過主機做forward的封包。
  • NAT table 負責進行NAT,也就是更改source IP/port或destination IP/port。請不要在NAT table中進行過濾的工作。如果你做了,他會把你擋下來並且說你不行XD
  • MANGLE 不講,因為少用而且我也不懂。

你可以自行在任意table的任意chain上添加或修改rule,也可以自己添加自定義的chain,再在裡面寫rule

  • 規則由上往下依序比對,這些rule包含「accept, drop, reject, return」,只要一符合該規則,接下來該封包就會直接套用上去pass或丟棄或阻擋。
  • 你可以在內建的chain中指定跳到某個自訂的chain比對。如果比對成功會套用規則,如果失敗,那就會自動return回當初跳過去的chain的rule位置,並繼續比對下去。

動手下指令

打開你的終端機,開始開心下指令。

首先先記一個簡單的格式

sudo iptables [-t Table] -L -n # 這可以列出你iptables現在的規則

  • -t Tables: 如果你沒有寫就代表預設指定Filter table
  • 如果你下 -t nat 代表使用nat Table,這樣該指令會列出nat這張tables下所有chain的規則
  • -L 代表List chian rule
  • -n 代表避開dns反查,這樣會直接列IP速度也比較快

現在立刻下該指令,動手學習最快。

簡單的講一下常用的指令格式

「指定某張table裡的某個chain,進行[添加/移除/修改] rule,而這些rule包含通過、阻擋、丟棄、跳到其他chain繼續比對、修改source/destination IP/port」


iptables -A [chain] [-s 來源] [-d 目的地] [-p 協定] [.....還有很多自己man] [-j 套用的rule]

  • -A some_chain : append rule到某個chain的最後面
  • -I some_chain : Insert rule到某個chain的最前面
  • -I some_chain 3: Insert rule到某個chain的第三個rule
  • -s 來源:source IP, 來源的格式可以是 192.168.1.1或是192.168.1.1/24,也可以是 -s ! source,這會排除所有source
  • -d 目的地:敘述同上。
  • -p 協定:協定可以是tcp, udp, icmp

其他常用的:

  • –dport port:match TCP或UDP封包的port,port的格式可以是 –dport 80或是 –dport 80:90
  • –sport port:同上
  • -j rule,這裡的rule其實是「target of rule」,也就是你可以是一個chain_name,或是「ACCEPT, DROP, QUEUE, RETURN, REJECT, LOG, DNAT, SNAT」
    更多指令規則請自己man iptables,或是你喜歡網頁版的話這裡不錯

實戰

封鎖你討厭的人的IP,讓他永遠無法跟你連線,假設是140.113.235.151

sudo iptables -A INPUT -s 140.113.235.151 -d 你自己的IP -j REJECTED

你反悔了,你想要和他和好

sudo iptables -D INPUT n #n填入由上往下數第幾個規則,第1個就填1第2個就填2...

你有一連串討厭的人,不想和他們連線

那我們最好另外開一條chain來管理所有你討厭的人
“`
sudo iptables -N BLACKLIST # 在Filter這個預設table下開一條新的chain叫做BLACKLIST

sudo iptables -A BLACKLIST -s 140.113.235.151 -d 你自己的IP -j REJECTED # 加入兩個你討厭的人
sudo iptables -A BLACKLIST -s 140.113.235.152 -d 你自己的IP -j REJECTED

sudo iptables -A INPUT -j BLACKLIST # 讓所有進入的封包都要經過BLACKLIST chain進行比對

**指定一個IP range,不想讓這個IP range的所有人透過tcp連線到我的port 22**

sudo iptables -A INPUT -p tcp –dport 22 -m iprange –src-range 192.168.1.100-192.168.1.200 -j REJECT
“`
-m 的意思是match,先match到的先得

進階,設定NAT

設定NAT不能在Filter這張表中設定,要在nat這張表中設定,所以請一定要記得-t nat

先觀察nat這張表的預設規則是什麼。


sudo iptables -t nat -L -n

我這台機器後面有192.168.2.0/24的子網域,我想讓這些人可以正常上網。


sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

從服務器的eth0網卡上,自動獲取當前ip地址來做NAT

更詳細關於SNAT,請看這裡

我想讓外面的人透過port 222連到我內部內網的port 192.168.2.1這台server的port 22,來進行ssh

sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

預設的nat table規則是什麼?


sudo iptables -t nat -L -n

我這台機器後面有192.168.2.0/24的子網域,我想讓這些人可以正常上網。

sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

從服務器的eth0網卡上,自動獲取當前ip地址來做NAT

更詳細關於SNAT和MASQUERADE的區別,請看這裡

為什麼是POSTROUTING? 因為封包會經過你機器route後離開,離開你機器前會先經過POSTROUTING,這時再改source IP

我想讓外面的人透過port 222連到我內部內網的port 192.168.2.1這台server的port 22,來進行ssh

sudo iptables -t nat -A PREROUTING -d x.x.x.x(你家IP) -p tcp --dport 222 -j DNAT--to-destination 192.168.2.1:22

為什麼是改PREROUTING? 因為封包到你機器進行route前會先經過preroute,這時你就可以趁天賜良機(?)的時候改掉目的地。達成NAT的效果。

BONUS:

你很害羞,不想讓所有人ping到你。

sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

ping是使用icmp protocal實作的,其他的機器會對你發出echo-request,這時你要選擇無視他(Drop)。

LOG通過該規則的封包


sudo iptables ....somerule... -j LOG

要如何觀察呢?

在ubuntu上是tail -f /var/log/kern.log

匯出/匯入設定檔


sudo iptables-save > 你電腦裡的祕密小角落
sudo iptables-restore < 你電腦裡的祕密小角落

結語

以上是我的iptables學習筆記,整理成比較易讀的形式,畢竟這東西不碰大概1個月就忘光了哈哈XD。如果對你有幫助的話歡迎轉載記得附上來源就好。希望有幫助到大家!

參考資料

  • 鳥哥:http://linux.vbird.org/linuxserver/0250simplefirewall.php
  • 不自量力:http://wiki.weithenn.org/cgi-bin/wiki.pl?IPTables-Linux_Firewall#Heading2
  • wikibooks,線上的iptables指令說明: http://en.wikibooks.org/wiki/CommunicationNetworks/IPTables
  • nixCraft: 如何使用range of IP http://www.cyberciti.biz/tips/linux-iptables-how-to-specify-a-range-of-ip-addresses-or-ports.html
  • saving iptables rule: http://www.thomas-krenn.com/en/wiki/SavingIptablesFirewallRulesPermanently
  • 解釋SNAT和MASQUERADE的區別:http://read-and-thinking.blogspot.tw/2009/06/iptablessnatmasquerade.html
  • 如果你用FTP做PASSIVE MODE和port forwarding,要記得看這篇http://linuxpoison.blogspot.tw/2008/11/ftp-port-forwarding-using-iptables.html

論我所看見的資工教育、研究所與創業(一)

每次和朋友討論諸如教育問題、社會問題,最後都只能相視苦笑,因為最終的答案永遠都是「逃離鬼島」唯一解。加上最近熊熊發現自己已經大三下了,對未來的徬徨日益加劇,只好向其他人尋找答案,如果你看完拙作非常歡迎留言給我一些建議。

接下來我會試著整理我所閱讀的網路文章、最近和Jserv大大吃飯的心得、參加SITCON(學生計算機年會)終於和心儀Follow許久的陳鍾誠教授見面聊天。

我所觀察到的問題是,大多數人到大三會開始問自己該不該讀研究所。因為似乎在大學待了三年,根本沒有培養出一技之長,好像自己還什麼都不會,然後開始說服自己大學是培養知識的廣度,接下來要去讀研究所學習,之後畢業才有能力勝任工作。

好,所以第一個問題是,為什麼在大學待了三年,會根本沒有培養出一技之長?答案很簡單,因為大學的目的根本不是培養你一技之長。我們打開交大資工系的課表來看看吧。

大一上:微積分(一)、物理化學生物(三選一)、線性代數、計算機概論與程式設計

大一下:微積分(二)、物理化學生物(三選一)、離散數學、物件導向程式設計、計算機科學概論

大二上:程式語言、資料結構、數位電路設計、電路學與電子學

大二下:數位電路實驗、機率、組合語言與系統程式、演算法概論、計算機網路概論、資料庫系統概論

大三上:作業系統概論、正規語言概論、計算機組織、密碼學概論、微處理機系統實驗

大三下:資工專題一、編譯器設計概論、人工智慧概論

大四上:資工專題二、資訊工程研討演講

以上課程一門三學分,也就是說,一週需要上3堂課,但有些課程像是物件導向程式設計、數位電路實驗、微處理機系統實驗需要額外三堂實驗課,也就是說一週需要上6堂課。

交大資工系還有一個叫做必選修課,你必須從八門課中選兩門來修才能畢業。分別是

(微分方程、數值方法、數理邏輯、組合數學、統計學、訊號與系統、嵌入式系統、軟體工程) 同樣的,這些課一樣每門三學分。

別忘了,你還有通識課和外文課,你必須要修20個學分的通識和8個學分的外文,也就是大學四年你必須要修滿10門通識和4門外文課。

我簡單的估算一下你每學期的修課數量吧

大一上:4門必修 +1門外文 + 1門通識  == 16學分

大一下:5門必修+ 1門外文 + 1門通識  == 19學分

大二上:4門必修+ 1門外文 + 1門通識 + 1門八選二 ==19學分

大二下:6門必修+ 1門通識 == 20學分

大三上:5門必修+ 1門外文+ 1門通識 == 19學分

大三下:3門必修+ 1門通識 + 1門八選二 == 14 學分

大四上:2門必修+ 2門通識 == 10 學分

大四下:2門通識 == 4學分

平均一個學分上課時數是一個小時,大一剛進來的時候你懵懵懂懂,所以很開心的玩社團參加系上活動交朋友我們不考慮。大一下開始到大三上,你每週必須要花19小時在上課,假設你是個用功的學生,每天會花2小時複習當天上的課,那每週就多花10小時。另外交大是有名的「交作業大學」,因此你必須每週花10小時寫作業。因此,你一週平均一週要花39小時。這相當於國外正常上班族的上班時間。

別忘了你還要上體育課、男生可能還會上軍訓課、修其他你感興趣的課、參加社團或課外活動,有愛情學分的另外算。

所以,你認為,你真的有時間好好學習所謂「一技之長」嗎?

鬼才相信,年輕的學生們又怎麼可能會乖乖認真上課呢?當然是有興趣就學,如果剛好這門課教授教的不引人入勝,就隨便應付應付。其他時間,就看各自的造化了,有的人會持續學習其他東西、有的人投注心力到社團、有的人則窩在宿舍打電動。

所以,到了大三快結束的時候,我們培養出了一批徬徨無助的大學生。

然後一部分的人開始覺得自己好像什麼都不太會,這樣畢業好像找不太到工作,於是決定大三升大四的暑假進補習班準備考研究所。

讓我引用PayPal 的共同創辦人,Peter Thiel的一句話吧:

大學管理者就如同拚命以夢想之名說服你貸款買房的次級房貸掮客一般,他們會告訴你,你的付出無關消費,而是投資未來。然而真相是,這切切實實就是失敗的消費決策,絕大多數的大學生活,都只是一場持續四年之久的狂歡派對而已。

雖然這是在描述美國教育的情況,但是搬移到台灣也不遑多讓,只是學費特別便宜而已。

是的,我也是那群不乖的學生,我修其他的課、我自己利用寒暑假的時間學習如何架設網站。接案子、然後和朋友一起做自己發想的專案,有的成功了、有的失敗了。我還利用時間參加其他社團、定時運動、參加商業模式競賽……。

一切看起來很美好,但是每件事情都有它的代價,

我不感興趣的課,我學得非常不紮實。但是你絕對從成績單上看不出來,因為我相對的投注一定的時間來「應付」這些東西。

然後,最近,因為專題的關係,我開始研究四軸飛行器。

我發現,要是從無到有,我根本沒有能力把這個東西架起來。

四軸飛行器簡直是各個學科的綜合體。你必須理解物理原理、了解扇葉的旋轉是如何讓物體飛行、升空、移動。接下來,你必須要透過加速度感測器、GPS、陀螺儀、氣壓計……等來取得週邊訊號,進行濾波後計算、之後反饋到動力控制系統,想辦法讓飛機平衡,你會需要一個板子,燒上控制用的作業系統,根據物理、數學、訊號來讓四軸飛行器升空。

這個感悟讓我非常沮喪,我心中早就知道這些東西總有一天會反過來咬我,只是我一直去忽視他。

在SITCON(學生計算機年會)上,我遇到了陳鍾誠教授,和他聊到了我所面臨的問題。

:「我感受到我以往試圖逃避、不感興趣的科目,其實都有他的用處,只是我們在學習的時候根本感受不到,等到需要的時候卻又使不上力。」

陳教授:「你們有修工程數學嗎?」

:「沒有,這不是必修課。」

陳教授:「MIT四軸飛行器,他們當初在做的時候,其實用了很多工程數學。但你們現在根本沒有學。……」

我們聊了一些教育學用落差的現況,學生在學習理論的時候,感受不到理論的用處,等到需要用到時卻又感慨書到用時方恨少。陳教授也在試圖解決這個情況,他嘗試寫了「給程式人」系列的教科書,創造一些新穎的教法(像是利用R語言來教機率與統計),吸引學生的興趣。

陳教授其實用一個很棒的比喻「劍宗與氣宗」來描述這個現象,這也在網路上引發一陣討論

專科的訓練,就好像是「笑傲江湖」裏「劍宗」訓練弟子的方式,一開始就教他怎麼用劍,這些人習武的方式直接了當,就是為了殺人,或者在打鬥之中獲得勝利。

而大學的訓練,則像是「笑傲江湖」裏「氣宗」訓練弟子的方式,一入門就先蹲三年的馬步,從理論開始學習,這種方式有其好處,內功會比較深厚,但是也有很多缺點,很多弟子受不了三年馬步的訓練,最後氣也沒練好,劍也沒學到。

— by 陳鍾誠 [大學武林 — 氣宗劍宗之爭]
:「那我們究竟該如何學習呢?乖乖蹲穩馬步?或是專注的朝著自己有興趣的領域研究?」

:「這要看你想做什麼而定。你看看XDite,他是劍宗的極致,他非常專注的學習如何用RoR寫好網站。你能說他不強嗎?他也沒好好讀大學,但是他很強啊。但是如果你想成為一個系統架構師,那XDite可能就完全做不來了,系統架構師需要從電腦的底層、CPU的架構了解到上層,這需要像金字塔般的知識一層一層疊上來才做得到。」

:「那你對於該不該讀研究所,有什麼建議?」

:「主要還是看,你有沒有想要研究的題目。以及學校有沒有能指導你研究方向的老師。……」

和陳教授的對話大概到此結束,同樣的問題我也拿去問過Jserv。

Jserv:(講話講很快):啊,你們要做四軸飛行器啊?很好啊?要買現成的板子還是自己組啊?

:現……成的

Jserv:(講話講很快)唉呀,你們怎麼會買現成的呢?這樣超廢的啊,你想想看,四軸飛行器要用到的數學你們哪個沒學過?你還記得argtangent的微分嗎?(OS:好像很多沒學過啊),其實你們都學過啦!只是用不上馬……你說為什麼用不上?因為沒有做過啊?這種就是要親手去實作……

讓我引用Linux Torvals談軟體裡提及的話,這是從Jserv的演講投影片中看到的:

現實是複雜的,不服從一劑良藥解萬愁的問題解決模式,現實的問題解決需要大量艱苦工作,以在細節上做到正確無誤

但是Jserv正努力改變這個情況,他在成大開設一門嵌入式系統實作,試圖對資工系學生「軟硬兼施」,讓學生了解到,你真的可以用嵌入式系統做一些東西,當然,包括一台四軸飛行器。

Jserv:(一樣講話講很快) 我看過很多像你一樣的學生啊,台大交大畢業,可是面試時問他問題,都回答不出來啊……

送小孩去學油畫,好歹能見到實習作品;送小孩去學音樂,好歹能聽到鋼琴演奏,送小孩去唸資工系,卻連一般可用的作品都無法拿出來,只好搪塞說,學習的是「研究」,非一般人能理解

—by Jserv
:那你建議休學嗎?

Jserv: 環境不一樣啦,我那個時候竹科新貴還很夯啊,我不去上課自己打工就可以養活自己了。……你們現在環境不一樣啦,如果是我,我會重新仔細考慮。

待續……

ubuntu firefox flash 亂碼 方塊字與字型問題修正

因為莫名其妙昨天ubuntu gnome的視窗title bar壞掉了,於是決定重灌。浪費我一整個晚上的時間,沒想到重灌後chrome就直接給我更新了。

重點是……更新過得chrome越來越難用,加上資源吃的有點多,所以決定轉戰firefox(啊…上次用firefox不知道是幾年前了啊)

於是就順手測測看chrome上出現的問題firefox上會不會出現,想當然爾,最重要的就是flash問題。

雖然只是小問題,但是我想這一定浪費n個人n個小時,所以決定紀錄在此給後人參考。

想測試的話請上TED,並隨便觀賞一部 範例影片 。記得開字幕選擇繁體中文,如果你的字幕出現口口口這種方塊字,恭喜你成為ubuntu 下 firefox TED字體錯誤的受害者(?)。

解決方法:

解決的方法很簡單,只要裝這個字型 ttf-arphic-uming 就可以了。
$ sudo apt-get install ttf-arphic-uming

重新啟動firefox應該就會正常顯示了。根據網路上查的資料,原因來自TED強制指定了該字型,因此把該字型裝上去就沒事了。

但是接下來你會遇到另外一個問題,那就是畫面變很醜。

有多醜呢?大概是這麼醜:

你的google search會變成這樣

Selection_001

Selection_002

看看那充滿排版不良充滿鋸齒的中文字啊,相信你絕對無法忍受這樣的情況,所以請自行改firefox字體設定,要修改的部份包括

Firefox–>Edit–>Preferences–>Content–>Fonts & Colrors –>Advanced

Fonts for Western: 請把Serif和Sans-serif都改為WenQuanYi Micro Hei

Fonts for Traditional Chinese(Taiwain):請把Sans-serif改為WenQuanYi Micro Hei

接下來,一切就漂亮的完成了。你的字體應該會變成

Selection_003

Selection_004Selection_003

可喜可賀可喜可賀,恭喜你的firefox變得美觀多了,flash亂碼問題也解決了,請愉快的使用firefox來瀏覽網站吧。

僅以此文供後人參考。以上範例使用Ubuntu 13.10與firefox 27.0.1進行測試。

7個小時與Linkedin OAuth的戰鬥

最近接了一個case,case的其中一項目標是要實踐使用Facebook, Gogle, Linkedin來登入網站。

上網查了一下,有朋友推薦使用 oauth.io 這個服務。號稱可以幫你整合Facebook, Google, Linkedin, Yahoo, Twitter…..所有你想得到的OAuth Provider,於是就很開心的申請一個帳號來用。free版一個月可以接受1000次不同帳號的OAuth API操作,對一個小網站來說應該是很夠用了。因此就不假思索的開始研究。

不得不說,OAuth.io 很簡單,照著官方網站的操作把Facebook, Google, Linkedin的Private key和Domain指到OAuth.io,最後利用OAuth.io的javascript Library取得access_token。就可以向Service Provider取得資料授權。

花了15分鐘把Facebook搞定,花了另外15分鐘把Google搞定,確定可以取得access_token,But……人生很多問題就出在這個But啊

設定Linkedin授權給OAuth.io後,熊熊發現,為什麼Linkedin的access_token長得和別人不一樣?

oauth.io for linkedin

是的,沒有為什麼,那是因為,明明Linkedin已經使用了OAuth2.0,但是OAuth.io並只支援到OAuth1.0啊。

接下來就是悲劇的開始,現在眼前面臨了兩個選擇 1. 研究OAuth1.0,利用OAuth1.0來完成授權 2. 放棄OAuth.io for linkedin,手動利用OAuth2.0授權

為了要維持程式的一致性,所以很自然的選擇了第一種作法,但是,萬萬沒想到這個決定,竟然會讓開發者,在接下來的四個小時,跌入了痛苦的深淵(盛竹如口吻)。

相較於OAuth2.0,OAuth1.0是非常討厭的東西……看了Slideshare的這份投影片,你就會理解我在說什麼

OAuth相較於OAuth2.0的簡單取得access_token,再利用private key向Service Provider伺服器驗證並交換user data,OAuth1.0必須要在開發者這邊先做好資料簽章,方法是使用HMAC,簽章的對象是你想要取得資料的網址。你可以去 Linkedin 的 Test Conosle 玩耍一下,大概會知道我在說什麼。

讓我們直接跳過一連串的廢話,重點是: 「OAuth1.0非常麻煩」,但不論再怎麼麻煩,總是會有範例的啊,問題是,Linkedin for python user 提供的範例 是使用python2,官方建議的套件可以在這裡找到。

天殺的python2啊~~~林北使用的是最新最潮的python3啦,稍微找了一下,發現其他支援的套件操作方式都沒有Linkedin官方提供的簡單,於是我又下了一個錯誤的決定:

「手動把套件轉成Python3 support!!」

於是又稍微研究了一下怎麼把python2的檔轉換成支援python3,看起來是簡單的下 2to3 就好了,然後稍微檢查一下import library支援性的問題。費盡一番心血把這些問題處理好後,把程式碼安插到我的專案,開始測試到底有沒有辦法從Linkedin那邊抓到資料。

卻發現,Linkedin有回應(淚),但是授權錯誤根本抓不到。

然後又是一連串研究到底是哪裡設定錯了,看起來根本沒錯啊,於是重新比較Linkedin的test console,讓我懷疑,該Library對Linkedin的簽章方法過時,可能Miss掉一些東西,導致簽章一直過不了。

看到最後我也不想去改Source code了……那本身就是一個悲劇。在悲劇上花費心力對你的人生一點幫助都沒有。

於是,我放棄OAuth1.0,放棄OAuth.io對Linkedin的support,開始手動寫OAuth2.0的code。

相較於折騰人的OAuth1.0,OAuth2.0好多了,但是有幾點小細節要注意,因為Linkedin的官方文件真的很容易誤導人,像是我卡在這邊浪費一個多小時

你可以在Linkedin官方OAuth2.0 step by step教學中看到這段話

linkedin oauth2.0

是的,你要對Linkedin使用https,這個我有注意到,然後要使用POST,嗯,這個我也注意到

但是請「千萬要記得」,正確的作法是對整個網址POST!!!不是把granttype, code, redirecturl等東西包起來當成資料對以前的網址做POST啊

如果你的作法和我或是這個國外網友一樣愚蠢的話,會收到這樣的錯誤訊息

{“error”:”invalidrequest”,”errordescription”:”missing required parameters, includes an invalid parameter value, parameter more then once. : Unable to retrieve access token : appId or redirect uri does not match authorization code or authorization code expired”}

他馬的誰會這樣做啦(崩潰)沒事對這種東西做POST幹嘛……為什麼要把參數都寫在網址上再用POST,這不是理所當然要用GET嗎(已哭)

突破這一關後,你還有最後一個難關。

接下來,Linkedin會一直授權失敗,

查詢問題後發現問題在於如果你有使用Linkedin OAuth1.0過,那OAuth2.0會一直過不了。有國外網友很神奇的解決了這個問題,那就是到Linkedin的設定頁面

Selection_012

按下Revoke,撤銷API key 和 Secret Key,之後重新設定新的API key和Sercret Key,一切才大功告成。

謹以本文,奉獻給未來踏上Linkedin的朋友誠摯的建議

  1. for Linkedin,不要用OAuth1.0。
  2. 用OAuth2.0如果發生問題或錯誤,請服用本文解決,人類的知識來自於眾人的分享與累積,不要讓我的七個小時白白浪費掉啊。

10分鐘理解OAuth和facebook登入原理

最近接了一個要求使用facebook做登入的案子,因此花了好些時間研究facebook登入如何實作。決定留下紀錄,供日後步上相同道路的人參考。

首先,要先理解OAuth是拿來做什麼的,才能知道如何利用他。常聽到OAuth和OpenID,最簡單的說法就是

OpenID:用作「身份認證」,如果某網站support OpenID,你登入其他網站不需要記憶密碼,只要拿你的OpenID登入就好。

OAuth:用作「授權」,舉例而言,如果你需要授權某相片列印公司的網站取得你在Facebook的相片,只要該相片列印公司support OAuth,你也授權,那該公司就可以取得你在Facebook的相片。

今天不談OpenID(因為我也還沒研究),只談OAuth。直接講重點,究竟OAuth要怎麼進行授權?

OAuth有分1.0和2.0,我們只討論比較新的2.0

首先,分四個角色

  • 資源擁有者(Resource Owner): 可以想成擁有Facebook帳號的小明。
  • 授權伺服器(Authorization Server): 相片列印公司向facebook取得使用者授權的伺服器
  • 資源伺服器(Resource Server): 保管你facebook相片的server
  • 用戶端(Client): 想要取得你facebook相片的列印公司

整體的流程是:

首先,相片列印公司在facebook有一個應用程式。

有一天,小明想要到哇哈哈相片列印公司網站想要列印自己的生日Party照片,哇哈哈必須要取得小明的facebook帳號授權,才可以取得小明在facebook的照片。

因此哇哈哈會把小明重新導向到facebook,小明必須向facebook說明「我授權給哇哈哈相片列印公司」,之後facebook會告訴哇哈哈的網站「我已經取得小明的授權了」,證明的方法是發送一個授權token給哇哈哈的網站。

但這時哇哈哈不能確定這個授權token真的是facebook給的,可能是某個不懷好意的無聊資工系學生(相信我,這種人很多)對你的網站進行練習資訊安全作業惡搞你。因此哇哈哈必須要把這個token送回給facebook,讓facebook告訴哇哈哈這個授權是真的,如果是真的,facebook會交給哇哈哈一串「access_token」,這個東西就是萬能的鑰匙!哇哈哈公司用這個就可以向facebook取得所有小明授權的資料了!

在 Facebook 利用OAuth 登入使用者

facebook並沒有提供OpenID服務,只提供OAuth,因此雖然OAuth的用途不是身份認證,但我們可以利用OAuth的特性來登入使用者。

接下來我們直接來看facebook文件吧。

facebook登入有分JavaScript登入,由Facebook提供SDK,都幫你包好了。或者你可以手動自己刻Server Login。但說真的,雖然我有用過Facebook JavaScript Login,但原理我沒有很清楚,一下子就突然登進去。所有取得授權資料code都是javascript,不過直接把程式碼暴露在前端還是怕怕的,如果對安全性比較要求的話還是自己慢慢刻後端登入吧。

手動登入Facebook官方文件

接下來請一邊參考官方文件,一邊參閱我的解釋,這樣學習的效果最好。

首先,你必須在Facebook建立一個應用程式。建立完後啟動網站登入功能,會得到

Selection_003

首先,你的網站必須把使用者重新導向回facebook,讓使用者告訴facebook可以授權給你。

因此建立一個取得授權的連結如下:

Selection_004

client_id當然就填你的應用程式ID, redirect_uri填入facebook授權完之後,要告訴你網站的哪個網址。其他還有一些參數可以設定自己看文件啦。

如果授權成功, facebook會向你給的redirect_uri傳一串code給你,這個code就是使用者授權給你家網站的證據。但問題是,你不能確定這個code真的是facebook傳回給你的,老樣子,網路是很危險的。

因此你必須要拿這個code向facebook換access_token

Selection_005因此,請自行在後端向facebook發出這個請求,記得填入你的app-id和app_screte key, 如此一來才能向facebook證明你就是這個應用程式的擁有者。之後facebook等待facebook的response。記得,這裡的redirect_uri必須要和上面的取得授權的uri相同,不然facebook會覺得你這個人怪怪的。

之後如果驗證成功,facebook會response你一個access_toke,這個就是你費盡千辛萬苦終於得到的facebook鑰匙,憑此就可以到授權給你的人的facebook相簿拿取他的相片了。如果錯誤的話,facebook會回傳你一段json格式的錯誤訊息。但正確的話,會回傳給你一串

Selection_006字樣,上面還會寫expires time(單位是秒), 要盡早使用,不然會過期。

取得access_token之後,請保存好,這就是這個人的授權鑰匙,你可以拿這個access_token去問facebook這個人是誰,facebook就會告訴你,因此你就把該名使用者資訊寫到database註冊這名使用者。

利用access_token 取得資訊的方法請參閱官方文件 使用facebook graph api,建議可以利用graph explorer玩一玩,就可以知道利用access_token換取使用者資料。

同樣的,之後該名使用者如果再度來到你的網站,你一樣可以問facebook該名使用者是誰,然後檢查是否資料庫已經存在該名使用者的資料,如果是的話,就可以把該名使用者登入進去你的網站。

以上,就是嘗試對facebook OAuth做簡單的說明,旨在讓不熟悉的人能快速了解整個facebook手動登入的全貌,如果有錯誤歡迎大家批評指教留言更正。

參考資料:

2013 回顧,該重新開始寫網誌了。

很久沒有動筆寫網誌了,高中時還有在寫,紀錄自己高中生活的點點滴滴,上了大學習慣 Facebook 之後,網誌就被幾句短短的即時動態取代了,當我滾著 facebook 開始回首這一年,總覺得好像有什麼東西被遺忘似的,人生很多事情不是三言兩語就可以取代的啊。

12/31晚上看完清大的跨年煙火後,回寢室翻著fb動態牆,逛到強者我學長大兜和強者我學弟pellaeon的網誌,看著他們兩人的年度回顧,不禁有些慚愧。

1/1元旦放假,陽光普照。我循著清交小徑走到清大,坐在大草皮上望著遠方,思考這一年來我有什麼成長,有什麼收穫,有什麼需要改進的地方。

這一年,參加了tic100商業模式競賽、和一群好朋友努力到複賽,花了3個月,還曾一起連續開會11個半小時(人生最長開會時間成就達成),雖然最終還是被淘汰,但是認識一群會永遠記得的好夥伴。

這一年,第一次上街頭,和25萬人一同悼念一個陌生人。只因為相信,正義不該被黑幕所掩蓋,正義需要人們挺身而出去守護自己想守護的東西。

這一年,程式寫得更多了,寒假時想要改變學校同學使用行事曆的方式,和好朋友一起進行F4 Calendar計畫,但努力了兩個多月最後因為技術力與對目標使用者瞭解不足失敗告終、暑假到Sam那邊實習,研究保險與寫程式,9月開學受朋友所托,幫忙校內的wakeupbar寫官方網站。10月到12月,前端後端幾乎全包的自幹嚮茶飲料DIY計畫的網站,寫到很崩潰但最後還是趕出來了。

這一年,達成了很多人生成就,第一次衝浪被大海制裁、第一次溯溪從7米高的地方跳潭、第一次換SSD覺得用電腦怎麼可以比大便還順暢、第一次手沖咖啡發現其實還不賴、第一次打cs沒被隊友爆頭感到非常愉快。

自己還是那個整天嚷嚷要改變世界的小鬼,只是對自己的能力感到非常慚愧。每次寫程式遇到問題,上網google不到解答,或是陷入文件海裡,花了大半天還是找不到正確的設定,總是會開始懷疑自己究竟適不適合寫程式。看看周遭強者朋友寫程式像喝水般飛快,聊著許多一時半刻我無法明白的專有名詞,自己的自信彷彿也跟著沉到水裡一般。

但一想到那些強者比我花了起碼三年以上的時間在程式碼中遊走,又會覺得一切都理所當然。我大一開始寫程式到現在都還不滿三年啊。每件事情都有他的代價,付出不夠又怎能奢望回報呢?

這一年,開始相信生命是長期而持續的累積,相信付出的努力不會白費,總是累積出一些東西。持續去健身房14個月,感受自己身體的變化,一點一滴慢慢變強壯,血液循環變好,變得不太怕冷,雖然每次練完腿都很想死,但是卻覺得人生哪有比運動更簡單,只要付出就有報酬的事情呢?咬咬牙撐過去就是了。

要檢討的話,這一年的自己過得太安逸了,躲在自己的舒適圈內,做自己喜歡的事情。人生不該只侷限在大學內,應該要盡可能的去挑戰與嘗試不同的環境。暑期實習兩個月讓我感受到工作的莫可奈何,大學生活應該要有更多嘗試與刺激才行。。

給自己立下新一年的期許吧:「敞開心胸、接觸更多不同事物、認識並瞭解更多人,最後,持續付出努力,有一天你會突然發現,自己不再是那個整天妄自菲薄的自己。」

引體向上

然後,要開始寫網誌了。