I am LAZY bones?
AN ancient AND boring SITE

SQLite简介

SQLite大致就是”SQL lite”,也就是一个微型的SQL解释器.它的赞助商和使用者包括mozilla,adobe,symbian等软件巨头,也算是来头不小了.
说它微型,那么它到底有多微型呢?我们可以看看它的可执行文件的大小,linux版本的打包文件是203.93 KiB,解压以后是350.88 KiB,是不是很微型呢?
除了微型之外,SQLite主要还要以下特点:

  • 无须配置: SQLite不需要安装,直接解压可执行文件即可运行.
  • 没有服务进程: SQLite无须通过TCP/IP等通信协议提交SQL到服务端,处理后再返回结果.
  • 单个数据文件: SQLite将用户数据存于单个普通文件里面.也就是说用户只要有数据文件的读权限,就可以读取所有数据;有写权限也能改变数据.
  • 数据文件可跨平台迁移: SQLite本身是跨平台的,它的数据文件同样也是跨平台的.数据文件和平台的字节序无关,也和CPU的位数无关.直接复制数据文件就可以实现数据迁移.
  • 紧凑: 如上所述,SQLite的运行环境非常小,如果在编译的时候去掉不需要的功能,可以减小至170KiB,用于嵌入式环境也是没问题的.
  • 松散数据类型: 不同于其他数据库的严格的数据类型检查,SQLite在尝试类型转换失败以后,允许在任何表的任何列里面插入任何类型的数据(一个例外是:整型的主键列里面只能存整型数据)
  • 变长的数据记录: 任何文本都是VARCHAR
  • 可读性很高的源码: 普通的程序员都能读懂,关键的变量和函数都有详细的注释.
  • SQL语句编译成虚拟机器语言: SQLite把SQL语句预编译成一种类似机器预言的代码,程序员可以方便得打印出代码及代码的执行结果,这样对debug很有好处.
  • 完全的公开: SQLite的源码可以任意下载使用,没有任何约束和版权(一些文档和测试代码是受开源license保护的).
  • SQL语言扩展: SQLite可以模块化地添加扩展,以增强其功能

说了这么多特点,那么,SQLite究竟怎么使用呢?
在一般的linux发行版下,安装 sqlite 这个包以后,就可以使用 sqlite3 这个命令来创建和处理数据库文件了.windows/DOS则下载这个文件解压到系统目录,mac则是下载这个文件.
安装完毕以后,就可以用

sqlite3 test.db

这个命令来创建一个空的数据库文件了.
然后,你可以用以下命令来建立一个含有两个列的表:

sqlite3 test.db "create table memos(text, priority INTEGER);"
sqlite3 test.db "insert into memos values('deliver project description', 10);"
sqlite3 test.db "insert into memos values('lunch with Christine', 100);"

然后可以这样查询出需要的数据:

sqlite3 test.db "select * from memos where priority>20;"
lunch with Christine|100

很简单吧~
下面展示一下,SQLite在C语言下的用法,同样用的是上面那个test.db,我们建立一个test.c,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <sqlite3.h>
 
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}
 
int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  char SQLbuffer[1024];
  int rc;
 
  if( argc!=2 ){
    fprintf(stderr, "Usage: %s num\n", argv[0]);
    return 1;
  }
  rc = sqlite3_open("test.db", &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return 1;
  }
  sprintf(SQLbuffer, "select * from memos where priority > %s;", argv[1]);
  rc = sqlite3_exec(db, SQLbuffer, callback, 0, &zErrMsg);
  if( rc!=SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
  }
  sqlite3_close(db);
  return 0;
}

gcc -lsqlite3 test.c

进行编译,完成之后,执行

./a.out 30
text = lunch with Christine
priority = 100

怎么样,相当简单吧~

注: 文中部分内容翻译和参考自官方文档和man页.

新的dlmp3

两年多前,我写过一个自动下载百度mp3的脚本,后来百度曾经更换过几次页面结构,我也跟进维护了一段时间:,.
但再后来,由于觉得自动下的歌曲质量还是不如手工,加上已经有别人写的软件了,这脚本就丢那没管了.
直到昨天,收到 You Sheng 发来的邮件,说他还是比较喜欢那个脚本,百度改了页面之后又帮我修改了脚本,还写了个python来处理那凯撒加密,我觉得很感动,真的要谢谢他.
另外不禁感叹,难道这就是开源的力量?嘿嘿.
来自 You Sheng 的脚本可以在这里下载.

抓了所有中国手机号段的数据

由于工作需要,我最近要查询大量手机号码的归属地,而本地又没有手机号段-归属地的映射数据,所以随手写了行脚本,运行了N个小时后,终于抓回了166000行的数据.包括13*,151*,1530-1535,155-156,1571,158-159号段的归属地信息.因为据我考查,目前的所有手机号码都应该在以上号段里面,当前的仍在广告中的188和189号段的数据也都还查不到,以后出了,我想我会再更新的.
对了,数据来自手机在线,感谢一下.命令就简单的一行:

for i in `seq 1350000 1350009`; do echo $i `curl -s "http://api.showji.com/Locating/default.aspx?m=$i&output=json&callback=querycallback" | awk -F "[,:\"]+" '{if($9!="PostCode")print $7,$9,$11,$13,$15,$17}'`; done

改一下seq的值就可以得到不同段的结果,但不推荐再大号段地抓数据了,毕竟人家的服务器和流量也是要钱的,如果需要数据的话,从这里下载我抓好的,嘿嘿.

用notecase代替了tomboy

今天照常emerge -uDN world了,发现有一堆 dev-dotnet 的包要更新,而且几个包的关系错综复杂,理不出个头绪来,一执行,果然出错了,虽然不难解决,但是心里一直对.net和mono的不爽终于一下子爆发出来了:我干嘛为这个tomboy装那么一大堆的依赖包呢? 虽然tomboy很方便很好用,而且速度也很快,但是我觉得还没有必要到装整个mono环境的地步.再说我里面也就只有几条记录而已.
于是狠下心来删了tomboy,depclean了一堆包,那个爽啊~~哈哈…
用上 oceanboo 给我推荐的 notecase ,基本也能满足我的需求了,不就记点事,然后可以缩到系统托盘,这样就和原来tomboy的applet模式差不多了.不过新建的时候麻烦一点,呵呵.
难道要自己写个tomboy用?

试用 linuxqq_v1.0.2-beta1

今天腾讯发布了 linuxqq_v1.0.2-beta1 ,我下载试用了一下,发现改进还是蛮大的。
首先,登录界面就可以看到,底下多出点东西了,有“注册新号”、“找回密码”和“网络代理”的功能了。
另外,好友列表也支持显示备注了,聊天窗口的滚动条显示问题也得到了修正。
还有一点就是支持热键了,ctrl+alt+z可以提取消息或者激活主窗口,ctrl+alt+a可以截屏,但是目前好像还没有可以自定义热键的地方,只能使用默认的。
看看接下来的版本腾讯还会给我们带来什么惊喜~

搞定黑莓的通讯录

新买手机的朋友,都知道有时候转移通讯录是件挺麻烦的事情,这不,我就遇到了。
不过幸好,我的老手机支持把通讯录都复制到SIM卡,而且我的联系人也不算多,刚好基本把SIM卡的150人塞满。而且黑莓也支持从SIM卡批量导入数据。
这样,转移似乎是很快就完成了,但是完事以后一看,这个黑莓的联系人排序确实是乱得可以,不知道为什么基本上是无序状态。
后来网上一看,还真有不少朋友也遇到了这样的问题,当然也有朋友给出了解决方案,就是在没个名字前加上名字的拼音首字母。具体做法呢就是先用PC端的名为“桌面管理器”的软件,先把通讯录导出成OUTLOOK的格式,然后转成txt文本,再用人家的一个excel文件,导入之后套用一个公式,就加上首字母了,然后再导成txt,到OUTLOOK,再导回黑莓。
这样问题虽算解决了,但整个一套,不仅麻烦,而且很windows,我总不能为了这个,而去下载整套MS office吧。。。
好好研究了一下那桌面管理器以后,发现,其实它是支持通讯录到txt文件的直接导入导出的,于是乎,就看到希望了,现在只要在txt文件里面加上没个人的首字母信息就可以了。
那个文本文件是这样的形式:没个联系人一行,字段之间用逗号割开,字段分别是:”First Name”,”Middle Name”,”Last Name”,”Title”,”Company Name”,”Work Phone”,”Work Phone2″….
而从SIM卡导入后,整个姓名都在 First Name 一栏,Last Name 空着,于是我就用了下面这段awk脚本,把每个人的 Last Name 填上了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BEGIN{
	FS=","
	OFS=""
}
{if(NR!=1){
	print "==",$1,$2,$3,$4
	h=$1 "," $2
	t=""
	for(i=3;i<NF;i++){
		t=t $i ","
	}
	$0=""
	"curl -s `echo \"http://www.51windows.net/pages/pinyin.asp?txt=" $1 "\" | iconv -f utf8 -t gb2312` | enconv | grep \\\"pincode\\\" | awk 'BEGIN{RS=\"<nobr>\"}{if(NR!=1)printf(\"%s\",substr($1,1,1))}'" | getline
	print h,",\"",$0,"\"",t
}else{
print $0
}
}

这个只是完成了到51windows查询拼音首字母的功能,另外那些诸如编码转换和换行符转换之类的事情,还得加几条命令。
完成了以后,导入会黑莓,联系人就又都乖乖地排好了,哈哈。

更新 e-file 到 20081230

更新 e-file 到 20081230 版本
没有其他的该动,只是判断了一下运行脚本的机器是否为gentoo。
如果不是,会有一行警告,其实基本的功能也还是可以用的,当然安装状态之类的肯定就查不到了。
下载地址

入手黑莓7290

话说富人有富人的生活,咱穷人也有穷人的生活,呵呵。。。我觉得这个黑莓7290就是给我这种人设计的,能打电话、发短信,然后价格285,呵呵,没啥好说的了,就当山寨机用吧~
用之前的山寨机给现在的黑莓拍的照片。别说模糊,估计30w像素都不到的。。。
黑莓7290
以后又多个东西可以折腾,哈哈。

医院门口

周六去了趟医院体检,是杭州市一医院,就发现了这个,于是就用我那强大的山寨机拍了下来,哈哈。
phoenixbios
第一次知道,原来这种屏也是有BIOS的。。。

另外,发点牢骚,觉得如今的医院虽然信息化了,但却更加不人性化了。变得没有一点人情味,就剩下金钱味了。自己虽然也算是挨踢(IT)人士,但是偶去医院却也显得无所适从。。。(此处省略1万字牢骚…)

调srt字幕时间的小脚本

首先,我知道mplayer和很多其他播放都有个类似 -subdelay的开关,可以实现字幕和电影的时间调整。
此脚本和subdelay又部分功能交叉,但是某些特殊的时候,还是用个这个脚本方便。
我当时的是电影一个avi文件,但srt字幕却只找到分CD1和CD2的那种,前半段电影的时间和CD1对上了,但是后半段就没字幕了。
为了解决这个文件,就写了这个脚本,名为 adjsrt.sh
我当时执行了 ./adjsrt.sh 3061 cd2.srt >> cd1.srt 就把第二个字幕的时间整体加上3061秒,然后加在了第一个字幕的后面了,哈哈。
脚本如下:

#!/bin/sh
offset=$1
shift
awk -v offset=$offset '
BEGIN{
	FS="[ :,]+"
}
/^[0-9][0-9]:[0-9]*/ {
	ST=toT($1,$2,$3)+offset;
	ST1=int(ST/3600);
	ST2=int((ST-ST1*3600)/60);
	ST3=ST%60;
	ET=toT($6,$7,$8)+offset;
	ET1=int(ET/3600);
	ET2=int((ET-ET1*3600)/60);
	ET3=ET%60;
	printf("%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n",
		ST1,ST2,ST3,$4,ET1,ET2,ET3,$9);
}
$0 !~ /^[0-9][0-9]:[0-9]*/ {
	print $0
}
 
function toT( hour, min , sec ){
	return hour*3600 + min*60 + sec
}
' $*