<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qiyadeng

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

    1,現在全國上下,流行罵人罵得最兇的一句話:
    甲:聽說你哥哥在國家隊踢球?
    乙:你哥哥才在國家隊踢球呢!!!你全家都在國家隊踢球!!!


    2,國內豬肉漲價的真實原因
    兒子問:爸爸,豬肉為什么會漲價?
    爸爸和藹的告訴他:兒子,中國的豬都被一個叫豬廣戶的帶去踢足球了。國內沒貨

     

    posted @ 2007-07-21 23:51 qiyadeng 閱讀(320) | 評論 (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 閱讀(1984) | 評論 (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 閱讀(23282) | 評論 (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 閱讀(2885) | 評論 (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 閱讀(1538) | 評論 (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 閱讀(1344) | 評論 (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 閱讀(1752) | 評論 (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 閱讀(1441) | 評論 (2)編輯 收藏

      1) 好好規劃自己的路,不要跟著感覺走

      根據個人的理想決策安排,絕大部分人并不指望成為什么院士或教授,而是希望活得滋潤一些,爽一些。那么,就需要慎重安排自己的軌跡。從哪個行業入手,逐漸對該行業深入了解,不要頻繁跳槽,特別是不要為了一點工資而轉移陣地,從長遠看,這點錢根本不算什么,當你對一個行業有那么幾年的體會,以后錢根本不是問題。頻繁地動蕩不是上策,最后你對哪個行業都沒有摸透,永遠是新手!

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

      千萬不可一門心思鉆研技術!給自己很大壓力,如果你的心思全部放在這上面,那么注定你將成為孔乙己一類的人物!適可而止為之,因為技術只不過是你今后前途的支柱之一,而且還不是最大的支柱,除非你只愿意到老還是個工程師!

      3) 不要去做技術高手,只去做綜合素質高手

      在企業里混,我們時常瞧不起某人,說他什么都不懂,憑啥拿那么多錢,憑啥升官這是普遍的典型的工程師的迂腐之言。很牛嗎?人家能上去必然有他的本事,而且是你沒有的本事。你想想,老板搞經營那么多年,難道見識不如你這個新兵?人家或許善于管理,善于領會老板意圖,善于部門協調等等。因此務必培養自己多方面的能力,包括管理,親和力,察言觀色能力,攻關能力等,要成為綜合素質的高手,則前途無量,否則只能躲在角落看示波器!技術以外的技能才是更重要的本事!!從古到今,美國日本,一律如此!

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

      不要只和工程師交往,認為有共同語言,其實更重要的是和其他類人物交往,如果你希望有朝一日當老板或高層管理,那么你整日面對的就是這些人。了解他們的經歷,思維習慣,愛好,學習他們處理問題的模式,了解社會各個角落的現象和問題,這是以后發展的巨大的本錢,沒有這些以后就會笨手笨腳,跌跌撞撞,遇到重重困難,交不少學費,成功的概率大大降低!

      5) 知識涉獵不一定專,但一定要廣

      多看看其他方面的書,金融,財會,進出口,稅務,法律等等,為以后做一些積累,以后的用處會更大!會少交許多學費!!

      6) 抓住時機向技術管理或市場銷售方面的轉變

      要想有前途就不能一直搞開發,適當時候要轉變為管理或銷售,前途會更大,以前搞技術也沒有白搞,以后還用得著。搞管理可以培養自己的領導能力,搞銷售可以培養自己的市場概念和思維,同時為自己以后發展積累龐大的人脈!應該說這才是前途的真正支柱!

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

      多疑,敏感,天真(貶義,并不可愛),猶豫不決,膽怯,多慮,臉皮太薄,心不夠黑,教條式思維。。。這些工程師普遍存在的性格弱點必須改變!很難嗎?只在床上想一想當然不可能,去幫朋友守一個月地攤,包準有效果,去實踐,而不要只想!不克服這些缺點,一切不可能,甚至連項目經理都當不好——盡管你可能技術不錯!

      8) 工作的同時要為以后做準備

      建立自己的工作環境!及早為自己配置一個工作環境,裝備電腦,示波器(可以買個二手的),仿真器,編程器等,業余可以接點活,一方面接觸市場,培養市場感覺,同時也積累資金,更重要的是準備自己的產品,咱搞技術的沒有錢,只有技術,技術的代表不是學歷和證書,而是產品,拿出象樣的產品,就可技術轉讓或與人合作搞企業!先把東西準備好,等待機會,否則,有了機會也抓不住!

      9) 要學會善于推銷自己

      不僅要能干,還要能說,能寫,善于利用一切機會推銷自己,樹立自己的品牌形象,很必要!要創造條件讓別人了解自己,不然老板怎么知道你能干?外面的投資人怎么相信你?提早把自己推銷出去,機會自然會來找你!搞個個人主頁是個好注意!!特別是培養自己在行業的名氣,有了名氣,高薪機會自不在話下,更重要的是有合作的機會...

      10) 該出手時便出手

      永遠不可能有100%把握!!!條件差不多就要大膽去干,去闖出自己的事業,不要猶豫,不要彷徨,干了不一定成功,但至少為下一次沖擊積累了經驗,不干永遠沒出息,而且要干成必然要經歷失敗。不經歷風雨,怎么見彩虹,沒有人能隨隨便便成功!

    posted @ 2006-04-25 13:22 qiyadeng 閱讀(287) | 評論 (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 閱讀(3224) | 評論 (3)編輯 收藏

    僅列出標題
    共9頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 
    主站蜘蛛池模板: 亚洲国产另类久久久精品小说| 久久久久久亚洲av无码蜜芽| 国产乱弄免费视频| 亚洲免费在线视频观看| 成年免费a级毛片免费看无码| 亚洲精品无码专区在线| 久久亚洲精品成人无码网站| 亚洲永久精品ww47| 大胆亚洲人体视频| 免费的一级片网站| 久久WWW免费人成人片| 亚洲国产精品免费视频| 中国内地毛片免费高清| 少妇亚洲免费精品| 99亚洲乱人伦aⅴ精品| 亚洲精品免费网站| 亚洲一区在线视频观看| 久久久国产精品亚洲一区| 国产∨亚洲V天堂无码久久久| 中文字幕亚洲图片| av在线亚洲欧洲日产一区二区| 免费乱码中文字幕网站| 免费国产不卡午夜福在线| 四虎永久成人免费影院域名| 永久免费无码网站在线观看| 午夜免费福利影院| 国内一级一级毛片a免费| 妞干网免费视频观看| 性xxxx视频播放免费| 免费爱爱的视频太爽了| 好爽…又高潮了毛片免费看| 在线观看AV片永久免费| 青娱乐免费在线视频| 性xxxxx免费视频播放| 国产h视频在线观看免费| 成人免费一级毛片在线播放视频| 亚欧免费视频一区二区三区| 国产精品免费网站| 18禁超污无遮挡无码免费网站国产 | 亚洲国产精品无码久久一线| 国产亚洲AV夜间福利香蕉149|