2010年1月29日 星期五

[桌面相關] XP 字體大改造!讓你的系統字型變得跟 MAC 一樣漂亮

本方法由《Jackbin 的懶人筆記本》提供。

Windows 一直以來都是以新細明體的面貌跟大家見面,不是作業系統或是網頁幾乎預設都是以這個字型居多,想必大家也都看習慣了吧!除了 Windows 之外, 蘋果 MAC 的內建字體受到許多網友的愛戴,但可惜都沒有簡單的方法能將蘋果字體套用到 Windows 裡作為系統字型,以至於大家都只能遠觀而不可褻玩焉。

透過 GDI++ 這套程式以及設計好的安裝批次檔,只要簡單的六個步驟就可以把新細明體換成蘋果的字體,安裝完成後的 XP 會變成這樣…




檔案下載:http://www.mediafire.com/?l2mywdwnmny

注意:如果你已經有安裝 GDI++ ,請先把他們移除,(包含【開始】 → 【所有程式】 → 【啟動】 → 【gditray.exe】)



Step 1

將下載下來的檔案解壓縮到 C 槽。



Step 2

接著打開 GDI++ 資料夾裡的「Font」→「_Replacer」資料夾,並點兩下滑鼠左鍵執行「Replacer.cmd」執行檔,會出現一個黑色的 DOS 視窗。



Step 3

開啟「C:\Windows\Font\」資料夾,找到「MingLiu&PMingliU」這個字型檔案(就是細明體&新細明體)。找到後用滑鼠左鍵選取該檔案後,拖曳到剛才開啟的黑色 DOS 視窗裡。

注意:拖曳檔案前先將該字型檔案複製到其他地方做備份。

這時 DOS 視窗理會顯示出這個字型的所在位置。按【Enter】下一步。



Step 4

將「C:\GDI++\font\iLihei」或「C:\GDI++\font\華文黑體」資料夾裡的「MINGLIU.TTC」字型檔拖曳到黑色 DOS 視窗,然後按【Enter】


(圖片引用自 Jackbin 的懶人筆記)

此時會出現「Continue? 」,在鍵盤上按「Y」然後按【Enter】。完成後會出現【Press any key to quit.】按任意鍵推出。


(圖片引用自 Jackbin 的懶人筆記)

Step 5

接著將「C:\GDI++\font」資料夾裡的「wt064.ttf」字型檔複製到「C:\Windows\Font\」資料夾裡面。

Step 6

最後,開啟「C:\GDI++\Registry」資料夾,執行裡面的「install_gdi++reg.bat」,這是要讓系統在開機時自動啟動 GDI++的步驟。

完成之後就重新啟動電腦吧!你會發現一切都變得不大一樣囉!




結果就是變成這樣:



不錯吧!

▍還原方法
(感謝網友 Leo 提供)

方法如下:

開啟「控制台」\「字型」。
刪除「MingLiU & PMingLiU(TrueType)」這個字型。
最後,將先前備份到桌面的「mingliu」字型,拉回控制台的「字型」。
重新開機,OK!

摘自:http://www.soft4fun.net/desktop/change-windows-font-to-mac-is-better-then-origin.htm

2010年1月27日 星期三

分享一個PHP的繁簡轉換類
Post by: LD | On Date: 一月 31st, 2009 | File Under PHP
這是一個很早的php繁簡轉換類,作者 CRLin 于2003年寫就,目前他留下的網址已不能訪問。原版中只要不同目錄調用就會出現 map 檔不能訪問的錯誤,我加入了 _FILE_DIR 常量,基本已沒有問題。
區別於 javascript方式,使用PHP轉換繁簡,可以方便的寫入資料庫中,其靈活度比較高。如果使用臺灣常用語與大陸常用語的對比map,可以一下子多出個繁文網站,我想做採集的諸位童鞋可能更感興趣。
使用方法:


include "big2gb.php";
$obj=new big2gb;
//簡體 轉換 繁體
$string_big5 = $obj->chg_utfcode($string_gb,'big5');
//繁體 轉換 簡體
$string_gb = $obj->chg_utfcode($string_big5,'gb2312'');


去 Ziddu 網盤下載 http://cn.ziddu.com/download/264698/bg2gb.zip.html
去 RayFile 網盤下載 http://www.rayfile.com/files/ac299599-ef3a-11dd-ba5e-0014221b798a/

喜悅村也有一個簡繁轉換的方法,
不妨一看: http://www.phpx.com/happy/viewthread.php?tid=66381

摘自:http://mifunny.info/share-a-php-class-of-character-conversion-for-gb2312-vs-big5-221.html

PHP minify

Combines, minifies, and caches JavaScript and CSS files on demand to speed up page loads.

Minify is a PHP5 app that helps you follow several of Yahoo!'s Rules for High Performance Web Sites.

It combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers.

官網:http://code.google.com/p/minify/

Google的YSlow——Page Speed

先来看界面吧

和YSlow一样,“Page Speed”也是一个基于firebug附加组件的FireFox插件。虽然听起来有点拗口,但是意思很容易理解:如果你想用“Page Speed”,那么你就要安装firbug,而firebug是FireFox的一个附加组件,所以你也必须按照FireFox浏览器。同时另外一个意思是:IE!NO!Sorry!

“Page Speed”有两个面板,分别是“Page Speed”面板和“Page Speed Activity”面板。

“Page Speed”面板

Page Speed附加组件的Page Speed面板
和YSlow使用Yahoo的14条标准来衡量网页的综合速度一样,Page Speed通过Google指定的20条标准来衡量网页的综合速度。而Page Speed面板就是用来展现你的网页在Google20条标准上的得分。“Page Speed”通过分析你的网页加载、呈现速度,用20条标准来衡量,最终告知你的网页速度如何、哪种标准得分多少、问题所在、如何改进等信息。

“Page Speed Activity”面板

Page Speed附加组件的Page Speed Activity”面板
“Page Speed Activity”面板用于展现你的网页加载各种元素的所用时间,这样,你就可以更明确的知道到底是谁在浪费、占用大量的时间,从而更有针对性的进行改进。不同的阶段占用的时间,用不同的色块进行表示,恩,真是贴心的设计。

“Page Speed”的20条衡量标准

如果你对YSlow比较熟悉的话,那么一定会知道YSlow用于衡量网页速度的14条标准,而“Page Speed”有20条衡量标准,那么他们之间的到底有什么不同呢?Google又会给我们带来什么新的观点呢?

补充一下:如果你对YSlow的14条衡量标准不熟悉的话,您可以阅读一下,我以前写的两篇文章,分别是《如何提高网页的效率(上篇)——提高网页效率的14条准则》和《如何提高网页的效率(下篇)——Use YSlow to know why your web Slow》,文章较为详细的介绍了YSlow这个工具的使用,以及YSlow的14条衡量标准。这两篇文章同时也被收录到了《博客园精华集-web标准之道》一书当中。

继续补充:如果你想非常详细的了解YSlow的14条衡量标准的超详细讲解,那么你可以购买一本书,书的名字叫做:《高性能网站建设指南》,书的封面是一条经常出现在《人与兽》一类电影中的那种狗狗。


高性能网站建设指南
OK,不扯那么多了,让我们回到正题:“Page Speed”的20条衡量标准到底是什么呢?

Put CSS in the document head
将你的CSS样式表文件放在整个页面的头部。没有什么难理解的。css先下载下来,就能更快的渲染网页效果。从而让人们感觉网页速度很快。

更多关于"Put CSS in the document head"的更多详细解释,请看官方文档。

Use efficient CSS selectors
使用效率更高的CSS选择符。举个很简单的例子:尽量不要使用*号选择符:
*{padding:0;margin:0}
像这样的得分会很低,正确的办法应该是只对你想设置的标签元素进行设置,例如:
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
}
如果你对本条有更多的兴趣,可以去看Use efficient CSS selectors官方文档的详细解释。

Leverage proxy caching
代理缓存。这个名词听起来好像很屌的样子,以至于我也是查了资料才知道:所谓proxy cacheing,就是一种公共缓存,用于静态资源,允许浏览器从最近的代理服务器上,而不是从远程的原始服务器,下载这些静态资源。这些代理服务器,通常而言就是有ISP,接入服务商所提供的。

这样的代理服务器缓存可以让通过同一ISP接入服务的用户共享这些静态资源,而节省原始服务器的带宽,以及下载速度也会大大提高,特别是对于局域网的用户有特别的好处。

关于“Leverage proxy caching”的文档资料,请看官方文档的详细解释。

Minify JavaScript
最小化JavaScript脚本。这个貌似没有什么好说的,压缩一下你的JavaScript脚本吧。

关于“Minify JavaScript”的更多文档资料,请看官方文档的详细解释吧。

Optimize images
优化图片,其实最经常使用的就是css script了,也有翻译为“css精灵”的,虽然翻译的很美好,但是其实很简单,就是将多个图形,放在张图片文件中。这样,可以有效的减少http请求的数量。

如果你对“Optimize images”有更多的兴趣,可以看这个。一个css cript的示例: 《【CSS翻转门】技术实例讲解(附源码下载)》。

Minimize cookie size
最小化你的cookie。cookie的确是个好东西,他可以让你在用户的客户端保存一些东西,但是,千万不要什么都往用户口袋里面塞。原因很简单,cookie大小有限,有最大限制,而且cookie过大会减慢网页呈现的速度。另外为了安全性考虑,也不要把所有的什么破铜烂铁都塞到cookie里面。

关于“Minimize cookie size”的更多文档资料:看这里。

Enable gzip compression
使用gzip压缩。详细这个大家应该已经比较熟悉了。说白了就是服务器向浏览器发的是经过压缩的页面,这样传输的字节就会大大减少,速度自然也就快了。


这幅图说明了gzip技术的工作原理
欲了解更多的“Enable gzip compression”资料,请看官方文档。

Combine external JavaScript
合并外部的JavaScript文件。道理很简单,依然是为了少读取.js文件,从而有效的减少http请求数量。


合并外部的JavaScript文件可以有效的减少http请求数量
更多的关于“Combine external JavaScript”的文档,可以看这个。

Minimize DNS lookups
最小化DNS查询。详情请看这个:Minimize DNS lookups规则详情。

Optimize the order of styles and scripts
优化样式表和脚本的顺序。如果你要是看过老赵的《挣脱浏览器的束缚》系列的话(本系列也已经收录到《博客园精华集-web标准之道》一书中)。就知道IE浏览器对同一个域名下的文件,同时只能下载2个文件。所以,到底先让哪些样式表先下载下来,让哪些脚本先下载下来,这个顺序就非常重要了。所以,如果有可能,请重视一下样式表和脚本的顺序吧。推荐的做法是:将css放在js文件上面,让css文件先被加载,这样就可以先让网页渲染出来,从而加快浏览者的感知速度。


IE浏览器对同一个域名下的文件,同时只能下载2个文件
关于“Optimize the order of styles and scripts”更多详情,请看这个。

Serve resources from a consistent URL
相同的资源,使用相同的url地址。道理很好理解,如果是相同的一张图片,就不要东方一下,西方一下,然后引用的时候使用不同的url地址。为什么要这样做,道理也很简单,因为——缓存!

更多“Serve resources from a consistent URL”详情,请看这里

Avoid CSS expressions
避免CSS表达式。这个我在《如何提高网页的效率(上篇)——提高网页效率的14条准则》一文中也有讲到。现在需要补充的是:IE8已经不再支持css表达式功能。

关于“Avoid CSS expressions”,更多详情看这里。

Parallelize downloads across hostnames
通过不同的主机同时下载网页资源。这个的道理已经在“Optimize the order of styles and scripts”这一准则中讲述过。道理依然是老赵的《挣脱浏览器的束缚》提到的原因:IE浏览器对同一个域名下的文件,同时只能下载2个文件。

更多关于“Parallelize downloads across hostnames”的详情,可以看这个。

Combine external CSS
合并外部的css文件。这条和“Combine external JavaScript”准则的道理一样。还是为了减少http请求数量。

关于“Combine external CSS”的更多详情,可以看这个。

Specify image dimensions
明确的指明图片的高度和宽度。很久很久以前,long long ago。一个同学问我:“明确的指明图片的宽度和高度,是否能加快页面的渲染速度?”当时我的答案是:“这个应该没有关系吧!”。看来,当时的我是误人子弟了。明确的指出图片的高度和宽度,能够有效的加快浏览器在渲染图片周围布局和绘制呈现时的速度。

更多关于“Specify image dimensions”的详情,可以看这里。

Minimize redirects
尽量避免重定向。道理很简单,你从A地点到你的同事B先生家,到了那里,他的邻居告诉你,B先生已经搬家了,搬到了C地点,于是,你又跑到C地点,然后C地点有个人告诉你,B先生现在又搬家了,已经搬到了D地点。于是你又跑到了D地点,才找到了这个B同事。而这个装B的B同事,告诉你,你如果直接就来D地点,就不用那么麻烦了,而且速度也会更快一些。网页的跳转和重定向的道理是一样的。

关于“Minimize redirects”的详细文档,可以看这里。

Defer loading of JavaScript
延期加载JavaScript。这个听起来真是个高科技的东西呀。其实这玩意还真是非常的有效呀。不仅可以延期加载脚本,像一些大的图片、flash也都可以延期加载。其实实现原来也不是很难,就是先不加载一些比较大的东西,当页面加载完毕后,再加载那些东西。

关于“Defer loading of JavaScript”的更多详情,请看这里。

更多相关资料

关于“Page Speed”的更多相关阅读。重要的下载链接在这里:点击进入Page Speed下载页面,支持现在最新的FireFox3.5.2版本。

摘自:http://www.cnblogs.com/JustinYoung/archive/2009/08/10/Page-Speed-Google.html

2010年1月25日 星期一

Linux SSH自動登入

狀況:A主機想要SSH到B主機(192.168.1.4),自動登入無需輸入密碼

步驟如下:
1.在A主機

[root@www ~]# cd /root/.ssh
[root@www .ssh]# ssh-keygen -d
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
8f:f7:45:87:a0:11:a2:a7:ec:88:45:e8:33:21:35:3f root@www.andowson.com

#產生兩個檔案:id_dsa和id_dsa.pub
[root@www .ssh]# ls -la
總計 24
drwx------ 2 root root 4096 11月 10 11:39 .
drwxr-x--- 7 root root 4096 10月 20 14:13 ..
-rw------- 1 root root 668 11月 10 11:39 id_dsa
-rw-r--r-- 1 root root 611 11月 10 11:39 id_dsa.pub
-rw-r--r-- 1 root root 2794 10月 9 22:41 known_hosts

#2.將id_dsa.pub傳到備份主機B的/root/.ssh目錄下
[root@www .ssh]# scp id_dsa.pub 192.168.1.4:/root/.ssh/id_dsa_XXX.pub
The authenticity of host '192.168.1.4 (192.168.1.4)' can't be established.
RSA key fingerprint is e2:61:f0:78:31:21:72:ce:06:dd:da:02:f1:41:05:ec.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.4' (RSA) to the list of known hosts.
root@192.168.1.4's password:
id_dsa.pub 100% 611 0.6KB/s 00:00

3.將B主機的/root/.ssh/id_dsa_XXX.pub新增至/root/.ssh/authorized_keys
[root@www .ssh]# cat /root/.ssh/id_dsa_XXX.pub >> /root/.ssh/authorized_keys

Shell Script 用 Perl 做 Search and replace

一些用靜態 HTML 編寫的網站,如果要將每一頁的特定文字更新 (例如 copyright),要逐頁逐頁更改真的十分麻煩。這個問題有幾個解決方法,其中一個是在指令模式用 perl 來做替換,例如:


perl -pi -e 's/src_str/new_str/g' *.html

以上指令會將目錄下所有 .html 尾的檔案更新,用 "new_str" 替換 "src_str"。

Deny access to .svn directories



Order allow,deny
Deny from all

Symbian S60: QR Code reader

開始玩 Symbian 後簡直欲罷不能,今天又收到了加買的KingSton 2G MicroSD 卡,更是肆無忌憚的開始嚐試很多不同的軟體。

之前已經先玩了Papago for Symbian,有空再來寫好了,今天先來看QR Code。

QR Code 其實在日本已經流行一陣了,不過台灣好像用的還不普遍,今天上網還沒找到solution時,順手(MSN是用手沒錯)問了一下CHT的朋友,他說CHT有提供,但要手機上網下載,網址是http://qr.idv/download,這裡不做連結是因為要用手機上線,我想應該沒有人是用手機看這一篇的,就沒放連結了。聽到CHT有solution,不管三七二十一...不是啦,不管我的Wifi不通,3G還是給他上線download了。

結果呢?下載後竟然沒有自動安裝,只存出一個 .cab 的檔案,不信邪的我又下載一次,一樣槓龜,白白被CHT賺了兩次3G傳輸費。

後來上網找到QuickMark這個solution,並且針對各手機都有對應的reader(當然要有辦法執行程式的),一試之下效果驚人,通常連對準都沒對準,正確結果已經出現了,好神奇,原來reader軟體有這般能耐,太了不起了。

下面是我的網址,用KAYWA網頁做出來的,有興趣的不妨一試。

摘自:http://johnptc.blogspot.com/2007/08/symbian-s60-qr-code-reader.html

2010年1月24日 星期日

[Debug]公司的Labs的linux用ssh有時可以登入Server,有時候無法登入,大部分都無法登入

這問題找了好久,
最後才發現是因為公司的linux重灌後,又用回原來的IP
灌致Server上的~/.ssh記錄錯亂

解決方法,將Server上的~/.ssh目錄移除即可

2010年1月20日 星期三

Caching with mod_headers 1.3|2.0|2.2


# 3 Month

Header set Cache-Control "max-age=7257600"

# 1 Week

Header set Cache-Control "max-age=604800"

# 10 Minutes

Header set Cache-Control "max-age=600"

# NONE

Header unset Cache-Control
Header unset Expires
Header unset Last-Modified
FileETag None
Header unset Pragma



摘自:http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html

2010年1月19日 星期二

[MySQL]今天在Labs中架設另外一台一模一樣的MySQL環境

因為舊的MySQL環境的空間不足
今天在Labs中架設另外一台一模一樣的MySQL環境
所以直接用scp將/usr/local/mysql/var中的所以資料庫搬移過去
shell > scp -r -p database1 database2 ... labs_user@labs_ip:/usr/local/mysql/var

移完後再把所有chown & chmod設成跟舊的MySQL一樣即可正常work
shell > chwon -R mysql:mysql database1 database2 ...
shell > chmod -R 660 database1/* database2/* ...

TimThumb:PHP縮圖程式



TimThumb原本是應用在Mimbo Pro這套WordPress佈景主題裡面的PHP縮圖程式,後來開發團隊將它獨立為一個開放原始碼專案,造福更多的使用者。

TimThumb用更精簡的程式碼來達成phpThumb的功能,並且加入PNG和GIF圖檔的支援,也使用快取來提高程式的效能。

使用時請將TimThumb.php引入後,使用以下語法載入網站上的圖片:




參數的意義如下:

w: 縮圖寬度
h: 縮圖高度
zc: 是否裁切圖片 (0 或 1)
q: 壓縮品質 (預設為 75,最大值為 100)
而其他需要注意的事項有:

請開啟主機上的GD library。
程式會在所在位置建立名為「cache」的子資料夾,如果主機權限不允許的話,請手動建立同名資料夾,並將此資料夾權限設定為 777。
此外,TimThumb所在的資料夾,其權限也需要開到 777。
如同範例網頁顯示,請使用絕對路徑來表示程式和圖片的位置。
想要更加快圖片載入速度的話,請將這些規則加到你的 .htaccess檔案中。

RewriteEngine on
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]
最近放假,窩在看一些大型 Conference 的 Slides 和 Videos,翻到 Qcon 2008 的這場 Talk:YELLOWPAGES.COM: Behind the Curtain,覺得蠻有意思的,看完 talk 以候趁著印象新鮮把重點摘要下來。

一般人對於 Rails 既定的印象都是只能拿來 prototyping,或者是 startup 開站時搶快,將來網站長大了之後,再用其他語言進行改寫的選擇( 即使許多名列前茅的 Facebook Application 都是使用 Rails 撰寫,每天擁有上千萬的 Pageviews。開發者對於 Scale 這件事還是內心存疑。)。更不用說使用 Rails 來改寫大型 production site….。

然而,YellowPages.com 卻這麼做了。

YellowPages.com 是 AT&T 旗下的一個事業( local yellowpage )

* Alexa 的排名在全球 600 名左右
* Daily Pageview 是每日 300 萬左右
* More than 48 million requests / day
* More than 1500 requests/ second
* 每日大概有 200 萬次的 Search
* 每個月有 2500 萬的 unique vistor
* 舊版純然使用 Java 開發 ( 架構圖 )
* 新版 ( Ruby on Rais ) Since 2007/07/04

在新版本上線運行一年之後,YellowPages.com 的首席架構師 John Straw 道出了當初改版的背後故事以及技術細節。

為什麼要改寫?

* 原先的網站是由一群顧問在 2004-2005 年用 Java 寫的。寫完就跑了…
* Fundamental design problems
* Code 大概有 125K 行,但是一堆 copy-and-modify 混雜 :/
* Absolutly No Test ( Code) !
* 想加新功能非常非常非常的困難 ….

於是就開始策劃改寫了 …

改寫的目標

* 換掉 Java Application Server
* 重新設計介面
* 改寫的時候順便加功能

新站的架構需求

* Absolute control of urls - Maximize SEO crawl-ability
* No sessions: HTTP is stateless
* Be agile: write less code
* Develop easy-to-leverage core business services

當中經過的 Survey 過程 ( Ruby / Python )

2007/1 - 2007/3 花了三個月嘗試各種架構 ( Ruby / Python ) ,最後花了四個月用 Rails 撰寫了新版…

*第一版 -> Web Tier : Rails ( fat controller ) , Service Tier -> Python
*第二版 -> Web Tier : Rails ( thin controller) , Service Tier -> Python
*第三版 -> Web Tier : Django , Service Tier -> Python
*最終版 -> Web Tier : Rails , Service Tier -> Rails

最後選擇 Rails 的原因

1. 他們 team 最好的 python developer 剛烙跑 Q_Q…
2. Platform maturity ( important )
3. Better automated testing integration ( also )
4. A clearer path to moving parts of it to C if necessary for performance ( also )
5. The development team simply felt more comfortable with it.

機器配置的考量

不過還有一些事,因為是前所未有的改版。他們對以下這些問題也有疑問…

1. 需要多少台機器
- 原先 Java 版 的架構是 21 台。Rails 版總共用了 23 台( Web Tier 17 台、Service Tier : 6 台)。DB ( Oracle ) 2 台。
- 所有的機器都是裝 CentOS 5, 只有 DB 是裝 Solaris ( John called Solaris “a mistake they wouldn’t repeat,” not because of any particular problems with it but because of a lack of system administrators in their organization who had experience with it. XDDDDDDDDDD).
2. 一台機器要跑幾隻 mongrel
- Web tier: 16 隻 , Service tier: 30 隻
3. 要準備多少記憶體給 memcached 用
- 4G
最後架構 :


Performance optimization

主要的 performance goal :

*Sub-second home page load time
*4-second average search time
*Never dies

1. 考慮過 HAProxy and Swiftiply 但是最後選了 F5。(因為他們手上有 F5 而且熟悉操作…)
2. 自己寫了 Mongrel Handler 把 request 挑出來從 Web Tier 直送到 Servie Tier 而不經過 Rails …
3. 自己寫了 C library 去 parse search cluster 的結果轉成 hash
4. 在 Web Tier 方面,選了 Erbuis 去 render view
5. 遵照 Yahoo performance guidelines 去 tune 前端 ( 比如說 minified javascript, 把 css / js 包成一支 , 將 image 移到 Akamai 上等等… ) , 將 Prototype 換成 jQuery.
6. Apache was slow serving the 42-byte single-pixel GIFs that they use as analytics tags,他們去挖掘了原因之後換成了 Nginx。( John 還氣憤給出了結論 : Apache is unsuitable for any production enviorment, in general XDDDDDDD)

經過這樣的 Tuning 以後,已經比以前 Java 版快上不少了,他們對這樣的改版結果很滿意。至於上線後前六個月,他們反而卡 DB 問題比較居多…

對於 Slow request 的解決之道

1. Slow requests in the web tier caused mongrel queueing
所以自己幹了 qrp ( query reverse proxy ). Establish a backup pool where requests get parked until a mongrel is available (跟在 Nginx 上設 maxconn 為 1 ,其餘的 queue 住的作法類似)
2. Experimented with different malloc implementations
3. Started using a custom MRI build — ypc_ruby ( MRI 是指 Matz 版 Ruby 也就是一般 Ruby , 他們自己的 ypc_ruby 版本是對原版 Ruby 打上自己需要的 patch )
4. Started using a slightly-customized Mongrel

Ruby not Rails

1. 之後會嘗試把 Service Tier porting 到 Merb 去
2. Supporting development of Waves ( 他們 hire 了 Waves 的開發者 )

改版完畢感想

滿意啊!!

觀眾提問

演講結束之後觀眾提了蠻多問題,也相當精采.. XD (太多了挑一些我覺得有興趣的整理出來…)

Q: 為什麼要用 Oracle ?
A: 因為 AT&T 有買 License..想不到什麼理由不用 XD

Q: 你們會 memory leaking 嗎?你們的 mongrel 的 uptime 多久…
A: 不會!我們沒有這種情形!不過每次我們 deploy 新版本的 code, 會重開一次,大概每隔兩週到一個月會這麼做…

Q: Team 人數 和 開發期?
A: Core Team 大概是四個人(其中只有一個在學校寫過 Rails)。當然還有部分是拆給其他人寫…。至於開發期的問題,在 AT&T 其他部門也有 project 改寫計畫,最後花了 24 個月。我們也以為要這麼久,但用 Rails 改寫 YelloPages 最後花了四個月.

Q: 你們用 ActiveRecord 嗎?
A: Yes

Q: 那表示你們的 db 需要 migrate 囉
A: Yes。重要的 model 有 migrate …

Q: 你們的 Search ranking system ,有想轉 Lucene 嗎?
A: 我們從來沒用過 Lucene,但有想過用 Lucene,我們現在在用的是 FAST。不過不換成 Lucene 是因為我們如果想擁有自己掌控的 search engine,必須先去 hire 一個會寫 Lucene 的人,然後拜託他幫忙加上 Customer Ranking System 上去。但我們自己的 search cluster 已經夠快了 ..可以達到 3600 qps …。但最終目標當然是想要擁有自己能掌控的 search engine。

—-
相關閱讀

YELLOWPAGES.COM: Behind the Curtain(這場 Talk 的投影片)
The Rebuilding and Scaling of YellowPages.com( 這場 Talk 的英文版重點摘要)
My Favorite Quotes from the Yellowpages.com Ruby on Rails Talk ( 外國鄉民對這場 Talk 的感想)
Surviving the Big Rewrite: Moving YELLOWPAGES.COM to Rails ( RailsConf 2008 同一講者,類似主題,但內容面向不同)
At&T Interactive: The Many Facets Of Ruby ( 這一份投影片有 YellowPages 當初轉換過程,一些詳細的架構和數據,值得一讀)

摘自:http://blog.xdite.net/?p=1250

2010年1月10日 星期日

php中由big5轉utf8,iconv不是個負責任的函數

可能是因為你還沒有痛過!iconv這個函數,是很不負責任的,因為他遇到轉不出來的字,就停住了!
我在網路上找到這個函數,稍微改了一下,如果轉不出來的函數,就會變空白,然後繼續轉換字串中所有的字元。
請享用。


function big52utf8($big5str) {
$blen = strlen($big5str);
$utf8str = "";

for($i=0; $i<$blen; $i++) {

$sbit = ord(substr($big5str, $i, 1));
//echo $sbit;
//echo "
";
if ($sbit < 129) {
$utf8str.=substr($big5str,$i,1);
}elseif ($sbit > 128 && $sbit < 255) {
$new_word = iconv("big5", "UTF-8", substr($big5str,$i,2));
$utf8str.=($new_word=="")?" ":$new_word;
$i++;
}
}
return $utf8str;
}


摘自:http://dev.sopili.net/2009/08/phpbig5utf8iconv.html

2010年1月9日 星期六

基層診所 看診時段查詢

http://webap.nhitb.gov.tw/opentime_sel/

2010年1月8日 星期五

RHEL5升級JDK 6 Update 17+Tomcat 6.0.20筆記

RHEL5內建的JDK是gij (GNU libgcj) version 4.1.1的Java 1.4.2,這版本跟一些系統不大合,也稍嫌有點舊,所以趁升級Tomcat 6時順便來換掉,
一般RHEL 5目前都僅支援到Apache Tomcat 5及JRE 5, 無法以yum安裝,以下為更新步驟:

1.安裝JDK

目前最新版本是JDK 6 Update 17,請到此下載
http://java.sun.com/javase/downloads/index.jsp

安裝JDK,回答完Yes的版權問題後, 開始自動解壓縮並安裝RPM

#sh jdk-6u17-linux-i586-rpm.bin

新增path在/etc/profile (順便把tomcat的路徑設定上去)

#vi /etc/profile

##JAVA Environment
export JAVA_HOME=/usr/java/jdk1.6.0_17
export JAVA_BIN=/usr/java/jdk1.6.0_17/bin
export JAVA_OPTS="$JAVA_OPTS -Xmx512M -Dcom.sun.management.jmxremote"
export PATH=$JAVA_HOME/bin:$PATH
#export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
export CATALINA_HOME=/var/lib/tomcat6
#export CLASSPATH=$CATALINA_HOME/common/lib/servlet.jar
export CLASSPATH=./:${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib/ext:${CATALINA_HOME}/common/lib

#source /etc/profile

退出後再重新登入,使用新path,由於一個系統可以使用多個版本的java,所以RHEL5內建的"java"是1.4.2的gij,
如果export PATH=$JAVA_HOME/bin:$PATH的順序相反可能會抓到1.4.2
# java -version
java version "1.4.2"
gij (GNU libgcj) version 4.1.1 20070105 (Red Hat 4.1.1-52)

正常應該看到我們新裝的1.6.0_17
$ java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)

2.安裝Apache Tomcat 6

目前最新版本是6.0.20,請在官方網站下載
http://apache.freelamp.com/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz

先將舊的tomcat5移除掉

#rpm -qa|grep tomcat

# rpm -qa|grep tomcat
tomcat5-servlet-2.4-api-5.5.17-8jpp.2
tomcat5-jsp-2.0-api-5.5.17-8jpp.2
tomcat5-jasper-5.5.17-8jpp.2
tomcat5-server-lib-5.5.17-8jpp.2
tomcat5-admin-webapps-5.5.17-8jpp.2
tomcat5-webapps-5.5.17-8jpp.2
tomcat5-common-lib-5.5.17-8jpp.2
tomcat5-5.5.17-8jpp.2

rpm -e tomcat5
rpm -e tomcat5-server-lib
rpm -e tomcat5-admin-webapps
rpm -e tomcat5-webapps
rpm -e tomcat5-common-lib
rpm -e tomcat5-jasper

解壓縮tomcat6,並移到 /var/lib/tomcat6
#tar zxvf apache-tomcat-6.0.20.tar.gz
# mv apache-tomcat-6.0.20 /var/lib/tomcat6

--------------------------------------
由於Tomcat從 5.5版本後增加了APR技術(Apache Portable Runtime),這是一個用C語言寫成的runtime lib,目的在於提高Tomcat的性能,使得Tomcat將不僅僅擔任一個容器的功能,且成為一個一般的web服務器(general purpose webserver),
但官方原始並未放進去這些,所以我們必須抓The Apache Tomcat Native Connector回來補進去
Tomcat在原apache-tomcat-6.0.20.tar.gz的bin裡面有附tomcat-native.tar.gz, 這是tomcat-native-1.1.16-src,但tomcat-6.0.20需要1.1.18,可以在此下載:

http://tomcat.apache.org/native-doc/

# wget http://www.apache.org/dist/tomcat/tomcat-connectors/native/1.1.18/source/tomcat-native-1.1.18-src.tar.gz
# tar zxvf tomcat-native-1.1.18-src.tar.gz

需要apr-devel ,openssl-devel兩個套件,openssl-devel已有,apr-devel在此下載:
# wget http://ftp://ftp.rediris.es/volumes/vol1/centos.org/5.3/os/x86_64/CentOS/apr-devel-1.2.7-11.i386.rpm
# rpm -ivh apr-devel-1.2.7-11.i386.rpm

# cd tomcat-native-1.1.18-src/jni/native
# ./configure --with-apr=/usr/bin/apr-1-config \
--with-java-home=/usr/java/jdk1.6.0_17 \
--with-ssl=yes \
--prefix=$CATALINA_HOME
# make && make install

compile好的lib會在$CATALINA_HOME/lib

在startup.sh加上以下兩行:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib
export LD_LIBRARY_PATH

或是直接丟到/jre/lib/i386
# cd /var/lib/tomcat6/lib
# mv lib* /usr/java/jdk1.6.0_17/jre/lib/i386

有個已經compile好的lib--Tomcat-native-i686-whatever-linux2.tar.gz是1.1.12,tomcat-6.0.20需要1.1.18,所以不支援
--------------------------------------
修改權限
#chown -R tomcat.tomcat /var/lib/tomcat6

啟動tomcat6
# cd /var/lib/tomcat6/bin
#./startup.sh

可以在logs/catalina.out裡看到APR有被啟動
2009/12/5 下午 05:39:27 org.apache.catalina.core.AprLifecycleListener init
資訊: Loaded APR based Apache Tomcat Native library 1.1.18.
2009/12/5 下午 05:39:27 org.apache.catalina.core.AprLifecycleListener init
資訊: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].

然後打開瀏覽器,http://your.ip:8080
即可看到Tomcat

Tomcat的帳號設定在/var/lib/tomcat6/conf/tomcat-users.xml
點Administration的Status/Tomcat Manager卻一直無法進入,原因是未拿掉,加入admin帳號及manager的role












Tomcat6開機啟動
這個有兩種方式,主要須避開以root啟動
(1)官方文件以jsvc來啟動,須compile jsvc

# cd $CATALINA_HOME/bin
# tar xvfz jsvc.tar.gz
# cd jsvc-src
# autoconf
# chmod 755 configure
# ./configure
# make
# cp jsvc ..
# cd ..
# cd $CATALINA_HOME
# ./bin/jsvc -cp ./bin/bootstrap.jar \
-outfile ./logs/catalina.out -errfile ./logs/catalina.err \
org.apache.catalina.startup.Bootstrap

然後把Tomcat5.sh修改完放到/etc/rc.d/init.d/去
cp $CATALINA_HOME/bin/jsvc-src/native/Tomcat5.sh /etc/rc.d/init.d/tomcat
以下請參考修改(附檔tomcat及tomcat6):
-----------------------------------------------------------------------------
echo "Tomcat 6 auto start/stop"
JAVA_HOME=/usr/java/jdk1.6.0_17
CATALINA_HOME=/var/lib/tomcat6
DAEMON_HOME=/var/lib/tomcat6/bin
TOMCAT_USER=tomcat

# for multi instances adapt those lines.
TMP_DIR=/var/lib/tomcat6/temp
PID_FILE=/var/run/tomcat6.pid
CATALINA_BASE=/var/lib/tomcat6

CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar

case "$1" in
'start')
#
# Start Tomcat
#
echo -n "Starting Tomcat6: "
$DAEMON_HOME/jsvc \
-user $TOMCAT_USER \
-home $JAVA_HOME \
-Dcatalina.home=$CATALINA_HOME \
-Dcatalina.base=$CATALINA_BASE \
-Djava.io.tmpdir=$TMP_DIR \
-wait 10 \
-pidfile $PID_FILE \
-outfile $CATALINA_HOME/logs/catalina.out \
-errfile '&1' \
$CATALINA_OPTS \
-cp $CLASSPATH \
org.apache.catalina.startup.Bootstrap
#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
exit $?
echo
;;

'stop')
#
# Stop Tomcat
#
echo -n "Shutting Tomcat6: "
$DAEMON_HOME/jsvc -stop -pidfile $PID_FILE org.apache.catalina.startup.Bootstrap
exit $?
echo
;;

'status')
#
# Tomcat Status
#
echo -n "Restarting Tomcat6: "
ps ax --width=1000 | grep "
rg.apache.catalina.startup.Bootstrap" | awk '{printf $1 " "}' | wc | awk '{print $2}' >/tmp/tomcat_process_count.txt
read line < /tmp/tomcat_process_count.txt
if [ $line -gt 0 ]; then
echo -n "Tomcat ( pid "
ps ax --width=1000 | grep "
rg.apache.catalina.startup.Bootstrap" | awk '{printf $1 " "}'
echo ") is running..."
else
echo "Tomcat is stopped"
fi
echo
;;

*)
echo "Usage tomcat {start | stop | status}"
exit 1;;

esac
exit 0
-----------------------------------------------------------------------------
(2)我個人的方式--直接以tomcat用戶呼叫startup.sh/shutdown.sh
-----------------------------------------------------------------------------
#!/bin/sh
#
# Startup script for Tomcat 6.0, the Apache Servlet Engine
#
# chkconfig: - 80 20
#
echo "Tomcat 6.0 auto start/stop"

JAVA_HOME=/usr/java/jdk1.6.0_17
JAVA_BIN=/usr/java/jdk1.6.0_17/bin
CATALINA_HOME=/var/lib/tomcat6
DAEMON_HOME=/var/lib/tomcat6/bin
TOMCAT_USER=tomcat

case "$1" in
'start')

echo -n "Starting Tomcat 6: "
su - $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
touch /var/lock/subsys/tomcat6
echo
;;

'stop')

echo -n "Shutting Tomcat 6: "
su - $TOMCAT_USER -c $CATALINA_HOME/bin/shutdown.sh
rm -f /var/lock/subsys/tomcat6
echo
;;

*)
echo "Usage: tomcat6 {start | stop }"
exit 1

esac
exit 0
-----------------------------------------------------------------------------
以上請擇一設定,
#chkconfig --add tomcat

安裝Lambdaprobe,這是個滿好用的tomcat管理系統
http://www.lambdaprobe.org/downloads/1.7/probe.1.7b.zip
Lambda Probe(以前稱為Tomcat Probe)是一款即時監控和管理的Apache Tomcat的基本工具, 以AJAX開發而成,可以用來即時管理一個單獨的host.
LambdaProbe擁有幾乎所有Tomcat Manager的功能,可以說是一個增強版本的 Tomcat Manager,除此之外,LambdaProbe 還擁有很多讓開發者和系統管理者更方便的性能, 使得Tomcat對開發者和管理者更加透明. 包括應用程式,資料來源,發佈, 日誌, 進程, 集群, 系統訊息, 狀態, 連接器狀態這些功能. 搭配 JDK 1.5 甚至可以即時的畫出 Server 的詳細記憶體佔用狀態.
用 Tomcat manager 安裝 Probe: 下載 Lambda Probe 的 .war 檔,啟動Tomcat,進入 Manager url(例如:http://localhost:8080/manager/html),使用“WAR file to deploy”選項載入 probe.war。

簡繁中文語言包安裝--將其中的 messages_zh_CN.properties和messages_zh_CN.properties 放到 $CATALINA_HOME/webapps/probe/WEB-INF下即可
# mv messages_zh_CN.properties messages_zh_TW.properties $CATALINA_HOME/webapps/probe/WEB-INF

摘自:http://phorum.study-area.org/index.php?topic=59120.0

2010年1月7日 星期四

php 正則式筆記

一.正則表達式
1.匹配符
1)頭匹配符"^":如^0754,只匹配開頭為0754的字符串
2)尾匹配符"$":如0754$,只匹配結尾為0754的字符串
3)全字匹配:將^和$結合,如^0754$,匹配0754字符串

2.轉義字符
1)空字符:
換行\n
回車\r
製表符\t
2)其他字符:
"$" \$
"^" \^
"+" \+
"/" \/

3.通配符
1)*號:用來匹配前面一個字符是否在字符串中出現零次或多次.
例1:'abc*',匹配含有ab的所有字符串。
2)+號:......................................一次或多次.
例2:'abc+',匹配含有abc的所有字符串。
3)?號:......................................零次或一次.
例3:只匹配含有ab、abc結尾不再含c的字符串。如abca,aabc,aaab都可以,但abcc就不行。

4.關於轉義字符\$與雙、單引號(php4環境)
1)正則表達式本身就是一個字符串。
2)當引號中含有$時,用雙、單引號定義就有區別,區別如下:
(1)使用單引號定義時,解釋器會把引號內所有字符(包括$在內)都原封不動的賦值給字符串變量。
(2)使用雙引號定義時,解釋器會把引號內"$"字符以及其後的合法字符(字母、數字、下劃線)翻譯成變量,直到遇到一個非法字符才認為變量名結束,該非法字符及其後面的字符都被視為一般字符賦給字符串變量,直到遇到下一個"$"為止。
(3)注意:單個$出現在雙引號的尾部,並且其後面不再有任何字符的時候,解釋器不會將其翻譯成變量。也不需要加轉義\,當然不提倡。
(4)如果待匹配的字符中本身就有$,就無法用雙引號來定義這個正則表達式,原因是轉義字符\$在單,雙引號中表示的意義不同:
<1>雙引號中,\$和單個的$意義是一樣的,都是代表尾匹配符,因此c\$$=c\$=c\$\$=c$=c\$\$;雙引號中,\$在 任何時刻都只代表一個字符"$",echo "c\$$"結果是c$$,並且\$和單個的$(單個的$是指該$無法和其後字符組成變量名)是完全等效的,都是尾匹配符,所以雙引號中是無法寫入作為非 尾匹配字符的字符"$"的,也正是這個原因,大多數需要匹配$時定義正則表達式只能用''。
<2>單引號中,\$的意義僅僅表示字符"$",尾匹配符是$,不管後面是否有合法變量名字符;單引號中,\$其實是兩個字符,如不用於正 則匹配將沒有任何意義,echo 'c\$$'結果仍是c\$$。單作為正則表達式來使用,單引號中的\$表示的是特殊字符"$",而尾匹配符就是單獨的$字符。
3)正則表達式的尾匹配符"$"和變量的定義符是相同的:
例1:定義正則表達式為^ab$:$pattern="^ab\$";轉義字符\$在雙引號中就表示字符$,結果是^ab$。
例2:如上題,使用$pattern="^ab$";顯然是錯誤的,但是由於$在尾部,後面沒有其他字符,所以依然適用。
例3:以字符組合c$結尾的正則表達式:$pattern='c\$$';
例4:如上題,$pattern="c\$$";正則表達式將\$視為尾匹配符,故只匹配以c結尾。

5."[]"方括號(字符簇)用法
1)[]匹配一個字符,在[]中使用^開頭表示取非,即其後的字符全部是不匹配的。
例1:[a-zA-Z0-9]匹配所有大小寫字母和數字。
例2:[\n\t\r\f]匹配所有空字符。
例3:[^A-Z]不匹配大寫字母。
例4:^[^0-9]匹配不以數字開頭的字符或字符串
2)特殊字符"."(句點)匹配除了"新行"之外的所有字符,模式^.abc$匹配任何以abc結尾的字符,但是不能匹配其本身。模式"."則可以匹配任何字符串,除了空字符串和只有一個"新行"字符的字符串。
例1:'^.abc$';匹配所有尾部含有abc的字符串,不匹配小數(新行),當不匹配abc。
例2:'.';匹配所有字符串,但不匹配空值。
例3:'.abc';匹配所有含abc的字符串,小數等等都可以,前提是不以abc為首,不匹配abc。
例4:'.abc$';匹配所有以abc結尾的字符串,任何小數等等都可以,不匹配abc。
3)php提供了內置通用字符簇:
[[:alpha:]]任何字母
[[:digit:]]任何數字
[[:alnum:]]任何字母和數字
[[:space:]]任何空白字符
[[:upper:]]任何大寫字母
[[:lower:]]任何小寫字母
[[:punct:]]任何表點符號
[[:xdigit:]]任何十六進制數字
[[:cntrl:]]任何ASCII值小於32的字符
注意:以上字符簇有個特點,只要被匹配的字符或字符串中有此字符,即匹配正確,不管字符串是以什麼方式組成的。

6."{}"大括號用法
1)方括號只能匹配一個字符,而匹配多個字符只能用{}實現:{}用來確定前面內容出現的次數。{n}表示出現n次;{m,n}表示出現m~n次,包括m和n次;{n,}表示出現n次或者n次以上。
例1:^a{10}$;匹配aaaaaaaaaa。
例2:[0-9]{1,}$;匹配所有>0的數。
2)"{}"與通配符之間的關係
? 相當於 {0,1} 零次或一次
* ..... {0,} 零次或無數次
+ ..... {1,} 一次或無數次

7."()"用法
圓括號"()"括住的pattern表示子模式,如$pattern='([1-9]{1}[0-9]{3})-([0-1]{1}[1-2] {1})-([0-3]{1}([0-9]|))';()擴住的就是一個個子模式,()相當於把他們獨立起來,分別匹配而相互不干擾。

二.POSIX風格正則表達式函數
1.ereg
ereg(pattern,string,[array $regs]);
eregi(pattern,string,[array $regs]);
ereg函數在string中找到滿足pattern模式的文本,如果找到true,沒找到false。如果有第三個參數$regs,那找到的文本將放 在$regs[0]中,並且regs數組中將一次存放各個圓括號表達的子模式匹配的結果。$regs[1]中存放了第一個子模式所匹配的結 果,$regs[2]中是第二個,順序從左到右,依次類推。如果沒有找到匹配的文本,$regs數組的值不會被改變。
注意:如果找到了匹配的文本,不管找到的子模式是多少個>9還是<9,ereg()只會改變$regs數組前10個元素的值。但是這不會影響 函數對子模式組合的匹配結果。ereg總是先匹配完,如果沒發現匹配的文本就false,發現了就true。如果有子模式,會逐步根據這些子模式重新在字 符串中尋找匹配的文本,直到$regs數組被填滿10個元素或者所有子模式被匹配完,如果子模式少於10則剩餘的$regs將被賦空值。總之一句話,匹配 歸匹配,$regs歸$regs,$regs只有10個值。 eregi()函數與ereg()基本用法相同,只是eregi對大小寫不敏感。

2.ereg_replace和eregi_replace ereg_replace(pattern,string replacement,string) eregi_replace(pattern,string replacement,string) string字串中滿足pattern的文本將被替換成replacement。如果string中有pattern匹配的文本,那麼返回替換之後的值,如果沒有,則返回原來的string值。 如果pattern中包含子模式,子模式可以有選擇的被保留而不被替換。 例1:pattern中的第二個子模式不被替換,replacement可寫成這樣:replacement\\2。這樣string中匹配的 pattern的字符串將被替換為replacement+pattern2,pattern2表示匹配pattern的文本中又匹配pattern的第 二個子模式的文本。如果使用"\\0"表示保留整個匹配文本。利用這個特性可以實現在特定的字符串之後插入文本的操作。 replacement必須是字符串類型變量,如果不是,替換時將強制轉換成字符串類型。

3.split()函數和spliti()函數用法 split(pattern,string,[int limit]); spliti(pattern,string,[int limit]); split以正則表達式pattern定義的模式為分隔符將string分隔成幾個部分。如果分隔成功,返回的值為各個分隔後部分組成的數組,失敗則返回 false。可選limit表示最大分割塊數。如果limit為5,那麼即使string有>5個的地方符合pattern,string也只被分 割為5個部分,最後一個部分是string去掉前四個部分後剩下的部分。返回值中也只有5個元素。

三.perl風格正則表達式及相關函數
1.perl正則語法
perl分隔符,可使用"/","!"和"{}"。
例1:/^[^0-9]/ !^[0-9]! {^[0-9]}三個都一樣。
在分隔符內部,分隔字符本身就是一個特殊敏感字符,要進行轉義。如果用分隔符"/",正則中又用了表達字符的"/",則必須要用"\/"。如果混合用"/"和"!"就沒問題。
例2:/\/\/$/ !//$! 兩者也相同
例3:!^\!\![0-9]$! /^!![0-9]$/ 兩者也相同
2.perl特殊意義字符
\a ASCII值為7的告警符
\b 詞的邊界
\A 和脫出符號("/")等價
\B 非詞邊界
\cn 控制字符
\d 單個數字
\D 單個非數字
\s 單個空白
\S 單個非空白
\w 單個的字母或下劃線
\W 單個的非詞字符(不是字母也不是下劃線)
\Z 從目標字串的尾部開始匹配
3.高級特性
1)或運算"|":
例如!^ex|em!匹配條件是ex或em開頭的字符串,還可以寫成!^e(x|m)!。
注意:()內的內容代表子模式\
2)邏輯符號後面的模式選項
!正則表達式!邏輯選項
A:只匹配位於目標字串開頭的字符。
E:該選項使轉義字符$構成的正則表達式只匹配目標字符串的結尾字符。如果選擇m選項,該選項就被忽略。
U:該選項禁止最大長度的搜索。一般情況下,搜索會儘量找最長的匹配字符串。例如模式/a+/在"caaaaab"字符串中的匹配結果是"aaaaa",但是使用該選項的模式/a+/U匹配的結果會是"a"。
S:對模式進行學習,提高查找速度。
i:該選項忽略大小寫。
m:該選項將含有換行符的字符串視為多行而不是一行。這個時候"$","^"等字符會匹配每個換行符。
s:該選項使句點"."也匹配換行符。
x:該選項通知PHP解釋器在分析的時候忽略正則表達式定義中的非轉義空格符。這樣可以在正則表達式中使用空格來增強其可讀性,但這時在表達式中使用空格符必須使用轉義字符。
3)擴展模式符號。
(?#comment) 添加註釋comment,可以增強正則可讀性。
(?=pattern) 指定在模式之後必須跟隨值pattern。
(?!pattern) 指定在模式之後不能跟隨值pattern。
(?n) 在模式內部而非結尾處定義模式選項n。
(?: ) 消耗字符,不捕獲匹配結果。
例:echo ereg("?:^a$","a");//無任何輸出。
4.per正則函數
1.preg_grep函數
preg_grep(pattern,array input);
輸入數組input中尋找匹配模式pattern的字串,並將所有的匹配字符串返回。返回值就是所有匹配的字符串組成的數組。

2.preg_match函數
preg_match(pattern,string subject,[array matches])
該函數在subject字符串中尋找匹配pattern的字符串。如果找到則返回一個非零值,否則返回零值。如果選用了可選項matches,那麼匹配的 字符串將被放到第一個元素的位置,可以用$matches[0]來讀取,圓括號匹配的結果也按順序放在這個數組中,第一個是$matches[1],第二 個是$matches[2],依次類推。

3.preg_match_all函數
preg_match_all(pattern,subject,array matches,[int order])
該函數在subject字符串中尋找匹配pattern的互不重疊的文本,找到了匹配的文本則返回匹配文本的個數,否則返回0。匹配文本被放在二維數組 matches中,matches[0]中存放的是所有符合的字符串。各種嵌入的子模式匹配的結果依次放在數組matches[1]~[n]中。
order參數可選,可取的值為PREG_PATTERN_ORDER和PREG_SET_ORDER。

4.preg_replace函數
preg_replace(pattern,replacement,subject,[int limit])
該函數將subject中符合pattern模式的部分替換成replacement,返回值類型和subject類型一樣,如果有替換,則返回替換後的值,反之則返回原來的值。
參數可以是數組也可以是變量,有幾種情況:
<1>如果subject參數是數組類型。函數對每一個數組元素進行替換操作;
<2>如果pattern是數組則函數根據每一個pattern中的類型進行替換;
<3>如果pattern和replacement都是數組,則按兩個數組中的元素對應完成替換;
<4>如果replacement中的元素個數少於pattern中的元素個數。那麼不夠的部分將有空字符串來代替。

5.preg_split函數
preg_split(pattern,subject,[int limit][flages])
該函數以pattern定義的模式為分隔符將subject字符串分隔為若干個部分,返回數組,其中存放被分隔後的字符串。limit可限制返回字符串的 數目,如果設置為-1表示對返回的字符串數目不加任何限制。flags也是可選項,其有兩個值:PREG_SPLIT_NO_EMPTY設定函數不返回空 字符串,PERG_SPLIT_DELIM_CAPTURE,該選項設定pattern中的嵌入子模式也會被函數匹配。

摘自:http://calos-tw.blogspot.com/2009/08/php.html

wibiya widget