Filed under: Technology
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: java
Posted in Technology | No Comments »
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: extjs, maven, sonatype
Posted in Technology | 2 Comments »
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/ 目录下。
1 2 3 4 5 6 7
Tags: postgresql, slony
Posted in Technology | No Comments »
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: 3g, usb
Posted in Technology | No Comments »
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: wordpress
Posted in Technology | No Comments »
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: ecj
Posted in Technology | No Comments »
January 4th, 2010
Concept
~~~~~~~~~~~
最近写程序需要了解一些JVM内存使用的知识,网上搜了一大圈,真是说什么的都有,还是老老实实在JVM规范和SUN的论坛找答案吧。JVM使用的内存分为:
+-----------------------+
| 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: jvm
Posted in Technology | No Comments »
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: emacs
Posted in Technology | No Comments »
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: pptp, vpn
Posted in Technology | 1 Comment »
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: exim4, fetchmail, mutt, procmail
Posted in Technology | No Comments »
Previous page