Overview
Java程序中的常见的资源有:文件,Socket,数据库连接。在使用这些资源时候要分外小心,因为操作系统可同时操作的资源是有限的,比如默认情况下系统允许同时打开的文件数为1024个,Mysql服务器默认允许的最大连接数是100,所以操作这些资源时候要注意即使在遇到错误时也要让系统能正确回收资源。如果发生错误时候,打开的文件描述符没关闭或数据库连接没关闭,积累到一定程度后,应用将会变得不可用,只能重启。
try-catch-finally
Java提供了try-catch-finally来保证程序遇到异常时总是有机会可以处理资源的关闭 – 调用资源对象的close()方法。但经验不足的Java程序员还是会错误的管理资源,而造成资源的泄露,静态代码分析工具,如FindBugs可以帮助发现此类问题。
首先我们来看一段文件操作代码:
private void copy(String from, String to) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
in = new FileInputStream(from);
out = new FileOutputStream(to);
int c;
while ((c = in.read()) != -1)
out.write(c);
in.close();
out.close();
}
Overview
一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神。程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的。本文想讨论的是如何在Java程序里写好日志。大多数的Web服务器(如Apache,Nginx)都有access日志和error日志,分别记录在不同的文件内;我们使用的服务器操作系统Linux有Syslog日志, /var/log目录下也有很多基础应用和服务的日志文件;桌面Windows有事件查看器, Mac有Console应用可以查看和管理日志;这些成熟的系统及工具方法都值得我们学习并在自己的项目中应用。
一般来说日志分为两种:业务日志和异常日志。使用日志我们希望能达到以下目标:
- 对程序运行情况的记录和监控;
- 在必要时可详细了解程序内部的运行状态;
- 对系统性能的影响尽量小;
日志规范
程序框架应该提供统一的日志记录接口,日志格式也需要有一定的规范,方便利用日志工具来分析日志。
首先我们有必要了解一下Linux普遍使用的Syslog标准协议,协议规定日志中应包含产生日志的模块(Facility),严重性(Severity Level),时间,主机名或IP,进程名,进程ID和日志内容,根据模块和严重性可以配置相应的动作:是否需要记录,日志存储路径(文件或网络)。
下面是部分常见的Syslog模块类型:
模块ID |
关键词 |
描述 |
0 |
kern |
内核消息 |
1 |
user |
用户级别消息 |
2 |
mail |
邮件系统 |
3 |
daemon |
系统后台守护程序 |
4 |
auth |
安全/鉴权消息 |
5 |
syslog |
syslogd内部产生的日志消息 |
… |
|
|
本文大部分内容来自: https://help.github.com/categories/63/articles
Github上合作开发最好的方式是“Fork + Pull Request”。比如我最近需要一个静态Blog生成器,市面上有很多Ruby实现的,但我想要一个Go语言的实现,Github上找到了一个 https://github.com/wendal/gor ,测试了一下已有的功能基本能满足了,就用上了。
但实际使用过程中发现了一个问题,如果在URL中有中文,生成的URL如下没有做URL安全编码:
http://hugozhu.myalert.info/2013/02/27/在Pi和Github上搭建自己的个人博客.html
还有一种情况是如果URL中有空格,如:
http://hugozhu.myalert.info//2013//02/25/Java properties to enviorment variables.html
浏览器遇到这种URL时,会主动进行编码,但这里有两个问题:
- 遇到中文时,浏览器是用GBK还是UTF-8还是其它字符集编码后再发送给服务器呢?
- 遇到空格时,编码成+还是%20呢?
不同浏览器实现可能不一样,在不同操作系统上也可能不一样(可能和用户设置的缺省语言有关),这样有些用户可能会遭遇404错误了,实际上我在服务器的错误日志上的确看到这样的错误
日志:
方法如下:
本站同时托管在家里的Raspberry Pi和Github Pages上,并同步保持更新,海外用户会访问Github,国内用户则会访问Pi,不同线路解析域名hugozhu.myalert.info到不同的服务器是通过DnsPod的服务实现的,这么好的服务还是免费的,这里推荐一下。
因为Github Pages只能支持静态网页,你需要一个能生成静态网页的博客生成引擎。我使用的是gor , 也可以使用ruhoh,Google一下还有很多。
静态页面博客的好处:
- 性能是最好的,很合适用Raspberry Pi来做服务器,节省资源;
- 文章可以用Markdown格式来编写,采用Github来做版本控制,我的Blog仓库在 http://github.com/hugozhu/blog ,数据安全很好,误删除也不担心了;
- 很容易找到托管环境,方便迁移;
- 用Gor在Pi上生成速度很快;再用Nginx提供Web服务,可以直接在Pi上写Blog;
- 大繁至简
Github设置
- 在你的仓库里增加一个your_github_id.github.com,比如我的github ID是hugozhu,相应的仓库名就是hugozhu.github.com,这个仓库也就是网站的根目录了,在这里放生成好的静态文件
- 如果你需要用自己的域名,而不是Github提供的,可以在根目录下增加一个CNAME文件,文件内容则是你的域名,在DnsPod上需要建一个CNAME记录,将你的域名指向your_github_id.github.com. 也就是github原来分配给你的,完成这个设置后,访问your_github_id.github.com会跳转到你的域名;
- 每次更新后,Github会在10分钟内生效。
动态根据宽带public ip更新dnspod登记的域名
按照 https://gist.github.com/833369 逻辑重新用Go实现了,用更少的内存开销在Raspberry Pi上跑。
替换上你的Email,密码,域名ID,记录ID等参数,就可以运行了。 会在后台一直运行,每隔30秒检查一遍IP,如果修改了就更新IP。
获得domain_id可以用:
curl curl -k https://dnsapi.cn/Domain.List -d "login_email=xxx&login_password=xxx"
获得record_id:
curl -k https://dnsapi.cn/Record.List -d "login_email=xxx&login_password=xxx&domain_id=xxx"
Overview
在Java程序中使用properties文件很方便,但有时候需要和脚本配合使用时,需要把properties文件内的多个变量转换成环境变量,本文提供一个转换脚本示范:
比如env.properties如下(=附近可以有空格,也可以有空行)
MYSQL_URL = jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=gbk
MYSQL_USER = root
MYSQL_PASS =
执行下面的脚本后就相当于
export MYSQL_URL="//localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=gbk"
export MYSQL_USER="root"
export MYSQL_PASS=""
env.sh脚本代码
#!/bin/bash
感谢使用Gor编写博客
本文位于 posts/first-blog.md , 你可以任何删掉,修改这个文件
文件开头是当前文章的元数据
- date为自动生成, 当然,你可以修改,这是你的自由
- permalink 可以是固定地址,也可以由gor为你自动生成
- categories 就是分类, 可以多个
- tags 同理,多个标签也是很常见的
请确保文件使用UTF8 without BOM编码
你可以通过执行下面的语句来新建一篇博客:
gor post 文章标题