2009年12月29日 星期二

windows和 Linux下建立 Ruby On Rails 環境 Thin 篇

windows下安裝 Thin A fast and very simple Ruby web server
gem install rack

gem install eventmachine

如果出現
ERROR: could not find gem eventmachine locally or in a repository
請到RubyForge: Ruby/EventMachine: 專案檔案列表下載最新的eventmachine.gem檔案
此處我下載的是eventmachine-0.12.10-x86-mswin32-60.gem

如果下載後存到c:\,請到c:\輸入
gem install eventmachine-0.12.10-x86-mswin32-60.gem


結果最後還是跟我說缺少cl.exe
查詢後才知道,需要安裝visual studio才有內含此檔
然後我又去Downloads visual studio 2008 express

結果下載三次都失敗!!!

弄了一上午,網上也有人說要用 Thin還是在Linux下,Windows無法安裝。
無論如何,我最後決定放棄這個方案了……去他媽的微軟!!!
實在想在WINDOWS下安裝的人可以自行參考這邊
http://groups.google.com/group/mack-framework/browse_thread/thread/767e005a944b1400?pli=1

Ubuntu下安裝Thin,只需要一個步驟就完成!
sudo gem install thin


到你的網頁目錄,啟動
thin start

完成!!

各種Ruby on Rails部署方案 的性能比較表

前後端搭配的測試

各種前端的,我在這裡要測試的性能主要是對於動態請求的響應速度,所以本案中的某些配置既沒有考慮使用Rewrite或其他方式對靜態文件進行單獨處理 (除了Passenger和Swiftiply默認配置便實現了這個功能),也不考慮測試到前端的KeepAlive請求。主要測試以下的組合:
  • Apache + Passenger
  • Nginx + Mongrel
  • Nginx + Evented Mongrel
  • Nginx + Thin
  • Swiftiply + Swiftiplied Mongrel
  • Swiftiply + Thin
  • HAproxy + Mongrel
  • HAproxy + Thin
  • Lighttpd + Mongrel
  • Lighttpd + Thin
  • Lighttpd + FastCGI/Socket
  • Lighttpd + FastCGI/TCP
做服務器的被測試機器為ThinkPad T43,Intel Pentium M 1.86G,1.5G RAM,系統為Ubuntu 8.04。發送請求的是無線局域網中的另外一台筆記本,運行Vista。兩台機器通過TP-Link WR340G+ 801.11g 54MB的無線局域網相連。
前端和後端處於同一台機器上,所有的後端都設為10個進程,綁定於30000-30009端口,Passenger設置為最大生成10個進程,Swiftiply則是綁定於4000端口監聽。FastCGI的socket路徑為/tmp/rails[0-9].sock。


各種部署方式的性能排個名次,以下是後各種方案在並發量>=10的情況下的平均值(去掉出現0值的情況):

前端
後端
平均每秒響應數 最大鏈接限制
Lighttpd
FastCGI/TCP
215.33
64
Lighttpd
FastCGI/Socket
214.65
64
Lighttpd
Thin
196.16
64
Swiftiply
Swiftiplied Mongrel
191.33
N/A
HAproxy
Thin
188.73
10
Swiftiply
Thin(Swiftiplied)
178.96
N/A
Apache2.2/Prefork
Passenger
173.02
N/A
HAproxy
Mongrel
170.4
1
Apache2.2/Worker
Passenger
163.9
N/A
Lighttpd
Mongrel
149.85
64
Nginx
Evented Mongrel
149.78
N/A
Nginx
Thin
143.88
N/A
Nginx
Mongrel
138.86
N/A

在這個表中,Lighttpd的三種方案佔據了前三位,Lighttpd+FastCGI是性能最高的部署方式。這種方式比另一種流行方案Nginx+Mongrel的方式性能提升了高達50%!
FastCGI的好處在此體現出來:
  • 二進制協議,無需HTTP的解析
  • 與前端可以建立持久鏈接
  • 沒有鎖和上下文切換的開銷
另外Lighttpd相對於Nginx的優勢在於請求和響應的接收緩衝區很大,省去多次接收和發送的開銷。
Lighttpd+Thin的方式的性能列第三位,這點似乎出乎意料之外,但實際上是因為Lighttpd 1.5支持對HTTP後端建立HTTP KeepAlive鏈接。在第一部分對後端單獨的測試中,小並發下的Thin的KeepAlive測試性能並不比FastCGI差,同時Thin實現了非 阻塞IO,而FastCGI則是阻塞式的。相反,HAproxy和Nginx則都不支持HTTP KeepAlive。
而Swiftiply的方式也顯示出了強勁的性能,應該是得益於它的「讓後端主動連接到Swiftiply」的這種特殊的結構。
當前備受關注的Passenger的部署方式在本案中並沒有顯示出特別的性能上的優勢,不過如果將並發鏈接數放在300以內,則 Apache2.2/Prefork + Passenger的部署方式的平均每秒響應數上升為204.03,這樣看來,倘若為Apache進行一些優化配置,依然不失為一種高效的部署方案。而同 時Passenger又是最容易配置的一種方案,能達到這種效果已經非常令人滿意。
HAproxy + Mongrel並限制鏈接數為1,則是一種穩定、保守的部署方式,雖然在這裡性能不出眾,但是穩定性非常好。
最後,與Nginx相關的三種方案都排在了該榜的末尾,由於Nginx的反向代理負載均衡缺少一些高級的特性以及Rails本身的特性而導致其不適合單獨應用在Rails程序的部署上:
  • 缺少到後台服務器端的鏈接數限制的能力,這導致了Mongrel在接受大量請求時將時間消耗在上下文切換和鎖的爭用上。
  • 缺乏建立到後台服務器端的持久鏈接的能力,這導致了在鏈接的打開、建立、關閉上花費了額外的開銷。
更詳細的分析過程和資料請看浅析Ruby on Rails部署方案

2009年12月28日 星期一

SQLite 教學

* 1 建立資料庫檔案
* 2 在sqlite3提示列下操作
* 3 SQL的指令格式
* 4 建立資料表
* 5 建立索引
* 6 加入一筆資料
* 7 查詢資料
* 8 如何更改或刪除資料
* 9 其他sqlite的特別用法
* 10 小結

建立資料庫檔案

用sqlite3建立資料庫的方法很簡單,只要在shell下鍵入(以下$符號為shell提示號,請勿鍵入):

$ sqlite3 foo.db3

如果目錄下沒有foo.db3,sqlite3就會建立這個資料庫。sqlite3並沒有強制資料庫檔名要怎麼取,因此如果你喜歡,也可以取個例如foo.icannameitwhateverilike的檔名。

在sqlite3提示列下操作

進入了sqlite3之後,會看到以下文字:

SQLite version 3.1.3
Enter ".help" for instructions
sqlite>

這時如果使用.help可 以取得求助,.quit則是離開(請注意:不是quit)

SQL的指令格式

所有的SQL指令都是以分號(;)結尾的。如果遇到兩個減號(--)則代表註解,sqlite3會略過去。

建立資料表

假設我們要建一個名叫film的資料表,只要鍵入以下指令就可以了:

create table film(title, length, year, starring);

這樣我們就建立了一個名叫film的資料表,裡面有name、length、year、starring四個欄位。

這個create table指令的語法為:

create table table_name(field1, field2, field3, ...);

table_name是資料表的名稱,fieldx則是欄位的名字。sqlite3與許多SQL資料庫軟體不同的是,它不在乎欄位屬於哪一種資料型態:sqlite3的欄位可以儲存任何東西:文字、數字、大量文字(blob),它會在適時自動轉換。

建立索引

如果資料表有相當多的資料,我們便會建立索引來加快速度。好比說:

create index film_title_index on film(title);

意思是針對film資料表的title欄位,建立一個名叫film_title_index的索引。這個指令的語法為

create index index_name on table_name(field_to_be_indexed);

一旦建立了索引,sqlite3會在針對該欄位作查詢時,自動使用該索引。這一切的操作都是在幕後自動發生的,無須使用者特別指令。

加入一筆資料

接下來我們要加入資料了,加入的方法為使用insert into指令,語法為:

insert into table_name values(data1, data2, data3, ...);

例如我們可以加入

insert into film values ('Silence of the Lambs, The', 118, 1991, 'Jodie Foster');
insert into film values ('Contact', 153, 1997, 'Jodie Foster');
insert into film values ('Crouching Tiger, Hidden Dragon', 120, 2000, 'Yun-Fat Chow');
insert into film values ('Hours, The', 114, 2002, 'Nicole Kidman');

如果該欄位沒有資料,我們可以填NULL。



查詢資料

講到這裡,我們終於要開始介紹SQL最強大的select指令了。我們首先簡單介紹select的基本句型:

select columns from table_name where expression;

最常見的用法,當然是倒出所有資料庫的內容:

select * from film;

如果資料太多了,我們或許會想限制筆數:

select * from film limit 10;

或是年份比較早的電影先列出來(預設為 asc):

select * from film order by year limit 10;

或是年份比較晚的電影先列出來:

select * from film order by year desc limit 10;

或是我們只想看電影名稱跟年份:

select title, year from film order by year desc limit 10;

查所有茱蒂佛斯特演過的電影:

select * from film where starring='Jodie Foster';

查所有演員名字開頭叫茱蒂的電影('%'、'_' 符號便是 SQL 的萬用字元,前者代表任意長度字元,後者代表任意一個字元):

select * from film where starring like 'Jodie%';

查所有演員名字以茱蒂開頭、年份晚於1985年、年份晚的優先列出、最多十筆,只列出電影名稱和年份:

select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10;

有時候我們只想知道資料庫一共有多少筆資料:

select count(*) from film;

有時候我們只想知道1985年以後的電影有幾部:

select count(*) from film where year >= 1985;

(進一步的各種組合,要去看SQL專書,不過你大概已經知道SQL為什麼這麼流行了:這種語言允許你將各種查詢條件組合在一起──而我們還沒提到「跨資料庫的聯合查詢」呢!)
[編輯]
如何更改或刪除資料

瞭解select的用法非常重要,因為要在sqlite更改或刪除一筆資料,也是靠同樣的語法。

例如有一筆資料的名字打錯了:

update film set starring='Jodie Foster' where starring='Jodee Foster';

就會把主角欄位裡,被打成'Jodee Foster'的那筆(或多筆)資料,改回成Jodie Foster。

delete from film where year > 1970;

就會刪除所有年代早於1970年(不含)的電影了。



其他sqlite的特別用法

sqlite可以在shell底下直接執行命令:

sqlite3 film.db "select * from film;"

輸出 HTML 表格:

sqlite3 -html film.db "select * from film;"

將資料庫「倒出來」:

sqlite3 film.db ".dump" > output.sql

利用輸出的資料,建立一個一模一樣的資料庫(加上以上指令,就是標準的SQL資料庫備份了):

sqlite3 film.db < output.sql

在大量插入資料時,你可能會需要先打這個指令:

begin;

插入完資料後要記得打這個指令,資料才會寫進資料庫中:

commit;

原始出處

2009年12月11日 星期五

excel csv資料檔案匯入MySQL phpmyadmin中文字看不到?

excel csv資料檔案匯入MySQL phpmyadmin中文字看不到問題?

如果MySQL資料庫伺服器安裝預設編碼為UTF 8(Unicode),那麼用Excel將資料轉存成CSV檔內容中文字會無法成功匯入,會出現空白…..



原因是因為Excel將資料轉存成CSV檔是以BIG5去儲存的,所以直接匯入MYSQL,當然會有問題,可以使用以下方式進行匯入:
1.將Excel資料轉存成CSV檔
2.使用notepad開啟剛剛轉存的CSV檔
3.再將這份文件另存檔案,注意編碼要選擇UTF-8
4.至phpmyadmin載入CSV檔即可

2009年12月9日 星期三

在Ubuntu9.10 利用Totem播放PPStream(PPS)和sopcast

首先是安裝PPS插件
在終端中執行
sudo gedit /etc/apt/sources.list

加入
deb http://ppa.launchpad.net/portis25/ppa/ubuntu karmic main
deb-src http://ppa.launchpad.net/portis25/ppa/ubuntu karmic main

之後在終端中依次執行
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 27F5B2C1B3EAC8D9

sudo apt-get update

sudo apt-get install totem-pps


若要安裝sopcast(看P2P電視),請安裝
sudo apt-get install totem-sopcast


要看PPS時,在 Totem 裡啟用 totem-pps 插件:
打開 Totem(電影播放器),選「編輯 –> 插件」
在所打開的窗口裡勾上 「PPS 瀏覽器」

要看sopcast的話,方法同上。


附註:PPS Totem 插件的PPA(一開始安裝的來源)
這個ppa裡還包含以下軟件: (Karmic下沒有問題, Jaunty等其他版本可能存在依賴問題)
gst-plugins-sopcast: 0.0.4
totem-sopcast: 0.0.3
sopcast: 命令行的網絡電視, karmic裡已經沒有libstdc++5庫了, 需要自行安裝該庫。
lib32stdc++5: 32位的libstdc++5庫,64位karmic系統需要安裝, 不然sopcast無法運行, 為了照顧jaunty系統去掉了sopcast對lib32stdc++5的依賴,因此需要自行安裝。
sopcast-player: 一個python寫的GUI前端


flashplugin-nonfree: 這個主要針對64位系統,安裝原生64位flash插件
gmlive: 0.22.2 (沒有測試)
ibus-qt4: ibus的qt4支持
jde: emacs的java支持包,修正了一個錯誤
lib32ibus: 我自己打的64位系統上的支持32位程序的ibus庫,包含gtk和qt4支持。有了它,64位系統上qq, googleearth, skype等32位程序也可以用ibus輸入法了。
linuxqq: 主要針對64位系統
monkeys-audio: ape無損格式編解碼器
reciteword*: 好像叫黑客背單詞?
另有更新後的pymacs, rope, ropemacs等