<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-心有多大舞台便有多大</title><link>http://www.blogjava.net/jjwwhmm/</link><description>Embrace changes, pursue excellence, share niceness.
</description><language>zh-cn</language><lastBuildDate>Thu, 24 Jul 2008 19:29:39 GMT</lastBuildDate><pubDate>Thu, 24 Jul 2008 19:29:39 GMT</pubDate><ttl>60</ttl><item><title>java InetAddress 的dns cache问题</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/07/09/213685.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 09 Jul 2008 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/07/09/213685.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/213685.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/07/09/213685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/213685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/213685.html</trackback:ping><description><![CDATA[jdk的InetAddress有一个特性,就是当系统访问过一个域名的时候,InetAddress就会通过其私有变量addressCache把域名对应的ip地址缓存起来.<br />
虽然缓存起来能极大的提高系统性能,但有时候会给系统带来很大的麻烦.例如,当对方改动了ip地址后,系统就不能再访问到新的ip地址了,这个时候最直接的方案就是:重启jvm!!!这对于需要7*24小时服务的系统来说,是不可忍受的.<br />
下面一段代码可以重现这个现象(但需要你在运行的时候是在调试模式):<br />
public void testDnsCachePolicy() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InetAddress addr1 = InetAddress.getByName("<a href="http://www.baidu.com/">www.baidu.com</a>");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(addr1.getHostAddress());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在下一行设置断点.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InetAddress addr2 = InetAddress.getByName("<a href="http://www.baidu.com/">www.baidu.com</a>");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(addr2.getHostAddress());<br />
}<br />
具体测试方式是:<br />
1.修改c:/windows/system32/drivers/etc/hosts文件,在文件末尾加入:64.233.189.104&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.baidu.com/">www.baidu.com</a><br />
这个ip地址是google的ip<br />
2.运行代码到断点处<br />
这时候打印出的ip地址是64.233.189.104<br />
3.修改hosts文件,把"64.233.189.104&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.baidu.com/">www.baidu.com</a>"这行注释掉,"#64.233.189.104&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.baidu.com/">www.baidu.com</a>"<br />
4.继续运行代码到结束<br />
这时候打印出的ip地址还是64.233.189.104,并没有更改为baidu的ip地址.<br />
<br />
那么应该怎么来解决这个问题呢?<br />
查了下网上的解决方案,一般是在启动jvm的时候,指定jvm参数:networkaddress.cache.ttl和networkaddress.cache.negative.ttl,具体的含义你可以查看InetAddress的源代码.<br />
这种方法的缺点是在JVM启动的时候就固定了dns的缓存策略.如果不缓存的话,对系统性能的影响是很大的,那么能不能动态的修改这个缓存的值呢?<br />
正好前段时间写了篇文章:怎么通过反射修改类的私有字段值.正好有了用武之地!<br />
下面是测试代码:<br />
//方法中的字符串常量policy,cache,addressCache请参考InetAddress源代码.<br />
public void testDnsCachePolicy() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InetAddress addr1 = InetAddress.getByName("<a href="http://www.baidu.com/">www.baidu.com</a>");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(addr1.getHostAddress());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在下一行设置断点.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //修改缓存数据开始<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class inetAddressClass = java.net.InetAddress.class;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Field cacheField = inetAddressClass.getDeclaredField("addressCache");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cacheField.setAccessible(true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Object obj = cacheField.get(inetAddressClass);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cacheClazz = obj.getClass();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Field cachePolicyField = cacheClazz.getDeclaredField("policy");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Field cacheMapField = cacheClazz.getDeclaredField("cache");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cachePolicyField.setAccessible(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cacheMapField.setAccessible(true);&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Map cacheMap = (Map)cacheMapField.get(obj);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cacheMap.remove("<a href="http://www.baidu.com/">www.baidu.com</a>");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //修改缓存数据结束<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InetAddress addr2 = InetAddress.getByName("<a href="http://www.baidu.com/">www.baidu.com</a>");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(addr2.getHostAddress());<br />
}<br />
重新按照上面的测试方法测试一次,第2次已经能够拿到正确的ip地址了.<br />
<br />
如果在用apache的httpclient,那么,在把缓存中的数据清除后,需要重新创建GetMethod/PostMethod对象.<br />
例如:<br />
HttpClient client = new HttpClient();<br />
GetMethod m1 = new GetMethod("http://www.baidu.com");<br />
client.executeMethod(m1);<br />
String content = m1.getResponseBodyAsString();<br />
........//通过上面的反射方法清楚缓存<br />
//重新执行m1,仍然不会得到正确的结果<br />
client.executeMethod(m1);<br />
String content = m1.getResponseBodyAsString();<br />
//重新创建GetMethod,才能得到正确的结果<br />
GetMethod m2 = new GetMethod("http://www.baidu.com");<br />
client.executeMethod(m2);<br />
content = m2.getResponseBodyAsString();<br />
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/213685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-07-09 15:57 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/07/09/213685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的JMS实践</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/26/210840.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Thu, 26 Jun 2008 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/26/210840.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/210840.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/26/210840.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/210840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/210840.html</trackback:ping><description><![CDATA[本文中只是把我的一些使用JMS的心得写出来,并非什么"最佳实践",有错误的请大家尽管拍砖!<br />
<br />
1.消息类型的选择<br />
Java的JMS消息类型有文本类型,对象类型,字节类型,流类型,XML类型,在实际项目中,用的最多的是文本类型,对象类型和xml类型的消息.建议最好不用对象类型,因为如果用对象类型的话,调试的时候是很麻烦的,首先你必须要写专门的测试代码用来发送消息,第二,必须要管理对象所属的类的不同版本,第三,不方便查看queue或者topic中的消息内容.而如果使用文本类型或者xml类型的消息,那么可以很容易的通过JMS中间件提供的一些管理工具来发送测试消息,查看消息内容,并且更加容易管理不同版本之间的兼容性.如果一定要用对象类型消息的话,建议使用xstream把对象转化为xml<br />
<br />
2.是使用queue还是topic?<br />
这两者的定义是很清楚的,也很容易区分.但是在实际项目中,如何来取舍呢?我的建议是尽量用queue.如果你的项目用到了JMS,那么你的系统也应该是到了需要部署在集群环境的规模了.用topic在集群环境下会带来很多麻烦.举个简单的例子,如果你是用MDB来处理topic的消息,你有一个MDB名为SampleMDB,它以集群的方式分别部署在A服务器和B服务器上.那么有可能同一条topic消息被同一个MDB处理两次.虽然一些JMS中间件提供商为解决这种问题提供了一些解决方案,例如把subsriber分组,但是它为开发和调试都带来了很大的麻烦.topic消息的处理也要比queue的复杂,很难跟踪topic消息的处理过程.<br />
那么,如果不用topic的话,怎么来实现topic这种性质的消息处理呢?可以写一个消息转发器,把一个queue上的消息转发给所有关注这个queue的其它queue中.例如,有一个queue,名为SampleQ1,一个消息发送者sender,一个消息转发器router,有三个handler A,B,C需要处理这个queue中的消息.那么,sender发送消息到SampleQ1,router接收SampleQ1的消息后分别发送到SampleQ1_A,SampleQ1_B,SampleQ1_C,handler A,B,C分别从队列SampleQ1_A,SampleQ1_B,SampleQ1_C中接收消息.<br />
<br />
3.用JMS来解决什么问题?<br />
一提起JMS可以做什么,第一想到的就是异步处理.面试的时候问JMS可以做什么?大多数的回答是:用JMS来异步发送邮件!(到底应该怎么样构建一个邮件发送系统不是本文的主题,以后有时间我会专门来谈谈在我的项目中,我是怎么来设计邮件发送系统的).其实,还可以用JMS来解决很多复杂的问题,例如分布,并发,系统解耦,负载均衡,热部署,触发器等等,这些复杂的问题因为引入了JMS而变的更加简单.下面简单介绍下解决分布,并发问题的场景.<br />
3.1 用JMS来解决并发问题<br />
queue的概念大家都很清楚了,那就是queue里的一条消息只会被一个消息接收者处理.基于这个概念,我们可以在系统中对并发要求很严格的模块中引入JMS的使用.例如,系统的送积分,一般这个模块是用一个定时器,例如quartz,每天定期查询数据库,如果发现有满足条件的记录,那么就把积分送给会员.如果同时有多个quartz在运行,那么必须严格控制防止并发的对同一条记录送多次积分.解决这个问题有很多方法,可以通过业务的设计,系统的部署,数据库的设计,事务的控制等方法来实现,在这里提一个用JMS来解决问题的方法:在插入记录的同时发送一个queue的消息.这样即使有多个送积分的MDB实例在运行,也只会被一个实例处理.<br />
<br />
3.2用JMS来解决分布的问题<br />
解决分布有两种类型,第一种是指消息是集中的,但消息的处理是分布的.例如,系统可能会被分为前台与后台,这两个系统是部署在不同的网段里的.那么怎么把前台发生的业务通知后台系统呢?当然,可以通过一个类似定时器的玩意定期去数据库查询.但这种方式要么就是浪费系统资源,可能在定期查询中80%的时间都是在做无用功,要么就是业务请求没有被及时处理.,因为定期的时间总是有一个时间间隔的.用JMS来处理这个问题会怎么样呢?前台系统在处理完业务请求后的同时发送一个消息到queue中,后台系统的消息接收者接收到消息后立即处理.这里消息的处理也可能有一定的延期,但这主要取决于消息服务器的硬件能力,网络带宽,消息接收者的处理速度等.<br />
<br />
第二中是指消息也是分布的.很多消息中间件都提供了消息路由的功能,即消息发送到一个消息服务器后,这个消息服务器根据定义的规则再把这条消息路由转发到其它的消息服务器.例如,可能在北京的一个数据中心部署了数据采集系统,采集到数据后以消息的方式发送到消息服务器,然后消息服务器再把这条消息路由到上海的数据中心,再由上海数据中心部署的数据处理系统来处理这条消息.<br />
<br />
4.JMS与事务,一定要用JTA事务吗<br />
很多人接触到JTA事务都是从用JMS开始的,毕竟同时要连多个数据库的的系统并不是那么的多!而要用JTA事务的话,就得要在笨重的应用服务器中部署.(当然,你也可以用类似atomikos的轻量级JTA事务管理器),更重要的是,并不是事务本身的技术有多复杂,而是事务的界定,这种事务的界定有时都不是程序员能决定的事情,需要在设计的时候就要考虑清楚,甚至可能还需要业务人员的参与.(题外话:经常问面试的,用spring的aop做什么?大多数答:用来管理事务!事务要真这么简单该多好啊!)<br />
我也不是要反对用JTA事务,而是要说明一下,用JMS,并非一定要用JTA事务.这可以分为三种场景:<br />
一,必须用JTA事务,这种情况下,一般消息的接收者只从消息本身获得数据并进行处理.所以必须要保证消息的发送与所依赖的业务保持一致.<br />
二.不需要用事务,这种情况下, 要么是业务无关紧要,例如用JMS来记录日志.要么是发送的消息仅仅是一个作为后续业务处理的一个触发器!消息接收者仅仅是从消息中获得一个id,然后根据这个id去查询所依赖的其它数据进行业务处理.即使消息丢失也没关系,可以通过其它的机制来补偿.<br />
三.消息丢失可以通过补偿事务来完成.这个依赖与具体实现,就不详细说了.<br />
<br />
5.处理消息永远比发送消息慢!<br />
要保证你的JMS应用稳定的运行,那么你必须在开发,部署的时候时刻重视这个问题.<br />
首先,需要把发送消息的连接池与接收消息的连接池分开.以避免接收消息的连接过过而导致发送消息的应用拿不到连接.<br />
在一个连接上并发的处理消息,而不是连接打开,处理一个消息,马上关闭连接.<br />
合理的设置消息的过期时间,否则消息日积月累,最终超出queue的size<br />
对于非关键业务的消息处理,可以采用异步处理的方法:接收到消息后并不是立刻处理,而是放到一个任务池或者线程池中处理.如果消息处理失败,则把消息重新发送回队列中.<br />
<br />
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/210840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-26 15:43 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/26/210840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不会偷懒的程序员不是好程序员!</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/20/209400.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Fri, 20 Jun 2008 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/20/209400.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/209400.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/20/209400.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/209400.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/209400.html</trackback:ping><description><![CDATA[<p>今天看了篇文章:<br />
http://blogoscoped.com/archive/2005-08-24-n14.html<br />
<br />
这篇文章是讲为什么好的程序员是既懒有笨的!哈哈!<br />
我记得在看UNIX编程艺术时,里面也有这么段话,说不会偷懒的程序员不是好程序员!<br />
为什么呢!我们可以举些简单的例子:<br />
1.只有懒惰的程序员才会去编写那些可以最终代替自己工作的自动化工具,好的程序员都会有一套自己的代码自动生成工具,有的是用模板语言,有的是用shell.在开发一个新的系统时,系统基础框架设计好后,很多业务层代码基本上都是一个模子出来的,要想让这些代码都是从一个模子里出来,那么就需要在底层下很大的功夫才能做到.所以,每个程序员够应该有,或者会写代码自动生成工具,当然,这个工具并不是一个成功工具!它的前提是你必须在底层有足够的抽象.<br />
<br />
2.只有懒惰的程序员才不会去去写大段的冗余重复的代码,他们会想出各种方法来避免这种冗余代码的情况,做的好的,就是在系统的基础架构层来解决大部分这样的问题,通过精致的设计模式,高度抽象的模块,易用的接口,高度可配置的基础平台等等来实现,做的一般的会利用各种开源工具来代替自己想要的代码,做的差些的就是不断利用refactor重构出那些重复代码.<br />
<br />
3.好程序员怎么可能"笨"呢!哈哈!俺们可都是天之骄子啊!小心我扔你鸡蛋啊!<br />
很聪明的程序员一般比较自信,难以听进别人的意见,在一个团队中,最怕的并不是怕没有技术好的人,而是怕那些很聪明的人不跟你团队保持一致,举个例子,可能团队里有一套通用的数据存取方法,但聪明的程序员会坚持己见,自己发明出一套新的方法来!聪明的程序员会认为自己更懂客户的需求,而不顾市场人员提出的需求.这也是为什么很多人会说"要对团队中听话的人委以重任",我当然不同意这种看法,但是,既聪明团队意识又好的人,就比较少见了.团队不行的话,一个人再聪明又有什么用?<br />
<br />
4.聪明的程序员喜欢自己重新发明轮子!笨的程序员喜欢利用聪明的程序员写出的代码!<br />
<br />
5.聪明的程序员一般有自己思维的定势,笨的程序员因为什么都不懂,所以他的眼里什么都是可能,什么都是不可能!查找代码问题的时候,聪明的程序员首先会说:这是系统的bug,笨的程序员会看看自己的代码是不是有拼写错误!笨的程序员跟容易换位思考,下面有个例子:<br />
一段关于web开发问题的程序员和客服人员的对话:<br />
</p>
<p>&#8220;从昨天开始我们的用户就看不到我们站点上的Logo了。&#8221;<br />
&#8220;他试过重启浏览器么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他试过重启电脑么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他清空过浏览器Cache么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他的浏览器版本是IE6么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他确信是真的看不到Logo了么？&#8221;<br />
&#8220;是的。&#8221;<br />
&#8220;他是在电脑显示器屏幕上看我们的站点么？&#8221;<br />
&#8220;什么？&#8221;<br />
&#8220;比如说，它可能是打印出来看不到？&#8221;<br />
&#8220;不。他是在显示器上看的。&#8221;<br />
&#8220;除了站点Logo之外，他是不是其他的图片都看不到？&#8221;<br />
&#8220;什么？哦。我再问问他。&#8221;<br />
</p>
<p>也许,聪明的程序员遇到这个问题的时候,甚至可能去找个图形算法分析下这个图片是否有问题!<br />
<br />
最后,以<a href="http://blogoscoped.com/archive/2005-08-24-n14.html">http://blogoscoped.com/archive/2005-08-24-n14.html</a>中的故事结尾,,以博列为看官一笑^_^<br />
It&#8217;s like the story of the centipede(蜈蚣). The centipede was very good at walking with its hundred legs. It never spent a thought on just how it could walk. Until one day, when a big black bug(臭虫) asked the centipede &#8220;How can you manage to <em>walk</em> with all those feet? Don&#8217;t you find it hard to coordinate their rhythm?&#8221; The black bug already left, when the centipede was still sitting down, pondering <em>how</em> it could walk, wondering, and (for the first time in his life) even worrying a little bit. From that day on, the centipede couldn&#8217;t walk anymore.<br />
So you better not think too much if you want to achieve something. And of course this is only half the truth, too... </p>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/209400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-20 11:38 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/20/209400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过反射修改类的私有字段值,调用私有方法</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/19/209083.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Thu, 19 Jun 2008 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/19/209083.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/209083.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/19/209083.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/209083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/209083.html</trackback:ping><description><![CDATA[<p>下面这个例子在实际项目中一般都不会这么用,只是用来说明怎么通过反射修改类的私有字段的值.<br />
<br />
有一个类TestData:<br />
<br />
public class TestData {<br />
&nbsp;private String name = "1";<br />
&nbsp;<br />
&nbsp;public String getName() {<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}<br />
}<br />
在运行的时候怎么来修改name的值呢?<br />
<br />
public class TestReflection extends TestCase {<br />
&nbsp;public void testSetPrivateField() throws Exception {<br />
&nbsp;&nbsp;TestData data = new TestData();<br />
&nbsp;&nbsp;System.out.println(data.getName());<br />
&nbsp; Assert.assertEquals("1", data.getName());<br />
&nbsp;&nbsp;Field f = data.getClass().getDeclaredField("name");<br />
&nbsp;&nbsp;f.setAccessible(true);<br />
&nbsp;&nbsp;f.set(data, "2");<br />
&nbsp;&nbsp;System.out.println(data.getName());<br />
&nbsp; Assert.assertEquals("2", data.getName());<br />
&nbsp;}<br />
}<br />
运行结果:<br />
1<br />
2<br />
其中,最关键的代码是:<br />
f.setAccessible(true);<br />
这行代码把对象data上的name字段设置为public访问属性.<br />
<br />
既然私有字段可以这样访问,那么,类似的,私有方法也可以这样调用!<br />
改一下TestData:<br />
<br />
public class TestData {<br />
&nbsp;private String name = "1";<br />
&nbsp;<br />
&nbsp;public String getName() {<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;private void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}<br />
}<br />
在TestData中增加了私有的setName方法,下面是测试代码:<br />
public class TestReflection extends TestCase {&nbsp;<br />
&nbsp;public void testInvokePrivateMethod() throws Exception {<br />
&nbsp;&nbsp;TestData data = new TestData();<br />
&nbsp;&nbsp;System.out.println(data.getName());<br />
&nbsp; Assert.assertEquals("1", data.getName());<br />
&nbsp;&nbsp;Method m = data.getClass().getDeclaredMethod("setName", String.class);<br />
&nbsp;&nbsp;m.setAccessible(true);<br />
&nbsp;&nbsp;m.invoke(data, "3");<br />
&nbsp;&nbsp;System.out.println(data.getName());<br />
&nbsp; Assert.assertEquals("3", data.getName());<br />
&nbsp;}<br />
}<br />
运行结果:<br />
1<br />
3<br />
其中最关键的代码行是:<br />
m.setAccessible(true);<br />
它把对象data的setName方法的访问属性设置为public.</p>
<p>那么这样调用私有方法,访问私有属性有什么用处呢?<br />
在实际项目中,我们会使用很多其它第三方的包,有的时候是通过修改源代码完成你想要的功能,有的时候,是因为第三方包中仅仅因为某几个方法的访问属性被设置为private,或者只要修改private的字段值即可.这个时候,用这种反射的方法就可以很容易实现了.<br />
<br />
另外一个场景就是从系统架构层来考虑数据封装.例如系统有一些元数据类,99%的情况下,我们只是提供get方法供其它应用层获得字段的值,如果把修改的set方法也提供出去,那么可能会影响到系统的可维护性.而在系统运行期间,又很难避免的要修改这些元数据的值.这种情况下,也可以通过这种反射的方式来实现.</p>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/209083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-19 10:14 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/19/209083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hessian序列化协议+memcached的缓存存取</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/18/208784.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 18 Jun 2008 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/18/208784.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/208784.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/18/208784.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/208784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/208784.html</trackback:ping><description><![CDATA[<p>大名鼎鼎的memcached恐怕没人不知道吧!hessian是一种远程调用的机制,类似与web service,不过它是使用自己的序列化协议.<br />
那么,为什么要把hessian的序列化协议和memcached结合起来实现缓存的读取呢?<br />
有过使用memcached的经验的人会了解到,php+memcached的性能是最好的,java+memcached的性能比较差,其主要原因就是在于java本身的序列化机制很慢.<br />
我做了个简单的测试,一个UserData类,有一个字符串属性,一个日期属性,一个double属性,分别用java,hessian来序列化一百万次,结果让人吃惊,不止是hessian序列化的速度要比java的快上一倍,而且hessian序列化后的字节数也要比java的少一倍.因为我在测试的时候只是做了序列化这部分的工作,并没有把序列化后的结果放到网络上传输,所以,实际中的性能hessian应该会更好!<br />
既然hessian的序列化协议要比java本身的好,而memcached客户端的性能又在很大程度上依赖与对象的序列化.所以,我就决定把我的cache实现中序列化这部分的工作改成用hessian来实现了.<br />
我用的memcached客户端是用的danga.MemCached包,主要是改动了MemCachedClient的get方法及set方法,在set方法中改为调用hessian的序列化:<br />
ByteArrayOutputStream bos = new ByteArrayOutputStream();<br />
//修改以前的序列化代码:<br />
&nbsp;//(new ObjectOutputStream( bos )).writeObject( value );<br />
//修改后的序列化代码:<br />
serializeByHessian(bos, value);<br />
&nbsp;val = bos.toByteArray();<br />
serializeByHessian方法如下:</p>
&nbsp;protected void serializeByHessian(OutputStream os, Object object) throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractHessianOutput out = new Hessian2Output(os);;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SerializerFactory serializerFactory = getSerializerFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.setSerializerFactory(serializerFactory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.startReply();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(object);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.completeReply();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush();<br />
&nbsp;}<br />
在get方法中主要是修改了这个方法调用的类ContextObjectInputStream的readObject方法:<br />
在ContextObjectInputStream中覆盖了readObjectOverride方法:<br />
&nbsp;protected Object readObjectOverride() throws IOException,&nbsp;&nbsp;ClassNotFoundException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayInputStream is = new ByteArrayInputStream(bytes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClHessian2Input in = new ClHessian2Input(is, this.mLoader);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.setSerializerFactory(getSerializerFactory());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int code = in.read();//"r"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int major = in.read();//&gt;=2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int minor = in.read();//0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object value = in.readObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return value;<br />
&nbsp;}<br />
因为我的框架是基于osgi的,所以我重载了Hessian2Input,把classloader作为参数传进去,否则hessian在反序列化的时候会找不到类.如果你没有用osgi框架的话,&nbsp;ClHessian2Input in = new ClHessian2Input(is, this.mLoader);这行代码就可以直接用:&nbsp;Hessian2Input in = new Hessian2Input(is);<br />
这样修改就基本完成了.<br />
我把memcached client的序列化协议改为hessian也有另外一个系统架构的原因,那就是因为我的服务层逻辑都是用java+spring+osgi的方式实现,而web层则是用php实现,两者之间通讯已经是采用hessian的远程调用.所以,部分缓存数据在服务层通过java设置到memcached服务器中,在php中一样可以用memcached php client读取出来.(php的memcached client我用的是memcached-client.php,而不是php扩展,所以一样可以修改memcached-client.php的序列化机制)<br />
<br />
<br />
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/208784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-18 10:04 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/18/208784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你的编程语言可以这样做吗？(map/reduce的js示范) (转)</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/09/206800.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 09 Jun 2008 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/09/206800.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/206800.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/09/206800.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/206800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/206800.html</trackback:ping><description><![CDATA[有一天，你在浏览自己的代码，发现有两大段代码几乎一样。实际上，它们确实是一样的——除了一个关于意大利面（Spaghetti）而另一个关于巧克力慕思（Chocolate Moose）。
<div class="code">&nbsp;// 一个小例子:<br />
&nbsp;<br />
&nbsp;alert("偶要吃意大利面!");<br />
&nbsp;alert("偶要吃巧克力慕思!");</div>
嗯，这个例子碰巧是用javascript写的，不过你就算不懂JavaScript，应该也能明白它在干什么。 <br />
<br />
拷贝代码不好。于是，你创建了个函数
<div class="code">&nbsp;function SwedishChef( food ){<br />
&nbsp;alert("偶要吃" + food + "!");<br />
&nbsp;}</div>
<div class="code">&nbsp;SwedishChef("意大利面");<br />
&nbsp;SwedishChef("巧克力慕思");</div>
Ok，这只是一个很小很小的例子而已，相信你能想像到个更实际一点的例子。这段代码有很多优点，你全都听过几万次了：可维护性、可读性、抽象性 = 好！ <br />
<br />
现在你留意到有另外两段代码几乎跟它们一模一样，除了一个反复调用一个叫BoomBoom的函数，另一个反复调用一个叫PutInPot的。除此之外，這两段代码简直没什么两样:
<div class="code">&nbsp;alert("拿龙虾");<br />
&nbsp;PutInPot("龙虾");<br />
&nbsp;PutInPot("水");</div>
<div class="code">&nbsp;alert("拿鸡肉");<br />
&nbsp;BoomBoom("鸡肉");<br />
&nbsp;BoomBoom("椰子酱");</div>
现在要想个办法，使得你可以將一个函数用作另一个函数的参数。这是个重要的能力，因为你更容易将框架代码写成一个函数（emu注：还记得template method模式吧？）。
<div class="code">&nbsp;function Cook( i1, i2, f ){<br />
&nbsp;alert("拿" + i1);<br />
&nbsp;f(i1);<br />
&nbsp;f(i2);<br />
&nbsp;}</div>
<div class="code">&nbsp;Cook( "龙虾", "水", PutInPot );<br />
&nbsp;Cook( "鸡肉", "椰子酱", BoomBoom );</div>
看看，我们居然把函数当成调用参数传递了！ <br />
<br />
你的编程语言能办到吗？ <br />
<br />
等等&#8230;&#8230;假如我们已经有了PutInPot和BoomBoom这些函数的具体实现代码（而且又不需要在别的地方重用它们），那么用内联语法把它们写进函数调用里面不是比显式的声明这两个函数更漂亮吗？
<div class="code">&nbsp;Cook( "龙虾", <br />
&nbsp;"水", <br />
&nbsp;function(x) { alert("pot " + x); }  );<br />
&nbsp;Cook( "鸡肉", <br />
&nbsp;"椰子酱", <br />
&nbsp;function(x) { alert("boom " + x); } );</div>
耶，真方便！请注意我只是随手创建了个函数，甚至不用考虑怎么为它起名，只要拎着它的耳朵把它往一个函数里头一丢就可以了。 <br />
<br />
当你一想到作为参数的匿名函数，你也许想到对那些对数组里的每个元素进行相同操作的代码。
<div class="code">&nbsp;var a = [1,2,3];</div>
<div class="code">&nbsp;for (i=0; i&lt;a.length; i++){<br />
&nbsp;a[i] = a[i] * 2;<br />
&nbsp;}</div>
<div class="code">&nbsp;for (i=0; i&lt;a.length; i++){<br />
&nbsp;alert(a[i]);<br />
&nbsp;}</div>
常常要对数组里的所有元素做同一件事，因此你可以写个这样的函数来帮忙：
<div class="code">&nbsp;function map(fn, a){<br />
&nbsp;for (i = 0; i &lt; a.length; i++){<br />
&nbsp;a[i] = fn(a[i]);<br />
&nbsp;}<br />
&nbsp;}</div>
现在你可以把上面的东西改成：
<div class="code">&nbsp;map( function(x){return x*2;}, a );<br />
&nbsp;map( alert, a );</div>
另一个常见的任务是将数组内的所有元素按照某总方式汇总起来：
<div class="code">&nbsp;function sum(a){<br />
&nbsp;var s = 0;<br />
&nbsp;for (i = 0; i &lt; a.length; i++)<br />
&nbsp;s += a[i];<br />
&nbsp;return s;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;function join(a){<br />
&nbsp;var s = "";<br />
&nbsp;for (i = 0; i &lt; a.length; i++)<br />
&nbsp;s += a[i];<br />
&nbsp;return s;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;alert(sum([1,2,3]));<br />
&nbsp;alert(join(["a","b","c"]));</div>
sum和join长得很像，你也许想把它们抽象为一个将数组内的所有元素按某种算法汇总起來的泛型函数：
<div class="code">&nbsp;function reduce(fn, a, init){<br />
&nbsp;var s = init;<br />
&nbsp;for (i = 0; i &lt; a.length; i++)<br />
&nbsp;s = fn( s, a[i] );<br />
&nbsp;return s;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;function sum(a){<br />
&nbsp;return reduce( function(a, b){ return a + b; }, a, 0 );<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;function join(a){<br />
&nbsp;return reduce( function(a, b){ return a + b; }, a, "" );<br />
&nbsp;}</div>
许多早期的编程语言没法子做这种事。有些语言容许你做，却又困难重重（例如C有函数指针，但你要在別处声明和定义函数）。面向对象语言也不确保你用函数可以干些啥（把函数当对象处理？）。 <br />
<br />
如
果你想将函数视为一类对象，Java要求你建立一个有单方法的对象，称为算子对象。许多面向对象语言要你为每个类都建立一个完整文件，像这样开发可真叫
快。如果你的编程語言要你使用算子对象来包装方法（而不是把方法本身当成对象），你就不能徹底得到现代（动态）编程语言的好处。不妨试试看你可否退货拿回
些钱？ <br />
<br />
不用再写那些除了经过一个数组对每个元素做一些事情之外一无是处的函数，有什么好处？ <br />
<br />
让我们看回map函数。当你要对数组内的每个元素做一些事，你很可能不在乎哪个元素先做。无论由第一个元素开始执行，还是是由最后一个元素执行，你的结果都是一样的，对不？如果你手头上有2個CPU，你可以写段代码，使得它们各对一半的元素工作，于是乎map快了两倍。 <br />
<br />
或
者，发挥一下想像力，设想你在全球有千千万万台服务器分布在全世界的若干个数据中心，你有一个真的很大很大的数组，嗯，再发挥一下想像力，设想这个数组记
录有整个互联网的内容。还了，现在你可以在几千台服务器上同时执行map，让每台服务器都来解决同一个问题的一小部分。 <br />
<br />
那么在这个例子里面，编写一段非常快的代码来搜索整个互联网这个问题，其实就和用一个简单的字符串搜索器（算子）作为参数来调用map函数一样简单了。 <br />
<br />
希
望你注意到一个真正有意思的要点，如果你想要把map/reduce模式变成一个对所有人都有用，对所有人都能立刻派上用场的技术，你只需要一个超级天才
来写最重要的一部分代码，来让map/reduce可以在一个巨大的并行计算机阵列上运行，然后其他旧的但是一向在单一个循环中运行良好的代码，仍可以保
持正确的运行，惟一的差别只是比原来单机运行快了n倍。这意味着它们都一不留神突然变成可以被用来解决一个巨大的问题的代码。 <br />
<br />
让我再啰嗦一下，通过把&#8220;循环&#8221;这个概念加以抽象，你可以把用任何你喜欢的方式来实现&#8220;循环&#8221;过程，包括可以实现让循环迭代速度随着硬件计算能力保持令人满意的同步增长。 <br />
<br />
你现在应该可以明白不久为何对那些对<a href="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html" title="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html" target="_blank">除了Java之外什么都沒被学过的计算机系学生表示不满</a>了：<br />
( <a href="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html" title="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html" target="_blank">http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html</a> ) ：<br />
<br />
Without
understanding functional programming, you can't invent MapReduce, the
algorithm that makes Google so massively scalable. The terms Map and
Reduce come from Lisp and functional programming. MapReduce is, in
retrospect, obvious to anyone who remembers from their 6.001-equivalent
programming class that purely functional programs have no side effects
and are thus trivially parallelizable. The very fact that Google
invented MapReduce, and Microsoft didn't, says something about why
Microsoft is still playing catch up trying to get basic search features
to work, while Google has moved on to the next problem: building
Skynet^H^H^H^H^H^H the world's largest massively parallel
supercomputer. I don't think Microsoft completely understands just how
far behind they are on that wave. <br />
<br />
不理解函数式编程，你就发明不了MapReduce这个让Google的计算能力如此具有可扩展性的算法。Map和Reduce这两个术语源自Lisp语言和函数式编程&#8230;&#8230;（这是另一篇文章的内容，emu也不是很理解其中的各种说法的来龙去脉，就不翻译了） <br />
<br />
我希望你现在明白，把函数当成基本类型的（动态）编程语言能让你在编程过程中更好的进行抽象化，也就是使代码精悍、功能更内聚、更具可重用性及更具有扩展性。很多的Google应用使用Map/Reduce模式，因此一有人对其优化或修正缺陷，它们就都可以从中得益。 <br />
<br />
我
准备要再罗嗦一下，我认为最有生产力的编程语言莫过于能让你在不同层次上都可以进行抽象化的。老掉牙的FORTRAN 语言以前是不让你写函数的注。C
有函数指针，可是它们都非常丑丑丑丑丑丑丑丑陋，不允许匿名声明，又不能在用它们时实现它们而偏偏要放在別处去实现。Java让你使用算子对象，一种更丑
陋的东西。正如Steve Yegge所述，Java是個<a href="http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" title="http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" target="_blank">名词王国</a> <br />
( <a href="http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" title="http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" target="_blank">http://steveyegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html</a> )。 <br />
<br />
<strong>作者注：</strong>这
里提起了FORTRAN，不过我上次使用FORTRAN是27年前的事了。FORTRAN是有函数的，我码字那会儿脑子里面想的大概是GW-BASIC语
言。（emu注，basic确实只有所谓的子程序和go-sub语句，作用只是重新组织代码结构而已，没有参数和调用堆栈，因此没有真正的函数调用）<br />
<br />
<strong>译者注：</strong>原作者起了《你的编程语言可以这样做吗》这个标题其实并不是这篇文章的真正价值所在，我转这篇文章也不是因为原作者可以把语言的初级技巧玩得转，而是因为这是一篇map/reduce模型的示范。
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/206800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-09 18:39 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/09/206800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天,俺们的市场总监离开了.郁闷啊</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/06/206262.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Fri, 06 Jun 2008 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/06/206262.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/206262.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/06/206262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/206262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/206262.html</trackback:ping><description><![CDATA[又一重量级人物出走,过两天,还有一个同事也要离开.到底还要相信是铁打的营盘流水的兵呢,还是俺们的营盘不是铁打的?<br />
发发牢骚,唉!
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/206262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-06 11:00 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/06/206262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UNIX编程艺术的一段话</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205925.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 04 Jun 2008 13:32:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205925.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/205925.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/205925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/205925.html</trackback:ping><description><![CDATA[看这本书我最经常回顾的一段话是：<br />
&nbsp;&nbsp;&nbsp;&nbsp; &#8220;软件设计和实现应该是一门充满快乐的艺术，一种高水平的游戏。如果这种态度对你来说听起来有些荒谬，或者令你隐约感到有些困窘，那么情停下来，想一想，问问自己是不是已经把什么给遗忘了。如果只是为了赚钱或是打发时间，你为什么要搞软件设计而不是别的什么呢？你肯定曾经也认为软件设计值得你付出激情......"<br />
<br />
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/205925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-04 21:32 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖茨向开发人员告别演讲的一句话有感</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205900.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 04 Jun 2008 10:18:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205900.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/205900.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205900.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/205900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/205900.html</trackback:ping><description><![CDATA[周二在&#8220;TechEd Developers&#8221;大会上，微软董事会主席比尔&#183;盖茨(Bill Gates)面对满屋的开发人员，发表了退隐前的最后一次公开演讲。在开幕演讲上，盖茨说了这么一句话，&#8220;微软的成功在于我们和开发人员的关系。&#8221; <br />
看到这句话的时候,我想到了现在的公司,现在公司老板的意思就是不要企业文化,而是通过明确的管理规范来约束企业员工,如果所有的员工都一视同仁,开发人员与市场人员,运营人员都在相同的管理制度下工作的话,那么怎么来提现"微软的成功在于我们和开发人员的关系"?<br />
我一直坚定自己从事互联网行业的工作,就是因为在这个舞台上,每个人都可能有机会,每一个人都更加能够发挥自己的主观能动性,而且更加容易.作为互联网企业中最前线的员工---开发人员,如果企业不能提供一个有效的机制来激发他们创作的激情,而只是把他们当作工具来使用的话,那么很难想像企业的前途.又联想到现在google大量高级开发人员,甚至管理人员都纷纷出走,究其原因,是因为这里限制了他们的创造性.我相信,没有一个其它的行业能比处在互联网行业这个时代的浪潮之尖的行业中更能体会到创造的乐趣!<br />
所以,我认为,互联网企业中,公司与开发人员的关系这个问题,应该要被提到公司的战略管理的高度来重视这个问题.
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/205900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-04 18:18 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>顺势而为,逆反心理,止跌止涨,禁止全仓,久盘必跌.</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205749.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 04 Jun 2008 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205749.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/205749.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/205749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/205749.html</trackback:ping><description><![CDATA[置顶以提醒自己.
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/205749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-04 11:28 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/04/205749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGI启动参数-Dosgi.compatibility.bootdelegation=true的作用</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/06/02/205315.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 02 Jun 2008 05:59:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/06/02/205315.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/205315.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/06/02/205315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/205315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/205315.html</trackback:ping><description><![CDATA[今天写le一个bundle,名字叫JmsSendBundle,用spring的jms template来实现发送jms消息.,写完之后,在eclipse环境中运行都正常,但导出到我的osgi环境中,始终报一个错误:java.lang.NoClassDefFoundError: javax/naming/Referenceable
<div>搞了一上午,最后比较eclipse和我自己的osgi的启动环境变量,发现eclipse中<span  style="font-family: 'lucida grande'; font-size: 11px; white-space: pre; ">osgi.compatibility.bootdelegation的值是true,而我的是false,结果把这个参数改成true之后就可以了.</span></div>
<div><font  face="'lucida grande'" size="3"><span  style="font-size: 11px; white-space: pre;">然后去google了下osgi.compatibility.bootdelegation这个参数的作用,<span  style="font-family: Tahoma; font-size: 12px; line-height: 18px; white-space: normal; ">如果该参数值为"true"，当一个类或资源查找不到时，类加载器会启动父类加载器进行最后的查找。该参数的默认值为"true",不知道我的为什么缺省成false了.</span></span></font></div>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/205315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-06-02 13:59 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/06/02/205315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>equinox开发osgi时的一个小技巧:定义公用的jar文件.</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203922.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Thu, 29 May 2008 11:33:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203922.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/203922.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203922.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/203922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/203922.html</trackback:ping><description><![CDATA[一般在开发java项目的时候,我们会有一些公用的jar文件,在开发bundle的时候,如果把这些jar文件重复的在各bundle中复制的话,即烦琐,又容易出错.<br />
今天我琢磨出一个方法,虽然不敢说这么做是否是正确方法,但至少解决了正确的问题(用错误的方法解决正确的事总比用正确的方法解决错误的事好!哈哈).下面是解决的方法:<br />
&nbsp;1.修改org.eclipse.osgi.xxxxxx.jar文件<br />
&nbsp;&nbsp; a.把文件中META-INF目录中的ECLIPSE.SF,ECLIPSE.RSA文件删除掉(因为jar文件是通过SF文件来保证jar中的内容不被篡改!如果不了解这个的,可以去查下jar的详细说明)<br />
&nbsp;&nbsp; b.修改jar根目录下的J2SE-1.5.profile文件(如果你开发osgi使用的是其它J2SE环境,请编辑相应的文件)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个文件中定义了osgi启动时的org.osgi.framework.system.packages属性,因为osgi中每个bundle都有自己独立的classpath,那么在各个bundle之间共享的class就是通过这个属性中定义的包来指定的.(如果不了解osgi的class载入机制,请参阅osgi的入门教材!),你可以在文件中的这个属性值上加入自己的包,例如:<br />
&nbsp;........<br />
&nbsp;org.ietf.jgss,\<br />
&nbsp;org.omg.*,\<br />
&nbsp;org.w3c.*,\<br />
&nbsp;org.xml.*,\<br />
&nbsp;sun.*,\<br />
&nbsp;demo.*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这一行是新增加的包<br />
2.把demo.*所在的jar文件加入到启动osgi的classpath中,一般你可以系统环境变量的classpath中加入这个jar文件路径.<br />
3.把第1步中修改后的osgi jar文件拷贝到eclipse的plugins目录下,重新启动eclipse<br />
4.打开一个bundle的MANIFEST.MF文件,在dependencies项中,你就可以在imported packages中导入刚才定义的demo包了.<br />
<br />
虽然这样做可以做到在各个bundle间共享一些jar文件,但这些公用的jar一定要确认清楚,否则会给以后的开发带来麻烦!因为之所以用osgi来开发,就是为了使用它的class loader的管理机制. 
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/203922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-29 19:33 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OOD比OOP更重要</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203892.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Thu, 29 May 2008 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203892.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/203892.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203892.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/203892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/203892.html</trackback:ping><description><![CDATA[OOP相对比较容易学习,毕竟与编程语言的语法有很大关系.但是OOD就很复杂了,一个大的系统,到了后期越来越混乱,大多数原因是随着新员工的不断加入,他们不能和以前的老员工或者已离职的员工的设计概念保持一致.或者由于系统上线后,新来的业务需求大部分是以一个个小的特性加入到系统中,所以开发人员,管理人员都以一种很容易实现的方式去做这些事情,结果到后面就乱成一团.所以,系统在后期有个重要的工作,就是不断进行架构的重构,以便使新的模块,代码能与以前的在构架概念上保持一致.一个大的系统如果不以OOD的方式设计,那么构架师基本上很难把这个系统向新的涉众解释清楚,无论你是用用例图,类图,序列图,还是交互图,部署图,都难.必须要以一个个的子系统去描述它.<br />
总之,概念完整性是系统成功的关键.设计上的技术可能对某一个模块的影响会比较大.<br />
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/203892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-29 17:35 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>公司要封外网了,极度郁闷中</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203811.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Thu, 29 May 2008 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203811.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/203811.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203811.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/203811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/203811.html</trackback:ping><description><![CDATA[这两天书也没心情看了,想到不久上班连google都不能用了,作为一个程序员,还有什么意思?今天前台已经郁闷一天了,因为没得上网!还有好几个财务的,今天msn上都看不到他们的身影了.
<div>是不是到时候改改变下自己了?郁闷啊!</div>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/203811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-29 13:51 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/29/203811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle AS的远程调试</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/28/203446.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 28 May 2008 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/28/203446.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/203446.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/28/203446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/203446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/203446.html</trackback:ping><description><![CDATA[如果要使OracleAS支持远程调试功能,需要在目录: \OracleAS_1\opmn\conf,修改配置文件opmn.xml:
<div><span  style="font-family: white-space: pre; ">&lt;module-data></span>
<pre>&lt;category id="start-parameters">
&lt;data id="java-options" value="-server &lt;del>Xdebug &lt;/del>Xnoagent -Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=4000
-Djava.security.policy=$ORACLE_HOME/j2ee/home/config/java2.policy
-Djava.awt.headless=true"/>
&lt;/category>
&lt;/module-data>
</pre>
</div>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/203446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-28 11:57 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/28/203446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下so文件的创建及调用方法</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/21/201850.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 21 May 2008 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/21/201850.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/201850.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/21/201850.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/201850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/201850.html</trackback:ping><description><![CDATA[<br />
<div>1.创建so文件</div>
<div>这一步很简单,只需要在用cc编译的时候,加上-shared选项即可,这样成成的执行程序即为动态链接库,例如:</div>
<div>&#160;&#160; &#160; cc -shared -o hello.so hello.c</div>
<div>2.调用so文件中的函数的步骤</div>
<div>&#160;&#160; a. 包含so中函数的头文件,包含<span  style="font-size: 14px; line-height: 20px; ">dlfcn.h头文件,这个头文件中定义了打开so文件,调用so的函数,关闭so的函数</span></div>
<div>&#160;&#160; b.申明so中函数的类型变量</div>
<div>&#160;&#160; c.用dlopen函数打开so文件,返回句柄</div>
<div>&#160;&#160; d.用dlsym函数以上c步骤中得到的句柄,得到so文件中要调用的函数的动态地址,并把这个地址赋值给在b步骤中申明的函数类型变量</div>
<div>&#160;&#160; e.通过b中申明的函数类型变量调用so中的函数</div>
<div>&#160;&#160; f.用dlclose函数关闭c中得到的句柄所指向的so动态连接库</div>
<div>挺简单吧!</div>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/201850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-21 10:56 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/21/201850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Felix设计中的一个疑问</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201412.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 19 May 2008 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201412.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/201412.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201412.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/201412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/201412.html</trackback:ping><description><![CDATA[这两天在看apache的osgi框架felix的源代码,对里面很多类的构造函数都有个logger感到很疑惑,一个logger对象会成为一个类的构造函数所必须要的参数吗?
<div>例如:</div>
<div>public Felix(Logger logger, Map configMutableMap, List activatorList) {...}</div>
<div>private EventDispatcher(Logger logger) {...}</div>
<div>protected BundleContextImpl(Logger logger, Felix felix, FelixBundle bundle) {...}</div>
<div>这样的例子太多了.我还看不出这样使用logger有什么好处,应该是跟osgi框架的每个bundle使用单独的classpath有关,不知道哪位可以解释下.谢谢!</div>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/201412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-19 16:11 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Collective Intelligence读书笔记之Inroduction to Collective Intelligence</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201369.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 19 May 2008 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201369.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/201369.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/201369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/201369.html</trackback:ping><description><![CDATA[在第一章的Collective Intelligence的介绍中,作者通过Netflix和google两个公司的例子来说明了Collective Intelligence的应用.但具体Collective Intelligence的定义到底是什么呢?作者并没有明确给出,所以我在读书笔记中也就直接用这两个单词了.
<div>这本书将会告诉读者,通过一些API,应用机器学习算法和统计方法来收集数据的一些方法.那么什么是机器学习呢?这个概念我倒是还有映像,幸好以前研究过语音识别,所以对人工智能方面的知识还有一点基础^_^作者给出的定义是:</div>
<div>An algorithm is given a set of data and infers information about the properties of the data---and that information allows it to make predictions about other data that it might see in the future.简单的说,就是给定一组数据,然后通过一个算法推断出一个数据模型,然后,利用这个模型可以对未来的其它数据做出预测.作者通过一个垃圾邮件过滤的简单例子形象的说明了机器学习的过程!</div>
<div>机器学习常用到的一些算法包括决策树,神经网络等,我还记得语音识别中用到了隐马尔科夫模型,DTW,线性预测LPC,聚类等模型,但主要的都是基于数学方法和统计方法,真是后悔数学没学好啊:(</div>
<div>作者罗列了一些机器学习算法的应用场景,例如Google的page rank,Amozon的推荐系统,在金融系统中的防欺骗检测,产品市场预测,供应链管理等方面.</div>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/201369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-19 13:38 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/19/201369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Collective Intelligence读书笔记之Foreword</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/16/200924.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Fri, 16 May 2008 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/16/200924.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/200924.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/16/200924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/200924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/200924.html</trackback:ping><description><![CDATA[<p>今天终于拿到了这本期盼已久的书,可惜是英文的,鉴于对这本书的敬仰!也只好咬着头皮读下去了!<br />
刚看了序言,把里面精彩的两段摘录下来:<br />
Web2.0...Getting users to participage is the first step.Learning from those users and shapping your site based on what they do and pay attention to is the second step.<br />
在web2.0中,让用户参与到你的系统中来只是其中的第一步,更多的是要从这些用户的行为中不断学习,并在这些经验的基础上优化你的web站点<br />
<br />
It's not longer enough to know how to build a database-backed web site.If you want to succeed,you need to know how to mine the data that users are ading,both explicitly and as a side effect of their activity on your site.<br />
如果你想成功的话,仅仅局限于知道怎么构建一个基于数据路的web站点还是很不够的,你需要知道怎么从用户增加的web内容中提炼出有用的数据.</p>
 <img src ="http://www.blogjava.net/jjwwhmm/aggbug/200924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-16 15:22 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/16/200924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>equinox的osgi命令</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/14/200343.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 14 May 2008 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/14/200343.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/200343.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/14/200343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/200343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/200343.html</trackback:ping><description><![CDATA[<span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">控制osgi framework的命令:<br />
&nbsp;launch&nbsp;-&nbsp;start&nbsp;the&nbsp;OSGi&nbsp;Framework</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">shutdown&nbsp;-&nbsp;shutdown&nbsp;the&nbsp;OSGi&nbsp;Framework</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">close&nbsp;-&nbsp;shutdown&nbsp;and&nbsp;exit</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">exit&nbsp;-&nbsp;exit&nbsp;immediately&nbsp;(System.exit)</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">init&nbsp;-&nbsp;uninstall&nbsp;all&nbsp;bundles</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">setprop&nbsp;&lt;key&gt;=&lt;value&gt;&nbsp;-&nbsp;set&nbsp;the&nbsp;OSGi&nbsp;property<br />
</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P><br />
控制bundle的命令:</O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">install&nbsp;-&nbsp;install&nbsp;and&nbsp;optionally&nbsp;start&nbsp;bundle&nbsp;from&nbsp;the&nbsp;given&nbsp;URL</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">uninstall&nbsp;-&nbsp;uninstall&nbsp;the&nbsp;specified&nbsp;bundle(s)</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">start&nbsp;-&nbsp;start&nbsp;the&nbsp;specified&nbsp;bundle(s)</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">stop&nbsp;-&nbsp;stop&nbsp;the&nbsp;specified&nbsp;bundle(s)</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">refresh&nbsp;-&nbsp;refresh&nbsp;the&nbsp;packages&nbsp;of&nbsp;the&nbsp;specified&nbsp;bundles</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">update&nbsp;-&nbsp;update&nbsp;the&nbsp;specified&nbsp;bundle(s)</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
显示bundle状态的命令:<br />
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">status&nbsp;[-s&nbsp;[&lt;comma&nbsp;separated&nbsp;list&nbsp;of&nbsp;bundle&nbsp;states&gt;]&nbsp;&nbsp;[&lt;segment&nbsp;of&nbsp;bsn&gt;]]&nbsp;-&nbsp;display&nbsp;installed&nbsp;bundles&nbsp;and&nbsp;registered&nbsp;services</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">ss&nbsp;[-s&nbsp;[&lt;comma&nbsp;separated&nbsp;list&nbsp;of&nbsp;bundle&nbsp;states&gt;]&nbsp;&nbsp;[&lt;segment&nbsp;of&nbsp;bsn&gt;]]&nbsp;-&nbsp;display&nbsp;installed&nbsp;bundles&nbsp;(short&nbsp;status)</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">services&nbsp;{filter}&nbsp;-&nbsp;display&nbsp;registered&nbsp;service&nbsp;details</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">packages&nbsp;{&lt;pkgname&gt;|&lt;id&gt;|&lt;location&gt;}&nbsp;-&nbsp;display&nbsp;imported/exported&nbsp;package&nbsp;details</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">bundles&nbsp;[-s&nbsp;[&lt;comma&nbsp;separated&nbsp;list&nbsp;of&nbsp;bundle&nbsp;states&gt;]&nbsp;&nbsp;[&lt;segment&nbsp;of&nbsp;bsn&gt;]]&nbsp;-&nbsp;display&nbsp;details&nbsp;for&nbsp;all&nbsp;installed&nbsp;bundles</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">bundle&nbsp;(&lt;id&gt;|&lt;location&gt;)&nbsp;-&nbsp;display&nbsp;details&nbsp;for&nbsp;the&nbsp;specified&nbsp;bundle(s)</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">headers&nbsp;(&lt;id&gt;|&lt;location&gt;)&nbsp;-&nbsp;print&nbsp;bundle&nbsp;headers</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
<p class="0" style="layout-grid-mode: char; text-align: justify"><font size="3"><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">&nbsp;</span><span style="font-size: 10.5pt; color: rgb(0,0,0); font-family: ''Courier New''; mso-spacerun: ''yes''">log&nbsp;(&lt;id&gt;|&lt;location&gt;)&nbsp;-&nbsp;display&nbsp;log&nbsp;entries</span><span style="font-size: 10.5pt; font-family: ''Courier New''; mso-spacerun: ''yes''"><O:P></O:P></span></font></p>
其它的命令一般不怎么用到,就不贴出来了.<br />
一般启动好osgi后,我们会用ss命令来看看当前bundles的启动状态<br />
用install命令把开发好的bundle部署到osgi中<br />
用update命令更新已经部署的bundle<br />
用uninstall命令停止一个bundle的服务
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/200343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-14 09:49 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/14/200343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)iptables的man中文文档</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/12/199931.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 12 May 2008 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/12/199931.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/199931.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/12/199931.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/199931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/199931.html</trackback:ping><description><![CDATA[<font size="2">总览<br />
用iptables&nbsp;-ADC&nbsp;来指定链的规则，-A添加&nbsp;-D删除&nbsp;-C&nbsp;修改<br />
<br />
iptables&nbsp;-&nbsp;[RI]&nbsp;chain&nbsp;rule&nbsp;num&nbsp;rule-specification[option]<br />
用iptables&nbsp;-&nbsp;RI&nbsp;通过规则的顺序指定<br />
<br />
iptables&nbsp;-D&nbsp;chain&nbsp;rule&nbsp;num[option]<br />
删除指定规则<br />
iptables&nbsp;-[LFZ]&nbsp;[chain][option]<br />
用iptables&nbsp;-LFZ&nbsp;链名&nbsp;[选项]<br />
<br />
iptables&nbsp;-[NX]&nbsp;chain<br />
用&nbsp;-NX&nbsp;指定链<br />
<br />
iptables&nbsp;-P&nbsp;chain&nbsp;target[options]<br />
指定链的默认目标<br />
<br />
iptables&nbsp;-E&nbsp;old-chain-name&nbsp;new-chain-name<br />
-E&nbsp;旧的链名&nbsp;新的链名&nbsp;<br />
用新的链名取代旧的链名<br />
说明<br />
Iptalbes&nbsp;是用来设置、维护和检查Linux内核的IP包过滤规则的。&nbsp;<br />
可以定义不同的表，每个表都包含几个内部的链，也能包含用户定义的链。每个链都是一个规则列表，对对应的包进行匹配：每条规则指定应当如何处理与之相匹配的包。这被称作'target'（目标），也可以跳向同一个表内的用户定义的链。<br />
<br />
TARGETS<br />
防火墙的规则指定所检查包的特征，和目标。如果包不匹配，将送往该链中下一条规则检查；如果匹配,那么下一条规则由目标值确定.该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT[通过],&nbsp;DROP[删除],&nbsp;QUEUE[排队],&nbsp;或者&nbsp;RETURN[返回]。<br />
ACCEPT&nbsp;表示让这个包通过。DROP表示将这个包丢弃。QUEUE表示把这个包传递到用户空间。RETURN表示停止这条链的匹配，到前一个链的规则重新开始。如果到达了一个内建的链(的末端)，或者遇到内建链的规则是RETURN，包的命运将由链准则指定的目标决定。<br />
<br />
TABLES<br />
当前有三个表（哪个表是当前表取决于内核配置选项和当前模块)。<br />
-t&nbsp;table<br />
这个选项指定命令要操作的匹配包的表。如果内核被配置为自动加载模块，这时若模块没有加载，(<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">系统</a></a>)将尝试(为该表)加载适合的模块。这些表如下：filter,这是默认的表，包含了内建的链INPUT（处理进入的包）、FORWORD（处理通过的包）和OUTPUT（处理本地生成的包）。nat,这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成：PREROUTING&nbsp;(修改到来的包)、OUTPUT（修改路由之前本地的包）、POSTROUTING（修改准备出去的包）。mangle&nbsp;这个表用来对指定的包进行修改。它有两个内建规则：PREROUTING（修改路由之前进入的包）和OUTPUT（修改路由之前本地的包）。<br />
OPTIONS<br />
这些可被iptables识别的选项可以区分不同的种类。<br />
<br />
COMMANDS<br />
这些选项指定执行明确的动作：若指令行下没有其他规定,该行只能指定一个选项.对于长格式的命令和选项名,所用字母长度只要保证iptables能从其他选项中区分出该指令就行了。<br />
-A&nbsp;-append<br />
在所选择的链末添加一条或更多规则。当源（地址）或者/与&nbsp;目的（地址）转换为多个地址时，这条规则会加到所有可能的地址(组合)后面。<br />
<br />
-D&nbsp;-delete<br />
从所选链中删除一条或更多规则。这条命令可以有两种方法：可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。<br />
<br />
-R&nbsp;-replace<br />
从选中的链中取代一条规则。如果源（地址）或者/与&nbsp;目的（地址）被转换为多地址，该命令会失败。规则序号从1开始。<br />
<br />
-I&nbsp;-insert<br />
根据给出的规则序号向所选链中插入一条或更多规则。所以，如果规则序号为1，规则会被插入链的头部。这也是不指定规则序号时的默认方式。<br />
<br />
-L&nbsp;-list<br />
显示所选链的所有规则。如果没有选择链，所有链将被显示。也可以和z选项一起使用，这时链会被自动列出和归零。精确输出受其它所给参数影响。<br />
<br />
-F&nbsp;-flush<br />
清空所选链。这等于把所有规则一个个的删除。<br />
<br />
--Z&nbsp;-zero<br />
把所有链的包及字节的计数器清空。它可以和&nbsp;-L配合使用，在清空前察看计数器，请参见前文。<br />
<br />
-N&nbsp;-new-chain<br />
根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。<br />
<br />
-X&nbsp;-delete-chain<br />
删除指定的用户自定义链。这个链必须没有被引用，如果被引用，在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数，这条命令将试着删除每个非内建的链。<br />
<br />
<br />
-P&nbsp;-policy<br />
设置链的目标规则。<br />
<br />
-E&nbsp;-rename-chain<br />
根据用户给出的名字对指定链进行重命名，这仅仅是修饰，对整个表的结构没有影响。TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则，而且内建链和用户自定义链都不能是规则的目标。<br />
<br />
-h&nbsp;Help.<br />
帮助。给出当前命令语法非常简短的说明。<br />
<br />
PARAMETERS<br />
参数<br />
以下参数构成规则详述，如用于add、delete、replace、append&nbsp;和&nbsp;check命令。<br />
<br />
-p&nbsp;-protocal&nbsp;[!]protocol<br />
规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或者全部，也可以是数值，代表这些协议中的某一个。当然也可以使用在/etc/protocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0相当于所有all。Protocol&nbsp;all会匹配所有协议，而且这是缺省时的选项。在和check命令结合时，all可以不被使用。<br />
-s&nbsp;-source&nbsp;[!]&nbsp;address[/mask]<br />
指定源地址，可以是主机名、<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">网络</a></a>名和清楚的IP地址。mask说明可以是<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">网络</a></a>掩码或清楚的数字，在<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">网络</a></a>掩码的左边指定<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">网络</a></a>掩码左边"1"的个数，因此，mask值为24等于255.255.255.0。在指定地址前加上"!"说明指定了相反的地址段。标志&nbsp;--src&nbsp;是这个选项的简写。<br />
<br />
-d&nbsp;--destination&nbsp;[!]&nbsp;address[/mask]<br />
指定目标地址，要获取详细说明请参见&nbsp;-s标志的说明。标志&nbsp;--dst&nbsp;是这个选项的简写。<br />
<br />
-j&nbsp;--jump&nbsp;target<br />
-j&nbsp;目标跳转<br />
指定规则的目标；也就是说，如果包匹配应当做什么。目标可以是用户自定义链（不是这条规则所在的），某个会立即决定包的命运的专用内建目标，或者一个扩展（参见下面的EXTENSIONS）。如果规则的这个选项被忽略，那么匹配的过程不会对包产生影响，不过规则的计数器会增加。<br />
<br />
-i&nbsp;-in-interface&nbsp;[!]&nbsp;[name]<br />
i&nbsp;-进入的（<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">网络</a></a>）接口&nbsp;[!][名称]<br />
这是包经由该接口接收的可选的入口名称，包通过该接口接收（在链INPUT、FORWORD和PREROUTING中进入的包）。当在接口名前使用"!"说明后，指的是相反的名称。如果接口名后面加上"+"，则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略，会假设为"+"，那么将匹配任意接口。<br />
<br />
-o&nbsp;--out-interface&nbsp;[!][name]<br />
-o&nbsp;--输出接口[名称]<br />
这是包经由该接口送出的可选的出口名称，包通过该口输出（在链FORWARD、OUTPUT和POSTROUTING中送出的包）。当在接口名前使用"!"说明后，指的是相反的名称。如果接口名后面加上"+"，则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略，会假设为"+"，那么将匹配所有任意接口。<br />
<br />
[!]&nbsp;-f,&nbsp;--fragment<br />
&nbsp;[!]&nbsp;-f&nbsp;--分片<br />
这意味着在分片的包中，规则只询问第二及以后的片。自那以后由于无法判断这种把包的源端口或目标端口（或者是ICMP类型的），这类包将不能匹配任何指定对他们进行匹配的规则。如果"!"说明用在了"-f"标志之前，表示相反的意思。<br />
<br />
OTHER&nbsp;OPTIONS<br />
其他选项<br />
还可以指定下列附加选项：<br />
<br />
-v&nbsp;--verbose<br />
-v&nbsp;--详细<br />
详细输出。这个选项让list命令显示接口地址、规则选项（如果有）和TOS（Type&nbsp;of&nbsp;Service）掩码。包和字节计数器也将被显示，分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍（不过请参看-x标志改变它），对于添加,插入,删除和替换命令，这会使一个或多个规则的相关详细信息被打印。<br />
<br />
-n&nbsp;--numeric<br />
-n&nbsp;--数字<br />
数字输出。IP地址和端口会以数字的形式打印。默认情况下，<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">程序</a></a>试显示主机名、<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">网络</a></a>名或者服务（只要可用）。<br />
<br />
-x&nbsp;-exact<br />
-x&nbsp;-精确<br />
扩展数字。显示包和字节计数器的精确值，代替用K,M,G表示的约数。这个选项仅能用于&nbsp;-L&nbsp;命令。<br />
<br />
--line-numbers<br />
当列表显示规则时，在每个规则的前面加上行号，与该规则在链中的位置相对应。<br />
<br />
MATCH&nbsp;EXTENSIONS<br />
对应的扩展<br />
iptables能够使用一些与模块匹配的扩展包。以下就是含于基本包内的扩展包，而且他们大多数都可以通过在前面加上!来表示相反的意思。<br />
<br />
tcp<br />
当&nbsp;--protocol&nbsp;tcp&nbsp;被指定,且其他匹配的扩展未被指定时,这些扩展被装载。它提供以下选项：<br />
<br />
--source-port&nbsp;[!]&nbsp;[port[:port]]<br />
源端口或端口范围指定。这可以是服务名或端口号。使用格式端口：端口也可以指定包含的（端口）范围。如果首端口号被忽略，默认是"0"，如果末端口号被忽略，默认是"65535"，如果第二个端口号大于第一个，那么它们会被交换。这个选项可以使用&nbsp;--sport的别名。<br />
<br />
--destionation-port&nbsp;[!]&nbsp;[port:[port]]<br />
目标端口或端口范围指定。这个选项可以使用&nbsp;--dport别名来代替。<br />
<br />
--tcp-flags&nbsp;[!]&nbsp;mask&nbsp;comp<br />
匹配指定的TCP标记。第一个参数是我们要检查的标记，一个用逗号分开的列表，第二个参数是用逗号分开的标记表,是必须被设置的。标记如下：SYN&nbsp;ACK&nbsp;FIN&nbsp;RST&nbsp;URG&nbsp;PSH&nbsp;ALL&nbsp;NONE。因此这条命令：iptables&nbsp;-A&nbsp;FORWARD&nbsp;-p&nbsp;tcp&nbsp;--tcp-flags&nbsp;SYN,&nbsp;ACK,&nbsp;FIN,&nbsp;RST&nbsp;SYN只匹配那些SYN标记被设置而ACK、FIN和RST标记没有设置的包。<br />
<br />
[!]&nbsp;--syn<br />
只匹配那些设置了SYN位而清除了ACK和FIN位的TCP包。这些包用于TCP连接初始化时发出请求；例如，大量的这种包进入一个接口发生堵塞时会阻止进入的TCP连接，而出去的TCP连接不会受到影响。这等于&nbsp;--tcp-flags&nbsp;SYN,&nbsp;RST,&nbsp;ACK&nbsp;SYN。如果"--syn"前面有"!"标记，表示相反的意思。<br />
<br />
--tcp-option&nbsp;[!]&nbsp;number<br />
匹配设置了TCP选项的。<br />
<br />
udp<br />
当protocol&nbsp;udp&nbsp;被指定,且其他匹配的扩展未被指定时,这些扩展被装载,它提供以下选项：<br />
<br />
--source-port&nbsp;[!]&nbsp;[port:[port]]<br />
源端口或端口范围指定。详见&nbsp;TCP扩展的--source-port选项说明。<br />
<br />
--destination-port&nbsp;[!]&nbsp;[port:[port]]<br />
目标端口或端口范围指定。详见&nbsp;TCP扩展的--destination-port选项说明。<br />
<br />
icmp<br />
当protocol&nbsp;icmp被指定,且其他匹配的扩展未被指定时,该扩展被装载。它提供以下选项：<br />
--icmp-type&nbsp;[!]&nbsp;typename<br />
这个选项允许指定ICMP类型，可以是一个数值型的ICMP类型，或者是某个由命令iptables&nbsp;-p&nbsp;icmp&nbsp;-h所显示的ICMP类型名。<br />
<br />
mac<br />
--mac-source&nbsp;[!]&nbsp;address<br />
匹配物理地址。必须是XX:XX:XX:XX:XX这样的格式。注意它只对来自以太设备并进入PREROUTING、FORWORD和INPUT链的包有效。<br />
<br />
limit<br />
这个模块匹配标志用一个标记桶过滤器一一定速度进行匹配,它和LOG目标结合使用来给出有限的登陆数.当达到这个极限值时,使用这个扩展包的规则将进行匹配.(除非使用了"!"标记)<br />
<br />
--limit&nbsp;rate<br />
最大平均匹配速率：可赋的值有'/second',&nbsp;'/minute',&nbsp;'/hour',&nbsp;or&nbsp;'/day'这样的单位，默认是3/hour。<br />
<br />
--limit-burst&nbsp;number<br />
待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则概数字加1.默认值为5<br />
<br />
multiport<br />
这个模块匹配一组源端口或目标端口,最多可以指定15个端口。只能和-p&nbsp;tcp&nbsp;或者&nbsp;-p&nbsp;udp&nbsp;连着使用。<br />
<br />
--source-port&nbsp;[port[,&nbsp;port]]<br />
如果源端口是其中一个给定端口则匹配<br />
<br />
--destination-port&nbsp;[port[,&nbsp;port]]<br />
如果目标端口是其中一个给定端口则匹配<br />
<br />
--port&nbsp;[port[,&nbsp;port]]<br />
若源端口和目的端口相等并与某个给定端口相等,则匹配。<br />
mark<br />
这个模块和与netfilter过滤器标记字段匹配（就可以在下面设置为使用MARK标记）。<br />
<br />
--mark&nbsp;value&nbsp;[/mask]<br />
匹配那些无符号标记值的包（如果指定mask，在比较之前会给掩码加上逻辑的标记）。<br />
<br />
owner<br />
此模块试为本地生成包匹配包创建者的不同特征。只能用于OUTPUT链，而且即使这样一些包（如ICMP&nbsp;ping应答）还可能没有所有者，因此永远不会匹配。<br />
<br />
--uid-owner&nbsp;userid<br />
如果给出有效的user&nbsp;id，那么匹配它的进程产生的包。<br />
<br />
--gid-owner&nbsp;groupid<br />
如果给出有效的group&nbsp;id，那么匹配它的进程产生的包。<br />
<br />
--sid-owner&nbsp;seessionid<br />
根据给出的会话组匹配该进程产生的包。<br />
<br />
state<br />
此模块，当与连接跟踪结合使用时，允许访问包的连接跟踪状态。<br />
<br />
--state&nbsp;state<br />
这里state是一个逗号分割的匹配连接状态列表。可能的状态是:INVALID表示包是未知连接，ESTABLISHED表示是双向传送的连接，NEW表示包为新的连接，否则是非双向传送的，而RELATED表示包由新连接开始，但是和一个已存在的连接在一起，如FTP数据传送，或者一个ICMP错误。<br />
<br />
unclean<br />
此模块没有可选项，不过它试着匹配那些奇怪的、不常见的包。处在实验中。<br />
<br />
tos<br />
此模块匹配IP包首部的8位tos（服务类型）字段（也就是说，包含在优先位中）。<br />
<br />
--tos&nbsp;tos<br />
这个参数可以是一个标准名称，（用iptables&nbsp;-m&nbsp;tos&nbsp;-h&nbsp;察看该列表），或者数值。<br />
<br />
TARGET&nbsp;EXTENSIONS<br />
iptables可以使用扩展目标模块：以下都包含在标准版中。<br />
<br />
LOG<br />
为匹配的包开启内核记录。当在规则中设置了这一选项后，linux内核会通过printk()打印一些关于全部匹配包的信息（诸如IP包头字段等）。<br />
--log-level&nbsp;level<br />
记录级别（数字或参看&nbsp;syslog.conf(5)）。<br />
--log-prefix&nbsp;prefix<br />
在纪录信息前加上特定的前缀：最多14个字母长，用来和记录中其他信息区别。<br />
<br />
--log-tcp-sequence<br />
记录TCP序列号。如果记录能被用户读取那么这将存在安全隐患。<br />
<br />
--log-tcp-options<br />
记录来自TCP包头部的选项。<br />
--log-ip-options<br />
记录来自IP包头部的选项。<br />
<br />
MARK<br />
用来设置包的netfilter标记值。只适用于mangle表。<br />
<br />
--set-mark&nbsp;mark<br />
<br />
REJECT<br />
作为对匹配的包的响应，返回一个错误的包：其他情况下和DROP相同。<br />
<br />
此目标只适用于INPUT、FORWARD和OUTPUT链，和调用这些链的用户自定义链。这几个选项控制返回的错误包的特性：<br />
<br />
--reject-with&nbsp;type<br />
Type可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port-nreachable、icmp-proto-unreachable、&nbsp;icmp-net-prohibited&nbsp;或者&nbsp;icmp-host-prohibited，该类型会返回相应的ICMP错误信息（默认是port-unreachable）。选项&nbsp;echo-reply也是允许的；它只能用于指定ICMP&nbsp;ping包的规则中，生成ping的回应。最后，选项tcp-reset可以用于在INPUT链中,或自INPUT链调用的规则，只匹配TCP协议：将回应一个TCP&nbsp;RST包。<br />
TOS<br />
用来设置IP包的首部八位tos。只能用于mangle表。<br />
<br />
--set-tos&nbsp;tos<br />
你可以使用一个数值型的TOS&nbsp;值，或者用iptables&nbsp;-j&nbsp;TOS&nbsp;-h&nbsp;来查看有效TOS名列表。<br />
MIRROR<br />
这是一个试验示范目标，可用于转换IP首部字段中的源地址和目标地址，再传送该包,并只适用于INPUT、FORWARD和OUTPUT链，以及只调用它们的用户自定义链。<br />
<br />
SNAT<br />
这个目标只适用于nat表的POSTROUTING链。它规定修改包的源地址（此连接以后所有的包都会被影响），停止对规则的检查，它包含选项：<br />
<br />
--to-source&nbsp;&lt;ipaddr&gt;[-&lt;ipaddr&gt;][:port-port]<br />
可以指定一个单一的新的IP地址，一个IP地址范围，也可以附加一个端口范围（只能在指定-p&nbsp;tcp&nbsp;或者-p&nbsp;udp的规则里）。如果未指定端口范围，源端口中512以下的（端口）会被安置为其他的512以下的端口；512到1024之间的端口会被安置为1024以下的，其他端口会被安置为1024或以上。如果可能，端口不会被修改。<br />
<br />
--to-destiontion&nbsp;&lt;ipaddr&gt;[-&lt;ipaddr&gt;][:port-port]<br />
可以指定一个单一的新的IP地址，一个IP地址范围，也可以附加一个端口范围（只能在指定-p&nbsp;tcp&nbsp;或者-p&nbsp;udp的规则里）。如果未指定端口范围，目标端口不会被修改。<br />
<br />
MASQUERADE<br />
只用于nat表的POSTROUTING链。只能用于动态获取IP（拨号）连接：如果你拥有静态IP地址，你要用SNAT。伪装相当于给包发出时所经过接口的IP地址设置一个映像，当接口关闭连接会终止。这是因为当下一次拨号时未必是相同的接口地址（以后所有建立的连接都将关闭）。它有一个选项：<br />
<br />
--to-ports&nbsp;&lt;port&gt;[-port&gt;]<br />
指定使用的源端口范围，覆盖默认的SNAT源地址选择（见上面）。这个选项只适用于指定了-p&nbsp;tcp或者-p&nbsp;udp的规则。<br />
<br />
REDIRECT<br />
只适用于nat表的PREROUTING和OUTPUT链，和只调用它们的用户自定义链。它修改包的目标IP地址来发送包到机器自身（本地生成的包被安置为地址127.0.0.1）。它包含一个选项：<br />
<br />
--to-ports&nbsp;&lt;port&gt;[&lt;port&gt;]<br />
指定使用的目的端口或端口范围：不指定的话，目标端口不会被修改。只能用于指定了-p&nbsp;tcp&nbsp;或&nbsp;-p&nbsp;udp的规则。<br />
<br />
DIAGNOSTICS<br />
诊断<br />
不同的错误信息会打印成标准错误：退出<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">代码</a>0表示正确。类似于不对的或者滥用的命令行参数错误会返回错误<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">代码</a>2，其他错误返回<a class="UBBWordLink" href="http://www.ahaoz.com/" target="_blank">代码</a>为1。<br />
<br />
BUGS&nbsp;<br />
臭虫<br />
Check&nbsp;is&nbsp;not&nbsp;implemented&nbsp;(yet).<br />
检查还未完成。<br />
<br />
COMPATIBILITY&nbsp;WITH&nbsp;IPCHAINS<br />
与ipchains的兼容性<br />
iptables和Rusty&nbsp;Russell的ipchains非常相似。主要区别是INPUT&nbsp;链只用于进入本地主机的包,而OUTPUT只用于自本地主机生成的包。因此每个包只经过三个链的一个；以前转发的包会经过所有三个链。其他主要区别是&nbsp;-i&nbsp;引用进入接口；-o引用输出接口，两者都适用于进入FORWARD链的包。当和可选扩展模块一起使用默认过滤器表时，iptables是一个纯粹的包过滤器。这能大大减少以前对IP伪装和包过滤结合使用的混淆，所以以下选项作了不同的处理：<br />
-j&nbsp;MASQ<br />
-M&nbsp;-S<br />
-M&nbsp;-L<br />
在iptables中有几个不同的链。<br />
<br />
SEE&nbsp;ALSO<br />
参见<br />
iptables-HOWTO有详细的iptables用法,对netfilter-hacking-HOWTO也有详细的本质说明。<br />
<br />
AUTHORS<br />
作者<br />
<br />
Rusty&nbsp;Russell&nbsp;wrote&nbsp;iptables,&nbsp;in&nbsp;early&nbsp;consultation&nbsp;with&nbsp;Michael&nbsp;Neuling.<br />
Marc&nbsp;&nbsp;Boucher&nbsp;&nbsp;made&nbsp;Rusty&nbsp;abandon&nbsp;ipnatctl&nbsp;by&nbsp;lobbying&nbsp;for&nbsp;a&nbsp;generic&nbsp;packet&nbsp;selection&nbsp;framework&nbsp;in&nbsp;iptables,&nbsp;then&nbsp;wrote&nbsp;the&nbsp;mangle&nbsp;table,&nbsp;the&nbsp;owner&nbsp;match,&nbsp;&nbsp;the&nbsp;&nbsp;mark&nbsp;&nbsp;stuff,&nbsp;&nbsp;and&nbsp;&nbsp;ranaround&nbsp;doing&nbsp;cool&nbsp;stuff&nbsp;everywhere.<br />
James&nbsp;Morris&nbsp;wrote&nbsp;the&nbsp;TOS&nbsp;target,&nbsp;and&nbsp;tos&nbsp;match.<br />
Jozsef&nbsp;Kadlecsik&nbsp;wrote&nbsp;the&nbsp;REJECT&nbsp;target.<br />
The&nbsp;Netfilter&nbsp;Core&nbsp;Team&nbsp;is:&nbsp;Marc&nbsp;Boucher,&nbsp;Rusty&nbsp;Russell.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mar&nbsp;20,&nbsp;2000<br />
<br />
<br />
中文维护：杨鹏&#183;NetSnake</font></span><br />
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/199931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-12 09:08 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/12/199931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>耶鲁cas单点登录系统的php客户端使用注意事项</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/07/198897.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 07 May 2008 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/07/198897.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/198897.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/07/198897.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/198897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/198897.html</trackback:ping><description><![CDATA[以前用CAS一直是用java的客户端,今天想把自己的phpMyAdmin集成到中心认证系统中,这样就不需要到apache的目录中用access文件去控制了.<br />
在集成phpCAS的时候,系统报出一些错误:<br />
<strong>Warning</strong>:  include_once(DB.php) [<a href="https://localhost/phpMyAdmin/cas/function.include-once">function.include-once</a>]: failed to open stream: No such file or directory in <strong>/opt/httproot/phpMyAdmin/cas/PGTStorage/pgt-db.php</strong> on line <strong>11</strong><br />
<br />
<strong>Warning</strong>:  include_once() [<a href="https://localhost/phpMyAdmin/cas/function.include">function.include</a>]: Failed opening 'DB.php' for inclusion (include_path='.:/usr/local/php-5.2.5/lib/php') in <strong>/opt/httproot/phpMyAdmin/cas/PGTStorage/pgt-db.php</strong> on line <strong>11</strong><br />
<br />
<strong>Warning</strong>:  session_start() [<a href="https://localhost/phpMyAdmin/cas/function.session-start">function.session-start</a>]:
Cannot send session cookie - headers already sent by (output started at
/opt/httproot/phpMyAdmin/cas/PGTStorage/pgt-db.php:11) in <strong>/opt/httproot/phpMyAdmin/cas/client.php</strong> on line <strong>489</strong><br />
<br />
<strong>Warning</strong>:  session_start() [<a href="https://localhost/phpMyAdmin/cas/function.session-start">function.session-start</a>]:
Cannot send session cache limiter - headers already sent (output
started at /opt/httproot/phpMyAdmin/cas/PGTStorage/pgt-db.php:11) in <strong>/opt/httproot/phpMyAdmin/cas/client.php</strong> on line <strong>489</strong><br />
<br />
<strong>Warning</strong>: Cannot modify header information - headers already sent
by (output started at
/opt/httproot/phpMyAdmin/cas/PGTStorage/pgt-db.php:11) in <strong>/opt/httproot/phpMyAdmin/cas/client.php</strong> on line <strong>880<br />
查了些资料,重新安装了php后问题解决:<br />
1.在编译php的时候,要加上--with-curl, --with-openssl, --with-dom, --with-zlib这些选项<br />
如果系统中还没有安装curl包:<br />
wget http://curl.haxx.se/download/curl-7.18.1.tar.gz<br />
tar -zxvf curl-7.18.1.tar.gz<br />
./configure --prefix=/usr/local/curl<br />
make<br />
sudo make install<br />
编译安装php：<br />
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs&nbsp; --with-mysql=/usr/local/mysql/ --with-libxml-dir=/usr/local/libxml-2.6.30/ --with-gd=/usr/local/gd-2.0.35/ --with-curl=/usr/local/curl/ --with-openssl --with-zlib --with-pear=/usr/local/php_pear<br />
make<br />
make test<br />
sudo make install<br />
注意，有可能pear安装不成功，要看你下载的php包，安装完后到php源代码目录下的pear下看看是有有错，否则，要现下载一个pear的安装包：<br />
wget http://pear.php.net/install-pear.phar<br />
再执行make，make install<br />
<br />
2.安装PEAR:DB<br />
cd /usr/local/php/bin<br />
pear install DB<br />
<br />
3.测试phpCAS<br />
把phpCAS包里的example_simple.php以及source目录里的所有文件拷贝到一个可以从apapche执行php文件的目录中<br />
然后访问http://host/dir/example_simeple.php<br />
结果页面转向到https://sso-cas.univ-rennes1.fr的中心认证地址，说明phpCAS安装成功。<br />
</strong><br />
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/198897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-07 14:00 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/07/198897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高考作文[细雨湿衣看不见，闲花落地听无声]</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/06/198678.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Tue, 06 May 2008 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/06/198678.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/198678.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/06/198678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/198678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/198678.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Arial; font-size: 14px; line-height: 20px; ">题目：细雨湿衣看不见，闲花落地听无声&#8221;是唐朝诗人刘长卿在《别严士元》中的诗<br style="line-height: normal; " />
句。<br style="line-height: normal; " />
曾经有人这样理解这句诗：1、这是歌颂春天的美好意境。2、闲花、细雨表达了不为<br style="line-height: normal; " />
人知的寂寞。3、看不见、听不见不等于无所作为，是一种恬淡的处世之道。4、这种<br style="line-height: normal; " />
意境已经不适合当今的世界&#8230;&#8230;根据你的看法写一篇作文。题目自拟，体裁不限。字<br style="line-height: normal; " />
数800以上。<br style="line-height: normal; " />
<br style="line-height: normal; " />
正文：<br style="line-height: normal; " />
盛夏，夜，深夜。<br style="line-height: normal; " />
景山山颠。<br style="line-height: normal; " />
山上有人，两个人，一男一女。<br style="line-height: normal; " />
这两人就是当今武林名声最响的两位杀手，男的名秋细雨，女的叫叶闲花，江湖人称<br style="line-height: normal; " />
&#8220;细雨闲花&#8221;。<br style="line-height: normal; " />
诗人刘长卿曾用&#8220;细雨湿衣看不见，闲花落地听无声&#8221;来描述这两个可怕的杀手。细<br style="line-height: normal; " />
雨湿衣，湿衣的是鲜血；闲花落地，落地的是人头。这两人杀人来无影去无踪，如果<br style="line-height: normal; " />
他们想杀你，当你还没看到他们人影没听到他们声音的时候，你就已经死了。<br style="line-height: normal; " />
秋细雨三天前接到一份帖子，指名要杀叶闲花。事成之后，不但有三百万两冥币，更<br style="line-height: normal; " />
可以让他在&#8220;红楼梦中人&#8221;选秀节目中担任曹雪芹的角色！<br style="line-height: normal; " />
但是杀死叶闲花比杀死比尔还要困难得多。<br style="line-height: normal; " />
江湖中没有一个人清楚叶闲花的武功来历，性格脾气，但是每个人都知道叶闲花的故<br style="line-height: normal; " />
事。<br style="line-height: normal; " />
叶闲花有一双迷人的大眼睛，据说她曾一动不动地瞪死过赵薇和高圆圆，而那一年她<br style="line-height: normal; " />
才十七岁。<br style="line-height: normal; " />
叶闲花声音有如黄莺般幽婉醉人，传说听过她说话后林志玲身体酥麻了整整一年，你<br style="line-height: normal; " />
说要不要命？<br style="line-height: normal; " />
叶闲花轻功独步武林，踏雪无痕，落地无声，号称超过当年青翼蝠王韦一笑。有人见<br style="line-height: normal; " />
她上星期在高速公路上偷了刘翔奥运会入场证，刘翔追出一万公里最后被活活累倒。<br style="line-height: normal; " />
<br style="line-height: normal; " />
一般人听到叶闲花的故事早就吓得去买尿不湿了，但是秋细雨没有去买。<br style="line-height: normal; " />
秋细雨不是一般人。<br style="line-height: normal; " />
他知道，杀人不但要靠技术，还要拼人品！<br style="line-height: normal; " />
秋细雨很镇定，他正用一把指甲刀修整着手指甲，他的手指修长有力。<br style="line-height: normal; " />
他要等待，等待对方先沉不住气。高手相争，不允许一丝一毫的失误，先沉不住气的<br style="line-height: normal; " />
人就会露出破绽。<br style="line-height: normal; " />
致命的破绽！<br style="line-height: normal; " />
因此秋细雨一言不发，只是静静地玩弄着指甲刀。<br style="line-height: normal; " />
没想到叶闲花更是好整以暇，自己悠然自得地涂口红，喷香水。<br style="line-height: normal; " />
秋细雨只好先发制人，道：&#8220;你知道我找你出来是为什么。&#8221;<br style="line-height: normal; " />
叶闲花温柔道：&#8220;在我们动手之前，不能先谈谈么？&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;我是来杀人的，不是来聊天的。&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;你有把握杀我？&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;我从不做没有把握的事情。&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;我要提醒你一件事。&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;你说。&#8221;<br style="line-height: normal; " />
<br style="line-height: normal; " />
叶闲花道：&#8220;百晓生作杀手谱，小女子是杀手榜排名第一，阁下区区第二，你真能杀<br style="line-height: normal; " />
得了我么？&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;我也要提醒你一件事。&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;你说。&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;论杀手实力，我本在你之前，只是那次排名百晓生采用了短信投票系统<br style="line-height: normal; " />
，中国&#8216;花痴&#8217;人数过于庞大才让你得了第一。&#8221;<br style="line-height: normal; " />
叶闲花的脸色一变，道：&#8220;我更要提醒你，我的粉丝团叫&#8216;花粉&#8217;，不叫&#8216;花痴&#8217;！<br style="line-height: normal; " />
&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;我最后要提醒你，你的那些&#8216;花粉&#8217;全都是花痴。还有，我们已经跑题<br style="line-height: normal; " />
了。&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;我们这样拼命厮杀，你难道不怕麻烦么？&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;你以后再也不用怕麻烦了，天下只有一种人永远不怕麻烦，死人！&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;这么说你非逼我出手不可？&#8221;<br style="line-height: normal; " />
秋细雨没有回答，他已不用回答。<br style="line-height: normal; " />
秋细雨道：&#8220;亮兵器！&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;我用刀。&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;你用刀？刀在何处？&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;我就是刀！&#8221;<br style="line-height: normal; " />
叶闲花露出甜甜的笑容，忽然间褪下了自己的衣服，全身上下只剩下蕾丝比基尼和黑<br style="line-height: normal; " />
色丝袜。<br style="line-height: normal; " />
叶闲花的脸美得让人窒息，再配上这样的身材，这样的服饰，充满了一种原始的诱惑<br style="line-height: normal; " />
力。<br style="line-height: normal; " />
她的眼睛会说话，她的媚笑会说话，她的手，她的胸膛，她的腿&#8230;&#8230;她身上每分每寸<br style="line-height: normal; " />
都会说话。<br style="line-height: normal; " />
她知道，只要是个不瞎的男人，现在肯定会被她迷得神魂颠倒。<br style="line-height: normal; " />
秋细雨是个男人，而且是个不瞎的男人。<br style="line-height: normal; " />
可他现在却偏偏好像瞎了一样，完全无动于衷。<br style="line-height: normal; " />
他知道，美丽的女人是一把刀，当你沉醉的时候，刀就会切进你的胸口。<br style="line-height: normal; " />
秋细雨沉吟道：&#8220;我只想问你一件事。&#8221;<br style="line-height: normal; " />
叶闲花娇笑着：&#8220;请讲。&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;大夏天的，穿这么少你丫不怕蚊子叮啊？&#8221;<br style="line-height: normal; " />
叶闲花沉默了半晌，幽幽地道：&#8220;你一定以为刚才我在喷香水，是不是？我告诉你，<br style="line-height: normal; " />
我喷的是六神花露水！&#8221;<br style="line-height: normal; " />
叶闲花又道：&#8220;不过这不是普通的六神，是我特别提炼的药水，无色无味无毒，不过<br style="line-height: normal; " />
却会慢慢扩散在空气中，闻到它的人会四肢麻痹不能动弹。&#8221;<br style="line-height: normal; " />
秋细雨一惊，忽然觉得身体已经麻木不听使唤，不由得一身冷汗。<br style="line-height: normal; " />
叶闲花又道：&#8220;你以为我和你扯淡是因为我害怕，以为我脱掉衣服是想色诱你，其实<br style="line-height: normal; " />
这都是为了拖延时间让药水能扩散到你周围。&#8221;<br style="line-height: normal; " />
秋细雨面上不动声色，道：&#8220;难道你自己不怕药水的厉害？&#8221;<br style="line-height: normal; " />
叶闲花得意地道：&#8220;一开始我涂的口红就是解药，所以我仍然可以自由行动。&#8221;<br style="line-height: normal; " />
叶闲花逼视着秋细雨，问道：&#8220;现在你还认为你能杀了我么？&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;我能。&#8221;<br style="line-height: normal; " />
<br style="line-height: normal; " />
叶闲花道：&#8220;你不能动而我能动，你却能杀了我，这不是很好笑么？&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;是很好笑，但是你一定会被我杀死。&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;为什么我会被你杀死？&#8221;<br style="line-height: normal; " />
秋细雨忽然反问道：&#8220;飞刀能不能杀人？&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;好像能。&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;我有没有手？&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;的确有。&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;我手上有没有刀？&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;你手上好像只有指甲刀。&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;足够了。&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;足够了？&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;我有手有刀，就能置人死地。&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;指甲刀也能杀人？实在可笑！&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;以前江湖中有七十三个人觉得我这把指甲刀很可笑。&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;现在呢？&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;现在人都已死了，死在这把刀下。&#8221;<br style="line-height: normal; " />
叶闲花道：&#8220;你的手还能动？&#8221;<br style="line-height: normal; " />
秋细雨道：&#8220;你要不要试试？&#8221;<br style="line-height: normal; " />
叶闲花脸上的笑容渐渐凝固，忽然间，她已出手！<br style="line-height: normal; " />
一招&#8220;冒牌九阴白骨爪&#8221;直逼秋细雨天灵盖，这一招她已练过七年四个月零二十九天<br style="line-height: normal; " />
，她完全有把握相信没有任何人可以抵挡得了这一招。<br style="line-height: normal; " />
可这一次她错了。<br style="line-height: normal; " />
刀光一闪，&#8220;盗版小李飞刀&#8221;已插入她的咽喉。<br style="line-height: normal; " />
她到死也不相信，一把指甲刀可以要了她的命！<br style="line-height: normal; " />
闲花终于落地！<br style="line-height: normal; " />
三个时辰后，药水的药效渐渐淡去，秋细雨终于可以动弹了。<br style="line-height: normal; " />
望着叶闲花的尸体，秋细雨道：&#8220;虽然你已经死了，但是我还要告诉你两件事。第一<br style="line-height: normal; " />
，我一直用甲刀修整着手指甲是为了调整手和刀之间的同步率，说白了就是找手感。<br style="line-height: normal; " />
第二，我杀你的真正目的不是为了钱或者名利。&#8221;<br style="line-height: normal; " />
一边说，秋细雨一边从叶闲花衣服的口袋里搜出了刘翔的奥运会入场证。<br style="line-height: normal; " />
秋细雨坚定地说：&#8220;我爱北京，我要看奥运！&#8221;<br style="line-height: normal; " />
从此，再也没有人见过秋细雨。</span>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/198678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-06 13:19 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/06/198678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2007年高考零分作文片段</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/06/198676.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Tue, 06 May 2008 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/06/198676.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/198676.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/06/198676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/198676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/198676.html</trackback:ping><description><![CDATA[<span  style="color: #333333; font-family: Arial; font-size: 13px; line-height: 18px; ">
<p style="margin-top: 7px; margin-bottom: 7px; overflow-x: auto; overflow-y: auto; "><font size="4">　　看，还是不看？这是个问题。看，对不起父母、社会；不看，对不起自己。武藤兰姐姐，你说我到底该怎么办呢？<br />
<br />
　　——上海卷：《必须跨过这道坎》</font></p>
<p style="margin-top: 7px; margin-bottom: 7px; overflow-x: auto; overflow-y: auto; "><br />
<font size="4"><br />
　　传递？很抽象的一个东西。我是个天才，就用传统的《说文解字》来论证它。传，从人从专。偶的神啊，这不是独裁者吗？递，从走从弟，这个意思是——从前有个人&#8230;&#8230;下面没有了。现在我们中有很多人，除了拼搏高考，什么都不做了&#8230;&#8230;瞧我的乌鸦嘴。<br />
<br />
　　——广东卷：话题作文《传递》<br />
<br />
　　我们头上的灿烂星空？谁出的题啊？现在的星空还灿烂吗？怎么不改成美丽的太湖水呢？这个比较有现实意义。闲话少说，还是要写作文，现在来论证怎么能够看见头上灿烂的星空：拿一个大棒子，狠狠地打在头上。<br />
<br />
　　——江苏卷：《我们头上的灿烂星空》<br />
<br />
　　&#8220;打雷了，下雨了，收衣服了！&#8221;唐僧哥哥这样说。2007年北京的第一场雨就这样来了。悟空当时在和紫霞姐姐约会，突然下雨了，悟空拿出自己的棒子，一下子向老天捅去。&#8220;悟空，叫你不要把你的棒子晃来晃去，乱插到人不好！就算没有插到人，插到天空中飞行的小鸟也是不行的！这孩子真顽皮，再不听话，我就要把紧箍咒念！&#8221;<br />
<br />
　　——北京卷：对《春夜喜雨》的不同评论写作文<br />
<br />
　　行走在消逝中？怎么可能！行走和消逝，那个谁谁谁，站出来走给我看！我只是想说明一个问题，做学问要认真，不要把学问当儿戏。我们为了这次高考可是下了好多的功夫的。你们这样草率，简直对不起我们的父母。<br />
<br />
　　等着，我的私人律师待会儿会给你们打电话！<br />
<br />
　　——浙江卷：《行走在消逝中》<br />
<br />
　　看着这个题目，心里很沉重。为什么现在高考居然掺入了商业的元素呢？悲哀！<br />
<br />
　　——辽宁卷：话题作文《我能》<br />
<br />
　　《提篮春光看妈妈》？第一眼，以为老眼昏花，没有想到居然就是这个题目。关于这个内容，该怎么写呢？首先，用竹篮子怎么装着光呢？没有听说过&#8220;竹篮打水一场空&#8221;吗？水尚且如此，何况春光乎？其次，看妈妈为什么要提篮春光呢？为什么不提什么&#8220;脑白金&#8221;呢？再次，妈妈是世界上最伟大的人，一篮春光能够代表我们的爱吗？本人认为题目还不如改成《烛光里的妈妈》。<br />
<br />
　　——安徽卷：《提篮春光看妈妈》</font></p>
</span>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/198676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-05-06 13:11 <a href="http://www.blogjava.net/jjwwhmm/archive/2008/05/06/198676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中国的未来到底在哪?</title><link>http://www.blogjava.net/jjwwhmm/archive/2008/05/05/198347.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 05 May 2008 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/archive/2008/05/05/198347.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/198347.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/archive/2008/05/05/198347.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/198347.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/198347.html</trackback:ping><description><![CDATA[作者吴冕写的"<a href="http://alexclark.itpub.net/post/670/412383">到底谁在抛弃中国</a>"<br />
<br />
<p><font size="4">我觉得我有必要为中国写点东西了。 <br />
　　虽然我一向标榜远离政治，对所谓的世界大势有一种与生俱来的失望。但最近的很多很多事情，还是让我觉得有某种东西如梗在喉，不吐不快。 <br />
　　我厌恶评论，因为评论家大多只是坐而论道的好手，一旦起而行之，则捉襟见肘。站着说话不腰疼，固然很惬意。我知道有一天我也许会因为我说的这些而打了自己的嘴巴。 <br />
　　但我还是决定要说<br />
　　我知道，也许我也不能把这座房子建的更好，但希望我说的话，能够给别人一些启示或者思索，这些启示或者思索中，也许就有建房子的高手呢。 <br />
　　我今