Profilo di 家恒和你在一起BlogElenchiGuestbook Strumenti Guida

Blog


31 ottobre

捅破的窗户纸-读《如何阅读一本书》

    这是最近刚看完的一本书,只是粗略的看了一遍,能用四个字形容“相见恨晚”。呵呵,虽然有点夸张了,不过不管怎么说还是学到不少东西,更重要的是解决了一些多年来的一些疑惑。

    其实书中讲的东西都是我们已经学过的了,而且是很早就已经学过的,只不过早就被我抛到脑后而已。书中说什么了?中心思想、主旨、段意、关键词、关键句……哈哈,是不是很眼熟啊。无语中......

    这些东西是我们小学就在学的了,而且学了这么多年,遗憾的是,自从告别语文以后我就在也没有接触过、使用过这些东西,而这些确又恰恰是读书中不可缺少的。唉,以前只学了怎么做,确没有学到什么时候去做?什么情况下去做?什么时候改做什么?如何使用这些阅读技巧。看完这本书才知道自己白学了这么多年语文。呵呵,好在让我看到了。

    遗憾这么半天,说点实用的。面对信息爆炸的时代,书中几点建议对我们的所有人都是很有帮助的。

    1. 拿来一本书有几点要做的:先看书名,如果有序先看序。很多精华的东西往往存在于序里面,其中也包含了书的中心,面对的读者等;研究目录。目录是一本书的大纲,同时也是内容简介;挑几个跟主题相关的看看。确实,目前市面上的书质量不一,好书才值得用心去读。
    2. 书不是只读一遍的,特别对于难读的书。所谓“一回生,二回熟”,一本书第一遍要粗略读一下,找到书的中心以及作者要解决的问题。对于难读的书更是,碰到难的部分可以不用太关心细节,可能以后再读时,就有新的体会。
    3. 带着问题读一本书。整体来说,这本书在谈什么?作者重点说了什么,怎么说的?这本书说的有道理吗?全都有还是部分有?这本书跟你有什么关系
    4. 做笔记。圈圈划划,再回来读的时候可能会有帮助。

    上面几点是我个人觉得自己读书时需要加强的地方。这本书还谈了深入阅读一本书的方法(分析阅读)、综合阅读一类主题的很多书的方法(主题阅读)以及阅读不同题材的书时需要注意的问题。

29 ottobre

搜索时代的tag

    tag不是一个新名词。或许很久以前就有人在用了。然而目前,面对海量的信息,tag在互联网上的重要性越发突显。

    最近用到一个记笔记的软件,EverNote。其与微软的OneNote类似,但是个人认为它的分类做的要更好一些。对比两个两个软件,你就会发现其中的问题所在。OneNote是一种传统式的先分类再记笔记的方式,也就是说你要记那类的笔记必须先给这个笔记分好类,进入相应的类别文件夹下面,才能开始比较。相反,EverNote的笔记很直观,上来就可以新建。等笔记完成以后,在进行分类。说白了,就是写完以后,在给笔记打上tag。这样的好处用写程序的话来说,就是把“记笔记”与“分类”在时间上分离。记笔记的时候可以专心笔记,整理的时候再专心分类。

    说上面只是想说一下分类的两种方式。一种是自上而下,先有大类、再有子类、然后再有子类的子类,这样的结果是,要把东西、内容分类,就必须知道整个目录结构;而另一种分类方式则是自上而下,先有内容,在把内容对应到相应的类别。后一种可以理解为我们所知道的tag。tag的优势就在于他的随意与平民划。一篇文章可以打上不同的tag,因为同一篇文章可能属于多个领域,其次,tag使得分类不是由专业人士(或者专门的部门)来完成,充分发挥了整个互联网众多网民的优势。

    搜索这当前我们这个时代的热门话题。面对海量的信息,没有搜索的互联网是不可想象的。但是,目前一个很麻烦的问题就是,搜索出来的结果是否就是我们想要的结果呢?答案是否定的。试试google、baidu就知道,搜索只能划定一个信息的范围,而搜索出来的信息是否有信息量则必须让使用者一一过滤了。所以目前的问题是,如何才能精确的定位信息呢?

    于是这里,我们想到了tag。tag起初只是为了文章更方便的被索引和被查询,但是当del.icio.us365key这样的基于tag的网站的出现,tag发生了质的变化。tag不尽是一种分类手段,也成为了评价一篇文章或者内容好坏的基点。道理显而易见:质量越高的文章,就会被越多的人打上tag,也就是说被其收藏或者链接。

    所以,当搜索与tag相结合的时候,是不是可以从某种程度上更为精确的定位信息?del.icio.us、365key只是以网站的形式给出了一个平台,他们的数据也只是网站使用者所提供的很小一部分数据。不过,想想google、baidu等,有着整个互联网的数据。他们所要做的只是追踪一下某篇文章的被链接的情况,被链接的越多,则代表着文章的价值。当然,细节远比这复杂。

    tag充分发挥了互联网人的价值,它从人的角度出发确定了一篇文章的价值,而搜索则从关键字的角度出发。当两个东西结合的时候,搜索划定了范围,tag确定了价值,呵呵,新时代的搜索将会焕然一新!

    再想远一点。tag做的只是对子类类别的判断,如果谁能够对互联网信息建立一个比较完善的信息分类结构,自动把tag好的子类划分到相应的大类别下面去,那么对于信息分类是不是又能更进一步呢?想想那个2、8定律,其实搜索引擎只要能对很少一部分但是很精华的信息进行tag、分类,那么这个分类的结果能发挥的作用应该会是巨大的。  

27 ottobre

客户端用https连接服务器的一点心得

   项目需要用https与服务器进行连接,获取系统需要的一些配置参数。以前是用http进行连接的,客户端代码比较简单,直接使用URL类进行连接并获取输入流即可。试着在浏览器中输入相应的https连接地址,提示证书确认,确认以后就访问到内容了。

   改成https以后碰到了一些问题。原以为Java可能已经封装好了,所以把直接把原来的http连接改成https,结果抛出异常:java.lang.UnsupportedClassVersionError: test/url/URLTest (Unsupported major.minor version 49.0)。查了一下,是JVM不支持这个协议(《java网络编程》上有说明)。换了一个jdk,这个问题好了。调用vurl.getProtocol()可以获取相应的协议了。

   接着出现了第二个异常:javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty。没办法,接着google,发现这个问题跟安全连接的证书有关(安全方面的东西不是很了解,只知道这个公钥,用于验证)。查了一下,jdk果然提供了跟证书相关的东西。首先要从服务器那得到证书,想了一下,ie好像可以。试着用ie连接地址,然后出现了证书确认的提示框,点击查看证书-详细信息,点击复制到文件,选择base64编码,导出后就可以用记事本打开了,大概样子如下:

-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQS6WuWd7dHMeAfIkikfDiQzANBgkqhkiG9w0BAQQFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wNjA1MTUyMzE4MTFaFw0w
j8thQJ7StDhAISTBTx/LE0qPlQLfkT3WQOsRb5sQoW/OkV4w9m0TXhWkLsIYngDD
2DJnR/y4HprZmo7M/3wStwO/UiDPIfTzd90SFfCU+pDV41logQ==
-----END CERTIFICATE-----

不用动这个文件,以后直接导入即可。

PS:如果已经点击了证书的确认,可能浏览器就直接打开链接了。这样情况下,可以接着点击ie有下脚的“”形符号,即可看见证书。证书搞到手了,接着要然Java环境能够认识它。这里调用的是jdk带的一个exe,keytool.exe(%JAVA_HOME%/bin下有,所以配了java环境变量的话直接能在命令行调用了)。这里我们输入导入命令即可:

%JAVA_HOME%\bin\keytool -import -file service.crt -keystore D:/test/urltest/crt

三个参数分别代表:导入操作,导入的证书文件,导入证书存放的位置(PS:这个路径可以使用相对路径也可以是绝对路径,但是相对路径我没有实验成功)。导入过程中会提示用户输入密码,这个密码随便就行,不过位数不能太少:)

   证书是导入成功了,但是问题ms还是没解决,新的异常出现了:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

没辙,接着google,还好问题不是很麻烦。上面虽然生成了证书,但是还要告诉程序证书的具体位置,涉及一个系统变量要配置。在程序中加入一句话即可:System.setProperty("javax.net.ssl.trustStore","D:/test/urltest/crt");或者在运行java时加入参数:-Djavax.net.ssl.trustStore=D:/test/urltest/crt.

   做了这么多,这个时候是黎明前最黑暗的时候。最后这个问题搞了2小时.......

   异常:java.net.UnknownHostException: 222.222.222.222。没啥好说了的,google。找来找去,找到一个blog说了这么一句:在生成证书的时候会提示你“你的姓名”,这里别写你的名字,而要写一个ip或者一个你对应网站的网址。抛出的异常提示的错误确实是我的https请求中的ip,这样的话可能是此ip和证书中的“名字”不相同造成的。再次使用ie打开证书,在“常规”里面,看到这么一个东西(我直接用https://mail.google.com试的,因为连它的时候没有出现任何证书确认)

   颁发给:www.google.com

找到url了,打开我的证书,哈哈,确实也有这么一个东西,爽。

   更郁闷的来了,url是找到了,可是,此url是个无效的地址.......输入到ie中返回无法连接。这下知道为什么google不用确认而这个证书需要确认了。因为此url连不通。怎么办?天无绝人之路,还是让我找到了。其实现在我要做的就是一个域名和ip绑定的问题,但是这个绑定不是DNS来做,而是本机(windows系统)来做。查了一下,果然有,就在C:\WINDOWS\system32\drivers\etc下有一个host文件,打开它,可以看到这么一行

127.0.0.1 localhost

^_^,原来localhost是这样绑定127.0.0.1的啊,如此就好。我试着加入一行

222.222.222.222 www.sample.test

把原来的https连接的ip换成了那个域名,OK!问题搞定,连接成功。

后记:

在整个调试过程中我一直使用 https://mail.google.com 做为参照来调试。使用这个url的话至于jvm支持,就能直接连接。出现上面的后几个异常,估计都是与域名有关。因为这个域名是一个DNS不能识别的。


这两天朋友使用时又发现这样一个异常:sun.security.validator.ValidatorException: No trusted certificate found   这个异常也是由于没有找到证书造成的,看看证书的路径设置对不对
24 ottobre

两代人

    很久没给老人们打电话了。昨天拿起电话,突然有一种想家的感觉,有点控制不住自己的眼泪。呵呵,不知道为什么,或许这就是一种牵挂吧。熟悉的声音、熟悉的语气,还是那几句问候,不过这次却是特别的温暖:)

    两代人,隔了半个世纪,彼此牵挂......

    爷爷那句:放心吧,我们会好好照顾自己的。一句历来都是我说的话,此刻却从老人口中说出。呵呵,话是简单。但对我确实一种前所未有的责任!

    好好照顾自己!!!

22 ottobre

人生的圆圈

大约10年前,我在一家电话推销公司作为业务员接受培训。主管有一次在培训课上用图诠释了一个人生寓意。他首先在黑板上画了一幅图:在一个圆圈中间站着一个人。接着,他在圆圈的里面加上了一座房子、一辆汽车、一些朋友。

    主管说:“这是你的舒服区。这个圆圈里面的东西对你至关重要:你的住房、你的家庭、你的朋友
,还有你的工作。在这个圆圈里头,人们会觉得自在、安全,远离危险或争端。”

    “现在,谁能告诉我,当你跨出这个圈子后,会发生什么?”教室里顿时鸦雀无声,一位积极的学员打破沉默:“会害怕。”另一位认为:“会出错。”这时主管微笑着说:“当你犯错误了,其结果是什么呢?”最初回答问题的那名学员大声答道:“我会从中学到东西。”

    “正是,你会从错误中学到东西。当你离开舒服区以后,你学到了你以前不知道的东西,你增加了自己的见识,所以你进步了。”主管再次转向黑板,在原来那个圈子之外画了个更大的圆圈,还加上些新的东西,如更多的朋友、一座更大的房子,等等。

    “如果你老是在自己的舒服区里头打转,你就永远无法扩大你的视野,永远无法学到新的东西。只有当你跨出舒服区以后,你才能使自己人生的圆圈变大,你才能把自己塑造成一个更优秀的人。”

摘自:新华网广东频道

北京的一大奇观

    早晨来公司,路上看见一列马车,大概有10来张,排成一列跑在公路上。煞是壮观啊!后面的公交车在不停按喇叭,有点搞笑......一直都觉得挺奇怪的,这些马车怎么跑过来的,呵呵。估计也算是北京的一大特点吧:)

14 ottobre

快速搞定环境变量

    每次重装机器(Windows)都要设置环境变量,一直以来都想找一个快捷的方式一下把所有环境变量都设了的方法。本来以为一个“set”命令能搞定,但是发现这样只能在当然的dos窗口中有用,不能改变系统的环境变量......

    不过还是被我找到了,虽然麻烦一点,总可以一劳永逸了:)

    这里是一段用于设置系统环境变量的vb脚本(个人不懂vb,不过Windows貌似天生可以执行vb,这就方便了):

'setEvn.vbs
'运行方式 cscript //NoLogo setEvn.vbs JAVA_HOME C:/java
'==============================================
Set unNamedArguments = WScript.Arguments.UnNamed
Call SetEvn(unNamedArguments.Item(0) , unNamedArguments.Item(1))

'设置环境变量
'--------------------------------------------------------------
Function SetEvn(strName,strPath)
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery( "Select * from Win32_Environment where name = 'SNC_LIB'")
Found = False

For Each objItem in colItems
If UCase(objItem.Name) = strName Then
Found = True
objItem.VariableValue = strPath
objItem.Put_
End If
Next

If (Found = False) Then
Set oEvn = objWMIService.Get("Win32_Environment").Spawninstance_
oEvn.Name = strName
oEvn.VariableValue = strPath
oEvn.SystemVariable = True
oEvn.UserName = "<SYSTEM>"
oEvn.Status = "OK"
Set oPath = oEvn.Put_
End If

End Function

    运行cscript setEvn.vbs JAVA_HOME C:/java 即可。其中,蓝字为此vb文件的文件名,红字部分为两个运行时的参数。这样就可以设置环境变量 JAVA_HOME=C:/java 了。可以再写一个bat,把自己想要设置的所有环境变量都放进去,哈哈,这下省事了~

07 ottobre

一个不错的UML工具

    朋友问我有没有什么好使的UML工具,想起这个了——JUDE。一个不错的UML工具。很小巧,但是方便实用,目前程序设计上需要用到的图基本上都能提供了,仅5.1M。提供Community版和Professional版。Community版免费,注册一个账户就能下载了,功能上也完全够用。

    祝大家以后不用再去找Rose~ 哈哈

JMeter试用手记

     JMeter是一款性能测试工具。个人认为与其说他是一个工具,不如说他是一个框架。因为JMeter的支持范围非常广,目前常见的需要进行性能测试的应用几乎都能应用(如:files, Servlets, Perl scripts, Java Objects, Data Bases and Queries, FTP Servers)。JMeter的一大好处就是它内部已经有实现好的线程机制,用户不用写任何关于并发的东西,只需做简单配置即可。同时他页提供了一些类似插件的东西,用于线程运行时的控制;其次,JMeter对测试结果能都产生相应的统计报表,简单、直观,对一般性能测试应该足够。

  1. QuickStart
    下载下来的JMeter有以下几个目录 bin  docs  extras  lib  printable_docs。bin自不用说了,运行下面的jmeter.bat就可以看见JMeter的GUI客户端了,可以对测试进行所有的配置。docs下面的是JMeter的所有用户手册,还算详细,一般需要的都能查到。可惜没有中文的,英文需要多花点时间。extras下为JMeter对Ant的一些支持。太具体的不是很清楚,不过生产报表这部分必不可少。运行测试时,可以把测试的所有数据记录下来,JMeter自动生成一个.jtl的文件。把此文件放到extras下,运行ant -Dtest=文件名 report,即可生成测试统计报表。lib目录下还有两个目录,一个是ext,此目录存放用户对JMeter进行扩展的测试应用,一个是junit目录,此目录没用到,不是很清楚。安装文档中的说法,ext目录存放对JMeter的扩展,用户的扩展所依赖的包则要直接放在lib下(不是lib/ext下)。
  2. 主要插件
    线程组为JMeter的主要插件,其内部实现好了多现在,用户只要添加、配置即可。



    以下为线程组的配置界面:
     
    如同所示,可以配置线程数,前一个线程与后一个线程启动间隔,以及线程的循环次数。

    配置元件
    为所有JMeter可以使用的应用,JMeter提供了一些基础配置。如图:
                      

     

    监听器为测试过程中收集数据的。而且可以根据数据生成相应的报表(文字、图形等)
     

    逻辑控制器用于对线程的运行逻辑进行控制.
     
  3. Sample

    这里我用到主要JMeter的线程和报表,扩展了他的“Java请求”这个应用类别。要扩展此应用,要用到lib/ext/ApacheJMeter_java.jar,他封装此应用。

    首先,需要继承ApacheJMeter_java.jar中的抽象类AbstractJavaSamplerClient,它提供了四个抽象方法:void setupTest(JavaSamplerContext arg0),SampleResult runTest(JavaSamplerContext arg0), void teardownTest(JavaSamplerContext arg0), Arguments getDefaultParameters()。setupTest和teardownTest与JUnit中的类似,分别在测试的开始和结束时执行。runTest为主要测试方法,所有测试程序都在这里完成,JavaSamplerContext参数封装测试中需要的所有外界数据(如配置信息等)。其SampleResult封装了所有测试结果(如:测试是否成功?程序执行时间等),getDefaultParameters用于把测试的一些默认数据在程序运行前显示到JMeter客户端,这个可以和runTest配合使用,实现数据的呈现和配置。

    下面为程序:

    import org.apache.jmeter.config.Arguments;
    import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
    import org.apache.jmeter.samplers.SampleResult;

    import com.ebupt.wv.client.WVClient;

    public class Login2 extends AbstractJavaSamplerClient {


    private static String label = "userLogin"
    private String name;
    private String address;


    public void setupTest(JavaSamplerContext arg0) {
         System.out.println("setupTest");
    }

    public SampleResult runTest(JavaSamplerContext arg0) {
         name = arg0.getParameter("name");
         address = arg0.getParameter("address");
         SampleResult sr;
         sr = new SampleResult();
         sr.setSampleLabel(label);
         try{
               sr.sampleStart();  //记录程序执行时间,以及执行结果
               sr.setSuccessful(true);
               System.out.println("send over!");
         }catch(Throwable e){
              sr.setSuccessful(false);
         }finally{
              sr.sampleEnd();
         }
         return sr;
    }

    public void teardownTest(JavaSamplerContext arg0) {
    }

    public Arguments getDefaultParameters() {
         Arguments params = new Arguments();
         params.addArgument("name", "JMeter");
         params.addArgument("address", "localhost");
         return params;
    }

    }

    其次,把写好的应用打包,放到lib/ext下,JMeter运行时即可找到。同时还要把用户自己编写的应用所依赖的包放在lib下。运行JMeter。界面打开后,右键“测试计划”,添加线程组;右键“线程组”-添加-Sampler-Java请求,在类名称处选择刚才写好的类。
    如图:


    这里,可以同时添加多个线程组、多个java请求、同时可以添加监听器用于输出不同的的测试结果图形、报表,各个请求之间可以用逻辑控制器进行执行流程的控制。如图:
     

    最后,点击运行-启动,保存相应的项目,即可开始运行。运行时的数据,可以通过监听器写入文件以便需要时生成报表。

  4. ant使用
    在运行JMeter项目前,会让用户保存项目,保存为.jmx文件,把此文件放到extras目录下,即可使用ant实现测试的自动化。ant有以下几个命令:
    ant -Dtest=项目名称    运行项目并生成报表。
    ant -Dtest=项目名称 run    只运行项目。
    ant -Dtest=项目名称 report  只生成报表(这个需要把测试时记录下来的.jtl文件放到ant目录下)

    报表如下:
     

PS:感觉网上能找到的关于JMeter的东西不是很多,这有篇不错的文章,介绍性能测试的。JMeter个人用的也不多,只用了其中很少一部分功能。更多的,要大家共同补充~

Live Space的写作工具

    前天打算写一篇。第一次,边写边在装东西,写了一半,刚好也装完,突然弹个对话框出来,没细看,直接点了确定......机器重启了,白忙活了半天。ft。第二次,机器重启完,不甘心,刚才写的也还有个印象,接着重头来。又是写了一半,靠,一个不小心把当前页关了......崩溃了。放弃吧:(

    今天来了,第一件事就是先找一个写blog的工具,然后设定成1分钟保存一次。呵呵,被我找到这个东西了,没想到还是ms的。应该会比较好用。麻烦一点的是,还要安装.net framework

    小发一篇测试一下~

03 ottobre

朝着未知的希望

        最近在准备马拉松,一天跑上十几圈。几天下来,发现一个问题,如果我把今天的目标定在10圈,那么我在跑完10圈以后一般就不会再跑了,如果再跑我会很难受。但是,如果我把目标定在20圈,我也一样能跑下来。现在的问题是,我到底能跑多远呢?以前参加过马拉松,说明我能跑42公里,那再远呢?42.5?43?行吗?我应该把目标目标定成是多少呢?
        这让我想起一个故事,说的是二战的时候一位美国的将军被俘虏了,但幸运的是最后他挺过来了。当记者问他您是靠什么撑过那段时期的呢?他的回答是:我相信我们没有活下来的希望了。他还解释到,与他一起被俘虏的人中,没有活下来的往往是那些报有很大获救希望的那些人。他们相信他们明天就能被救,然而日子一天天过去,他们日渐消沉,最终没有挺过来。
        所以,希望是什么呢?是一个目标、是一个你永远也不知道是否能够达成的目标、是你生活的动力。因而,如果你知道你如何能够达成你的希望,那么此时的希望就已经不再是希望,而成为了你前进的绊脚石。成为了你突破自己的限制。
        所以,我的目标不是10圈、不是50圈、不是100圈、也不是42公里,我的目标是我脚底下的每一圈,而我的希望就是那远方的地平线~