#
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.OutputStreamWriter;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import com.ibatis.common.exception.NestedRuntimeException;
Document getDoc(Reader reader) {
try {
// Configuration
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
dbf.setValidating(true);
dbf.setIgnoringComments(true);
dbf.setIgnoringElementContentWhitespace(true);
dbf.setCoalescing(false);
dbf.setExpandEntityReferences(false);
OutputStreamWriter errorWriter = new OutputStreamWriter(System.err);
DocumentBuilder db = dbf.newDocumentBuilder();
db.setErrorHandler(new SimpleErrorHandler(new PrintWriter(errorWriter, true)));
//db.setEntityResolver(new DaoClasspathEntityResolver());
// Parse input file
Document doc = db.parse(new ReaderInputStream(reader));
return doc;
} catch (Exception e) {
throw new NestedRuntimeException("XML Parser Error. Cause: " + e);
}
}
/**********************************************************/
private static class SimpleErrorHandler implements ErrorHandler {
/**
* Error handler output goes here
*/
private PrintWriter out;
SimpleErrorHandler(PrintWriter out) {
this.out = out;
}
/**
* Returns a string describing parse exception details
*/
private String getParseExceptionInfo(SAXParseException spe) {
String systemId = spe.getSystemId();
if (systemId == null) {
systemId = "null";
}
String info = "URI=" + systemId +
" Line=" + spe.getLineNumber() +
": " + spe.getMessage();
return info;
}
// The following methods are standard SAX ErrorHandler methods.
// See SAX documentation for more info.
public void warning(SAXParseException spe) throws SAXException {
out.println("Warning: " + getParseExceptionInfo(spe));
}
public void error(SAXParseException spe) throws SAXException {
String message = "Error: " + getParseExceptionInfo(spe);
throw new SAXException(message);
}
public void fatalError(SAXParseException spe) throws SAXException {
String message = "Fatal Error: " + getParseExceptionInfo(spe);
throw new SAXException(message);
}
}
在sources.list中加入:
deb http://archive.ubuntu.org.cn/ubuntu-cn ubuntu.org.cn main
#apt-get update
#apt-get install ttf-arphic-newsung
这样就可以安装上新宋体.
kanru 是我国台湾地区著名的 Debian 黑客
引用:
作者: kanru
有在注意 freetype 最新發展的人應該已經知道
freetype2 已經內建粗體模擬支援(cvs 版本),在 xft2 中相對應的程式碼也已經有了
所以只要更新這兩個套件便可以有基本的粗體支援 眨眨眼
想要嘗鮮的人可以加入以下到 sources.list
代码:
deb http://people.debian.org.tw/~koster/debian/sid ./ deb-src http://people.debian.org.tw/~koster/debian/sid ./
|
其中 freetype2 的部份是今天更新的 cvs 版本,有熱呼呼的的粗體支援
xft2 是拿 debian 中的版本直接重新編譯,讓 configure 偵測到已經開啟模擬粗體
更新 libfreetype6 與 libxft2 後重新啟動 X 便能體驗到久違的粗體 眨眨眼
NOTE: 此修正是以直接修改底層的方式,與其他之前的 patch 不同
混用這些不同 patch 的套件將有不能預期的後果
相關網址:
freetype maillist 討論串
http://lists.gnu.org/archive/html/f...5/msg00019.html
(Firefly) freetype已經接受粗体補丁?
http://firefly.idv.tw/test/Forum.ph...=view&History=0
|
加了 apt 源后
apt-get update
apt-get install libfreetype6 libxft2
然后重启 X , 就可以看到效果了
引用:
作者: kanru
補充一下
如果您有修改過 /etc/fonts/fonts.conf
請檢查有沒有這幾行
PHP代码:
<!--
Synthetic emboldening for fonts that do not have bold face available
--> <match target="font"> <!-- check to see if the font is just regular --> <test name="weight" compare="less_eq"> <int>100</int> </test> <!-- check to see if the pattern requests bold --> <test target="pattern" name="weight" compare="more_eq"> <int>200</int> </test> <!-- set the embolden flag --> <edit name="embolden" mode="assign"> <bool>true</bool> </edit> </match>
|
這些是用?碓O定啟用模擬粗體的,是 Debian 預設安裝,沒改過 fonts.conf 的人應該不用再改
作者:robbin 网址:http://www.fankai.com/
在IBM的developerWorks上有几篇非常优秀的关于Java XML API的评测文章,它们是:
http://www-900.ibm.com/developerWorks/cn/xml/x-injava/index.shtml
http://www-900.ibm.com/developerWorks/cn/xml/x-injava2/index.shtml
http://www-900.ibm.com/developerWorks/cn/xml/x-databdopt/part2/index.shtml
http://www-900.ibm.com/developerWorks/cn/xml/x-databdopt/part1/index.shtml
对这几篇文章我想说的就是“吐血推荐”
Java的XML API这几篇文章该讲的都讲到了,我只想补充几点:
一、Crimson和Xerces恩仇录
Crimson来自于Sun捐赠给Apache的ProjectX项目,Xerces来自IBM捐赠给Apache的XML4J项目,结果Xerces胜出,成了Apache XML小组全力开发的XML API,而Crimon已经早就不做了,如今Xerces名满天下,到处都是在用Xerces DOM和SAX解析器,只有Sun不服气,非要在JDK1.4里面使用过时的Crimson,让人感觉像是在赌气一样,真是让人可怜又可气!不过IBM发行JDK用的XML 解析器自然是Xerces。
由于JDK的Class Loader的优先级关系,当你采用JAXP编写XML程序的时候,即使把Xerces包
引入CLASSPATH,JDK还是会顽固的使用Crimson,这一点通过打开JVM的verbose参数可以观察到。不过JDK也允许你采用其它的解
析器,因此我们可以通过在JRE\lib\目录下建一个jaxp.properties的文件,来替换解析器,jaxp.properties内容如下:
javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl 这样就可以使用Xerces,当然你必须还是要把Xerces包放到CLASSPATH下。
二、JAXP的姗姗来迟
Sun在XML领域总是后知后觉,等到Sun重视XML的时候,XML的API早就满天 飞了,尤其是IBM具有非常大的领先优势。不过Sun是规范的制订者,于是参考W3C的标准制订了JAXP规范。JAXP不像Xerces和Crimon那样,它只是一个spec,本身是不做任何事情的,它的作用就是提出一个统一的接口,让其它的XML API都来遵循JAXP编程,那么用JAXP写出来的程序,底层的API可以任意切换。
具
体来说JAXP包括了几个工厂类,这就是JDK1.4里面的javax.xml.parsers 包,用来寻找符合DOM标准的XML
API实现类的位置;此外JAXP还包括一整套interface,这就是JDK1.4里面的org.w3c.dom那几个包。工厂类负责加载DOM的实
现类。那么加载的规则是什么呢?
我是通过阅读JAXP的源代码知道的,工厂类首先会根据java命令行传入的参数进行寻找,然后在根据
JRE\lib\jaxp.properties中定义的实现类寻找,最后什么都找不到的话,就用Crimson。注意Crimons是由
Bootstrap Class Loader来load的,如果你不通过上面两个方法来改变工厂的寻找顺序,那么铁定用Crimson了
三、 DOM解析器和DOM API
当你严格采用JAXP编程的时候,是遵循W3C的DOm标准的,那么在JAXP底层你实际上可以任意切换不同的DOM实现,例如Xerces,或者Crimon,再或者其它,切换方法就是配置jaxp.properties。因此JAXP就是一些标准接口而已。
而Xerces和Crimon也不单单是一个DOM实现那么简单,他们本身实际上也包含SAX解析器和DOM解析器。所以一个JAXP程序下面有如下层次:
JAXP应用程序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析器
只要你用JAXP编程,那么你就可以切换到Crimson上来
JAXP应用程序 -> JAXP接口 -> Crimson DOM实现 -> Crimson DOM/SAX 解析器
另外你也可以这样来做:
JAXP应用程序 -> JAXP接口 -> Crimson DOM实现 -> Xerces DOM/SAX 解析器
不过如果你的程序不安装JAXP来写,那么就没有办法切换不同的DOM实现了。
四、不是标准的dom4j和jdom
W3C
的DOM标准API难用的让人想撞墙,于是有一帮人开发Java专用的XML
API目的是为了便于使用,这就是jdom的由来,开发到一半的时候,另一部分人又分了出来,他们有自己的想法,于是他们就去开发dom4j,形成了今天
这样两个API,至于他们之间的性能,功能之比较看看上面我推荐的文章就知道了,jdom全面惨败。
jdom 相当于上面的 JAXP接口 + Xerces DOM实现部分,它本身没有解析器,它可以使用Xerces或者Crimson的解析器,就是这样:
jdom应用程序 -> jdom API -> Xerces/Crimson解析器
dom4j 和jdom类似,不过他自己绑定了一个叫做Alfred2的解析器,功能不是很全,但是速度很快,当没有其它的解析器的时候,dom4j将使用Alfred2解析器,如下:
dom4j应用程序 -> dom4j API -> Xerces/Crimson解析器
或者
dom4j应用程序 -> dom4j API -> Alfred2解析器
你在SF上下载的dom4j.jar是不含 Alfred2解析器的,而dom4j-full.jar包含了 Alfred2解析器,在这种情况下,实际上你什么也不需要,光是一个dom4j-full.jar就全部都包括了。
因此可以看出采用dom4j/jdom编写的应用程序,已经不具备可移植性了。
五、小插曲
Sun是JAXP标准的制订者,甚至很执著的在JDK1.4里面绑定Crimson DOM实现和解析器,然后可笑的是,Sun自己的JAXM RI竟然不是用JAXP写出来的,而是dom4j,制订标准让大家遵守,自己却监守自盗,这未免太说不过去了吧!
BTW: Hibernate也用的是dom4j来读取XML配置文件,如今已经越来越多的程序纷纷采用dom4j,如果你不是那么在乎可移植性,我强烈建议你采用dom4j。
因为sourcenav不支持中文的locale,所以会报错误.
只要输入:$export LANG=en_US
$export LC_ALL=en_US
$snavigator
这样就能正确的起动.
详细的命令如下:
mount -t smbfs -o username=tridge,password=foobar //fjall/test /data/test
不符合ANSI/ISO的源代码
/*
* pedant.c - use -ansi, -pedantic or
-pedantic-errors
*/
#include <stdio.h>
void
main(void)
{
long long int i = 0l;
printf("This is a non-conforming
c program\n");
}
使用gcc pedant.c -o
pedant这个命令时,编译器会警告main函数的返回类型无效:
$gcc pedant.c -o pedant
pedant.c:In
function 'main':
pedant.c:7 warning:return type of 'main' is not
'int'
现在给gcc加上-ansi选项:
$gcc -ansi pedant.c -o pedant
$gcc pedant.c -o
pedant
pedant.c: In function 'main'
pedant.c:7 warning: return type of
'main' is not
'int'
gcc再次给出了同样的警告信息,并忽略了无效的数据类型.
-ansi,-pedantic以及-pedantic-errors编译选项并不能保证被编译的程序的ANSI/ISO兼容性,它们仅被用来帮助程序员离这个目标更近.
$gcc
-Wall pedant.c -o pedant
pedant.c:7: warning: return type of 'main' is not
'int'
pedant.c: In function 'main':
pedant.c:8 warning: unused variable
'i'
-Wall系列选项的另一个极端是-w选项,它能关闭所有的警告信息。-W{warning}选项的作用是打开warning所指出的用户感兴趣的特殊警
告信息,比如隐身函数说明(-Wimplicit-function-declaration)或者隐身声明返回类型的函数(-Wreturn-
type).前者的作用在于它提示出定义了一个函数却没有事先声明或者忘记了包含适当的头文件.后者的作用在于指出声明的函数可能没有指定它的返回类型,
此时默认的返回类型为int.
提示:如果只想检查语法而实际上不做如何编译工作,那么可以调用带有-fsyntax-only参数的GCC.
选项
说明
-Wcomment
如果出现了注解嵌套(在第一个/*之后又出现了第二个/*)则发出警告
-Wformat
如果传递给printf及及其相关函数
的参数和对应的格式字符串中指定的类型不平配则发出警告
-Wmain
如果main的返回类型不
是int或者调用main时使用的参数数目不正确则不出警告
-Wparentheses
如果在出现了赋值(例如,(n=10))的地方使用了括号,而那里根据前后关系推断应该是比较(例如,(n==100))而非赋值的时候,或者如果括号能够解决运算优先级问题的时候,发出警告
-Wswitch
如果swtich语句少了它的一个或多
个枚举值的case分支(只有索引值是enum类型时才适用)则发出警告
-Wunused
如果声明的变量没有使用,或者函数声明
为static类型但却从未使用,则发出警告
-Wuninitialized
如果使用的自动变量没有初始化则发出警告
-Wundef
如果在#if宏中使用了未定义的变量作判断则发出警告
-Winline
如果函数不能被内联则发出警告
-Wmissing-declarations 如果定义了全局函数但却没有在任何头文件中声明它,则发出警告
-Wlong-long
如果使用了long long类型则发出警告
-Werror
将所有的警告转变为错误
常见的编程错误:
/*
* blunder.c - Mistakes caught by
-W(warning)
*/
#include <stdio.h>
#include
<stdlib.h>
int main(int argc, char *argv[])
{
int i,
j;
printf("%c\n", "not a character"); /* -Wformat */
if(i =
10) /*
-Wparenthesses */
printf("oops\n");
if(j !=
10)
/* -Wuninitialized */
printf("another oops\n");
/* /*
*/ /*
-Wcomment */
no_decl(); /*
-Wmissing-declaration */
return (EXIT_SUCCESS);
}
void
no_decl(void)
{
printf("no_decl\n");
}
$gcc blunder.c -o
blunder
blunder.c:27: warning: type mismatch with previous implicit
declaration
blunder.c:21: warning: previous implicit declaration of
'no_decl'
blunder.c:27: warning: 'no_decl' was previously implicitly declared
to return
'int'
gcc只发出了和隐式声明no_decl函数有关的警告.它忽略了其他潜在的错误,这些错误包括:
.传递给printf的参数类型(一个字符串)和格式化字符串定义的类型(一个字符)不匹配.这会产生一个-Wformat警告.
.变量i和j使用前都没有初始化.它们中的任何一个都产生-Wuninitialized警告.
.在根据前后关系推断应该对变量i的值做比较的地方,却对变量i进行赋值.这应该会产生一个-Wparentheses警告.
.在注释嵌套开始的地方应该会产生一个-Wcomment警告.
例如,如果已经在/home/fred/include 下保存了自定义的头文件,那么为了让gcc能够找到它们,可按下面的例子使用-I选项:
$gcc
myapp.c -I /home/fred/include -o
myapp
-L选项对库文件起的作用和-I选项告诉gcc把DIRNAME添加到库文件搜索路径里,要保证DIRNAME比标准位置先被搜索.
假设读者需要测试一个新的编程库libnew.so,当前它保存在/home/fred/lib下(.so是共享库文件的标准扩展名).为了链接库文件,gcc命令行应与下面类似:
$gcc
myapp.c -L/home/fred/lib -lnew -o
myapp
-L/home/fred/lib结构让gcc先在/home/fred/lib下查找库文件,然后再到默认的库文件搜索路径下进行查找.-l选项使得链
接程序使用指定的函数库中的目标代码,也就是本例中的libnew.so.把函数库命名为lib{名字}是UNIX的约定,与许多其他编译器一样,gcc
也遵循此约定.如果忘了使用-l选项,则与库的链接将失败,并且gcc产生错误,说明程序中引用了未定义的函数名.
默认情况下,gcc使用共享库进行链接,所以在需要链接静态库时必须使用-static选项来保证只使用静态库.
$gcc
cursesapp.c -lncurses -static -o
cursesapp
在链接静态库时,可执行程序的大小比链接共享库要达很多.使用共享库时,程序所使用的代码是在运行时动态链接,而不是在编译时静态链接,因此,如果所需要的共享库没有在用户系统中安装,运行就会失败.
选项 说明
-o FILE 指定输出文件名,在编译为目标代码时,这一选项不
是必须的.如果FILE没有指定,默认文件名时a.out
-c
只编译不链接
-DFOO=BAR 在命令行定义预处理宏FOO,其值为BAR
-IDIRNAME 将DIRNAME加入到包含文件的搜索目录列表中
-LDIRNAME 将DIRNAME加入到库文件的搜索目录列表中
-static
链接静态库,即执行静态链接默认情况下gcc只链接共享库
-IFOO 链接名为libFOO的函数库
-g
在可执行程序中包含标准调试信息
-ggdb 在可执行程序中包含只有GNU
debugger(gdb)才能识别大量调试信息
-O
优化编译过的代码
-ON
指定代码优化的级别为N,0<=N<=
3,如果未指定N,则默认级别为1
-ansi 支持ANSI/ISO
C的标准语法,取消GNU的语法扩展中与该标准有冲突部分(但这一选项并不能保证生成ANSI兼容的代码)
-pedantic 允许发出ANSI/ISO
C标准所列出的所有警告
-pedantic-errors 允许发出ANSI/ISO
C标准所列出的所有错误
-traditional 支持Kernighan & Ritchie C 语法
(如用旧式语法定义函数).
-w
关闭所有警告,建议不要使用此项
-Wall
允许发出gcc能提供的所有有用的警告.也可以用-W{warning}来标
记指定的警告
-werror 把所有警告转换为错误,以在警告发生时中止编译过程
-MM
输出一个make兼容的相关列表
-v
显示在编译过程的每一步中用到的命令
实例代码:
/*
* hello.c - Canonical "Hello, World!" program
*/
#include
<stdio.h>
int main(void)
{
printf("Hello,Linux programming
world!\n");
return 0;
}
在命令行上键入以下命令编译和运行这段程序:
$gcc hello.c -o
hello
$./hello
Hello, Linux programming
world!
第一行命令告诉gcc对源代码hello.c进行编译和链接,并使用-o参数指定创建名为hello的可见程序.第二行命令执行hello这个程序,第三行是程序的执行结果.
其实,gcc首先运行预处理程序cpp来展开hello.c中的宏并在其中插入#include文件所包含的内容:然后把预处理后的源代码编译成为目标代码;最后,链接程序ld创建一个名为hello的二进制文件.
现在我们来通过手工操作重新创建这些步骤,以逐步执行编译过程.第一布是运行预处理器.使用-E选项告诉gcc在预处理后停止编译过程:
$gcc
-E hello.c -o
hello.cpp
此时查看hello.cpp会发现stdio.h的内容确实都插到文件里去了,而其他应当被预处理的标记也做了类似处理.
下一步是将hello.cpp编译为目标代码.可使用gcc的-c选项来完成:
$gcc
-x cpp-output -c hello.cpp -o
hello.o
-x选项告诉gcc从指定的步骤开始编译,在本例中也就是编译器处理后的源代码(cpp-output).
gcc是怎么知道如何处理某种特殊类型的文件呢?它是依靠文件的扩展名来决定如何正确处理该文件的.
——————————————————————————————
扩展名
类型
.c
C语言源代码
.C,.cc
C++语言源代码
.i
预处理后的C源代码
.ii
预处理后的C++源代码
.S,.s
汇编语言源代码
.o
编译后的目标代码
.a,.so
编译后的库代码
———————————————————————————————
最后,链接目标文件,生成二进制代码.
$gcc
hello.c -o hello
|