分类:'发芽网开发记录' 的所有文章

折腾 - 发芽网后台更新Python2.7.2, Django1.3, Pygments1.4, jQuery1.6.2

发芽网后台更新了:Django1.3, Python2.7.2,jQuery1.6.2,Pygments1.4

其中Pygments的更新带了更多的语法高亮支持,包含了许多人熟悉的AutoHotkey

话说,似乎是临时的,很多的国外网站都没法访问了,连ssh也不可用了,这些网站都是技术性网站,应该没问题的,加上vpn就可以访问了,奇怪的是,用vpn也访问不了twitter了,难道传说中的白名单制度开始试水了?Fuck GFW! @ 2011-08-21, 18:47:11

—————————————————————

最近有人在代码发芽网上留言问能不能加上AutoHotkey的高亮支持,瞄了一眼Pygments的新版本1.4,发现已经支持了,打算搞过来。另外发现发芽网后台的Django和Python以至于jQuery都老了,想起前几天看到阮一峰介绍新版jQuery性能的文章,据说快了很多,决定把这些一起更新一下,折腾开始了,且看一个业余的网页开发者会遇到多少问题。。。

1. 首先,参考以前的文章”configure your own python 2.5.2 on bluehost”安装Python2.7.2,下载编译安装,搞定。顺手改了.bashrc,这样下次ssh到服务器用的就是2.7了

2. 然后,下载easy_install的egg包,用 sh xxx.egg 安装完毕,然后,easy_install安装了发芽网依赖的库:django1.3, PIL, flup, MySQL-Python, Pygments1.4, markdown2, python-openid,为了用起来顺手,又安装了ipython

3. 然后,参考以前的文章Bluehost Django fastcgi配置, 静态(static)文件处理更改了t.fcgi,指向新的python库

4. 然后到后台杀死所有t.fcgi进程,网站立马不可访问了,500 Error或者干脆半天都不返回,杯具。

5. 查吧,一个个查,根据多次折腾的经验,觉得应该是t.fcgi里面出异常了。这个好办(现在说好办,当时也想了半天),因为t.fcgi也是python脚本,直接执行之,居然没有发现任何问题,突然发现,t.fcgi最上面一行,对,就是指定python可执行文件地址的地方,用的还是python2.5,sigh,亏我还在以前的文章里专门写过注意事项。

6. 再次杀死进程,打开网站,nnd,依然是挂的,再次执行t.fcgi,这次报了异常 - flup库没有安装,晕倒(前面步骤2里是全的,当时忘了装了),再次执行,没有啥问题了………中间由于每次fail都会发日志给我的邮箱,还遇上了bluehost发email的限制,不得不在Django配置文件里打开了Debug=True调试选项

7. 再次杀死进程,打开网络,tnnd,依然是挂的;好吧没关系,就放我换个姿势再来一次,在发芽网源文件目录底下,敲入python manage.py runserver,对,就是起了一个本地Django Server,果然起不来,但是可以看到异常了,看出来似乎是PIL里面出的问题,错误信息是MemoryError还提到了ctypes,肿么办?这个吓不倒我,Google之,发现这篇文章,里面说,打开$HOME/lib/python2.7/ctypes/__init__.py,找到CFUNCTYPE(c_int)(lambda: None),注释掉它就ok但是不知道到底为神马。我打开一看,里面居然有一段注释,意思是,写这几行代码的人也不完全清楚为什么要写这行代码:

# XXX for whatever reasons, creating the first instance of a callback
# function is needed for the unittests on Win64 to succeed.  This MAY
# be a compiler bug, since the problem occurs only when _ctypes is
# compiled with the MS SDK compiler.  Or an uninitialized variable?
CFUNCTYPE(c_int)(lambda: None)

8. 这样的神问题都碰上了,我像个小强一样挺了过来,注释掉这一行,居然,就搞定了~~~

9. 终于,发芽网可以打开了,世界和平了,王子和公主从此过上了幸福的生活~~~直到,我发现admin页面无法访问了

10. 这时候我大概已经患上了斯德哥尔摩综合症,看到这个问题,居然虎躯一震,精神焕发,查起了Django1.4的文档,发现,urls.py里面有个地方要改改了。这么快就搞定,很是乏味啊~

11. 终于成功的打开了admin页面,发现页面布局有些古怪,突然想起以前发的另一篇文章Bluehost上架设Django之Admin,原来admin_media还是指向以前安装的1.1的,删掉链接文件重新ln一下,搞定

12. 终于,看起来一切正常了,siteuptime服务告诉我说 back to normal 。。。咚咚呛

13. 然后发现代码发芽网贴代码以后,看起来就是一片漆黑,用chrome的developer tools验证了一下,原来所有的jQuery.ajax调用都会跑到异常分支里去,加上了几行代码发现报错 Unexpected token 。继续Google关键字Unexpected token和jQuery,发现stackoverflow上面有个帖子说这个事情,居然是个jQuery的bug?jQuery会把返回结果当成json进行eval,当然会有些问题啦,于是把所有的ajax调用里面都加上了一句 dataType: ‘text’ 之后,一切ok了

14. 至此,好像一切都好了,第二天,tianyi song同学给我写信,问我为什么代码发芽网不能用了?还给我发来了截图。来回交流了几次,发现我原来的代码里对Pygments的一个格式有严格依赖,在Pygments1.4里面这个格式有些改动,没办法,把Pygments源码里面html.py这个formatter改了几行,总算搞定了

15. 篇幅限制,省略细节问题十数条,还会遇到神马问题?期待~~~

经验总结

1. 不要怕,找到问题,细心分析,想各种方式去debug,搜索Google,大不了去看代码

2. 本地环境和部署的环境的一致性很重要,Service Engineer很重要啊,要想再更新的同时网络不下线,没有SE的支持是很困难的

3. 做个大网站,没有unit test也没有测试团队,那是不可能地~

btw, 或许有人问,搞这么多问题,就为了一个小小的网站,值吗?

值!兴趣是无价的,折腾是永恒的~~~在折腾中学习就是爽~~~!

  • Share/Bookmark

Windows下的用vim编辑javascript: ctags, taglist, javscript设置

前提:
1. 安装Ctags,只要把ctags.exe解压到你的系统PATH所在的任意文件夹下就可以,不知道的话就放到system32下吧。其他文件不需要
2. 安装gvim的taglist.vim插件

设置:
1. 打开命令行,输入: cd %HOMEDRIVE%%HOMEPATH% (一般在 C:\Documents and Settings\登录用户名\ 目录下 )
2. 在该目录下建立一个文件名为 ctags.cnf
3. 在该文件里面输入:

--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Object\(/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/f,function/
--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Array\(/\1/a,array/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/a,array/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/s,string/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/s,string/

4. 在.vimrc文件里面加上一行:

let tlist_js_settings = 'javascript;s:string;a:array;o:object;f:function'

好了,配置完成,现在用gvim打开一个包含很多函数定义的.js文件(不要是.min.js的啊),输入:Tlist就可以啦
上图:
vim_taglist_ctags_js1
其他vim+javascript设置: javascript.vim

参考:
* http://stackoverflow.com/questions/1790623/how-can-i-make-vims-taglist-plugin-show-useful-information-for-javascript

  • Share/Bookmark

绕过Bluehost的数据库连接限制(Django/发芽网)

最近个把月,发芽网的访问量有所上升,直接后果就是数据库报错,说我的数据库用户链接数超过了max_user_connections

联系了一下bluehost,客服跟我说,最近他们设置了max_user_connections为15, 建议我多用cache方式减少数据库连接,并根据我用的是Django推荐了django-staticgenerator,我看了一下,还不错,但是最近太忙了,时间上估计来不及。

bluehost抱怨了一下连接数太少,顺便想到了一个暂时的解决方案:
1. 在settings.py里面加入了一个DATABASE_USERS的新变量,里面放上很多个用户名,这些用户对发芽网的数据库都有同样的访问权限,同样的密码
2. 在后台的python2.6/lib/site-packages/django/db/__init__.py里面,把获取数据库用户的赋值改成了random.choice( settings.DATABASE_USERS )

暂时来看,应该还是有点效果了,先观察几天再说。

BTW: 给发芽网添加了OpenID支持以后,到现在已经有80个用户使用了OpenID,多数都是Google的,第二位的是Yahoo,呵呵这个结果还不错。

  • Share/Bookmark

给发芽网添加OpenID支持,Google帐户登陆很方便

fayaa-openid-1

上周刚刚做好,欢迎小白鼠 :)
(好像已经有十几个了,大部分都是Google用户)

登陆以后,可以选择生成新帐户(只要稍微改改就行,懒的话直接添个验证码,反正已经有三个人这么做了),或者绑定到老帐户,以后登录发芽网就可以多渠道了。而且,支持绑定多个Openid到一个发芽网帐号哦~~~!

fayaa-openid-2


关于实现

查了一下发芽网的Roadmap,大概八个月前,加入了OpenID的需求,这是个计划了很久的功能,刚刚想到的时候改了一半,结果没做完的工作直接导致了八个月内不敢做其他的更新,看来版本管理还是要做做好。

以下是准备过程:
最初的时候,想用Django-Openid-Auth
后来感觉本地用户还是需要的,就想用Django-Authopenid,被Nonce搞到晕
再后来,想过用Google Friend Connect(谷鸽迁徙香港后放弃)
然后还试过Django SocialAuth
还试过修改gaema
。。。
最终,回到起点,仔细研究了一下python openid的库以及openid的spec,基于python openid自己写了一个
(model那部分代码直接copy了django-authopenid)


PS:
这段时间很少有精力改进发芽网,一半的周末用于来往京津高速回家赔乖女儿乐乐,带她挖沙子是主要任务,呵呵

另外,来北京快5年了,前不久才去了故宫、簋街、南锣鼓巷,长城至今还没有去过,跟猫猫一合计,现在不转转真是对不住自己每天这么辛苦,于是另外一半的周末,一部分时间在北京转转玩玩,另一部分的时间,在睡觉,以及做爱做的事情。。。

  • Share/Bookmark

代码发芽网重新支持临时代码

代码发芽网新界面

(上上周做的了,直到今天才有时间写)

代码发芽网改版以后,把临时高亮代码的支持去掉了,也就是说,不管你有没有登录,所有的代码都会发布,别人也看得到

当时考虑的情况是:保不保存都没关系,因为用来高亮的代码都是要贴到网上的,给出了“高亮不保存”按钮反而添乱。

然后有朋友在贴了代码以后,写信给我要求删除;如是者三,我也纳闷,跟其中一位朋友聊聊为啥,才知道有时候贴代码是在本地用的,并不想公开。

想了又想,决定还是尊重用户的选择;为了区分,我加上了一个“临时自用,请不要保存”的选项。

  • Share/Bookmark

下一页 »