Archive for 五月 2013

MongoDB 查询返回指定键(字段)

默认情况下,find方法会返回所有的键,类似于SQL中的select *,如果要指定返回的字段,需要用到find的第二个参数:


db.user.find({},{"_id":0})

上面的命令是查询user集合(表),在返回的结果中,不返回_id键,第二个参数是需要过滤的键,而不是要显示的键。
如果同时要过滤age键:


db.user.find({},{"_id":0,"age":0})

使用Google PageSpeed让你的网站访问速度飚升

用了国内的服务器,国内用户访问速度是快了,但是国外用户就会卡,如果用国外的服务器,国内的用户又会卡,从cnzz的统计来看,我的博客海外访客还是蛮多的,特别是台湾同胞,所以弄个cdn加速,就很有必要了。Google PageSpeed目前是免费服务,但是并不是所有的网站都能申请通过,至少我第一次被拒绝了,然后过了大半个月,就是今天,Google突然发邮件说申请通过了,好吧,那就试试吧。 Continue reading ‘使用Google PageSpeed让你的网站访问速度飚升’ »

Android开发 ContentResolver,ContentProvider的使用方法

ContentResolver之前在介绍联系人的时候已经用过了,用于查询另一个程序的数据库,相对的,而ContentProvider就是把自己的数据库提供给其他程序查询。
Continue reading ‘Android开发 ContentResolver,ContentProvider的使用方法’ »

Android开发 asmack断线收不到通知的BUG解决

基于Openfire+asmack开发一个聊天软件,但发现客户端在一段时间没有操作以后,就会与服务器断开,而且客户端的XMPPConnection.connected字段还是true,就是客户端根本不知道自己是不是已经断了,openfire那边已经显示断开。而asmack在发送出消息以后,并不会检测对方是否已经收到。这个问题困扰了很久,必竟asmack用的人也挺多的,就没想过会是asmack的问题,实在找不到BUG在哪,就下了asmack研究,不看不知道,一看吓一跳,尼玛,asmack就是个半成品。打开org.jivesoftware.smack.PacketWriter,可以看到声明了一个keepAliveThread的线程,看这名字,很明显是用来发心跳包的。但是从源代码上看,这个keepAliveThread根本什么都没干,连初始化都没做,asmack根本就没有心跳机制。长时间连接不操作,openfire检测不到心跳,必然主动断线。
找到问题,解决就简单了,登录成功以后,开个Alarm,重复触发ping操作。关于发送ping包的代码,可以参考smack里的org.jivesoftware.smack.keepalive.KeepAliveManager,但是不建议直接用smack的心跳机制,smack是在收到服务器的packet以后,就发送ping,因为ping发送成功以后,服务器会返回个packet,这样就能无限循环了。但是服务器不仅会在收到ping后发送packet,用户上下线,新消息等都会发送packet,而客户端发送ping的线程是同步的,这样的话,后面排队的ping操作就会很多,而且也没必要高频率发送packet。

MongoDB 数组操作

$push:向文档数组中添加元素,如果没有该数组,则自动添加数组。

db.users.insert({"name":"zhang"})
db.users.update({"name":"zhang"},{"$push":{"emails":"zhang@pocketdigi.com"}})
db.users.update({"name":"zhang"},{"$push":{"emails":"zhang@fwvga.com"}})

以上代码,先创建name为zhang的用户,再给该用户加入邮箱,放到emails数组中.
$addToSet:功能与$push相同,区别在于,$addToSet把数组看作成一个Set,如果数组中存在相同的元素,不会插入。

db.users.update({"name":"zhang"},{"$addToSet":{"emails":"zhang@fwvga.com"}})
db.users.find()

可以看到,并没有两个zhang@fwvga.com的邮箱.
Continue reading ‘MongoDB 数组操作’ »

Linux安装MongoDB

官方下的MongoDB其实是绿色免安装的,http://www.mongodb.org/downloads
默认没有带配置文件,自己建一个:
vi mongodb.conf:

dbpath=/home/mongodata
fork=true
auth=true
logpath=/home/server/mongodb-linux-i686-2.4.3/log.log
logappend=true
journal=true
quiet=true

启动:
/bin/mongod --config mongodb.conf
如果报 exception in initAndListen std::exception: locale::facet::_S_create_c_locale name not valid, terminating
先执行 export LC_ALL=C mongodb

PHP+Nginx+MongoDB启动脚本

每次开机都要手工一个一个启动,nginx,php,mongodb,太麻烦了,写了个脚本,但是MongoDB启动会输出日志,所以不是很完美,会显示日志。
/root/webserver Continue reading ‘PHP+Nginx+MongoDB启动脚本’ »

PHP MongoDB驱动安装

对比了一下mysql和mongodb,以后自己开发基本选定mongodb了。
MongoDB驱动下载地址:
https://github.com/mongodb/mongo-php-driver
安装(下载里有安装说明,不过有些小不同):

unzip mongo-php-driver-master.zip
cd mongo-php-driver-master
export PHP_PREFIX="/home/server/php-5.4.15/"
$PHP_PREFIX/bin/phpize
./configure -with-php-config=$PHP_PREFIX/bin/php-config
make install

装完提示so保存在/home/server/php-5.4.15/lib/php/extensions/no-debug-non-zts-20100525/
修改php.ini,加上一句:

extension="/home/server/php-5.4.15/lib/php/extensions/no-debug-non-zts-20100525/mongo.so"

重启ngix+php