推文按鈕

收進你的MyShare個人書籤

2008年3月21日 星期五

地圖日記課程:Google Map API

前天請到地圖日記技術長Andy為同事講解示範Google Map API的玩法,
大家都收穫良多,來分享一下。

叫出地圖
首先引入Gmap,Key要向Google Map申請,每個網域都有特定的值
<script type="text/javascript" src="http://www.google.com/jsapi?key=ABCDEFG">script>
接下來將Map2物件實體化,並塞在前端div=map的標籤內,
用setCenter方法,傳入經緯度及地圖比例(1~18),就可以將地圖叫出
var map = new google.maps.Map2(document.getElementById("map"));
map
.setCenter(new google.maps.LatLng(37.4419, -122.1419), 13);
加上標記(marker)
用Gmarker,
GMarker(point, icon?, inert?),
第一個參數傳入一個Gpoint或GLatLng,第二個是傳入icon類型,
Gmarker實體化,再用map.addOverlay(marker),將標記放在地圖上。
icon可以換成自己想要的圖或者選擇預設
icon的定位設定跟iconSize及iconAnchor,如果
iconoff.iconSize = new GSize(40, 40);
iconoff.iconAnchor = new GPoint(20, 40);

開對話視窗

用map.openInfoWindow(point, node, opts?)或openInfoWindowHtml(point, html, opts?)
或GinfoWindow開出視窗,可設定各種視窗及效果


將鏡頭拉到某一個點

map.panTo(center),center傳入一個GLatLng(lat, lng, unbounded?)或Gpoint(x,y)當作中心點,
因此如果要做出動態拉鏡頭的效果,可以將一串經緯度傳入陣列,再用setTimeout
設定依時間順序序傳入陣列的經緯度值。
setTimeout("javascript statement",milliseconds);
另外,eval()也很好用,
後端回傳的responseText如果用JSON格式,塞入eval(string)中,可以直接成為陣列
landmarkdata = eval('(' + o.responseText + ')');
標定視窗界線,讓使用者拉動到鏡頭外時可以重新傳入新的經緯度值

必須以事件(GEventListener)監聽地圖的四個角的位置(GBound),
當改變時,重新到資料庫取出新的使用者經緯度資料,並重繪地圖。

2008年3月13日 星期四

資料庫優化

發現資料庫的查詢很慢,看了一下書,做點筆記

1. 建立索引
- 建立索引可以加速查詢,但是update的速度會慢一些,因為update資料欄位也同時要更新索引排序
- 不能在太多欄位建立索引,否則資料量會變大,也讓速度下降
- 使用不可重覆的索引,並且盡量短(但是還是得保留辨視度)
- 索引建立的地方,加在 FROM或WHERE相關的欄位,而不是要SELECT的欄位

SELECT (col_a) FROM (tb1 LEFT JOIN tb2 ON tb1.col_b=tbl2.col_c) WHERE (col_d=expr)

-UPDATE時,盡量寫在一筆內一次寫入多個欄位,而不要分為多筆,否則必須重覆建立索引,速度會很慢

2. 欄位設定NOT NULL,可以讓Where的判斷式更快
3. 使用查詢加速器
4. 記憶體要大,請參考FAR的文章

相關資料
http://www.belinking.com/Big5/data_52.htm

2008年3月6日 星期四

Web 2.0 創新服務大驚奇

昨天參加完資策會web 2.0創新服務競賽的決選,表現不算好,
能不能入選看運氣囉!

不過隔天看到Multani的文章12,發現兩個有趣的網站,ShowJoinLocalking,分別和場地王有合作的可能性

1. ShowJoin,是敲活動時間的工具+社群網站:
a. 場地王開放場地API,供ShowJoin網友揪團的時候除了時間還可以有活動場地的選擇
b. ShowJoin開放API讓場地王嵌入網站,提供場地王使用者在場地王平台外,除了選擇活動 (記者會、宴席、聚會)場地外,還可以橋時間。揪團網也提供類似功能。

2. LocalKing,在msn介面上以plugin嵌入Google Map,以web 2.0方式提供地緣關係的生活資訊 問答。
a. 場地王網站上提供LocalKing Plugin下載,增加LocalKing User Base;
b. LocalKing在msn上的LocalKing介面,可以藉由場地王資料庫豐富生活資訊及專家。
c. 場地王客戶若需要在多一個介面上(LocalKing)刊登廣告,可以透過場地王,並將利益拆帳給 LocalKing

2008年3月2日 星期日

好文精選:架設大型網站的Tips

原文出自Pixnet的創辦人Far
http://blog.pixnet.net/far/post/17024


「架設像Pixnet或者是無名這類網站真的要所費不貲麼?
其實不然.
下面的東西,對一些大Site來說是很基本的道理。只是想讓初學者省去摸索跟試誤的時間。
一些架站的Tips..

1. Storage Server
外面一台專業存儲設備或者是NAS等等都價格昂貴,但有多少錢做多少事情,買個幾台一般的主機,買個幾張RAID卡,RAID卡的價錢,當然就關係著品質。建議購買具有RAID 5的功能之RAID卡,stripe 可以加快讀取速度,硬碟越多顆,讀取速度越快。RAID 5允許在有一顆硬碟fail的情況下可以rebuild資料回來。增加資料安全性。

一般建立使用者,會給予其流水號,建議使用流水號來分目錄,比如說Pixnet,有一位使用者的帳號是far,他的uid是12345,我會將他的圖片放置於userpics/4/5/12345裡面,這樣有什麼好處?好處在於可以把使用者平均的分散在不同的目錄,不同的機器上。像pixnet的範例,依成長的比例,從1台~100台都可以自由運用。 (分的越細當然就可以分更多台)。有人會說每個人用量都不一樣,真的能夠平均麼?可以的。人數越多,就越平均.:)。某site用的是使用者名稱的第一個字母,但是英文字首的命名本來就極不平均,所以要load banlance就越困難,加上他只能最多分到26台。
ㄧ般要讓其他機器可以存取圖檔,我們習慣的作法是開NFS,但是我們建議,盡量不要用NFS,問題太多,效能也不好。能用其他方式取代就取代。

2. DB
Pixnet 使用MySQL 5,自MySQL 4.1之後的sub-select是我很愛用的,真的頗好用。DB在編譯的時候,用不到的功能能關就關,my.cnf 其實有很多東西可以調,看你自己最多的query type是什麼,對於memory的分配就很重要。DB重的是memory,所以能大就盡量大。

tune my.cnf只能有部分的效能增進,要使其到極限,還是要去改寫你的mysql query,使用EXPLAIN來看你的query是不是做太多白工。這部份的效能增進是最大的。

打開log slow query,可以讓你知道哪些query最耗時,想辦法改寫他。

打開mysql cache,這樣mysql會有cache的功能,相同的query就不會再去處理一次,而把上ㄧ次同樣的結果丟出來。時間與CPU都省了下來。

安裝mytop可以幫助你了解可能出問題的query在哪裡。

定期OPTIMIZE TABLE。

能讓php做的,就不要讓mysql去做。與其讓mysql去做非自己專們的運算,不如給php做。
對於常常access且static的資料,比如像是熱門相簿等等,不需要每次都重算。你可以每小時做一次統計,並且將結果丟到一個HEAP的 table,這樣對於這種很常大量access的資料,mysql幾乎只是提取資料,而不需要另外做運算。效能上當然是大大增進。

將ㄧ些會很常大量access的資料,且可以經由其他table運算出來的資料,放到另ㄧ個HEAP table,因為HEAP是把table放置到memory,在server重起後,資料會不見。所以適合可以重新運算即可得到,且被大量使用的資料上。

類似像隨機相簿這種,請不要真的把所有的資料放下去隨機,隨著你的site成長越大,這部份的load也就會越大,你只要讓人家感覺是隨機就好了。每個小時從原始資料中random出夠大的SET(比如說1萬份),當使用者要access時,再從這1萬份裡random取出10份即可。randomㄧ萬份是比random一千萬份的時間是少之又少。Server Load也頓減許多。

要做的是功能,某種層度上它是真的隨機,請不要傻傻的全部去給他隨機。
如果機器算多的話,做一下mysql replication,讓master專門做寫入,讓多台slave做讀取,如此可以做到High Available又可以做到備份的功效。效能增進上更是倍數成長。

3. reverse Proxy
Proxy是很重要的,他是擋在file server前面的東西。大家都知道file server最怕的是硬碟壞軌,而過量的IO也確實會讓file Server的壽命減少。Reverse Proxy的功能就在保護File Server的壽命。我在每台file server上面跑thttpd。然後Reverse Proxy再跟file server的HTTP要檔案。thttpd本身有cache的功能,你可以設定expire time,他會cache在memory中,所以實際上可以減少硬碟的I/O,加上Reverse Proxy又再一次的cache,可以做到雙層cache,做到保護硬碟的功效。

4. Web
如果可以的話,讓網站只有很簡單的吞吐,不要有多餘的功能,如果是用APACHE之類的,module load越少越好,htaccess能關儘量關掉。PHP如果可以就跑fastcgi,現在php cache的soft有很多,像是mmcache,APC,eaccelerator等等。它可以將php complie候cache在memory裡,如此,下一次同樣的request就可以少掉這段的耗費。

如果可以弄成static page就最好弄成static page。靜態頁面的吞吐大過於php產生頁面。

5. 程式
程式方面就沒什麼好說了,這多少是看功力。多試多玩,他就是你的了。

還有,做這種東西,很重要的是"Cache!Cache!Cache!!"

很多Optimize的方法Google其實都有,不要怕花太多時間,就算是一點點小tip,有時也是很實用的。

寫的有點雜亂無章.以後想到再補訴。」

補充資料
1. MySQL設定
http://www.eland.com.tw/www/javaland/2003_11/javatech_javaclassroom.htm

2. HEAP TABLE
http://www.databasejournal.com/features/mysql/article.php/3077531
http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html
http://linux.tnc.edu.tw/techdoc/mysql/mysql_doc/manual_Server.html
http://www.twbbs.net.tw/1302006.html