All articles, tagged with “zine”

Blog 改动备忘录

远足回来, 惊讶的发现 Picasa Web 也被墙奸了…

真是无奈, Zine 不支持附件上传, 所以 Blog 的照片基本都存放在 Picasa Web 上.

Picasa Web 最近不断抽筋, 不过根据以往的经验, 把希望寄托在 GFW 上是无知的, 更靠谱的方法还是换一个支持附件上传的 Blog 引擎.

  • 切换到 Byteflow, 支持图片上传

  • 使用 virtualen + django-cpserver + supervisor 的组合部署 Django / Byteflow

  • 安装 django-cpserver, 在 settings_local.py 文件 ADDITIONAL_APPS 中追加: ‘cpserver’

  • settings_local.py 文件 ADDITIONAL_APPS 中启用: nebulafriends apps

  • 主题转换

  • settings_local.py 时间, 日期格式:

    DATE_FORMAT = "Y-m-j, l"
    TIME_FORMAT = "H:i A"
    
  • settings_local.py 文件, 设置 reStructuredText 格式: RENDER_METHOD = ‘rst’

  • settings_local.py 文件, 设置时区: TIME_ZONE = ‘Asia/Shanghai’

  • settings_local.py 文件, 设置 SMTP 邮件信息:

    EMAIL_HOST = 'smtp.webfaction.com'
    EMAIL_HOST_USER = 'xxxxxxx'
    EMAIL_HOST_PASSWORD = 'xxxxxx'
    EMAIL_PORT = 25
    DEFAULT_FROM_EMAIL = 'xx@yy.com' # from address for server error emails
    SERVER_EMAIL = 'donot-reply@yy.com' # used as the from address for django.core.mail.mail_admins() and django.core.mail.mail_managers()
    
  • settings_local.py 文件, 把 DEBUG = True 修改成 DEBUG = False

  • FeedBurner 自动转向: FEEDBURNER = {“blog.yangyubo.com”: {“blog” : “yangyubo”, “comments” : “yangyubo_comments”} }

  • 修改 app/discussion/models.py, 将 self.body_html = render(self.body, ‘markdown’) 修改成 self.body_html = render(self.body, ‘rst’)

  • 修改 static/js/comments.js, 在 function init() 中, 注释掉 comment_form.hide(); 一行

  • 在 Webfaction 控制面板中添加 admin-media, static 等静态资源映射

2009-08-16, Sunday 15:07 PM | 2 comments | 0 pingbacks | Tags: , , ,

Homepage / Blog 改动备忘录

改动备忘录:

  • 添加 Google CSE 嵌入式搜索框
  • 鉴于 Twitter 被放行, 改回 Twitter 更新框. FriendFeed 更新框的默认风格像块狗皮膏药, 和 Blog 风格严重不协调
  • 修改 Sphinx 和 Zine 模板, 将耗时的 Twitter AJAX / Google Analytics / Google CSE 等 javascript 代码移至紧靠 </body> 处, 提高页面加载心理速度
  • 修改 Sphinx 模板, 增加 Twitter 更新框, 并把页面最小宽度设为 980px, 最大宽度设为 1400px
  • Sphinx 升级到 0.6.2
  • 尝试将 Zine 升级到源码库最新版本, 失败, 原因是数据库结构发生变化, 下次升级要注意.
  • 在 Webfaction 上编译 lxml Python 库失败. 下次升级 Zine 时要记得用 import xml.etree.cElementTree as etree 替换所有包含 from lxml import etree 语句的 .py 文件, 规避这个问题.
2009-06-18, Thursday 12:10 PM | 0 comments | 0 pingbacks | Tags: , , , , ,

用 Supervisor 管理后台守护进程

一些虚拟主机支持跑后台守护程序, 比如 Webfaction.

在虚拟主机中管理后台守护程序没有 VPS 那么方便, VPS 是可以使用 root 权限的, 但虚拟主机则不能.

要更方便的管理后台进程, 通常需要借助一些辅助工具. 常用的管理工具有 runit, daemontools 以及 Supervisor. 其中以 Supervisor 最为易用, 功能也很完善.

安装 Supervisor

Supervisor 是一个 Python 程序, 按照 官方文档安装 就可以了.

稍加注意的是, 虚拟主机用户需要安装到他的用户目录:

easy_install supervisor --prefix=$HOME

安装完成后, 确保 $HOME/bin 目录在 $PATH 环境变量中并已经生效.

使用方法: 以 Zine 为例

Zine 可以作为后台守护程序运行, 通过 Supervisor 进行 启动/重启/失败自动重启 等控制.

Supervisor 有两个可执行程序 — supervisordsupervisorctl:

  • supervisord 是后台管理服务器, 用来依据配置文件的策略管理后台守护进程;
  • supervisorctl 用于管理员向后台管理程序发送 启动/重启/停止 等指令;

它们之间的关系就相当于 Apache 的 httpdapachectl.

创建工作目录和配置文件

首先需要创建一个 Supervisor 的工作目录, 如: $HOME/deploy/supervisor/, 用来存放错误日志输出, pid 文件, socket 文件, 配置文件等.

接着是创建 配置文件, 配置文件用来指示 Supervisor 有哪些进程需要管理, 以及管理策略.

我们把配置文件命名为 supervisord.conf (也可以是其它任何文件名, 但 Supervisor 默认自动在当前目录查找该文件, 用 supervisord.conf 会为以后管理提供方便):

[supervisord]
logfile = %(here)s/supervisord.log
loglevel = warn
pidfile = %(here)s/supervisord.pid
directory = %(here)s/
childlogdir = %(here)s/childlog

[unix_http_server]
file = <YOU-HOME-PATH>/deploy/supervisor/supervisord.sock

[rpcinterface:supervisor]
; This section is always necessary because supervisor uses RPC internally.
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
; Must match settings in 'unix_http_server'
serverurl = unix:///<YOU-HOME-PATH>/deploy/supervisor/supervisord.sock

[program:blog]
command = <YOU-HOME-PATH>/deploy/zine/bin/python /home/yospaly/deploy/zine/scripts/server -a 127.0.0.1 --no-reloader --no-debugger --threaded -p 6666 -I <YOU-HOME-PATH>/deploy/blog/

[program:blog2]
command = <YOU-HOME-PATH>/deploy/zine/bin/python /home/yospaly/deploy/zine/scripts/server -a 127.0.0.1 --no-reloader --no-debugger --threaded -p 8888 -I <YOU-HOME-PATH>/deploy/blog2/
  • 配置文件的第一段用来配置 supervisord 后台管理服务器一些输出文件的路径;
  • 第二段用来打开 supervisord 内部的 Socket 服务, 以便接受和处理来自控制程序 (supervisorctl) 请求;
  • 第三段是必备的, 详见注释;
  • 第四段告诉控制程序 (supervisorctl) 通过什么途径和 supervisord 通信;

Note

Webfaction 的用户不能随意指定 Zine 的端口号, 要使用在 Webfaction 控制面板添加新的 “Custom app (listening on port)” 后获得的一个特定端口号.

使用 supervisorctl 进行控制

supervisord.conf 所在的工作目录执行 supervisord 运行后台管理服务器, 如果运行失败请查看工作目录下的错误日志;

supervisord 跑起来后, supervisorctl 就可以方便的手工管理守护程序了:

supervisorctl start all
supervisorctl stop blog
supervisorctl restart blog2

结束语

Supervisor 是一个易用, 又不失强大的工具, 这里只涉及了 Supervisor 最基本的使用, 还有很多更加高级和有用的功能未能覆盖, 可以进一步参考 Supervisor 官方文档.

2009-05-14, Thursday 17:42 PM | 0 comments | 0 pingbacks | Tags: , , ,

Blog 搬迁到 Webfaction + Zine

原来是用 Blogspot 的托管服务, 除了它的 HTML 编辑器外, 我觉得非常好用 — 稳定/可靠, 不用自己升级系统, 不用担心数据安全, 不用操心垃圾广告 …

除了 HTML 编辑器.

毕竟 Blogspot 是面向普通用户, 对程序员的需求缺乏照顾. 最痛苦的时候莫过于贴代码和复制其它页面的文字, 太糟糕了, 字体大小有时会变得非常夸张:

http://lh5.ggpht.com/_MqMrLCdh6gQ/SgvRZkwnP8I/AAAAAAAABIQ/U0ZZVbwxFvY/s800/blogspot-wrong-font-size.jpg

被虐了一段时间后, 终于受不了了, 决定切换到我最习惯, 也是最有效率的排版和书写方法 — 纯文本的标记语言, 如: CreoleWiki, reStructuredText.

我需要一个 Python 写的 Blog 引擎 (没什么原因, 个人喜好), 一个对 Python 友好的虚拟主机:

2009-05-14, Thursday 16:29 PM | 2 comments | 0 pingbacks | Tags: , , ,

看好 Django 和 Werkzeug

开发框架的繁荣通常从侧面反映了这门编程语言的广泛接受程度, Java, C++, PHP 都各有不少开发框架.

Python 则是有过之而无不及 — Web Frameworks for Python, 这只是其中一部分, 还有很多其它大大小小的土制框架.

Python Web 开发框架的空前繁荣得益于 WSGIPEP 333 规范, WSGI 定义了服务器/网关如何同 Web 应用 交换数据, 它还更进一步的明确了中间件的行为, 使中间件能够被复用. 下图用洋葱形象的描述了 WSGI 的请求处理 (来自 Pylons 文档) :

http://www.pylonshq.com/docs/en/0.9.7/_images/pylons_as_onion.png

WSGI 规范让 Web 开发的各个要素自由组合成为可能, 利用各种现有的库装配出自己满意的 Web 框架也不是件太难的事情 — A Do-It-Yourself Framework.

Python 社区不断生产出新的 Web 框架, 快得让人窒息, 以致很多人, 包括我都曾希望挂掉几个. 后来想想这可能未必是件坏事, 虽然分散了社区资源, 但也利用了闲散的智力资源, 不同的框架之间可以也相互借鉴和给予灵感, 催生一个更开放, 更繁荣的社区.

Django

众多框架中, 个人感觉社区势头比较好的是 DjangoZope 系 (Zope3, Grok, Repoze.bfg). Pylons / Turbogears 等框架虽然灵活, 但并没有很好的解决复用问题. Django 的 app 复用机制和 Zope 系的组件机制是目前所有框架中最完整的方案.

DjangoZope 系之外的大部分框架, 各具特色的同时, 其实也都大同小异 — 都符合 WSGI 规范, 而且都没能很好的处理复用.

Django 很适合用来快速搭建在线社区, django-registration / django-profiles / pinax 等大量现成的 app 可以整合利用.

不过独立应用软件是 Django 的弱项, 比如类似 Wordpress / MoinMoin 这类软件.

Django 没有对普通用户提供特殊照顾, 所有的设施都是面向开发人员的. 我试过 Byteflow, 一个基于 Django 的 Blog 引擎, 部署方式还是过于原始, 非 Django 开发人员不容易搞定. Byteflow 虽然提供很多特性, 但易用性是最大的问题: 我不能在管理后台修改一些常用配置, 每次 Byteflow 更改配置都需要重启 Django 服务, 相比之下 Zine 易用的多, 插件和主题支持也比较完善.

WSGI + Werkzeug + Jinja2

如果 Django 不适合做一个小的应用或者独立应用软件的话, 谁更适合呢? 有很多不同的选择, 我倾向于 WSGI + Werkzeug + Jinja2, 和 Sphinx / Pygments 一样, WerkzeugJinja2 都出自 pocoo 团队.

Werkzeug 在德语里面是 “工具” 的意思, “Colubrid” 项目的后续, 不属于开发框架的范畴, 但它是相当成熟和完整的 WSGI 工具模块. 比较成功的独立应用软件如 ZineMoinMoin 1.9 都是基于它. 和 Paste 一样, Werkzeug 可以用来整合不同的 WSGI 中间件, 搭建自己的私有平台或框架.

Jinja2 是 Jinja 的后续版本, 它和 Django 模板非常相似, 但是没有 Django 模板的种种限制, 比如不能调用函数, 不能使用 Python 语句等. Jinja2 的性能比 Jinja 有很大的提高, 作者的测试结果是仅次于 Mako.

很多人误认为 Jinja 模板系 “日货”, 并以为是指 靖国神社. 其实作者 Armin Ronacher 是奥地利人, 年纪不大, 却主导和参与了很多比较有影响的开源项目: http://lucumr.pocoo.org/projects/. 他经常使用 mitsuhiko (圆谷光彦) 这个 ID, 搞得我有段时间也以为他是日本人. Armin 好像会些日语, 可能对日本文化也是颇为神往.

英文中 Template (模板) 和 Temple (庙宇) 有相似的发音, 这位兄弟就联想到了日本的 Jinja (神社, 庙宇), 蛮有创意的. 不过一般的 神社 和伤害中国人民感情的 靖国神社 不是一码事.

MoinMoin 2.0 很有可能会采用 Werkzeug + Jinja2 + Pygments 的组合.

2009-05-13, Wednesday 14:29 PM | 1 comment | 0 pingbacks | Tags: , , , ,

关于 Yang Yubo

身处 IT 行业, 惯用 C/C++, 对 Python 情有独钟, 平时比较关注 QT / Django / Werkzeug 等. 了解更多 »