最新文章

近期迴響

  • Chang Peter: 很棒很好笑的影片呀! 真是辛苦你做了個這麼大的迷宮 他到二樓似乎就沒...
  • 呆呆: 這太屌了!!! 我傻了...
  • kanna66: FOXY满足了我们的生理需要。...
  • 漫畫迷: 你的blog不錯,加油,有空歡迎你也來逛逛我的blog,thanks 我的bl...
  • Leon: 這資訊幫了我大忙, 十分感謝!...
  • othree: 重點:「所以當你螢幕夠大時」...

VerXD 作品集


 絕望網

 VeryXD 2.0

 Twitio.us

無分類雜文 15 Jul 2010


LiveReload:你的套版好幫手!

網頁設計師或者是程式設計師,無可避免的日常一定會遇到「切版」/「套版」的工作。做這些工作時,遇到最討厭的煩人事,除了「測各大瀏覽器相容性」,莫過於「邊切邊套按 Reload 重新整理瀏覽器整理到手抽筋」…。

要是檔案一變更,瀏覽器能自動更新就好了

這個願望從前只有在 Firefox 上的 firebug (或者一些 js console)上能夠實現,而且也僅止於暫時修改 html/css/js 預覽結果的用途。

這個問題,最近被 LiveReload 這個 rubygem 解決了!

在開始使用 LiveReload 前,你可以先觀看由 EnvyLabs 拍攝的示範影片,了解使用方式。相信我,裝了它之後你就會愛上它了。

LiveReload 的特點有:

1. 更改 CSS 以及 JavaScript 類檔案時,存檔可以所見即所得(不需 reload page)。
2. 更改 HTML 或者其他 server-side script ( Ruby / PHP / Python 等等…),存檔時也可以所見即所得(瀏覽器會自動 reload)。

所以當你螢幕夠大時,一邊開瀏覽器一邊開編輯器寫 code 測試,搭配上 LiveReload,切版 / 套版速度會馬上大大的暴增!

有些人也許會好奇 LiveReload 的運作原理是什麼?

基本上 LiveReload 就是一個 directory watcher,透過設定工作目錄底下的 .livereload 檔下的檔案類型,執行 livereload 後,它會自動 watch 裡面的更動。它同時也自帶一個 http server,開發者安裝了它的 browser plugin ( Chrome / Safari supported ),client 與 server 連接起來。當目錄裡檔案更動時,browser 就自動 reload。

首次執行時不需要設定任何 .livereload 檔,執行後會自動產生…
預設會 watch 這一些類型的檔案。


Watching: /Users/xdite/projects/playgame
- extensions: .html .css .js .png .gif .jpg .php .php5 .py .rb .erb
- excluding changes in: */.git/* */.svn/* */.hg/*

如果你有其他的需要,可以修改 .livereload 檔,exclude 或 extend。

至於執行平台方面,Mac 當然是完全沒問題。它也提供了 Linux 與 Windows solution…不過這方面我就沒有測試過了,也許大家可以玩玩看 :D

如果都不能用,那就買台 Mac 加入使用 Mac 的行列吧!XD

無分類雜文 10 Jul 2010


使用 Amazon S3 + BitTorrent 永久分享檔案

剛剛看到 朱宅學恆在他的噗浪上面哀號他的主機每天的流量被開放式課程翻譯的演講用爆而束手無策。

螢幕快照 2010-07-10 下午11.06.03

我想一些人應該在巨大檔案的分享上應該也有類似的問題。其實如果手上有一點預算的話,這個問題是很好解決的。解法就是使用 Amazon 的 S3 服務搭配上 BitTorrent。

Amazon S3 (Simple Storage Service) 是由 Amazon 所提供的線上儲存服務。以簡單的方式比喻就是他是一個穩定快速的永久線上儲存空間。把檔案扔上 S3,再把檔案永久網址貼出來,問題就解決了。

它的基礎收費是儲存空間,每 GB 0.15 美元。傳輸費用是 每 GB 0.1 美元。超過 50TB 以後的計費方式可以看價目表。

螢幕快照 2010-07-10 下午11.13.55

至於怎樣把檔案上傳到 S3,可以找一下支援 S3 的 FTP client。如果是 unix 主機的話,有 s3cmd 這種東西…

搭配 BitTorrent

當然有人還是會靠北,放 S3 讓大家自由下載很像不關水龍頭一樣,被人濫用了就很傷荷包。Amazon 的 S3 有設計一項機制,它會將你的檔案製作成種子。

比如說你的原始檔案位址是:
http://s3.amazonaws.com/marcel/kiss.jpg
那麼種子位址就會是:
http://s3.amazonaws.com/marcel/kiss.jpg?torrent

你可以選擇將 torrent 另存新檔後再行發佈(可別笨笨的就將 ?torrent 的網址貼出去)。

這樣 Amazon S3 就可以充當檔案的永久種源,永遠不斷種。但是頻寬壓力卻不會都在你的 S3 帳單上。

Ruby 17 Jun 2010


[Rails3] RailsConf2010 - 有關 Rails3 的重點整理

RailsConf2010 落幕了,大會釋出了一些投影片

今年 Rails3 當然是熱門主題。花了一點時間整理了相關的 Talk,如下:

Rails3 的 General Introduction
DHH 的 keynote
Gregg Pollack : The Rails 3 Ropes Course
大會上也釋出了一系列官方教學影片:http://rubyonrails.org/screencasts/rails3

Bundler:
André Arko : Bundler: Painless Dependency Management

ActionMailer:
Mikel Lindsaar: Itch Scratching the ActionMailer API

Rack, Metal, ActionController, Plugin, Railties, Engine, Generator
Jeremy McAnally : Rails 3 Deep Dive

ActiveModel , ActiveRelation
Adam Keys :Rails’ Next Top Model: Using ActiveModel and ActiveRelation

RVM ( Rails 3 通常搭配 Ruby 1.9.2 運行)
Wayne E. Seguin: Ruby Version Manager (rvm) - An Overview

respond_with
Fabio Akita : Making Rails really RESTful with Restfulie

Ruby 27 May 2010


[Mac] 使用 Ruby on Rails Dictionary 快速找尋 Rails API

這是最近學到的一個技巧。Mac 上本身有一套 default 字典軟體,不少人貢獻了辭庫擴充它。有人太閒,也把 Ruby on Rails 的 API 也做成了一本辭庫

也就是說,只要裝了這套辭庫,當我們在程式碼裡面看到不懂的 API,按下右鍵然後 Look up in Dictionary ,就可以很快的把 API 用法叫出來看。不需要去 APIdock 上翻老半天。

Ruby on Rails Dictionary

安裝方法如下 ( in OSX 10.6.x )

1. 下載 http://f.priithaamer.com/dictionary/Ruby%20on%20Rails%202.3.dictionary.zip
2. Copy 到 ~/Library/Dictionaries,unzip it !
3. 字典 => 偏好設定 => 打勾 Ruby on Rails 2.3 的選項
4. 到 console 端輸入 defaults write com.apple.Dictionary ProhibitNewWindowForRequest -bool TRUE
5. 之後在任何地方就可以把字反白起來查 API…

Ruby on Rails Dictionary

無分類雜文 25 Apr 2010


Ship It! with Ruby & Rails ecosystem

這是我在 Rubyconf TW 2010 給的 Talk

無分類雜文 25 Apr 2010


Scaling Rails Sites by Default

這是我在三月份的 Ruby Tuesday #10 給的 talk。

錄影在此

Ruby 14 Mar 2010


2010 Ruby on Rails 書單 與 練習作業

學習 Ruby on Rails 最快的途徑無非是直接使用 Rails 撰寫產品。而這個過程中若有 mentor 指導以及 code review,學習進度也會加速不少。

但現實生活中並非如此理想,

第一,並不是每個人都有每天必須要以 Rails 撰寫產品的壓力(not a Rails Developer)。

第二,沒有循序漸進的入門途徑以及沒有 mentor。(Framework 進展太快,導致現有書籍版本跟不上進度,另外具有經驗的 mentor 太少,有的話也沒興趣回答過於初階的問題)

最近幾個月都在訓練 Rails Developer,零碎的東西講了不少遍。懶得一次次重講基礎的東西和開訓練菜單,乾脆整理成文字,以後新人就直接看這篇…

新人需要具備的「一般」基礎技能:

  1. 對 Git 的觀念與技巧掌握。
  2. 對 VIM / Textmate 的基本開發技巧掌握。
  3. 熟悉 Linux Command Line 的操作。

* Git

書單

Peepcode 的 GitPro Git

練習

上 Github 開啟一個專案,練習 git commit , git push , git pull, git branch , git checkout , git merge

* Editor

書單

c9s 的 VIM Hacks 與 Oreilly 的 精通 vi 與 vim 與 Pragmatic 的 TextMate: Power Editing for the Mac

練習

vgod 的 給程式設計師的Vim入門圖解說明 全部練習一遍

* Linux CLI

書單與練習:

Peepcode 的 Meet the Command LineAdvanced Command Line 全部練過一遍

=====

新人需要具備的 Rails 基礎技能:

  1. 可手刻 CRUD ( Create / Read / Update / Delete ) 並且理解 CRUD 中的 params 傳遞方法
  2. route 中 resources 觀念配合 model 裡 has_many 的設計,理解並熟悉 RESTful 觀念。
  3. route 的優先順序與 routes 中 resource / namespace 的實作。
  4. named_scope 、 counter_cache、before_filter
  5. plugin 的使用:restful-authenticationwill_paginatepaperclip
  6. rake 原理以及撰寫 task
  7. ruby on rails 的 production setup 與撰寫 capistrano recipes

書單:(案頭必備)

Ruby Programming — 向 Ruby 之父學程式設計
Ruby for Rails - Rails 開發者必備的 Ruby 學習手冊 (英文新版: The Well-Grounded Rubyist )
碼上就會:Rails敏捷開發網站 (英文新版: Agile Web Development with Rails, Third Edition )
The Rails Way
Ruby Pocket Reference
Rails Recipes
Advanced Rails Recipes: 84 New Ways to Build Stunning Rails Apps

線上工具:(必加書籤)

Ruby API : StringArrayHash
APIDock : Ruby on Rails

練習作業:

(1)開發一個簡易論壇系統。系統要有 Forum 與 Post 兩個 model,寫出 CRUD 介面,並且文章網址是使用 http://example.org/forum/1/post/2 這種表示。

        吸收觀念:

        * CRUD & migration
        * has_many 與 belongs_to
        * resources 與雙層 resources
        * before_filter : find_event

        參考資料:
        
        * 深入淺出 RoR (4-3) - RESTful 與 CRUD action
        * ihower training : Ruby on Rails 入門

( 2)使用者必須能夠 註冊 / 登入,登入後才可以發表 Post,不然只能瀏覽。只有自己的 Post 才能進行修改與刪除。

        吸收觀念:

        * routes 優先權與 route alias
        * plugin 安裝與使用
        * before_filter : login_required
        * session : current_user
        * attr_accessible / attr_protected        

        參考資料:

        * restful-authentication

( 3)論壇的文章要能夠分頁,每一頁 20 筆,每一個論壇要秀出現在論壇裡有多少 post 數量。可用 params 配合 named_scope 在文章列表排序。

        吸收觀念:

        * pagination
        * counter_cache
        * named_scope :recent

        參考資料:
        
        * will_paginate
        * Railscast : Counter Cache Column
        * Railscast : named_scope

( 4)每篇文章可以上傳附件

        吸收觀念:

        * form_for multipart

        參考資料:

        * paperclip

( 5)Admin 可以刪改所有文章,建立一個後台做這件事。網址是 http://example.org/admin/。只有身分是 admin 的人可以進後台。admin 的判別方是 column 裡加一個 boolean,判斷是否 admin。這個 attribute 必須用 attr_accessible / attr_protected 保護。

        吸收觀念:
        
        * route : namespace
        * before_filter : require_is_admin

        參考資料:

        * Namespaces added to routes

( 6)用 Rake 撰寫自動化步驟,生假資料。寫一個 rake 可以達成以下步驟:「砍 db => 建 db => 跑 migration => 生種子資料」,另一個 rake 是生假文章與假論壇。

        吸收觀念:

        * rake -T
        * rake db:drop ; rake db:create ; rake db:migrate ; rake db:seed
        * rake dev:fake ( 自己寫 namespace : dev, 裡面放一個 task 叫做 fake,fake 資料用 Populator 生)

        參考資料:

        * Ruby on Rails Rake Tutorial (aka. How rake turned me into an alcoholic)
        * What’s New in Edge Rails: Database Seeding

( 7)在租來的 VPS 上面建置 Ruby on Rails production 環境,使用 Ruby Enterprise 與 mod_rails。使用 capistrano 佈署 application。

        吸收觀念:

        * cap deploy:setup , cap deploy , cap deploy:rollback , cap deploy:restart

        參考資料:

        * rails-nginx-passenger-ubuntu
        * AWDR3 的 deploy 章節 , Ruby Pocket Reference 的 capistrano 章節

===

PS. 實際測試的結果是,完全不懂 Ruby on Rails 的新人,從頭帶過大概兩週可以練完這一份作業。

Ruby 10 Mar 2010


[閒聊] Rails 與 Merb 合併背後的故事

剛剛有感而發,在公司開發的 microblog上寫了一段 Rails 與 Merb 合併的故事,以作為一些事情的借鏡。後來覺得寫太長了,所以就乾脆整理一下貼過來…

====

Merb 當初是為了要解決 Rails 沒辦法解決的問題,比如說上傳檔案會造成整個網站 hang 住才開始開發的。在 Yehuda 當初設計的哲學之中,他認為 Framework 內部要能夠 modularity 。同時要能實現 ORM Agnosticism,甚至不只 ORM ,包括 javascript library 之類的也都必須要可以這麼做。最後幹出了一套 merb。於是在 2008 年逐漸形成了 Rails 與 Merb 之爭。

但 Merb 越來越開發到最後,core team 發現到一件事,”過於自由” 並不會帶來開發上的便利,反而形成 Merb 內部 component dependency 的 conflict。同時,對於寫出一套 Merb application,不像 Rails 一樣,大家並沒有很清楚的開發標準與 Best Practice,而光看教學文件,因為版本與寫法的關係,造成有心踏入 merb 的開發者一天到晚踩中難以解決的地雷。

更糟糕的是,跳槽來 Merb 的人都是前 Rails 開發者,雖然他們多半是不滿 Rails 的束縛過來的,但他們過來之後,對 Merb 最大的抱怨變成:Merb 並沒有 Rails 那麼便利。這個沒有,那個沒有 ….

剛開始,Merb 的核心團隊,對於這些抱怨,解決之道,就是你喊缺,我們就加!但寫到最後越來越不對勁。他們越來越接近在「重寫」一個 Rails 而已。但這些開發者並不會感激他們。開發者還是只會抱怨 Merb 相比起 Rails「還」缺了甚麼

加功能,並不會讓 Merb 從此以後取代 Rails,只是永無止盡的追趕和重造輪子
,但是開發者還是只是會繼續抱怨。而且,一個 Community 再大,力量也只撐的起一個「主流」Framework。Merb 與 Rails 之爭,相當的損害了社群的開發元氣。

Yehuda 覺得這樣發展下去並不是他的本意。於是找上了 Rails core team 談。一談之下,才達成了現在的合併共識。Rails Core Team 覺得 Yehuda 提的 modulity 與 API 是很好的提議,只是他們「不在乎」。這個不在乎並不是真的不在乎,而是 Rails 的 goal 是壓縮開發的 cost,讓 convention 達到最大化,在此目標之下,要做這件事並沒有太大的實質效益,而且他們這些人的力量與技術能力也不夠做這件事。

而 Yehuda 的原意是他要解決 Rails 沒有辦法達成的事,同時帶進他覺得 modern framework 應該要有的設計,這樣才能讓整個 framework scable,連帶 application 也 scable。而非玩到如今的局面 :「 硬是重造一個 Rails」。既然 Rails core team 也覺得 Yehuda 提的很好很重要,只是他們沒能力去做。而如今 Yehuda 也有能力有意願去做,那就讓他加入 Rails core team 做這件事吧。

所以才造就現在看到的偉大 framework : Rails 3

====

apply 到一些場景,真是感觸良多啊 /_\

無分類雜文 04 Mar 2010


[閒聊] 豆瓣的購書單

最近要買一些大陸書看,就上了豆瓣找評價,發現多了這個新功能:購書單….

如果我是大陸地區的消費者,這功能真的還蠻棒的就是了…:D

可惜當年博客來的松鼠窩沒做起來啊 :(

豆瓣購書單

Ruby & ScalingRailsSite 01 Mar 2010


Scaling Rails Site:Reading Material # 5

6. Distributed Filesystem / Database , Database Optimization, NoSQL

基本上如果你的網站規模不到一定規模(這邊的定義是,用到幾十台機器),是不需要去研究 Distributed Filesystem / Distributed Database 的。不過我還是稍微聊一下它們的使用情境好了。

Distributed Filesystem 我們在做完網站後,可以使用 Load Balancer 把 request 分散到各台 web-front 機器上,但隨之就會產生一個問題,全站上的靜態檔案要怎樣讓這麼多台的 web-front 存取呢?基本想法當然是用 NFS,但是隨著網站成長,很快的 NFS 就不夠擔當這種重責大任了。於是另一種簡單的作法又出現了,用大量的 rsync + script 將檔案複製到多台 來*暫時* 解決 NFS 不夠用的情況。這個方法勉強夠用,但是會隨之產生架構維護上的難度缺乏整體的管理與監控…。而且在有大量小檔案需要同步,或者是檔案數量到達了百萬級、千萬級時,純用 rsync 非常的傷…

所以這時候才會用上 Distributed Filesystem 來解決這個問題。DFS 的作用是讓 Application 不用理會檔案資源實際會存在哪裡,往裡扔就對了,接下來的事情 DFS 會自己處理掉。Opensource 中比較出名的 Distributed Filesystem 當屬 Hadoop Distributed File System 。

HDFS 想做到的是 Google File System (GFS)能提供的:

1. 易於擴充的分散式檔案系統
2. 可運作於廉價的普通硬體上,又可以提供硬體錯誤容忍能力
3. 給大量的用戶提供總體性能較高的服務

解決以上情景會遇到的問題,同時又提供擴充性、移植性、資料一致性,而且支援相當大的資料規模(Perabytes)。Facebook 本身也是用 HDFS。

有關於這部分的閱讀資料,可參考國網中心的 Hadoop Distributed File System 這份投影片

Distributed Database 這個主題 DK 講過也講的蠻清楚了,我就不重複寫一遍了。最重要的目標是 CAP theorem 的 Eventual Consistent(資料最終一致性)。比較知名的 Distributed Database 有 HBase 、Cassandra、Voldemort 等等….

=====

Database Optimization

這方面的主題能談的非常多。而且每個主題也都相當博大精深。既然這系列的重點是 Reading Martrial,我就挑重點講好了。

首先是:MySQL 的調校 (軟硬體、版本、設定),這一段 DK 也已經專門整理過一篇文章了。內容是有關於機器、硬碟的挑選,架構的設計。挑選適合 MySQL 使用的 FileSystem ,my.cnf 的調校。

而跟 MySQL 各方面都不是很熟,看原文書又覺得很痛苦的人。我推薦看對岸簡朝陽寫的 MySQL 性能調優與架構設計 這一本書。基本上如果想瞭解 MySQL 的各樣基礎知識甚至進階知識,這本書大部分都含括了,而且寫的相當深入淺出….

架構設計上的需求,可直接看這本書的第三篇 (Ch12-Ch18),以及 High Performance MySQL 這本書。追求極致的 Performance Optimizaion 可追 MySQL Performance Blog 這個 blog …

DB 永遠是 Web Application 的瓶頸。而使用 ActiveRecord 想對 query optimize 的幾個 tips 是:

1. 不要忘記打 index,這一點很常在寫 model code ,寫著寫嗨了就忘記了,忘記打 index 可能會造成 slow query,可用 rails_indexes 這個 plugin。
2. 只 SELECT 你要的資料,而非 SELECT *。這一點可以透過 scrooge 這個 plugin 辦到。
3. 避免產生 n+1 query。
4. 記得加 counter_cache。( 3. 與 4. 都可用 bullet 這個 plugin 抓出來 )
5. 記得打開 my.cnf 裡面記錄 slow query log 的選項,然後善用 EXPLAIN 抓出真正的原因。
6. 儘量使用 find_in_batch,而不要使用迴圈跑 find(i)
7. 少用 join,多用幾次 select 做到相同的事。
8. 必要的時候,使用 SQL Antipattern 技巧,denormalize,實作 eav 等等….這方面可以看 SQL Antipaatern 這本書。

=====
NoSQL

對岸 JavaEye 的站長 Robbin 寫過一篇「NoSQL數據庫探討之一 - 為什麼要用非關係數據庫?」。整理了為什麼世界上比較大型的 Web 2.0 Site 要捨棄 RDBMS 轉而開發/使用 NoSQL 的原因:

1. High performance - 對數據庫高並發讀寫的需求
2. Huge Storage - 對海量數據的高效率存儲和訪問的需求
3. High Scalability && High Availability- 對數據庫的高可擴展性和高可用性的需求

這些 production 網站,對 DBMS 特性的要求 :

1.數據庫事務一致性需求
2.數據庫的寫實時性和讀實時性需求
3.對複雜的SQL查詢,特別是多表關聯查詢的需求

以及市面上滿足這些需求的各種 NoSQL (依照分類)以及簡單介紹,相當值得一看。

另外 High Scalability 這兩天也出了一篇 Paper: High Performance Scalable Data Stores

而我個人比較有在玩的是 MongoDB,他比較貼近 MySQL 的用法,但速度上快少 MySQL 不少。MongoDB 貼近 MySQL 的用法和一些其它的 feature,也比較滿足我在開發網站上的需求,比如說我就相當喜歡它以下的特色:

* Document-oriented # BSON ( Binary JSON)
* schema-less
* full index support
* dynaminc query (MongoDB - Ruby document store that doesn’t rhyme with ouchP.34)
* MM replication & auto sharding
* 可用來做 Real-Time Analytics …# upsert 特性
* subdocument 甚至是 nested document # 做巢狀 comment 特別簡單。知名留言系統 Disqus (支援 Nested Comment )的 backend 就是 Mongodb。

2009 的 Rubyconf 就有一個關於 MongoDB 的 Talk :Getting Non-Relational with MongoDB,相當值得一看。

====

以上就是我關於 Scaling Rails Site 的五篇文章,感謝收看…

另外推薦幾本 General Scaling 的書:
* Building Scalable Web Sites (Cal Henderson 著) # 這本是經典中的經典
* 構建高性能 Web 站點 (郭欣 著)# 這是對岸出的新書,也是講了相當多 general topic

還有這一個 blog: High Scalability

Next Page »