我喜欢用命令行做一些事情,写一篇文章,发布到这个博客,也是一样。最好的方法应该能够使用文本编辑器写好,然后从命令行直接发布,比如
[plain light=”true”]
blog hello.txt
blog -m hello.txt
blog -d post_id
[/plain]
-m 是修改,-d是删除,这样就方便多了

wordpress的设置中有个Remote Publishing项,支持atom publishing protocol和xml-rpc,我对atom不太熟悉,不过xml-rpc以前用过,便想试一试,python很适合这种实验性质的程序。wordpresss是用xmlrpc.php文件支持远程调用的,看了看这个文件,在客户端写了几个脚本尝试一下,感觉挺简单的,就写了下面段代码,丑是丑了点儿,不过能满足我的需求就够了。
[python]
import sys;
import xmlrpclib;

class Blog:
"""just a simple interface for xmlrpc call"""
def __init__(self,url,name,pwd):
self.name = name;
self.pwd = pwd;
self.sv = xmlrpclib.ServerProxy(url);
def newPost(self, cont):
self.sv.metaWeblog.newPost(1, self.name, self.pwd, cont, True);
def editPost(self, pid, newpost):
self.sv.metaWeblog.editPost(pid, self.name, self.pwd, newpost, True);
def delPost(self, pid):
self.sv.metaWeblog.deletePost(0, pid, self.name, self.pwd, True);

def parse_content(ct):
bcont = {};
ct = ct.decode("gbk");
head,cont = ct.split("nn",1);
for line in head.split("n"):
k,v = line.split(":");
if k.startswith("categories"):
bcont[k] = v.split(",");
else:
bcont[k] = v;
bcont["description"] = cont;
return bcont;

def new_from_commandline(b):
ct = sys.stdin.read();
return b.newPost(parse_content(ct));
def new_from_file(b,fname):
ct = open(fname).read();
return b.newPost(parse_content(ct));

def modify_from_commandline(b,pid):
ct = sys.stdin.read();
return b.editPost(pid, parse_content(ct));

def modify_from_file(b, pid, fname):
ct = open(fname).read();
return b.editPost(pid, parse_content(ct));

def delete_post(b,pid):
b.delPost(pid);

def main():
b = Blog("http://localhost/wordpress/xmlrpc.php","username","password");
if len(sys.argv)==1:
new_from_commandline(b);
elif len(sys.argv)==2 and not sys.argv[1].startswith("-"):
new_from_file(b,sys.argv[1]);
elif len(sys.argv)==3:
if sys.argv[1].startswith("-m"):
modify_from_commandline(b,int(sys.argv[2]));
elif sys.argv[1].startswith("-d"):
delete_post(b,int(sys.argv[2]));
elif len(sys.argv)==4:
modify_from_file(b,int(sys.argv[2]),sys.argv[3]);

if __name__ == ‘__main__’:
main();

[/python]
现在很喜欢python,给人一种优雅简约的感觉,心里想什么,顺手就能写出来。

对程序员来说,代码加亮的需求很迫切。心想既然wordpress这么成熟了,肯定会有语法加亮的模块,于是便google了一把,果不出所料,找到了一个叫SyntaxHighlighter Evolved的插件,在本地机器上试了试,貌似用起来还不错,便装了上来。

服务器好像不支持php直接写文件,安装的时候,wordpress提示填入ftp账户,proceed就成功了,不过要这样的话,图片不知道能不能上传。

下面放几段代码测试一下

C语言

[c highlight=”4″]
#include <stdio.h>
int main()
{
printf("hello worldn");
return 0;
}
[/c]

perl

[perl]
while(<>){
s/^/hello world/g;
print;
}
[/perl]

貌似支持的语言不少,可惜的是,没有lua和mathematica,而这两种语言我恰好还经常使用~

google了一下,找到了mathematica语法的.js文件,我想,也许直接拷到相应的文件夹就行了吧,找了找,里面有一个third-party-brushes的文件夹,拷了过去,居然不行,看了看里面的readme文件,给出了一个怎么添加new brush的链接,懒得仔细看了,改天有空再搞搞吧。

Bezier曲线很常用,一般2D绘图软件里都有。比如photoshop,flash之类。
它背后的原理简单的超乎想象,体现了数学的美妙。

先从简单的开始,两个点之间进行线性插值。


很容易理解,可以得到

[latex] B(t)=P_0+t(P_1-P_0)=(1-t)P_0+tP_1,tin[0,1] [/latex]

当然这是最简单的情形,如果扩展到三个点该如何插值呢?


从上面图片上可以看到,可以分成三步,从P0到P1进行上面的一维情形,得到点Q0,再从P1到P2,得到Q1,那么就有

[latex]Q_0=(1-t)P_0+tP_1[/latex]
[latex]Q_1=(1-t)P_1+tP_2[/latex]

然后再对Q0和Q1进行线性插值,得到点B

[latex]B=(1-t)Q_0+tQ_1=(1-t)^2P_0+2t(1-t)P_1+t^2P_2[/latex]

t从0到1增加,就得到了一条曲线,如下图


同样可以推广到四个点的情形,这样的曲线中,t的最高幂是三次。三次样条曲线用的最多,因为它提供了足够的可控制性和满足大部分场合的精度,同时又保持了相对的简单。
依照上面的方法,可以得到三次的情形

[latex]B(t)=(1-t)^3P_0+3(1-t)^2tP_1+3(1-t)t^2P_2+t^3P_3,tin[0,1][/latex]

这个时候可以注意到Pi点前面的系数,是不是似曾相识?没错,就是二项式公式。可以看成是相应次幂的[latex](1-t+t)^n[/latex]的展开。这个系数叫做Bernstein多项式。

最常用的三次曲线如下图,其中中间的两个就是控制点,在一些绘图软件里用钢笔拖出来的两条调整曲线形状的直线,就是调节中间两个点的位置。


推广到任意中n的情况

[latex size=”2″]B(t)=sum_{i=0}^{n}{binom{n}{i}(1-t)^{n-i}t^iP_i}[/latex]

[latex size=”1″]=(1-t)^nP_0+binom{n}{1}(1-t)^{n-1}tP_1+..+t^nP_n,tin[0,1][/latex]

不过n大于3的时候就很少用了,除非在一些要求比较高的场合,比如飞机汽车线形的设计。

更多的资料,可以看这里
http://en.wikipedia.org/wiki/B%C3%A9zier_curve

今天又想来mathmetica来了,本来是懒得拿笔推导一个比较繁琐的公式,结果一不小心玩上瘾了,一天基本上都在搞这个软件。

呵呵,不说了,放张图片吧

前几天在图书馆找些数学方面的书看,很自然的导致了我用一些数学软件之类的想法。以前maple和matlab用过一些,在wikipedia上看了篇对比介绍的文章,又下了几个,今天挨个试了试。

先是一个叫做Euler的开源软件,界面简约实用,功能还行吧,用起来还是比较顺手的,不过功能稍微弱了一点。

mathematica应该算是一个比较重量级的吧,不过我以前没有使用过,今天装上试了一下。符号运算能力挺强的,它的notebook界面让我觉得很爽很专业,特别是在当中在plot几幅图,跟公式夹杂在一起,就像一篇排好版的论文一样。

又翻出maple装了上来,记得我大一刚接触它的时候,唏嘘不已,强大的符号运算能力让我对计算机能做的事情感到惊讶,不过现在再用也没什么感觉了。

没想到,看了一下今天的日期,三月十四号,Pi,呵呵,太巧了~~~

我常常低估解决一个问题需要的时间,大致看一眼问题,规划一下思路,然后考虑考虑是否可行,凭感觉给出一个时间。

可能对于熟悉的或者解决过的问题,这样子估计的误差不是太大。一旦遇到未知的领域,结果却是谬之千里。

当解决未知问题的时候,在纸上勾画出大致的算法是一种情形,一行行代码敲进去的时候,往往会变成另外的情形。大量的细节性的问题没有考虑周全。有时认为困难的地方,反倒是最简单的。那些认为无足轻重的枝枝叶叶,形成一股极大的阻力,缠绕在四肢,降低前进的步伐。

周四吧,吃过晚饭之后,突然想写一个程序匹配正则表达式。没有任何外加原因,我自己都奇怪,仿佛上帝说,你写个那样的程序吧。

于是我就动手开始了,心想看起来不太难,一个晚上搞定吧。

先是写了二百行左右的代码,最后发现整个思路都有问题,第二天又重新开始写,写了又改,改了又写。最后大致剩三四百行。

一开始我试图直接从正则表达式构造一个dfa,也就是第一天晚上的想法,后来发现太困难放弃了。又看了看书,也就是那本dragon book。周五一天,完成了从正则表达式到nfa的程序。表面上看使用Thompson构造法似乎很容易就能得到结果了,但我低估了实现数据结构表示形式以及操作等细节实现的复杂度。再加上一大部分调试的时间,磨蹭了一天才完成。

昨天跟一个同学出去打台球了,晚上回来看了部电影,没写程序。

今天又折腾了一天,主要是将nfa转换成dfa,也就是那个很简单的子集构造算法,描述起来是很简单的,感觉也不复杂。可我慢慢腾腾的花了一天才搞定。九点钟的时候,得到了一个还算满意的结果。

完成的时候,心情挺不错。似乎费心力的那么长的时间不算什么。也许大部分人都是这样子,在完成一件事情之后,忽略掉为完成它而付出的努力。

很多时候,不单是程序,通常生活中也常常低估事情的复杂性,人的力量,凭感觉似乎能做很多事情,其实一段时间之内,真正能做好的,也就那么一两件而已。