在 Python 中使用 GDB 来调试[译文]

大约一年前,我接触了 Java 中的 Btrace 能够不停机查看线上 JVM 运行情况的特性让我艳羡不已。 另外还有强悍的 jStack 和 jConsole 来进行运行期侦测,JVM 的工业级强度果然不是盖的。

当时公司技术方面也遇到了一些瓶颈,一部分原因是 CPython 本身的 IO 模型问题, 另一方面也和早期代码写的极不工整脱不了关系。万般无奈之下,我们用 Jython 推翻重做了主要业务,效果立竿见影,但同时也把真实问题给规避掉了。

在这之后我们在 JVM 的领导下,走上了康庄大道。但我心中始终还有一个梗, 就是想对性能遇到瓶颈的 Python Process 进行线上侦测。 这篇文章就是开始的第一步。

PS:这篇文章理论上是可行的,但是在我机器(Ubuntu 12.04 / 系统自带 Python) 无法正常执行,会爆出 unable to read python frame information 的问题。解决方法我会在下篇文章中写出。这里只是单纯翻译一下原文。

原文可以移步 https://wiki.python.org/moin/DebuggingWithGdb

more ...


如何让 Instagram 在一百多万用户爆炸后稳定运行

原文链接:Keeping Instagram up with over a million new users in twelve hours


这周二我们发布了 Instagram for Android,反响空前强烈。 最近这几周我们一直(在基础设施方面)做负载计划,为所有可能发生的事故做准备。 尽管如此,在发布那天,最大的挑战仍然是如何快速定位问题,找到瓶颈并尽快修复他们。 在这里我们将分享一些帮助我们解决问题的工具和技术。

more ...

KuKu-一个 Weekend Project

一个小小的 Weekend Project,基于 web.py。 代码在 alswl / kuku ,很简陋,属于差不多能用阶段。

Kuku

基于以下原因开发:

  • 想把服务器去 PHP 化,以前的 upload.log4d.com 是基于 PHP 的, 详情请见 使用独立图床子域名
  • 刚买的 Linode VPS,终于从 128MB 内存解放出来了,赶紧放个 Python 程序跑跑。
  • 想些 Python 了,手痒,想看看写这么简单的功能需要多长时间, 弥补上次没能参加黑客马拉松的遗憾。

KuKu 的发音是我家乡话的「看看」。

KuKu 中比较有趣的地方是,用了 Foundation 这个流式 Web 前端框架, 用了 ...

more ...

PyCon 2012 见闻

PyCon 是 Python 领域最著名的技术会议,从 2011 年开始,中国区开始举办自己的 PyCon 大会。这次 PyCon 2012 分成两个场地同时进行,北京和上海, 并且在网上提供同步转播,各地也有组织线下收看的。

PyCon Logo

去年时候我很遗憾的不能跑到上海来参加,现在我人就在上海, 怎能错过 Pythoner 的饕餮大餐呢?早就眼巴巴的买票准备参加了。

more ...

Working with Python subprocess[译文]

8月底到魔都开始新工作,头一个月当然各种忙,都没时间来更新博客。

这篇文章是在写 Btrace 脚本时候查资料看到的, 看着不错就顺手翻译,没想到差点烂在草稿箱出不来啊出不来。 熬了一个月才磨出来,媳妇都快成婆了有木有。

原文链接:Working with Python subprocess - Shells, Processes, Streams, Pipes, Redirects and More


注意

关于「执行命令时候发生了什么」这个问题,可以在 http://en.wikipedia.org/wiki/Redirection_(computing) 找到更多最新信息。这篇文章遵循 GFDL 协议。

在我的上一篇日志中,我写到如何 build a command line interface with sub-commands in Python。 这次我来尝试如何通过 Python 的 subprocess 模块来和命令行指令进行交互。

我想达到的目标是:

  • 查看当你键入命令时究竟发生了什么
  • 如何确认一个命令是否存在并找出到底在哪
  • 通过 Python 或 shell 执行命令
  • 向一个运行中的进程读取 STDOUT 或写入 STDIN
  • 检查进程的退出返回状态
  • 理解 Bash 在命令中断中扮演的角色,并如何将它们发送给程序
more ...

MoinMoin Wiki 转换 Text 脚本

我使用 MoinMoin 作为我的 KMS,具体使用方式可以参考 [使用MoinMoin作为个人KMS][moin-kms]。另外,我将 MoinMoin 的 data 目录链接到 Dropbox 同步目录下面,从而可以备份并查看我的知识库。

我想同步阅读 KMS 数据

想在移动设备阅读 KMS 数据时,我遇到一个麻烦,MoinMoin 使用文件来保存 wiki 数据, 比如「28个Unix.Linux的命令行神器」这篇 wiki 目录在 data/28(e4b8aa)Unix(2e)Linux(e79a84e591bde4bba4e8a18ce7a59ee599a8) 中, 结构如下:

more ...

GAE 编程指南读书笔记

GAE 和我蛮有缘分,我初学 Python 的其中一个原因就是当时 GAE 刚推出, 当时想法是免费的应用要用起来,要不然就浪费了。随后也假模假样的看文档, 就是没有什么产出。

去年写了一个小应用 dbevent2gc , 期间发现 GAE 和普通程序开发的诸多不同,又遭遇 GAE 配额大幅缩水, 写出来的应用运转的不太稳定。在南京图书馆的架上看见这本《GAE 编程指南读书笔记》, 立即借回家仔细阅读。

  • GAE 的简介

    • 运行时环境 Python / Java
    • 数据存储 Datastore(实体 / 查询 / 索引 / 事务)
    • 服务(Memcache / GAccount / 任务队列 / 计划任务)
    • 工具(SDK / appcfg / dev_appserver / 控制台)
    • 入门(安装 / GAccount / webapp / app ...
more ...

在Python中调试代码

撰写程序时候,需要在调试上面花费不少时间,好的调试工具可以让这个过程如虎添翼, 靠打 log 调试会是一种很痛苦的过程,我总结一下 Pylons 开发的调试技巧。

吐槽:团队开发时候,每个成员需要学习、总结和分享各自的开发技巧, 这样才能自我提升并提高开发效率。这属于团队文化建设,开发是一种艺术创造过程, 绝对不是简单的复制和粘帖。

在 Python 中调试

pdb

在代码中加入下列语句即可启用交互式调试。

import pdb;pdb.set_trace()

在 pdb 中,可以使用 h / l / b / n / s / c / j / a / p / ! / q 这些命令所代表的含义可以通过 h(elp) 打印出来。

参考链接:

ipdb

比 pdb 更好用的是 ...

more ...

给MoinMoin写插件

1. 使用 MoinMoin

前些日子,我写了一篇使用MoinMoin作为个人KMS 大赞MoinMoin的各种好处。MoinMoin的其中一个好处是基于GPL的开源, 我们可以方便的给MoinMoin撰写自己的插件(当然也可以去官方的wiki上获取大量现成插件)。

我在使用MoinMoin过程中,有一个急迫需要的功能:

保存一篇网页时候,要将里面的图片保存到本地,而不是使用外链接方式保存, 因为由于各种不可预测的原因,原始图片数据很有可能丢失或者无法连接。

这个功能对于将Wiki产品转化为KMS应用非常需要,可惜MoinMoin官方并没有提供, 我也没在MoinMoin的开发者插件库中找到类似功能,就自己写了一个插件image2attach。

现在我分享一下如何写MoinMoin插件,技术大牛可以直接移步官方开发文档, 我这里只是写一些简单的内容,帮助像我一样的同学。

以下内容需要Python编程基础~

2. MoinMoin 系统结构

MoinMoin的UML图:

MoinMoin

3. MoinMoin 常用对象

3.1. request

这个request和普通jsp/asp中request很类似(实际上这个request就是继承 werkzeug的Request)。

除了正常的web request功能,Moin的request还带了Wiki自身的信息 ...

more ...