Wednesday, April 20, 2005
Macromedia将于2月售新版Director MX2004
Director是Macromedia公司最老的应用软件之一,可以追述到多媒体内容主要通过CD-ROM而不是互联网传播的时代。该软件的关键市场是那些开发定制型教育培训软件的企业以及为MacromediaShockwave播放器开发简单游戏和动画的开发人员。
新版的Director MX2004增加了对t语言的支持,从而使那些不熟悉MacromediaLingo格式的开发人员更容易使用。这一举措与不久前该公司推出经过修改的Flash开发工具模仿Java开发人员的工作模式类似。Macromedia产品管理主任MiriamGeller认为,增加对t语言的支持使开发人员可以使用具有行业标准的脚本语言编写脚本,同时省却了开发人员学习一门新语言的时间。
新的Director软件支持更多的媒体格式,包括微软WindowsMedia和DVD视频。该软件还与MacromediaFlash MX 2004等最新版的网页设计和开发工具存在接口。DirectorMX2004输出更为简单、Flash内容处理更迅速,同时提供用于用户界面开发的预制模块。
Geller称,“我们所关注的事情是那些确实能够让人们高效工作并能更快适应该应用工具的东西。”
该工具的其它功能还包括一步制作完成Mac和Windows电脑的投影文件;支持多数视频、音频、位图、3D和矢量图形格式;以及定制型用户界面等。
Director MX 2004可以在Windows XP、Windows 2000、MacOS10.2.6以及更高版本上运行。该产品计划在2月份上市,针对新用户的售价为1199美元,Director8.5及DirectorMX用户升级需要399美元。
Macromedia推出视频流服务 挑战三大巨头
Macromedia公司的产品管理负责人Chris Hock说,“我们认为网络是视频革命的主要原因”。Hock举例说,Flash具有交互性内容的功能,交互性内容是网站的一个关键要素,这是开发者和商业人员在选择产品时候考虑的主要原因,但是现在还没有这种的产品出现。Macromedia公司承认,要使人们接受Macromedia公司的Flash Video的关键是引导人们,因为市场上其他竞争对手的产品已经站稳了脚跟。
苹果、微软和Real Networks公司是当今视频流市场的三大巨头,这些公司给用户提供免费的视频流软件,而且可以在网上一睹自己的技术制作出来的内容。但是Macromedia公司对此不屑一顾。Hock说,“我们认为现在网上的视频配置不适当,我们将给用户提供下一代的视频传递技术,因此我们来到这个市场。”
Macromedia公司为了展示新的Flash Video服务,公司将推出一种Flash Video库,里面全部是采用这种新视频流技术而制作的精彩内容。
Macromedia拟以新Flash工具吸引J2EE开发人员
原本Flash大多是作为网络广告之用,但是Macromedia现在正在推广Flash的应用,试图将Flash打造成传送网络应用和建立互动网站的基础。Macromedia在今年初推出新的Flash开发工具,设计出不需浏览器的Flash。
最近,Macromedia也发表Flash MX Professional 2004,提供熟悉Visual Basic等开发环境的开发人员一套专业的Flash开发工具。
Macromedia的资深产品营销总监Jeff Whatcott表示,Royale将采用类似于Java开发人员所使用的文字环境来扩充Flash,标准的Flash开发工具大多以时间线(timeline)为主,时间线的接口,也反映了Flash是以动画为基础的工具。
Whatcott表示,“这将是全新的多媒体应用开发方式,将可吸引企业应用程序的开发人员,虽然大多数的Java的开发人员,认为Flash这种开发工具,和他们习惯的方式并不相同。”
Macromedia的目的是以Flash作为J2EE的应用程序,打造吸引人又容易浏览的接口。目前,网络使用者浏览Java和HTML所打造的接口,必须通过一系列的页面更新和其它的程序动作,才有办法得到所需要的资料。
Whatcott表示,“任何Java的开发人员都会告诉你,Java在资料表现层(presentation tier)之上有其限制,终端使用者总得花上一大推功夫,才能得到他们想要的。”
但实际上是,“大多数的公司用J2EE建立非常强大的后端,在呈现给使用者的最后一段却失败了。
Tuesday, April 05, 2005
about Post Washington Consensus
Monday, January 10, 2005
Useful information about Wireless card in IBM R40
http://tuxmobil.org/minipci_linux.html
http://www.srcf.ucam.org/~mjg59/thinkpad/wireless.html
http://www-306.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-43693
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Wireless.html
https://gullfoss2.fcc.gov/prod/oet/cf/eas/reports/ViewExhibitReport.cfm?mode=Exhibits&RequestTimeout=500&calledFromFrame=N&application_id=146007&fcc_id='ANO20020200BRX'
R40 can use
Cisco Aironet Wireless 802.11b
Intel PRO/Wireless LAN 2100 3B Mini PCI Adapter
IBM 11a/b/g Wireless Lan Mini PCI Adapter
IBM High Rate Wireless LAN Mini PCI Adapter III
To confirm which one is in your R40, we can check the FCC code on the R40 back. Then comparing the code in
http://www-306.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-43693
To confirm the chipset in the wireless card, we need to check the Device ID of your wireless card the use google to find the OEM manufacturer. so that you may find the compatible linux driver.
Thursday, December 16, 2004
Enterprise CRM and Groupware System
PHP/PostgreSQL system offering multi-layered access to data and the following functionality: Advanced CRM, Project Management tools, Email Ticketing, Website News, File Sharing and ERP.
Project/Consulting
Is a solution for consulting companies focused on the efficient management of internal resources, knowledge management and Internet collaboration.
open source call center
http://www.supportwizard.com/
http://reqadm.sourceforge.net/
http://freshmeat.net/projects/requesttracker/
Java 乱码问题
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=1523&start=0&tstart=0
在JAVA平台的jsp/servlet中可以说是非常令初学者头痛的事,甚至很多"高手(当然只是所谓的,如果连乱码都不能解决还叫什么高手)"都不知所措.
我先说明,乱码问题绝对没有一种通用的方法来解决绝,除非你你都用i18n来定义和用UTF来传传输,显示,但这是不可能的.我们只有根本不同原因来用不同的解决方案.
要从底层解决乱码,要求程序员要熟悉数据在网络上和内存中的每一个字节是来源和去向,这样才能从根本上解决.
产生的原因:
1:数据传输入过程中没有按协议格式化.
2:没有根据当前环境决定显示方式.
下面为了说明,我们只讨论汉字乱码产生的原因:
从客户端提交给服务端,对于POST传送,目前的浏览器都能正确编码,但QueryString方法是程序员控制的,很多程序员根本不对中文的URL格式化,直接用中文作为参数传送,对于IE6这样的智能程序高的浏览器可以自动格式化,而老版本的浏览器测原方传送,则服务器端程序不能正确地从标准输入中取得.应该先格式化编码.
如果网络上或内存中原如数据是正确的,但要用正确的方式从byte转换成系统能显示的字符集.假设"我"的byte表示为78,63(只是例子)
但78,63有可能表示日文的ぬ,那你就要告诉系统,你当前的byte[] b表示的是什么字符集.而我所见过的jsp/servlet容器中除了resin在
getParameter()这个方法实现中都是return new String(b//byte[]);而没有指定字集.WLS我没的反编译,所以不知道它的HTMLUtil这个类在实现时是如何指定字符集还是没有.
如果各种方法不能解决,我们只能对BEA不敬了,把ServletRequestWrapper类decode出来,在getParameter()方法中直接return new String(b,"GBK")得了.这样省得在XML中配置又不起作用.
同样从数据库中如果取得的数据乱码,我们只要把JDBC的ResultSet类decode出来,把其中的getString(int column)方法中的return new String(b)方法都强行加上"GBK"
这样取数据保证正确了,然后再来解决显示的问题,即使你的数据在内存中是正确的,你也指定了正确的字符集参数,仍然不能保证你看到的是正确的,原因是系统知道这个编码是对的,但它没有这种字符集来显示,或你用来显示的字集不对.
这就是JSP中<%@page contentType="text/html;charset=xxxx"%>的作用,有人以为光这样就正确了,你要知道这句和response.setContentType("text/html;charset=xxxx");是一样的,只它是告诉浏览器我现在发给你的内容是用xxxx字符集来解释的,只能在从网络上或内存中取得的数据是正确的前提下才有用.
现在servet也1.2也支持设置客户端字符集的方法了:setCharacterEncoding.
所以乱码问题绝不是一种方法能解决的,我们一定要知道它产生的原因,从底层来进行原始数据的转换才能解决.其实找原因也很简单,在
HttpUtil中加一个直接getBytes()方法,把得到的原始数据看看是不是你你传过来的.比如从QueryString传过来"我"
aaa.jsp?name=我,那你看看它的byte中是不是我的值,如果是,说明传送没有问题,不是就是没有格式化.一步步下来,总是不难解决的.
发信人: maquan ('ma:kju), 信区: Java
标 题: 关于JAVA中文问题的一点个人心得
发信站: BBS 水木清华站 (Wed Jun 12 12:16:49 2002)
有关 JAVA 中文的问题真是层出不穷,版内几乎每天都有人在问,涉及到字符串处理、JSP 显示、数据库存储等诸多方面。总而言之就是,文字不听使唤,总出现乱码。
我本人也经历过很多类似的问题,个人的体会是,这类问题的表象是非常复杂的,具体问题的具体解决方法也是不同的,但如果能对其中几个概念区分清楚并彻底理解的话,对于自己动手解决问题是很有指导意义的,而不至于从别人那儿得到了解决办法还不知道问题出在哪儿。
下面是我个人的一点心得,不对之处请方家指正 :)
最重要的就是要区分两个概念:charset 和 encoding!
character set,中文一般译为“字符集”,实际上它定义的是数值与图形之间的关系。数值有时是单个整数(比如 unicode),有时是一对整数(比如 GB2312)。图形就是这个字的笔划写法。举个例子,在 unicode 中,“21313”这个数值就代表一横一竖的中文“十”字,而在 GB2312 中,则是用“202/174”(就是我们常说的区位码 CA/AE)这对整数代表“十”字。
encoding,好像一般译为“编码方式”,实际上它定义的是数值在存储和传输时的格式。比如 unicode 中的 21313 这个字符,如果用 UTF-8 格式存储,就会在文件中占用 3 个字节,它们是 E5/8D/81,但如果用 UCS-2 格式存储,就会在文件中占用 2 个字节,它们是 41/53。3 个字节也好,2 个字节也好,目的都是为了保存“21313”这个值。而 GB2312 中的 CA/AE,保存成文件也就是这两个字节。
我们平时遇到的词中,unicode、latin-1、CJK 等等,应该都是指 charset,而象 UCS-2、UTF-8 等应该都是指 encoding,至于 GB2312,有些混乱,既表示 charset,也表示 encoding(因为它的存储方式很简单,就是两个字节原样存储)。一般来说,charset-encoding 是一对多的关系(?)。
回到 JAVA,JDK 的国际版是全程支持 UNICODE 的,一个主要表现就是它对字符的内部存储格式采用 UCS-2,String.charAt() 得到的值永远是 unicode字符集中的数值。
好了,说得比较罗嗦,希望能给那些对此问题感兴趣的朋友一些帮助。
参考文章:想必大家都听说过“两只老虎工作室”吧,劳虎的《无废话XML》中有一章叫“Unicode说分明”,很有参考价值。这本书可以在http://www.2tigers.net/ 下载。如果你搞清楚了 UTF-8 中是怎样用E5/8D/81 来表示 21313 的,就很容易理解 encoding 和 charset 的关系了。
具体问题的表象是多种多样的,要分析清楚,除了有明确的概念、清晰的思路,还要有相应的知识和经验,比如:
javac 是如何确定以何种 encoding 来理解 .java 文件的?
程序中 FileReader 是如何确定 encoding 的?
如何告诉 Application Server 你的 JSP 文件是以什么 encoding 编写的?
如何在同一个 WEB 页面中显示中文、韩文和阿拉伯文?
Oracle 数据库中 charset 的设置对 java 程序有什么影响?
……
总之是具体问题具体分析啦 :)
1. String代表一个Unicode字符串
2. String构造时会经过转换程序将输入的字符串转换成Unicode字符串存在一个char(无符号16位)数组中。
String("...") --- JVM按默认字符集(一般为操作系统默认的)将"...."转换成Unicode。
String(byte[] bytes, String String(byte[] bytes, String charsetName)) --- JVM按charsetName指定的字符集对数组byte进行转换,
byte内数据应该是和charsetName指定的字符集对应的,
否则不会有正确的转换。
3. 由于String中都是Unicode,所以在显示或输出时系统会进行另一次相反过程的转换。
4. .getBytes(String charsetName) -- String通过转换器将内部的Unicode转换为charsetName指定字符集中的对应,并以byte数组形式存在。
new String(byte[] bytes, String charsetName) -- charsetName对应的字符串以byte数组形式存在,转换器通过charsetName找到指定
转换程序,将bytes数组转换为Unicode。
5. java.nio.charset.CharsetDecoder -- 负责特定字符集到Unicode的转换(byte数组到byte数组)。
java.nio.charset.CharsetEncoder -- 负责Unicode到特定字符集的转换(byte数组到byte数组)。
只存在特定字符集到Unicode的转换,特定字符集之间转换要经过Unicode。
对不同的字符集转换器会选择不同的转换程序,转换程序由每个特定字符集提供,Unicode不提供其他字符集转换成它或由它转换成其他字符集的程序。
在String中已封装了CharsetDecoder和CharsetEncoder的功能,对应new String(byte[] bytes, String charsetName)和.getBytes(String charsetName)。
. String s1 = new String("字符的秘密");
String s2 = new String(s1.getBytes("UTF8"),"UTF8");
那么s1.equals(s2)应该是true,因为s1和s2中都是Unicode。而且终端上输出s1,s2都是正确的。
String s1 = new String("字符的秘密");
String s2 = new String(s1.getBytes("8859_1"),"8859_1");
那么s1.equals(s2)应该是false,因为s1.getBytes("8859_1")没有正确的结果。原因是GBK和Unicode支持中文,而8859_1是拉丁字符集
不支持中文,GBK-->Unicode没问题,Unicode-->8859_1就错了。
所以并非所有字符集件都能通过Unicode相互转换。java实际上是通过Unicode作为中介来转换字符集的。(charset one <-->Unicode<--> charset two)
(参见UnicodeHack3.java)
7.
byte[] bytes1--->new String(bytes1, "a kind of charset")--->A String instance--->.getBytes("a kind of charset")--->byte[] bytes2
bytes1 == bytes2
. 有些情况下,字符串必须用某种不支持中文的字符集来存储,比如遗留的早期数据库只支持Latin字符集(cp850,iso8859_1)。
由于GBK无法转换成iso8859_1,所以GBK存不进iso8859_1数据库,但通过利用第7点中提到的bytes1和bytes2之间的恒等性可以找到折衷的方法。
A.
String s1 = new String("字符的秘密");
String s2 = new String(s1.getBytes("GBK"),"8859_1");
insert s2 into table1;
-------------------------------------------------------
B.
String s2 = select s2 from table1;
String s1 = new String(s2.getBytes("8859_1"),"GBK");
System.out.println(s1);
A. 字符集8859_1的转换程序将输入byte数组转换为Unicode,显然转换的结果s2是不正确的,s2中存的不是"字符的秘密"在Unicode中的对应,不能正确打印。
在s2中的是字符集8859_1认为s1.getBytes("GBK")对应的字符串的Unicode对应,但s2中的Unicode符合8859_1的要求,可以存入数据库。
B. s2被取出后,s2.getBytes("8859_1")还原了GBK对应的byte数组,字符集GBK的转换程序可以正确的将byte数组转换为Unicode,所以s1是正确的。
(参见UnicodeHack2.java)
如果直接从iso8859_1的数据库中提取中文,并在非GBK平台上显示,结果会不正确。
[axman]: getParameter()这个方法实现中都是return new String(b//byte[]);而没有指定字集.WLS我没的反编译,所以不知道它的HTMLUtil这个类在实现时是如何指定字符集还是没有.
如果各种方法不能解决,我们只能对BEA不敬了,把ServletRequestWrapper类decode出来,在getParameter()方法中直接return new String(b,"GBK")得了.这样省得在XML中配置又不起作用.
[bigegg]:
我没打算解决所有的乱码问题,我只是打算解决一下你的问题。我是做项目的,不是搞研究的,很多问题对我来说解决方案比原理更重要。
Tuesday, December 14, 2004
Log4J 最佳实践之全能配置文件
下面给出得Log4J配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@hollycrm.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
###################
#自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
有选择地更改某些包或者类的日志级别
作者: corlin 于 04-08-09 06:00
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=INFO
使用LogKit进行日志操作
1. 概述
任何一个系统中,日志都是不可缺少的,现在Apache提供了两套日志工具,一个就是Log4j,另一个是本文要给出例子的LogKit。
Log4j和LogKit有很多相似的地方。比如,Log4j提供5级日志:DEBUG、INFO、WARN、ERROR和FATAL,LogKit也提供5级日志:DEBUG、INFO、WARN、ERROR和FATAL-ERROR,除了级别5的命名不一样,实质是一样的。
LogKit同样提供目录功能,而对日志格式的控制,在Log4j中是使用Layout,而在LogKit中使用的是Formatter。对于日志输出,Log4j使用的是Appender,LogKit则使用了更为直接的名字:Target。
这个文章当然不是用来对比LogKit和Log4j的不同的,而是想说明,为什么在有了Log4j这样的日志工具以后,还需要使用LogKit。
使用LogKit的原因是:Context和LogTargets。使用Log4j的时候,日志的内容只能是一句话,而使用LogKit,你可以记录很多项内容,甚至可以各项内容记录到对应的数据库字段中。如果使用Log4j存储日志到不同的存储介质,如数据库,需要使用Appender,而LogKit已经可以支持多种存储目标。
下面的程序将用一个产品检测线(ProductChecker)作为示范。
2. 一个例子
产品检测线是用来检查产品是否合格使用的,要求记录产品编号、产品是否通过检测、简要说明三个项目。而LogKit会把级别、时间和信息也记录下作为参考。
在免费的Mysql数据库上建立logkitexample表的sql语句:
create table logkigexample
(
logmessage varcher(1000),
logpriority varchar(20),
logtime datetime,
productnumber varchar(100),
productpass varchar(10),
productexplain varchar(100)
)
在这个产品检测线中,产品是否通过分三种情况:ok、soso和bad。其中,ok代表产品质量好,soso代表质量一般,bad代表没有通过检查,需要重新制造。
代码如下:
package logkitexample;
import java.lang.*;
import java.util.*;
import org.apache.log.*;
import org.apache.log.output.db.*;
public class ProductChecker
{
/** ProductChecker日志记录器 */
static private org.apache.log.Logger LoggerProductChecker;
public static void main(String[] argv)
{
ProductChecker _p = new ProductChecker();
_p.initLogKit();
//模拟产品检查的结果
Random _checkrandom = new Random();
int _checkresult;
for (int i = 1; i <= 20; i++)
{
_checkresult = (int)(_checkrandom.nextFloat() * 3);
switch (_checkresult)
{
case 0:
ContextMap.bind(_p.getProductCheckerMap("no." + String.valueOf(i), "ok", "ok"));
LoggerProductChecker.info("ProductChecker Pass");
break;
case 1:
ContextMap.bind(_p.getProductCheckerMap("no." + String.valueOf(i), "soso", "check again"));
LoggerProductChecker.warn("ProductChecker No Good");
break;
case 2:
ContextMap.bind(_p.getProductCheckerMap("no." + String.valueOf(i), "bad", "redo"));
LoggerProductChecker.error("ProductChecker Bad");
break;
}
}
}
/** 初始化LogKit */
private void initLogKit()
{
try
{
//登记使用的数据源
Class.forName("org.gjt.mm.mysql.Driver");
DefaultDataSource _dataSource = new DefaultDataSource("jdbc:mysql://localhost/logkitexample" , "root", "");
//登记对应的列映射关系
ColumnInfo[] _columeProductChecker = {
new ColumnInfo( "logmessage", ColumnType.MESSAGE, null ),
new ColumnInfo( "logpriority", ColumnType.PRIORITY, null ),
new ColumnInfo( "logtime", ColumnType.TIME, null ),
new ColumnInfo( "productnumber", ColumnType.CONTEXT,"productnumber" ),
new ColumnInfo( "productpass", ColumnType.CONTEXT,"productpass" ),
new ColumnInfo( "productexplain", ColumnType.CONTEXT,"productexplain" ),
};
//登记JDBCTarget
DefaultJDBCTarget _targetProductChecker =
new DefaultJDBCTarget(_dataSource, "logkitexample", _columeProductChecker);
//登记日志的层次
org.apache.log.Hierarchy _hierarchy = new org.apache.log.Hierarchy();
LoggerProductChecker = _hierarchy.getLoggerFor("logkitexample");
//设置ProductChecker的日志记录器使用的Target
LoggerProductChecker.setLogTargets(
new LogTarget[] { _targetProductChecker });
//设置日志级别为DEBUG
LoggerProductChecker.setPriority(org.apache.log.Priority.DEBUG);
}
catch (Exception e)
{
System.out.println("LogKitinit error");
}
}
/** 获得产品日志的ContextMap */
private org.apache.log.ContextMap getProductCheckerMap(String _ProductNumber, String _ProductPass, String _ProductExplain)
{
org.apache.log.ContextMap _cm = new org.apache.log.ContextMap();
_cm.set("productnumber", _ProductNumber);
_cm.set("productpass", _ProductPass);
_cm.set("productexplain", _ProductExplain);
return (_cm);
}
}
3. LogKit的存储目标
LogKit支持多种不同的日志存储目标,称为LogTargets,包括有文件、数据库、IRC频道、JMS,甚至是任意的Sockets定义。
LogKit中一个日志记录器可以对应不同的LogTargets,使用Filter可以根据不同的日志级别记录到不同的LogTargets中。比如日志都是存放早数据库的,但是FATAL_ERROR要存放在文本文件,因为这种情况下,很可能数据库都是不可用的。
LogKit还支持异步的LogTargets,适用于不能实时响应的LogTargets,如邮件系统等。
4. 参考资料
LogKit项目主页:http://jakarta.apache.org/avalon/logkit/index.html
作者Blog:http://blog.csdn.net/crogers/
Log4J使用常识
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数见表1如下:
%m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
基本应用
Log4J的配置
现在来看log4j.properties配置文件的意义。第一行指定了根Logger的级别是DEBUG,并将此指定输出到A1。A1就是第 二行定义的org.apache.log4j.ConsoleAppender,此行表示将A1输出到控制台。第三行规定了输出到A1的格式为 org.apache.log4j.PatternLayout。第四行规定了输出到A1格式的转换模式为 org.javaresearch.log4j.TestLog4J。
很多成熟的服务器类的软件日志信息会输出到控制台,同时输出到日志文件备查。使用Log4J可以在不改变任何代码的情况下,仅通过修改配置文件就可以轻松地完成这项功能。相关配置文件如下:
#### Use two appenders, one to log to console, another to log to a file log4j.rootCategory=debug, stdout, R
# Print only messages of priority WARN or higher for your category log4j.category.your.category.name=WARN
#### First appender writes to console log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
#### Second appender writes to a file log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log
# Control the maximum log file size log4j.appender.R.MaxFileSize=100KB # Archive log files (one backup file here) log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
这个配置文件指定了两个输出源stdout和R。前者把日志信息输出到控制台,后者是一个轮转日志文件。最大的文件是100KB,当一个日志文 件达到最大尺寸时,Log4J会自动把example.log重命名为example.log.1,然后重建一个新的example.log文件,依次轮 转。
在Web应用中使用
在Web应用中,应该在哪儿对Log4J进行配置呢?首先要明确,Log4J必须在应用的其它代码执行前完成初始化。因为Servlet是在 Web服务器启动时立即装入的,所以,在Web应用中一般使用一个专门的Servlet来完成Log4J的配置,并保证在web.xml的配置中,这个 Servlet位于其它Servlet之前。下面是一个例子,代码如下:
package org.javaresearch.log4j;
import java.io.*; import javax.servlet.*;
import org.apache.log4j.*;
public class Log4JInit extends HttpServlet {
public void init() throws ServletException {
String prefix = getServletContext().getRealPath("/");
String file = getServletConfig().getInitParameter("log4j-config-file");
// 从Servlet参数读取log4j的配置文件
if (file != null) {
PropertyConfigurator.configure(prefix + file); }
}
public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {}
public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {}
}
注意:上面的load-on-startup应设为1,以便在Web容器启动时即装入该Servlet。log4j.properties文件放在根的properties子目录中,也可以把它放在其它目录中。应该把.properties文件集中存放,这样方便管理。
作者Blog:http://blog.csdn.net/sswt/
Wednesday, December 01, 2004
rpmdb: fatal region error detected; run recovery
rpmdb: fatal region error detected; run recovery
I got an odd error today when trying to use apt-get and instal synapic. When rpm ran we got a pile of errors including the message "rpmdb: fatal region error detected; run recovery" .
Running rpm --rebuilddb produced the same error.Anyway after much screwing around and useless searches in linux mail lists I found a liitle gem on the page "Repair a RPM database safely" on the http://www.rpm.org site.
Basically it says:-"hangs" in select are usually stale locks.
Fix by doing
cd /var/lib/rpm rm -f /var/lib/rpm/__db*
Turns out rpm --rebuilddb was failing due to an old lock file.
Wednesday, November 17, 2004
Mono-> Avalon->XAML???!!!
辣椒、龙舌兰酒、大沿尖顶帽……墨西哥在人们心目中,是一副热辣辣火烈烈的形象。早前两部电影,Man on Fire和City of God,淋漓尽致地把墨西哥地底下一股邪火展现在世人面前——那地方,是天真、直白、充满诗意和理想,而且暴烈的,一如兽类盘踞的伊甸园。
所以,当一些杰出而理想化的IT技术人物渐次在这块土地上崭露头角,世界并不应感到吃惊——Miguel de Icaza就是其中一位。他推动了Gnome这一著名Linux桌面系统的产生、创建Ximian公司(后被Novell收购),在开源世界里,是一个成功地引入商业概念的奇人。
2001年,Miguel de Icaza和朋友一起开启了Mono,基于UNIX的.NET Framework开发平台实现。
.NET是微软希望借以打击Java的重要武器。.NET与Java相比(抛却因成熟度带来的差异不谈,那是可以弥补的),前者跨语言而不跨平台、后者跨平台而不跨语言。在跨平台支持方面,.NET先天不足。当然这与微软“捆绑操作系统”战略密不可分——既有好处,也有坏处。然而无论如何.NET要比 Java晚生多年,在某些方面绝对要比Java具有更多优势,也从Java学习了许多优秀的特性。所以,对.NET发生极大兴趣的,不光是原来的微软开发者,还包括Miguel de Icaza这样的Linux拥趸。
Mono在西班牙语中的意思,是“猴子”。这个名字让人想起墨西哥人火辣直白的性格,那与《西游记》中孙悟空的野性难驯别无二致。Mono项目野心极大,它包括C#编译器、CLR引擎、兼容.NET Framework的类库(支持ADO.NET和ASP.NET等)、第三方类库Gtk#(gtk+工具集的.NET实现)、甚至还有漂亮的IDE、调试工具和文档浏览器。
Mono的主要组成部分是:
公共语言架构(CLI)虚拟机,包括类装载器、Just-in-time编译器和运行时垃圾回收机制;
基础类库,运行于CLR之上的任何语言均可使用,包括兼容.NET的类库和Mono独有类库。
C#语言编译器。未来将实现基于CLR的其他编译器。
Mono已经发布了1.0版本。在这个版本中,最基础的部分已经实现,包括:
C#编译器
VM(虚拟机),包括JIT和预编译器
IL assembler、disassembler
开发和安全工具
核心库:mscorlib、System、System.XML
System.Data和Mono database providers
System.Web:Web应用平台和Apache集成模块
System.Web.Services客户端和服务器支持
System.Drawing
System.DirectoryServices
JIT支持: x86、SPARC和PPC架构
通过IKVM实现Java集成
运行时的嵌入式界面
Mono将紧随Microsoft,在2005年发布支持Whidbey(.NET 2.0)的版本,于2006年发布支持WinFX的版本。
从目前的状况来看,Mono还远未成熟。尽管已经有一些站点在Mono之上搭建,但总体上并没有为大多数人所接受。这里面既有效率效率的原因,也有兼容度的原因。但无论如何,一只天不怕地不怕的石猴已经横空出世了。
事实上Microsoft也有自己的.NET UNIX实现:Rotor,但我相信他们不会很快在战略层面上支持跨平台的.NET Framework。依照微软一贯的做法,类似Mono这样的尝试,也不会进入被打击之列——且看你能做出什么东西,再做打算。
Mono,这只初入人间的猴子,是否能够成长为齐天大圣?Miguel de Icaza显然有此雄心,一切只能让时间来验证了。
Avalon? Apache Avalon or MS Avalon
同样的名字,完全不同的内容。这年头技术变化得很快。MS Avalon到底是什么呢。。。
http://msdn.microsoft.com/msdnmag/issues/04/01/Avalon/default.aspx
May be HTML NG in Longhorn with implement XAML.
So what is XAML?
http://www.cnblogs.com/alex/archive/2004/03/22/3921.aspx
XamlonXamlon是目前流行的第三方工具(运行库)之一,支持在.Net下使用XAML来构建Windows应用程序。现在处于测试(这些第三方工具基本上都在测试阶段),以后将是个商业的东东(要不他怎么在Google上打广告?)http://www.xamlon.com
MyXamlMyXaml是一个开源的东东,也有很多支持者,目前版本是0.92,功能还比较弱,可以看看他的Latest Demonstration。http://www.myxaml.com/
MOBIFORM出了基本的Xaml控件,还有一个图形库http://www.mobiform.com/
相关网站Open XUL Alliance开源XML UI Builders的大本营,里面的The Richmond Post里有一个投票"What .NET/Mono/DotGNU *XUL* Toolkit Do You Use Most?"结果目前显示MyXaml遥遥领先,不过样本太少(总共46 votes),说明不了什么问题。不过至少说明目前XUL-XAML社区还是一片欣欣向荣的景象。另外XUL和XAML还是有区别的,就我所知而言,XUL主要是支持Web上的应用,因为它最初的目的就是做Mozilla的界面用的,而XAML则是纯微软,纯.Net的,他的目标主要是为了填平B/S和C/S的鸿沟,它支持Longhorn时候的IE,使用attribute来定义外观(XUL用的是 CSS)。http://xul.sourceforge.net/
Xaml.net内容比较少,只有一些文章的链接http://www.xaml.net/
zaml.com有一些文章,Blog和Sample的链接http://www.zaml.com/
文章和评论
WFMLhttp://windowsforms.net/articles/wfml.aspx
Introducing "Longhorn" for Developers(系列文章,很值得一读)http://msdn.microsoft.com/msdnmag/issues/04/01/DevelopingAppsforLonghorn/default.aspx
"Longhorn" Markup Language (code-named "XAML") Overviewhttp://longhorn.msdn.microsoft.com/lhsdk/core/overviews/about xaml.aspx
Inside XAMLhttp://www.ondotnet.com/pub/a/dotnet/2004/01/19/longhorn.html
.NET Gripes and XAML Worrieswww.devx.com/codemag/Article/20147?trk=DXRSS_LATEST
遥遥无期的XAML
在我们目前的这个项目里面需要用XML来描述一切,业务流程,表单格式,数据格式,甚至是GUI。我目前负责GUI这一块,菜单,工具栏,导航栏,状态栏这些简单的部分都已经完成了,但是复杂的Form,比如说上面M个文本框,N个标签,下面X个 Grid...实在是个问题--位置信息如何描述?持久化的问题?Validate的问题?我们这样做的初衷本是想做的灵活一些,全部可配置,这样除了 Engine之外基本不用写什么代码,具体的各种业务就是写各种XML配置文件罢了。但是这样带来的复杂性令人头疼。可能是实现的水平根本达不到设计的水平吧--目前看来基本上是自己在代码里写一个类似.Net IDE Designer的东东,根据resx画出窗体来。前些日子看到了XAML,他就是为这个而作的,动态的加载各种控件,但是距离正式发布还遥遥无期--天知道Longhorn什么时候Release?而目前的.Net Framework在设计的时候似乎还没有XAML,所以可以说XAML是下一代的技术了,其目标是融合B/S和C/S,我们这次是用不上了,不过就目前的一些资料来看,XAML的功能还十分有限,不过新技术还是很值得学习的。另外,Marc Clifton目前在做的Application Automation Layer也是在解决这方面的问题,他的代码可以到Codeproject下载,不过他将AAL的整个Framework分了若干层,整体架构比较复杂,目前我正在研究中,AAL自带的一个PhotoAlbum程序演示了这个Framework的功能。相关链接:XAML http://longhorn.msdn.microsoft.com/lhsdk/core/overviews/about xaml.aspxMyXaml http://www.myxaml.com/Marc Clifton http://www.blogstudio.com/aal/AAL (一共5篇文章)http://www.codeproject.com/csharp/aal-1.asp Marc的另一篇文章http://www.codeproject.net/gen/design/xaml.aspWindowsForms.com上的一篇文章 Defining Windows Forms in XMLhttp://windowsforms.net/articles/wfml.aspx


