0%

当有多个不同编码的文件需要统一处理时,如果不转换成同样的编码,会出现中文乱码的问题。转换编码,又需要先知道源文件的编码。 判断文件编码,可以使用开源库 cpdetector:http://sourceforge.net/projects/cpdetector/

        try {
            File file = new File(lrcPath);

            // 获取原始文件编码
            CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
            detector.add(JChardetFacade.getInstance());
            Charset charset = null;
            charset = detector.detectCodepage(file.toURL());
            
            if (charset != null) {
                                //使用源文件的编码,读取文件
                InputStreamReader bufRead = new InputStreamReader(new FileInputStream(file),charset.name());
                StringBuilder sb = new StringBuilder();
                char[] buffer = new char[2048];
                int len = 0;
                while ((len = bufRead.read(buffer, 0, 2048)) > 0) {
                    sb.append(buffer, 0, len);
                }
                String text = sb.toString();
                bufRead.close();
                                //使用UTF-8编码写入文件
                BufferedWriter bufWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
                bufWriter.write(text);
                bufWriter.flush();
                bufWriter.close();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

不知道这个算不算BUG,如果被调用的Action和当前Action同名,ThinkPHP就会报找不到方法(也许是在调用的这个Action里找了). 比如:Admin/Config里调Common/Config里的方法时,就会出现这个问题,解决方法: 没办法,改个名字吧。

这里需要用到一个开源项目:mp3agic https://github.com/mpatric/mp3agic 更新比较活跃是我选择它的原因。 下载后,把 src/main/java/下的com目录拖到我们自己项目的src目录下. 使用方法看readme.md,我这里编译id3tagv1 Mp3File mp3File = new Mp3File(tempPath); ID3v1 tag = mp3File.getId3v1Tag(); tag.setArtist("www.fwvga.com"); tag.setComment("Downloaded from www.fwvga.com"); tag.setTitle("www.fwvga.com"); mp3File.setId3v1Tag(tag); mp3File.save(savePath);

rsync是一款数据镜像备份工具,可以保持两个服务器间数据同步,用得最多的场景就是备份数据了。 安装方法参考:http://wiki.ubuntu.org.cn/UbuntuHelp:Rsync/zh 如果没成功,几点注意一下: /etc/rsyncd.conf: auth users = user 后面的user是被授权可以访问这个module的用户,需要与/etc/rsyncd.secrets里对应。 远程同步: sudo rsync -arlHptgzqh --delete --delay-updates --progress fhp@serverip::share --password-file=/etc/rsync_password /media/Server/server1/home /etc/rsync_password只需要填密码就可以了。

识别条码和二维码,一般都用zxing(http://code.google.com/p/zxing/),不仅支持java,还支持cpp,c#,Objective C,Ruby等语言。网上很多文章都说这个需要先用ant编译,但我发现源代码根目录下的build.xml,只是把源代码打个包而已,没其他功能。直接把android目录作为一个android项目导入到eclipse,报错,缺各种类,这是因为少了核心包。把core目录打包成jar放到libs目录下,或者直接把源代码拖进android项目的src目录下,即可正常运行。

随机查询,最简单的方法是,计算文档总数,再生成一个范围在0到文件总数的随机数,然后使用skip,limit把它找出来,但是,前面说过skip影响性能,如果文档有点多,这个随机数有点大,就不适合了。 换个思路,我们可以在每个文档加一个随机键(random),用Math.random()方法生成随机数,存放进文档里。查询的时候,同样用Math.random()生成一个随机数,返回一条集合中随机数小于这个随机数的文档。当然,也有可能没有小于这个随机数的文档,但如果这样,就必定有一个大于等于这个随机数的文档,除非集合是空的。

var random=Math.random();
var result=db.user.findOne({"random":{"$lt":random}});
if(result==null)
{
   result=db.user.findOne({"random":{"$gte":random}});
}

排序用sort,相当于order by,升序用1表示,降序用-1 比如,按age字段升序排列:

db.user.find().sort({"age":1})

如果有多个字段,按姓名降序,年龄升序

db.user.find().sort({"name":-1,"age":1})

limit和skip一起用,相当于mysql里的limit:

db.user.find().skip(1).limit(1)

相当于mysql里的limit(1,1),即跳过第0条,从第1条开始返回,只返回1条 skip和limit就能实现分页,但是skip太多的话,会影响性能,应该尽量避免,比如说,获取当前页最后一个文档的某个值作为条件(如日期)来查询,就可以不用skip.

国内免费CDN目前比较大的有加速乐,安全宝,360等,因为李开复的关系,个人比较喜欢安全宝,但因为安全宝的缓存只有10M,正如他的名字一样,能保护服务器,但是起不到降低服务器负载的作用,所以放弃。360客服态度差,自己服务器出问题不从自身身上找原因,就说是客户操作错误。出问题了,我解析回自己服务器,客服竟然抖窗,要求把解析改回他们服务器(有点命令的口吻),感觉他们才是大爷,上帝,在我拒绝修改解析后,直接把我的域名拉入黑名单。只能说流氓公司就有流氓客服。加速乐免费用户每小时有1G的流量,对我这么小的博客而言,够用了,于是国内用了加速乐,国外,前两天提过,用Google PageSpeed Service.不知道这两天加速乐被攻击还是怎样,感觉加速效果不好,比没加速还慢,监控宝昨天还发报警了几次连接服务器超时。 今早去看监控宝纪录,果然发现问题,我是在5月31日用加速乐的: jiashule 域名解析时间下降是因为我改了TTL,跟加速乐无关,但是服务器计算时间,从100ms,升到了600ms,下载内容时间也多了,明显是加速乐的原因。所以,同学们,如果自己的服务器已经够快,流量又不大,用CDN不但起不到加速效果,还会适得其反。

条件查询,可以使用操作符,如$gt(>),$gte(>=),$lt(<),$lte(<=),$ne(!=)等,可以组合使用,执行and查询 比如,查询age>=20&&age<30的用户:

db.user.find({"age":{"$gte":20,"$lt":30}})

or查询,如果是查询一个键的多个值,比如查询age为18,20的用户,可以使用$in操作符:

db.user.find({"age":{"$in":[18,20]}});

相对的,上面如果用$nin,就是指age不等于18或20 如果要匹配多个键,就需要$or操作符了,比如,查询age=18,或sex=female

db.user.find({"$or":[{"age":18},{"sex":"female"}]});

$mode是比较特殊的运算符,比如,要取出所有属蛇的用户,2013年属蛇,意味着age%12==0

db.user.find({"age":{"$mod":[12,0]}})

$not操作符可以用在任何条件之上,如找出不属蛇的用户:

db.user.find({"age":{"$not":{"$mod":[12,0]}}})

另外,find还支持正则表达式:

db.user.find({"name":/.*j.*/i})db.user.find({"name":/.*j.*/i})

上面的规则匹配所有用户名里带j的记录,注意,正则表达式不需要加双引号 如果要根据文档中的文档属性查询,比如返回post集合评论标题是title1,内容是content1的评论,可以使用$elemMatch操作符

db.post.find({"comments":{"$elemMatch":{"title":"comment1","content":"content1"}}});

其中comments是一个数组文档

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

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

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

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