Linux下jvm读取时区顺序问题

先说结论,jvm在读取linux的系统时区时

如果存在环境变量TZ,则jvm最优先读取环境变量TZ中的内容;

如果不存在环境变量TZ,会读取/etc/sysconfig/clock文件中的ZONE内容(需要引号);
若都不存在,则读取使用/etc/localtime文件内容所对应的时区
如果设置了-Duser.timezone,则使用指定的时区
在java中一般使用SimpleDateFormat来格式化及解析时间,如

Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String f = sdf.format(d);
System.out.println(f);

但是上边的代码存在一个问题,就是时区的问题,
SimpleDateFormat默认会使用系统时区来格式化当前Date对象表示的时间戳
这样在中国,如果服务器的时区为非东8区(GMT+8)时,会发生格式化出来的字符串并不是我们想要的。
所以在使用SimpleDateFormat时会设置时区

TimeZone tz = TimeZone.getTimeZone("GMT+8");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(tz);

但还有一个问题:

在redhat/centos中,有时使用date 和date -R时显示的系统时区没有问题(东8区、CTS、+0800)但是在代码中不设置时区时使用SimpleDateFormat时,得到的仍然不是我们想要的答案这是因为jvm在读取linux的系统时区时会读取/etc/sysconfig/clock文件中的ZONE内容,当仅仅更改/etc/localtime文件时,date命令返回的时间正确,但jvm读取的时区却正确。
如果存在环境变量TZ,则jvm最优先读取环境变量TZ中的内容

所以,在使用java进行日期处理时,为了避免上述麻烦,请在代码中显示的设定时区:

sdf.setTimeZone(tz);

附设置为东八区的配置

1、java -Duser.timezone=Asia/Shanghai

2、/etc/sysconfig/clock文件内容ZONE="Asia/Shanghai"

3、ln -s /etc/localtime /usr/share/zoneinfo/Asia/Shanghai

4、export TZ=Asia/Shanghai

参考:
http://my.oschina.net/huawu/blog/4646
http://linux.vbird.org/linux_server/0440ntp.php
http://bugs.java.com/view_bug.do?bug_id=6456628

android模拟点击程序并截图

本文章主要内容为如何在PC或服务器上为指定android程序模拟随机点击并对其进行截图

主要解决的问题是获取android设备上当前时间所显示的内容,截图后保存到本地(服务器端),而非android设备上。

主要利用的工具为chimpchat.jar与ddmlib.jar两个jar包,这两个jar包包含在android sdk内,一般在sdk/tools/lib/下,这两个jar包所完成的工作不过是封装了一些协议及一些常用操作,如操纵设备点击、拖动等,也包含了将命令(cmd)在android设备上执行的功能。

核心代码如下,代码展示了对一个应用程序进行随机点击并截图保存,里边用到了monkey自动化测试工具来完成随机点击事件:

ChimpChat c = ChimpChat.getInstance();
//等待设备连接
IChimpDevice paramIChimpDevice = c.waitForConnection();
//截图
paramIChimpDevice.takeSnapshot();
//cmd内容为执行monkey命令
paramIChimpDevice.shell(cmd, 5 * 1000 * 60);

继续阅读“android模拟点击程序并截图”

apache虚拟主机配置

记录一下配置apache的虚拟主机(virtual host)配置,可基于以下内容配置apache的单ip多域名,或多ip多域名访问

一般情况下,我们新建一个站点时都是新建一个配置文件而不是直接修改httpd.conf文件,这样做的好处是:一旦站点迁移,只需要复制新建的配置文件就可以了。

一个新配置文件的构成如下:

#监听某个端口
Listen 80
#为一个基于域名的虚机主机(VirtualHost)指定一个ip地址(端口),httpd2.4版本不需要此属性
NameVirtualHost *:80
#建立虚拟主机,可以使用ip地址和通配符:如*:80或115.28.52.195:80
<VirtualHost *:80>
      ServerAdmin webmaster@liuhe36.cn
      ServerName liuhe36.cn
      ServerAlias www.liuhe36.cn
      DocumentRoot /mnt/myDisk/wordpress
      <Directory />
          Options FollowSymLinks
          AllowOverride All
          Order allow,deny
          allow from all
      </Directory>
</VirtualHost>

继续阅读“apache虚拟主机配置”

linux增加和关闭swap

以下操作请在root用户下完成,文件位置可自拟

#创建一个1G的文件
dd if=/dev/zero of=/swapfile bs=1024 count=1048576

#格式化为swap文件
mkswap /swapfile

#使swap生效
swapon /swapfile

#修改启动挂载
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab

修改linux名字

1、临时修改:使用hostname命令即可使计算机名临时变为指定的名字,如hostname test就可以使计算机在重启之前的名字变为test。

2、永久修改:

  • 修改/etc/sysconfig/network文件中的hostname的值为你期望的名字。
  • 一般情况下我们还需要修改hosts文件,当然如果你完全不知道修改host是为了做什么的,你最好确认一下hosts文件是否含有原来的服务器名,并且集群内的其他服务器如果使用服务器名来寻找本台服务器的话,那么在你修改服务器名之前则需要更改其他服务器的dns server的配置或者其hosts文件。hosts文件位于/etc/hosts

关闭linux服务

chkconfig --list #列出所有的系统服务

chkconfig --add httpd #增加httpd服务

chkconfig --del iptables #删除iptables服务(关闭防火墙)

chkconfig --list #列出系统所有的服务启动情况

chkconfig --list mysqld #列出mysqld服务设置情况

chkconfig mysqld on #使mysqld服务开机启动(运行级别2、3、4、5)

chkconfig iptables off #禁止mysqld服务开机启动(关闭防火墙)

mysql远程访问

经常的,我们遇到这种情况:在单机下使用mysql进行测试、开发都没有问题,但是一旦将应用与数据库服务器分离,就发生不能连接到mysql的情况。这是由于默认情况下mysql账户不支持远程访问而导致的,所以需要调整一下mysql的用户信息。

首先连接至mysql,查看mysql的用户表:

#-p部分填写root的密码
mysql -u root -p qwer1234
--查询mysql用户表
select host, user from user;

结果如下所示:

+———–+——+——————————————-+
| host      | user | password                                  |
+———–+——+——————————————-+
| localhost | root | *D75CC763C5551A420D28A227AC294FADE26A2FF2 |
+———–+——+——————————————-+

这里边可能存在多条记录。

接下来有以下几种方式能够达到我们远程访问mysql的目的:

1、通过授权实现

GRANT ALL PRIVILEGES ON *.* TO ‘root'@'%' IDENTIFIED BY ‘MyPassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;

注意密码需要填写正确,否则对原来的root用户不会修改成功,并且也会产生其他奇怪的问题(如数据库怎么也连接不上了,这时候要把刚才的user表里的数据清理一下)

另外上边语句的含义其实就是授权root用户在任意服务器(由%指定,也可@后接具体的服务器ip来达到指定ip才能访问mysql的目的)上均可访问mysql。

2、通过直接改表实现

update user set host = '%' where user = 'root';
commit;

重启mysql。

这里边容易发生user表数据冲突,所以在更改之前一定要确认好更新所影响的范围。

在64位linux系统无法启动avd及SD Card报错的问题

64位的linux下使用AVD启动android模拟器会报错,centOS会提示bad ELF interpreter而ubuntu只会提示NoSuchFile

这是由于从google下载的android虽然是x86_64的sdk包,但里边实际上是含有32位的程序的(或者说是对32位的相关包有依赖),所以需要安装32位的lib

对于ubuntu

sudo apt-get install ia32-libs lib32ncurses5 lib32stdc++6

对于centOS

yum install glibc.i686
yum install libstdc++.so.6

安装完毕后即可。