紫风乱写

除了他眼前的屏幕,这个人什么也没看见。
被周围的电脑簇拥着,他只知道他所创造的现实,但又意识到那是虚幻。
他已经超越了技术。也超越了机器。
posts - 62, comments - 93, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2005年9月11日

有这么一种神器,英文叫做reference card, 中文我不知道叫什么,就作用来说,可以叫做快捷键一页纸,可以打印出来,放在案头,然后可以随时查阅。百度不容易找到,用谷歌的话可以使用reference card作为关键字查找。

下面是几个例子
Eclipse 4.6: https://github.com/pellaton/eclipse-cheatsheet/raw/master/eclipse4.6/eclipse-shortcuts-4.6.0.pdf
Intellij IDEA: https://resources.jetbrains.com/assets/products/intellij-idea/IntelliJIDEA_ReferenceCard.pdf
Emacs: https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf
Org-Mode: https://www.gnu.org/software/emacs/refcards/pdf/orgcard.pdf

posted @ 2016-06-05 14:08 Justfly Shi 阅读(519) | 评论 (0)编辑 收藏

     摘要: Emacs Tutorial中提到的快捷键以及自己找的一些快捷键  阅读全文

posted @ 2016-06-02 02:16 Justfly Shi 阅读(334) | 评论 (0)编辑 收藏

修改内容:

posted @ 2015-12-05 21:28 Justfly Shi 阅读(1949) | 评论 (0)编辑 收藏


修改内容:

  • 添加BeanQuery.nested()方法,调用该方法后,具有同样前缀的属性或者别名会被放到一个Map中返回,详情请看Allow format result into a map
  • BeanQuery.selectBean方法标为@deprecated,并添加同一样功能的方法,命名为BeanQuery.select

posted @ 2015-12-05 20:48 Justfly Shi 阅读(2831) | 评论 (0)编辑 收藏

     摘要: 在我看来,干活有两种方式:

1. 没想清楚了,贸贸然开干,然后各处救火各种解决问题
2. 想清楚了再开干,无惊无险,安然做完

本文讲讲如何在设计中系统的思考以避免内存溢出,并给出一个例子讲解。  阅读全文

posted @ 2015-06-08 19:13 Justfly Shi 阅读(3969) | 评论 (4)编辑 收藏

5月初的时候,我发了一个帖子说要开始讲单元测试,但是20多天过去了,为什么没有更新呢?
原因就是我在做视频公开课,发现光文字表现的话比较费劲,所以我决定录制视频,做成公开课。

第一个录制的是JUnit技术,课程地址:http://edu.csdn.net/course/detail/908 欢迎大家观后留言探讨哦。

posted @ 2015-05-26 22:25 Justfly Shi 阅读(1630) | 评论 (4)编辑 收藏

     摘要: 从04年开始,我就开始在项目实践中使用单元测试。十几年来,参与的项目基本上都或多或少的使用了单元测试,多的能有100%覆盖率的要求,少的也要覆盖主要代码,发现这个实践在提高软件质量和开发速度上还是很有好处的。在和朋友同事的交流中,发现有很多项目没有使用单元测试,也有很多程序员不会写单元测试,但是大家对这个都很有兴趣。所以我想把自己掌握的关于单元测试的技能(架构、设计和技术)和实施策略分享一下。  阅读全文

posted @ 2015-05-05 00:33 Justfly Shi 阅读(6039) | 评论 (4)编辑 收藏

代码地址:https://github.com/Jimmy-Shi/bean-query/tree/bean-query-1.1.1

修改内容:
  • 简化用户自定义转换
例子:
List<String> bookNames=select(new DefaultSelector<String>() {
      @Override
      public String select(Object item) {
        return ((Book)item).getName();
      }
    }).executeFrom(bookCollection);

在Maven项目中引用:
<dependency>
  <groupId>cn.jimmyshi</groupId>
  <artifactId>bean-query</artifactId>
  <version>1.1.1</version>
</dependency>

posted @ 2014-11-23 00:02 Justfly Shi 阅读(1235) | 评论 (2)编辑 收藏

Bean Query是一个开源的Java工具包,它复用Apache Commons BeanUtilsApache Commons CollectionsJava Hamcrest 来简化对Bean(集合)的排序,过滤和转换。

项目地址:

https://github.com/Jimmy-Shi/bean-query

http://git.oschina.net/jimmyshi/bean-query

修改内容:

  • 支持用户自定义排序
  • 支持用户自定义转换
  • 支持对一个对象进行转换和过滤
  • 提供了完整的使用说明文档

在Maven项目中引用:

<dependency>
  <groupId>cn.jimmyshi</groupId>
  <artifactId>bean-query</artifactId>
  <version>1.1.0</version>
</dependency>

posted @ 2014-11-21 22:58 Justfly Shi 阅读(8427) | 评论 (2)编辑 收藏

修改内容:
在Maven项目中引用
<dependency>
  <groupId>cn.jimmyshi</groupId>
  <artifactId>bean-query</artifactId>
  <version>1.0.1</version>
</dependency>

posted @ 2014-11-03 21:56 Justfly Shi 阅读(5547) | 评论 (3)编辑 收藏

BeanQuery 是一个把对象转换为Map的Java工具库。支持选择Bean中的一些属性,对结果进行排序和按照条件查询。不仅仅可以作用于顶层对象,也可以作用于子对象。更多详细的介绍可以看我的博文: http://www.blogjava.net/justfly/archive/2014/10/26/419067.html

我刚刚发布了版本1.0.0. 现在已经在Sonatype OSS库上了,2个小时后将会被同步到Maven中央库上。

Sonatype OSS 库下载地址: https://oss.sonatype.org/content/groups/public/cn/jimmyshi/bean-query/1.0.0/

Github上的代码: https://github.com/Jimmy-Shi/bean-query/tree/bean-query-1.0.0

在Maven项目中引用

<dependency>
  <groupId>cn.jimmyshi</groupId>
  <artifactId>bean-query</artifactId>
  <version>1.0.0</version>
</dependency>

posted @ 2014-10-29 02:24 Justfly Shi 阅读(4462) | 评论 (0)编辑 收藏

     摘要: BeanQuery 是一个把对象转换为Map的Java工具库。支持选择Bean中的一些属性,对结果进行排序和按照条件查询。不仅仅可以作用于顶层对象,也可以作用于子对象。

BeanQuery的使用非常简单也很直接  阅读全文

posted @ 2014-10-26 23:33 Justfly Shi 阅读(5505) | 评论 (6)编辑 收藏

     摘要: 作为一个程序员,我们的日常工作之一就是看Log,从Log中发现自己所需要的信息,以及对Log做一些简单的分析和统计。本文分享了我所使用的工具和方法。  阅读全文

posted @ 2014-09-17 23:00 Justfly Shi 阅读(2795) | 评论 (6)编辑 收藏

     摘要: 本文介绍了在代码中应该在什么时候需要Log什么信息;使用何种级别的Log;如何Log异常信息;Log中的一些要点。另外也分析了静态Logger变量和对象Logger变量的优劣。  阅读全文

posted @ 2014-08-13 23:32 Justfly Shi 阅读(25921) | 评论 (7)编辑 收藏

     摘要: 作为《Java程序员修炼之道》博文的第一个主题Logging,我计划中按照如下三篇来写: 1. Logback的简单介绍和配置 2. 在Java代码中如何使用SLF4J来写日志以及写日志的要点 3. 作为一个程序员,在日常工作中如何分析和挖掘Log。 这个是第一篇,简单介绍一下Logback的配置,适用于开始配置和开始入门,适用于一般情况下的使用。  阅读全文

posted @ 2014-08-10 02:46 Justfly Shi 阅读(19786) | 评论 (1)编辑 收藏

     摘要: 后来我意识到,我不能只抱怨,作为一个写了10多年代码,带过项目、做过业务最终还是写代码, 有车有房有妻有娃的四有不太牛逼的程序员,我有责任帮助刚入行的、入行时间不短的,还没车没房的Java程序员们掌握一些基础的东西。
如果你掌握了这些基础的东西的话,而且英语口语还凑合的话,欢迎来找我帮你内部推荐工作,估计一万多的月薪是不成问题的,至于30、40万的年薪应该也是有机会的。  阅读全文

posted @ 2014-08-03 01:18 Justfly Shi 阅读(5165) | 评论 (13)编辑 收藏

Sorry every body, I am so busy that I can not finish this article on time. I will try to finish this article after I have got a job. You can compare the 2 xml files in the attached zip file to get some idea.

There are 2 files in the zip file:
1. google.xml: The original google search plugin
2. google-oracle.xml: The search plugin that only search the oracle.com web site.

Usage
1. Put the google-oracle.xml in your personal firefox searchplugin folder. In windows firefox version 4 it is {FIREFOX_HOME}\distribution\searchplugins
2. Restart the firefox. Done

Click here to download the search plugins

posted @ 2011-04-18 00:13 Justfly Shi 阅读(1912) | 评论 (6)编辑 收藏

If after upgrading your eclipse STS plugin from 2.5.2 to 2.6.0, your grails projects can not be build, and when building it, it always warning that "Errors running builder 'Java Builder' on projec". That might be caused by the old 1.6 groovy compiler.  The solution is to edit the file "eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info" and find the line for org.codehaus.groovy_1.6 and remove it. And then restart the eclipse. you can find that it should be fixed.

Reference: http://docs.codehaus.org/display/GROOVY/Compiler+Switching+within+Groovy-Eclipse

posted @ 2011-03-30 22:24 Justfly Shi 阅读(1510) | 评论 (0)编辑 收藏

     摘要: 第一章 新的机会 第二章 对抗卡布福斯 第三章 “硅谷” 第四章 CD-ROM工厂 优质管理的四大要素 l 选择正确的人 l 为他们分配正确的工作 l 保持他们的积极性 l 帮助团队凝聚起来并保持团队的凝聚力 (其他的一切都只是“文案”) 安全和变化 l 除非感到安全,否则人...  阅读全文

posted @ 2011-03-26 23:56 Justfly Shi 阅读(338) | 评论 (0)编辑 收藏

上周去一家大型网络公司的内部系统开发部门面试,该部门主要是为公司的各个部门开发工作中所需要用到的系统,比如财务,人事的一些小系统。面临着:资源少,任务多,体现不出部门价值等问题。面试出来后想了几点,发给他们了,另外也分享出来,希望对从事类似工作的同学们有用。
1. 统一简洁的页面风格和CSS
因为是内部系统,所以页面不需要太华丽和复杂的界面,所需要的是简单易用。因为是都是sohu的内部系统,所以可以有统一的页面风格。
统一页面风格带来以下这些好处:
a. 只需要采用一套CSS,而不需要在每个项目都进行CSS的开发
b. 能减少页面设计的时间,页面布局,功能区域设置能全部都统一起来
c. 减低用户对于新系统的学习曲线
因为是内部系统,客户端与服务器之间的连接速度能保证。因此可以采用简洁的页面风格。
简洁的页面能带来以下好处:
a. 减少页面的开发难度,不用在一个页面中堆积过非必要的数据。
b. 方便任务分配
 
2. 在做需求的时候同时完成静态页面的设计
这条的好处是做页面设计的时候能进一步理解用户的需求,也能同时从解决方案的角度来考虑问题,从用户的角度来说,针对模型进行思考能进一步的引导他的需求。
具体的做法就是
a. 在一边谈需求一边用纸画出大概的页面模型和用户沟通,初步形成页面功能的设计
b. 谈完需求之后尽快使用统一的CSS做出静态的页面。用页面跳转代替表单提交。
c. 用静态页面组成的模型和用户进行初步沟通,在沟通过程中,如果时间不多的话在纸面上进行修改再沟通,如果时间多的话,快速的修改静态页面,争取尽可能多的把重点页面和用户达成一致。
根据沟通结果把可以开始做的部分安排开发人员开始做,还不能确定的和客户约好时间再进行下一次沟通。
 
3. 逐步建立可复用的代码库(功能组件)
这一点说起来容易,做起来需要一定的额外代价,是一个部门内部的积累。前提是第一条建议能够比较好的实施。这里的代码库(功能组件)大到一个功能模块(连接LDAP),小到一个页面控件(多层次部门选择下拉列表)。具体做法是
a. 在项目开发中有意识的把可通用的组件单独放到一个包里
b. 项目结束后,花1到2天的时间整理成可复用的代码
c. 整理完之后再对相关技术人员进行培训(这个很重要,有通用代码而别人不知道=没有通用代码)
d. 在以后的项目中,在复用的过程中进行完善
e. 尽量减少复制粘贴再修改
 
4. 收集客户部门使用系统后的效果,其结果可用于对上对外和对内
客户部门应该会有这样的数据,因为他们需要这些东西来说明他们上新系统的效果。本部门可以用这些数据来说明自己的贡献以获取公司的认同甚至可以去争取更多的资源
IT或者运维部门应该会有bug数量的和分布的统计数据,如果没有的话自己可以收集到达本部门的bug数量和分布的数据,通过这些可以在以后的工作中有意识的避免这些bug
通过这些数据可以在以后的需求分析过程中为客户部门提供更容易使用的系统

posted @ 2011-03-02 11:36 Justfly Shi 阅读(880) | 评论 (0)编辑 收藏

     摘要: 软件开发团队和测试团队之间的关系是复杂而有趣的,双方有共同目标,又互相竞争。双方的共同目标在于减少软件交付之后缺陷的严重程度和数量。双方的利益竞争在于测试人员尽可能的发现软件开发团队交付的软件产品的缺陷。在这种情况下,减少无谓的内耗,共同保证共同目标的实现,才可能实现双方的共赢。但是在很多时候,软件开发团队和测试人员之间总存在着一种紧张的关系,并因此无谓的添加了到达共同目标的困难。

在我经历过的一些开发过程中,多次因为与测试人员之间的颇为愉快的合作,实现了双赢和共赢。总结出来几点,抛砖引玉:
1. 保持良好的心态,提高对开发人员与测试人员之间关系的认识
2. 对于客户想法的理解,开发团队与测试团队需要达成一致并且保持同步。
3. 互相帮助,共同提高  阅读全文

posted @ 2010-10-24 05:07 Justfly Shi 阅读(1805) | 评论 (0)编辑 收藏

1. test if the command notify-send is installed
notify-send "Hello"
If the command is not found, install the required package following the tips
2. vi notify.sh and input the below content into it.
#!/bin/bash
DISPLAY=:0.0 /usr/bin/notify-send -30000 "<b>Take a Break!</b>"
3. chmod +x notify.sh
4. crontab -e
5. add the below content as a new line in the opened file. and then save it
*/45 * * * * /home/jimmy/notify.sh
6. Done!

posted @ 2010-09-28 15:49 Justfly Shi 阅读(361) | 评论 (0)编辑 收藏

It is only available for one session.
using the below command before you run your query
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
For more information, refer to the page http://www.oracle.com/technology/products/database/sql_developer/howtos/howto_policy_date_formats.html

posted @ 2010-08-11 16:45 Justfly Shi 阅读(360) | 评论 (0)编辑 收藏

In Ubuntu, key F10 is used to open the first item of the menu bar, but If you use Emacs key binding in eclipse, F10 is used as the redo key. So you need to do the below change.

Run gconf-editor, browse to /desktop/gnome/interface then scroll down to menubar_accel and delete the F10 value.

From http://www.h4ck3r.net/2010/04/07/debugging-step-over-f10-eclipse-ubuntu/

posted @ 2010-07-22 23:35 Justfly Shi 阅读(328) | 评论 (0)编辑 收藏

install jdk via Synaptic package manager, the name of it is sun-java6-jdk
download the eclipse install file for Linux

1.Extract the eclipse download and move to opt.

tar xzf wtp-all-in-one-sdk-1.0-linux-gtk.tar.gz
sudo mv eclipse /opt/eclipse
cd /opt
sudo chmod -R +r eclipse
sudo chmod +x `sudo find eclipse -type d`

2. Then create an eclipse executable in your path
sudo touch /usr/bin/eclipse
sudo chmod 755 /usr/bin/eclipse
sudo vi /usr/bin/eclipse

With this contents
#!/bin/sh
export ECLIPSE_HOME="/opt/eclipse"
export GDK_NATIVE_WINDOWS=1

$ECLIPSE_HOME/eclipse $*

3 Then create a gnome menu item
sudo vi /usr/share/applications/eclipse.desktop

With this contents
[Desktop Entry]
Encoding=UTF-8
Name=Eclipse
Comment=Eclipse IDE
Exec=eclipse
Icon=/opt/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=GNOME;Application;Development;
StartupNotify=true


4 You now have a working eclipse. But run this command first to initialize the set up
. /opt/eclipse/eclipse -clean

Then from here on you can run from the menu item applications/programming/eclipse

posted @ 2010-07-22 23:27 Justfly Shi 阅读(333) | 评论 (0)编辑 收藏

查找包含某字符串的所有文件
grep -F 'aaa' -R ./

如何指定输出文件的某几行
想输出多行用:
sed -n '1,np' file
跳着输出用";"
sed -n '1p;4p;7p;9p' file

posted @ 2010-07-22 23:25 Justfly Shi 阅读(268) | 评论 (0)编辑 收藏

open System->Administration->Language support
1. Install/Remove languages->check 'Chinese(Simplified)
2. Keyboard input method system->ibus
open System->Preferences->IBus Preferences->Input method->add "Chinese Pinyin"->move it to the top

posted @ 2010-07-22 23:23 Justfly Shi 阅读(415) | 评论 (0)编辑 收藏

http://www.linuxsir.org/bbs/thread362467.html
下面的这个已经不再维护了。上面的这个好使。
http://www.linuxsir.org/bbs/thread320802.html

posted @ 2010-07-22 23:23 Justfly Shi 阅读(554) | 评论 (2)编辑 收藏

create or edit file /etc/hal/fdi/policy/mouse-wheel.fdi, change its content to below
<?xml version="1.0" encoding="UTF-8"?>
<match key="info.product" string="TPPS/2 IBM TrackPoint">
<merge key="input.x11_options.EmulateWheel" type="string">true</merge>
<merge key="input.x11_options.EmulateWheelButton" type="string">2</merge>
<merge key="input.x11_options.XAxisMapping" type="string">6 7</merge>
<merge key="input.x11_options.YAxisMapping" type="string">4 5</merge>
<merge key="input.x11_options.ZAxsisMapping" type="string">4 5</merge>
<merge key="input.x11_options.Emulate3Buttons" type="string">true</merge>
</match>


then run the below command

sudo rm /var/cache/hald/fdi-cache
sudo /etc/init.d/hal restart
sudo /etc/init.d/gdm restart

posted @ 2010-07-22 23:21 Justfly Shi 阅读(384) | 评论 (0)编辑 收藏

当Eclipse无法找到类,无法正确导入类的时候,有的时候是因为index出错,删除下面这个目录
.metadata\.plugins\org.eclipse.jdt.core

posted @ 2010-06-29 15:21 Justfly Shi 阅读(626) | 评论 (0)编辑 收藏

使用如下Name Space可以让Xml工具对POM元素进行验证
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation
="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
</project>
几个相当不错的Maven Repository
<repositories>
        
<repository>
          
<id>maven2-repository.dev.java.net</id>
          
<name>Java.net Repository for Maven</name>
          
<url>http://download.java.net/maven/2/</url>
          
<layout>default</layout>
        
</repository>
        
<repository>
          
<id>jboss.repository</id>
          
<name>JBoss Repository</name>
          
<url>http://repository.jboss.com/maven2/</url>
        
</repository>
        
<repository>
        
<id>maven.search</id>
        
<name>Maven Search Org</name>
        
<url>http://www.mvnsearch.org/maven2</url>
        
</repository>
      
</repositories>

posted @ 2008-03-11 22:18 Justfly Shi 阅读(1152) | 评论 (0)编辑 收藏

  上周去某上市公司面试一个ITIL产品技术经理的岗位,前一轮面试已经谈了不少管理方面的事情了,这次主要集中在谈ITIL的知识。该公司本身在做HP等厂家的ITIL类产品的代理,自己也开发了一套ITIL软件。

  在面谈过程中,该公司的面试人员对我原先服务的理想科技公司Entegor(iEAI)产品在光大银行IT服务管理项目中的作用不以为然,认为只要是加强了IT运维过程中的管理就能起到大幅度减少IT事故。并且认为该项目并不是一个合格的ITIL项目。很是汗颜的是,那天天我居然被该面试人员的ITIL方面的教条熟悉程度以及其对HPIBMBMCCA等厂家的产品了解程度所吓到,认为对方果然是ITIL专家,作为一个连十大流程名字都背不全的我实在是不配谈ITIL。第二天早上醒来,才发现其论点是典型 ITIL教条主义。下面我谈谈基于中国银行业IT建设现状该怎么看待ITIL

  “ITILInformation Technology Infrastructure LibraryIT基础设施库)是英国中央计算机与电信总局(Central Computer and Telecommunications agencyCCTA)于1980年为了解决“IT服务质量不佳的问题而开发的一套IT业界的服务管理标准库,是管理科学在信息技术(IT)中的应 用,是一种基于流程的方式。(来之《现代IT服务管理-基于ITIL的最佳实践) ITIL包括十大流程,五个基于运营层面的服务支持流程,包括服务台、事件管理、问题管理、配置管理、变更管理、发布管理;二是五个基于战术层面的服务提供流程,包括服务等级管理、持续性、可用性、能力和财务管理。以 ITIL为参考,各个厂家都提出了自身的实施模型,其中包括有HPITSMIBMITPM、微软的MOF

  以上是ITIL的一些基本资料,冷一眼看起来的确是非常不错:英国的中央计算机与电信总局各大厂商支持十大流程。于是业内的一些行 家,开口闭口十大流程,但是却忘了IT系统的最基本的要求满足客户需求。作为任何一个服务提供商,你的价值体现在为客户解决现有问题。ITIL只是一个源于英国国内IT管理实践的参考模型而已,并不是一个万能药。

  中国的IT建设有其自身的特点,与英国的IT建设并不一样,不同的文化和不同的种族需要不同的管理方法,来自于英国的管理文化在中国成功的并不不多。同样,来自于英国的IT管理实践在国内也不见得就是好东西,有些情况下还可能是一副毒药。这个情况和ERP最初的实施情况非常类似。

  我在担任长春理想科技Entegor(iEAI)产品研发部门经理期间与多家银行的信息部门管理人员有过交流。总的来说,大家的关注点主要集中在如何保证系统持续良好的运行上。

  那么这个情况是怎么形成的呢,我认为主要是这是国内目前IT建设现状的一个体现。

  国内的IT建设现在处于这么一个情况:IT系统种类丰富,IT系统性能不稳定,管理水平较低。这个情况主要由这么几个因素造成:1、信息系统建设初期缺乏完整的远期的规划,后期随意建设情况较严重;2、高级系统管理人员缺乏,初级维护人员经验不足;3IT部门管理仍有相当部分停留在手工操作水平;4、国外IT产品水土不服、国内IT产品质量欠缺。

  那么国内目前最需要的是什么样的IT管理呢?我总结出来的结论是目前国内所需要的IT管理主要集中在保持系统的稳定运行,保证IT系统的良好运行,提高IT系统、部门的管理水平。从实施的角度来说,需要做好对系统的监控,事故问题的预防、及时解决和经验总结,完善IT系统、部门的信息管理。要做到这个不是单靠背诵ITIL教条,死搬硬套ITIL十大流程就能做到的。需要的是参考成功经验(如ITIL模型及流程),根据企业的管理模式、IT建设现状进行相关系统的开发和实施,相关制度和流程的制订和实施。

  在这个实施过程中,企业IT建设现状和企业管理模式才是我们需要关注的重点,ITIL只是一个参考模型而已。

  我们需要这么来认识ITIL,它是一个泊来的提高IT管理和IT服务水平的参考模型,仅供参考!

posted @ 2007-12-11 00:18 Justfly Shi 阅读(1597) | 评论 (12)编辑 收藏

  作为一个现代的开发人员,你已经习惯了使用版本管理来管理自己的代码和文档。当我们在家里的机器上想对自己的东西做版本管理的时候你需要自己配置一个版本管理服务器,如CVS等。但是很遗憾的是,CVSNT的配置很是麻烦,而且CVS的功能实在是落伍,SVN服务器的配置也实在麻烦,VSS?老古董一边去!网络上申请一个免费的项目空间,如sf.net之类的:那你的文件就都公开了。

  今天我无意中发现原来创建一个个人用的SVN Repository是那么的方便。TortoiseSvn这个小乌龟你一定很熟悉,它本身就有一个创建本地Repository的功能,我以前没有注意到过,不知道你用过没有。我用的版本是 1.4.4,在它的帮助的Chapter4里就提到了这个功能。简单来说操作步骤如下

  第一步,创建一个空白目录,如F:/SVNRepositorys/sample/sampleRepository

  第二步,右键点击该目录,在右键菜单中选择TortoiseSVN->Create repository here...。如下图所示


  第三步,在弹出窗口中选择repository的类型,FSFS是一种新的格式是一种新的类型,速度快,支持网络共享和windows98;BDB类型比较成熟,已经用了很长时间了,比较稳定。选择你想要的,点击OK按钮就可以了。

 


  到此为止我们的工作就完成了,你已经有一个本地的repository可以用来做版本管理了。如果有兴趣的话你可以打开你刚才创建的目录看看里面的内容。我对里面的内容格式并不很清楚,这里就不说了。下面我们可以用Repository Browser看看我们新创建的repository,如下图所示:输入地址file:///F:/SVNRepositorys/sample/sampleRepository你就可以看到新创建的repository了。注意上面的蓝色部分,这里使用的协议是file协议。

 

 

  我原先为自己一些文件的版本管理做过很多的麻烦事,比如搭建CVSNT啊,学习SVN Server的配置啊。但是没有想到可以这么简单的就可以达到自己的目的了。这件事情给了我一个启发:熟练掌握你手里已有的工具,你会发现你其实已经拥有很多。

posted @ 2007-08-29 01:38 Justfly Shi 阅读(7694) | 评论 (4)编辑 收藏

CURRENT=`pwd`
echo $CURRENT

以上两行厉害吧?其实就是使用了反引号而已,注意pwd边上的那两撇不是单引号,是键盘左上角1边上的那个键。

下面是一点相关的资料
来源是http://hi.baidu.com/lzwwqk/blog/item/40a3f41bb4f8b3fbae513358.html

反引号 `

反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。例如:

$ pwd

/home/xyz

$ string=”current directory is `pwd`”

$ echo $string

current directour is /home/xyz

$

shell执行echo命令时,首先执行`pwd`中的命令pwd,并将输出结果/home/xyz取代`pwd`这部分,最后输出替换后的整个结果。

利用反引号的这种功能可以进行命令置换,即把反引号括起来的执行结果赋值给指定变量。例如:

$ today=`date`

$ echo Today is $today

Today is Mon Apr 15 16:20:13 CST 1999

$

反引号还可以嵌套使用。但需注意,嵌套使用时内层的反引号必须用反斜线(\)将其转义。例如:

$ abc=`echo The number of users is \`who| wc-l\``

$ echo $abc

The number of users is 5

$

在反引号之间的命令行中也可以使用shell的特殊字符。Shell为得到``中命令的结果,它实际上要去执行``中指定的命令。执行时,命令中的特殊字符,如$,”,?等又将具有特殊含义,并且``所包含的可以是任何一个合法的Shell命令,如:

$ ls

note readme.txt Notice Unix.dir

$ TestString=”`echo $HOME ` ` ls [nN]*`”

$ echo $TestString

/home/yxz note Notice

posted @ 2007-04-18 21:14 Justfly Shi 阅读(1959) | 评论 (1)编辑 收藏

Remote Debugging with Eclipse说明了远程调试的原理,说明了让java程序支持被远程调用所需要的java参数如下
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
以及如何配置远程调试weblogic、jboss和tomcat,但是里面对如何让tomcat支持远程调用并没有仔细说。再搜索,在tomcat的FAQ就找到了:
How do I configure Tomcat to support remote debugging?
如上面所示,其中的关键在于如何正确的启动tomcat。对于非windows平台下的操作来说,需要把%TOMCAT_HOME%/bin/startup.sh中的最后一行exec "$PRGDIR"/"$EXECUTABLE" start "$@" 中的start改成jpda start。如果的8000端口有其他用处的话,那么还需要修改catalina.sh文件,看其中的说明,添加一行JPDA_ADDRESS=”1044”或者其他你指定的端口。这样就可以通过startup.sh或者catalina.sh jpda start来其中支持远程调试的tomcat了。
在windows平台上是一样的步骤,只不过.sh文件改成了.bat文件了。然后需要注意以下这些地方,
1、 catalina.bat文件默认的JPDA_TRANSPORT是dt_shmem,但是Eclipse只支持dt_socket,所以需要在catalina.bat中添加一行set JPDA_TRANSPORT=”dt_socket”
2、 catalina.bat文件默认的端口是jdbconn,我也不知道这个端口是多少,因此添加一个set JPDA_ADDRESS="1044"

posted @ 2007-02-05 18:34 Justfly Shi 阅读(6756) | 评论 (0)编辑 收藏

资料地址: SSH技术专题|中国IT认证实验室
配置SSH所用密钥的方法
使用ssh-keygen或者ssh-keygen -d(for ssh2)产生密钥对,其中公钥的地址为$HOME/.ssh/id_dsa.pub,私钥的地址为$HOME/.ssh/id_dsa。
把.ssh下面的id_dsa.pub改名为authorized_keys,则可以使用id_dsa作为密钥实现登陆了



ssh-keygen -d调用过程

putty使用密钥登录的方法
putty是一个常用的ssh客户端,通过使用密钥登录,就可以不用每次登录的时候都使用密码了。1、使用puttygen.exe程序,先load上面生成的id_dsa文件,然后Save private key生成一个ppk文件。
2、打开putty,在Connection->SSH->Auth中选中该ppk文件就可以了。

SCP使用密钥登录的命令
scp -i .ssh/id_dsa ./tmp/test.tgz abc@192.168.0.5:/tmp
其中-i .ssh/id_dsa用于指定使用id_dsa做为私钥

posted @ 2007-01-29 20:03 Justfly Shi 阅读(758) | 评论 (0)编辑 收藏

25 测试驱动开发模式


准备两个TODO-List一个用于当前,一个用于最近
当发现有事情要做的时候,对其优先级进行判断,将其放到当前或者以后。
集中注意力于当前要做的事情

断言优先
写Case的时候,一开始就写断言,从测试完成时能通过的断言开始写。

测试数据
测试数据要使用容易让人理解的数据,不要为了编排数据而编排数据
不要用同一个常量来表达多种一丝。另外也可以使用真实数据进行测试。

尽量让测试的行为和数据容易理解,比如不使用常量,而是直接使用数字。在assert中加入断言要测试的目的的文字说明

26 不可运行状态


一步测试(One Step Test)
从计划列表中选择具有指导意义而且有把握实现的测试去完成它。  

启动测试(Starter Test)
从测试某个实质上不做任何工作的操作开始,这样的测试一般能很快工作。而一个做实际工作的功能的测试可能需要等你解决很多问题,比如:这个操作隶属于哪里?正确的输入是什么?对应的正确输出是什么?等等。结果是其长期无法通过。

回归测试(Regression Test)
对于一个错误情况,编写一个针对该错误的,会出错的,尽可能小的测试。

27测试模式


子测试(Child Test)
如果一个测试太大以至于难以运行起来,那么可以先把该测试给分解成几个小的测试,并注释掉本测试。等这些小测试通过之后再继续这个大的测试  

模拟对象(Mock Object)
如何测试一个依赖于昂贵的且复杂的资源的对象?创建一个这些资源的模拟版本。

自分流(self Shunt)
如何测试对象间是否正常交互?让测试对象于测试用例而不是期望的对象进行交互。
需要让测试用例类实现所要交互的类的接口。从而进行测试所实现的方法会被正确的调用。

日志字符串(Log String)
如何才能测试使消息调用顺序是正确的?将日志保存在字符串中,当调用一个消息时,就向字符串尾部追加相应的信息。

清扫测试死角(Crash Test Dummy)
如何测试到不大可能被调用的错误代码呢?使用一种特殊的对象调用它,这个对象抛出一个异常而不做任何实际工作。比如实现一个匿名File子类,只实现其createNewFile方法,方法中抛出一个异常,通过这种方式来测试文件系统满了的情况。

不完整测试(Broken Test)
留下半截句子或者一个没有通过的测试用例可以保证你离开代码一段时间之后依然能较快的回忆起原先的想法。

提交前保证所有测试运行通过
当你在团队中变成时如何结束一段编码工作?让所有测试运行起来。
注释掉一些测试代码使测试套件通过是要严格禁止的。

28可运行模式


伪实现(直到你成功)
测试不能通过时首先应该执行什么?可以返回一个常量。一旦你能使测试运行起来,那个常量就会逐渐换成用变量表示的表达式。这个方法可以从心理上让我们感到满足,可以让我们集中注意力于当前要解决的问题。

三角法(Triangulation)
怎样可以更适当地利用测试推动抽象呢?只有当你有两个或两个以上的例子时,你才能进行抽象。使用两个针对同一个测试目标的测试例子(或断言),在此基础上对该测试目标的实现进行抽象并实现。

显明实现(Obvious Implementation)
直接实现简单的操作。

从一到多(One to Many)
怎样实现一个作用于对象集合体的操作呢?首先在非集合体中实现,然后使之作用于集合体。

32 掌握TDD


什么可以不必测试?
应该测试:条件部分、循环部分、操作部分、多态性。除了不信任,否则不要测试其他来源的代码。

怎样知道自己的测试没有疏漏呢?
一些预示着设计存在这缺陷的特征:
过长的设置代码——如果为了一个简单的断言,需要花费上百行代码创建对象,那么肯定有哪儿不对劲儿。对象太大,需要分割。
冗余的设置代码——如果你无法为公共代码找到一个存放它的公共场所的话,那么就表明有太多的对象过于紧密地联系在一起了。
过长的测试运行时间——这样测试不会被经常运行,同时也暗示着对系统的方方面面进行测试是困难的。这种测试困难是一种设计问题,并且需要在设计时就被提出来。
脆弱的测试——意外中断的测试说明应用的某一部分出人意料地存在对另一部分的影响。你需要对系统进行设计,要么打破联系,要么将两部分合并,直到这种影响消失为止。

你需要多少反馈?
测试驱动的开发对测试的观点就是注重实效。在测试驱动开发中,测试从某种意义上说是一种达到目的的手段——达到充满自信地编写代码的目的。如果我们对实现有充分了解,不用测试就能拥有自信的话,那么就没有必要编写测试了。

什么时候应该删除测试?
如果删除一个测试降低了你对整个系统功能的信心,那么就不要删除。
如果你有两个测试,走的是同一条路,但对读者来说讲述的是不同的情形的话,那么就应该原封不动的保留。
如果有两个测试,它们就自信和沟通而言都是冗余的,那么就删除其中用处最小的那个。

如何中途转向测试驱动开发?
首先限定修改的范围。对于该范围外的可以简化的地方先不动手。
其次,必须打破测试与重构之间的僵局。可以先通过其他方式获取反馈,如系统测试,然后使用这些反馈进行修改。通过这种方式逐渐的让一直在改变的部分转向测试驱动。

posted @ 2006-11-21 00:24 Justfly Shi 阅读(541) | 评论 (0)编辑 收藏

  由于最近需要通过一种跨平台、跨语言的方式来传递需要多层嵌套的数据,因此研究了一下JSON。首先试用JSON-lib做一下测试,但是未能通过测试,于是再找其他几个Java实现,但是也未能通过测试。分别测试对于一个简单的类的序列化和反序列化,对于一个有数组和Map域的对象的序列化和反序列化。对于结果比较失望。
  其中的JSON-lib能通过第一个测试,第二个测试的时候则失败。但是有一个很大的bug,对于存在null域的对象反序列化的时候会失败。该bug已经在主页上了,但是不知道那个版本会修改。
  其中的StringTree只能revert回一个Map对象。而对于一个复杂的对象,则无法revert。在做第二个测试的时候总是停在那里不动了。
  其中的JSON-Tool根本就没有直接的序列化的功能。
  由于测试情况很不理想,因此只进行了两个测试,对于特殊字符、国际化的测试没有进行。
  
  结论:JSON的序列化和反序列化功能还不成熟。
  所有代码下载地址http://www.blogjava.net/Files/justfly/jsonTest.zip
  测试类如下:

 1 /**
 2  * created on 2006-10-2
 3   */

 4 package  cn.shijingjia.justfly.json;
 5
 6 import  java.util.HashMap;
 7 import  java.util.Map;
 8
 9 import  junit.framework.Assert;
10 import  net.sf.json.JSONObject;
11
12 import  org.junit.Before;
13 import  org.junit.Test;
14
15 import  cn.shijingjia.justfly.json.imps.StringTreeImp;
16
17 /**
18  *  @author  Shi Jiemiao
19  * 
20   */

21 public   class  JSonTest  {
22
23      private  SimpleClass simple1  =   new  SimpleClass();
24
25      private  SimpleClass simple2  =   new  SimpleClass();
26
27      private  SimpleClass simple3  =   new  SimpleClass();
28
29      private  IJSonUtil < SimpleClass >  simpUtil;
30
31      private  IJSonUtil < CompositeClass >  compositeUtil;
32
33      /**
34      *  @throws  java.lang.Exception
35       */

36     @Before
37      public   void  setUp()  throws  Exception  {
38         simple1.setAInt( 1 );
39         simple1.setStr( " name1 " );
40         simple2.setAInt( 2 );
41         simple2.setStr( " name2 " );
42         simple3.setAInt( 3 );
43         simple3.setStr( " name3 " );
44
45         simpUtil  =   new  StringTreeImp < SimpleClass > ();
46         compositeUtil  =   new  StringTreeImp < CompositeClass > ();
47     }

48
49      /**
50      * Test if it can format a object and then reverted it back
51       */

52     @Test
53      public   void  simpleTest()  {
54
55         String jsonString  =  simpUtil.toString(simple1);
56         System.out.println( " simpleClass\n "   +  jsonString);
57         SimpleClass revertedObj  =  simpUtil.toBean(jsonString);
58         Assert.assertEquals(simple1, revertedObj);
59     }

60
61      /**
62      * Test if it can format and revert a composite object with array and map
63       */

64     @Test
65      public   void  testComposite()  {
66          //  setup the origin composite class
67         CompositeClass composite  =   new  CompositeClass();
68         composite.setName( " composite Instance " );
69         composite.setSimple(simple2);
70         composite.setSimples( new  SimpleClass[]  { simple1, simple3, simple2 } );
71         Map multiMap  =   new  HashMap();
72         multiMap.put( " simpleObject " , simple3);
73         multiMap.put( " aString " " This is a String " );
74         multiMap.put( " A integer " 297 );
75         composite.setMultiMap(multiMap);
76          //  orgin json object and jsonString
77         String jsonString  =  compositeUtil.toString(composite);
78         System.out.println( " composite class\n "   +  jsonString);
79
80          //  Map atrMap = new HashMap();
81          //  atrMap.put("simpleObject", SimpleClass.class);
82          //  atrMap.put("aString", String.class);
83          //  atrMap.put("A integer", Integer.class);
84
85         CompositeClass revertedBean  =  compositeUtil.toBean(jsonString);
86         Assert.assertEquals(composite, revertedBean);
87     }

88
89 }

90


posted @ 2006-10-03 17:45 Justfly Shi 阅读(3137) | 评论 (3)编辑 收藏

I have talked with my boss last week. Because there is a workflow enginee in our product, my boss don't allow me to release an open source workflow enginee , even the design of my Frontal Sea Workflow Engine is different with the enginee in our product.

posted @ 2006-08-30 23:28 Justfly Shi 阅读(603) | 评论 (0)编辑 收藏

I want to develop a workflow engine together with my girl friend. The purpose of developing a workflow is list below:
1. I was deploy project with workflow or developing workflow product in my three year career, but none of them can satisfy me.
2. I think I can study and practice java 5, spring, Hibernate 3, AJAX, Eclipse EMF etc...
3. With pair programming, I can teach my girl friend how to do professional programming

What is Frontal Sea?
Frontal Sea is the name of a scenic beach in my hometown. Spray waving lightly, the sea breeze blowing softly. It is peaceful; it is full of childhood memories.

posted @ 2006-06-21 00:49 Justfly Shi 阅读(715) | 评论 (0)编辑 收藏

前言
vi是一个跨平台的文本编辑工具,在我工作中所遇到的所有操作系统平台都能找到它,同时vi支持手放在主键盘上就可以完成所有的操作, 对于我这种非常反感右手在键盘、数字键、方向键和鼠标之间来回切换的懒人来说,实在是太方便了。虽然以前也学习过一点基本的vi操作,但是总是不全,比如 不知道怎么进行字符选中。
前几天花了一点时间学习了一下gvim。主要是学习它的一些快捷键。现在的gvim已经是7.0版本,自带了一份中文的简短的教程,对于我这个只需要学习一下简单操作的初级用户来说已经足够了。


目录
移动
字符编辑
搜索替换
命令格式
文件操作


移动

           k (上行) 
h (左移)            l (右移)
           j (下行)          
0行头 $行尾 e 单词结尾 w单词开头 Ctrl+e 窗口内容向下移动 Ctrl+y窗口内容向上移动
Ctrl-g 显示当前光标所在位置和文件状态信息。
Shift-G 用于将光标跳转至文件最后一行。
LineNumber Shift-G 将光标移动至该行号代表的行


字符编辑

i 在当前位置开始编辑
a 在当前位置之后开始编辑
x 删除光标所在位置的字符
A 在当前行末尾开始编辑
dw 从当前光标删除至单字/单词末尾
d$ 从当前光标删除至当前行末尾
dd 删除整行
u 撤消以前的操作
U 撤消在一行中所做的改动
CTRL-R    撤消以前的撤消命令,恢复以前的操作结果
p 重新置入已经删除的文本内容
r 替换光标所在位置的字符
cw 替换当前光标到单词的末尾的内容
c$ 替换当前光标到行末的内容
小写的 o 在光标下方打开新的一行并将光标置于新开的行首,进入插入模式
大写的 O 在光标上方打开新的一行并将光标置于新开的行首,进入插入模式
小写的 a 在光标所在位置之后插入文本
大写的 A 在光标所在行的行末之后插入文本
大写的 R 进入替换模式,直至按 <ESC> 键退出替换模式而进入正常模式。
%  将光标移动到配对的括号上


搜索替换

   输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。
     输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字
     符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查
     找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。


   在一行内替换头一个字符串 old 为新的字符串 new,请输入  :s/old/new
     在一行内替换所有的字符串 old 为新的字符串 new,请输入  :s/old/new/g
     在两行内替换所有的字符串 old 为新的字符串 new,请输入  :#,#s/old/new/g
     在文件内替换所有的字符串 old 为新的字符串 new,请输入  :%s/old/new/g
     进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc


命令格式

   在正常模式下一个命令的格式是∶

       [number]   command   object     或者     command    [number]   object
     其意是∶
       number - 代表的是命令执行的次数
       command - 代表要做的事情,比如 d 代表删除
       object - 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。



文件操作

  :w FILENAME  可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
     件中。

  :#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件
     FILENAME 中。

  :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
     后面。

posted @ 2006-06-02 20:06 Justfly Shi 阅读(2034) | 评论 (3)编辑 收藏

<label for="myId">点一下这里<input type="checkbox" name="abc" value="nil" id="myId">也可以点一下这里</label>
<input type="checkbox" name="abc" value="nil" id="myId2"><label for="myId2">点一下这里</label>

posted @ 2006-04-14 12:38 Justfly Shi 阅读(3401) | 评论 (0)编辑 收藏

首先,为了能运行ant相关的svn任务,我们到subclipse的子项目svnant里去下载一个svnant
地址是:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=1731&expandFolder=1731&folderID=0
这个时候如果linux上已经装有了svn命令行工具的话,那么就可以直接按照把svnant里面的相关的jar放到ant的lib目录下使用就可以了。
不过由于一般新安装的linux系统或者是其他没有svn客户端的系统都没有svn命令行工具,那么可以使用一个全部用java实现的svn客户端实现来作替代。
具体的替代办法在下面这个网址里面提供了
http://tmate.org/svn/kb/user-guide-svnant.html

其内容如下:

Making SvnAnt use JavaSVN

Step-by-step instructions:

  • Remove existing javahl.jar and svnClientAdapter.jar (libraries distirbuted with the svnant) from your Ant classpath (ANT_HOME/lib/ directory).
  • Download latest version of JavaSVN library. You will need javasvn.jar and javasvn-javahl.jar files from the library distribution.
  • Get patched version of svnClientAdapter.jar (version 0.9.32).
  • Put javasvn.jarjavasvn-javahl.jar and svnClientAdapter-0.9.32.jar files on your Ant classpath (ANT_HOME/lib/ directory).

After performing the steps above svnant will use JavaSVN instead of JavaHL bindings.

If you have any questions regarding JavaSVN, would like to report a bug or contribute a patch, please write to support@tmatesoft.com

posted @ 2006-03-30 15:11 Justfly Shi 阅读(3442) | 评论 (0)编辑 收藏

从原来的blog中转了几个技术文章过来,原来还想转几篇非技术的文章,但是想了想,还是算了。

posted @ 2006-02-04 23:28 Justfly Shi 阅读(494) | 评论 (0)编辑 收藏

对于ORACLE9i的初步安装完成后,接下来由于“ORA-12571:TNS:包写入程序失败”错误,数据库并没有建立问题的解决方法:
打开“D:\oracle\ora92\network\admin\sqlnet.ora”文件,把其中的“NTS”改为“NONE”

posted @ 2006-02-04 23:22 Justfly Shi 阅读(1842) | 评论 (0)编辑 收藏

Eclipse3.1中的Alt+/快捷键除了分配给content assistent之外还分配给了Word Completion。所以在默认的情况下它是不好使的。
解决方案:把Word Completion的快捷键给改成别的,我是改成Alt+shift+/。

改快捷键的方法windows->preference->keys

posted @ 2006-02-04 23:21 Justfly Shi 阅读(1219) | 评论 (3)编辑 收藏

http://www.jdom.org/docs/faq.html#a0350

How do I keep the DTD from loading? Even when I turn off validation the parser tries to load the DTD file.

Even when validation is turned off, an XML parser will by default load the external DTD file in order to parse the DTD for external entity declarations. Xerces has a feature to turn off this behavior named "http://apache.org/xml/features/nonvalidating/load-external-dtd" and if you know you're using Xerces you can set this feature on the builder.

builder.setFeature(
"http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

If you're using another parser like Crimson, your best bet is to set up an EntityResolver that resolves the DTD without actually reading the separate file.

import org.xml.sax.*;
import java.io.*;
public class NoOpEntityResolver implements EntityResolver {
public InputSource resolveEntity(String publicId, String systemId) {
return new InputSource(new StringBufferInputStream(""));
}
}

Then in the builder...

builder.setEntityResolver(new NoOpEntityResolver());

There is a downside to this approach. Any entities in the document will be resolved to the empty string, and will effectively disappear. If your document has entities, you need to setExpandEntities(false) code and ensure the EntityResolver only suppresses the DocType.

posted @ 2006-02-04 23:19 Justfly Shi 阅读(785) | 评论 (3)编辑 收藏

今天在和小彭聊天的时候谈到了他在最近的项目中的设计的时候,我说了这么一句“做设计的时候需要从用户的角度来考虑,写设计文档的时候需要从开发人员的角度来考虑”。
晚 上重新想到了这句话,是挺有用的,但是也是挺简单的一个道理:做一个工作的时候想好了这个工作的目标是什么,然后从这个目标反过来对这个工作进行要求。比 如,做设计是为了实现需求,所以要从用户使用的角度来考虑,设计文档是为了指导开发人员写代码的,所以需要从开发人员编码的角度来考虑。
这些很简 单的道理,我们这些IT人能不懂吗?能不理解吗?但是很多时候我们都忘了这个道理,很多时候总会说:什么什么事情我不知道该怎么做?OK,真的不知道吗? 考虑一下做这个事情的目标是什么,然后回过头来推一下,为了达到这个目标需要做什么?好的,有方案了吧?可能是错误的,也可能遗漏了很重要的事情,但是至 少不是不知道该怎么做了吧?

posted @ 2006-01-17 23:56 Justfly Shi 阅读(434) | 评论 (0)编辑 收藏

这两天在修改代码中的log4j的配置。
log4j的配置有两种,一种是按照属性进行配置,一种是使用代码进行配置。
1、按照属性进行配置
按照属性进行配置可以分为按照properties格式的进行配置,一种是按照XML格式的进行配置,后者没有研究过,在此就不写了。
按照properties 的设置比较简单。使用org.apache.log4j.PropertyConfigurator类就可以了
最简单的当时是如下所示的代码了。

PropertyConfigurator.configure(_log4jProperties);
另外在这个类中还有别的方法也相当有用,如:
 static  public  void configureAndWatch(String configFilename)
2、使用代码进行配置
这个比较罗嗦,不过可控制性比较高
代码示例如下:
Layout layout = new PatternLayout(logPattern);
RollingFileAppender fileAppendar 
= new RollingFileAppender(layout,_fileName, true);
fileAppendar.setMaximumFileSize(_fileSize 
* 1024 * 1024);
fileAppendar.setMaxBackupIndex(_fileNum);


ConsoleAppender consoleAppendar 
= new ConsoleAppender(layout, "System.out");
consoleAppendar.setLayout(layout);

Logger mainLogger 
= Logger.getLogger("cn.justfly");
mainLogger.setLevel(Level.toLevel(_logLevel, Level.INFO));
mainLogger.addAppender(fileAppendar);
mainLogger.addAppender(consoleAppendar);

需要分别配置Layout、Appender和Logger
然后把Layout配置给Appender,把Appender添加给Logger,于是乎就大功告成了。
3、去掉原有的属性配置
在上面的两种方面中只是会添加原有的配置。并不会删除掉原先的配置项。
可以使用LogManager.resetConfiguration();来删除原有的配置。
4、锁定
在执行配置代码的时候,当有Logger在干活的时候怎么办?
比如在你去掉原有的配置项而还没有来得及设置新的属性的时候的时候
这个时候Log4j的配置是空的,如果这个时候有一个Logger正在log的话是会出错的。
所以我们需要一个锁,它可以让你在进行配置的时候阻塞其它Logger的动作。
这个锁就是rootLogger。可以通过Logger.getRootLogger()获取到。

posted @ 2005-12-26 21:21 Justfly Shi 阅读(3570) | 评论 (0)编辑 收藏

就在org.apache.log4j.PatternLayout这个类的说明文档中

posted @ 2005-12-08 18:15 Justfly Shi 阅读(587) | 评论 (0)编辑 收藏

看了一下日历,整整有一周没有写blog了。并不是因为自己不想写了,而是因为很忙很忙的过了一周,估计接下来还有一段时间是没空写blog。昨天在和客户讨论完需求之后,偷空看了看Annotation。不过今天是在是没有时间写blog了。时间啊……

posted @ 2005-09-22 23:50 Justfly Shi 阅读(466) | 评论 (0)编辑 收藏

一个大将被调去做外包了,一个大校去做论文了,两个中尉还没有成长起来。
就我一个司令又要排兵布阵又要上场杀敌又要行政又要应付公文往来还要到处去救火
为啥长春开发人员就这么难招呀,别说大将,连小兵都招不来合格的。
命苦呀

posted @ 2005-09-14 00:30 Justfly Shi 阅读(1099) | 评论 (2)编辑 收藏

范型有两种,类范型和方法范型。他们可以用于一些类似于C++中的模板之类的作用。
这里主要有这么几点要注意:
0、范型类之间的转型
1、范型类的继承
2、范型方法的override
3、关键字 super 和exends的使用。

package cn.justfly.study.tiger.generics;

import java.util.Collection;

/**
 * Sample of defining generics type
 * 
 * @author Justfly Shi 
 * created at 2005-8-25 22:03:09
 
*/

public class Defination<G_T, G_B> {
  
private G_T _t = null;

  
private G_B _b = null;

  
public G_B getB() {
    
return _b;
  }


  
public void setB(G_B b) {
    _b 
= b;
  }

  
  
//Generics Method
  <G_A> G_A abc(G_A a,Defination<G_T, ? extends G_B> f)//keyword extends
  {
    
return a;
  }


  
//class Generics Method
  static <G_F,G_F2> void test(G_F[] a, Collection super G_F> b)// keyword super 
  {
    
for (G_F o : a) {
      b.add(o);
    }

  }


  
public G_T getT() {
    
return _t;
  }


  
public void setT(G_T t) {
    _t 
= t;
  }


  
public Defination(G_T t, G_B b) {
    super();
    _b 
= b;
    _t 
= t;
  }


  
/**
   * @param args
   
*/

  
public static void main(String[] args) {
    Defination
<A, A> d = new Defination<A, A>(new AImp2(), new AImp1());
    printDefination(d);

    
// about extends
    Defination<A, A> right = new SubDefination<A, A>(new AImp2(), new AImp1());
    printDefination(right);
    
// Type mismatch: cannot convert from SubDefination// Defination// Defination// AImp1());

    
// Type mismatch: cannot convert from Defination// Defination// Defination// AImp1());
  }


  
private static void printDefination(Defination<A, A> defination) {
    A t 
= defination.getT();
    A b 
= defination.getB();
    System.
out.println(t.getValue());
    System.
out.println(b.getValue());
  }

}


class SubDefination<G_T, G_J> extends Defination<G_T, G_J> {

  
public SubDefination(G_T t, G_J b) {
    super(t, b);
  }

  
  @Override
  
<G_A> G_A abc(G_A a, Defination<G_T, ? extends G_J> f) {
    
return super.abc(a, f);
  }

  
}


class A {
  String getValue() 
{
    
return "class A";
  }

}


class AImp1 extends A {
  
public String getValue() {
    
return "class AImp1";
  }

}


class AImp2 extends A {
  
public String getValue() {
    
return "class AImp2";
  }

}

最后再推荐一篇中文的范型学习资料
在Eclipse 3.1中体验J2SE 5.0的新特性 : 第三部分 :范型

posted @ 2005-09-13 23:50 Justfly Shi 阅读(1200) | 评论 (2)编辑 收藏

Enum也是java中我比较喜欢的一个改进,虽然使用到的地方并不多。
每一个enum类型都默认的继承了java.lang.Enum虚拟类。
每一个列举实例都是改enum类型的一个实例。

package cn.justfly.study.tiger.enums;

/**
 * Sample code of enum
 * 
 * @author Justfly Shi created at 2005-9-12 23:59:59
 
*/
public enum Gentle {
  WOMAN(
":)"), MAN(":|");
  Gentle(String hello) {
    _hello 
= hello;
  }

  String _hello;

  String sayHello() {
    
return _hello;
  }

  
public static void main(String[] args) {
    System.
out.println(Gentle.MAN.getDeclaringClass());

    Gentle[] allGentles 
= Gentle.values();
    System.
out.println("There are " + allGentles.length + " Gentles");
    
for (Gentle g : allGentles) {
      System.
out.println("index: " + g.ordinal() + " name: " + g.name()
          
+ " HelloSmile: " + g.sayHello());
    }
  }
}

posted @ 2005-09-13 00:02 Justfly Shi 阅读(812) | 评论 (0)编辑 收藏

改进的for循环是Java 5.0中的一个让我很喜欢的改进。它只对数组和实现了java.util.Iterable接口的容器类有效。
package cn.justfly.study.tiger.enhancedfor;

import java.util.ArrayList;
import java.util.Collection;


/**
 * The demo of enhanced for statement
 * it can only used for array and classes implements java.util.Iterable interface
 * @author Justfly Shi
 * created at 2005-8-28 21:42:12
 
*/
public class EnhancedFor {

  
/**
   * @param args
   
*/
  
public static void main(String[] args) {
    
//for array
    int[] intArray={1,2,3,4};
    System.
out.println("printing ints:");
    
for(int i:intArray){
      System.
out.println(i);   
    }
    
    
//for Collection
   Collection<String> list=new ArrayList<String>();
    
for(int i=0;i<4;i++){
      list.add(
"String"+i);
    }
    System.
out.println("print Strings in an Collection:");
    
for(String i:list){
      System.
out.println(i);
    }
    
    
//self-define Iterable
    MyIterable<String> myIte=new MyIterable<String>(list);
    System.
out.println("print Stings in an Iterable");
    
for(String i:myIte){
      System.
out.println(i);
    }
    
  }

}

package cn.justfly.study.tiger.enhancedfor;

import java.util.Collection;
import java.util.Iterator;

/**
 * an self-defined Iterable ,that can be used in enhanced-for statement 
 * @author Justfly Shi
 * created at 2005-8-28 22:09:05
 * @param 
 
*/
public class MyIterable<G_E> implements Iterable<G_E> {
  
private Collection<G_E> _list;

  
public Iterator<G_E> iterator() {
    
return new MyIterator<G_E>(_list.iterator());
  }

  
public MyIterable(Collection<G_E> list) {
    _list 
= list;
  }

  
class MyIterator<G_I> implements Iterator<G_I> {
    
private Iterator<G_I> _ite;

    MyIterator(Iterator
<G_I> ite) {
      _ite 
= ite;
    }

    
public boolean hasNext() {
      
return _ite.hasNext();
    }

    
public G_I next() {
      
return _ite.next();
    }

    
public void remove() {
      _ite.remove();

    }
  }
}

输出结果
printing ints:
1
2
3
4
print Strings in an Collection:
String0
String1
String2
String3
print Stings in an Iterable
String0
String1
String2
String3

posted @ 2005-09-12 23:44 Justfly Shi 阅读(1644) | 评论 (0)编辑 收藏

如下列代码所示

1、传入的可变参数将做为一个数组处理
2、一个函数中只能有一个可变参数列,并且只能在函数参数定义的最后。
package cn.justfly.study.tiger;

/**
 * Sample of using varargs
 * @author Justfly Shi
 * created at 2005-8-31 0:38:19
 
*/
public class Varargs {
  
public void printObjectArgs(Object objects ){
    
for(Object o:objects)// objects is an Object Array
    {
      System.
out.println(o);
    }
    System.
out.println("var count:"+ objects.length);
  }
  
public void printFloats(float fs ){
    
for(float f:fs){
      System.
out.println(f);
    }
    System.
out.println("var count:"+ fs.length);
  }
// only one param can be var args,and should be placed at the end of param list   
//  public void printArgs(Integer integers,String objects  ){}

  
/**
   * @param args
   
*/
  
public static void main(String[] args) {
    Varargs vars
=new Varargs();
    vars.printObjectArgs(
new Integer(1),new Integer(2),3,"abc");
    vars.printFloats(
1.2f,1.3f);
  }

}
输出结果:
1
2
3
abc
var count:4
1.2
1.3
var count:2

posted @ 2005-09-12 23:17 Justfly Shi 阅读(823) | 评论 (0)编辑 收藏

在java5中添加的一个新特性就是static import(静态导入?)通过静态导入我们可以很方便的使用在其他类中定义的函数。如下面的代码所示,我们可以直接的使用java.lang.Math 的min和max以及其他在java.lang.Math中所定义的静态方法,只需要在import中添加一句import static java.lang.Math.*。这是一个很方便的功能。

package cn.justfly.study.tiger;

import 
static java.lang.Math.max;
import 
static java.lang.Math.min;
/**
 * Sample of Static Import
 * @author Justfly Shi
 * created at 2005-9-3 23:41:50
 
*/

public class StaticImport {

  
/**
   * @param args
   
*/

  
public static void main(String[] args) {
   
/*
    * min() and max() are defined in java.lang.Math as static method.
    * but they can now be easily access.
    * 
*/

   
int min=min(3,4);
   System.
out.println("min is : "+min);
   
int max=max(3,4);
   System.
out.println("max is : "+max);

  }


}


但是这个功能却不能滥用。因为它会导致代码的可读性变得很差。考虑一下一个未曾接触过java.lang.Math类的读者来看这段代码。当他读到“int min=min(3,4)”,他会很迷惑,这个min函数到底是在哪里定义的呢?于是他就得去分析import这里。这段代码还好说,只有一个类被静态导入,只需要打开 java.lang.Math的文档就可以直接了解这些方法的相关信息了。但是如果同时静态导入了10个类的情况下呢?如果这些类中有着名字类似(相同)但是行为却不一致的方法的时候呢?比如Person.eat(Food food)和 Animal.eat(Food food)。

那么这个功能该如何用呢?我认为一些常用的工具类、全局变量类等当需要在一个类中多次使用的时候可以导进来,但是对于系统中的模型类或者是用的次数不多的工具类还是不要导入的好。我们需要在自己写代码时的方便和代码本身的可读性间做个权衡。

posted @ 2005-09-11 20:15 Justfly Shi 阅读(1123) | 评论 (0)编辑 收藏

要注意的是,当要被unboxing的封装类为null的时候或未被初始化时会抛出一个nullpoint错误

package cn.justfly.study.tiger;

import java.util.ArrayList;
import java.util.Collection;

/**
 * Sample code of autoBoxing and auto-unboxing 
 * @author Justfly Shi
 * created at 2005-8-28 
 
*/

public class Boxing {

  
/**
   * @param args
   
*/

  
public static void main(String[] args) {
    Collection
<Integer> c = new ArrayList<Integer>();

    
for (int i = 0; i < 5; i++{
      c.add(i);
// autoboxing
    }

    System.
out.println("iterate with Interger");
    
for (Integer i : c) {

      System.
out.println(i + 100);// unboxing
    }


    System.
out.println("iterate with int");
    
for (int i : c)// unboxing in enhanced for
    {

      System.
out.println(i + 100);
    }

    
    Integer i
=null;
    
int j=i;//NullPointerException will be throw here
    System.out.println(j);
  }


}

posted @ 2005-09-11 02:07 Justfly Shi 阅读(582) | 评论 (0)编辑 收藏

小弟我新到贵地,请大家多多照顾。
现有gmail邀请函一些,有需要者请留Email

posted @ 2005-09-11 00:16 Justfly Shi 阅读(446) | 评论 (0)编辑 收藏