Subversion pre-commit hooks


pre-commit内容如下

#!/bin/sh

REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | wc -c`

if [ "$LOGMSG" -lt 5 ];
then
  echo -e "***** Comment must be at least 5 characters. *****" 1>&2
  exit 1
fi# All checks passed, so allow the commit.
exit 0

添加完成之后需要修改文件具备执行权限,否则会提示

svn: Commit blocked by pre-commit hook (exit code 255) with no output.
Advertisements

XML创建/解析/验证


最近用到XML结合JMS TextMessage传输数据的技术。采用TextMessage+XML格式传输对象是考虑到这个平台不仅仅使用Java语言开发,同时还需要能够支持其他语言接入:比如C, Ruby, Perl, Python, PHP, ActionScript/Flash, Smalltalk,借助于ActiveMQ提供的Stomp,这些非Java语言能够很方便的就接入平台。

总结下来整个传输过程如下(Java to Java):

DTO对象->XML对象->XML文本->JMS TextMessage->XML文本->XML对象->DTO

对象

涉及技术点:

  1. JavaDTO对象如何转变为XML对象
  2. 如何从XML对象中获得XML文本
  3. 如何通过XML文本构造XML对象
  4. 遍历XML对象创建JavaDTO对象

先说第一点,JavaDTO对象如何转变为XML对象

// 创建DocumentBuilderFactory,创建和解析XML都需要
DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder
DocumentBuilder builder = domfac.newDocumentBuilder();
// 新建文档
Document doc = builder.newDocument();
doc.setXmlVersion("1.0");
// 创建文档根节点
Element root = doc.createElement("root");
// 循环创建叶子节点
Element leaf = doc.createElement("leaf");
// 添加叶子节点属性
leaf.setAttribute("name", "从Java对象中获取");
// 增加叶子节点至根节点
root.appendChild(leaf);

至此,XML对象已经创建完成,现在需要从XML对象中获取XML文本。

Continue reading “XML创建/解析/验证”

修改 Oracle XE 的CHARACTERSET


从Oracle 11g上导出一些资料至 oracle xe上时,会出现长度不足的情况。经查发现是NLS_CHARACTERSET设置不同导致的。
Oracle XE安装后,默认为AL32UTF8,这样一个中文字符会占用三个字节,而原来的数据库设置为:ZHS16GBK。以下为将Oracle XE上的AL32UTF8改为ZHS16GBK的方法:

以 sysdba 角色 进入sqlplus 之后执行以下命令:

D:\oraclexe\app\oracle\product\10.2.0\server\BIN\sqlplus.exe / as sysdbaSHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
ALTER SESSION SET SQL_TRACE=FALSE;

查看Oracle 參數

select * from v$NLS_PARAMETERS

重启数据库

SHUTDOWN IMMEDIATE;
STARTUP;

修改完成后管理界面会乱码,不用管它。

参考:修改 Oracle XE 的CHARACTERSET

Log4j中添加自定义的日志级别


Log4j自带了trace,debug,info.warn,error,fatal几个日志级别。

由于项目需要拆分业务和系统日志,而我又想偷懒,所以决定在log4j日志框架上增加自定义的日志级别专门用于业务日志输出。需要增加的日志级别定为audit,在log4j所有自带日志级别之上。

Log4j官方推荐的增加自定义的日志级别的方法是“继承org.apache.log4j.Level类”,具体的可以参考log4j中的示例XLevel。由于系统开发时不直接使用Log4j,而是通过slf4j调用log4j,官方推荐的方法行不通,所以决定修改log4j和slf4j相关源代码。

Log4j源代码修改点如下:

org.apache.log4j.Logger添加audit方法

public void audit(Object message) {
	if (repository.isDisabled(Level.AUDIT_INT)) {
		return;
	}

	if (Level.AUDIT.isGreaterOrEqual(this.getEffectiveLevel())) {
		forcedLog(FQCN, Level.AUDIT, message, null);
	}
}

org.apache.log4j.Priority类添加AUDIT_INT属性

public final static int AUDIT_INT = 60000; //日志级别大于log4j包含的所有日志级别,便于后期通过Threshold属性过滤日志

org.apache.log4j.Level类添加AUDIT相关属性和方法

public static final Level AUDIT = new Level(AUDIT_INT, "AUDIT", 0);public static Level toLevel(int val, Level defaultLevel) {
	switch(val) {
		case ALL_INT: return ALL;
		case AUDIT_INT: return Level.AUDIT;
		case DEBUG_INT: return Level.DEBUG;
		case INFO_INT: return Level.INFO;
		case WARN_INT: return Level.WARN;
		case ERROR_INT: return Level.ERROR;
		case FATAL_INT: return Level.FATAL;
		case OFF_INT: return OFF;
		case TRACE_INT: return Level.TRACE;
		default: return defaultLevel;
	}
}

至此Log4j修改完成,下面修改slf4j相关源代码。slf4j需要修改slf4j-api和slf4j-log4j12两个包 Continue reading “Log4j中添加自定义的日志级别”

通过SSH隧道安全连接vncserver


当前大部分Linux发行版中都能够安装vncserver,但是由于免费版的vncserver不支持加密协议连接,所以在internet上通过vnc管理服务器还是存在不安全的因素。

当然,可以购买vncserver企业版,下面的文章是介绍如何通过ssh协议在internet上建立加密通道。

首先需要配置vncserver监听localhost,配置文件如下:

VNCSERVERS="1:oracle"
VNCSERVERARGS[1]="-geometry 1366x768 -alwaysshared -localhost"

根据ssh客户端的不同,建立加密通道的方式也不同。

OpenSSH比较简单,一条命令即可搞定。

ssh -L 5901:127.0.0.1:5901 oracle@internet_ip

Putty客户端配置可以参考:Tunneling Tight-VNC over ssh using PuTTY截图。

最后连接的时候,在VNC Viewer中输入localhost:1即可连接internet_ip对应的5901端口。

需要注意的是,如果需要同时连接两个公网IP的5901地址,可以在创建ssh隧道的时候指定不同的本地端口。例如:

ssh -L 5901:127.0.0.1:5901 oracle@internet_ip1
ssh -L 5903:127.0.0.1:5901 oracle@internet_ip2

VNC Viewer中输入localhost:3将会连接internet_ip2的5901端口。

参考:How to use VNC over SSH tunnelling for secure remote graphical sessions

Install Oracle 11gR1 x64 on CentOS


首先需要注意安装之前修改本地主机名。

  • 修改/etc/sysconfig/network文件中的HOSTNAME
  • 修改/etc/hosts中的127.0.0.1以及::1对应域名

修改完成后重启。原因是电信的DNS把localhost.localdomain指向了202.106.199.39,导致oracle em启动时不正常。

下面开始安装

创建Oracle用户及用户组

[root@localhost ~]# groupadd oinstall
[root@localhost ~]# groupadd dba
[root@localhost ~]# useradd -m -g oinstall -G dba oracle
[root@localhost ~]# passwd oracle

修改系统参数

[root@localhost ~]# vim /etc/sysctl.conf
# Oracle Install
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576[root@localhost ~]# sysctl -p

创建Oracle目录 Continue reading “Install Oracle 11gR1 x64 on CentOS”