记录一段关于密码处理的 Python 代码

标签:Python

这是昨晚写的一段关于密码处理的代码,包含生成 salt、加密密码、生成随机密码和检验密码。
结果今天懒得用了,主要是懒得写修改密码、重设密码、找回密码这些页面,于是就用 Google 的 OAuth 代替了。
感觉删了也可惜,以后说不定会用到,就放这吧。

关于 VIM 的一点学习经验

标签:VIM

以前总是很排斥使用这种很难记的编辑器,不过陆陆续续用了几个月后,就渐渐离不开 VIM 了。
回想了一下学习时的过程,发现 VIM 的一致性对于学习者而言很有帮助,许多操作都能举一反三地猜测出来。
下面的介绍只针对 VIM 的初学者,其他人可以无视了。

将 Google Reader 的加星条目导出到 Pocket

标签:Python, Google Reader

鉴于 Google Reader 即将关闭,而我没找到好的替代品,所以急需导出几千条加星条目。
前几天测试了下把知乎日报分享到 Pocket,看上去体验还不错,于是决定先保存到 Pocket 吧。

因为没多少时间来写,我就简要说明下原理吧,其他的自己看代码吧。

原生应用 vs HTML 5

标签:HTML, JavaScript, iOS开发

这几个月都在开发知乎日报的后端,让我对移动应用的开发有了更多的认识。

简单来说,我以前一直都认为原生应用才是王道,现在则觉得 HTML 5 才是未来。

准备将 Doodle 移植到 Linux

标签:Python, Redis

最近实在太忙了,而博客还时不时遇到配额用完的问题,我已经懒得解决了。想着 Google Reader 也快不能用了,干脆也别享受 GAE 这免费的午餐了,还是换个地方玩吧。
于是只能很抱歉地告诉 Doodle 的使用者们,Doodle 2 将只能在 Linux 平台(VPS 或独立服务器)上运行了,老版本将只在即日起的一年内提供迁移(到 Doodle 2 或 WordPress)、修正 bug 和指导性的帮助,不再添加新功能了。
预计第一步将支持的是 Ubuntu 12.04+,因为开发是在 OS X 10.8 上,所以肯定也是支持的,只是依赖的工具 / 包 / 库我也记不清(找不到干净的系统)。Windows 上的开发者就抱歉了,支持这个实在头大。
虽说计划是最低支持 128 MB 内存的 VPS,不过看到 DigitalOcean 512 MB + 20G SSD 的 VPS 才卖 $5 每月,也支持按小时扣费,网速和口碑好像还行,所以想先玩玩。有闲钱赞助的,可以通过这个链接购买,累计消费 $10 (例如购买 2 个月最低配置的 VPS)后,我会收到 $10 的佣金,先谢了。发现几个优惠码,不知何时失效,有需要的自便:SSDBEAR10(免费 $10,需要绑定信用卡或 PayPal)、HELLOSF(免费 $5,无需绑定)。不会用的可以在填写支付方式时,找到 Promo Code,把优惠码贴进去,成功就会提示。

关于 Redis 的几种数据库设计方案的内存占用测试

标签:Python, 性能, Redis

最近在做一个项目,数据库使用的是 Redis。在设计数据结构时,不知道哪种实现是最优的,于是做了下测试。

测试环境如下:
OS X10.8.3
Redis 2.6.12
Python 2.7.4
redis-py 2.7.2
hiredis 0.1.1
ujson 1.30
MessagePack 0.3.0
注意:
  1. 因为是拿 Python 测试的,所以可能对其他语言并不完全适用。
  2. 使用的测试数据是特定的,可能对更小或更大的数据并不完全适用。

记录 Python 处理 cookie 时的一个 bug

标签:Python

几周前我遇到了一个问题,某个用户说她无法登录我们的网站。我记录了她的 cookie,发现它是以 ',BRIDGE_R=;' 开头的,其中包含了一个非法字符。
而 Tornado 使用 Cookie.SimpleCookie.load() 方法来解析 cookie:
class HTTPRequest(object):
    @property
    def cookies(self):
        """A dictionary of Cookie.Morsel objects."""
        if not hasattr(self, "_cookies"):
            self._cookies = Cookie.SimpleCookie()
            if "Cookie" in self.headers:
                try:
                    self._cookies.load(
                        native_str(self.headers["Cookie"]))
                except Exception:
                    self._cookies = {}
        return self._cookies
在遇到非法的 cookie 时就会抛出异常,所以 self._cookies 就变成一个空字典了。这样服务器就取不到用户的 cookie,只能当成一个未登录的用户来处理。
而在用户尝试登录以后,虽然写入了正确的登录信息,却仍然无法被读取,于是就不可能成功登录了。

为何 Google Reader 无可取代?

标签:Google Reader

前天一觉醒来,发现 Google Reader 被判死缓了,瞬间觉得生命中好像缺少了什么。
不过这次度假没带电脑,所以也懒得写些什么;只是用继续浏览 Google Reader 上的资讯,来表达我无声的抗议。

Google Reader 对我的重要性,它自己也知道:
From your 111 subscriptions, over the last 30 days you read 10,972 items, clicked 20 items, starred 90 items, and emailed 0 items.
Since June 21, 2011 you have read a total of 296,176 items.
而今,它却要离我而去。

关于 logging 的一些琐事

标签:Python

虽说 logging 模块都用了好久了,不过由于文档不够详细,每次都忍不住去搜索别人的文章,于是就干脆记录下来吧。

生产环境下如何优雅地重启 Tornado

标签:Python

之前我在《Tornado 使用经验》一文中,提到了调用 tornado.process.fork_processes() 来提高性能的方法。
在最近的实践中,我发现这样会有些弊端,所以便有了本文。
当然,这些仍然只是我个人的探索而已,并不保证是最佳实践。

« 看看还有什么好玩意