最近开始写一个大的文档,《Android ABC》,希望把一年来积累的Android知识整理一下。因为是和同事一起写,选择了docbook作为编写文档的方案。
第一个方案
在写文档之前,我们做了技术准备,主要是docbook生成pdf和docbook脚本自动化构建。最终选择了jdocbook和maven,并对fop等做了个别针对中文的配置和改动。可参见《转化docbook的maven工程的安装配置》。
按照上面链接的方式,开始使用的是docbook4.4,通过dtd做语法校验,并写出了文档目录和各章结构。在xml文档的dtd部分声明entity:
然后在文档需要的地方引用:
尝试过很多种图表生成方案,比较有代表性的:
- 服务器端生成图表方案,比如通过jfreechart;
- 使用云计算的方式,比如通过google提供的chart api,可以参见使用google chart生成动态图;
- 使用flash的免费开源应用,比如fusioncharts,在浏览器端生成图表,效果可见:http://www.fusioncharts.com/free/demos/
- 使用html5的canvas api在浏览器端生成图表。
其中前两者是通过服务器端生成的,后两者是通过客户端生成的。
服务器端的缺点是:
- 图表缺乏交互性,比如折线图,鼠标放在某个点上,希望看到该点的值,就做不到;
- 带宽和流量问题,比如通过手机访问,手机是按流量计费的,对服务器端也会有影响,当大规模访问的时候挤占服务器端带宽;
- 服务器端性能,当大规模访问的时候服务器端生成图表性能下降。
android系统支持全文检索, 是通过sqlite的fts3来提供支持的.
见:
http://androidappdocs.appspot.com/guide/topics/search/search-dialog.html
的searching your data部分.
原因是如果使用like是很慢的. 在android下如果用like做查询, 比如LIKE somestrin%, 是很慢的, 有多慢呢, 10万行的表, 大概要1300ms吧. 不是我测试的, 见:
http://stackoverflow.com/questions/2734828/sqlite-fts3-sumulate-like-somestrin
因此需要通过sqlite3支持的fts3全文检索功能.
具体示例可以参见:
运行上面示例的办法是, 解压缩, 然后通过eclipse创建新adt项目, 选择已存在的项目, 然后连接设备运行即可. 从运行效果来看, 英文是没有问题的. 但是中文因为分词方式不一样, 造成无法查询到预期的效果. 比如, 输入”全文检索”四个汉字, 插入到表中, 以”检索”来查询, 就查不到结果, 除非输入”全文检索”四个字才能得到匹配结果.
这说明, fts3没有合适的中文分词, 目前只能适用于比如英文这样带空格的文字分词.
使用sqlite全文检索的步骤如下.
首先要创建VIRTUAL TABLE:
CREATE VIRTUAL TABLE records USING FTS3 ( INTEGER PRIMAERY KEY, col_text TEXT );
插入数据和查询的api就是content provider的. 插入:
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(“col_text“, text);
db.insert(“records”, “col_text“, values);
匹配全文检索的查询:
List<String> result = new ArrayList<String>();
SQLiteDatabase db = getReadableDatabase();
final Cursor cursor = db.query(“records”,
new String[] { “col_text“ }, “col_text“ + ” MATCH ?”,
new String[] { query }, null, null, null);
if (cursor.moveToFirst()) {
do {
String text = cursor.getString(cursor
.getColumnIndexOrThrow(“col_text“));
result.add(text);
} while (cursor.moveToNext());
}
cursor.close();
return result;
如果想通过文本方式传递图形内容, 在一些情况下是可能的.
这里提到的文本方式, 比如通过服务器端传递XML或者JSON格式数据.
一般浏览器端会有脚本通过AJAX获取到XML或者JSON数据, 然后修改 (新增) DOM中显示元素的值.
图形文件可以进行base64编码, 通过XML或者JSON传输到浏览器端.
这里对浏览器有一定的要求, IE7及以上版本, 或者其他主流浏览器, 都可以, 这里唯一限制的是必须IE版本7以上. 其他的比如webkit内核的浏览器(safari和chrome), firefox等都没有问题.
这是因为这些浏览器支持一个新的特性, 见下面示例:
<html>
<body>
<img src=“data:image/gif;base64,R0lGODlhDwAPAKECAAAAzMzM/////
wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4ML
wWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==”
alt=“Base64 encoded image” width=“150″ height=“150″/>
</body>
</html>
在img标签的src属性中按照这样格式的写法, 可以将base64编码的文本作为图片显示.
今天上午, 再次登录腾讯微博, 填写用户名和密码, 发现已经可以创建微博了.

让同事测试了一下, 进入的是调查问卷界面, 看来我上次提交调查问卷生效了. 腾讯目前还处在内部测试阶段.
用mac笔记本的摄像头拍了一张夸张效果的照片, 让自己尽量显得和蔼一些.
我的腾讯微博是: http://t.qq.com/marshalw
公司里面时常有非法的DHCP服务器, 一般不是员工有意为之的, 可能是病毒或者木马自带的. 这样的DHCP服务器有个名字: rogur DHCP.
这样的DHCP服务器可能会带来网络安全或者公司信息泄密问题.
其实最好的办法是通过硬件解决, 交换机如果支持DHCP SNOOPING功能, 可以设置屏蔽非法DHCP发出的响应.
目前不具备这个条件, 因此, 考虑通过软件侦测到rogur DHCP, 然后纠正错误.
这里选择的是scapy, 功能很强大, 不只是可以侦测DHCP.
nmap可以扫描网络中的主机和端口, 见根据ip地址查主机.
以下写出一些最近使用的nmap命令.
列出网络中当前的主机及其数目:
sudo nmap -sP 192.168.0.0/24

项目打包的时候,经常会遇到动态生成文件中字符串的要求。
举个例子,android手机项目,打包生成的APK文件,如果世间只有一个分发渠道,比如google android market,那么没关系,我就打一个包,发布就可以了。
但是现在有多个渠道,比如国内的安卓市场,EOE等等,为了能区分用户安装的版本是从哪个渠道来的,需要在分发包中定制一个渠道代号。
当然手工也可以做这件事情,不过,耗费精力而且容易出错。
这里打算用maven配置来实现这个功能。maven中对资源文件有个filter过滤器的配置,可以用于配置对指定文件进行文字替代。使用的是在刚才生成QR二维码图片的简单示例中的maven项目,在此基础上增加示例。