Other articles


  1. [翻译] 使用 Python C 扩展实现生成器/yield

    原文:Implementing a generator/yield in a Python C extension

    在 Python 中,生成器 (generator) 是一个返回迭代器 (iterator) 对象的函数。虽然有很多方法来实现,不过最优雅和常用的形式是使用 yield 语句。

    举例来说,这是一个简单的例子:

    def pyrevgen(seq):
        for i, elem in enumerate(reversed(seq)):
            yield i, elem
    

    这里的 pyrevgen 函数就是一个生成器。给定一个序列,它将会返回一个迭代器用以逆序输出这个串的元素并附上序号。比如说:

    >>> for i, e in pyrevgen(['a', 'b ...
    read more

    There are comments.

  2. [翻译] 在 Python 中使用模糊匹配根据发音搜索

    原文:Using Fuzzy Matching to Search by Sound with Python

    当你编写代码搜索数据库时,你不能总是依赖于相信所有的数据项都有正确的拼写。DreamHost 的开发者以及《Python 标准库编程范例》(The Python Standard Library by Example) 的作者 Doug Hellmann 在这篇文章中回顾了一些根据目标的发音,而不是准确的拼写,进行数据库搜索的方法。

    在数据库中搜索人名是一项独特的挑战。对于不同来源和不同年代的数据,你不但不能指望其中名字的拼写是正确的,甚至相同的名字如果多次出现时,它们的拼写都不一定一样。而储存的数据和搜索项之间也有可能因为个人喜好、文化差异、同音词、拼写错误、文盲或仅仅因为在某些时期根本没有标准拼法而出现差异。这些问题在历史学家、谱系学家和其他研究者的手写的文本记录中尤为常见。

    一个常用的解决这样的字符串搜索问题的方法是寻找与搜索目标相近的值。但是,使用传统的模糊匹配算法计算两个任意字符串之间的相似度,代价是很大的,同时它也不适合用于搜索大规模数据集。一个更好的解决方案是为数据库里的每一项预先计算一个哈希值,有一些专门的哈希算法正是为此设计的。这些语音算法 ...

    read more

    There are comments.

  3. [翻译] AST 模块:用 Python 修改 Python 代码

    原文:Static Modification of Python With Python: The AST Module

    修改代码在有时会变的十分有用,比如在进行测试和分析的时候。在这篇文章中,我们将看到如何使用 ast 模块对 Python 代码进行修改,同时还将看到一些使用了这个技术的工具。

    CPython 的编译过程

    在开始之前,我们应该先看看 CPython 的编译过程,这个过程在 PEP 339 中有详细的描述。

    当然,在读这篇文章的时候,你并不需要对这个步骤有很深入的理解,不过这可以帮助你对整个过程有一个大体的了解。

    首先,编译器会根据源代码生成一棵语法分析树 (Parse Tree),随后,再根据语法分析树建立抽象语法树 (AST, Abstract Syntax Tree)。从 AST 中可以生成出控制流图 (CFG, Control Flow Graph ...

    read more

    There are comments.

  4. 安装配置 LXR

    专业课学习操作系统,满心欢喜地以为可以是 Linux 代码导读,结果选用了一本八十年代的教材,介绍 UNIX v6 的。于是自己从图书馆借来了内核开发的入门读物《Linux 内核设计与实现》。既然是介绍内核的书,自然少不了代码,但是书中又不可能将每个提到的代码的相关信息全部写出来,这时就得自己去查看代码。查看代码的话,虽然 Linux 的代码可以很容易地得到,但那来看终归有些麻烦,各种调用需要查找半天。于是想起了很有名的一个网站 LXR,Linux 交叉引用。这个网站好是好,就是网络原因速度太慢,于是就想自己装一个。

    先说一句,下面的安装环境都是64位 Gentoo。

    最开始找到了 LXR Cross Referencer 这个项目,一看最后更新时间还挺新,看起来是一直都还在维护的。然后在 Gentoo 的网站上查到 LXR 是可以直接用 portage 安装的,于是安装,安装相关的包,最后放弃了。出于什么原因我也不记得了 ...

    read more

    There are comments.

  5. Gmail 的超级子邮箱功能

    如果你也用 Gmail,他可以让你轻易拥有无限多的子邮箱,发给这些邮箱也就等于发给你的邮箱。这有什么意义呢?很简单,你可以在每个地方注册的时候都使用不同的邮箱,这样当你收到垃圾邮件广告邮件,你就可以知道是从哪里来的了~再结合 Gmail 强大的过滤器,你也可以针对性的进行屏蔽~

    Gmail 事实上支持两种方式来扩张你的邮箱,第一种是在你的用户名后面加上“+”和任意字符串,比如我的邮箱 quanxunzhen@gmail.com(我这邮箱无所谓了已经嗯),如果我想要识别不同的网站,比如豆瓣,我可以直接在豆瓣的注册邮箱里填写 quanxunzhen+douban@gmail.com,所有验证邮件都可以发给我,我如果不想申请一个新邮箱却想注册个豆瓣小号,也可以再写 quanxunzhen+douban2@gmail.com

    当然,支持上面的方式固然是最好的,但遗憾的是很多网站并不支持带加号的邮箱,那就要稍稍麻烦点了。

    根据 @fanzeyi 的说法,Gmail 的邮箱是自动忽略点,也就是“.”的,也就是说对于我上面的邮箱,如果写为 quan ...

    read more

    There are comments.

  6. 增强版的 Bash 提示符

    上周六参加了好久没有参加的的 SHLUG 月聚,恰逢 TualatriX 也带团来上海。自由讨论的时候,我看到 TualatriX 的终端十分色彩斑斓,便询问,他给我们展示了他的 bash 的两个特色功能:1、当上一条命令返回结果不为0时显示返回值并高亮显示提示符;2、自动检测git分支。他说这个在他的博客上都可以找到,今天想起来去找了一下,发现了这篇:史上最强的PS1 | I’m TualatriX,感觉满强大的。

    不过,说实话,我觉的这个还不够完美,原因有二:一是我发觉高亮显示的时候那个配色相当不怎么样,二是我本来就讨厌提示符太长,这样一下就更长了……于是我就想起 ghosTM 的 zsh 里面有一些信息是放在右边的,我想把返回值也扔右边去,并且是右边上移一行。此外,由于很少使用 git,所以检测 git 分支的功能也就不需要了~

    先放一个最终效果图: Bash 提示符的最终效果图

    然后直接写出了我的新的 PS1

    PS1 ...
    read more

    There are comments.

  7. 为 Linux 做一把 USB “钥匙”

    我曾经很早以前就在想,能不能将U盘作为登入我系统的验证机制。当时的想法是,这样比较有趣~不过后来发现另外一个重要的用途就是,防止在众目睽睽之下输入密码……

    这个问题提出后,邮件列表里很快就有人告诉我,Linux 已经有一个现成的机制了,这就是 pam_usb。不过我在网上搜了半晌都没搜到相关的中文资料,前几天弄成了,就写出来供大家参考~

    其实来说,是很简单的。首先,当然,要准备一个U盘~(废话),然后安装 pam_usb。在 Ubuntu 下的话,源里就有,可以输入命令

    sudo apt-get install pamusb-tools
    

    直接安装。当然如果你连终端也懒得打开,可以直接点击这里:安装 pamusb-tools。当然,在后面的步骤中你终归还是要打开终端的,所以还是先开了吧~这个东西目前暂时还没什么图形界面的样子(当然做一个相信也不难)。

    另外,Fedora 源里有 pam_usb 包,Arch ...

    read more

    There are comments.

  8. 半完美解决 zip 文件中中文文件名乱码的问题

    前一段由于收了某个 zip 文件,用 Ubuntu 自带的归档管理器打开,哎呦,那真不是一般的蛋疼……因为里面全是中文文件名,那个乱码啊……

    于是我就下决心要解决这个问题。

    虽然我的系统还在 9.10,但看到网上一篇文章教人如何在 10.04 中解决这个问题,我就了解了,这个问题至今没有解决。那么什么叫做“半完美”呢?大概意思就是说,对我来说差不多完美了,不过还是很可能出问题的……

    命令行方法

    一般的方法是利用命令行的方式:

    LANG=C 7z x xxxx.zip
    convmv -f gbk -t utf8 *
    

    用这个方法,我就写了一个 unzip 的小脚本:

    #! /bin/sh
    LANG=C /usr/lib/p7zip ...
    read more

    There are comments.

  9. 在 tty 里添加一个开机自启动的任务管理器

    每当感觉到系统卡的时候,最好的方法无外乎进入 tty,登入,打开一个 top 监视。可是每次到了需要的时候才去开,打开的效率自然不敢恭维。于是便想,每次开机的时候,记起来就跑到 tty 下面去先开起来。不过这件事情总归是麻烦的,于是才有了现在的方案。

    既然 tty 那么多,那我们就把他利用一下吧~让他开机自动在某个 tty 里面启动 top 无疑最方便了~

    首先呢,我找到了 Ubuntu 里面 tty 配置存放的地方 /etc/init/ttyX.conf,其中的 X 便是 tty 的编号,我这里选择了 tty6.conf。打开这个文件,结构简单极了,看到里面

    exec /sbin/getty -8 ...
    read more

    There are comments.

Page 1 / 2 »

social