查看Unix/Linux系统里的字体的排序顺序: fc-match

Tags: fc-match

fc-match -h:

usage: fc-match [-savVh] [-f FORMAT] [--sort] [--all] [--verbose] [--format=FORMAT] [--version] [--help] [pattern] {element...}
List best font matching [pattern]

  -s, --sort           display sorted list of matches
  -a, --all            display unpruned sorted list of matches
  -v, --verbose        display entire font pattern verbosely
  -f, --format=FORMAT  use the given output format
  -V, --version        display font config version and exit
  -h, --help           display this help and exit

有一个sort的选项,太给力了。

Shell:~ >: fc-match -s serif                    
VeraSe.ttf: "Bitstream Vera Serif" "Roman"
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSerif-Bold.ttf: "DejaVu Serif" "Bold"
DejaVuSerif-Italic.ttf: "DejaVu Serif" "Italic"
DejaVuSerif-BoldItalic.ttf: "DejaVu Serif" "Bold Italic"
times.ttf: "Times New Roman" "Normal"
luxirr.ttf: "Luxi Serif" "Regular"
l049013t.pfa: "Luxi Serif" "Regular"
timR12.pcf.gz: "Times" "Regular"
wqy-zenhei.ttf: "文泉驛正黑" "中等"
GohaTibebZemen.ttf: "Goha-Tibeb Zemen" "Regular"
YaHei.Consolas.ttf: "YaHei Consolas Hybrid" "Normal"
arial.ttf: "Arial" "Normal"
cour.ttf: "Courier New" "Normal"
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
ariblk.ttf: "Arial Black" "Normal"
simsun.ttf: "SimSun" "Regular"
SyrCOMAdiabene.otf: "East Syriac Adiabene" "Regular"
SyrCOMMalankara.otf: "Serto Malankara" "Regular"
seguibk.ttf: "Segoe UI" "Regular"
cour.pfa: "Courier" "Regular"
tahomabd.ttf: "Tahoma" "Negreta

...

 

知道了排序了,可以用/etc/fonts/local.conf来修改,想怎样就怎样。

 

No Comments 2011-02-10 23:19:49 by No.0023

Clojure links

Tags: Clojure
搜了一个下午的结果:

No Comments 2011-01-14 23:10:26 by No.0023

多年积累的20条编程经验[转]

Tags: program, dev

编者按:原文作者乔纳森·丹尼可(Jonathan Danylko)是一位自由职业的web架构师和程序员,编程经验已超过20年,涉足领域有电子商务、生物技术、房地产、医疗、保险和公用事业。正如乔纳 森在文中所言,本文适合刚毕业的大学生和刚入门的程序员。如果你已是高级开发人员,或许你能在本文中看到自己的身影。

从11岁时,我就一直在编程,并且一直都很喜欢技术和编程。这些年来,我积累了一些艰难又容易的经验。作为一名程序员,你或许还没这些经验,但我会把它们献给那些想从中学到更多的朋友。

我会持续更新这些经验,我可能还会有更多的感想,但就我这20年来看,我想下面这个列表中基本不需要增添额外的东西了。下面就是我至今最难忘的经验。

1. 估算解决问题所需要的时间。不要怕,承认吧!我曾见过一些程序员为了解决一个特殊问题而坐在显示器前面8小时。为自己定一个时间限制吧,1小时、30分钟或甚至15分钟。如果在这期间你不能解决问题,那就去寻求帮助,或到网上找答案,而不是尝试去做“超级堆码员”。

2. 编程语言是一种语言,只是一种语言。随着时光推移,只要你理解了一种语言的原理,你会发现各种语言之间的相似之处 。你所选择的语言,你应该觉得“舒服”,并且能够写出有效(而且简洁)的代码。最重要的,让语言去适应项目,反之亦然。

3. 不要过于注重程序的“设计模式”。 有时候,写一个简单的算法,要比引入某种模式更容易。在多数情况下,程序代码应是简单易懂,甚至清洁工也能看懂。

4. 经常备份代码。在我年轻时,我就有过因硬盘故障而丢了大量代码的经历,这经历很恐怖的。只要你一次没有备份,就应当像有着严格的期限,客户明天就需要。此时就该源码/版本控制软件大显身手了。

5. 承认自己并不是最顶尖的程序员 - 知不足。我常想,我对编程了解已足够多,但是总有其他人比你优秀。正所谓,“一山总比一山高”。所以,向他们看齐吧!

6、学习再学习。正如第5点所说,我经常会在手里拿一本计算机或编程相关的杂志或书(不信,可以问我的朋友)。诚然,总有很多你不知道的技术,你可以从中学习以保持不落后。如果你有一种灵巧的方式来获取你需要的新技术,那你每天都应该坚持学习。

7. 永恒的变化。你对待技术/编程知识,就应像你对待股票一样:多样化。不要在某一特定技术上自我感觉良好。 如果那种技术或语言已经没有足够支持,那你还不如现在就开始更新你的简历,并启动培训新计划。我能保持前行的主要原则是什么呢?至少了解两到三种语言,所 以,如果某种语言过时了,你在学习新技术的时候还可以依靠另一种语言。

8. 提携新人。协助并且培养初级/入门的开发人员学习优秀的编程方法和技巧。也许你还不知道,在帮助他们向更高一层前进时,你自己也在向更高一层提升,你会更加自信。

9. 简化算法。代码如恶魔,在你完成编码后,应回头并且优化它。从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松。

10. 编写文档。无论是Web服务的API,还是一个简单的类,你尽量编写相应文档。我曾经引以为豪的代码注 释,因过度注释而有人指责。给三行代码加一行注释,只需要你几秒时间。如果那是一个比较难以理解的技术,千万别担心过多注释。如果你能很好做好自己的工 作,大多数架构师、后备程序员、支持组都会感激你。

11. 测试、测试再测试。我是一名黑盒测试粉丝。当你完成编码后,你“被认可”的时候就开始了。如果你们公司有QA部门,如果你的代码中有错误,那你得到的评论,会比项目经理还多。如果你不彻底测试自己的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉。

12. 庆祝每一次成功。我见过很多程序员在解决编程技术难题后,会和同伴握手、击掌或甚至手舞足蹈。每个人在 生命中都会碰到“顿悟”。如果一个程序员高兴地跑来叫你去看他的非凡代码,也许你已经看过这样的代码100遍了,但你也应该为了这个家伙而庆祝第101 次。(编者注:《庆祝成功的九种方式》。)

13. 经常检查代码。 在公司,你的代码要经常检查(包括自查和其他同事检查)。不要把别人的检查,看成是对代码风格的苛求。应该把它们看作是有建设性的批评。对个人来说,经常检查你的代码并且自问,“我怎样才能写得更好呢?” 这会加速你的成长,让你成为一个更优秀的程序员。

14. 回顾你的代码。在看到自己以前的代码时,通常会有两种方式:“难以至信,这代码是我写的”和“难以至 信,这代码是我写的”。第一种往往是厌恶的语气,并在想如何改进它。你也许会惊叹,旧代码也能复活成为一种更好的程序,甚至是一个完整的产品。第二种通常 带着惊奇和成就感。开发人员应该一到两个自己完成的项目成果,能让众人不禁而立并注目而观的项目。同样,基于你优越的编程能力,你可以把过去的程序或项目 拿出来,把它们更新为更加优秀的产品或想法。

15. 幽默是不可缺的。在我20年的开发生涯中,我还没有碰到哪位程序员是没有幽默感的。实际上,干我们这行,幽默是一项必备品。

16. 谨防那些无所不知的程序员,不愿分享的程序员,还有经验不足的程序员。当你遇到这几种程序员时,你自己要谦虚。无所不知的程序员,更想当一个英雄而不是团队成员;保守的程序员则是在编写着他们独享的代码;而经验不足的程序员则会每十分钟就来问你一下,当代码完成后,代码已经是你的,而不是他们。

17. 任何项目都不会那么简单。朋友、家人和同事曾请求我仓促做一些事情,仓促做一个程序或者网站。对于这样 的事,应该从双方做计划,才能做出令两方都会满意的东西。如果某人起初只是需要一个使用Microsoft Access的、只有有3个页面的网站,但来就很可能变成一个有15个页面的网站,并使用SQL Server,有一个论坛,还有一个定制的CMS(内容管理系统)。

18. 任何时候不要想当然。假如你承接一个简单的项目,你可能会认为某个部分可以轻松完成。千万别这样想!除非你有一个类、组件、或者一段已经写好的代码,并且在现有的项目已经测试通过。不要认为这将是很容易的。

19. 没有已经完成的软件。曾经有一位程序员告诉我,没有软件是已经完成的,它只是“暂时完成了”。这是明智的忠告。如果客户还在使用你写的程序,并经受了时间的考验。如果有机会,你仍在更新它,这并不是什么坏事,这让你不断地前行。

20. 耐心是一种美德。当客户、朋友或家庭成员用电脑的时候,他们也许会受挫,进而想砸电脑,或气冲冲地离 开。我一直在告诉他们,“是你掌控电脑,不是电脑掌控你。”对于用作编程的电脑,你要有一定的耐心。一旦程序员知道问题所在后,他们就会站在电脑的角度看 问题,并且说“哦,这就是为什么它是这样做。”

编者后话

对本文深有感触!虽然本文没有华丽的辞藻,其中朴实的道理,其实并非只适用程序员,同样可以扩展到其他行业。记得以前练字时,总感觉当时写得很好,但后来回头再看时,也会想“这居然是我写的字!”

1 Comment 2010-11-24 12:31:48 by No.0023

开源协议 Apache License 中文翻译

Tags: open, license

Apache许可证

2.0版,2004年1月
http://www.apache.org/licenses/

译者:Joe 改动:hbW
使用、重生成及分发的术语和条件:

1.定义

"许可证"是指根据本文档第1到第9部分关于使用、重生成和分发的术语和条件。

"许可证颁发者"是指版权所有者或者由版权所有者批准的授权许可证的实体。

" 法律实体"是指实施实体和进行控制的所有其它实体受该实体控制,或者受该实体集中控制。根据此定义,"控制"是指(i)让无论是否签订协议的上述实体,进 行指导或管理的直接权利或间接权利,或者(ii)拥有百分之五十(50%)或以上已发行股票的所有者,或者(iii)上述实体的实权所有者。

"用户"(或"用户的")是指行使本许可证所授予权限的个人或法律实体。

"源程序"形式是指对包含但不限制软件源代码、文档源程序和配置文件进行修改的首选形式。

"目标"形式是指对源程序形式进行机械转换或翻译的任何形式,包括但不限于对编译的目标代码,生成的文件以及转换为其它媒体类型。

"作品"是指根据本许可证所制作的源程序形式或目标形式的著作,在著作中包含的或附加的版权通知(在下面附录中提供了一个示例)。

" 衍生作品"是指基于作品(或从作品衍生而来)的源程序形式或目标形式的任何作品,以及编辑修订、注释、详细描述或其它修订等构成原创著作作品的整体。根据 本许可证,衍生作品不得包括与作品及其衍生作品分离之作品,或仅与作品及其衍生作品的接口相链接(或按名称结合)之作品。

"贡献"是指任何 著作作品,包括作品的原始版本和对该作品或衍生作品所做的任何修订或补充,意在提交给许可证颁发者以让版权所有者或代表版权所有者的授权个人或法律实体包 含在其作品中。根据此定义,"提交"一词表示发送给许可证颁发者或其代表人,任何电子的、口头的或书面的交流信息形式,包括但不限于在由许可证颁发者或者 代表其管理的电子邮件清单、源代码控制系统、以及发布跟踪系统上为讨论和提高作品的交流,但不包括由版权所有者以书面形式明显标注或指定为"非贡献"的交 流活动。

"贡献者"是指许可证颁发者和代表从许可证颁发者接受之贡献的并随后包含在作品之贡献中的任何个人或法律实体。

2.版权许可证的授予

根据本许可证的条款,每个贡献者授予用户永久性的、全球性的、非专有性的、免费的、无版权费的、不可撤销的版权许可证以源程序形式或目标形式复制、准备衍生作品、公开显示、公开执行、授予分许可证、以及分发作品和这样的衍生作品。

3.专利许可证的授予

根 据本许可证的条款,每个贡献者授予用户永久性的、全球性的、非专有性的、免费的、无版权费的、不可撤销的(除在本部分进行说明)专利许可证对作品进行制 作、让人制作、使用、提供销售、销售、进口和其它转让,且这样的许可证仅适用于在所递交作品的贡献中因可由单一的或多个这样的贡献者授予而必须侵犯的申请 专利。如果用户对任何实体针对作品或作品中所涉及贡献提出因直接性或贡献性专利侵权而提起专利法律诉讼(包括交互诉讼请求或反索赔),那么根据本许可证, 授予用户针对作品的任何专利许可证将在提起上述诉讼之日起终止。

4.重新分发

用户可在任何媒介中复制和分发作品或衍生作品之副本,无论是否修订,还是以源程序形式或目标形式,条件是用户需满足下列条款:

  1. 用户必须为作品或衍生作品的任何其他接收者提供本许可证的副本;并且
  2. 用户必须让任何修改过的文件附带明显的通知,声明用户已更改文件;并且
  3. 用户必须从作品的源程序形式中保留衍生作品源程序形式的用户所分发的所有版权、专利、商标和属性通知,但不包括不属于衍生作品任何部分的类似通知;并且
  4. 如 果作品将"通知"文本文件包括为其分发作品的一部分,那么用户分发的任何衍生作品中须至少在下列地方之一包括,在这样的通知文件中所包含的属性通知的可读 副本,但不包括那些不属于衍生作品任何部分的通知:在作为衍生作品一部分而分发的通知文本文件中;如果与衍生作品一起提供则在源程序形式或文件中;或者通 常作为第三方通知出现的时候和地方,在衍生作品中产生的画面中。通知文件的内容仅供信息提供,并未对许可证进行修改。用户可在其分发的衍生作品中在作品的 通知文本后或作为附录添加自己的属性通知,条件是附加的属性通知不得构成修改本许可证。

用户可以为自身所做出的修订添加自己的版权声明并可对自身所做出修订内容或为这样的衍生作品作为整体的使用、复制或分发提供附加或不同的条款,条件是用户对作品的使用、复制和分发必须符合本许可证中声明的条款。

  • 5.贡献的提交。

  • 除非用户明确声明,在作品中由用户向许可证颁发者的提交若要包含在贡献中,必须在无任何附加条款下符合本许可证的条款。尽管上面如此规定,执行许可证颁发者有关贡献的条款时,任何情况下均不得替代或修改任何单独许可证协议的条款。

  • 6.商标。本许可证并未授予用户使用许可证颁发者的商号、商标、服务标记或产品名称,除非将这些名称用于合理性和惯例性描述作品起源和复制通知文件的内容时。
  • 7.保证否认条款。除 非因适用法律需要或书面同意,许可证颁发者以"按原样"基础提供作品(并且每个贡献者提供其贡献),无任何明示的或暗示的保证或条件,包括但不限于关于所 有权、不侵权、商品适销性、或适用性的保证或条件。用户仅对使用或重新分发作品的正确性负责,并需承担根据本许可证行使权限时的任何风险。
  • 8.责任限制条款。在 任何情况下并根据任何法律,无论是因侵权(包括过失)或根据合同,还是其它原因,除非根据适用法律需要(例如故意行为和重大过失行为)或经书面同意,即使 贡献者事先已被告知发生损害的可能性,任何贡献者不就用户因使用本许可证或不能使用或无法使用作品(包括但不限于商誉损失、停工、计算机失效或故障,或任 何商业损坏或损失)而造成的损失,包括直接的、非直接的、特殊的、意外的或间接的字符损坏而负责。
  • 9.接受保证或附加责任。重 新分发作品或及其衍生作品时,用户可选择提供或为符合本许可证承担之支持、担保、赔偿或其它职责义务和/或权利而收取费用。但是,在承担上述义务时,用户 只可代表用户本身和用户本身责任来执行,无需代表任何其它贡献者,并且用户仅可保证、防护并保持每个贡献者不受任何因此而产生的责任或对因用户自身承担这 样的保证或附加责任而对这样的贡献者所提出的索赔。
  • 条款结束

    附录:如何向用户作品中应用Apache许可证。

    若 要向用户作品应用Apache许可证,请附加下列样本通知,将括号"[]"中的字段以用户自身的区分信息来替换(但不包括括号)。文本必须以文件格式适当 的注释句法包含在其中。另外建议将文件名或类别名以及目的说明包含在相同的"打印页"上作为版权通知,以更加容易的区分出第三方档案。

    版权所有[yyyy][版权所有者的名称]

    根据2.0版本Apache许可证("许可证")授权;
    根据本许可证,用户可以不使用此文件。
    用户可从下列网址获得许可证副本:

    http://www.apache.org/licenses/LICENSE-2.0

    除非因适用法律需要或书面同意,
    根据许可证分发的软件是基于"按原样"基础提供,
    无任何明示的或暗示的保证或条件。
    详见根据许可证许可下,特定语言的管辖权限和限制。

    No Comments 2010-10-14 14:47:07 by No.0023

    Google Go:初级读本

    Tags: Go, golang, google

    from http://www.infoq.com/cn/articles/google-go-primer

    作者 Samuel Tesla 译者 黄璜 发布于 2010年4月2日 上午12时5分

    Google最近发布新型的编程语言,Go。它被设计为将现代编程语言的先进 性带入到目前仍由C语言占统治地位的系统层面。然而,这一语言仍在试验阶段并在不断演变。

    Go语言的设计者计划设计一门简单、高效、安全和 并发的语言。这门语言简单到甚至不需要有一个符号表来进行词法分析。它可以快速地编译;整个工程的编译时间在秒以下的情况是常事。它具备垃圾回收功能,因 此从内存的角度是安全的。它进行静态类型检查,并且不允许强制类型转换,因而对于类型而言是安全的。同时语言还内建了强大的并发实现机制。

    阅读Go

    Go的语法传承了与C一样的风格。程序由函数组成,而函数体是一系列的语句序列。一段代码块用花括号括起来。这门语言保留有限的关键字。表达式使用 同样的中缀运算符。语法上并无 太多出奇之处。

    Go语言的作者在设计这一语言时坚持一个单一的指导原则:简单明了至上。一些新的语法构件提供了简明地表达一些约定俗成的概 念的方式,相较之下用C表达显得冗长。而其他方面则是针对几十年的使用所呈现出来的一些不合理的语言选择作出了改进。

    变量声明

    变量是如下声明的:

    var sum int // 简单声明
    var total int = 42 // 声明并初始化

    最值得注意的是,这些声明里的类型跟在变量名的后面。乍一看有点怪,但这更清晰明了。比如,以下面这个C片段来说:

    int* a, b;

    它并明了,但这里实际的意思是a是一个指针,但b不是。如果要将两者都声明为指针,必须要重复星号。然后在Go语言里,通过如下方式可以将两者都 声明为指针:

    var a, b *int

    如果一个变量初始化了,编译器通常能推断它的类型,所以程序员不必显式的敲出来:

    var label = "name"

    然而,在这种情况下var几乎显得是多余了。因此,Go的作者引入了一个新的运算符来 声明和初始化一个新的变量:

    name := "Samuel"

    条件语句

    Go语言当中的条件句与C当中所熟知的if-else构造一样,但条件不需要被打包在括号内。这样可以减少阅读代码时的视觉上的混乱。

    括号并不是唯一被移去的视觉干扰。在条件之间可以包括一个简单的语句,所以如下的代码:

    result := someFunc();
    if result > 0 {
    /* Do something */
    } else {
    /* Handle error */
    }

    可以被精简成:

    if result := someFunc(); result > 0 { 
    /* Do something */
    } else {
    /* Handle error */
    }

    然而,在后面这个例子当中,result只在条件块内部有效——而前者 中,它在整个包含它的上下文中都是可存取的。

    分支语句

    分支语句同样是似曾相识,但也有增强。像条件语句一样,它允许一个简单的语句位于分支的表达式之前。然而,他们相对于在C语言中的分支而言走得更远。

    首先,为了让分支跳转更简明,作了两个修改。情况可以是逗号分隔的列表,而fall-throuth也不再是默认的行为。

    因此,如下的C代码:

    int result;
    switch (byte) {
    case 'a':
    case 'b':
    {
    result = 1
    break
    }

    default:
    result = 0
    }

    在Go里就变成了这样:

    var result int
    switch byte {
    case 'a', 'b':
    result = 1
    default:
    result = 0
    }

    第二点,Go的分支跳转可以匹配比整数和字符更多的内容,任何有效的表达式都可以作为跳转语句值。只要它与分支条件的类型是一样的。

    因此如下的C代码:

    int result = calculate();
    if (result < 0) {
    /* negative */
    } else if (result > 0) {
    /* positive */
    } else {
    /* zero */
    }

    在Go里可以这样表达:

    switch result := calculate(); true {
    case result < 0:
    /* negative */
    case result > 0:
    /* positive */
    default:
    /* zero */
    }

    这些都是公共的约定俗成,比如如果分支值省略了,就是默认为真,所以上面的代码可以这样写:

    switch result := calculate(); {
    case result < 0:
    /* negative */
    case result > 0:
    /* positive */
    default:
    /* zero */
    }

    循环

    Go只有一个关键字用于引入循环。但它提供了除do-while外C语言当中所有可用的循环方式。

    条件

    for a > b { /* ... */ }

    初始,条件和步进

    for i := 0; i < 10; i++ { /* ... */ }

    范围

    range语句右边的表达式必须是arrayslicestring或者map, 或是指向array的指针,也可以是channel

    for i := range "hello" { /* ... */ }

    无限循环

    for { /* ever */ }

    函数

    声明函数的语法与C不同。就像变量声明一样,类型是在它们所描述的术语之后声明的。在C语言中:

    int add(int a, b) { return a + b }

    在Go里面是这样描述的:

    func add(a, b int) int { return a + b }

    多返回值

    在C语言当中常见的做法是保留一个返回值来表示错误(比如,read()返回0),或 者保留返回值来通知状态,并将传递存储结果的内存地址的指针。这容易产生了不安全的编程实践,因此在像Go语言这样有良好管理的语言中是不可行的。

    认识到这一问题的影响已超出了函数结果与错误通讯的简单需求的范畴,Go的作者们在语言中内建了函数返回多个值的能力。

    作为例子,这个函数将返回整数除法的两个部分:

    func divide(a, b int) (int, int) {
    quotient := a / b
    remainder := a % b
    return quotient, remainder
    }

    有了多个返回值,有良好的代码文档会更好&mdash;&mdash;而Go允许你给返回值命名,就像参数一样。你可以对这些返回的变量赋值,就像其它的变量一样。所以我们可以重写divide:

    func divide(a, b int) (quotient, remainder int) {
    quotient = a / b
    remainder = a % b
    return
    }

    多返回值的出现促进了"comma-ok"的模式。有可能失败的函数可以返回第二个布尔结果来表示成功。作为替代,也可以返回一个错误对象,因此像下面这样的代码也就不见怪了:

    if result, ok := moreMagic(); ok {
    /* Do something with result */
    }

    匿名函数

    有了垃圾收集器意味着为许多不同的特性敞开了大门&mdash;&mdash;其中就包括匿名函数。Go为声明匿名函数提供了简单的语法。像许多动态语言一样,这些函数在它们被定义的范围内创建了词法闭包。

    考虑如下的程序:

    func makeAdder(x int) (func(int) int) {
    return func(y int) int { return x + y }
    }

    func main() {
    add5 := makeAdder(5)
    add36 := makeAdder(36)
    fmt.Println("The answer:", add5(add36(1))) //=> The answer: 42
    }

    基本类型

    像C语言一样,Go提供了一系列的基本类型,常见的布尔,整数和浮点数类型都具备。它有一个Unicode的字符串类型和数组类型。同时该语言还引入了两 种新的类型:slicemap

    数组和切片

    Go语言当中的数组不是像C语言那样动态的。它们的大小是类型的一部分,在编译时就决定了。数组的索引还是使用的熟悉的C语法(如 a[i]),并且与C一样,索引是由0开始的。编译器提供了内建的功能在编译时求得一个数组的长度 (如 len(a))。如果试图超过数组界限写入,会产生一个运行时错误。

    Go还提供了切片(slices),作为数组的变形。一个切片(slice)表示一个数组内的连续分段,支持程序员指定底层存储的明确部分。构建一个切片 的语法与访问一个数组元素类似:

    /* Construct a slice on ary that starts at s and is len elements long */
    s1 := ary[s:len]

    /* Omit the length to create a slice to the end of ary */
    s2 := ary[s:]

    /* Slices behave just like arrays */
    s[0] == ary[s] //=> true

    // Changing the value in a slice changes it in the array
    ary[s] = 1
    s[0] = 42
    ary[s] == 42 //=> true

    该切片所引用的数组分段可以通过将新的切片赋值给同一变量来更改:

    /* Move the start of the slice forward by one, but do not move the end */
    s2 = s2[1:]

    /* Slices can only move forward */
    s2 = s2[-1:] // this is a compile error

    切片的长度可以更改,只要不超出切片的容量。切片s的容量是数组从s[0]到数组尾端的大小,并由内建的cap()函数返回。一个切片的长度永远不能超出它的容量。

    这里有一个展示长度和容量交互的例子:

    a := [...]int{1,2,3,4,5} // The ... means "whatever length the initializer has"
    len(a) //=> 5

    /* Slice from the middle */
    s := a[2:4] //=> [3 4]
    len(s), cap(s) //=> 2, 3

    /* Grow the slice */
    s = s[0:3] //=> [3 4 5]
    len(s), cap(s) //=> 3, 3

    /* Cannot grow it past its capacity */
    s = s[0:4] // this is a compile error

    通常,一个切片就是一个程序所需要的全部了,在这种情况下,程序员根本用不着一个数组,Go有两种方式直接创建切片而不用引用底层存储:

    /* literal */
    s1 := []int{1,2,3,4,5}

    /* empty (all zero values) */
    s2 := make([]int, 10) // cap(s2) == len(s2) == 10

    Map类型

    几乎每个现在流行的动态语言都有的数据类型,但在C中不具备的,就是dictionary。Go提供了一个基本的dictionary类型叫做map。下 面的例子展示了如何创建和使用Go map:

    m := make(map[string] int) // A mapping of strings to ints

    /* Store some values */
    m["foo"] = 42
    m["bar"] = 30

    /* Read, and exit program with a runtime error if key is not present. */
    x := m["foo"]

    /* Read, with comma-ok check; ok will be false if key was not present. */
    x, ok := m["bar"]

    /* Check for presence of key, _ means "I don't care about this value." */
    _, ok := m["baz"] // ok == false

    /* Assign zero as a valid value */
    m["foo"] = 0;
    _, ok := m["foo"] // ok == true

    /* Delete a key */
    m["bar"] = 0, false
    _, ok := m["bar"] // ok == false

    面向对象

    Go语言支持类似于C语言中使用的面向对象风格。数据被组织成structs,然后定义操作这些structs的函数。类似于Python,Go语言提供 了定义函数并调用它们的方式,因此语法并不会笨拙。

    Struct类型

    定义一个新的struct类型很简单:

    type Point struct {
    x, y float64
    }

    现在这一类型的值可以通过内建的函数new来分配,这将返回一个指针,指向一块内存单元,其所占内存槽初始化为零。

    var p *Point = new(Point)
    p.x = 3
    p.y = 4

    这显得很冗长,而Go语言的一个目标是尽可能的简明扼要。所以提供了一个同时分配和初始化struct的语法:

    var p1 Point = Point{3,4}  // Value
    var p2 *Point = &Point{3,4} // Pointer

    方法

    一旦声明了类型,就可以将该类型显式的作为第一个参数来声明函数:

    func (self Point) Length() float {
    return math.Sqrt(self.x*self.x + self.y*self.y);
    }

    这些函数之后可作为struct的方法而被调用:

    p := Point{3,4}
    d := p.Length() //=> 5

    方法实际上既可以声明为值也可以声明为指针类型。Go将会适当的处理引用或解引用对象,所以既可以对类型T,也可以对类型*T声明方式,并合理地使用它们。

    让我们为Point扩展一个变换器:

    /* Note the receiver is *Point */
    func (self *Point) Scale(factor float64) {
    self.x = self.x * factor
    self.y = self.y * factor
    }

    然后我们可以像这样调用:

    p.Scale(2);
    d = p.Length() //=> 10

    很重要的一点是理解传递给MoveToXY的self和其它的参数一样,并且是传递,而不是引用传递。如果它被声明为Point,那么在方法内修改的struct就不再跟调用方的一样&mdash;&mdash;值在它们传递给方法的时候被 拷贝,并在调用结束后被丢弃。

    接口

    像Ruby这样的动态语言所强调面向对象编程的风格认为对象的行为比哪种对象是动态类型(duck typing)更为重要。Go所 带来的一个最强大的特性之一就是提供了可以在编程时运用动态类型的思想而把行为定义的合法性检查的工作推到编译时。这一行为的名字被称作接口

    定义一个接口很简单:

    type Writer interface {
    Write(p []byte) (n int, err os.Error)
    }

    这里定义了一个接口和一个写字节缓冲的方法。任何实现了这一方法的对象也实现了这一接口。不需要像Java一样进行声明,编译器能推断出来。这既给予了动态类型的表达能力又保留了静态类型检查的安全。

    Go当中接口的运作方式支持开发者在编写程序的时候发现程序的类型。如果几个对象间存在公共行为,而开发者想要抽象这种行为,那么它就可以创建一个接口并使用它。

    考虑如下的代码:

    // Somewhere in some code:
    type Widget struct {}
    func (Widget) Frob() { /* do something */ }

    // Somewhere else in the code:
    type Sprocket struct {}
    func (Sprocket) Frob() { /* do something else */ }

    /* New code, and we want to take both Widgets and Sprockets and Frob them */
    type Frobber interface {
    Frob()
    }

    func frobtastic(f Frobber) { f.Frob() }

    需要特别指出的很重要的一点就是所有的对象都实现了这个空接口:

    interface {}

    继承

    Go语言不支持继承,至少与大多数语言的继承不一样。并不存在类型的层次结构。相较于继承,Go鼓励使用组合和委派,并为此提供了相应的语法甜点使其更容易接受。

    有了这样的定义:

    type Engine interface {
    Start()
    Stop()
    }

    type Car struct {
    Engine
    }

    于是我可以像下面这样编写:

    func GoToWorkIn(c Car) {
    /* get in car */

    c.Start();

    /* drive to work */

    c.Stop();

    /* get out of car */
    }

    当我声明Car这个struct的时候,我定义了一个匿名成员。这是一 个只能被其类型识别的成员。匿名成员与其它的成员一样,并有着和类型一样的名字。因此我还可以写成c.Engine.Start()。 如果Car并没有其自身方法可以满足调用的话,编译器自动的会将在Car上的调用委派给它的Engine上面的方法。

    由匿名成员提供的分离方法的规则是保守的。如果为一个类型定义了一个方法,就使用它。如果不是,就使用为匿名成员定义的方法。如果有两个匿名成员都提供一 个方法,编译器将会报错,但只在该方法被调用的情况下。

    这种组合是通过委派来实现的,而不是继承。一旦匿名成员的方法被调用,控制流整个都被委派给了该方法。所以你无法做到和下面的例子一样来模拟类型层次:

    type Base struct {}
    func (Base) Magic() { fmt.Print("base magic") }
    func (self Base) MoreMagic() {
    self.Magic()
    self.Magic()
    }

    type Foo struct {
    Base
    }
    func (Foo) Magic() { fmt.Print("foo magic") }

    当你创建一个Foo对象时,它将会影响Base的两个方法。然而,当你调用MoreMagic时, 你将得不到期望的结果:

    f := new(Foo)
    f.Magic() //=> foo magic
    f.MoreMagic() //=> base magic base magic

    并发

    Go的作者选择了消息传递模型来作为推荐的并发编程方法。该语言同样支持共享内存,然后作者自有道理:

    不要通过共享内存来通信,相反,通过通信来共享内存。

    该语言提供了两个基本的构件来支持这一范型:goroutineschannels

    Go例程

    Goroutine是轻量级的并行程序执行路径,与线程,coroutine或者进程类似。然而,它们彼此相当不同,因此Go作者决定给它一个新的名字并 放弃其它术语可能隐含的意义。

    创建一个goroutine来运行名为DoThis的函数十分简单:

    go DoThis() // but do not wait for it to complete

    匿名的函数可以这样使用:

    go func() {
    for { /* do something forever */ }
    }() // Note that the function must be invoked

    这些goroutine将会通过Go运行时而映射到适当的操作系统原语(比如,POSIX线程)。

    通道类型

    有了goroutine,代码的并行执行就容易了。然而,它们之间仍然需要通讯机制。Channel提供一个FIFO通信队列刚好能达到这一目的。

    以下是使用channel的语法:

    /* Creating a channel uses make(), not new - it was also used for map creation */
    ch := make(chan int)

    /* Sending a value blocks until the value is read */
    ch <- 4

    /* Reading a value blocks until a value is available */
    i := <-ch

    举例来说,如果我们想要进行长时间运行的数值计算,我们可以这样做:

    ch := make(chan int)

    go func() {
    result := 0
    for i := 0; i < 100000000; i++ {
    result = result + i
    }
    ch <- result
    }()

    /* Do something for a while */

    sum := <-ch // This will block if the calculation is not done yet
    fmt.Println("The sum is:", sum)

    channel的阻塞行为并非永远是最佳的。该语言提供了两种对其进行定制的方式:

    1. 程序员可以指定缓冲大小&mdash;&mdash;想缓冲的channel发送消息不会阻塞,除非缓冲已满,同样从缓冲的channel读取也不会阻塞,除非缓冲是空的。
    2. 该语言同时还提供了不会被阻塞的发送和接收的能力,而操作成功是仍然要报告。
    /* Create a channel with buffer size 5 */
    ch := make(chan int, 5)

    /* Send without blocking, ok will be true if value was buffered */
    ok := ch <- 42

    /* Read without blocking, ok will be true if a value was read */
    val, ok := <-ch

    Go提供了一种简单的机制来组织代码:包。每个文件开头都会声明它属于哪一个包,每个文件也可以引入它所用到的包。任何首字母大写的名字是由包导出的,并可以被其它的包所使用。

    以下是一个完整的源文件:

    package geometry

    import "math"

    /* Point is capitalized, so it is visible outside the package. */

    type Point struct {

    /* the fields are not capitalized, so they are not visible
    outside of the package */

    x, y float64
    }

    /* These functions are visible outside of the package */

    func (self Point) Length() float64 {
    /* This uses a function in the math package */
    return math.Sqrt(self.x*self.x + self.y*self.y)
    }

    func (self *Point) Scale(factor float64) {
    self.setX(self.x * factor)
    self.setY(self.y * factor)
    }

    /* These functions are not visible outside of the package, but can be
    used inside the package */

    func (self *Point) setX(x float64) { self.x = x }
    func (self *Point) setY(y float64) { self.y = y }

    缺失

    Go语言的作者试图将代码的清晰明确作为设计该语言作出所有决定的指导思想。第二个目标是生产一个编译速度很快的语言。有了这两个标准作为方向,来 自其它语言的许多特性就不那么适合了。许多程序员会发现他们最爱的语言特性在Go当中不存在,确实,有很多人也许会觉得Go语言由于缺乏其它语言所共有的 一些特性,还不太可用。

    这当中两个缺失的特性就是异常和泛型,两者在其它语言当中都是非常有用的。而它们目前都不是Go的一分子。但因为该 语言仍处于试验阶段,它们有可能最终会加入到语言里。然而,如果将Go与其它语言作比较的话,我们应当记住Go是打算在系统编程层面作为C语言的替代。明 白这一点的话,那么缺失的这许多特性倒也不是很大的问题了。

    最后,因为这一语言才刚刚发布,因此它没有什么类库或工具可以用,也没有Go语 言的集成编程环境。Go语言标准库有些有用的代码,但这与更为成熟的语言比 起来仍还是很少的。

    查看英文原文Google Go: A Primer


    感谢马国耀对本文的审校。

    给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。

    3 Comments 2010-04-03 00:40:51 by No.0023

    改造工具

    Tags: python, Py

    PyPy有一个工具叫py.lookup,可以搜索python源文件里的字符串,像这样:

    Shell:~/hgroot/iredadmin >: py.lookup username
    controllers/base.py:47:         if session.get('username') != None and session.get('logged') == True:
    libs/iredbase.py:92:             'username': None,
    controllers/ldap/admin.py:87:         self.username = web.safestr(i.get('username'))
    controllers/ldap/admin.py:89:         self.mail = self.username + '@' + self.domain

    ...

    但只能搜索python文件太不爽,于是决定改造一下,让它可以搜索其他文件:

    diff -r 02b74505f46d py.lookup
    --- a/py.lookup    Wed Mar 31 23:38:32 2010 +0000
    +++ b/py.lookup    Wed Mar 31 23:41:37 2010 +0000
    @@ -12,6 +12,7 @@
     from _findpy import py
     from py.__.misc.terminal_helper import ansi_print, terminal_width
     import re
    +import stat
     
     curdir = py.path.local()
     def rec(p):
    @@ -24,6 +25,8 @@
                       help="ignore case distinctions")
     parser.add_option("-C", "--context", action="store", type="int", dest="context",
                 default=0, help="How many lines of output to show")
    +parser.add_option("-p", "--pattern", dest="pattern",
    +            default="*.py", help="pattern for file name")
     
     def find_indexes(search_line, string):
         indexes = []
    @@ -42,7 +45,8 @@
         string = args[0]
         if options.ignorecase:
             string = string.lower()
    -    for x in curdir.visit('*.py', rec):
    +    for x in curdir.visit(options.pattern):
    +        if stat.S_ISDIR(x.stat().mode): continue
             try:
                 s = x.read()
             except py.error.ENOENT:


    修改后的帮助菜单如下:
    Shell:~ >: py.lookup -h
    usage: py.lookup SEARCH_STRING [options]

    Looks recursively at Python files for a SEARCH_STRING, starting from the
    present working directory. Prints the line, with the filename and line-number
    prepended.

    options:
      -h, --help            show this help message and exit
      -i, --ignore-case     ignore case distinctions
      -C CONTEXT, --context=CONTEXT
                            How many lines of output to show
      -p PATTERN, --pattern=PATTERN
                            pattern for file name

    --pattern的default也是*.py,但我们搜索其他类型的文件:
    Shell:~/hgroot/iredadmin >: py.lookup -p '*.html' utf-8
    templates/default/ldap/admin_profile.html:61: {% set cn = entry.get('cn', [''])[0].decode('utf-8') %}
    templates/default/ldap/admins.html:64:             {% set cn = entry.get('cn', [''])[0].decode('utf-8') %}
    templates/default/ldap/domain_profile.html:61: {% set cn = entries.get('cn', [''])[0].decode('utf-8') %}
    templates/default/ldap/layout.html:28:     <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    templates/default/ldap/users.html:81:                 {% set cn = entries.get('cn', [''])[0].decode('utf-8') %}
    templates/default/ldap/users.html:82:                 {% set employeeid = entries.get('employeeNumber', [''])[0].decode('utf-8') %}
    templates/default/ldap/macros.html:169:                                 {{ _("%s (%s)") |format( admin[1].get('cn')[0].decode('utf-8'), adminMail ) }}
    templates/default/ldap/user_profile.html:65: {% set cn = entries.get('cn', [''])[0].decode('utf-8') %}
    templates/default/ldap/user_profile.html:68: {% set employeeNumber = entries.get('employeeNumber', [''])[0].decode('utf-8') %}
    Shell:~/hgroot/iredadmin >:

    1 Comment 2010-04-01 21:45:01 by No.0023

    golang hg log

    Tags: golang, Go

    Shell:~ >: cd hgroot
    Shell:~/hgroot >: cd go
    Shell:~/hgroot/go >: hg log -r 0:4

    changeset:   0:f6182e5abf5e
    user: Brian Kernighan
    date: Tue Jul 18 19:05:45 1972 -0500
    summary: hello, world

    changeset: 1:b66d0bf8da3e
    user: Brian Kernighan
    date: Sun Jan 20 01:02:03 1974 -0400
    summary: convert to C

    changeset: 2:ac3363d7e788
    user: Brian Kernighan
    date: Fri Apr 01 02:02:04 1988 -0500
    summary: convert to Draft-Proposed ANSI C

    changeset: 3:172d32922e72
    user: Brian Kernighan
    date: Fri Apr 01 02:03:04 1988 -0500
    summary: last-minute fix: convert to ANSI C

    changeset: 4:4e9a5b095532
    user: Robert Griesemer
    date: Sun Mar 02 20:47:34 2008 -0800
    summary: Go spec starting point.

     

    No Comments 2010-03-24 15:19:57 by No.0023

    QQMail 的杯具

    Tags: QQMail

    尊敬的 85800355@qq.com
     
        感谢您使用QQ邮箱。
        您的邮箱总邮件数已经达到 39000 封,如果超过 40000 封,系统将视为邮箱已满,不能再收到新邮件。
        请您及时清理邮箱,保证邮件总数一直在 40000 封以下。
     
     
                                 QQ邮箱管理员

    No Comments 2010-03-12 17:31:01 by No.0023

    BSDMagazine

    Tags: BSD

    Shell:~/mylibs/share/BSDMagazine >: tree .
    .
    |-- 62-64__wywiad.pdf
    |-- BSD_01_2008.pdf
    |-- BSD_01_2009.pdf
    |-- BSD_01_2010.pdf.tar.gz
    |-- BSD_02_2008.pdf
    |-- BSD_02_2009.pdf
    |-- BSD_02_2010.pdf
    |-- BSD_03_2009.pdf
    |-- BSD_04_2009.pdf
    |-- instal_netbsd.pdf
    `-- marko.pdf

    0 directory, 11 files

    1 Comment 2010-02-28 22:32:13 by No.0023

    Go Lang介绍

    Tags: Go, Google

    Go Lang介绍
    Go编程语言是Google中一些大牛(尤其是有着plan9前科的大牛们)如Rob Pike,Ken Thomason这两位赫赫有名的程序高手、技术作于2007年9月开始建造。

    Pike指出,Go代码的编译基本上可以达到C语言的速度,几乎可以在瞬间完成,“就像是在使用交互式语言”。现有的语言都没有针对多核心处理器进 行优化,为了解决此类编程问题,Google工程师们开发了Go语言。从源文件的copyright可以看到,很多基础代码来自plan9.

    Go 已在Google公司内部测试过,但仍处于试验阶段。Google开放Go的代码,希望籍此帮助Go语言的发展。首席软件工程师Rob Pike说:我们开发Go,是因为近10年左右开发程序之难让我们有点沮丧。Google两年前开始开发Go,1年前开始有一只团队专职于此。目前只支持 unix平台, windows平台的支持由于资源的原因,需要更多的参与者来移植。
    Go的定位 是系统编程,比如Web服务器、存储系统和数据库等,但也欢迎在其它方面的应用。

    Go语言的官方吉祥物如下:

    我看好Go的原因是: 这个语言不是凭空或者实验室设计的,而是填补过去10年在系统编程软件方面的不足。作为系统软件的编写者,经常会深深的感觉到目前常见语言的面对大规模的 网络应用,在不断涌现的多核心硬件前的无奈, 纠缠在多线程和各种锁中间, 不停的制造各种各样的轮子, 低效的排错。Go拥有的这些现代特性都是系统用户梦迷以求的,经过作者全面的考虑,适当的取舍,即结合了动态语言的弹性,又有了静态语言的安全性和高性 能。

    目前这个GO社区非常活跃,邮件列表里每天都有几百个讨论,加上有Google的强力支持, 个人认为非常有前途。

    那么GO能解决什么问题:
    1. 硬件很快 软件开发很慢。
    2. 依赖很麻烦。
    3. c++ java太笨拙。
    4. 并行和gc
    5. 多核心机器的出现,未来几年128核心的机器都很常见。

    大部分的系统语言并不是设计来解决这些问题的,而且新涌现的大多数库并没有改善这些问题,相反加剧了。

    GO结合了动态语言的开发效率和静态编译型语言的安全性和运行效率,支持网络和多核编程,带给我们快速, 安全, 并发, 快乐。

    Go有着非常高的效率。 实际上golang.org就是用gdoc架设的。同时语言效能评测网站() Go和其他语言的对比,也充分说明了Go的效率和c语言很接近。

    GO的设计目标:
    1。 系统编程语言。
    2. 快速编译和执行。
    3. 类型安全性和内存使用安全。
    4. 很好的支持并发计算。
    5. 高效,低延迟的垃圾回收算法。

    指导原则:
    1. 减少bookkeeping。
    2. 更少的关键词,减少无谓的输入。无符号表设计使得语法分析,调试等大幅简单。
    3. 保持概念正交
    4. 保持简单。
    5. 减少类型,无类型层次,避免啰嗦。

    语言特性:
    清晰,精确的语法语法:大多数从c 继承, 包机制Pascal/Modula/Oberon family (declarations, packages),并发从(CSP)那里借鉴。
    大写符号导出符号。
    函数或者块开始注释是文档,用于gdoc处理。
    改进的If, case 复合语句,允许在条件前,执行语句。 Case 不支持自动fall throught, 必须显示说明。 Case支持多个判断。

    轻量的类型系统
    没有隐式的转换
    强类型,显式类型转化
    指针运算 slice代替 提供安全性
    通用类型:interface{}
    内置数组和字典
    支持面向对象编程,但是不支持层次继承。
    融合多种语言的特性,各个社区的人都会熟悉,特别是c, lua, python社区的用户非常容易上手。

    运行期: c和汇编实现内存的分配和收集,栈管理,轻量级协程,通讯管道,切片,Map以及反射等等基础设施。

    Gc:目前是用经典的简单的Mark And sweep 算法, 未来会采用更高效,低延迟的算法。

    库实现:
    1. 完全用Go语言实现, 不依赖其他系统库
    2. 从接口库如xml, asn1,jonson, IO库,压缩,加密库等等,比较齐全,极大的方便了用户。
    支持unicode. 值得一提的是 Go的 “hello 世界”,很好的展示了对unicode支持。

    模块:
    Package管理。一个package可以分散在多个文件里,就好比在一个文件效果一样。

    扩展:
    Cgo 支持c和go编程混合,使得GO的扩展非常容易,让Cgo来做参数和类型的转换, 直接连接用户的c函数。

    Range:for语句支持通用的迭代,支持数组,字典,通讯管道。 特别是通讯管道结合goroutine, 由生产者负责在一端输入数据, range充当消费者, 从另外一端。。。,使得包容器的迭代实现非常的优雅和简单易懂。

    Type: 相当灵活的struct, 支持匿名字段,复用看起来很优雅。

    Interface:
    接口 类型 接口实现分离。Interface{}用来实现表示同样类型,用于实现保容器和参数省略。

    闭包:函数是第一类对象。有了闭包,我们很容易把数据和函数结合在一起,形成一个独立的执行体,无需关心数据的泄漏。

    反射(reflection):用于实现多参数和实现比如xml库,很直观的把结构的字段名和值映射起来,但是效率不高。

    Network 支持。支持tcp,udp,接口统一,但网络读写暂时无效的时候,net模块会自动把该句柄注册到系统的poll, 并且让出执行,等待读写事件的发生。一旦事件通知,net内部通过channel通知阻塞的句柄继续往下执行。从用户的使用角度来看,网络的读写都是顺序 执行的,极大的简化了编程。

    Goroutine:Goroutines 是使得并发编程变得容易的核心。核心思想就是通过系统的线程来多路派遣独立函数的执行 单位协程。当一个协程阻塞的时候,比如说系统调用,调度器就会自动把其他协程安排到另外的线程去执行,从而保证了系统的不间断运行。 这个调度对于程序员是透明的,从用户的角度来看,协程在一直运行。而且这个调度的开销非常小,典型的CPU每秒钟可以调度百万次,使得我们可以创建大量的 goroutine, 模拟现实世界的行为,大大的简化了程序的设计和实现。

    Channel: CSP的核心思想是通过消息共享, 而不是内存共享。 而消息共享机制就是通过channel来传递消息,有同步和异步之分。 Channel在生产者和消费者之间架设起沟通的桥梁。

    正是 Network+闭包+Goroutine+Channel让Go这么突出。

    目前存在的问题:
    1. 语言的实现时间比较短,实现和社区都不够成熟,一些语言特性如select timeout还没有实现。
    2. 语言库和基于GO的应用还比较少,甚至在Google内部也还是个试验项目。

    2 Comments 2010-02-04 23:41:43 by No.0023

    my twitter

    Tags: twitter

    https://twitter.com/
    https://rabr.in/
    https://brizzly.com/
    https://t.jteet.com/
    http://twittload.com/
    http://power.com/
    http://fanfou.alwaysdata.net/
    http://is.gd/
    http://3.ly/
    http://yfrog.com/
    http://img.ly/
    http://twitpic.com/
    http://twitgoo.com/
    http://pingwire.com/
    http://twitterfeed.com/
    http://bit.ly/
    http://bitly.tv/
    http://j.mp/

    No Comments 2010-01-20 16:18:04 by No.0023

    我家儿子欣然的相册

    Tags: 欣然

    http://www.douban.com/photos/album/22113815/

     

     

    No Comments 2010-01-20 16:16:39 by No.0023

    beautiful

    Tags: Python

    you guest?

    漂亮吧?猜一下这图来自哪?

    3 Comments 2009-12-03 08:41:08 by No.0023

    终于用上了unladen-swallow

    Tags: Python

    Shell:~ >: python
    Python 2.6.1 (r261:900M, Nov 18 2009, 17:55:22)
    [GCC 4.3.2] on linux2
    [Unladen Swallow 2009Q4]
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

     

    由于OpenSolaris太慢了,换成Debian,终于可以用unladen-swallow.

    2 Comments 2009-11-19 09:18:59 by No.0023

    bpython Screenshots

    Tags: Python

    1 Comment 2009-11-11 22:34:04 by No.0023

    Monaco ttf is cool

    Tags: OpenBSD, others

    Monaco ttf from apple.com

    Mocaco tff

    4 Comments 2009-10-30 17:47:14 by No.0023

    iRedAdmin-0.1.1 (开源版)新版本发布

    Tags: iRedAdmin

    iRedAdmin-0.1.1 管理后台(开源版)发布了。下载地址:http://code.google.com/p/iredmail/downloads/list

    iRedAdmin 是为 iRedMail 开源邮件方案开发的基于 web 的管理后台,大家可以在这里访问 demo: http://demo.iredmail.org/
    我们也提供了全功能版的管理后台,将在 iRedMail 项目2周年生日的 2009-11-01 发布,只需要 99$ 即可。您可以从 demo 体验后再决定是否购买。demo 地址: http://demo.iredmail.org (选择 Full-featured edition)。

    以下是 0.1.1 版本从 0.1 版本发布以来的更新记录:


    • 支持实时的语言切换,支持多国语言。
    • 新建用户时默认允许使用 POP3S, IMAPS,以及通过 TLS/SSL 使用 managesieve 协议修改自己的邮件过滤规则。
    • 增加了 Vi_VN (Vietnamese),fr_FR(法语),zh_CN(简体中文)翻译。
    • 修正:将 SQL 模板中的语法由 'TYPE=' 改为 'ENINGE='。感谢论坛的 @peterpp 网友。
    • 在编辑帐号时显示帐号的当前状态(启用、禁用)。
    • 新建邮件域是默认添加 ou=Externals。
    • 修正:正确显示 404 错误页面。
    • 修正:将新建帐号的邮件地址都转换成小写。
    • 修正:修正新建帐号时错误的 maildir 路径(域名和用户名之间少了一个 '/')。
    • 修正:允许显示多个电话号码。
    • 列出用户时显示用户的 ID(员工ID,可用于存储类似工号之类的信息)。
    • 允许修改员工 ID。
    • 修正:编辑帐号时允许保存空的显示名称(cn)。

    No Comments 2009-10-30 11:07:55 by No.0023

    python exec

    Tags: Python

    In Python 2, exec is actually implemented as a special language statement,
    whereas Python 3 implements it as a standard library function.

    在python2是语句,在python3已经是标准的库函数了。

    2 Comments 2009-10-27 15:59:53 by No.0023

    中文 Scala 用户组

    Tags: Scala

    https://groups.google.com/group/scala-cn

    No Comments 2009-09-16 22:02:05 by No.0023

    sbaz is cool

    Tags: scala

    Shell:~ >: sbaz installed
    base/1.9
    sbaz/1.25tmp
    sbaz-setup/1.0
    scala/2.7.5.final
    scala-devel/2.7.5.final
    scala-documentation/2.7.5.final
    scala-library/2.7.5.final
    scala-tool-support/2.7.5.final
    8 packages installed
    Shell:~ >: sbaz upgrade 
    Refreshing list of available packages...
    Planning to install scala/2.7.6.final...
    Planning to install scala-devel/2.7.6.final...
    Planning to install scala-documentation/2.7.6.final...
    Planning to install scala-library/2.7.6.final...
    Planning to install scala-tool-support/2.7.6.final...
    Installing...
    sbaz upgrade  3.76s user 0.97s system 3% cpu 2:31.58 total
    Shell:~ >: scalac -version
    Scala compiler version 2.7.6.final -- Copyright 2002-2009, LAMP/EPFL

    No Comments 2009-09-11 15:16:03 by No.0023


    共有文章182篇 第(1/10)页 首页 上一页 1 2 3 4 5 6 7 8 9 ... 下一页 末页