为了批量操作,重新开始发展 HTML5

2019-08-10 作者:小鱼儿主页高手论坛   |   浏览(103)

开篇,还是得说说 ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明
如果您是新手,猜你取消 正则表达式30分钟入门教程
"^The": 开头一定要有"The"字符串;
"of despair$": 结尾一定要有"of despair" 的字符串;
那么,
"^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配
"notice": 匹配包含notice的字符串
你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边
接着,说说 '*', ' ',和 '?',
他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:
"zero or more"相当于{0,},
"one or more"相当于{1,},
"zero or one."相当于{0,1}, 这里是一些例子:
"ab*": 和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串("a", "ab", "abbb", 等);
"ab ": 和ab{1,}同义,同上条一样,但最少要有一个b存在 ("ab", "abbb", 等.);
"ab?":和ab{0,1}同义,可以没有或者只有一个b;
"a?b $": 匹配以一个或者0个a再加上一个以上的b结尾的字符串.
要点, '*', ' ',和 '?'只管它前面那个字符.
你也可以在大括号里面限制字符出现的个数,比如
"ab{2}": 要求a后面一定要跟两个b(一个也不能少)("abb");
"ab{2,}": 要求a后面一定要有两个或者两个以上b(如"abb", "abbbb", 等.);
"ab{3,5}": 要求a后面可以有2-5个b("abbb", "abbbb", or "abbbbb").

HTML5定稿,html5

我使用DW 这个所见所得的编辑器来写html时,喜欢写上注释,如<!-- header --> 等等的注释,在一次比较大的改动时,需要批量查找替换,为了批量操作,于是我写了一个正则表达式来进行处理。

ceph管理平台Calamari的扩展开发

接近大半年没有写日志了,也许是自己越来越懒惰吧。但有时候写写东西能够让自己沉淀,还是回来记录一下吧。入职大半年了,熟悉了一些相关的工作,目前主要从事分布式系统的研究和开发,目前的开发主要是停留在管理层面的开发,还未到达修改代码。这半年的时间熟悉了两款非常不错的分布式系统glusterfs和Ceph。两款分布式存储产品各有优势,其中Glusterfs提供的文件服务是Ceph系统无法提供的。而Ceph的块设备、对象存储、文件系统统一的架构也是GlusterFs无法满足的。因此各有优势。

从代码层面来说,GlusterFs的代码比较简单,层次比较明显,堆栈式的处理流程非常清晰。非常容易实现文件系统的功能扩展(在客户端和服务器端添加处理模块即可),虽然服务器端、客户端代码是一份代码,但整体而言代码比较清晰,代码量较少。

而Ceph采用C 开发,而且系统本身存在多个进程,多个进程构成一个大的集群,而集群内部也存在小的集群,相对Glusterfs而言,代码要复杂的多,同时Ceph自身实现了自我调整和自我修复。支持软件系统的定制,通过Crush算法查找到对象的存储位置。

就目前的热度而言Ceph比较火,但是文件系统的提供,Glusterfs还是不错的选择。

最近在从事Ceph的相关管理平台开发工作,熟悉了官方提供的Calamari平台,该平台目前主要提供了Ceph分布式存储系统的管理工作,整体上主要是提供了页面管理Ceph的手段。从目前的实现角度来看,该平台还存在一定的局限性,不能完成强大的功能,或者说目前提供的版本只能提供一些基本的功能。但是Calamari的框架确实非常不错的。Ceph属于开源软件,Calamari也是开源软件,而且Calamari是由一系列的开源软件组合而言,这些开源软件都只完成了其特定的功能。虽然是拼凑,但整体而言,该管理平台的框架是值得借鉴的。
以下部分参考
小鱼儿主页高手论坛 1Calamari的架构图

其中红框部分为Calamari代码实现的部分,非红框部分为非Calamari实现的开源框架。

在Cephserver node安装的组件有Diamond和Salt-minion。Diamond负责收集监控数据,它支持非常多的数据类型和metrics;每一个类型的数据都是上图中的一个collector,它除了收集Ceph本身的状态信息,它还可以收集关键的资源使用情况和性能数据,包括CPU,内存,网络,I / O负载和磁盘指标。Collector都是使用本地的命令行来收集数据,然后报告给Graphite。

Graphite不仅是一个企业级的监控工具, 还可以实时绘图。carbon-cache是Python实现的高度可扩展的事件驱动的I/O架构的后端进程,它可以有效地跟大量的客户端通信并且以较低的开销处理大量的业务量。

Whisper跟RRDtool类似,提供数据库开发库给应用程序来操纵和检索存储在特殊格式的文件数据(时间数据点数据),Whisper最基本的操作是创建作出新的Whisper文件,更新写入新的数据点到一个文件中,并获取检索的数据点

Graphite_web是用户接口,用来生成图片,用户可以直接通过URL的方式访问这些生成的图片。

Calamari 使用了Saltstack让Calamari Server和Ceph server node通信。Saltstack是一个开源的自动化运维管理工具,与Chef和Puppet功能类似。Salt-master发送指令给指定的Salt-minion来完成对Cpeh Cluster的管理工作;Salt-minion 在Ceph server node安装后都会从master同步并安装一个ceph.py文件,里面包含Ceph操作的API,它会调用librados或命令行来最终和Ceph Cluster通信。

calamari_rest提供Calamari REST API,详细的接口请大家参照官方文档。Ceph的REST API是一种低层次的接口,其中每个URL直接映射到等效的CEPH CLI;Calamari REST API提供了一个更高层次的接口,API的使用者可以习惯的使用GET/POST/PATCH方法来操作对象,而无需知道底层的Ceph的命令;它们之间的主要区别在于,Ceph的REST API的使用者需要非常了解Ceph本身,而Calamari 的REST API更贴近对Ceph资源的描述,所以更加适合给上层的应用程序调用。

cthulhu可以理解是Calamari Server的Service层,对上为API提供接口,对下调用Salt-master。

calamari_clients是一套用户界面,Calamari Server在安装的过程中会首先创建opt/calamari/webapp目录,并且把webapp/calamari下的manager.py(django 配置)文件考进去, calamari_web的所有内容到要放到opt/calamari/webapp下面来提供UI的访问页面。

calamari-web包下面的文件提供所有web相关的配置,calamari_rest和calamari_clients都要用到。

该框架使用了大量的开源软件,但是从扩展的角度来说还是值得学习的,其中saltstack实现了管理节点和服务器节点的通信链路,而且支持多节点的管理,这样不需要考虑管理节点和服务器之间的通信问题,在服务器端只需要实现具体的业务逻辑,即具体管理任务的实现。同时Saltstack是采用Python开发的,这样便于快速的开发系统,非常的方便管理人员在现场进行调试,定位问题。ceph本身也提供了python的API接口,直接通过Ceph的API就能实现集群的控制。SaltStack的使用使得集群可以到达一定的规模。SaltStack的Master端实际上作为管理端的控制接口,而SaltStack作为服务器的Agent端。在Calamari中通过Saltstack发送心跳报文,检查服务器的信息、集群的信息,控制命令的分发。可以说理解了SaltStack的基本模式就能理解Calamari的开发和扩展。

该框架中另一组非常重要的开源软件是diamond graphite,其中diamond完成了服务器端信息的收集工作,而graphite实现了图表信息的提供。diamond目前提供了绝大多数开源系统的信息收集,提供服务器基本信息的收集(CPU、内存、磁盘等信息),也是采用Python实现,非常容易扩展和调试。目前diamond中已经存在了Ceph的信息收集。而graphite主要是为前台提供时序数据,这样就简化了重新编写具体的业务逻辑。

学习和了解Calamari就必须了解一些基本的组件,掌握这些组件的作用和目的。下面从代码的层面介绍如何扩展Calamari。

现在我们把一定几个字符放到小括号里,比如:
"a(bc)*": 匹配 a 后面跟0个或者一个"bc";
"a(bc){1,5}": 一个到5个 "bc."
还有一个字符 '│', 相当于OR 操作:
"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;
"(a│b)*c": 匹配含有这样多个(包括0个)a或b,后面跟一个c
的字符串;
一个点('.')可以代表所有的单一字符,不包括"n"
如果,要匹配包括"n"在内的所有单个字符,怎么办?
对了,用'[n.]'这种模式.
"a.[0-9]": 一个a加一个字符再加一个0到9的数字
"^.{3}$": 三个任意字符结尾 .

HTML5定稿了,终于有一种编程语言开发的程序可以在Android和IOS两种设备上运行了

本文转载自: http://www.cnblogs.com/tuyile006/p/4103634.html
(只作转载, 不代表本站和博主同意文中观点或证实文中信息)

2007 年 W3C (万维网联盟)立项  HTML5 ,直至 2014 年 10 月底,这个长达八年的规范终于正式封稿。

过去这些年,HTML5 颠覆了 PC 互联网的格局,优化了移动互联网的体验,接下来,HTML5 将颠覆原生 App 世界。这听起来有点危言耸听,但若认真分析 HTML5 的发展史,你会发现,这个世界的发展趋势确实就是这样。

熟知历史才能预知未来,先让我们来看看 HTML5 为什么诞生、这 8 年是怎么过来的。

查找:

1 Calamari的扩展

在Calamari的基础之上进行新的功能开发,主要分为如下的几个模块,这部分包括Rest-API部分,Cthulhu、salt客户端的扩展。关于扩展新功能的基本步骤如下:

>> 扩展URL模块,确定对应的响应接口参数、对应ViewSet中的响应接口。

>> 完成ViewSet中部分接口的实现,这部分主要涉及与cthulhu的交互,如何获取数据信息,有些情况下还需要获取serializer中对象的序列化操作。

>> 完成后台rpc.py中对应类型的扩展,这部分主要是针对部分的post操作。

>> 完成cluster_monitor.py的扩展,对于提供操作的部分功能需要支持create、update、delete等操作,必须提供对应的RequestFactory。而在cluster_monitor.py中需要将对应的RequestFactory添加代码中。

>> 完成对应RequestFactory类的编写,这部分主要是完成命令操作的封装。并构建对应的请求操作。

>> salt-minion的扩展,这部分主要是针对ceph.py文件的扩展,当然也可以提供新的xxx.py文件。

接下来以PG的控制和操作为例进行说明。

中括号括住的内容只匹配一个单一的字符
"[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样);
"[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样); 一般我们都用[a-zA-Z]来指定字符为一个大小写英文
"^[a-zA-Z]": 匹配以大小写字母开头的字符串
"[0-9]%": 匹配含有 形如 x% 的字符串
",[a-zA-Z0-9]$": 匹配以逗号再加一个数字或字母结尾的字符串
你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^'

一、 HTML5 的诞生

自 W3C 于 1999 年发布 HTML4 后,Web 世界快速发展,一片繁荣。人们一度认为 HTML 标准不需要升级了。一些致力于发展 Web App 的公司另行成立了 WHATWG 组织,直到 2007 年,W3C 从 WHATWG 接手相关工作,重新开始发展 HTML5。

HTML5 的发展史,有用户的需求在推动,有技术开发者的需求在推动,更有巨大的商业利益在推动。

在互联网的早期,对用户而言,能打开浏览器接入到互联网世界就是一个神奇的事情,但互联网发展到 2005 年前后,开始出现下一个变化,就是宽带互联。

随着宽带的普及和电脑性能的增强,人们不再满足于单纯的通过互联网看新闻、收发邮件,消耗更高带宽的娱乐产品开始出现,就是流视频和网页游戏。其实视频和游戏是古老的需求,在互联网不普及的时候,需求的满足方式是离线传输的 VCD 和游戏光盘;后来互联网逐渐普及,人们更改了使用方式,通过下载软件 本地媒体播放器来看视频,下载体积较大的端游玩游戏。

但是对消费者体验更好的新方式还是出现并颠覆了以前的一切,那就是流媒体和网页游戏。Youtube 等公司把握住潮流飞速崛起,各种页游公司也如雨后春笋。

但是 HTML 标准没有把握住产业的变化及时演进,浏览器产品也未升级,这块新需求被浏览器插件满足了,那就是 Flash。这个部署在亿万浏览器里的商业插件俨然成为事实标准。2005 年 Adobe 巨资收购 Macromedia,把 Flash 收归旗下,紧接着大幅推广 FLV 流媒体和 action script 语言,很明显这桩收购可以列为 IT 并购的经典案例,FLV 流媒体和 Flash 游戏风靡互联网,Adobe 在新的产业升级中攫取了大量的利润。

除了 Flash 这个商业产品成为了事实标准,W3C 还面临一个尴尬,就是另一个私有扩展协议的制造者—IE。IE 当时在桌面浏览器占有垄断地位,并且扩展了大量的 IE Only 语法,开发者完全不知道这些语言是谁定义的。整个 web 世界,就被两家公司微软 Adobe 绑架了。

很多 IT 巨头都坐不住了,尤其是苹果和 Google。PC 操作系统的世界难有突破,Web 浏览器被苹果寄予厚望,而且第一代 iPhone 只支持网页,那时还没有 Appstore,Safari 是乔布斯非常看重的产品;新贵 Google 虽然大量赞助 Mozilla,但并未对 IE 的地位产生实质影响,收购了 YouTube 后发现底层被 Adobe 控制,也是非常难过,而且 Google 每年给 IE 的搜索框和 Adoble FLV 缴纳的费用真不是小数目。

既然大家都是 W3C 的主席单位,好吧,我们重新开始做 HTML5 吧。

是的,HTML5 其实就是这么诞生的。那是 2007 年,IE 和 Flash 由盛转衰的转折点。

复制代码 代码如下:

1.1URL模块扩展

目前Calmamari采用Rest-API形式,采用Django的Rest-Framework框架支持,这部分在rest-api代码目录中。Django采用Url和代码逻辑分离的实现方式,因此URL可以单独的扩展。

在rest-api/calamari-rest/urls/v2.py中添加如下的有关PG的URL:

url(r'^cluster/(?P<fsid>[小鱼儿主页高手论坛,a-zA-Z0-9-] )/pool/(?P<pool_id>d )/pg$', calamari_rest.views.v2.PgViewSet.as_view({'get': 'list'}), name='cluster-pool-pg-list'),

url(r'^cluster/(?P<fsid>[a-zA-Z0-9-] )/pool/(?P<pool_id>d )/pg/(?P<pg_id>[0-9a-fA-F] .[0-9a-fA-F] )/command/(?P<command>[a-zA-Z_] )$',

calamari_rest.views.v2.PgViewSet.as_view({'post': 'apply'}),

name='cluster-pool-pg-control'),

以上定义了两个URL,分别是:

api/v2/cluster/xxxx/pool/x/pg

api/v2/cluster/xxxx/pool/x/pg/xx/command/xxx

以上两个URL分别指定了PgViewSet中的接口,url的get方法对应了list接口。post接口对应的apply接口。这两个接口就是PgViewSet中必须实现的。


二、 HTML5 第一阶段: Web 增强与破垄断

自 HTML5 诞生以来,一共经历了两个阶段,分别是 Web 增强和移动互联网。我们先从 Web 增强说起。

web 体验的丰富增强主要表现在:1. webapp,比如 gmail;2. 流媒体;3. 游戏。我们就这 3 个方面来讲 HTML5 做了什么。

(rn|n|.)*?<!-- header -->

1.2ViewSet的扩展

在扩展URL之后,接下来就是进行对应响应接口的扩展,这部分的扩展主要是针对在URL中指定的接口类进行实现。在之前的PG指定了两个不同的接口,分别是获取和操作命令,对应的代码路径为/rest-api/calamari-rest/view/v2.py,具体的代码如下:

class PgViewSet(RPCViewSet):

serializer_class= PgSerializer

deflist(self, request, fsid, pool_id):

poolName = self.client.get(fsid, POOL, int(pool_id))['pool_name']

pg_summary = self.client.get_sync_object(fsid, PgSummary.str)

pg_pools = pg_summary['pg_pools']['by_pool'][int(pool_id)]

forpg in pg_pools:

pg['pool'] = poolName

return Response(PgSerializer(pg_pools, many=True).data)

defapply(self, request, fsid, pool_id, pg_id, command):

return Response(self.client.apply(fsid, PG, pg_id, command), status=202)

从如上的实现可知,代码实现了两个接口,分别是list和apply接口,即对应与之前的get、post操作。以上两个操作都会与后台cthulhu进行交互。分别是获取参数和提交请求。返回内容也有一定的差异。

同时在list接口中进行了序列化设置,即PgSerializer,该实现在rest-api/calamari-rest/serializer/v2.py中。

^ 和 $ 分别用来匹配字符串的开始和结束

例1 ^<b> 开头 一定要有"<b>"字符串;
例2 </b>$ 结尾 一定要有"</b>" 的字符串;
例3 ^abc$ 以abc开头和以abc结尾的字符串,实际上是只有abc匹配
例4 abc 没符号就 匹配包含abc的字符串


1. webApp

HTML5 新增了离线存储、更丰富的表单(比如 Input type=date)、js 线程、socket 王乐、标准扩展 embed、以及很多 css3 新语法…

效果如图:

1.2.1 序列化操作

通常在Rest-Api中会进行数据的序列化,这部分并不是一定要进行的,通常在需要更改的操作中是有必要的。如下是Pg的序列化操作:

class PgSerializer(serializers.Serializer):

classMeta:

fields = ('id', 'pool', 'state', 'up', 'acting', 'up_primary','acting_primary')

id =serializers.CharField(source='pgid')

pool =serializers.CharField(help_text='pool name')

state =serializers.CharField(source='state', help_text='pg state')

up =serializers.Field(help_text='pg Up set')

acting =serializers.Field(help_text='pg acting set')

up_primary = serializers.IntegerField(help_text='pg up primary')

acting_primary =serializers.IntegerField(help_text='pg acting primary')

这部分并不是必须的。有些模块可能不存在这部分的操作。在之前的三个步骤中基本上就实现了Rest-API部分的扩展,其中主要的ViewSet的扩展。有关ViewSet实际上实现了cthulhu与rest-api的交互方法。

在ViewSet的扩展中实际上采用了rpc与后台交互,因此在cthulhu的实现部分主要是处理对应的rpc请求。

* 和 ? 用来表示一个字符可以出现的次数或者顺序. 他们分别表示

{0,} = * 例1 ab{0,} 匹配以a开头后面B出现O-N次( "a", "ab", "abb", "abbbbbbbbbbbbbbbbb", 无限...)
{1,} = 例2 ab{1,} 匹配以a开头后面B出现1-N次( "ab", "abb", "abbbbbbbbbbbbbbbbb", 无限...)
{0,1}= ? 例3 ab{0,1} 匹配以a开头后面B出现O-1次( "a", "ab")
例4 a{0,1}b $ 匹配以0个或者1个a 再加上一个b结尾的字符串. ( "b", "ab")

注(2种写法)
ab{0,}也可以写成 ab*
ab{1,}也可以写成 ab
ab{0,1}也可以写成 ab?
a{0,1}b $也可以写成 a?b $

(1)1要点, '*' ' ',和 '?'只管控制它前面那个字符出现次数.
2 {N,N} 几到几次 {0} O次
3{}这个内不能为负数

(2)次数是可以修改的

例5 ab{2} 要求a后面一定要跟两个b(一个也不能少)如 ("abb");
例6 ab{2,} 要求a后面一定要有两个或者两个以上b 如("abb", "abbbb", 等.);
例7 ab{3,5} 要求a后面可以有2-5个b("abbb", "abbbb", or "abbbbb").

(3)后面跟多个字符用()
例8 a(bc)* 匹配 a 后面跟0个或者一个"bc"; 当然你也可以写成"a(bc){0,}"
例9 a(bc){1,5} 匹配1个到5个 "bc."


2. 流媒体

HTML5 新增了 audio、video

小鱼儿主页高手论坛 2

1.3rpc扩展

rpc.py中实现了所有请求的操作,但是新扩展的操作也是需要支持扩展的,以pg为例继续说明:

defapply(self, fs_id, object_type, object_id, command):

"""

Apply commands that do not modify an object in a cluster.

"""

cluster = self._fs_resolve(fs_id)

ifobject_type == OSD:

# Run a resolve to throw exception if it's unknown

self._osd_resolve(cluster, object_id)

return cluster.request_apply(OSD, object_id, command)

elifobject_type == PG:

return cluster.request_apply(PG,object_id, command)

else:

raise NotImplementedError(object_type)

而Pg的列表是通过PgSummary获取。这部分在之前的实现中已存在,之前的代码实现如下:

defget_sync_object(self, fs_id, object_type, path=None):

"""

Getone of the objects that ClusterMonitor keeps a copy of from the mon, such

asthe cluster maps.

:param fs_id: The fsid of a cluster

:param object_type: String, one of SYNC_OBJECT_TYPES

:param path: List, optional, a path within the object to return insteadof the whole thing

:return: the requested data, or None if it was not found (including ifany element of ``path``

was not found)

"""

ifpath:

obj =self._fs_resolve(fs_id).get_sync_object(SYNC_OBJECT_STR_TYPE[object_type])

try:

for part in path:

if isinstance(obj, dict):

obj = obj[part]

else:

obj = getattr(obj, part)

except (AttributeError, KeyError) as e:

log.exception("Exception %s traversing %s: obj=%s" % (e, path,obj))

raise NotFound(object_type, path)

return obj

else:

returnself._fs_resolve(fs_id).get_sync_object_data(SYNC_OBJECT_STR_TYPE[object_type])

│ 相当于OR 用来表示 1个或者 多个或者

例1 A│B 匹配含有"A" 或者 "B" 的 字符串;
例2 (A│B)C 匹配含有 "AC" 或者 "BC"的字符串;
例3 (A│B)*C 匹配含有(包括0-1个)a或b,后面跟一个c


3. 游戏

HTML5 新增了 canvas、webgl

当然还有 Google 努力在 HTML5 中推进 Header 和 Section 等标签,以利于搜索引擎分析,这些不多述。

HTML5 补充流媒体和游戏能力后,加上苹果强势拒绝在 iOS 上引入 Flash,成功的遏制了 Flash 的发展,然后就该遏制 IE 私有语法了。

在 HTML5 标准的升级过程中,苹果和 Google 同时也看到了浏览器市场重新洗牌的机会,他们一方面参与 HTML5 的规范,一边在浏览器产品上发力。Apple 首先开始大力发展 Safari,建立 WebKit 开源项目,Mac、iOS、Windows 多平台齐发力;Google 起初是赞助 Mozilla 开发 Firefox,后来自己开发了 v8 引擎,合并 WebKit,于 2008 年正式推出 Chrome。“IE 的私有规范 Flash 不是标准,我们才是标准”这样的口号在新一代浏览器大战中打响,IE 瞬间成为千夫所指的垄断代表,甚至成了阻碍 Web 发展的**(当时 IE6 已数年未更新,并且丝毫不惧 Firefox 的发展)。

偏偏微软此时也出了晕招,推出了一系列即不完整支持规范又互相不兼容的 IE7、8、9、10,彻底失去了开发者的心。

Adobe 的 Flash 被遏制,与 Web 霸主的位子擦肩而过;IE 的私有标准被遏制,并且造成 IE 市场份额不停下滑,直到 IE 最新的移动版本反过来开始支持 WebKit 私有语法,真是令人唏嘘。不知道 HTML6 是不是该打倒 WebKit 垄断了。

还有一个常用的就是字符串之间的字符
如:查找<!-- header start --> 到<!-- header end -->之间的字符,包括换行。
查找:

1.4cluster_monitor.py扩展

有关请求的操作都会进行集群的控制,这部分可以通过cluster_monitor进行实现,以pg为例进行说明。

def__init__(self, fsid, cluster_name, notifier, persister, servers, eventer,requests):

super(ClusterMonitor, self).__init__()

self.fsid = fsid

self.name = cluster_name

self.update_time = datetime.datetime.utcnow().replace(tzinfo=utc)

self._notifier = notifier

self._persister= persister

self._servers = servers

self._eventer = eventer

self._requests = requests

#Which mon we are currently using for running requests,

#identified by minion ID

self._favorite_mon = None

self._last_heartbeat = {}

self._complete = gevent.event.Event()

self.done = gevent.event.Event()

self._sync_objects = SyncObjects(self.name)

self._request_factories = {

CRUSH_MAP: CrushRequestFactory,

CRUSH_NODE: CrushNodeRequestFactory,

OSD: OsdRequestFactory,

POOL: PoolRequestFactory,

CACHETIER: CacheTierRequestFactory,

PG: PgRequestFactory,

ERASURE_PROFILE: ErasureProfileRequestFactory,

ASYNC_COMMAND: AsyncComRequestFactory

}

self._plugin_monitor = PluginMonitor(servers)

self._ready = gevent.event.Event()

这部分主要是将对应的请求与对应的请求工厂类进行绑定,这样才能产生出合适的请求。

. 可以代表所有的单一字符

. 不包括"n"空格 如果有空格就用 但空格加一字符[n.] 多个空格 1字符 [nnnnnn.]

例1 a.[0-9] 一个a 加一个字符 再加一个0到9的数字
例2 ^.{3}$ 三个任意字符结尾


三、 HTML5 第二阶段: 移动互联网

随着 Chrome 和 Safari 的高歌猛进,以及 IE Flash 的衰落,HTML5 告一段落,进入了下一个时代——移动互联网。HTML5 的跨平台优势在移动互联网时代被进一步凸显。HTML5 是唯一一个通吃 PC、Mac、iPhone、iPad、Android、Windows Phone 等主流平台的跨平台语言。Java 和 Flash 都曾梦想这个位置,但梦断于 iOS。此时人们纷纷开始研究基于 HTML5 开发跨平台手机应用。很多人当时认为,原生应用只是过渡,就像当年从C/S结构转变为B/S结构一样。而且学习 Objective-C 和 Java 很费劲,我既然会网页开发,为何不试试 HTML5。

W3C 此时成立了 Device API 工作组,为 HTML5 扩展了 Camera、GPS 等手机特有的 API,然而麻烦的是,移动互联网初期的迭代太快了,手机 OS 在不停的扩展硬件 API,陀螺仪、距离感应器、气压计。。。每年手机 OS 都有大版本更新。而 W3C 作为一个数百家会员单位共同决策的组织,从标准草案的提出到达成一致是非常复杂的过程,跟不上移动互联网初期的快速迭代。

PhoneGap 的出现,给开发者打开了一扇窗。很多人期待 PhoneGap 不停扩展 API,来补充浏览器的不足。Adobe 看到 PhoneGap 仿佛看到了重振江湖地位的希望,但在 Adobe 收购 PhoneGap 后,又发现这个东西可商用性不足,而且开源使得 Adobe 无法像 Flash 那样获取商业利益,于是就把 PhoneGap 捐给了 Apache,改名为 Cordova。

因为各种原因,Cordova 的定位最终没有成为浏览器的强化,而走向了混合式开发。基于当时的背景,他们认为原生是不可替代的,“原生 HTML5”的混合模式更有意义。所以现在 Cordova 的使用模型是“原生工程师 HTML5 工程师”一起协作完成 App。

这时 Facebook 加入了 W3C,牵头成立了 Mobile Web 工作组。Facebook 是混 Web 圈的,并且在手机 OS 上没有自己的领地,他不喜欢被苹果和 Google 掌控的原生应用生态系统。Mobile Web 这个工作组的重要目标就是让 HTML5 开发的网页应用达到原生应用的体验。然而,事与愿违,它不努力也就算了,结果是努力了却失败了。2012 年,Facebook 放弃了 HTML5 的新闻充斥了全世界的 IT 媒体,HTML5 瞬间被打入冷宫。

Facebook 为何放弃 HTML5?核心是当时基于 HTML5 真的做不出好的移动 App。对比 Twritter 等竞争对手的原生 App,Facebook 的 HTML5 版本实在无法让用户满意。比如 Push 功能,到现在 HTML5 的推送和原生的推送体验差距依然巨大,更不用说 HTML5 应用的页面切换白屏、下拉刷新/侧滑菜单不流畅等众多问题。看着原生工程师轻松实现摇一摇、二维码、语音输入、分享到朋友圈等功能,更是让 HTML5 工程师感觉自己站错了队。

即使 Facebook 不喜欢被控制,也不能拿被用户抛弃来冒险。而且 Facebook 并没有掌握关键点—手机浏览器内核。如果浏览器不跟上,徒然定一堆标准草案落不了地。

而浏览器在手机上的表现是什么呢?先看 Google,Chrome 性能虽高,但 Android 上的浏览器却并非 Chrome,而是 WebKit 改出来的一个蹩脚的 Android 浏览器;再看苹果,iOS 上不允许其他浏览器引擎上架 App Store,而且其他使用 Safari 引擎的应用也无法调用苹果自己的 JavaScript 加速引擎 Nitro。结果是苹果和 Google 不但不在浏览器上积极实现 HTML5 关于移动 App 所需的规范,反而对 HTML5 做出种种限制。

不管是当时硬件能力不足,还是手机 OS 厂商的故意限制,总之结果就是:在移动互联网的初期,一定是原生应用生态系统的天下,iOS 和 Android 首先自己的地盘稳固后,产业才会向下个阶段升级。

Facebook 也好,PhoneGap 也好,想在移动互联网初期就分一杯羹是分不到的,但坚持下来,机会往往会出现。

复制代码 代码如下:

1.5工厂类编写

该工厂类主要是针对不同的需求,实现具体的接口类,不同的对象有不同的请求类,以Pg为例说明:

from cthulhu.manager.request_factory importRequestFactory

from cthulhu.manager.user_request importRadosRequest

from calamari_common.types importPG_IMPLEMENTED_COMMANDS, PgSummary

class PgRequestFactory(RequestFactory):

def scrub(self,pg_id):

return RadosRequest(

"Initiating scrub on{cluster_name}-pg{id}".format(cluster_name=self._cluster_monitor.name,id=pg_id),

self._cluster_monitor.fsid,

self._cluster_monitor.name,

[('pg scrub', {'pgid': pg_id})])

defdeep_scrub(self, pg_id):

return RadosRequest(

"Initiating deep-scrub on{cluster_name}-osd.{id}".format(cluster_name=self._cluster_monitor.name,id=pg_id),

self._cluster_monitor.fsid,

self._cluster_monitor.name,

[('pg deep-scrub', {'pgid': pg_id})])

defrepair(self, pg_id):

return RadosRequest(

"Initiating repair on{cluster_name}-osd.{id}".format(cluster_name=self._cluster_monitor.name,id=pg_id),

self._cluster_monitor.fsid,

self._cluster_monitor.name,

[('pg repair', {'pgid': pg_id})])

defget_valid_commands(self, pg_id):

ret_val = {}

file('/tmp/pgsummary.txt', 'a ').write(PgSummary.str 'n')

pg_summary = self._cluster_monitor.get_sync_object(PgSummary)

pg_pools = pg_summary['pg_pools']['by_pool']

pool_id = int(pg_id.split('.')[0])

pool= pg_pools[pool_id]

forpg in pool:

if pg['pgid'] == pg_id:

ret_val[pg_id] = {'valid_commands': PG_IMPLEMENTED_COMMANDS}

else:

ret_val[pg_id] = {'valid_commands': []}

return ret_val

该类中实现了三个不同的命令的实现,该命令主要是进行对应的封装,这部分关键字需要根据ceph源码中的参数进行选择,因此在编码时需要参照ceph源码中对应命令的json参数名。

'[ab]' 中括号括住的内容只匹配一个单一的字符

例1 [ab] 匹配单个的 a 或者 b ( 和 "a│b" 一样);
例2 [a-d] 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样); 一般我们都用[a-zA-Z]来指定字符为一个大小写英文
例3 ^[a-zA-Z] 匹配以大小写字母开头的字符串
例4 [0-9]% 匹配含有 形如 x% 的字符串
例5 ,[a-zA-Z0-9]$ 匹配以逗号再加一个数字或字母结尾的字符串
例6 %[^a-zA-Z]% 匹配含有两个百分号里面有一个(非)字母的字符串.

你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^'

要点1:^[内容] ^在[]外开头,就表示以内容开头
要点2:[^内容] ^在[]里开头,就表示排除里面的内容(^非的意思)
要点3: 匹配含有这些字符的字符串. 在中括号里[* ?{}.] 或者' 符号将失效 括号只匹配单一字符
要点4: []中含有']' 最好把它作为列表里的第一个字符(可能跟在'^'后面)
要点5: []中含有有'-' 最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点[a-d-0-9]中间的'-'将有效.


四、 HTML5 这回真的来了

终于,在 2014 年 10 月底,W3C 宣布 HTML5 正式定稿。这个时间,不晚不早,硬件性能更强、手机 OS 迭代速度下降。

随着 HTML5 标准定稿,一切纷争将告一段落,现在,属于 HTML5 的时代到来了。

有人说,光标准定稿没用啊,配套起来了吗?HTML5 做的应用究竟能否匹敌原生 App?答案是,HTML5 不但可以匹敌原生 App,甚至它天然的很多特性超越了原生 App。

我们先谈谈 HTML5 原来不如原生应用的地方,业内俗称 HTML5 有“性工能”障碍。即 HTML5 性能不如原生、开发工具不如原生、能力调用不如原生。

这几个问题导致开发者无法使用 HTML5 做出与原生一样的 App。然而,不管是硬件升级还是 OS 厂商策略变化,以及相关软件技术的成熟,已解决了 HTML5 的“性工能”障碍。

<!-- header start -->(rn|n|.)*?<!-- header end -->

1.6salt-minion的扩展

这部分是salt的扩展模块,主要用于获取对应的数据信息,执行对应的操作命令等。在cthulhu中通过salt执行对应的操作命令。Ceph.py中有rados.commands等接口,该接口可用于执行ceph的命令。工厂类中封装的命令最终都会通过该接口执行。

总结
整体而言,Calamari的代码结构比较清晰,而且该开源框架也是值得学习的,在后续的分布式管理系统中也可参考saltstack diamond graphite的架构,前者实现控制逻辑,后面两个实现数据采集和数据的存储显示。

接近大半年没有写日志了,也许是自己越来越懒惰吧。但有时候写写东西能够让自己沉淀,还是回来记录一下...

本文由小鱼儿玄机30码发布于小鱼儿主页高手论坛,转载请注明出处:为了批量操作,重新开始发展 HTML5

关键词: 小鱼儿玄机30码