1,現在全國上下,流行罵人罵得最兇的一句話:
甲:聽說你哥哥在國家隊踢球?
乙:你哥哥才在國家隊踢球呢!!!你全家都在國家隊踢球!!!
2,國內豬肉漲價的真實原因
兒子問:爸爸,豬肉為什么會漲價?
爸爸和藹的告訴他:兒子,中國的豬都被一個叫豬廣戶的帶去踢足球了。國內沒貨
posted @ 2007-07-21 23:51 qiyadeng 閱讀(321) | 評論 (0) | 編輯 收藏
posts - 84, comments - 152, trackbacks - 0, articles - 34 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1,現在全國上下,流行罵人罵得最兇的一句話:
posted @ 2007-07-21 23:51 qiyadeng 閱讀(321) | 評論 (0) | 編輯 收藏 開始 1. 用DBTestCase的子類建立數據庫 2. 用你自己的TestCase子類建立數據庫 3. 數據庫數據校驗 4. DbUnit的Ant任務和Canoo web測試(此處省略,另詳)
用DBTestCase的子類建立數據庫
第一步:創建你的dataset文件 你的測試需要一些數據。這就意味著你必須創建dataset。許多情況下你都是處理xml的dataset。你可以人工湊一些一般的xml dataset或是從你的數據庫中導出一個xml dataset.
第二步:繼承DBTestCase類 現在你要創建一個測試類。最簡單的方式是用通過繼承DbUnit的DBTestCase來創建你自己的測試類。DBTestCase繼承了Junit的TestCase類。一個模板方法你需要實現,getDataSet()返回你在第一步創建的dataset。DBTestCase依靠IdatabaseTester來工作,默認的配置是使用PropertiesBaseJdbcDatabaseTester,它是用系統屬性來指出DriverManager的配置。最簡單的方式是在你測試類的構造函數中配置它。你可以通過覆蓋getDatabaseTester()方法來修改它的行為。
使用下面提供的三種IDatabaseTester之一實現,你也可以使用下面表中描述的DBTestCase的其它子類。
下面是一個簡單的實現,連接到一個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類。你可以覆蓋標準的Junit的SetUp()方法,執行你所需要的數據庫操作。如果你要執行清除,同樣覆蓋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個方便的實現。
你也可以提供你自己的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 閱讀(1985) | 評論 (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 閱讀(23289) | 評論 (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
posted @ 2007-04-22 23:34 qiyadeng 閱讀(2886) | 評論 (1) | 編輯 收藏 Linux控制臺的用戶自動登錄
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 閱讀(1540) | 評論 (0) | 編輯 收藏 關于 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 包中實現合適的接口。下表中列出了四種事件相關的接口。
典型的事件監聽過程 考慮一個 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 閱讀(1442) | 評論 (2) | 編輯 收藏
1) 好好規劃自己的路,不要跟著感覺走
根據個人的理想決策安排,絕大部分人并不指望成為什么院士或教授,而是希望活得滋潤一些,爽一些。那么,就需要慎重安排自己的軌跡。從哪個行業入手,逐漸對該行業深入了解,不要頻繁跳槽,特別是不要為了一點工資而轉移陣地,從長遠看,這點錢根本不算什么,當你對一個行業有那么幾年的體會,以后錢根本不是問題。頻繁地動蕩不是上策,最后你對哪個行業都沒有摸透,永遠是新手! 2) 可以做技術,切不可沉湎于技術 千萬不可一門心思鉆研技術!給自己很大壓力,如果你的心思全部放在這上面,那么注定你將成為孔乙己一類的人物!適可而止為之,因為技術只不過是你今后前途的支柱之一,而且還不是最大的支柱,除非你只愿意到老還是個工程師! 3) 不要去做技術高手,只去做綜合素質高手 在企業里混,我們時常瞧不起某人,說他什么都不懂,憑啥拿那么多錢,憑啥升官這是普遍的典型的工程師的迂腐之言。很牛嗎?人家能上去必然有他的本事,而且是你沒有的本事。你想想,老板搞經營那么多年,難道見識不如你這個新兵?人家或許善于管理,善于領會老板意圖,善于部門協調等等。因此務必培養自己多方面的能力,包括管理,親和力,察言觀色能力,攻關能力等,要成為綜合素質的高手,則前途無量,否則只能躲在角落看示波器!技術以外的技能才是更重要的本事!!從古到今,美國日本,一律如此! 4) 多交社會三教九流的朋友 不要只和工程師交往,認為有共同語言,其實更重要的是和其他類人物交往,如果你希望有朝一日當老板或高層管理,那么你整日面對的就是這些人。了解他們的經歷,思維習慣,愛好,學習他們處理問題的模式,了解社會各個角落的現象和問題,這是以后發展的巨大的本錢,沒有這些以后就會笨手笨腳,跌跌撞撞,遇到重重困難,交不少學費,成功的概率大大降低! 5) 知識涉獵不一定專,但一定要廣 多看看其他方面的書,金融,財會,進出口,稅務,法律等等,為以后做一些積累,以后的用處會更大!會少交許多學費!! 6) 抓住時機向技術管理或市場銷售方面的轉變 要想有前途就不能一直搞開發,適當時候要轉變為管理或銷售,前途會更大,以前搞技術也沒有白搞,以后還用得著。搞管理可以培養自己的領導能力,搞銷售可以培養自己的市場概念和思維,同時為自己以后發展積累龐大的人脈!應該說這才是前途的真正支柱! 7) 逐漸克服自己的心里弱點和性格缺陷 多疑,敏感,天真(貶義,并不可愛),猶豫不決,膽怯,多慮,臉皮太薄,心不夠黑,教條式思維。。。這些工程師普遍存在的性格弱點必須改變!很難嗎?只在床上想一想當然不可能,去幫朋友守一個月地攤,包準有效果,去實踐,而不要只想!不克服這些缺點,一切不可能,甚至連項目經理都當不好——盡管你可能技術不錯! 8) 工作的同時要為以后做準備 建立自己的工作環境!及早為自己配置一個工作環境,裝備電腦,示波器(可以買個二手的),仿真器,編程器等,業余可以接點活,一方面接觸市場,培養市場感覺,同時也積累資金,更重要的是準備自己的產品,咱搞技術的沒有錢,只有技術,技術的代表不是學歷和證書,而是產品,拿出象樣的產品,就可技術轉讓或與人合作搞企業!先把東西準備好,等待機會,否則,有了機會也抓不住! 9) 要學會善于推銷自己 不僅要能干,還要能說,能寫,善于利用一切機會推銷自己,樹立自己的品牌形象,很必要!要創造條件讓別人了解自己,不然老板怎么知道你能干?外面的投資人怎么相信你?提早把自己推銷出去,機會自然會來找你!搞個個人主頁是個好注意!!特別是培養自己在行業的名氣,有了名氣,高薪機會自不在話下,更重要的是有合作的機會... 10) 該出手時便出手 永遠不可能有100%把握!!!條件差不多就要大膽去干,去闖出自己的事業,不要猶豫,不要彷徨,干了不一定成功,但至少為下一次沖擊積累了經驗,不干永遠沒出息,而且要干成必然要經歷失敗。不經歷風雨,怎么見彩虹,沒有人能隨隨便便成功! posted @ 2006-04-25 13:22 qiyadeng 閱讀(289) | 評論 (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- 另外,在天極上面也有一片不錯的文章 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/
), 它是一個 Hylafax 的 java 客戶端 , 而且是開源的,我們可以研究它的代碼來實現自己的傳真程序。其實 JHylaFAX 使用到另外一個開源項目 gnu.hylafax ( http://gnu-hylafax.sourceforge.net/ ),使用起來很簡單的,看看例子文檔應該就不成問題了。現在剩下的就是用你的想像去實現傳真了。 甚至你可以有一個網站來提供傳真服務,和郵件服務來互相綁定。
posted @ 2006-04-17 11:18 qiyadeng 閱讀(3227) | 評論 (3) | 編輯 收藏 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||