Blog系统更新

Blog系统使用的是 allbuttonspressed 。这是一款运行在Google Appengine上的开源的简易CMS系统。之前根据自己的需要修改了部分源代码,我部署的版本则停留在了去年5月份左右。这两天花了一些时间将Blog系统更新到最新的版本。

在更新的过程中,发现merge最新的代码产生了不少conflict。为了将来merge的时候变得更加轻松,我修改了部分自定义代码,尽量采取注入式的修改,而不直接修改源代码。

现在,更新后的版本已经上线。从前台几乎看不出区别,后台底层还是有蛮大区别的。

为Blog增加了网址缩短功能

之前 添加了当博客有新文章发布的时候会自动发送更新到Twitter的功能。由于偷懒,发送的网址并没有缩短,导致今天出现了标题过长时超过Twitter字数限制的问题。

花了一些时间,使用 django-shorturls 为博客添加了简单的网址缩短功能,之后就不用害怕标题太长导致Twitter无法更新的问题了,并且发送到Twitter的更新也更加简洁。

其实,这是一个测试 :)

在nginx+php-fpm环境中部署使用Kohana框架开发的BlueBox系统

前两天想研究一下BlueBox这个新的FreeSwitch网页管理客户端系统,花了一点时间部署了一套。期间遇到了Nginx环境和Kohana框架兼容的问题,以下是遇到的问题以及解决的方案。

背景知识:

  • Nginx :一款高效的Http服务器
  • Kohana :一款PHP框架
  • BlueBox : 使用Kohana开发的一款FreeSwitch网页管理客户端系统,前身是 FreePBX v3

问题及解决方案:

BlueBox的安装参见其相关文档,这里就不重复了。在安装流程中,进行到访问 http://YOUR_WEB_SERVER/bluebox/ 这一步进行初始化时报错。系统会将页面转向到 http://YOUR_WEB_SERVER/bluebox/index.php/installer 这个页面,但是Nginx提示404页面无法找到,无法继续。

经过一番研究之后发现Kohana框架对Apache的支持比较好,在bluebox根目录下也有.htaccess 这个Apache的配置文件。BlueBox的安装文档也是基于Apache环境来编写的。从出错提示来看,应该是直接在index.php后面跟/installer导致Nginx将index.php/installer整体当成了脚本文件名在目录中寻找,最终无法找到,返回404错误。而Apache似乎会将index.php/installer打断,定位到index.php脚本,所以安装流程得以顺利进行。

找到问题之后首先尝试让BlueBox使用Nginx能够解析的url形式,由于并没有Kohana框架的使用经验,简单查看配置文件及Kohana的代码后没有发现解决问题的办法。一番Google以后,找到了 这篇文档 。按照文档中的配置写法,修改了VirtualHost配置,使得Nginx能够正常兼容Kohana框架,问题得到解决。以下是我的配置文件,仅供参考:

server {
    listen       80;
    server_name  YOUR_DOMAIN;
    index        index.html index.htm index.php;
    root         /DOCUMENT_ROOT;

  location ~ .*\.(php|php5)?$ {
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }

  location /bluebox/ {
    rewrite index.php(.+)$ /bluebox/index.php?kohana_uri=$1 last;
  }
}

其中php-fpm的部分与正常的在Nginx中部署php程序的配置一致,不需要多说,主要是在后面的rewrite rule中处理了index.php与/installer分离的问题。最近多次使用了nginx的rewrite以及try_files,越发觉得nginx在这方面的强大。

当Kohana与Nginx的兼容问题得到解决以后,剩下的安装流程就一切顺利。只是进入BlueBox之后一看,觉得功能还是稍显简单,估计需要再经过一定时间的开发之后,才能真正让人用的顺手。在那之前,我还是继续使用直接修改配置文件的方法来进行FreeSwitch的配置吧。

使用Python导出WordPress数据

在进行Blog迁移的时候,需要从之前的WordPress系统中导出以往写的博文,导入新系统中。WordPress本身提供了信息导出的功能,但是使用xmlrpc接口来进行博文导出将会更加方便。

网上搜索了一下, wordpress-library 提供了api简单的封装,不过直接使用Python自带的xmlrpclib来操作也非常的简单。代码片段如下:

import xmlrpclib

XMLRPC_ENDPOINT = "http://www.YOURBLOG.com/xmlrpc.php"
USERNAME = "YOURUSERNAME"
PASSWORD = "YOURPASSWORD"
BLOGID = "0" # Blog ID,如果是单用户的WordPress系统,则为0

client = xmlrpclib.ServerProxy(XMLRPC_ENDPOINT)
posts = client.metaWeblog.getRecentPosts(BLOGID, USERNAME, PASSWORD, 1000) # 最后一个参数代表取多少篇博文,如果想一次性获取全部博文,则将这个参数设为一个大数即可

for post in posts:
    print post
    DO_SOMETHING_ELSE()

需要注意的是,返回的post所带的wp_slug参数是经过quote了的,需要unquote来得到原始的值,代码片段如下:

import urllib
slug = urllib.unquote(post['wp_slug']).decode("utf8")

使用WordPress的xmlrpc接口还可以方便的进行其他操作,所有接口函数列表可以使用 mt.supportedMethods() 函数获得,如下:

>>> client.mt.supportedMethods()
['wp.getUsersBlogs', 'wp.getPage', 'wp.getPages', 'wp.newPage', 'wp.deletePage', 'wp.editPage', 'wp.getPageList', 'wp.getAuthors', 'wp.getCategories', 'wp.getTags', 'wp.newCategory', 'wp.deleteCategory', 'wp.suggestCategories', 'wp.uploadFile', 'wp.getCommentCount', 'wp.getPostStatusList', 'wp.getPageStatusList', 'wp.getPageTemplates', 'wp.getOptions', 'wp.setOptions', 'wp.getComment', 'wp.getComments', 'wp.deleteComment', 'wp.editComment', 'wp.newComment', 'wp.getCommentStatusList', 'wp.getMediaItem', 'wp.getMediaLibrary', 'wp.getPostFormats', 'blogger.getUsersBlogs', 'blogger.getUserInfo', 'blogger.getPost', 'blogger.getRecentPosts', 'blogger.getTemplate', 'blogger.setTemplate', 'blogger.newPost', 'blogger.editPost', 'blogger.deletePost', 'metaWeblog.newPost', 'metaWeblog.editPost', 'metaWeblog.getPost', 'metaWeblog.getRecentPosts', 'metaWeblog.getCategories', 'metaWeblog.newMediaObject', 'metaWeblog.deletePost', 'metaWeblog.getTemplate', 'metaWeblog.setTemplate', 'metaWeblog.getUsersBlogs', 'mt.getCategoryList', 'mt.getRecentPostTitles', 'mt.getPostCategories', 'mt.setPostCategories', 'mt.supportedMethods', 'mt.supportedTextFilters', 'mt.getTrackbackPings', 'mt.publishPost', 'pingback.ping', 'pingback.extensions.getPingbacks', 'demo.sayHello', 'demo.addTwoNumbers']

对这些接口函数的解析可以参考本文最后的相关链接,这里就不详细解释了。充分利用这些接口函数可以实现定制WordPress客户端,自动发帖等更加高级的功能,为开发者留下了无限的可能。

解决 mount cifs 时出现的 Value too large for defined data type 错误

今天遇到的一个问题,记录一下,以便日后备查。

今天在捣鼓openwrt时,打算挂载局域网内的一个samba share,在成功挂载后执行 ls 时报错:

root@OpenWrt:/mnt/cifs# ls
ls: can't open '/mnt/cifs': Value too large for defined data type

经过一段不短的时间调试以及搜索后,总算找到了解决方案,参见 这里

使用以下指令挂载samba share后,问题解决:

root@OpenWrt:~# mount.cifs //IP/SHARE /mnt/cifs -o nounix,noserverino
Update:
貌似这个问题很早就有了,参见 这里的讨论:

3个不错的CSS教学Slide

都来自于 http://css.maxdesign.com.au

文字简单易懂,适合有一定CSS基础以及英语基础的同学阅读。另外该网站上还有一些CSS教程,也值得一看。

给Blog增加了同步到Twitter的功能

其实,这是一个测试 :)

杂感

夫妻感情和睦的核心其实并不是追求那些自己想要的东西,而是接受那些自己不想要的东西。因为当一个愿望得到满足以后,总会有新的欲望产生。而另一半的缺陷总是有限的,当所有的缺陷都能够接受以后,对方在自己眼中就变得完美起来了。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17