Browsing all articles from December, 2008
Dec
30

[pil-handbook翻译]使用指南-5

Author laihj    Category 善其事     Tags , , ,

更多图像载入方法 为了叙述的方便,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目录

注:后面是一些概念和库说明什么的,没啥好翻  翻译到此为此

原文链接

Dec
29

[pil-handbook翻译]使用指南-4

Author laihj    Category 善其事     Tags , , ,

图像序列(动画)

    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目录 下一页

Dec
27

[pil-handbook翻译]指用指南-3

Author laihj    Category 善其事     Tags , , ,

颜色转换

    使用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目录 下一页

Dec
26

[pil-handbook翻译]使用指南-2

Author laihj    Category 善其事     Tags , , ,

剪切,粘贴与合并图像
    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目录  下一页

Dec
25

[pil-handbook翻译]使用指南-1

Author laihj    Category 善其事     Tags , ,

使用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目录  下一页

Dec
24

[pil-handbook翻译]Python Imaging Library 概览

Author laihj    Category 善其事     Tags , , ,

简介
    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方法使您可以输出对某个图像的一些统计信息。这可以用于自动对比增强和全局统计分析。

PIL目录  下一页

Dec
23

加班2008

Author laihj    Category 负暄琐话     Tags

二零零八年,我经常在晚上九点到十点之前,就这样站在路边,等最后一班449到来,把我载回去。有时候有本本看动画,有时候拿着一本书,有时候什么也不做。

08年加班不少,进步不多。第四季度,公司发了一封内部信件,说经费不足了,大家以后要节约,于是我K,加了一半以上的工作日要加班,晚饭和打车费就够把经费耗光的,自然会不足。

08年,依然是一个一人吃饱全家不饿的年头,于是无所谓下班后在公司还是在家,晚上蹭个晚饭也就是常事,从这个意义上说,其实我个人对加班并没有什么恶感。只是强制加班这回事,总是让人不爽,就好像午饭后的下午两点钟,被人限制一个小时内不准吃饭,并没有什么实际意义,却还是不爽。

08年在加班回家的公交站认识一哥们,不晓得名字,只能叫“最后一班449男”,同一站上车,他坐两站,我要做很多站,于是花两站时间闲扯,骂骂资本家什么的,也是一乐事。

08年的12月,在清闲了大半个月之后,又通知开始加班了。

加班进入2009.

Dec
12

[资料]下交叉综合症

Author laihj    Category 负暄琐话     Tags ,

交叉综合症,是指身体姿态偏离正常状态的症状。“交叉”是指导致姿态偏离的强弱肌肉呈十字交叉排列。“综合症”是指偏离的姿态有多于两项特征。交叉综合症分成上交叉综合症和下交叉综合症

真没想到我还会写这种题目。

昨天去健身房刚好跟某私人教练聊了会,然后花点时间做体测,被认为是下交叉综合症初期。并推销了康复课程。

回家查了有关交叉综合症的相关信息,发现即使在google中,相关资料也少,个人觉得看上去比较专业的还是亚洲运动及体适能专业学院的一篇文章,文章列表在这里,这个列表中有针对下交叉综合症的实用训练方法(pdf)

搜到的其它资料多多少少都与这篇有点类似。

这样看来,健身的话,有个私人教练还是有必要的。当然费用比较高,不过暂不谈钱的因素,我觉得更重要的是,如何判断一个教练可以相信,毕竟你要用他的提议来折腾自己的身体 。

Dec
11

[对话软件大师]沃德·坎宁安 第一部分 揭秘维基

在开发社区,沃德·坎宁安作为“点子产生器”备受推崇。他发明了CRC卡,一种对象发现的技术,用来方便地发现和文档化软件模式;建立了世界上第一个维基站点,一种基于网络的协同写作工具。最近,坎宁安又被认为是极限编程的多项技术背后的主要灵感源。2003年9月23日,在丹麦奥尔胡斯市举办的JDOO大会上,Bill Venners见到了沃德·坎宁安。在这个将会被分批发表Artima.com的采访中,坎宁安提供了在内部视角对维基的观察和对极限编程的一些展望。最 初的部分,坎宁安会解释维基在协同探索方面的应用和维基作者与读者之间的交流。


 

为什么开发维基?

 

比尔:创立维基时你的目标是什么?

 

坎宁安:当时我有一些事情想要达成。我对第一个维基的具体目的就是要创建一种环境,在那里我们可以把每个人在编程模式语言方面的体验都链接在一起。之前我使用HyperCard程序,该程序被开发来达到同样的目的。我了解人们已习惯HyperCard上进行资料的阅读与写作,但它是单用户的。当我们开始PLoP[编程模式语言]的一系列会议,并意识到我们真正想做的是建立一种新的学科时,我决定放弃HyperCard程序并寻找一个基于网络的替代品。

 

我对维基还有一些泛泛的日标。首先,人们有一种爱谈话天性。人们喜欢谈话。创建维基,我希望解放我们所有人讲故事的天性。其次,也许是最重要的,我希望那些平常不善表达的人们发现它易于写作,这样,这里就存在一个机会让我们能发现他们表达的事物的脉络。

 

比尔:维基怎样帮助写作者?

 

坎宁安:某些不习惯写作的人可能有了一种想法,这想法只是一个片段。 如果他们要为杂志写一个随笔,但一个片段实在太简短了,他们需要建立一个上下环境,去说明某些重要的东西,用一个可以让多数人理解的方式去描述它,然后还要总结。这些都超过了多数人所愿花费的精力。

 

但是,如果你先读到了一些其它人的文章,然后你想,“对,但也可以这么想,”;也可能浏览某个段落然后说,“嗯,是这样,但事实上……”。在维基上,有许许多多这种想法对激的火花,这种“是的,不过……”式的观点。讨论组也在做同样的事情,不过,在讨论组中,这些火花最终都不见了。

 

比尔:为什么它们在讨论组都会丢失?

 

坎宁安:因为你无法保存它们。没有上下文环境。讨论组更倾向于用新的主题一遍又一遍地覆盖同一页面,因此人们总会忘记之前讨论过什么。我觉得FAQ(常见问题解答)的发明就是为了应付这一情况。很多时候,仅仅是阅读FAQ都比加入讨论组有价值得多。我刚开始建立维基的时候,也有一个被称为FAQ-O-Matic的系统——就是维基里的FAQ——致力于建立有关常见问题的解答。我看着它想道“是的,这是同样的理念。”可接着我又想:“不,我更喜欢面向文档的形式,而不是‘提问回答’的形式。”在维基中我们建立的模式是很像FAQ的,但又能给出更多信息。现在,在维基中大约有10,000 15,000个模式,25,000个页面的文档。

 

比尔:你理想中的维基程序是什么样子的?在什么地方维基表现抢眼?

 

坎宁安:维基的作用发挥最好的,就是当你尝试去解答一个无法很容易地描述出来的问题的时候,在那些不存在一个不言自明的结构使你明白接下来你需要了解些什么的领域。比如说这样的问题:“这个项目接下来是什么?”我们可以设计一个数据库,但是无论我们将什么放入数据库中,得到的都不是那些对项目的继续进行有重要作用的东西。因为对于该项目什么是最重要的,你无法预先考虑。

 

维基页面形式上是很自由的。贯穿整个维基的是超文本结构,但在一个给定的页面,在你使用自然语言作出多变命令的范围内,你可以描述所有需要描述的东西。所以,用以追踪项目状态,维基是一个很好的方式。你可以考虑一个我们的模式系统,比如说,一个长时间的项目。我们之前并不知道最终的目的,但我们要令它与我们想要的一致。

 

此外,维基在那种你可以放心把控制权分配给系统使用者的环境中工作得最好。在维基中并没有很多的规则来限制谁什么时候可以做什么,因为维基并不能理解你所要做的是什么。它仅仅是为你保存那些页面。大量的讨论被用来证明或证否某物是不是可用,但这些都不在维基程序的业务逻辑中,而存在于用户的脑中。如果你们的组织是相互信任的,而不向系统寻求对某些操作行为的限制功能,维基系统就会工作得很好。例如,我曾考虑过维基是否适合商业环境。我想有些公司的雇员们之间拥有足够的信任。当然,也有一些公司的并不认为他们可以信任他们的雇员可以自行维护一个网站,那么他们不能使用维基,而应该去找些别的。


得到事物的大轮廓

 

 比尔:在维基中,读者怎么样获得有关一切的总体轮廓?

 

坎宁安:首先,你得知道由于我们创建维基是为了方便写作,所以我们对阅读确实有点不友好。在维基中材料是有组织的,但这个组织还有待改进,它并不是高组织性的。所以,对读者来说,寻找一个有用信息的感觉得就像在荒野中寻找一小堆草料一样。你只能很偶然得碰到一些重要的东西,于是你说:“真荒谬,为什么没有人把所有重要的片段收集起来做一个列表,这样我就不需要自己把其它的找出来。”或者说:“为什么没有人把这些组织起来,让我能很快地找到问题的答案?”迟早他们会认识到,“呀,我可以做这个。”他们花了一到两个月收集到他们关心的东西,然后做一个页面。他们所呈现出来的,就是维基的组织方式。

 

我不是分类迷。当你真正感兴趣的事物是那些难以分类的事,无法预见的事的时候,建立一个好用的分类表是非常难的。但是有人认为每一个页面都应该被分类。他们提出一张基于页面名称的表,用以为维基建立一个分类系统。这些人关心分类,并维护它。如果有人写了一个页面却无法分类它,某些人就会说“噢,这应该被分类于维基维护或设计模式。”

 

比尔:他们怎么把一个页面分类为“维基维护”?            

 

坎宁安:他们只是做了引用链向一个叫作“维基维护目录”的页面。点击那个链接,就转到一个页面,这个页面会解释目录的意义及建立它的理由。就是说,把一个页面加入目录,就是在页面上加一个链向描述目录页面的链接。这样就标记了页面。如果你想知道目录是什么,随着链接到目录页;想知道目录中包括哪些页面,就搜索所有引用了该目录的页面。

 

比尔:假设搜索是我开始探索新维基的一种方式。从某种意义上来说,维基像internet的一个小版本。东西散落各处。我如何找到我所要寻找的?可以从搜索关键字开始。

 

坎宁安:对。人们约定任何一个名字以“Category”结尾的页面都是值得搜索的材料。你可以通过Google搜索小说,但如果作者不把他们的作品标记为“小说”,你可能搜不到。目录系统是页面的集合,这些页面也解释了该目录的本质,而你可以阅读这些页面。他们使用了命名空间的一小部分——所有的词都以“Category”结尾——并且开创了这些页面描述了其它页面的类别的先例。这样很好,并且平衡。如果我尝试开发一种解决方案,它无法既简单又好用。而我最喜欢的是,有一个活跃的社区在管理着目录的集合。有几次他们把目录弄错了,但很快又改好它们。


维基里的时间

 

比尔:你的描述使我经历了一个小型头脑风暴。你聚集了一些人,他们把本不清晰的图景描述出来。

 

坎宁安:维基一点头脑风暴的感觉,虽然它本身并不是交互式的。你可以用十分钟做头脑风暴,然后花三十分钟或四十五分钟分析这次头脑风暴的产出。在维基中,步调更慢。你可以就一个想法写一个页法,或者为一系列想法写好页面。一周之后再回来看看这个页面发展出些什么。不过,如果你仅过了十五分钟就回来了,可能什么都不会发生。在维基中,事情的发生时间是以天或者周来量度的,因为人们更倾向于以每天或者每周来浏览一下。

 

维基中有很有意思的时间元素。如果在阅读新闻组或邮件列表,你会感觉到你在列表中的位置就是“现在”。如果你落后了,就得努力赶上。我不希望在维基中出现一个时间轴。如果你在一个维基站读什么东西,我不希望这个东西是一年前,一天前,或者几分钟前写就的成为一个问题。那意味着我们需要一些方法去取得上下文环境。

 

如果你正在编辑一个页面,这一页面又提到了其它东西。那么你需要做的就是在一个小节里面描述在所有其它页面组成的上下文环境中,这一页面是关于什么的。人们会变得很熟悉这些页面名称。如果他们已经了解那些页面,那么继续读下去。如果他们不知道他们页面说些什么,他们会说:“噢,这个页面完全读不懂。我得去读读其它页面。”所以,如果你了解上下文环境,你没必要去浏览它们。但如果你不了解上下文环境,你可以先去阅读,它们总在那里。

 

比尔:听起来你需要去了解一个维基站点。花些时间,让自己熟悉它。开始的时候,它可能有点令人迷惑,也不富含信息。当你进入看到东西散落各处,并没有为读者作必要的组织。

 

坎宁安:是的,维基站点总是处于被组织的过程当中。但是,对应每一个小时的组织,就有两个多小时在加入新材料。所以对一个维基站来说,现状,就是指部分组织化。


维基与可读性。

 

比尔:我真的很喜欢维基这个主意,但我觉得有些维基页面难以阅读。可读性是我从来没有把一个维基程序放在Artima.com上的主要原因。Artima.com同样也是一个基于网络的协作文档系统,但是结构更好。在维基中,并没有编辑来为读者组织材料。所有的页面都是协作完成的,结构就是协作。编辑是协作。在维基的协作中,你得到什么使它值得与可读性作一个折衷?

 

 

坎宁安:作为一个维基的读者你是在接近一个平常很少发表意见的人。我们给予话语权的人有一种想要编写和交流电脑程序的本能。我们的商业文化看重出版。打个比方说,如果你要给一个杂志供稿,你就应该作功课。熟悉领域内其它人的文献是这种功课的一部分。而其它的人文献会多少有些纠缠于枝节问题。写作有关编程和文章跟熟练编程的感觉是完全不同的。使用维基,那些没时间去熟悉文献的,没时间阅读杂志上专栏的资深程序员就拥有了一处地方去表达对他们来说很重要的那些东西。维基提供了不同的视角。事实上,在维基中你可以区分写作自己个人经验的人和仅是引用最后阅读的材料的人

 

比尔:如何区分?

 

坎宁安:你可以这样区分:如果他们这样写一件事情:“玛丽安就是没办法让这部分正常运作。”这并不是科学腔调。如果一些人引用某个作者并且说:“如此这般这般如此,你们不听这些就太蠢了。”这就是一个崇拜自己所读的书的人。另一方面,如果有人说。“你知道,在最近的三个项目中我们都努力这么做,但没有一次成功。我们一直被迫使用它做一些事而不是将它们扫地出门,”而有个人已经将它扫地出门了,他告诉我们的事就会很有用。这只是他的经验,如何理解就是我的事了。接着你可能会再看到其它的段落写道:“是的,这也发生在我们身上,但我们用另一种方式将它扫地出门了。”现在,有两种方法将它扫地出门。突然,你是在与将软件扫地出门的人们交流,而不是与正在将软件扫地出门的人对话,这有很大的区别。

Dec
10

一个很不错的口琴站-口琴草堂

Author laihj    Category 负暄琐话     Tags ,

最早想吹口琴是因为玩英雄传说VI空之轨迹FC,在剧情推动中约书亚时不时会拿出他的小口琴吹一曲《星之所在》,也就喜欢上了,就像当年想玩吉他是因为想弹eagles的hotel california一样。布 鲁斯口琴很早就买了,也在verycd上下了一些教程,却不一直没有玩起来。

前几天发版后觉得最近比较闲便想再搜拿起口琴玩一下,google到这个教程,居然,能跟着玩起来了。

草堂口琴课程分为四个学年,同大学教育一样。第一学年的课程是为初学者开设的,相应的技巧难度逐步增加。后学年的课程涉及到口琴的高级技巧,其中设计了挑战职业经验口琴手的大量练习。无论你起点如何,都能找到适合自己的相应课程。

        下面有口琴课程摘要。共有约81篇课程,分为口琴曲课程布鲁斯课程,每学年大约要学习20篇。如果你只想吹奏布鲁斯,修完大一的课程后,在后面的学年中可以选择只修布鲁斯课程。然而,建议你能修完所有的课程,因为口琴曲课程将为你创造一翻音乐和吹奏机会的新天地。

也许,不久之后,我就可以吹一些简单的曲子了吧。