Thursday, February 21, 2013
Bitcoin / 比特幣 / 位元幣交易所
Bitcoin從2013年1月中以來最近不斷升值,判斷該是入手的時間。但是從台灣要買bitcoin不容易,比較可靠的管道多為交易所。那麼有哪些交易所呢? Bitcoin wiki 上面有給出一個清單,就我逛逛之後列出幾個交易量比較大的交易所。
2013/02/21
MtGox 交易量 35389 BTC
BTC-E 交易量 1738 BTC
Bitcoin-Central 交易量 741 BTC
這些交易所其實是在交換bitcoin和各種貨幣(美金,歐元,或其它電子貨幣)。在交易前需要先存款(Deposit),好比說要用美金交易的話,要先從台灣進行國際匯款美元到交易所的銀行帳戶,然後才能買bitcoin。目前用來交易的貨幣幾乎都是美金和歐元。
就自己的經驗,國際匯款不是個最好的選擇,第一是要被收取300~900圓的手續費,第二是要兩三天對方才能確認收到款項。當然有人已經著手解決這個問題,如果是在美國的話,可以使用BitInstant服務,在7-11直接存款,非常方便。應該讓台灣的7-11也能進行這種服務。
Saturday, November 17, 2012
初嘗Node.js開發管理package.json
發佈自己的程式時,如何解決相依套件的問題是很麻煩的。套件的相依性,簡單來說就是我的程式需要哪些套件,要用什麼版本。最近看到node的npm管理方法,令人驚艷。
開發npm的套件時,需要package.json,這個檔案包含package的各種資訊,如作者和依賴的套件。顧名思義,package.json就是個json,結構也很簡潔。
這裡有官方的文件,我節錄和套件有關的重要的package.json片段,
從上表我們可以發現,指定相依套件的方式很有彈性。可以指定特定版本,也可以指定某個區間。
設定完成後,只需要用以下指令,npm就會幫忙把套件裝到package所在的目錄下,對於開發者來說實在是很方便:)
開發npm的套件時,需要package.json,這個檔案包含package的各種資訊,如作者和依賴的套件。顧名思義,package.json就是個json,結構也很簡潔。
這裡有官方的文件,我節錄和套件有關的重要的package.json片段,
{ "dependencies" :
{ "foo" : "1.0.0 - 2.9999.9999"
, "bar" : ">=1.0.2 <2.1.2"
, "baz" : ">1.0.2 <=2.3.4"
, "boo" : "2.0.1"
, "qux" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0"
, "asd" : "http://asdf.com/asdf.tar.gz"
, "til" : "~1.2"
, "elf" : "~1.2.3"
, "two" : "2.x"
, "thr" : "3.3.x"
}
}
從上表我們可以發現,指定相依套件的方式很有彈性。可以指定特定版本,也可以指定某個區間。
設定完成後,只需要用以下指令,npm就會幫忙把套件裝到package所在的目錄下,對於開發者來說實在是很方便:)
npm i
Sunday, August 5, 2012
增進程式設計功力的好書推薦
身為一個不太勤快的工程師,從學校畢業後看程式設計相關的書的時間減少很多,在這些書中有三本(其實有認真看的也沒幾本:-D )對我的影響最大。
Pragmatic Programmer / Andrew Hunt and David Thomas
Code Complete / Steve McConnell
Programming Pearls / Jon Bentley
這三本書中我第一名推薦的是Pragmatic Programmer,有兩個原因,其一是夠薄,三百多頁而已,在不算長的篇幅中把單兵作戰守則解說得很清楚。第二個原因是他有一個很棒的小抄。
推薦的第二名是Code Complete,此本為聖經不需多說,應該是所有推薦書單的平均第一名,我沒有放在第一名的原因是因為太厚了我還沒看完。
第三名推薦的是Programming Pearls,很老的書,很薄。最推薦的是"Back of the Envelope"這一章。此書在台灣甚難入手,Amazon上也沒有電子書,如果有機會得到的話一定要買下。
本日學習:
翻到Code Complete的第三十章:程式設計工具,其中一個自我檢查是:你的編輯器是否有自動編譯和錯誤檢查?
我赫然發覺平時用Vim寫Perl程式居然沒有這個功能,我必須用 perl -c 自行檢查。沒關係亡羊補牢猶未遲,趕緊找一個plugin perl_synwrite來幫忙,搭配這個外掛只需在存檔的時候用:W就可以先編譯perl程式,如果錯誤的話就會顯示錯誤訊息。
最後的總結就用 Jeff Atwood 的推薦書單吧
Pragmatic Programmer / Andrew Hunt and David Thomas
Code Complete / Steve McConnell
Programming Pearls / Jon Bentley
這三本書中我第一名推薦的是Pragmatic Programmer,有兩個原因,其一是夠薄,三百多頁而已,在不算長的篇幅中把單兵作戰守則解說得很清楚。第二個原因是他有一個很棒的小抄。
推薦的第二名是Code Complete,此本為聖經不需多說,應該是所有推薦書單的平均第一名,我沒有放在第一名的原因是因為太厚了我還沒看完。
第三名推薦的是Programming Pearls,很老的書,很薄。最推薦的是"Back of the Envelope"這一章。此書在台灣甚難入手,Amazon上也沒有電子書,如果有機會得到的話一定要買下。
本日學習:
翻到Code Complete的第三十章:程式設計工具,其中一個自我檢查是:你的編輯器是否有自動編譯和錯誤檢查?
我赫然發覺平時用Vim寫Perl程式居然沒有這個功能,我必須用 perl -c 自行檢查。沒關係亡羊補牢猶未遲,趕緊找一個plugin perl_synwrite來幫忙,搭配這個外掛只需在存檔的時候用:W就可以先編譯perl程式,如果錯誤的話就會顯示錯誤訊息。
最後的總結就用 Jeff Atwood 的推薦書單吧
Monday, July 16, 2012
Vim基本心法 - 移動系
你聽說Vim的學習曲線很高而卻步嗎?
你正在學習Vim,但卻因指令難以記憶而苦惱嗎?
Vim和Emacs是電腦高手的唯二選擇。其實Vim的指令設計是很合理的。只要了解一個大觀念:
Vim是上古神器,那時會用電腦的人都會寫程式。
另外一個小觀念是:懶惰是程序員的美德,若可以的話,手盡量不移動位置,用右手去拿滑鼠這件事更是萬萬不可。
第一問: 為什麼Vim預設會進入命令模式而非編輯模式呢? 為什麼我不能夠一開始就打字呢?
試想你打開程式時,大多的時間在閱讀,編程的時間相對的少,所以一開始進入移動模式會比較有效率。
復述一遍:懶惰是程序員的美德,因此在命令模式下通常只需要一個按鍵就可以自在的移動。
用Vim打開你的一個檔案吧,如果沒有可供練習的檔案,可以打開Vim的求助檔案
:help<enter>
移動游標是基本,而上下左右則是中的基本,所以就用右手最容易按的四個鍵hjkl。那為什麼j是下一行呢? 想想我們最常按的鍵就是"下一行",所以跟最容易按的右手食指j配對正好。決定j代表下一行之後,右邊的k就當作"上一行",再來就用左邊的h表示向左和右邊的l表示向右。
到指定行 G
xG
x是行號。這指令很簡單,G就是go。
那要如何回到第一行呢? 可以用1G,但是可以用gg更為簡短。
e 是移動到此word的結束
b 是移動到前移個word的起始
0 是移動到此行的開頭。為什麼是0而不是1呢?我認為這是因為C語言中陣列的開頭是第0個字元而非第1個字元。
^是移動到此行的第一個非空白字元。選用^的原因是它可以被稱為hat,而帽子就是戴在頭上的囉。
$ 是移動到此行的最末端。選用$的原因我還不清楚:p
搜尋和跳躍 /? nN *#
/ 後面加上要搜尋的字串,就會跳到該字串。使用 / 作為指令的原因我猜是因為 slash 和 search 聽起來很像
? 和 / 相似,唯一個差別在於 ? 是用於向前搜尋。使用?的理由就是因為它和/是同一個按鍵。
n和N要配合/?使用。n就是搜尋下一個符合的字串。N是搜尋前一個符合的字串。如果一開始用 / 搜尋的話,n會往文章的後面搜尋,N則會往前面搜尋。如果是用 ? 搜尋的話,方向會相反過來。
學會這21個指令後,有沒有發覺Vim比其他的編輯器更強大呢?
你正在學習Vim,但卻因指令難以記憶而苦惱嗎?
Vim和Emacs是電腦高手的唯二選擇。其實Vim的指令設計是很合理的。只要了解一個大觀念:
Vim是上古神器,那時會用電腦的人都會寫程式。
另外一個小觀念是:懶惰是程序員的美德,若可以的話,手盡量不移動位置,用右手去拿滑鼠這件事更是萬萬不可。
第一問: 為什麼Vim預設會進入命令模式而非編輯模式呢? 為什麼我不能夠一開始就打字呢?
試想你打開程式時,大多的時間在閱讀,編程的時間相對的少,所以一開始進入移動模式會比較有效率。
復述一遍:懶惰是程序員的美德,因此在命令模式下通常只需要一個按鍵就可以自在的移動。
用Vim打開你的一個檔案吧,如果沒有可供練習的檔案,可以打開Vim的求助檔案
:help<enter>
移動系四招共21個指令
左下上右 h j k l移動游標是基本,而上下左右則是中的基本,所以就用右手最容易按的四個鍵hjkl。那為什麼j是下一行呢? 想想我們最常按的鍵就是"下一行",所以跟最容易按的右手食指j配對正好。決定j代表下一行之後,右邊的k就當作"上一行",再來就用左邊的h表示向左和右邊的l表示向右。
螢幕頂中底 H M L
除了上下移動,你有時會想移動游標到螢幕的頂部,中間,或是底部。這時就可以用按鍵H (High)移到頂部,M(middle)到中間,以及L(low)到底部。至於為什麼是大寫呢? 因為h和l已經被當成左右了呀。到指定行 G
xG
x是行號。這指令很簡單,G就是go。
那要如何回到第一行呢? 可以用1G,但是可以用gg更為簡短。
在句子中遊走 web 0^$
w 是移動到下移個word的起始e 是移動到此word的結束
b 是移動到前移個word的起始
0 是移動到此行的開頭。為什麼是0而不是1呢?我認為這是因為C語言中陣列的開頭是第0個字元而非第1個字元。
^是移動到此行的第一個非空白字元。選用^的原因是它可以被稱為hat,而帽子就是戴在頭上的囉。
$ 是移動到此行的最末端。選用$的原因我還不清楚:p
搜尋和跳躍 /? nN *#
/ 後面加上要搜尋的字串,就會跳到該字串。使用 / 作為指令的原因我猜是因為 slash 和 search 聽起來很像
? 和 / 相似,唯一個差別在於 ? 是用於向前搜尋。使用?的理由就是因為它和/是同一個按鍵。
n和N要配合/?使用。n就是搜尋下一個符合的字串。N是搜尋前一個符合的字串。如果一開始用 / 搜尋的話,n會往文章的後面搜尋,N則會往前面搜尋。如果是用 ? 搜尋的話,方向會相反過來。
學會這21個指令後,有沒有發覺Vim比其他的編輯器更強大呢?
Friday, April 6, 2012
連署網站設計
最近幫人做了一個簡易的連署網站,作為Google App Engine的練習。
第一次看到有這麼多人使用自己的作品,實在是很感動,同時也覺得應該要改進設計。
第一次看到有這麼多人使用自己的作品,實在是很感動,同時也覺得應該要改進設計。
網頁簡介
此網站非常簡單,只有兩個使用者網頁 - 訪客用: 顯示連署書,加上連署者的姓名、生日、地址和電話。填好資料後按下送出即可。
- 管理者用: 可以下載連署資料,格式為csv。不需任何輸入。
可改進之處
- 採用 https 連線。
- 驗證輸入資料的合法性。拒絕空白的使用者姓名。
- 平衡流量。GAE的免費版本大約只能支援每天1500人。可以採用多重網站,每個的服務都相同,並從入口處隨機分配要連到哪個網站。
Bug
英文地址裡有逗號,會讓csv的欄位判斷錯誤。解決方法為加上雙引號。
Friday, March 9, 2012
自制vimgolf競賽排行榜
緣起
因為朋友ypcatw的介紹開始玩vimgolf,現在一共有104個題目,解決了32個題目之後,晉升到第92名囉,也終於可以在Leaderboard看到自己的名字。不過這個排行榜有兩個特別的地方。
補充說明一下,vimgolf官方規定排名是用Global rank來計算,一個玩家的Global rank是他在所有比賽(題目)得到的rank總和。好比說fakecolor在"Get rid of html tags"這個比賽拿到第47名,rank就是47。如果沒有參與某場比賽,那rank就等同於參與該場比賽的最後一名玩家的rank。在計算排名時,Global rank越小的人名次越高。由此規則可知,每參與一場比賽都可以使你的Global rank下降。
結果如下表格:
...
目前(2012 Feb)一共有約2000名玩家
製作方法
我們採用Google App Engine(GAE)做為平台,每天自動抓取所有比賽(Challenge)的Leaderboard,擷取出每場比賽的參賽者後,放入資料庫,並計算所有玩家的Global rank。使用GAE的好處是Google去別人家撈東西很勤快XD
尚未解決的問題
計算好玩家的成績後,我們利用web.py的template功能來產生網頁。目前為止都很順利,但是我們卻被頻寬的問題打敗。由於玩家約有2000名,所以每次產生網頁都需要從資料庫讀取2000資料。然而GAE是以量計價,免費帳號的資料庫存取量每天只夠我們讀取約60,000筆資料,也就是至多能產生30次網頁。為了減少流量,我們決定每天指更新一次資料庫,並利用GAE本身的記憶體快取(memcache)來減少需要讀取資料庫的情況。不過很可惜的是memcache常常會失敗。我們的第一個常識是把結果轉成RSS格式,並利用RSSPECT網站幫我們發佈,但是很可惜的是Google reader沒有辦法讀取發佈的文章,可能是因為內容太長了。
因此我們改採用另外一招:把動態產生的網頁轉成靜態網頁,放在其他伺服器上,做為權宜之計: http://www.csie.ntu.edu.tw/~b89107/vimgolf/ 。不過還是希望能夠在GAE內部就解決這個問題。
因為朋友ypcatw的介紹開始玩vimgolf,現在一共有104個題目,解決了32個題目之後,晉升到第92名囉,也終於可以在Leaderboard看到自己的名字。不過這個排行榜有兩個特別的地方。
- 只有前一百名的排名
- 沒有真正的"竿數",也就是所有題目的排名總和。
補充說明一下,vimgolf官方規定排名是用Global rank來計算,一個玩家的Global rank是他在所有比賽(題目)得到的rank總和。好比說fakecolor在"Get rid of html tags"這個比賽拿到第47名,rank就是47。如果沒有參與某場比賽,那rank就等同於參與該場比賽的最後一名玩家的rank。在計算排名時,Global rank越小的人名次越高。由此規則可知,每參與一場比賽都可以使你的Global rank下降。
自製排行榜
回到一開始的問題,官方沒有公布完整的排名,以及每個人的global rank。沒關係,身為programmer最棒的一件事就是可以自己動手做。為了知道自己和其他人的Global rank差距,我和Y決定自行計算所有人的Global rank,並製作成完整的排行榜。要怎麼自行計算Global rank呢? 要訣在於每場比賽的Leaderboard是公開的,就位於題目的右方。我們只須抓取每個比賽的Leaderboard,然後就能計算每個玩家的排名啦。結果如下表格:
| Ranking | ID | Global Rank |
| 1 | clvv42 | 2147 |
| 2 | gumnos | 2491 |
| 3 | wondible | 2867 |
| 4 | federicogalassi | 2885 |
| 5 | h_east | 2929 |
| 6 | yslinnctu | 3014 |
| 7 | Korvin79 | 3800 |
| 8 | _Balkoth_ | 3885 |
| 9 | johnsyweb | 4100 |
| 10 | hujunfeng | 4163 |
目前(2012 Feb)一共有約2000名玩家
製作方法
我們採用Google App Engine(GAE)做為平台,每天自動抓取所有比賽(Challenge)的Leaderboard,擷取出每場比賽的參賽者後,放入資料庫,並計算所有玩家的Global rank。使用GAE的好處是Google去別人家撈東西很勤快XD
尚未解決的問題
計算好玩家的成績後,我們利用web.py的template功能來產生網頁。目前為止都很順利,但是我們卻被頻寬的問題打敗。由於玩家約有2000名,所以每次產生網頁都需要從資料庫讀取2000資料。然而GAE是以量計價,免費帳號的資料庫存取量每天只夠我們讀取約60,000筆資料,也就是至多能產生30次網頁。為了減少流量,我們決定每天指更新一次資料庫,並利用GAE本身的記憶體快取(memcache)來減少需要讀取資料庫的情況。不過很可惜的是memcache常常會失敗。我們的第一個常識是把結果轉成RSS格式,並利用RSSPECT網站幫我們發佈,但是很可惜的是Google reader沒有辦法讀取發佈的文章,可能是因為內容太長了。
因此我們改採用另外一招:把動態產生的網頁轉成靜態網頁,放在其他伺服器上,做為權宜之計: http://www.csie.ntu.edu.tw/~b89107/vimgolf/ 。不過還是希望能夠在GAE內部就解決這個問題。
Saturday, February 4, 2012
vim競技大賽 -- vimgolf
世界上有各種奇奇怪怪的比賽,在電腦界中常出現的一種叫做某某高爾夫,如同真正的高爾夫以杆數決勝負,電腦界的高爾夫往往是利用程式的長短。最近出現的vimgolf,是以vim編輯器作為競技場,參賽者相互比較誰能用最少的按鍵數目來修改一篇文章。
來看一個實際題目:以下是一份code,但是作者把大括號,中括號,以及小括號弄錯了,想請你把錯誤修正過來。
可以試試看用你最愛用的編輯器,要按幾次按鍵才能完成編輯呢?用vim的話,最少只需用34個鍵就能搞定!如何,是否有興趣學學vim呢?
來看一個實際題目:以下是一份code,但是作者把大括號,中括號,以及小括號弄錯了,想請你把錯誤修正過來。
錯誤的程式 var some_function = function {arg1, arg2} [ var some_array = (1, 2, 3, 4, 'foo'); for {var i in some_array} ( console.log(some_array, [{1 + (8 / 2)}, 'hello (world)'); ) ];
正確的程式
var some_function = function (arg1, arg2) { var some_array = [1, 2, 3, 4, 'foo']; for (var i in some_array) { console.log(some_array, [(1 + (8 / 2)), 'hello (world)'); } };
可以試試看用你最愛用的編輯器,要按幾次按鍵才能完成編輯呢?用vim的話,最少只需用34個鍵就能搞定!如何,是否有興趣學學vim呢?
Subscribe to:
Posts (Atom)