qiyadeng

专注于Java示例及教程
posts - 84, comments - 152, trackbacks - 0, articles - 34

1,现在全国上下,流行骂人骂得最凶的一句话:
甲:听说你哥哥在国家队踢球?
乙:你哥哥才在国家队踢球呢!!!你全家都在国家队踢球!!!


2,国内猪肉涨价的真实原因
儿子问:爸爸,猪肉为什么会涨价?
爸爸和蔼的告诉他:儿子,中国的猪都被一个叫猪广户的带去踢足球了。国内没货

 

posted @ 2007-07-21 23:51 qiyadeng 阅读(314) | 评论 (0)编辑 收藏

 

开始

1.    DBTestCase的子类建立数据库

2.    用你自己的TestCase子类建立数据库

3.    数据库数据校验

4.    DbUnitAnt任务和Canoo web测试(此处省略,另详)

 

DBTestCase的子类建立数据库

 

第一步:创建你的dataset文件

你的测试需要一些数据。这就意味着你必须创建dataset。许多情况下你都是处理xmldataset。你可以人工凑一些一般的xml dataset或是从你的数据库中导出一个xml dataset.

 

第二步:继承DBTestCase

现在你要创建一个测试类。最简单的方式是用通过继承DbUnitDBTestCase来创建你自己的测试类。DBTestCase继承了JunitTestCase类。一个模板方法你需要实现,getDataSet()返回你在第一步创建的datasetDBTestCase依靠IdatabaseTester来工作,默认的配置是使用PropertiesBaseJdbcDatabaseTester,它是用系统属性来指出DriverManager的配置。最简单的方式是在你测试类的构造函数中配置它。你可以通过覆盖getDatabaseTester()方法来修改它的行为。

 

使用下面提供的三种IDatabaseTester之一实现,你也可以使用下面表中描述的DBTestCase的其它子类。

JdbcBaseDBTestCase

使用DriverManager来创建连接(JdbcDatabaseTester的帮助下)

DataSourceBasedDBTestCase

使用javax.sql.DataSource来创建连接(DataSourceDatabaseTester的帮助下)

JndiBasedDBTestCase

使用javax.sql.DataSourece通过JNDI定位(jndiDatabaseTester的帮助下)

 

下面是一个简单的实现,连接到一个Hypersonic数据库并返回xml dataset

 

public class SampleTest extends DBTestCase

{

    
public SampleTest(String name)

    {

        
super( name );

        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, 
"org.hsqldb.jdbcDriver" );

        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, 
"jdbc:hsqldb:sample" );

        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, 
"sa" );

        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, 
"" );

    
// System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, "" );

    }

 

    
protected IDataSet getDataSet() throws Exception

    {

        
return new FlatXmlDataSet(new FileInputStream("dataset.xml"));

    }

}

 

第三步:(可选)实现getSetUpOperation()getTearDownOperation()方法

默认的情况,DbUnit在每次执行test之前执行一个CLEAN_INSERT操作并且不之后不执行清除操作。你可以通过覆盖getSetUpOperation()getTearDownOperation()来改变这个行为。

 

下面这个例子演示你可以通过简单的覆盖方法改变执行测试前和后。

 

public class SampleTest extends DBTestCase

{

    

    
protected DatabaseOperation getSetUpOperation() throws Exception

    {

        
return DatabaseOperation.REFRESH;

    }

 

    
protected DatabaseOperation getTearDownOperation() throws Exception

    {

        
return DatabaseOperation.NONE;

    }

    

}

 

第四步:实现你的testXXX()方法

就像你使用JUit一样实现test方法。你的数据库在测试方法之前初始化并且在测试之后清除,这取决于你在前几步是怎么做的。

 

 

 

用你自己的TestCase子类建立数据库

为了使用DbUnit你不是必须要继承DBTestCase类。你可以覆盖标准的JunitSetUp()方法,执行你所需要的数据库操作。如果你要执行清除,同样覆盖teardown()方法。

 

例如:

 

public class SampleTest extends TestCase

{

    
public SampleTest(String name)

    {

        
super(name);

    }

 

    
protected void setUp() throws Exception

    {

        
super.setUp();

 

        
// initialize your database connection here

        IDatabaseConnection connection 
= null;

        
// 

 

        
// initialize your dataset here

        IDataSet dataSet 
= null;

        
// 

 

        try1

        {

            DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);

        }

        
finally

        {

            connection.close();

        }

    }

    

}

 

 

自从2.2版本你可以使用IdatabaseTester来完成同样的功能。就像前面所提到过的,DBTestCase内部是使用IdatabaseTester来实现的。你的测试类可以使用这个功能操作数据集(DataSets)。目前有4个方便的实现。

JdbcDatabaseTester

使用DriverManager来创建连接。

PropertiesBasedJdbcDatabaseTester

也是使用DriverManager来创建连接,但是配置信息是从系统属性中读取的。这是DBTestCase的默认实现方式。

DataSourceDatabaseTester

使用javax.sql.DataSource创建连接。

JndiDatabaseTester

使用javax.sql.DataSource通过JNDI寻找

 

 

你也可以提供你自己的IdatabaseTester实现,推荐使用AbstractDatabaseTester作为一个开始点。

例:

 

public class SampleTest extends TestCase

{

    
private IDatabaseTester databaseTester;

 

    
public SampleTest(String name)

    {

        
super(name);

    }

 

    
protected void setUp() throws Exception

    {

        databaseTester 
= new JdbcDatabaseTester("org.hsqldb.jdbcDriver",

            
"jdbc:hsqldb:sample""sa""");

 

        
// initialize your dataset here

        IDataSet dataSet 
= null;

        
// 

 

        databaseTester.setDataSet( dataSet );

    
// will call default setUpOperation

        databaseTester.onSetUp();

    }

 

    
protected void tearDown() throws Exception

    {

    
// will call default tearDownOperation

        databaseTester.onTearDown();

    }

    

}

 

 

 

数据库数据校验

DbUnit提供校验两个表或是数据集是否包含相同的数据的方法。下面的两个方法是在执行测试类的时候可以校验你的数据库中是否包含预期的数据。

 

 

public class Assertion

{

    
public static void assertEquals(ITable expected, ITable actual)

    
public static void assertEquals(IDataSet expected, IDataSet actual)

}

 

例子

以下例子,展示怎么比较一个数据库表的快照和一个XML表。

 

public class SampleTest extends DBTestCase

{

    
public SampleTest(String name)

    {

        
super(name);

    }

 

    
// Implements required setup methods here

    

 

    
public void testMe() throws Exception

    {

        
// Execute the tested code that modify the database here

        

 

 

        
// Fetch database data after executing your code

        IDataSet databaseDataSet 
= getConnection().createDataSet();

        ITable actualTable 
= databaseDataSet.getTable("TABLE_NAME");

 

        
// Load expected data from an XML dataset

        IDataSet expectedDataSet 
= new FlatXmlDataSet(new File("expectedDataSet.xml"));

        ITable expectedTable 
= expectedDataSet.getTable("TABLE_NAME");

 

        
// Assert actual database table match expected table

        Assertion.assertEquals(expectedTable, actualTable);

    }

}

 

actual数据集是一个数据库的快照可以和你想要比较的expected数据集进行比较。就象他的名字一样,expected数据集中包含预期的值。

 

expected数据集一定要和你建立数据库时的对象不一样。因为你需要两个数据集,一个是在测试之前建立数据库,一个是提供匹配测试时的expected数据。

 

 

使用查询来获取数据库的快照

你也可以校验查询的结果是不是和期望的数据集匹配。这个查询可以使查询一个表中的一部分也可以是多表的联合查询。

 

Itable actualJoinData = getConnection().createQueryTable("RESULT_NAME",

                
"SELECT * FROM TABLE1, TABLE2 WHERE ");

 

 

在比较的时候忽略一些列

 有些时候希望忽视一些列来进行比较,特别是对主键,日期或是时间列,这些列的值是在测试的时候又代码产生的。一种方式是在你的expected表中省略你不想比较的列的声明。这样你可以过滤真实的数据库表只暴露出expected表中的列。

 

 下面这些代码片段向你展示怎么过滤真实数据库中的表。首先,真实数据库中必须包含expected表中的所有列。另外,真实表中有这些列而expected表中没有这些列,这种情况是允许的。

 

 

    ITable filteredTable = DefaultColumnFilter.includedColumnsTable(actual, 

            expected.getTableMetaData().getColumns());

    Assertion.assertEquals(expected, filteredTable);

 

 

这个技术的主要限制是你不能在你的expected数据集XML中使用DTD。使用DTD的话你需要过滤expected表和真实表中的列。查看FAQ中关于在运行时排除一些表的列(excluding some table columns at runtime)

 

行顺序

默认的情况下,用DbUnit得到的数据库快照表是按主键排序的。如果一个表没有主键或是主键是由数据库自动产生的,行的顺序是不确定的,那么assertEquals将会失败。

 你一定要排序你的数据库快照通过在IdatabaseConnection.createQueryTable时手工加入”ORDER BY”语句。或者你可以这样使用SortedTable:

 

Assertion.assertEquals(new SortedTable(expected),

                
new SortedTable(actual, expected.getTableMetaData()));

 

  

posted @ 2007-06-25 11:45 qiyadeng 阅读(1972) | 评论 (0)编辑 收藏

 两分钟教程

  这是一个关于XStream快速的介绍。快速浏览一下你会马上知道把一个对象转换到XML或是转换回来是多么的简单。你肯定会碰到下面的问题。

 

创建能够序列化的类

  这是一组简单的类。XStream能把这些类的实例转换到XML或是转换回来。

 

public class Person { 

 
private String firstName;
 
private String lastName;
 
private PhoneNumber phonex;
 
private PhoneNumber fax;
//构造函数或是其他方法 


public class PhoneNumber { 

 
private int code;
 
private int number; 

//构造函数或是其他方法
}

 

  :注意到这些都是私有变量。XStream不关心变量的作用域。不需要getter或是setter方法。并且,XStream不限定需要默认的构造函数。

 

实例化XStream

使用XStream,简单实例化XStream类:

 

XStream xStream = new XStream(); 

 

 你需要xstream-[version].jar and xpp3-[version].jar在classpath中。XPP3是一个非常快的XML拉式转换器工具。如果你不想包含这个依赖,你可以使用标准的JAXP DOM转换器来代替。

 

XStream xStream = new XStream(new DomDriver());//不需要XPP3库 


:这个类的简单设计是为了实现通用操作的。为了实现更复杂的操作你可以选择自己创建出不同方式。

 

现在,为了使用XStream来更精简的输出XML,你可以为自定义的类创建别名到XML的元素名的映射。这是使用XStream唯一需要的映射的,甚至这个都是可选的。

 

xStream.alians("person",Person.class); 

 

:这是可选的一步。没有这步XStream也可以很好的起作用,但是XML元素的名字就会包含每个类的全称(包括包名),这将会使生成XML稍大。

 

序列号一个对象到XML

 让我们创建一个Person的实例并且填充它的变量域:

 

Person joe = new Person("Joe","Walnes"); 

joe.setPhone(
new PhoneNumber(123,"1234-456")); 

joe.setFax(
new PhoneNumber(123,"9999-999")); 

 

现在转换到XML,你要做的是简单的调用XStream:
 

String xml = xstream.toXML(joe); 

生成的XML看上去像这样:

 

<person>
  
<firstname>Joe</firstname>
  
<lastname>Walnes</lastname>
  
<phone>
    
<code>123</code>
    
<number>1234-456</number>
  
</phone>
  
<fax>
    
<code>123</code>
    
<number>9999-999</number>
  
</fax>
</person> 

 

非常简单,像创建XML一样。

 

从XML反序列化一个对象

 

从XML重新构造一个对象:
 

Person newJoe = (Person)xStream.fromXML(xml); 


XStream是多么的简单啊!

 

总结:

 

使用xStream.alias(String elementName, Class cls)为任何一个自定义类创建到类到元素的别名;

使用xStream.toXML(Object obj)转换对象到XML;

使用xStream.fromXML(String xml)转换XML到对象;

(附原文地址:http://xstream.codehaus.org/tutorial.html)

posted @ 2007-05-08 18:14 qiyadeng 阅读(23261) | 评论 (8)编辑 收藏

   今天在调试程序中发现类似下面这种错误

- SQL Error: 1064, SQLState: 42000- You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REQUIRE, PLAN_DATE, COMPILE, AUDITOR, AGREE_PERSON, AGREE_DATE, ADD_BY, MOD_BY, ' at line 1- Could not synchronize database state with sessionorg.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update


找了半天也没发现是什么错误,搜索多数认为是 hbm.xml中catalog中引起的问题,但我检查了发现不是配置文件引起的问题。后来联想到是不是MySQL的保留字的问题,找到http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#reserved-words,果然是。
MySQL的保留字有以下这些,使用中需要注意。
ADD ALL ALTER
ANALYZE AND AS
ASC ASENSITIVE BEFORE
BETWEEN BIGINT BINARY
BLOB BOTH BY
CALL CASCADE CASE
CHANGE CHAR CHARACTER
CHECK COLLATE COLUMN
CONDITION CONNECTION CONSTRAINT
CONTINUE CONVERT CREATE
CROSS CURRENT_DATE CURRENT_TIME
CURRENT_TIMESTAMP CURRENT_USER CURSOR
DATABASE DATABASES DAY_HOUR
DAY_MICROSECOND DAY_MINUTE DAY_SECOND
DEC DECIMAL DECLARE
DEFAULT DELAYED DELETE
DESC DESCRIBE DETERMINISTIC
DISTINCT DISTINCTROW DIV
DOUBLE DROP DUAL
EACH ELSE ELSEIF
ENCLOSED ESCAPED EXISTS
EXIT EXPLAIN FALSE
FETCH FLOAT FLOAT4
FLOAT8 FOR FORCE
FOREIGN FROM FULLTEXT
GOTO GRANT GROUP
HAVING HIGH_PRIORITY HOUR_MICROSECOND
HOUR_MINUTE HOUR_SECOND IF
IGNORE IN INDEX
INFILE INNER INOUT
INSENSITIVE INSERT INT
INT1 INT2 INT3
INT4 INT8 INTEGER
INTERVAL INTO IS
ITERATE JOIN KEY
KEYS KILL LABEL
LEADING LEAVE LEFT
LIKE LIMIT LINEAR
LINES LOAD LOCALTIME
LOCALTIMESTAMP LOCK LONG
LONGBLOB LONGTEXT LOOP
LOW_PRIORITY MATCH MEDIUMBLOB
MEDIUMINT MEDIUMTEXT MIDDLEINT
MINUTE_MICROSECOND MINUTE_SECOND MOD
MODIFIES NATURAL NOT
NO_WRITE_TO_BINLOG NULL NUMERIC
ON OPTIMIZE OPTION
OPTIONALLY OR ORDER
OUT OUTER OUTFILE
PRECISION PRIMARY PROCEDURE
PURGE RAID0 RANGE
READ READS REAL
REFERENCES REGEXP RELEASE
RENAME REPEAT REPLACE
REQUIRE RESTRICT RETURN
REVOKE RIGHT RLIKE
SCHEMA SCHEMAS SECOND_MICROSECOND
SELECT SENSITIVE SEPARATOR
SET SHOW SMALLINT
SPATIAL SPECIFIC SQL
SQLEXCEPTION SQLSTATE SQLWARNING
SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT
SSL STARTING STRAIGHT_JOIN
TABLE TERMINATED THEN
TINYBLOB TINYINT TINYTEXT
TO TRAILING TRIGGER
TRUE UNDO UNION
UNIQUE UNLOCK UNSIGNED
UPDATE USAGE USE
USING UTC_DATE UTC_TIME
UTC_TIMESTAMP VALUES VARBINARY
VARCHAR VARCHARACTER VARYING
WHEN WHERE WHILE
WITH WRITE X509
XOR YEAR_MONTH ZEROFILL

posted @ 2007-04-22 23:34 qiyadeng 阅读(2877) | 评论 (1)编辑 收藏

Linux控制台的用户自动登录


在/sbin目录下新建文件autologin,并往文件写入下面内容:

exec 0</dev/$1 1>/dev/$1 2>&1

cat /etc/issue

shift

exec $*

改变autologin文件的权限执行下面语句:

chmod 777 /sbin/autologin

最后编辑/etc/inittab文件

把类似以下部分

2:2345:respawn:/sbin/getty tty2

修改为

2:2345:respawn:/sbin/autologin tty2 login –f sybase

以上为系统启动时,sybase用户自动登录.

posted @ 2007-04-16 21:53 qiyadeng 阅读(1524) | 评论 (0)编辑 收藏

漂亮的小居室
o_jinzhi1.jpg

o_jinzhi2.jpg

o_jingzhi3.jpg

o_jinzhi4.jpg 

o_jinzhi6.jpg

o_jinzhi5.jpg 

o_jinzhi7.jpg 

o_jinzhi8.jpg

posted @ 2007-03-28 09:52 qiyadeng 阅读(1334) | 评论 (1)编辑 收藏

关于 Servlet 中的事件监听

Servlet2.3 规范中添加了一些监听 web 应用中重要事件的能力。这项功能可以让我们根据事件的状态更有效的对资源进行管理和自动化进行。这部分描述了 servlet 的事件监听,包含以下部分:

1.   事件的分类和 Listener 接口

2.   典型的事件监听过程

3.   事件监听的声明和调用

4.   事件监听编码和发布向导

5.   事件监听的方法和相关的类

事件的分类和 Listener 接口

Servlet 事件有两个级别:

1.   Application 级别事件

包含着运行应用程序的虚拟机级别的相关资源和状态,即和 servlet Context 对象相关。

2.   Session 级别的事件

包含着一个单一用户的 session 的一系列请求的相关资源和状态,即 Http Session 对象。

在上面两个级别的事件,又可分别分为两种:

1.   生命周期的改变

2.   属性的改变

你可以为上面四种事件创建一个或多个监听类。一个单一的监听类可以监视多种事件。

创建一个事件类可以从 javax.servlet 包或 javax.servlet.http 包中实现合适的接口。下表中列出了四种事件相关的接口。

事件种类

事件描述

接口

Context 生命周期的改变

context 的建立和即将关闭 context

Javax.servlet.ServletContextListener

Context 属性值的改变

添加,删除,修改 context 的属性值

Javax..servlet.ServletContextAttributeListener

Session 生命周期的改变

Session 的创建,注销,超时

Javax.servlet.http.HttpSessionListener

Session 属性值的改变

添加,删除,修改 session 的属性值

Javax.servlet.htpp.HttpSessionAttributeListener

典型的事件监听过程

考虑一个 web 应用是由一组访问数据库的 servlet 组成的。一个典型的事件监听机制是这样的,创建一个 context 生命周期的事件来管理数据库连接,这个监听器可以有如下的功能:

1.   这个监听器监视着应用程序的启动

2.   这个应用程序写入日志到数据库中并且把连接对象存储在 context

3.   Servelt 使用连接对象来执行 SQL

4.   监听器监听应用程序的即将关闭

5.   在关闭应用程序之前,先关闭连接对象

事件监听的声明和调用

事件监听的声明在应用程序的 web.xml 里,用 <listener> 元素,该元素是 <web-app> 的子元素。每个监听器都对应一个 <listener> ,有一个 <listener-class> 子元素用来指定对应的类名。在每种事件中,你需要指定你想调用的顺序。

在应用程序启动之后,并且在第一次请求之前, servlet 容器会创建并注册每个监听类的实例。每种事件,监听器是按照他们声明的顺序来注册的。然后,当应用程序开始运行,每种事件监听器安装他们的顺序调用。在最后一次请求之前,所有的监听器都保持活动状态。

一旦应用程序关闭, session 事件首先发生,以他们声明的顺序相反。然后 context 事件发生也是以声明的顺序相反。

下面是一个例子:

<web-app>

   <display-name>MyListeningApplication</display-name>

   <listener>

      <listener-class>com.acme.MyConnectionManager</listenerclass>

   </listener>

   <listener>

      <listener-class>com.acme.MyLoggingModule</listener-class>

   </listener>

   <servlet>

      <display-name>RegistrationServlet</display-name>

      ...

   </servlet>

</web-app>

假设 MyConnectionMnanager MyLoggingModule 都是实现 ServletContextListener 接口, MyLoggingModule 也是实现了 HttpSessionListener 接口。

当应用程序运行,两个监听器都会监听 context 生命周期事件, MyLoggingModule 监听器还会监听 session 生命周期。在 context 生命周期中, MyConnectionMananger 会首先开始监听,因为它声明在前面。

事件监听器的编码和发布指南

请注意事件监听器类的以下规则和指南:

l          在多线程的应用程序中,属性可能同时改变。这是不需要 Servlet 容器来同步结果――在这种情况下监听类本身负责保持数据的完整性。

l          每个监听类都必须有一个 public 的零参数的构造函数。

l          每个监听类文件必须打包到 WAR 文件,也可以是在 /WEB-INF/classes 或是包含在 /WEB-INF/lib 下的 JAR 文件中。

注意:在分布式的环境中,事件监听类的作用域是包含这个部署描述文件的虚拟机。不需要分布式的 Web 容器来传递 servlet context 事件或是 session 事件到其他的虚拟机。这个在 Sun Microsystem Java Servlet 规范, 2.3 版本。

事件监听器的方法和相关的类

这部分列出了事件监听器的方法,当 servlet context 事件或是 servlet session 事件发生时,容器将会调用他们。这些方法的输入的事件对象的类型不一样,因此一下讨论事件类和他们的方法。

ServletContextListener 方法, ServletContextEvent

ServletContextListener 接口规范以下的方法:

       void contextInitialized(ServletContextEvent sce)

              servlet 容器调用这个方法来通知监听器, servlet context 已经建立并且应用程序准备处理请求。

       void contextDestory(ServletContextEvent sce)

              servlet 容器调用这个方法来通知监听器应用程序即将关闭。

Servlet 容器创建一个 java.servlet.ServletContextEvent 对象作为调用 ServletContextListener 方法的输入。 ServletContextEvent 类包含以下方法,你的监听器可以调用

ServletContext getServletContext()

用这个方法返回已创建的或是将要销毁的 servlet context 对象,从中你可以得到你想要的信息。(未完待续)

 

posted @ 2007-03-27 15:00 qiyadeng 阅读(1743) | 评论 (1)编辑 收藏

为了加快发传真的速度,弄了个串口卡(4口),加上原来的主板上的串口,一共现在可以接五个外置modem了。
在linux安装串口卡其实很简单:
1、把串口卡插入PCI插槽中
2、开启计算机,以root用户登陆
命令#more /proc/pci
找到这串口卡的相关信息
  Bus  1, device   9, function  0:
    Serial controller: PCI device 9710:9845 (NetMos Technology) (rev 1).
      IRQ 9.
      Master Capable.  Latency=32. 
      I/O at 0x9000 [0x9007].
      I/O at 0x9400 [0x9407].
      I/O at 0x9800 [0x9807].
      I/O at 0x9c00 [0x9c07].
      I/O at 0xa000 [0xa007].
      I/O at 0xa400 [0xa40f].
可以知道各个串口的地址和IRQ。
3、添加串口
命令
#setserial  /dev/ttyS2 port 0x9000 UART 16550A irq 9 Baud_base 115200
#setserial  /dev/ttyS3 port 0x9400 UART 16550A irq 9 Baud_base 115200
#setserial  /dev/ttyS4 port 0x9800 UART 16550A irq 9 Baud_base 115200
#setserial  /dev/ttyS5 port 0x9c00 UART 16550A irq 9 Baud_base 115200
4、用minicom测试下
OK之后证明安装成功了。

posted @ 2006-06-10 14:10 qiyadeng 阅读(1424) | 评论 (2)编辑 收藏

  1) 好好规划自己的路,不要跟着感觉走

  根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!

  2) 可以做技术,切不可沉湎于技术

  千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!

  3) 不要去做技术高手,只去做综合素质高手

  在企业里混,我们时常瞧不起某人,说他什么都不懂,凭啥拿那么多钱,凭啥升官这是普遍的典型的工程师的迂腐之言。很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!

  4) 多交社会三教九流的朋友

  不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!

  5) 知识涉猎不一定专,但一定要广

  多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!

  6) 抓住时机向技术管理或市场销售方面的转变

  要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!

  7) 逐渐克服自己的心里弱点和性格缺陷

  多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好——尽管你可能技术不错!

  8) 工作的同时要为以后做准备

  建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!

  9) 要学会善于推销自己

  不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...

  10) 该出手时便出手

  永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功!

posted @ 2006-04-25 13:22 qiyadeng 阅读(278) | 评论 (0)编辑 收藏

在传真量很大的部门,用传真机发送传真有时候不仅浪费资源(很多东西都是先需要打印出来然后再去传真),而且效率低下,也不便于归档管理。大家都知道, Windows xp 提供了传真服务组件,需要使用一个 modem ,就可以供传真服务。只要是能够打印的东西,都能够传真,这样确实方便不少。但是,实际使用中会有一个比较严重的问题,就是 fax 并不像打印机一样可以共享使用,这样网络中的其他机器就不能使用该 modem 进行传真。很自然的想到使用第三方的软件,思路应该是基于传真服务器或是传真客户端的模式。遗憾的是我没有找到满意的软件,而且都是价格不菲。

关键的时候想到了开源的东西,经过搜索,锁定在 Hylaxfax 上面,这是一个 linux 下面的 fax 服务器,选择它的理由是,网站的文档非常详细,并且有很多成熟的开源的客户端。

 

 Hylafax软件的安装和配置

Hylafax http://www.hylafax.org/ )上有很详细的介绍怎么进行安装。

http://www.hylafax.org/content/Handbook:Binary_Package_Install

安装步骤很简单,但是我安装的时候好像需要一个 sharutils-4.2.1-9.i386.rpm 包,但是文档中没有提出,如果安装提示的时候可以另外下载。

另外,在天极上面也有一片不错的文章 http://www.yesky.com/20030318/1657865.shtml

 

客户端的配置

天极那篇文章上作者推荐了 whfc ,我觉得这个软件不太适合我。我觉得比较方便的是 HylaFSP ,这个软件使用起来就像是 windows 自带的传真服务,然后把传真请求发送到 Hylafax 的传真队列中,但是这个软件不是免费的,而且没有提供管理 Hylafax 所有传真文件的功能。

先说说客户端的配置,默认情况下 Hylafax 是不允许任何的网络用户使用传真服务,需要编辑 hots.hylafax 文件。或是通过 faxadduser 来添加用户和主机,另外一点就是不要忘了防火墙的设置,还有 Hlafax 默认开放的端口是 4579

给出一篇参考的文档: http://fanqiang.chinaunix.net/a1/b1/20020111/08100047.html

 

另外就是说说,我们怎么进行开发,用 java

先看看一个小软件 JHylaFAX http://jhylafax.sourceforge.net/ ),
main-window-1.3.1-small.png

它是一个 Hylafax java 客户端 , 而且是开源的,我们可以研究它的代码来实现自己的传真程序。其实 JHylaFAX 使用到另外一个开源项目 gnu.hylafax http://gnu-hylafax.sourceforge.net/ ),使用起来很简单的,看看例子文档应该就不成问题了。现在剩下的就是用你的想像去实现传真了。

甚至你可以有一个网站来提供传真服务,和邮件服务来互相绑定。

 

posted @ 2006-04-17 11:18 qiyadeng 阅读(3207) | 评论 (3)编辑 收藏

仅列出标题
共9页: 上一页 1 2 3 4 5 6 7 8 9 下一页