异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
然而,对于任意字符到底意味着什么则存在一些混淆。用来处理正则表达式的最古老的工具在处理文件时是逐行处理的,因此,在目标文本中从来不可能出现包含换行符的情形。在本书中讨论的编程语言则会把目标文本当作一个整体来处理,而不去管其中到底会包含多少个换行符。
创建一个正则表达式来匹配calendar的所有常见的错误拼写形式,使你能够在一份文档中找到这个单词而无需依赖作者的拼写能力。在每个元音位置都允许使用a或者e。创建另外一个正则表达式来匹配一个单个的十六进制字符。再创建一个正则表达式来匹配不属于十六进制字符的单个字符。
匹配一个包含下列ASCII控制字符的字符串:振铃符(bell)、转义符(escape)、换页符(form feed)、换行符(line feed)、回车符(carriage return)、水平制表符(horizontal tab)和垂直制表符(vertical tab)。
新接触正则表达式的人通常会对看到的每个标点字符进行转义。不要让任何人看出来你是个新手!要明智地选择需要转义的场合(时机)。一大堆不需要的反斜杠会使正则表达式变得难以阅读,特别是当在源代码中把正则表达式作为字符串来引用以至于所有这些反斜杠必须加倍出现的时候。
除非已经拥有了相当长的使用正则表达式编程的经验,否则建议你先在一个工具中试验一下正则表达式,而不是直接在源代码中使用它们。本章和第2章中提供的正则表达式示例都是原始正则表达式,其中并不包含编程语言(即使是Unlx shell)所必需的额外的转义符号。
虽然替代文本(replacement text)并不是一个正则表达式,读者也可以使用某些特殊的语法构造动态的替代文本。所有的流派都允许把正则表达式或者某个捕获分组匹配到的文本,重新添加到替代字符串中。实例2.20和实例2.21会对此加以讲解。
正则表达式(regular expression)是一种可以在许多现代应用程序和编程语言中使用的特殊形式的文本模式。它们可以用来验证输入是否符合给定的文本模式;在一大段文本中查找匹配该模式的文本;用其他文本来替换匹配该模式的文本或者重新组织匹配文本的片段;把一块文本切分成一系列更小的文本,当然如果使用不当也可能搬起石头砸自己的脚。
IT运维领域正在进行一场革命。新一代的配置管理工具可以在几秒内完成大量服务器的构建(配置)和整个网络自动化。为了充分利用云计算的强大功能,并且建立可靠、可扩展、安全、高性能的系统,拥有Puppet这样的工具是必不可少的。
Puppet通过regsubst函数提供了一种简单的方式来处理文本,在字符串中进行搜索和替换,或者从字符串中提取所需模式(子串)。人们经常需要用它来处理来自fact或来自外部程序的数据。
本节书摘来自异步社区《Puppet实战手册》一书中的第2章,第2.11节,作者:【英】John Arundel著,更多章节内容可以访问云栖社区“异步社区”公众号查看
Puppet会比较$::operatingsystem和每个所提供的可能的值:Ubuntu、Debian等。这些值可以是正则表达式(例如,部分字符串匹配或通配符匹配),但在此例中,只使用文字字符串(或全字符匹配)。
正则表达式非常强大,但是很难理解和调试。如果感觉正在用的正则表达式太复杂,不能一眼看明白它在做什么,最好简化设计,使其更加简单化。但是,正则表达式捕获模式是个非常有用的功能。
此外,也可以通过在清单内设置变量来调整引入的类的行为。例如,在数据中心A的服务器可能需要使用与在数据中心B不同的DNS服务器,或者可能需要为Ubuntu系统使用一组类,而其他系统使用另一组不同的类。
当Puppet遇到数组作为一个资源的名称时,它会为数组中每个元素的创建一个资源。在这个例子中,$packages数组中的每一个软件包都会被Puppet创建一个新的package资源,并且使用相同的参数(ensure => installed)。这是一种简化相似资源书写的方式。
任何传递给inline_template函数的字符串的内容都会被当作ERB模板来执行。也就是说,任何在<%=和%>分隔符之间的内容都将作为Ruby代码而执行,而其余的部分将被视为字符串。
本节书摘来自异步社区《Puppet实战手册》一书中的第2章,第2.5节,作者:【英】John Arundel著,更多章节内容可以访问云栖社区“异步社区”公众号查看
模块是将相关的事物进行组合的一种简单方式。例如,一个webserver模块应该包括让一台机器作为Web服务器所必需的一切:Apache的配置文件、虚拟主机模板和一些必要的用来部署它们(Apache的配置文件、虚拟主机模板)的Puppet代码。
使用一些风格约定是很有必要的,特别是代码编写工作存在协同的情况下。除非彼此能够在空格、跳格(Tab)、引用、对齐等方面达成一致的标准,否则,代码将会被认为非常丑陋并且难以阅读和维护。
如果其他人需要阅读或维护你的配置清单,或者如果读者想通过社区分享自己的代码,那么尽可能密切地按照现有风格、规范进行代码编写会是一个很好的主意。这些会在代码的布局、间距、引号、对齐方式和变量引用等方面进行约束
本章中讲解如何编写优雅的Puppet配置清单(Puppet用于配置服务器的程序代码被称为配置清单,以后均使用配置清单说法)。这里“优雅”的意思是代码符合社区习惯,可读、高效、一致。
这是非常有用的。如果清单中的任何一个位置存在语法错误,那么都会停止Puppet在所有节点上运行,即使节点中没有使用那部分有错误的配置清单。因此,检查配置清单中的错误,直到问题被发现,可能引起一段时间内Puppet在生产环境中无法应用变更,这可能会带来严重的后果。
如果希望让新的服务器成为Puppet基础设施的一部分,只需要在服务器上面运行几条命令就可以实现,但现在通过为Rakefile添加新引导任务的方式使这一过程更加简单。
Rake是一个基于Ruby语言编写的实用工具,它可以帮助自动化完成Puppet的工作流程。虽然有很多其他方法支持在远程服务器上运行命令,但是Rake碰巧是本书使用的方法,它很容易扩展,可以非常方便地使用它做任何事。
到现在为止,已经实现了从被管理的服务器上通过SSH认证访问GitHub(使用SSH代理转发),但是如果不登录到服务器并执行相关命令,服务器就不能自动拉取更新。所以,此处创建了一个新的SSH密钥对,将公钥作为部署密钥添加到GitHub,使拥有密钥文件的服务器可以访问仓库。
人们希望可以尽量简单和简单地将Puppet配置应用到主机上,因此,通常会写一个脚本,它包含puppet apply命令和所需要的参数。要部署这个脚本到需要它的地方,除了Puppet,还有什么更好的工具吗?
换句话说,如果能安排适当的清单文件分发至客户端上,就可以使用Puppet直接执行而不需要通过Puppet Master来控制。这将消除由于仅有一台主服务器导致的性能瓶颈,也消除了单点故障。同时,这也避免了添加新的客户端时颁发SSL签名证书的问题。
现在,已经将Puppet配置清单文件添加到仓库并创建了第一条提交。这个提交更新了仓库的历史,但仅保存在本地工作副本中。如果要将副本的变化同步到GitHub上,还需要运行git push命令推送所有变更。
如果读者已经有一些Puppet代码(也就是Puppet配置清单manifest),那么可以跳过此步骤继续下一步。如果没有,就来学习一下如何去创建和应用一个简单的配置清单。
如果安装的Puppet版本与本书不完全相同,不用担心,可以从Puppet Labs获取由它提供的最新稳定版本。在很长的一段时间之内,Puppet的版本都会是3.x系列,读者不用担心本书的示例无法运行。
你是否注意到市面上存有大量的C语言编程书籍,它们的书名具有一定的启示性,如:C Traps and Pitfalls(本书中文版《C陷阱与缺陷》已由人民邮电出版社出版), The C Puzzle Book, Obfuscated C and Other Mysteries,而其他的编程语言好像没有这类书。
本书包含一些代表着Puppet社区认同的最佳实践的实例,一些可以帮助读者在工作中更容易使用Puppet的小提示和技巧,还有介绍一些读者以前不知道的功能。虽然有些技巧操作起来比较快捷,但是本书不建议读者将其作为标准操作流程使用(这些技巧在紧急情况下是非常有用的)。
Git提供了丰富、强大的功能来加入到开发的不同分支。第9章介绍了合并分支和解决分支冲突的基础。对Git模型的一个关键洞察力是意识到Git执行的所有合并是发生在当前工作目录上下文的本地版本库中的。
Git依赖于SHA1散列函数的另一个后果:你是如何得到称为68aba62e560c0ebc3396 e8ae9335232cd93a3f60的树的并不重要。如果你得到了它,你就可以非常有信心地说,它跟本书的另一个读者的树对象是一样的。
请注意提交对象之间箭头的方向。父提交在时间上来得更早。因此,在Git的实现里,每个提交对象指回它的一个或多个父提交。很多人对此感到困惑,因为版本库的状态通常画成反方向:数据流从父提交流向子提交。
Git版本库(repository)只是一个简单的数据库,其中包含所有用来维护与管理项目的修订版本和历史的信息。在Git中,跟大多数版本控制系统一样,一个版本库维护项目整个生命周期的完整副本。然而,不同于其他大多数VCS,Git版本库不仅仅提供版本库中所有文件的完整副本,还提供版本库本身的副本。
本节书摘来自异步社区《Git版本控制管理(第2版)》一书中的第1章,第1.4节,作者:【美】Jon Loeliger , Matthew McCullough著,更多章节内容可以访问云栖社区“异步社区”公众号查看
VCS的完整历史已经超出了本书的讨论范围。然而,有一些具有里程碑、革新意义的系统值得一提。这些系统对Git的开发或者有重要的铺垫意义,或者有引导意义。(本节为可选章节,希望能够记录那些新特性出现的时间,以及在自由软件社区变得流行的时间。)
现如今,难以想象有创意的人会在没有备份策略的情况下启动一个项目。数据是短暂的,且容易丢失——例如,通过一次错误的代码变更或者一次灾难性的磁盘崩溃。所以说,在整个工作中持续性地备份和存档是非常明智的。
软件架构有一些前置条件(设计原则)和一个后置条件(实现一个产生预期结果的系统)。本书的第1部分是“基础”,为软件架构打下基础,关注架构师的角色、软件项目的固有机制以及提升软件品质方面,如可测试性和可读性。
本节书摘来自异步社区《Android 应用测试指南》一书中的目录,作者 【阿根廷】Diego Torres Milano(迭戈 D.),更多章节内容可以访问云栖社区“异步社区”公众号查看
本节书摘来自异步社区《Microsoft.NET企业级应用架构设计(第2版)》一书中的第2章,第2.5节,作者: 【意】Dino Esposito(埃斯波西托) , Andrea Saltarello(索尔塔雷罗)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
重新设计一个完整系统与完全从头开始开发之间的区别是什么?就采取的措施而言,区别是极小的,如果存在任何区别的话。但心理层面的选择是不同的。如果要求重新设计,管理层传递的信息是团队正在迎头赶上并且快速修复东西。如果要求重写,管理层则是在承认失败。在软件项目里很少愿意接受失败。
如果你问:“什么导致项目失败?”,你得到的最常见的回答可能会把失败归咎到与业务有关的问题,比如说,缺少需求,项目管理不到位,成本估算不正确,缺少沟通,甚至各个团队的人员相互不配合。你很难看到坏代码可能导致问题这种情况。
今天,成功设计的软件对于任何类型、任何规模的商业来说都是至关重要的,但更为关键的是避免质量低下的软件。烂的软件会使组织在很多地方遭受损失,比如说,响应很慢的页面会导致访问者离开你的网站,笨拙的用户界面会带来入口瓶颈,导致你提供的服务不得不面对处理队列,甚至未处理异常也会触发不可控的连锁反应,造成不可预测的后果。
本节书摘来自异步社区《Microsoft.NET企业级应用架构设计(第2版)》一书中的第1章,第1.4节,作者: 【意】Dino Esposito(埃斯波西托) , Andrea Saltarello(索尔塔雷罗)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
我们通常会拿软件和土木工程比较,但是,当土木工程师要建一座桥时,这座桥将会建成。除此之外,这座桥总能正常使用,而且建筑成本和原先的预算相差无几。这对于很多软件项目来说并非如此。放到软件上,有时候很难确定利益相关者的承诺最终有哪些能够兑现。
在软件项目里,有些事情是在架构师参与进来之前发生的。一群分析师、IT经理以及高管见面、讨论、评估以及谈判。一旦确认新增的或者更新系统的需求,而且也有预算,分析师就会引出需求,这通常基于他们对业务、公司流程、环境以及最终用户反馈的了解。
在计算机的最初年代,硬件成本远远大于软件成本。数十年之后,我们发现情况有了根本的变化。整个工业有了显著的进步,而硬件成本也急剧下降。另一方面,软件成本却大幅上升,这主要是因为开发自定义企业软件的复杂性提升了。
该团队根据从销售、市场以及工程团队收集到的数据,甄别并提供高价值的解决方案,并为内外部用户开发参考架构。Scott是Red Hat认证构架师(RHCA),具有超过15年的IT从业经验,他现在专注于Docker、OpenShift以及Red Hat系列产品。