用PyYAML读取Puppet的YAML文件,会从中提取出一个ruby变量,成为Python的datetime模块定义的datetime对象。转换为JSON时会出错,因为JSON不知道怎么处理datetime对象。
试了用repr先处理这个对象,即可转换为JSON,在Django中处理时再eval,就可原样返回之前的datetime对象。这样做很方便,无需知道对象的具体类型。但是太不安全了,因为没有内容判断,把从文件中得到的任何东西都进行eval。测试的时候可以eval,实际代码中是用datetime类的strftime和strptime函数配对转换的。
2012年10月23日星期二
2012年10月21日星期日
Django项目的路径设置
一个别人的Django项目,在命令行用manage.py启动是正常的,但在Eclipse里启动后却出错,页面显示找不到django-session表。发现是找不到SQLite数据库文件的原因。可以看出,django-session是Django进程访问的第一个表,以后如果碰到这个错误,那么一定是数据库配置的问题。
新建PyDev Django项目时,会有对话框来设置项目,包括数据库类型和库名。对于目录里已有相关文件的项目,这个设置是无效果的,该设置是为了给新建项目生成settings.py。出错开始,我还以为需要改正在这个对话框提供过的设置,就在项目属性里找相关的设置,但找不到。其实所有Django相关的设置都在settings.py里面。
在settings.py里面,SQLite数据库文件是直接写的文件名,这就是个相对路径,相对于Django进程的工作目录,即getcwd(3)的结果。如果不是从项目根目录启动manage.py(假设settings.py和manage.py都在根目录),那就找不到数据库文件,因为在PyDev里面启动Django时,进程工作目录是Eclipse的Workspace所在目录。
所以不要提供相对路径,而应该使用“动态的绝对路径”。在settings.py的开头写入:import os.pathROOT = os.path.dirname(os.path.abspath(__file__))
这样ROOT就是settings.py文件所在目录,根据ROOT来指定项目文件的目录,包括SQLite数据库文件、静态文件等,不论从哪里启动项目,文件都可以找到。
2012年10月6日星期六
自动挂载存储卡的问题
弄了一个4GB的Micro SD卡,可以把手机上2GB的升级了。把手机用USB存储模式连接到电脑,SD卡没有自动挂载,就用mount /dev/sdb1 /mnt挂载了,然后用tar把卡上的内容打包。把新卡换到手机上,再用tar把打包的内容释放到新卡上,但是发现原来的中文文件名字,在压缩包里面显示的是一串问号?,导致解压失败。
因为存储卡是VFAT文件系统的,想起默认的mount会有编码问题,但是懒得查mount选项了,就想搞定自动挂载,因为Ubuntu会对VFAT的移动设备自动挂载,会设置一系列参数,不会出现编码问题。
在Ubuntu的官方文档看到自动挂载是udisks实现的,我只好手动试试:
因为存储卡是VFAT文件系统的,想起默认的mount会有编码问题,但是懒得查mount选项了,就想搞定自动挂载,因为Ubuntu会对VFAT的移动设备自动挂载,会设置一系列参数,不会出现编码问题。
在Ubuntu的官方文档看到自动挂载是udisks实现的,我只好手动试试:
/usr/bin/udisks --mount /dev/sdb1结果出错,说是
Mount failed: Error mounting: mount exited with exit code 1: helper failed with:看到那个/mnt/pi就知道原来是我在fstab文件里面写了/dev/sdb1的条目,所以udisks没有自动挂载,把这个条目注释后,就可以自动挂载了,而且也没有文件名乱码了。自动挂载的参数是:
mount: only root can mount /dev/sdb1 on /mnt/pi
/dev/sdb1 on /media/595B-BB30 type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks)自动挂载设定了好多有用的参数,比手动挂载方便多了,utf8=1应该就是处理编码问题的选项。
2012年9月25日星期二
Django模板的forloop出错
在Django模板的for循环中用了一句:
原来用的是Jinja2。加上Jinja再搜索找到了文档,原来Jinja2里面forloop叫loop,把forloop改为loop就好了。
{% if not forloop.last %}出错了:
Exception Type: UndefinedErrorGoogle搜索未解,再看出错信息:
Exception Value: 'forloop' is undefined
Exception Location: /usr/local/lib/python2.7/dist-packages/jinja2/environment.py in getattr, line 372
原来用的是Jinja2。加上Jinja再搜索找到了文档,原来Jinja2里面forloop叫loop,把forloop改为loop就好了。
2012年9月1日星期六
NetworkManager和Upstart
Ubuntu桌面下,网络是由NetworkManager管理的。NM很好用,但是有时要配置复杂的网络,只能用interfaces等网络配置文件搞定。
我给eth0设置了静态IP,用于办公室环境(其实也是DHCP网络)。回家之后这个静态IP得不到,开机的时候会等待2分钟时间让网络起来,先显示:
现在的Ubuntu在/etc/init.d下,System V Init任务和Upstart任务都有。如果是Upstart任务,则都链接到/lib/init/upstart-job,如NM:
那么开机等待的两分钟在哪里配置的呢?看了这个文章后才知道,是在/etc/init/failsafe.conf里面配置的。具体看该文件可以知道个大概。
我给eth0设置了静态IP,用于办公室环境(其实也是DHCP网络)。回家之后这个静态IP得不到,开机的时候会等待2分钟时间让网络起来,先显示:
1分钟后是:Waiting for network configuration...
最后是:Waiting up to 60 more seconds for network configuration...
这在Launchpad上有N个bug报告。之后进入Ubuntu,interfaces文件没有生效,而且NM都没自动启动呢。来分析一下这个问题。Booting system without full network configuration...
现在的Ubuntu在/etc/init.d下,System V Init任务和Upstart任务都有。如果是Upstart任务,则都链接到/lib/init/upstart-job,如NM:
开始我看到NM在/etc/rc?.d下没有启动脚本,就用update-rc.d创建了链接,但还是不能自动启动。后来才明白Upstart任务的启动和停止控制不在/etc/rc?.d目录下,而是在/etc/init目录。NM的配置文件为/etc/init/network-manager.conf。里面有:tux@macbook:/etc/init.d(0)$ ls -l network-manager
lrwxrwxrwx 1 root root 21 May 25 12:01 network-manager -> /lib/init/upstart-job
就是说NM要在local-filesystem, dbus和static-network-up之后才会启动,而这个Upstart Event(事件)应该是要在interfaces中的网络接口启用之后才会发生(Emit)。所以如果interfaces文件失效,NW也起不来。start on (local-filesystems
and started dbus
and static-network-up)
那么开机等待的两分钟在哪里配置的呢?看了这个文章后才知道,是在/etc/init/failsafe.conf里面配置的。具体看该文件可以知道个大概。
2012年8月29日星期三
PyDev的Debug Console
用PyDev的远程调试器(Remote Debugger)来调试Django程序,只看到调试服务器(Debug Server)的控制台(Console)(见下图),看不到PyDev的交互式调试控制器(Interactive Debug Console):
其实可以在Console视图(View)的Open Console的按钮点击,选择PyDev Console:
在弹出的对话框选择PyDev Debug Console:
然后在Console视图的Display Selected Console选择刚刚开启的PyDev Debug Console:
这样就可以出来了,在这个Console里面可以对断点处各个Frame的状态进行检查,超实用。但是还有个问题,如果鼠标在Debug视图里面点击,Console视图就会切换到Debug Server。可以点击Console视图的Pin Console按钮:
这样Debug Console就不会被自动切换了。
2012-10-12更新:
如果在Open Console对话框不能选PyDev Debug Console:
上面写着:Start the debugger and select the valid frame。在Debug的过程中,在Debug视图选中一个Frame即可选择PyDev Debug Console了。




2012-10-12更新:
如果在Open Console对话框不能选PyDev Debug Console:

GCC找不到标准库
一个开发的哥们,说在开发机(CentOS)上可以编译成功的C++程序,在线上机器(Ubuntu)上就不行。我发现是链接不了pthread库,而这个库是安装了的。然后另一个和他一起的哥们,来抱怨Ubuntu的动态库路径不标准。
我在自己的Ubuntu桌面上写的多线程的C程序,又编译了一下是没有问题的啊。后来他发现是应该把动态库放到编译命令行的最后。原来是:
我在自己的Ubuntu桌面上写的多线程的C程序,又编译了一下是没有问题的啊。后来他发现是应该把动态库放到编译命令行的最后。原来是:
g++ $(INCLUDE) $(CPPFLAG) -g $(LLIB) -o $(OBJ) $^改成下面的就好了:
我又回忆起这是一个C的FAQ。我的Makefile里面-lm -pthread是写到最后的,所以没有问题。g++ $(INCLUDE) $(CPPFLAG) -g -o $(OBJ) $^ $(LLIB)
订阅:
博文 (Atom)