??xml version="1.0" encoding="utf-8" standalone="yes"?>а√最新版地址在线天堂,欧美一区二区三区不卡,亚洲伦理一区 http://www.aygfsteel.com/freeman1984/archive/2015/12/14/428645.html疯狂 疯狂 Mon, 14 Dec 2015 10:04:00 GMT http://www.aygfsteel.com/freeman1984/archive/2015/12/14/428645.html http://www.aygfsteel.com/freeman1984/comments/428645.html http://www.aygfsteel.com/freeman1984/archive/2015/12/14/428645.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/428645.html http://www.aygfsteel.com/freeman1984/services/trackbacks/428645.html 阅读全文 ]]> oracle 索引字段包含datecdQ用spring jdbc更新时不走烦引,而是走table access full的问?/title> http://www.aygfsteel.com/freeman1984/archive/2015/11/15/428197.html疯狂 疯狂 Sat, 14 Nov 2015 16:04:00 GMT http://www.aygfsteel.com/freeman1984/archive/2015/11/15/428197.html http://www.aygfsteel.com/freeman1984/comments/428197.html http://www.aygfsteel.com/freeman1984/archive/2015/11/15/428197.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/428197.html http://www.aygfsteel.com/freeman1984/services/trackbacks/428197.html 阅读全文 ]]> 关于java RMI在多|卡?或者启?60Q百度,腾讯{wifi׃n?无法q接问题(java.rmi.ConnectException: Connection refused to host: xx) http://www.aygfsteel.com/freeman1984/archive/2014/12/05/421085.html疯狂 疯狂 Fri, 05 Dec 2014 06:08:00 GMT http://www.aygfsteel.com/freeman1984/archive/2014/12/05/421085.html http://www.aygfsteel.com/freeman1984/comments/421085.html http://www.aygfsteel.com/freeman1984/archive/2014/12/05/421085.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/421085.html http://www.aygfsteel.com/freeman1984/services/trackbacks/421085.html 场景Qjava RMI 在服务端者启?60 wifi׃nQ报错java.rmi.ConnectException: Connection refused to host: xx?br /> 也就是服务端在调用时使用了wifi׃n|卡的地址。此地址在RMI客户端pc上无法ping通。(因ؓ没有q接此wifi。当然RMI客户端pc如果q接此wifi是不会报错的Q?br />惛_资料Q?br /> http://docs.huihoo.com/java/rmi/whitepage/index.html 比较全的解释RMI的英文资料:http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/faq.html#netunknownhosthttp://www.aygfsteel.com/shaolijun/archive/2007/05/22/119213.html
试代码 Q?br /> (一)服务端:
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* rmi remote 接口
* @author joe
* @2014-12-5 @上午11:49:10
*/
public interface RmiInterface extends Remote{
public String say(String name) throws RemoteException;
}
import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class RmiServer extends UnicastRemoteObject implements RmiInterface{ private static final long serialVersionUID = 1L; protected RmiServer() throws RemoteException { super (); } public String say(String name) throws RemoteException { return "helloQ?+name; } }
public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException { RmiServer server=new RmiServer(); LocateRegistry.createRegistry(8808); Naming.rebind("http://10.10.XX.XX:8808/SAMPLE-SERVER", server); }
(?客户?调用服务Q?br />public static void main(String[] args) throws Exception { RmiInterface server=(RmiInterface) Naming.lookup("http://10.10.116.XX:8808/SAMPLE-SERVER"); System.out.println(server.say("张三")); }
此时报错Qjava.rmi.ConnectException: Connection refused to host: 192.168.23.X?br /> RMI的调用原理基本如下:大致译如下 Q首先客L必须通过Naming.lookup得到服务端服务的一个指针或者叫指针Q一旦拥有的q个应用Q客L用服务的引用里面包含的主机名(ip)和端口来讉K服务?br /> 也就是说Q虽然我们就服务端的IP和端口去Naming.lookup("http://10.10.116.XX:8808/SAMPLE-SERVER"); Q但是服务端q回的服务的引用里面包含的ipq不是lookup时的ip?br />官方说法Q?br />【In many versions of the JDK (all versions of the JDK except in v1.1 and the latest releases) , Java RMI may default to using an unresolvable server hostname (for example: unqualified names, Windows Internet Naming Service (WINS) names, or unqualified DHCP names). When a Java RMI client invokes a remote method using a reference that contains an unresolvable server hostname, the client will throw an UnknownHostException
.?/span> In order to generate functional remote references, Java RMI servers must be able to supply a fully qualified hostname or IP address that is resolvable from all Java RMI clients (an example of a fully qualified hostname is foo.bar.com ). If a Java RMI program provides a remote callback operation, then that program serves a Java RMI object and consequently, must be able to determine a resolvable hostname to use as its server hostname in the remote references it passes to Java RMI clients. VMs that make calls to applets that serve remote objects may throwUnknownHostException
s because the applet has failed to provide a usable server hostname.
If your Java RMI application throws an UnknownHostException
, you can look at the resulting stack trace to see if the hostname that the client is using to contact its remote server is incorrect or not fully qualified.?nbsp;If necessary, you can set the java.rmi.server.hostname
property on the server to the correct IP address or hostname of the server machine and Java RMI will use this property's value to generate remote references to the server.?/strong>
解决办法是在服务端发布注册服务的之前设|:System.setProperty("java.rmi.server.hostname", 指定IP);
对应到本文例子就是:public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException { RmiServer server=new RmiServer(); System.setProperty("java.rmi.server.hostname", 指定IP); LocateRegistry.createRegistry(8808); Naming.rebind("http://10.10.116.74:8808/SAMPLE-SERVER", server); }
但是此时q是报相同的错没法访问,百思不得其解,原来java.rmi.server.hostname 的设|必d服务对象创徏之前?br />
public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException { System.setProperty("java.rmi.server.hostname", 指定IP); RmiServer server=new RmiServer(); LocateRegistry.createRegistry(8808); Naming.rebind("http://10.10.116.74:8808/SAMPLE-SERVER", server); }
Z么呢Q?br />
RmiServer q个实现cM用了UnicastRemoteObject去联接RMIpȝ。在我们的例子中Q我们是直接的从UnicastRemoteObjectq个cMl承的,事实上ƈ不一定要q样做,当然也可以不是从UnicastRmeoteObject上承,那必M用它的exportObject()Ҏ去联接到RMI。如果一个类l承自UnicastRemoteObjectQ那么它必须提供一个构造函数ƈ且声明抛Z个RemoteException对象。当q个构造函数调用了super()Q它久激zUnicastRemoteObject中的代码完成RMI的连接和q程对象的初始化。而此时应该已l决定了使用哪个hostname来实例化q程对象。因此必d服务对象创徏之前指定l定的hostname?br />
~~~完?/div>
]]>
dbcp重连(? http://www.aygfsteel.com/freeman1984/archive/2013/06/06/400263.html疯狂 疯狂 Thu, 06 Jun 2013 01:38:00 GMT http://www.aygfsteel.com/freeman1984/archive/2013/06/06/400263.html http://www.aygfsteel.com/freeman1984/comments/400263.html http://www.aygfsteel.com/freeman1984/archive/2013/06/06/400263.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/400263.html http://www.aygfsteel.com/freeman1984/services/trackbacks/400263.html 转自Q?a >http://lc87624.iteye.com/blog/1734089
使用数据库连接池Ӟ免不了会遇到断网、数据库挂掉{异常状况,当网l或数据库恢复时Q若无法恢复q接池中的连接,那必然会是一场灾难?
关于dbcp的自动重q配|,|上相关的资料也不少Q通过以下资料Qƈ对照官方文档中的参数说明Q大致能了解各项配置的含义,我就不冗诉了Q本文的目的主要是对问题排查的经q做个简单的记录?
参考资料:
试环境Q?
dbcp版本——1.4 数据?#8212;—postgresSQL 9.10Q简UpgQ?/li> 本地(以下UCؓclient)操作pȝ及数据库服务?以下UCؓserver)操作pȝ均ؓlinux server位于内网环境Qclient需要通过vpn或网U直q内|才能访问数据库 首先模拟的是断网的情?/strong> 在本地测试dbcp的重q配|时Q发现断|后Q连接池无法重徏q接Q分别试qtestOnBorrow和testWhileIdle两种validate方式Q都没能解决Q现象如下: 1. 正常启动应用Q在server端通过"select * from pg_stat_activity"查看q接敎ͼ会有initialSize个来自client的IDLEq接?#8212;—正常 2. 在client端执行各U查询操作,q接C持不变,且在server端的db log中能看到validate query?#8212;—正常 3. 手动切断vpnQclient与server断开Q查询无法返回结果;然后重连Q再ơ查看连接数Q连接数仍保持不变,且连接的创徏旉为断|前Q即是说q接池认Z前的q接仍然有效Q没有销毁旧q接&创徏新连接? 4. 此时在应用中执行各种查询操作Q均无响应,{待一D|间后Q分钟Q,时抛出异常Q? Caused by: org.postgresql.util.PSQLException: An I/O error occured while sending to the backend. Caused by: java.net.SocketException: Connection timed out. 5. l箋通过"select * from pg_stat_activity"查看q接敎ͼ隔一D|间后Q连接消失?问题Q?/strong>断网后,仍留在线E池内的q接是否有效Q若有效Qؓ什么网l恢复后查询无响应?若无效,ZU程池没有发现ƈ重新创徏有效q接Q?排查q程Q?/strong> 1.重连vpn后,通过netstat查看client至server的连?
sudo netstat -antop | grep : 5432 | grep java 注:5432为pg端口Qgrep java是ؓ了过滤client上的其他形式的连接?/em> 发现q接数和在server端看到的q接C_且均为ESTABLISH状态? 2. 但在client上执行查询时Q通过tcpdump查看client发往server的tcphQƈ无Q何请求生?
sudo tcpdump -s 65535 -X -i eth0 host xxx.xxx.xxx 可见当前U程池中的连接实际上已经失效了,但dbcp仍认为它是有效的Q因此仍在尝试用旧连接访问数据库Q直至网l超时? 于是Q开始怀疑是vpn的问题,client接上|线直连内网后,再次重试上述步骤Q只是把断网的方式由切断vpn换成了拔|线Q发现这ơ用断|前的连接能够正常访问数据库Q于是断定是vpn的问题,猜测是重qvpn后,虽然client端ip没有变,但\q路径已经变了Q之前的q接无法复用Q但dbcpq不知道。对|络l节不是太熟悉,׃多加揣测了?接下来模拟数据库断开clientq接的情?/strong> ׃pg采用的是q程模型Q与数据库徏立的每一个连接都是单独的一个进E,故尝试采用killq程的方式模拟数据库断开q接? 预期的结果是Qkill掉一个连接进E后Qdbcp通过validate query发现该连接失效,销毁该q接q新创建新q接? 但实际情늡是:kill掉一个连接后Q所有连接全部被销毁?问题Q?/strong>I竟是数据库q是dbcp销毁了所有连? 排查q程Q?/strong> 熟悉pg的同事认为pg之所以采用进E模型,是Z避免q接之间的媄响,因此不可能发生kill一个连接,其他q接也被销毁的情况。在q个理论前提下,问题变得很诡异Q因为dbcp的validate肯定是针对一个连接的Q也不可能会在validate一个连接失效的情况下销毁所有连接,于是想偏Q甚臛_始怀疑是pg的jdbc driver有问题,最l放弃了q? 但我总觉得有点不太对Ԍ于是推翻之前的前提,开始怀疑是pg销毁了所有连接。于是,在用连接池的应用之外,通过pg的数据库客户端psqlq接dbQ这徏立了一个与dbcp无关的连接,接着l箋在server端kill了一个连接池中的q接Q而发现psql创徏的连接也被销毁了Q这p定是pg在销毁连接,因ؓdbcp不可能控制自w范围之外的q接? 后来才知道,pg之所以会q么做,是因为我们killq接时用的是kill -9Q简U?杀Q,9杀太过_暴Qpg会重启很多内部进E,以保证所有进E正常,之前的连接也会丢失Q换用普通的kill命oQ则不会发生以上情况。可?杀很多情况下是十分危险的,试想一个线上dbQ若?杀一个连接,后果不堪设想。。?ȝ 说是dbcp问题排查Q但大家可以看到最l问题的Ҏ都跟dbcp没有什么关pR实际工作中的很多问题,兌的因素众多,需要有各方面的知识储备才能扑ֈ真正问题ҎQ否则就会把问题归结C个自׃太了解的领域? 另外Q看?a target="_blank">dbcp基本配置和重q配|?/a>q篇文章中对q接池重q有两句不错的ȝQ引用一下:
引用
1. 数据库意外重启后Q原先的数据库连接池能自动废弃老的无用的链接,建立新的数据库链? 2. |络异常中断后,原先的徏立的tcp链接Q应该能q行自动切换
最后附上测试用的dbcp配置? testOnBorrow配置Q?
< bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close" > < property name = "driverClassName" value = "${jdbc.driver}" /> < property name = "url" value = "${jdbc.url}" /> < property name = "username" value = "${jdbc.user}" /> < property name = "password" value = "${jdbc.passwd}" /> < property name = "removeAbandoned" value = "true" /> < property name = "initialSize" value = "10" /> < property name = "maxIdle" value = "10" /> < property name = "minIdle" value = "10" /> < property name = "maxActive" value = "30" /> < property name = "maxWait" value = "30000" /> < property name = "testWhileIdle" value = "false" /> < property name = "testOnBorrow" value = "true" /> < property name = "testOnReturn" value = "false" /> < property name = "validationQuery" value = "select 1" /> </ bean > testWhileIdle配置Q?
< bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close" > < property name = "driverClassName" value = "${jdbc.driver}" /> < property name = "url" value = "${jdbc.url}" /> < property name = "username" value = "${jdbc.user}" /> < property name = "password" value = "${jdbc.passwd}" /> < property name = "removeAbandoned" value = "true" /> < property name = "initialSize" value = "10" /> < property name = "maxIdle" value = "10" /> < property name = "minIdle" value = "10" /> < property name = "maxActive" value = "30" /> < property name = "maxWait" value = "30000" /> < property name = "testWhileIdle" value = "true" /> < property name = "testOnBorrow" value = "false" /> < property name = "testOnReturn" value = "false" /> < property name = "validationQuery" value = "select 1" /> < property name = "timeBetweenEvictionRunsMillis" value = "30000" /> < property name = "numTestsPerEvictionRun" value = "30" /> < property name = "minEvictableIdleTimeMillis" value = "1800000" /> </ bean > 注:testOnBorrow只会发现当前q接失效Q再创徏一个连接供当前查询使用Q而testWhileIdle会定时校验numTestsPerEvictionRun个连接,只要发现q接失效Q就其U除再重新创建?
]]> URL最大长度限?? http://www.aygfsteel.com/freeman1984/archive/2013/05/30/399942.html疯狂 疯狂 Thu, 30 May 2013 01:29:00 GMT http://www.aygfsteel.com/freeman1984/archive/2013/05/30/399942.html http://www.aygfsteel.com/freeman1984/comments/399942.html http://www.aygfsteel.com/freeman1984/archive/2013/05/30/399942.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/399942.html http://www.aygfsteel.com/freeman1984/services/trackbacks/399942.html
转自Q?a >http://blog.csdn.net/jinhill/article/details/3961881
URL不能大于255bytes的说法确实存在,?a title="RFC2616" target="_blank">RFC2616中提刎ͼ
The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET-based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15).
Note: Servers ought to be cautious about depending on URI lengths above 255 bytes, because some older client or proxy implementations might not properly support these lengths.
从上一点也可以看出Q?55bytes的说法也是ؓ了兼Ҏ考虑。实际上C览器的限制如下Q?br />
Microsoft Internet Explorer (Browser) Microsoft states that the maximum length of a URL in Internet Explorer is 2,083 characters , with no more than 2,048 characters in the path portion of the URL. In my tests, attempts to use URLs longer than this produced a clear error message in Internet Explorer.Firefox (Browser) After 65,536 characters, the location bar no longer displays the URL in Windows Firefox 1.5.x. However, longer URLs will work. I stopped testing after 100,000 characters.Safari (Browser) At least 80,000 characters will work. I stopped testing after 80,000 characters.Opera (Browser) At least 190,000 characters will work. I stopped testing after 190,000 characters. Opera 9 for Windows continued to display a fully editable, copyable and pasteable URL in the location bar even at 190,000 characters.Apache (Server) My early attempts to measure the maximum URL length in web browsers bumped into a server URL length limit of approximately 4,000 characters, after which Apache produces a “413 Entity Too Large” error. I used the current up to date Apache build found in Red Hat Enterprise Linux 4. The official Apache documentation only mentions an 8,192-byte limit on an individual field in a request.Microsoft Internet Information Server The default limit is 16,384 characters (yes, Microsoft’s web server accepts longer URLs than Microsoft’s web browser). This is configurable.Perl HTTP::Daemon (Server) Up to 8,000 bytes will work. Those constructing web application servers with Perl’s HTTP::Daemon module will encounter a 16,384 byte limit on the combined size of all HTTP request headers. This does not include POST-method form data, file uploads, etc., but it does include the URL. In practice this resulted in a 413 error when a URL was significantly longer than 8,000 characters. This limitation can be easily removed. Look for all occurrences of 16×1024 in Daemon.pm and replace them with a larger value. Of course, this does increase your exposure to denial of service attacks.
另外值得注意的是Q有文章提到作ؓ<a>的href属性时QURL不能过1024bytesQ这Ҏ有详l查?
lgQURLq是不适合太长Q不是不得已Q尽量不要通过GET方式提交大量参数Q可以考虑用POST方式Q大U在2M左右Q应该是和服务器及设定有养I。另外这么长的URL在访问和收藏Q有文章提到有些览器在收藏长地址时也是会出现问题Q时也是相当不友好的。当Ӟ之前数据库字D设|时q是作ؓ255bytes处理Q现在可能要考虑扩充一下了?/p>
参考:
What is the maximum length of a URL? What is the limit on QueryString / GET / URL parameters? ]]> oracle ORA-39212异常 http://www.aygfsteel.com/freeman1984/archive/2013/02/20/395438.html疯狂 疯狂 Wed, 20 Feb 2013 02:10:00 GMT http://www.aygfsteel.com/freeman1984/archive/2013/02/20/395438.html http://www.aygfsteel.com/freeman1984/comments/395438.html http://www.aygfsteel.com/freeman1984/archive/2013/02/20/395438.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/395438.html http://www.aygfsteel.com/freeman1984/services/trackbacks/395438.html 阅读全文 ]]> 关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和?/title> http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html疯狂 疯狂 Mon, 24 Dec 2012 07:16:00 GMT http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html http://www.aygfsteel.com/freeman1984/comments/393402.html http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/393402.html http://www.aygfsteel.com/freeman1984/services/trackbacks/393402.html 阅读全文 ]]> bat 获取pȝ旉QƈL旉时前面的空?/title> http://www.aygfsteel.com/freeman1984/archive/2012/12/12/392840.html疯狂 疯狂 Wed, 12 Dec 2012 01:38:00 GMT http://www.aygfsteel.com/freeman1984/archive/2012/12/12/392840.html http://www.aygfsteel.com/freeman1984/comments/392840.html http://www.aygfsteel.com/freeman1984/archive/2012/12/12/392840.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/392840.html http://www.aygfsteel.com/freeman1984/services/trackbacks/392840.html set h=%h: =0% set bak_filename=%date:~0,4%%date:~5,2%%date:~8,2%%h%%time:~3,2%%time:~6,2% q回如下Q?0121212093639 ]]> windows xp 下office2010出现“windows installer 服务不能更新一个或多个受保护的”错误解军_ http://www.aygfsteel.com/freeman1984/archive/2012/11/07/390965.html疯狂 疯狂 Wed, 07 Nov 2012 07:36:00 GMT http://www.aygfsteel.com/freeman1984/archive/2012/11/07/390965.html http://www.aygfsteel.com/freeman1984/comments/390965.html http://www.aygfsteel.com/freeman1984/archive/2012/11/07/390965.html#Feedback 3 http://www.aygfsteel.com/freeman1984/comments/commentRss/390965.html http://www.aygfsteel.com/freeman1984/services/trackbacks/390965.html ~少相关文g所_以下文?/Files/freeman1984/bin.rar 解压后放入C:\Program Files\Common Files\Microsoft Shared\web server extensions\40\bin下即可?br />截图Q?br /> ]]> A/B试(转蝲) http://www.aygfsteel.com/freeman1984/archive/2012/08/28/386419.html疯狂 疯狂 Tue, 28 Aug 2012 03:41:00 GMT http://www.aygfsteel.com/freeman1984/archive/2012/08/28/386419.html http://www.aygfsteel.com/freeman1984/comments/386419.html http://www.aygfsteel.com/freeman1984/archive/2012/08/28/386419.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/386419.html http://www.aygfsteel.com/freeman1984/services/trackbacks/386419.html A / B试不是一个时髦名词。现在很多有l验的营销和设计工作者用它来获得访客行ؓ信息Q来提高转换率。然而, A / B试与SEO不同的是Qh们都不太知道徒河q行|站分析和可用性分析。他们ƈ不完全明白它是什么或如何更有效的使用它。本文将Z提供有史以来最好的A / B试教程?/p>
什么是A/B试?
A / B试的核心就是:定两个元素或版本(A和BQ哪个版本更好,你需要同时实验两个版本。最后,选择最好的版本使用?/p>
|络上的A / B试Q即你设计的面有两个版本(A和BQ,A为现行的设计Q称为控Ӟ Q?B是新的设计。比较这两个版本之间你所兛_的数据(转化率,业WQ蟩出率{) 。最后,您选择效果最好的版本?/p>
试哪些东西?
你要选择什么去试取决于你的目标。例如,如果你的目标是增加顾客数量,那么您可能测试下列内容:注册表单数量Q字D늱型要求,隐私政策{。在q种情况下A / B试的目标是要弄清楚什么阻止了游客注册。需要填写的表单的数量?用户的隐U?q是该网站做了让游客不信ȝ事情Q所有这些问题都可以通过一个个A/B 试获得{案?/p>
每一个A / B试内容都是独一无二的,单通常试一下这些内容:
行动按钮的措辞,大小Q颜色和位置Q?/li> 标题或品说明, 表单的数量和字段cdQ?/li> |站的布局和风| 产品定h和促销zdQ?/li> 着陆和产品面上的囄Q?/li> 面上文字的长度Q少Vs多)?/li>
一旦你军_要测试什么,下一步当然是要选择一个合适的试工具。如果你惌一个基的免费工P可以使用Google Website Optimizer 。如果你惌功能更加强大的工P可以使用Visual Website Optimizer 。其他的一些选择都是可以的,建立试验在所有工具中都很怼Q所以我们只需讨论一U即可?/p>
你可以通过两种Ҏ建立A / B试Q?/p>
在页面测试加载前替换元素 如果你测试的是页面上的单个元素,如注册按钮,然后需要在试工具中设|按钮。当试Ӟ在A / B工具在面l用户前随机替换按钮?/li>重定向到另一面 如果你想通过A / B试整个面Q比如说Q一个绿色的主题和一个红色主题,那么你就需要创建和上传新的面。例如,如果您的主页?http://www.example.com/index.htmlQ那么你需要创建另外一个页?http://www.example.com/index1.html。当试q行Ӟ您的试工具一部分讉K者重定向到第二个|址?/li>
一旦您使用了上面的两种变换ҎQ下一步是建立您的转换目标。通常Q你会得C个JavaScript代码Q您可以复制q粘贴到一个需要游客到辄目标|页。例如,如果您有一个电子商务网站,你正在测试的“立即购买“按钮的颜Ԍ然后您的转换目标是购买成功后的“谢谢?#8220;面?/p>
在{换事件发生的同时Q在A / B试工具Q记录了哪种面昄l了讉K者。经q够数量的游客Q您可以定哪个面带来了最多的转化Q徏立和q行的A / B试Q其实很单?/p>
该做什么和不该做什?/strong>
虽然A / B试是超U简单的概念Q但是请CQ以下这些都只是我自ql验?/p>
注意事项
需要做?/strong>
知道q行试多久。结束太早,可能会你花了时间但是没有得到有意义的结果。结束太晚也不好Q因为效果不佳的面可能影响你的转化和业l。用一?a href="http://visualwebsiteoptimizer.com/ab-split-test-duration/">计算?/a>Q来定试多久以后来结束它?/li> 相同的面呈献l同一个访客。您的工具应该有一个记忆访问者已l看到的面的功能。这样可以防止向同一用户昄一不同的h格或不同的促销优惠?/li> 让您的A / B试在整个网站保持一致。如果你正在试的登录按钮在多个地点出现Q然后一个访问者应在所有的地方看到同样的变化。在面1昄一个样子,在页?昄两外一个样子,会试验l果被干扰?/li> 做很多的A / B试。让我们面对现实吧:你的W一个A / B试可能会无效。但是不要绝望。一个A / B试只能有三个结果:没有l果Q不好的l果和好的结果。优化{换率的关键是要做大量的A / B试Q把所有的好的l果拼接hQ最l推动业l?/li>
l典A/B试案例研究
q里有一些如何进行A/B试的案例研I?/p>
Writing Decisions: Headline Tests on the Highrise Sign-Up Page 37Signals试他们的h格页面的标题。最l发玎ͼ “30-Day Free Trial on All Accounts “比原来的“Start a Highrise Account. “多?0 Q以上的订单?/p>
“You Should Follow Me on Twitter Here” (Dustin Curtis) q是一个用来测试召唤用户在Twitter上关注自q试验? Dustin 发现提示文字?#8220;You should follow me on Twitter here” 的效果是“I’m on Twitter.” 173%
Human Photos Double Conversion Rates 从两个不同的A / B试在|站上增加{换率的h的照片:一个oZo人惊讶的l论QA/B试两张囄Q将真h照片攑֜|站上会获得一倍的转化。研I说明,我们潜意识被照片吸引了?/p>
Google Website Optimizer Case Study: Daily Burn, 20%+ Improvement (Tim Ferriss) 一个将用户选择减少的变化转化提高?0%Q最l的版本在细节和文字上更易吸引目光?/p>
Two Magical Words Increased Conversion Rate by 28% “It’s free” q个单词增加了注册按钮点L数的28%, 试l果表明Q在行动召唤上一些很的变化会带来o人惊讶的l果?/p>
Changing the Sign-Up Button from Green to Red 依靠A / B试Q?CareLogger把注册按钮从l色修改为红色增加了34Q{换率Q?/p>
Single page vs. multi-step checkout 如果你有一个在U商店,很常见的是支付程。这个A / B试发现Q多个支付流E比单个支付程完成的销售更好?/p>
“Mad Libs” style form increases conversion 25-40% 打|传统的智慧,此A / B试发现一D风?/em>形式输入字段比传lŞ式的布局更好?/p>
Complete redesign of product page increased sales by 20% 一个Y件品的公司重新设计他们的品页l它一个现代的外观和增加信L块。最l结果:他们成功地增?0 Q的总销售额。本案例研究证明了设计对销售的影响?/p>
Marketing Experiments response capture case study – triple digit increase in conversions 通过优化邮g地址获取提高?58 Q。重Ҏ消除所有的q扰Qƈ要求游客只需提供电子邮g地址。用亚马逊礼品卡让他/她的完成个h资料?/p>
A/B 试工具
有许多侧重点Qh位和功能不同的A / B试工具Q这里是一些:
一些深入研I的A/B试资料
如果你已l读到这里,那么A / B试大概已经Ȁ起你的兴。在q里Q有一些非常好的A/B试资源?/p>
L你下一个A/B试的灵?/strong>
一些介l性文?/strong>
A/B 试中的数学
原文地址Q?a >http://www.smashingmagazine.com/2010/06/24/the-ultimate-guide-to-a-b-testing/ 转蝲自:http://ucdchina.com/snap/7203
]]>
ȝ行备?/title> http://www.aygfsteel.com/freeman1984/archive/2012/07/13/383021.html疯狂 疯狂 Fri, 13 Jul 2012 06:59:00 GMT http://www.aygfsteel.com/freeman1984/archive/2012/07/13/383021.html http://www.aygfsteel.com/freeman1984/comments/383021.html http://www.aygfsteel.com/freeman1984/archive/2012/07/13/383021.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/383021.html http://www.aygfsteel.com/freeman1984/services/trackbacks/383021.html 2 如何在excel里面ȝ行:{?排序 卛_?img src ="http://www.aygfsteel.com/freeman1984/aggbug/383021.html" width = "1" height = "1" /> ]]> hibernateQspring理事务?transactionQJDBC connectionQHibernate Session的用研I?Q一Q?/title> http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html疯狂 疯狂 Fri, 18 Nov 2011 03:25:00 GMT http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html http://www.aygfsteel.com/freeman1984/comments/363984.html http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/363984.html http://www.aygfsteel.com/freeman1984/services/trackbacks/363984.html http://www.aygfsteel.com/freeman1984/archive/2011/08/04/355808.html首先hibernate的Connection release mode有以下几U: 1 after_statement 2 after_transaction 3 on_close 其中after_statement 用在jta?Q?span style="color: red">on_close ?.1之前遗留的(也许是ؓspring留的-_-Q,也就?.1之前默认是on_close Q但3.1之后默认如果单独使用hibernate是after_transactionQ?/strong>如果有第三方事务理Q就用第三方提供的默认|spring是默认使用了on_close?br />在spring理事务中我们看看系l启动后默认使用的配|: 1,ransaction strategy: org.springframework.orm.hibernate3.SpringTransactionFactory使用spring事务{略 2Qhibernate内部 Automatic session close at end of transaction: disabled 因ؓ已经交给spring?br />3 Connection release mode: auto 默认Q也是没有配置hibernate.connection.release_mode的时候,但是q里有地斚w要注意:也就是前面提到的使用W三方策略时的问题:看一下代码:
String releaseModeName = PropertiesHelper.getString( Environment.RELEASE_CONNECTIONS, properties, " auto " ); log.info( " Connection release mode: " + releaseModeName ); ConnectionReleaseMode releaseMode; if ( " auto " .equals(releaseModeName) ) { releaseMode = transactionFactory.getDefaultReleaseMode(); } else { releaseMode = ConnectionReleaseMode.parse( releaseModeName ); if ( releaseMode == ConnectionReleaseMode.AFTER_STATEMENT && ! connections.supportsAggressiveRelease() ) { log.warn( " Overriding release mode as connection provider does not support 'after_statement' " ); releaseMode = ConnectionReleaseMode.AFTER_TRANSACTION; } } 其中U色部分是调用了spring提供的默认|而spring的默认|在jta和cmt中都默认使用的是after_statement
/** */ /** * Sets connection release mode "on_close" as default. * <p>This was the case for Hibernate 3.0; Hibernate 3.1 changed * it to "auto" (i.e. "after_statement" or "after_transaction"). * However, for Spring's resource management (in particular for * HibernateTransactionManager), "on_close" is the better default. */ public ConnectionReleaseMode getDefaultReleaseMode() { return ConnectionReleaseMode.ON_CLOSE; } 而springZ么要使用on_close Q而不是用after_transaction ,我们xopensessioninview的原理也许能明白Qsession在view成还要用,所以不能再transaction使用完后关闭JDBC connectionQ必要在session之后Q所以要使用on_close Q?/span>也就是在on session(flush.autoQ或者flush.Eagerly) 关闭Q。这U情况hibernate内部q会在spring关闭JDBC connection后提C?费解Q因为after transaction之后session没有关闭Q但?nbsp;Connection release mode配置的是on_close,session的关闭和 Connection 的关闭都由spring来管理,hibernate׃知道?Q所以hibernate有好的提C如?其实sessionQ已l关闭。当焉着session的关闭jdbc链接释放回连接池)Q?/span>transaction completed on session with on_close connection release mode; be sure to cl ose the session to release JDBC resources!Q?br /> 。当然我们也可以使用after_transaction Q这U情况对使用~程式事务非帔R用?br /> ]]> jsessionid 问题分析 http://www.aygfsteel.com/freeman1984/archive/2011/09/02/357833.html疯狂 疯狂 Fri, 02 Sep 2011 08:33:00 GMT http://www.aygfsteel.com/freeman1984/archive/2011/09/02/357833.html http://www.aygfsteel.com/freeman1984/comments/357833.html http://www.aygfsteel.com/freeman1984/archive/2011/09/02/357833.html#Feedback 2 http://www.aygfsteel.com/freeman1984/comments/commentRss/357833.html http://www.aygfsteel.com/freeman1984/services/trackbacks/357833.html 阅读全文 ]]> IT目理的六U错误思维 http://www.aygfsteel.com/freeman1984/archive/2011/08/23/357095.html疯狂 疯狂 Tue, 23 Aug 2011 02:09:00 GMT http://www.aygfsteel.com/freeman1984/archive/2011/08/23/357095.html http://www.aygfsteel.com/freeman1984/comments/357095.html http://www.aygfsteel.com/freeman1984/archive/2011/08/23/357095.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/357095.html http://www.aygfsteel.com/freeman1984/services/trackbacks/357095.html DQ在软g行业Q在界面设计没有正式展现l客户之前,所有的工作都处于需求调研阶Dc很多IT目l理因ؓq轻Q初生牛犊不怕虎Q胆量大Q勇气Q敢于在实践中引入新的工兗方法。敢于尝试不是坏事,但试验的风险一定要控制好。本文例举了在IT目理中常遇到的六U错误思维Q给开发者们借鉴Q学习,打造成功的IT目理?/strong>
内容如下Q?/strong>
错误一Q错误的需求调研阶D,D很多目永远无法l束!
在Y件行业,在界面设计没有正式展现给客户之前Q所有的工作都处于需求调研阶Dc其实徏{行业已l给我们做好了先例:客户买房子之前是先要看看h房和模型的,什么都看不刎ͼq房子你敢买?除非你不是自׃Q而在我们所学的软g工程概念模型中,q是三个阶段Q需求调研、需求分析、概要设计?/p>
在客h他们惌理的业务模块以及与之相关的业务数据、流E、表单交付你的时候,你千万不要把q个阶段定性ؓ需要调研结束,写出《需要规D明书》就可以了。大量的实践证明Q在概要设计阶段所衍生出来的需求工作量是之前的5~10倍,甚至更多Q因要看设计人员的业务沟通能力和建模水^?/p>
有实施经验比较丰富的目理人员ȝ_在中国实施Y仉目,必须以咨询方式展开Q要推出自己的方案,而不能完全按照客h提需求作目。这是一U很好的解决思\Q但无法解决所有实施项目的N。这U解x案的前提Q要么项目实施者有成熟的业务模型,要么有成熟的产品(包含了成熟的业务模型)Q否则是不可能做到的。但如果没有3~5q在同一行业Q同一领域的实施经验和理论ȝQ没有哪家IT企业能达到这L前提要求?/p>
其实得出q样l论的深层原因,是因为国内多C业管理思想不成熟,更谈不上完善的业务模型,所以客L思维一定程度是发散的,q未形成pȝ。甚臌有些客户的领|脑子中有很多新鲜的点子,他都有可能想在企业信息化的实施过E中加进来,q对把控目范围和项目实施效果来_都可能是N的开始?/p>
所以,要做好实施项目,实施者必L很好的业务徏模能力,快速的l客户展C合理的软g原型软gDemo?/p>
误住:软g实施目Q一定要l用L到样板房软gDemoQ才需求调研结?
错误二:IT技术h员不需要掌握项目管?/strong>
有这U看法的Z在少数。根据观察,之所以Ş成这U看法,一是对目的真正概念不清晰Q二是对理的概능话了Q把理理解成了高深莫测Q非一般h能做的事情。首先有必要普及一下项目的概念?/p>
寚w目有很多Zq定义,目理圣经PMBOKW三?2004?的定义是Qؓ创造某个独特的产品或服务,或完成某独特的Q务所做的临时性努力。围l这句话PMBOK做了详细的解释和举例说明Q很严}Q想了解的请学习PMBOK。因为都是翻译过来的定义Q翻译得q于术语化很Ҏ把hl进去,在国内不排除已经拿到PMP认证证书的专业h士还搞不清楚目I竟是什么。笔者在q里只想用汉语最通俗的语a来说明什么是目和项目管理?/p>
目Q就是在限定的时间要人完成的事。记住三个关键字卛_把握Qh、时、事?/p>
目理是参与者用什?知识、技能、工兗方?来圆满地q好qg事?/p>
明白了这些,你就会明白从日常生活的吃喝拉撒到国家理Q处处都是项目,处处都需要项目管理,也就能明白每个h都需要项目管理,也就能理解学会了目理会多么受益无穷Q娴熟运用项目管理思维无往不胜!
但需要提醒大家一点,现在的PMBOK是把传统刉行业、徏{行业、IT行业{多个行业领域的目理知识p合C一P大而全Q但针对性不够好Q所以很多h觉得PMBOK理论化太强,学完了觉得很多东西没用。现在国际知名的另外一套项目管理认证,IPMP是按照工作岗位能力进行了分Q也没有针对行业q行分解。所以,无论拿到PMP或者IPMPQ很多h都会有同L困惑。据了解QPMI已经准备做这L改进Q这是一个很好的消息?/p>
错误三:忘记目目标
你看到这个题目什么感?很多Z觉得q样的错误怎么会发?几乎没有Z认ؓ自己犯这个错误!忘记目目标有两U情形:一是从开始接手项目就没弄清楚目的目标是什?二是虽然清楚目的目标是什么,但却q着跟完成项目目标无兟뀁甚x害的事?/p>
时刻铭记目目标是项目管理很重要的一个思维Q项目所有的zd都围l这个展开。可是随着目的逐步开展,其是复杂项目:人多、事多、周期长Q很多项目经理会逐渐因ؓ个h喜好而忘C目的大目标Q比较典型的有:技术出w的目l理会沉q于技术细节,大量旉花在学习新技术或者一头闷在解x术难题上;脾气火爆的项目经理会因ؓ很多不值当的事情大发脾气,把团队搞得乌烟瘴?心眹{爱面子的项目经理会因ؓ某个l员无意的顶撞而怀恨在心,从此ȝ其穿鞋Q搞得团队拉帮结z,毫不团结;q有更糟p的Q比如爱玩游戏的Q爱喝小酒的{等。所有这些,无论原因是自w不成熟Q还是管理经验、管理能力不Il果都一P那就是项目出问题Q甚臛_败?/p>
目l理最重要的一Q务就是跟t与控制Q时L握项目方向,保证目计划得以利执行Q偏差控制在可控风险范围内。但目L有太多意外因素,其是周期长的项目,Z常用夜长梦多来Ş定w险会随时间的廉而增加,所以项目经理一定时刻都要保持头脑清醒,寚w目无益的事情不做Q对目有风险的事情更不能做?/p>
M目在开展过E中都会不断面对Z和诱惑,目l理一定要能明项目大目标Q才能清晰地识别哪些是ə目成功的机会,哪些是会l项目带来风险的诱惑Q才会少走弯路,早日成功。项目管理者联盟,目理问题?/p>
人是需要不断被提醒的,q由人性决定。智慧的够不断的反省从而自我提醒,愚笨的h会被挫折、外界的警示不断提醒Q这Ş成了成功与失败的差异?/p>
错误四:计划不能?/strong>
怎样才能保证目成功?计划Q计划,再计划,q是目理的最佛_践!所以,做项目管理的一般都知道如何~制目计划Qƈ且很多h能熟l的使用Project工具Q知?0时或?0时法则、WBS和关键\径的概念。每个项目经理都会记住计划一旦Ş成,׃格按照计划去执行Q而不受某个h、某件事的媄响这个原则,也明白这样做不仅能够减少大量资源的浪费,产品的质量也能得C障。所以,很多目l理排斥Q甚xl改变计划。坚持原则,q貌似没什么错Q但真的q样?
要弄清楚一件事是否有必要做Q首先就得弄清楚两个问题Q一、这件事Z么要?二、做了有什么好?
那我们首先问一下编制计划的目的是什?我们知道计划是项目管理的最佛_践,计划是保证项目成功的一U手D和ҎQ做qg事只有一个目的,那就是ؓ了保证项目成功,但前提是Q这份计划是周密的、可行的。严格执行一份周密可行的目计划才能保证目成功。很多项目经理记住了上面的严格执行原则,但忘Cq个大前提?/p>
W二个问题,计划有什么好?目理的计划方法,把项目活动、持l时间、所需资源有机地结合在一Pq且有严格的先后ơ序、里E碑和关键\径,可以清晰地提醒项目所有成员在什么时_做什么事情,保证每个目d都得以执?通过对计划的执行跟踪Q项目经理可以清晰地了解目q展情况和偏差情况,评估q及时有效的控制目风险Q从而保证项目的成功?/p>
明白了这两点Q我们再来看IT目。对多数IT目Q尤其是软g实施目Q启动时都存在范围不够明晎ͼ需求不定的情c只有到软gDemo产生Q才可能需求清晎ͼ范围定Q这些情况就军_了IT目计划需要根据项目的实际情况及时q行修正。如何压~范围确定的旉Q早日制定出周密可行的计划,是Y仉目的一个重要课题?/p>
制定一份周密可行的计划是项目经理优U能力的体玎ͼ其是WBS的制定,对复杂项目有很大隑ֺ。在?008奥运目的管理体会时Q项目专家曹蕑ְ提到奥运会项目最隄一点就是WBS的制?参见PMU|站?008奥运目的访?。要保证目的成功,p保证目的每个活动都能得以顺利执行。所以,在项目情况发生变化,在原有的计划基础上有需求变更时Q就要把新的d补充到计划中Q修正计划,保WBS的完_保计划周密可行Q之后的工作才是严格执行?/p>
Z提一句,有些目l理会走另外一个极端:因ؓ需求不定Q所以不制定目计划。这同样是对计划的错误理解。即使计划不够周密,但它可以提醒我们目的大目标是什么,保证目团队所采取的行动不偏离大方向。Q何一大的项目,都可以拆分成很多项目,WBS的渐q明l,也是目必须完成的Q务之一Q所有Q务的持箋旉都是要估的Q即使不够准,臛_可以作ؓl验累积Qؓ今后的准估做了准备。因此,目的Q何阶D都一定要有计划?/p>
错误五:目一定要盈利
目一定要盈利Q这句话被无数IT目l理奉ؓ真理Q也注定了要创造很多悲剧!Z辑ֈq个目的Q很多IT目l理甚至都在悉心研究厚黑学,学习用什么办法把弟搞得热情高涨Q比民工累,从而用最低的成本创造最大的利润?/p>
目理作ؓ战术层次的管理手D,一定要服务于战略层ơ的大方向。商场如战场Q有胜利׃有失败。ؓ了战略胜利,很多战役要诱敌深入,必须打|仗。|仗不要紧Q关键要弄清楚|C么层ơ,损失CU地步,明确本次战役的真实目标,再去打这场战役,׃做到驾轻qQ从而不至于到最后Ş成不仅损光|,q未能诱敌深入的局面?/p>
开拓市场、占领市场、站E_场、挖掘市场,q是每个公司发展必不可少的步骤。很多项目,对公司来说都是ؓ了占领市场,甚至虎口夺食。这L目Q公总战略层面首先要求的绝对不是盈利,而是如何能把市场占领Q而站EI目l理必须明白q个战略意图?/p>
q是项目管理最为重要的一个思想Q从q去的做好质量、时间、成本项目三要素的^衡,到现在满相兛_pMh的需求,所有的最佛_践和理论研究成果Q都l不会提倡走极端Q杀机取卵!利润只是目的一个目标,q且一定要明白有短期利润和长期利润之分Q过分单一q求利润的项目注定要p|Q过分追求利润的公司也不会长久?/p>
该花的钱不能省,不该q׃分也不要花,目l理把成本控制在合理的预范围内Q就是成本控制的成功。万万不可ؓ了把一个注定要赔钱的项目做得盈利而想办法、绞脑汁压~成本,从而让l员加班加点Q玩命干z,到最后,目q完了,Z?光了Q还极有可能因ؓ赶工D目质量不合|客户不满意,那就真的赔了夫h又折?
目l要能保持激情高效,不能懒散拖沓Q项目经理一定要把握好这个度Q绝不能走极端。^衡是一门艺术,也是展示目l理能力水^的一个重要标!
错误六:C了科学,忘记了有?/strong>
学以致用Q就怕ؕ用。无论是产品、技术还是管理方法,都存在ؓ了更先进、更U学而罔儡实,盲目q的现象,l果先进和科学的技术、工具不仅未提高生效率Q却成了累赘Q这L情况到处都是Q在IT目中也为数不少?/p>
国内大量p|的ERP目是q类错误的典型。有人把ERP目归结Z把手工程Q意思是只有领导重视q推动才能成功。领导支持是目成功很重要的一个条Ӟ但绝不是有领导支持就一定能够成功。有些项目就是领导决{失误盲目上的,从开始就注定目要失败。一个信息化目的实施,对很多企业来说就是一场大的改革,Ҏ有员工从思维、技能到工作习惯{多斚w都需要进行调整。如果企业的员工素质不能跟上Q纵然有各种各样的培训,但不֑工基和学习曲U,用户不能真正掌握全新的系l,l果只能增加用戯担,而生不了期望的效果?/p>
很多IT目l理在学习了一些新的技术后QL立刻在项目中实践Q而不Ml分析这些技术在q个目中是否需要,是否适合。IT技术日新月异,不断有新的理提出来,被翻译引q到国内。有些项目经理在一知半解,对这些技术还不是很熟悉的情况下,敢向h吹嘘他所掌握技术的U学性、先q性,q而强制要求在目中实c这可能是甲方的目l理Q也可能是乙方的目l理。因为技术选择错误D目p|的例子在国内q去有,现在也还?l对不可准备不Q大范围引入全新的技术,待到目旉q去一半了Q才发现选择的技术不适用Q那时候一切都晚了。掌握Q何新东西都有学习曲线Q项目的旉限制是项目经理必Lȝ记的要素Q把握不好就会给目带来极大风险?/p>
涉及到具体的IT目理QPMBOK的知识体pd谓博大,q有一些其他新的项目管理工P不能说不先进Q但是哪些知识、工兗方法适合本项目,需要项目经理根据实情,认真分析后进行筛选用?/p>
U学、先q、好用等{修饰头衔这些都不是要选择的首要理由,需要、适用和有效才是首要考虑的事情。很多IT目l理因ؓq轻Q初生牛犊不怕虎Q胆量大Q勇气Q敢于在实践中引入新的工兗方法。敢于尝试不是坏事,但试验的风险一定要控制好。对于项目经理来_所有的决策都要围绕目目标q行。项目经理的首要d是保证项目成功,如果同时能引入新的技术、工P增加l员的知识技能,提升目l工作效率,提高产品的质量和可靠性,l对是锦上添花,但绝对不能ؓ了锦上添p导致项目失控甚臛_败,捡了芝麻Q丢了西? 转自Q?a >http://sd.csdn.net/a/20110819/303332.html
]]>使用hibernate中connection.release_modeQconnection.autocommit和transaction.auto_close_session用法及需要注意的问题 http://www.aygfsteel.com/freeman1984/archive/2011/08/04/355808.html疯狂 疯狂 Thu, 04 Aug 2011 07:57:00 GMT http://www.aygfsteel.com/freeman1984/archive/2011/08/04/355808.html http://www.aygfsteel.com/freeman1984/comments/355808.html http://www.aygfsteel.com/freeman1984/archive/2011/08/04/355808.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/355808.html http://www.aygfsteel.com/freeman1984/services/trackbacks/355808.html 阅读全文 ]]> 大家都用什么bug理软gQ?/title> http://www.aygfsteel.com/freeman1984/archive/2011/06/20/352649.html疯狂 疯狂 Mon, 20 Jun 2011 03:38:00 GMT http://www.aygfsteel.com/freeman1984/archive/2011/06/20/352649.html http://www.aygfsteel.com/freeman1984/comments/352649.html http://www.aygfsteel.com/freeman1984/archive/2011/06/20/352649.html#Feedback 9 http://www.aygfsteel.com/freeman1984/comments/commentRss/352649.html http://www.aygfsteel.com/freeman1984/services/trackbacks/352649.html ]]> websphereQ?EAR 文g可能是损坏的或不完整的问?/title> http://www.aygfsteel.com/freeman1984/archive/2011/06/01/351492.html疯狂 疯狂 Wed, 01 Jun 2011 02:35:00 GMT http://www.aygfsteel.com/freeman1984/archive/2011/06/01/351492.html http://www.aygfsteel.com/freeman1984/comments/351492.html http://www.aygfsteel.com/freeman1984/archive/2011/06/01/351492.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/351492.html http://www.aygfsteel.com/freeman1984/services/trackbacks/351492.html 今天在websphere上部|项目的时候出?nbsp;EAR 文g可能是损坏的或不完整的问题,最后查了半天才发现时web.xml里面的filter和filter-maping写的序不对。解军_ok?br /> Q?如果用myeclipse开发可以用右?myeclipse->run validate 验证下web.xmlq样׃发现问题了?br /> q也是websphere和tomcat的一个区别吧? ]]> Unable to open kernel device "\\.\vmci"_ http://www.aygfsteel.com/freeman1984/archive/2011/04/30/349328.html疯狂 疯狂 Sat, 30 Apr 2011 14:23:00 GMT http://www.aygfsteel.com/freeman1984/archive/2011/04/30/349328.html http://www.aygfsteel.com/freeman1984/comments/349328.html http://www.aygfsteel.com/freeman1984/archive/2011/04/30/349328.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/349328.html http://www.aygfsteel.com/freeman1984/services/trackbacks/349328.html Unable to open kernel device "": pȝ找不到指定的文g. Did you reboot after installing VMware Workstation?
Module DevicePowerOn power on failed.
有一D|间不用虚拟机了,今天又要用到虚拟机。开拟机后,Power on出现上述信息
解决办法Q开?》运行:
net start vmci
原因Q?/p>
Sometimes WS 6.5.0 does not start this automatically
]]> ORA-12514 TNS 监听E序当前无法识别q接描述W中h服务 的解x?/title> http://www.aygfsteel.com/freeman1984/archive/2011/04/15/348350.html疯狂 疯狂 Fri, 15 Apr 2011 06:58:00 GMT http://www.aygfsteel.com/freeman1984/archive/2011/04/15/348350.html http://www.aygfsteel.com/freeman1984/comments/348350.html http://www.aygfsteel.com/freeman1984/archive/2011/04/15/348350.html#Feedback 11 http://www.aygfsteel.com/freeman1984/comments/commentRss/348350.html http://www.aygfsteel.com/freeman1984/services/trackbacks/348350.html
早上同事用PL/SQLq接虚拟Z的Oracle数据库,发现又报?#8220;ORA-12514 TNS 监听E序当前无法识别q接描述W中h服务 ”错误Q帮其解军_Q发现很多h遇到q这L问题Q因此写着q里?/p>
也许你没有遇到过Q原因如下:
你oracle安装成功后,一直未停止数据库(x据库是启动的Q,客户端配|成功后Q应该一直不会有什么问题?/p>
而一旦你和我同事一P有时把Oracle安装在虚拟机中,而且Oracle安装完毕后,没在q行M监听的配|,则虚拟机再启动,则就会出现ORA-12514的问题。如下图
TNS 监听E序当前无法识别q接描述W中h服务 的解x? name=image_operate_32961295504739984 alt="ORA-12514 TNS 监听E序当前无法识别q接描述W中h服务 的解x? src="http://s7.sinaimg.cn/middle/5007d1b1g9a40c1c8ebf6&690" width=378 height=106>
如下是解x\Q?/p>
Ҏ出错信息判断出客L未监听到实例服务?/p>
1、通过重启服务的方式启动数据库Q再ơ连接仍无法q接服务器?/p>
2、既然第一U方法不能解决问题,那就W二U方法。考虑监听listener.ora
监听配置文glistener.ora中可以不必指定监听的服务名(安装Oracle10g后也是没有指定的Q。正常情况下一般只要数据库启动Q客Lq接数据库也没有什么问题,但是有时重复启动关闭也会出现ORA-12514错误?/p>
既然listener.ora中没有指定监听,我们可以在listener.ora文g中指定监听的实例名,q样该问题应该可以连接?/p>
步骤如下Q?/p>
在oracle服务器Oracle安装目录Q我的在E:\Oracle10g下,每个人的不一PҎ自己的情冉|找)Network/admin目录下找到listener.ora 我的如下图所C?
# listener.ora Network Configuration File: E:\Oracle10g\network\admin\listener.ora # Generated by Oracle configuration tools.
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = E:\Oracle10g) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = E:\Oracle10g) (SID_NAME = ORCL) ) )
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) (ADDRESS = (PROTOCOL = TCP)(HOST = onest)(PORT = 1521)) ) )
标红的ؓ我添加的部分QORCL为监听的实例名?/p>
然后在Oracle服务器的服务中重新启动监听服?img title="ORA-12514 TNS 监听E序当前无法识别q接描述W中h服务 的解x? src="http://s16.sinaimg.cn/middle/5007d1b1g9a4102276c5f&690" real_src="http://s16.sinaimg.cn/middle/5007d1b1g9a4102276c5f&690">Q然后在oracle客户端通过再次配置对Orcl实例的监听,如下图所C?img title="ORA-12514 TNS 监听E序当前无法识别q接描述W中h服务 的解x? src="http://s6.sinaimg.cn/middle/5007d1b1g9a410a2805c5&690" width=476 height=86 real_src="http://s6.sinaimg.cn/middle/5007d1b1g9a410a2805c5&690"> l果出现如下囄提示?br /> TNS 监听E序当前无法识别q接描述W中h服务 的解x? name=image_operate_14831295504695718 alt="ORA-12514 TNS 监听E序当前无法识别q接描述W中h服务 的解x? src="http://s13.sinaimg.cn/middle/5007d1b1g9a40c26294dc&690" width=598 height=401 real_src="http://s13.sinaimg.cn/middle/5007d1b1g9a40c26294dc&690"> q时我们不要着急,只需要oracle服务器重新启动一下,再次q接x功。这也是我们配置完listener.ora 监听后,l常忘记的。再ơ尝试,可以看到客户端可以连接上oracle服务器了Q而且PL/SQL再次q接也没有问题了?
而有些朋友在配置客户端时Q连接数据库成功Q而用PL/SQLӞ又出C如下图所C的问题。这又如何解军_Qؓ什么oracle客户端已l连接成功了Q而PL/SQL不行呢Q?br />
TNS 监听E序当前无法识别q接描述W中h服务 的解x? name=image_operate_78131295504727281 alt="ORA-12514 TNS 监听E序当前无法识别q接描述W中h服务 的解x? src="http://s3.sinaimg.cn/middle/5007d1b1g9a40c320fad2&690" width=436 height=288 real_src="http://s3.sinaimg.cn/middle/5007d1b1g9a40c320fad2&690">
出现如上的原因是Q可能是大家再配|oracle客户端时Q虽焉接成功了Q步骤上可能有些错误。大家用Net Cofiguration Assistant客户端时重新配置了OrclQ而不是添加,我们应该如下步骤处理Q就不会出问题了?/p>
1、如果Net Cofiguration Assistant中已l有了Orcl。我们可以重新配|?/p>
2、如果Net Cofiguration Assistant中没有OrclQ我们应该添?nbsp; 具体界面如下图所C?/p>
TNS 监听E序当前无法识别q接描述W中h服务 的解x? name=image_operate_52121295504778234 alt="ORA-12514 TNS 监听E序当前无法识别q接描述W中h服务 的解x? src="http://s5.sinaimg.cn/middle/5007d1b1g9a412cc6e6d4&690" width=594 height=397 real_src="http://s5.sinaimg.cn/middle/5007d1b1g9a412cc6e6d4&690">
如果大家该步处理也没有问题了Qlistener.ora 修改成功Qƈ且重新启动了oracle服务器,无论oracle客户端还是PL/SQL都能够成功连接数据库了?/p>
ȝ一下。当大家遇到“ORA-12514 TNS 监听E序当前无法识别q接描述W中h服务 ”错误的解x骤:
1、通过重启服务的方式启动数据库Q再ơ连接尝试?/p>
2、如果第一U方法不可行Q我们采用第二种Ҏ
正确dlistener.oraQ?/div>
重新启动了oracle服务器,q检查oracle所有服务是否启动;
oracle客户端Net Cofiguration Assistant正确d或重新配|实例名
转蝲自:http://blog.sina.com.cn/s/blog_5007d1b10100oqo8.html
]]>
提高AJAX客户端响应速度(转蝲) http://www.aygfsteel.com/freeman1984/archive/2011/02/11/344056.html疯狂 疯狂 Fri, 11 Feb 2011 07:23:00 GMT http://www.aygfsteel.com/freeman1984/archive/2011/02/11/344056.html http://www.aygfsteel.com/freeman1984/comments/344056.html http://www.aygfsteel.com/freeman1984/archive/2011/02/11/344056.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/344056.html http://www.aygfsteel.com/freeman1984/services/trackbacks/344056.html 提高 AJAX 客户端响应速度
(文:包一?/span>)
AJAX 的出现极大的改变?/span>Web 应用客户端的操作模式Q它使的用户可以在全心工作时不必频繁的忍受那令h厌恶的页面刷新。理Z AJAX 技术在很大的程度上可以减少用户操作的等待时_同时节约|络上的数据量。而然Q实际情况却q不Lq样。用h怼抱怨用?/span>AJAX 的系l响应速度反而降低了?/span>
W者从?/span>AJAX 斚w的研发多q_参与开发了目前国内较ؓ成熟?/span>AJAX q_ -dorado 。根据笔者的l验Q导致这U结果的Ҏ原因q不?/span>AJAX 。很多时候系l响应速度的降低都是由不够合理的界面设计和不够高效的编E习惯造成的。下面我们就来分析几?/span>AJAX 开发过E中需要时L意的环节?/span>
n 合理的用客L~程和远E过E调用?/span>
客户端的~程主要都是Z JavaScript 的。?/span>JavaScript 是一U解释型的编E语aQ它的运行效率相对于 Java {都要稍逊一{V同?/span>JavaScript 又是q行在浏览器q样一个严格受限的环境当中。因此开发h员对于哪些逻辑可以在客L执行应该有一个清醒的认识?/span>
在实际的应用中究竟应该怎样使用 客户端编E,q依赖于开发h员的l验判断。这里很多问题是只可意会的。由于篇q有限,在这里我们大致归U_下面q几个注意事:
u 可能避免频J的使用q程q程调用Q例如避免在循环体中使用q程q程调用?/span>
u 如果可能的话可能?/span>AJAX 方式的远E过E调用(异步方式的远E过E调用)?/span>
u 避免重量的数据操作放|在 客户端。例如:大批量的数据复制操作、需要通过大量的数据遍历完成的计算{?/span>
n 改进?/span>DOM 对象的操作方式?/span>
客户端的~程中,?/span>DOM 对象的操作往往是最Ҏ占用 CPU 旉的。而对?/span>DOM 对象的操作,不同的编E方法之间的性能差异又往往是非常大的?/span>
以下是三D运行结果完全相同的代码Q它们的作用是在|页中创Z?/span>10x1000 的表根{然而它们的q行速度却有着天壤之别?/span>
/* 试代码 1 - 耗时 : 41 U?/span>*/
var table = document.createElement("TABLE");
document.body.appendChild(table);
for(var i = 0; i < 1000; i++){
var row = table.insertRow(-1);
for(var j = 0; j < 10; j++){
var cell = objRow.insertCell(-1);
cell.innerText = "( " + i + " , " + j + " )";
}
}
/* 试代码 2 - 耗时 : 7.6 U?/span> */
var table = document.getElementById("TABLE");
document.body.appendChild(table);
var tbody = document.createElement("TBODY");
table.appendChild(tbody);
for(var i = 0; i < 1000; i++){
var row = document.createElement("TR");
tbody.appendChild(row);
for(var j = 0; j < 10; j++){
var cell = document.createElement("TD");
row.appendChild(cell);
cell.innerText = "( " + i + " , " + j + " )";
}
}
/* 试代码 3 - 耗时 : 1.26 U?/span> */
var tbody = document.createElement("TBODY");
for(var i = 0; i < 1000; i++){
var row = document.createElement("TR");
for(var j = 0; j < 10; j++){
var cell = document.createElement("TD");
cell.innerText = "( " + i + " , " + j + " )";
row.appendChild(cell);
}
tbody.appendChild(row);
}
var table = document.getElementById("TABLE");
table.appendChild(tbody);
document.body.appendChild(table);
q里?#8220;试代码 1 ”?#8220;试代码 2 ”之间的差别在于在创徏表格单元时用了不同?/span>API Ҏ。?#8220;试代码 2 ”?#8220;试代码 3 ” 之间的差别在于处理顺序的略微不同?/span>
“试代码 1 ”?#8220;试代码 2 ”之间如此大的性能差别我们无从分析Q目前所知的?/span>insertRow ?/span>insertCell ?/span>DHTML 中表格特有的 API Q?/span>createElement ?/span>appendChild ?/span>W3C DOM 的原?/span>API 。而前者应该是对后者的装。不q,我们q不能因此而得出结?/span>DOM 的原?/span>API L优于对象Ҏ?/span>API 。徏议大家在需要频J调用某一 API Ӟ对其性能表现做一些基本的试?/span>
“试代码 2 ”?#8220;试代码 3 ”之间的性能差异主要来自于他们的构徏序不同?#8220;试代码 2 ”的做法是首先创徏最外层?/span><TABLE> 对象Q然后再在@环中依次创徏 <TR> ?/span><TD> 。?#8220;试代码 3 ”的做法是首先在内存中由内到外的构建好整个表格Q最后再它d到网中。这样做的目的是可能的减少览器重新计页面布局的次数。每当我们将一个对象添加到|页中时Q浏览器都会试寚w面中的控件的布局q行重新计算。所以,如果我们能够首先在内存中整个要构造的对象全部创徏好,然后再一ơ性的d到网中。那么,览器将只会做一ơ布局的重计算 。ȝZ句话那就是越晚执?/span>appendChild 好。有时ؓ了提高运行效率,我们甚至可以考虑先?/span>removeChild 已存在的控件从面中移除,然后构造完成后再重新将其放|回面当中?/span>
n 提高字符串篏加的速度
在?/span>AJAX 提交信息Ӟ我可能常帔R要拼装一些比较大的字W串通过 XmlHttp 来完?/span>POST 提交。尽提交这样大的信息的做法看v来ƈ不优雅,但有时我们可能不得不面对q样的需求。那?/span>JavaScript 中对字符串的累加速度如何呢?我们先来做下面的q个实验。篏加一个长度ؓ 30000 的字W串?/span>
/* 试代码 1 - 耗时 : 14.325 U?/span> */
var str = "";
for (var i = 0; i < 50000; i++) {
str += "xxxxxx";
}
q段代码耗时 14.325 U,l果q不理想。现在我们将代码改ؓ如下的Ş式:
/* 试代码 2 - 耗时 : 0.359 U?/span> */
var str = "";
for (var i = 0; i < 100; i++) {
var sub = "";
for (var j = 0; j < 500; j++) {
sub += "xxxxxx";
}
str += sub;
}
q段代码耗时 0.359 U!同样的结果,我们做的只是首先D一些较的字符串然后再l装成更大的字符丌Ӏ这U做法可以有效的在字W串D的后期减内存复制的数据量。知道了q一原理之后我们q可以把上面的代码进一步拆散以后进行测试。下面的代码仅耗时 0.140 U?/span>
/* 试代码 3 - 耗时 : 0.140 U?/span> */
var str = "";
for (var i1 = 0; i1 < 5; i1++) {
var str1 = "";
for (var i2 = 0; i2 < 10; i2++) {
var str2 = "";
for (var i3 = 0; i3 < 10; i3++) {
var str3 = "";
for (var i4 = 0; i4 < 10; i4++) {
var str4 = "";
for (var i5 = 0; i5 < 10; i5++) {
str4 += "xxxxxx";
}
str3 += str4;
}
str2 += str3;
}
str1 += str2;
}
str += str1;
}
不过Q上面这U做法也许ƈ不是最好的Q如果我们需要提交的信息?/span>XML 格式的(其实l大多数情况下,我们都可以设法将要提交的信息l装?/span>XML 格式Q,我们q能扑ֈ更高效更优雅的方?/span>?span style="font-family: 宋体">利用 DOM 对象为我们组装字W串。下面这D代买组装一个长度ؓ 950015 的字W串仅须耗时 0.890 U?/span>
/* 利用 DOM 对象l装信息 - 耗时 : 0.890 U?/span> */
var xmlDoc;
if (browserType == BROWSER_IE) {
xmlDoc = new ActiveXObject("Msxml.DOMDocument");
}
else {
xmlDoc = document.createElement("DOM");
}
var root = xmlDoc.createElement("root");
for (var i = 0; i < 50000; i++) {
var node = xmlDoc.createElement("data");
if (browserType == BROWSER_IE) {
node.text = "xxxxxx";
}
else {
node.innerText = "xxxxxx";
}
root.appendChild(node);
}
xmlDoc.appendChild(root);
var str;
if (browserType == BROWSER_IE) {
str = xmlDoc.xml;
}
else {
str = xmlDoc.innerHTML;
}
n 避免 DOM 对象的内存泄漏?/span>
关于 IE ?/span>DOM 对象的内存泄露是一个常常被开发h员忽略的问题。然而它带来的后果却是非怸重的Q它会导?/span>IE 的内存占用量持箋上升Qƈ且浏览器的整体运行速度明显下降。对于一些泄露比较严重的|页Q甚臛_要刷新几ơ,q行速度׃降低一倍?/span>
比较常见的内存泄漏的模型?#8220; 循环引用 模型”?#8220; 闭包函数 模型”?#8220; DOM 插入序模型” , 对于前两U泄漏模型,我们都可以通过在网|构时解除引用的方式来避免。而对?#8220; DOM 插入序模型”则需要通过改变一些惯有的~程习惯的方式来避免?/span>
有关内存泄漏的模型的更多介绍可以通过 Google 很快的查刎ͼ本文不做q多的阐q。不q,q里我向您推荐一个可用于查找和分析网内存泄露的工?/span>?span style="font-family: 'Verdana', 'sans-serif'">Drip Q目前的较新版本?/span>0.5 Q下载地址?/span>http://outofhanwell.com/ieleak/index.php
n 复杂面的分D装载和初始?/span>
对系l当中某些确实比较复杂而又不便使用 IFrame 的界面,我们可以对其实施分段装蝲。例如对于多|{界面Q我们可以首先下载和初始化多|{默认,然后利用 AJAH Q?/span>asynchronous JavaScript and HTML Q技术来异步的装载其他标{N中的内容。这样就能保证界面可以在W一旉首先展现l用戗把整个复杂界面的装载过E分散到用户的操作过E当中?/span>
n 利用 GZIP 压羃|络量?/span>
除了上面提到的这些代码的改良之外,我们q可以利?/span>GZIP 来有效的降低|络量。目前常见的L览器已l全部支?/span>GZIP 法Q我们往往只需要编写少量的代码可以支?/span>GZIP 了。例如在 J2EE 中我们可以在 Filter 中通过下面的代码来判断客户端浏览器是否支持 GZIP 法Q然后根据需要利?/span>java.util.zip.GZIPOutputStream 来实?/span>GZIP 的输出?/span>
/* 判断览器对 GZIP 支持方式的代?/span> */
private static String getGZIPEncoding(HttpServletRequest request) {
String acceptEncoding = request.getHeader("Accept-Encoding");
if (acceptEncoding == null) return null;
acceptEncoding = acceptEncoding.toLowerCase();
if (acceptEncoding.indexOf("x-gzip") >= 0) return "x-gzip";
if (acceptEncoding.indexOf("gzip") >= 0) return "gzip";
return null;
}
一般而言Q?/span>GZIP 对于 HTML ?/span>JSP 的压~比可以辑ֈ 80% 左右Q而它造成的服务端和客L的性能损耗几乎是可以忽略的。结合其他因素,支持 GZIP 的网站有可能为我们节U?/span>50% 的网l流量。因?/span>GZIP 的用可以ؓ那些|络环境不是特别好的应用带来显著的性能提升。?/span>Http 的监视工?/span>Fiddler 可以方便的检出|页在?/span>GZIP 前后的通讯数据量?/span>Fiddler 的下载地址?/span>http://www.fiddlertool.com/fiddler/
关于 Web 应用的性能优化其实是一个非常大的话题。本文由于篇q有限,只能涉及其中的几个细节,q且也无法将q些l节的优化方式全面的展现l大家。期望本文能够引起大家对 Web 应用其是客L性能优化的充分重视。毕竟服务端~程技巧已为大家熟知多q_在服务端挖掘性能的潜力已l不大了。而在客户端的Ҏ改进往往能够得到令h惊奇的性能提升?/span>
]]>PopCap James GwwertzmanQ植物大战僵成功秘诀大揭U?/title> http://www.aygfsteel.com/freeman1984/archive/2010/10/23/335986.html疯狂 疯狂 Sat, 23 Oct 2010 11:44:00 GMT http://www.aygfsteel.com/freeman1984/archive/2010/10/23/335986.html http://www.aygfsteel.com/freeman1984/comments/335986.html http://www.aygfsteel.com/freeman1984/archive/2010/10/23/335986.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/335986.html http://www.aygfsteel.com/freeman1984/services/trackbacks/335986.html ?0?2日下午的“走向外分论?#8221;分论坛中QPopCap游戏公司亚太区总裁James Gwertzman发表了主题ؓ《《植物大战僵》成功的U密》的_ֽ演讲?/p>
PopCap游戏公司亚太区总裁James Gwertzman
对于植物大战僵尸成功U诀QJames Gwertzmanȝ了以下几点:
W一点:设计的游戏必要有创新。仅把别人的游戏直接搬过来虽然也会成功,但是永远没有办法做成最好的游戏Q最好的游戏永远都是原创的、创新的?/p>
W二点:要不断进行完。设计的游戏要让每种不同cd的h试q个游戏Q去适应不同人群?/p>
W三点:游戏发布后,要不断更新。成功游戏往往会经常更斎ͼ植物大战僵尸每三个月会更Cơ?/p>
W四点:同时需要充分利用社会网l,要把C会|络和游戏联在一Pq样可以影响游戏的销售情c?/p>
W五点:游戏支持的设备也很重要,对于开发商必须支持一pd讑֤?/p>
W六点:最开始游戏要是免费的。免Ҏ戏很Ҏ被嵌入到一些设备?/p>
附演讲实录:
James GwwertzmanQ大家好Q今天给大家谈一谈我们PopCap的经验,我们想问一下大家有多少人玩q,所以这h׃介绍q个游戏了,我们PopCaP目前为止最成功的游戏也是卖得最快的游戏Q我想介l我们怎么攑֜Ud端上应用Q首先给大家举一个例子这里面是我们原来这个游戏获得的一些奖大家可以非常受Ƣ迎Q不仅在PCZ在手Z也是有很多流行比用iPhoen其他讑֤玩这个游戏,比如说在中国我最喜欢q个视频是从哈尔滨学生传q来Q他们做了一个小视频模拟了这个游戏,可以在土豆或者其他上面可以看刎ͼq个可以看到哈尔滨冰雪节的时候,哈尔滨每天雪雕艺术展Q我们还有iPhoen版本Q大家有多少人在iPhoen或者Ipad上,q个是我最喜欢的版本,最有意思,最好玩和在PC机或者iPhoenQIpad是最有意思最好玩的?/p>
当我们推出iPhoen版本我们当时W一周销售超q?00万美金,然后对于我们PopCaP公司q有包括iPhoen都是历史记录Q这个是我们销售在亚洲销售情况,可以看到U色q个是大中华区,l色是澳大利亚,中间q一部分我们在中国iPhoen版本比其他国安要多q个是很见Q我们从来没有在中国卖游戏赚p是第一ơ,我们在iPhoen上面比日本,新加坡,q有其他的一些都是远q超q的Q增镉K度也是不断的在增加Q在我们销售^C增加Q所以越来越讑֤销售出去越来越多,iPhoen4当几周以前上个月北京国内推出iPhoen4Q中国成为第二个全球的PPZ国家W一是美国,W二是中国,iPhoen4来多会下载我们这个植物大战僵?/p>
我想谈一下如何能做一个成功的游戏Q当然要开发一个好的游戏,但是不仅如此要开发一个很好游戏其实ƈ不容易,我们PopCaP有几斚w做得比较好,首先W一个就是你必须要能够创斎ͼ不能说把别h的游戏直接搬q来放过来就成功Q当然抄别h东西可能风险比较,可能做得q不错但是永q没有办法做到最好游戏,最好的游戏永远都是原创Q创新的Q和别的游戏不一LQ这个不是我们PopCaP游戏Q这个仍然也是做得非常好的游戏,现在有很多不同版本,不同斚wQ第一要承担创新的风险Q第二当你有x要不断完,我觉得对于开发者有很多问题Q就是说q没有把q个游戏完全做得非常好,q做得比较好Q或者还不错Q还不是完美推出我们这个游戏花三年旉准备Q第二年我们CEO说这个不错,很好游戏赶紧推出我们说不行,我们q不是很完美游戏Q到W三q我们才觉得q个游戏是趋于完了Q我们CEO当时说原来第二年的时候说要把q个游戏推出Q他说这是他做得最大一个错误,因ؓW三q可以把q个游戏q一步雕琢,q个是一个屏q截图,q个是我们第一个版本,我们当时W一个版?5q就是这个样子的Q所以可以看到我们第一个版本叫U种子,是说你把你植物U到土里面,q些都是植物逐渐一点点长大Q植物长大开始和坏h作战Q右边可以看到是U植工,开发h员他们当时设计就是原来植物和完打仗不是和僵这个是游戏原ŞQ当时这个游戏一炚w不好玩,U种子还要等着q个U子长大q个q程和烦人,你看CU种子下去逐渐长大作战Q种下种子马上要跟它q行坏h作战Q从原Ş我们发现他的问题在哪里这个是06q第二版本植物大战僵,我给大家看一下这个游戏?/p>
可以看到谁能认出q个图标Q我们上面说在一个暖当中,在早期版本上你必选择某一个卡Q把它放到这个卡当中Q像q样Q你选择你的卡片以后会随即选择哪个卡来玩?/p>
比如说是随即来选这个植物的Q然后你要等他卡出现在上面,q个也不是很有意思,Z么?它太随即了,比如说我现在惛_q边再种一个种植我不能U了Q得{到卡出现才能种Q它太随即了。所以大家可以看到这是早期一个版本。所以在q个版本06q版本当时告诉我们就是这U随机性现在卡片,随即你选什么也不是很有意思,不好玩,我们永远不是有一个设计的文gQ我们不在纸上写下来游戏是怎么设计出来Q你不知道你只有玩的时候才知道q个话游戏好玩不好玩Q你只有做完以后玩以下才知道q个游戏意思没意思,早期版本向日葵,僵尸最初分几行U植q是我们原Şq有很多东西我们早期是没有考虑是后期添加,q个也是我们从早期版本学到这个是另外一个版本,是我?7q一个版本,07q我们这个游戏其实看h已经很好玩,背景跟现在差不多Q包括格子分布,僵尸形状基本定下来,有很多已l定下来q有最主要一个问题,大家可以看到我不知道大家能不能看到这些植物图表,向日葉|100分,豆荚也是100分,Ҏ玩家玩这个不了解q个l济学,不了解就是说Z么你要先U很多向日葵再种豆荚打僵刚开始玩家可能会挣很多钱Q有100块钱他想我是选向日葵q是豆荚先玩家会建立q样一个的在家门口都是U的豆荚Q最后肯定会p|不了解这个游戏,所以当时我们设计师惛_何解册L问题Q如何教l新玩家Z么先U向日葵Q这个对于很多游戏设计师W一{案你教他,如果玩家不懂你要加一个说明,但是我觉得这个设计是不好的,说明是修整你设计当中存在的漏洞Q但是这个ƈ不是最好的解决ҎQ所以他们所做我们的设计师就是说你只能,你某些区域只能种向日葵不能种豆荚Q最后我们提x案把h调整以下Q向日葵?0分,豆荚?00分,新玩家会被你带领U很多的向日葵,通过阳光挣很多钱才能花q豆荚{等Q这个就是很好的解决了这样一个问题,所以你看到是一个很的变化Q但是媄响整个游戏对新玩家的布局?/p>
对于高玩家对于其他游戏很熟悉这个你没有什么问题,因ؓ你已l了解了是先种向日葵再U豆荚,只有随便玩一玩,普通玩家不了解q里面的情况Q另外一Ҏ们设计其实目标是针对所有hQ大人,孩Q男女等{,你必L所有hq行试Q我们当时用我们老婆或者女朋友玩这个游戏,所有h都发现这样一个问题,我们自己监测的时候没有Q何问题,但是有些Z来没有玩q游戏,觉得q个游戏太难Q你设计游戏要让每一个不同类型h试你这个游戏,q个最新版本是我们花四q时_?9q版本,我们最初是05q设计出来,大家可以看到是我们最l出来的情况Q可以看ChD有其他很多方面都定下来,你不能够急于求成有很多东西要花很多时间雕琢才能达到精品,我这个笔记本里面有植物大战僵十多不同版本,我们一点一Ҏ雕琢完善Q第二开发出来很好游戏必d一个很好手机游戏,像原来我们在电脑上游戏是不一P如果你在手机开发出来游戏还要考虑很多其他因素Q对于手机游戏来说首先第一个必要有一个直观控Ӟ特别是在触屏方式Q你讄用户界面是非常关键,如果UI觉得不好玩,没有直接沟通等{,q样没有做好Q要有一个直接控Ӟ要调整你q个游戏Q或者你把这个游戏来设计Q比如说l大家D一个例子,左边是一个在电脑上PCZ的版本,双是iPhoen版本Q可以看到首先第一点就是它的按U在iPhoen上按U大很多QiPhoen本n很小Q屏q本w很,按纽必须比较大用h能按刎ͼ而且很容易能够看刎ͼ僵尸脑袋大很多,大了20%Q这L户很Ҏ看到q是那种僵尸Q我们还把UI转边上,整个下面一个集成表Q我们从右下角挪C间上面,非常的改变使它适合IPhoneQ我们当时有很多设计Q在IPhone上面我们使它更加化而且W合多种q面要求Q可以看到右下角不同的iPhoen的UIQ所以你对你的游戏不断调整才能做出成功的游戏?/p>
W三点就是必要不断更新你要不管?GQ?G{等Q要跟上Q然后成功游戏往往会经常更斎ͼ我们植物大战僵尸每三个月更新一ơ,有些公司频率会更高一些,比如说愤怒鸟q个游戏每两周更Cơ,他们也不攉Q你买这个游戏一ơ每两周都可以更Cơ,没有什么问题,q个游戏不断q行更新Qh们不断玩不断告诉他们朋友Q所以这个愤怒鸟在游戏当中一直是排名前十位,不断更新随着技术不断进展,比如说iPhoen也出玎ͼAndroid也出CQ技术可能变化速度更快Q必要准备好,不仅仅开发完了这个游戏就是一x怺Q是要不断的投入?/p>
q是回到前面q个图,如果你游戏正你销售会一直增加,我们卖出q个拯已经很多了,跟刚开始推个游戏已l有很多版本被销售出去,所以大家不要想你这个游戏只卖一个月完蛋了Q如果是一个好的游戏一直会保证一个非常好的销售,所以你要对q个游戏一直进行投资,我们要听取玩家意见,把他融入到我们游戏设计里面去Q同时我们需要充分利用社会网l,我们要把C会|络和我们的游戏联在一Pq样可以会媄响我们游戏的一个销售,我们看一下一个游戏大家玩q在脸谱上的一个游戏,是一个非常有名的游戏是他的一个改~版本这个就是iPhoen的版本,旉q不是特别长Q一般来说都是排W五Q第六iPhoen游戏Q我们就是把它加上了Q我们需要从iPhoen游戏当中d我们脸谱的一个游戏,可以游戏上玩q个游戏可以得到一个比较高的分敎ͼ可以把比较高的分数放到脸׃Q这样一个变化媄响是什么,q里是我们销售的一个结果,是在我们加上脸谱内容以后,在我们加上脸qq接性以后,可以看到很多Z在iPhoen上购买游戏,因ؓ他们是从脸谱上了解到q个游戏的,而且我们的销售量也是有了很大的增加,可以看到q个销售量是在我们加入社交网l之前相比我们销售收入已l增加了两到三倍?/p>
那么我们可以一ơ性购买iPhoen的游戏,然后可以利用我们的模式规模更多一些更新版本,所以可以看到社会的|络Q我认ؓ是相当重要,而且他也会推动我们下一轮网l游戏的一个发展。比如说现在在日本,现在最大的市场是移动社交网l,国和中国也会很快追上来Q我们开发游戏是要把游戏和社交网l结合在一P因ؓ我们认ؓq个是一个非常大的成长空_我们大家应该更多考虑一下社交网l,再现|络或者是C交|络联在一P另外是我们支持设备也是相当重要,对于开发商我们必须支持一pd讑֤Q对于PopCaP也是一个非常大的挑战,比如说现在我也没有一个对Androidq没有一个很好的融合Q比如说之前我们也发现要支持很多讑֤是非帔R的,我们有很多技术但是我们还需要做很多调查试q是一个非常大的挑战如果我们游戏可以在更多讑֤商玩我们׃增加一个收入?/p>
后面我会讲一下PLANTS。这个就是其中一个离?我认为PLANTSq个版本要比我们的PC版本q有Ud手机版本要好得多Q将来我们会更多开发一些用于PLANTS斚w游戏Q我们会设计一些图标,比如说我的孩子只?岁他特别喜欢我这个IPADQ因Z喜欢用我的IPAD玩游戏,我们安面也有PC和其他设备但是他L喜欢通过IPAD玩游戏也p明这斚w市场是非常大?/p>
我们看一下在亚洲和中国,我没有必要告诉F2P是一个很好的模式Q我们知道免费玩游戏是一个非常好的模式,当然在美国销售游戏是比较好的模式Q在中国我想免费玩游戏是非常好的模式Q特别是在中国,或者在亚洲我们发现很多游戏是免费玩的一U模式,如果是能够免费玩的话Q如果是q种模式游戏DRM很容易被破解Q但是在IPAD可以有,别的地方没有Q所以这个DRM五问题一定是非常重要的,另外一个就是有大量的OEM嵌入ZQ游戏是免费游戏很容易被嵌入C些设备,可以获得一些许可一些成本,可以获得一些许可费Q同时比如说我们看一下Y件商城,q里是一个IPhone上一个嵌入一个应用我们需要够一些它也是非常好,我们点击一下我们就可以q行采购Q我惛_是每个h都曾l用q这样一些界面我们知道可能有两到三十个YӞq样模式可能会很快流行v来,你是否愿意花更多旉玩那些你认ؓ可以玩的那些游戏吗,对于用户来说可能会首先购C个游戏,如果q个游戏是免费,我想问题不会特别大,如果游戏刚开始是免费Q也总们会愿意׃些钱C些工P所以大家一定要采用q种模式Q最开始游戏是免费的,我不知道有多h知道PopCaP我们在很多^C是非常成功,我们有PCQ还有在手机Q还有在脸谱上等{我们都特别好的游戏的应用Y件?/p>
我们希望能够把所有这些^台整合一P我知道这是一个移动开发者大会,当然q个Ud游戏是非常好的,如果q个Ud游戏能够和其他^台结合在一P比如说和我们的网l游戏,PC游戏或者是C交|络联在一起将会更好,如果能够整合所有^台的话,我们的游戏会变得特别强大?/p>
我还有一些关于几个游戏的一些例子,我也会给大家展示一些示范。接下来l大家介l我们PVZD的一些游戏,然后我们会进入问{环节,我们做植物大战僵我们最重要q个游戏一定要好玩Q关于PVZq个游戏Q不知道大家是否熟悉q个游戏Q在国是我们??日愚我们喜欢在办公室玩游戏,我们喜欢玩这个PVZQ我们也喜欢??日玩植物大战僵尸游戏我们可以看到Q比如说我们会骗别h说我们有一个最新版本最好的植物大战僵尸游戏国Z载,l果不是Q每个h都被骗了。我们有一个内部工P玩家可以在上面加上他们的一些评论,他们可能会有一些不同评论可能说最好的PVZ版本有些Z说我们会用这个,或者我们怎么杀d诞老h僵尸如果你玩的话你会发现它特别有意思。这个就是愚的版本,很多人都说根本不好,q个游戏Ҏ不能玩,很多Z问到底出了什么问题,当然q个是一个游戏是一个愚版本Q同时我们还有一个另外一个僵游戏,q个游戏也是来欺骗别人的Q大家可以看C是特别有意思的。我不知道我们还有多长时_但是现在我想我们应该回答一下大家的问题Q如果大家有问题我们可以提问一下?/p>
他问的问题在我们说到免费版本Q我们是通过q告赚钱q是通过在线游戏Q通过工具来赚钱呢Q我们答案就是第二种情况Q游戏当中广告说实话q不是很成功Q比如说每年我们都听到这L一些说到游戏当中加q告是非常好的模式,实际上我们这个模式我们也是用十年旉但是从来没有成功Q我惛_是你让用户ؓq个工具花钱的话Q可能会更加成功Q因得花q个钱是Z自己qQ所以我的答案就是第二种模式?/p>
他是一个评论PopCaP是一个如果让Z个工兯钱,我们会有一个免Ҏ式,应该成ؓ一个社会网l的游戏Q比如说我们做的W一个游戏,q个游戏在脸谱是可以玩的Q因谱是一个社交网l我们可以和朋友Q一L争玩q个游戏Q可以拿C个非常好的分敎ͼ他是一个一个非常简单在U模式,也就是说你所要想的就是要获得最高的分数Q劲玩获得很多分数很多人在q方面愿意花很多qq个游戏Q这个游戏每q也是变得越来越复杂Q可以看到这个游戏就是和最开始我们这个游戏推出和6个月之前我们发现每个用户在上面花p我们游戏推出开始的时候比q个钱是之前??倍,我们有很多方法改善我们的游戏Q更新我们的游戏Q很多h讲到AP试是说我们应该做不同的测试然后选择最好的ҎQ通过他可以对我们游戏q行提高但是我们可以提高10%?0%Q如果我们加入一些新特点Q我们能够非常快的推动这个游戏的一个推q,如果你分数非帔Rq个游戏会说贺你,因ؓ你发现我们的月亮矻I你是否愿意买Q这个玩家会觉得是一个珍늚宝石Q所以他们会用他们免费货币买Q当然如果你没有|上虚拟货币可以用真׃我们的宝矟?/p>
当然q不会改变我们的多层的一个^収ͼ很多人非常喜Ƣ这样一U模式,比如说有很多Z试q样一个游戏,然后会反复玩Q如果我们能够尝试不同的东西的话Q可能会帮助你生成更多的收入非常感谢?/p>
提问Q?/strong>我有两个问题Q你讲到PopCaP我们会进入社交网l游戏不仅仅是手机游戏,我中国有一个网l开发商他们已经创徏了一个在U的PVZ游戏版本他,他可以在M览器上使用Q我的第一个问题就是他很容易被复制Q很Ҏ被复制到中国来。所以可能会影响PopCaP在中国的收入Q那么您的看法是什么呢Q?/p>
James GwwertzmanQ?/strong>是对于q种山寨游戏我们是非常关注,比如说中国很多山寨游戏我们都知道Q有的时候我们会提v上诉Q当然就是用法律手段是一U方法,我们都知道PopCaPq个游戏有的时候需要花很多旉才能开发出来好的,很多山寨游戏q不是特别好Qȝ来说用户都不喜欢那些山寨游戏因ؓ我们L要听看这个PPS论坛上用h见这q不是真的我们不喜欢q个游戏Q是山寨版本l了我们一个希望,用户新的真的版本Q真的东西,真的品牌Q我们能够提供一个真正的PVZ游戏如果很有意思我们会占据优势Q当然要花很多时_最开始游戏要花四q时_要徏立一个在U游戏当然要花很长时_我们最l会推出q样一个在U游戏,我们竞争Ҏq不应该是这U山寨游戏因Z们的质量太差了,我们真正竞争Ҏ的ƈ不是山寨开发商Q我们最大的竞争Ҏ是我们自己,很多人喜Ƣ以前版本我们要把他吸引到再现游戏版本上来说的话Q对我来说这是一个很大的挑战Q当然如果我们花很长旉开发出非常好在U游戏丰富它的内Ҏ们排名还要考前Qh们一直想要尝试愿意玩他们q个游戏Q我们希望我们能够开发出特别好的游戏Q而且一直进行更新?/p>
我想是中国可能和国际市场有一些不同,在中国我们有几个非常大的CQ比如说ZhQQQ我们知道最初版本是脸谱是一个原创版本,但是PVZiPhoen版本Q他们也有一些功能可以很脸谱朋友联一P但是q个Zhq有QQ上的朋友Q现在h们喜Ƣ通过山寨版本的脸谱和自己的朋友联合,实际上就是我们也有一个版本就是通过iPhoen可以跟h在一P我们q没有在Zh上启动一个功能,但是我们特别重视中国的社交网l比我们跟h人,开心,QQ都进行过跟踪Q脸׃是中国本土网l,在中国就是这样一些市场必L本土化的Q所以我们也希望PopCaP一些游戏能够实现本土化?/p>
你最q是在中国市ZQ它能不能用在SNS比如说h人网l上我们现在是出版了它的实验版将来大家可能会看到?/p>
提问Q?/strong>W一是你如何^衡它的时间和q展Q你刚才说你前面植物僵尸是花四年旉不断雕琢Q那么你四年肯定׃很多旉金钱{等Q如果成功了没有问题Q但是如果你四年以后q是p|怎么办?/p>
W二个问题你如何比如说像EA你觉得他们是你的竞争Ҏ吗?
James GwwertzmanQ?/strong>W一个问题如果我们花四年旉做游戏如果失败怎么办,比如说花了很多时间精力,对于我们是快点p|Q如果失败就会快一点,q个游戏不会一直投入,然后发展到失败,q个原Ş是我们可能q了两周觉得q个游戏不是很有意思,但是我们没有说完全放弃,我们要看它有没有意思,再改q,如果说你q个x有意思只需要改q可能花三年Q我们花?个月q道这是一个很好的游戏Q如果这个游戏过六周没有意思过了三q也没有意思我们PopCaP有很多游戏没有上市,我们推出很多游戏可能是很多游戏都是从来没有出q他的摇当中,你看到都是成功的游戏我们会很快决定,所以对于成本和质量来说往往是有关系Q我们CEO说我们每两年推出一个游戏,一个成功的游戏的话Q我们做的时候是非常好,每两q只要能有一个游戏成功就没有问题Q但是及时这样都很难但是我们不可能一q推出十个游戏,所有都是很一般的游戏Q所以游戏好q是不好Q得好不好,是不是所有的q_的多挣钱QPC挣这么多钱,iPhoen每一个^台设备都能挣钱所以一个非怼大的 游戏Q根据这个游戏开发出一个不同的pd?/p>
提问Q?/strong>我想问一下你对于在线多玩家游戏是什么看法?/p>
James GwwertzmanQ?/strong>q个问题中国现在是做PC游戏来少Q我觉得全球范围之内也是q样QPopCaP也是单一玩家游戏会越来越,来我们可以看到C交游戏在线游戏Q网上游戏等{,|上游戏有很多优势,所以我觉得每个游戏PopCaP有一个网l特性,C交Ҏ,我们现在设计游戏是针Ҏ个h的,所以我们植物大战僵怹是这P我们希望来能够d我们C交特色C交|络Q对于中国更是这P我们上v?0人团队做中国游戏开发,比如说一个月之前在韩国我们宣布了一个新产品叫PopCaPW是第一个自由在U多玩家PopCaP游戏Q有一个超U祖玛四个h多万?玩祖玛游戏这个是玛游戏最有意思一个版本,我们在韩国现在推ZQ将来我们有可能把它带到中国市场Q我们现在正在开发这U多玩家在线游戏Q但是不仅仅是PCQ我们说Ud讑֤Q比如说现在我们可以看到Android{等Q我们觉得多讑֤Q界面也是非常有潜力Q非常感谢大家?/p>
文章来自Qhttp://mobile.csdn.net/n/20101022/280798.html
]]>
如何防止量的代码修改导致的全用例测?/title> http://www.aygfsteel.com/freeman1984/archive/2010/10/19/335508.html疯狂 疯狂 Mon, 18 Oct 2010 16:18:00 GMT http://www.aygfsteel.com/freeman1984/archive/2010/10/19/335508.html http://www.aygfsteel.com/freeman1984/comments/335508.html http://www.aygfsteel.com/freeman1984/archive/2010/10/19/335508.html#Feedback 4 http://www.aygfsteel.com/freeman1984/comments/commentRss/335508.html http://www.aygfsteel.com/freeman1984/services/trackbacks/335508.html
一个关于移动的目Q现在做了快两年了,目来大Q其中有的表数据加上历史数据都到10亿别,׃q两q团队成员流动大Q导致代码越来臃肿,前期目代码的管理不善,除了较大的版本,一般的修改都不l过代码评审Q本地测试通过后,直接hotfixQ有时候很利Q但是偶导致较大问题,有时候甚臛_响客户用,D公司亏损。现在领导发现问题就直接骂工E部Q导致现在每当有一点点修改Q工E部都要求AQ按照试用进行全用例试Q测试非常的不易Q光是功能测试几?个测试h员一天时_q要兼容几乎所有浏览器Qie6~8,火狐Q遨游,TTQ?60Qgoogle,搜狗Q。工作量巨大。没办法现在我们的做法如下:
1 加强代码的版本控ӞҎơ代码的修改Q都直接联系C人,代码的修攚w要写修改说明Q包括:修改内容Q修改前效果Q修改后效果Q对其他接口或功能的影响Q回滚策略,试用例?br />
2 代码评审Q代码评审的标准我们也在不断修改完善Q过一D|都会对评审标准进行评审。评审前参会人员都会拿到 上一步相关h员写的修改说明,会前2时阅读Q会中,有相关h员对代码q行程讲解Qƈq行效果演示Q评审内容包括,代码评审Q是否符合代码评审标准)Q效果评审(是否辑ֈ产品需求效果)Q用例评?是否可以覆盖当前修改)Q回滚评审(出错后是否可以及时的回滚到前一版本Q?br />
3 ȝ每期评审l果Q必要时间进行讨论,提出问题Q包括项目中遇到的难题,和大家对评审的看法,ȝl验Qƈ对公认的技术问题进行归c,由对此熟悉的人员Q架构师Q开发经理,个hQ在周一q行技术讲解(我们是每?ơ的技术培训,没有公共话题的情况下Q如果有人想分n个hl验的话Q可提前准备Q现在ؓ了鼓励大ӞҎ培训效果Q对培训讲解人是有偿的,奖励多少不公开Q会中很z跃Q一般不会刻意打断你Q除非公p题,q一Ҏ是比较喜Ƣ,每天都会ȝ大量的文章,书籍M解话题)?br />
4 和W效挂钩,q一点大安不喜Ƣ啊Q不q没办法Q领导意思,每次上线都搞得心里惶惶的?br />
q些工作我们做了半年Q也是有成效Q有时候评审会叫上工程部的人来看,工程部也承认我们的工作,也不怎么要求全用例了Q但是好多都慢慢形式化,包括评审Q主要还是有时候项目特别紧Q大安加班加点q项目,Z上线Q项目都改了好几个版本,q没评审一ơ,l果可想而知。有时候也惌自动化测试,但是d了h为的控制ȝ问题多多啊,主要是自动化试q方便经验不?br />
不知道大家在开发大型项目的q程中,都是如何保证产品质量的,主要是如何在目比较紧的情况下防止全用例测试,不要说你们每ơ修攚w全用例测试,都是l灯才上U,全用例测试对我们来说那简直是要命啦,也不要说刚招聘的一个新Z写的代码你就攑ֿ不用试评审?br />
我个为是可以避免量修改D的全用例试的,主要的问题就是修改带出来的新问题Q如何防止修改老问题带出新问题Q个为有以下因素DQh的积极性,人的责Q心,人的上进心。h的积极性需要领导层共同解决Q如何在紧张的项目下l员工舒适的环境和心情,人的责Q心和上进心是是自己的素养,不管多么没意思的工作你是否愿意去做好Q还有就是你是否愿意提高你的技能来防止q些问题? 但是q每一炚w不是嘴上说说p做好的?/span>
]]> 加速JavascriptQDOM操作优化 http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335395.html疯狂 疯狂 Sun, 17 Oct 2010 15:53:00 GMT http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335395.html http://www.aygfsteel.com/freeman1984/comments/335395.html http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335395.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/335395.html http://www.aygfsteel.com/freeman1984/services/trackbacks/335395.html 原文Q《Speeding up JavaScript: Working with the DOM?/p>
作者: KeeKim Heng, Google Web Developer
在我们开发互联网富应用(RIAQ时Q我们经常写一些javascript脚本来修Ҏ者增加页面元素,q些工作最l是DOM——或者说文档对象模型——来完成的,而我们的实现方式会媄响到应用的响应速度?/p>
DOM操作会导致浏览器重解?reflow)Q这是浏览器的一个决定页面元素如何展现的计算q程。直接修改DOMQ修改元素的CSS样式Q修Ҏ览器的窗口大,都会触发重解析。读取元素的布局属性比如offsetHeithe或者offsetWidth也会触发重解析。重解析需要花费计时_因此重解析触发的少Q应用就会越快?/p>
DOM操作通常要不是修改已经存在的页面上的元素,要不是创徏新的面元素。下面的4U优化方案覆盖了修改和创建DOM节点两种方式Q帮助你减少触发览器重解析的次数?/p>
Ҏ一Q通过CSScd切换来修改DOM
q个Ҏ让我们可以一ơ性修改一个元素和它的子元素的多个样式属性而只触发一ơ重解析?/p>
需求:
Qemu注:原文作者写到这里的时候脑子显然短路了一下,把后面的Out-of-the-flow DOM Manipulation模式要解决的问题l摆到这里来了,不过从示范代码中很容易明白作者真正想描述的问题,因此emu׃照翻原文了)
我们现在需要写一个函数来修改一个超链接的几个样式规则。要实现很简单,把这几个规则对应的属性逐一改了好了。但是带来的问题是,每修改一个样式属性,都会D一ơ页面的重解析?/p>
view plaincopy to clipboardprint?
function selectAnchor(element) {
element.style.fontWeight = 'bold';
element.style.textDecoration = 'none';
element.style.color = '#000';
}
function selectAnchor(element) {
element.style.fontWeight = 'bold';
element.style.textDecoration = 'none';
element.style.color = '#000';
}
解决Ҏ
要解册个问题,我们可以先创Z个样式名Qƈ且把要修改的样式规则都放到这个类名上Q然后我们给链接添加上q个新类名,可以实现添加几个样式规则而只触发一ơ重解析了。这个模式还有个好处是也实现了表现和逻辑相分R?/p>
view plaincopy to clipboardprint?
.selectedAnchor {
font-weight: bold;
text-decoration: none;
color: #000;
}
function selectAnchor(element) {
element.className = 'selectedAnchor';
}
.selectedAnchor {
font-weight: bold;
text-decoration: none;
color: #000;
}
function selectAnchor(element) {
element.className = 'selectedAnchor';
}
Ҏ二:在非渲染Z改DOM
Qemu注:作者在q里再次脑子短\Q把DocumentFragment DOM Generation模式的介l提前到q里来了Qemu只好再次发挥一下)
上一个方案解决的是修改一个超链接的问题,当一ơ需要对很多个超链接q行相同修改的时候,q个Ҏ可以大显n手了?/p>
需?/p>
需求是q样的,我们要写一个函数来修改一个指定元素的子元素中所有的链接的样式名(classNameQ属性。要实现很简单,我们可以通过遍历每个链接ƈ且修改它们的样式名来完成d。但是带来的问题是Q每修改一个超链接都会D一ơ重解析?/p>
view plaincopy to clipboardprint?
function updateAllAnchors(element, anchorClass) {
var anchors = element.getElementsByTagName('a');
for (var i = 0, length = anchors.length; i < length; i ++) {
anchors[i].className = anchorClass;
}
}
function updateAllAnchors(element, anchorClass) {
var anchors = element.getElementsByTagName('a');
for (var i = 0, length = anchors.length; i < length; i ++) {
anchors[i].className = anchorClass;
}
}
解决Ҏ
要解册个问题,我们可以把被修改的指定元素从DOM里面U除Q再修改所有的链接,然后在把q个元素插入回到它原来的位置上。ؓ了完成这个复杂的操作Q我们可以先写一个可重用的函敎ͼ它不但移除了q个DOM节点Q还q回了一个把元素插回到原来的位置的函数?/p>
view plaincopy to clipboardprint?
/**
* Remove an element and provide a function that inserts it into its original position
* @param element {Element} The element to be temporarily removed
* @return {Function} A function that inserts the element into its original position
**/
function removeToInsertLater(element) {
var parentNode = element.parentNode;
var nextSibling = element.nextSibling;
parentNode.removeChild(element);
return function() {
if (nextSibling) {
parentNode.insertBefore(element, nextSibling);
} else {
parentNode.appendChild(element);
}
};
}
/**
* Remove an element and provide a function that inserts it into its original position
* @param element {Element} The element to be temporarily removed
* @return {Function} A function that inserts the element into its original position
**/
function removeToInsertLater(element) {
var parentNode = element.parentNode;
var nextSibling = element.nextSibling;
parentNode.removeChild(element);
return function() {
if (nextSibling) {
parentNode.insertBefore(element, nextSibling);
} else {
parentNode.appendChild(element);
}
};
}
有了上面q个函数Q现在我们就可以在一个不需要解析渲染的元素上面修改那些链接了。这样只在移除和插入元素的时候各触发一ơ重解析?/p>
view plaincopy to clipboardprint?
function updateAllAnchors(element, anchorClass) {
var insertFunction = removeToInsertLater(element);
var anchors = element.getElementsByTagName('a');
for (var i = 0, length = anchors.length; i < length; i ++) {
anchors[i].className = anchorClass;
}
insertFunction();
}
function updateAllAnchors(element, anchorClass) {
var insertFunction = removeToInsertLater(element);
var anchors = element.getElementsByTagName('a');
for (var i = 0, length = anchors.length; i < length; i ++) {
anchors[i].className = anchorClass;
}
insertFunction();
}
Ҏ三:一ơ性的DOM元素生成
q个Ҏ让我们创Z个元素的q程只触发一ơ重解析。在创徏完元素以后,先进行所有需要的修改Q最后才把它插入到DOM里面d可以?/p>
需?/p>
需求是q样的,实现一个函敎ͼ往一个指定的父元素上插入一个超链接元素。这个函数要同时可以讄q个链接的昄文字和样式类。我们可以这样做Q创建元素,插入到DOM里面Q然后设|相应的属性。这p触发3ơ重解析?/p>
view plaincopy to clipboardprint?
function addAnchor(parentElement, anchorText, anchorClass) {
var element = document.createElement('a');
parentElement.appendChild(element);
element.innerHTML = anchorText;
element.className = anchorClass;
}
function addAnchor(parentElement, anchorText, anchorClass) {
var element = document.createElement('a');
parentElement.appendChild(element);
element.innerHTML = anchorText;
element.className = anchorClass;
}
解决Ҏ
很简单,我们只要把插入元素这个操作放到最后做Q就可以只进行一ơ重解析了?/p>
view plaincopy to clipboardprint?
function addAnchor(parentElement, anchorText, anchorClass) {
var element = document.createElement('a');
element.innerHTML = anchorText;
element.className = anchorClass;
parentElement.appendChild(element);
}
function addAnchor(parentElement, anchorText, anchorClass) {
var element = document.createElement('a');
element.innerHTML = anchorText;
element.className = anchorClass;
parentElement.appendChild(element);
}
不过Q要是我们想要插入很多个链接到一个元素里面的话,那么q个做法q是有问题:每插入一个超链接q是要触发一ơ重解析。下一个方案可以解册个问题?/p>
Ҏ四:通过文档片段对象QDocumentFragmentQ创Zl元?/p>
q个Ҏ允许我们创徏q插入很多个元素而只触发一ơ重解析。要实现q点需要用到所谓的文档片段对象QDocumentFragmentQ。我们先在DOM之外创徏一个文档片D对象(q样它也׃需要解析和渲染Q,然后我们在文档片D对象中创徏很多个元素,最后我们把q个文档片段对象中所有的元素一ơ性放到DOM里面去,只触发一ơ重解析?/p>
需?/p>
我们要写一个函敎ͼ往一个指定的元素上面增加10个超链接。如果我们简单的直接插入10个超链接到元素上面,׃触发10ơ重解析?/p>
view plaincopy to clipboardprint?
function addAnchors(element) {
var anchor;
for (var i = 0; i < 10; i ++) {
anchor = document.createElement('a');
anchor.innerHTML = 'test';
element.appendChild(anchor);
}
}
function addAnchors(element) {
var anchor;
for (var i = 0; i < 10; i ++) {
anchor = document.createElement('a');
anchor.innerHTML = 'test';
element.appendChild(anchor);
}
}
解决Ҏ
要解册个问题,我们要先创徏一个文档片D对象,然后把每个新创徏的超链接都插入到它里面去。当我们把文档片D对象用appendChild命o插入到指定的节点Ӟq个文档片段对象的所有子节点׃赯插入到指定的元素里面Q而且只需要触发一ơ重解析?/p>
view plaincopy to clipboardprint?
function addAnchors(element) {
var anchor, fragment = document.createDocumentFragment();
for (var i = 0; i < 10; i ++) {
anchor = document.createElement('a');
anchor.innerHTML = 'test';
fragment.appendChild(anchor);
}
element.appendChild(fragment);
}
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/emu/archive/2010/03/01/5334583.aspx
]]> CometQ基?HTTP 长连接的“服务器推”技?/title> http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html疯狂 疯狂 Sun, 17 Oct 2010 15:45:00 GMT http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html http://www.aygfsteel.com/freeman1984/comments/335394.html http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/335394.html http://www.aygfsteel.com/freeman1984/services/trackbacks/335394.html CometQ基?HTTP 长连接的“服务器推”技?br />
2008-06-30 21:31
别: 中
??(zhouting@cn.ibm.com), 软g工程? IBM 中国软g开发技术实验室
2007 q?8 ?31 ?/p>
很多应用譬如监控、即旉信、即时报Ll都需要将后台发生的变化实时传送到客户端而无dL不停地刷新、发送请求。本文首先介l、比较了常用?#8220;服务器推”ҎQ着重介l了 Comet Q?使用 HTTP 长连接、无L览器安装插g的两U?#8220;服务器推”ҎQ基?AJAX 的长轮询方式Q基?iframe ?htmlfile 的流方式。最后分析了开?Comet 应用需要注意的一些问题,以及如何借助开源的 Comet 框架Qpushlet 构徏自己?#8220;服务器推”应用?br />
“服务器推”技术的应用
误?Ajax 技术资源中心,q是有关 Ajax ~程模型信息的一站式中心Q包括很多文档、教E、论坛、blog、wiki 和新闅RQ?Ajax 的新信息都能在这里找到?nbsp;
订阅 Ajax 相关文章和教E的 RSS 提要
传统模式?Web pȝ以客L发出h、服务器端响应的方式工作。这U方式ƈ不能满很多现实应用的需求,譬如Q?/p>
监控pȝQ后台硬件热插拔、LED、温度、电压发生变化;
x通信pȝQ其它用L录、发送信息;
x报hpȝQ后台数据库内容发生变化Q?
q些应用都需要服务器能实时地更新的信息传送到客户端,而无dL发出h?#8220;服务器推”技术在现实应用中有一些解x案,本文这些解x案分Zc:一c需要在览器端安装插gQ基于套接口传送信息,或是使用 RMI、CORBA q行q程调用Q而另一cd无须览器安装Q何插件、基?HTTP 长连接?/p>
?#8220;服务器推”应用?Web E序中,首先考虑的是如何在功能有限的览器端接收、处理信息:
客户端如何接收、处理信息,是否需要用套接口或是使用q程调用。客L呈现l用L?HTML 面q是 Java applet ?Flash H口。如果用套接口和远E调用,怎么?JavaScript l合修改 HTML 的显C?
客户与服务器端通信的信息格式,采取怎样的出错处理机制?
客户端是否需要支持不同类型的览器如 IE、FirefoxQ是否需要同时支?Windows ?Linux q_?
回页?
Z客户端套接口?#8220;服务器推”技?/p>
Flash XMLSocket
如果 Web 应用的用h受应用只有在安装?Flash 播放器才能正常运行, 那么使用 Flash ?XMLSocket 也是一个可行的Ҏ?/p>
q种Ҏ实现的基是:
Flash 提供?XMLSocket cR?
JavaScript ?Flash 的紧密结合:?JavaScript 可以直接调用 Flash E序提供的接口?
具体实现ҎQ在 HTML 面中内嵌入一个用了 XMLSocket cȝ Flash E序。JavaScript 通过调用?Flash E序提供的套接口接口与服务器端的套接口进行通信。JavaScript 在收到服务器端以 XML 格式传送的信息后可以很Ҏ地控?HTML 面的内ҎC?/p>
关于如何L建充当了 JavaScript ?Flash XMLSocket 桥梁?Flash E序Q以及如何在 JavaScript 里调?Flash 提供的接口,我们可以参?AFLAXQAsynchronous Flash and XMLQ项目提供的 Socket Demo 以及 SocketJSQ请参见 参考资源)?/p>
Javascript ?Flash 的紧密结合,极大增强了客L的处理能力。从 Flash 播放?V7.0.19 开始,已经取消?XMLSocket 的端口必d?1023 的限制。Linux q_也支?Flash XMLSocket Ҏ。但此方案的~点在于Q?/p>
客户端必d?Flash 播放器;
因ؓ XMLSocket 没有 HTTP 隧道功能QXMLSocket cM能自动穿q防火墙Q?
因ؓ是用套接口Q需要设|一个通信端口Q防火墙、代理服务器也可能对?HTTP 通道端口q行限制Q?
不过q种Ҏ在一些网l聊天室Q网l互动游戏中已得到广泛用?/p>
Java Applet 套接?
在客L使用 Java AppletQ通过 java.net.Socket ?java.net.DatagramSocket ?java.net.MulticastSocket 建立与服务器端的套接口连接,从而实?#8220;服务器推”?/p>
q种Ҏ最大的不在于 Java applet 在收到服务器端返回的信息后,无法通过 JavaScript L?HTML 面的内宏V?/p>
回页?
Z HTTP 长连接的“服务器推”技?/p>
Comet ?/p>
览器作?Web 应用的前収ͼ自n的处理功能比较有限。浏览器的发展需要客L升软gQ同时由于客L览器Y件的多样性,在某U意义上Q也影响了浏览器新技术的推广。在 Web 应用中,览器的主要工作是发送请求、解析服务器q回的信息以不同的风格显C。AJAX 是浏览器技术发展的成果Q通过在浏览器端发送异步请求,提高了单用户操作的响应性。但 Web 本质上是一个多用户的系l,对Q何用h_可以认ؓ服务器是另外一个用戗现?AJAX 技术的发展q不能解军_一个多用户?Web 应用中,更新的信息实时传送给客户端,从而用户可能在“q时”的信息下q行操作。?AJAX 的应用又使后台数据更新更加频J成为可能?/p>
?1. 传统?Web 应用模型与基?AJAX 的模型之比较
“服务器推”是一U很早就存在的技术,以前在实C主要是通过客户端的套接口,或是服务器端的远E调用。因为浏览器技术的发展比较~慢Q没有ؓ“服务器推”的实现提供很好的支持Q在U浏览器的应用中很难有一个完善的Ҏd?#8220;服务器推”q用于商业程序。最q几q_因ؓ AJAX 技术的普及Q以及把 IFrame 嵌在“htmlfile“?ActiveX lg中可以解?IE 的加载显C问题,一些受Ƣ迎的应用如 meeboQgmail+gtalk 在实C使用了这些新技术;同时“服务器推”在现实应用中实存在很多需求。因些原因,ZU浏览器?#8220;服务器推”技术开始受到较多关注,Alex RussellQDojo Toolkit 的项?LeadQ称q种Z HTTP 长连接、无d览器端安装插g?#8220;服务器推”技术ؓ“Comet”。目前已l出C一些成熟的 Comet 应用以及各种开源框Ӟ一?Web 服务器如 Jetty 也在为支持大量ƈ发的长连接进行了很多改进。关?Comet 技术最新的发展状况请参考关?Comet ?wiki?/p>
下面介l两U?Comet 应用的实现模型?/p>
Z AJAX 的长轮询Qlong-pollingQ方?/p>
??1 所C,AJAX 的出C?JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP hQJavaScript 响应处理函数Ҏ服务器返回的信息?HTML 面的显C行更新。?AJAX 实现“服务器推”与传l的 AJAX 应用不同之处在于Q?/p>
服务器端会阻塞请求直到有数据传递或时才返回?
客户?JavaScript 响应处理函数会在处理完服务器q回的信息后Q再ơ发求,重新建立q接?
当客L处理接收的数据、重新徏立连接时Q服务器端可能有新的数据到达Q这些信息会被服务器端保存直到客L重新建立q接Q客L会一ơ把当前服务器端所有的信息取回?
?2. Z长轮询的服务器推模型
一些应用及CZ?“Meebo”, “Pushlet Chat” 都采用了q种长轮询的方式。相对于“轮询”QpollQ,q种长轮询方式也可以UCؓ“?#8221;QpullQ。因U方案基?AJAXQ具有以下一些优点:h异步发出Q无d装插ӞIE、Mozilla FireFox 都支?AJAX?/p>
在这U长轮询方式下,客户端是?XMLHttpRequest ?readystate ?4Q即数据传输l束Q时调用回调函数Q进行信息处理。当 readystate ?4 Ӟ数据传输l束Q连接已l关闭。Mozilla Firefox 提供了对 Streaming AJAX 的支持, ?readystate ?3 Ӟ数据仍在传输中)Q客L可以d数据Q从而无d闭连接,pd处理服务器端q回的信息。IE ?readystate ?3 Ӟ不能d服务器返回的数据Q目?IE 不支持基?Streaming AJAX?/p>
Z Iframe ?htmlfile 的流QstreamingQ方?/p>
iframe 是很早就存在的一U?HTML 标记Q?通过?HTML 面里嵌入一个隐蔵Q然后将q个隐蔵帧的 SRC 属性设为对一个长q接的请求,服务器端p源源不断地往客户端输入数据?/p>
?3. Z方式的服务器推模型
上节提到?AJAX Ҏ是在 JavaScript 里处?XMLHttpRequest 从服务器取回的数据,然后 Javascript 可以很方便的L?HTML 面的显C。同L思\用在 iframe Ҏ的客LQiframe 服务器端q不q回直接昄在页面的数据Q而是q回对客L Javascript 函数的调用,?#8220;<script type="text/javascript">js_func(“data from server ”)</script>”。服务器端将q回的数据作为客L JavaScript 函数的参C递;客户端浏览器?Javascript 引擎在收到服务器q回?JavaScript 调用时就会去执行代码?/p>
??3 可以看到Q每ơ数据传送不会关闭连接,q接只会在通信出现错误Ӟ或是q接重徏时关闭(一些防火墙常被讄Z弃过长的q接Q?服务器端可以讄一个超时时_ 时后通知客户端重新徏立连接,q关闭原来的q接Q?/p>
使用 iframe h一个长q接有一个很明显的不之处:IE、Morzilla Firefox 下端的进度栏都会昄加蝲没有完成Q而且 IE 上方的图标会不停的{动,表示加蝲正在q行。Google 的天才们使用一个称?#8220;htmlfile”?ActiveX 解决了在 IE 中的加蝲昄问题Qƈ这U方法用C gmail+gtalk 产品中。Alex Russell ?“What else is burried down in the depth's of Google's amazing JavaScript?”文章中介l了q种Ҏ。Zeitoun |站提供?comet-iframe.tar.gzQ封装了一个基?iframe ?htmlfile ?JavaScript comet 对象Q支?IE、Mozilla Firefox 览器,可以作ؓ参考。(请参?参考资源)
回页?
使用 Comet 模型开发自q应用
上面介绍了两U基?HTTP 长连接的“服务器推”架构Q更多描qC客户端处理长q接的技术。对于一个实际的应用而言Q系l的E_性和性能是非帔R要的。将 HTTP 长连接用于实际应用,很多l节需要考虑?/p>
不要在同一客户端同时用超q两个的 HTTP 长连?/p>
我们使用 IE 下蝲文g时会有这L体验Q从同一?Web 服务器下载文Ӟ最多只能有两个文g同时被下载。第三个文g的下载会被阻塞,直到前面下蝲的文件下载完毕。这是因?HTTP 1.1 规范中规定,客户端不应该与服务器端徏立超q两个的 HTTP q接Q?新的q接会被d。?IE 在实C严格遵守了这U规定?/p>
HTTP 1.1 对两个长q接的限Ӟ会对使用了长q接?Web 应用带来如下现象Q在客户端如果打开过两个?IE H口去访问同一个用了长连接的 Web 服务器,W三?IE H口?HTTP h被前两个H口的长q接d?/p>
所以在开发长q接的应用时Q?必须注意在用了多个 frame 的页面中Q不要ؓ每个 frame 的页面都建立一?HTTP 长连接,q样会阻塞其它的 HTTP hQ在设计上考虑让多?frame 的更新共用一个长q接?/p>
服务器端的性能和可扩展?/p>
一?Web 服务器会为每个连接创Z个线E,如果在大型的商业应用中?CometQ服务器端需要维护大量ƈ发的长连接。在q种应用背景下,服务器端需要考虑负蝲均衡和集技术;或是在服务器端ؓ长连接作一些改q?/p>
应用和技术的发展L带来新的需求,从而推动新技术的发展。HTTP 1.1 ?1.0 规范有一个很大的不同Q?.0 规范下服务器在处理完每个 Get/Post h后会关闭套接口连接; ?1.1 规范下服务器会保持这个连接,在处理两个请求的间隔旉里,q个q接处于I闲状态?Java 1.4 引入了支持异?IO ?java.nio 包。当q接处于I闲Ӟ个连接分配的U程资源会返q到U程池,可以供新的连接用;当原来处于空闲的q接的客户发出新的请求,会从U程池里分配一个线E资源处理这个请求?q种技术在q接处于I闲的机率较高、ƈ发连接数目很多的场景下对于降低服务器的资源负载非常有效?/p>
但是 AJAX 的应用h的出现变得频J,?Comet 则会长时间占用一个连接,上述的服务器模型在新的应用背景下会变得非怽效,U程池里有限的线E数甚至可能会阻塞新的连接。Jetty 6 Web 服务器针?AJAX、Comet 应用的特点进行了很多创新的改q,请参考文?#8220;AJAXQComet and Jetty”Q请参见 参考资源)?/p>
控制信息与数据信息用不同的 HTTP q接
使用长连接时Q存在一个很常见的场景:客户端网需要关闭,而服务器端还处在d数据的堵塞状态,客户端需要及旉知服务器端关闭数据q接。服务器在收到关闭请求后首先要从d数据的阻塞状态唤醒,然后释放个客L分配的资源,再关闭连接?/p>
所以在设计上,我们需要客户端的控制h和数据请求用不同的 HTTP q接Q才能控制h不会被阻塞?/p>
在实CQ如果是Z iframe 方式的长连接,客户端页面需要用两?iframeQ一个是控制帧,用于往服务器端发送控制请求,控制h能很快收到响应,不会被堵塞;一个是昄帧,用于往服务器端发送长q接h。如果是Z AJAX 的长轮询方式Q客L可以异步地发Z?XMLHttpRequest hQ通知服务器端关闭数据q接?/p>
在客户和服务器之间保?#8220;心蟩”信息
在浏览器与服务器之间l持一个长q接会ؓ通信带来一些不定性:因ؓ数据传输是随机的Q客L不知道何时服务器才有数据传送。服务器端需要确保当客户端不再工作时Q释放ؓq个客户端分配的资源Q防止内存泄漏。因此需要一U机制双方知道大家都在正常q行。在实现上:
服务器端在阻塞读时会讄一个时限,时后阻塞读调用会返回,同时发给客户端没有新数据到达的心跳信息。此时如果客L已经关闭Q服务器往通道写数据会出现异常Q服务器端就会及旉放ؓq个客户端分配的资源?
如果客户端用的是基?AJAX 的长轮询方式Q服务器端返回数据、关闭连接后Q经q某个时限没有收到客L的再ơ请求,会认为客L不能正常工作Q会释放个客L分配、维护的资源?
当服务器处理信息出现异常情况Q需要发送错误信息通知客户端,同时释放资源、关闭连接?
Pushlet - 开?Comet 框架
Pushlet 是一个开源的 Comet 框架Q在设计上有很多值得借鉴的地方,对于开发轻量?Comet 应用很有参考h倹{?/p>
观察者模?/p>
Pushlet 使用了观察者模型:客户端发送请求,订阅感兴的事gQ服务器端ؓ每个客户端分配一个会?ID 作ؓ标记Q事件源会把C生的事g以多播的方式发送到订阅者的事g队列里?/p>
客户?JavaScript ?/p>
pushlet 提供了基?AJAX ?JavaScript 库文件用于实现长轮询方式?#8220;服务器推”Q还提供了基?iframe ?JavaScript 库文件用于实现流方式?#8220;服务器推”?/p>
JavaScript 库做了很多封装工作:
定义客户端的通信状态:STATE_ERROR、STATE_ABORT、STATE_NULL、STATE_READY、STATE_JOINED、STATE_LISTENINGQ?
保存服务器分配的会话 IDQ在建立q接之后的每ơ请求中会附上会?ID 表明w䆾Q?
提供?join()、leave()、subscribe()?unsubsribe()、listen() {?API 供页面调用;
提供了处理响应的 JavaScript 函数接口 onData()、onEvent()…
|页可以很方便地使用q两?JavaScript 库文件封装的 API 与服务器q行通信?/p>
客户端与服务器端通信信息格式
pushlet 定义了一套客户与服务器通信的信息格式,使用 XML 格式。定义了客户端发送请求的cdQjoin、leave、subscribe、unsubscribe、listen、refreshQ以及响应的事gcdQdata、join_ack、listen_ack、refresh、heartbeat、error、abort、subscribe_ack、unsubscribe_ack?/p>
服务器端事g队列理
pushlet 在服务器端?Java Servlet 实现Q其数据l构的设计框架仍可适用?PHP、C ~写的后台客L?/p>
Pushlet 支持客户端自己选择使用、拉Q长轮询Q、轮询方式。服务器端根据客户选择的方式在d事g队列QfetchEventsQ时q行不同的处理?#8220;轮询”模式?fetchEvents() 会马上返回?#8221;?#8220;?#8221;?#8220;模式使用d的方式读事gQ如果超Ӟ会发l客L发送一个没有新信息收到?#8220;heartbeat“事gQ如果是“?#8221;模式Q会?#8220;heartbeat”?#8220;refresh”事g一起传l客LQ通知客户端重新发求、徏立连接?/p>
客户服务器之间的会话理
服务端在客户端发?join hӞ会ؓ客户端分配一个会?IDQ?q传l客LQ然后客L通过此会?ID 标明w䆾发出 subscribe ?listen h。服务器端会为每个会话维护一个订阅的主题集合、事仉列?/p>
服务器端的事件源会把C生的事g以多播的方式发送到每个会话Q即订阅者)的事仉列里?/p>
回页?
结
本文介绍了如何在现有的技术基上选择合适的Ҏ开发一?#8220;服务器推”的应用,最优的Ҏq是取决于应用需求的本n。相对于传统?Web 应用Q?目前开?Comet 应用q是h一定的挑战性?/p>
“服务器推”存在q泛的应用需求,Z?Comet 模型适用于大规模的商业应用,以及方便用户构徏 Comet 应用Q最q几q_无论是服务器q是览器都出现了很多新技术,同时也出C很多开源的 Comet 框架、协议。需求推动技术的发展Q相?Comet 的应用会变得?AJAX 一h及?/p>
参考资?
学习
developerWorks 文章“ 面向 Java 开发h员的 Ajax: 使用 Jetty ?Direct Web Remoting ~写可扩展的 Comet 应用E序”Q受异步服务器端事g驱动?Ajax 应用E序实现较ؓ困难Q本文介l了一U结合?Comet 模式?Jetty 6 Continuations API 的解x法?
“Comet: Low Latency Data for the Browser”QAlex Russell ?Dojo Toolkit 的项目主和 Dojo Foundation 的主席,他在q篇博客文章中提Z Comet q个术语?
“What else is burried down in the depth’s of Google’s amazing JavaScript?”QAlex RusselQ?006 q?2 月)QAlex 在这文章里介绍了如何?#8220;htmlfile”ActiveX 控g解决 iframe h长连接时 IE 的加载显C问题?
Comet wikiQ提供了很多开?Comet 框架的链接?
JettyQJetty 是一U开源的Z标准?Web 服务器,完全使用 Java 语言实现?
“Ajax, Comet and Jetty”QGreg WilkinsQWebtideQ?006 q?1 月)QWilkins 的这份白皮书讨论了扩?Ajax q接?Jetty 架构Ҏ?
ContinuationsQ了解更多关?Jetty ?Continuations Ҏ的信息?
“pushlet”Q开?comet 框架Q用了观察者模型。浏览器端提供了Z AJAX ?iframe ?JavaScript 库,服务器端使用 Java Servlet?
“How to implement COMET with PHP”Q提供的 comet-iframe.tar.gz 使用 iframe/htmlfile 装了一?JavaScript comet 对象Q支?IE、Mozilla Firefox 览器?
“AFLAX”QAsynchronous Flash and XMLQ提供了强大?Flash、Javascript 库和很多范例?
developerWorks Ajax 技术资源中心:能找到更多关?Ajax 技术的文章和教E?
developerWorks Web 开发技术专区:提供了关?Web 开发和架构斚w的大量文章?
developerWorks Java 技术专区:提供了关?Java ~程各个斚w的数癄文章?
览 技术书店,查阅有关本文所qC题以及其他技术主题的书籍?nbsp;
]]> Oracle 10g SQL 优化再学?/title> http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html疯狂 疯狂 Sun, 10 Oct 2010 15:52:00 GMT http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html http://www.aygfsteel.com/freeman1984/comments/334235.html http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/334235.html http://www.aygfsteel.com/freeman1984/services/trackbacks/334235.html
?i?0gQOracle不断q化自己的SQL TuningQ一些秘c的优化口诀已经失效?br />
但我喜欢失效Q不用记口诀Q操个Toad for Oracle Xpert Q按照大方向舒舒服服的调优才是爱做的事情?/p>
1.Excution Plan
Excution Plan是最基本的调优概念,不管你的调优吹得如何天花乱堕Q结果还是要由Excution plan来显COracle 最l用什么烦引、按什么顺序连接各表,Full Table Scanq是Access by Rowid IndexQ瓶颈在什么地斏V如果没有它的指|一切调优都是蒙的?/p>
2.Toad for Oracle Xpert
用它来调优在真的好舒服。Quest 吞ƈ了Lecco后,它整合CToad 的SQL Tunning里面Q最清晰的执行计划显C,自动生成N条等价SQL、给Z化徏议,不同SQL执行计划的对比,q有实际执行的逻辑诅R物理读数据{等一目了然?/p>
3.索引
大部分的性能问题其实都是索引应用的问题,Where子句、Order By、Group By 都要用到索引?br />
一般开发h员认为将索引建全了就可以下班回家了,实则q有颇多的思量和陷阱?/p>
3.1 索引列上不要q行计算
q是最最普遍的失效陷阱,比如where trunc(order_date)=trunc(sysdate), i+2>4。烦引失效的原因也简单,索引是针对原值徏的二叉树Q你列?3/4+2折腾一番后Q原来的二叉树当然就用不上了。解决的Ҏ:
1. 换成{h语法Q比如trunc(order_date) 换成
where order_date>trunc(sysdate)-1 and order_date<trunc(sysdate)+1 2. 特别徏立函数烦?/p>
create index Q_XXXX on shop_order(trunc(order_date)) 3. 计从{号左边Ud双
q是针对某些无心之失的纠正,把a*2>4 改ؓa>4/2Q把TO_CHAR(zip) = '94002' 改ؓzip = TO_NUMBER('94002');
3.2 CBO与烦引选择?br />
Z索引也不一定会被Oracle用的Q就像个挑食的孩子。基于成本的优化?CBO, Cost-Based Optimizer)Q会先看看表的大,q有索引的重复度Q再军_用还是不用。表中有100 条记录而其中有80 个不重复的烦引键? q个索引的选择性就?0/100 = 0.8Q留意Toad里显C烦引的Selective和Cardinailty。实在不听话Ӟp用hints来调教?br />
另外Qwhere语句存在多条索引可用Ӟ只会选择其中一条。所以烦引也不是多好Q)
3.3 索引重徏
传说中数据更新频J导致有20%的碎片时QOracle׃攑ּq个索引。宁可信其有之下Q应该时常alter index <INDEXNAME> rebuild一下?/p>
3.4 其他要注意的地方
不要使用NotQ如goods_no != 2Q要改ؓ
where goods_no>2 or goods_no<2 不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改?/p>
WHERE DEPT_CODE >=0;3.5 select 的列如果全是索引列时
又如果没有where 条gQ或者where条g全部是烦引列ӞOracle 直接从索引里获取数据而不去读真实的数据表Q这样子理论上会快很多,比如
select order_no,order_time from shop_order where shop_no=4当order_no,order_time,shop_no q三列全为烦引列Ӟ你将看到一个和qx完全不同的执行计划?/p>
3.6 位图索引
传说中当数据D,比如某些表示分类、状态的列,应该Z囄引而不是普通的二叉树烦引,否则效率低下。不q看执行计划Q这些位囄引鲜有被Oracle临幸的?br />
4.减少查询往q和查询的表
q也是很单的大道理,E序与Oracle交互的成本极高,所以一个查询能完成的不要分开两次查,如果一个@环执行1万条查询的,怎么都快不到哪里M?/p>
4.1 装PL/SQL存储q程
最高的做法是把@环的操作装到PL/SQL写的存储q程里,因ؓ存储q程都在服务端执行,所以没有数据往q的消耗?/p>
4.2 装PL/SQL内部函数
有机会,一些查询封装到函数里,而在普通SQL里用这些函敎ͼ同样是很有效的优化?/p>
4.3 Decode/Case
但存储过E也ȝQ所以有case/decode把几条条件基本相同的重复查询合ƈZ条的用法Q?/p>
SELECT
COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low,
COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med,
COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high
FROM products;4.4 一UWhere/Update语法
SELECT TAB_NAME FROM TABLES
WHERE (TAB_NAME,DB_VER) = Q? SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS WHERE VERSION = 604)
UPDATE EMP
SET (EMP_CAT, SAL_RANGE)
= (SELECT MAX(CATEGORY)FROM EMP_CATEGORIES)
5.其他优化
5.1RowID和ROWNUM
qHibernate 新版也支持ROWID了,证明它非常有用。比如号U删除重复数据的最快写法:
DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X
WHERE X.EMP_NO = E.EMP_NO);6.l极U技 - Hints
q是Oracle DBA的玩P也是l极武器Q比如Oracle在CBO,RBO中所做的选择M合自己心水时Q可以用它来强力调教一下OracleQ结果经常让人喜出望外?br />
如果开发h员没那么多时间来专门学习它,可以依靠Toad SQL opmitzer 来自动生成这些提C,然后Ҏ一下各U提C的实际效果。不q随着10g的进化,hints的惊喜少了?/p>
7. 扑և要优化的Top SQL
了q么久的枪,如果找不到敌人是仉L事情?br />
q怺10gq方面做得非常好。进入Web理界面Q就能看到当前或者Q意一天的SQL列表Q按性能排序?br />
有了它,SQL Trace和TKPROF都可以不用了?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/calvinxiu/archive/2005/11/15/529756.aspx
]]> |管技巧:无法q程桌面q接解决Ҏ http://www.aygfsteel.com/freeman1984/archive/2010/10/09/334042.html疯狂 疯狂 Sat, 09 Oct 2010 02:02:00 GMT http://www.aygfsteel.com/freeman1984/archive/2010/10/09/334042.html http://www.aygfsteel.com/freeman1984/comments/334042.html http://www.aygfsteel.com/freeman1984/archive/2010/10/09/334042.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/334042.html http://www.aygfsteel.com/freeman1984/services/trackbacks/334042.html
|管技巧:无法q程桌面q接解决Ҏ
【赛q网技术报道?
1、检查点L的电?右键-服务中的Terminal Servicesq个服务是否q行.
2、检查我的电?右键-属?q程-是否钩选远E桌?
3、检查系l自带的防火是否开?如果开启了请关?
4、默认情况下,q程d的帐号密码不能ؓI?一定要讄有密?(默认情况下这个用户必设|密码,若没有设|密码就不能在远E登录界面用I密码登录。这是因为已启用了组{略?#8220;计算机配|?#8221;→“安全讄”→“本地{略”→“安全选项”→“帐户Q用空白密码的本地帐户只允许进行控制台d”{略Q双击,把它改ؓ“已禁?#8221;p用空密码的帐戯行远E登录了?
Terminal Services
允许用户以交互方式连接到q程计算机。远E桌面、快速用户切换、远E协助和l端服务器依赖此服务 - 停止或禁用此服务会您的计算机变得不可靠。要Lq程使用此计机Q请?#8220;pȝ”属性控刉杉K目上清除“q程”选项卡上的复选框?
C:\WINDOWS\System32\svchost.exe -k termsvcs
文章转自Qhttp://tech.ccidnet.com/art/1084/20090213/1675535_1.html
]]> 让程序向卫星发射一样受控:谨慎在for循环中的使用集合的remove(int index) http://www.aygfsteel.com/freeman1984/archive/2010/10/01/333617.html疯狂 疯狂 Fri, 01 Oct 2010 10:59:00 GMT http://www.aygfsteel.com/freeman1984/archive/2010/10/01/333617.html http://www.aygfsteel.com/freeman1984/comments/333617.html http://www.aygfsteel.com/freeman1984/archive/2010/10/01/333617.html#Feedback 5 http://www.aygfsteel.com/freeman1984/comments/commentRss/333617.html http://www.aygfsteel.com/freeman1984/services/trackbacks/333617.html 阅读全文 ]]> J2EE开发注意事?/title> http://www.aygfsteel.com/freeman1984/archive/2010/10/01/333614.html疯狂 疯狂 Fri, 01 Oct 2010 09:40:00 GMT http://www.aygfsteel.com/freeman1984/archive/2010/10/01/333614.html http://www.aygfsteel.com/freeman1984/comments/333614.html http://www.aygfsteel.com/freeman1984/archive/2010/10/01/333614.html#Feedback 0 http://www.aygfsteel.com/freeman1984/comments/commentRss/333614.html http://www.aygfsteel.com/freeman1984/services/trackbacks/333614.html J2EE开发注意事?/a>
1.面展现?/strong>
1.每个input输入框都必须讄maxlength。texaArea没有maxlengthq个属性,所以必M用js来控制用戯入的长度?
2.对于数据昄列表Q必d义每列的宽度Q必d制截取每列的长度Q在TITLE昄每列的全部数据?
3.必须在用h定的分L率下q行试Q如1024*768?
4.量在firefox下做试Q这栯量兼容各个览器?
5.面上的地址原则上写l对路径?
6.I间和窗口的大小Q尽量用百分比Q而不是像素点。以避免在不同分辨率下界面错位的问题?
7.对于表格的各列,Ҏ昄的内容,固定该列的宽度?
2.业务逻辑?/strong>
2.1 在获得数据和~辑数据的时候,必须先检查当前数据是否存在,如果不存在,则提C用戗?
2.2 原则上调用service层,不直接调用DAO层?
2.3 输出数据格式与^台无养I如: 输出JSON的数据格式,q样面展现层无论是用jspQswing,flex开发都能用这些数据?
3.服务展现?/strong>
3.1 对于多条数据库更新操作,使用事务处理。单条数据更新操作不做事务处理?
3.2 对传入的参数Q进行验证,抛出参数异常?
3.3 抛出用户友好异常。如 当前用户已经存在?
3.4 量抛出uncheck异常Q不推荐抛出check异常?
4.数据讉K?/strong>
4.1 不涉及Q何业务逻辑Q只兛_数据的操作。如Q?
不应该提供查询已办Q务的ҎQ应该是通过d状态进行查?
转蝲自:http://kiral.javaeye.com/blog/186456
]]>
վ֩ģ壺
|
ͨ |
ٸ |
|
|
|
ĵ |
|
|
|
|
|
ɽ |
|
߷ |
żҽ |
|
|
ľ |
|
|
Ͻ |
|
|
|
|
˳ |
|
|
|
ٸ |
ʯ |
|
|
Ϸ |
|
ƽ˳ |
|
|
֥ |
Ů |