Other articles


  1. 2013年新首页

    由于之前跟其他人一起合租的一个虚拟主机空间很快就要到期了,而我的域名 upsuper.org 一直停靠在那上面,没有迁移到自己后来买的 VPS 上,于是今天决定把域名指过去。之前已经花了一番功夫把博客里面的大把文章转移到了这个 GitHub 上面的新博客里,剩下的主要就是首页了。

    当年做的首页很久没有维护了,有一些链接甚至应该已经是死链了。而现在感觉能放上去的链接实在太少了,不好保留原来的样式,所以就新做了一个。既然重新做,这自然又是练手的好时机,一面看看自己(自我感觉良好)的设计,一面学习学习那些新的技术。

    之前在做 white 这个应用的时候,就研究过 CSS3 里许多有趣的东西,其中不少就被我用在了这次做新首页上。

    设计

    参考了 Reeoo 网站里面的一些设计之后,脑中大概形成了新首页的设计:中间照旧地放上标志性的 Logo,旁边将链接围成一圈,然后绕着中心旋转;作为平衡,在链接圈外加一圈逆向旋转的虚线;鼠标放到链接上时停止旋转,并且呈现某种与所指链接有关的效果。

    以最近所活跃的网站作为链接选择的标准,最后选择了这个博客Twitter 页面GitHub ...

    read more

    There are comments.

  2. HTTPS 与服务器名

    一直以来都觉得用 HTTPS 的话,所有传输的信息都是密文传输的。正是因为如此,用 hosts 配合 HTTPS 来绕过墙访问一些敏感网站一直是一种看过去天衣无缝的完美方法:所有的程序都不需要修改,不需要知道如何使用代理,只要照常使用就可以了。唯一的缺陷是,hosts 的地址可能不时会失效,需要更换。而这唯一的缺陷,还可以用私设反向代理来解决。完美,毫无破绽。

    提问

    可当我对安全协议有一些了解之后,发现这件事情并没有那么简单。HTTPS 只是简单地将 HTTP 协议包裹进了 SSL/TLS,作为它们的应用数据。而 SSL/TLS 的协议流程,简单地来说可以分为握手和交换数据两大部分。而 HTTP 的数据,作为应用数据,显然是在交换数据阶段进行传送的,换句话说,握手这件事情,应该跟 HTTP 协议里的东西没有半毛钱关系。毕竟,握手的大多数内容都可以被认为是明文进行的嘛,如果握手的内容里有 HTTP ...

    read more

    There are comments.

  3. 在 GitHub 上建一个新的博客

    一直想着将技术向博客迁移到 GitHub Pages 上,觉得这样大概可以使我显得更 Geek 一点吧?不过呢,因为一直以来各种事情很多,所以一直没有去做。(其实跟事情多也没什么关系吧,看看你自己都多久没写博客了……)最近看到之前买的虚拟空间快要到期了,因为不怎么打算继续续下去了,所以估量着把里面的东西迁移出来。另一方面,末日的2012过去了,新世界2013年到来了,顺便也就盘算着重新开始写博客?不过果然还是觉得有点麻烦呢……

    既然是将这里定位于技术向的博客的话,自然除了关于这个博客本身的事情以外,其他都是技术讨论了。我其实也一直想把技术之外的一些内容单独放在一个博客里,只不过因为太懒了也是一直没去建的,估计在短时间内也不会去做吧,现在都没什么写东西的激情了呢。

    这个博客的标题“鬼の领地”是延续自之前的博客的,它取自我中二的年代,正如我的常用 ID upsuper 一样。同时与之前我的每一个博客一样,我会把过去的内容挑选一些放入新的博客里面。另外原来参与 @fanzeyi 同学的 PyCodersCN 项目的时候翻译过的一些文章也准备放进来。因为实在懒于写自己的东西(大多只是一些小东西,就不想单独写文章了),所以也考虑不定期的译一些自己觉得不错的文章放在这个博客里,就当练练中英文水平好了(其实是为了充数吧)。

    关于这个博客本身,目前是准备使用 ...

    read more

    There are comments.

  4. [翻译] 使用 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.

  5. [翻译] 探索 Python 代码对象

    原文:Exploring Python Code Objects

    由于受到 David BeazleyPyCon 上的 Keynote 的启发,近来我四处学习与 Python 代码对象 (code object) 相关的内容。我并没有什么特别的利器,也没有专门的任务去解决 (至今为止?),所以请将这篇文章看做一些也许有趣的记录和随笔 (如果没意思的话,抱歉)。

    免责声明:这篇文章是关于 CPython 2.7 的,虽然其中的大部分对于其他的 CPython 版本应该也是正确的 (包括 3.x)。但我不保证它在 PyPy、Jython、IronPython 等实现上是正确和适用的。

    第0步:是什么?

    所以首先,代码对象是什么呢?许多人 (特别是仇视 Python 的人 ...

    read more

    There are comments.

  6. [翻译] Python 内部:可调用对象是如何工作的

    原文:Python internals: how callables work

    【这篇文章所描述的 Python 版本是 3.x,更确切地说,是 CPython 3.3 alpha。】

    在 Python 中,可调用对象 (callable) 的概念是十分基本的。当我们说什么东西是“可调用的”,马上可以联想到的显而易见的答案便是函数。无论是用户定义的函数 (你所编写的) 还是内置的函数 (经常是在 CPython 解析器内由 C 实现的),他们总是用来被调用的,不是么?

    当然,还有方法也可以调用,但他们仅仅是被限制在对象中的特殊函数而已,没什么有趣的地方。还有什么可以被调用呢?你可能知道,也可能不知道,只要一个对象所属的类定义了 __call__ 魔术方法,它也是可以被调用的。所以对象可以像函数那样使用。再深入思考一点,类也是可以被调用的 ...

    read more

    There are comments.

  7. [翻译] 在 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.

  8. [翻译] 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.

  9. 动态切换 Linux 使用的 CPU 数量

    由于要测试一些代码,其运行结果会受到多核并行的影响,所以希望能够调整使用的 CPU 数量。网络上之前看到的方法是在内核的启动参数上添加一个 maxcpus,但是如果这样的话每切换一次都要重启一次,是在太麻烦了。想想 Linux 应该是很强大的,所以可以动态修改 CPU 数量才对。

    无意中看到 Linux 代码的 Documentation 文件夹下有个文件叫做 cpu-hotplug.txt,于是就看了一下,发现可以在 /sys/devices/system/cpu 看到代表各 CPU 的文件夹按照 cpuX 的命名方式,如 cpu0cpu1cpu2 等。这些文件夹里面有一个 online 文件,如果其值为0则禁用该 CPU,如果为1则启用该 CPU。注意,这里需要 root 权限哦。

    因为我只要在单核和多核之间切换 ...

    read more

    There are comments.

Page 1 / 3 »

social