2008年2月20日

zz 怎样避开10个最损耗你精力的元凶

原作者: K. Stone 原文 译者: 思齐

Link: http://feed.yeeyan.com/articles/view/siva/4892

这篇文章告诉你怎样防止疲倦,保持旺盛的精力

 

让我们面对现实吧.如果你试图在生命中成就任何事 -- 工作,养家,或者仅仅是娱乐,你都需要精力.我们陷入情绪低潮,或者效率低下, 多半是因为我们能量不足. 奇怪的是,很多人自愿让自己受制于那些使人筋疲力尽的事物. 下面的清单告诉你10个最会导致你疲倦的元凶,以及怎样避免它们.

1。缺乏睡眠

不会吧? 我们怎么会睡眠不足?睡眠必须是我们的头等大事,你应该让自己重视起来。不是每个人都需要8小时的睡眠,但是有些人确实需要。怎么样才能知道你需要多少睡眠? 试验。Steve Pavlina 建议我们每天在同样时间醒来,累的时候就去睡觉,根据你第二天的表现来判断你需要的睡眠时间长短。如果你整天都精神不振,耷拉着眼皮,那么说明你睡眠不足。如果你大部分时间都很精神,那么你的睡眠时间就正好。

2。糖

避免糖分。如果你必须要吃甜的东西那么和纤维质一起食用。纤维质会减缓血液对糖分的吸收。 大部分水果都同时拥有糖分和纤维质。 下次你吃甜点或者喝碳酸饮料时,当心你在接下来30到60分钟内精力的下降,准备好应付打瞌睡的欲望吧。

3。咖啡因

别恨我,但咖啡因是个大大的谎言。 这只是很简单的物理法则:每个作用力都有反作用力。咖啡因的作用也是这样。 起初你会觉得充了电,但是过后你就会疲倦,失眠,或者过于兴奋。当然这取决于个人的选择,但是包括我在内很多人都从减少或者杜绝咖啡因的摄取中获益。

4。缺乏锻炼

不用则废。你的肌肉存储能量,为你提供精力。 尤其是有规律的锻炼,比如每天20到30分钟, 会让你精力十足。还有个简单的方法是每工作一小时站起来休息5分钟,伸展一下你的肢体,四处走动一下。如果你觉得昏昏欲睡, 就运动一下来让你的血液加速吧。 不过如果你某天觉得筋疲力尽,那还是好好睡一觉吧。

5。供氧不足

大部分情况下我们大多进行浅层次的呼吸,这使我们不能得到足够的氧气来帮助燃烧我们体内的能量。深呼吸还会促进淋巴系统内液体的流动。你的淋巴系统会排毒,好让你的身体有空去做更重要的事。 每天两到三次,花5分钟时间做10个缓慢深长的呼吸。慢慢的吸气,稍微摒住,然后缓慢地呼出。你会为效果感到惊奇的!

6。精加工的食物

水果和蔬菜类的新鲜食物吃得越多,你就越生龙活虎。尽量吃健康食品:全麦谷物,水果,蔬菜,瘦蛋白[注:一般指不含皮的鸡肉,鱼肉,低脂奶制品,豆制品],以及在三文鱼,核桃,亚麻籽和橄榄油中存在的有益的脂肪。

7。缺水

这通常是个被人忽视的要素。如果你的水分摄入不足,流向你身体包括大脑在内各个器官的血流会减缓,让你感觉疲倦。至少要保证摄入的水分足够补充你日常消耗掉的部分。水的需求量因人而异,尽管人们嘲笑一天八杯水的理论,这确实是个简单有效的法则。要注意的是你的水分来源可以是果汁或者其它饮料,但是含咖啡因的饮料会让你的身体脱水,你得补充更多才行。所以保险起见,还是喝更多的水吧。

8。压力

生活中压力无处不在,但我们大多让日程表塞满从而使自己压力更大。不要试图什么都做。找出对你最重要的事去做,去掉其它的。调整你的日程表,学会说不。试着做冥想。仅仅每天一到两次10到20分钟的冥想会大大减轻你的压力水平。如果你在一天当中陷入低潮,一个“冥想小睡”会让你恢复精力。另一个让你减压并且快乐的方法是保持感恩的心情,提醒自己更关注已经拥有的那些宝贵的东西(而不是没得到的那些)[注:原文keeping your internal voice focused on the glass being half full]。

9。长期慢性的疼痛

日常生活中的头疼脑热很多,比如背疼,或者太紧的鞋子引起的脚疼。问题是我们已经渐渐习惯了它们,很多人就让它去了,但这些小毛小病在掠夺我们的精力。关注你的身体,找出那些让你每天都会承受的疼痛并解决它。比如,假如你每天晚上回家脱下鞋子的时候都觉得放松了很多,那你就应该换双舒服点的鞋子。如果你有坐骨神经痛,你最好开始做一些简单的伸展练习比如触碰脚趾之类。如果你的膝盖疼痛并且超重的话,那么该考虑减肥了。其它消除小疼痛的方法包括伸展运动,按摩,针灸,或者找个专门的医生。

10。讨厌的人

让人心生厌恶的人也会夺去你的能量。你可以做的事有:尽量少与消极负面的人相处,保证不与他们交往。不要和他们斗争,不要指望他们变好。试着对他们培养怜悯之情,也许他们的让人厌恶之处只是他们生活中遭受到的痛苦的反应 -- 不得不与他们相处时记得注意这点。与人和善,鼓励自己每天都和积极向上的人在一起。

2008年2月19日

学习单元测试

说到单元测试,我想很多朋友都听说过或者学过一点,但是真正贯彻执行的少之又少。我也是这样的 :)

为什么需要再学习一下单元测试呢?因为我现在正在进行的项目中遇到了很多的Bug,当然称之为Bug也不完全对,因为在最初编程的时候没有考虑到会出现这些情况。我想通过一种方法来加速我完成项目的时间以及提高完成代码的质量。

忽然在Yiyan上看到这样一篇文章《实践的一小步-代码质量的一大步》,其中提到了提高代码质量的三招实践攻略:单元测试,代码覆盖,持续整合。读罢顿觉不错,好的项目都是需要这个东西的。其实再仔细想想我们经常提到的发表论文前的相关实验,我敢保证,很少有人说他的实验部分的代码是100%没有Bug的。很多时候,实验结果都是会受到代码质量的影响的。

为了弥补自己软件开发方面的不足,我打算从单元测试开始学习。争取以后都能在写代码前写好测试用例。

在Google上随便转了一下,发现这篇文章《单元测试》写得很好。在提到测试用例和实际开发的顺序时,作者的态度是“在实际的工作中,可以不必过分强调先什么后什么,重要的是高效和感觉舒适”。他的结论是“先编写产品函数的框架,然后编写测试函数,针对产品函数的功能编写测试用例,然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的随便返回一个值,编译通过后再编写测试代码,这时,函数名、参数表、返回类型都应该确定下来了,所编写的测试代码以后需修改的可能性比较小。”感觉这个经验相当不错,之所以很多人不愿意写测试用例,我想也是和没有找到这样的经验有关。

对于单元测试,一些流行的误解如下:

  • 它浪费了太多的时间
  • 它仅仅是证明这些代码做了什么
  • 我是个很棒的程序员, 我是不是可以不进行单元测试?
  • 不管怎样, 集成测试将会抓住所有的Bug
  • 它的成本效率不高

这里就不一一解答这些误解了,感兴趣的朋友可以看看《单元测试》中的解释。

单元测试的优点有:

  • 它是一种验证行为

程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支缓。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。

  • 它是一种设计行为

编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。

  • 它是一种编写文档的行为

单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。

  • 它具有回归性

自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。

单元测试主要包括黑盒测试以及白盒测试,黑盒测试主要是在函数功能上进行测试,不会深入到函数内部;白盒测试是对函数的逻辑进行测试,需要深入到函数的内部,需要覆盖的逻辑单位主要有:语句、分支、条件、条件值、条件值组合,路径。语句覆盖就是覆盖所有的语句,其他类推。另外还有一种判定条件覆盖,其实是分支覆盖与条件覆盖的组合。跟条件有关的覆盖就有三种,解释一下:条件覆盖是指覆盖所有的条件表达式,即所有的条件表达式都至少计算一次,不考虑计算结果;条件值覆盖是指覆盖条件的所有可能取值,即每个条件的取真值和取假值都要至少计算一次;条件值组合覆盖是指覆盖所有条件取值的所有可能组合。作者做过一些粗浅的研究,发现与条件直接有关的错误主要是逻辑操作符错误,例如:||写成&&,漏了写!什么的,采用分支覆盖与条件覆盖的组合,基本上可以发现这些错误,另一方面,条件值覆盖与条件值组合覆盖往往需要大量的测试用例,因此,在作者看来,条件值覆盖和条件值组合覆盖的效费比偏低。

作者认为效费比较高且完整性也足够的测试要求是这样的:完成功能测试,完成语句覆盖、条件覆盖、分支覆盖、路径覆盖。这种测试要求其实是比较高的,但是借助于一些相关的工具还是能方便的完成的。

 

工具篇:

        单元测试最著名的工具我想就是Unit系列吧,C++的CppUnit,Java的JUnit,Python的PyUnit等等,还有一些其他工具吧。由于目前我主要采用Java进行编程,搜罗一下Java的单元测试工具(Eclipse下使用的):JUnit4, TestNG。阅读了一篇关于这两个重量级工具的对比文章(《追求代码质量: JUnit 4 与 TestNG 的对比》)后,我决定使用TestNG来作为我的单元测试工具。

 

经过三个小时的尝试后,不得不放弃TestNG,原因是它不支持Eclipse 3.3,感觉好像支持jdk1.6也不太好,似乎TestNG跟不上时代啊!再一眼,发现Junit到是默认出现在了Eclipse 3.3里面,那就试试Junit4咯。呵呵,只要能提高效率就要,为什么一定要用TestNG呢 :)

 

学习几个相关的JUnit教程,感觉这个系列最好:

  1. 在Eclipse中使用JUnit4进行单元测试(初级篇)
  2. 在Eclipse中使用JUnit4进行单元测试(中级篇)
  3. 在Eclipse中使用JUnit4进行单元测试(高级篇)

学完后有这几个心得:

1. Eclipse下创建单元测试非常方便,很多时候只需要点击鼠标即可完成绝大多数的工作,而且可以通过创建很多的单元测试后用打包的方式全部执行。

2. JUnit4比JUnit3多出了许多TestNG具有的特性

3. JUnit4主要有如下几点:

  1. 包含必要地Package
  2. 测试类的声明
  3. 测试方法的声明,以@开头,例如@Before、@Test、@After
  4. 忽略测试某些尚未完成的方法@Ignore
  5. 限时测试,防止死循环,用timeout如@Test(timeout = 1000)
  6. 测试异常,用expected 如 @Test(expected = ArithmeticException.class)
  7. 选择运行器@RunWith(...)
  8. 参数化测试,用于实例数较多的测试,用@RunWith(Parameterized.class)配合Collection的asList
  9. 打包测试,import org.junit.runners.Suite; @RunWith(Suite.class)

4.JUnit4的功能非常强大,自己以后的编程习惯应该是先写整个程序的类及函数框架,然后生成大量的对各个相关函数的单元测试,并且写好打包测试,然后每次实现一个函数就运行一次打包测试,从而逐渐消除所有的Failure和Error,其间如果需要对类及函数框架做出增删改,都必须立即更新单元测试的结构和代码,直到完成

5. 对于具有单元测试的项目,代码的组织可以是在当前文件夹下新建两个文件夹java及test,分别存放正式的代码文件和测试文件,这样有利于最终的文件提取。

 

哈哈,一口气写了这么多,就这样吧!算是自己对单元测试的一次较为深入的学习。

2008年2月18日

定时器、绿色植物、19存显示器

前不久每日煮粥,晚上回去时先小煮一小时,早上再小煮半小时,加上相关琐碎,居然为了吃早饭也得花上两个小时。一日忽然想,如果有个定时器能控制煮粥锅的电源,让它定时关机,那晚上就不用守在那里或者非常不好意思的持续麻烦那位每晚都看电影到后半夜的斯里兰卡哥们儿了。询问了好几位朋友,终于在Stanly那里得知并且得到了一个非常高级的定时器。这东西价值新元8.5元。主要功能是将一天分成24小时,每个小时分成两段,共有48个按键,相应的按键按下就表示对应的这半个小时接着的电器会被通电,按键跳起则表示这半个小时处于断电状态。有了这个东西,煮粥的确方便了很多很多。这个东西插在电源插孔上后,定时盘就会自动旋转,旋转速度就是按照正常的时钟运行的。哈哈,晒一下这个定时器的照片咯。有位朋友说北京也有卖的,只是俺是第一次看到,一想到自己瞎想的东西居然还真有人做成产品了,顿觉高兴。补充说明一下,Stanly家用这种定时器来控制灯的亮灭。感觉这东西有时会比声控灯要好些。

P1030565 P1030566

                      侧看                                                正看

P1030567 P1030569

                      定时盘                    红色开关位于右侧时调整开关时段

P1030575 P1030577

       例如按下的几个时段                               广告一下

P1030578

纯英文说明书,还让俺查了一下词典,汗!

 

今天在实验室好友陈斌的帮助下,我的办公桌上终于有了第一株植物,另外在Upali的帮助下,我终于用上了传说中的19寸显示器,真是爽不可言,在Eclipse下调程序时可以不用鼠标拖来拖去了,真是极大提高生产效率啊,也秀秀picture咯!

P10305812

不知道放在19寸显示器 前会不会让这株植物辐射过大

P10305831

                     美丽的植物

2008年2月16日

zz 开源,选择Google Code还是Sourceforge?

 

这两日认真学习了一下Subversion的使用方法,现在使用Eclipse+Subclipse以及TortoiseSVN,感觉确实像是搭上了一趟时间列车,非常不错的说。顺带了解了一下Sourceforge和Google Code的对比。感觉项目管理还真是一个复杂的事情,Sourceforge的模式非常不错。

link: http://blog.csdn.net/xushiweizh/archive/2006/12/28/1466334.aspx

许式伟
2006-12-28

概要

提起Google Code,我需要很惭愧地承认一点,我一开始的时候“把它看扁了”。初接触Google Code的时候,我简单地认为,Google Code只是一个半成品,从各方面的功能来讲,似乎远不能够与Sourceforge的完备相比。但是,随着对Google Code了解的深入,我不能不承认我错了,Google Code再一次证明“简单是美”的法则:Google的服务似乎永远是看似简单(甚至让你觉得不够用),而实则非常完备。

如果你有开源的计划,或者已经开源,或者你有私人的项目希望有个完备的平台去管理它,那么本文值得你一读,因为这是我在这方面的一些心得。到目前为止,我开源了WINXDocX已经4个月多了,和Google Code、Sourceforge均有了较长时间的接触,希望借机会和大家交流下。

选择Google Code,还是Sourceforge?总体来讲,两者各有各的优势。从进入的门槛来讲,使用Google Code会比Sourceforge容易很多。

Google Code的优势与劣势

Google Code的优势

  • 速度第一。Google的服务以快速著称,Google Code亦不例外。当你上传新的Release时,你会特别感受到这一点。
  • 操作简洁。如果Sourceforge和Google Code提供了同样的功能,那么我可以毫不思索的讲,Google Code比Sourceforge快捷易用。我们后文将详细比较各个功能。

Google Code的劣势

  • 容易被盾。以我的经验,Google Code被盾比较频繁。这导致我有时无法浏览Bug列表,发布新的Release等等。所幸的是,Google Code的SVN连接从来没有出现访问障碍。因此这不算太大的问题。另外,按Google Code的说法,有些功能可以在命令行进行,而不需要到Web上,但是我本人尚未进行详细的验证。
  • 100M的容量限制。Google Code限制每个项目的SVN空间大小不能超过100M,发布的所有Release亦不能超过100M。由于目前我的项目刚刚开始,这一点还不是一个障碍。但是这是一个比较容易到达的数字。可以预见,你的项目要面临搬家的风险。我试图寻找办法来清除一部分SVN历史版本数据、删除一些历史Release 版本,未果。
  • 无数据统计功能。你无法得知你的Release被下载的情况(下载总数以及趋势)。

Sourceforge的优势与劣势

Sourceforge的优势

  • 更多的受众,已经形成第一开源社区。简单统计结果表明,Sourceforge上大约每5分钟就有一个新的Release。也就是说,一天大约有300个新的发布(这不是精确的统计,只是简单估算)。
  • 功能更加完备。目前来看,Google Code在功能上并不比Sourceforge成熟。如果Google Code是一个完整、快捷、功能足够的平台,那么Sourceforge则是一个方方面面均已经相当完备的开发平台。

Sourceforge的劣势

  • 操作繁复,速度较慢。

详细功能对比

下面我们展开来对比一下两者的功能:

  • 建立帐号。Google Code只要你有Gmail帐号即可。Sourceforge要求你进行注册。而且你发现,Sourceforge的注册流程十分罗嗦。
  • 建立项目。Google Code只要你简单填写一下项目的相关信息(http://code.google.com/hosting/createProject),仅一个页面即可完成申请。而Sourceforge的新Project申请流程是繁复的,有很多的下一步,并需要你阅读一些英文细节。另外,你的项目并不马上生效,而是需要进过审批。不出意外的话,在申请之后的第二天再上Sourceforge,你的项目应该通过审批了。
  • 代码管理。Google Code仅支持SVN库,Sourceforge支持SVN和CVS。Google SVN限制在100M内,Sourceforge则尚未见到明确的容量限制。
  • 代码库的权限管理。Google Code的代码库权限管理非常简单,在你登陆后,http://code.google.com/hosting/settings 将显示Google Code为你自动生成的随机密码。通过你的用户名和这个随机密码,你就可以访问SVN代码库,对其进行修改。sourceforge推荐使用putty套件,详细参考sourceforge上的说明,总的来说,相当繁复。
  • 发布版本。Google Code限制所有Release包不能超过100M,单个Release不能超过10M。Sourceforge尚未见到明确的限制。
    Google Code发布一个新的Release流程,仍然只需要一个页面即可完成。你只需要选择上传的文件,并为该文件加一些预定义的标签(用于告诉别人你的 Release支持的平台或其他信息,这些标签Google Code已经预定义部分,项目管理人员亦可以定义),确认即开始上传。特别地,如果一个Release被打上 Featured 标签,那么它将出现在项目首页。
    Sourceforge的流程则比较复杂:
    • 通过ftp上传你要发布的文件。上传地址:ftp://upload.sourceforge.net/incoming,这个过程匿名进行。上传的文件在你后续的步骤中进行“认领”,如果某个包长时间没人认领,Sourceforge将清理之。
    • 进入Sourceforge。用你的Sourceforge帐号登陆。
    • 进入项目主页,进入Admin -> FileReleases。
    • 选择已有的Package或者新建Package,向该Package中添加一个Release。在你的项目发布的文件比较多(不是发布的历史版本多,而是一次发布的文件多,你可能希望对他们进行归类)时,Package可以更加有条理地管理这些文件。
    • 为该Release添加ReleaseNote和ChangeLog。确认。
    • 认领你上传到ftp上的文件。打上勾,确认即可。
    • 为你发布的文件添加说明(支持的平台、包的格式及其他规格)。
    • 如果有人关注这个项目的Release,最后一步,你可以向这些人发送信息,告诉他们发布了新的Release。这一步很有意思,是Google Code不能做到的。
  • Bug报告。Google Code中的issues,Sourceforge的tracker。由于用的还不算多,暂时不做详细比较。
  • 论坛。Google Code中并不直接提供论坛功能,当然,这是因为它推荐你使用强大的Google Groups。Sourceforge则除了提供给用户的论坛(并把用户论坛分为两个,一个讨论产品功能的,一个属于头脑风暴型的开放式讨论),也提供开发者专用的论坛(对非项目成员不可见)。
  • Project Web。Google Code中没有提供项目主页,而是颇具创意的提供了一个Wiki Pages。Sourceforge提供了项目主页,项目主页的地址是:"项目名.sourceforge.net"。你可以利用这个网址来宣传项目、提供项目信息。这个空间是是php+mysql的,并且你可以通过远程Shell控制,极其灵活。
  • 团队成员管理。Google Code你可以通过添加其他Gmail帐号为项目成员(Members)或管理员(Administers),但似乎还不能进行更加详细的权限管理。Sourceforge提供了非常精细的项目成员的权限管理。
  • 下载与访问统计。Google Code无此功能。Sourceforge提供了最近7日、最近2个月、年、全部访问/下载统计。非常详细。
  • 软件截图(ScreenShots)。可以让用户迅速获得项目的第一印象,吸引眼球。Google Code无此功能。

2008年2月9日

人无远虑必有近忧:目标分解

我清楚的记得高中时的教学副校长常说的这句话:人无远虑必有近忧!由于当时副校长说这句话是总是有点快,每次听起来就像是一句口头禅一样。高中时或者说大学时,我们的目标都是比较清楚了,好好学习争取考上大学或者考上研究生。随着进入博士阶段了,我们的目标反而不那么清晰了,经常会出现恍恍惚惚度日的情况。我发现不只是我,我认识的好多博士生都不同程度不同阶段的出现了这个问题。

今天看到下面这个故事:

1984年,在东京国际马拉松邀请赛中,名不见经传的日本选手山田本一出人意料地夺得了世界冠军。全世界的人都好奇他凭什么取得如此惊人的成绩时,而他在自传中这么写道:

每次比赛之前,我都要乘车把比赛的线路仔细地看一遍,并把沿途比较醒目的标志画下来,比如第一个标志是银行;第二个标志是一棵大树;第三个标志是一座红房子……这样一直画到赛程的终点。比赛开始后,我就以百米的速度奋力地向第一个目标冲去,等到达第一个目标后,我又以同样的速度向第二个目标冲去。40多公里的赛程,就把我分解的几个小目标轻松地跑完了。起初,我并不懂这样的道理,我把我的目标定在40多公里外终点线上的那面旗帜上,结果我跑到十几公里时就疲惫不堪了,我被前面那段遥远的路程给吓倒了。

人生就像马拉松,每个人肯定在心中都会默默的有着自己的目标,但是目标过大难于执行,终至目标虚设。今天看到褪墨上的这篇文章《怎样设定目标(一)——目标金字塔》,感触很深。看到下面这幅目标金字塔图,我自查了一下,忽然间发现自己居然只剩下了短期目标。

 

为了“挽救”自己,我开始继续思考。《九步确定你的人生目标和制定达到目标的计划 》这篇文章好像挺有用。

2008年2月5日

Stanford Parser加速之HashCode和序列化

现在的Java程序中用到了Stanford Parser,在程序功能完整实现后,我开始对这个Parser的使用进行加速。

由于采用的直接嵌入式的调用,没有遇到命令行调用方式下会遇到的资源重复加载的问题。在主控程序中对Parser采用一个类(A)的静态函数来加载所需资源到该类的静态成员变量上,就得到了一个全局的常驻内存资源。哈哈,第一次采用这种方案来实现全局资源,感觉甚为不错!在类A中另写了一个静态函数来执行句法分析。在对文件的处理循环中的某个特征抽取部分,使用类A的静态句法分析函数,从而实现了全局的调用。

加速方案我采用的主要有两种:

  1. 如果pair的第二个元素和第一个元素位于同一个句子,就只parse一次。
  2. 在类A的parse函数中对已经parse过的句子直接加载parse结果。

第一个方法实现起来非常简单,关键是第二个。尝试了几种解决方案后我最后结合hashcode和序列化方法实现了这个功能。这里记录一下,以备查找。

hashcode是对即将Parse的句子采用.HashCode()方法获得这个对象唯一的整数索引值,将这个索引值对应成文件名即可实现每个句子parse后对应一个唯一的文件。说起来这个hashcode函数还真是很神奇的 :)

序列化是我在Python里面常用的技巧,想来就是将对象存入文件以及从文加载对象两步。基于原理都是一样的。但是看了一下Java中对序列化的介绍后,感觉序列化功能也是有巨大应用功能的。参考了一下如下一段讲述Java序列化方法的文章后完成了我的Parse加速。

3.一般序列化实例
程序名称:SerializationDemo.java
程序主题:实现对象的序列化和反序列化
程序说明:该程序由实例化一个MyClass类的对象开始,该对象有三个实例变量,类型分别为String、int、double,是希望存储和恢复的信息。
import java.io.Serializable;
class MyClass implements Serializable {
    String s;
    int i;
    double d;
    public MyClass(String s, int i, double d) {
        this.s = s;
       this.i = i;
       this.d = d;
    }
    public String toString() {
       return "s=" + s + ";i=" + i + ";d=" + d;
    }
}
要想序列化对象,你必须先创建一个OutputStream,然后把它嵌进ObjectOutputStream。这时,你就能用writeObject ( )方法把对象写入OutputStream了。读的时候,你得把InputStream嵌到ObjectInputStream里面,然后再调用 readObject( )方法。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializationDemo {
        public static void main(String args[]) {
       FileInputStream in = null;
       FileOutputStream out = null;
       ObjectInputStream oin = null;
       ObjectOutputStream oout = null;
       MyClass object1 = new MyClass("Hello", -7, 2.7e10);
       System.out.println("object1:" + object1);
       // Object serialization
       try {
           out = new FileOutputStream("serial.txt");
           oout = new ObjectOutputStream(out);
           oout.writeObject(object1);
           oout.close();
       } catch (Exception e) {
           System.out.println("Exception during serialization:" + e);
           System.exit(0);
       }
       // Object deserialization
        try {
           MyClass object2;
           in = new FileInputStream("serial");
           oin = new ObjectInputStream(in);
           object2 = (MyClass) oin.readObject();
           oin.close();
           System.out.println("object2:" + object2);
       } catch (Exception e) {
           System.out.println("Exception during deserialization:" + e);
           System.exit(0);
       } finally {
           // …此处省略
       }
    }
}
结果:
object1:s=Hello;i=-7;d=2.7E10
object2:s=Hello;i=-7;d=2.7E10

 

现在我的程序正在健步如飞的运行着,任何两个一模一样的句子都只会被parse一次。

 

序列化和hashcode搭配起来真是不错~!

2008年2月3日

学习使用InkScape

两日来,学习了一下Inscape的使用,现在看来这个软件很好很强大。学习了一些教程:

Link: http://linuxtoy.org/archives/inkscape-tutorials.html

自己学着里面的东东,弄了一个送给大家的卡片以及仿制了一下上一篇blog里面的双螺旋结构的第一个logo。在这里也晒一晒哦 :)

happynewyear_langjun

                            11122 

现在感觉设计图案也是一件很有趣的事情 :)

2008年2月1日

Logo Collections

忽然间喜欢上了Logo设计,简单Google一下,发现这个行当还真是千变万化。这里找到了一组讲述2007年Logo设计潮流中的几组代表:

双螺旋

橡皮圈

放射

生态智能

都市搪胶公仔

同心,同心

消逝的圆点

花+枝 招展

半隐半现,欲说还休

光照

面具

重叠

三维

视觉魔术

丝带

              

这些类型中,我比较喜欢双螺旋、放射、消逝的圆点、视觉魔术、丝带以及三维重的第一个。