高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

Amazon Web Services之門外漢心得

image

雲端,雲端,大家都在講雲端,不過我這種第三類組畢業的學生,沒有什麼的理論基礎,也不喜歡講理論(不過聽李教授說人死了之後就會在雲端了),僅就我自己最近試玩幾天Amazon的EC2心得與大家分享。

以前要蓋網站,除了要找設計師來做設計、工程師來寫程式外,還要有一個網站空間可以放你做好的東西才行。而這個”空間”的來源就有很多種,一個是自己架,不管是公司內部有專線,架在自己公司裡,還是花點錢去內湖那邊的機房租個機櫃,把機器放進去住,就是所謂的「主機代管」,不管是哪一種,都至少有養一台機器跟線路的成本。另一種是「虛擬主機」,就是跟業者租用一小塊硬碟空間,把你的網頁檔案放上去。

用房子來比喻,主機代管就像獨棟的透天厝,而虛擬主機就像在社區裡租一層公寓。各有優缺點,透天厝的優點就是可以自己高興怎麼裝潢就怎麼裝潢,而社區公寓除了樓層空間大小限制外,還有一些先天的限制,例如管委會不願意讓你破壞原有的牆壁(某些元件沒辦法安裝),或是當你在你家辦party,搞得太high(CPU或其它硬體使用率過高)影響到其它住戶,可能還會被管理員(主機商)來關切一下,或是狠一點直接把你趕走;相對的,透天厝的缺點就是成本比較高,而且還得自己小心會不會遭小偷,你可能得自己請一個看門的(MIS人員)或花錢裝一些保全設備(防火牆),而社區公寓則是同個社區的人一起share管理人員或保全的費用,成本相對較低。

其實之前一直就知道Amazon Web Services(AWS)很強大,但因為自己已經有在內湖養自己的主機所以一直沒去試試看,直到最近在某次讀書會上聽了前輩們的介紹,聽起來相當心動,反正現在有第一年免費的優惠,就註冊了個帳號上去玩。註冊過程其實不會太難,就是步驟有點多,然後都是英文介面,感覺AWS真的是另一個世界..沒聽過的資訊名詞多到爆炸 :) 。在你註冊新帳號的時候,會需要你的聯絡電話跟信用卡號做驗證。

那AWS的Elastic Compute Cloud(EC2) 跟前面提到的透天厝或社區公寓有什麼不同? 簡單的說,它可以同時有上述兩種方案的優點,而且成本還相當便宜。有這麼好康的事? 以下就以功能面跟成本面來說明:

以功能面來看:

EC2有好幾個等級的機器,可以依照不同的需求及預算來租用,從最便宜的Micro等級到High-Memory Instances等級(68.4 GB RAM),如果你是要大量運算的,也可以考慮High-CPU Instances。其實你在EC2啟用一個instance就等於你就擁有一台VPS了。

VPS? 簡單的講,這就跟一般把機器放到機房代管差不多,只是這台機器是”虛擬”的,你摸不到也看不到,但這台虛擬的主機跟一般獨立主機一樣可以SSH登入,要裝什麼軟體都可以裝,而且有擁有完整的root操作權限。

EC2的安裝也很方便,你可以用AWS提供的Image檔(Linux跟Windows平台都有),也可以找一些社群熱心人士貢獻的。安裝時間也是出乎意料的短,只要點幾下滑鼠,系統就整個裝好了!! 我自己是習慣FreeBSD,所以找了FreeBSD 8.2 Release版本的Image來裝,不過那個Image還滿”乾淨”的,Apache、PHP、Python、Ruby、MySQL都沒有,連/usr/ports也是空的,所以我自己花了點時間,把基本環境建好之後再做成自己的Image檔。

做自己的Image檔要幹嘛? 以前當過網管或是管過電腦教室的人應該都對Ghost這個軟體不陌生,通常會在系統最完美(或乾淨)的狀態把它ghost起來,然後如果要重灌或是灌其它台電腦的時候,只要一下子的時間就可以把那個乾淨的環境裝到新的電腦裡了,省時省力。而在AWS上做自己順手的Image也差不多是這個道理,只要在管理後台點幾下,下次要開新的instance的時候只要選用自己做的Image就可以很快的再開一個新的instance起來,而且還是你習慣的作業環境。

想想以前想要學Linux/FreeBSD的話,可能得自己想辦法從網路或光碟來安裝,再快也差不多得要半小時才能裝好,現在有現成的Image,只要滑鼠點幾下,幾分鐘就搞定,如果不想要或是被玩爛了,隨時可以砍掉重練,EC2真的是練功的好地方..

EC2有提供”Security Group”的功能,其實就是防火牆啦,你可以只限定某些IP或某些Port的連線才能存取資源,設定也相當簡單。如果在自己的機房自己弄,這可能還得花點錢買一台實體的防火牆來設定,而且要搞懂那些防火牆的rule設定也挺煩人的。

雖然micro instance的等級並不高,但放一些簡單的網頁或是基本的服務(例如DNS管理),是相當足夠的。像我就是把它拿來管理我手上的一些domain name,還有放一些簡單的HTML頁面。

AWS EC2的instance的IP預設是浮動的,如果重新啟動後,它的IP可能會變動,你可以跟EC2要固定的IP,並把它掛上到你指定的instance上。要注意的是,申請固定IP不用另外收費,但如果要了IP卻沒有掛到任何一個instance上,會被額外收費,免得大家亂要IP,佔著不拉屎。(IPv4已經發光了,請大家好好珍惜)

對我來說的另一個重點,是因為我近來喜歡用Ruby on Rails(RoR)來做網路活動的後端,原因請見另一篇門外漢心得。不過國內虛擬主機很少支援RoR,又加上我喜歡每次都放一些新玩意進來做實驗,虛擬主機限制太多,所以這也是我自己養機器的最主要原因。

以成本面來看:

錢很重要,所以先來看一下價目表

它的計價單位是”小時”,主要有兩種租用方式,一個是On-Demand Instances,一個是Reserved Instances。On-Demand就是要的時候租,不要的時候就退還,Reserved則是一次租比較長的一段時間(1年或3年)。

On-Demand的micro instance的一個月算下來才18塊美金(第一年免費),等級稍微好一點的standard instance是33塊/月。

因為我的工作大部份是跟網路活動相關的,而且網路活動的特性就是「時間短、流量會忽大忽小、下線之後就撤掉了」,所以On-Demand的計費方式就很適合,案子下線之後直接到後台把它停掉,就不會繼續算錢了。而如果是長期維護的的網站的話,就可以考慮Reserved的方式,一次買1年或買3年,價格更便宜,1年期的micro instance只要54塊美金。

這樣的價錢貴嗎? 以我現在養在內湖機房的12U機櫃費+頻寬費來算(不含主機跟其它硬體),一年差不多是2,100美金,如果換到EC2的話可以買到相當不錯的規格。那像智X的VPS方案呢? 一年約650美金(規格),戰國X的VPS的費用也差不多(規格) 。

比較起來EC2的價錢是真的不貴,而且EC2現在第一年還免費。那一年後怎麼辦? 真的覺得用得不錯的話,就付費吧。

其實雲端主機最重要的是它的scalability。

這讓我想到年輕時的一個故事,2005年Yahoo!有一個叫做”咖啡聽“的網路活動(已下線,僅剩網頁備份),那是個滿特別的網路行銷案例,目的是為了證明「網路廣告是有效的」,所以虛擬了一個罐裝咖啡的品牌,沒有在一般的電視或平面媒體打廣告,只在Yahoo!的首頁買了好幾百萬的網路廣告(都是雙星那種很貴的版位)。那案子的程式是我寫的,第一次遇到這麼大流量的案子,結果還是有幾次被衝到掛點。

再假想今天如果你蓋了一個線上購物的網站,一開始可能會想只買一台主機來放,但隨著會員越來越多,當你發現你的主機的硬碟燈閃不停、已經負荷不了,為了提供更好的網站瀏覽品質,也許你會想再加幾台機器來幫忙。即使如此,你可能得找人來想辦法新的主機跟原來的機器”串”起來(這個”串”其實挺複雜,這又是另一個故事了),這過程還是免不了得停機休息一下。但如果今天用的是雲端服務,通常只要刷卡付錢就可以”無痛”的馬上切換或擴充成高檔設備,來應付更多的需求,這點自己弄主機是很不容易辦到的。

突然想起以前我老闆給過我的一句話:「錢能解決的事都是小事」。

這樣講起來好像真的上了雲端就變神仙一樣了,真的這麼好,那生意就全部給它做就好了! 其實AWS還是有些我擔心的問題的,最主要的就是因為台灣沒有AWS的機房,亞太地區的機房目前只有新加坡跟最近新開的東京,畢竟還是得出國,反應速度就是比台灣本地的會慢了那麼一些些。

有個檢測的工具叫做CloudPing,可以測試不同地區AWS的Latency,我在台北用中華電信的線路測試,新加坡133ms,日本75ms。真希望AWS也來台灣開個機房啊..機會好像不大就是了。

AWS也沒這麼弱,也是有一些配套的解決方案,例如可以用AWS Simple Storage Service (Amazon S3)搭配CloudFront服用來改善速度,把靜態檔案放在S3上,然後CloudFront會找到離使用者最近的機房,並從那邊丟檔案出來。例如我常逛的天瓏書局網站就是個很成功的例子。

AWS的另一個問題,就是使用者的技術能力最好得有一定的網管基礎,不然玩起來會有點辛苦。另外就是因為台灣沒有AWS的客服,所以萬一有問題可能得打越洋電話或是英文書信往來,這也是另一個小小的門檻。

這就是我個人最近試玩的一些簡單心得,目前還沒有真正拿客戶或自己的案子在上面實戰過,應該不久的將來就會有了。

以上,才疏學淺,若內容有誤還請多多指教 :)

參考資料:

補充:

  • 感謝johnpupu補充,其實還有ebs跟頻寬的費用,AWS有做了一個計算機,可以更方便的算出成本 :)
  • Linode似乎也是VPS不錯的選擇,價格上也比AWS來得便宜一些。

第0次Flash/Flex/AS讀書會

image

先感謝ETBlue熱血贊助Logo :)

再感謝大家前來參加,雖然只是個行前說明,又剛好遇到過年 + 尾牙 + 要放假的星期五晚上,來的人比報名的人少,不過看到邦邦TicoreGray等大角色都有來捧場,真的是太感謝了

我相信參加讀書會的人就是會來來去去的,畢竟這不是學校,沒有規定缺席幾次就會被當掉,或是補習班,不來上課學費還是照收。我並不在乎人多人少,只要有人願意來,我就願意繼續辦下去。

目前讀書會有在Facebook上弄了一個供大家交流訊息用的粉絲頁,如果大家有什麼問題也可以直接在上面留言。

這是個自發性的社群活動,有興趣的就來吧,都歡迎的 :)

討論內容:

  • 會有特定的主題,由讀書會成員來介紹。
  • 希望可以兩個星期一次,至少一個月一次。
  • 仍以台北為主。
  • 希望每場讀書會的主持人可以輪流當,練習講話的機會。

下次讀書會日期:

  • 日期:2/15 (或2/22)
  • 時間:晚上7點
  • 地點:如果沒其它建議,暫定果子咖啡
  • 人數:20~30人
  • 主題:PureMVC
  • 主講:林立
  • 附註:如果時間來得及,我也會幫忙補充

因為PureMVC不算是個簡單的主題,大家過年期間最好先做一下功課,先看一下官網的文件或是網路上的教學(推薦Erin的blog文章)。可能會有機會可以跟著實作練習,所以別忘了可以帶電腦邊學邊做。

最後,也是最重要的結論:希望可以一直繼續下去!

很高興認識大家,大家年後見!

至於為什麼是第0次? 因為Array的index是從0開始算啊 :)

Faster Array Concatenation in AS3

前不久在Grant Skinner大人的twitter上看到這個:

Just discovered a handy trick for merging two arrays in JS: arr1.push.apply(arr1, arr2);

真神奇,原來Function.apply還可以這樣玩,而且這招似乎在AS3上也可行,直接寫幾行程式碼測一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function test_concat():void
{
  trace("== TEST Array Concat ==");
  var array1:Array = [1, 2, 3];
  var array2:Array = ['a', 'b', 'c'];
  var timer_start = getTimer();
  for (var i:int = 0; i< 10000; i++)
  {
      array1 = array1.concat(array2);
  }
  var timer_end = getTimer();
  trace("the length of array1 is : " + array1.length);
  trace("== " + (timer_end - timer_start) + " miniseconds ==");
}

function test_push_and_apply():void
{
  trace("== TEST Array Push and Apply ==");
  var array1:Array = [1, 2, 3];
  var array2:Array = ['a', 'b', 'c'];
  var timer_start = getTimer();
  for (var i:int = 0; i< 10000; i++)
  {
      array1.push.apply(array1, array2);
  }
  var timer_end = getTimer();
  trace("the length of array1 is : " + array1.length);
  trace("== " + (timer_end - timer_start) + " miniseconds ==");
}

// 測試
test_concat();
trace("");
test_push_and_apply();

我的環境:

  • Macbook Pro
  • CPU : Intel Core 2 Duo 2.4 GHz
  • RAM : 4 GB

執行結果:

== TEST Array Concat ==
the length of array1 is : 30003
== 4119 miniseconds ==

== TEST Array Push and Apply ==
the length of array1 is : 30003
== 5 miniseconds ==

array1最後結果內容是一樣的,但花的時間差非常大,我想這其中主要的差異應該是在於Array.concat每次都會產生一個新的array,而且還得再assign給原來的array的緣故。

後來還有看到這篇,野中さん有在wonderfl上做了幾個實驗,結果發現跟這兩個array的大小有關。不過在我的機器上好像在試不出來差異,不知道是不是我哪邊有錯,即使調整兩個array的大小,Function.apply的速度都是遠大於Array.concat的。

update: 是我自己耍笨,測試數字請見連結裡野中さん的那三個測試。

I may be wrong, please correct me if there’s anything wrong :)

AS勉強會(草案)

image

常看到日本那邊有不少的”AS勉強會”,一群對某樣技術有共同喜好的人聚在一起聊聊最近又學了什麼新技術或有了新的idea,實在很令人羨慕。

就我所知,國內比較有”活性”的聚會,Ruby有Ruby Tuesday,Google Technology有Taipei GTUG,PHP也有framework的讀書會,但Flash/Flex/AS呢? AUG可能因為主要的核心成員都忙,有好長一陣子沒消息了;PTT-Flash版聚一年也才launch一次,同業間的AS分享會雖然有固定時間在跑,但屬於比較private的性質。

也許不少人很不喜歡Flash,嫌它慢、嫌它肥、嫌它不夠標準化,但明明Flash就還是目前大部份FB Game/Web Game的首選,明明Flash/Flex/AS人才的需求量就不小,為什麼不也來弄一個? 所以小的斗膽,把自己的一些想法貼出來跟大家討論一下,希望可以讓對這些技術有興趣的朋友能找到個共通的實體平台,互相交流、學習,或是人才招募。

我想”讀書會”跟”研討會”的定義並不同,研討會比較像一年一度的中元普渡大拜拜,大多是少數幾個大師站在台上講,其它人坐在台下聽;而讀書會則是像初一、十五拜拜,固定時間的常態進行,而且每個人不分強弱、新手老鳥,都可以有參與感,不然只會強的越強,弱的就一直原地踏步。但我也不希望讀書會被當成”補習班”,畢竟讀書會是比較自發性的。

讀書會要一直活下去,最重要的是要一直有在運作,最怕要來不來,或是公司加班、家裡有事、天氣不好..等不可抗力因素造成一次沒來、二次沒來,然後就沒來了,以下列出一些我初步的構想,大家可以參考看看:

開始時間:

新年新氣象,預計農曆年後可以開跑。

場地:

有網路、投影設備的簡餐、咖啡店,除非有更好的場地,不然確定之後應該就會固定了。

地區:

這個是很現實的因素,似乎比較多的朋友都在北部,在其它縣市的朋友可能就不好意思了。

成員:

人數不限。但至少要有幾個固定的核心成員,核心成員的工作除了要讓讀書會維持一定的人數外,還可以輪流當主持人。建議至少要有3個,如果沒人志願可以先算我一個。

費用:

不收費,若聚會的場地有規定的最低消費則依其規定。

週期:

每月一次

時間:

週末或週間都可,這個可以大家再研究看看。

主題內容:

Monthly Review:

閒聊一下這個月以來又多了哪些新的玩具或是新的應用。

Special Topic:

邀(或凹)對某些主題特別有研究的神人/高手來分享。

Case Study:

  • 個人作品展示及心得分享
  • 國內外作品討論

Communication:

  • 新成員介紹
  • 名片交換
  • 人才招募

若有想到其它的再請幫忙補充

時間:

若選在週間一次約2~3小時,若是在週末可以一整個下午。

有任何想法,也歡迎在底下留言,還請大家一起討論看看,感謝 :)

update:

讀書會網址:https://www.facebook.com/thestudygroup

Using Terminal in Mac OS

image

身為一個阿宅,開一個黑黑的terminal視窗(而且可能要同時開好幾個),手指頭快速的敲打指令,看著terminal不斷的噴log出來,就會有種強者上身的錯覺,至少電影裡都是這樣演的。二年前,我換到了Mac的作業環境之後,terminal還是我工作上不可或缺的重要工具之一。不過內建的terminal我用不太習慣,在看了許多人的推薦下就換用iTerm了,原來那個就不知道丟哪邊去了。

不過有時候為了要切換到某個比較深層的目錄,得一直cd(change directory)下去,特別是萬一遇到中文目錄,cd起來更痛苦。還好有個方便小工具叫做”openterminal“,可以很快的就切換到你要去的地方。

像這樣,我是把它放在Finder上面的工具列裡,然後先在Finder裡選擇我要去的目錄,再點一下openterminal的按鈕:

image

它會自動幫我開一個terminal視窗,並且自動cd到我要去的目錄:

image

這樣快多了!! 另外最近還發現一個方法,例如我先開一個terminal,然後在terminal裡打cd兩個字,再來把我要去的資料夾拖到terminal視窗放掉:

image

terminal會自動帶出那個資料夾的所在路徑:

image

以上一些小小心得,供大家參考 :)