over 3 years ago

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

重點節錄

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

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

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

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

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

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

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

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

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

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

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

談計畫與變化

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

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

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

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

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

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

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

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

 
over 3 years ago

先承認標題殺人,這東西不可能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/linux_server/0250simple_firewall.php#nat_ip_share 鳥哥的文章。

實戰

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

成為router

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

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

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

你也可以寫到設定檔,讓下次開機繼續當router。
/etc/sysctl.conf:
net.ipv4.ip_forward = 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  # 加入兩個你討厭的人<br />
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。如果對你有幫助的話歡迎轉載記得附上來源就好。希望有幫助到大家!

參考資料

 
almost 4 years ago

因為莫名其妙昨天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進行測試。

 
almost 4 years ago

最近接了一個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!!!不是把grant_type, code, redirect_url等東西包起來當成資料對以前的網址做POST啊

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

{"error":"invalid_request","error_description":"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如果發生問題或錯誤,請服用本文解決,人類的知識來自於眾人的分享與累積,不要讓我的七個小時白白浪費掉啊。
 
almost 4 years ago

最近接了一個要求使用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手動登入的全貌,如果有錯誤歡迎大家批評指教留言更正。

參考資料:

 
almost 4 years ago

很久沒有動筆寫網誌了,高中時還有在寫,紀錄自己高中生活的點點滴滴,上了大學習慣 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個月,感受自己身體的變化,一點一滴慢慢變強壯,血液循環變好,變得不太怕冷,雖然每次練完腿都很想死,但是卻覺得人生哪有比運動更簡單,只要付出就有報酬的事情呢?咬咬牙撐過去就是了。

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

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

引體向上

然後,要開始寫網誌了。

 
over 4 years ago

Hi, This a demo post of Logdown.

Logdown use Markdown as main syntax, you can find more example by reading this document on Wikipedia

Logdown also support drag & drop image uploading ( required Beta / Premium membership). The picture syntax is like this:

Bloging with code snippet:

inline code

Plain Code

puts "Hello World!"

Code with Language

puts "Hello World!"

Code with Title

hello_world.rb
puts "Hello World!"

MathJax Example

Mathjax

Inline Mathjax

The answser is .

Table Example

Tables Are Cool
col 1 Hello $1600
col 2 Hello $12
col 3 Hello $1