用Dropbox搭配MoinMoin建立个人的Wiki
什么是MoinMoin
MoinMoin是一个基于python的wiki程序,有一个可利用的特点是不用数据库,所有数据都是文本。
它的desktop版本安装和介绍如下:
http://moinmo.in/DesktopEdition
什么是Dropbox
Dropbox是一个好用的文件备份和共享工具,现在有for win,mac和linux版本。它的用法是在系统中建立一个共享文件夹。你对这个文件夹的所有修改都会被同步到Dropbox提供的网络空间上,这个同 步的过程是自动的,不需要用户插手。现在Dropbox给初级用户的空间是2G。
https://www.dropbox.com/
怎么用?
简单的说,就是利用Dropbox的文件同步功能,将moinmoin的数据文件放到Dropbox共享文件夹中,以实现多台机器上的moinmoin DeskTop共享同一个数据源的目的。
实现起来也很简单,moinmoin的配置文件wikiconfig.py中,直接将data_dir,data_underlay_dir两个参数修改为Dropbox的共享文件夹即可。

这样,当你在一台机器上修改了你的wiki之后,本机的Dropbox共享文件夹先被修改,然后这个修改会被即时同步到Dropbox上,之后其它所有共享了这个文件夹的机器上的相应文件就会同时修改。于是在那台机器上打开wiki,就可以看到最新的修改了。
Dropbox 本身是一个非常好的同步工具。所有跟文件相关的东西都可以同步,比如firefox的profile文件夹,使用这样方法,同样可以实现不同机器上的 firefox配置同步的问题。比如同步书签,当然,firefox有delicious.com和Xmarks可用,但是由于众所周知的原因,它们并不 是什么时候都可以访问的。
[pil-handbook翻译]使用指南-5
更多图像载入方法 为了叙述的方便,Image模块里的open函数经常被用来打开像文件。在多数情况下,你只需要传给它一个文件名作为参数即可:
im = Image.open("lena.ppm")
如果一切顺利,返回的是一个Image实例,否则,将会引起一枚IOError异常。
你也可以用一个类文件的实列来代替文件名。这个实例必须实现read, seek 和tell方法,并以binary模式打开.
从一个打开的文件流读取:
fp = open("lena.ppm", "rb")
im = Image.open(fp)
从一个字节流数据读取图像,使用StringIO类 :
从一个字节流读取:
import StringIO im = Image.open(StringIO.StringIO(buffer))
注意,图像库可以在读取图像文件头之前就回朔图像(使用seek(0)),另外,seek也可以用于那些已经被读取的(使用load的方法)图像。如果图像被包含在一个大文件中,比如tar包,你可以使用ContainerIO或TarIO来读取它。
从一个TAR包读取
import TarIO
fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")
im = Image.open(fp)
控制编码
一些编码器允读你在读入图像之后对它进行操作。这个特性通常用于创建缩略图(效率高于图像质量)和使用单色激光打印机(仅需要一个灰度图)时.
draft方法操作的是一个打开而未载入的图像,因此它只能提供尽可能接近给定的模式和大小的结果。它是通过重新配置图像编码来完成这一功能的。
用drft模式读取:
im = Image.open(file)
print "original =", im.mode, im.size
im.draft("L", (100, 100))
print "draft =", im.mode, im.size
打印出的信息大概是这样:
original = RGB (512, 512) draft = L (128, 128)
请注意,这里的结果图像并没有跟给定的模式与大小完全吻合。如果要确定结果不大于给定的大小,需使用thumbnail方法.
注:后面是一些概念和库说明什么的,没啥好翻 翻译到此为此
[pil-handbook翻译]使用指南-4
图像序列(动画)
PIL包含对图像序列(也叫动画格式)的基本支持。所支持的序列图格式包括FLI/FLC, GIF和一部分还在试验中的格式。TIFF同样可以包含超过一帧的图像。
当你打开一个图像序列文件,PIL自动载入这个序列的第一帧。
你可以使用seek和tell方法在不同的帧之间移动:
Example: Reading sequences
import Image
im = Image.open(”animation.gif”)
im.seek(1) # skip to the second frame
try:
while 1:
im.seek(im.tell()+1)
# do something to im
except EOFError:
pass # end of sequence
如这个例子所示,当序列结束时你将得到一个EOFError异常。
注意,在当前库版本中的大部分方法都只允许你称动到下一帧(如上面的例子所示)。如果要回溯图像,你可以重新打开.
下面这个iterator类使你可以用for语名来循环图像序列:
Example: A sequence iterator class
class ImageSequence:
def __init__(self, im):
self.im = im
def __getitem__(self, ix):
try:
if ix:
self.im.seek(ix)
return self.im
except EOFError:
raise IndexError # end of sequence
for frame in ImageSequence(im):
# …do something to frame…
Postscript 打印
The Python Imaging Library includes functions toprint images, text and graphics on
Postscript printers. Here’s a simple example:
PIL包含在Postscript 打印机上打印图像,文本和图型所需的函数,以下是简单例子:
Example: Drawing Postscript
import Image
import PSDraw
im = Image.open(”lena.ppm”)
title = “lena”
box = (1*72, 2*72, 7*72, 10*72) # in points
ps = PSDraw.PSDraw() # default is sys.stdout
ps.begin_document(title)
# draw the image (75 dpi)
ps.image(box, im, 75)
ps.rectangle(box)
# draw centered title
ps.setfont(”HelveticaNarrow-Bold”, 36)
w, h, b = ps.textsize(title)
ps.text((4*72-w/2, 1*72-h), title)
ps.end_document()
[pil-handbook翻译]指用指南-3
颜色转换
使用convert函数,PIL让你可以在不同的图像模式之间转换。
Example: 转换模式
im = Image.open(”lena.ppm”).convert(”L”)
图像库支持所有图像模式到 “L”和”RGB”模式之间的转换。如果需要在其它两种模式之间转化,你可以使用一个中间图像(一般是一枚”RGB”图像)
图像增强
PIL提供了许多方法和模块来支持图像增强。
滤镜
ImageFilter模块预置了一系列图像增强滤镜与filter方法一起使用。
Example: 应用滤镜
import ImageFilter
out = im.filter(ImageFilter.DETAIL)
象素操作
point方法可以用来改变一个图像象素点的值。(例,图像对比操作)。在大多数情况下,一个函数需要一个参数来运行。
每个象素都可以依照以下函数进行处理:
Example: Applying point transforms
# multiply each pixel by 1.2
out = im.point(lambda i: i * 1.2)
使用上述技术,你可以快速地在一枚图像上应用任何表达式。你也可以综合使用point和paste方法来选择性地修改一枚图像:
Example: 处理单个颜色通道
# split the image into individual bands
source = im.split()
R, G, B = 0, 1, 2
# select regions where red is less than 100
mask = source[R].point(lambda i: i 100 and 255)
# process the green band
out = source[G].point(lambda i: i * 0.7)
# paste the processed band back, but only where red was 100
source[G].paste(out, None, mask)
# build a new multiband image
im = Image.merge(im.mode, source)
注意创建蒙版(mask)的句法:
imout = im.point(lambda i: expression and 255)
Python只是判断决定可输出结果的那部分逻辑表达式,返回值则是expression的结果。所以,如果上列的expression结果是false(0),python将不再查看第二个操作数,而直接返回0,否则,返回255。
(有点像短路判断,只要运行的部份已足以决定结果了,那么剩下的部分就不看)
增强
更高级的图像增强,使用ImageEnhance module中的类.
一旦由图像创建出实例,一个enhancement对象可以很快速地试验各种不同设定。
你可以用这种方式调整图像的对比度,亮度,色平衡和锐度:
Example: Enhancing images
import ImageEnhance
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show(”30% more contrast”)
[pil-handbook翻译]使用指南-2
剪切,粘贴与合并图像
Image类所包含的方法可以让你对图像的某个区域进行操作。取到图像的一个子区,可以使用crop方法。
Example: 从图像中复制一小框
box = (100, 100, 400, 400)
region = im.crop(box)
这个区域以一个四元组定义,其坐标表示为(左,上,右,下).PIL使用一个以(0,0)代表左上角的坐标系统。同时也要注意坐标指向的位置是以像素标识,所以在上面这个例子中的区域刚好是300×300像素。
现在,这个图区可以做一些处理然后粘贴回去。
Example: 处理一个子区,再贴回去
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
当粘贴一个区域时,该区域的大小必须与给定的大小吻合,另外,粘贴区也不能延展到图像外面。但是,原始图像和粘贴区域的格式并不需要一致。如果它们不一致,粘贴域会自动进行转化。(在下方的颜色转换部分会有详细讨论)
这里是另一个例子
Example: Rolling an image
def roll(image, delta):
“Roll an image sideways”
xsize, ysize = image.size
delta = delta % xsize
if delta == 0: return image
part1 = image.crop((0, 0, delta, ysize))
part2 = image.crop((delta, 0, xsize, ysize))
image.paste(part2, (0, 0, xsize-delta, ysize))
image.paste(part1, (xsize-delta, 0, xsize, ysize))
return image
更进一步,使用一个可选参数,paste方法也可以实现透明蒙版效果。在这个蒙版中,值255表示这个粘贴图像在该位置完全不透明,值0意味着粘贴图像是完全透明的,而这之间的值则表示不同的透明度。
PIL 也使你可以操作一个多道道图像的单个颜色通道。比如一个RGB图像。split方法创建一个新的图像集,其中每一个图像包含量原始图像的一个颜色通道。 merge方法使用两个参数,一个是模式,一个是图像组,将图像组重新组成合一个新的图像。下面这个例子将三个颜色通道合成一个RGB图像:
Example: 分割和合并颜色通道
r, g, b = im.split()
im = Image.merge(”RGB”, (b, g, r))
几何变换
图像库提供方法来缩放和旋转图像。前者需要以二元组的方式提供新的尺寸参数,后者则需要一个逆时针方向的角度。
Example: 简单几何变换。
out = im.resize((128, 128))
out = im.rotate(45) # degrees counter-clockwise
将一枚图像旋转90度,既可以使用rotate方法,也可以使用transpose方法,后者同时也可以用于将一枚图像沿着它作重直或水平旋转。
Example: 变换一坨图像
out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
使用transpose(ROTATE),或选用相应的rotate操作,在结果和显示上并无不同。
更通用的图像变换方式可以使用transform方法。在后面的reference可以找到相关细节。
[pil-handbook翻译]使用指南-1
使用Image类
在PIL中最重要的类就是Image类,它在模块中以相同的名称定义。你可以用多种方式创建该类的实例:包括从文件中载放图像,处理其它图像所得,及从草稿中创建图像。
从文件中裁入图像,使用Imag模块中的open函数。
>>> import Image
>>> im = Image.open(”lena.ppm”)
如果成功,函数返回一个Image对象。现在,你可以使用实例属性来检视文件内容了。
>>> print im.format, im.size, im.mode
PPM (512, 512) RGB
format 属性标识出图像的类别,如果图像并不是从文件中读取,它的值会被设为None.size属性是一个二元组,内容包括图像的高和宽(以像素为单 位).mode属性定了的图像颜色通道数量及名字,同时也包括像素类型和深度.常见的模式比如”L”(luminance)代表灰度图,”RGB”是真彩色图像, 而”CMYK”则是打印图像.
如果打开失败,则抛出IOError异常.
一旦创建了一枚Image类的实例,你就可以使用这个类所定义的方法来处理和操作图像.举列来说,显示这一图像:
>>> im.show()
(标准版本的show并不是非常有效率,因为先将图像保存为临时文件,然后调用xv来显示它.如果你没有安装xv,它甚至可能无法使用.不过当它可用的时候,还是能够非常方便地调试与测试.)
–译注,xv是Unix下的一个看图工具,在windows是,应该是调用系统默认的工具打开图像.
接下来的部分,我们给出这个库中的一些不同函数的总览.
读写图像
PIL支持大范围的图像格式.从硬盘中读取图像,使用Image模块中的open函数.你不需要在打开文件的时候给出文件类型.图像库自动根据文件内容来决定格式.
保存一枚图像,使用Image模块中的save函数.在保存图像的时候,文件名就像得很重要了.除非你指定格式,否则图像库使用文件扩展名来确定文件所用的存储格式.
Example: 将图像转化为JPEG
import os, sys
import Image
for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + “.jpg”
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print “cannot convert”, infile
可以稍微花时间讨论一下显示指定文件格式时的save方法.如果你使用一个非标准的扩展名,就必须始终以这种方式指定文件格式:
Example: 创建JPEG图像的缩略图
import os, sys
import Image
for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + “.thumbnail”
if infile != outfile:
try:
im = Image.open(infile)
im.thumbnail((128, 128))
im.save(outfile, “JPEG”)
except IOError:
print “cannot create thumbnail for”, infile
若非真有必要,图像库并不会去解码或载入栅格数据,注意这一点很重要.当你打开一个图像文件,读取文件头就得了文件的格式,压缩模式,大小和其它解码该文件所需要的属性.但文件的其它部分则要稍后处理.
这意味着打开一枚图像是一个非常快速的操作,它与图像的大小及压缩方式都没有关系.这里是快速查看一堆图像属性的简单脚本:
Example:打印图像属性
import sys
import Image
for infile in sys.argv[1:]:
try:
im = Image.open(infile)
print infile, im.format, “%dx%d” % im.size, im.mode
except IOError:
pass
[pil-handbook翻译]Python Imaging Library 概览
简介
Python Imaging Library为您的python程序添加有图像处理能力的接口。
这个库提供扩展文件格式支持——一种高效的扩展方式——和相当强大的图像处理能力。
核心图像库是为快速访问一些基本像素格式图像设计的。它能为普通图像处理工具提供一个可靠的基础。
让我们来看一个这个库的可能应用:
图像归档
针对于图像归档和批处理,Python Imaging Library是理想的程序。你可以用这个库来创建缩略呼,转化图像格工,打印图片等等。
Python Imaging Library的最新版本可以识别并读取多数图像格式。保存时则有意地限制为最常用的交流和发布格式。
图像显示
最新发布版本包含Tk PhotoImage and BitmapImage 接口,Windows DIB 接口也可以随着PythonWin一起使用。而对了X 和Mac系统的显示,您可以使用Jack Jansen的图像库。
调试版本(可能指非release版本)中,于Unix版本也提供show方法调用xv来显示图像。
图像处理
图像库包含一些基本的图像处理函数,包括像素操作,一系列内置convolution kernel的滤镜和颜色空间变换。
同时也提供图像缩放,旋转和任意几何变换的支持。
提供histogram方法使您可以输出对某个图像的一些统计信息。这可以用于自动对比增强和全局统计分析。
[PY]玩pythonchallenge要复盘
忘了谁人在什么地方说的了,他们组里的人进来,先潜下心来做两周的pythonchallenge,然后写出来的python代码就非常漂亮。
我不相信,直到我前两天刚好有空做了第n关(很慢,我还真就当一个游戏来玩,只是有空才做一下),来到 第n+1关时,在页面最下面看到一句话:
To see the solutions to the previous level, replace pc with pcc, i.e. go to: http://www.pythonchallenge.com/pcc/def/ocr.html
接提示可以找到前一段的解法,多种解法,用不同思路的解法。可以用来跟自己的想法印证对比,并学习更多的写python方式。非常好玩。
[PY]python中的OO
写给自己的备忘,很浅显,可能只是句法方面的事,不涉及OO思想之类的,因为OO思想是共通的,并没有python的OO思想一说
PS 示例代码来自《python简明教程》
继承
python中的继承语法跟java/c++系不同,却不是:也不是extends,是这样的
class child(parent):
pass #py中,pass是空语句块
self,init,和del
python中的self有点类似于c++/java中的this是指针,代表本实例,不同的地方在于self要写在类函数的参数列表中,传递了self才能在函数中使用类实例的数据,但在调用时不需要写这个参数
init类似于构造函数,用法也差不多,而del,不像c++中的析构,比较像java中的finalize,在实例被回收时调用,同java中一样,这个函数被调用的时间是不一样的
class SchoolMember:
def __init__(self, name, age):
self.name = name
self.age = age
print ‘(Initialized SchoolMember: %s)’ % self.name
def __del__(self, name, age):passdef tell(self):
print ‘Name:”%s” Age:”%s”‘ % (self.name, self.age)SchoolMember().tell() <–这里不需要写self的引用
类数据与实例数据
class child():
bi=2 <–在java中这个是要加staitc滴,也就是说这个实际上相当于静态
def __init__(self):
self.bb=3 <–实例数据
重载
基本一样,不同的是python中的构造函数并不自动调用基类的构造函数,需要显式调用。
多继承
python支持多继承,不过不晓得有没有用,反正在我看来,多继承就是记载于葵花宝典的屠龙之技,自宫去学它了吧,也不一定用得上
让C/C++/Java人员不爽的地方:
- * 类数据居然不用声明直接用的
- * 数据居然不用指定类型的
- * 函数居然没有返回值类型的
- * 居然没有访问权限修饰符的(我是指public,private,protected,忘了术语怎么说了)
[PY]module的问题
前两天配好了pydev+eclipse的环境,然后在玩The Python Challenge.
The Python Challenge是一个很好玩的游戏,其实就是一系列的网页,你必须解开A页面的迷,然得到B页面的地址,这样一关一关走下去,有些解迷的乐趣,同时也能用来熟悉Python的模块函数,相关不错。
问题是我玩的那一关需要用到string模块的translate和maketrans函数,这本身难度不高,几行代码也就解决了,可奇怪的是,编译出错(也许python是解释出错?),在eclipse的输出框里面总是提示string模块并没有translate的方法,可不管看文档还是GOOGLE的结果,这模块都是应该包含这两个接口的。
这问题卡了一个多小时,直到我发现eclipse的输出窗口出现了一些本不该出现的输出字串,才想起来,原来我在这个py源文件的同一目录建了一个名叫string.py的文件,也就是说,当我在源文件里面输入import string的时候,它导入的并不是python库文件string.pyc,而是我自己建的这个string.pyc.
这样看起来,python引入库的时候,应该是跟c或者c++一样,先是寻找自己所在的目录有没有这一模块,如果没有,才会到系统指定的模版文件夹中寻找。
ps:关于python,推荐一个沈洁元先生的python简明教程,在线版和下载版到处都是,GOOGLE一下即可。
页面
Categories
- 92383 (1)
- lonely planet (25)
- Uncategorized (1)
- 一些故事 (3)
- 利其器 (10)
- 善其事 (62)
- 小说翻译 (2)
- 负暄琐话 (74)
laihj


