修改SecureCRT的home功能键

之前一直使用putty作为ssh的客户端,最近用了一下SecureCRT,多标签比较好用,但是在使用时发现没有home、end功能,而且delete键删除的是光标前一个字符,功能与退格键是一样的。

网上有关于SecureCRT使用“键映射编辑器”,实现自定义的功能的文章,不过飞尘这里试了一下貌似不起作用。

于是换另外一个思路,修改仿真终端类型即可。

SecureCRT中默认的终端为VT100,这里修改为linux,并勾选“ANSI颜色选项”,这样就会五颜六色了哦,呵呵。

对于键映射编辑器的方式,这里就不再多做研究了。

js日期与extjs日期不一致

在javascript中使用new Date()获取当前时间,也可以直接将时间格式的字符串转换为时间对象,如:

new Date(’2011-11-11′);

在firebug中输出日期为:

Date {Fri Nov 11 2011 08:00:00 GMT+0800}

既然已经指定了时区为GMT+0800,时间就不应该是08:00:00,就是这个原因带来了很多麻烦。

在extjs中,通过日期组件获取到的时间对象与js的时间有些区别,如果选择2011年11月11日,则可以看到得到的日期为:

Date {Fri Nov 11 2011 00:00:00 GMT+0800}

而此时如果需要使用到日期比较时,就会出现问题,因此需要将日期统一为一种形式。

extjs提供了这样的方法Ext.Date.clearTime():

clearTime( Date date, Boolean clone ) : Date
Attempts to clear all time information from this Date by setting the time to midnight of the same day, automatically adjusting for Daylight Saving Time (DST) where applicable. (note: DST timezone information for the browser’s host operating system is assumed to be up-to-date)

Parameters
date : Date
The date
clone : Boolean
true to create a clone of this date, clear the time and return it (defaults to false).
Returns
Date
this or the clone.

可以在firebug中通过下面的代码查看区别:

var a=new Date();
console.log(a);
var b=Ext.Date.format(a,’Y-m-d’);
var c=new Date(b);
console.log(c);
var d=Ext.Date.clearTime(c);
console.log(d);

python安装模块报错缺少ez_setup

在windows环境下使用python安装模块时,遇到这样的错误,说是缺少ez_setup。

这个问题是在安装pygeoip时遇到的,pygeoip是一个用纯python实现(不依赖c库)的查询ip对应国家、城市等等的模块,项目地址:

http://code.google.com/p/pygeoip/

具体的错误消息如下:

ImportError: No module named ez_setup

而安装是手动下载了模块,然后使用python setup.py install安装的,并没有直接使用easy_install pygeoip,不过遗憾的是安装脚本里却使用了:-(

在Windows平台下python默认情况是没有easy_install这个模块的,不过从下面这个地址下载对应python版本的setuptools安装即可解决此问题。

http://pypi.python.org/pypi/setuptools#files

本文下载使用的是

setuptools-0.6c11.win32-py2.7.exe

wordpress升级安装插件出现http错误

之前使用wordpress一直是很正常,后来就发现akismet经常出现无法连接服务器,造成评论不能自动审核。

再后来,使用自动更新插件,升级wordpress版本就遇到了这样的错误:

在向 API 发送请求时发生了一个 HTTP 异常错误

其中有一种原因是网络请求超时,修改方法也是参考自网络,超时时间不一定要设置很大,飞尘此处将原来的5改为10,基本上没有再出现以上的错误消息。

修改wp-includes/class-http.php文件中的第220行(这个行数对于不同的版本可能不一定相同,不去纠结它):

‘timeout’ => apply_filters( ‘http_request_timeout’, 5)

修改其中的5即可,这个5是请求时间,根据个人情况自行增加。

对于vps或者拥有控制权的独立主机,可以配合下面的方法:

编辑/etc/reslov.conf文件,飞尘这里本身就没有这个文件的

nameserver 8.8.8.8
nameserver 8.8.4.4

设置dns服务器,上面是以google的为例。

csdn帐号安全性堪忧

下午QQ群里有人贴了个网址

http://www.wooyun.org/bugs/wooyun-2010-03692

说是CSDN数据库泄露,大量用户真实账号密码外泄

具体信息的真实与否,这里不做任何评价和考量。

但是处于安全性的考虑,还是想着去csdn把密码修改一下为好。而大多数人都习惯很多帐号使用同一组密码,那么其它网站的密码呢?全部修改?工作量何其之大啊。

登陆时多了个想法,由于看到截图给出的CSDN数据库中的密码居然都是明文,就在firefox中使用firebug查看了一下。真是不看不知道,一看吓一跳啊。

看看下面的登陆提交的页面地址就很清楚了,先说登陆是使用的get方法,个人认为使用post似乎更稳妥些吧。可能是为了登陆后跳转回原来的页面,故而使用get方法的吧。这点到没什么太大问题,但是用户名和密码都是赫然的使用明文作为参数进行传递,这点可真的说不过去了吧。

http://passport.csdn.net/ajax/accounthandler.ashx?t=log&u=test-user&p=test-password&c=&remember=0&f=http%3A//passport.csdn.net/account/login

飞尘在做一个比较小的系统时,都是将密码在web前端使用javascript进行加密之后才传递参数的。对于csdn的方式真是不敢恭维啊。之前有看到md5被破解,因此加密采用了sha1,当然加密的算法有很多,比如SHA-256、AES、DES等等,各种语言都有具体的实现,下面给出一份在javascript中实现的crypto-js

http://code.google.com/p/crypto-js/

在安全性要求更高的情况下,加密后的密码在服务端还会做一些处理,进行二次加密,这样即便是服务器被黑客攻击,数据库遭遇盗窃,用户的密码也不至于大白于天下,毕竟算法的逆向工程还是很有难度的。

如果真如文章所言,用户密码为明文保存,后果真的很严重,估计绝大部分的黎叔都会很生气吧。

无论与否,定时修改密码总归是件值得做的事情。可惜csdn修改密码依然不给力啊。

http://passport.csdn.net/ajax/accounthandler.ashx?t=chgpwd&p0=old-password&p1=new-password&p2=new-password

python使用logging模块之二

之前写过一篇如何在python中启用日志logging模块的文章,当时是使用外部配置文件的形式来设置logging相关参数的。

由于开发环境是在win7下,潜在的文件权限问题没有及时的暴露出来。在项目部署到服务器的linux环境中时,出现了许多始料未及的问题,而最主要的也就是文件系统的差异带来的问题。

记得在配置文件中,日志输出到文件只需要设置日志文件名就可以了,当然可以带有路径,只是需要绝对路径。至于相对路径,在python环境下自然是脚本所在的路径了,但是跑在apache容器中的时候,就不是脚本文件的路径了,而是apache安装的路径。

所以当时只设定了文件名,而这个日志文件是写在了apache安装目录下,windows下一般是不会有问题的,等到linux环境时,apache目录自然是不允许随便写的啦,python脚本执行出错。查看了apache的错误日志才发现了这个问题。

网上也查了些资料,始终没有找到解决方法,当时只能先将日志功能禁用。

如今又需要日志了,既然配置文件不好使,那就先来点直接的。

log.py文件如下

?View Code PYTHON
#coding=utf-8
import logging
import os
pwd = os.path.abspath(os.path.dirname(__file__))
 
folder = 'log'
dir = os.path.join(pwd, folder)
if not os.path.exists(dir):
    os.mkdir(dir)
 
logger = logging.getLogger('debug')
logger.setLevel(logging.DEBUG)
 
ch = logging.FileHandler(dir + '/debug.txt')
ch.setLevel(logging.DEBUG)
 
# create formatter
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
 
# add formatter to ch
ch.setFormatter(formatter)
 
def debug(msg):
    logger.addHandler(ch)
    logger.debug(msg)
    logger.removeHandler(ch)
 
def error(msg):
    logger.addHandler(ch)
    logger.error(msg)
    logger.removeHandler(ch)

使用logger的时候遇到另外一个问题,重复的日志会多次输出,由于是web形式,每次刷新页面,log就会多输出一次,乖乖!

经查,原来是没有removeHandler,那种返回logger对象的方法不好用,于是自己修改为上面的形式。引入log模块后,调用相应级别的方法就好了,如log.debug(‘hello’)