<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>学而.海口 [X Education.HaiKou]</title>
	<atom:link href="http://ruby.blog.35.com/feed" rel="self" type="application/rss+xml" />
	<link>http://ruby.blog.35.com</link>
	<description>学而不思则罔，思而不学则殆…… 海口学而网http://xe.hk</description>
	<pubDate>Wed, 30 Apr 2008 06:07:00 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>必须掌握的八个【cmd 命令行】</title>
		<link>http://ruby.blog.35.com//16.html</link>
		<comments>http://ruby.blog.35.com//16.html#comments</comments>
		<pubDate>Wed, 30 Apr 2008 06:06:13 +0000</pubDate>
		<dc:creator>RestOnRails</dc:creator>
		
		<guid isPermaLink="false">http://ruby.blog.35.com//16.html</guid>
		<description><![CDATA[一，ping 　　 
　　它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说，ping命令是第一个必须掌握的DOS命令，它所利用的原理是这样的：网络上的机器都有唯一确定的IP地址，我们给目标IP地址发送一个数据包，对方就要返回一个同样大小的数据包，根据返回的数据包我们可以确定目标主机的存在，可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧，在DOS窗口中键入：ping /? 回车，。所示的帮助画面。在此，我们只掌握一些基本的很有用的参数就可以了（下同）。 　　 
　　-t 表示将不间断向目标IP发送数据包，直到我们强迫其停止。试想，如果你使用100M的宽带接入，而目标IP是56K的小猫，那么要不了多久，目标IP就因为承受不了这么多的数据而掉线，呵呵，一次攻击就这么简单的实现了。 　　 
　　-l 定义发送数据包的大小，默认为32字节，我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用，会有更好的效果哦。 　　 
　　-n 定义向目标IP发送数据包的次数，默认为3次。如果网络速度比较慢，3次对我们来说也浪费了不少时间，因为现在我们的目的仅仅是判断目标IP是否存在，那么就定义为一次吧。 　　 
　　说明一下，如果-t 参数和 -n参数一起使用，ping命令就以放在后面的参数为标准，比如&#8221;ping IP -t -n 3&#8243;，虽然使用了-t参数，但并不是一直ping下去，而是只ping 3次。另外，ping命令不一定非得ping IP，也可以直接ping主机域名，这样就可以得到主机的IP。 　　 
　　下面我们举个例子来说明一下具体用法。 　　 
　　这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒，从这里可以判断网络连接速度的大小 。从TTL的返回值可以初步判断被ping主机的操作系统，之所以说&#8221;初步判断&#8221;是因为这个值是可以修改的。这里TTL=32表示操作系统可能是win98。 
　　（小知识：如果TTL=128，则表示目标主机可能是Win2000；如果TTL=250，则目标主机可能是Unix） 
　　至于利用ping命令可以快速查找局域网故障，可以快速搜索最快的QQ服务器，可以对别人进行ping攻击……这些就靠大家自己发挥了。 　　 
二，nbtstat 　　 
　　该命令使用TCP/IP上的NetBIOS显示协议统计和当前TCP/IP连接，使用这个命令你可以得到远程主机的NETBIOS信息，比如用户名、所属的工作组、网卡的MAC地址等。在此我们就有必要了解几个基本的参数。 　　 
　　-a 使用这个参数，只要你知道了远程主机的机器名称，就可以得到它的NETBIOS信息（下同）。 　　 
　　-A 这个参数也可以得到远程主机的NETBIOS信息，但需要你知道它的IP。 
　　-n 列出本地机器的NETBIOS信息。 　　 
　　当得到了对方的IP或者机器名的时候，就可以使用nbtstat命令来进一步得到对方的信息了，这又增加了我们入侵的保险系数。 　　 
三，netstat 
　　这是一个用来查看网络状态的命令，操作简便功能强大。 　　 
　　-a 查看本地机器的所有开放端口，可以有效发现和预防木马，可以知道机器所开的服务等信息，如图4。 　　 
　　这里可以看出本地机器开放有FTP服务、Telnet服务、邮件服务、WEB服务等。用法：netstat -a IP。 
　　-r 列出当前的路由信息，告诉我们本地机器的网关、子网掩码等信息。用法：netstat -r IP。 
四，tracert 
　　跟踪路由信息，使用此命令可以查出数据从本地机器传输到目标主机所经过的所有途径，这对我们了解网络布局和结构很有帮助。如图5。 　　 
　　这里说明数据从本地机器传输到192.168.0.1的机器上，中间没有经过任何中转，说明这两台机器是在同一段局域网内。用法：tracert IP。 　　 
五，net 　　 
　　这个命令是网络命令中最重要的一个，必须透彻掌握它的每一个子命令的用法，因为它的功能实在是太强大了，这简直就是 微软为我们提供的最好的入侵工具。首先让我们来看一看它都有那些子命令，键入net /?回车如图6。 
　　在这里，我们重点掌握几个入侵常用的子命令。 　　 
　　net view 　　 
　　使用此命令查看远程主机的所以共享资源。命令格式为net view \IP。　　 
　　net use 
　　把远程主机的某个共享资源影射为本地盘符，图形界面方便使用，呵呵。命令格式为net use x: \IP\sharename。上面一个表示把192.168.0.5IP的共享名为magic的目录影射为本地的Z盘。下面表示和192.168.0.7建立IPC$连接（net use \IP\IPC$ &#8221;password&#8221; /user:&#8221;name&#8221;）， 　　 
　　建立了IPC$连接后，呵呵，就可以上传文件了：copy nc.exe \192.168.0.7\admin$，表示把本地目录下的nc.exe传到远程主机，结合后面要介绍到的其他DOS命令就可以实现入侵了。 　　 
　　net start 
　　使用它来启动远程主机上的服务。当你和远程主机建立连接后，如果发现它的什么服务没有启动，而你又想利用此服务怎么办？就使用这个命令来启动吧。用法：net start servername，如图9，成功启动了telnet服务。 　　 
　　net stop 
　　入侵后发现远程主机的某个服务碍手碍脚，怎么办？利用这个命令停掉就ok了，用法和net start同。 　　 
　　net user 
　　查看和帐户有关的情况，包括新建帐户、删除帐户、查看特定帐户、激活帐户、帐户禁用等。这对我们入侵是很有利的，最重要的，它为我们克隆帐户提供了前提。键入不带参数的net user，可以查看所有用户，包括已经禁用的。下面分别讲解。 
　　1，net user abcd 1234 /add，新建一个用户名为abcd，密码为1234的帐户，默认为user组成员。 
　　2，net user abcd /del，将用户名为abcd的用户删除。 
　　3，net user abcd /active:no，将用户名为abcd的用户禁用。 
　　4，net user abcd /active:yes，激活用户名为abcd的用户。 
　　5，net user abcd，查看用户名为abcd的用户的情况　　 
　　net localgroup 
　　查看所有和用户组有关的信息和进行相关操作。键入不带参数的net localgroup即列出当前所有的用户组。在入侵过程中，我们一般利用它来把某个帐户提升为administrator组帐户，这样我们利用这个帐户就可以控制整个远程主机了。用法：net localgroup groupname username /add。 　　 
　　现在我们把刚才新建的用户abcd加到administrator组里去了，这时候abcd用户已经是超级管理员了，呵呵，你可以再使用net user abcd来查看他的状态，和图10进行比较就可以看出来。但这样太明显了，网管一看用户情况就能漏出破绽，所以这种方法只能对付菜鸟网管，但我们还得知道。现在的手段都是利用其他工具和手段克隆一个让网管看不出来的超级管理员，这是后话。有兴趣的朋友可以参照《黑客防线》第30期上的《由浅入深解析隆帐户》一文。 　　 
　　net time 
　　这个命令可以查看远程主机当前的时间。如果你的目标只是进入到远程主机里面，那么也许就用不到这个命令了。但简单的入侵成功了，难道只是看看吗？我们需要进一步渗透。这就连远程主机当前的时间都需要知道，因为利用时间和其他手段（后面会讲到）可以实现某个命令和程序的定时启动，为我们进一步入侵打好基础。用法：net time \IP。 　　 
六，at 
这个命令的作用是安排在特定日期或时间执行某个特定的命令和程序（知道net time的重要了吧？）。当我们知道了远程主机的当前时间，就可以利用此命令让其在以后的某个时间（比如2分钟后）执行某个程序和命令。用法：at time command \computer。 　　 
　　表示在6点55分时，让名称为a-01的计算机开启telnet服务（这里net start telnet即为开启telnet服务的命令）。 　　 
七，ftp 　　 
　　大家对这个命令应该比较熟悉了吧？网络上开放的ftp的主机很多，其中很大一部分是匿名的，也就是说任何人都可以登陆上去。现在如果你扫到了一台开放ftp服务的主机（一般都是开了21端口的机器），如果你还不会使用ftp的命令怎么办？下面就给出基本的ftp命令使用方法。 
　　首先在命令行键入ftp回车，出现ftp的提示符，这时候可以键入&#8221;help&#8221;来查看帮助（任何DOS命令都可以使用此方法查看其帮助)。 　　 
　　大家可能看到了，这么多命令该怎么用？其实也用不到那么多，掌握几个基本的就够了。 　　 
　　首先是登陆过程，这就要用到open了，直接在ftp的提示符下输入&#8221;open 主机IP ftp端口&#8221;回车即可，一般端口默认都是21，可以不写。接着就是输入合法的用户名和密码进行登陆了，这里以匿名ftp为例介绍。 　　 
　　用户名和密码都是ftp，密码是不显示的。当提示**** logged in时，就说明登陆成功。这里因为是匿名登陆，所以用户显示为Anonymous。 　　 
　　接下来就要介绍具体命令的使用方法了。 　　 
　　dir 跟DOS命令一样，用于查看服务器的文件，直接敲上dir回车，就可以看到此ftp服务器上的文件。 
　　cd 进入某个文件夹。 
　　get 下载文件到本地机器。 
　　put 上传文件到远程服务器。这就要看远程ftp服务器是否给了你可写的权限了，如果可以，呵呵，该怎么 利用就不多说了，大家就自由发挥去吧。 
　　delete 删除远程ftp服务器上的文件。这也必须保证你有可写的权限。 
　　bye 退出当前连接。 
　　quit 同上。 
　　 
八，telnet 
　　功能强大的远程登陆命令，几乎所有的入侵者都喜欢用它，屡试不爽。为什么？它操作简单，如同使用自己的机器一样，只要你熟悉DOS命令，在成功以administrator身份连接了远程机器后，就可以用它来干你想干的一切了。下面介绍一下使用方法，首先键入telnet回车，再键入help查看其帮助信息。 　　 
　　然后在提示符下键入open IP回车，这时就出现了登陆窗口，让你输入合法的用户名和密码，这里输入任何密码都是不显示的。 　　 
　　当输入用户名和密码都正确后就成功建立了telnet连接，这时候你就在远程主机上具有了和此用户一样的权限，利用DOS命令就可以实现你想干的事情了。这里我使用的超级管理员权限登陆的。　　 
　　到这里为止，网络DOS命令的介绍就告一段落了，这里介绍的目的只是给菜鸟网管一个印象，让其知道熟悉和掌握网络DOS命令的重要性。其实和网络有关的DOS命令还远不止这些，这里只是抛砖引玉，希望能对广大菜鸟网管有所帮助。学好DOS对当好网管有很大的帮助，特别的熟练掌握了一些网络的DOS命令。 
　　另外大家应该清楚，任何人要想进入系统，必须得有一个合法的用户名和密码（输入法漏洞差不多绝迹了吧），哪怕你拿到帐户的只有一个很小的权限，你也可以利用它来达到最后的目的。所以坚决消灭空口令，给自己的帐户加上一个强壮的密码，是最好的防御弱口令入侵的方法。 
　　最后，由衷的说一句，培养良好的安全意识才是最重要的。
=========================================
开始→运行→命令集锦
winver&#8212;&#8212;&#8212;检查Windows版本 
wmimgmt.msc&#8212;-打开windows管理体系结构(WMI) 
wupdmgr&#8212;&#8212;&#8211;windows更新程序 
wscript&#8212;&#8212;&#8211;windows脚本宿主设置 
write&#8212;&#8212;&#8212;-写字板 
winmsd&#8212;&#8212;&#8212;系统信息 
wiaacmgr&#8212;&#8212;-扫描仪和照相机向导 
winchat&#8212;&#8212;&#8211;XP自带局域网聊天 
mem.exe&#8212;&#8212;&#8211;显示内存使用情况 
Msconfig.exe&#8212;系统配置实用程序 
mplayer2&#8212;&#8212;-简易widnows media player 
mspaint&#8212;&#8212;&#8211;画图板 
mstsc&#8212;&#8212;&#8212;-远程桌面连接 
mplayer2&#8212;&#8212;-媒体播放机 
magnify&#8212;&#8212;&#8211;放大镜实用程序 
mmc&#8212;&#8212;&#8212;&#8212;打开控制台 
mobsync&#8212;&#8212;&#8211;同步命令 
dxdiag&#8212;&#8212;&#8212;检查DirectX信息 
drwtsn32&#8212;&#8212; 系统医生 
devmgmt.msc&#8212; 设备管理器 
dfrg.msc&#8212;&#8212;-磁盘碎片整理程序 
diskmgmt.msc&#8212;磁盘管理实用程序 
dcomcnfg&#8212;&#8212;-打开系统组件服务 
ddeshare&#8212;&#8212;-打开DDE共享设置 
dvdplay&#8212;&#8212;&#8211;DVD播放器 
net stop messenger&#8212;&#8211;停止信使服务 
net start messenger&#8212;-开始信使服务 
notepad&#8212;&#8212;&#8211;打开记事本 
nslookup&#8212;&#8212;-网络管理的工具向导 
ntbackup&#8212;&#8212;-系统备份和还原 
narrator&#8212;&#8212;-屏幕&#8221;讲述人&#8221; 
ntmsmgr.msc&#8212;-移动存储管理器 
ntmsoprq.msc&#8212;移动存储管理员操作请求 
netstat -an&#8212;-(TC)命令检查接口 
syncapp&#8212;&#8212;&#8211;创建一个公文包 
sysedit&#8212;&#8212;&#8211;系统配置编辑器 
sigverif&#8212;&#8212;-文件签名验证程序 
sndrec32&#8212;&#8212;-录音机 
shrpubw&#8212;&#8212;&#8211;创建共享文件夹 
secpol.msc&#8212;&#8211;本地安全策略 
syskey&#8212;&#8212;&#8212;系统加密，一旦加密就不能解开，保护windows xp系统的双重密码 
services.msc&#8212;本地服务设置 
Sndvol32&#8212;&#8212;-音量控制程序 
sfc.exe&#8212;&#8212;&#8211;系统文件检查器 
sfc /scannow&#8212;windows文件保护 
tsshutdn&#8212;&#8212;-60秒倒计时关机命令 
tourstart&#8212;&#8212;xp简介（安装完成后出现的漫游xp程序） 
taskmgr&#8212;&#8212;&#8211;任务管理器 
eventvwr&#8212;&#8212;-事件查看器 
eudcedit&#8212;&#8212;-造字程序 
explorer&#8212;&#8212;-打开资源管理器 
packager&#8212;&#8212;-对象包装程序 
perfmon.msc&#8212;-计算机性能监测程序 
progman&#8212;&#8212;&#8211;程序管理器 
regedit.exe&#8212;-注册表 
rsop.msc&#8212;&#8212;-组策略结果集 
regedt32&#8212;&#8212;-注册表编辑器 
rononce -p &#8212;-15秒关机 
regsvr32 /u *.dll&#8212;-停止dll文件运行 
regsvr32 /u zipfldr.dll&#8212;&#8212;取消ZIP支持 
cmd.exe&#8212;&#8212;&#8211;CMD命令提示符 
chkdsk.exe&#8212;&#8211;Chkdsk磁盘检查 
certmgr.msc&#8212;-证书管理实用程序 
calc&#8212;&#8212;&#8212;&#8211;启动计算器 
charmap&#8212;&#8212;&#8211;启动字符映射表 
cliconfg&#8212;&#8212;-SQL SERVER 客户端网络实用程序 
Clipbrd&#8212;&#8212;&#8211;剪贴板查看器 
conf&#8212;&#8212;&#8212;&#8211;启动netmeeting 
compmgmt.msc&#8212;计算机管理 
cleanmgr&#8212;&#8212;-垃圾整理 
ciadv.msc&#8212;&#8212;索引服务程序 
osk&#8212;&#8212;&#8212;&#8212;打开屏幕键盘 
odbcad32&#8212;&#8212;-ODBC数据源管理器 
oobe/msoobe /a&#8212;-检查XP是否激活 
lusrmgr.msc&#8212;-本机用户和组 
logoff&#8212;&#8212;&#8212;注销命令 
iexpress&#8212;&#8212;-木马捆绑工具，系统自带 
Nslookup&#8212;&#8212;-IP地址侦测器 
fsmgmt.msc&#8212;&#8211;共享文件夹管理器 
utilman&#8212;&#8212;&#8211;辅助工具管理器 
gpedit.msc&#8212;&#8211;组策略
]]></description>
			<content:encoded><![CDATA[<p><span id="more-16"></span>一，ping 　　 </p>
<p>　　它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说，ping命令是第一个必须掌握的DOS命令，它所利用的原理是这样的：网络上的机器都有唯一确定的IP地址，我们给目标IP地址发送一个数据包，对方就要返回一个同样大小的数据包，根据返回的数据包我们可以确定目标主机的存在，可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧，在DOS窗口中键入：ping /? 回车，。所示的帮助画面。在此，我们只掌握一些基本的很有用的参数就可以了（下同）。 　　 </p>
<p>　　-t 表示将不间断向目标IP发送数据包，直到我们强迫其停止。试想，如果你使用100M的宽带接入，而目标IP是56K的小猫，那么要不了多久，目标IP就因为承受不了这么多的数据而掉线，呵呵，一次攻击就这么简单的实现了。 　　 </p>
<p>　　-l 定义发送数据包的大小，默认为32字节，我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用，会有更好的效果哦。 　　 </p>
<p>　　-n 定义向目标IP发送数据包的次数，默认为3次。如果网络速度比较慢，3次对我们来说也浪费了不少时间，因为现在我们的目的仅仅是判断目标IP是否存在，那么就定义为一次吧。 　　 </p>
<p>　　说明一下，如果-t 参数和 -n参数一起使用，ping命令就以放在后面的参数为标准，比如&#8221;ping IP -t -n 3&#8243;，虽然使用了-t参数，但并不是一直ping下去，而是只ping 3次。另外，ping命令不一定非得ping IP，也可以直接ping主机域名，这样就可以得到主机的IP。 　　 </p>
<p>　　下面我们举个例子来说明一下具体用法。 　　 </p>
<p>　　这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒，从这里可以判断网络连接速度的大小 。从TTL的返回值可以初步判断被ping主机的操作系统，之所以说&#8221;初步判断&#8221;是因为这个值是可以修改的。这里TTL=32表示操作系统可能是win98。 </p>
<p>　　（小知识：如果TTL=128，则表示目标主机可能是Win2000；如果TTL=250，则目标主机可能是Unix） </p>
<p>　　至于利用ping命令可以快速查找局域网故障，可以快速搜索最快的QQ服务器，可以对别人进行ping攻击……这些就靠大家自己发挥了。 　　 </p>
<p>二，nbtstat 　　 </p>
<p>　　该命令使用TCP/IP上的NetBIOS显示协议统计和当前TCP/IP连接，使用这个命令你可以得到远程主机的NETBIOS信息，比如用户名、所属的工作组、网卡的MAC地址等。在此我们就有必要了解几个基本的参数。 　　 </p>
<p>　　-a 使用这个参数，只要你知道了远程主机的机器名称，就可以得到它的NETBIOS信息（下同）。 　　 </p>
<p>　　-A 这个参数也可以得到远程主机的NETBIOS信息，但需要你知道它的IP。 </p>
<p>　　-n 列出本地机器的NETBIOS信息。 　　 </p>
<p>　　当得到了对方的IP或者机器名的时候，就可以使用nbtstat命令来进一步得到对方的信息了，这又增加了我们入侵的保险系数。 　　 </p>
<p>三，netstat </p>
<p>　　这是一个用来查看网络状态的命令，操作简便功能强大。 　　 </p>
<p>　　-a 查看本地机器的所有开放端口，可以有效发现和预防木马，可以知道机器所开的服务等信息，如图4。 　　 </p>
<p>　　这里可以看出本地机器开放有FTP服务、Telnet服务、邮件服务、WEB服务等。用法：netstat -a IP。 </p>
<p>　　-r 列出当前的路由信息，告诉我们本地机器的网关、子网掩码等信息。用法：netstat -r IP。 <br />
四，tracert </p>
<p>　　跟踪路由信息，使用此命令可以查出数据从本地机器传输到目标主机所经过的所有途径，这对我们了解网络布局和结构很有帮助。如图5。 　　 </p>
<p>　　这里说明数据从本地机器传输到192.168.0.1的机器上，中间没有经过任何中转，说明这两台机器是在同一段局域网内。用法：tracert IP。 　　 </p>
<p>五，net 　　 </p>
<p>　　这个命令是网络命令中最重要的一个，必须透彻掌握它的每一个子命令的用法，因为它的功能实在是太强大了，这简直就是 微软为我们提供的最好的入侵工具。首先让我们来看一看它都有那些子命令，键入net /?回车如图6。 </p>
<p>　　在这里，我们重点掌握几个入侵常用的子命令。 　　 </p>
<p>　　net view 　　 </p>
<p>　　使用此命令查看远程主机的所以共享资源。命令格式为net view \IP。　　 </p>
<p>　　net use </p>
<p>　　把远程主机的某个共享资源影射为本地盘符，图形界面方便使用，呵呵。命令格式为net use x: \IP\sharename。上面一个表示把192.168.0.5IP的共享名为magic的目录影射为本地的Z盘。下面表示和192.168.0.7建立IPC$连接（net use \IP\IPC$ &#8221;password&#8221; /user:&#8221;name&#8221;）， 　　 </p>
<p>　　建立了IPC$连接后，呵呵，就可以上传文件了：copy nc.exe \192.168.0.7\admin$，表示把本地目录下的nc.exe传到远程主机，结合后面要介绍到的其他DOS命令就可以实现入侵了。 　　 </p>
<p>　　net start </p>
<p>　　使用它来启动远程主机上的服务。当你和远程主机建立连接后，如果发现它的什么服务没有启动，而你又想利用此服务怎么办？就使用这个命令来启动吧。用法：net start servername，如图9，成功启动了telnet服务。 　　 </p>
<p>　　net stop </p>
<p>　　入侵后发现远程主机的某个服务碍手碍脚，怎么办？利用这个命令停掉就ok了，用法和net start同。 　　 </p>
<p>　　net user </p>
<p>　　查看和帐户有关的情况，包括新建帐户、删除帐户、查看特定帐户、激活帐户、帐户禁用等。这对我们入侵是很有利的，最重要的，它为我们克隆帐户提供了前提。键入不带参数的net user，可以查看所有用户，包括已经禁用的。下面分别讲解。 </p>
<p>　　1，net user abcd 1234 /add，新建一个用户名为abcd，密码为1234的帐户，默认为user组成员。 </p>
<p>　　2，net user abcd /del，将用户名为abcd的用户删除。 </p>
<p>　　3，net user abcd /active:no，将用户名为abcd的用户禁用。 </p>
<p>　　4，net user abcd /active:yes，激活用户名为abcd的用户。 </p>
<p>　　5，net user abcd，查看用户名为abcd的用户的情况　　 </p>
<p>　　net localgroup </p>
<p>　　查看所有和用户组有关的信息和进行相关操作。键入不带参数的net localgroup即列出当前所有的用户组。在入侵过程中，我们一般利用它来把某个帐户提升为administrator组帐户，这样我们利用这个帐户就可以控制整个远程主机了。用法：net localgroup groupname username /add。 　　 </p>
<p>　　现在我们把刚才新建的用户abcd加到administrator组里去了，这时候abcd用户已经是超级管理员了，呵呵，你可以再使用net user abcd来查看他的状态，和图10进行比较就可以看出来。但这样太明显了，网管一看用户情况就能漏出破绽，所以这种方法只能对付菜鸟网管，但我们还得知道。现在的手段都是利用其他工具和手段克隆一个让网管看不出来的超级管理员，这是后话。有兴趣的朋友可以参照《黑客防线》第30期上的《由浅入深解析隆帐户》一文。 　　 </p>
<p>　　net time </p>
<p>　　这个命令可以查看远程主机当前的时间。如果你的目标只是进入到远程主机里面，那么也许就用不到这个命令了。但简单的入侵成功了，难道只是看看吗？我们需要进一步渗透。这就连远程主机当前的时间都需要知道，因为利用时间和其他手段（后面会讲到）可以实现某个命令和程序的定时启动，为我们进一步入侵打好基础。用法：net time \IP。 　　 </p>
<p>六，at </p>
<p>这个命令的作用是安排在特定日期或时间执行某个特定的命令和程序（知道net time的重要了吧？）。当我们知道了远程主机的当前时间，就可以利用此命令让其在以后的某个时间（比如2分钟后）执行某个程序和命令。用法：at time command \computer。 　　 </p>
<p>　　表示在6点55分时，让名称为a-01的计算机开启telnet服务（这里net start telnet即为开启telnet服务的命令）。 　　 <br />
七，ftp 　　 </p>
<p>　　大家对这个命令应该比较熟悉了吧？网络上开放的ftp的主机很多，其中很大一部分是匿名的，也就是说任何人都可以登陆上去。现在如果你扫到了一台开放ftp服务的主机（一般都是开了21端口的机器），如果你还不会使用ftp的命令怎么办？下面就给出基本的ftp命令使用方法。 </p>
<p>　　首先在命令行键入ftp回车，出现ftp的提示符，这时候可以键入&#8221;help&#8221;来查看帮助（任何DOS命令都可以使用此方法查看其帮助)。 　　 </p>
<p>　　大家可能看到了，这么多命令该怎么用？其实也用不到那么多，掌握几个基本的就够了。 　　 </p>
<p>　　首先是登陆过程，这就要用到open了，直接在ftp的提示符下输入&#8221;open 主机IP ftp端口&#8221;回车即可，一般端口默认都是21，可以不写。接着就是输入合法的用户名和密码进行登陆了，这里以匿名ftp为例介绍。 　　 </p>
<p>　　用户名和密码都是ftp，密码是不显示的。当提示**** logged in时，就说明登陆成功。这里因为是匿名登陆，所以用户显示为Anonymous。 　　 </p>
<p>　　接下来就要介绍具体命令的使用方法了。 　　 </p>
<p>　　dir 跟DOS命令一样，用于查看服务器的文件，直接敲上dir回车，就可以看到此ftp服务器上的文件。 </p>
<p>　　cd 进入某个文件夹。 </p>
<p>　　get 下载文件到本地机器。 </p>
<p>　　put 上传文件到远程服务器。这就要看远程ftp服务器是否给了你可写的权限了，如果可以，呵呵，该怎么 利用就不多说了，大家就自由发挥去吧。 </p>
<p>　　delete 删除远程ftp服务器上的文件。这也必须保证你有可写的权限。 </p>
<p>　　bye 退出当前连接。 </p>
<p>　　quit 同上。 <br />
　　 </p>
<p>八，telnet </p>
<p>　　功能强大的远程登陆命令，几乎所有的入侵者都喜欢用它，屡试不爽。为什么？它操作简单，如同使用自己的机器一样，只要你熟悉DOS命令，在成功以administrator身份连接了远程机器后，就可以用它来干你想干的一切了。下面介绍一下使用方法，首先键入telnet回车，再键入help查看其帮助信息。 　　 </p>
<p>　　然后在提示符下键入open IP回车，这时就出现了登陆窗口，让你输入合法的用户名和密码，这里输入任何密码都是不显示的。 　　 </p>
<p>　　当输入用户名和密码都正确后就成功建立了telnet连接，这时候你就在远程主机上具有了和此用户一样的权限，利用DOS命令就可以实现你想干的事情了。这里我使用的超级管理员权限登陆的。　　 </p>
<p>　　到这里为止，网络DOS命令的介绍就告一段落了，这里介绍的目的只是给菜鸟网管一个印象，让其知道熟悉和掌握网络DOS命令的重要性。其实和网络有关的DOS命令还远不止这些，这里只是抛砖引玉，希望能对广大菜鸟网管有所帮助。学好DOS对当好网管有很大的帮助，特别的熟练掌握了一些网络的DOS命令。 </p>
<p>　　另外大家应该清楚，任何人要想进入系统，必须得有一个合法的用户名和密码（输入法漏洞差不多绝迹了吧），哪怕你拿到帐户的只有一个很小的权限，你也可以利用它来达到最后的目的。所以坚决消灭空口令，给自己的帐户加上一个强壮的密码，是最好的防御弱口令入侵的方法。 </p>
<p>　　最后，由衷的说一句，培养良好的安全意识才是最重要的。</p>
<p>=========================================<br />
开始→运行→命令集锦<br />
winver&#8212;&#8212;&#8212;检查Windows版本 <br />
wmimgmt.msc&#8212;-打开windows管理体系结构(WMI) <br />
wupdmgr&#8212;&#8212;&#8211;windows更新程序 <br />
wscript&#8212;&#8212;&#8211;windows脚本宿主设置 <br />
write&#8212;&#8212;&#8212;-写字板 <br />
winmsd&#8212;&#8212;&#8212;系统信息 <br />
wiaacmgr&#8212;&#8212;-扫描仪和照相机向导 <br />
winchat&#8212;&#8212;&#8211;XP自带局域网聊天 </p>
<p>mem.exe&#8212;&#8212;&#8211;显示内存使用情况 <br />
Msconfig.exe&#8212;系统配置实用程序 <br />
mplayer2&#8212;&#8212;-简易widnows media player <br />
mspaint&#8212;&#8212;&#8211;画图板 <br />
mstsc&#8212;&#8212;&#8212;-远程桌面连接 <br />
mplayer2&#8212;&#8212;-媒体播放机 <br />
magnify&#8212;&#8212;&#8211;放大镜实用程序 <br />
mmc&#8212;&#8212;&#8212;&#8212;打开控制台 <br />
mobsync&#8212;&#8212;&#8211;同步命令 </p>
<p>dxdiag&#8212;&#8212;&#8212;检查DirectX信息 <br />
drwtsn32&#8212;&#8212; 系统医生 <br />
devmgmt.msc&#8212; 设备管理器 <br />
dfrg.msc&#8212;&#8212;-磁盘碎片整理程序 <br />
diskmgmt.msc&#8212;磁盘管理实用程序 <br />
dcomcnfg&#8212;&#8212;-打开系统组件服务 <br />
ddeshare&#8212;&#8212;-打开DDE共享设置 <br />
dvdplay&#8212;&#8212;&#8211;DVD播放器 </p>
<p>net stop messenger&#8212;&#8211;停止信使服务 <br />
net start messenger&#8212;-开始信使服务 <br />
notepad&#8212;&#8212;&#8211;打开记事本 <br />
nslookup&#8212;&#8212;-网络管理的工具向导 <br />
ntbackup&#8212;&#8212;-系统备份和还原 <br />
narrator&#8212;&#8212;-屏幕&#8221;讲述人&#8221; <br />
ntmsmgr.msc&#8212;-移动存储管理器 <br />
ntmsoprq.msc&#8212;移动存储管理员操作请求 <br />
netstat -an&#8212;-(TC)命令检查接口 </p>
<p>syncapp&#8212;&#8212;&#8211;创建一个公文包 <br />
sysedit&#8212;&#8212;&#8211;系统配置编辑器 <br />
sigverif&#8212;&#8212;-文件签名验证程序 <br />
sndrec32&#8212;&#8212;-录音机 <br />
shrpubw&#8212;&#8212;&#8211;创建共享文件夹 <br />
secpol.msc&#8212;&#8211;本地安全策略 <br />
syskey&#8212;&#8212;&#8212;系统加密，一旦加密就不能解开，保护windows xp系统的双重密码 <br />
services.msc&#8212;本地服务设置 <br />
Sndvol32&#8212;&#8212;-音量控制程序 <br />
sfc.exe&#8212;&#8212;&#8211;系统文件检查器 <br />
sfc /scannow&#8212;windows文件保护 </p>
<p>tsshutdn&#8212;&#8212;-60秒倒计时关机命令 <br />
tourstart&#8212;&#8212;xp简介（安装完成后出现的漫游xp程序） <br />
taskmgr&#8212;&#8212;&#8211;任务管理器 </p>
<p>eventvwr&#8212;&#8212;-事件查看器 <br />
eudcedit&#8212;&#8212;-造字程序 <br />
explorer&#8212;&#8212;-打开资源管理器 </p>
<p>packager&#8212;&#8212;-对象包装程序 <br />
perfmon.msc&#8212;-计算机性能监测程序 <br />
progman&#8212;&#8212;&#8211;程序管理器 </p>
<p>regedit.exe&#8212;-注册表 <br />
rsop.msc&#8212;&#8212;-组策略结果集 <br />
regedt32&#8212;&#8212;-注册表编辑器 <br />
rononce -p &#8212;-15秒关机 <br />
regsvr32 /u *.dll&#8212;-停止dll文件运行 <br />
regsvr32 /u zipfldr.dll&#8212;&#8212;取消ZIP支持 </p>
<p>cmd.exe&#8212;&#8212;&#8211;CMD命令提示符 <br />
chkdsk.exe&#8212;&#8211;Chkdsk磁盘检查 <br />
certmgr.msc&#8212;-证书管理实用程序 <br />
calc&#8212;&#8212;&#8212;&#8211;启动计算器 <br />
charmap&#8212;&#8212;&#8211;启动字符映射表 <br />
cliconfg&#8212;&#8212;-SQL SERVER 客户端网络实用程序 <br />
Clipbrd&#8212;&#8212;&#8211;剪贴板查看器 <br />
conf&#8212;&#8212;&#8212;&#8211;启动netmeeting <br />
compmgmt.msc&#8212;计算机管理 <br />
cleanmgr&#8212;&#8212;-垃圾整理 <br />
ciadv.msc&#8212;&#8212;索引服务程序 </p>
<p>osk&#8212;&#8212;&#8212;&#8212;打开屏幕键盘 <br />
odbcad32&#8212;&#8212;-ODBC数据源管理器 <br />
oobe/msoobe /a&#8212;-检查XP是否激活 <br />
lusrmgr.msc&#8212;-本机用户和组 <br />
logoff&#8212;&#8212;&#8212;注销命令 </p>
<p>iexpress&#8212;&#8212;-木马捆绑工具，系统自带 </p>
<p>Nslookup&#8212;&#8212;-IP地址侦测器 </p>
<p>fsmgmt.msc&#8212;&#8211;共享文件夹管理器 </p>
<p>utilman&#8212;&#8212;&#8211;辅助工具管理器 </p>
<p>gpedit.msc&#8212;&#8211;组策略</p>
]]></content:encoded>
			<wfw:commentRss>http://ruby.blog.35.com//16.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>ImageMagick 调用函数中文文档</title>
		<link>http://ruby.blog.35.com//15.html</link>
		<comments>http://ruby.blog.35.com//15.html#comments</comments>
		<pubDate>Fri, 25 Apr 2008 09:07:36 +0000</pubDate>
		<dc:creator>RestOnRails</dc:creator>
		
		<guid isPermaLink="false">http://ruby.blog.35.com/rails/%e6%9c%aa%e5%88%86%e7%b1%bb/15.html</guid>
		<description><![CDATA[

PHP 4.3.8 imageMagick 6.0.0 iMagick 0.9.9
导读：iMagick的作者并未告诉大家可以使用那些函数以及方法，这些函数和方法都是从source文件中的定义找到。作者摸索测试。请大家在有example的代码情况下做测试，不然很难用明白。


Function
Description


图片构造类
image_handle = imagick_readimage([image file])
读取图片到handle



bool = imagick_writeimage([source image handle],[new name &#38; filetype])
写图片



UN KNOW USE = imagick_writeimages




new_handle = imagick_clonehandle([image handle])
复制出新句柄



image_handle = imagick_image2blob([blob handle])
将数据流数据转换成为image数据



imagick_blob2image
与image2blob相反



image_handle = imagick_getcanvas([color],[canvas width],[canvas height])
创建一个画布



UN KNOW USE = imagick_newimagelist



错误句柄类
bool = imagick_iserror([image handle])
最后一次执行是否成功



rason_string = imagick_failedreason([image handle])
如果执行iImagick函数返回假将可以从本函数抛出失败



desc_string = imagick_faileddescription([image handle])
显示抛出的异常描述



error_string = imagick_error([image handle])
返回错误内容


获取图片信息类
image_width = imagick_getwidth([image handle])
获得图片宽度



image_height = imagick_getheight([image handle])
获得图片高度



mime_string = imagick_getmimetype([image handle])
获得图片MIME类型



depth_int [...]]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td>PHP 4.3.8 imageMagick 6.0.0 iMagick 0.9.9<br />
导读：iMagick的作者并未告诉大家可以使用那些函数以及方法，这些函数和方法都是从source文件中的定义找到。作者摸索测试。请大家在有example的代码情况下做测试，不然很难用明白。<span id="more-15"></span></p>
<table border="1" width="100%">
<tr>
<td height="22" colSpan="2" width="75%" align="center">Function</td>
<td height="22" width="25%" align="center">Description</td>
</tr>
<tr>
<td height="22" width="13%" align="center">图片构造类</td>
<td height="22" width="62%"><em>image_handle</em> = <strong>imagick_readimage</strong>(<em>[image file]</em>)</td>
<td height="22" width="25%">读取图片到handle</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_writeimage</strong>(<em>[source image handle]</em>,<em>[new name &amp; filetype]</em>)</td>
<td height="22" width="25%">写图片</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%">UN KNOW USE = <strong>imagick_writeimages</strong></td>
<td height="22" width="25%"></td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>new_handle</em> = <strong>imagick_clonehandle</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">复制出新句柄</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>image_handle</em> = <strong>imagick_image2blob</strong>(<em>[blob handle]</em>)</td>
<td height="22" width="25%">将数据流数据转换成为image数据</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><strong>imagick_blob2image</strong></td>
<td height="22" width="25%">与image2blob相反</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>image_handle</em> = <strong>imagick_getcanvas</strong>(<em>[color]</em>,<em>[canvas width]</em>,<em>[canvas height]</em>)</td>
<td height="22" width="25%">创建一个画布</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%">UN KNOW USE = <strong>imagick_newimagelist</strong></td>
<td height="22" width="25%"></td>
</tr>
<tr>
<td height="22" width="13%" align="center">错误句柄类</td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_iserror</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">最后一次执行是否成功</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>rason_string</em> = <strong>imagick_failedreason</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">如果执行iImagick函数返回假将可以从本函数抛出失败</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>desc_string</em> = <strong>imagick_faileddescription</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">显示抛出的异常描述</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>error_string</em> = <strong>imagick_error</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">返回错误内容</td>
</tr>
<tr>
<td height="22" width="13%" align="center">获取图片信息类</td>
<td height="22" width="62%"><em>image_width</em> = <strong>imagick_getwidth</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">获得图片宽度</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%">image_height = <strong>imagick_getheight</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">获得图片高度</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>mime_string</em> = <strong>imagick_getmimetype</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">获得图片MIME类型</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%">depth_int = <strong>imagick_getimagedepth</strong>(<em>[image handle]</em>)</td>
<td height="23" width="25%">获得图片DEPTH值</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>colors_num</em> = <strong>imagick_getnumbercolors</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">获得图片颜色数量</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_isgrayimage</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">是否会度图片</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_ismonochromeimage</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">是否单色图片</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_isopaqueimage</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">是否不透明图片</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_ispaletteimage</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">是否彩色图片</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>image_type</em> = <strong>imagick_getimagetype</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">获得图片颜色值</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_isimagesequal</strong>(<em>[image handle1],</em>(<em>[image handle2]</em>))</td>
<td height="22" width="25%">图片是否相同</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>magick_type</em> = <strong>imagick_getmagick</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%">获得图片类型</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>int</em> = <strong>imagick_getcolorspace</strong>(<em>[image handle]</em>)</td>
<td height="22" width="25%"></td>
</tr>
<tr>
<td height="22" width="13%" align="center">图片转换类</td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_convert</strong>(<em>[image handle],[new type]</em>)</td>
<td height="22" width="25%">将图片数据转换成为指定格式</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_setcompressiontype</strong>(<em>[image handle],[compression type]</em>)</td>
<td height="22" width="25%">指定图片的压缩方式</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_setcompressionquality</strong>(<em>[image handle],[quality value]</em>)</td>
<td height="22" width="25%">指定图片的压缩质量</td>
</tr>
<tr>
<td height="22" width="13%" align="center">尺寸调整类</td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_resize</strong>(<em>[image handle],[new width],[new height],[filter type],[blur],[geometry]</em>)</td>
<td height="22" width="25%">改变图片尺寸</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%">UN KNOW USE <strong>imagick_magnify</strong></td>
<td height="22" width="25%"></td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%">UN KNOW USE <strong>imagick_minify</strong></td>
<td height="22" width="25%"></td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_scale</strong>(<em>[image handle],[new width],[new height],[geometry]</em>)</td>
<td height="22" width="25%">按照指定比例缩小图片</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_sample</strong>(<em>[image handle],[new width],[new height],[geometry]</em>)</td>
<td height="22" width="25%">缩小产生样本图片</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_zoom</strong>(<em>[image handle],[new width],[new height],[geometry]</em>)</td>
<td height="22" width="25%">放大图片</td>
</tr>
<tr>
<td height="22" width="13%" align="center">字体设置类</td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_setfontsize</strong>(<em>[image handle],[size]</em>)</td>
<td height="22" width="25%">设置字体大小</td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%">UN KNOW USE <strong>imagick_setfontstyle</strong></td>
<td height="22" width="25%"></td>
</tr>
<tr>
<td height="22" width="13%" align="center"></td>
<td height="22" width="62%"><em>bool</em> = <strong>imagick_setfontface</strong>(<em>[image handle],[Font Name]</em>)</td>
<td height="22" width="25%">设置采用的字体</td>
</tr>
<tr>
<td height="23" width="13%" align="center">绘图类</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_begindraw</strong>(<em>[image handle])</em></td>
<td height="23" width="25%">开始在一个image上绘画</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_drawannotation</strong>(<em>[image handle],[x],[y],[text])</em></td>
<td height="23" width="25%">在image上的x y开始画一些文字符号</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_drawrectangle</strong>(<em>[image handle],[up x],[up y],[low x],[low y])</em></td>
<td height="23" width="25%">画一个矩形</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_drawellipse</strong>(<em>[image handle],[starting x],[starting y],[ending x],[ending y],[start rotation in degrees],[end rotation in degrees]</em>)</td>
<td height="23" width="25%">画一个椭圆形</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_drawarc</strong>(<em>[image handle],[origin x],[origin y],[ x radius],[ y radius],[ start rotation in degrees],[ end rotation in degrees]</em>)</td>
<td height="23" width="25%">画一个弧形</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_drawcircle</strong>(<em>[image handle],[origin x],[origin y],[</em>perimater x<em>],[</em>perimater y<em>]</em>)</td>
<td height="23" width="25%">画一个圆</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_drawline</strong>(<em>[image handle],[</em>starting <em>x],[</em>starting <em>y],[</em>ending x<em>],[</em>ending y<em>]</em>)</td>
<td height="23" width="25%">画一条线</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_drawpoint</strong>(<em>[image handle],[x</em> coordinate <em>],[y</em> coordinate <em>]</em>)</td>
<td height="23" width="25%">画一个点</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_setfillcolor</strong>(<em>[image handle],[color vlaue]</em>)</td>
<td height="23" width="25%">设置填充颜色</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_setfillopacity</strong>(<em>[image handle],[opactiy]</em>)</td>
<td height="23" width="25%">设置不透明度</td>
</tr>
<tr>
<td height="23" width="13%" align="center">质量增强类</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_rotate</strong>(<em>[image handle],[degrees]</em>)</td>
<td height="23" width="25%">设置旋转图片的角度</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_shear</strong>(<em>[image handle],[</em>x coordinate<em>],[</em>y coordinate<em>]</em>)</td>
<td height="23" width="25%">旋转剪切</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_contrast</strong>(<em>[image handle],[</em>contrast value<em>]</em>)</td>
<td height="23" width="25%">提高或降低图象对比度</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_equalize</strong>(<em>[image handle]</em>)</td>
<td height="23" width="25%">色彩均匀化</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_gamma</strong>(<em>[image handle],[</em>gamma value 0.8 - 2.3<em>]</em>)</td>
<td height="23" width="25%">图象GAMMA调整</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_level</strong>(<em>[image handle],[</em>gamma value 0.8 - 2.3<em>]</em>)</td>
<td height="23" width="25%">图象GAMMA调整</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_modulate</strong>(<em>[image handle],[</em>modulate<em>]</em>)</td>
<td height="23" width="25%">调整亮度,饱和度,色彩</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_negate</strong>(<em>[image handle],[</em>gray scale value<em>]</em>)</td>
<td height="23" width="25%">反色图片</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_normalize</strong>(<em>[image handle]</em>)</td>
<td height="23" width="25%">规格化图片</td>
</tr>
<tr>
<td height="23" width="13%" align="center">图片装饰类</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_border</strong>(<em>[image handle],[</em> x starting position of border <em>],[</em>y starting position of border <em>],[</em>width of border<em>],[</em>height of border<em>]</em>)</td>
<td height="23" width="25%">在图片上化一个边框</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%">UN KNOW USE <strong>imagick_frame</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_raise</strong>(<em>[image handle],[</em> x starting position of border <em>],[</em> y starting position of border <em>],[</em> width of border<em>],[</em> height of border<em>],[raise non-zero]</em>)</td>
<td height="23" width="25%">浮雕效果</td>
</tr>
<tr>
<td height="23" width="13%" align="center">效率滤镜类</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_charcoal</strong>(<em>[image handle],[</em>the radius of pixel neighborhood<em>],[</em>the standard deviation of the Gaussian, in pixels<em>]</em>)</td>
<td height="23" width="25%">碳笔</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_implode</strong>(<em>[image handle],[</em>define the extent of the implosion<em>]</em>)</td>
<td height="23" width="25%">内曝效果</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_oilpaint</strong>(<em>[image handle],[</em>the radius of the circular<br />
neighborhood<em>]</em>)</td>
<td height="23" width="25%">油画效果</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_solarize</strong>(<em>[image handle],[</em>define the extent of solarization - this value is between 0 and MaxRGB<em>]</em>)</td>
<td height="23" width="25%">反转曝光</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_swirl</strong>(<em>[image handle],[</em>define the tightness of the swirling<br />
effect <em>]</em>)</td>
<td height="23" width="25%">旋涡</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_wave</strong>(<em>[image handle],[</em>the amplitude of the wave<em>],[</em>the frequency of the wave<em>]</em>)</td>
<td height="23" width="25%">水波纹</td>
</tr>
<tr>
<td height="23" width="13%" align="center">图片滤镜类</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_blur</strong>(<em>[image handle],[</em>the radius of the Gaussian, in<br />
pixels, not counter the center pixel<em>],[</em>the standard deviation of the<br />
Gaussian, in pixels<em>]</em>)</td>
<td height="23" width="25%">模糊</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_despeckle</strong>(<em>[image handle]</em>)</td>
<td height="23" width="25%">平滑聚焦图象</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_edge</strong>(<em>[image handle],[</em>the radius of the pixel neighbor- hood; using 0 will cause a suitable radius to be selected for you<em>]</em>)</td>
<td height="23" width="25%">边缘锐化</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_emboss</strong>(<em>[image handle],[</em>the radius of the pixel neighbor-<br />
hood<em>],[</em>the standard deviation of the Gaussian, in pixels<em>]</em>)</td>
<td height="23" width="25%">浮雕效果</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_enhance</strong>(<em>[image handle]</em>)</td>
<td height="23" width="25%">图象增强</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_gaussianblur</strong>(<em>[image handle],[</em>he radius of the Gaussian, in pixels, not counting the center pixel; using 0 will cause a suitable radius to be selected for you<em>],[</em>the standard deviation of the Gaussian, in pixels<em>]</em>)</td>
<td height="23" width="25%">高斯模糊</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_medianfilter</strong>(<em>[image handle],[</em>the radius of the pixel neighbor-hood<em>]</em>)</td>
<td height="23" width="25%">平滑过滤图象</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_motionblur</strong>(<em>[image handle],[</em>the radius of the Gaussian, in<br />
pixels, not counter the center pixel<em>],[</em>the standard deviation of the<br />
Gaussian, in pixels<em>],[</em>apply the effect along this angle<em>]</em>)</td>
<td height="23" width="25%">动感模糊</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_reducenoise</strong>(<em>[image handle],[</em>the radius of the pixel neighborhood<em>]</em>)</td>
<td height="23" width="25%">降噪</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_shade</strong></td>
<td height="23" width="25%">阴影</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_sharpen</strong></td>
<td height="23" width="25%">锐化</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_spread</strong></td>
<td height="23" width="25%">发散</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_threshold</strong></td>
<td height="23" width="25%">临界值</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_unsharpmask</strong></td>
<td height="23" width="25%">unsharpmask锐化</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%">UN KNOW USE <em>bool</em> = <strong>imagick_flatten</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center">图片列表类</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_next</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_prev</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_first</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_goto</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_getlistsize</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_getlistindex</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_getimagefromlist</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_pushlist</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_poplist</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center">图片变形类</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_chop</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_crop</strong>(<em>[image handle],[</em>x starting position of border<em>],[</em>y starting position of border<em>],[</em>width of border<em>],[</em>height of border<em>]</em>)</td>
<td height="23" width="25%">从图片上截取</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_flip</strong> (<em>[image handle]</em>)</td>
<td height="23" width="25%">图象翻转</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_flop</strong></td>
<td height="23" width="25%">左右转换</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_roll</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_profile</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_rgbtransform</strong></td>
<td height="23" width="25%">色彩变更</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_transformrgb</strong></td>
<td height="23" width="25%">色彩变更</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_mosaic</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_transparent</strong>(<em>[image handle],[color value]</em>)</td>
<td height="23" width="25%">设置指定颜色成为透明色</td>
</tr>
<tr>
<td height="23" width="13%" align="center">图片量子化</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_ordereddither</strong>(<em>[image handle]</em>)</td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center">图片合成类</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_composite</strong></td>
<td height="23" width="25%">图象融合</td>
</tr>
<tr>
<td height="23" width="13%" align="center">图片属性设置</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_set_image_comment</strong>(<em>[image handle]</em>,<em>[</em>the comment to set in the image<em>]</em>)</td>
<td height="23" width="25%">设置图象的一些参数</td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_set_image_quality</strong>(<em>[image handle]</em>,<em>[</em>quality value<em>]</em>)</td>
<td height="23" width="25%">设置图象的质量</td>
</tr>
<tr>
<td height="23" width="13%" align="center">句柄销毁类</td>
<td height="23" width="62%"><em>bool</em> = <strong>imagick_destroyhandle</strong>(<em>[image handle]</em>)</td>
<td height="23" width="25%">干掉指定的image handle</td>
</tr>
<tr>
<td height="23" width="13%" align="center">兼容的函数</td>
<td height="23" width="62%"><strong>imagick_read =&gt; imagick_readimage</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_free =&gt; imagick_destroyhandle</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center">抛弃的函数</td>
<td height="23" width="62%"><strong>imagick_add_resource</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_list_magickinfo</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_new</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_init</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_copy_sample</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_copy_resize</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_copy_crop</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_copy_shear</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_copy_rotate</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_copy_morph</strong></td>
<td height="23" width="25%"></td>
</tr>
<tr>
<td height="23" width="13%" align="center"></td>
<td height="23" width="62%"><strong>imagick_dump</strong></td>
<td height="23" width="25%"></td>
</tr>
</table>
</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://ruby.blog.35.com//15.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>PHP图片处理类</title>
		<link>http://ruby.blog.35.com//14.html</link>
		<comments>http://ruby.blog.35.com//14.html#comments</comments>
		<pubDate>Fri, 25 Apr 2008 08:56:42 +0000</pubDate>
		<dc:creator>RestOnRails</dc:creator>
		
		<guid isPermaLink="false">http://ruby.blog.35.com/php/14.html</guid>
		<description><![CDATA[


&#60;?php
&#60; ?php
/**
* 基本图片处理，用于完成图片缩入，水印添加
* 当水印图超过目标图片尺寸时，水印图能自动适应目标图片而缩小
* 水印图可以设置跟背景的合并度
*/
/*
使用方法:
    自动裁切:
    程序会按照图片的尺寸从中部裁切最大的正方形，并按目标尺寸进行缩略
    $t-&#62;setSrcImg(&#8221;img/test.jpg&#8221;);
    $t-&#62;setCutType(1);//这一句就OK了
    $t-&#62;setDstImg(&#8221;tmp/new_test.jpg&#8221;);
    $t-&#62;createImg(60,60);
    手工裁切:
    程序会按照指定的位置从源图上取图
    $t-&#62;setSrcImg(&#8221;img/test.jpg&#8221;);
    $t-&#62;setCutType(2);//指明为手工裁切
    $t-&#62;setSrcCutPosition(100, 100);// 源图起点坐标
    $t-&#62;setRectangleCut(300, 200);// 裁切尺寸
    $t-&#62;setDstImg(&#8221;tmp/new_test.jpg&#8221;);
    $t-&#62;createImg(300,200);
*/
class ThumbHandler
{
    var $dst_img;// 目标文件
    var $h_src; // 图片资源句柄
    var $h_dst;// 新图句柄
    var $h_mask;// 水印句柄
    var $img_create_quality = 100;// 图片生成质量
    var $img_display_quality = 80;// 图片显示质量,默认为75
    var $img_scale = 0;// 图片缩放比例
    var $src_w = [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-14"></span></p>
<table>
<tr>
<td>&lt;?php<br />
&lt; ?php<br />
/**<br />
* 基本图片处理，用于完成图片缩入，水印添加<br />
* 当水印图超过目标图片尺寸时，水印图能自动适应目标图片而缩小<br />
* 水印图可以设置跟背景的合并度<br />
*/</p>
<p>/*<br />
使用方法:<br />
    自动裁切:<br />
    程序会按照图片的尺寸从中部裁切最大的正方形，并按目标尺寸进行缩略</p>
<p>    $t-&gt;setSrcImg(&#8221;img/test.jpg&#8221;);<br />
    $t-&gt;setCutType(1);//这一句就OK了<br />
    $t-&gt;setDstImg(&#8221;tmp/new_test.jpg&#8221;);<br />
    $t-&gt;createImg(60,60);</p>
<p>    手工裁切:<br />
    程序会按照指定的位置从源图上取图</p>
<p>    $t-&gt;setSrcImg(&#8221;img/test.jpg&#8221;);<br />
    $t-&gt;setCutType(2);//指明为手工裁切<br />
    $t-&gt;setSrcCutPosition(100, 100);// 源图起点坐标<br />
    $t-&gt;setRectangleCut(300, 200);// 裁切尺寸<br />
    $t-&gt;setDstImg(&#8221;tmp/new_test.jpg&#8221;);<br />
    $t-&gt;createImg(300,200);<br />
*/<br />
class ThumbHandler<br />
{<br />
    var $dst_img;// 目标文件<br />
    var $h_src; // 图片资源句柄<br />
    var $h_dst;// 新图句柄<br />
    var $h_mask;// 水印句柄<br />
    var $img_create_quality = 100;// 图片生成质量<br />
    var $img_display_quality = 80;// 图片显示质量,默认为75<br />
    var $img_scale = 0;// 图片缩放比例<br />
    var $src_w = 0;// 原图宽度<br />
    var $src_h = 0;// 原图高度<br />
    var $dst_w = 0;// 新图总宽度<br />
    var $dst_h = 0;// 新图总高度<br />
    var $fill_w;// 填充图形宽<br />
    var $fill_h;// 填充图形高<br />
    var $copy_w;// 拷贝图形宽<br />
    var $copy_h;// 拷贝图形高<br />
    var $src_x = 0;// 原图绘制起始横坐标<br />
    var $src_y = 0;// 原图绘制起始纵坐标<br />
    var $start_x;// 新图绘制起始横坐标<br />
    var $start_y;// 新图绘制起始纵坐标<br />
    var $mask_word;// 水印文字<br />
    var $mask_img;// 水印图片<br />
    var $mask_pos_x = 0;// 水印横坐标<br />
    var $mask_pos_y = 0;// 水印纵坐标<br />
    var $mask_offset_x = 5;// 水印横向偏移<br />
    var $mask_offset_y = 5;// 水印纵向偏移<br />
    var $font_w;// 水印字体宽<br />
    var $font_h;// 水印字体高<br />
    var $mask_w;// 水印宽<br />
    var $mask_h;// 水印高<br />
    var $mask_font_color = &#8220;#ffffff&#8221;;// 水印文字颜色<br />
    var $mask_font = 2;// 水印字体<br />
    var $font_size;// 尺寸<br />
    var $mask_position = 0;// 水印位置<br />
    var $mask_img_pct = 50;// 图片合并程度,值越大，合并程序越低<br />
    var $mask_txt_pct = 50;// 文字合并程度,值越小，合并程序越低<br />
    var $img_border_size = 0;// 图片边框尺寸<br />
    var $img_border_color;// 图片边框颜色<br />
    var $_flip_x=0;// 水平翻转次数<br />
    var $_flip_y=0;// 垂直翻转次数</p>
<p>    var $cut_type=0;// 剪切类型</p>
<p>    var $img_type;// 文件类型</p>
<p>    // 文件类型定义,并指出了输出图片的函数<br />
    var $all_type = array(<br />
        &#8220;jpg&#8221; =&gt; array(&#8221;output&#8221;=&gt;&#8221;imagejpeg&#8221;),<br />
        &#8220;gif&#8221; =&gt; array(&#8221;output&#8221;=&gt;&#8221;imagegif&#8221;),<br />
        &#8220;png&#8221; =&gt; array(&#8221;output&#8221;=&gt;&#8221;imagepng&#8221;),<br />
        &#8220;wbmp&#8221; =&gt; array(&#8221;output&#8221;=&gt;&#8221;image2wbmp&#8221;),<br />
        &#8220;jpeg&#8221; =&gt; array(&#8221;output&#8221;=&gt;&#8221;imagejpeg&#8221;));</p>
<p>    /**<br />
     * 构造函数<br />
     */<br />
    function ThumbHandler()<br />
    {<br />
        $this-&gt;mask_font_color = &#8220;#ffffff&#8221;;<br />
        $this-&gt;font = 2;<br />
        $this-&gt;font_size = 12;<br />
    }</p>
<p>    /**<br />
     * 取得图片的宽<br />
     */<br />
    function getImgWidth($src)<br />
    {<br />
        return imagesx($src);<br />
    }</p>
<p>    /**<br />
     * 取得图片的高<br />
     */<br />
    function getImgHeight($src)<br />
    {<br />
        return imagesy($src);<br />
    }</p>
<p>    /**<br />
     * 设置图片生成路径<br />
     *<br />
     * @param    string    $src_img   图片生成路径<br />
     */<br />
    function setSrcImg($src_img, $img_type=null)<br />
    {<br />
        if(!file_exists($src_img))<br />
        {<br />
            die(&#8221;图片不存在&#8221;);<br />
        }<br />
       <br />
        if(!empty($img_type))<br />
        {<br />
            $this-&gt;img_type = $img_type;<br />
        }<br />
        else<br />
        {<br />
            $this-&gt;img_type = $this-&gt;_getImgType($src_img);<br />
        }<br />
       <br />
        $this-&gt;_checkValid($this-&gt;img_type);</p>
<p>        // file_get_contents函数要求php版本&gt;4.3.0<br />
        $src = &#8221;;<br />
        if(function_exists(&#8221;file_get_contents&#8221;))<br />
        {<br />
            $src = file_get_contents($src_img);<br />
        }<br />
        else<br />
        {<br />
            $handle = fopen ($src_img, &#8220;r&#8221;);<br />
            while (!feof ($handle))<br />
            {<br />
                $src .= fgets($fd, 4096);<br />
            }<br />
            fclose ($handle);<br />
        }<br />
        if(empty($src))<br />
        {<br />
            die(&#8221;图片源为空&#8221;);<br />
        }<br />
        $this-&gt;h_src = @ImageCreateFromString($src);<br />
        $this-&gt;src_w = $this-&gt;getImgWidth($this-&gt;h_src);<br />
        $this-&gt;src_h = $this-&gt;getImgHeight($this-&gt;h_src);<br />
    }</p>
<p>    /**<br />
     * 设置图片生成路径<br />
     *<br />
     * @param    string    $dst_img   图片生成路径<br />
     */<br />
    function setDstImg($dst_img)<br />
    {<br />
        $arr = explode(&#8217;/',$dst_img);<br />
        $last = array_pop($arr);<br />
        $path = implode(&#8217;/',$arr);<br />
        $this-&gt;_mkdirs($path);<br />
        $this-&gt;dst_img = $dst_img;<br />
    }</p>
<p>    /**<br />
     * 设置图片的显示质量<br />
     *<br />
     * @param    string      $n    质量<br />
     */<br />
    function setImgDisplayQuality($n)<br />
    {<br />
        $this-&gt;img_display_quality = (int)$n;<br />
    }</p>
<p>    /**<br />
     * 设置图片的生成质量<br />
     *<br />
     * @param    string      $n    质量<br />
     */<br />
    function setImgCreateQuality($n)<br />
    {<br />
        $this-&gt;img_create_quality = (int)$n;<br />
    }</p>
<p>    /**<br />
     * 设置文字水印<br />
     *<br />
     * @param    string     $word    水印文字<br />
     * @param    integer    $font    水印字体<br />
     * @param    string     $color   水印字体颜色<br />
     */<br />
    function setMaskWord($word)<br />
    {<br />
        $this-&gt;mask_word .= $word;<br />
    }</p>
<p>    /**<br />
     * 设置字体颜色<br />
     *<br />
     * @param    string     $color    字体颜色<br />
     */<br />
    function setMaskFontColor($color=&#8221;#ffffff&#8221;)<br />
    {<br />
        $this-&gt;mask_font_color = $color;<br />
    }</p>
<p>    /**<br />
     * 设置水印字体<br />
     *<br />
     * @param    string|integer    $font    字体<br />
     */<br />
    function setMaskFont($font=2)<br />
    {<br />
        if(!is_numeric($font) &amp;&amp; !file_exists($font))<br />
        {<br />
            die(&#8221;字体文件不存在&#8221;);<br />
        }<br />
        $this-&gt;font = $font;<br />
    }</p>
<p>    /**<br />
     * 设置文字字体大小,仅对truetype字体有效<br />
     */<br />
    function setMaskFontSize($size = &#8220;12&#8243;)<br />
    {<br />
        $this-&gt;font_size = $size;<br />
    }</p>
<p>    /**<br />
     * 设置图片水印<br />
     *<br />
     * @param    string    $img     水印图片源<br />
     */<br />
    function setMaskImg($img)<br />
    {<br />
        $this-&gt;mask_img = $img;<br />
    }</p>
<p>    /**<br />
     * 设置水印横向偏移<br />
     *<br />
     * @param    integer     $x    横向偏移量<br />
     */<br />
    function setMaskOffsetX($x)<br />
    {<br />
        $this-&gt;mask_offset_x = (int)$x;<br />
    }</p>
<p>    /**<br />
     * 设置水印纵向偏移<br />
     *<br />
     * @param    integer     $y    纵向偏移量<br />
     */<br />
    function setMaskOffsetY($y)<br />
    {<br />
        $this-&gt;mask_offset_y = (int)$y;<br />
    }</p>
<p>    /**<br />
     * 指定水印位置<br />
     *<br />
     * @param    integer     $position    位置,1:左上,2:左下,3:右上,0/4:右下<br />
     */<br />
    function setMaskPosition($position=0)<br />
    {<br />
        $this-&gt;mask_position = (int)$position;<br />
    }</p>
<p>    /**<br />
     * 设置图片合并程度<br />
     *<br />
     * @param    integer     $n    合并程度<br />
     */<br />
    function setMaskImgPct($n)<br />
    {<br />
        $this-&gt;mask_img_pct = (int)$n;<br />
    }</p>
<p>    /**<br />
     * 设置文字合并程度<br />
     *<br />
     * @param    integer     $n    合并程度<br />
     */<br />
    function setMaskTxtPct($n)<br />
    {<br />
        $this-&gt;mask_txt_pct = (int)$n;<br />
    }</p>
<p>    /**<br />
     * 设置缩略图边框<br />
     *<br />
     * @param    (类型)     (参数名)    (描述)<br />
     */<br />
    function setDstImgBorder($size=1, $color=&#8221;#000000&#8243;)<br />
    {<br />
        $this-&gt;img_border_size = (int)$size;<br />
        $this-&gt;img_border_color = $color;<br />
    }</p>
<p>    /**<br />
     * 水平翻转<br />
     */<br />
    function flipH()<br />
    {<br />
        $this-&gt;_flip_x++;<br />
    }</p>
<p>    /**<br />
     * 垂直翻转<br />
     */<br />
    function flipV()<br />
    {<br />
        $this-&gt;_flip_y++;<br />
    }</p>
<p>    /**<br />
     * 设置剪切类型<br />
     *<br />
     * @param    (类型)     (参数名)    (描述)<br />
     */<br />
    function setCutType($type)<br />
    {<br />
        $this-&gt;cut_type = (int)$type;<br />
    }</p>
<p>    /**<br />
     * 设置图片剪切<br />
     *<br />
     * @param    integer     $width    矩形剪切<br />
     */<br />
    function setRectangleCut($width, $height)<br />
    {<br />
        $this-&gt;fill_w = (int)$width;<br />
        $this-&gt;fill_h = (int)$height;<br />
    }</p>
<p>    /**<br />
     * 设置源图剪切起始坐标点<br />
     *<br />
     * @param    (类型)     (参数名)    (描述)<br />
     */<br />
    function setSrcCutPosition($x, $y)<br />
    {<br />
        $this-&gt;src_x = (int)$x;<br />
        $this-&gt;src_y = (int)$y;<br />
    }</p>
<p>    /**<br />
     * 创建图片,主函数<br />
     * @param    integer    $a     当缺少第二个参数时，此参数将用作百分比，<br />
     *                             否则作为宽度值<br />
     * @param    integer    $b     图片缩放后的高度<br />
     */<br />
    function createImg($a, $b=null)<br />
    {<br />
        $num = func_num_args();<br />
        if(1 == $num)<br />
        {<br />
            $r = (int)$a;<br />
            if($r &lt; 1)<br />
            {<br />
                die(&#8221;图片缩放比例不得小于1&#8243;);<br />
            }<br />
            $this-&gt;img_scale = $r;<br />
            $this-&gt;_setNewImgSize($r);<br />
        }</p>
<p>        if(2 == $num)<br />
        {<br />
            $w = (int)$a;<br />
            $h = (int)$b;<br />
            if(0 == $w)<br />
            {<br />
                die(&#8221;目标宽度不能为0&#8243;);<br />
            }<br />
            if(0 == $h)<br />
            {<br />
                die(&#8221;目标高度不能为0&#8243;);<br />
            }<br />
            $this-&gt;_setNewImgSize($w, $h);<br />
        }</p>
<p>        if($this-&gt;_flip_x%2!=0)<br />
        {<br />
            $this-&gt;_flipH($this-&gt;h_src);<br />
        }</p>
<p>        if($this-&gt;_flip_y%2!=0)<br />
        {<br />
            $this-&gt;_flipV($this-&gt;h_src);<br />
        }<br />
        $this-&gt;_createMask();<br />
        $this-&gt;_output();</p>
<p>        // 释放<br />
        if(imagedestroy($this-&gt;h_src) &amp;&amp; imagedestroy($this-&gt;h_dst))<br />
        {<br />
            Return true;<br />
        }<br />
        else<br />
        {<br />
            Return false;<br />
        }<br />
    }</p>
<p>    /**<br />
     * 生成水印,调用了生成水印文字和水印图片两个方法<br />
     */<br />
    function _createMask()<br />
    {<br />
        if($this-&gt;mask_word)<br />
        {<br />
            // 获取字体信息<br />
            $this-&gt;_setFontInfo();</p>
<p>            if($this-&gt;_isFull())<br />
            {<br />
                die(&#8221;水印文字过大&#8221;);<br />
            }<br />
            else<br />
            {<br />
                $this-&gt;h_dst = imagecreatetruecolor($this-&gt;dst_w, $this-&gt;dst_h);<br />
                $white = ImageColorAllocate($this-&gt;h_dst,255,255,255);<br />
                imagefilledrectangle($this-&gt;h_dst,0,0,$this-&gt;dst_w,$this-&gt;dst_h,$white);// 填充背景色<br />
                $this-&gt;_drawBorder();<br />
                imagecopyresampled( $this-&gt;h_dst, $this-&gt;h_src,<br />
                                    $this-&gt;start_x, $this-&gt;start_y,<br />
                                    $this-&gt;src_x, $this-&gt;src_y,<br />
                                    $this-&gt;fill_w, $this-&gt;fill_h,<br />
                                    $this-&gt;copy_w, $this-&gt;copy_h);<br />
                $this-&gt;_createMaskWord($this-&gt;h_dst);<br />
            }<br />
        }</p>
<p>        if($this-&gt;mask_img)<br />
        {<br />
            $this-&gt;_loadMaskImg();//加载时，取得宽高</p>
<p>            if($this-&gt;_isFull())<br />
            {<br />
                // 将水印生成在原图上再拷<br />
                $this-&gt;_createMaskImg($this-&gt;h_src);<br />
                $this-&gt;h_dst = imagecreatetruecolor($this-&gt;dst_w, $this-&gt;dst_h);<br />
                $white = ImageColorAllocate($this-&gt;h_dst,255,255,255);<br />
                imagefilledrectangle($this-&gt;h_dst,0,0,$this-&gt;dst_w,$this-&gt;dst_h,$white);// 填充背景色<br />
                $this-&gt;_drawBorder();<br />
                imagecopyresampled( $this-&gt;h_dst, $this-&gt;h_src,<br />
                                    $this-&gt;start_x, $this-&gt;start_y,<br />
                                    $this-&gt;src_x, $this-&gt;src_y,<br />
                                    $this-&gt;fill_w, $this-&gt;start_y,<br />
                                    $this-&gt;copy_w, $this-&gt;copy_h);<br />
            }<br />
            else<br />
            {<br />
                // 创建新图并拷贝<br />
                $this-&gt;h_dst = imagecreatetruecolor($this-&gt;dst_w, $this-&gt;dst_h);<br />
                $white = ImageColorAllocate($this-&gt;h_dst,255,255,255);<br />
                imagefilledrectangle($this-&gt;h_dst,0,0,$this-&gt;dst_w,$this-&gt;dst_h,$white);// 填充背景色<br />
                $this-&gt;_drawBorder();<br />
                imagecopyresampled( $this-&gt;h_dst, $this-&gt;h_src,<br />
                                    $this-&gt;start_x, $this-&gt;start_y,<br />
                                    $this-&gt;src_x, $this-&gt;src_y,<br />
                                    $this-&gt;fill_w, $this-&gt;fill_h,<br />
                                    $this-&gt;copy_w, $this-&gt;copy_h);<br />
                $this-&gt;_createMaskImg($this-&gt;h_dst);<br />
            }<br />
        }</p>
<p>        if(empty($this-&gt;mask_word) &amp;&amp; empty($this-&gt;mask_img))<br />
        {<br />
            $this-&gt;h_dst = imagecreatetruecolor($this-&gt;dst_w, $this-&gt;dst_h);<br />
            $white = ImageColorAllocate($this-&gt;h_dst,255,255,255);<br />
            imagefilledrectangle($this-&gt;h_dst,0,0,$this-&gt;dst_w,$this-&gt;dst_h,$white);// 填充背景色<br />
            $this-&gt;_drawBorder();</p>
<p>            imagecopyresampled( $this-&gt;h_dst, $this-&gt;h_src,<br />
                        $this-&gt;start_x, $this-&gt;start_y,<br />
                        $this-&gt;src_x, $this-&gt;src_y,<br />
                        $this-&gt;fill_w, $this-&gt;fill_h,<br />
                        $this-&gt;copy_w, $this-&gt;copy_h);<br />
        }<br />
    }</p>
<p>    /**<br />
     * 画边框<br />
     */<br />
    function _drawBorder()<br />
    {<br />
        if(!empty($this-&gt;img_border_size))<br />
        {<br />
            $c = $this-&gt;_parseColor($this-&gt;img_border_color);<br />
            $color = ImageColorAllocate($this-&gt;h_src,$c[0], $c[1], $c[2]);<br />
            imagefilledrectangle($this-&gt;h_dst,0,0,$this-&gt;dst_w,$this-&gt;dst_h,$color);// 填充背景色<br />
        }<br />
    }</p>
<p>    /**<br />
     * 生成水印文字<br />
     */<br />
    function _createMaskWord($src)<br />
    {<br />
        $this-&gt;_countMaskPos();<br />
        $this-&gt;_checkMaskValid();</p>
<p>        $c = $this-&gt;_parseColor($this-&gt;mask_font_color);<br />
        $color = imagecolorallocatealpha($src, $c[0], $c[1], $c[2], $this-&gt;mask_txt_pct);</p>
<p>        if(is_numeric($this-&gt;font))<br />
        {<br />
            imagestring($src,<br />
                        $this-&gt;font,<br />
                        $this-&gt;mask_pos_x, $this-&gt;mask_pos_y,<br />
                        $this-&gt;mask_word,<br />
                        $color);<br />
        }<br />
        else<br />
        {<br />
            imagettftext($src,<br />
                        $this-&gt;font_size, 0,<br />
                        $this-&gt;mask_pos_x, $this-&gt;mask_pos_y,<br />
                        $color,<br />
                        $this-&gt;font,<br />
                        $this-&gt;mask_word);<br />
        }<br />
    }</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://ruby.blog.35.com//14.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>將 Zend Framework 放進 CodeIgniter</title>
		<link>http://ruby.blog.35.com//13.html</link>
		<comments>http://ruby.blog.35.com//13.html#comments</comments>
		<pubDate>Thu, 17 Apr 2008 16:17:09 +0000</pubDate>
		<dc:creator>RestOnRails</dc:creator>
		
		<guid isPermaLink="false">http://ruby.blog.35.com/php/codeigniter/13.html</guid>
		<description><![CDATA[
基本上這裡所謂的整合就是用 CodeIgniter 的 hooks 來做, 單純用 hooks 來設定 include_path, 不然直接設定 include_path, 把 Zend Framework 當成跟 PEAR 類似的放著也可以, 不過由於這樣整合看起來比較帥, 之後程式如果搬家也不會因為失誤而漏了 ZF :p 又, 用 SVN 來管理也方便。
1. 下載 ZF, 把 library 放進 CodeIgniter
就依我的方式, 我是把 ZF 解開後, 把 library copy 放到 CodeIgniter 的 system 下面, 命名為 zendframework
/project/system/zendframework
2. 開啟 CodeIgniter hook
修改 /project/system/application/config/config.php

$config['enable_hooks'] = TRUE;  

$config['enable_hooks'] = TRUE; 
3. 增加一個 hook 設定
修改 /project/system/application/config/hooks.php, [...]]]></description>
			<content:encoded><![CDATA[<h2></h2>
<p>基本上這裡所謂的整合就是用 CodeIgniter 的 hooks 來做, 單純用 hooks 來設定 include_path, 不然直接設定 include_path, 把 Zend Framework 當成跟 PEAR 類似的放著也可以, 不過由於這樣整合看起來比較帥, 之後程式如果搬家也不會因為失誤而漏了 ZF :p 又, 用 SVN 來管理也方便。<span id="more-13"></span></p>
<p><strong>1. 下載 ZF, 把 library 放進 CodeIgniter</strong><br />
就依我的方式, 我是把 ZF 解開後, 把 library copy 放到 CodeIgniter 的 system 下面, 命名為 zendframework</p>
<p>/project/system/zendframework</p>
<p><strong>2. 開啟 CodeIgniter hook</strong><br />
修改 /project/system/application/config/config.php</p>
<ol>
<li>$config['enable_hooks'] = TRUE;  </li>
</ol>
<p><textarea cols="60" rows="10" name="code">$config['enable_hooks'] = TRUE; </textarea></p>
<p><strong>3. 增加一個 hook 設定</strong><br />
修改 /project/system/application/config/hooks.php, 加入下列程式碼</p>
<ol>
<li>$hook['pre_controller'][] = array(  </li>
<li>        &#8217;class&#8217;         =&gt; &#8217;Zendframework&#8217;,  </li>
<li>        &#8217;function&#8217;      =&gt; &#8217;index&#8217;,  </li>
<li>        &#8217;filename&#8217;      =&gt; &#8217;zendframework.php&#8217;,  </li>
<li>        &#8217;filepath&#8217;      =&gt; &#8217;hooks&#8217;  </li>
<li>);  </li>
</ol>
<p><textarea cols="60" rows="10" name="code">$hook['pre_controller'][] = array(         &#8216;class&#8217;         =&gt; &#8216;Zendframework&#8217;,         &#8216;function&#8217;      =&gt; &#8216;index&#8217;,         &#8216;filename&#8217;      =&gt; &#8216;zendframework.php&#8217;,         &#8216;filepath&#8217;      =&gt; &#8216;hooks&#8217; ); </textarea><strong>4. 增加 hook 程式</strong></p>
<p>在 /project/system/application/hooks 裡, 增加一個 zendframework.php 內容如下</p>
<ol>
<li>&lt;?php if (!defined(&#8217;BASEPATH&#8217;)) exit(&#8217;No direct script access allowed&#8217;);  </li>
<li>  </li>
<li>class Zendframework{  </li>
<li>        function index(){  </li>
<li>                ini_set(&#8217;include_path&#8217;,ini_get(&#8217;include_path&#8217;).&#8217;:&#8217;.BASEPATH.&#8217;zendframework/&#8217;);  </li>
<li>        }  </li>
<li>}  </li>
<li>  </li>
<li>?&gt;  </li>
</ol>
<p><textarea cols="60" rows="10" name="code">&lt;?php if (!defined(&#8217;BASEPATH&#8217;)) exit(&#8217;No direct script access allowed&#8217;);  class Zendframework{         function index(){                 ini_set(&#8217;include_path&#8217;,ini_get(&#8217;include_path&#8217;).&#8217;:&#8217;.BASEPATH.&#8217;zendframework/&#8217;);         } }  ?&gt; </textarea><strong>5. 最後就可以在 CodeIgniter 中直接叫 ZF 來用啦! </strong></p>
<p>UPDATE:</p>
<p>我的方式是用 Hook 的方式來掛進 ZF, <a href="http://thislab.com/2008/02/21/using-zend-framework-with-codeigniter/">這裡有篇文章</a>是用 library 的方式來把 ZF 包進來, 可以看看。</p>
<p>話說好像很少看到有人在用 hook~</p>
]]></content:encoded>
			<wfw:commentRss>http://ruby.blog.35.com//13.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>ruby 1.8.7 预览版1发布了</title>
		<link>http://ruby.blog.35.com//12.html</link>
		<comments>http://ruby.blog.35.com//12.html#comments</comments>
		<pubDate>Wed, 16 Apr 2008 14:57:50 +0000</pubDate>
		<dc:creator>RestOnRails</dc:creator>
		
		<guid isPermaLink="false">http://ruby.blog.35.com/rails/ruby/12.html</guid>
		<description><![CDATA[ruby 1.8.7的预览版发布了，这个预览版包含了大量的bug修复、新的特性和性能方面的提升。关于1.8.7的新的特性请看：
http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7_preview1/NEWS
bug的修复和功能改进
http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7_preview1/ChangeLog
预计ruby 1.8.7的正式版本也将于不久之后正式发布。
]]></description>
			<content:encoded><![CDATA[<p>ruby 1.8.7的预览版发布了，这个预览版包含了大量的bug修复、新的特性和性能方面的提升。关于1.8.7的新的特性请看：</p>
<p><a target="_blank" href="http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7_preview1/NEWS">http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7_preview1/NEWS</a></p>
<p>bug的修复和功能改进</p>
<p><a target="_blank" href="http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7_preview1/ChangeLog">http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7_preview1/ChangeLog</a></p>
<p>预计ruby 1.8.7的正式版本也将于不久之后正式发布。</p>
]]></content:encoded>
			<wfw:commentRss>http://ruby.blog.35.com//12.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ruby on Rails 2.0的新特性介绍</title>
		<link>http://ruby.blog.35.com//11.html</link>
		<comments>http://ruby.blog.35.com//11.html#comments</comments>
		<pubDate>Tue, 15 Apr 2008 11:32:53 +0000</pubDate>
		<dc:creator>RestOnRails</dc:creator>
		
		<guid isPermaLink="false">http://ruby.blog.35.com/rails/%e6%9c%aa%e5%88%86%e7%b1%bb/11.html</guid>
		<description><![CDATA[ 万众瞩目的Ruby on Rails 2.0已经发布了，Rails框架在2004年诞生以来，一直保持着相当快的版本升级速度：2005年发布了Rails1.0版本，2006年初发布Rails1.1版本，2007年初发布Rails1.2版本，而还没有等到2008年，在2007年圣诞前夕的12月6日，Rails2.0已经发布。
 Rails框架每个大的版本升级都给我们带来了相当多的新功能，新惊喜。Rails1.0带给我们完善的单元测试和集成测试；Rails1.1带给我们DataBase Migration和RJS；Rails1.2让我们看到了REST的光明前景，那么Rails2.0又将带给我们什么呢？ 我粗略的翻译了一下Rails框架作者DHH写的Rails2.0框架介绍文章，以下翻译自DHH的文章，原文在：
 http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done
 在经过差不多一年的开发之后，Rails2.0终于发布了。这是一个棒极了的Rails版本，包括了大量堪称伟大的新特性，无数的bugfix和大量功能的打磨。我们花了无数的精力去打造这样一个非常完美合理的软件包。
 这也是Rails框架发展历史上的一个里程碑。我个人在Rails框架上面的开发工作已经有四年半的时间了，并且我们现在的贡献者也越来越多。我对这几年我们所做出的工作和我们一直坚持的信念感到非常的满意。我们一直在坚持这一点并且不断推动它。
 在详细的介绍Rails2.0之前，我要向那些为Rails框架做出过贡献的每一个人致以深深的谢意，不论是像一个家庭那样其乐融融的Rails核心开发团队，还是成千上万的、而且年复一年为Rails提交补丁，积极参与Rails社区人们。Rails2.0也是大规模开源软件开发社区的一个重大胜利，而你完全可以自豪于你在Rails社区当中扮演的角色和做出的贡献。干杯！
 现在让我们简单的窥一斑见全豹的看看Rails的那些闪闪发光的特性：
 Action Pack: Resources
 Controller里面充斥着大量action方法的时代已经过去了，我们对REST架构的应用进行了大量的改进和提高。首先，我们不再使用分号来隔离自定义的方法，而是采用斜线，例如原来是 /people/1;edit的URL，现在改成了 /people/1/edit.另外我们还对URL路由资源添加了命名空间的支持，因此像后台管理的接口你可以像这样非常简单的定义：
 ruby 代码
 map.namespace(:admin) do &#124;admin&#124;   
   admin.resources :products,   
     :collection =&#62; { :inventory =&#62; :get },   
     :member     =&#62; { :duplicate =&#62; :post },   
     :has_many   =&#62; [ :tags, :images, :variants ]   
 end  
 这种方式可以让你按照如下的方式定义命名路由，例如：inventory_admin_products_url和 admin_product_tags_url等等。为了方便的记录所有的路由规则，我们添加了一个rake任务叫做“rake routes”，它能够列举出来routes.rb定义的所有命名路由规则。
 此外我们还引入了一个新的约定，即所有基于资源的controller默认都是复数形式的。这样即便单个资源在不同的路由规则中被多次引用，仍然可以指向同一个controller来处理，例如：
 ruby 代码
 # /avatars/45 =&#62; AvatarsController#show   
 map.resources :avatars  
   
 # /people/5/avatar =&#62; AvatarsController#show    
 map.resources :people, :has_one =&#62; :avatar  
 Action Pack: Multiview
 与资源映射一起进行功能增强的还有MultiView。我们已经有了respond_to方法，但我们可以更进一步，把MultiView控制延伸到模板里面去。我们现在可以根据模板文件的后缀格式来决定使用什么render机制。因此，show.rhtml你可以写成show.rhtml.erb，这就表明是一个默认的rhtml模板，和你过去在Action里面使用respond_to声明的format.html是一个意思。此外你还可以使用诸如show.csv.erb，它表明显示为csv格式的数据，并且使用默认的erb去render它。
 所以，新的模板格式是： action.format.renderer。例如： * show.erb: 不管什么格式的显示方式都使用默认的erb显示show模板 * index.atom.builder: 用Builder库来render XML文件，输出的文件类型为RSS的AOTM类型 * edit.iphone.haml: 使用用户自己定义的HAML render机制来输出模板内容到iPhone手机上面
 说到iPhone手机，我们可以自己造一个专用的类型来实现内部路由。当你需要类似iPhone这样的特殊的HTML接口的时候，我们所要做的就是：
 ruby 代码
 # should go in config/initializers/mime_types.rb   
 Mime.register_alias &#8221;text/html&#8221;, :iphone  
   
 class ApplicationController &#60; ActionController::Base   
   before_filter :adjust_format_for_iphone  
   
   private   
     def adjust_format_for_iphone   
       if request.env["HTTP_USER_AGENT"] &#38;&#38; request.env["HTTP_USER_AGENT"][/(iPhone&#124;iPod)/]   
         request.format = :iphone  
       end  
     end  
 end  
   
 class PostsController &#60; ApplicationController   
   def index   
     respond_to do &#124;format&#124;   
       format.html   # renders index.html.erb   
       format.iphone # renders index.iphone.erb   
     end  
   end  
 end  
 你完全可以在config/initializers/mime_types.rb里面注册自己的mime type类型的映射，这个文件默认已经提供了。
 Action Pack: Record identification
 为了驱使你使用基于资源的映射，我们对资源映射的controller和view的URL处理进行了大量的简化。我们添加了大量的命名约定，让你可以直接把model对象转化为资源映射的路由，例如：
 ruby 代码
 # person is a Person object, which by convention will    
 # be mapped to person_url for lookup   
 redirect_to(person)   
 link_to(person.name, person)   
 form_for(person)  
 Action [...]]]></description>
			<content:encoded><![CDATA[<p> 万众瞩目的Ruby on Rails 2.0已经发布了，Rails框架在2004年诞生以来，一直保持着相当快的版本升级速度：2005年发布了Rails1.0版本，2006年初发布Rails1.1版本，2007年初发布Rails1.2版本，而还没有等到2008年，在2007年圣诞前夕的12月6日，Rails2.0已经发布。<br />
 Rails框架每个大的版本升级都给我们带来了相当多的新功能，新惊喜。Rails1.0带给我们完善的单元测试和集成测试；Rails1.1带给我们DataBase Migration和RJS；Rails1.2让我们看到了REST的光明前景，那么Rails2.0又将带给我们什么呢？ 我粗略的翻译了一下Rails框架作者DHH写的Rails2.0框架介绍文章，以下翻译自DHH的文章，原文在：<br />
 <a href="http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done">http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done</a><br />
 在经过差不多一年的开发之后，Rails2.0终于发布了。这是一个棒极了的Rails版本，包括了大量堪称伟大的新特性，无数的bugfix和大量功能的打磨。我们花了无数的精力去打造这样一个非常完美合理的软件包。<span id="more-11"></span><br />
 这也是Rails框架发展历史上的一个里程碑。我个人在Rails框架上面的开发工作已经有四年半的时间了，并且我们现在的贡献者也越来越多。我对这几年我们所做出的工作和我们一直坚持的信念感到非常的满意。我们一直在坚持这一点并且不断推动它。<br />
 在详细的介绍Rails2.0之前，我要向那些为Rails框架做出过贡献的每一个人致以深深的谢意，不论是像一个家庭那样其乐融融的Rails核心开发团队，还是成千上万的、而且年复一年为Rails提交补丁，积极参与Rails社区人们。Rails2.0也是大规模开源软件开发社区的一个重大胜利，而你完全可以自豪于你在Rails社区当中扮演的角色和做出的贡献。干杯！<br />
 现在让我们简单的窥一斑见全豹的看看Rails的那些闪闪发光的特性：<br />
 Action Pack: Resources<br />
 Controller里面充斥着大量action方法的时代已经过去了，我们对REST架构的应用进行了大量的改进和提高。首先，我们不再使用分号来隔离自定义的方法，而是采用斜线，例如原来是 /people/1;edit的URL，现在改成了 /people/1/edit.另外我们还对URL路由资源添加了命名空间的支持，因此像后台管理的接口你可以像这样非常简单的定义：<br />
 ruby 代码<br />
 map.namespace(:admin) do |admin|   <br />
   admin.resources :products,   <br />
     :collection =&gt; { :inventory =&gt; :get },   <br />
     :member     =&gt; { :duplicate =&gt; :post },   <br />
     :has_many   =&gt; [ :tags, :images, :variants ]   <br />
 end  <br />
 这种方式可以让你按照如下的方式定义命名路由，例如：inventory_admin_products_url和 admin_product_tags_url等等。为了方便的记录所有的路由规则，我们添加了一个rake任务叫做“rake routes”，它能够列举出来routes.rb定义的所有命名路由规则。<br />
 此外我们还引入了一个新的约定，即所有基于资源的controller默认都是复数形式的。这样即便单个资源在不同的路由规则中被多次引用，仍然可以指向同一个controller来处理，例如：<br />
 ruby 代码<br />
 # /avatars/45 =&gt; AvatarsController#show   <br />
 map.resources :avatars  <br />
   <br />
 # /people/5/avatar =&gt; AvatarsController#show    <br />
 map.resources :people, :has_one =&gt; :avatar  <br />
 Action Pack: Multiview<br />
 与资源映射一起进行功能增强的还有MultiView。我们已经有了respond_to方法，但我们可以更进一步，把MultiView控制延伸到模板里面去。我们现在可以根据模板文件的后缀格式来决定使用什么render机制。因此，show.rhtml你可以写成show.rhtml.erb，这就表明是一个默认的rhtml模板，和你过去在Action里面使用respond_to声明的format.html是一个意思。此外你还可以使用诸如show.csv.erb，它表明显示为csv格式的数据，并且使用默认的erb去render它。<br />
 所以，新的模板格式是： action.format.renderer。例如： * show.erb: 不管什么格式的显示方式都使用默认的erb显示show模板 * index.atom.builder: 用Builder库来render XML文件，输出的文件类型为RSS的AOTM类型 * edit.iphone.haml: 使用用户自己定义的HAML render机制来输出模板内容到iPhone手机上面<br />
 说到iPhone手机，我们可以自己造一个专用的类型来实现内部路由。当你需要类似iPhone这样的特殊的HTML接口的时候，我们所要做的就是：<br />
 ruby 代码<br />
 # should go in config/initializers/mime_types.rb   <br />
 Mime.register_alias &#8221;text/html&#8221;, :iphone  <br />
   <br />
 class ApplicationController &lt; ActionController::Base   <br />
   before_filter :adjust_format_for_iphone  <br />
   <br />
   private   <br />
     def adjust_format_for_iphone   <br />
       if request.env["HTTP_USER_AGENT"] &amp;&amp; request.env["HTTP_USER_AGENT"][/(iPhone|iPod)/]   <br />
         request.format = :iphone  <br />
       end  <br />
     end  <br />
 end  <br />
   <br />
 class PostsController &lt; ApplicationController   <br />
   def index   <br />
     respond_to do |format|   <br />
       format.html   # renders index.html.erb   <br />
       format.iphone # renders index.iphone.erb   <br />
     end  <br />
   end  <br />
 end  <br />
 你完全可以在config/initializers/mime_types.rb里面注册自己的mime type类型的映射，这个文件默认已经提供了。<br />
 Action Pack: Record identification<br />
 为了驱使你使用基于资源的映射，我们对资源映射的controller和view的URL处理进行了大量的简化。我们添加了大量的命名约定，让你可以直接把model对象转化为资源映射的路由，例如：<br />
 ruby 代码<br />
 # person is a Person object, which by convention will    <br />
 # be mapped to person_url for lookup   <br />
 redirect_to(person)   <br />
 link_to(person.name, person)   <br />
 form_for(person)  <br />
 Action Pack: HTTP Loving<br />
 如你所期望的那样，Rails2.0的Action Pack更加贴近HTTP，并且充分利用HTTP协议，例如资源、多种视图，还有更多的呢。我们添加了一个模块来处理HTTP的Basic验证，它能够让授权的API轻松跨越SSL协议，而且他是如此的简单易用。下面是一个例子(更多的例子请参考ActionController::HttpAuthentication)：<br />
 ruby 代码<br />
 class PostsController &lt; ApplicationController   <br />
   USER_NAME, PASSWORD = &#8221;dhh&#8221;, &#8221;secret&#8221;    <br />
   <br />
   before_filter :authenticate, :except =&gt; [ :index ]   <br />
   <br />
   def index   <br />
     render :text =&gt; &#8221;Everyone can see me!&#8221;    <br />
   end  <br />
   <br />
   def edit   <br />
     render :text =&gt; &#8221;I&#8217;m only accessible if you know the password&#8221;    <br />
   end  <br />
   <br />
   private   <br />
     def authenticate   <br />
       authenticate_or_request_with_http_basic do |user_name, password|    <br />
         user_name == USER_NAME &amp;&amp; password == PASSWORD   <br />
       end  <br />
     end  <br />
 end  <br />
 此外，我们也做了很多工作让你把JavaScript和CSS文件组织到一个逻辑单元里面去，而不需要让浏览器发起多次HTTP请求，分别获取每个JavaScript和CSS文件，以便减少HTTP请求次数。使用javascript_include_tag(:all, :cache =&gt; true) 这个helper在生产环境下自动把public/javascripts/目录下面的所有js文件打包到单个public/javascripts/all.js文件里面，但在开发环境下，仍然保持每个文件独立的修改。<br />
 我们还添加了一些选项让，仅仅几行代码，就能够让浏览器去访问多台服务器上面的资源。如果你添加如下设置：ActionController::Base.asset_host = “assets%d.example.com”，那么Rails框架就会自动的把静态资源的请求分发到多台物理服务器上面去，例如分发到assets1.example, assets2.example.com, assets3.example.com等等。这样浏览器可以同时向多台服务器下载资源，增加你的应用的访问速度。<br />
 Action Pack: Security<br />
 能够很简单的创建出来安全的应用总是一件令人愉快的事情，而Rails2.0提供了大量先进的功能来达到这一点。非常重要的是我们现在提供了一种内建的机制来处理CRSF攻击。我们在所有的HTML表单和AJAX请求当中包含了一个特殊的token，而请求来自于其他的应用的时候，你就可以检测到。所有的这些选项在新创建的Rails2.0项目当中默认就是打开的状态，对于你升级到Rails2.0的项目要打开这一个选项也很容易，使用ActionController::Base.protect_from_forgery就可以了，详细的说明请看：ActionController::RequestForgeryProtection。<br />
 对于允许用户在应用当中提交HTML代码的情况，防止XSS攻击现在也变得更加简单了。TextHelper#sanitize方法从过滤黑名单变成了验证白名单。如果你已经使用了sanitize方法，你就会自动获得更好的保护。当然你也可以自行调整默认允许的HTML tag，请看TextHelper#sanitize获取详情。<br />
 最后，我们还添加了“HTTP only cookies”支持，这一特性并不是所有的浏览器都支持，但是对于支持的浏览器你就可以派上用场了。<br />
 Action Pack: Exception handling<br />
 大多数常见的异常都可以统一处理，而不是每个需要单独的处理。通常情况下，你只需要覆盖rescue_action_in_public方法，来进行统一的异常处理即可。但是你也有可能需要使用自己的case语句来处理特定场合的异常。因此我们现在提供了一个类级别的宏叫做rescue_from，你可以使用它来声明针对某个特定的Action来捕获异常，例如：<br />
 ruby 代码<br />
 class PostsController &lt; ApplicationController   <br />
   rescue_from User::NotAuthorized, :with =&gt; :deny_access  <br />
   <br />
   protected   <br />
     def deny_access   <br />
       &#8230;   <br />
     end  <br />
 end  <br />
 Action Pack: Cookie store sessions<br />
 Rails2.0默认的Session存储机制现在是基于Cookie的方案。Session也可以不必存储在服务器的文件系统或者数据库系统里面，而是以ruby hash的格式每次作为cookie发送到客户端浏览器来保持。这样做不单单会比传统的服务器端保存Session的方式要快一些，而且完全不需要维护。你不需要在服务器上面运行cron job任务来清理session文件，也不必担心因为你忘记清理session文件导致你的服务器/tmp分区下面因为塞满了50万的session文件，从而让你的服务器crash掉。<br />
 如果你能够遵循一些最佳实践，保持session最小化，例如只在session里面存放user_id和flash信息，那么这种session机制就会很棒。但是，如果你打算在session里面保存核弹发射代码的话，这一存储机制就不是一个好主意了。因为它们无法被加密(例如用户伪造is_admin=true)，它们很容易被用户看到。如果对于你的应用程序来说，这是一个必须注意的问题，那么你就应该使用传统的session存储机制(但你首先应该先做一下调查)。<br />
 Action Pack: New request profiler<br />
 在一个真实的应用当中找出性能瓶颈是一个艰难的活，但有了我们新的request profiler，工作会变得简单很多。request profiler跟踪一个完整的执行脚本，报告执行结果，你可以像这样来使用它：<br />
 ruby 代码<br />
 $ cat login_session.rb   <br />
 get_with_redirect &#8217;/&#8217;   <br />
 say &#8221;GET / =&gt; #{path}&#8221;    <br />
 post_with_redirect &#8217;/sessions&#8217;, :username =&gt; &#8217;john&#8217;, :password =&gt; &#8217;doe&#8217;   <br />
 say &#8221;POST /sessions =&gt; #{path}&#8221;    <br />
 $ ./script/performance/request -n 10 login_session.rb  <br />
 这样你就可以得到一份非常详尽的HTML和text格式的运行报告，每个步骤执行了多少时间，有了这个东西，你就可以很清楚的知道怎样优化你的应用程序了。<br />
 Action Pack: Miscellaneous<br />
 还有一个值得一提的是AtomFeedHelper。它可以让你更容易的使用增强的builder格式来创建RSS输出，例如：<br />
 ruby 代码<br />
 # index.atom.builder:   <br />
 atom_feed do |feed|   <br />
   feed.title(&#8221;My great blog!&#8221;)   <br />
   feed.updated((@posts.first.created_at))   <br />
   <br />
   for post in @posts  <br />
     feed.entry(post) do |entry|   <br />
       entry.title(post.title)   <br />
       entry.content(post.body, :type =&gt; &#8217;html&#8217;)   <br />
   <br />
       entry.author do |author|   <br />
         author.name(&#8221;DHH&#8221;)   <br />
       end  <br />
     end  <br />
   end  <br />
 end  <br />
 在Rails2.0里面，我们已经进行了大量的性能优化，因此对于helper的调用开销已经变得很小了，而且对于简单的命名路由，我们还使用了cache，让它们能够执行的更快。<br />
 最后我们把in_place_editor和autocomplete_for这两个helper从Rails框架当中挪出去，放到了Rails官方SVN的插件目录下面了。<br />
 Active Record: Performance<br />
 ActiveRecord进行了无数的bug修复和少量的调整，但是仍然有一些值得一提的亮点。我们添加了一个非常简单的查询缓存，它能够在同一个请求的过程当中记录相似的SQL调用，并且缓存查询结果。查询缓存对于那些很难用:include来解决的N+1次查询问题会非常有帮助。另外我们也彻底提高了fixtures的性能，对于大多数常规的测试套件，性能提高了50-100%。<br />
 Active Record: Sexy migrations<br />
 现在我们有一种新的migration文件中声明的格式。以前我们是这样写的：<br />
 ruby 代码<br />
 create_table :people do |t|   <br />
   t.column, &#8221;account_id&#8221;,  :integer  <br />
   t.column, &#8221;first_name&#8221;,  :string, :null =&gt; false  <br />
   t.column, &#8221;last_name&#8221;,   :string, :null =&gt; false  <br />
   t.column, &#8221;description&#8221;, :text  <br />
   t.column, &#8221;created_at&#8221;,  :datetime  <br />
   t.column, &#8221;updated_at&#8221;,  :datetime  <br />
 end  <br />
 而现在，我们可以这样写：<br />
 ruby 代码<br />
 create_table :people do |t|   <br />
   t.integer :account_id  <br />
   t.string  :first_name, :last_name, :null =&gt; false  <br />
   t.text    :description  <br />
   t.timestamps   <br />
 end  <br />
 Active Record: Foxy fixtures<br />
 近来fixtures功能受到了很多抨击，对于fixtures的批评主要集中在fixtures之间声明的依赖关系上。在fixtures里面通过声明id属性来作为主键，从而构造fixtures之间的关联关系是个郁闷的活。现在你可以通过这种方式声明和编写fixtures：<br />
 ruby 代码<br />
 # sellers.yml   <br />
 shopify:   <br />
   name: Shopify   <br />
   <br />
 # products.yml   <br />
 pimp_cup:   <br />
   seller: shopify   <br />
   name: Pimp cup   <br />
 如上面所示，不再需要定义id属性，通过id来关联fixtures了，你现在可以直接使用fixtures的名字来建立关联关系。<br />
 Active Record: XML in, JSON out<br />
 ActiveRecord支持XML的序列化已经有一段时间了。在Rails2.0当中，我们还添加了XML的反序列化功能，所以你现在可以这样用Person.new.from_xml(“David“) 来获取person对象。当然我们也添加了序列化到JSON格式的功能，它和XML序列化的支持是一样的，还可以支持关联关系的抓取，只需要写person.to_json就可以了。<br />
 Active Record: Shedding some weight<br />
 为了让ActiveRecord更加简洁和通用，我们把acts_as_list，acts_as_tree等acts_as_xxx功能挪出了Rails，放在了Rails官方的SVN插件里面。如果你需要用到诸如acts_as_list的话，那么你需要安装这个插件，你可以./script/plugin install acts_as_list 来安装，安装好以后，acts_as_list功能又回来了，用法没有任何区别。<br />
 更加激进一点的改动是我们把所有的商业数据库驱动全部挪到了外部的gem包里面。因此Rails2.0仅仅自带MySQL、SQLite和PostgreSQL数据库驱动。这三个数据库是我们更加积极测试和支持的数据库。当然，这并非意味着我们排斥商业数据库，我们只是希望它们能够在Rails发行版本之外保持自己独立的开发和发布计划。对于商业数据库来说，这其实是一件好事情，让厂商可以在基础版本上面添加更多的异常和处理机制，使它们工作的更好。<br />
 所有的商业数据库驱动现在都放在gems包里面，符合如下命名规则：activerecord-XYZ-adapter。所以如果你安装了activerecord-oracle-adapter包，那么这台机器上面所有的各种版本的Rails应用程序都可以访问Oracle数据库了，你却无需修改任何一行应用的代码。<br />
 这种方式对于新的数据库驱动来说在Rails社区也可以更加方便的获得支持。只要你把数据库驱动安装命名规范打包成为gem，用户就可以安装这个gem，立刻在Rails程序当中使用到它们了。<br />
 Active Record: with_scope with a dash of syntactic vinegar<br />
 ActiveRecord::Base.with_scope被劝阻使用以避免用户在controoler，特别是filter里面误用。现在我们鼓励用户仅仅在model里面使用这种格式，这也是当初我们设计这项功能的初衷和保持一个良好实践的需要。当然，这仅仅只是鼓励和劝阻，如果你在衡量得失之后，非要坚持在model之外使用with_scope的话，你尽管可以用这种方式来调用：.send(:with_scope)。<br />
 ActionWebService out, ActiveResource in<br />
 在SOAP和REST的争论当中，Rails选择坚定的站在REST这一边似乎不出人意料。如果你并没有集成其他异构系统需求的话，那么我们强烈劝阻你使用SOAP。作为很自然的选择，ActionWebService现在并不在Rails框架的依赖当中，gem包仍然保留，但是这是一个重要的信息，建议你尽量不用它。<br />
 与此同时，我们把新的ActiveResource包从beta版本升级挪入Rails框架之内。ActiveResource很像ActiveRecord，只不过面向的不是model，而是资源。它有和ActiveRecord非常相似的API，并且可以和基于资源的Rails应用良好的整合。例如，ActiveResource提供了一个vanilla scaffold，你可以参考。<br />
 ActiveSupport<br />
 ActiveSupport没有多少新东西，我们只是添加了大量新的方法，例如Array#rand可以随机取得集合的元素，Hash#except可以过滤掉不想要的key和其他大量的Date类型的扩展。另外单元测试增加了一个assert_difference的便利方法。简而言之，仅仅是bugfix和调整。<br />
 Action Mailer<br />
 Action Mailer有不少更新，除了一大堆bugfix之外，我们添加了一个选项可以注册可选的模板渲染机制，此外还给email的单元测试添加一套assert_emails，例如验证邮件投递的数量：<br />
 ruby 代码<br />
 assert_emails 1 do post :signup, :name =&gt; ‘Jonathan’ end  <br />
 Rails: The debugger is back<br />
 为了更好的整合调试器，我们对Rails框架整体进行了一系列的改进。我最得意之作就是调试器的断点功能回来了，这不仅仅只是一个类似irb dump那样的断点数据观测，而是一个真正的调试器。你可以单步前进、单步后退、列举当前位置等等。这完全得益于ruby-debug这个gem包，所以我们推荐你安装这个gem包，然后Rails新的调试器就可以工作了。<br />
 如果你想使用调试器，那么首先安装ruby-debug这个gem包，然后把“debugger”命令写在你的应用程序当中，接着用-debugger或者-u参数启动服务器，当代码执行到debugger命令的地方，你就可以在运行服务器的终端上面直接操纵应用了，完全不需要使用script/breakpointer或者其他的什么东西。当然你还可以在单元测试当中使用调试器。<br />
 Rails: Clean up your environment<br />
 在Rails2.0之前的版本，config/environment.rb当中塞满了各种各样的启动配置信息和代码。现在你可以把这些东西分门别类的放在独立的文件当中，然后把文件放在config/initializers目录下面，当Rails应用启动的时候，它们就会被自动的加载。新的Rails2.0应用自带了两个这样的例子，分别是inflections.rb(定义你自己的单复数规则)和mime_types.rb(定义你自己的扩展类型)。我们鼓励你把启动配置信息放在独立的文件里面，而不要去改动environment.rb文件。<br />
 Rails: Easier plugin order<br />
 现在我们开始把很多功能从Rails剥离出来放到插件里面去了，你也许有可能有一些其他依赖这些功能的插件。例如在你自己的acts_as_extra_cool_list插件被加载之前，需要首先加载acts_as_list插件，因为acts_as_extra_cool_list扩展了acts_as_list。<br />
 在Rails2.0之前，设定插件的加载次序需要你在config.plugins里面列举所有的插件。这种做法主要的问题是当你仅仅需要acts_as_list插件加载次序在前，而不关心其他插件加载次序的时候，未免需要多写太多东西。而现在你仅仅这样写就可以了：config.plugins = [ :acts_as_list, :all ]。<br />
 And hundreds upon hundreds of other improvements<br />
 上面我提到的这么多特性也仅仅只是Rails2.0的冰山一角。我们可以列举出来成千上万的bug修复、功能调优、新功能的添加。许许多多的热情的贡献者不知疲倦的在各个细节上面改进Rails框架，但是这些工作都是非常重要的。<br />
 我希望你能够不介意麻烦去阅读Rails的CHANGELOG，了解更多的Rails2.0的改进。<br />
 So how do I upgrade?<br />
 如果你希望升级到Rails2.0，那么你应该首先升级到Rails 1.2.6版本。它对于所有在Rails2.0当中被挪出去的功能给出了警告信息。如果你的应用程序在Rails 1.2.6上面良好的运行，并且没有任何警告信息，那么你就可以升级到Rails 2.0了。当然如果你用到了Rails的分页的话，你需要安装classic_pagination这个插件。如果你需要使用Oracle数据库，那么你需要安装activerecord-oracle-adapter这个gem包，诸如此类等等等等。<br />
 </p>
<p>Rails2.0当中被废弃的用法，以及如何升级</p>
<p>在Rails2.0当中有大量的用法已经被废弃掉了，在你的应用程序升级到Rails2.0的过程当中必须注意。下面我先列举一下有哪些用法被废弃，然后有什么替代方案，大家请帮我补充： 一、controller的paginate分页方法被拿掉了<br />
2.0以前controller带有paginate这个public的分页方法，现在已经不能使用了。现在推荐的是另外一个替代插件will_paginate，安装这个插件可以用如下的命令：<br />
ruby 代码<br />
./script/plugin install svn://errtheblog.com/svn/plugins/will_paginate  <br />
关于will_paginate的用法可以参考这个插件里面自带的文档，用法非常简单，或者也可以看作者的博客：<br />
<a href="http://errtheblog.com/posts/56-im-paginating-again">http://errtheblog.com/posts/56-im-paginating-again</a><br />
目前JavaEye2.0的代码也是使用controller的paginate，但是在我们JavaEye3.0代码里面，已经改成了will_paginate。<br />
二、ActionWebServices这个gem包被拿掉了<br />
Rails社区提倡REST，而不是SOAP，如果以前用了SOAP，那么也可以单独安装ActionWebServices，如果是新项目，还是用REST和ActiveResource吧。<br />
三、controller里面的一些实例方法@params, @session, @request等被拿掉<br />
@params, @session, @request, @response, @headers, @flash这些实例方法被拿掉，而是在controller里面定义了同名的方法，所以请使用params, session, request, response, headers, flash<br />
四、acts_as_list, acts_as_tree被拿掉<br />
acts_as_list, acts_as_tree被拿掉，放在Rails官方的SVN网站上面，现在如果你要用得话，请用插件安装，直接用命令 ./script/plugin install acts_as_list 就可以了。<br />
五、in_place_editor和auto_complete这两个AJAX的helper被拿掉<br />
in_place_editor和auto_complete这两个AJAX的helper被拿掉了，放在Rails官方的SVN网站上面，如果你要用，也请安装插件，和上面一样。<br />
六、start_form_tag 标签被拿掉<br />
表单标签现在改成了block格式的，例如<br />
ruby 代码<br />
&lt;% form_tag &#8230; do |form| -%&gt;   <br />
 &#8230;&#8230;..    <br />
&lt;% end -%&gt;   <br />
七、一些写法的改变：<br />
1、:post =&gt; &#8216;true&#8217;的写法改成了 :method =&gt; &#8216;post&#8217; 2、find_all 改成 find :all, find_first 改成 find :first<br />
这里有一个rake task,可以提示你需要修改哪些地方，并且帮助你自动修改：<br />
<a href="http://www.slashdotdash.net/articles/2007/12/03/rails-2-upgrade-notes">http://www.slashdotdash.net/articles/2007/12/03/rails-2-upgrade-notes</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ruby.blog.35.com//11.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>第四章、使用 CI 简化数据库开发 《使用 CodeIgniter 框架快速开发 PHP 应用》</title>
		<link>http://ruby.blog.35.com//10.html</link>
		<comments>http://ruby.blog.35.com//10.html#comments</comments>
		<pubDate>Sat, 12 Apr 2008 20:58:00 +0000</pubDate>
		<dc:creator>RestOnRails</dc:creator>
		
		<guid isPermaLink="false">http://ruby.blog.35.com/php/codeigniter/diyizhangshiyongcijianhuashujukukaifashiyongcodeigniterkuangjiakuaisukaifaphpyingyong.html</guid>
		<description><![CDATA[你学习CI是因为你想要使编程更容易和更有生产力。这一章讲述CI的Active Record类。 如果CI只提供一个Active Record类，它还是物超所值的。当然，CI是免费的，只不过我要强调Active Record（以后简称AR）类的价值是非常高的，它是你提高生产力的主要工具。
AR使你以最小的代价获得最大的回报。 它简单，易于使用和维护。
这一章描述CI如何连接到一个数据库,你如何使用AR操纵数据库。你将会见到:
AR类与传统PHP/MySQL接口的比较
如何读取数据库并显示结果
如何创建,更新, 删除查询
CI保留让你用传统的方法编写数据库查询，但是我不会详细介绍这部分内容。它的知识完全被在线手册覆盖。使用AR类后，你可能不会再用传统的方式来做数据库查询了。
配置config文件
你或许已经注意到在这本书的大多数的章节会谈到system/application/config 文件夹和里面的config文件。这些文件对控制CI按要求工作相当必要。而且你可以让大部分的配置参数等于系统的默认值。数据库config文件在正常使用数据库之前需要进行设置。
基本上，你仅仅必须告诉它你的数据库在哪里、它是什么类型。 文件的默认值为:
$active_group=&#8221;default&#8221;;
$db['default']['hostname']=&#8221;";
$db['default']['username']=&#8221;";
$db['default']['password']=&#8221;";
$db['default']['database']=&#8221;";
$db['default']['dbdriver']=&#8221;";
（注：到CI1.6.1时又多了如下一些项目
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = &#8220;&#8221;;
$db['default']['char_set'] = &#8220;utf8&#8243;;
$db['default']['dbcollat'] = &#8220;utf8_general_ci&#8221;;）
其他的选项可以保留为默认值。 必选项是:
hostname: 你的数据库的位置, 举例来说, &#8216;localhost&#8217; 或 IP 地址
username和password: 使用者名称和密码必须有充分的权限，允许你的网站存取数据库中的数据。
database: 你的数据库的名字, 举例来说, &#8216;websits&#8217;
dbdriver: 你正在使用的数据库的类型 - CI可受的有选项有MySQL、MySQLi、 Postgre SQL、ODBC和MS SQL
以我的经验来看, 最困难的事情之一就是把新的CI网站连接到数据库。你可能需要查询你的ISP-有时他们的数据库运行在与他们的web server IP