• [SQL] GaussDB(DWS) XML数据处理实践
    【摘要】 GaussDB(DWS)支持XML数据类型及丰富的XML解析函数,可实现关系数据和XML数据的映射管理功能。XML概述XML是可扩展的标识语言(eXtensible Markup Language)的缩写,可以描述非常复杂的数据结构,广泛应用于传输和存储数据。XML是一种类似于HTML的标记语言,但XML没有使用预定义的标记,可以根据应用需求定义标记。XML的基本格式是标准化的,可以跨平台、操作系统和应用程序实现异构系统之间的数据共享。XML数据类型GaussDB(DWS)支持将XML文档存储在数据库的XML数据类型列中。通过XML数据类型来保存数据,相比于文本方式的优势在于具有数据结构检查功能,能够保证结构的正确,并且支持XML数据解析和处理函数。判断一个 XML 文档正确的标准是:文档必须是一个格式良好的文档。文档遵循 XML 所有的语法规则并且有效。文档遵循特定语义的规则,这些规则通常规定在 XML 或 DTD 规范中XML可以存储由XML标准定义的格式正确的文档,以及由XML标准中定义的内容片断,内容片断可以有多个顶级元素或字符节点。下面是一个格式良好的XML文档示例:<?xml version="1.0" encoding="UTF-8"?><message>Hello GaussDB(DWS)</message>可以使用INSERT SQL语句将格式良好的文档插入到XML列中,如果能够成功分析文档,那么就说明文档的格式正确。在执行插入或更新操作前,会根据配置参数来验证XML文档是否格式正确。在应用程序中的XML数据一般采用其序列化字符串格式,将数据插入到 XML 列中时,必须将它转换为 XML 分层格式。因此在执行插入操作时可显式调用 XMLPARSE 函数,以将数据从其序列化字符串格式转换为 XML 分层格式。test=# SELECT XMLPARSE(document '<root>GAUSSDB(DWS)</root>');          xmlparse           ---------------------------  <root>GAUSSDB(DWS)</root>(1 row)访问XML值当访问和处理XML数据时,由于XML数据在数据库内部的表示不是字符串,XML数据类型没有提供比较操作符,因此不能直接与字符串进行比较。这样的结果是无法通过比较XML数值和搜索值来检索到数据行,因此对于XML数据应该伴随一个ID值用于检索数据。通过使用 XMLSERIALIZE 函数,可以将 XML 值变换成表示 XML 文档的已序列化字符串值。test=# SELECT XMLSERIALIZE(document '<root>GAUSSDB(DWS)</root>' AS TEXT);        xmlserialize         ---------------------------  <root>GAUSSDB(DWS)</root>(1 row)XML解析函数目前GaussDB(DWS)已经支持了30多个XML解析函数,包括解析XML数据、生成XML内容、XML谓词、XML参数设置、将数据映射到XML等功能。处理XML数据的函数xpath 对xml值计算xpath表达式的结果xmltable 通过XPath表达式的方式对XML数据进行解析生成XML内容的函数xmlparse 字符数据转换为xml类型的值xmlserialize  xml类型转换为字符串xmlcomment 创建一个包含XML注释的特定文本内容的值xmlconcat 连接独立的XML值列表来创建一个包含XML内容片段的单值xmlelement 生成一个带有给定名称,属性和内容的XML元素。xmlforest 生成一个使用指定的名称和内容的XML森林(序列)元素xmlpi 创建一条XML处理指令xmlroot 更改XML值的根节点属性xmlagg 聚合函数,连接聚合函数调用的输入值XML谓词函数IS DOCUMENT 判断XML值是否为文档IS NOT DOCUMENT 判断XML值是否为文档xmlexists 判断XPath表达式是否返回任何节点xpath_exists 判断XPath表达式是否返回任何节点xml_is_well_formed 检查字符串是不是格式良好的XMLxml_is_well_formed_document  检查字符串是不是格式良好的XML文档xml_is_well_formed_content 检查字符串是不是格式良好的XML内容XML参数设置SET XML OPTION 设置XML格式SET XMLBINARY TO 设置二进制值在XML中的编码格式将表、查询、游标、数据库映射到XML的函数table_to_xml、query_to_xml、cursor_to_xml、database_to_xml等。具体每个函数的使用方法可以参考GaussDB(DWS)用户手册,下面主要介绍应用中常见的解析XML数据的XMLTABLE函数。XMLTABLE函数概述XMLTABLE函数通过XPath表达式的方式对XML数据进行解析,按照定义的列生成一个表将数据返回,返回的表可以包含任何 SQL 数据类型(包括 XML类型)。XMLTABLE函数支持将表中的XML数据或一个SELECT查询的XML数据作为变量传递到指定的XPath表达式上,通过XPath表达式解析XML数据后的结果用于产生表中的列值,生成的表的结构由 XMLTABLE 的 COLUMNS 子句定义,可以指定列名、数据类型和生成列值的方式来定义列的特征。下面演示一下XMLTABLE函数的使用方法,首先创建CUSTOMER表并插入包含客户信息的XML数据。CREATE TABLE CUSTOMER AS SELECT 1 AS ID,XML $$<ROWS>   <ROW ID="1">     <CUSTOMER_NAME>Tony</CUSTOMER_NAME> <PHONENUM>123-456-666</PHONENUM>   </ROW>   <ROW ID="2">     <CUSTOMER_NAME>Serena</CUSTOMER_NAME> <PHONENUM>123-456-888</PHONENUM>   </ROW>   <ROW ID="3">     <CUSTOMER_NAME>Tina</CUSTOMER_NAME> <PHONENUM>123-456-999</PHONENUM>   </ROW></ROWS>$$ AS INFO;通过以下 SELECT 语句在 XMLTABLE 函数中解析 CUSTOMER 表的 INFO 列。SELECT XMLTABLE.* FROM CUSTOMER,XMLTABLE('//ROWS/ROW'         PASSING INFO        COLUMNS ID INT PATH '@ID',         NAME VARCHAR(64) PATH 'CUSTOMER_NAME',         PHONENUM TEXT PATH 'PHONENUM');  id |  name  |  phonenum    ----+--------+-------------   1 | Tony   | 123-456-666   2 | Serena | 123-456-888   3 | Tina   | 123-456-999(3 rows)在GaussDB(DWS)上,XMLTABLE函数支持下推到数据节点DN执行的STREAM查询计划,XML数据在数据节点上进行解析生成XMLTABLE结果表,通过GATHER STREAM将结果汇总到协调节点CN上,能够下推到DN的STREAM计划具有较好的查询性能。XMLTABLE应用案例在业务场景中,经常会遇到需要解析XML文档的场景,使用XMLTABLE函数可以快捷方便的完成对XML数据的解析,将所需的数据以表的形式返回,便于对数据进一步的查询和分析。下面演示一个对消息数据的解析流程:1. 创建一张用于存储消息数据的表,插入数据。CREATE TABLE MSGS AS SELECT 1 AS ID, 'A,BB,CCC,DDDD,EEEEE' AS MSG;2. 将消息文本数据通过XMLPARSE函数转化为XML数据。test=# SELECT XMLPARSE(content '<r><c>' || REPLACE(MSG, ',', '</c><c>') ||'</c></r>') AS XML_MSG FROM MSGS;                           xml_msg                           -----------------------------------------------------------  <r><c>A</c><c>BB</c><c>CCC</c><c>DDDD</c><c>EEEEE</c></r>(1 row)3. 使用XMLTABLE函数对XML数据进行解析,逐条返回消息内容。test=# SELECT MSG_CONTENT FROMtest-# (SELECT XMLPARSE(content '<r><c>' || REPLACE(MSG, ',', '</c><c>') ||'</c></r>') AS XML_MSG FROM MSGS),test-# XMLTABLE('/r/c/text()' PASSING XML_MSG COLUMNS MSG_CONTENT VARCHAR(4000) PATH '.');  msg_content  -------------  A  BB  CCC  DDDD  EEEEE(5 rows)从上图中可以看到,XMLTABLE解析后的数据以表的形式返回,在这个XMLTABLE表上可以进一步的对数据排序、筛选等操作,同时GaussDB(DWS)也支持在函数或存储过程中进行XML数据的处理,使应用程序的开发非常便捷。总结GaussDB(DWS)支持了XML数据类型及丰富的XML解析函数,同时基于Shared Nothing的分布式架构具有良好的并行处理和扩展能力,对XML数据的解析任务可下推到数据节点上进行并行处理,完全能够满足应用中出现的XML数据解析需求。原文链接:https://bbs.huaweicloud.com/blogs/244334【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [技术干货] 数据库的种类
    DBMS(数据库管理系统)主要通过数据的保存格式进行分类,现阶段主要分为以下几种类型。层次数据库(Hierarchical Database,HDB)层次数据库是最早研制成功的数据库系统,它把数据通过层次结构(树形结构)的方式表现出来。层次数据库曾经是数据库的主流,但随着关系数据库的出现和普及,现在已经很少使用了。比较具有代表性的层次数据库是 IMS(Information Management System)数据库,由 IBM 公司研制成功。关系型数据库(Relational Database,RDB)关系型数据库是现在应用最广泛的数据库。关系型数据库在 1969 年诞生,可谓历史悠久。和 Excel 工作表一样,关系型数据库也采用由行和列组成的二维表来管理数据,所以简单易懂。同时,它还使用 SQL(Structured Query Language,结构化查询语言)对数据进行操作。传统的关系型数据库采用表格的存储方式,数据以行和列的方式进行存储,要读取和查询都十分方便。下表是一些在关系型数据库中的数据。商品编号商品名称商品种类销售单价进货单价登记日期0001T恤衫衣服100502020-12-240002打孔器办公用品5003202020-12-240003运动T恤衣服4002802020-12-240004菜刀厨房用具50302020-12-240005高压锅厨房用具2001002020-12-240006叉子厨房用具1052020-12-240007菜板厨房用具80702020-12-240008圆珠笔办公用品1052020-12-24 比较具有代表性的关系型数据库有 Oracle Database、SQL Server、DB2、PostgreSQL 和MySQL。面向文档(Document-Oriented)数据库文档型数据库的灵感来自于 Lotus Notes 办公软件,和最后一种键值存储数据库类似。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。面向文档数据库会将数据以文档的形式存储。每个文档都是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储。具有代表性的面向文档数据库有 MongDB 和 CouchDB。列存储(Column-oriented)数据库列存储数据库将数据存储存在列族(column family)中,一个列族用来存储经常被一起查询的相关数据。例如,如果有一个 Person 类,我们经常会一起查询他们的姓名和年龄而不是薪资。这种情况下,姓名和年龄就会被放入一个列族中,而薪资则在另一个列族中。列存储数据库通常用来应对分布式存储的海量数据。具有代表性的列存储数据库有 Cassandra 和 HBase。XML 数据库(XML Database,XMLDB)XML 数据库是一种支持对 XML(标准通用标记语言下的一个应用)格式文档进行存储和查询等操作的数据管理系统。在系统中,开发人员可以对数据库中的 XML 文档进行查询、导出和指定格式的序列化。键值存储数据库(Key-Value Store,KVS)键值存储数据库是用来保存查询所使用的主键(Key)和值(Value)的组合的数据库。具有编程语言知识的读者可以把它想象成关联数组或者散列(hash)。近年来,随着键值存储数据库被应用到 Google 等需要对大量数据进行超高速查询的 Web 服务当中,它正逐渐为人们所关注。具有代表性的键值存储数据库有 Redis、Memcached 和 MemcachedDB。
  • [技术干货] 《ONAP技术详解与应用实践》读书笔记9
    3.2 架构设计原则重要的几个原则:模型驱动、微服务化及云原生。3.2.1 模型驱动模型是对“事物”的一种抽象化表达,从特定角度对系统进行描述,省略部分不重要的细节,聚焦感兴趣的特性。模型驱动在软件开发领域有多种,如MBD(Model Based Development,基于模型的开发)、MDD(Model Driven Development,模型驱动开发)和MDA(Model Driven Architecture,模型驱动架构)。其主要核心都是从模型生成代码和其他开发过程中的组件,在解决领域问题的同时,提高生产效率。传统开发方式则是硬编码。两者差异在于:谁负责修改,改什么(包括在哪修改),影响多大。传统硬编码方式,所有变更都需要由原软件提供者(软件供应商)来修改,且需要在实际产品代码上修改,包括重新编译、发布、打包,再经过商业交付流程提供给使用者。使用者则只能等待版本,后再经过入网测试、升级部署等流程后才能使用。代价大、周期长(一般以月为单位),需要系统关机重启,影响较大。如果整个过程中发生任何问题,包括理解上的差异,很可能需要从头再来。而模型驱动,能做到对多数变更,但平台开发者(供应商)不需要参与代码修改,平台本身也不需停机、重新编译、发布。而是由使用者/用户通过修改外部(相对平台代码而言)的模型文件(TOSCA或YANG等)或插件(可能包括JavaScript、Python等动态语言)即可动态生效,这一开发过程在ONAP中被称为设计。模型的格式(模型文件应该如何描述)和模型生效的流程(模型如何加载、生效,如果中间出现错误如何处理等)需要事先约定。模型驱动表达的意思是,ONAP支持在不需要修改ONAP自身框架代码的前提下,通过对模型做组合/变更(新增,删除或修改),实现电信业新业务的上线或更新。一般是通过修改某些脚本及动态加载部分插件或驱动来实现的。模型驱动并不意味着业务变更完全不需要修改代码,只是不需要修改ONAP框架代码。ONAP作为面向电信领域的开源社区致力于以下几方面:全局数据结构:ONAP的全局数据结构都定义在Schema文件中,文件名类似aai_schema_v15.xsd。正常情况下,在SDC中每次修改模型的定义(不是模型对应的实例),则SDC会自动触发模型文件的版本递增,ONAP的A&AI支持多个版本的模型文件并存。ONAP在代码层面并不固定描述用户、网元或设备的数据模型,即没有硬编码定义这些对象的结构,而是采用Schema脚本进行描述。在需要变更时,只要在设计态修改对应Schema脚本,并分发到运行态涉及的组件中即可。各资源构件:各资源构件(网络或业务的定义,如BPMN与Policy等)都保存于可重用资源库目录中,方便动态支持资源上线、服务的定义和创建,且支持通过由更简单的、可重用的资源构件组合成复杂业务。ONAP平台自身:ONAP自身特异性也采取类似的元数据驱动的方式实现。比如从ONAP的Casablanca版本开始,在CCSDK项目中启动CDS(Controller Design Studio),通过设计与定义不同的控制器蓝图(Controller Blueprints),即可帮助运营商根据需要灵活定义Controller模板(比如将有线与无线融合到一个Controller,或者分成不同Controller)。1.常见模型包括业务模型、概念模型、数据模型、对象实例(物理数据模型)和元模型等信息模型、业务模型、概念模型:可简略记成IM(Information Model,信息模型),其为对现实世界中真实事物的描述,不涉及具体软件实现,例如员工、合同、客户、网络、站点、设备等;也包括这些抽象概念之间的关系,比如站点中“包含”设备、而交换机“属于”某种设备等。数据模型:可简略记成DM(Data Model),这是对业务模型/概念模型的进一步分解和细化,包括所有的实体(抽象代表一类对象,如员工代表所有具体的员工)和关系(实体间的关系)。需要确定每个实体的属性,定义每个实体的主键,指定实体的外键,并进行范式化处理。对象实例:英文一般为Instance(实例),用于在数据模型基础上定义每个具体的独立对象,元模型(Meta Data):即模型的模型,是模型驱动设计更高一层次的抽象。ONAP自身也采用了多种模型,比如面向业务与VNF生命周期管理的TOSCA语言,面向网络层配置管理的YANG语言,内部数据库建模又采用XML Schema语言等。2.常见模型语言1)XMLXML(Extensible Markup Language,可扩展的标记语言)是1998年2月由W3C(World Wide Web Consortium,万维网联盟)正式批准定义的标准通用标记语言。“标记”指计算机所能理解的信息符号,通过标记,计算机之间可以处理包含各种信息的文章等。XML是一套定义语义标记的规则,这些标记将文档分成很多部件并对这些部件加以标识。XML也是元标记语言,即为定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。XML是一种规则,其把一个文档划分为不同的层次或部分,并对这些层次或部分做好标记。XML文档的字符分为标记(Markup)与内容(content)两类。标记通常以“<”开头,以“>”结尾;或者以字符“&”开头,以“;”结尾;不是标记的字符就是内容。XML有如下几个特征:内容与形式分离,宗旨是传输和存储数据,而不是显示数据。良好的可扩展性,标签没有被预定义,需要自行定义。被设计为具有自我描述性。遵循严格的语法要求。便于不同系统之间信息的传输,是W3C的推荐标准。2)XML Schema语法正确—术语称为well-formed XML,但不一定合法—术语称为validating XML。比如年龄这个标签,在计算机处理中还需更进一步严格定义:数据类型是一个数值,而不是字符串。显然,说年龄是10(岁),这是合法的(一个数值);而把年龄说成一个字符串OK或“非常大”,则是非法的。为了约束一个字段或者说为了约束XML的类型,就有了XML Schema(XML Schema Definition,XSD),它是一套W3C标准,即为用于XML的模式定义语言,其作为关联的文档来定义XML标记规范。对Age进行约束的例子。Age这个标签(XML又称元素,即element)有如下定义/约束:value必须是整型(xs:integer)。值范围必须是7~50。3)YAMLYAML(Yet Another Markup Language,另一种标记语言)是一种以数据为中心的标记语言,官方定义为一种人性化的数据格式定义语言。数据组织主要依靠的是空白、缩进、分行等结构。YAML相比XML有如下优点:可读性好和脚本语言交互性好使用实现语言的数据类型有个一致的信息模型易于实现由于YAML有较好的可扩展性与可读性,相比XML编码效率更高,在特定场景下具备明显优势。比如常用的动态语言就支持用YAML定义的数据结构与数据类型。4)YANGYANG是IETF在RFC 6020中定义的用于网络配置的数据模型描述语言,支持NETCONF接口协议,实现了网络配置的标准化,是一种DSL(领域特有语言)。NETCONF协议是一个网络配置管理协议,是由IETF标准组织定义的一套管理网络设备的机制。用户可使用这套机制增加、修改、删除网络设备的配置,获取网络设备的配置和状态信息。YANG与XSD(XML Schema Definition)基本是等价的,也即YANG是一种Schema定义的语言,而不是像XML/YAML一样为了数据的传输和存储。相比XML Schema,YANG语言定义的数据模型没有晦涩的内容,可读性好、简单易懂、可扩展。当前YANG已在设备配置领域被普遍接受,IETF、ONF等标准组织都要求提交的模型用YANG来写。其他组织,如Openconfig,OpenDayLight等也普遍支持YANG。5)TOSCATOSCA全称是Topology and Orchestration Specification for Cloud Applications,是一种数据建模描述语言,是由OASIS组织制定的面向云计算环境中的应用拓扑和编排描述语言,目前支持YAML和XML实现。TOSCA的基本概念:节点(node)和关系(relationship),且都可通过程序来扩展,同时TOSCA规范中也支持Plan(即Workflow工作流文件)。(1)节点预定义了很多基础类型,包括云基础设施中常用的计算节点、网络节点、数据库节点等。(2)关系定义了node之间的关系,具体如下:DependsOn(依赖于):表示节点间的顺序依赖关系HostedOn(运行于):比如即数据库运行在计算机上ConnectsTo(连接):表示连接关系。TOSCA面向云计算环境中的应用拓扑和编排场景来预定义一些属性,较适合用于解决以下场景中的需求:(1)自动化的软件部署和管理。(2)应用生命周期(安装、扩容、卸载等)管理方案的可移植性(不是应用本身的可移植性)。(3)组件之间的互操作性和重用性。YANG、TOSCA都具备较强的扩展能力如,NFV领域的VNFD,就是以TOSCA描述文件(可以是YAML或XML格式)进行说明的,包括安装软件过程中都有哪些组件、组件之间有什么依赖关系等;当然,实际运行时还需要用TOSCA运行态环境来对TOSCA文件进行读取(分析文件的语法、语意)和解释执行(进行具体的软件安装、配置工作)。3.2.2 微服务化服务化架构(Service-Oriented Architecture,SOA)是一种粗粒度、松耦合的以服务为中心的架构,服务之间通过定义明确的协议和接口进行通信。这里说的“服务”,就是指RPC远程程序调用。面向服务架构(Service-Oriented Architecture,SOA)是Gartner于20世纪90年代中期提出的概念,主要面向分布式系统的开发。多数是遵从著名SOA专家Thomas Erl的归纳:标准化的服务契约(Standardized service contract)服务的松耦合(Service loose coupling)服务的抽象(Service abstraction)服务的可重用性(Service reusability)服务的自治性(Service autonomy)服务的无状态性(Service statelessness)服务的可发现性(Service discoverability)服务的可组合性(Service composability)这些原则目的是:提高软件重用性,减少开发维护成本,最终增加业务的敏捷度。微服务架构则是一种服务化架构,提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相协作(通常是基于HTTP协议的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立部署到生产环境、类生产环境等。微服务的诞生并非偶然。它是互联网高速发展,敏捷、精益、持续交付方法论的深入人心,虚拟化技术与DevOps文化的快速发展,以及传统单块架构无法适应快速变化等多重因素的推动下所诞生的产物,涉及业务、开发、测试、部署、运维等多个环节。SOA与微服务架构在很多地方是重合的(可以混用)。如果要区分的话,SOA关注的是服务的重用;微服务则在关注服务重用的同时,也同时关注快速交付。ONAP架构支持微服务化,各项目都分成多个独立服务,可单独部署。服务之间的通信经由DMaap或MSB项目(都是基于Kafka构建的服务),支持弹性缩放和CI/CD环境的集成。3.2.3 云原生设计2010年,WSO2的联合创始人Paul Fremantle在业界最早提出Cloud Native,认为其有如下几个关键特征:Distributed/Dynamically wired,分布式/动态连接Elastic,弹性Scale down as well as up, based on load,基于系统负载的动态伸缩Granularly metered and billed,粒度合适的计量计费Pay per user,按使用量计费Multi-tenant,支持多租户Self service,支持自服务Incrementally deployed and tested,支持增量的部署与测试云原生系统的效果应该是更好地利用资源,更快地提供资源,更好地管理在2013年,AWS的云战略架构师,同时也是NetFlix的云架构师Adrian Cockcroft 对Cloud Native新的定义:基于不可靠的、易失效的基础设施构建高度敏捷、高可用的服务。2015年,Google联合其他20家公司宣布成立了开源组织Cloud Native Computing Foundation(CNCF),开源了Kubernetes。Kubernetes是一个以应用为中心的容器编排、调度集群管理系统,希望成为CloudNative Application的基石。从CNCF组织来看,Cloud-Native Application应该包含微服务、容器、CI/CD特征。Cloud Native的软件架构需求有:按需特性的伸缩按特性持续演进应用快速上线系统高可用全面解耦合系统自服务支持多租户异构公有云ONAP当前支持在OpenStack及微软Azure上运行,未来还计划支持AWS。
  • [问题求助] 请问一下你们1.32.B080有提供编译好的JSON或者XML解析库么?
    想自己加个配置文件,自己解析.能有现成的,我就不自己编译了.谢谢!~
  • [热门活动] 【HDZ Summit 2020】码豆发放失败用户名单,附领取攻略
    以下开发者发放码豆失败。为保证您顺利领取码豆,请您至少登录一次DevCloud会员中心https://devcloud.huaweicloud.com/bonususer/home。如您修改过用户名还请一并提供修改前的以及最新的用户名。详情请咨询版主或小助手(Huawei-HDZ),备注“补发码豆”,反馈时间截至2020年8月1日,如您在此之前没有反馈,视为自动放弃获奖资格。抓紧时间呦~
  • [技术干货] Open Images Dataset的label转xml代码
    import osimport xml.etree.cElementTree as ETfrom PIL import Imageimport cv2BASE_DIR = r'D:\ChromeCoreDownloads\Object-Detection-and-Tracking-master\darknet-master\OIDv4_ToolKit-master\OIDv4_ToolKit-master\OID\VOCify'label_dir = os.path.join(BASE_DIR,'Label','')image_dir = os.path.join(BASE_DIR,'JPEGImages','ima','')annotations_dir = os.path.join(BASE_DIR,'Annotations','')label = []i = 0for img_name in os.listdir(image_dir):    img_name = img_name.split('.')[0]    with open(label_dir+img_name+'.txt') as f:        read_data = f.readlines()        for line in read_data:            length = len(line.strip().split(' '))            if length==5:                name,xmin,ymin,xmax,ymax = line.strip().split(' ')            else:                name1 = line.strip().split(' ',1)[0]                name2 = line.strip().split(' ',1)[1].split(' ',1)[0]                name = name1+' '+name2                xmin,ymin,xmax,ymax = line.strip().split(' ',2)[2].split(' ')            label.append([name,xmin,ymin,xmax,ymax])    img = Image.open(os.path.join(image_dir, img_name+'.jpg'))    width, height = img.size    width -= 1    height -= 1    img.close()    annotation = ET.Element('annotation')    ET.SubElement(annotation, 'filename').text = img_name    ET.SubElement(annotation, 'folder').text = '2017_07'    img = cv2.imread(os.path.join(image_dir, img_name+'.jpg'))    height, width, channel = img.shape    size = ET.SubElement(annotation, 'size')    ET.SubElement(size, 'width').text = str(width)    ET.SubElement(size, 'height').text = str(height)    ET.SubElement(size, 'channel').text = str(channel)    for single in label:        xmin,ymin,xmax,ymax = single[1:5]        obj = ET.SubElement(annotation, 'object')        ET.SubElement(obj, 'name').text = single[0]        bndbox = ET.SubElement(obj, 'bndbox')        ET.SubElement(bndbox, 'xmin').text = str(int(round(float(xmin))))        ET.SubElement(bndbox, 'xmax').text = str(int(round(float(xmax))))        ET.SubElement(bndbox, 'ymin').text = str(int(round(float(ymin))))        ET.SubElement(bndbox, 'ymax').text = str(int(round(float(ymax))))        annotation_path = os.path.join(annotations_dir, '%s.xml' % img_name)    tree = ET.ElementTree(annotation)    tree.write(annotation_path)    f.close()    label = []    i += 1    print(i)import osimport randomi = 0name = []f1 = open(r'D:\ChromeCoreDownloads\Object-Detection-and-Tracking-master\darknet-master\OIDv4_ToolKit-master\OIDv4_ToolKit-master\OID\VOCify\ImageSets\Main\train.txt','w')f2 = open(r'D:\ChromeCoreDownloads\Object-Detection-and-Tracking-master\darknet-master\OIDv4_ToolKit-master\OIDv4_ToolKit-master\OID\VOCify\ImageSets\Main\val.txt','w')for img_name in os.listdir(r'D:\ChromeCoreDownloads\Object-Detection-and-Tracking-master\darknet-master\OIDv4_ToolKit-master\OIDv4_ToolKit-master\OID\VOCify\JPEGImages\ima'):    img_name = img_name.split('.')[0]    name.append(img_name)random.shuffle(name)len_val = 20000val = name[0:20000]train = name[20000:]for val_name in val:    f2.write(val_name+'\n')    i+=1f2.close()for train_name in train:    f1.write(train_name+'\n')    i+=1f1.close()print(i)   
  • [问题求助] maven构建是报错,说缺少pom.xml,原因是没找到product_demo在哪里下载
    在做实验手册的第第四个实验时,代码托管,其中让下载product_demo,没有找到在哪儿下,我本机没有,是需要在哪儿下载么,所以在构建的时候就报错了,说找不到里面的pom.xml文件,请各位大神指导下,在哪里“下载并解压附件工程文档的源代码到本地”?
  • [HPC] Hadoop 3.1.2+Spark 2.4.4 移植指南(CentOS 7.6)
    文档位置已迁移至如下链接:https://support.huaweicloud.com/prtg-kunpenghpcs/kunpenghpcs_prtg_0013.html
  • [中间件] 【华为云鲲鹏云服务最佳实践】【工具篇】第074期tinyxml2-7.0.1安装配置指南
    1、简介TinyXML是一个简单,小巧的C++XML解析器,可以轻松集成到其他程序中。它读取XML并创建表示XML文档的C++对象。可以将对象作为XML进行操作,更改和再次保存。类别:解析器2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.5Kernel4.143、依赖安装yum install gcc-c++  make  -y4、安装编译  获取软件包cd /optwget https://github.com/leethomason/tinyxml2/archive/7.0.1.tar.gz  解压软件包tar -zxvf 7.0.1.tar.gz  编译和安装cd tinyxml2-7.0.1/make  回显如下图     编译完成后,在当前目录下会生成“libtinyxml2.a”库文件,此时即可用该库文件编译项目。5、系统配置无6、测试测试该静态库是否可以正常使用。在解压目录下有一个“xmltest.cpp”文件,是项目默认的测试程序(也可自行编写程序),执行命令使用链接静态库编译该cpp文件。g++ -o  xmltest_bak  xmltest.cpp  libtinyxml2.a 7、参考信息无8、FAQ无
  • 编译hbase-1.3.0报“User setting file does not exist ...\root\.m2\setting.xml“解决方法
    执行“mvn package -DskipTests assembly:single”编译hbase-1.3.0-src.tar.gz时报“User setting file does not exist ...\root\.m2\setting.xml”错误时,解决方法如下:拷贝${maven.home}/conf/settings.xml的文件到${user.home}/.m2/settings.xml中即可如:cp /home/apache-maven-3.5.4/conf/settings.xml /root/.m2/【说明】:settings.xml文件中的settings元素包含用于定义以各种方式配置Maven执行的值的元素,如pom.xml,但不应与任何特定项目绑定或分配给每一个用户。这些包括本地存储库(local repository)位置,备用远程存储库服务器和认证信息等值。settings.xml文件可能存在两个位置:Maven安装:${maven.home}/conf/settings.xml用户安装:${user.home}/.m2/settings.xml前一个settings.xml也称为全局设置,后者的settings.xml称为用户设置。如果两个文件都存在,它们的内容将被合并,用户特定的settings.xml看作是主要的。
  • fedora 30 x86_64 repomd.xml 文件信息不正确导致dnf工具无法工作
    https://mirrors.huaweicloud.com/fedora/updates/30/Everything/x86_64/repodata/repomd.xml就是这个文件, 文件内容和同目录下不匹配
  • [交流吐槽] YANG,NETCONF,RESTCONF,XML之间的关系
    netconf是什么? netconf是一种协议用于给网络设备发送配置。 什么意思呢,比如我有一台路由器,我想配一条静态路由,正常的办法是什么呢,我连上面去打命令。这是最最一般的配置方法了,所以最开始我们网络工程师很吃香,特别是会各种机器设备配置的人。netconf你可以理解成一种通用的协议,它就是那个会各种配置的人,你只要吩咐他做什么事情,他就会按你说的去做。这样我的配置就可以写成脚本了,而且关注点变成了配置数据的本身而不是设备的相关命令。理想的情况,所有的设备都用相同的配置,netconf会自己处理他们到相应的机器的上。听上去很完美是不是?然而现实是骨干的,网络设备的配置结构往往是是不同的。实现同样的功能的不同设备需要的配置结构也往往不同。比如思科设备接口上配置一个address 只要知道接口名 ip版本 和地址掩码就足够了 但是juniper的机器上不但要知道这些还要额外提供一个unit 号来标识逻辑接口。这就TM尴尬了。特别是现在nfv大潮下,nfv是干毛的,网络功能虚拟化,既然虚拟化我就更关注的是功能本身而不是实现这个功能的设备,对于管理人员来说,他往往就只想告诉一套nfv系统,我要什么功能,比如 我要一号站点能联网我要DHCP服务我要VPN,而单纯利用netconf是无法配置的,因为还要求具体的配置结构。这可咋整!没事儿,我们只要给对应的设备所需的配置结构来个模型不就行了?到时候不就是完形填空吗,yang model就是吃这口饭的,我只需知道对应设备的yang model就可以向管理者请求对应设备所需的信息了,具体结构上的问题有yang model来解释。什么叫做结构上的问题呢?还是举刚才那个例子思科为啥不需要unit号来指定逻辑端口呢?因为它的逻辑端口藏在接口名里所以它的配置类似这样接口名{ ip{ address x.x.x.x mask x.x.x.x } } 但是juniper的额外需要一个unit号来表示逻辑端口所以它的配置类似这样接口名{ unit x { ip{ address x.x.x.x mask x.x.x.x } } } 当然实际上他们的yang model 要比这个复杂的多,比如juniper还有family 这个层级这里就是举一个例子但是对于上层用户管理来说,他只用填逻辑口号,接口名,地址以及ip版本就可以了,他不需要知道具体到底实际的配置长啥样了,因为有可能及其复杂233.是不是感觉很完美了,这样NFV可以让服务提供商随意换设备了,底层是思科华为还是juniper没啥所谓,反正只要有yang model我们就知道到底怎么配一台机器了。XML呢,刚说过netconf是一种协议,它实际是个服务器,接受客户端发来的请求来配置自己,所以每台设备上都有一个netconf server,这里的信息交互就是用xml来实现的,所以yang model其实就是一种描述XML结构的模型。好了,继续向下说到restconf了,这要从rest api说起,需要读者有一点web开发的知识。什么是rest api呢?说白了这是一种利用HTTP协议来做RPC的办法。我们做NFV呢往往会有一个dashboard,管理员可以利用这个dashboard来配置他想要的功能,这个dashboard很多时候都是一个web application,web application有很多好处,比如客户端可以轻松跨平台,只要有浏览器就行。轻松远程接入等等好处。现代的很多web application往往是这样的结构 一个前端,可以理解为客户端,一个后端,往往就是一个web service了。而REST api就是web service的一种。这里不具体展开了,没有几千字是说不完的。那么rest api 往往是这样工作的接受一个json格式的数据,然后根据请求的方法和url do something。我们关注NFV,简单设计一个NFV的dashboard无非就是让用户能去配置机器嘛,最简单的结构无非就是这样dashboard | | config | web service | | config + yang | netconf client | |request XML | | device 这个restconf的作用就在web service 那一层,简单的讲就是怎么把你发来的config和所请求的yang映射到一个URL上的,有了这个URL就能把yang model的数填了,填完了你就有对应的设备的配置结构了,然后根据这个在生成xml就可以把请求发到对应的设备上配置啦。
  • [技术分享] Android代码库manifest.xml文件介绍
    Android源码库数据量庞大,因此Google为了方便管理代码库以及后期的开发,特此引入了repo来封装git,大大的简化了代码库的下载、更新和推送。而庞大的代码库则被封装在.repo/manifests/default.xml文件中,在下载或推送代码时,git会根据xml文件对应的库和路径进行代码的自动索引。现就xml文件简单介绍如下:<?xml version="1.0" encoding="UTF-8"?> <manifest>   <remote fetch="gerrit" name="sim" review="gerrit:8080"/>   <default remote="caf" revision="QRD8926_KK"/>   <project name="device/common"/>   <project groups="pdk" name="device/generic/armv7-a-neon"/>   <project groups="pdk" name="device/generic/common"/>   <project name="device/qcom/common">     <copyfile dest="build.sh" src="build.sh"/>     <copyfile dest="vendor/qcom/build/tasks/generate_extra_images.mk" src="generate_extra_images.mk"/>   </project>   <project groups="pdk" name="platform/external/chromium-trace" path="external/chromium-trace"/> </manifest>1) manifest元素最顶层的xml元素,<manifest>与</manifest>对应,成对出现。2) remote元素功能:设置远程git服务器的属性属性:  * name:远程git服务器的名字,直接用于git fetch,git remote等操作。  * alias:远程git服务器的别名,如果设置了,则会覆盖name的设定,在一个manifest文件中,name不能重名,但alias可以重名。  * fetch:所有projects的git url前缀。  * review:指定gerrit服务器名,用于repo upload操作,若没指定,repo upload无效果。例如:<remote fetch="ssh://git.example.com"   name="test"   review="gerrit.example.com"/>3) default元素功能:设定所有project的默认属性值,如果在project元素中没有指定一个属性,则使用default元素的属性值。属性:  * remote:之前定义的某一的remote元素中name属性值,用于指定使用哪一个远程git服务器。  * revesion:git分支名字,例如master或者 refs/heads/master  * sync_j:在repo sync中默认并行的数目  * sync_c:设置为true,则只同步指定的分支(revision属性指定),而不是所有ref内容。  * sync_s:设置为true,则会同步git的子项目。4) manifest-server元素只能有一个该元素,他的url属性用于指定manifest服务的url,通常是一个xml rpc服务。5) project元素功能:指定一个需要clone的git仓库在服务器上对应的路径和clone到本地后所属的路径。属性:    * name: 唯一的名字标识project,同时也用于生成git仓库的URL。格式如下: ${remote_fetch}/${project_name}.git    * path: 可选的路径。指定git clone出来的代码存放在本地的子目录。如果没有指定,则以name作为子目录名。    * remote: 指定之前在某个remote元素中的name。    * revision: 指定需要获取的git提交点(master, refs/heads/master, tag或者SHA-1值)。    * groups: 列出project所属的组,以空格或者逗号分隔多个组名。所有的project都自动属于"all"组。每一个project自动属于name:'name' 和path:'path'组。例如:<project name="**eys" path="barrel-of"/>它自动属于default, name:**eys, 和path:barrel-of组。如果一个project属于notdefault组,则repo sync时不会下载。    * sync_c: 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。    * sync_s: 如果设置为true,则会同步git的子项目。    * upstream: 在哪个git分支可以找到一个SHA1。用于同步revision锁定的manifest(-c 模式)。该模式可以避免同步整个ref空间。    * annotation: 可以有多个annotation,格式为name-value pair。在repo forall 命令中这些值会导入到环境变量中。    * remove-project: 从内部的manifest表中删除指定的project。经常用于本地的manifest文件,用户可以替换一个project的定义。6)  include元素通过name属性可以引入另外一个manifest文件(路径相对于manifest repository's root)。
  • [技术干货] Maven迁移神器介绍
    本帖最后由 吴建军 于 2018-3-23 17:02 编辑Maven迁移神器介绍 6327 必要条件:安装JDK1.7+以上。 使用场景: 作为华为开发云的租户,如果您已经在自己公司内部有一些公用的自己开发的组件jar包,或者您从公网上收集的一些比较小众的私有组件(pom.xml或者jar包),如果要迁移到华为开发云上(发布服务里面的您自己租户下面的1号仓库)此工具就是最佳选择,支持自动指定目录搜索,批量并发上传,此工具不仅支持单独的pom.xml文件的上传,也支持pom.xml组合jar文件上传。目前也能支持您的snaps**类型的包上传。 使用方法:从华为开发云发布服务模块 ("Maven私有依赖库"--> "批量迁移和维护")下载MigrationArtifact.jar包,鼠标双击即可打开。下面主要介绍上传工具的页面: 主要就一个BoardView,分为菜单栏(帮助,版本)可以查看简洁的帮助介绍和版本号。左右看板和日志提示区。 左边看板主要展示的租户私有仓库的信息,需要输入的有URL,账号,密码,点击刷新(如果无法看到“刷新”按钮,可能是显示器的分辨率问题,往右拖动分隔栏即可展示出“刷新”按钮)即可看到自己租户私有仓库里面的内容。点击左看板的目录树,即可展开,观察仓库里面有哪些内容。 右边看板是本地文件系统的文件选择工具+上传按钮,选择一个本地的目录,上传工具会自动扫描该目录下符合maven2规范的包或pom文件,自动上传到您的私有仓库。注意,如果文件夹下面只有jar包,没有对应的pom.xml(即没有坐标信息)是无法上传的! 最下方是日志记录区和提示框,报错信息或者提示信息均会在此位置进行展示。 获取URL,账号,密码方法: 6333 如果您是华北区的话,按上图方式获取URL。 账号密码在您下载的settings.xml文件中,release类型的仓库的账号密码即是! 有任何问题,请在帖子下留言,或者提交上传工具的bug描述,祝使用开心!
  • 代码自动生成——一切都为了提高您的工作效率,和苦逼...
    背景: 开发兄弟在开发过程中肯定会遇到这样的场景: 1. 尼玛,这个功能不是和我上次做的A功能差不多嘛; 2. 每次都需要干苦力,最讨厌敲键盘写底层的VO; 3. 简单的CRUD操作,太low level了,敲代码敲的让人累觉不爱咯; 4. 功能雷同,复制粘贴太枯燥了,能不能给点有技术含量的活儿; 。。。。。。 那么,问题来了,有没有一个好的idea?将这些简单、重复、枯燥的编码工作一股脑全做了,开发人员把精力集中在复杂的功能逻辑处理上来,从而大大提高开发效率,也避免了犯一些低级的、共性的编码问题。 思路: (以Spring+MyBatis架构为例) 1. 假定每个业务功能模块都需要CRUD操作(通用接口) 2. 每个业务实体都可以抽象成系统实体对象(VO) 3. 每个系统实体对象都会和数据库表有对应关系,或者是一个抽象的实体(无法从数据库关联) 4. 数据库的CRUD操作其实都是类似的,只是针对的数据库表不同列不同而已(mybatis xml,Dao) 5. 基本的增删改查接口和实现类:命名可保持一致性,实现类的逻辑也大部分通用(接口类和实现类) 6. 前端页面上,一般按照系统风格和架构风格上都会保持一致,菜单区、查询区和数据操作区的一致性 7. 前端对业务数据的请求方式在定义上保持一致性 8. 基于以上几点,我们可以抽取共性,转换成设计编码的模板(如:VO对象模板、数据库mybatis操作的xml模板、Dao层接口模板、业务相关的接口类和实现类模板、前端页面模板、等等) 9. 借助freemarker强大的模板功能,将实体对象绑定到模板中,从而生成前后端完整的一套业务逻辑代码 10. 将代码生成的功能以插件的形式提供给IDE,如Eclipse Plugin 11. 借助JAVA JDBC驱动,根据数据库表名获取表结构信息;如果实体不依赖数据库表,则可通过外部文件导入的方式,获取的实体的基础属性信息 12. 利用JAVA Swing 实现可操作性的交互功能界面,一键生成**代码 技术点: 1. Eclipse插件开发 2. FreeMarker通过ftl模板生成代码文件 ---------------------------------功能升级:这两天对原有的插件做了次升级,主要源于以下目的:1. 原插件功能提供的代码模板比较固定,开发人员如果需要修改模板,必须打开插件jar包修改ftl文件;原插件不支持灵活配置模板;2. 因自身插件开发能力有限,为方便程序的配置功能可扩展,将插件转换成客户端小工具程序;3. 将所有模板信息通过xml文件进行配置管理(后台自动解析xml配置信息),支持多套模板灵活切换,亦可自定义新增模板,不受程序限制2781
总条数:60 到第
上滑加载中