Turtleblog

2012年7月15日 19:29

Wordpress 已经 out 了,现在流行什么?静态博客。
Turtleblog 便是一个自用的静态博客生成器。基本上是模仿 Armin Ronacher 博客的样式。

  • 单 python 脚本,200 行。再加一个基于 bottle 的十几行的用于本地测试的服务器脚本。
  • 实现基于 markdown 的博客,支持图片,代码,Tex 公式。
  • 实现文章标签和 RSS 输出。
  • 使用 Python-markdown 和 Pygments 进行基本渲染。
  • 使用 Jinja2 模板引擎。
  • 使用 Disqus 作为评论服务。
  • 使用 Json 文件保存配置。
  • 可以方便的搭建在 Github Pages 上。

demo:scturtle.github.com (RSS暂时停止,确定没有什么 Bug 了再开)

新 blog: scturtle.me

评论(3) 阅读(2375)

python3 的语法变化

2012年7月06日 23:30

Blog显示效果不好请移步 gist orz.

评论(0) 阅读(2393)

There we were

2012年6月30日 23:11

本来想的很多,也想详细的记下所有想法,无奈笔拙罢了,该记得的自然会记住,该忘的不如就忘了吧。

《此间的少年》的英文名是“There They Were”,感觉真心好。于是借用一下,就谨以此标题纪念刚刚逝去的大学生活吧。

评论(0) 阅读(1441)

下载 60-Second Science 小工具

2012年6月22日 10:35

Scientific American 有一个 Podcast 栏目 60-Second Science,每天一个 60 秒的科技新闻。语速很快,词汇丰富,是练习英语听力的好东西。

老早学英语时想,要是能在 iPad 歌词界面直接看原文就好了。昨天看到有人推荐 60-Second Science 就又想起来了,遂有如此一个小工具,输入一篇文章的网页地址,自动下载 MP3 并爬出文章内容加入 MP3。心血来潮还拿 Tk 做了个界面,加了个下载进度条。这一周的 blog 于是就混出来了……

gist

评论(2) 阅读(2480)

不定义函数实现递归(python)

2012年6月17日 10:15

不定义函数?那么我们就无法重复利用自身的代码了吗?不,自动机理论中的递归原理的引理告诉我们,一个函数可以得到其自身(读取源文件这种方法无视之),只需要这么做:

A = r'''B = "A = r\'''" + A + "\'''\n" + A
print B'''
B = "A = r\'''" + A + "\'''\n" + A
print B

原理就是分两步,运行时先写下来接下来要做什么(A),然后接下来根据刚才写的就构造出前面和后来都要做些什么,既是整个源程序了。构造过程相反,因为接下来这个过程是确定的,所以先写出接下来,再反填回A。

wr 给的这个链接里的许多程序就是这个原理,虽然比我这个短,但是我这个的好处是接下来这个过程可以随便写,反填时还保持原格式,下面我们利用这个特点实现一个不定义函数的递归程序。

得到程序自身后,当然需要再次运行它,我们利用 exec 这个相当于通用图灵机的函数。因为 exec 默认使用和修改当前的全局和本地变量,所以我们给他加一个虚拟环境 env。这个计算阶乘的程序如下:

A = r'''
B = "A = r\'''" + A + "\'''\n" + A
n = 10
if n == 1:
    ans = 1
else:
    B = B.replace('n = '+str(n),'n = '+str(n-1),2)
    env = {}
    exec(B,env)
    ans = n * env['ans']
print ans
'''
B = "A = r\'''" + A + "\'''\n" + A
n = 10
if n == 1:
    ans = 1
else:
    B = B.replace('n = '+str(n),'n = '+str(n-1),2)
    env = {}
    exec(B,env)
    ans = n * env['ans']
print ans

其实在我想出来虚拟一个环境之前,我是实现的下面这个代码。和上面不同的是,由于修改了当前变量,所以无法保存之前的状态(比如 n)。咦?!这不就是尾递归吗?所以就按照尾递归的思路实现了,把 ans 当做变量传下去,如果你做过 SICP 的话,对这种写法应该不陌生。

A = r'''
B = "A = r\'''" + A + "\'''\n" + A
ans = 1
n = 10
if n > 1:
    B = B.replace('ans = '+str(ans),'ans = '+str(ans*n),2)
    B = B.replace('n = '+str(n),'n = '+str(n-1),2)
    exec(B)
print ans
'''
B = "A = r\'''" + A + "\'''\n" + A
ans = 1
n = 10
if n > 1:
    B = B.replace('ans = '+str(ans),'ans = '+str(ans*n),2)
    B = B.replace('n = '+str(n),'n = '+str(n-1),2)
    exec(B)
print ans

不知道看完本文的你是感到有些蛋疼菊紧呢,还是感到仿佛触碰到了计算机科学的灵魂……

PS: 本文奇葩代码貌似可秒杀多数代码高亮程序,包括 vim,iPython 和本 blog 用的 SyntaxHighlighter,前两者只有一点儿错,可以拷进去看。

评论(5) 阅读(3216)