Filed under: Technology

在处理 JavaBean 时,boolean 和 Boolean 的不同

August 3rd, 2010

昨天在写一个 JavaBean 相关的程序时,发现不能正常的通过 getReadMethod().invoke(...) 读取 一个 Boolean 的属性值,最后总算找到了原因,真相总是如此简单!
首先这个属性在Bean中的定义如下:

......
private boolean married = false;
private Boolean hasChildren;
 
......
 
public void setMarried(boolean married) { this.married = married; }
public boolean isMarried() { return married; }
 
public void setHasChildren(Boolean hasChildren) { this.hasChildren = hasChildren; }
public Boolean isHasChildren() { return hasChildren; }
 
......

我通过下面的方式进行值的读取这两个属性

......
 
PropertyDescriptor[] pds = 
    Introspector.getBeanInfo( o.getClass() ).getPropertyDescriptors();
for( int pdi = 0; pdi < pds.length; pdi ++ ){
    Class type = pds[pdi].getPropertyType();
 
    String name = pds[pdi].getName();
    Object value = pds[pdi].getReadMethod().invoke( o );
}
 
......

第一个属性能正常读出,第二个总是会报空指针错误,如果把 isHasChildren() 改为

public Boolean getHasChildren() { return hasChildren; }

则没问题,注意我的另一个属性用的也是isMarried() ,可以正常读取.
最后发先,如果是 boolean ,isMarried() 或者是 getMarried() 都没问题,如果是Boolean ,则只能使用 getHasChildren()

Tags:
Posted in Technology | No Comments »

将Extjs放入Maven中心库

July 30th, 2010

总算比较完美的解决了extjs在maven下的依赖问题,过程如下:

  • 首先将extjs作为一个单独的maven项目,通过maven-assembly-plugin插件做成一个zip包。
  • 然后通过sonatype同步的maven中心库,这步最复杂
    + 首先要向sonatype申请,主要是说明一下你的项目,例如它的描述,项目主页,代码库的位置等。
    + 如果批准,你就可以通过maven-deploy-plugin插件将的包deploy到sonatype的一个零时库。
    + 进入零时库后,你要通过一个管理界面将包放到sonatype的正式库,这步需要检验你的包是否规范,什么license, gpg签名,scm等信息一样都不能少。
    + 如果进入sonatype的正式库,再向sonatype提出申请,要求激活与maven中心库的同步。
    + 如果激活,过几个小时,就能看到你的包了。看看我的!
  • 以后有新版本,就不用再申请,只要保证你的包格式规范就行了。
  • 全部过程最多也就2天时间,如果没有时差,估计更快。

大家以后再也不用在自己的代码库中保存extjs那一大堆文件了,直接通过maven导入extjs,如果有新版本的需要,请email给我。

    ...
    <dependency>
      <groupId>org.gaixie.extjs-wrapped</groupId>
      <artifactId>extjs-wrapped</artifactId>
      <version>3.2.1</version>
      <type>zip</type>
    </dependency>
    ...

然后通过 maven-war-plugin 插件的 overlay 把它解压到你的web项目目录中,配一下jetty,就可以很方便的调试了。可以参考我写的pom。

我是参考这几篇文章操作的:
[1] http://www.jroller.com/holy/entry/releasing_a_project_to_maven
[1] https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide

Tags: , ,
Posted in Technology | 2 Comments »

PostgreSQL 与 Slony-I 的安装配置

April 22nd, 2010

公司主要使用的是 PostgreSQL 数据库,最近人员变动,我需要尽快掌握数据库实时备份的相关知识,一旦 master 数据库服务器出现故障,可以迅速的切换到 slave 数据库。本文档的测试环境,如下表:

Master 192.168.0.194 Slave 192.168.0.199
操作系统 Fedora 12 Ubuntu 9.10
PostgreSQL 8.4.3 8.4.2
SlonyI 1.2.20 1.2.20

文档结构主要分为下面几个部分:

  • 安装相关的软件包
  • 配置 master 和 slave 数据库
  • SlonyI 的同步测试
  • 数据库切换
  • Schema 改动
  • 常见问题
  • 参考文档

安装相关的软件包
~~~~~~~~~~~~~
+ Fedora

sudo yum install postgresql-server

PostgreSQL 装好后会自动创建一个名为 postgres 的数据库管理员用户,此用户没有密码,可用 root su 过去。

$ su -l postgres
$ initdb

用root启动postgresql

$ sudo service postgresql start
$ sudo yum install pgadmin3

修改postgresql.conf,是外部client可以通过tcp访问

$ vi /var/lib/pgsql/data/postgresql.conf

在 #listen_addresses = ‘localhost’ 前面增加一行

listen_addresses = '*'

使同一网段的所有用户可以无须密码验证的使用 pgadmin 进行连接,修改 pg_hba.conf 文件

$ vi /var/lib/pgsql/data/pg_hba.conf

在文件最后增加一行

host    all         all         192.168.0.1/24        trust

注:上面的配置只是为了方便测试,生产环境不能这样配置,需要重启数据库

fedora默认的防火墙策略是拦截5432端口请求,修改iptables,让外部主机可以访问postgresql端口

$ sudo vi /etc/sysconfig/iptables

在 -A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT 的下一行增加

-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT

重启防火墙

$ sudo service iptables restart

slony编译需要 pg_config,所以需要安装 postgresql-devel 包,否则在 ./configure 会提示未找到 pg_config

$ sudo yum install postgresql-devel

pg_config 可以输出 postgresql 的安装路经

checking for pg_config... /usr/bin/pg_config
pg_config says pg_bindir is /usr/bin/
pg_config says pg_libdir is /usr/lib/
pg_config says pg_includedir is /usr/include/
pg_config says pg_pkglibdir is /usr/lib/pgsql/
pg_config says pg_includeserverdir is /usr/include/pgsql/server/
checking for correct version of PostgreSQL... 8.4
pg_config says pg_sharedir is /usr/share/pgsql/

安装 bison 和 flex,否则 gmake all 时会报 Missing yacc parser.y parser.c 之类的错

$ sudo yum install bison flex

下载 slony 源码及文档,并用root安装

$ wget http://www.slony.info/downloads/1.2/source/slony1-1.2.20-docs.tar.bz2
$ wget http://www.slony.info/downloads/1.2/source/slony1-1.2.20.tar.bz2
$ su
$ tar -vxjf slony1-1.2.20.tar.bz2
$ ./configure
$ gmake all
$ gmake install

+ Ubuntu
需要安装的软件包和 fedora 类似,具体的包名可能有点差别,openssh-server 开启 ssh 服务,方便远程控制。

$ sudo aptitude update
$ sudo aptitude install openssh-server
$ sudo aptitude install postgresql
$ sudo aptitude install pgadmin3

装完后默认已经执行了 initdb,由于ubuntu 没有 root 用户,所以 sudo -i 到postgres

$ sudo -i -u postgres

这里可能有字符集的问题,见常见问题部分。
和 fedora 一样,修改 postgresql.conf,是外部 client 可以通过 tcp 访问

$ vi /etc/postgresql/8.4/main/postgresql.conf

在 #listen_addresses = ‘localhost’ 前面增加一行

listen_addresses = '*'

同样需要修改 pg_hba.conf 文件

$ sudo vi /etc/postgresql/8.4/main/pg_hba.conf

在文件最后增加一行

host    all         all         192.168.0.1/24        trust

重启postgresql

$ sudo -i -u postgres /etc/init.d/postgresql-8.4 restart

参考前面 fedora下的 slony 配置,安装下面几个包

$ sudo aptitude install postgresql-server-dev-8.4
$ sudo aptitude install bison flex

pg_config的输出如下:

checking for pg_config... /usr/bin/pg_config
pg_config says pg_bindir is /usr/lib/postgresql/8.4/bin/
pg_config says pg_libdir is /usr/lib/
pg_config says pg_includedir is /usr/include/postgresql/
pg_config says pg_pkglibdir is /usr/lib/postgresql/8.4/lib/
pg_config says pg_includeserverdir is /usr/include/postgresql/8.4/server/
checking for correct version of PostgreSQL... 8.4
pg_config says pg_sharedir is /usr/share/postgresql/8.4/

slony的安装和 fedora 一样,注意ubuntu 中用make,不是 gmake

$ wget http://www.slony.info/downloads/1.2/source/slony1-1.2.20.tar.bz2
$ sudo tar -vxjf slony1-1.2.20.tar.bz2
$ cd slony1-1.2.20
$ sudo ./configure
$ sudo make all
$ sudo make install

默认slony被安装至 /usr/lib/postgresql/8.4/bin/ 目录下。

Tags: ,
Posted in Technology | No Comments »

Fedora 12 下配置Huawei EC1260 3G无线网卡

April 5th, 2010

Huawei EC1260 是一款中国电信的3G无线网卡,在Ubuntu 9.10上无须任何配置就可以运行,在Fedora 12上,却始终无法正常工作。试了很多方法,最后总算找到了解决方案。

kernel version: 2.6.32.9-70
usb_modeswitch version: 1.0.5

安装配置usb_modeswitch
~~~~~~~~~~~~~~~~~~~~~
初次插入EC1260时,系统能自动识别Usb设备。

$ lsusb
... ID 12d1:1446 Huawei Technologies Co., Ltd....

表示此usb 设备的 vendor = 0x12d1 , product = 0×1446,但0×1446这个设备并不是modem,而是zeroCD,它是一个存贮设备,里面有一些厂商提供的驱动(可以认为此模式下EC1260就是一个优盘)。所以,要把EC1260中第二个设备驱起来(也就是关键的3G Modem),就需要安装一个usb_modeswitch的软件包,它的作用是切换网卡的工作模式,例如从zeroCD切换到modem。

$ sudo yum install usb_modeswitch

编辑usb_modeswitch的配置文件

$ sudo vi /etc/usb_modeswitch.conf

找找有没有 EC1260的配置项,有的话就打开注释,没有就添加下面内容

########################################################
# Huawei EC1260
#

DefaultVendor= 0x12d1
DefaultProduct= 0x1446

MessageEndPoint= "0x01"
MessageContent="55534243123456780000000000000011060000000000000000000000000000"

配置udev
~~~~~~~~
新增一个udev配置文件,保证热拔插usb设备,也能将modem驱动起来

$ sudo vi /etc/udev/rules.d/45-huaiwei-3g.rules

只需在文件中添加下面内容

ACTION=="add", SUBSYSTEM=="usb", SYSFS{idProduct}=="1446", SYSFS{idVendor}=="12d1",
RUN+="/lib/udev/modem-modeswitch --vendor 0x12d1 --product 0x1446 --type option-zerocd"

重启电脑后,再次lsusb,会发现product已经变为 0×1001,也就是我们要使用的无线modem,可以去network manager连接了。

参考文档
~~~~~~~~
[1] http://swiss.ubuntuforums.org/showthread.php?t=1246293
[2] http://www.linuxquestions.org/questions/slackware-14/3g-modem-794337/
[3] http://forums.fedoraforum.org/showthread.php?t=207393

Tags: ,
Posted in Technology | No Comments »

在Fedora 12上安装配置WordPress

March 4th, 2010

WordPress安装很简单,网上相关文档也很多,写此文档的目的是下次在Fedora上配置WordPress时,可以不用动脑子的 Ctrl+c, Ctrl+v

安装Apache, MySQL, PHP
~~~~~~~~~~~~~~~~~~~~~
如果在安装Fedora 12的时候选择了安装Web Server,那么Apache 和PHP引擎都会被默认安装。
执行下面命令进行MySQL安装时,会安装一个依赖包:perl-DBD-MySQL

$ sudo yum install mysql mysql-server

设置boot时运行级别2,3,5启动mysqld,运行级别的说明见 /etc/inittab 注释,如果要关闭,把on改为off

$ sudo chkconfig --levels 235 mysqld on

先手动把mysql启动起来

$ sudo /etc/init.d/mysqld start 

为MySQL的root设置密码

$ sudo mysqladmin -u root password "xxxx"  

安装WordPress
~~~~~~~~~~~~
下载相应的版本:http://wordpress.org/download/release-archive/ 。
Fedora的Apache默认的DocumentRoot是/var/www/html,所以WordPress应该安装到此目录下,然后通过http://localhost/tommy来访问

$ wget http://wordpress.org/wordpress-2.8.6.tar.gz
$ tar xzvf wordpress-2.8.6.tar.gz
$ sudo mv wordpress /var/www/html/tommy 

设置WordPress使用的MySQL库。
增加一个tommy用户,并被授予操作wpdb库的所有权限,localhost限定tommy只能从本机连接库,WordPress文档中提示要flush privileges,实际上如果使用grant命令,就不需要flush。

% mysql -u root -p
password: *****
mysql> create database wpdb;
mysql> grant all on wpdb.* to 'tommy'@'localhost' identified by '****';
mysql> exit    

按照 wordpress安装包中的 readme.html,编辑 wp-config 文件,设置数据库名,用户及密码。

$ cp /var/www/html/tommy/wp-config-sample.php /var/www/html/tommy/wp-config.php
$ vi /var/www/html/tommy/wp-config.php

用浏览器打开 /var/www/html/tommy/wp-admin/install.php 文件,进行最后的配置。
安装完成后,用自动生成的帐号登录,记得修改密码。

WordPress数据恢复
~~~~~~~~~~~~~~~
将备份出的WordPress数据恢复到新建的库 wpdb中

$ mysql -u tommy -p'****' wpdb<backup/wpdb.sql

恢复theme,直接复制到 /var/www/html/tommy/wp-content/themes,我的theme保存在googlecode上,见
Install mercurial 1.3.1 on debian lenny

$ cd /var/www/html/tommy/wp-content/themes
$ hg clone https://bito.googlecode.com/hg/ bito

参考文档
~~~~~~~
[1] http://www.howtoforge.com/installing-apache2-with-php5-and-mysql-support-on-fedora-12-lamp
[2] http://dev.mysql.com/doc/refman/5.1/zh/installing.html#default-privileges
[3] http://codex.wordpress.org/Installing_WordPress#Using_the_MySQL_Client
[4] http://dev.mysql.com/doc/refman/5.1/en/adding-users.html

Tags:
Posted in Technology | No Comments »

Eclipse默认的Java编译器

February 8th, 2010

开发编译器门槛很高,Java 的编译器数的上的也就下面几种:
1. javac : 不用介绍了,也是最常见的。
2. GCJ (Compiler for Java) : GNU 项目比较常用,绝大多数 Linux 发行版的默认 Java 编译器。
3. ECJ (Eclipse Compiler for Java) : 大名鼎鼎的 eclipse 内置的编译器。

如果你不想在 eclipse 中使用 ECJ,想使用 javac 或者是 GCJ,就需要使用 Ant,在build.xml中指定编译器,全局替换掉 eclipse 默认的 ECJ 好像比较困难。关于这个问题的讨论见:
http://dev.eclipse.org/newslists/news.eclipse.tools/msg17370.html

正是因为有了 ECJ ,所以即使你只安装了 JRE,也可以在 eclipse 中进行编译,它基本上算是为 eclipse 量身定做,所以效率不错。

网上没找到有关它们性能权威的分析,只有几个不太权威的测试:
http://blog.mikiobraun.de/2008/08/benchmarking-javac-vs-ecj-on-array.html
http://www.jroller.com/andyl/entry/sun_javac_vs_eclipse_ecj

对我来说,上面任何一种编译器都是值得尊敬的杰作,足够满足我日常的开发需要。

Tags:
Posted in Technology | No Comments »

Understanding Java Virtual Machine(JVM) memory usage

January 4th, 2010

Concept
~~~~~~~~~~~
最近写程序需要了解一些JVM内存使用的知识,网上搜了一大圈,真是说什么的都有,还是老老实实在JVM规范SUN的论坛找答案吧。JVM使用的内存分为:

  • Stack Memory (栈内存) : 虚拟机的每一个线程都有一个私有的栈,当一个方法被调用时,下面内容被作为一个Frame (帧)被创建并且被压入栈中:
    + 局部变量:包括基本数据类型,对象的引用和返回值地址。
    + 一个自己的操作栈:帧内局部变量进行运算时使用,也用于传递方法的参数和接受方法的返回值。
    + 一个当前方法所在类的Runtime constant pool (常量池)的引用。
    方法调用完成时,帧出栈,并销毁,无论方法是正常结束还是有未捕获的异常。
  • Heap Memory(堆内存) : 虚拟机的堆内存保存的是对象,类变量以及实例变量,它被所有线程共享,常说的垃圾回收就是对堆内存的回收。
+-----------------------+
|    Stack Memory       | ----------> 线程私有
+-----------------------+
|         ^             | -------+
+---------|-------------+        |
|         |             |        |
+----Heap Memory--------+        |
|         |             |        |--> 线程共享
+---------|-------------+        |
|         v             |        |
+-----------------------+        |
|    Method Area        | -------+
+-----------------------+

当JVM加载一个class时 ,将该类的一些信息保存到Method Area,包括Runtime constant pool ,方法数据,方法和构造器代码,域等。Runtime constant pool 则包括类名,父类名,静态变量等。
Method Area在逻辑上属于Heap。不过它垃圾回收与Heap可能不同,取决于JVM的实现。
当通过new Class()方式创建一个实例时,JVM在Method Area寻址到该类的基本信息, 同时进行相关实例的初始化(包括实例变量),存贮在Heap中。

Example
~~~~~~~~~~~
栈内存比堆内存小,但是效率高,所以更珍贵。下面的例子可以证明这一点,如何合理的配置和使用这两个内存,让应用的效率更高,是一个大命题,只能在实践中慢慢摸索。

private int x=0;
 
public void run() {
    // 取stack运算的时间差(纳秒)
    long start = System.nanoTime();
    stackAccess();
    long end = System.nanoTime() - start;
    System.out.println("stackAccess:" + end);
    // 取heap运算的时间差(纳秒)
    start = System.nanoTime();
    heapAccess();
    end = System.nanoTime() - start;
    System.out.println("heapAccess:" + end);
}
 
public void stackAccess() {
    // 减少堆寻址的次数,提高效率
    x = 0; // x 是一个实例变量,存贮在堆中
    int j = x; // j 是一个局部变量,存贮在栈中
    for (int i = 0; i < 100; i++) {
        j += 1;
    }
    x = j;
}
 
public void heapAccess() {
    // 每次循环x都去堆中寻址,降低效率
    x =0;
    for (int i = 0; i < 100; i++) {
        x += 1;
    }
}

静态变量是否会被垃圾回收?
这是一个网上讨论异常激烈的问题,我是这样理解的:
类的静态变量(类变量)存贮在Method Area(具体点说在Runtime Constant Pool)中,如果把它置为null,那么它所引用的对象会被GC。类变量自身不会被回收,除非类被卸载,也就是说:即使这个类的所有的实例都被回收,该类变量仍然存在,即使它引用一个空的对象。

什么时候使用静态变量?
不用我多说(各种教程都有介绍),如果不想用静态变量,也可以尝试单态或者线程同步来实现对象共享,例如:

Logger logger = LoggerFactory.getLogger(ClassA.class);

在这种情况下,可以不用将logger置为static类型了。

由于水平有限,感觉JVM规范太抽象,对于具体实现介绍的不够详细,希望理解的没大问题。

Reference
~~~~~~~~~~~
[1] The Structure of the Java Virtual Machine
[2] Sun Forums > Desktop > Runtime Environment
[3] Picture-Mode

Tags:
Posted in Technology | No Comments »

Input chinese characters with emacs and scim

December 22nd, 2009

不知是那儿配置有问题,在emacs下使用scim输入中文有时会出现乱码,下面是我摸索出来的规律:
环境:debian lenny , en_US.UTF-8

+ 默认创建一份新文档(UTF-8),能正常调出scim,但输入后显式为乱码。

+ 如果文档本来就是UTF-8格式,并且包含汉字,则scim输入正常。

+ 如果在.emacs中增加 (set-language-environment 'Chinese-GB),则可以正常输入中文并显示,但是保存的文档格式为GBK,在其他编辑工具(如gedit)中打开会有乱码(默认是UTF-8,需要指定为GBK格式)。

+ 如果在 .emacs 配置中加一行中文注释,如:;; 中文, 也能正常输入并显示,并且文件格式也是UTF-8

+ 如果用emacs中的内置输入法(setq default-input-method 'chinese-py-punct), 一旦用 C+\ 激活了中文输入(甚至不用输入任何汉字),紧接着 Ctrl+Space 调出scim,也可以正常输入。

Tags:
Posted in Technology | No Comments »

Install pptp-linux 1.7.2 on debian lenny

November 15th, 2009

同事给了我一个新的VPN帐号,windows能正常连接公司的VPN Server,可在linux中报下面错误:

CHAP authentication failed: Authentication failed.
CHAP authentication failed

查了半天,pptp-linux官方文档中的一句话点醒梦中人:

if the passwords contain any special characters, quote them.

因为新帐号的密码含有特殊字符,只要将密码用双引号括起来就OK了。pptp-linux是个很好用的工具,感觉比Cisco官方的client(公司用的是Cisco设备)还要稳定。下面说说如何安装和配置pptp-linux: (more…)

Tags: ,
Posted in Technology | 1 Comment »

Configuring Fetchmail, Exim4 and Mutt

November 12th, 2009

MailConcept
~~~~~~~~~~~~~
配置Mutt比想象的要复杂,因为在此之前我基本上对邮件服务是一窍不通,所以还是先了解邮件的基本原理,它主要包括下面几个部分:

  • MTA (Mail Transfer Agent): 邮件传输代理,主要负责将邮件转发到目的服务器的MTA,MTA之间的通讯采用SMTP (Simple Mail Transfer Protocol)协议。流行的软件有:
    + http://www.sendmail.org
    + http://www.exim.org
    + http://www.postfix.org
  • MDA (Mail Delivery Agent): 邮件投递代理,当邮件到达目的主机,不用再继续转发的时候,MTA会将邮件交给MDA,由它来投递到相应用户。本文用到的http://www.procmail.org/就是一款流行的MDA。
  • MRA (Mail Retrieval Agent): 邮件获取代理,负责以POP或者IMAP协议将远程邮件服务器的邮件取到本机。fetchmail就是一款典型的MRA。
  • MUA (Mail User Agent) 邮件用户代理,也就是经常使用的邮件客户端,主要功能是让用户管理和读取存贮在用户目录上的邮件。包括对邮件内容的加密和解密。典型的MUA有Mutt, Outlook, Foxmail, kmail, evolution等。
    Mutt于其他客户端不同的是,它没有内置smtp的访问,也就是说它不能直接发送邮件,官方对此的解释是 “one task per tool” 符合Unix哲学。不过Mutt内置了一些MRA的基本功能,为什么这么做,可以参考:http://wiki.mutt.org/?MailConcept。本文仍然使用一个独立的MRA。

下图会有助于你理解上面的概念:

+----------------------------------+
|domain A                          |
|MUA (mutt)                        |
|tommy send two mails(bob@A,bito@B)|
+----------------------------------+
      |
      |
      v
+----------+ bito@B  +----------+ bito@B  +----------+
|domain A  |non-local|domain B  | local   |domain B  |
|   MTA    |-------->|   MTA    |-------->|   MDA    |
|  Check   |  SMTP   |  Check   |         |          |
+----------+         +----------+         +----------+
      |bob@A                                    |
      |local                                    |deliver
      v                                         v
+----------+         +----------+         +----------+
|domain A  | bito@B  |domain A  | bito@B  |domain B  |
|   MDA    |<--------|   MRA    |<--------|bito's    |
|          |         |          | POP/IMAP|mail box  |
+----------+         +----------+         +----------+
      |deliver(bob is bito)
      |bob@A,bito@B
      v
+----------+         +-------------------------------+
|domain A  |         |domain A                       |
|bob's     |-------->|MUA (mutt)                     |
|mail box  |         |bob get two mails(bob@A,bito@B)|
+----------+         +-------------------------------+

(more…)

Tags: , , ,
Posted in Technology | No Comments »

Previous page