推荐两本2008年可能走红的技术书

第一本:《Prototype 和 script.aculo.us》
你不曾知道的 JavaScript 世界!
 http://www.pragmaticprogrammer.com/titles/cppsu/index.html
 
作者:Christophe Porteneuve
页数: 330
ISBN: 1-934356-01-8
日期: 2007年10月
 
Prototype and script.aculo.us
在 Web 2.0 时代的 JavaScript 编程中,还没有因为纠缠不清的跨浏览器细节而感到厌烦吗?投入 Prototype 和 script.aculo.us 的怀抱吧,这两个极其流行的 JavaScript 类库,会让你的 JavaScript 编程体验胜似闲庭信步。不仅对 AJAX 编程的支持独树一帜,而且在拖放、自动完成、高级视觉效果和其他极其有用的特性方面也令人不禁拍案叫绝。通过使用这两个库,你要做的事只剩写一两行脚本,而且这些脚本看起来比 Ruby 的代码有过之而不无及!

关于本书
Web 应用程序的种类越来越丰富,而且日益具有了更高的交互性。但是,JavaScript、DOM、CSS 和一大堆的 Web 标准虽然相当复杂,却仍然不能保证结果被浏览器兼容。

而 Prototype 和 script.aculo.us 类库这两个有待发掘的宝库,却能够轻松地抚平浏览器间的种种差异,使得实现最常用的功能变成了小事一桩。通过学习本书,你可以迅速地掌握如何发挥这两个卓而不群的类库的强大威力。

深入 Prototype 中,你会发现,这个类库把 JavaScript 武装得如此强大,甚至会有人误以为是 Ruby 的代码。遍历 DOM、处理事件、运筹 AJAX 以及从根本上简化大多数的脚本编写量--这些在 Prototype 中都成为了一件轻而易举的事。

在开发基于高级界面功能的应用时,script.aculo.us 使得每一位 Web 开发者得以梦想成真--无论是需要创建能够自动完成的文本输入框,还是实现适当的文本编辑器,还是提供自定义的拖放功能,或者是通过视觉效果吸引用户的眼球,亦或是提高构建 DOM 片段的效率,应有尽有--而且也都是通过轻量级代码实现。

本书会引导你深入研究这些功能的全部细节,通过融合不同的服务器端技术,如 PHP、vanilla Ruby 和 Ruby On Rails,运用大量的实例来示范这些功能的方方面面。有能力的用户还可以学习到这些类库的设计原理,以及如何根据自己的需要发布并扩展这些类库。
第二本:《Prototype 和 Scriptaculous实战》
http://www.manning.com/crane3/

Dave Crane and Bear Bibeault with Tom Locke
出版日期:2007年3月
页数:544
ISBN: 1-933988-03-7

本书简介

Common Ajax tasks should be easy, and with Prototype and Scriptaculous they are. Prototype and Scriptaculous are libraries of reusable JavaScript code that simplify Ajax development. Prototype provides helpful methods and objects that extend JavaScript in a safe, consistent way. Its clever Ajax request model simplifies cross-browser development. Scriptaculous, which is based on Prototype, offers handy pre-fabricated widgets for rich UI development.

Prototype and Scriptaculous in Action is a comprehensive, practical guide that walks you feature-by-feature through the two libraries. First, you抣l use Scriptaculous to make easy but powerful UI improvements. Then you抣l dig into Prototype抯 elegant and sparse syntax. See how a few characters of Prototype code can save a dozen lines of JavaScript. By applying these techniques, you can concentrate on the function and flow of your application instead of the coding details. This book is written for web developers with a working knowledge of JavaScript.

《精通正则表达式》书评

作者:孟岩(原文) 

IT产业新技术日新月异,令人目不暇接,然而在这其中,真正称得上伟大东西的却寥寥无几。1998年,被誉为“软件世界的爱迪生”,发明了 BSD、 TCP/IP、csh、vi 和 NFS 的 SUN 首席科学家 Bill Joy 曾经不无调侃地说,在计算机体系结构领域里,缓存是唯一称得上伟大的思想,其他的一切发明和技术不过是在不同场景下应用这一思想而已。在计算机软件领域里,情形也大体相似。如果罗列这个领域中的伟大发明,我相信绝不会超过二十项。在这个名单当中,当然应该包括分组交换网络、Web、Lisp、哈希算法、UNIX、编译技术、关系模型、面向对象、XML 这些大名鼎鼎的家伙,而正则表达式也绝对不应该被漏掉。正则表达式具有伟大技术发明的一切特点,它简单,优美,功能强大,妙用无穷。对于很多实际工作来讲,正则表达式简直是灵丹妙药,能够成百倍地提高开发效率和程序质量。CSDN 的创始人蒋涛先生在早年开发专业软件产品时,就曾经体验过这一工具的巨大威力,并且一直印象深刻。而我的一位从事网络编辑工作的朋友,最近也领略了正则表达式的威力——他用 Perl 开发了一个不足 20 行的小程序,使用正则表达式将一项原本每天耗用10个人时的工作在一分钟之内自动完成。而正则表达式在生物信息学和人类基因图谱的研究中所发挥的关键作用,更是被传为佳话。无论对于软件开发者,还是从事其他知识工作的专业人士,正则表达式都是最有利的工具之一。

所谓正则表达式,就是一种描述字符串结构模式的形式化表达方法。在发展的初期,这套方法仅限于描述正则文本,故此得名“正则表达式(regular expression)”。随着正则表达式研究的深入和发展,特别是 Perl 语言的实践和探索,正则表达式的能力已经大大突破了传统的、数学上的限制,成为威力巨大的实用工具,在几乎所有主流语言中获得支持。为什么正则表达式具有如此巨大的魅力?一方面,因为正则表达式处理的对象是字符串,或者抽象地说,是一个对象序列,而这恰恰是当今计算机体系的本质数据结构,我们围绕计算机所做的大多数工作,都归结为在这个序列上的操作,因此,正则表达式用途广阔。另 一方面,与大多数其他技术不同,正则表达式具有超强的结构描述能力,而在计算机中,正是不同的结构把无差别的字节组织成千差万别的软件对象,再组合成为无所不能的软件系统,因此,描述了结构,就等于描述了系统。在这方面,正则表达式的地位是独特的。正因为这两点,在现在的软件开发和日常数据处理工作中,正则表达式已经是必不可少的工具。如果一个开发工具不支持正则表达式,那它就会被视为玩具语言,如果一个编辑器不支持正则表达式,那它就会被称为阳春应用。 连人们原本并不指望应用正则表达式的商用数据库,各家厂商也竞相以支持正则表达式为卖点。正则表达式的声势之隆,是毋庸置疑的。

非常奇怪的是,这样一个了不起的技术,在我国却并没有得到充分推广。以其价值而言,正则表达式不但值得每一个专业程序员掌握,而且值得所有知识工作者去了 解。然而现实情况是,不但一般知识工作者大多闻所未闻,很多专业程序员也视之为畏途。为什么会出现这种情况呢?原因有二。其一,正则表达式产生和发展在 UNIX 文化体系之中,而我国软件开发社群的知识结构长期受到微软的决定,UNIX 文化影响甚微。在 2002 年推出 .NET 平台之前,微软在其各项主流平台、产品与开发工具当中,均未对正则表达式给予足够重视,相应地,我们的开发者们对正则表达式也就知之不多。第二,也是更重要的原因,就是正则表达式并不是那么好掌握的,在通向驾驭正则表达式强大力量的道路上,还是有那么几只拦路虎的,而要打虎过岗,不但要花点功夫,还要有正确的方法。

学习正则表达式,入门不难,看一些例子,试着模仿模仿,就可以粗通,并且在工作中解决不少问题。然而大部分学习者也就就此止步,他们对自己说:“正则表达式不过如此,我就学到这里了,以后现用现学就行了”。他们以为自己可以像学习其他技术一样,在实践中逐渐提高正则表达式的应用水平。然而事实上,正则表达式并不是每天都会用到,而其密码般的形象,随着时间的推移很容易被忘记,所以经常发生的情况是,开发者对于正则表达式的记忆迅速消退,每次遇到新的问题, 都要查资料,重新唤回记忆,对于稍微复杂一点的问题,只好求助于现成的解决方案。反反复复,长期如此,不但应用水平难以明显提升,而且逐渐对这项技术产生一定的恐惧感和厌烦情绪。这还只是应用阶段,正则表达式应用的高级阶段,要求开发者此外还必须充分理解正则表达式的能力范围,能够将一些正则表达式技术组合应用,达成超乎一般想像的效果。为了高效、正确地解决实际问题,有的时候甚至要求深入理解正则表达式的原理,甚至对于如何实现正则表达式引擎都有所了解,在此基础上,规避陷阱,优化设计,提高程序执行效率。要达到这样的程度,不经过系统的学习是不可能的。

系统学习正则表达式并不是一件容易的事情,仅仅通过阅读一些“HOW TO”的快餐式的文章是不行的,必须有更完整、更系统的资料指导学习。如果你在国外技术社区里询问如何才能系统学习正则表达式,几乎所有的领域专家都会向你推荐一本书——Jeffrey Friedl 的《精通正则表达式》,也就是本书。

这本《精通正则表达式》是系统学习正则表达式的唯一最权威著作。可以说,在今天,如果想理解和掌握正则表达式,想要建立关于这一技术的完整概念体系,想充分发挥其巨大能量,这本书几乎是无法绕开的必经之路。甚至可以说,如果你没有读过这本书,那么你对于正则表达式的理解和应用能力一定达不到升堂入室的程度。本书第一版出于十年之前,自那时起就成为正则表达式领域最全面、最受欢迎的代表著作,数以万计的读者通过这本书掌握了正则表达式,成为行家里手。在任何时候,任何地方,只要提到正则表达式著作,人们都会提到这本书。这本书的质量之高,声誉之盛,使得几乎没有人企图挑战它的地位,从而在正则表达式图书领域形成独特的“一夫当关”的局面,称其为正则表达式圣经,绝对当之无愧。

为什么这本书能够表现得如此出色?我认为这其中有三个原因。其一,作者本人具有多年程序开发经验,理论基础深厚,实战经验丰富,对正则表达式这个主题透彻理解,因此在技术上得心应手,底气十足,对于技术上的难点不回避、不含糊。作者高超的技术水平是本书质量的强大保证。其二,作者思路对头,素材组织得当,用例丰富。正则表达式根植于数学理论,却又能在日常俗事上发挥巨大的效用。写这种类型的技术,思路稍微一偏差,就可能走歪路,不是太理论,就是太琐碎,不是太枯燥,就是太浅薄,实在很难把握。作者清楚地认识到,这本书的读者不是计算机科学家,但也不是满足于“知其然而不知其所以然”的快餐式代码小子,而是具有一定理论素养,却又始终以实践为本的专业开发者。他们需要的是面向实践的理论和思想,是实实在在的实战能力,只有满足这种需要,才能够真正打动读者。 通读此书,可以说作者对这一路线的把握十分成功,保证了内容大方向的正确。其三,这本书的写法独具匠心,堪称典范。技术图书的主要使命是传播专业知识。而专业知识分为框架性知识和具体知识。框架性知识需要通过系统的阅读和学习掌握,而大量的具体知识,则主要通过日常工作的积累以及随用随查的的学习来逐渐填充起来。本书前六章,以顺序式记述的方式,将正则表达式的系统知识娓娓道来,读者像看故事书似的就建立起整个正则表达式的基本知识体系。而后面的内容,则是方便实际开发中频繁查阅之用,包括各大主流语言对正则表达式的支持细节,包含有大量案例。这样的写法,完全符合一般人学习的特点,因此书读起来非常惬意,非常有趣,而用的时候查起来又非常方便。这样的著述风格,实在值得学习。

读者可以在没有任何正则表达式的基础上开始阅读此书,只要勤动脑,加强理解,适当动手练习,将能够在不长的时间里掌握正则表达式的思想和技术精华,这一点已经被很多人验证过,我本人也是这本书的受益者之一。正因为这本书独一无二的地位和高度的可读性,也因为正则表达式作为一项了不起的技术发明所具有的巨大威力,我非常希望更多的读者能够通过认真地学习本书而掌握这一强大技术,并享受阅读的乐趣。

Mastering Regular Expressions,3rd

《Mastering Regular Expressions,3rd》(以下简称《MRE3》)这本书的中译版也要上市了,中文名叫《精通正则表达式》,由电子工业出版社的博文视点推出。而《Beginning Regular Expressions》(以下简称《BRE》)可能还要等四个月以上才能面世。

本文的目的是就这两本“国内首册”正则表达式技术书的引进版作一比较。

首先,来看一下《MRE3》的英文目录(PDF下载):

Preface
1 Introduction to Regular Expressions
    Solving Real Problems
    Regular Expressions as a Language
        The Filename Analogy
        The Language Analogy
    The Regular-Expression Frame of Mind
        If You Have Some Regular-Expression Experience
        Searching Text Files: Egrep
    Egrep Metacharacters
        Start and End of the Line
        Character Classes
        Matching Any Character with Dot
        Alternation
        Ignoring Differences in Capitalization
        Word Boundaries
        In a Nutshell
        Optional Items
        Other Quantifiers: Repetition
        Parentheses and Backreferences
        The Great Escape
    Expanding the Foundation
        Linguistic Diversification
        The Goal of a Regular Expression
        A Few More Examples
        Regular Expression Nomenclature
        Improving on the Status Quo
        Summary
    Personal Glimpses
2 Extended Introductory Examples
    About the Examples
        A Short Introduction to Perl
    Matching Text with Regular Expressions
        Toward a More Real-World Example
        Side Effects of a Successful Match
        Intertwined Regular Expressions
        Inter mission
    Modifying Text with Regular Expressions
        Example: Form Letter
        Example: Prettifying a Stock Price
        Automated Editing
        A Small Mail Utility
        Adding Commas to a Number with Lookaround
        Text-to-HTML Conversion
        That Doubled-Word Thing
3 Over view of Regular Expression Features and Flavors
    A Casual Stroll Across the Regex Landscape
        The Origins of Regular Expressions
        At a Glance
    Care and Handling of Regular Expressions
        Integrated Handling
        Procedural and Object-Oriented Handling
        A Search-and-Replace Example
        Search and Replace in Other Languages
        Care and Handling: Summary
    Strings, Character Encodings, and Modes
        Strings as Regular Expressions
        Character-Encoding Issues
        Unicode
        Regex Modes and Match Modes
    Common Metacharacters and Features
        Character Representations
        Character Classes and Class-Like Constructs
        Anchors and Other “Zero-Width Assertions”
        Comments and Mode Modifiers
        Grouping, Capturing, Conditionals, and Control
    Guide to the Advanced Chapters
4 The Mechanics of Expression Processing
    Start Your Engines!
        Two Kinds of Engines
        New Standards
        Regex Engine Types
        From the Department of Redundancy Department
        Testing the Engine Type
    Match Basics
        About the Examples
        Rule 1: The Match That Begins Earliest Wins
        Engine Pieces and Parts
        Rule 2: The Standard Quantifiers Are Greedy
    Regex-Directed Versus Text-Directed
        NFA Engine: Regex-Directed
        DFA Engine: Text-Dir ected
        First Thoughts: NFA and DFA in Comparison
    Backtracking
        A Really Crummy Analogy
        Two Important Points on Backtracking
        Saved States
        Backtracking and Greediness
    More About Greediness and Backtracking
        Problems of Greediness
        Multi-Character “Quotes”
        Using Lazy Quantifiers
        Greediness and Laziness Always Favor a Match
        The Essence of Greediness, Laziness, and Backtracking
        Possessive Quantifiers and Atomic Grouping
        Possessive Quantifiers, ?+, ++, ++, and {m,n}+
        The Backtracking of Lookaround
        Is Alternation Greedy?
        Taking Advantage of Ordered Alternation
    NFA, DFA, and POSIX
        “The Longest-Leftmost”
        POSIX and the Longest-Leftmost Rule
        Speed and Efficiency
        Summary: NFA and DFA in Comparison
    Summary
5 Practical Regex Techniques
    Regex Balancing Act
    A Few Short Examples
        Continuing with Continuation Lines
        Matching an IP Addr ess
        Working with Filenames
        Matching Balanced Sets of Parentheses
        Watching Out for Unwanted Matches
        Matching Delimited Text
        Knowing Your Data and Making Assumptions
        Stripping Leading and Trailing Whitespace
    HTML-Related Examples
        Matching an HTML Tag
        Matching an HTML Link
        Examining an HTTP URL
        Validating a Hostname
        Plucking Out a URL in the Real World
    Extended Examples
        Keeping in Sync with Your Data
        Parsing CSV Files
6 Crafting an Efficient Expression
    A Sobering Example
        A Simple Change—Placing Your Best Foot Forward
        Efficiency Versus Correctness
        Advancing Further—Localizing the Greediness
        Reality Check
    A Global View of Backtracking
        More Work for a POSIX NFA
        Work Required During a Non-Match
        Being More Specific
        Alternation Can Be Expensive
    Benchmarking
        Know What You’r e Measuring
        Benchmarking with PHP
        Benchmarking with Java
        Benchmarking with VB.NET
        Benchmarking with Ruby
        Benchmarking with Python
        Benchmarking with Tcl
    Common Optimizations
        No Free Lunch
        Everyone’s Lunch is Different
        The Mechanics of Regex Application
        Pre-Application Optimizations
        Optimizations with the Transmission
        Optimizations of the Regex Itself
    Techniques for Faster Expressions
        Common Sense Techniques
        Expose Literal Text
        Expose Anchors
        Lazy Versus Greedy: Be Specific
        Split Into Multiple Regular Expressions
        Mimic Initial-Character Discrimination
        Use Atomic Grouping and Possessive Quantifiers
        Lead the Engine to a Match
    Unrolling the Loop
        Method 1: Building a Regex From Past Experiences
        The Real “Unrolling-the-Loop” Pattern
        Method 2: A Top-Down View
        Method 3: An Internet Hostname
        Observations
        Using Atomic Grouping and Possessive Quantifiers
        Short Unrolling Examples
        Unrolling C Comments
    The Freeflowing Regex
        A Helping Hand to Guide the Match
        A Well-Guided Regex is a Fast Regex
        Wrapup
    In Summary: Think!
7 Perl
    Regular Expressions as a Language Component
        Perl’s Greatest Strength
        Perl’s Greatest Weakness
    Perl’s Regex Flavor
        Regex Operands and Regex Literals
        How Regex Literals Are Parsed
        Regex Modifiers
    Regex-Related Perlisms
        Expression Context
        Dynamic Scope and Regex Match Effects
        Special Variables Modified by a Match
    The qr/˙˙˙/ Operator and Regex Objects
        Building and Using Regex Objects
        Viewing Regex Objects
        Using Regex Objects for Efficiency
    The Match Operator
        Match’s Regex Operand
        Specifying the Match Target Operand
        Different Uses of the Match Operator
        Iterative Matching: Scalar Context, with /g
        The Match Operator’s Environmental Relations
    The Substitution Operator
        The Replacement Operand
        The /e Modifier
        Context and Return Value
    The Split Operator
        Basic Split
        Returning Empty Elements
        Split’s Special Regex Operands
        Split’s Match Operand with Capturing Parentheses
    Fun with Perl Enhancements
        Using a Dynamic Regex to Match Nested Pairs
        Using the Embedded-Code Construct
        Using local in an Embedded-Code Construct
        A Warning About Embedded Code and my Variables
        Matching Nested Constructs with Embedded Code
        Overloading Regex Literals
        Problems with Regex-Literal Overloading
        Mimicking Named Capture
    Perl Efficiency Issues
        “Ther e’s Mor e Than One Way to Do It”
        Regex Compilation, the /o Modifier, qr/˙˙˙/, and Efficiency
        Understanding the “Pre-Match” Copy
        The Study Function
        Benchmarking
        Regex Debugging Information
    Final Comments
8 Java
    Java’s Regex Flavor
        Java Support for \p{˙˙˙} and \P{˙˙˙}
        Unicode Line Terminators
    Using java.util.regex
    The Pattern.compile() Factory
        Pattern’s matcher method
    The Matcher Object
        Applying the Regex
        Querying Match Results
        Simple Search and Replace
        Advanced Search and Replace
        In-Place Search and Replace
        The Matcher’s Region
        Method Chaining
        Methods for Building a Scanner
        Other Matcher Methods
    Other Pattern Methods
        Pattern’s split Method, with One Argument
        Pattern’s split Method, with Two Arguments
    Additional Examples
        Adding Width and Height Attributes to Image Tags
        Validating HTML with Multiple Patterns Per Matcher
        Parsing Comma-Separated Values (CSV) Text
    Java Version Differences
        Differences Between 1.4.2 and 1.5.0
        Differences Between 1.5.0 and 1.6
9 .NET
    .NET’s Regex Flavor
        Additional Comments on the Flavor
    Using .NET Regular Expressions
        Regex Quickstart
        Package Overview
        Core Object Overview
    Core Object Details
        Creating Regex Objects
        Using Regex Objects
        Using Match Objects
        Using Group Objects
    Static “Convenience” Functions
        Regex Caching
    Support Functions
    Advanced .NET
        Regex Assemblies
        Matching Nested Constructs
        Capture Objects
10 PHP
    PHP’s Regex Flavor
    The Preg Function Interface
        “Pattern” Arguments
    The Preg Functions
        preg_match
        preg_matchRall
        preg_replace
        preg_replaceRcallback
        preg_split
        preg_grep
        preg_quote
    “Missing” Preg Functions
        preg_regex_to_pattern
        Syntax-Checking an Unknown Pattern Argument
        Syntax-Checking an Unknown Regex
    Recursive Expressions
        Matching Text with Nested Parentheses
        No Backtracking Into Recursion
        Matching a Set of Nested Parentheses
    PHP Efficiency Issues
        The S Pattern Modifier: “Study”
    Extended Examples
        CSV Parsing with PHP
        Checking Tagged Data for Proper Nesting
Index

页面: 1 2 3 4 5 6

Regular Expression Pocket Reference, Second Edition

偶尔发现这本书的,觉得(对出版社和读者来说都)很有价值。如果配合《Beginning Regular Expressions》出版,可谓“珠联璧合”。因为《Beginning Regular Expressions》前半部分讲述了正则表达式方方面面的基本概念和原理;后半部分以独立整章的形式详尽介绍了 16 种应用软件、工具和编程语言中的正则表达式功能,包括:

第11章 在 MICROSOFT WORD 中使用正则表达式
第12章 在 STAROFFICE/OPENOFFICE.ORG WRITER 中使用正则表达式
第13章 通过 FINDSTR 使用正则表达式
第14章 POWERGREP
第15章 MICROSOFT EXCEL 中的通配符
第16章 SQL SERVER 2000 中的正则表达式功能
第17章 在 MYSQL 中使用正则表达式
第18章 正则表达式与 MICROSOFT ACCESS
第19章 JSCRIPT 和 JAVASCRIPT 中的正则表达式
第20章 正则表达式与 VBSCRIPT
第21章 VISUAL BASIC .NET 与正则表达式
第22章 C# 和正则表达式
第23章 PHP 和正则表达式
第24章 W3C XML SCHEMA 中的正则表达式
第25章 JAVA 中的正则表达式
第26章 PERL 中的正则表达式

如上所示,该书所介绍的语言和工具中包含 《Regular Expression Pocket Reference, Second Edition 》中的大部分内容,读者可以相互参照、互为补充。《Regular Expression Pocket Reference, Second Edition 》的目录试译如下:

关于本书
Regexe 和 Pattern 匹配简介
  Regex 元字符、模式(mode)和构建 
  Unicode 支持
正则表达式实例
  解决方案 
Perl 5.8 
  支持的元字符
  正则表达式操作符
  Unicode 支持
  例子
  其他资源
Java (java.util.regex) 
  支持的元字符
  正则表达式类和接口
  Unicode 支持
  例子
  其他资源
.NET and C# 
  支持的元字符
  正则表达式类和接口
  Unicode 支持
  例子
  其他资源
PHP 
  支持的元字符
  基于模式(Pattern)匹配的函数
  例子
  其他资源
Python 
  支持的元字符
  re 模块对象及函数
  Unicode 支持
  例子
  其他资源
RUBY 
  支持的元字符
  面向对象的接口
  Unicode 支持
  例子
JavaScript 
  支持的元字符
  基于模式(Pattern)匹配的方法和对象
  例子
  其他资源
PCRE 
  支持的元字符
  PCRE API 
  Unicode 支持
  例子
  其他资源
Apache Web Server 
  支持的元字符
  RewriteRule (重写规则)
  Matching Directives (匹配指令)
  例子
vi Editor 
  支持的元字符
  模式(Pattern)匹配
  例子
  其他资源
Shell 工具
  支持的元字符
  其他资源
 

另外,这本《Regular Expression Pocket Reference, Second Edition 》的卖点主要还有:

1. 包含当今正方兴未艾的脚本语言 Perl、Python、Ruby 中的正则表达式内容;

2. 包含 Apache Web Server  中的正则表达式内容。

如今个人博客网站正如火如荼,其中大多是基于 PHP 脚本的免费 CMS,如 WordPress、Drupal、 ExpressionEngine、Joomla/mambo 、vBulletin  和 Textpattern 等,而随着应用的普及和层次的提高,这些 CMS 都将转而使用 Apache 服务器,因为 Apache 内置了 Mod_Rewrite 和 .htaccess 指令文件--也就是模块重写规则,这样才能使这些 CMS 才尽其用。而 Mod_Rewrite 和 .htaccess 指令文件都涉及到使用正则表达式来定义重写规则。

3. 包含在 Shell 工具中使用正则表达式的内容。随着 Windows 新一代 shell 语言 PowerShell 的发布(比如,与《Beginning Regular Expressions》同一作者的《Professional.Windows.PowerShell (Wros,Apr.2007)》就是一本专门介绍 PowerShell 的书),以及 SSH(Secure Shell)的重新流行,在这些语言中使用正则表达式完成特定的任务也将是一种趋势。

4. 这本书也补充了《Beginning Regular Expressions》一书中缺少的流行内容。

《CSS 权威指南,第三版》

这本书的第二版(2004年出版)去年我就翻译完了--虽然当时已经看到 Oreilly 和 Amazon 中第三版的预告了,但我还是决定先翻译完第二版--就是想看看第三版会有多大的变化?想看看两年多来,Eric A. Meyer 大师修订的内容都着重于哪些方面。于是,我日复一日地往前赶,终于在这本书第三版面世时翻译完了,那是2006年11月。于是,我“雄心勃勃”地计划再重新翻译第三版,因为我预计第三版一定会像《JavaScript The Definitive Guide,5th Edition 》(2006年8月第五版)那样,不仅内容重新编排,而且会“与时俱进”地增加很多新技术或新应用的介绍--这几年,随着 Web 编程技术及应用突飞猛进的发展,特别是对 JavaScript 和 CSS 技术的重新认识,以及标准化浪潮的推动,使上述二者分别作为 Web 编程中的行为层和表现层日益回归了本来的面目,CSS 的重要地位日益突显。而且,大量以 CSS 为主题的网站中对有关 CSS 布局、导航、菜单、定位技术应用、负外边距使用的探讨也达到了一个全新的境界。加之 IE 7 对 CSS 标准的支持(正确的盒模型、支持非A元素的悬停事件响应、支持相邻选择符、支持固定定位,以及修正大量的不规范行为等),可以说已经为 CSS 权威指南第三版中增加全新内容、全新应用,甚至“洗心革面”作了大量铺垫。所以,当时我觉得应该有理由满怀希望地期待第三版的隆重面世!

可是,当我有点欣喜若狂地打开这本书的第二版和刚刚得到第三版原版一一对照时,一种失望之感却油然而生。经过仔细对比,我发现这两个版本的内容几乎可以用“相差无几”来形容。当时感觉真有点不敢相信自己的眼睛--但事实的确如此。于是,想重新翻译第三版的计划也就搁浅了--因为只须对照原文修改“几”处变化不大的地方即可堂而皇之地将“第二版”升级为“第三版”(而且,有些改动,只是语言描述上的。比如:在段前加个 So,或者在句中加个 to;另外去掉零星过时的“小提示”等)。当时感觉,与其叫第3版不如叫第2.1版更恰当一些。

后来,又陆续翻译了其他几本 CSS 方面的书,如《Cascading Style Sheets: Designing for the Web, Third Edition 》和《Stylin with CSS – A Designers Guide 》。使我对这本书的第三版有了重新认识--姑且这么认识吧(毕竟失望还是有的)。也就是说,这本书的主要内容讲述 CSS 2.1 规范,也完全涵盖了新的应用中对 CSS 原理的利用。内容一点都不过时,而且不仅不过时,甚至可以说对理解当前标准的 CSS 技术(不含 Hack 或 Filters)以及新的应用具有奠基的意义,值得每一名 Csser 认真研究和领会。可能是我以前没有太重视这一点,也可能是 Eric A. Meyer 大师认为现在这些应用仍然没有超出他第二版的“如来佛掌心”罢,所以第三版只给我们这些学生换了个封面。但,不管怎么说,从我个人翻译全书的体会而言,这的的确确一本经典、也是名符其实的“权威指南”--是学习 CSS 必备的书。

(事实上,《Cascading Style Sheets: Designing for the Web, Third Edition 》的水准与这本书也在伯仲之间。该书作者 Hå;kon Wium Lie 和 Bert Bos 同是 CSS 2.1 规范〈http://www.w3.org/TR/CSS21/〉的编辑,其中 Hå;kon Wium Lie  2005年在挪威奥斯陆学院提交的长达300页的博士论文的题目就是《Cascading Style Sheets》〈http://people.opera.com/howcome/2006/phd/〉)

《JavaScript 权威指南,第四版》

虽然我没有看到这本书,但我丝毫不怀疑张铭泽老师的翻译水平。

他翻译的《JAVASCRIPT 权威指南(第四版)》是我看到过翻译的最好的书,我曾经拿他翻译的中文版与英文版中的一些章节逐句地对照过,可以说翻译质量的达到了“信、达”的标准,是同类计算机图书译作中少有的上乘之作。至于“雅”则是个见仁见智的问题了--不过,由于计算机图书本身描述的是技术,语言追求的是简练、准确,而不像文学作品强调词藻和意境。所以,只要译者能做到忠实原文之意(当然原文必须正确),还能做到词句畅达、衔接自然,我觉得就算是好译作了。

不强调“雅”,而强调“信、达”,并非认为计算机图书的翻译可以等而下之,或者说可以不追求“雅”。恰恰相反,计算机图书也应该把“雅”作为翻译的最高境界。只不过,我认为计算机图书译作的“信、达”是译者容易把握的,而“雅”却是由原书作者的谋篇布局能力所决定的--也就是说计算机图书的“雅”必须建立在原作者对该门技术深刻理解和良好表达的基础之上。为什么有的计算机图书(包括中文翻译版)能够让人手不释卷、忍俊不禁;而有的却会令人抓耳挠腮、不知所云。本人认为很多书,都堪称大“雅”之作。比如:《JAVASCRIPT 权威指南(第四版)》,还有《Pro JavaScript Techniques》(JQuery库的作者所著)等等。只有原书有“雅”,译者才能有“发挥空间”,否则必将是“巧妇难为无米之炊”。但也不排除有的书看英文原版,觉得酣畅淋漓,而再读中文版反而感觉晦涩难懂的情况。这里面既存在译者对原文理解(如技术要点)和对中文母语表达的驾驭能力问题;也存在由于语言文化背景的巨大差异和原作者表达风格习惯(如原作者在英文原作中借古讽今,使用隐喻,甚至使用复杂句型等)对翻译形成“非技术性障碍”的问题。

尽管有那么多网友都对这本书的翻译提出了异议,我也非常尊重各位网友的意见,相信大家的意见不是空穴来风。但毕竟我对张铭泽老师的印象从看完他译的《JAVASCRIPT 权威指南(第四版)》后,就始终是持一个非常肯定的态度。所以,我想说不能因为一本书就否定一个好译者。大家积极地关注和提意见,既是出于对这门技术的深爱,也是出于对译者的关心。我倡议大家应该客观地提意见、批评译作,但不要使用过激言语,共同营造一个和谐的评论空间。否则,如果译者看了您的评论后觉得连辩解余地都没有,相信也不是您发表评论的本意罢。