網頁最佳化圖片

http://www.webresizer.com/resizer/ PS:可恨的000webhost原本有一堆資料,現在都沒了,啊!~~~

2010-01-01 · 1 min · 2 words · Me

[轉]10 个你应该知道的 mod_rewrite 规则

http://www.mangguo.org/10-mod_rewrite-rule-you-should-know/ Mod_rewrite 是一个基于 Apache 服务器的动态 URL 重写引擎。Apache 服务器已本地集成了该模块,但默认情况下不启用。 它能够超越简单的重写功能,以下其中的一些实用技巧。 开启 Mod_Rewrite 模块 Mod_rewrite 模块通过 .htaccess 文件使用。粘贴以下代码至 .htaccess 文件头部,以开启 mod_rewrite 模块: RewriteEngine on 谨记,.htaccess 文件命令是区分大小写的。要使用 mod_rewrite 模块,此代码必须在 .htaccess 文件的开头输入。 基本 Mod_Rewrite 布局 mod_rewrite 命令的基本格式为: RewriteRule Pattern Substitution [Flag(s)] URL 地址是相对的 您所要重定向的 URL 地址是相对于当前 .htaccess 所在目录而言的。因此如果 .htaccess 存放于根目录,URL 地址均涉及并相对于根目录;如果 .htaccess 存放于子目录,URL 地址涉及并相对于特定的子目录。 基本重定向 如果只是想创建简单的从一个 URL 地址到另一个 URL 地址的 301 重定向,可以使用以下代码: RewriteRule ^fileone.html$ filetwo.html 这是一个非常基本的规则,意味着任何来自 fileone.html 的请求将被引导至 filetwo.html 文件。 关于 301 重定向请详细参考:使用 .htaccess 实现 301 域名重定向 省略 “www” 前缀 这段代码将允许访客不需要输入 “www” 前缀即可正确访问网站。 RewriteCond %{HTTP_HOST} !^mangguo.org$ [NC] RewriteRule ^(.)$ http://mangguo.org/$1 [R=301,L] 阻止特定的 IP 地址 如果想阻止来自特定 IP 地址访问你的网站,可以使用以下代码: RewriteCond %{REMOTE_ADDR} ^(A.B.C.D)$ RewriteRule ^/ http://www.mangguo.org/sorry.html [L] 阻止特定的 User Agent 如果想阻止一组来自相同 User Agent 的 IP 地址段,可使用以下代码: RewriteCond %{HTTP_USER_AGENT} UserAgent RewriteRule .* - [F,L] 通过修改 User Agent 参数内容,可以轻易阻止任何 User Agent 的访问。如果要同时阻止一个以上,则代码如下: RewriteCond %{HTTP_USER_AGENT} UserAgentA [OR] RewriteCond %{HTTP_USER_AGENT} UserAgentB 你可以根据需要添加更多 User Agent 字段,确保每一行换行处使用 [OR] 来标示。 去除查询字符串 比方说,网站上除首页以外的其他网页 URL 地址格式如下,以查询字符串区分: http://www.mangguo.org/home.html?example=12345abcd 这些地址格式都不是很漂亮,更重要的是,搜索引擎会显示一堆重复地址的网页。如果想摆脱 URL 地址中的查询字符串,请使用以下代码: RewriteCond %{QUERY_STRING} example= RewriteRule (.) http://www.mangguo.org/$1? [R=301] 这不仅摆脱了查询字符串,而且去除了前面的问号。 预设图片 一旦无法找到图片,使用默认的预设图片替换,以防止出现丑陋的红叉,使网站显得更加专业。代码如下: RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^images/..jpg$ /images/default.jpg [L] 当然,也可以改变采用其他图片格式。保证你有一个实际存在的 “default.jpg” 或其他名称的预设图片。 防止盗链 被其他网站盗取内容或图片,是网站所有者最苦恼的事情。而且图片盗链浪费了大量的服务器带宽资源。下面是一段阻止盗链的简单代码: RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www.)?mangguo.org/ .$ [NC] RewriteRule .(gif|jpg|swf|flv|png)$ /feed/ [R=302,L] 请务必改变将 “mangguo.org” 更换为你自己的域名。 重定向到维护页 如果需要维修网站并使站点下线,可以将整个网站重定向至维护页面(或其他页面),代码如下: RedirectMatch 302 ^/ /maintenancepage.html 请将 maintenancepage.html 更换为所需网页名称。 重定向多个域名至单一域名 如果你有多个域名指向你的网站,很可能会在搜索引擎中出现重复内容。使用以下代码将多个域名重定向至单一域名: RewriteCond %{HTTP_HOST} ^www.mangguo.org$ [NC,OR] RewriteCond %{HTTP_HOST} ^mangguo.org$ [NC,OR] RewriteCond %{HTTP_HOST} ^www.mangguo.org$ [NC] RewriteRule ^(.)$ http://mangguo.org/$1 [R=301,L] 谨记文件系统的优先性 服务器上的文件系统始终优先于 URL 地址重写。比如有一个名为 “services” 的文件目录,存放一个名为 “design.html” 的文件。则无法将该 URL 重定向至 “http://www.mangguo.org/services",因为 Apache 忽略重写代码直接转向 “services” 目录。要解决此问题,只需重命名目录即可。 英文原稿:10+ Mod_Rewrite Rules You Should Know | Noupe 翻译整理:10 个你应该知道的 mod_rewrite 规则 | 芒果 ...

2009-09-06 · 2 min · 237 words · Me

[轉]Distributed Key-Value Database

http://blog.gslin.org/page/2/ 這篇是因為在 PIXNET 內講了 n 次,決定寫成文字,至少之後新人進來可以說「就看這篇」,避免整套系統都需要重新講一次。 對了,補充一下,PIXNET 還是有缺人,參考「缺人找人」這篇的內容,如果有想問的細節,可以寫信問我。 資料庫 在 RDBMS 提供了很多而且很豐富的操作方式,但當資料量愈來愈大時,會遇到單台機器的網路頻寬有限以及空間有限。這時候一定得走向多台的架構。 Replication 最容易解決的情況是「讀取的 query 比寫入的 query 多」,可以用 database replication 解決,這也是 Web 1.0 網站常見的解法之一 (另外一種常見的解法是使用靜態檔案,或是 reverse proxy cache),同步將資料複製到多台。 Memcached 接下來會發現當 slave 過多時會造成每台記憶體內重複 cache 相同的元素,也就是說,有二十台 slave,每台都有 SELECT * FROM user WHERE name = ‘gslin’ 的結果其實很浪費資源。不過這個問題可以用memcached 或是 hash selection 解決。 Sharding 在 Web 2.0 的環境裡,User generated content 成為主流,當寫入的 query 超過單台可以負荷的量時,replication 的架構就不是很適合了,因為每個寫入的 query 在其他台 slave 上也會被執行。在商用資料庫的領域通常是使用 cluster 架構,在 open source 領域的 MySQL cluster 也是 cluster-based solution,不過用的單位還不是很多,而且 overhead 還蠻重的。 比較常見的解法是 sharding:依照 id,把資料拆散到各台。像是 Flickr 就是這樣使用。 但 sharding 就會少了很多 RDBMS 可以用的特性 (JOIN 與 transaction),在寫 application server 或是 library 的時候得花功夫多下幾次 query,並且注意資料的正確性。 上面這些方法在 2005 年 Brad Fitzpatrick (LiveJournal founder、memcached 作者) 的投影片「LiveJournal’s Backend: A history of scaling」都有提到。 Sharding 是一個解法,但有不少缺點: 需要 application server 或是 library,否則 3rd party 程式得清楚知道 sharding 的架構,才會知道資料要到哪個 cluster 找。 無法隨意使用 JOIN 及 transaction。如果真的要 JOIN,設計時要想辦法把需要 JOIN 的資料放在同一台 database server。如果要跨機器 transaction 得透過 2PC 甚至 3PC (看需求),或是類似的 distributed transaction protocol,效能會比起同一台機器差很多。 設計 schema 時必須注意當一個 cluster 愈來愈大時要 rebalance,或是更進一步,在一開始設計時就考慮到資料搬移的問題。 Key-Value Database 後來就有不少人注意到,Web 2.0 網站很多時候不需要 transaction,而 JOIN 也會儘量避免。透過多次 SELECT 拉資料,或是 denormalize 以提高效能的方式還蠻常見。(JOIN 保證 atomic,而且會因為 query analyzer enginer 在沒有正確分析的情況下會有大量的 random access,比多次 SELECT 耗資源) 另外一個是財務層面上的問題,一開始寫的時候通常也都只有一組 database server,不太可能一次就買兩組 database server。當成長到需要 sharding 時通常寫 code 的人已經不只一個人,一定有人偷懶使用 JOIN 或是其他無法 sharding 的程式。這時候會發現需要「重寫」而非「改寫」。 於是就有人開始思考,如果我放棄 RDBMS 的 JOIN 與 transaction,放棄到只剩下 key-value 的架構,是不是有辦法可以發展一套 distributed database system 可以取得 “incremental scalibility” 的特性 (白話的說就是「加機器就可以增加承載量」),再想辦法看看在這個系統上還可以加什麼功能。 也就是說,這樣的系統一開始可能只有兩台小台的機器 (為了 HA),同時跑 Web 與 Database,當網站愈來愈大的時候我把這些小機器拉到前端跑 Web,或是轉為開發機使用,本來的 Database 買 15KRPM SAS (為了 cache miss 的 seek time 與 latency) 與 64GB RAM (還是為了 cache hit 降低 latency)。 所以在 distributed key-value database 先有基本的功能: GET(key) SET(key, value) DELETE(key) 有了這三個功能,至少你可以把本來在 RDBMS 裡很大一部份放到 Key-Value Database 裡。以 Blog 來說,可以把所有的標題及內文部份放到 Key-Value Database 內,大幅減少 RDBMS 的 cache 負擔。 或者,key 是 path + filename,value 是檔案內容,當作一個 filesystem 在用。(也就是 Amazon S3) 這樣對於前端寫程式的人就會簡單許多。整個 Key-Value Database 是一朵可以無限擴充的雲,前端程式不需要設計或是修改程式碼就可以一直發展。如果當作 Filesystem 就不用擔心 disk 滿了之後加機器需要停機。 在這個想法下,就有許多單位投入資源往 distributed key-value system 發展。經過這些年的發展,分散式資料庫主要有三個問題要解決,而且也被證明這三個問題無法同時解決 (被稱為 CAP theorem,參考 Brewer’s Conjecture and the Feasibility of Consistent Available Partition-Tolerant Web Services, 2002 這篇原始論文,或是參考比較簡單易懂的說明「Brewer’s CAP Theorem」): Consistent Availibility Partition Tolerance 所以分散式資料庫得在這三個條件內取捨。目前比較熱門的 Distributed Key-Value Database 主要都是把 Consistent 放寬到 “Eventally Consistent“,只保證資料「遲早會一致」,這些 Database 包括了HBase (Yahoo!)、Cassandra (Facebook) 這兩套 Java-based 分散式資料庫。 要瞭解這兩套系統的架構,一般建議從「Amazon’s Dynamo」這篇開始看,看完後再看這兩套系統的系統架構介紹,以及 mailing list 的討論。 這兩套除了基本的 Key-Value 外,還多了 Column 的觀念,彈性會比 Key-Value 好一些。Yahoo! 與 Facebook 都拿這個系統當 Search Engine 使用。 另外有一些比較單純的分散式系統,只有 Key-Value 而沒有 Column 的,在「My Thoughts on NoSQL」這篇文章裡對 CouchDB、Redis 自稱 distributed 的嘴炮批評了不少。另外「Anti-RDBMS: A list of distributed key-value stores」介紹了很多。 大致上是這樣。 ...

2009-09-06 · 2 min · 346 words · Me

Datatable jquery

Datatables jquery 最近剛好在利用,因為server-side用php,改寫成asp 底下是參考的code '*** 底下為server-side SQL處理 ***** 'sql變數儲存的為原本sql語法 sql = "select xxx from xxx" if not isnull( Request.QueryString("iSortCol_0")) then sOrder = "ORDER BY " for i=0 to Request.QueryString("iSortingCols" ) - 1 sOrder = sOrder & fnColumnToField(Request.QueryString("iSortCol_" & i) ) & " " & Request.QueryString("iSortDir_" & i)) & ", " next sOrder = left( sOrder, len(sOrder) - 2 ) end if '/* Filtering - NOTE this does not match the built-in DataTables filtering which does it ' * word by word on any field. It's possible to do here, but concerned about efficiency ' * on very large tables, and MySQL's regex functionality is very limited '*/ sWhere = "" if Request.QueryString("sSearch") <> "" then sWhere = "WHERE search_column_name LIKE '%" & replace(trim(Request.QueryString("sSearch")), "'", "''") & "%' OR " &_ "search_column_name LIKE '%" & replace(trim(Request.QueryString("sSearch")), "'", "''") & "%' " end if sQuery = "SELECT column_name " &_ " FROM (" & sql & ") a " &_ sWhere &_ sOrder '*** 這段是分頁處理 ***** 開始 pagesize = Request.QueryString("iDisplayLength") '每頁大小 page = fix(Request.QueryString("iDisplayStart") / pagesize) + 1 '這段比較有問題,可能有錯 set cmd = server.CreateObject("ADODB.Command") cmd.ActiveConnection = Conn cmd.CommandType = 4 'adCmdText 1; adCmdTable 2; adCmdStoreProc 3; adCmdUnknown 4; adStroeProducure cmd.CommandText = "sp_xxx_store_procedure" 'cmd.Parameters 欄位, 類型, 回傳|輸入|輸出, 長度, 值 'adChar adInteger '1:adParamInput 2:adParamOutput輸出參數 3:adParamReturnValue返回值 cmd.Parameters.Append cmd.CreateParameter("@SqlCommand", 8, 1, 4000, sQuery) cmd.Parameters.Append cmd.CreateParameter("@CurrentPageIndex", 4, 1, 4, page) cmd.Parameters.Append cmd.CreateParameter("@PageSize", 4, 1, 4, pagesize) cmd.Parameters.Append cmd.CreateParameter("@PageCount", 4, 2, 4, pageCount) cmd.Parameters.Append cmd.CreateParameter("@recordCount", 4, 2, 4, recordCount) set rs = cmd.Execute rs.close pageCount = cmd.Parameters("@PageCount").value recordCount = cmd.Parameters("@recordCount").value if pageCount = 0 then pageCount = 1 if page > pageCount then response.Redirect("?page="&pageCount) end if rs.open set rs = rs.NextRecordSet if not rs.eof then '有值才取出來 arr_mn = rs.GetRows '(欄位,第幾列) StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr end if rs.close set rs=nothing '*** 這段是分頁處理 ***** 結束 '/* Paging */ '使用上面的分頁 iFilteredTotal = recordCount '這個也可能有問題 iTotal = recordCount sOutput = "{" sOutput = sOutput & """sEcho"": " & Request.QueryString("sEcho") & ", " sOutput = sOutput & """iTotalRecords"": " & iTotal & ", " sOutput = sOutput & """iTotalDisplayRecords"": " & iFilteredTotal & ", " sOutput = sOutput & """aaData"": [" sOutput = sOutput & datatable_sdata(arr_mn) & "]}" response.write sOutput function fnColumnToField( i ) '這是放datatables的column,要order欄位 if i = 0 then fnColumnToField = "sort_column_name_1" elseif i = 1 then fnColumnToField = "csort_column_name_2" end if end function 'sp_xxx_store_procedure 為底下程式碼 CREATE PROCEDURE [dbo].[sp_xxx_store_procedure] @SqlCommand NVARCHAR(4000), @CurrentPageIndex INT, @PageSize INT, @PageCount int=0 out, @recordCount int=0 out AS SET nocount ON DECLARE @curl INT, @rowcount INT EXEC sp_cursoropen @curl output, @SqlCommand, @scrollopt=1, @ccopt=1, @rowcount=@rowcount output set @recordCount = @rowcount set @PageCount = ceiling(1.0*@rowcount/@PageSize) --SELECT ceiling(1.0 * @rowcount/@PageSize) as 總頁數, @rowcount as 總筆數, @CurrentPageIndex as 目前頁 --SELECT ceiling(1.0 * @rowcount/@PageSize) as totalpages, @rowcount as totalrecords, @CurrentPageIndex as nowpage SET @CurrentPageIndex = (@CurrentPageIndex - 1) * @PageSize + 1 EXEC sp_cursorfetch @curl, 16, @CurrentPageIndex, @PageSize EXEC sp_cursorclose @curl SET nocount OFF GO 'asp內的function function datatable_sdata(arr) '串dataTable用的data if isarray(arr) then rows_mn = ubound(arr, 2) '取得recordset 的記錄行數' 2代表第2維陣例-幾例 for i=0 to rows_mn arr(0,i) = replace(arr(0,i), chr(13)&chr(10), "") '去掉換行 coumn_1 arr(1,i) = replace(arr(1,i), chr(13)&chr(10), "") '去掉換行 coumn_2 str = str & "[""" & arr(0,i) & """, """ & arr(1,i) & """]," & chr(13) & chr(10) '有沒有chr(13)或chr(10)都行 next datatable_sdata = left(str, len(str)-3) 'chr(13)+chr(10)+, end if end function

2009-09-06 · 3 min · 533 words · Me

測試網頁工具

附上三套測試網頁工具,從外國連線測試,最準啦! 以 http://www.mjj.hk/ 為例 http://tools.pingdom.com 測試結果10 seconds載完,104檔圖……太多了吧! http://webwait.com 讀10次網站 平均1.5秒 http://loadimpact.com 這個最暴力,最浪費時間,以10 clients 11.7s

2009-09-06 · 1 min · 14 words · Me